attributary 0.1.0 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3ebdff0c364b0480e2c79d90df50064f2b015400
4
- data.tar.gz: cef7eccd653b8c77ea68aa3f08a40ab89787ab63
3
+ metadata.gz: 521f68ae59d9b4342cf782032031b3b3f89783a9
4
+ data.tar.gz: 1c90025b9fa2c89e2b3fe840f09a401933fdc6ea
5
5
  SHA512:
6
- metadata.gz: 0aa7ee051f7a870076ff468b1f6b1a9b4ab91a1342e2e3c5f876c3fb7a024affd4b8a3b279cc933a2a340161444082f9702025a4d6b4e725d3682f747a707e51
7
- data.tar.gz: d13c1daefa1c490e0a9fe70ac1dfbb626c477525716013bf1467212688b7c1f72b17821b857fa7679b5c05a730db844da493fa8923464e5556181199ee56a3b3
6
+ metadata.gz: d8ca0e1373df36cba4a85ab7070afd78bd80f6f28fb8bbd8d58d9185e5c781f68c70fa6cb53708927ccc37a0bfda69bb43d9f35f8dfb755184ab5a8b5c4143cf
7
+ data.tar.gz: fdacaca03e9e2ffca3de0de4ea09ccc3bbfda882151389ab731b76ebe612c1c8c8ce7a18b6f89ee067898e6e43b5a1773486fb75222a69e5c5c352e222ff2446
data/.rspec_status ADDED
@@ -0,0 +1,15 @@
1
+ example_id | status | run_time |
2
+ ------------------------------------------------ | ------ | --------------- |
3
+ ./spec/unit/attributary/attribute_spec.rb[1:1:1] | passed | 0.00034 seconds |
4
+ ./spec/unit/attributary/attribute_spec.rb[1:1:2] | passed | 0.00008 seconds |
5
+ ./spec/unit/attributary/attribute_spec.rb[1:1:3] | passed | 0.00012 seconds |
6
+ ./spec/unit/attributary/attribute_spec.rb[1:1:4] | passed | 0.00013 seconds |
7
+ ./spec/unit/attributary/attribute_spec.rb[1:2:1] | passed | 0.00009 seconds |
8
+ ./spec/unit/attributary/attribute_spec.rb[1:2:2] | passed | 0.00007 seconds |
9
+ ./spec/unit/attributary/attribute_spec.rb[1:3:1] | passed | 0.00081 seconds |
10
+ ./spec/unit/attributary/attribute_spec.rb[1:3:2] | passed | 0.00012 seconds |
11
+ ./spec/unit/attributary/attribute_spec.rb[1:4:1] | passed | 0.0001 seconds |
12
+ ./spec/unit/attributary/attribute_spec.rb[1:4:2] | passed | 0.0001 seconds |
13
+ ./spec/unit/attributary/attribute_spec.rb[1:5:1] | passed | 0.00012 seconds |
14
+ ./spec/unit/attributary/attribute_spec.rb[1:6:1] | passed | 0.00011 seconds |
15
+ ./spec/unit/attributary/attribute_spec.rb[1:7:1] | passed | 0.0001 seconds |
data/Gemfile CHANGED
@@ -1,6 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
-
5
- # Specify your gem's dependencies in attributary.gemspec
6
3
  gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2018 Josh Brody
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -25,6 +25,16 @@ Or install it yourself as:
25
25
  Attributary.configure do |c|
26
26
  c.dsl_name = :donkey # defaults to :attrubute
27
27
  c.strict_mode = false # set this to `true` to skip casting in the writer method (raises TypeError)
28
+ c.raise_errors = false # set this to true to raise errors when collection/validation fails
29
+ end
30
+
31
+ You can also set this on an object-by-object basis.
32
+
33
+ class Character
34
+ include Attributary::DSL
35
+ attributary do |c|
36
+ c.raise_errors = true
37
+ end
28
38
  end
29
39
 
30
40
  ### Actually using it
@@ -60,6 +70,10 @@ Have to initialize other stuff? Send a hash to attributary_initialize
60
70
  include Attributary::Initializer
61
71
  include Attributary::DSL
62
72
 
73
+ attributary do |c|
74
+ c.raise_errors = true
75
+ end
76
+
63
77
  donkey :gender, :symbol, default: :male
64
78
 
65
79
  def initialize(name, attributary_attributes = {})
