petroglyph 0.0.5 → 0.0.6
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/.travis.yml +7 -0
- data/README.md +10 -2
- data/lib/petroglyph/version.rb +1 -1
- data/petroglyph.gemspec +1 -1
- data/spec/engine_spec.rb +9 -9
- data/spec/fixtures/views/partials/nested_partial.pg +1 -1
- data/spec/fixtures/views/the_partial.pg +1 -1
- data/spec/fixtures/views/with_partial.pg +1 -1
- data/spec/scope_spec.rb +104 -98
- data/spec/sinatra_integration_spec.rb +1 -4
- data/spec/tilt_spec.rb +1 -1
- metadata +13 -11
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
A simple, terse, and unsurprising ruby dsl to create json views.
|
4
4
|
|
5
|
+
[](http://travis-ci.org/kytrinyx/petroglyph)
|
6
|
+
[](https://codeclimate.com/github/kytrinyx/petroglyph)
|
7
|
+
|
5
8
|
## Usage
|
6
9
|
|
7
10
|
Add a node with a simple value:
|
@@ -85,13 +88,18 @@ In your controller:
|
|
85
88
|
|
86
89
|
Support for partials is non-standard at this time: create a subdirectory in the directory that your template lives in and call it `partials`.
|
87
90
|
|
91
|
+
## Sinatra
|
92
|
+
|
93
|
+
This works with version 1.3 of Sinatra. It may work with earlier versions.
|
94
|
+
|
95
|
+
There is a known incompatibility in Sinatra versions prior to 1.3 where a local variable named `post` will crash with Sinatra's HTTP `post` action.
|
96
|
+
The same goes for `get`, `head`, `put`, etc, but these are less likely to be resources in your application.
|
97
|
+
|
88
98
|
|
89
99
|
## Caveat
|
90
100
|
|
91
101
|
There is currently no support for instance variables in Sinatra and Rails 3.
|
92
102
|
|
93
|
-
Avoid using `post` as a local variable name in sinatra. Since the template context in sinatra is the controller, calling `post` from your template will call the http `post` action. Same goes for `get`, `head`, `put`, etc, but these are less likely to be resources in your application.
|
94
|
-
|
95
103
|
## Related Projects
|
96
104
|
|
97
105
|
Other json templating libraries exist, some of which also generate XML.
|
data/lib/petroglyph/version.rb
CHANGED
data/petroglyph.gemspec
CHANGED
data/spec/engine_spec.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Petroglyph::Engine do
|
4
|
-
specify "#to_hash" do
|
5
|
-
engine = Petroglyph::Engine.new('node :
|
6
|
-
engine.to_hash({:
|
4
|
+
specify "#to_hash takes local variables and passes them to the template" do
|
5
|
+
engine = Petroglyph::Engine.new('node :beverage => drink')
|
6
|
+
engine.to_hash({:drink => 'espresso'}).should eq({:beverage => 'espresso'})
|
7
7
|
end
|
8
8
|
|
9
9
|
it "takes a template" do
|
10
|
-
engine = Petroglyph::Engine.new('node :
|
11
|
-
engine.render.should eq({:
|
10
|
+
engine = Petroglyph::Engine.new('node :beverage => "no, thanks"')
|
11
|
+
engine.render.should eq({:beverage => "no, thanks"}.to_json)
|
12
12
|
end
|
13
13
|
|
14
14
|
it "takes a block" do
|
15
15
|
Petroglyph::Engine.new.render do
|
16
|
-
node :
|
17
|
-
end.should eq({:
|
16
|
+
node :beverage => "hot chocolate"
|
17
|
+
end.should eq({:beverage => "hot chocolate"}.to_json)
|
18
18
|
end
|
19
19
|
|
20
20
|
it "passes the locals" do
|
21
|
-
engine = Petroglyph::Engine.new('node :
|
22
|
-
engine.render(nil, {:
|
21
|
+
engine = Petroglyph::Engine.new('node :beverage => drink')
|
22
|
+
engine.render(nil, {:drink => 'bai mu cha'}).should eq({:beverage => 'bai mu cha'}.to_json)
|
23
23
|
end
|
24
24
|
end
|
@@ -1 +1 @@
|
|
1
|
-
partial :the_partial, :
|
1
|
+
partial :the_partial, :drink => 'stuff'
|
@@ -1 +1 @@
|
|
1
|
-
node :
|
1
|
+
node :beverage => drink
|
data/spec/scope_spec.rb
CHANGED
@@ -2,223 +2,227 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Petroglyph::Scope do
|
4
4
|
|
5
|
-
it
|
5
|
+
it 'takes a simple string value' do
|
6
6
|
scope = Petroglyph::Scope.new
|
7
|
-
scope.node :
|
8
|
-
scope.value.should eq(:
|
7
|
+
scope.node :beverage => 'soda pop'
|
8
|
+
scope.value.should eq(:beverage => 'soda pop')
|
9
9
|
end
|
10
10
|
|
11
|
-
it
|
12
|
-
tea = {:tea => {:
|
11
|
+
it 'merges in a hash' do
|
12
|
+
tea = {:tea => {:type => 'wulong', :temperature => 'hot'}}
|
13
13
|
|
14
14
|
scope = Petroglyph::Scope.new
|
15
15
|
scope.merge tea
|
16
|
-
scope.value.should eq({:tea => {:
|
16
|
+
scope.value.should eq({:tea => {:type => 'wulong', :temperature => 'hot'}})
|
17
17
|
end
|
18
18
|
|
19
|
-
it
|
19
|
+
it 'merges within a block' do
|
20
20
|
scope = Petroglyph::Scope.new
|
21
|
-
scope.node :
|
22
|
-
merge(
|
21
|
+
scope.node :beverage do
|
22
|
+
merge('espresso' => {:shots => 2})
|
23
23
|
end
|
24
24
|
|
25
|
-
scope.value.should eq({:
|
25
|
+
scope.value.should eq({:beverage => {'espresso' => {:shots => 2}}})
|
26
26
|
end
|
27
27
|
|
28
|
-
it
|
28
|
+
it 'lets you process what you merge in a block' do
|
29
29
|
scope = Petroglyph::Scope.new
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
drink = 'Zombie Driver'
|
31
|
+
def drink.tagline
|
32
|
+
'Take your mind off the apocalypse!'
|
33
|
+
end
|
34
|
+
scope.node :beverage do
|
35
|
+
merge(drink) do
|
36
|
+
attributes :tagline
|
33
37
|
end
|
34
38
|
end
|
35
39
|
|
36
|
-
scope.value.should eq({:
|
40
|
+
scope.value.should eq({:beverage => {:tagline => 'Take your mind off the apocalypse!'}})
|
37
41
|
end
|
38
42
|
|
39
|
-
it
|
43
|
+
it 'handles sibling nodes' do
|
40
44
|
scope = Petroglyph::Scope.new
|
41
|
-
scope.node :
|
42
|
-
scope.node :
|
45
|
+
scope.node :beverage => 'bubble milk tea'
|
46
|
+
scope.node :price => 2.5
|
43
47
|
|
44
|
-
scope.value.should eq({:
|
48
|
+
scope.value.should eq({:beverage => 'bubble milk tea', :price => 2.5})
|
45
49
|
end
|
46
50
|
|
47
|
-
it
|
51
|
+
it 'handles sibling nodes as blocks' do
|
48
52
|
scope = Petroglyph::Scope.new
|
49
|
-
scope.node :
|
50
|
-
scope.node :
|
51
|
-
merge(:
|
53
|
+
scope.node :beverage => 'root beer float'
|
54
|
+
scope.node :ingredients do
|
55
|
+
merge(:ice_cream => 'vanilla', :root_beer => 'to taste')
|
52
56
|
end
|
53
57
|
|
54
|
-
scope.value.should eq({:
|
58
|
+
scope.value.should eq({:beverage => 'root beer float', :ingredients => {:ice_cream => 'vanilla', :root_beer => 'to taste'}})
|
55
59
|
end
|
56
60
|
|
57
|
-
it
|
61
|
+
it 'nests nodes' do
|
58
62
|
scope = Petroglyph::Scope.new
|
59
|
-
scope.node :
|
60
|
-
node :
|
63
|
+
scope.node :beverage do
|
64
|
+
node :tea => 'black'
|
61
65
|
end
|
62
66
|
|
63
|
-
scope.value.should eq({:
|
67
|
+
scope.value.should eq({:beverage => {:tea => 'black'}})
|
64
68
|
end
|
65
69
|
|
66
|
-
it
|
70
|
+
it 'nests stuff arbitrarily deeply with complex values' do
|
67
71
|
scope = Petroglyph::Scope.new
|
68
72
|
scope.node :drink do
|
69
73
|
node :tea do
|
70
74
|
node :temperature do
|
71
|
-
merge(:really =>
|
75
|
+
merge(:really => 'hot')
|
72
76
|
end
|
73
77
|
end
|
74
78
|
end
|
75
79
|
|
76
|
-
scope.value.should eq({:drink => {:tea => {:temperature => {:really =>
|
80
|
+
scope.value.should eq({:drink => {:tea => {:temperature => {:really => 'hot'}}}})
|
77
81
|
end
|
78
82
|
|
79
|
-
it
|
83
|
+
it 'uses regular ruby' do
|
80
84
|
scope = Petroglyph::Scope.new
|
81
|
-
scope.node :
|
85
|
+
scope.node :beverage do
|
82
86
|
if false
|
83
|
-
|
87
|
+
'hot'
|
84
88
|
else
|
85
89
|
node(:tea) do
|
86
|
-
merge(:temperature =>
|
90
|
+
merge(:temperature => 'iced'.upcase)
|
87
91
|
end
|
88
92
|
end
|
89
93
|
end
|
90
94
|
|
91
|
-
scope.value.should eq({:
|
95
|
+
scope.value.should eq({:beverage => {:tea => {:temperature => 'ICED'}}})
|
92
96
|
end
|
93
97
|
|
94
|
-
context
|
95
|
-
let(:scope) { Petroglyph::Scope.new(nil, {:
|
98
|
+
context 'with locals' do
|
99
|
+
let(:scope) { Petroglyph::Scope.new(nil, {:drink => 'strawberry daikiri'}) }
|
96
100
|
|
97
101
|
before(:each) do
|
98
102
|
scope.instance_eval do
|
99
|
-
node :
|
103
|
+
node :beverage => drink
|
100
104
|
end
|
101
105
|
end
|
102
106
|
|
103
|
-
it
|
104
|
-
scope.value.should eq({:
|
107
|
+
it 'resolves values' do
|
108
|
+
scope.value.should eq({:beverage => 'strawberry daikiri'})
|
105
109
|
end
|
106
110
|
|
107
|
-
it
|
108
|
-
scope.respond_to?(:
|
111
|
+
it 'responds to existing locals' do
|
112
|
+
scope.respond_to?(:drink).should == true
|
109
113
|
end
|
110
114
|
|
111
115
|
it "doesn't respond to missing locals" do
|
112
116
|
scope.respond_to?(:not_a_thing).should == false
|
113
117
|
end
|
114
118
|
|
115
|
-
it "doesn't clobber :respond_to?" do
|
119
|
+
it "doesn't clobber :respond_to? for existing methods" do
|
116
120
|
scope.respond_to?(:value).should == true
|
117
121
|
end
|
118
122
|
end
|
119
123
|
|
120
|
-
describe
|
121
|
-
it
|
124
|
+
describe 'within a context' do
|
125
|
+
it 'has access to methods' do
|
122
126
|
context = Object.new
|
123
|
-
def context.
|
124
|
-
'
|
127
|
+
def context.drink
|
128
|
+
'tisane'
|
125
129
|
end
|
126
130
|
|
127
131
|
scope = Petroglyph::Scope.new(context)
|
128
132
|
scope.instance_eval do
|
129
|
-
node :
|
133
|
+
node :beverage => drink
|
130
134
|
end
|
131
|
-
scope.value.should eq({:
|
135
|
+
scope.value.should eq({:beverage => 'tisane'})
|
132
136
|
end
|
133
137
|
|
134
|
-
it
|
138
|
+
it 'lets local variables take precedence over methods' do
|
135
139
|
context = Object.new
|
136
|
-
def context.
|
137
|
-
'
|
140
|
+
def context.drink
|
141
|
+
'coffee'
|
138
142
|
end
|
139
143
|
|
140
|
-
scope = Petroglyph::Scope.new(context, {:
|
144
|
+
scope = Petroglyph::Scope.new(context, {:drink => 'rooiboos tea'})
|
141
145
|
scope.instance_eval do
|
142
|
-
node :
|
146
|
+
node :beverage => drink
|
143
147
|
end
|
144
|
-
scope.value.should eq({:
|
148
|
+
scope.value.should eq({:beverage => 'rooiboos tea'})
|
145
149
|
end
|
146
150
|
end
|
147
151
|
|
148
|
-
describe
|
149
|
-
it
|
150
|
-
|
152
|
+
describe 'attributes' do
|
153
|
+
it 'evaluates on an object' do
|
154
|
+
drink = OpenStruct.new(:name => "Grandma's Herb Garden", :temperature => 'luke warm', :origin => 'the garden')
|
151
155
|
|
152
156
|
scope = Petroglyph::Scope.new
|
153
|
-
scope.node :
|
154
|
-
attributes :name, :
|
157
|
+
scope.node :beverage => drink do
|
158
|
+
attributes :name, :temperature
|
155
159
|
end
|
156
160
|
|
157
|
-
scope.value.should eq({:
|
161
|
+
scope.value.should eq({:beverage => {:name => "Grandma's Herb Garden", :temperature => 'luke warm'}})
|
158
162
|
end
|
159
163
|
|
160
|
-
it
|
161
|
-
|
164
|
+
it 'evaluates on a hash' do
|
165
|
+
drink = {:name => 'darjeeling', :temperature => 'piping hot', :origin => 'the store'}
|
162
166
|
|
163
167
|
scope = Petroglyph::Scope.new
|
164
|
-
scope.node :
|
165
|
-
attributes :name, :
|
168
|
+
scope.node :beverage => drink do
|
169
|
+
attributes :name, :temperature
|
166
170
|
end
|
167
171
|
|
168
|
-
scope.value.should eq({:
|
172
|
+
scope.value.should eq({:beverage => {:name => 'darjeeling', :temperature => 'piping hot'}})
|
169
173
|
end
|
170
174
|
end
|
171
175
|
|
172
|
-
context
|
176
|
+
context 'with a collection' do
|
173
177
|
let(:tea) { OpenStruct.new(:type => 'tea', :temperature => 'hot') }
|
174
|
-
let(:coffee) { OpenStruct.new(:type => 'coffee', :temperature => '
|
178
|
+
let(:coffee) { OpenStruct.new(:type => 'coffee', :temperature => 'warm') }
|
175
179
|
let(:drinks) { [tea, coffee] }
|
176
180
|
|
177
|
-
it
|
181
|
+
it 'evaluates attributes' do
|
178
182
|
scope = Petroglyph::Scope.new
|
179
|
-
scope.collection :
|
183
|
+
scope.collection :beverages => drinks do
|
180
184
|
attributes :type, :temperature
|
181
185
|
end
|
182
186
|
|
183
|
-
scope.value.should eq({:
|
187
|
+
scope.value.should eq({:beverages => [{:type => 'tea', :temperature => 'hot'}, {:type => 'coffee', :temperature => 'warm'}]})
|
184
188
|
end
|
185
189
|
|
186
|
-
it
|
190
|
+
it 'evaluates attributes on explicitly named items' do
|
187
191
|
scope = Petroglyph::Scope.new
|
188
|
-
scope.collection :
|
192
|
+
scope.collection :beverages => drinks do |drink|
|
189
193
|
node :drink do
|
190
194
|
node :type => drink.type
|
191
195
|
end
|
192
196
|
node :prep => "Make water #{drink.temperature}."
|
193
197
|
end
|
194
198
|
|
195
|
-
scope.value.should eq({:
|
199
|
+
scope.value.should eq({:beverages => [{:drink => {:type => 'tea'}, :prep => 'Make water hot.'}, {:drink => {:type => 'coffee'}, :prep => 'Make water warm.'}]})
|
196
200
|
end
|
197
201
|
|
198
|
-
it
|
202
|
+
it 'evaluates object attributes within a sub node' do
|
199
203
|
scope = Petroglyph::Scope.new
|
200
|
-
scope.collection :
|
204
|
+
scope.collection :beverages => drinks do |drink|
|
201
205
|
node :drink => drink do
|
202
206
|
attributes :type
|
203
207
|
end
|
204
|
-
node :prep => "
|
208
|
+
node :prep => "Water should be #{drink.temperature}."
|
205
209
|
end
|
206
210
|
|
207
|
-
scope.value.should eq({:
|
211
|
+
scope.value.should eq({:beverages => [{:drink => {:type => 'tea'}, :prep => 'Water should be hot.'}, {:drink => {:type => 'coffee'}, :prep => 'Water should be warm.'}]})
|
208
212
|
end
|
209
213
|
|
210
|
-
it
|
214
|
+
it 'evaluates an empty collection to an empty array' do
|
211
215
|
scope = Petroglyph::Scope.new
|
212
|
-
scope.collection :
|
216
|
+
scope.collection :beverages => [] do |drink|
|
213
217
|
node :drink => drink
|
214
218
|
end
|
215
219
|
|
216
|
-
scope.value.should eq({:
|
220
|
+
scope.value.should eq({:beverages => []})
|
217
221
|
end
|
218
222
|
end
|
219
223
|
|
220
|
-
context
|
221
|
-
it
|
224
|
+
context 'with partials' do
|
225
|
+
it 'renders a partial' do
|
222
226
|
Petroglyph.stub(:partial) { 'node :drink => "tea"' }
|
223
227
|
|
224
228
|
scope = Petroglyph::Scope.new
|
@@ -229,7 +233,7 @@ describe Petroglyph::Scope do
|
|
229
233
|
scope.value.should eq({:partial => {:drink => 'tea'}})
|
230
234
|
end
|
231
235
|
|
232
|
-
it
|
236
|
+
it 'renders a partial with local variables' do
|
233
237
|
Petroglyph.stub(:partial) { 'node :drink => drink' }
|
234
238
|
|
235
239
|
scope = Petroglyph::Scope.new
|
@@ -240,30 +244,32 @@ describe Petroglyph::Scope do
|
|
240
244
|
scope.value.should eq({:partial => {:drink => 'tea'}})
|
241
245
|
end
|
242
246
|
|
243
|
-
it
|
244
|
-
Petroglyph.stub(:partial) { 'node :
|
247
|
+
it 'defaults locals to match the name of the partial' do
|
248
|
+
Petroglyph.stub(:partial) { 'node :beverage => drink' }
|
245
249
|
|
246
250
|
scope = Petroglyph::Scope.new(nil, {:drink => 'coffee'})
|
247
|
-
scope.node :
|
251
|
+
scope.node :beverages do
|
248
252
|
partial :drink
|
249
253
|
end
|
250
254
|
|
251
|
-
scope.value.should eq({:
|
255
|
+
scope.value.should eq({:beverages => {:beverage => 'coffee'}})
|
252
256
|
end
|
253
257
|
|
254
|
-
it
|
258
|
+
it 'finds the partial' do
|
255
259
|
scope = Petroglyph::Scope.new
|
256
|
-
|
260
|
+
# Pretend that this node is defined in some_template
|
261
|
+
# so that we have a decent relative path for the partial.
|
262
|
+
scope.file = 'spec/fixtures/views/some_template.pg'
|
257
263
|
scope.node :partial do
|
258
|
-
partial :the_partial, :
|
264
|
+
partial :the_partial, :drink => 'mocha'
|
259
265
|
end
|
260
266
|
|
261
|
-
scope.value.should eq({:partial => {:
|
267
|
+
scope.value.should eq({:partial => {:beverage => 'mocha'}})
|
262
268
|
end
|
263
269
|
|
264
|
-
it
|
270
|
+
it 'finds the partial in a subdirectory' do
|
265
271
|
scope = Petroglyph::Scope.new
|
266
|
-
scope.file =
|
272
|
+
scope.file = 'spec/fixtures/views/some_template.pg'
|
267
273
|
scope.node :partial do
|
268
274
|
partial :sub_partial, :thing => 'stuff'
|
269
275
|
end
|
@@ -271,15 +277,15 @@ describe Petroglyph::Scope do
|
|
271
277
|
scope.value.should eq({:partial => {:thing => 'stuff'}})
|
272
278
|
end
|
273
279
|
|
274
|
-
it
|
280
|
+
it 'finds nested partials' do
|
275
281
|
scope = Petroglyph::Scope.new
|
276
|
-
scope.file =
|
282
|
+
scope.file = 'spec/fixtures/views/some_template.pg'
|
277
283
|
|
278
284
|
scope.node :partial do
|
279
285
|
partial :nested_partial
|
280
286
|
end
|
281
287
|
|
282
|
-
scope.value.should eq({:partial => {:
|
288
|
+
scope.value.should eq({:partial => {:beverage => 'stuff'}})
|
283
289
|
end
|
284
290
|
end
|
285
291
|
end
|
@@ -30,10 +30,7 @@ describe "Sinatra integration" do
|
|
30
30
|
last_response.body.should eq '{"drinks":[{"type":"tea","temperature":"hot"},{"type":"coffee","temperature":"lukewarm"}]}'
|
31
31
|
end
|
32
32
|
|
33
|
-
it "
|
34
|
-
# look at /views/fixtures/post.pg
|
35
|
-
# and line 18 of this file
|
36
|
-
pending "right now if you refer to a local var 'post' in the template, you will accidentally call sinatra's post method"
|
33
|
+
it "doesn't get overshadowed by controller methods (issue #5)" do
|
37
34
|
post '/'
|
38
35
|
last_response.body.should eq "{\"post\":\"a post\"}"
|
39
36
|
end
|
data/spec/tilt_spec.rb
CHANGED
@@ -32,7 +32,7 @@ describe "Tilt integration" do
|
|
32
32
|
context "with partials" do
|
33
33
|
it "loads the partial" do
|
34
34
|
template = Tilt::PetroglyphTemplate.new('spec/fixtures/views/with_partial.pg')
|
35
|
-
template.render.should eq('{"root":{"
|
35
|
+
template.render.should eq('{"root":{"beverage":"stuff"}}')
|
36
36
|
end
|
37
37
|
|
38
38
|
it "loads the partial from a subdirectory" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: petroglyph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: tilt
|
16
|
-
requirement: &
|
16
|
+
requirement: &70296704591240 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70296704591240
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70296704590820 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,21 +32,21 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70296704590820
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: sinatra
|
38
|
-
requirement: &
|
38
|
+
requirement: &70296704590320 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: '
|
43
|
+
version: '1.3'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70296704590320
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rack-test
|
49
|
-
requirement: &
|
49
|
+
requirement: &70296704589900 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70296704589900
|
58
58
|
description: A simple, terse, and unsurprising ruby dsl to create json views.
|
59
59
|
email:
|
60
60
|
- katrina.owen@gmail.com
|
@@ -65,6 +65,7 @@ files:
|
|
65
65
|
- .gitignore
|
66
66
|
- .rspec
|
67
67
|
- .simplecov
|
68
|
+
- .travis.yml
|
68
69
|
- Gemfile
|
69
70
|
- README.md
|
70
71
|
- Rakefile
|
@@ -118,3 +119,4 @@ signing_key:
|
|
118
119
|
specification_version: 3
|
119
120
|
summary: A simple, terse, and unsurprising ruby dsl to create json views.
|
120
121
|
test_files: []
|
122
|
+
has_rdoc:
|