petroglyph 0.0.6 → 0.0.7

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/.rspec CHANGED
@@ -1 +1 @@
1
- --color --format documentation
1
+ --color
data/.travis.yml CHANGED
@@ -2,6 +2,7 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.2
4
4
  - 1.9.3
5
+ - 2.0.0
5
6
  - rbx-19mode
6
7
 
7
8
  script: rspec spec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Katrina Owen
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -50,6 +50,14 @@ Conveniently define which attributes to include. Create a new node with a differ
50
50
  end
51
51
  => '{"person":{"name":"Alice","gender":"female","job":"surgeon"}}'
52
52
 
53
+ If you don't want to namespace the object, you can use `merge` in place of `node`:
54
+
55
+ merge alice do
56
+ attributes :name, :gender
57
+ node :job => alice.profession
58
+ end
59
+ => '{"name":"Alice","gender":"female","job":"surgeon"}'
60
+
53
61
  Iterate through collections:
54
62
 
55
63
  wulong = Tea.new(:type => 'wulong')
@@ -73,7 +81,11 @@ You can also explicitly reference each item in the collection if you need to:
73
81
 
74
82
  Partials have been implemented. This defaults to looking for a file in the same file as the template, or in a subdirectory called `partials`.
75
83
 
76
- This can be overridden by re-implementing the `Petroglyph.partial(name)` method.
84
+ There is a shortcut if you're looping over a collection to render a partial for each item in the collection:
85
+
86
+ collection :teas => teas, :partial => :tea
87
+
88
+ The name of the partials subdirectory can be overridden by re-implementing the `Petroglyph.partial(name)` method.
77
89
 
78
90
  collection :teas => teas do |tea|
79
91
  # partial(template_name, local_variables)
@@ -92,6 +104,24 @@ Support for partials is non-standard at this time: create a subdirectory in the
92
104
 
93
105
  This works with version 1.3 of Sinatra. It may work with earlier versions.
94
106
 
107
+ ### Config
108
+
109
+ You need to require the Sinatra petroglyph extension:
110
+
111
+ ```ruby
112
+ require 'sinatra/petroglyph'
113
+ ```
114
+
115
+ Then you can use the `pg` helper method in your endpoints:
116
+
117
+ ```ruby
118
+ get '/api/v1/widgets' do
119
+ pg :widgets, :locals => {:widgets => Widget.all}
120
+ end
121
+ ```
122
+
123
+ ### Gotcha
124
+
95
125
  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
126
  The same goes for `get`, `head`, `put`, etc, but these are less likely to be resources in your application.
97
127
 
