active_model_attributes_backport 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: 3ffe6571eeecda9527ee484212bef6a05fef1e84
4
+ data.tar.gz: 230ed82d63b2f11dafdd435d27b3a282772c6faf
5
+ SHA512:
6
+ metadata.gz: 16e4853f7bd9f9e42b5d83d2c64b5357afa90975b34ec9f8f92e5e451c55daf8d1987ae72df818af808fdc75261d3e3e15f9cfaad35166a958d83286d819a063
7
+ data.tar.gz: '0185a15ed13dcedae1b2d4cba4bfc174d9bc261e278b50e99bb8377f3c62459356ff8300e3985dc6d4dfe987b85a128b38c973dcd76c4955843e208cce52d1ad'
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /gemfiles/*.lock
11
+ /gemfiles/**/config
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.0
5
+ before_install: gem install bundler -v 1.15.4
6
+ gemfile:
7
+ - gemfiles/4.2_stable.gemfile
8
+ - gemfiles/5.0_stable.gemfile
9
+ - gemfiles/5.1_stable.gemfile
data/Appraisals ADDED
@@ -0,0 +1,11 @@
1
+ appraise '4.2-stable' do
2
+ gem 'rails', git: 'https://github.com/rails/rails', branch: '4-2-stable'
3
+ end
4
+
5
+ appraise '5.0-stable' do
6
+ gem 'rails', git: 'https://github.com/rails/rails', branch: '5-0-stable'
7
+ end
8
+
9
+ appraise '5.1-stable' do
10
+ gem 'rails', git: 'https://github.com/rails/rails', branch: '5-1-stable'
11
+ end
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # ActiveModelAttributes
2
+
3
+ Make `.attribute` in ActiveModel for `< Rails 5.2`.
4
+
5
+ **Deprecation Warning**
6
+
7
+ This is no longer needed on Rails5.2+.
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'active_model_attributes_backport'
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ Define `.attribute` to cast value.
20
+
21
+ ```
22
+ class User
23
+ include ActiveModelAttributes
24
+
25
+ attribute :id, :integer
26
+ attribute :no_cast
27
+ attribute :user_id, :integer, default: -> { Current.user.id }
28
+ attribute :locale, :string, default: 'ja'
29
+ end
30
+
31
+ user = User.new(id: '1')
32
+
33
+ user.id == 1
34
+ user.user_id == Current.user.id
35
+ user.locale == 'ja'
36
+ user.no_cast.nil?
37
+ ```
38
+
39
+ ```
40
+ # Lookup type from `ActiveModel::Type.lookup(type)`
41
+ # ActiveModel::Type.registry.send(:registrations).map { |type| type.send(:name) }
42
+
43
+ :big_integer
44
+ :binary
45
+ :boolean
46
+ :date
47
+ :datetime
48
+ :decimal
49
+ :float
50
+ :integer
51
+ :string
52
+ :text
53
+ :time
54
+ ```
55
+
56
+ ## Contributing
57
+
58
+ Bug reports and pull requests are welcome on GitHub at https://github.com/alpaca-tc/active_model_attributes.
59
+
60
+ run spec
61
+
62
+ ```
63
+ bundle exec appraisal install
64
+ bundle exec appraisal 4.2-stable rspec
65
+ bundle exec appraisal 5.0-stable rspec
66
+ bundle exec appraisal 5.1-stable rspec
67
+ ```
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require 'active_model_attributes/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'active_model_attributes_backport'
9
+ spec.version = ActiveModelAttributes::VERSION
10
+ spec.authors = ['alpaca-tc']
11
+ spec.email = ['alpaca-tc@alpaca.tc']
12
+
13
+ spec.summary = %q{Backport ActiveModel::Attributes -like method}
14
+ spec.homepage = 'https://github.com/alpaca-tc/active_model_attributes_backport'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_dependency 'activemodel', '>= 4.2.0', '< 5.2.0'
23
+ spec.add_development_dependency 'bundler', '~> 1.13'
24
+ spec.add_development_dependency 'rake', '~> 10.0'
25
+ spec.add_development_dependency 'rspec', '~> 3.0'
26
+ spec.add_development_dependency 'appraisal'
27
+ end
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", git: "https://github.com/rails/rails", branch: "4-2-stable"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", git: "https://github.com/rails/rails", branch: "5-0-stable"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", git: "https://github.com/rails/rails", branch: "5-1-stable"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,91 @@
1
+ require 'active_support/concern'
2
+ require 'active_support/core_ext/object/deep_dup'
3
+ require 'active_model/attribute_methods'
4
+
5
+ require 'active_model_attributes/version'
6
+ require 'active_model_attributes/utils'
7
+ require 'active_model_attributes/type'
8
+
9
+ module ActiveModelAttributes
10
+ extend ActiveSupport::Concern
11
+
12
+ NO_DEFAULT_PROVIDED = Class.new(Object) do
13
+ def dup; self end
14
+ end.new.freeze
15
+
16
+ private_constant :NO_DEFAULT_PROVIDED
17
+
18
+ included do
19
+ include ActiveModel::AttributeMethods
20
+
21
+ attribute_method_suffix '='
22
+ class_attribute :_active_model_attributes_attribute_types, :_active_model_attributes_default_attributes, instance_accessor: false
23
+ self._active_model_attributes_attribute_types = Hash.new(ActiveModelAttributes::Type.default_value)
24
+ self._active_model_attributes_default_attributes = {}
25
+ end
26
+
27
+ module ClassMethods
28
+ def attribute(name, type = ActiveModelAttributes::Type.default_value, **options)
29
+ name = name.to_s
30
+
31
+ if type.is_a?(Symbol)
32
+ type = ActiveModelAttributes::Type.lookup(type)
33
+ end
34
+
35
+ self._active_model_attributes_attribute_types = _active_model_attributes_attribute_types.merge(name => type)
36
+
37
+ define_default_attribute(name, options.fetch(:default, NO_DEFAULT_PROVIDED))
38
+ define_attribute_methods(name)
39
+ end
40
+
41
+ private
42
+
43
+ def define_default_attribute(name, new_value)
44
+ self._active_model_attributes_default_attributes = _active_model_attributes_default_attributes.deep_dup.merge(name => new_value)
45
+ end
46
+ end
47
+
48
+ def initialize(*)
49
+ initialize_default_attributes
50
+ super
51
+ end
52
+
53
+ private
54
+
55
+ def initialize_default_attributes
56
+ self.class._active_model_attributes_default_attributes.each do |name, default_value|
57
+ initialize_default_attribute(name, default_value)
58
+ end
59
+ end
60
+
61
+ def initialize_default_attribute(name, default_value)
62
+ return if default_value == NO_DEFAULT_PROVIDED
63
+
64
+ value = if default_value.is_a?(Proc)
65
+ default_value.call
66
+ else
67
+ default_value
68
+ end
69
+
70
+ public_send(:"#{name}=", value)
71
+ end
72
+
73
+ def attribute(attr_name)
74
+ name = if self.class.attribute_alias?(attr_name)
75
+ self.class.attribute_alias(attr_name)
76
+ else
77
+ attr_name
78
+ end
79
+
80
+ name = name.to_s
81
+
82
+ reader = :"@#{name}"
83
+ instance_variable_get(reader) if instance_variable_defined?(reader)
84
+ end
85
+
86
+ def attribute=(attribute_name, new_value)
87
+ type = self.class._active_model_attributes_attribute_types[attribute_name]
88
+ value = ActiveModelAttributes::Type.cast(type, new_value)
89
+ instance_variable_set("@#{attribute_name}", value)
90
+ end
91
+ end
@@ -0,0 +1,13 @@
1
+ require 'active_model'
2
+
3
+ module ActiveModelAttributes
4
+ module Type
5
+ if ActiveModelAttributes::Utils.rails5?
6
+ require 'active_model_attributes/type/rails5'
7
+ include(ActiveModelAttributes::Type::Rails5)
8
+ else
9
+ require 'active_model_attributes/type/rails4'
10
+ include(ActiveModelAttributes::Type::Rails4)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,40 @@
1
+ module ActiveModelAttributes
2
+ module Type
3
+ module Rails4
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+ require 'active_record'
8
+ require 'active_support/core_ext/hash/keys'
9
+ require 'active_record/type'
10
+
11
+ def lookup(symbol)
12
+ registry[symbol]
13
+ end
14
+
15
+ def cast(type, value)
16
+ type.type_cast_from_user(value)
17
+ end
18
+
19
+ def default_value
20
+ @default_value ||= ActiveRecord::Type::Value.new
21
+ end
22
+
23
+ private
24
+
25
+ def registry
26
+ @registry ||= Hash.new do |h, name|
27
+ h[name] = find_type(name).new
28
+ end
29
+ end
30
+
31
+ def find_type(name)
32
+ classified = ActiveSupport::Inflector.classify(name.to_s)
33
+ ActiveRecord::Type.const_get(classified)
34
+ rescue NameError
35
+ raise ArgumentError, "Unknown type #{name}"
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,23 @@
1
+ require 'active_model/type'
2
+
3
+ module ActiveModelAttributes
4
+ module Type
5
+ module Rails5
6
+ extend ActiveSupport::Concern
7
+
8
+ module ClassMethods
9
+ def lookup(symbol)
10
+ ActiveModel::Type.lookup(symbol)
11
+ end
12
+
13
+ def cast(type, value)
14
+ type.cast(value)
15
+ end
16
+
17
+ def default_value
18
+ @default_value ||= ActiveModel::Type::Value.new
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,7 @@
1
+ module ActiveModelAttributes
2
+ module Utils
3
+ def self.rails5?
4
+ defined?(::ActiveModel) && ::ActiveModel.gem_version >= Gem::Version.new('5.0.0')
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module ActiveModelAttributes
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1 @@
1
+ require_relative 'active_model_attributes'
metadata ADDED
@@ -0,0 +1,137 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_model_attributes_backport
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - alpaca-tc
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-01-24 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: 4.2.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 5.2.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 4.2.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 5.2.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: bundler
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.13'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.13'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '10.0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '10.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rspec
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: appraisal
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ description:
90
+ email:
91
+ - alpaca-tc@alpaca.tc
92
+ executables: []
93
+ extensions: []
94
+ extra_rdoc_files: []
95
+ files:
96
+ - ".gitignore"
97
+ - ".rspec"
98
+ - ".travis.yml"
99
+ - Appraisals
100
+ - Gemfile
101
+ - README.md
102
+ - Rakefile
103
+ - activemodel_attributes_backport.gemspec
104
+ - gemfiles/4.2_stable.gemfile
105
+ - gemfiles/5.0_stable.gemfile
106
+ - gemfiles/5.1_stable.gemfile
107
+ - lib/active_model_attributes.rb
108
+ - lib/active_model_attributes/type.rb
109
+ - lib/active_model_attributes/type/rails4.rb
110
+ - lib/active_model_attributes/type/rails5.rb
111
+ - lib/active_model_attributes/utils.rb
112
+ - lib/active_model_attributes/version.rb
113
+ - lib/active_model_attributes_backport.rb
114
+ homepage: https://github.com/alpaca-tc/active_model_attributes_backport
115
+ licenses: []
116
+ metadata: {}
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ requirements: []
132
+ rubyforge_project:
133
+ rubygems_version: 2.5.2.1
134
+ signing_key:
135
+ specification_version: 4
136
+ summary: Backport ActiveModel::Attributes -like method
137
+ test_files: []