fars 0.0.1 → 0.0.2

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.
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Array#serialize' do
4
+ subject { %w{green blue grey} }
5
+ let(:json_data) { { colors: [{ color: 'green' }, { color: 'blue' }, { color: 'grey' }] }.to_json }
6
+
7
+ specify 'with proc as item serializer' do
8
+ subject.serialize(root_key: :colors,
9
+ serializer: Proc.new { |c| { color: c } }).should == json_data
10
+ end
11
+
12
+ specify 'with block as item serializer' do
13
+ subject.serialize(root_key: :colors) { |c| { color: c } }.should == json_data
14
+ end
15
+
16
+ specify 'with custom class as item serializer' do
17
+ subject.serialize(root_key: :colors, serializer: 'ColorSerializer').should == json_data
18
+ end
19
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fars::BaseCollectionSerializer do
4
+ before(:each) do
5
+ 1.upto(2) { |i| Master.create(id: i, name: "Object#{i}", data: '123') }
6
+ 1.upto(3) { |i| Slave.create(id: i, master_id: (i % 2) + 1, name: "Slave #{i}") }
7
+ end
8
+
9
+ context 'without API version' do
10
+ context '#to_json' do
11
+ it 'returns all fields with metadata' do
12
+ json_data = { masters: [
13
+ { master: { id: 1, name: 'Object1' }, _metadata: { metadata: :present } },
14
+ { master: { id: 2, name: 'Object2' }, _metadata: { metadata: :present } }
15
+ ] }.to_json
16
+
17
+ described_class.new(Master.where('1 = 1'),
18
+ add_metadata: true,
19
+ fields: [:id, :name]
20
+ ).to_json.should == json_data
21
+ end
22
+ end
23
+ end
24
+
25
+ context 'with API version' do
26
+ context '#to_json' do
27
+ it 'returns all fields and relations withot metadata' do
28
+ json_data = { masters: [
29
+ { master: { id: 1, name: 'Object1', data: '123', updated_at: '2014-04-14',
30
+ slaves: [{ slave: { id: 2, name: 'Slave 2', data: nil, updated_at: '2014-04-14' } }] } },
31
+ { master: { id: 2, name: 'Object2', data: '123', updated_at: '2014-04-14',
32
+ slaves: [
33
+ { slave: { id: 1, name: 'Slave 1', data: nil, updated_at: '2014-04-14'} },
34
+ { slave: { id: 3, name: 'Slave 3', data: nil, updated_at: '2014-04-14'} }
35
+ ] } }
36
+ ] }.to_json
37
+
38
+ described_class.new(Master.where('1 = 1'),
39
+ add_metadata: false,
40
+ api_version: 'V1'
41
+ ).to_json.should == json_data
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fars::BaseModelSerializer do
4
+ before :each do
5
+ @object = Master.create(id: 1, name: 'Object1', data: '123')
6
+ 1.upto(2) { |i| Slave.create(id: i, master_id: @object.id, name: "Slave #{i}") }
7
+ end
8
+
9
+ context 'without API version' do
10
+ context '#to_json' do
11
+ it 'returns all fields with metadata' do
12
+ json_data = {
13
+ master: { id: 1, name: 'Object1', data: '123' },
14
+ _metadata: { metadata: :present }
15
+ }.to_json
16
+
17
+ MasterSerializer.new(@object,
18
+ add_metadata: true,
19
+ fields: [:id, :name, :data]
20
+ ).to_json.should == json_data
21
+ end
22
+
23
+ it 'returns not all field, whithout metadata' do
24
+ json_data = { master: { id: 1, name: 'Object1' } }.to_json
25
+
26
+ MasterSerializer.new(@object,
27
+ add_metadata: false,
28
+ fields: [:id, :name]
29
+ ).to_json.should == json_data
30
+ end
31
+
32
+ it 'returns not all field, whithout metadata if serializer does not respond to meta method' do
33
+ json_data = { master: { id: 1, name: 'Object1' } }.to_json
34
+
35
+ MasterSerializer.any_instance.stub(:respond_to?).with(:meta).and_return(false)
36
+
37
+ MasterSerializer.new(@object,
38
+ fields: [:id, :name]
39
+ ).to_json.should == json_data
40
+ end
41
+
42
+ it 'returns all field with slaves' do
43
+ json_data = { master: { id: 1, name: 'Object1', data: '123',
44
+ slaves: [
45
+ { slave: { id: 1, name: 'Slave 1', data: nil } },
46
+ { slave: { id: 2, name: 'Slave 2', data: nil } },
47
+ ]}}.to_json
48
+
49
+ MasterSerializer.new(@object,
50
+ add_metadata: false,
51
+ fields: [:id, :name, :data, :slaves]
52
+ ).to_json.should == json_data
53
+ end
54
+
55
+ it 'returns all field with slaves' do
56
+ json_data = { master: { id: 1, name: 'Object1', data: '123',
57
+ slaves: [
58
+ { slave: { id: 1, name: 'Slave 1', data: nil } },
59
+ { slave: { id: 2, name: 'Slave 2', data: nil } },
60
+ ]}}.to_json
61
+
62
+ @object.serialize(
63
+ add_metadata: false,
64
+ fields: [:id, :name, :data, :slaves]
65
+ ).should == json_data
66
+ end
67
+ end
68
+ end
69
+
70
+ context 'with API version' do
71
+ context '#to_json' do
72
+ it 'returns all fields with metadata' do
73
+ json_data = {
74
+ master: { id: 1, name: 'Object1', data: '123' },
75
+ _metadata: { metadata: :present }
76
+ }.to_json
77
+
78
+ V1::MasterSerializer.new(@object,
79
+ add_metadata: true,
80
+ fields: [:id, :name, :data],
81
+ api_version: 'V1'
82
+ ).to_json.should == json_data
83
+ end
84
+
85
+ it 'returns not all field, whithout metadata' do
86
+ json_data = { master: { id: 1, name: 'Object1' } }.to_json
87
+
88
+ V1::MasterSerializer.new(@object,
89
+ add_metadata: false,
90
+ fields: [:id, :name],
91
+ api_version: 'V1'
92
+ ).to_json.should == json_data
93
+ end
94
+
95
+ it 'returns all field with slaves' do
96
+ json_data = { master: { id: 1, name: 'Object1', data: '123',
97
+ slaves: [
98
+ { slave: { id: 1, name: 'Slave 1', data: nil, updated_at: '2014-04-14' } },
99
+ { slave: { id: 2, name: 'Slave 2', data: nil, updated_at: '2014-04-14' } },
100
+ ]}}.to_json
101
+
102
+ V1::MasterSerializer.new(@object,
103
+ add_metadata: false,
104
+ fields: [:id, :name, :data, :slaves],
105
+ api_version: 'V1'
106
+ ).to_json.should == json_data
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Fars::BaseObjectSerializer do
4
+ before(:all) { Book = Struct.new(:isbn, :title, :author, :price, :count) }
5
+ let(:book) { Book.new('isbn1', 'title1', 'author1', 10, nil) }
6
+ let(:book2) { Book.new('isbn2', 'title2', 'author2', 20.0, 4) }
7
+ let(:book3) { Book.new('isbn3', 'title3', 'author3', 30.5, 7) }
8
+ let(:books) { [book, book2, book3] }
9
+
10
+ it 'serializes any object with appropriate serializer' do
11
+ BookSerializer.new(book).as_json.should ==
12
+ { book: { isbn: 'isbn1', title: 'title1', author: 'author1', price: '10.00', count: 0 } }
13
+ end
14
+
15
+ it 'includes only requested fields' do
16
+ BookSerializer.new(book, fields: [:isbn, :title, :price]).as_json.should ==
17
+ { book: { isbn: 'isbn1', title: 'title1', price: '10.00' } }
18
+ end
19
+
20
+ it 'includes only requested fields reduced by #available_attributes methods' do
21
+ book_serializer = BookSerializer.new(book, fields: [:isbn, :title, :price])
22
+ def book_serializer.available_attributes
23
+ [:isbn, :price]
24
+ end
25
+ book_serializer.as_json.should == { book: { isbn: 'isbn1', price: '10.00' } }
26
+ end
27
+
28
+ it 'serializes collection which consists of objects of same tipe with appropriate serializer' do
29
+ books.serialize(root_key: :books, serializer: 'BookSerializer', fields: [:isbn, :title, :price]).should =={ books: [
30
+ { book: { isbn: 'isbn1', title: 'title1', price: '10.00' } },
31
+ { book: { isbn: 'isbn2', title: 'title2', price: '20.00' } },
32
+ { book: { isbn: 'isbn3', title: 'title3', price: '30.50' } }
33
+ ] }.to_json
34
+ end
35
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Hash#serialize' do
4
+ subject do
5
+ { '2014-01' => { visitors: 23, visits: 114 }, '2014-02' => { visitors: 27, visits: 217 } }
6
+ end
7
+
8
+ specify 'with proc as item serializer' do
9
+ json_data = { stats: [{ month: '2014-01', visitors: 23 }, { month: '2014-02', visitors: 27 }] }.to_json
10
+
11
+ subject.serialize(root_key: :stats,
12
+ serializer: Proc.new { |k, v| { month: k, visitors: v[:visitors] } }).should == json_data
13
+ end
14
+
15
+ specify 'with block as item serializer' do
16
+ json_data = { stats: [{ month: '2014-01', visitors: 23 }, { month: '2014-02', visitors: 27 }] }.to_json
17
+
18
+ subject.serialize(root_key: :stats) do |k, v|
19
+ { month: k, visitors: v[:visitors] }
20
+ end.should == json_data
21
+ end
22
+
23
+ specify 'custom class as item serializer' do
24
+ json_data = { stats: [{ stat_key: '2014-01', stat_value: { visitors: 23, visits: 114 } },
25
+ { stat_key: '2014-02', stat_value: { visitors: 27, visits: 217 } }] }.to_json
26
+
27
+ subject.serialize(root_key: :stats, serializer: 'StatSerializer').should == json_data
28
+ end
29
+
30
+ specify 'with custom class as item serializer and without root_key' do
31
+ json_data = [{ stat_key: '2014-01', stat_value: { visitors: 23, visits: 114 } },
32
+ { stat_key: '2014-02', stat_value: { visitors: 27, visits: 217 } }].to_json
33
+
34
+ subject.serialize(root_key: false, serializer: 'StatSerializer').should == json_data
35
+ end
36
+ end
@@ -32,3 +32,9 @@ end
32
32
  root = File.dirname(__FILE__)
