in_json 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/in_json.gemspec +1 -1
- data/lib/in_json.rb +36 -34
- data/lib/in_json/ext/hash.rb +2 -2
- data/spec/in_json/ext/hash_spec.rb +1 -1
- data/spec/in_json_spec.rb +33 -0
- data/spec/spec_helper.rb +6 -0
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.6
|
data/in_json.gemspec
CHANGED
data/lib/in_json.rb
CHANGED
@@ -58,19 +58,47 @@ module InJson
|
|
58
58
|
write_inheritable_attribute :in_json_definitions, definitions
|
59
59
|
end
|
60
60
|
|
61
|
+
# TODO move precedence to doc
|
62
|
+
def in_json_definition(name, injected_definition)
|
63
|
+
definitions = read_inheritable_attribute(:in_json_definitions)
|
64
|
+
|
65
|
+
# Try nested first (if I am nested)
|
66
|
+
return injected_definition if injected_definition.kind_of?(Hash)
|
67
|
+
|
68
|
+
# Try named second
|
69
|
+
injected_definition.kind_of?(Symbol) && definitions && result = definitions[injected_definition]
|
70
|
+
return result if result
|
71
|
+
|
72
|
+
# Try thread third
|
73
|
+
thread_definition = Thread.current[:in_json_definition]
|
74
|
+
thread_definition && definitions && result = definitions[thread_definition]
|
75
|
+
return result if result # *yuck*
|
76
|
+
|
77
|
+
# Try given definitions fourth
|
78
|
+
definitions && result = definitions[name]
|
79
|
+
return result if result
|
80
|
+
|
81
|
+
# Try default last
|
82
|
+
return definitions && definitions[:default]
|
83
|
+
end
|
84
|
+
|
61
85
|
# Calculates associations to be load alongside based on an {InJson} definition
|
62
86
|
# @param [Symbol] name the definition to calculate from
|
63
87
|
# @return [Hash] the associations
|
64
|
-
def include_in_json(name = :default)
|
65
|
-
|
66
|
-
definition = definitions[name]
|
88
|
+
def include_in_json(name = :default, injected_definition = nil)
|
89
|
+
definition = in_json_definition(name, injected_definition)
|
67
90
|
return unless definition
|
68
|
-
|
69
91
|
reflexions = reflections
|
70
92
|
|
71
|
-
definition.
|
72
|
-
|
73
|
-
|
93
|
+
definition.inject({}) do |result, attr_dfn|
|
94
|
+
attr, definition = attr_dfn
|
95
|
+
|
96
|
+
klass = reflexions[attr].klass if reflexions.has_key?(attr) && reflexions[attr]
|
97
|
+
def_at = (klass.include_in_json(name, definition) || {}) if klass
|
98
|
+
|
99
|
+
result[attr] = def_at if def_at
|
100
|
+
result
|
101
|
+
end
|
74
102
|
end
|
75
103
|
end
|
76
104
|
|
@@ -80,7 +108,7 @@ module InJson
|
|
80
108
|
# @param [Symbol, Hash, nil] injected_definition a named {InJson} definition, a full Hash definition, or nil
|
81
109
|
# @return [Hash] the JSON-ready Hash
|
82
110
|
def in_json(name = :default, injected_definition = nil)
|
83
|
-
definition = in_json_definition(name, injected_definition)
|
111
|
+
definition = self.class.in_json_definition(name, injected_definition)
|
84
112
|
attrs = attributes.freeze.symbolize_keys
|
85
113
|
return attrs unless definition
|
86
114
|
definition.inject({}) do |result, attr_dfn|
|
@@ -94,32 +122,6 @@ module InJson
|
|
94
122
|
end
|
95
123
|
end
|
96
124
|
alias_method :as_json, :in_json
|
97
|
-
|
98
|
-
protected
|
99
|
-
|
100
|
-
# TODO move precedence to doc
|
101
|
-
def in_json_definition(name, injected_definition)
|
102
|
-
definitions = self.class.read_inheritable_attribute(:in_json_definitions)
|
103
|
-
|
104
|
-
# Try nested first (if I am nested)
|
105
|
-
return injected_definition if injected_definition.kind_of?(Hash)
|
106
|
-
|
107
|
-
# Try named second
|
108
|
-
injected_definition.kind_of?(Symbol) && definitions && result = definitions[injected_definition]
|
109
|
-
return result if result
|
110
|
-
|
111
|
-
# Try thread third
|
112
|
-
thread_definition = Thread.current[:in_json_definition]
|
113
|
-
thread_definition && definitions && result = definitions[thread_definition]
|
114
|
-
return result if result # *yuck*
|
115
|
-
|
116
|
-
# Try given definitions fourth
|
117
|
-
definitions && result = definitions[name]
|
118
|
-
return result if result
|
119
|
-
|
120
|
-
# Try default last
|
121
|
-
return definitions && definitions[:default]
|
122
|
-
end
|
123
125
|
end
|
124
126
|
end
|
125
127
|
|
data/lib/in_json/ext/hash.rb
CHANGED
@@ -6,11 +6,11 @@ module InJson
|
|
6
6
|
|
7
7
|
module InstanceMethods
|
8
8
|
def recursively_reject(default = nil, &blk)
|
9
|
-
|
9
|
+
inject({}) do |result, k_v|
|
10
10
|
key, value = k_v
|
11
11
|
result[key] = value.is_a?(Hash) ? value.recursively_reject(&blk) : (value || default)
|
12
12
|
result
|
13
|
-
end
|
13
|
+
end.reject(&blk)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/spec/in_json_spec.rb
CHANGED
@@ -64,6 +64,11 @@ class User < ActiveRecord::Base
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
+
in_json(:with_posts_and_all_named) do
|
68
|
+
posts :with_all
|
69
|
+
end
|
70
|
+
|
71
|
+
|
67
72
|
in_json(:with_posts_and_comments_missing) do
|
68
73
|
posts do
|
69
74
|
title
|
@@ -98,6 +103,11 @@ class Post < ActiveRecord::Base
|
|
98
103
|
score
|
99
104
|
end
|
100
105
|
end
|
106
|
+
|
107
|
+
in_json(:with_all) do
|
108
|
+
reviews
|
109
|
+
comments :with_votes
|
110
|
+
end
|
101
111
|
end
|
102
112
|
|
103
113
|
class BlogPost < Post
|
@@ -105,6 +115,7 @@ end
|
|
105
115
|
|
106
116
|
class Comment < ActiveRecord::Base
|
107
117
|
belongs_to :post
|
118
|
+
has_many :votes
|
108
119
|
|
109
120
|
in_json do
|
110
121
|
content
|
@@ -121,6 +132,19 @@ class Comment < ActiveRecord::Base
|
|
121
132
|
in_json(:with_posts_and_comments_named) do # Just to counter-act collission
|
122
133
|
content
|
123
134
|
end
|
135
|
+
|
136
|
+
in_json (:with_votes) do
|
137
|
+
votes
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
class Comment::Vote < ActiveRecord::Base
|
142
|
+
belongs_to :comment
|
143
|
+
belongs_to :user
|
144
|
+
|
145
|
+
in_json do
|
146
|
+
rating
|
147
|
+
end
|
124
148
|
end
|
125
149
|
|
126
150
|
class Review < ActiveRecord::Base
|
@@ -273,6 +297,15 @@ describe InJson do
|
|
273
297
|
User.include_in_json(:with_posts).should == {
|
274
298
|
:posts => {}
|
275
299
|
}
|
300
|
+
|
301
|
+
User.include_in_json(:with_posts_and_all_named).should == {
|
302
|
+
:posts => {
|
303
|
+
:reviews => {},
|
304
|
+
:comments => {
|
305
|
+
:votes => {}
|
306
|
+
}
|
307
|
+
}
|
308
|
+
}
|
276
309
|
end
|
277
310
|
|
278
311
|
it "should use calculated eager-loading includes" do
|
data/spec/spec_helper.rb
CHANGED
@@ -35,6 +35,12 @@ ActiveRecord::Base.connection.create_table :comments do |t|
|
|
35
35
|
t.integer :post_id
|
36
36
|
end
|
37
37
|
|
38
|
+
ActiveRecord::Base.connection.create_table :comment_votes do |t|
|
39
|
+
t.integer :rating
|
40
|
+
t.integer :comment_id
|
41
|
+
t.integer :user_id
|
42
|
+
end
|
43
|
+
|
38
44
|
ActiveRecord::Base.connection.create_table :reviews do |t|
|
39
45
|
t.integer :score
|
40
46
|
t.integer :post_id
|
metadata
CHANGED