statham 0.1.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: 6b874caa4c2b43695d5b4df17ba6afe935cea0b2
4
+ data.tar.gz: f021b56b8ec690530247373a3a549c785b2fdab3
5
+ SHA512:
6
+ metadata.gz: f2be195a49962c4d8ca0e40e3e124802d568900ca2f87e20619cf77719cbdc16741a6c68ad4f72765f5a993f7f5d196bfbd4c4003a5daaabed10537b13649bd3
7
+ data.tar.gz: 82b4bac5b759c7ff0db07cb1508d212102b9aba218a86c4ac335db95e0d036bfb98c902d07b27526f689cb819af9a31484b7d1a4501f1140885ecf0899267866
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in statham.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Inbeom Hwang
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # Statham
2
+
3
+ Do serialization like boss.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'statham'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ ## Usage
16
+
17
+ Mix in `Statham::Document` in models you want:
18
+
19
+ class Post < ActiveRecord::Base
20
+ include Statham::Document
21
+ end
22
+
23
+ Do migration:
24
+
25
+ change_table :post do |t|
26
+ t.text :metadata
27
+ end
28
+
29
+ Define schema for serialization:
30
+
31
+ class Post < ActiveRecord::Base
32
+ include Statham::Document
33
+
34
+ statham :metadata do |json|
35
+ json.attribute :transporter, type: :string, default: 'frank'
36
+ json.attribute :italian_job, type: :integer
37
+ json.attribute :the_expandables, type: :boolean
38
+ end
39
+ end
40
+
41
+ That's it.
42
+
43
+ The attributes defined in the JSON behaves like regular attributes. Thus You can
44
+ use them on forms and views:
45
+
46
+ <%= form_for @post do |f| %>
47
+ <%= f.checkbox :the_expandables %>
48
+ <%= f.input :transporter %>
49
+ <%= f.input :italian_job %>
50
+ <% end %>
51
+
52
+ ## Contributing
53
+
54
+ 1. Fork it
55
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
56
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
57
+ 4. Push to the branch (`git push origin my-new-feature`)
58
+ 5. Create new Pull Request
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,61 @@
1
+ module Statham
2
+ # Internal: Attributes serialized inside JSON.
3
+ class Attribute
4
+ # Internal: Type of the attribute.
5
+ attr_accessor :type
6
+ # Internal: Default value for the attribute.
7
+ attr_accessor :default
8
+
9
+ # Internal: Initialize the attribute.
10
+ #
11
+ # options - The hash options used for defining new attributes:
12
+ # type - Type of the attribute.
13
+ # default - Default value for the attribute.
14
+ #
15
+ # Returns new Statham::Attribute object.
16
+ def initialize(options = {})
17
+ @type = options[:type]
18
+ @default = options[:default]
19
+ end
20
+
21
+ # Internal: Serializes value to be JSON-compatible.
22
+ #
23
+ # value - Value to serialize.
24
+ #
25
+ # Returns serialized value.
26
+ def serialize(value)
27
+ serialized = value.nil? ? nil : casted_to_type(value)
28
+
29
+ serialized.nil? && !@default.nil? ? @default : serialized
30
+ end
31
+
32
+ # Internal: Deserializes JSON-compatible value to native one.
33
+ #
34
+ # value - Value to deserialize.
35
+ #
36
+ # Returns deserialized value.
37
+ def deserialize(value)
38
+ deserialized = value.nil? ? nil : casted_to_type(value)
39
+
40
+ deserialized.nil? && !@default.nil? ? @default : deserialized
41
+ end
42
+
43
+ protected
44
+
45
+ # Internal: Casts value to type defined for the attribute.
46
+ #
47
+ # value - Value to cast type.
48
+ #
49
+ # Returns value with type casted.
50
+ def casted_to_type(value)
51
+ case @type
52
+ when :boolean
53
+ ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
54
+ when :integer
55
+ value.to_i
56
+ else
57
+ value.to_s
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,47 @@
1
+ module Statham
2
+ # Public: Collection of definition of child attributes inside JSON.
3
+ class AttributeSet
4
+ # Public: Name of the parent JSON attribute.
5
+ attr_reader :name
6
+ # Public: AttributeSet defined in the parent class of the owner of the
7
+ # AttributeSet.
8
+ attr_reader :parent
9
+
10
+ # Internal: Initialize an AttributeSet.
11
+ #
12
+ # options - The hash options used to define AttributeSets:
13
+ # :name - Name of the parent attribute.
14
+ #
15
+ # Returns new AttributeSet.
16
+ def initialize(options = {})
17
+ @name = options[:name]
18
+ @parent = options[:parent]
19
+ @attributes = {}
20
+ end
21
+
22
+ # Public: Define an attribute serialized inside JSON.
23
+ #
24
+ # name - Name of the attribute.
25
+ # options - The hash options used to define new attribute:
26
+ # :type - Type of the attribute.
27
+ # :default - Default value for the attribute.
28
+ #
29
+ # Returns nothing.
30
+ def attribute(name, options = {})
31
+ @attributes[name] = Statham::Attribute.new(options)
32
+ end
33
+
34
+ # Public: Collection of attributes definition. If parent AttributeSet
35
+ # exists, it merges attributes on the AttributeSet with attributes of
36
+ # parent.
37
+ #
38
+ # Returns Hash collection of attributes.
39
+ def attributes
40
+ if @parent
41
+ @attributes.reverse_merge @parent.attributes
42
+ else
43
+ @attributes
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,92 @@
1
+ module Statham
2
+ # Public: Mixin for ActiveRecord models which enables defining attributes
3
+ # serialized into a JSON attribute.
4
+ #
5
+ # Examples
6
+ #
7
+ # class Foo < ActiveRecord::Base
8
+ # include Statham::Document
9
+ #
10
+ # statham :metdata do |json|
11
+ # json.attribute :foo, type: :integer
12
+ # json.attribute :bar
13
+ # end
14
+ # end
15
+ #
16
+ # Each attribute is given name and options including type and default value.
17
+ module Document
18
+ extend ActiveSupport::Concern
19
+
20
+ module ClassMethods
21
+ # Public: Initializes and creates JSON attribute with specified name
22
+ # containing defined child attributes.
23
+ #
24
+ # column_name - Symbol object containing name of parent JSON column.
25
+ # block - Required block containing definitions for child
26
+ # attributes.
27
+ #
28
+ # Returns Statham::AttributeSet object for newly defined parent JSON.
29
+ def statham(column_name, &block)
30
+ parent = parent_statham_attribute_set_for(column_name)
31
+ attribute_set = statham_attribute_sets[column_name] ||= Statham::AttributeSet.new(name: column_name, parent: parent)
32
+
33
+ yield attribute_set if block_given?
34
+
35
+ apply_statham_attribute_set(attribute_set)
36
+ end
37
+
38
+ # Internal: Collection of JSON attributes used as parent attributes for a
39
+ # class.
40
+ #
41
+ # Returns hash object for the collection.
42
+ def statham_attribute_sets
43
+ statham_attribute_sets_collection[self] ||= {}
44
+ end
45
+
46
+ # Internal: Collection of statham_attribute_sets for related classes.
47
+ #
48
+ # Returns hash object for the collection.
49
+ def statham_attribute_sets_collection
50
+ @@attribute_sets_collection ||= {}
51
+ end
52
+
53
+ # Internal: Find AttributeSets defined in parent classes and return the
54
+ # nearest AttributeSet if it exists.
55
+ #
56
+ # column_name - Name of the column to find.
57
+ #
58
+ # Returns AttributeSet with parent set.
59
+ def parent_statham_attribute_set_for(column_name)
60
+ parent = statham_attribute_sets_collection.inject({}) do |parents, (klass, attribute_sets)|
61
+ if klass > self && parent_attribute_set = attribute_sets[column_name]
62
+ parents.merge(klass => parent_attribute_set)
63
+ else
64
+ parents
65
+ end
66
+ end.sort.first
67
+
68
+ parent && parent.last
69
+ end
70
+
71
+ # Internal: Define required getter/setter methods for child attributes
72
+ # in JSON and set up ActiveRecord serialization with the set.
73
+ #
74
+ # set - AttributeSet object to apply.
75
+ #
76
+ # Returns attributes in AttributeSet object.
77
+ def apply_statham_attribute_set(attribute_set)
78
+ serialize attribute_set.name, Statham::Serializer.new(attribute_set)
79
+
80
+ attribute_set.attributes.each do |name, attribute|
81
+ define_method(name) do
82
+ attribute.deserialize(send(attribute_set.name)[name])
83
+ end
84
+
85
+ define_method("#{name}=") do |value|
86
+ send(attribute_set.name)[name] = attribute.serialize(value)
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,59 @@
1
+ module Statham
2
+ # Internal: Serializes/deserializes collection of attributes into/from JSON.
3
+ class Serializer
4
+ # Internal: Initializes Serializer.
5
+ #
6
+ # attribute_set - AttributeSet object for definition of the attributes.
7
+ #
8
+ # Returns new Serializer object.
9
+ def initialize(attribute_set)
10
+ @attribute_set = attribute_set
11
+ end
12
+
13
+ # Internal: Serializes object.
14
+ #
15
+ # object - Object to serialize.
16
+ #
17
+ # Returns JSON string for the object.
18
+ def dump(object)
19
+ ActiveSupport::JSON.encode(serialize_with_attributes(object))
20
+ end
21
+
22
+ # Internal: Deserializes JSON string into object.
23
+ #
24
+ # json - JSON string to deserialize.
25
+ #
26
+ # Returns Hash object deserialized from the JSON.
27
+ def load(json)
28
+ object = json ? ActiveSupport::HashWithIndifferentAccess.new(ActiveSupport::JSON.decode(json)) : Hash.new
29
+
30
+ deserialize_with_attributes(object)
31
+ end
32
+
33
+ protected
34
+
35
+ # Internal: Serialize values in specified hash object using options used to
36
+ # define attributes.
37
+ #
38
+ # object - Object to serialize.
39
+ #
40
+ # Returns Hash containing serialized values.
41
+ def serialize_with_attributes(object)
42
+ @attribute_set.attributes.inject(object) do |serialized, (name, attribute)|
43
+ serialized.merge name => attribute.serialize(object[name])
44
+ end
45
+ end
46
+
47
+ # Internal: Deserialize values in specified hash object using options used
48
+ # to define attributes.
49
+ #
50
+ # object - Object to deserialize.
51
+ #
52
+ # Returns Hash containing deserialized values.
53
+ def deserialize_with_attributes(object)
54
+ @attribute_set.attributes.inject(object) do |serialized, (name, attribute)|
55
+ serialized.merge name => attribute.deserialize(object[name])
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,3 @@
1
+ module Statham
2
+ VERSION = '0.1.1'
3
+ end
data/lib/statham.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'active_support'
2
+ require 'active_support/hash_with_indifferent_access'
3
+
4
+ require 'statham/version'
5
+ require 'statham/document'
6
+ require 'statham/attribute'
7
+ require 'statham/attribute_set'
8
+ require 'statham/serializer'
@@ -0,0 +1,6 @@
1
+ require 'rspec'
2
+ Dir['./spec/support/**/*.rb'].sort.each { |f| require f }
3
+
4
+ require 'bundler/setup'
5
+ require 'active_record'
6
+ require 'statham'
@@ -0,0 +1,5 @@
1
+ require 'active_record'
2
+
3
+ ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
4
+ ActiveRecord::Migration.verbose = false
5
+ require File.join(File.dirname(__FILE__), 'schema')
@@ -0,0 +1,5 @@
1
+ ActiveRecord::Schema.define(version: 20131213121829) do
2
+ create_table "attributes_test_model", force: true do |t|
3
+ t.text "foo"
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Statham::AttributeSet do
4
+ describe '#attribute' do
5
+ let(:attribute_set) { Statham::AttributeSet.new }
6
+
7
+ it { expect { attribute_set.attribute(:foo) }.to change { attribute_set.attributes } }
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Statham::Attribute do
4
+ describe '#serialize' do
5
+ context 'when type is boolean' do
6
+ let(:attribute) { Statham::Attribute.new(type: :boolean) }
7
+
8
+ it { expect(attribute.serialize(nil)).to be_nil }
9
+ it { expect(attribute.serialize(true)).to be_true }
10
+ it { expect(attribute.serialize(false)).to be_false }
11
+ it { expect(attribute.serialize('1')).to be_true }
12
+ it { expect(attribute.serialize('0')).to be_false }
13
+ end
14
+
15
+ context 'when default value is set' do
16
+ let(:default) { 'hello' }
17
+ let(:value) { 'world' }
18
+ let(:attribute) { Statham::Attribute.new(default: default) }
19
+
20
+ it { expect(attribute.serialize(nil)).to eq(default) }
21
+ it { expect(attribute.serialize(value)).to eq(value) }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ class AttributesTestModel < ActiveRecord::Base
4
+ include Statham::Document
5
+
6
+ statham :foo do |json|
7
+ json.attribute :bar
8
+ end
9
+ end
10
+
11
+ class ChildTestModel < AttributesTestModel
12
+ statham :foo do |json|
13
+ json.attribute :baz
14
+ end
15
+ end
16
+
17
+ class ChildChildTestModel < ChildTestModel
18
+ statham :foo do |json|
19
+ json.attribute :qux
20
+ end
21
+ end
22
+
23
+ describe Statham::Document do
24
+ describe '.statham_attribute_sets' do
25
+ it { expect(AttributesTestModel.statham_attribute_sets).to be_a(Hash) }
26
+ it { expect(AttributesTestModel.statham_attribute_sets.keys).to eq([:foo]) }
27
+ it { expect(ChildTestModel.statham_attribute_sets).to be_a(Hash) }
28
+ it { expect(ChildTestModel.statham_attribute_sets.keys).to eq([:foo]) }
29
+ end
30
+
31
+ describe '.parent_statham_attribute_set_for' do
32
+ it { expect(ChildTestModel.parent_statham_attribute_set_for(:foo)).to eq(AttributesTestModel.statham_attribute_sets[:foo]) }
33
+ it { expect(ChildChildTestModel.parent_statham_attribute_set_for(:foo)).to eq(ChildTestModel.statham_attribute_sets[:foo]) }
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Statham::Serializer do
4
+ let(:attribute_set) { Statham::AttributeSet.new(name: :foobar) }
5
+
6
+ describe '#dump' do
7
+ let(:statham_column) { Statham::Serializer.new(attribute_set) }
8
+ let(:object) { { foo: 'bar' } }
9
+
10
+ it { expect(statham_column.dump(object)).to eq('{"foo":"bar"}') }
11
+ it { expect(ActiveSupport::JSON.decode(statham_column.dump(object))).to eq({ 'foo' => 'bar' }) }
12
+
13
+ context 'when attribute_set has attributes' do
14
+ let(:baz_default) { 'bazbaz' }
15
+
16
+ before do
17
+ attribute_set.attribute :baz, default: baz_default
18
+ end
19
+
20
+ it { expect(ActiveSupport::JSON.decode(statham_column.dump(object))).to eq({ 'foo' => 'bar', 'baz' => baz_default }) }
21
+ end
22
+ end
23
+
24
+ describe '#load' do
25
+ let(:statham_column) { Statham::Serializer.new(attribute_set) }
26
+ let(:object_json) { ActiveSupport::JSON.encode({ foo: 'bar' }) }
27
+
28
+ it { expect(statham_column.load(object_json)).to eq({ 'foo' => 'bar' }) }
29
+ it { expect(statham_column.load(object_json)[:foo]).to eq('bar') }
30
+ end
31
+ end
data/statham.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'statham/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'statham'
8
+ spec.version = Statham::VERSION
9
+ spec.authors = ['Inbeom Hwang']
10
+ spec.email = ['hwanginbeom@gmail.com']
11
+ spec.description = %q{Manage JSON object in string typed attributes for ActiveRecord models}
12
+ spec.summary = %q{JSON objects for attributes}
13
+ spec.homepage = ''
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'activesupport'
22
+ spec.add_dependency 'activerecord'
23
+
24
+ spec.add_development_dependency 'bundler', "~> 1.3"
25
+ spec.add_development_dependency 'rake'
26
+ spec.add_development_dependency 'rspec'
27
+ spec.add_development_dependency 'sqlite3'
28
+ end
metadata ADDED
@@ -0,0 +1,155 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: statham
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Inbeom Hwang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sqlite3
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Manage JSON object in string typed attributes for ActiveRecord models
98
+ email:
99
+ - hwanginbeom@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - .gitignore
105
+ - Gemfile
106
+ - LICENSE.txt
107
+ - README.md
108
+ - Rakefile
109
+ - lib/statham.rb
110
+ - lib/statham/attribute.rb
111
+ - lib/statham/attribute_set.rb
112
+ - lib/statham/document.rb
113
+ - lib/statham/serializer.rb
114
+ - lib/statham/version.rb
115
+ - spec/spec_helper.rb
116
+ - spec/support/active_record.rb
117
+ - spec/support/schema.rb
118
+ - spec/unit/attribute_set_spec.rb
119
+ - spec/unit/attribute_spec.rb
120
+ - spec/unit/document_spec.rb
121
+ - spec/unit/serializer_spec.rb
122
+ - statham.gemspec
123
+ homepage: ''
124
+ licenses:
125
+ - MIT
126
+ metadata: {}
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - '>='
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ requirements: []
142
+ rubyforge_project:
143
+ rubygems_version: 2.0.6
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: JSON objects for attributes
147
+ test_files:
148
+ - spec/spec_helper.rb
149
+ - spec/support/active_record.rb
150
+ - spec/support/schema.rb
151
+ - spec/unit/attribute_set_spec.rb
152
+ - spec/unit/attribute_spec.rb
153
+ - spec/unit/document_spec.rb
154
+ - spec/unit/serializer_spec.rb
155
+ has_rdoc: