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/.gitignore +17 -0
- data/.rspec +2 -0
- data/Gemfile +6 -0
- data/README.md +99 -0
- data/Rakefile +29 -0
- data/lib/assets/javascripts/serenade.js +2351 -0
- data/lib/serenade.rb +6 -0
- data/lib/serenade/rails.rb +11 -0
- data/lib/serenade/renderer.rb +43 -0
- data/lib/serenade/sprockets.rb +4 -0
- data/lib/serenade/template.rb +26 -0
- data/lib/serenade/version.rb +4 -0
- data/serenade.gemspec +30 -0
- data/spec/serenade_spec.rb +16 -0
- data/spec/sprockets_spec.rb +14 -0
- metadata +152 -0
data/lib/serenade.rb
ADDED
@@ -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,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
|
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:
|