active_model-attribute 0.0.1
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 +7 -0
- data/README.md +0 -0
- data/lib/active_model/attribute.rb +64 -0
- data/test/active_model_attribute_test.rb +55 -0
- metadata +117 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: acfb0e13856030c00204836441c5481d2b238838
|
4
|
+
data.tar.gz: 05dbc59c83fcb732bbdadc04f244dc092ef3729e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 65931e37d6de7f9648be28cbc9feaf79c16f6937349cb60d3451cd8c453d352e360e6035a9997cb39992a863568c3e9c0f2267ac97f5cfe2051145010796b35d
|
7
|
+
data.tar.gz: 27b14282c475e4b138a90839e39a16d924e322f144c67415d6566b4df9e5cda7473b026f5885c098cfa5780d452e826be24184f9a8f7bb32eb943398fa5ded48
|
data/README.md
ADDED
File without changes
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/concern"
|
4
|
+
require "active_model/forbidden_attributes_protection"
|
5
|
+
require "active_model/attribute_assignment"
|
6
|
+
require "active_model/type"
|
7
|
+
|
8
|
+
module ActiveModel
|
9
|
+
module Attribute
|
10
|
+
extend ActiveSupport::Concern
|
11
|
+
|
12
|
+
included do
|
13
|
+
include ActiveModel::AttributeAssignment
|
14
|
+
end
|
15
|
+
|
16
|
+
class_methods do
|
17
|
+
def inherited(subclass)
|
18
|
+
subclass.attributes.replace(attributes)
|
19
|
+
end
|
20
|
+
|
21
|
+
def attributes
|
22
|
+
@attributes ||= []
|
23
|
+
end
|
24
|
+
|
25
|
+
def attribute(name, type, **options)
|
26
|
+
attributes << name unless attributes.include?(name)
|
27
|
+
|
28
|
+
getter = name.to_sym
|
29
|
+
setter = :"#{name}="
|
30
|
+
|
31
|
+
define_method(getter) do
|
32
|
+
@attributes[getter]
|
33
|
+
end
|
34
|
+
|
35
|
+
define_method(setter) do |value|
|
36
|
+
@attributes[getter] = ActiveModel::Type.lookup(type, **options).cast(value)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def alias_attribute(new_name, old_name)
|
41
|
+
alias_method new_name, old_name
|
42
|
+
alias_method :"#{new_name}=", :"#{old_name}="
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize(attrs = {})
|
47
|
+
@attributes = {}
|
48
|
+
|
49
|
+
assign_attributes(attrs) if attrs
|
50
|
+
|
51
|
+
super()
|
52
|
+
end
|
53
|
+
|
54
|
+
def attributes
|
55
|
+
slice(*self.class.attributes)
|
56
|
+
end
|
57
|
+
|
58
|
+
def slice(*attrs)
|
59
|
+
attrs.each_with_object({}) do |name, hash|
|
60
|
+
hash[name] = send(name)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
require "minitest/autorun"
|
3
|
+
require_relative "../lib/active_model/attribute"
|
4
|
+
|
5
|
+
class User
|
6
|
+
include ActiveModel::Attribute
|
7
|
+
|
8
|
+
class TextType < ActiveModel::Type::String
|
9
|
+
def type
|
10
|
+
:text
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
ActiveModel::Type.register(:text, TextType)
|
15
|
+
|
16
|
+
attribute :name, :string
|
17
|
+
attribute :description, :text
|
18
|
+
attribute :age, :integer
|
19
|
+
attribute :active, :boolean
|
20
|
+
end
|
21
|
+
|
22
|
+
class Admin < User
|
23
|
+
attribute :sudo, :boolean
|
24
|
+
end
|
25
|
+
|
26
|
+
class ActiveModelAttributeTest < Minitest::Test
|
27
|
+
def test_class_attributes
|
28
|
+
assert_equal User.attributes, [:name, :description, :age, :active]
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_inheritance
|
32
|
+
assert_equal Admin.attributes, User.attributes + [:sudo]
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_casting
|
36
|
+
user = User.new(
|
37
|
+
name: 'Francesco',
|
38
|
+
description: 'Developer',
|
39
|
+
age: '322',
|
40
|
+
active: 'true'
|
41
|
+
)
|
42
|
+
|
43
|
+
assert_equal 'Francesco', user.name
|
44
|
+
assert_equal 'Developer', user.description
|
45
|
+
assert_equal 322, user.age
|
46
|
+
assert_equal true, user.active
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_attributes
|
50
|
+
user = User.new(name: 'Francesco', description: 'Developer')
|
51
|
+
|
52
|
+
assert_equal 'Francesco', user.attributes[:name]
|
53
|
+
assert_equal 'Developer', user.attributes[:description]
|
54
|
+
end
|
55
|
+
end
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: active_model-attribute
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Francesco Rodríguez
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-09-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activemodel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '5.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.15'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.15'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.49'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.49'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '12.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '12.0'
|
83
|
+
description: Declares attribute for Active Model objects
|
84
|
+
email: frodsan@protonmail.com
|
85
|
+
executables: []
|
86
|
+
extensions: []
|
87
|
+
extra_rdoc_files: []
|
88
|
+
files:
|
89
|
+
- README.md
|
90
|
+
- lib/active_model/attribute.rb
|
91
|
+
- test/active_model_attribute_test.rb
|
92
|
+
homepage: https://github.com/frodsan/active_model-attribute
|
93
|
+
licenses:
|
94
|
+
- MIT
|
95
|
+
metadata: {}
|
96
|
+
post_install_message:
|
97
|
+
rdoc_options: []
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
requirements: []
|
111
|
+
rubyforge_project:
|
112
|
+
rubygems_version: 2.6.13
|
113
|
+
signing_key:
|
114
|
+
specification_version: 4
|
115
|
+
summary: Declares attribute for Active Model objects
|
116
|
+
test_files:
|
117
|
+
- test/active_model_attribute_test.rb
|