@@ -112,3 +142,10 @@ Other json templating libraries exist, some of which also generate XML.
112
142
  * [Jsonify](https://github.com/bsiggelkow/jsonify)
113
143
  * [Representative](https://github.com/mdub/representative)
114
144
  * [Tokamak](https://github.com/abril/tokamak)
145
+
146
+ ## License
147
+
148
+ MIT License
149
+
150
+ Copyright (c) 2012 Katrina Owen
151
+
data/Rakefile CHANGED
@@ -1 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
data/lib/petroglyph.rb CHANGED
@@ -6,13 +6,20 @@ require 'petroglyph/engine'
6
6
  module Petroglyph
7
7
  class << self
8
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)
9
+ paths(filename, template_filename).each do |path|
10
+ if File.exist?(path)
11
+ return eval "Proc.new{#{File.read(path)}}"
12
+ end
13
13
  end
14
14
  raise Exception.new("Could not find partial #{filename}")
15
15
  end
16
+
17
+ def paths(filename, template_filename)
18
+ basedir = File.dirname(template_filename)
19
+ [basedir, "#{basedir}/partials"].map do |dir|
20
+ File.join(dir, "#{filename}.pg")
21
+ end
22
+ end
16
23
  end
17
24
  end
18
25
 
@@ -39,10 +39,15 @@ module Petroglyph
39
39
  end
40
40
  end
41
41
 
42
- def collection(input, &block)
42
+ def collection(args, &block)
43
43
  @value ||= {}
44
- name = input.keys.first
45
- items = input.values.first
44
+ name, items = args.first
45
+
46
+ if args.length == 2
47
+ singular = args[:partial]
48
+ block = eval "Proc.new{|item| partial #{singular.inspect}, #{singular.inspect} => item}"
49
+ end
50
+
46
51
  results = []
47
52
  items.each do |item|
48
53
  scope = sub_scope(item)
@@ -77,9 +82,9 @@ module Petroglyph
77
82
  def partial(name, locals = nil)
78
83
  locals ||= {name => send(name)} if respond_to?(name)
79
84
  locals ||= {}
80
- data = Petroglyph.partial(name, file)
85
+ partial = Petroglyph.partial(name, file)
81
86
  scope = Scope.new(@context, locals, file)
82
- scope.instance_eval(data.to_s)
87
+ scope.instance_eval(&partial)
83
88
  merge scope.value
84
89
  end
85
90
 
@@ -1,3 +1,3 @@
1
1
  module Petroglyph
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -1,7 +1,4 @@
1
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
2
  require 'tilt'
6
3
  require 'petroglyph'
7
4
 
@@ -13,14 +10,16 @@ module Tilt
13
10
  require_template_library 'petroglyph'
14
11
  end
15
12
 
16
- def prepare; end
13
+ def prepare
14
+ @engine = Petroglyph::Engine.new(data)
15
+ end
17
16
 
18
17
  def precompiled_template(locals)
19
18
  data.to_str
20
19
  end
21
20
 
22
21
  def evaluate(scope = Object.new, locals = {}, &block)
23
- Petroglyph::Engine.new(data).render(scope, locals, file, &block)
22
+ @engine.render(scope, locals, file, &block)
24
23
  end
25
24
  end
26
25
  register PetroglyphTemplate, 'pg'
data/spec/scope_spec.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
+ def fake_partial(s)
4
+ eval "Proc.new{#{s}}"
5
+ end
6
+
3
7
  describe Petroglyph::Scope do
4
8
 
5
9
  it 'takes a simple string value' do
@@ -219,11 +223,20 @@ describe Petroglyph::Scope do
219
223
 
220
224
  scope.value.should eq({:beverages => []})
221
225
  end
226
+
227
+ it 'has a convenience handler' do
228
+ Petroglyph.stub(:partial) { fake_partial('node :drink => drink.type') }
229
+
230
+ scope = Petroglyph::Scope.new
231
+ scope.collection :drinks => drinks, :partial => :drink
232
+
233
+ scope.value.should eq({:drinks => [{:drink => 'tea'}, {:drink => 'coffee'}]})
234
+ end
222
235
  end
223
236
 
224
237
  context 'with partials' do
225
238
  it 'renders a partial' do
226
- Petroglyph.stub(:partial) { 'node :drink => "tea"' }
239
+ Petroglyph.stub(:partial) { fake_partial('node :drink => "tea"') }
227
240
 
228
241
  scope = Petroglyph::Scope.new
229
242
  scope.node :partial do
@@ -234,7 +247,7 @@ describe Petroglyph::Scope do
234
247
  end
235
248
 
236
249
  it 'renders a partial with local variables' do
237
- Petroglyph.stub(:partial) { 'node :drink => drink' }
250
+ Petroglyph.stub(:partial) { fake_partial('node :drink => drink') }
238
251
 
239
252
  scope = Petroglyph::Scope.new
240
253
  scope.node :partial do
@@ -245,7 +258,7 @@ describe Petroglyph::Scope do
245
258
  end
246
259
 
247
260
  it 'defaults locals to match the name of the partial' do
248
- Petroglyph.stub(:partial) { 'node :beverage => drink' }
261
+ Petroglyph.stub(:partial) { fake_partial('node :beverage => drink') }
249
262
 
250
263
  scope = Petroglyph::Scope.new(nil, {:drink => 'coffee'})
251
264
  scope.node :beverages 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.6
4
+ version: 0.0.7
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: 2013-01-08 00:00:00.000000000 Z
12
+ date: 2013-08-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: tilt
16
- requirement: &70296704591240 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70296704591240
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: rspec
27
- requirement: &70296704590820 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: '0'
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70296704590820
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: sinatra
38
- requirement: &70296704590320 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: '1.3'
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70296704590320
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: rack-test
49
- requirement: &70296704589900 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,7 +69,12 @@ dependencies:
54
69
  version: '0'
55
70
  type: :development
56
71
  prerelease: false
57
- version_requirements: *70296704589900
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  description: A simple, terse, and unsurprising ruby dsl to create json views.
59
79
  email:
60
80
  - katrina.owen@gmail.com
@@ -67,6 +87,7 @@ files:
67
87
  - .simplecov
68
88
  - .travis.yml
69
89
  - Gemfile
90
+ - LICENSE
70
91
  - README.md
71
92
  - Rakefile
72
93
  - lib/padrino/petroglyph.rb
@@ -114,9 +135,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
135
  version: '0'
115
136
  requirements: []
116
137
  rubyforge_project: petroglyph
117
- rubygems_version: 1.8.15
138
+ rubygems_version: 1.8.23
118
139
  signing_key:
119
140
  specification_version: 3
120
141
  summary: A simple, terse, and unsurprising ruby dsl to create json views.
121
142
  test_files: []
122
- has_rdoc: