type_attributes 0.1.0

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: aa0469edc670739073bbb6bd15f1480266d775d6
4
+ data.tar.gz: f3e78ba5fe58e42cf065eb51bc0d5e8c3b9a305d
5
+ SHA512:
6
+ metadata.gz: f0d22c0c88747f124d0a4547deaf1243ebff57700b18cfab92e4b7e92527a48609eb2c6e9ddf8d82fb922774fd95968dacaffba577bfd1c92545a9ab22d686cd
7
+ data.tar.gz: f1c48125dcc5f89876ae761c36b5761917ac77156af83f0c835ef857910f13a640ebf969a3ecd9632ec0d3e1174526fda6a30376b75375d610a15ebcfa09829d
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.0
5
+ before_install: gem install bundler -v 1.13.7
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in type_attributes.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # TypeAttributes
2
+
3
+ TypeAttributes defines `.type_attribute` method to typecast value with `ActiveModel::Type.lookup(type).cast(value)`.
4
+ Supported versions are `ActiveModel(> 5.0)` or `ActiveRecord(> 4.2)`.
5
+
6
+ ```
7
+ class User
8
+ include TypeAttributes
9
+
10
+ type_attribute :id, :integer
11
+ end
12
+
13
+ user = User.new
14
+ user.id = '1'
15
+ user.id == 1 #=> true
16
+ ```
17
+
18
+ ```
19
+ # Lookup type from `ActiveModel::Type.lookup(type)`
20
+ # ActiveModel::Type.registry.send(:registrations).map { |type| type.send(:name) }
21
+ :big_integer
22
+ :binary
23
+ :boolean
24
+ :date
25
+ :datetime
26
+ :decimal
27
+ :float
28
+ :integer
29
+ :string
30
+ :text
31
+ :time
32
+ ```
33
+
34
+ ## Installation
35
+
36
+ Add this line to your application's Gemfile:
37
+
38
+ ```ruby
39
+ gem 'type_attributes'
40
+ ```
41
+
42
+ ## Contributing
43
+
44
+ Bug reports and pull requests are welcome on GitHub at https://github.com/alpaca-tc/type_attributes.
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,3 @@
1
+ module TypeAttributes
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,58 @@
1
+ require 'type_attributes/version'
2
+ require 'active_support/concern'
3
+ require 'active_model'
4
+
5
+ module TypeAttributes
6
+ extend ActiveSupport::Concern
7
+
8
+ IS_RAILS_5 = defined?(ActiveModel) && ActiveModel.gem_version >= Gem::Version.new('5.0.0')
9
+
10
+ module ClassMethods
11
+ def type_attribute(name, cast_type)
12
+ name = name.to_sym
13
+ cast_type = cast_type.to_sym
14
+
15
+ define_method name do
16
+ value = instance_variable_get(:"@#{name}")
17
+ TypeAttributes.cast_value(cast_type, value)
18
+ end
19
+
20
+ define_method "#{name}=" do |decibels|
21
+ value = TypeAttributes.cast_value(cast_type, decibels)
22
+ instance_variable_set(:"@#{name}", value)
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.flexible_type_name(type)
28
+ return type unless %i(date_time datetime).include?(type)
29
+
30
+ if IS_RAILS_5
31
+ # Change type name for DateTime in Rails5
32
+ # related: https://github.com/rails/rails/pull/24079
33
+ :datetime
34
+ else
35
+ :date_time
36
+ end
37
+ end
38
+
39
+ if IS_RAILS_5
40
+ # Rails 5
41
+ require 'active_model/type'
42
+
43
+ def self.cast_value(cast_type, value)
44
+ ActiveModel::Type.lookup(flexible_type_name(cast_type)).cast(value)
45
+ end
46
+ else
47
+ # Rails 4.2
48
+ require 'active_record'
49
+ require 'active_support/core_ext/hash/keys'
50
+ require 'active_record/type'
51
+
52
+ def self.cast_value(cast_type, value)
53
+ classified = ActiveSupport::Inflector.classify(flexible_type_name(cast_type).to_s)
54
+ type = ActiveRecord::Type.const_get(classified)
55
+ type.new.type_cast_from_user(value)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'type_attributes/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'type_attributes'
8
+ spec.version = TypeAttributes::VERSION
9
+ spec.authors = ['alpaca-tc']
10
+ spec.email = ['alpaca-tc@alpaca.tc']
11
+
12
+ spec.summary = %q{A type cast for ActiveModel}
13
+ spec.homepage = 'https://github.com/alpaca-tc/type_attributes'
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
16
+ f.match(%r{^(test|spec|features)/})
17
+ end
18
+
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'activerecord', '>= 4.2.0', '~> 4.2.0'
22
+ spec.add_development_dependency 'bundler', '~> 1.13'
23
+ spec.add_development_dependency 'rake', '~> 10.0'
24
+ spec.add_development_dependency 'rspec', '~> 3.0'
25
+ end
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: type_attributes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - alpaca-tc
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-01-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
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: 4.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: 4.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
+ description:
76
+ email:
77
+ - alpaca-tc@alpaca.tc
78
+ executables: []
79
+ extensions: []
80
+ extra_rdoc_files: []
81
+ files:
82
+ - ".gitignore"
83
+ - ".rspec"
84
+ - ".travis.yml"
85
+ - Gemfile
86
+ - README.md
87
+ - Rakefile
88
+ - lib/type_attributes.rb
89
+ - lib/type_attributes/version.rb
90
+ - type_attributes.gemspec
91
+ homepage: https://github.com/alpaca-tc/type_attributes
92
+ licenses: []
93
+ metadata: {}
94
+ post_install_message:
95
+ rdoc_options: []
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 2.6.8
111
+ signing_key:
112
+ specification_version: 4
113
+ summary: A type cast for ActiveModel
114
+ test_files: []