33
33
  db_config = YAML.load_file("#{root}/config/database.yml")
34
34
  ActiveRecord::Base.establish_connection(db_config)
35
+
36
+ Dir["./spec/support/**/*.rb"].each { |f| require f }
37
+
38
+ ActiveSupport::Inflector.inflections do |inflect|
39
+ inflect.irregular 'slave', 'slaves'
40
+ end
@@ -0,0 +1,3 @@
1
+ class Master < ActiveRecord::Base
2
+ has_many :slaves
3
+ end
@@ -0,0 +1,3 @@
1
+ class Slave < ActiveRecord::Base
2
+ belongs_to :master
3
+ end
@@ -0,0 +1,11 @@
1
+ class AnotherMasterSerializer < Fars::BaseModelSerializer
2
+ self.model = Master
3
+ self.root_key = :father
4
+ attributes :id, :name, # attrs
5
+ :number, # methods
6
+ :slaves
7
+
8
+ def number
9
+ 14
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ class BookSerializer < Fars::BaseObjectSerializer
2
+ attributes :isbn, :title, :author, # attrs
3
+ :price, :count # methods
4
+
5
+ def price
6
+ "%.2f" % object.price
7
+ end
8
+
9
+ def count
10
+ object.count.to_i
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ class ColorSerializer < Fars::BaseObjectSerializer
2
+ def as_json
3
+ { color: object }
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ class MasterSerializer < Fars::BaseModelSerializer
2
+ attributes :id, :name, :data, # attrs
3
+ :slaves
4
+
5
+ def meta
6
+ { 'metadata' => :present }
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ class SlaveSerializer < Fars::BaseModelSerializer
2
+ attributes :id, :name, :data # attrs
3
+ end
@@ -0,0 +1,5 @@
1
+ class StatSerializer < Fars::BaseObjectSerializer
2
+ def as_json
3
+ { stat_key: object[0], stat_value: object[1] }
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ module V1
2
+ class MasterSerializer < Fars::BaseModelSerializer
3
+ attributes :id, :name, :data, # attrs
4
+ :updated_at, # methods
5
+ :slaves
6
+
7
+ def updated_at
8
+ '2014-04-14'
9
+ end
10
+
11
+ def meta
12
+ { 'metadata' => :present }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ module V1
2
+ class SlaveSerializer < Fars::BaseModelSerializer
3
+ attributes :id, :name, :data, # attrs
4
+ :updated_at # methods
5
+
6
+ def updated_at
7
+ '2014-04-14'
8
+ end
9
+ end
10
+ end
@@ -14,7 +14,7 @@ namespace :spec do
14
14
  task :migrate do
