brainstem 0.2.6 → 0.2.6.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 CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7c38b868345e5b3aaadc1c2746e6963d1daf1f1f
4
- data.tar.gz: cccbd5c71854048fb2331fc909e2a7a98c0345ed
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZjgxZDgwYTRkN2Y0NGU0Y2NhMmFiYjMxZmJjNWE0ZmNjOWY3NWQ4Yw==
5
+ data.tar.gz: !binary |-
6
+ ZDY4MmYyNjBlZTNlMDJmMmU3Yjk1MDZhYjJhNTY0MDQ3NmY3MjRmMg==
5
7
  SHA512:
6
- metadata.gz: fec3d2771167970f5198ece98f6febc2d903599167ea2b15ac2d60558e50e8c8ef9cc650e1129cfb29c333dd8d080fcf8705615fb7b445c25ec7a49be9b8e826
7
- data.tar.gz: 06a68af6770a08acf1c6ca3379eb5ee2b050b14acc80982af2afb2be8b65e60cc5f257f0de2cd8825741fa040c74c0121f397c9f400cff91b639d649adcc1028
8
+ metadata.gz: !binary |-
9
+ NzZkOGU5Y2FlN2I0OTY0ZTkwMzkxYzkyYzMyOTc2MDU5MTA4ODk2NTI0ODEy
10
+ NzhmYzViODBmN2M2NmFkODk4NTdiM2U4YzBhNTZjODQ1NTllZmUxOWUzZWM3
11
+ MzFiMmEzMDViNGJkNjkwMmM0NzE1MTg0N2JhYjJkMzVmYzM1NTk=
12
+ data.tar.gz: !binary |-
13
+ Mzk5ZmNlMmQ4ZGMxODI0OTY0ZjU1Y2FlYjQ1MDAwOWJiZjk0MDNlMzJhNjVi
14
+ N2RmMjkwZTUzZjJmM2UyOWE3OWQ1MTMwMzBhMWEyMjZjNjY1MDgwNGY5MTJj
15
+ YmI2NDBjZTA1N2EzM2Q3ZjFkZWRkNzk3NGYyZDBjZjdjNzY5MGM=
data/Gemfile.lock CHANGED
@@ -1,39 +1,39 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- brainstem (0.2.6)
4
+ brainstem (0.2.6.1)
5
5
  activerecord (>= 3.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (4.1.6)
11
- activesupport (= 4.1.6)
10
+ activemodel (4.2.0)
11
+ activesupport (= 4.2.0)
12
12
  builder (~> 3.1)
13
- activerecord (4.1.6)
14
- activemodel (= 4.1.6)
15
- activesupport (= 4.1.6)
16
- arel (~> 5.0.0)
17
- activesupport (4.1.6)
18
- i18n (~> 0.6, >= 0.6.9)
13
+ activerecord (4.2.0)
14
+ activemodel (= 4.2.0)
15
+ activesupport (= 4.2.0)
16
+ arel (~> 6.0)
17
+ activesupport (4.2.0)
18
+ i18n (~> 0.7)
19
19
  json (~> 1.7, >= 1.7.7)
20
20
  minitest (~> 5.1)
21
- thread_safe (~> 0.1)
21
+ thread_safe (~> 0.3, >= 0.3.4)
22
22
  tzinfo (~> 1.1)
23
- arel (5.0.1.20140414130214)
23
+ arel (6.0.0)
24
24
  builder (3.2.2)
25
25
  diff-lcs (1.2.5)
26
- i18n (0.6.11)
26
+ i18n (0.7.0)
27
27
  json (1.8.1)
28
- minitest (5.4.2)
29
- rake (10.3.2)
30
- redcarpet (3.1.2)
28
+ minitest (5.5.0)
29
+ rake (10.4.2)
30
+ redcarpet (3.2.2)
31
31
  rr (1.1.2)
32
32
  rspec (3.1.0)
33
33
  rspec-core (~> 3.1.0)
34
34
  rspec-expectations (~> 3.1.0)
35
35
  rspec-mocks (~> 3.1.0)
36
- rspec-core (3.1.6)
36
+ rspec-core (3.1.7)
37
37
  rspec-support (~> 3.1.0)
38
38
  rspec-expectations (3.1.2)
39
39
  diff-lcs (>= 1.2.0, < 2.0)
@@ -41,11 +41,11 @@ GEM
41
41
  rspec-mocks (3.1.3)
42
42
  rspec-support (~> 3.1.0)
43
43
  rspec-support (3.1.2)
44
- sqlite3 (1.3.9)
44
+ sqlite3 (1.3.10)
45
45
  thread_safe (0.3.4)
46
46
  tzinfo (1.2.2)
47
47
  thread_safe (~> 0.1)
48
- yard (0.8.7.4)
48
+ yard (0.8.7.6)
49
49
 
50
50
  PLATFORMS
51
51
  ruby
data/README.md CHANGED
@@ -86,9 +86,6 @@ The scope passed to `present` could contain any starting conditions that you'd l
86
86
 
87
87
  GET /api/widgets.json?include=features&order=popularity:desc&location_name=san+francisco
88
88
 
89
- Additionally, requests can have a 'pretty' parameter. When set to true, responses will be pretty-printed.
90
- Do this by adding `&pretty=true` to the above example.
91
-
92
89
  Responses will look like the following:
93
90
 
94
91
  {
@@ -149,13 +149,14 @@ module Brainstem
149
149
  # @api private
150
150
  # Makes sure that associations are loaded and converted into ids.
151
151
  def load_associations!(model, struct, associations)
152
+ reflections = Brainstem::PresenterCollection.reflections(model.class)
152
153
  struct.to_a.each do |key, value|
153
154
  if value.is_a?(AssociationField)
154
155
  struct.delete key
155
156
  id_attr = value.method_name ? "#{value.method_name}_id" : nil
156
157
 
157
158
  if id_attr && model.class.columns_hash.has_key?(id_attr)
158
- reflection = value.method_name && model.class.reflections[value.method_name.to_sym]
159
+ reflection = value.method_name && reflections[value.method_name.to_s]
159
160
  if reflection && reflection.options[:polymorphic] && !value.ignore_type
160
161
  struct["#{key.to_s.singularize}_ref".to_sym] = begin
161
162
  if (id_attr = model.send(id_attr)).present?
@@ -108,9 +108,6 @@ module Brainstem
108
108
 
109
109
  rewrite_keys_as_objects!(struct)
110
110
 
111
- # Make struct pretty-print when rendered as json, if required.
112
- make_pretty_printable!(struct) if options[:params][:pretty] == "true"
113
-
114
111
  struct
115
112
  end
116
113
 
@@ -175,6 +172,7 @@ module Brainstem
175
172
  def calculate_allowed_includes(presenter, presented_class, is_only_query)
176
173
  allowed_includes = {}
177
174
  model = presented_class.new
175
+ reflections = Brainstem::PresenterCollection.reflections(model.class)
178
176
  presenter.present(model).each do |k, v|
179
177
  next unless v.is_a?(AssociationField)
180
178
  next if v.restrict_to_only && !is_only_query
@@ -182,8 +180,8 @@ module Brainstem
182
180
  if v.json_name
183
181
  v.json_name = v.json_name.tableize.to_sym
184
182
  else
185
- association = model.class.reflections[v.method_name]
186
- if !association.options[:polymorphic]
183
+ association = reflections[v.method_name.to_s]
184
+ if association && !association.options[:polymorphic]
187
185
  v.json_name = association && association.table_name.to_sym
188
186
  if v.json_name.nil?
189
187
  raise ":json_name is a required option for method-based associations (#{presented_class}##{v.method_name})"
@@ -329,11 +327,11 @@ module Brainstem
329
327
  records.tap do |models|
330
328
  association_names_to_preload = includes_hash.values.map {|i| i.method_name }
331
329
  if models.first
332
- reflections = models.first.class.reflections
333
- association_names_to_preload.reject! { |association| !reflections.has_key?(association) }
330
+ reflections = Brainstem::PresenterCollection.reflections(models.first.class)
331
+ association_names_to_preload.reject! { |association| !reflections.has_key?(association.to_s) }
334
332
  end
335
333
  if association_names_to_preload.any?
336
- preload(models, association_names_to_preload)
334
+ Brainstem::PresenterCollection.preload(models, association_names_to_preload)
337
335
  Brainstem.logger.info "Eager loaded #{association_names_to_preload.join(", ")}."
338
336
  end
339
337
  end
@@ -375,22 +373,19 @@ module Brainstem
375
373
  end
376
374
  end
377
375
 
378
- def preload(models, association_names)
376
+ # Class Methods
377
+
378
+ # In Rails 4.2, ActiveRecord::Base#reflections started being keyed by strings instead of symbols.
379
+ def self.reflections(klass)
380
+ klass.reflections.each_with_object({}) { |(key, value), memo| memo[key.to_s] = value }
381
+ end
382
+
383
+ def self.preload(models, association_names)
379
384
  if Gem.loaded_specs['activerecord'].version >= Gem::Version.create('4.1')
380
385
  ActiveRecord::Associations::Preloader.new.preload(models, association_names)
381
386
  else
382
387
  ActiveRecord::Associations::Preloader.new(models, association_names).run
383
388
  end
384
389
  end
385
-
386
- # Modify a hash so that it is pretty-printed when rendered as JSON. Works
387
- # by adding a `to_json` singleton method which is called during rendering.
388
- # Uses a copy of the hash to avoid recursion issues.
389
- def make_pretty_printable!(struct)
390
- struct.define_singleton_method(:to_json) do |options = nil|
391
- copy = self.deep_dup
392
- JSON.pretty_generate(copy)
393
- end
394
- end
395
390
  end
396
391
  end
@@ -1,3 +1,3 @@
1
1
  module Brainstem
2
- VERSION = "0.2.6"
2
+ VERSION = "0.2.6.1"
3
3
  end
Binary file
@@ -259,7 +259,7 @@ describe Brainstem::PresenterCollection do
259
259
 
260
260
  it "preloads associations when they are full model-level associations" do
261
261
  # Here, primary_maven is a method on Workspace, not a true association.
262
- mock(@presenter_collection).preload(anything, [:tasks])
262
+ mock(Brainstem::PresenterCollection).preload(anything, [:tasks])
263
263
  result = @presenter_collection.presenting("workspaces", :params => { :include => "tasks" }) { Workspace.order('id desc') }
264
264
  expect(result[:tasks].length).to be > 0
265
265
  end
@@ -825,22 +825,6 @@ describe Brainstem::PresenterCollection do
825
825
  expect(result[:count]).to eq(Workspace.owned_by(bob.to_param).count)
826
826
  end
827
827
  end
828
-
829
- describe "pretty printing" do
830
- before do
831
- @user_result = { :count => 1, :users => { 1 => { :username => "bob", :id => "1" } }, :results => [{ :key => "users", :id => "1" }] }
832
- end
833
-
834
- it "should return normal json if the pretty parameter is not true" do
835
- result = @presenter_collection.presenting("users") { User.where(:id => 1) }
836
- expect(result.to_json).to eq(JSON.generate(@user_result))
837
- end
838
-
839
- it "should return pretty printed json if the pretty parameter is true" do
840
- result = @presenter_collection.presenting("users", :params => { :pretty => "true" }) { User.where(:id => 1) }
841
- expect(result.to_json).to eq(JSON.pretty_generate(@user_result))
842
- end
843
- end
844
828
  end
845
829
 
846
830
  describe "collection methods" do
@@ -136,7 +136,7 @@ describe Brainstem::Presenter do
136
136
  iso8601_time = /\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}[-+]\d{2}:\d{2}/
137
137
  iso8601_date = /\d{4}-\d{2}-\d{2}/
138
138
 
139
- struct = TimePresenter.new.present_and_post_process("something")
139
+ struct = TimePresenter.new.present_and_post_process(Workspace.first)
140
140
  expect(struct[:time]).to match(iso8601_time)
141
141
  expect(struct[:date]).to match(iso8601_date)
142
142
  expect(struct[:recursion][:time]).to match(iso8601_time)
@@ -4,28 +4,28 @@ ActiveRecord::Schema.define do
4
4
 
5
5
  create_table :users, :force => true do |t|
6
6
  t.string :username
7
- t.timestamps
7
+ t.timestamps null: true
8
8
  end
9
9
 
10
10
  create_table :workspaces, :force => true do |t|
11
11
  t.string :title
12
12
  t.string :description
13
13
  t.belongs_to :user
14
- t.timestamps
14
+ t.timestamps null: true
15
15
  end
16
16
 
17
17
  create_table :tasks, :force => true do |t|
18
18
  t.string :name
19
19
  t.integer :parent_id
20
20
  t.belongs_to :workspace
21
- t.timestamps
21
+ t.timestamps null: true
22
22
  end
23
23
 
24
24
  create_table :posts, :force => true do |t|
25
25
  t.string :body
26
26
  t.integer :subject_id
27
27
  t.string :subject_type
28
- t.timestamps
28
+ t.timestamps null: true
29
29
  end
30
30
  end
31
31
 
metadata CHANGED
@@ -1,111 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brainstem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mavenlink
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-01 00:00:00.000000000 Z
11
+ date: 2015-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - ! '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - ! '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - ! '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: redcarpet
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - ! '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - ! '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rr
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - ! '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - ! '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - ! '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: sqlite3
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - ! '>='
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - ! '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: yard
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - ! '>='
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - ! '>='
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  description: Brainstem allows you to create rich API presenters that know how to filter,
@@ -135,6 +135,7 @@ files:
135
135
  - lib/brainstem/time_classes.rb
136
136
  - lib/brainstem/version.rb
137
137
  - pkg/brainstem-0.2.5.gem
138
+ - pkg/brainstem-0.2.6.gem
138
139
  - spec/brainstem/controller_methods_spec.rb
139
140
  - spec/brainstem/presenter_collection_spec.rb
140
141
  - spec/brainstem/presenter_spec.rb
@@ -153,17 +154,17 @@ require_paths:
153
154
  - lib
154
155
  required_ruby_version: !ruby/object:Gem::Requirement
155
156
  requirements:
156
- - - ">="
157
+ - - ! '>='
157
158
  - !ruby/object:Gem::Version
158
159
  version: '0'
159
160
  required_rubygems_version: !ruby/object:Gem::Requirement
160
161
  requirements:
161
- - - ">="
162
+ - - ! '>='
162
163
  - !ruby/object:Gem::Version
163
164
  version: '0'
164
165
  requirements: []
165
166
  rubyforge_project:
166
- rubygems_version: 2.4.3
167
+ rubygems_version: 2.2.2
167
168
  signing_key:
168
169
  specification_version: 4
169
170
  summary: ActiveRecord presenters with a rich request API