petroglyph 0.0.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.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ coverage
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --format documentation
data/.simplecov ADDED
@@ -0,0 +1,2 @@
1
+ SimpleCov.add_filter 'spec'
2
+ SimpleCov.start
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in petroglyph.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,95 @@
1
+ # Petroglyph
2
+
3
+ A simple, terse, and unsurprising ruby dsl to create json views.
4
+
5
+ ## Usage
6
+
7
+ Add a node with a simple value:
8
+
9
+ node :beverage => current_user.favorite_drink
10
+ => '{"beverage":"mead"}'
11
+
12
+ Add a node with nested content:
13
+
14
+ node :home do
15
+ merge {:location => {:city => 'Paris', :country => 'France'}}
16
+ end
17
+ => '{"home":{"location":{"city":"Paris","country":"France"}}}'
18
+
19
+ Add sibling nodes within a node:
20
+
21
+ node :pet do
22
+ merge {:species => "turtle", :color => 'green'}
23
+ node :name => "Anthony"
24
+ end
25
+ => '{"pet":{"species":"turtle","color":"green","name":"Anthony"}}'
26
+
27
+ It's all just ruby, unsurprisingly:
28
+
29
+ node :pet do
30
+ if user.child?
31
+ merge {:species => "turtle"}
32
+ node :name => "Anthony"
33
+ else
34
+ node :species => 'human'
35
+ node :name => 'Billy'
36
+ end
37
+ end
38
+ => '{"pet":{"species":"turtle","name":"Anthony"}}'
39
+
40
+ Conveniently define which attributes to include. Create a new node with a different name for attributes you wish to alias.
41
+
42
+ alice = Person.create!(:name => 'Alice', :profession => 'surgeon', :created_at => 28.years.ago, :gender => 'female')
43
+
44
+ node :person => alice do
45
+ attributes :name, :gender
46
+ node :job => alice.profession
47
+ end
48
+ => '{"person":{"name":"Alice","gender":"female","job":"surgeon"}}'
49
+
50
+ Iterate through collections:
51
+
52
+ wulong = Tea.new(:type => 'wulong')
53
+ lucha = Tea.new(:type => 'green')
54
+
55
+ collection :teas => [wulong, lucha] do
56
+ attributes :type
57
+ end
58
+ => '{"teas":[{"type":"wulong"},{"type":"wulong"}]}'
59
+
60
+
61
+ You can also explicitly reference each item in the collection if you need to:
62
+
63
+ collection :teas => teas do |tea|
64
+ node :tea => tea do
65
+ attributes :type
66
+ end
67
+ node :provider => lookup_provider_for(tea)
68
+ end
69
+ => '{"teas":[{"tea":{"type":"wulong"},{"provider":"Imperial Teas"}},{"tea":{"type":"wulong"},{"provider":"House of Tea"}}]}'
70
+
71
+ Partials have been implemented. This defaults to looking for a file in the same file as the template, or in a subdirectory called `partials`.
72
+
73
+ This can be overridden by re-implementing the `Petroglyph.partial(name)` method.
74
+
75
+ collection :teas => teas do |tea|
76
+ # partial(template_name, local_variables)
77
+ partial :tea, :tea => tea
78
+ end
79
+
80
+ ## Caveat
81
+
82
+ We've removed support for using instance variables (from the controller) in the template, as this was hacky and not optimal.
83
+
84
+ ## Related Projects
85
+
86
+ Other json templating libraries exist, some of which also generate XML.
87
+
88
+ * [Rabl](https://github.com/nesquena/rabl)
89
+ * [Tequila](https://github.com/inem/tequila)
90
+ * [Argonaut](https://github.com/jbr/argonaut)
91
+ * [JSON Builder](https://github.com/dewski/json_builder)
92
+ * [JBuilder](https://github.com/rails/jbuilder)
93
+ * [Jsonify](https://github.com/bsiggelkow/jsonify)
94
+ * [Representative](https://github.com/mdub/representative)
95
+ * [Tokamak](https://github.com/abril/tokamak)
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,18 @@
1
+ module Petroglyph
2
+ class Engine
3
+
4
+ def initialize(data = nil)
5
+ @data = data
6
+ end
7
+
8
+ def render(context = Object.new, locals = {}, file = nil, &block)
9
+ scope = Scope.new(context, locals, file)
10
+ if @data
11
+ scope.instance_eval(@data)
12
+ else
13
+ scope.instance_eval(&block)
14
+ end
15
+ scope.value.to_json
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,94 @@
1
+ module Petroglyph
2
+ class Scope
3
+ attr_accessor :value, :object, :file
4
+
5
+ def initialize(context = nil, locals = {}, template_filename = nil, parent_scope = nil)
6
+ @file = template_filename
7
+ @context = context
8
+ @locals = locals
9
+ @parent_scope = parent_scope
10
+ @value = nil
11
+ end
12
+
13
+ def sub_scope(object = nil)
14
+ scope = Scope.new(@context, @locals, @file, self)
15
+ scope.object = object
16
+ scope
17
+ end
18
+
19
+ def node(input, &block)
20
+ @value ||= {}
21
+ scope = nil
22
+ name = nil
23
+ value = nil
24
+ if input.is_a?(Hash)
25
+ raise ArgumentError, "node can't deal with more than one key at a time" if input.keys.size > 1
26
+ name = input.keys.first
27
+ value = input.values.first
28
+ else
29
+ name = input
30
+ end
31
+
32
+ if block_given?
33
+ scope = sub_scope(value)
34
+ scope.instance_eval(&block)
35
+ @value[name] = scope.value if scope.value
36
+ else
37
+ @value[name] = value
38
+ end
39
+ end
40
+
41
+ def collection(input, &block)
42
+ @value ||= {}
43
+ name = input.keys.first
44
+ items = input.values.first
45
+ results = []
46
+ items.each do |item|
47
+ scope = sub_scope(item)
48
+ scope.instance_exec(item, &block)
49
+ results << scope.value
50
+ end
51
+ @value[name] = results
52
+ end
53
+
54
+ def merge(hash, &block)
55
+ @value ||= {}
56
+ if block_given?
57
+ scope = sub_scope(hash)
58
+ scope.instance_eval(&block)
59
+ hash = scope.value
60
+ end
61
+ @value.merge!(hash)
62
+ end
63
+
64
+ def attributes(*args)
65
+ fragment = {}
66
+ args.each do |method|
67
+ if @object.respond_to?(method)
68
+ fragment[method] = @object.send(method)
69
+ else
70
+ fragment[method] = @object[method]
71
+ end
72
+ end
73
+ merge fragment
74
+ end
75
+
76
+ def partial(name, locals = {})
77
+ data = Petroglyph.partial(name, file)
78
+ scope = Scope.new(@context, locals)
79
+ scope.instance_eval(data)
80
+ merge scope.value
81
+ end
82
+
83
+ def method_missing(method, *args, &block)
84
+ if @locals.has_key?(method)
85
+ @locals[method]
86
+ elsif @context.respond_to?(method)
87
+ @context.send(method)
88
+ else
89
+ super
90
+ end
91
+ end
92
+
93
+ end
94
+ end
@@ -0,0 +1,3 @@
1
+ module Petroglyph
2
+ VERSION = "0.0.1"
3
+ end
data/lib/petroglyph.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'json'
2
+
3
+ require 'petroglyph/scope'
4
+ require 'petroglyph/engine'
5
+
6
+ module Petroglyph
7
+ class << self
8
+ def partial(filename, template_filename)
9
+ basedir = File.dirname(template_filename)
10
+ [basedir, "#{basedir}/partials"].each do |dir|
11
+ path = File.join(dir, "#{filename}.pg")
12
+ return File.read(path) if File.exist?(path)
13
+ end
14
+ raise Exception.new("Could not find partial #{filename}")
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ require 'tilt/petroglyph'
2
+
3
+ if defined?(Sinatra)
4
+ module Sinatra::Templates
5
+ def pg(template, options={}, locals={})
6
+ render :pg, template, options, locals
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ # Makes Petroglyph available through Tilt.
2
+ # Also contains a utility function that will
3
+ # be added to Sinatra if Sinatra is defined.
4
+
5
+ require 'tilt'
6
+ require 'petroglyph'
7
+
8
+ module Tilt
9
+ class PetroglyphTemplate < Template
10
+ self.default_mime_type = "application/json"
11
+ def initialize_engine
12
+ return if defined? ::Petroglyph
13
+ require_template_library 'petroglyph'
14
+ end
15
+
16
+ def prepare; end
17
+
18
+ def precompiled_template(locals)
19
+ data.to_str
20
+ end
21
+
22
+ def evaluate(scope = Object.new, locals = {}, &block)
23
+ Petroglyph::Engine.new(data).render(scope, locals, file, &block)
24
+ end
25
+ end
26
+ register PetroglyphTemplate, 'pg'
27
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "petroglyph/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "petroglyph"
7
+ s.version = Petroglyph::VERSION
8
+ s.authors = ["Katrina Owen"]
9
+ s.email = ["katrina.owen@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{A simple, terse, and unsurprising ruby dsl to create json views.}
12
+ s.description = %q{A simple, terse, and unsurprising ruby dsl to create json views.}
13
+
14
+ s.rubyforge_project = "petroglyph"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {spec}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_runtime_dependency "tilt"
22
+ s.add_development_dependency "rspec"
23
+ s.add_development_dependency "sinatra"
24
+ s.add_development_dependency "rack-test"
25
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Petroglyph::Engine do
4
+ it "takes a template" do
5
+ engine = Petroglyph::Engine.new('node :whatever => "nevermind"')
6
+ engine.render.should eq({:whatever => "nevermind"}.to_json)
7
+ end
8
+
9
+ it "takes a block" do
10
+ Petroglyph::Engine.new.render do
11
+ node :whatever => "nevermind"
12
+ end.should eq({:whatever => "nevermind"}.to_json)
13
+ end
14
+
15
+ it "passes the locals" do
16
+ engine = Petroglyph::Engine.new('node :whatever => thing')
17
+ engine.render(nil, {:thing => 'stuff'}).should eq({:whatever => 'stuff'}.to_json)
18
+ end
19
+ end
@@ -0,0 +1 @@
1
+ node :price => price
@@ -0,0 +1,3 @@
1
+ collection :drinks => drinks do |drink|
2
+ attributes :type, :temperature
3
+ end
@@ -0,0 +1 @@
1
+ node :thing => thing
@@ -0,0 +1 @@
1
+ node :post => post
@@ -0,0 +1,3 @@
1
+ node :syntax do
2
+ node :it => "works"
3
+ end
@@ -0,0 +1 @@
1
+ node :thing => thing
@@ -0,0 +1,3 @@
1
+ node :root do
2
+ partial :the_partial, :thing => 'stuff'
3
+ end
@@ -0,0 +1,3 @@
1
+ node :root do
2
+ partial :sub_partial, :thing => 'stuff'
3
+ end
@@ -0,0 +1,250 @@
1
+ require 'spec_helper'
2
+
3
+ describe Petroglyph::Scope do
4
+
5
+ it "takes a simple string value" do
6
+ scope = Petroglyph::Scope.new
7
+ scope.node :whatever => "nevermind"
8
+ scope.value.should eq(:whatever => "nevermind")
9
+ end
10
+
11
+ it "merges in a hash" do
12
+ tea = {:tea => {:temperature => 'hot', :type => 'wulong'}}
13
+
14
+ scope = Petroglyph::Scope.new
15
+ scope.merge tea
16
+ scope.value.should eq({:tea => {:temperature => "hot", :type => 'wulong'}})
17
+ end
18
+
19
+ it "merges within a block" do
20
+ scope = Petroglyph::Scope.new
21
+ scope.node :whatever do
22
+ merge(:stuff => {:no => :way})
23
+ end
24
+
25
+ scope.value.should eq({:whatever => {:stuff => {:no => :way}}})
26
+ end
27
+
28
+ it "lets you process what you merge in a block" do
29
+ scope = Petroglyph::Scope.new
30
+ scope.node :whatever do
31
+ merge(10) do
32
+ attributes :to_s
33
+ end
34
+ end
35
+
36
+ scope.value.should eq({:whatever => {:to_s => '10'}})
37
+ end
38
+
39
+ it "handles sibling nodes" do
40
+ scope = Petroglyph::Scope.new
41
+ scope.node :whatever => "nevermind"
42
+ scope.node :stuff => "awesome"
43
+
44
+ scope.value.should eq({:whatever => "nevermind", :stuff => "awesome"})
45
+ end
46
+
47
+ it "handles sibling nodes as blocks" do
48
+ scope = Petroglyph::Scope.new
49
+ scope.node :whatever => "nevermind"
50
+ scope.node :stuff do
51
+ merge(:too => :cool)
52
+ end
53
+
54
+ scope.value.should eq({:whatever => "nevermind", :stuff => {:too => :cool}})
55
+ end
56
+
57
+ it "nests nodes" do
58
+ scope = Petroglyph::Scope.new
59
+ scope.node :whatever do
60
+ node :stuff => "awesome"
61
+ end
62
+
63
+ scope.value.should eq({:whatever => {:stuff => 'awesome'}})
64
+ end
65
+
66
+ it "nests stuff arbitrarily deeply with complex values" do
67
+ scope = Petroglyph::Scope.new
68
+ scope.node :drink do
69
+ node :tea do
70
+ node :temperature do
71
+ merge(:really => :hot)
72
+ end
73
+ end
74
+ end
75
+
76
+ scope.value.should eq({:drink => {:tea => {:temperature => {:really => :hot}}}})
77
+ end
78
+
79
+ it "uses regular ruby" do
80
+ scope = Petroglyph::Scope.new
81
+ scope.node :drink do
82
+ if false
83
+ "cold"
84
+ else
85
+ node(:tea) do
86
+ merge(:temperature => "hot".upcase)
87
+ end
88
+ end
89
+ end
90
+
91
+ scope.value.should eq({:drink => {:tea => {:temperature => "HOT"}}})
92
+ end
93
+
94
+ context "with locals" do
95
+ it "resolves values" do
96
+ scope = Petroglyph::Scope.new(nil, {:thing => 'stuff'})
97
+
98
+ scope.instance_eval do
99
+ node :thing => thing
100
+ end
101
+
102
+ scope.value.should eq({:thing => 'stuff'})
103
+ end
104
+ end
105
+
106
+ describe "within a context" do
107
+ it "has access to methods" do
108
+ context = Object.new
109
+ def context.thing
110
+ 'stuff'
111
+ end
112
+
113
+ scope = Petroglyph::Scope.new(context)
114
+ scope.instance_eval do
115
+ node :thing => thing
116
+ end
117
+ scope.value.should eq({:thing => 'stuff'})
118
+ end
119
+
120
+ it "lets local variables take precedence over methods" do
121
+ context = Object.new
122
+ def context.thing
123
+ 'junk'
124
+ end
125
+
126
+ scope = Petroglyph::Scope.new(context, {:thing => 'stuff'})
127
+ scope.instance_eval do
128
+ node :thing => thing
129
+ end
130
+ scope.value.should eq({:thing => 'stuff'})
131
+ end
132
+ end
133
+
134
+ describe "attributes" do
135
+ it "evaluates on an object" do
136
+ hal = OpenStruct.new(:name => 'HAL 9000', :temperament => 'psychotic', :garbage => 'junk')
137
+
138
+ scope = Petroglyph::Scope.new
139
+ scope.node :hal => hal do
140
+ attributes :name, :temperament
141
+ end
142
+
143
+ scope.value.should eq({:hal => {:name => 'HAL 9000', :temperament => 'psychotic'}})
144
+ end
145
+
146
+ it "evaluates on a hash" do
147
+ hal = {:name => 'HAL 9000', :temperament => 'psychotic', :garbage => 'junk'}
148
+
149
+ scope = Petroglyph::Scope.new
150
+ scope.node :hal => hal do
151
+ attributes :name, :temperament
152
+ end
153
+
154
+ scope.value.should eq({:hal => {:name => 'HAL 9000', :temperament => 'psychotic'}})
155
+ end
156
+ end
157
+
158
+ context "with a collection" do
159
+ let(:tea) { OpenStruct.new(:type => 'tea', :temperature => 'hot') }
160
+ let(:coffee) { OpenStruct.new(:type => 'coffee', :temperature => 'lukewarm') }
161
+ let(:drinks) { [tea, coffee] }
162
+
163
+ it "evaluates attributes" do
164
+ scope = Petroglyph::Scope.new
165
+ scope.collection :drinks => drinks do
166
+ attributes :type, :temperature
167
+ end
168
+
169
+ scope.value.should eq({:drinks => [{:type => 'tea', :temperature => 'hot'}, {:type => 'coffee', :temperature => 'lukewarm'}]})
170
+ end
171
+
172
+ it "evaluates attributes on explicitly named items" do
173
+ scope = Petroglyph::Scope.new
174
+ scope.collection :drinks => drinks do |drink|
175
+ node :drink do
176
+ node :type => drink.type
177
+ end
178
+ node :prep => "Make water #{drink.temperature}."
179
+ end
180
+
181
+ scope.value.should eq({:drinks => [{:drink => {:type => 'tea'}, :prep => "Make water hot."}, {:drink => {:type => 'coffee'}, :prep => "Make water lukewarm."}]})
182
+ end
183
+
184
+ it "evaluates object attributes within a sub node" do
185
+ scope = Petroglyph::Scope.new
186
+ scope.collection :drinks => drinks do |drink|
187
+ node :drink => drink do
188
+ attributes :type
189
+ end
190
+ node :prep => "Make water #{drink.temperature}."
191
+ end
192
+
193
+ scope.value.should eq({:drinks => [{:drink => {:type => 'tea'}, :prep => "Make water hot."}, {:drink => {:type => 'coffee'}, :prep => "Make water lukewarm."}]})
194
+ end
195
+
196
+ it "evaluates an empty collection to an empty array" do
197
+ scope = Petroglyph::Scope.new
198
+ scope.collection :drinks => [] do |drink|
199
+ node :drink => drink
200
+ end
201
+
202
+ scope.value.should eq({:drinks => []})
203
+ end
204
+ end
205
+
206
+ context "with partials" do
207
+ it "renders a partial" do
208
+ Petroglyph.stub(:partial) { 'node :drink => "tea"' }
209
+
210
+ scope = Petroglyph::Scope.new
211
+ scope.node :partial do
212
+ partial :the_partial
213
+ end
214
+
215
+ scope.value.should eq({:partial => {:drink => 'tea'}})
216
+ end
217
+
218
+ it "renders a partial with local variables" do
219
+ Petroglyph.stub(:partial) { 'node :drink => drink' }
220
+
221
+ scope = Petroglyph::Scope.new
222
+ scope.node :partial do
223
+ partial :the_partial, :drink => 'tea'
224
+ end
225
+
226
+ scope.value.should eq({:partial => {:drink => 'tea'}})
227
+ end
228
+
229
+ it "finds the partial" do
230
+ scope = Petroglyph::Scope.new
231
+ scope.file = "spec/fixtures/views/some_template.pg"
232
+ scope.node :partial do
233
+ partial :the_partial, :thing => 'stuff'
234
+ end
235
+
236
+ scope.value.should eq({:partial => {:thing => 'stuff'}})
237
+ end
238
+
239
+ it "finds the partial in a subdirectory" do
240
+ scope = Petroglyph::Scope.new
241
+ scope.file = "spec/fixtures/views/some_template.pg"
242
+ scope.node :partial do
243
+ partial :sub_partial, :thing => 'stuff'
244
+ end
245
+
246
+ scope.value.should eq({:partial => {:thing => 'stuff'}})
247
+ end
248
+
249
+ end
250
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+ require 'sinatra'
3
+ require 'sinatra/petroglyph'
4
+ require 'rack/test'
5
+
6
+ class PetroglyphApp < Sinatra::Base
7
+ set :root, File.dirname(__FILE__)+"/fixtures"
8
+ set :show_exceptions, false
9
+
10
+ get "/" do
11
+ tea = OpenStruct.new(:type => 'tea', :temperature => 'hot')
12
+ coffee = OpenStruct.new(:type => 'coffee', :temperature => 'lukewarm')
13
+ pg :index, :locals => {:drinks => [tea, coffee]}
14
+ end
15
+
16
+ post '/' do
17
+ pg :post, :locals => {:post => 'a post'}
18
+ end
19
+ end
20
+
21
+ describe "Sinatra integration" do
22
+ include Rack::Test::Methods
23
+
24
+ def app
25
+ PetroglyphApp
26
+ end
27
+
28
+ it "works" do
29
+ get "/"
30
+ last_response.body.should eq '{"drinks":[{"type":"tea","temperature":"hot"},{"type":"coffee","temperature":"lukewarm"}]}'
31
+ end
32
+
33
+ xit "doesn't freak out on the HTTP method" do
34
+ post '/'
35
+ last_response.body.should eq '{}'
36
+ end
37
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+ begin
3
+ require 'simplecov'
4
+ rescue LoadError => e
5
+ # ignore code coverage
6
+ end
7
+
8
+ require 'ostruct'
9
+ require 'petroglyph'
data/spec/tilt_spec.rb ADDED
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+ require 'tilt/petroglyph'
3
+
4
+ describe "Tilt integration" do
5
+ it "registers .pg as a petroglyph template" do
6
+ Tilt.mappings['pg'].should include(Tilt::PetroglyphTemplate)
7
+ end
8
+
9
+ it "renders from a file" do
10
+ template = Tilt::PetroglyphTemplate.new('spec/fixtures/views/syntax.pg')
11
+ template.render.should eq('{"syntax":{"it":"works"}}')
12
+ end
13
+
14
+ it "renders from a block" do
15
+ template = Tilt::PetroglyphTemplate.new { |t| 'node :hello => "world"' }
16
+ template.render.should eq("{\"hello\":\"world\"}")
17
+ end
18
+
19
+ it "can be rendered more than once" do
20
+ template = Tilt::PetroglyphTemplate.new { |t| 'node :hello => "world"' }
21
+
22
+ 3.times do
23
+ template.render.should eq("{\"hello\":\"world\"}")
24
+ end
25
+ end
26
+
27
+ it "takes local variables" do
28
+ template = Tilt::PetroglyphTemplate.new { |t| 'node :hello => place' }
29
+ template.render(Object.new, :place => 'world').should eq("{\"hello\":\"world\"}")
30
+ end
31
+
32
+ context "with partials" do
33
+ it "loads the partial" do
34
+ template = Tilt::PetroglyphTemplate.new('spec/fixtures/views/with_partial.pg')
35
+ template.render.should eq('{"root":{"thing":"stuff"}}')
36
+ end
37
+
38
+ it "loads the partial from a subdirectory" do
39
+ template = Tilt::PetroglyphTemplate.new('spec/fixtures/views/with_sub_partial.pg')
40
+ template.render.should eq('{"root":{"thing":"stuff"}}')
41
+ end
42
+
43
+ end
44
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: petroglyph
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Katrina Owen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-12-20 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: tilt
16
+ requirement: &2161013440 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2161013440
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &2161013020 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2161013020
36
+ - !ruby/object:Gem::Dependency
37
+ name: sinatra
38
+ requirement: &2161012600 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *2161012600
47
+ - !ruby/object:Gem::Dependency
48
+ name: rack-test
49
+ requirement: &2161012180 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *2161012180
58
+ description: A simple, terse, and unsurprising ruby dsl to create json views.
59
+ email:
60
+ - katrina.owen@gmail.com
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - .gitignore
66
+ - .rspec
67
+ - .simplecov
68
+ - Gemfile
69
+ - README.md
70
+ - Rakefile
71
+ - lib/petroglyph.rb
72
+ - lib/petroglyph/engine.rb
73
+ - lib/petroglyph/scope.rb
74
+ - lib/petroglyph/version.rb
75
+ - lib/sinatra/petroglyph.rb
76
+ - lib/tilt/petroglyph.rb
77
+ - petroglyph.gemspec
78
+ - spec/engine_spec.rb
79
+ - spec/fixtures/views/helper.pg
80
+ - spec/fixtures/views/index.pg
81
+ - spec/fixtures/views/partials/sub_partial.pg
82
+ - spec/fixtures/views/post.pg
83
+ - spec/fixtures/views/syntax.pg
84
+ - spec/fixtures/views/the_partial.pg
85
+ - spec/fixtures/views/with_partial.pg
86
+ - spec/fixtures/views/with_sub_partial.pg
87
+ - spec/scope_spec.rb
88
+ - spec/sinatra_integration_spec.rb
89
+ - spec/spec_helper.rb
90
+ - spec/tilt_spec.rb
91
+ homepage: ''
92
+ licenses: []
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project: petroglyph
111
+ rubygems_version: 1.8.10
112
+ signing_key:
113
+ specification_version: 3
114
+ summary: A simple, terse, and unsurprising ruby dsl to create json views.
115
+ test_files: []