serenade 0.3.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/lib/serenade.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "serenade/version"
2
+ require "serenade/renderer"
3
+
4
+ # Serenade for Ruby. See {Serenade::Renderer} for the view renderer.
5
+ module Serenade
6
+ end
@@ -0,0 +1,11 @@
1
+ require "serenade/sprockets"
2
+ require "rails/engine"
3
+
4
+ module Serenade
5
+ # Creating an empty Rails engine will make Rails add Serenade to
6
+ # the load path. As a result, you can require serenade.js in your
7
+ # assets without having to register the load path manually through
8
+ # Sprockets.
9
+ class Engine < ::Rails::Engine
10
+ end
11
+ end
@@ -0,0 +1,43 @@
1
+ require "execjs"
2
+ require "multi_json"
3
+
4
+ module Serenade
5
+ # Absolute path to the directory containing the Serenade assets.
6
+ ASSET_PATH = File.expand_path("../assets/javascripts", File.dirname(__FILE__))
7
+
8
+ # Absolute path to the bundled serenade.js.
9
+ SERENADEJS_PATH = File.join(ASSET_PATH, "serenade.js")
10
+
11
+ # Serenade::Renderer compiles Serenade views into a Serenade AST.
12
+ class Renderer
13
+ # @return [String] name of the serenade view
14
+ attr_reader :name
15
+
16
+ # @return [String] content of the serenade view, before compilation
17
+ attr_reader :content
18
+
19
+ def initialize(name, content)
20
+ @name = name
21
+ @content = content
22
+ end
23
+
24
+ # Parse the Serenade view in {#content}.
25
+ #
26
+ # @return [Hash] Serenade view AST.
27
+ def parse
28
+ context = ExecJS.compile(File.read(SERENADEJS_PATH))
29
+ code = "Serenade.view(#{MultiJson.dump(content)}).parse()"
30
+ context.eval(code)
31
+ end
32
+
33
+ # Parse the Serenade view in {#content} and return a JavaScript string
34
+ # that will register the view with the designated {#name} in Serenade.
35
+ #
36
+ # This is the compiled output of a Serenade view template in Sprockets.
37
+ #
38
+ # @return [String] JavaScript output: `Serenade.view('view_name', view_ast)`
39
+ def render
40
+ "Serenade.view(#{MultiJson.dump(name)}, #{MultiJson.dump(parse)});"
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,4 @@
1
+ require "serenade/template"
2
+ require "sprockets"
3
+
4
+ Sprockets.register_engine(".serenade", Serenade::Template)
@@ -0,0 +1,26 @@
1
+ require "serenade"
2
+ require "tilt"
3
+
4
+ module Serenade
5
+ # Tilt template for Serenade views. Tilt is used by Sprocket engines.
6
+ class Template < Tilt::Template
7
+ # @return [String] mime type assigned to all Serenade templates
8
+ def self.default_mime_type
9
+ "application/javascript"
10
+ end
11
+
12
+ # Tilt forces us to override this, or it will raise a NotImplementedError.
13
+ def prepare
14
+ end
15
+
16
+ # Used by tilt to render the template.
17
+ #
18
+ # @param scope
19
+ # @param [Hash] locals
20
+ # @return (see Serenade::Renderer#render)
21
+ def evaluate(scope, locals, &block)
22
+ name = scope.logical_path.gsub(/^views\//, "")
23
+ Serenade::Renderer.new(name, data.dup).render
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,4 @@
1
+ module Serenade
2
+ # Serenade.js version this gem is bundled with.
3
+ VERSION = "0.3.0.1"
4
+ end
data/serenade.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "serenade/version"
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "serenade"
8
+ gem.version = Serenade::VERSION
9
+
10
+ gem.authors = ["Jonas Nicklas", "Kim Burgestrand"]
11
+ gem.email = ["jnicklas@gmail.com", "kim@burgestrand.se"]
12
+ gem.license = "MIT License"
13
+
14
+ gem.summary = "Serenade.js for Ruby, Rails, and Sprockets"
15
+ gem.homepage = "https://github.com/elabs/serenade.rb"
16
+ gem.description = <<-TEXT
17
+ - Use serenade.js with the Rails asset pipeline.
18
+ - Use serenade.js with any sprockets application (middlemanapp, sinatra).
19
+ - Prerender serenade.js views server-side, before it even reaches the client.
20
+ TEXT
21
+
22
+ gem.add_dependency "execjs", ">= 0.3.0"
23
+ gem.add_dependency "multi_json"
24
+ gem.add_development_dependency "rspec", "~> 2.0"
25
+ gem.add_development_dependency "sprockets", "~> 2.0"
26
+ gem.add_development_dependency "rails", "~> 3.1"
27
+
28
+ gem.files = `git ls-files`.split("\n")
29
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
30
+ end
@@ -0,0 +1,16 @@
1
+ require "serenade"
2
+
3
+ describe Serenade do
4
+ specify { defined?(Serenade::VERSION).should_not be_nil }
5
+
6
+ describe Serenade::Renderer do
7
+ describe "#parse" do
8
+ it "returns a parsed Sereande template" do
9
+ result = Serenade::Renderer.new("foo", 'h1 "Hello world"').parse
10
+ result["name"].should eq "h1"
11
+ result["children"][0]["type"].should eq "text"
12
+ result["children"][0]["value"].should eq "Hello world"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ require "serenade/sprockets"
2
+
3
+ describe "Serenade sprockets integration" do
4
+ it "registers the .serenade template engine" do
5
+ Sprockets.engines[".serenade"].should eq Serenade::Template
6
+ end
7
+
8
+ it "allows you to require serenade in your assets" do
9
+ env = Sprockets::Environment.new
10
+ env.append_path Serenade::ASSET_PATH
11
+
12
+ File.exists?(env.resolve "serenade").should be_true
13
+ end
14
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: serenade
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jonas Nicklas
9
+ - Kim Burgestrand
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-10-05 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: execjs
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 0.3.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: 0.3.0
31
+ - !ruby/object:Gem::Dependency
32
+ name: multi_json
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '2.0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: sprockets
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: '2.0'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: '2.0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: rails
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ~>
85
+ - !ruby/object:Gem::Version
86
+ version: '3.1'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: '3.1'
95
+ description: ! '- Use serenade.js with the Rails asset pipeline.
96
+
97
+ - Use serenade.js with any sprockets application (middlemanapp, sinatra).
98
+
99
+ - Prerender serenade.js views server-side, before it even reaches the client.
100
+
101
+ '
102
+ email:
103
+ - jnicklas@gmail.com
104
+ - kim@burgestrand.se
105
+ executables: []
106
+ extensions: []
107
+ extra_rdoc_files: []
108
+ files:
109
+ - .gitignore
110
+ - .rspec
111
+ - Gemfile
112
+ - README.md
113
+ - Rakefile
114
+ - lib/assets/javascripts/serenade.js
115
+ - lib/serenade.rb
116
+ - lib/serenade/rails.rb
117
+ - lib/serenade/renderer.rb
118
+ - lib/serenade/sprockets.rb
119
+ - lib/serenade/template.rb
120
+ - lib/serenade/version.rb
121
+ - serenade.gemspec
122
+ - spec/serenade_spec.rb
123
+ - spec/sprockets_spec.rb
124
+ homepage: https://github.com/elabs/serenade.rb
125
+ licenses:
126
+ - MIT License
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ requirements: []
144
+ rubyforge_project:
145
+ rubygems_version: 1.8.21
146
+ signing_key:
147
+ specification_version: 3
148
+ summary: Serenade.js for Ruby, Rails, and Sprockets
149
+ test_files:
150
+ - spec/serenade_spec.rb
151
+ - spec/sprockets_spec.rb
152
+ has_rdoc: