in_json 0.0.3 → 0.0.4

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.0.4
data/in_json.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{in_json}
8
- s.version = "0.0.3"
8
+ s.version = "0.0.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Henry Hsu"]
12
- s.date = %q{2011-05-23}
12
+ s.date = %q{2011-05-31}
13
13
  s.description = %q{JSON serialization for Rails. Straight-forward attributes. Only serialize what you want. Optimally obeys eager-loaded associations}
14
14
  s.email = %q{henry.hsu@photomugs.com}
15
15
  s.extra_rdoc_files = [
@@ -28,6 +28,8 @@ Gem::Specification.new do |s|
28
28
  "in_json.gemspec",
29
29
  "lib/in_json.rb",
30
30
  "lib/in_json/ext/array.rb",
31
+ "lib/in_json/ext/hash.rb",
32
+ "spec/in_json/ext/hash_spec.rb",
31
33
  "spec/in_json_spec.rb",
32
34
  "spec/spec_helper.rb"
33
35
  ]
@@ -37,6 +39,7 @@ Gem::Specification.new do |s|
37
39
  s.rubygems_version = %q{1.5.0}
38
40
  s.summary = %q{Optimally straight-forward JSON serialization for Rails}
39
41
  s.test_files = [
42
+ "spec/in_json/ext/hash_spec.rb",
40
43
  "spec/in_json_spec.rb",
41
44
  "spec/spec_helper.rb"
42
45
  ]
@@ -0,0 +1,21 @@
1
+ module InJson
2
+ module HashExt
3
+ def self.included(base)
4
+ base.send :include, InstanceMethods
5
+ end
6
+
7
+ module InstanceMethods
8
+ def recursively_reject(&blk)
9
+ reject(&blk).inject({}) do |result, k_v|
10
+ key, value = k_v
11
+ result[key] = value.is_a?(Hash) ? value.recursively_reject(&blk) : value
12
+ result
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ Hash.class_eval do
20
+ include InJson::HashExt
21
+ end
data/lib/in_json.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'in_json/ext/array'
2
+ require 'in_json/ext/hash'
2
3
 
3
4
  module InJson
4
5
  def self.included(base)
@@ -38,7 +39,8 @@ module InJson
38
39
  # Stores any method calls as {Hash} keys
39
40
  # @return [Hash] the evaluated definition
40
41
  def method_missing(method, *args, &block)
41
- method = method.to_s.sub(/^_/, '').to_sym if method.to_s =~ /^_.*/
42
+ method_s = method.to_s
43
+ method = method_s.sub(/^_/, '').to_sym if method_s =~ /^_.*/
42
44
  @hash[method] = block_given? ? Definition.new.instance_eval(&block) : args.first
43
45
  @hash
44
46
  end
@@ -55,6 +57,16 @@ module InJson
55
57
 
56
58
  write_inheritable_attribute :in_json_definitions, definitions
57
59
  end
60
+
61
+ # Calculates associations to be load alongside based on an {InJson} definition
62
+ # @param [Symbol] name the definition to calculate from
63
+ # @return [Hash] the associations
64
+ def include_in_json(name = :default)
65
+ definitions = read_inheritable_attribute(:in_json_definitions) || {}
66
+ definition = definitions[name]
67
+ return unless definition
68
+ definition.recursively_reject { |key, value| value.nil? }
69
+ end
58
70
  end
59
71
 
60
72
  module InstanceMethods
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hash do
4
+ before do
5
+ @sample = {
6
+ 1 => {1 => 'a'},
7
+ 2 => {1 => 'b'},
8
+ 3 => {2 => 'c'},
9
+ 4 => {2 => 'd'},
10
+ 5 => {3 => 'e'},
11
+ 6 => {3 => 'f'}
12
+ }
13
+ end
14
+
15
+ it "rejects even keys" do
16
+ @sample.reject { |key, value| key % 2 == 0 }.should == {
17
+ 1 => {1 => 'a'},
18
+ 3 => {2 => 'c'},
19
+ 5 => {3 => 'e'}
20
+ }
21
+ end
22
+
23
+ it "recursively rejects even keys" do
24
+ @sample.recursively_reject { |key, value| key % 2 == 0 }.should == {
25
+ 1 => {1 => 'a'},
26
+ 3 => {},
27
+ 5 => {3 => 'e'}
28
+ }
29
+ end
30
+ end
data/spec/in_json_spec.rb CHANGED
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  class User < ActiveRecord::Base
4
4
  has_many :posts
@@ -263,6 +263,21 @@ describe InJson do
263
263
  }.should have_queries(0)
264
264
  end
265
265
 
266
+ it "should intelligently calculate eager-loading includes" do
267
+ User.include_in_json(:with_posts_and_comments).should == {
268
+ :posts => {
269
+ :comments => {}
270
+ }
271
+ }
272
+ end
273
+
274
+ it "should use calculated eager-loading includes" do
275
+ lambda { @users = User.find(:all, :include => User.include_in_json(:with_posts_and_comments)) }.should have_queries(3)
276
+ lambda {
277
+ @users.in_json(:with_posts_and_comments)
278
+ }.should have_queries(0)
279
+ end
280
+
266
281
  it "should return model as json" do
267
282
  @user_hash = JSON.parse(@user.to_json)
268
283
  @user_hash['name'].should == 'John User'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: in_json
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Henry Hsu
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-23 00:00:00 -07:00
18
+ date: 2011-05-31 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -251,6 +251,8 @@ files:
251
251
  - in_json.gemspec
252
252
  - lib/in_json.rb
253
253
  - lib/in_json/ext/array.rb
254
+ - lib/in_json/ext/hash.rb
255
+ - spec/in_json/ext/hash_spec.rb
254
256
  - spec/in_json_spec.rb
255
257
  - spec/spec_helper.rb
256
258
  has_rdoc: true
@@ -288,5 +290,6 @@ signing_key:
288
290
  specification_version: 3
289
291
  summary: Optimally straight-forward JSON serialization for Rails
290
292
  test_files:
293
+ - spec/in_json/ext/hash_spec.rb
291
294
  - spec/in_json_spec.rb
292
295
  - spec/spec_helper.rb