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 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