active_model-attribute 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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 [![Build Status](https://travis-ci.org/frodsan/active_model-attribute.svg)](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
|