jbuilder 1.0.2 → 1.2.0
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 +7 -0
- data/.gitignore +4 -0
- data/.travis.yml +32 -0
- data/Gemfile +3 -5
- data/Gemfile.edge +10 -0
- data/README.md +17 -6
- data/Rakefile +3 -3
- data/jbuilder.gemspec +4 -2
- data/lib/generators/rails/jbuilder_generator.rb +7 -2
- data/lib/generators/rails/{jbuilder_scaffold_controller_generator.rb → scaffold_controller_generator.rb} +3 -2
- data/lib/generators/rails/templates/index.json.jbuilder +1 -1
- data/lib/jbuilder.rb +57 -89
- data/lib/{jbuilder_template.rb → jbuilder/jbuilder_template.rb} +6 -1
- data/lib/jbuilder/railtie.rb +11 -0
- data/test/jbuilder_generator_test.rb +3 -3
- data/test/jbuilder_template_test.rb +86 -56
- data/test/jbuilder_test.rb +97 -89
- data/test/scaffold_controller_generator_test.rb +4 -4
- metadata +36 -38
- data/Gemfile-1.8 +0 -5
- data/jbuilder-0.9.0.gem +0 -0
- data/jbuilder-1.0.0.gem +0 -0
- data/jbuilder-1.0.1.gem +0 -0
- data/lib/railtie.rb +0 -8
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f77252f3bcb2ef3d4b51adb825d326df4804bc00
|
4
|
+
data.tar.gz: 6d2a626cfe5b9e37a18deb6f544be39e83a1c4d0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7890f2df618e57810e26afa21c626183b17a45067e476d3f872b3cbe60466d00fc0e32184637e8f87166417b9d573932eb2ac381d6a024e7356a9fcc7d923294
|
7
|
+
data.tar.gz: 02e87a25b940a5700ba1bed69ed670003598aeb7c312d03e5d9c16662538fed7b24debae031944b99951739844f1521095b0f3d7f2e7703085a942ae834f996c
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
language: ruby
|
2
|
+
before_install:
|
3
|
+
- gem install bundler
|
4
|
+
rvm:
|
5
|
+
- 1.8.7
|
6
|
+
- 1.9.2
|
7
|
+
- 1.9.3
|
8
|
+
- ruby-head
|
9
|
+
- ree
|
10
|
+
- jruby-18mode
|
11
|
+
- jruby-19mode
|
12
|
+
- rbx-18mode
|
13
|
+
- rbx-19mode
|
14
|
+
gemfile:
|
15
|
+
- Gemfile
|
16
|
+
- Gemfile.edge
|
17
|
+
matrix:
|
18
|
+
exclude:
|
19
|
+
# Edge Rails is only compatible with 1.9.3
|
20
|
+
- gemfile: Gemfile.edge
|
21
|
+
rvm: 1.8.7
|
22
|
+
- gemfile: Gemfile.edge
|
23
|
+
rvm: 1.9.2
|
24
|
+
- gemfile: Gemfile.edge
|
25
|
+
rvm: ree
|
26
|
+
- gemfile: Gemfile.edge
|
27
|
+
rvm: jruby-18mode
|
28
|
+
- gemfile: Gemfile.edge
|
29
|
+
rvm: rbx-18mode
|
30
|
+
|
31
|
+
notifications:
|
32
|
+
email: false
|
data/Gemfile
CHANGED
data/Gemfile.edge
ADDED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Jbuilder [](https://travis-ci.org/rails/jbuilder)
|
1
|
+
Jbuilder [](https://travis-ci.org/rails/jbuilder) [](https://rubygems.org/gems/jbuilder) [](https://codeclimate.com/github/rails/jbuilder)
|
2
2
|
========
|
3
3
|
|
4
4
|
Jbuilder gives you a simple DSL for declaring JSON structures that beats massaging giant hash structures. This is particularly helpful when the generation process is fraught with conditionals and loops. Here's a simple example:
|
@@ -31,7 +31,7 @@ This will build the following structure:
|
|
31
31
|
|
32
32
|
``` javascript
|
33
33
|
{
|
34
|
-
"content": "<p>This is <i>serious</i> monkey business",
|
34
|
+
"content": "<p>This is <i>serious</i> monkey business</p>",
|
35
35
|
"created_at": "2011-10-29T20:45:28-05:00",
|
36
36
|
"updated_at": "2011-10-29T20:45:28-05:00",
|
37
37
|
|
@@ -55,15 +55,26 @@ This will build the following structure:
|
|
55
55
|
}
|
56
56
|
```
|
57
57
|
|
58
|
+
To define attribute and structure names dynamically, use the `set!` method:
|
59
|
+
|
60
|
+
``` ruby
|
61
|
+
json.set! :author do
|
62
|
+
json.set! :name, "David"
|
63
|
+
end
|
64
|
+
|
65
|
+
# => "author": { "name": "David" }
|
66
|
+
```
|
67
|
+
|
58
68
|
Top level arrays can be handled directly. Useful for index and other collection actions.
|
59
69
|
|
60
70
|
``` ruby
|
61
71
|
# @people = People.all
|
62
|
-
json.array!
|
72
|
+
json.array! @people do |person|
|
63
73
|
json.name person.name
|
64
74
|
json.age calculate_age(person.birthday)
|
65
75
|
end
|
66
|
-
|
76
|
+
|
77
|
+
# => [ { "name": "David", "age": 32 }, { "name": "Jamie", "age": 31 } ]
|
67
78
|
```
|
68
79
|
|
69
80
|
Jbuilder objects can be directly nested inside each other. Useful for composing objects.
|
@@ -124,10 +135,10 @@ Keys can be auto formatted using `key_format!`, this can be used to convert keyn
|
|
124
135
|
json.key_format! :camelize => :lower
|
125
136
|
json.first_name "David"
|
126
137
|
|
127
|
-
# { "firstName": "David" }
|
138
|
+
# => { "firstName": "David" }
|
128
139
|
```
|
129
140
|
|
130
|
-
You can set this globaly with the class method `key_format` (from inside your
|
141
|
+
You can set this globaly with the class method `key_format` (from inside your environment.rb for example):
|
131
142
|
|
132
143
|
``` ruby
|
133
144
|
Jbuilder.key_format :camelize => :lower
|
data/Rakefile
CHANGED
@@ -4,10 +4,10 @@ require 'rake/testtask'
|
|
4
4
|
Bundler.require
|
5
5
|
|
6
6
|
Rake::TestTask.new do |test|
|
7
|
-
if ::
|
8
|
-
test.test_files = %w(test/jbuilder_template_test.rb test/jbuilder_test.rb)
|
9
|
-
else
|
7
|
+
if defined?(::Rails::Railtie)
|
10
8
|
test.test_files = FileList['test/*_test.rb']
|
9
|
+
else
|
10
|
+
test.test_files = %w(test/jbuilder_template_test.rb test/jbuilder_test.rb)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
data/jbuilder.gemspec
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'jbuilder'
|
3
|
-
s.version = '1.0
|
3
|
+
s.version = '1.2.0'
|
4
4
|
s.author = 'David Heinemeier Hansson'
|
5
5
|
s.email = 'david@37signals.com'
|
6
6
|
s.summary = 'Create JSON structures via a Builder-style DSL'
|
7
|
+
s.license = 'MIT'
|
7
8
|
|
8
9
|
s.add_dependency 'activesupport', '>= 3.0.0'
|
9
10
|
s.add_development_dependency 'rake', '~> 10.0.3'
|
10
11
|
|
11
|
-
s.files
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.test_files = `git ls-files -- test/*`.split("\n")
|
12
14
|
end
|
@@ -11,7 +11,8 @@ module Rails
|
|
11
11
|
argument :attributes, type: :array, default: [], banner: 'field:type field:type'
|
12
12
|
|
13
13
|
def create_root_folder
|
14
|
-
|
14
|
+
path = File.join('app/views', controller_file_path)
|
15
|
+
empty_directory path unless File.directory?(path)
|
15
16
|
end
|
16
17
|
|
17
18
|
def copy_view_files
|
@@ -30,8 +31,12 @@ module Rails
|
|
30
31
|
def attributes_list_with_timestamps
|
31
32
|
attributes_list(attributes_names + %w(created_at updated_at))
|
32
33
|
end
|
33
|
-
|
34
|
+
|
34
35
|
def attributes_list(attributes = attributes_names)
|
36
|
+
if self.attributes.any? {|attr| attr.name == 'password' && attr.type == :digest}
|
37
|
+
attributes = attributes.reject {|name| %w(password password_confirmation).include? name}
|
38
|
+
end
|
39
|
+
|
35
40
|
attributes.map { |a| ":#{a}"} * ', '
|
36
41
|
end
|
37
42
|
end
|
@@ -1,11 +1,12 @@
|
|
1
|
+
require 'rails/generators'
|
1
2
|
require 'rails/generators/rails/scaffold_controller/scaffold_controller_generator'
|
2
3
|
|
3
4
|
module Rails
|
4
5
|
module Generators
|
5
|
-
class
|
6
|
+
class ScaffoldControllerGenerator
|
6
7
|
source_root File.expand_path('../templates', __FILE__)
|
7
8
|
|
8
|
-
hook_for :
|
9
|
+
hook_for :jbuilder, default: true
|
9
10
|
end
|
10
11
|
end
|
11
12
|
end
|
data/lib/jbuilder.rb
CHANGED
@@ -35,10 +35,10 @@ class Jbuilder < JbuilderProxy
|
|
35
35
|
def format(key)
|
36
36
|
@cache[key] ||= @format.inject(key.to_s) do |result, args|
|
37
37
|
func, args = args
|
38
|
-
if func.is_a?
|
39
|
-
func.call
|
38
|
+
if func.is_a?(::Proc)
|
39
|
+
func.call result, *args
|
40
40
|
else
|
41
|
-
result.send
|
41
|
+
result.send func, *args
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -70,30 +70,47 @@ class Jbuilder < JbuilderProxy
|
|
70
70
|
yield self if ::Kernel.block_given?
|
71
71
|
end
|
72
72
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
73
|
+
BLANK = ::Object.new
|
74
|
+
|
75
|
+
def set!(key, value = BLANK, *args, &block)
|
76
|
+
result = if ::Kernel.block_given?
|
77
|
+
if BLANK != value
|
78
|
+
# json.comments @post.comments { |comment| ... }
|
79
|
+
# { "comments": [ { ... }, { ... } ] }
|
80
|
+
_scope{ array! value, &block }
|
81
|
+
else
|
82
|
+
# json.comments { ... }
|
83
|
+
# { "comments": ... }
|
84
|
+
_scope { yield self }
|
85
|
+
end
|
86
|
+
elsif args.empty?
|
87
|
+
if ::Jbuilder === value
|
88
|
+
# json.age 32
|
89
|
+
# json.person another_jbuilder
|
90
|
+
# { "age": 32, "person": { ... }
|
91
|
+
value.attributes!
|
92
|
+
else
|
93
|
+
# json.age 32
|
94
|
+
# { "age": 32 }
|
95
|
+
value
|
96
|
+
end
|
97
|
+
elsif value.respond_to?(:map)
|
98
|
+
# json.comments @post.comments, :content, :created_at
|
99
|
+
# { "comments": [ { "content": "hello", "created_at": "..." }, { "content": "world", "created_at": "..." } ] }
|
100
|
+
_map_collection(value){ |element| extract! element, *args }
|
92
101
|
else
|
93
|
-
|
102
|
+
# json.author @post.creator, :name, :email_address
|
103
|
+
# { "author": { "name": "David", "email_address": "david@loudthinking.com" } }
|
104
|
+
_scope { extract! value, *args }
|
94
105
|
end
|
106
|
+
|
107
|
+
_set_value key, result
|
95
108
|
end
|
96
109
|
|
110
|
+
alias_method :method_missing, :set!
|
111
|
+
private :method_missing
|
112
|
+
|
113
|
+
|
97
114
|
# Specifies formatting to be applied to the key. Passing in a name of a function
|
98
115
|
# will cause that function to be called on the key. So :upcase will upper case
|
99
116
|
# the key. You can also pass in lambdas for more complex transformations.
|
@@ -136,12 +153,12 @@ class Jbuilder < JbuilderProxy
|
|
136
153
|
# not to receive keys which have null values.
|
137
154
|
#
|
138
155
|
# Example:
|
139
|
-
# json.ignore_nil!
|
156
|
+
# json.ignore_nil! false
|
140
157
|
# json.id User.new.id
|
141
158
|
#
|
142
159
|
# { "id": null }
|
143
160
|
#
|
144
|
-
# json.ignore_nil
|
161
|
+
# json.ignore_nil!
|
145
162
|
# json.id User.new.id
|
146
163
|
#
|
147
164
|
# {}
|
@@ -172,7 +189,7 @@ class Jbuilder < JbuilderProxy
|
|
172
189
|
# json.content comment.formatted_content
|
173
190
|
# end
|
174
191
|
def child!
|
175
|
-
@attributes = [] unless @attributes.is_a?
|
192
|
+
@attributes = [] unless @attributes.is_a?(::Array)
|
176
193
|
@attributes << _scope { yield self }
|
177
194
|
end
|
178
195
|
|
@@ -206,9 +223,9 @@ class Jbuilder < JbuilderProxy
|
|
206
223
|
# json.array! [1, 2, 3]
|
207
224
|
#
|
208
225
|
# [1,2,3]
|
209
|
-
def array!(collection)
|
226
|
+
def array!(collection, &block)
|
210
227
|
@attributes = if ::Kernel::block_given?
|
211
|
-
_map_collection(collection) { |element|
|
228
|
+
_map_collection(collection) { |element| block.arity == 2 ? block[self, element] : block[element] }
|
212
229
|
else
|
213
230
|
collection
|
214
231
|
end
|
@@ -233,17 +250,17 @@ class Jbuilder < JbuilderProxy
|
|
233
250
|
# json.(@person, :name, :age)
|
234
251
|
def extract!(object, *attributes)
|
235
252
|
if object.is_a?(::Hash)
|
236
|
-
attributes.each {|attribute| _set_value attribute, object.
|
253
|
+
attributes.each { |attribute| _set_value attribute, object.fetch(attribute) }
|
237
254
|
else
|
238
|
-
attributes.each {|attribute| _set_value attribute, object.send(attribute)}
|
255
|
+
attributes.each { |attribute| _set_value attribute, object.send(attribute) }
|
239
256
|
end
|
240
257
|
end
|
241
258
|
|
242
259
|
def call(object = nil, *attributes)
|
243
260
|
if attributes.empty?
|
244
|
-
array!
|
261
|
+
array! object, &::Proc.new
|
245
262
|
else
|
246
|
-
extract!
|
263
|
+
extract! object, *attributes
|
247
264
|
end
|
248
265
|
end
|
249
266
|
|
@@ -254,62 +271,17 @@ class Jbuilder < JbuilderProxy
|
|
254
271
|
|
255
272
|
# Encodes the current builder as JSON.
|
256
273
|
def target!
|
257
|
-
::MultiJson.
|
274
|
+
::MultiJson.dump @attributes
|
258
275
|
end
|
259
276
|
|
260
|
-
|
277
|
+
private
|
278
|
+
|
261
279
|
def _set_value(key, value)
|
262
280
|
unless @ignore_nil && value.nil?
|
263
281
|
@attributes[@key_formatter.format(key)] = value
|
264
282
|
end
|
265
283
|
end
|
266
284
|
|
267
|
-
private
|
268
|
-
|
269
|
-
BLANK = ::Object.new
|
270
|
-
|
271
|
-
def method_missing(method, value = BLANK, *args)
|
272
|
-
result = if ::Kernel.block_given?
|
273
|
-
if BLANK != value
|
274
|
-
# json.comments @post.comments { |comment| ... }
|
275
|
-
# { "comments": [ { ... }, { ... } ] }
|
276
|
-
_map_collection(value) { |element| if ::Proc.new.arity == 2 then yield self, element else yield element end }
|
277
|
-
else
|
278
|
-
# json.comments { ... }
|
279
|
-
# { "comments": ... }
|
280
|
-
_scope { yield self }
|
281
|
-
end
|
282
|
-
else
|
283
|
-
if args.empty?
|
284
|
-
if ::Jbuilder === value
|
285
|
-
# json.age 32
|
286
|
-
# json.person another_jbuilder
|
287
|
-
# { "age": 32, "person": { ... }
|
288
|
-
value.attributes!
|
289
|
-
else
|
290
|
-
# json.age 32
|
291
|
-
# { "age": 32 }
|
292
|
-
value
|
293
|
-
end
|
294
|
-
else
|
295
|
-
if value.respond_to?(:map)
|
296
|
-
# json.comments(@post.comments, :content, :created_at)
|
297
|
-
# { "comments": [ { "content": "hello", "created_at": "..." }, { "content": "world", "created_at": "..." } ] }
|
298
|
-
_map_collection(value) do |element|
|
299
|
-
args.each do |attribute|
|
300
|
-
_set_value attribute, element.send(attribute)
|
301
|
-
end
|
302
|
-
end
|
303
|
-
else
|
304
|
-
# json.author @post.creator, :name, :email_address
|
305
|
-
# { "author": { "name": "David", "email_address": "david@loudthinking.com" } }
|
306
|
-
_scope { extract! value, *args }
|
307
|
-
end
|
308
|
-
end
|
309
|
-
end
|
310
|
-
_set_value method, result
|
311
|
-
end
|
312
|
-
|
313
285
|
def _map_collection(collection)
|
314
286
|
return [] if collection.nil?
|
315
287
|
|
@@ -329,17 +301,13 @@ class Jbuilder < JbuilderProxy
|
|
329
301
|
|
330
302
|
def _merge(hash_or_array)
|
331
303
|
if hash_or_array.is_a?(::Array)
|
332
|
-
@attributes = [] unless @attributes.is_a?
|
333
|
-
@attributes.concat
|
304
|
+
@attributes = [] unless @attributes.is_a?(::Array)
|
305
|
+
@attributes.concat hash_or_array
|
334
306
|
else
|
335
|
-
@attributes.update
|
307
|
+
@attributes.update hash_or_array
|
336
308
|
end
|
337
309
|
end
|
338
310
|
end
|
339
311
|
|
340
|
-
require 'jbuilder_template' if defined?(ActionView::Template)
|
341
|
-
|
342
|
-
begin
|
343
|
-
require 'railtie' if Rails::VERSION::MAJOR == 4
|
344
|
-
rescue NameError
|
345
|
-
end
|
312
|
+
require 'jbuilder/jbuilder_template' if defined?(ActionView::Template)
|
313
|
+
require 'jbuilder/railtie' if defined?(Rails::VERSION::MAJOR) && Rails::VERSION::MAJOR == 4
|
@@ -34,7 +34,12 @@ class JbuilderTemplate < Jbuilder
|
|
34
34
|
|
35
35
|
protected
|
36
36
|
def _cache_key(key)
|
37
|
-
if @context.respond_to?(:
|
37
|
+
if @context.respond_to?(:cache_fragment_name)
|
38
|
+
# Current compatibility, fragment_name_with_digest is private again and cache_fragment_name
|
39
|
+
# should be used instead.
|
40
|
+
@context.cache_fragment_name(key)
|
41
|
+
elsif @context.respond_to?(:fragment_name_with_digest)
|
42
|
+
# Backwards compatibility for period of time when fragment_name_with_digest was made public.
|
38
43
|
@context.fragment_name_with_digest(key)
|
39
44
|
else
|
40
45
|
::ActiveSupport::Cache.expand_cache_key(key.is_a?(::Hash) ? url_for(key).split('://').last : key, :jbuilder)
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'rails/railtie'
|
2
|
+
|
3
|
+
class Jbuilder
|
4
|
+
class Railtie < ::Rails::Railtie
|
5
|
+
generators do |app|
|
6
|
+
Rails::Generators.configure! app.config.generators
|
7
|
+
Rails::Generators.hidden_namespaces.uniq!
|
8
|
+
require 'generators/rails/scaffold_controller_generator'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -3,8 +3,8 @@ require 'generators/rails/jbuilder_generator'
|
|
3
3
|
|
4
4
|
class JbuilderGeneratorTest < Rails::Generators::TestCase
|
5
5
|
tests Rails::Generators::JbuilderGenerator
|
6
|
-
arguments %w(Post title body:text)
|
7
|
-
destination File.expand_path('../tmp',
|
6
|
+
arguments %w(Post title body:text password:digest)
|
7
|
+
destination File.expand_path('../tmp', __FILE__)
|
8
8
|
setup :prepare_destination
|
9
9
|
|
10
10
|
test 'views are generated' do
|
@@ -28,4 +28,4 @@ class JbuilderGeneratorTest < Rails::Generators::TestCase
|
|
28
28
|
assert_match /json\.extract! @post, :title, :body, :created_at, :updated_at/, content
|
29
29
|
end
|
30
30
|
end
|
31
|
-
end
|
31
|
+
end
|
@@ -1,121 +1,151 @@
|
|
1
1
|
require 'test/unit'
|
2
|
+
require 'mocha/setup'
|
2
3
|
require 'action_view'
|
3
4
|
require 'action_view/testing/resolvers'
|
4
5
|
require 'active_support/cache'
|
5
6
|
require 'jbuilder'
|
6
7
|
|
7
8
|
module Rails
|
8
|
-
|
9
|
-
|
10
|
-
clear
|
11
|
-
end
|
12
|
-
|
13
|
-
def clear; @cache = {}; end
|
14
|
-
|
15
|
-
def write(k, v, opt={})
|
16
|
-
@cache[k] = v
|
17
|
-
end
|
18
|
-
|
19
|
-
def read(k, opt={})
|
20
|
-
@cache[k]
|
21
|
-
end
|
22
|
-
|
23
|
-
def fetch(k, opt={}, &block)
|
24
|
-
@cache[k] || @cache[k] = block.call
|
25
|
-
end
|
9
|
+
def self.cache
|
10
|
+
@cache ||= ActiveSupport::Cache::MemoryStore.new
|
26
11
|
end
|
27
|
-
|
28
|
-
def self.cache; @cache ||= Cache.new; end
|
29
12
|
end
|
30
13
|
|
31
14
|
class JbuilderTemplateTest < ActionView::TestCase
|
15
|
+
setup do
|
16
|
+
@context = self
|
17
|
+
Rails.cache.clear
|
18
|
+
end
|
19
|
+
|
32
20
|
def partials
|
33
|
-
{
|
21
|
+
{ '_partial.json.jbuilder' => 'json.content "hello"' }
|
34
22
|
end
|
35
23
|
|
36
24
|
def render_jbuilder(source)
|
37
25
|
@rendered = []
|
38
|
-
lookup_context.view_paths = [ActionView::FixtureResolver.new(partials.merge(
|
39
|
-
ActionView::Template.new(source,
|
26
|
+
lookup_context.view_paths = [ActionView::FixtureResolver.new(partials.merge('test.json.jbuilder' => source))]
|
27
|
+
ActionView::Template.new(source, 'test', JbuilderHandler, :virtual_path => 'test').render(self, {}).strip
|
28
|
+
end
|
29
|
+
|
30
|
+
def undef_context_methods(*names)
|
31
|
+
self.class_eval do
|
32
|
+
names.each do |name|
|
33
|
+
undef_method name.to_sym if self.method_defined?(name.to_sym)
|
34
|
+
end
|
35
|
+
end
|
40
36
|
end
|
41
37
|
|
42
|
-
test
|
38
|
+
test 'rendering' do
|
43
39
|
json = render_jbuilder <<-JBUILDER
|
44
|
-
json.content
|
40
|
+
json.content 'hello'
|
45
41
|
JBUILDER
|
46
42
|
|
47
|
-
assert_equal
|
43
|
+
assert_equal 'hello', MultiJson.load(json)['content']
|
48
44
|
end
|
49
45
|
|
50
|
-
test
|
46
|
+
test 'key_format! with parameter' do
|
51
47
|
json = render_jbuilder <<-JBUILDER
|
52
48
|
json.key_format! :camelize => [:lower]
|
53
|
-
json.camel_style
|
49
|
+
json.camel_style 'for JS'
|
54
50
|
JBUILDER
|
55
51
|
|
56
52
|
assert_equal ['camelStyle'], MultiJson.load(json).keys
|
57
53
|
end
|
58
54
|
|
59
|
-
test
|
55
|
+
test 'key_format! propagates to child elements' do
|
60
56
|
json = render_jbuilder <<-JBUILDER
|
61
57
|
json.key_format! :upcase
|
62
|
-
json.level1
|
58
|
+
json.level1 'one'
|
63
59
|
json.level2 do
|
64
|
-
json.value
|
60
|
+
json.value 'two'
|
65
61
|
end
|
66
62
|
JBUILDER
|
67
63
|
|
68
64
|
result = MultiJson.load(json)
|
69
|
-
assert_equal
|
70
|
-
assert_equal
|
65
|
+
assert_equal 'one', result['LEVEL1']
|
66
|
+
assert_equal 'two', result['LEVEL2']['VALUE']
|
71
67
|
end
|
72
68
|
|
73
|
-
test
|
69
|
+
test 'partial! renders partial' do
|
74
70
|
json = render_jbuilder <<-JBUILDER
|
75
71
|
json.partial! 'partial'
|
76
72
|
JBUILDER
|
77
73
|
|
78
|
-
assert_equal
|
74
|
+
assert_equal 'hello', MultiJson.load(json)['content']
|
79
75
|
end
|
80
76
|
|
81
|
-
test
|
82
|
-
|
83
|
-
|
77
|
+
test 'fragment caching a JSON object' do
|
78
|
+
undef_context_methods :fragment_name_with_digest, :cache_fragment_name
|
79
|
+
|
84
80
|
render_jbuilder <<-JBUILDER
|
85
|
-
json.cache!
|
86
|
-
json.name
|
81
|
+
json.cache! 'cachekey' do
|
82
|
+
json.name 'Cache'
|
87
83
|
end
|
88
84
|
JBUILDER
|
89
85
|
|
90
86
|
json = render_jbuilder <<-JBUILDER
|
91
|
-
json.cache!
|
92
|
-
json.name
|
87
|
+
json.cache! 'cachekey' do
|
88
|
+
json.name 'Miss'
|
93
89
|
end
|
94
90
|
JBUILDER
|
95
91
|
|
96
|
-
MultiJson.load(json)
|
97
|
-
|
98
|
-
end
|
92
|
+
parsed = MultiJson.load(json)
|
93
|
+
assert_equal 'Cache', parsed['name']
|
99
94
|
end
|
100
95
|
|
101
|
-
test
|
102
|
-
|
103
|
-
|
96
|
+
test 'fragment caching deserializes an array' do
|
97
|
+
undef_context_methods :fragment_name_with_digest, :cache_fragment_name
|
98
|
+
|
104
99
|
render_jbuilder <<-JBUILDER
|
105
|
-
json.cache!
|
106
|
-
json.array!
|
100
|
+
json.cache! 'cachekey' do
|
101
|
+
json.array! %w(a b c)
|
107
102
|
end
|
108
103
|
JBUILDER
|
109
104
|
|
110
105
|
json = render_jbuilder <<-JBUILDER
|
111
|
-
json.cache!
|
112
|
-
json.array!
|
106
|
+
json.cache! 'cachekey' do
|
107
|
+
json.array! %w(1 2 3)
|
113
108
|
end
|
114
109
|
JBUILDER
|
115
110
|
|
116
|
-
MultiJson.load(json)
|
117
|
-
|
118
|
-
end
|
111
|
+
parsed = MultiJson.load(json)
|
112
|
+
assert_equal %w(a b c), parsed
|
119
113
|
end
|
120
114
|
|
121
|
-
|
115
|
+
test 'fragment caching works with previous version of cache digests' do
|
116
|
+
undef_context_methods :cache_fragment_name
|
117
|
+
|
118
|
+
@context.expects :fragment_name_with_digest
|
119
|
+
|
120
|
+
render_jbuilder <<-JBUILDER
|
121
|
+
json.cache! 'cachekey' do
|
122
|
+
json.name 'Cache'
|
123
|
+
end
|
124
|
+
JBUILDER
|
125
|
+
end
|
126
|
+
|
127
|
+
test 'fragment caching works with current cache digests' do
|
128
|
+
undef_context_methods :fragment_name_with_digest
|
129
|
+
|
130
|
+
@context.expects :cache_fragment_name
|
131
|
+
|
132
|
+
render_jbuilder <<-JBUILDER
|
133
|
+
json.cache! 'cachekey' do
|
134
|
+
json.name 'Cache'
|
135
|
+
end
|
136
|
+
JBUILDER
|
137
|
+
end
|
138
|
+
|
139
|
+
test 'fragment caching falls back on ActiveSupport::Cache.expand_cache_key' do
|
140
|
+
undef_context_methods :fragment_name_with_digest, :cache_fragment_name
|
141
|
+
|
142
|
+
ActiveSupport::Cache.expects :expand_cache_key
|
143
|
+
|
144
|
+
render_jbuilder <<-JBUILDER
|
145
|
+
json.cache! 'cachekey' do
|
146
|
+
json.name 'Cache'
|
147
|
+
end
|
148
|
+
JBUILDER
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
data/test/jbuilder_test.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'active_support/test_case'
|
3
3
|
require 'active_support/inflector'
|
4
|
-
|
5
4
|
require 'jbuilder'
|
6
5
|
|
6
|
+
Comment = Struct.new(:content, :id)
|
7
|
+
|
7
8
|
class JbuilderProxy
|
8
9
|
# Faking Object#instance_eval for 1.8
|
9
10
|
def instance_eval(code)
|
@@ -53,10 +54,9 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
53
54
|
json.content 'world'
|
54
55
|
end
|
55
56
|
|
56
|
-
MultiJson.load(json)
|
57
|
-
|
58
|
-
|
59
|
-
end
|
57
|
+
parsed = MultiJson.load(json)
|
58
|
+
assert_equal 'hello', parsed['title']
|
59
|
+
assert_equal 'world', parsed['content']
|
60
60
|
end
|
61
61
|
|
62
62
|
test 'extracting from object' do
|
@@ -66,10 +66,9 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
66
66
|
json.extract! person, :name, :age
|
67
67
|
end
|
68
68
|
|
69
|
-
MultiJson.load(json)
|
70
|
-
|
71
|
-
|
72
|
-
end
|
69
|
+
parsed = MultiJson.load(json)
|
70
|
+
assert_equal 'David', parsed['name']
|
71
|
+
assert_equal 32, parsed['age']
|
73
72
|
end
|
74
73
|
|
75
74
|
test 'extracting from object using call style for 1.9' do
|
@@ -83,10 +82,9 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
83
82
|
end
|
84
83
|
end
|
85
84
|
|
86
|
-
MultiJson.load(json)
|
87
|
-
|
88
|
-
|
89
|
-
end
|
85
|
+
parsed = MultiJson.load(json)
|
86
|
+
assert_equal 'David', parsed['name']
|
87
|
+
assert_equal 32, parsed['age']
|
90
88
|
end
|
91
89
|
|
92
90
|
test 'extracting from hash' do
|
@@ -96,10 +94,9 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
96
94
|
json.extract! person, :name, :age
|
97
95
|
end
|
98
96
|
|
99
|
-
MultiJson.load(json)
|
100
|
-
|
101
|
-
|
102
|
-
end
|
97
|
+
parsed = MultiJson.load(json)
|
98
|
+
assert_equal 'Jim', parsed['name']
|
99
|
+
assert_equal 34, parsed['age']
|
103
100
|
end
|
104
101
|
|
105
102
|
test 'nesting single child with block' do
|
@@ -110,10 +107,9 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
110
107
|
end
|
111
108
|
end
|
112
109
|
|
113
|
-
MultiJson.load(json)
|
114
|
-
|
115
|
-
|
116
|
-
end
|
110
|
+
parsed = MultiJson.load(json)
|
111
|
+
assert_equal 'David', parsed['author']['name']
|
112
|
+
assert_equal 32, parsed['author']['age']
|
117
113
|
end
|
118
114
|
|
119
115
|
test 'nesting multiple children with block' do
|
@@ -124,10 +120,9 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
124
120
|
end
|
125
121
|
end
|
126
122
|
|
127
|
-
MultiJson.load(json)
|
128
|
-
|
129
|
-
|
130
|
-
end
|
123
|
+
parsed = MultiJson.load(json)
|
124
|
+
assert_equal 'hello', parsed['comments'].first['content']
|
125
|
+
assert_equal 'world', parsed['comments'].second['content']
|
131
126
|
end
|
132
127
|
|
133
128
|
test 'nesting single child with inline extract' do
|
@@ -143,24 +138,22 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
143
138
|
json.author person, :name, :age
|
144
139
|
end
|
145
140
|
|
146
|
-
MultiJson.load(json)
|
147
|
-
|
148
|
-
|
149
|
-
end
|
141
|
+
parsed = MultiJson.load(json)
|
142
|
+
assert_equal 'David', parsed['author']['name']
|
143
|
+
assert_equal 32, parsed['author']['age']
|
150
144
|
end
|
151
145
|
|
152
146
|
test 'nesting multiple children from array' do
|
153
|
-
comments = [
|
147
|
+
comments = [ Comment.new('hello', 1), Comment.new('world', 2) ]
|
154
148
|
|
155
149
|
json = Jbuilder.encode do |json|
|
156
150
|
json.comments comments, :content
|
157
151
|
end
|
158
152
|
|
159
|
-
MultiJson.load(json)
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
end
|
153
|
+
parsed = MultiJson.load(json)
|
154
|
+
assert_equal ['content'], parsed['comments'].first.keys
|
155
|
+
assert_equal 'hello', parsed['comments'].first['content']
|
156
|
+
assert_equal 'world', parsed['comments'].second['content']
|
164
157
|
end
|
165
158
|
|
166
159
|
test 'nesting multiple children from array when child array is empty' do
|
@@ -171,14 +164,13 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
171
164
|
json.comments comments, :content
|
172
165
|
end
|
173
166
|
|
174
|
-
MultiJson.load(json)
|
175
|
-
|
176
|
-
|
177
|
-
end
|
167
|
+
parsed = MultiJson.load(json)
|
168
|
+
assert_equal 'Parent', parsed['name']
|
169
|
+
assert_equal [], parsed['comments']
|
178
170
|
end
|
179
171
|
|
180
172
|
test 'nesting multiple children from array with inline loop' do
|
181
|
-
comments = [
|
173
|
+
comments = [ Comment.new('hello', 1), Comment.new('world', 2) ]
|
182
174
|
|
183
175
|
json = Jbuilder.encode do |json|
|
184
176
|
json.comments comments do |comment|
|
@@ -186,11 +178,10 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
186
178
|
end
|
187
179
|
end
|
188
180
|
|
189
|
-
MultiJson.load(json)
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
end
|
181
|
+
parsed = MultiJson.load(json)
|
182
|
+
assert_equal ['content'], parsed['comments'].first.keys
|
183
|
+
assert_equal 'hello', parsed['comments'].first['content']
|
184
|
+
assert_equal 'world', parsed['comments'].second['content']
|
194
185
|
end
|
195
186
|
|
196
187
|
test 'handles nil-collections as empty arrays' do
|
@@ -204,21 +195,20 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
204
195
|
end
|
205
196
|
|
206
197
|
test 'nesting multiple children from a non-Enumerable that responds to #map' do
|
207
|
-
comments = NonEnumerable.new([
|
198
|
+
comments = NonEnumerable.new([ Comment.new('hello', 1), Comment.new('world', 2) ])
|
208
199
|
|
209
200
|
json = Jbuilder.encode do |json|
|
210
201
|
json.comments comments, :content
|
211
202
|
end
|
212
203
|
|
213
|
-
MultiJson.load(json)
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
end
|
204
|
+
parsed = MultiJson.load(json)
|
205
|
+
assert_equal ['content'], parsed['comments'].first.keys
|
206
|
+
assert_equal 'hello', parsed['comments'].first['content']
|
207
|
+
assert_equal 'world', parsed['comments'].second['content']
|
218
208
|
end
|
219
209
|
|
220
210
|
test 'nesting multiple chilren from a non-Enumerable that responds to #map with inline loop' do
|
221
|
-
comments = NonEnumerable.new([
|
211
|
+
comments = NonEnumerable.new([ Comment.new('hello', 1), Comment.new('world', 2) ])
|
222
212
|
|
223
213
|
json = Jbuilder.encode do |json|
|
224
214
|
json.comments comments do |comment|
|
@@ -226,15 +216,14 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
226
216
|
end
|
227
217
|
end
|
228
218
|
|
229
|
-
MultiJson.load(json)
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
end
|
219
|
+
parsed = MultiJson.load(json)
|
220
|
+
assert_equal ['content'], parsed['comments'].first.keys
|
221
|
+
assert_equal 'hello', parsed['comments'].first['content']
|
222
|
+
assert_equal 'world', parsed['comments'].second['content']
|
234
223
|
end
|
235
224
|
|
236
225
|
test 'nesting multiple children from array with inline loop with old api' do
|
237
|
-
comments = [
|
226
|
+
comments = [ Comment.new('hello', 1), Comment.new('world', 2) ]
|
238
227
|
|
239
228
|
json = Jbuilder.encode do |json|
|
240
229
|
json.comments comments do |json, comment|
|
@@ -242,15 +231,14 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
242
231
|
end
|
243
232
|
end
|
244
233
|
|
245
|
-
MultiJson.load(json)
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
end
|
234
|
+
parsed = MultiJson.load(json)
|
235
|
+
assert_equal ['content'], parsed['comments'].first.keys
|
236
|
+
assert_equal 'hello', parsed['comments'].first['content']
|
237
|
+
assert_equal 'world', parsed['comments'].second['content']
|
250
238
|
end
|
251
239
|
|
252
240
|
test 'nesting multiple children from array with inline loop on root' do
|
253
|
-
comments = [
|
241
|
+
comments = [ Comment.new('hello', 1), Comment.new('world', 2) ]
|
254
242
|
|
255
243
|
json = Jbuilder.encode do |json|
|
256
244
|
json.call(comments) do |comment|
|
@@ -258,14 +246,13 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
258
246
|
end
|
259
247
|
end
|
260
248
|
|
261
|
-
MultiJson.load(json)
|
262
|
-
|
263
|
-
|
264
|
-
end
|
249
|
+
parsed = MultiJson.load(json)
|
250
|
+
assert_equal 'hello', parsed.first['content']
|
251
|
+
assert_equal 'world', parsed.second['content']
|
265
252
|
end
|
266
253
|
|
267
254
|
test 'nesting multiple children from array with inline loop on root with old api' do
|
268
|
-
comments = [
|
255
|
+
comments = [ Comment.new('hello', 1), Comment.new('world', 2) ]
|
269
256
|
|
270
257
|
json = Jbuilder.encode do |json|
|
271
258
|
json.call(comments) do |json, comment|
|
@@ -273,10 +260,9 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
273
260
|
end
|
274
261
|
end
|
275
262
|
|
276
|
-
MultiJson.load(json)
|
277
|
-
|
278
|
-
|
279
|
-
end
|
263
|
+
parsed = MultiJson.load(json)
|
264
|
+
assert_equal 'hello', parsed.first['content']
|
265
|
+
assert_equal 'world', parsed.second['content']
|
280
266
|
end
|
281
267
|
|
282
268
|
test 'array nested inside nested hash' do
|
@@ -292,10 +278,9 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
292
278
|
end
|
293
279
|
end
|
294
280
|
|
295
|
-
MultiJson.load(json)
|
296
|
-
|
297
|
-
|
298
|
-
end
|
281
|
+
parsed = MultiJson.load(json)
|
282
|
+
assert_equal 'hello', parsed['author']['comments'].first['content']
|
283
|
+
assert_equal 'world', parsed['author']['comments'].second['content']
|
299
284
|
end
|
300
285
|
|
301
286
|
test 'array nested inside array' do
|
@@ -351,13 +336,25 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
351
336
|
json.value 'Test'
|
352
337
|
json.nested to_nest
|
353
338
|
end
|
354
|
-
|
355
|
-
|
356
|
-
assert_equal
|
339
|
+
|
340
|
+
result = {'value' => 'Test', 'nested' => {'nested_value' => 'Nested Test'}}
|
341
|
+
assert_equal result, MultiJson.load(json)
|
342
|
+
end
|
343
|
+
|
344
|
+
test 'nested jbuilder object via set!' do
|
345
|
+
to_nest = Jbuilder.new
|
346
|
+
to_nest.nested_value 'Nested Test'
|
347
|
+
json = Jbuilder.encode do |json|
|
348
|
+
json.value 'Test'
|
349
|
+
json.set! :nested, to_nest
|
350
|
+
end
|
351
|
+
|
352
|
+
result = {'value' => 'Test', 'nested' => {'nested_value' => 'Nested Test'}}
|
353
|
+
assert_equal result, MultiJson.load(json)
|
357
354
|
end
|
358
355
|
|
359
356
|
test 'top-level array' do
|
360
|
-
comments = [
|
357
|
+
comments = [ Comment.new('hello', 1), Comment.new('world', 2) ]
|
361
358
|
|
362
359
|
json = Jbuilder.encode do |json|
|
363
360
|
json.array!(comments) do |comment|
|
@@ -365,10 +362,9 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
365
362
|
end
|
366
363
|
end
|
367
364
|
|
368
|
-
MultiJson.load(json)
|
369
|
-
|
370
|
-
|
371
|
-
end
|
365
|
+
parsed = MultiJson.load(json)
|
366
|
+
assert_equal 'hello', parsed.first['content']
|
367
|
+
assert_equal 'world', parsed.second['content']
|
372
368
|
end
|
373
369
|
|
374
370
|
test 'empty top-level array' do
|
@@ -385,7 +381,7 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
385
381
|
|
386
382
|
test 'dynamically set a key/value' do
|
387
383
|
json = Jbuilder.encode do |json|
|
388
|
-
json.set!
|
384
|
+
json.set! :each, 'stuff'
|
389
385
|
end
|
390
386
|
|
391
387
|
assert_equal 'stuff', MultiJson.load(json)['each']
|
@@ -399,10 +395,22 @@ class JbuilderTest < ActiveSupport::TestCase
|
|
399
395
|
end
|
400
396
|
end
|
401
397
|
|
402
|
-
MultiJson.load(json)
|
403
|
-
|
404
|
-
|
398
|
+
parsed = MultiJson.load(json)
|
399
|
+
assert_equal 'David', parsed['author']['name']
|
400
|
+
assert_equal 32, parsed['author']['age']
|
401
|
+
end
|
402
|
+
|
403
|
+
test 'dynamically sets a collection' do
|
404
|
+
comments = [ Comment.new('hello', 1), Comment.new('world', 2) ]
|
405
|
+
|
406
|
+
json = Jbuilder.encode do |json|
|
407
|
+
json.set! :comments, comments, :content
|
405
408
|
end
|
409
|
+
|
410
|
+
parsed = MultiJson.load(json)
|
411
|
+
assert_equal ['content'], parsed['comments'].first.keys
|
412
|
+
assert_equal 'hello', parsed['comments'].first['content']
|
413
|
+
assert_equal 'world', parsed['comments'].second['content']
|
406
414
|
end
|
407
415
|
|
408
416
|
test 'query like object' do
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'rails/generators/test_case'
|
2
|
-
require 'generators/rails/
|
2
|
+
require 'generators/rails/scaffold_controller_generator'
|
3
3
|
|
4
|
-
class
|
5
|
-
tests Rails::Generators::
|
4
|
+
class ScaffoldControllerGeneratorTest < Rails::Generators::TestCase
|
5
|
+
tests Rails::Generators::ScaffoldControllerGenerator
|
6
6
|
arguments %w(Post title body:text)
|
7
|
-
destination File.expand_path('../tmp',
|
7
|
+
destination File.expand_path('../tmp', __FILE__)
|
8
8
|
setup :prepare_destination
|
9
9
|
|
10
10
|
test 'controller content' do
|
metadata
CHANGED
@@ -1,36 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- David Heinemeier Hansson
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-03-24 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activesupport
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 3.0.0
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: 3.0.0
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -49,49 +44,52 @@ executables: []
|
|
49
44
|
extensions: []
|
50
45
|
extra_rdoc_files: []
|
51
46
|
files:
|
52
|
-
-
|
53
|
-
-
|
54
|
-
-
|
55
|
-
-
|
56
|
-
-
|
57
|
-
-
|
58
|
-
-
|
59
|
-
-
|
60
|
-
-
|
61
|
-
-
|
62
|
-
-
|
63
|
-
-
|
64
|
-
-
|
65
|
-
-
|
66
|
-
-
|
67
|
-
-
|
68
|
-
-
|
69
|
-
-
|
70
|
-
-
|
71
|
-
-
|
72
|
-
- ./test/scaffold_controller_generator_test.rb
|
47
|
+
- .gitignore
|
48
|
+
- .travis.yml
|
49
|
+
- Gemfile
|
50
|
+
- Gemfile.edge
|
51
|
+
- MIT-LICENSE
|
52
|
+
- README.md
|
53
|
+
- Rakefile
|
54
|
+
- jbuilder.gemspec
|
55
|
+
- lib/generators/rails/jbuilder_generator.rb
|
56
|
+
- lib/generators/rails/scaffold_controller_generator.rb
|
57
|
+
- lib/generators/rails/templates/controller.rb
|
58
|
+
- lib/generators/rails/templates/index.json.jbuilder
|
59
|
+
- lib/generators/rails/templates/show.json.jbuilder
|
60
|
+
- lib/jbuilder.rb
|
61
|
+
- lib/jbuilder/jbuilder_template.rb
|
62
|
+
- lib/jbuilder/railtie.rb
|
63
|
+
- test/jbuilder_generator_test.rb
|
64
|
+
- test/jbuilder_template_test.rb
|
65
|
+
- test/jbuilder_test.rb
|
66
|
+
- test/scaffold_controller_generator_test.rb
|
73
67
|
homepage:
|
74
|
-
licenses:
|
68
|
+
licenses:
|
69
|
+
- MIT
|
70
|
+
metadata: {}
|
75
71
|
post_install_message:
|
76
72
|
rdoc_options: []
|
77
73
|
require_paths:
|
78
74
|
- lib
|
79
75
|
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
-
none: false
|
81
76
|
requirements:
|
82
|
-
- -
|
77
|
+
- - '>='
|
83
78
|
- !ruby/object:Gem::Version
|
84
79
|
version: '0'
|
85
80
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
-
none: false
|
87
81
|
requirements:
|
88
|
-
- -
|
82
|
+
- - '>='
|
89
83
|
- !ruby/object:Gem::Version
|
90
84
|
version: '0'
|
91
85
|
requirements: []
|
92
86
|
rubyforge_project:
|
93
|
-
rubygems_version:
|
87
|
+
rubygems_version: 2.0.0
|
94
88
|
signing_key:
|
95
|
-
specification_version:
|
89
|
+
specification_version: 4
|
96
90
|
summary: Create JSON structures via a Builder-style DSL
|
97
|
-
test_files:
|
91
|
+
test_files:
|
92
|
+
- test/jbuilder_generator_test.rb
|
93
|
+
- test/jbuilder_template_test.rb
|
94
|
+
- test/jbuilder_test.rb
|
95
|
+
- test/scaffold_controller_generator_test.rb
|
data/Gemfile-1.8
DELETED
data/jbuilder-0.9.0.gem
DELETED
Binary file
|
data/jbuilder-1.0.0.gem
DELETED
Binary file
|
data/jbuilder-1.0.1.gem
DELETED
Binary file
|