15
15
  ActiveRecord::Base.establish_connection(db_config)
16
16
 
17
- ActiveRecord::Base.connection.execute(<<SQL
17
+ ActiveRecord::Base.connection.execute(<<-SQL
18
18
  DROP TABLE IF EXISTS "public"."masters";
19
19
 
20
20
  CREATE TABLE "public"."masters" (
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fars
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
4
+ version: 0.0.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - Denyago
@@ -10,12 +9,11 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2014-03-26 00:00:00.000000000 Z
12
+ date: 2014-05-05 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: activerecord
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
18
  - - ! '>='
21
19
  - !ruby/object:Gem::Version
@@ -23,7 +21,6 @@ dependencies:
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
25
  - - ! '>='
29
26
  - !ruby/object:Gem::Version
@@ -31,7 +28,6 @@ dependencies:
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: rspec
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
32
  - - ! '>='
37
33
  - !ruby/object:Gem::Version
@@ -39,7 +35,6 @@ dependencies:
39
35
  type: :development
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
39
  - - ! '>='
45
40
  - !ruby/object:Gem::Version
@@ -47,7 +42,6 @@ dependencies:
47
42
  - !ruby/object:Gem::Dependency
48
43
  name: rake
49
44
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
45
  requirements:
52
46
  - - ! '>='
53
47
  - !ruby/object:Gem::Version
@@ -55,7 +49,6 @@ dependencies:
55
49
  type: :development
56
50
  prerelease: false
57
51
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
52
  requirements:
60
53
  - - ! '>='
61
54
  - !ruby/object:Gem::Version
@@ -63,7 +56,6 @@ dependencies:
63
56
  - !ruby/object:Gem::Dependency
64
57
  name: shoulda
65
58
  requirement: !ruby/object:Gem::Requirement
66
- none: false
67
59
  requirements:
68
60
  - - ! '>='
69
61
  - !ruby/object:Gem::Version
@@ -71,7 +63,6 @@ dependencies:
71
63
  type: :development
72
64
  prerelease: false
73
65
  version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
66
  requirements:
76
67
  - - ! '>='
77
68
  - !ruby/object:Gem::Version
@@ -79,7 +70,6 @@ dependencies:
79
70
  - !ruby/object:Gem::Dependency
80
71
  name: pg
81
72
  requirement: !ruby/object:Gem::Requirement
82
- none: false
83
73
  requirements:
84
74
  - - ! '>='
85
75
  - !ruby/object:Gem::Version
@@ -87,7 +77,6 @@ dependencies:
87
77
  type: :development
88
78
  prerelease: false
89
79
  version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
80
  requirements:
92
81
  - - ! '>='
93
82
  - !ruby/object:Gem::Version
@@ -95,7 +84,6 @@ dependencies:
95
84
  - !ruby/object:Gem::Dependency
96
85
  name: database_cleaner
97
86
  requirement: !ruby/object:Gem::Requirement
98
- none: false
99
87
  requirements:
100
88
  - - ! '>='
101
89
  - !ruby/object:Gem::Version
@@ -103,7 +91,6 @@ dependencies:
103
91
  type: :development
104
92
  prerelease: false
105
93
  version_requirements: !ruby/object:Gem::Requirement
106
- none: false
107
94
  requirements:
108
95
  - - ! '>='
109
96
  - !ruby/object:Gem::Version
@@ -125,39 +112,71 @@ files:
125
112
  - lib/fars.rb
126
113
  - lib/fars/base_collection_serializer.rb
127
114
  - lib/fars/base_model_serializer.rb
115
+ - lib/fars/base_object_serializer.rb
116
+ - lib/fars/model_serializable.rb
117
+ - lib/fars/relation_serializable.rb
128
118
  - lib/fars/version.rb
119
+ - spec/active_record/base_spec.rb
120
+ - spec/active_record/relation_spec.rb
121
+ - spec/array_spec.rb
129
122
  - spec/config/database.example.yml
130
- - spec/fars/api_version_spec.rb
131
- - spec/fars/fars_spec.rb
123
+ - spec/fars/base_collection_serializer_spec.rb
124
+ - spec/fars/base_model_serializer_spec.rb
125
+ - spec/fars/base_object_serializer_spec.rb
126
+ - spec/hash_spec.rb
132
127
  - spec/spec_helper.rb
128
+ - spec/support/models/master.rb
129
+ - spec/support/models/slave.rb
130
+ - spec/support/serializers/another_master_serialiser.rb
131
+ - spec/support/serializers/book_serializer.rb
132
+ - spec/support/serializers/color_serializer.rb
133
+ - spec/support/serializers/master_serializer.rb
134
+ - spec/support/serializers/slave_serializer.rb
135
+ - spec/support/serializers/stat_serializer.rb
136
+ - spec/support/serializers/v1/master_serializer.rb
137
+ - spec/support/serializers/v1/slave_serializer.rb
133
138
  - spec/tasks/db_setup.rake
134
139
  homepage: https://github.com/Lightpower/fars
135
140
  licenses: []
141
+ metadata: {}
136
142
  post_install_message:
137
143
  rdoc_options: []
138
144
  require_paths:
139
145
  - lib
140
146
  required_ruby_version: !ruby/object:Gem::Requirement
141
- none: false
142
147
  requirements:
143
148
  - - ! '>='
144
149
  - !ruby/object:Gem::Version
145
150
  version: '0'
146
151
  required_rubygems_version: !ruby/object:Gem::Requirement
147
- none: false
148
152
  requirements:
149
153
  - - ! '>='
150
154
  - !ruby/object:Gem::Version
151
155
  version: '0'
152
156
  requirements: []
153
157
  rubyforge_project:
154
- rubygems_version: 1.8.23
158
+ rubygems_version: 2.2.2
155
159
  signing_key:
156
- specification_version: 3
160
+ specification_version: 4
157
161
  summary: Gem provedes classes for fast serialisation of ActiveRecord relations.
158
162
  test_files:
163
+ - spec/active_record/base_spec.rb
164
+ - spec/active_record/relation_spec.rb
165
+ - spec/array_spec.rb
159
166
  - spec/config/database.example.yml
160
- - spec/fars/api_version_spec.rb
161
- - spec/fars/fars_spec.rb
167
+ - spec/fars/base_collection_serializer_spec.rb
168
+ - spec/fars/base_model_serializer_spec.rb
169
+ - spec/fars/base_object_serializer_spec.rb
170
+ - spec/hash_spec.rb
162
171
  - spec/spec_helper.rb
172
+ - spec/support/models/master.rb
173
+ - spec/support/models/slave.rb
174
+ - spec/support/serializers/another_master_serialiser.rb
175
+ - spec/support/serializers/book_serializer.rb
176
+ - spec/support/serializers/color_serializer.rb
177
+ - spec/support/serializers/master_serializer.rb
178
+ - spec/support/serializers/slave_serializer.rb
179
+ - spec/support/serializers/stat_serializer.rb
180
+ - spec/support/serializers/v1/master_serializer.rb
181
+ - spec/support/serializers/v1/slave_serializer.rb
163
182
  - spec/tasks/db_setup.rake