serenade 0.3.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: