active_model-attribute 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +57 -0
- data/lib/active_model/attribute.rb +32 -26
- data/test/active_model_attribute_test.rb +33 -11
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ed7ef5bddca113e053cd2edf3856bd665f37c52
|
4
|
+
data.tar.gz: de80657a0582837da4417a871004411323b2427f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e632f92ade18c2728bdd8596c498e6aaae8beb01d61a5b0753288383e29ea8a8e71ef7b977e942a5839ad9cf8c611d9e0700e439f20b3a80db306d1a64d28d5
|
7
|
+
data.tar.gz: a74d10d8d2c23e61a5bd18406d21daff642accce9167cca61645a8157ed1f84a521b92d0fd1b12abbc8753d76aedc2642e813b7648cf36110921bfe6133f7b54
|
data/README.md
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
# ActiveModel::Attribute [](https://travis-ci.org/frodsan/active_model-attribute)
|
2
|
+
|
3
|
+
Declares attributes for Active Model objects.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem "active_model-attribute"
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install active_model-attribute
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
class User
|
25
|
+
include ActiveModel::Attribute
|
26
|
+
|
27
|
+
attribute :name, :string
|
28
|
+
attribute :position, :string
|
29
|
+
attribute :age, :integer
|
30
|
+
attribute :active, :boolean
|
31
|
+
|
32
|
+
alias_attribute :full_name, :name
|
33
|
+
end
|
34
|
+
|
35
|
+
user = User.new(
|
36
|
+
name: 'Bob',
|
37
|
+
position: 'Developer',
|
38
|
+
age: '42',
|
39
|
+
active: false
|
40
|
+
)
|
41
|
+
|
42
|
+
user.age
|
43
|
+
# => 42
|
44
|
+
|
45
|
+
user.age.class
|
46
|
+
# => Integer
|
47
|
+
|
48
|
+
user.full_name
|
49
|
+
# => 'Bob'
|
50
|
+
|
51
|
+
user.active?
|
52
|
+
# => false
|
53
|
+
```
|
54
|
+
|
55
|
+
## License
|
56
|
+
|
57
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
@@ -1,8 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "active_support/concern"
|
4
|
-
require "active_model
|
5
|
-
require "active_model/attribute_assignment"
|
4
|
+
require "active_model"
|
6
5
|
require "active_model/type"
|
7
6
|
|
8
7
|
module ActiveModel
|
@@ -10,42 +9,35 @@ module ActiveModel
|
|
10
9
|
extend ActiveSupport::Concern
|
11
10
|
|
12
11
|
included do
|
12
|
+
include ActiveModel::AttributeMethods
|
13
13
|
include ActiveModel::AttributeAssignment
|
14
|
-
end
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
15
|
+
class_attribute :attributes, :attribute_registry,
|
16
|
+
instance_accessor: false,
|
17
|
+
instance_predicate: false
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
end
|
19
|
+
self.attributes = []
|
20
|
+
self.attribute_registry = {}
|
24
21
|
|
25
|
-
|
26
|
-
|
22
|
+
attribute_method_suffix '='
|
23
|
+
attribute_method_suffix '?'
|
24
|
+
end
|
25
|
+
|
26
|
+
class_methods do
|
27
|
+
def attribute(name, type, options = {})
|
28
|
+
name = name.to_s
|
27
29
|
|
28
|
-
|
29
|
-
setter = :"#{name}="
|
30
|
+
self.attribute_registry = attribute_registry.merge(name => [type, options])
|
30
31
|
|
31
|
-
|
32
|
-
@attributes[getter]
|
33
|
-
end
|
32
|
+
self.attributes = attribute_registry.keys
|
34
33
|
|
35
|
-
|
36
|
-
@attributes[getter] = ActiveModel::Type.lookup(type, **options).cast(value)
|
37
|
-
end
|
38
|
-
end
|
34
|
+
define_attribute_method(name)
|
39
35
|
|
40
|
-
|
41
|
-
alias_method new_name, old_name
|
42
|
-
alias_method :"#{new_name}=", :"#{old_name}="
|
36
|
+
attr_reader(name)
|
43
37
|
end
|
44
38
|
end
|
45
39
|
|
46
40
|
def initialize(attrs = {})
|
47
|
-
@attributes = {}
|
48
|
-
|
49
41
|
assign_attributes(attrs) if attrs
|
50
42
|
|
51
43
|
super()
|
@@ -60,5 +52,19 @@ module ActiveModel
|
|
60
52
|
hash[name] = send(name)
|
61
53
|
end
|
62
54
|
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def attribute=(attr, value)
|
59
|
+
type, options = self.class.attribute_registry[attr.to_s]
|
60
|
+
|
61
|
+
value = ActiveModel::Type.lookup(type, **options).cast(value)
|
62
|
+
|
63
|
+
instance_variable_set(:"@#{attr}", value)
|
64
|
+
end
|
65
|
+
|
66
|
+
def attribute?(attr)
|
67
|
+
send(attr).present?
|
68
|
+
end
|
63
69
|
end
|
64
70
|
end
|
@@ -17,6 +17,8 @@ class User
|
|
17
17
|
attribute :description, :text
|
18
18
|
attribute :age, :integer
|
19
19
|
attribute :active, :boolean
|
20
|
+
|
21
|
+
alias_attribute :full_name, :name
|
20
22
|
end
|
21
23
|
|
22
24
|
class Admin < User
|
@@ -25,31 +27,51 @@ end
|
|
25
27
|
|
26
28
|
class ActiveModelAttributeTest < Minitest::Test
|
27
29
|
def test_class_attributes
|
28
|
-
assert_equal User.attributes, [
|
30
|
+
assert_equal User.attributes, %w[name description age active]
|
29
31
|
end
|
30
32
|
|
31
33
|
def test_inheritance
|
32
|
-
assert_equal Admin.attributes, User.attributes + [
|
34
|
+
assert_equal Admin.attributes, User.attributes + %w[sudo]
|
33
35
|
end
|
34
36
|
|
35
37
|
def test_casting
|
36
38
|
user = User.new(
|
37
|
-
name:
|
38
|
-
description:
|
39
|
-
age:
|
40
|
-
active:
|
39
|
+
name: "Francesco",
|
40
|
+
description: "Developer",
|
41
|
+
age: "322",
|
42
|
+
active: "true"
|
41
43
|
)
|
42
44
|
|
43
|
-
assert_equal
|
44
|
-
assert_equal
|
45
|
+
assert_equal "Francesco", user.name
|
46
|
+
assert_equal "Developer", user.description
|
45
47
|
assert_equal 322, user.age
|
46
48
|
assert_equal true, user.active
|
47
49
|
end
|
48
50
|
|
49
51
|
def test_attributes
|
50
|
-
user = User.new(name:
|
52
|
+
user = User.new(name: "Francesco", description: "Developer")
|
53
|
+
|
54
|
+
assert_equal "Francesco", user.attributes["name"]
|
55
|
+
assert_equal "Developer", user.attributes["description"]
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_predicates
|
59
|
+
user = User.new(active: false)
|
60
|
+
|
61
|
+
refute user.active?
|
62
|
+
refute user.name?
|
63
|
+
|
64
|
+
user.name = "Francesco"
|
65
|
+
user.active = true
|
66
|
+
|
67
|
+
assert user.name?
|
68
|
+
assert user.active?
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_alias
|
72
|
+
user = User.new(full_name: 'Francesco')
|
51
73
|
|
52
|
-
|
53
|
-
assert_equal
|
74
|
+
assert user.full_name?
|
75
|
+
assert_equal user.full_name, user.name
|
54
76
|
end
|
55
77
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_model-attribute
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Francesco Rodríguez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -109,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
109
|
version: '0'
|
110
110
|
requirements: []
|
111
111
|
rubyforge_project:
|
112
|
-
rubygems_version: 2.6.
|
112
|
+
rubygems_version: 2.6.13
|
113
113
|
signing_key:
|
114
114
|
specification_version: 4
|
115
115
|
summary: Declares attribute for Active Model objects
|