@@ -82,6 +96,10 @@ Simply pass an array of the possible options for the attribute.
82
96
  class Character
83
97
  include Attributary::DSL
84
98
 
99
+ attributary do |c|
100
+ c.raise_errors = true
101
+ end
102
+
85
103
  donkey :gender, :symbol, default: :male, collection: [:male, :female]
86
104
  end
87
105
 
@@ -99,6 +117,10 @@ Pass a proc or a method name.
99
117
  class Character
100
118
  include Attributary::DSL
101
119
 
120
+ attributary do |c|
121
+ c.raise_errors = true
122
+ end
123
+
102
124
  donkey :gender, :symbol, default: :male, validates: proc { |value| [:male, :female].include?(value) }
103
125
  end
104
126
 
@@ -107,7 +129,6 @@ Pass a proc or a method name.
107
129
  character.gender = :left # raises CollectionValidationError
108
130
  character.gender = 'female' # gets casted correctly, and doesn't raise an error
109
131
 
110
-
111
132
  ### Types
112
133
 
113
134
  Supports some really naive typecasting. [See the supported types](https://github.com/joshmn/attributary/tree/master/lib/attributary/types). Create your own by inheriting from `Attributary::Types` and naming it like `ClassNameType`
@@ -122,6 +143,22 @@ Supports some really naive typecasting. [See the supported types](https://github
122
143
  end
123
144
  end
124
145
 
146
+ ## Error handling
147
+
148
+ If the configuration `raise_errors` is false, the object will have their accessible errors on the `attributary_errors` instance method, which is a hash of `{attribute_name: error object}`
149
+
150
+ class Character
151
+ include Attributary::DSL
152
+
153
+ donkey :gender, :symbol, default: :male, :collection => [:male, :female]
154
+ end
155
+
156
+ character = Character.new
157
+ character.attributary_errors # {}
158
+ character.gender = :left # raises CollectionValidationError
159
+ character.gender = 'female' # gets casted correctly, and doesn't raise an error
160
+
161
+
125
162
  ## Contributing
126
163
 
127
164
  Bug reports and pull requests are welcome on GitHub at https://github.com/joshmn/attributary
data/attributary.gemspec CHANGED
@@ -7,6 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.version = Attributary::VERSION
8
8
  spec.authors = ['Josh Brody']
9
9
  spec.email = ['josh@josh.mn']
10
+ spec.licenses = ['MIT']
10
11
 
11
12
  spec.summary = 'Like ActiveModel::Attributes but less fluffy and more attribute-y.'
12
13
  spec.description = 'Like `ActiveModel::Attributes` but less fluffy and more attribute-y.'
@@ -18,7 +19,10 @@ Gem::Specification.new do |spec|
18
19
  spec.bindir = 'exe'
19
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
21
  spec.require_paths = ['lib']
22
+ spec.files += Dir['lib/**/*.rb']
21
23
 
22
24
  spec.add_development_dependency 'bundler', '~> 1.15'
23
25
  spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'pry', '~> 0.11.3'
27
+ spec.add_development_dependency 'rspec', '~> 3.0'
24
28
  end
data/lib/attributary.rb CHANGED
@@ -1,9 +1,19 @@
1
- require_relative 'attributary/config'
2
- require_relative 'attributary/core_ext'
3
- require_relative 'attributary/type'
4
- require_relative 'attributary/initializer'
5
- require_relative 'attributary/dsl'
6
- require_relative 'attributary/version'
1
+ require 'attributary/errors'
2
+ require 'attributary/config'
3
+ require 'attributary/core_ext'
4
+ require 'attributary/type'
5
+ require 'attributary/types/array_type'
6
+ require 'attributary/types/big_decimal_type'
7
+ require 'attributary/types/boolean_type'
8
+ require 'attributary/types/float_type'
9
+ require 'attributary/types/hash_type'
10
+ require 'attributary/types/integer_type'
11
+ require 'attributary/types/string_type'
12
+ require 'attributary/types/symbol_type'
13
+ require 'attributary/initializer'
14
+ require 'attributary/serializer'
15
+ require 'attributary/dsl'
16
+ require 'attributary/version'
7
17
 
8
18
  module Attributary
9
19
  end
@@ -0,0 +1,7 @@
1
+ module Attributary
2
+ module All
3
+ include Attributary::DSL
4
+ include Attributary::Initializer
5
+ include Attributary::Serializer
6
+ end
7
+ end
@@ -13,11 +13,17 @@ module Attributary
13
13
  end
14
14
 
15
15
  class Config
16
- attr_accessor :dsl_name, :strict_mode
17
-
16
+ attr_accessor :validation_error, :collection_error, :strict_mode, :dsl_name, :raise_errors
18
17
  def initialize
19
- @dsl_name = :attribute
18
+ @validation_error = ::Attributary::ValidationError
19
+ @collection_error = ::Attributary::CollectionValidationError
20
20
  @strict_mode = false
21
+ @dsl_name = :attribute
22
+ @raise_errors = false
23
+ end
24
+
25
+ def raise_errors?
26
+ @raise_errors
21
27
  end
22
28
 
23
29
  def strict_mode?
@@ -1,87 +1,28 @@
1
+ require 'attributary/dsl/accessors'
2
+ require 'attributary/dsl/castings'
3
+ require 'attributary/dsl/error'
4
+ require 'attributary/dsl/helpers'
5
+ require 'attributary/dsl/validations'
6
+
1
7
  module Attributary
2
8
  module DSL
3
- class ValidationError < StandardError; end
4
- class CollectionValidationError < StandardError; end
5
9
 
6
10
  def self.included(base)
7
11
  base.extend ClassMethods
12
+ base.include InstanceMethods
8
13
  end
9
14
 
10
- module ClassMethods
11
- def _attributary_attribute_set
12
- @_attributary_attribute_set ||= {}
13
- end
14
-
15
- def _attributary_attributes
16
- hash = {}
17
- _attributary_attribute_set.keys.each do |k|
18
- hash[k] = instance_variable_get(:"@#{k}")
19
- end
20
- hash
21
- end
22
-
23
- define_method(Attributary.configuration.dsl_name) do |name, type, options = {}|
24
- options[:type] = type
25
- _attributary_attribute_set[name] = options
26
- _attributary_reader(name, type, options)
27
- _attributary_writer(name, type, options)
28
- end
29
-
30
- def _attributary_reader(name, type, options)
31
- define_method(name) do
32
- instance_variable_get(:"@#{name}") || if options[:default].is_a?(Proc)
33
- options[:default].call
34
- else
35
- options[:default]
36
- end
37
- end
38
- if type == :boolean
39
- define_method("#{name}?") do
40
- send(name.to_s)
41
- end
42
- end
43
- end
44
-
45
- def _attributary_writer(name, type, options)
46
- define_method("#{name}=") do |value|
47
- value = self.class._attributary_cast_to(type, value) unless Attributary.configuration.strict_mode?
48
- self.class._attributary_check_collection(value, options[:collection]) if options[:collection].is_a?(Array)
49
- self.class._attributary_validate_attribute(value, options[:validates])
50
- instance_variable_set(:"@#{name}", value)
51
- end
52
- end
53
-
54
- def _attributary_check_collection(value, collection)
55
- unless collection.include?(value)
56
- raise CollectionValidationError, "Value `#{value}' is not in the collection #{collection}."
57
- end
58
- end
59
-
60
- def _attributary_validate_attribute(value, validator)
61
- return true if validator.nil?
62
- raise ValidationError, 'Validator failed.' unless validator.call(value)
63
- end
64
-
65
- def _attributary_cast_to(type, value)
66
- cast_klass = _attributary_cast_class(type)
67
- cast_klass.cast_to(value)
68
- end
69
-
70
- def _attributary_cast_class(type)
71
- cast_klass_name = _attributary_cast_class_name(type)
72
- cast_klass = cast_klass_name.safe_constantize
73
- if cast_klass.nil?
74
- raise NameError, "#{cast_klass_name} is not a valid type."
75
- end
76
- unless cast_klass.respond_to?(:cast_to)
77
- raise NoMethodError, "#{cast_klass} should have a class-method of cast_to"
78
- end
79
- cast_klass
15
+ module InstanceMethods
16
+ def attributary_errors
17
+ self.class._attributary_errors
80
18
  end
19
+ end
81
20
 
82
- def _attributary_cast_class_name(type)
83
- "Attributary::Types::#{type.to_s.split('_').map(&:capitalize).join}Type"
84
- end
21
+ module ClassMethods
22
+ include Accessors
23
+ include Castings
24
+ include Helpers
25
+ include Validations
85
26
  end
86
27
  end
87
28
  end
@@ -0,0 +1,45 @@
1
+ module Attributary
2
+ module DSL
3
+ module Accessors
4
+
5
+ define_method(Attributary.configuration.dsl_name) do |name, type, options = {}|
6
+ options[:type] = type
7
+ _attributary_attribute_set[name] = options
8
+ _attributary_writer(name, type, options)
9
+ _attributary_reader(name, type, options)
10
+ end
11
+
12
+ def _attributary_writer(name, type, options)
13
+ define_method("#{name}=") do |value|
14
+ value = self.class._attributary_cast_to(type, value) unless self.class._attributary_config.strict_mode?
15
+ write = true
16
+ write = self.class._attributary_check_collection(name, value, options[:collection]) if options[:collection].is_a?(Array)
17
+ write = self.class._attributary_validate_attribute(name, value, options[:validate]) if options[:validate].is_a?(Proc)
18
+ if options[:validate].is_a?(Symbol)
19
+ unless send(options[:validate])
20
+ self.class._attributary_handle_error(name, value, :validation)
21
+ end
22
+ end
23
+ instance_variable_set(:"@#{name}", value) if write
24
+ end
25
+ end
26
+
27
+ def _attributary_reader(name, type, options)
28
+ define_method(name) do
29
+ instance_variable_get(:"@#{name}") || self.class._attributary_default_for_method(type, options[:default])
30
+ end
31
+ if type == :boolean
32
+ define_method("#{name}?") do
33
+ send(name.to_s)
34
+ end
35
+ end
36
+ end
37
+
38
+ def _attributary_default_for_method(type, value)
39
+ return nil if value.nil?
40
+ _attributary_cast_to(type, value)
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,28 @@
1
+ module Attributary
2
+ module DSL
3
+ module Castings
4
+
5
+ def _attributary_cast_to(type, value)
6
+ cast_klass = _attributary_cast_class(type)
7
+ cast_klass.cast_to(value)
8
+ end
9
+
10
+ def _attributary_cast_class(type)
11
+ cast_klass_name = _attributary_cast_class_name(type)
12
+ cast_klass = cast_klass_name.safe_constantize
13
+ if cast_klass.nil?
14
+ raise NameError, "#{cast_klass_name} is not a valid type."
15
+ end
16
+ unless cast_klass.respond_to?(:cast_to)
17
+ raise NoMethodError, "#{cast_klass} should have a class-method of cast_to"
18
+ end
19
+ cast_klass
20
+ end
21
+
22
+ def _attributary_cast_class_name(type)
23
+ "Attributary::Types::#{type.to_s.split('_').map(&:capitalize).join}Type"
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,13 @@
1
+ module Attributary
2
+ module DSL
3
+ class AttributaryError
4
+ attr_reader :name, :klass, :message
5
+ def initialize(name, klass, message)
6
+ @name = name
7
+ @klass = klass
8
+ @message = message
9
+ end
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,38 @@
1
+ module Attributary
2
+ module DSL
3
+ module Helpers
4
+ def attributary(&block)
5
+ block.call(_attributary_config)
6
+ end
7
+
8
+ def _attributary_config
9
+ @_attributary_config ||= Attributary::Config.new
10
+ end
11
+
12
+ def _attributary_attribute_set
13
+ @_attributary_attribute_set ||= {}
14
+ end
15
+
16
+ def _attributary_errors
17
+ @_attributary_errors ||= {}
18
+ end
19
+
20
+ def attributary_errors
21
+ _attributary_errors
22
+ end
23
+
24
+ def _attributary_attributes
25
+ hash = {}
26
+ _attributary_attribute_set.keys.each do |k|
27
+ hash[k] = instance_variable_get(:"@#{k}")
28
+ end
29
+ hash
30
+ end
31
+
32
+ def _attributary_valid?
33
+ _attributary_errors.empty?
34
+ end
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,42 @@
1
+ module Attributary
2
+ module DSL
3
+ module Validations
4
+
5
+ def _attributary_handle_error(attribute, value, type, options = {})
6
+ message = options[:message] || "#{attribute} value #{value} is invalid."
7
+ error = _attributary_config.send("#{type}_error")
8
+ if error.is_a?(Proc)
9
+ error = error.call(attribute, value)
10
+ end
11
+ if quiet_errors?
12
+ _add_attributary_error(attribute, error.class, message)
13
+ return
14
+ end
15
+ raise error, message
16
+ end
17
+
18
+ def _attributary_check_collection(attribute, value, collection)
19
+ unless collection.include?(value)
20
+ _attributary_handle_error(attribute, value, :collection, :message => "Attribute #{attribute} `#{value}' is not in the collection #{collection}")
21
+ false
22
+ end
23
+ end
24
+
25
+ def _attributary_validate_attribute(attribute, value, validator)
26
+ return true if validator.nil?
27
+ unless validator.call(value)
28
+ _attributary_handle_error(attribute, value, :validation)
29
+ false
30
+ end
31
+ end
32
+
33
+ def _add_attributary_error(name, klass, message)
34
+ self._attributary_errors[name] = AttributaryError.new(name, klass, message)
35
+ end
36
+
37
+ def quiet_errors?
38
+ !_attributary_config.raise_errors?
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,4 @@
1
+ module Attributary
2
+ class ValidationError < StandardError; end
3
+ class CollectionValidationError < StandardError; end
4
+ end
@@ -6,7 +6,7 @@ module Attributary
6
6
 
7
7
  def attributary_initialize(options = {})
8
8
  options.each do |k, v|
9
- send("#{k}=", v) if attribute_set[k]
9
+ send("#{k}=", v) if self.class._attributary_attribute_set[k]
10
10
  end
11
11
  end
12
12
  end
@@ -0,0 +1,21 @@
1
+ module Attributary
2
+ module Serializer
3
+ def self.included(base)
4
+ base.include InstanceMethods
5
+ end
6
+
7
+ module InstanceMethods
8
+ def read_attribute_for_serialization(attribute_name)
9
+ send(attribute_name)
10
+ end
11
+
12
+ def as_json
13
+ hash = {}
14
+ self.class._attributary_attribute_set.keys.each do |key|
15
+ hash[key] = read_attribute_for_serialization(key)
16
+ end
17
+ hash
18
+ end
19
+ end
20
+ end
21
+ end
@@ -7,12 +7,3 @@ module Attributary
7
7
  end
8
8
  end
9
9
  end
10
-
11
- require_relative 'types/array_type'
12
- require_relative 'types/big_decimal_type'
13
- require_relative 'types/boolean_type'
14
- require_relative 'types/float_type'
15
- require_relative 'types/hash_type'
16
- require_relative 'types/integer_type'
17
- require_relative 'types/string_type'
18
- require_relative 'types/symbol_type'
@@ -1,3 +1,3 @@
1
1
  module Attributary
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.1.3'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attributary
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Brody
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-06-18 00:00:00.000000000 Z
11
+ date: 2018-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.11.3
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.11.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
41
69
  description: Like `ActiveModel::Attributes` but less fluffy and more attribute-y.
42
70
  email:
43
71
  - josh@josh.mn
@@ -46,7 +74,9 @@ extensions: []
46
74
  extra_rdoc_files: []
47
75
  files:
48
76
  - ".gitignore"
77
+ - ".rspec_status"
49
78
  - Gemfile
79
+ - LICENSE
50
80
  - README.md
51
81
  - Rakefile
52
82
  - attributary.gemspec
@@ -55,10 +85,18 @@ files:
55
85
  - lib/.DS_Store
56
86
  - lib/attributary.rb
57
87
  - lib/attributary/.DS_Store
88
+ - lib/attributary/all.rb
58
89
  - lib/attributary/config.rb
59
90
  - lib/attributary/core_ext.rb
60
91
  - lib/attributary/dsl.rb
92
+ - lib/attributary/dsl/accessors.rb
93
+ - lib/attributary/dsl/castings.rb
94
+ - lib/attributary/dsl/error.rb
95
+ - lib/attributary/dsl/helpers.rb
96
+ - lib/attributary/dsl/validations.rb
97
+ - lib/attributary/errors.rb
61
98
  - lib/attributary/initializer.rb
99
+ - lib/attributary/serializer.rb
62
100
  - lib/attributary/type.rb
63
101
  - lib/attributary/types/array_type.rb
64
102
  - lib/attributary/types/big_decimal_type.rb
@@ -70,7 +108,8 @@ files:
70
108
  - lib/attributary/types/symbol_type.rb
71
109
  - lib/attributary/version.rb
72
110
  homepage: https://github.com/joshmn/attributary
73
- licenses: []
111
+ licenses:
112
+ - MIT
74
113
  metadata: {}
75
114
  post_install_message:
76
115
  rdoc_options: []