joosy-rails 1.0.0.beta.3 → 1.0.0.rc4
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.
- checksums.yaml +4 -4
- data/README.md +47 -23
- data/app/assets/javascripts/joosy/railties.coffee.erb +13 -0
- data/app/assets/javascripts/joosy/resource_loader.coffee +37 -0
- data/joosy-rails.gemspec +3 -2
- data/lib/joosy/rails.rb +2 -1
- data/lib/joosy/rails/engine.rb +12 -16
- data/lib/joosy/rails/routing.rb +41 -0
- data/lib/joosy/rails/version.rb +1 -1
- data/lib/rails/generators/joosy/application_generator.rb +13 -6
- data/lib/rails/generators/joosy/base.rb +47 -17
- data/lib/rails/generators/joosy/controller_generator.rb +3 -3
- data/lib/rails/generators/joosy/layout_generator.rb +2 -8
- data/lib/rails/generators/joosy/page_generator.rb +3 -9
- data/lib/rails/generators/joosy/resource_generator.rb +9 -0
- data/lib/rails/generators/joosy/widget_generator.rb +3 -9
- data/vendor/ejs.js +581 -0
- metadata +26 -7
- data/lib/joosy/generators.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f4c956ac6c811912d2f3fd84fc5237b405a592f
|
4
|
+
data.tar.gz: 88f62c939a0903964f9607968d03607d4cba0a12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e40e76c5deaac35836fee232ab625f90bc784398a1e6d516a45433ad4324cc7d596a2b801b7cc278b254c42abbe5fa8702dfb575d4959f3b9124ca9097b96d2
|
7
|
+
data.tar.gz: 51f2f98722e649e45fa3ad9e6dfa7e907cf29884154c4e0241ab69bef8ed9c82bf639e7ec9c3e58310638766d2e9a9e175e7c090ef1eab14be7e7f54584fd8b2
|
data/README.md
CHANGED
@@ -1,18 +1,21 @@
|
|
1
1
|
# Joosy::Rails
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
Rails ties for the [Joosy](http://joosy.ws) Framework
|
3
|
+
<a href="http://joosy.ws"><img src="http://f.cl.ly/items/3X0f2K1z3r1X3K162W2c/logo.png" align="right" /></a>
|
6
4
|
|
7
5
|
[](http://badge.fury.io/rb/joosy-rails)
|
8
|
-
[](https://gemnasium.com/joosy/rails)
|
6
|
+
[](https://gemnasium.com/joosy/joosy-rails)
|
7
|
+
|
8
|
+
The bindings between **[Joosy](http://joosy.ws) framework** and [Rails](http://rubyonrails.org).
|
9
|
+
|
10
|
+
If you are seeking for information about Joosy, start with [official site](http://joosy.ws), [guides](http://guides.joosy.ws) or [central repository](https://github.com/joosy/joosy/).
|
9
11
|
|
10
|
-
|
12
|
+
## Capabilities
|
11
13
|
|
12
14
|
* Full assets integration
|
13
15
|
* Generators
|
14
16
|
* Built-in serving controller
|
15
17
|
* Routes helpers
|
18
|
+
* Automatic Joosy Resources generation
|
16
19
|
|
17
20
|
## Installation
|
18
21
|
|
@@ -28,20 +31,35 @@ And then execute:
|
|
28
31
|
|
29
32
|
### Generators
|
30
33
|
|
31
|
-
|
32
|
-
|
34
|
+
#### rails g joosy:application (NAME)
|
35
|
+
|
36
|
+
Generates basic application and patches route to make it loadable straight away.
|
37
|
+
|
38
|
+
By default an application will be generated directly at `app/assets/javascripts`. If you want to isolate it a bit more, pass in the `NAME` argument — then it will appear at `app/assets/javascripts/NAME`.
|
39
|
+
|
40
|
+
#### rails g joosy:layout NAME (APPLICATION)
|
41
|
+
|
42
|
+
Generates Joosy layout. `NAME` can contain slashes to automatically generate corresponding path and namespace.
|
43
|
+
|
44
|
+
Note that if the application was initially generated with the usage of `NAME` option, you should pass it here as the second parameter (APPLICATION).
|
45
|
+
|
46
|
+
#### rails g joosy:page NAME (APPLICATION)
|
47
|
+
|
48
|
+
Generates Joosy page. `NAME` can contain slashes to automatically generate corresponding path and namespace.
|
33
49
|
|
34
|
-
|
35
|
-
**:name** can include any namespace (i.e. 'deeply/nested/layout').<br>
|
36
|
-
**:application** is a name of an application.<br>
|
50
|
+
Note that if the application was initially generated with the usage of `NAME` option, you should pass it here as the second parameter (APPLICATION).
|
37
51
|
|
38
|
-
|
39
|
-
**:name** can include any namespace (i.e. 'deeply/nested/page').<br>
|
40
|
-
**:application** is a name of an application.<br>
|
52
|
+
#### rails g joosy:widget NAME (APPLICATION)
|
41
53
|
|
42
|
-
|
43
|
-
|
44
|
-
|
54
|
+
Generates Joosy widget. `NAME` can contain slashes to automatically generate corresponding path and namespace.
|
55
|
+
|
56
|
+
Note that if the application was initially generated with the usage of `NAME` option, you should pass it here as the second parameter (APPLICATION).
|
57
|
+
|
58
|
+
#### rails g joosy:controller NAME (--copy)
|
59
|
+
|
60
|
+
Generates a controller serving Joosy application using the NAME given.
|
61
|
+
|
62
|
+
By default a controller will inherit from internal `Joosy::Rails::ServeController`. If instead you want to patch it from the ground, use `--copy` option that will make generator to create raw controller that inherits from `ActionController::Base`.
|
45
63
|
|
46
64
|
### Serving controller and helpers
|
47
65
|
|
@@ -51,12 +69,18 @@ This gem provides `joosy` routing helper which can be used in the following way:
|
|
51
69
|
joosy '/', application: 'dummy'
|
52
70
|
```
|
53
71
|
|
54
|
-
This will map your `dummy` Joosy application to the root url.
|
72
|
+
This will map your `dummy` Joosy application to the root url. The `application` option is optional. It should reflect path to application from `app/assets/javascript` (use the value that you passed into the NAME of `rails g joosy:application`).
|
73
|
+
|
74
|
+
## Maintainers
|
75
|
+
|
76
|
+
* Boris Staal, [@inossidabile](http://staal.io)
|
77
|
+
|
78
|
+
## License
|
79
|
+
|
80
|
+
Copyright 2013 [Boris Staal](http://staal.io)
|
81
|
+
|
82
|
+
It is free software, and may be redistributed under the terms of MIT license.
|
83
|
+
|
55
84
|
|
56
|
-
|
85
|
+
[](https://bitdeli.com/free "Bitdeli Badge")
|
57
86
|
|
58
|
-
1. Fork it
|
59
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
60
|
-
3. Commit your changes (`git commit -am 'Add some feature'`)
|
61
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
62
|
-
5. Create new Pull Request
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#= require joosy/resources
|
2
|
+
|
3
|
+
Joosy.ResourceLoader =
|
4
|
+
defineResource: (name, path, parent) ->
|
5
|
+
class @[name] extends parent
|
6
|
+
@entity inflection.underscore(name)
|
7
|
+
@source path
|
8
|
+
|
9
|
+
namespaceFromLevels: (levels) ->
|
10
|
+
levels.map((x) ->
|
11
|
+
res = x.replace(/^\//, '').split('/')
|
12
|
+
if res.length > 1
|
13
|
+
# resource, has second (mask) part
|
14
|
+
res = inflection.singularize(res[0])
|
15
|
+
else
|
16
|
+
# scope
|
17
|
+
res = res[0]
|
18
|
+
inflection.camelize res
|
19
|
+
).join('.')
|
20
|
+
|
21
|
+
loadResources: (routes) ->
|
22
|
+
for route in routes
|
23
|
+
levels = route.match /\/[^\/]+(\/:[^\/]+)?/g
|
24
|
+
continue unless levels instanceof Array
|
25
|
+
rootPath = levels.pop()
|
26
|
+
name = inflection.camelize inflection.singularize(rootPath.replace(/^\//, ''))
|
27
|
+
|
28
|
+
parent = if window[name] && Joosy.Module.hasAncestor(window[name], Joosy.Resources.REST)
|
29
|
+
window[name]
|
30
|
+
else if !window[name]
|
31
|
+
@defineResource.call window, name, rootPath, Joosy.Resources.REST
|
32
|
+
else
|
33
|
+
Joosy.Resources.REST
|
34
|
+
|
35
|
+
if (ns = @namespaceFromLevels(levels)) != ''
|
36
|
+
Joosy.namespace ns, ->
|
37
|
+
Joosy.ResourceLoader.defineResource.call @, name, route, parent
|
data/joosy-rails.gemspec
CHANGED
@@ -18,10 +18,11 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_dependency 'joosy', '>= 1.2.0.
|
21
|
+
spec.add_dependency 'joosy', '>= 1.2.0.beta.4'
|
22
22
|
spec.add_dependency 'sprockets'
|
23
23
|
spec.add_dependency 'execjs'
|
24
|
-
spec.add_dependency '
|
24
|
+
spec.add_dependency 'activesupport'
|
25
|
+
spec.add_dependency 'thor'
|
25
26
|
|
26
27
|
spec.add_dependency 'sugar-rails'
|
27
28
|
spec.add_dependency 'jquery-form-rails'
|
data/lib/joosy/rails.rb
CHANGED
data/lib/joosy/rails/engine.rb
CHANGED
@@ -3,26 +3,22 @@ require 'rails/engine'
|
|
3
3
|
module Joosy
|
4
4
|
module Rails
|
5
5
|
class Engine < ::Rails::Engine
|
6
|
+
cattr_accessor :resources
|
7
|
+
self.resources = []
|
8
|
+
|
6
9
|
initializer 'joosy.extend.sprockets' do |app|
|
7
10
|
Joosy.assets_paths.each{|p| app.assets.append_path p}
|
8
11
|
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
initializer 'joosy.routing' do |app|
|
14
|
+
app.routes.prepend do
|
15
|
+
Engine.resources = []
|
16
|
+
end
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
via: :get,
|
22
|
-
as: (options[:application] ? "joosy_#{options[:application]}" : "joosy"),
|
23
|
-
defaults: {route: route, application: options[:application]},
|
24
|
-
anchor: false,
|
25
|
-
format: false
|
19
|
+
def route_dependencies
|
20
|
+
::Rails.application.routes_reloader.paths
|
21
|
+
end
|
26
22
|
end
|
27
23
|
end
|
28
|
-
end
|
24
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'action_dispatch/routing/mapper'
|
2
|
+
|
3
|
+
module ActionDispatch::Routing
|
4
|
+
class Mapper
|
5
|
+
module Resources
|
6
|
+
class JoosyResource
|
7
|
+
def initialize(context)
|
8
|
+
@context = context
|
9
|
+
end
|
10
|
+
|
11
|
+
def method_missing(name, *args, &block)
|
12
|
+
@context.send(name, *args, &block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def resources(*args, &block)
|
16
|
+
@context.resources(*args) do
|
17
|
+
scope = @context.instance_eval { @scope }
|
18
|
+
Joosy::Rails::Engine.resources << "#{scope[:path]}/#{scope[:scope_level_resource].path}"
|
19
|
+
@context.joosy_resources(&block)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def joosy_resources(&block)
|
25
|
+
JoosyResource.new(self).instance_eval(&block) if block_given?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def joosy(route, options={})
|
30
|
+
extender = route.last == '/' ? '(*x)' : '(/*x)'
|
31
|
+
|
32
|
+
get route,
|
33
|
+
controller: options[:controller] || 'joosy/rails/serve',
|
34
|
+
action: options[:action] || 'index',
|
35
|
+
as: (options[:application] ? "joosy_#{options[:application]}" : "joosy"),
|
36
|
+
defaults: {route: route, application: options[:application]},
|
37
|
+
anchor: false,
|
38
|
+
format: false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/joosy/rails/version.rb
CHANGED
@@ -7,14 +7,21 @@ module Joosy
|
|
7
7
|
|
8
8
|
def create_application
|
9
9
|
dependencies = <<-COFFEE
|
10
|
+
#= require hamlcoffee
|
10
11
|
#= require jquery
|
11
|
-
#= require
|
12
|
+
#= require joosy
|
13
|
+
#= require joosy/resources
|
14
|
+
#= require joosy/railties
|
12
15
|
#= require sugar
|
13
|
-
#= require hamlcoffee
|
14
16
|
COFFEE
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
+
@options = {
|
19
|
+
'dependencies' => dependencies,
|
20
|
+
'html5' => true,
|
21
|
+
'prefix' => name || ''
|
22
|
+
}
|
23
|
+
|
24
|
+
directory 'application', Pathname.new('app/assets/javascripts/').join(name || '')
|
18
25
|
end
|
19
26
|
|
20
27
|
def create_bindings
|
@@ -24,14 +31,14 @@ module Joosy
|
|
24
31
|
index = ::Rails.root.join('app/assets/javascripts/application.js')
|
25
32
|
|
26
33
|
if File.exists?(index)
|
27
|
-
copy_file index, 'app/assets/javascripts/application.
|
34
|
+
copy_file index, 'app/assets/javascripts/application.js-old'
|
28
35
|
remove_file index
|
29
36
|
end
|
30
37
|
end
|
31
38
|
|
32
39
|
layout = 'joosy'
|
33
40
|
layout << "/#{name}" if name
|
34
|
-
|
41
|
+
erb_template File.expand_path('../templates/layout.html.erb', __FILE__), "app/views/layouts/#{layout}.html.erb"
|
35
42
|
|
36
43
|
application = name ? ", application: '#{name}'" : ''
|
37
44
|
route "joosy '/#{name}'#{application}"
|
@@ -1,30 +1,60 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'active_support/all'
|
2
|
+
require 'sprockets'
|
3
|
+
require 'execjs'
|
3
4
|
|
4
5
|
module Joosy
|
5
6
|
module Generators
|
6
7
|
class Base < ::Rails::Generators::Base
|
8
|
+
no_tasks do
|
9
|
+
class <<self
|
10
|
+
attr_accessor :kind
|
11
|
+
end
|
12
|
+
|
13
|
+
alias_method :erb_template, :template
|
14
|
+
|
15
|
+
def template(source, destination=nil, config={})
|
16
|
+
destination ||= source
|
17
|
+
source = File.expand_path(find_in_source_paths(source.to_s))
|
18
|
+
context = instance_eval('binding')
|
19
|
+
|
20
|
+
create_file destination, nil, config do
|
21
|
+
self.class.ejs ::File.read(source), @options
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
7
26
|
protected
|
8
27
|
|
28
|
+
def self.sprockets
|
29
|
+
return @sprockets if @sprockets
|
30
|
+
|
31
|
+
@sprockets = Sprockets::Environment.new
|
32
|
+
@sprockets.append_path File.expand_path('../../../../../vendor/', __FILE__)
|
33
|
+
@sprockets
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.ejs(template, data)
|
37
|
+
ExecJS.compile(sprockets['ejs'].to_s).eval("ejs.compile(#{template.to_json})(#{data.to_json})")
|
38
|
+
end
|
39
|
+
|
9
40
|
def self.source_root
|
10
41
|
Joosy.templates_path
|
11
42
|
end
|
43
|
+
end
|
12
44
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end
|
27
|
-
end
|
45
|
+
class Entity < Base
|
46
|
+
argument :name, type: :string
|
47
|
+
argument :application, type: :string, optional: true
|
48
|
+
|
49
|
+
def create_files
|
50
|
+
@options = {
|
51
|
+
'name' => name,
|
52
|
+
'namespace' => name.split('/')[0..-2].map(&:camelize).join('/'),
|
53
|
+
'view' => name.split('/').last.underscore,
|
54
|
+
'klass' => name.split('/').last.camelize
|
55
|
+
}
|
56
|
+
|
57
|
+
directory self.class.kind, Pathname.new('app/assets/javascripts/').join(application || '')
|
28
58
|
end
|
29
59
|
end
|
30
60
|
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require_relative './base'
|
2
|
-
|
3
1
|
module Joosy
|
4
2
|
module Generators
|
5
|
-
class ControllerGenerator < Base
|
3
|
+
class ControllerGenerator < ::Rails::Generators::Base
|
6
4
|
argument :name, type: :string
|
7
5
|
class_option :copy, :default => false, :type => :boolean, :desc => 'Indicates whether internal controller should be copied'
|
8
6
|
|
7
|
+
source_root ::Rails.root
|
8
|
+
|
9
9
|
def create_files
|
10
10
|
if options["copy"]
|
11
11
|
template File.expand_path('../../../../joosy/rails/controller.rb', __FILE__), "app/controller/joosy/rails/serve_controller.rb"
|
@@ -2,14 +2,8 @@ require_relative './base'
|
|
2
2
|
|
3
3
|
module Joosy
|
4
4
|
module Generators
|
5
|
-
class LayoutGenerator <
|
6
|
-
|
7
|
-
argument :application, type: :string, optional: true
|
8
|
-
|
9
|
-
def create_files
|
10
|
-
self.destination_root = ::Rails.root.join('app/assets/javascripts/').join(application || '')
|
11
|
-
run Joosy::Generators.pregenerate('layout', {name: name})
|
12
|
-
end
|
5
|
+
class LayoutGenerator < Entity
|
6
|
+
self.kind = 'layout'
|
13
7
|
end
|
14
8
|
end
|
15
9
|
end
|
@@ -2,14 +2,8 @@ require_relative './base'
|
|
2
2
|
|
3
3
|
module Joosy
|
4
4
|
module Generators
|
5
|
-
class PageGenerator <
|
6
|
-
|
7
|
-
argument :application, type: :string, optional: true
|
8
|
-
|
9
|
-
def create_files
|
10
|
-
self.destination_root = ::Rails.root.join('app/assets/javascripts/').join(application || '')
|
11
|
-
run Joosy::Generators.pregenerate('page', {name: name})
|
12
|
-
end
|
5
|
+
class PageGenerator < Entity
|
6
|
+
self.kind = 'page'
|
13
7
|
end
|
14
8
|
end
|
15
|
-
end
|
9
|
+
end
|
@@ -2,14 +2,8 @@ require_relative './base'
|
|
2
2
|
|
3
3
|
module Joosy
|
4
4
|
module Generators
|
5
|
-
class WidgetGenerator <
|
6
|
-
|
7
|
-
argument :application, type: :string, optional: true
|
8
|
-
|
9
|
-
def create_files
|
10
|
-
self.destination_root = ::Rails.root.join('app/assets/javascripts/').join(application || '')
|
11
|
-
run Joosy::Generators.pregenerate('widget', {name: name})
|
12
|
-
end
|
5
|
+
class WidgetGenerator < Entity
|
6
|
+
self.kind = 'widget'
|
13
7
|
end
|
14
8
|
end
|
15
|
-
end
|
9
|
+
end
|
data/vendor/ejs.js
ADDED
@@ -0,0 +1,581 @@
|
|
1
|
+
ejs = (function(){
|
2
|
+
|
3
|
+
// CommonJS require()
|
4
|
+
|
5
|
+
function require(p){
|
6
|
+
if ('fs' == p) return {};
|
7
|
+
var path = require.resolve(p)
|
8
|
+
, mod = require.modules[path];
|
9
|
+
if (!mod) throw new Error('failed to require "' + p + '"');
|
10
|
+
if (!mod.exports) {
|
11
|
+
mod.exports = {};
|
12
|
+
mod.call(mod.exports, mod, mod.exports, require.relative(path));
|
13
|
+
}
|
14
|
+
return mod.exports;
|
15
|
+
}
|
16
|
+
|
17
|
+
require.modules = {};
|
18
|
+
|
19
|
+
require.resolve = function (path){
|
20
|
+
var orig = path
|
21
|
+
, reg = path + '.js'
|
22
|
+
, index = path + '/index.js';
|
23
|
+
return require.modules[reg] && reg
|
24
|
+
|| require.modules[index] && index
|
25
|
+
|| orig;
|
26
|
+
};
|
27
|
+
|
28
|
+
require.register = function (path, fn){
|
29
|
+
require.modules[path] = fn;
|
30
|
+
};
|
31
|
+
|
32
|
+
require.relative = function (parent) {
|
33
|
+
return function(p){
|
34
|
+
if ('.' != p.substr(0, 1)) return require(p);
|
35
|
+
|
36
|
+
var path = parent.split('/')
|
37
|
+
, segs = p.split('/');
|
38
|
+
path.pop();
|
39
|
+
|
40
|
+
for (var i = 0; i < segs.length; i++) {
|
41
|
+
var seg = segs[i];
|
42
|
+
if ('..' == seg) path.pop();
|
43
|
+
else if ('.' != seg) path.push(seg);
|
44
|
+
}
|
45
|
+
|
46
|
+
return require(path.join('/'));
|
47
|
+
};
|
48
|
+
};
|
49
|
+
|
50
|
+
|
51
|
+
require.register("ejs.js", function(module, exports, require){
|
52
|
+
|
53
|
+
/*!
|
54
|
+
* EJS
|
55
|
+
* Copyright(c) 2012 TJ Holowaychuk <tj@vision-media.ca>
|
56
|
+
* MIT Licensed
|
57
|
+
*/
|
58
|
+
|
59
|
+
/**
|
60
|
+
* Module dependencies.
|
61
|
+
*/
|
62
|
+
|
63
|
+
var utils = require('./utils')
|
64
|
+
, fs = require('fs');
|
65
|
+
|
66
|
+
/**
|
67
|
+
* Library version.
|
68
|
+
*/
|
69
|
+
|
70
|
+
exports.version = '0.7.2';
|
71
|
+
|
72
|
+
/**
|
73
|
+
* Filters.
|
74
|
+
*
|
75
|
+
* @type Object
|
76
|
+
*/
|
77
|
+
|
78
|
+
var filters = exports.filters = require('./filters');
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Intermediate js cache.
|
82
|
+
*
|
83
|
+
* @type Object
|
84
|
+
*/
|
85
|
+
|
86
|
+
var cache = {};
|
87
|
+
|
88
|
+
/**
|
89
|
+
* Clear intermediate js cache.
|
90
|
+
*
|
91
|
+
* @api public
|
92
|
+
*/
|
93
|
+
|
94
|
+
exports.clearCache = function(){
|
95
|
+
cache = {};
|
96
|
+
};
|
97
|
+
|
98
|
+
/**
|
99
|
+
* Translate filtered code into function calls.
|
100
|
+
*
|
101
|
+
* @param {String} js
|
102
|
+
* @return {String}
|
103
|
+
* @api private
|
104
|
+
*/
|
105
|
+
|
106
|
+
function filtered(js) {
|
107
|
+
return js.substr(1).split('|').reduce(function(js, filter){
|
108
|
+
var parts = filter.split(':')
|
109
|
+
, name = parts.shift()
|
110
|
+
, args = parts.shift() || '';
|
111
|
+
if (args) args = ', ' + args;
|
112
|
+
return 'filters.' + name + '(' + js + args + ')';
|
113
|
+
});
|
114
|
+
};
|
115
|
+
|
116
|
+
/**
|
117
|
+
* Re-throw the given `err` in context to the
|
118
|
+
* `str` of ejs, `filename`, and `lineno`.
|
119
|
+
*
|
120
|
+
* @param {Error} err
|
121
|
+
* @param {String} str
|
122
|
+
* @param {String} filename
|
123
|
+
* @param {String} lineno
|
124
|
+
* @api private
|
125
|
+
*/
|
126
|
+
|
127
|
+
function rethrow(err, str, filename, lineno){
|
128
|
+
var lines = str.split('\n')
|
129
|
+
, start = Math.max(lineno - 3, 0)
|
130
|
+
, end = Math.min(lines.length, lineno + 3);
|
131
|
+
|
132
|
+
// Error context
|
133
|
+
var context = lines.slice(start, end).map(function(line, i){
|
134
|
+
var curr = i + start + 1;
|
135
|
+
return (curr == lineno ? ' >> ' : ' ')
|
136
|
+
+ curr
|
137
|
+
+ '| '
|
138
|
+
+ line;
|
139
|
+
}).join('\n');
|
140
|
+
|
141
|
+
// Alter exception message
|
142
|
+
err.path = filename;
|
143
|
+
err.message = (filename || 'ejs') + ':'
|
144
|
+
+ lineno + '\n'
|
145
|
+
+ context + '\n\n'
|
146
|
+
+ err.message;
|
147
|
+
|
148
|
+
throw err;
|
149
|
+
}
|
150
|
+
|
151
|
+
/**
|
152
|
+
* Parse the given `str` of ejs, returning the function body.
|
153
|
+
*
|
154
|
+
* @param {String} str
|
155
|
+
* @return {String}
|
156
|
+
* @api public
|
157
|
+
*/
|
158
|
+
|
159
|
+
var parse = exports.parse = function(str, options){
|
160
|
+
var options = options || {}
|
161
|
+
, open = options.open || exports.open || '<%'
|
162
|
+
, close = options.close || exports.close || '%>';
|
163
|
+
|
164
|
+
var buf = [
|
165
|
+
"var buf = [];"
|
166
|
+
, "\nwith (locals) {"
|
167
|
+
, "\n buf.push('"
|
168
|
+
];
|
169
|
+
|
170
|
+
var lineno = 1;
|
171
|
+
|
172
|
+
var consumeEOL = false;
|
173
|
+
for (var i = 0, len = str.length; i < len; ++i) {
|
174
|
+
if (str.slice(i, open.length + i) == open) {
|
175
|
+
i += open.length
|
176
|
+
|
177
|
+
var prefix, postfix, line = '__stack.lineno=' + lineno;
|
178
|
+
switch (str.substr(i, 1)) {
|
179
|
+
case '=':
|
180
|
+
prefix = "', escape((" + line + ', ';
|
181
|
+
postfix = ")), '";
|
182
|
+
++i;
|
183
|
+
break;
|
184
|
+
case '-':
|
185
|
+
prefix = "', (" + line + ', ';
|
186
|
+
postfix = "), '";
|
187
|
+
++i;
|
188
|
+
break;
|
189
|
+
default:
|
190
|
+
prefix = "');" + line + ';';
|
191
|
+
postfix = "; buf.push('";
|
192
|
+
}
|
193
|
+
|
194
|
+
var end = str.indexOf(close, i)
|
195
|
+
, js = str.substring(i, end)
|
196
|
+
, start = i
|
197
|
+
, n = 0;
|
198
|
+
|
199
|
+
if ('-' == js[js.length-1]){
|
200
|
+
js = js.substring(0, js.length - 2);
|
201
|
+
consumeEOL = true;
|
202
|
+
}
|
203
|
+
|
204
|
+
while (~(n = js.indexOf("\n", n))) n++, lineno++;
|
205
|
+
if (js.substr(0, 1) == ':') js = filtered(js);
|
206
|
+
buf.push(prefix, js, postfix);
|
207
|
+
i += end - start + close.length - 1;
|
208
|
+
|
209
|
+
} else if (str.substr(i, 1) == "\\") {
|
210
|
+
buf.push("\\\\");
|
211
|
+
} else if (str.substr(i, 1) == "'") {
|
212
|
+
buf.push("\\'");
|
213
|
+
} else if (str.substr(i, 1) == "\r") {
|
214
|
+
buf.push(" ");
|
215
|
+
} else if (str.substr(i, 1) == "\n") {
|
216
|
+
if (consumeEOL) {
|
217
|
+
consumeEOL = false;
|
218
|
+
} else {
|
219
|
+
buf.push("\\n");
|
220
|
+
lineno++;
|
221
|
+
}
|
222
|
+
} else {
|
223
|
+
buf.push(str.substr(i, 1));
|
224
|
+
}
|
225
|
+
}
|
226
|
+
|
227
|
+
buf.push("');\n}\nreturn buf.join('');");
|
228
|
+
return buf.join('');
|
229
|
+
};
|
230
|
+
|
231
|
+
/**
|
232
|
+
* Compile the given `str` of ejs into a `Function`.
|
233
|
+
*
|
234
|
+
* @param {String} str
|
235
|
+
* @param {Object} options
|
236
|
+
* @return {Function}
|
237
|
+
* @api public
|
238
|
+
*/
|
239
|
+
|
240
|
+
var compile = exports.compile = function(str, options){
|
241
|
+
options = options || {};
|
242
|
+
|
243
|
+
var input = JSON.stringify(str)
|
244
|
+
, filename = options.filename
|
245
|
+
? JSON.stringify(options.filename)
|
246
|
+
: 'undefined';
|
247
|
+
|
248
|
+
// Adds the fancy stack trace meta info
|
249
|
+
str = [
|
250
|
+
'var __stack = { lineno: 1, input: ' + input + ', filename: ' + filename + ' };',
|
251
|
+
rethrow.toString(),
|
252
|
+
'try {',
|
253
|
+
exports.parse(str, options),
|
254
|
+
'} catch (err) {',
|
255
|
+
' rethrow(err, __stack.input, __stack.filename, __stack.lineno);',
|
256
|
+
'}'
|
257
|
+
].join("\n");
|
258
|
+
|
259
|
+
if (options.debug) console.log(str);
|
260
|
+
var fn = new Function('locals, filters, escape', str);
|
261
|
+
return function(locals){
|
262
|
+
return fn.call(this, locals, filters, utils.escape);
|
263
|
+
}
|
264
|
+
};
|
265
|
+
|
266
|
+
/**
|
267
|
+
* Render the given `str` of ejs.
|
268
|
+
*
|
269
|
+
* Options:
|
270
|
+
*
|
271
|
+
* - `locals` Local variables object
|
272
|
+
* - `cache` Compiled functions are cached, requires `filename`
|
273
|
+
* - `filename` Used by `cache` to key caches
|
274
|
+
* - `scope` Function execution context
|
275
|
+
* - `debug` Output generated function body
|
276
|
+
* - `open` Open tag, defaulting to "<%"
|
277
|
+
* - `close` Closing tag, defaulting to "%>"
|
278
|
+
*
|
279
|
+
* @param {String} str
|
280
|
+
* @param {Object} options
|
281
|
+
* @return {String}
|
282
|
+
* @api public
|
283
|
+
*/
|
284
|
+
|
285
|
+
exports.render = function(str, options){
|
286
|
+
var fn
|
287
|
+
, options = options || {};
|
288
|
+
|
289
|
+
if (options.cache) {
|
290
|
+
if (options.filename) {
|
291
|
+
fn = cache[options.filename] || (cache[options.filename] = compile(str, options));
|
292
|
+
} else {
|
293
|
+
throw new Error('"cache" option requires "filename".');
|
294
|
+
}
|
295
|
+
} else {
|
296
|
+
fn = compile(str, options);
|
297
|
+
}
|
298
|
+
|
299
|
+
options.__proto__ = options.locals;
|
300
|
+
return fn.call(options.scope, options);
|
301
|
+
};
|
302
|
+
|
303
|
+
/**
|
304
|
+
* Render an EJS file at the given `path` and callback `fn(err, str)`.
|
305
|
+
*
|
306
|
+
* @param {String} path
|
307
|
+
* @param {Object|Function} options or callback
|
308
|
+
* @param {Function} fn
|
309
|
+
* @api public
|
310
|
+
*/
|
311
|
+
|
312
|
+
exports.renderFile = function(path, options, fn){
|
313
|
+
var key = path + ':string';
|
314
|
+
|
315
|
+
if ('function' == typeof options) {
|
316
|
+
fn = options, options = {};
|
317
|
+
}
|
318
|
+
|
319
|
+
options.filename = path;
|
320
|
+
|
321
|
+
try {
|
322
|
+
var str = options.cache
|
323
|
+
? cache[key] || (cache[key] = fs.readFileSync(path, 'utf8'))
|
324
|
+
: fs.readFileSync(path, 'utf8');
|
325
|
+
|
326
|
+
fn(null, exports.render(str, options));
|
327
|
+
} catch (err) {
|
328
|
+
fn(err);
|
329
|
+
}
|
330
|
+
};
|
331
|
+
|
332
|
+
// express support
|
333
|
+
|
334
|
+
exports.__express = exports.renderFile;
|
335
|
+
|
336
|
+
/**
|
337
|
+
* Expose to require().
|
338
|
+
*/
|
339
|
+
|
340
|
+
if (require.extensions) {
|
341
|
+
require.extensions['.ejs'] = function(module, filename) {
|
342
|
+
source = require('fs').readFileSync(filename, 'utf-8');
|
343
|
+
module._compile(compile(source, {}), filename);
|
344
|
+
};
|
345
|
+
} else if (require.registerExtension) {
|
346
|
+
require.registerExtension('.ejs', function(src) {
|
347
|
+
return compile(src, {});
|
348
|
+
});
|
349
|
+
}
|
350
|
+
|
351
|
+
}); // module: ejs.js
|
352
|
+
|
353
|
+
require.register("filters.js", function(module, exports, require){
|
354
|
+
|
355
|
+
/*!
|
356
|
+
* EJS - Filters
|
357
|
+
* Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
|
358
|
+
* MIT Licensed
|
359
|
+
*/
|
360
|
+
|
361
|
+
/**
|
362
|
+
* First element of the target `obj`.
|
363
|
+
*/
|
364
|
+
|
365
|
+
exports.first = function(obj) {
|
366
|
+
return obj[0];
|
367
|
+
};
|
368
|
+
|
369
|
+
/**
|
370
|
+
* Last element of the target `obj`.
|
371
|
+
*/
|
372
|
+
|
373
|
+
exports.last = function(obj) {
|
374
|
+
return obj[obj.length - 1];
|
375
|
+
};
|
376
|
+
|
377
|
+
/**
|
378
|
+
* Capitalize the first letter of the target `str`.
|
379
|
+
*/
|
380
|
+
|
381
|
+
exports.capitalize = function(str){
|
382
|
+
str = String(str);
|
383
|
+
return str[0].toUpperCase() + str.substr(1, str.length);
|
384
|
+
};
|
385
|
+
|
386
|
+
/**
|
387
|
+
* Downcase the target `str`.
|
388
|
+
*/
|
389
|
+
|
390
|
+
exports.downcase = function(str){
|
391
|
+
return String(str).toLowerCase();
|
392
|
+
};
|
393
|
+
|
394
|
+
/**
|
395
|
+
* Uppercase the target `str`.
|
396
|
+
*/
|
397
|
+
|
398
|
+
exports.upcase = function(str){
|
399
|
+
return String(str).toUpperCase();
|
400
|
+
};
|
401
|
+
|
402
|
+
/**
|
403
|
+
* Sort the target `obj`.
|
404
|
+
*/
|
405
|
+
|
406
|
+
exports.sort = function(obj){
|
407
|
+
return Object.create(obj).sort();
|
408
|
+
};
|
409
|
+
|
410
|
+
/**
|
411
|
+
* Sort the target `obj` by the given `prop` ascending.
|
412
|
+
*/
|
413
|
+
|
414
|
+
exports.sort_by = function(obj, prop){
|
415
|
+
return Object.create(obj).sort(function(a, b){
|
416
|
+
a = a[prop], b = b[prop];
|
417
|
+
if (a > b) return 1;
|
418
|
+
if (a < b) return -1;
|
419
|
+
return 0;
|
420
|
+
});
|
421
|
+
};
|
422
|
+
|
423
|
+
/**
|
424
|
+
* Size or length of the target `obj`.
|
425
|
+
*/
|
426
|
+
|
427
|
+
exports.size = exports.length = function(obj) {
|
428
|
+
return obj.length;
|
429
|
+
};
|
430
|
+
|
431
|
+
/**
|
432
|
+
* Add `a` and `b`.
|
433
|
+
*/
|
434
|
+
|
435
|
+
exports.plus = function(a, b){
|
436
|
+
return Number(a) + Number(b);
|
437
|
+
};
|
438
|
+
|
439
|
+
/**
|
440
|
+
* Subtract `b` from `a`.
|
441
|
+
*/
|
442
|
+
|
443
|
+
exports.minus = function(a, b){
|
444
|
+
return Number(a) - Number(b);
|
445
|
+
};
|
446
|
+
|
447
|
+
/**
|
448
|
+
* Multiply `a` by `b`.
|
449
|
+
*/
|
450
|
+
|
451
|
+
exports.times = function(a, b){
|
452
|
+
return Number(a) * Number(b);
|
453
|
+
};
|
454
|
+
|
455
|
+
/**
|
456
|
+
* Divide `a` by `b`.
|
457
|
+
*/
|
458
|
+
|
459
|
+
exports.divided_by = function(a, b){
|
460
|
+
return Number(a) / Number(b);
|
461
|
+
};
|
462
|
+
|
463
|
+
/**
|
464
|
+
* Join `obj` with the given `str`.
|
465
|
+
*/
|
466
|
+
|
467
|
+
exports.join = function(obj, str){
|
468
|
+
return obj.join(str || ', ');
|
469
|
+
};
|
470
|
+
|
471
|
+
/**
|
472
|
+
* Truncate `str` to `len`.
|
473
|
+
*/
|
474
|
+
|
475
|
+
exports.truncate = function(str, len){
|
476
|
+
str = String(str);
|
477
|
+
return str.substr(0, len);
|
478
|
+
};
|
479
|
+
|
480
|
+
/**
|
481
|
+
* Truncate `str` to `n` words.
|
482
|
+
*/
|
483
|
+
|
484
|
+
exports.truncate_words = function(str, n){
|
485
|
+
var str = String(str)
|
486
|
+
, words = str.split(/ +/);
|
487
|
+
return words.slice(0, n).join(' ');
|
488
|
+
};
|
489
|
+
|
490
|
+
/**
|
491
|
+
* Replace `pattern` with `substitution` in `str`.
|
492
|
+
*/
|
493
|
+
|
494
|
+
exports.replace = function(str, pattern, substitution){
|
495
|
+
return String(str).replace(pattern, substitution || '');
|
496
|
+
};
|
497
|
+
|
498
|
+
/**
|
499
|
+
* Prepend `val` to `obj`.
|
500
|
+
*/
|
501
|
+
|
502
|
+
exports.prepend = function(obj, val){
|
503
|
+
return Array.isArray(obj)
|
504
|
+
? [val].concat(obj)
|
505
|
+
: val + obj;
|
506
|
+
};
|
507
|
+
|
508
|
+
/**
|
509
|
+
* Append `val` to `obj`.
|
510
|
+
*/
|
511
|
+
|
512
|
+
exports.append = function(obj, val){
|
513
|
+
return Array.isArray(obj)
|
514
|
+
? obj.concat(val)
|
515
|
+
: obj + val;
|
516
|
+
};
|
517
|
+
|
518
|
+
/**
|
519
|
+
* Map the given `prop`.
|
520
|
+
*/
|
521
|
+
|
522
|
+
exports.map = function(arr, prop){
|
523
|
+
return arr.map(function(obj){
|
524
|
+
return obj[prop];
|
525
|
+
});
|
526
|
+
};
|
527
|
+
|
528
|
+
/**
|
529
|
+
* Reverse the given `obj`.
|
530
|
+
*/
|
531
|
+
|
532
|
+
exports.reverse = function(obj){
|
533
|
+
return Array.isArray(obj)
|
534
|
+
? obj.reverse()
|
535
|
+
: String(obj).split('').reverse().join('');
|
536
|
+
};
|
537
|
+
|
538
|
+
/**
|
539
|
+
* Get `prop` of the given `obj`.
|
540
|
+
*/
|
541
|
+
|
542
|
+
exports.get = function(obj, prop){
|
543
|
+
return obj[prop];
|
544
|
+
};
|
545
|
+
|
546
|
+
/**
|
547
|
+
* Packs the given `obj` into json string
|
548
|
+
*/
|
549
|
+
exports.json = function(obj){
|
550
|
+
return JSON.stringify(obj);
|
551
|
+
};
|
552
|
+
}); // module: filters.js
|
553
|
+
|
554
|
+
require.register("utils.js", function(module, exports, require){
|
555
|
+
|
556
|
+
/*!
|
557
|
+
* EJS
|
558
|
+
* Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
|
559
|
+
* MIT Licensed
|
560
|
+
*/
|
561
|
+
|
562
|
+
/**
|
563
|
+
* Escape the given string of `html`.
|
564
|
+
*
|
565
|
+
* @param {String} html
|
566
|
+
* @return {String}
|
567
|
+
* @api private
|
568
|
+
*/
|
569
|
+
|
570
|
+
exports.escape = function(html){
|
571
|
+
return String(html)
|
572
|
+
.replace(/&(?!\w+;)/g, '&')
|
573
|
+
.replace(/</g, '<')
|
574
|
+
.replace(/>/g, '>')
|
575
|
+
.replace(/"/g, '"');
|
576
|
+
};
|
577
|
+
|
578
|
+
}); // module: utils.js
|
579
|
+
|
580
|
+
return require("ejs");
|
581
|
+
})();
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: joosy-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.rc4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Boris Staal
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-02-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: joosy
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.2.0.
|
19
|
+
version: 1.2.0.beta.4
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.2.0.
|
26
|
+
version: 1.2.0.beta.4
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sprockets
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,7 +53,21 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: activesupport
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: thor
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - '>='
|
@@ -106,20 +120,24 @@ files:
|
|
106
120
|
- LICENSE.txt
|
107
121
|
- README.md
|
108
122
|
- Rakefile
|
123
|
+
- app/assets/javascripts/joosy/railties.coffee.erb
|
124
|
+
- app/assets/javascripts/joosy/resource_loader.coffee
|
109
125
|
- joosy-rails.gemspec
|
110
|
-
- lib/joosy/generators.rb
|
111
126
|
- lib/joosy/rails.rb
|
112
127
|
- lib/joosy/rails/controller.rb
|
113
128
|
- lib/joosy/rails/engine.rb
|
129
|
+
- lib/joosy/rails/routing.rb
|
114
130
|
- lib/joosy/rails/version.rb
|
115
131
|
- lib/rails/generators/joosy/application_generator.rb
|
116
132
|
- lib/rails/generators/joosy/base.rb
|
117
133
|
- lib/rails/generators/joosy/controller_generator.rb
|
118
134
|
- lib/rails/generators/joosy/layout_generator.rb
|
119
135
|
- lib/rails/generators/joosy/page_generator.rb
|
136
|
+
- lib/rails/generators/joosy/resource_generator.rb
|
120
137
|
- lib/rails/generators/joosy/templates/controller.rb
|
121
138
|
- lib/rails/generators/joosy/templates/layout.html.erb
|
122
139
|
- lib/rails/generators/joosy/widget_generator.rb
|
140
|
+
- vendor/ejs.js
|
123
141
|
homepage: http://github.com/joosy/rails
|
124
142
|
licenses:
|
125
143
|
- MIT
|
@@ -140,8 +158,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
158
|
version: 1.3.1
|
141
159
|
requirements: []
|
142
160
|
rubyforge_project:
|
143
|
-
rubygems_version: 2.0.
|
161
|
+
rubygems_version: 2.0.3
|
144
162
|
signing_key:
|
145
163
|
specification_version: 4
|
146
164
|
summary: Joosy Rails ties
|
147
165
|
test_files: []
|
166
|
+
has_rdoc:
|
data/lib/joosy/generators.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'sprockets'
|
2
|
-
require 'execjs'
|
3
|
-
require 'ejs'
|
4
|
-
|
5
|
-
module Joosy
|
6
|
-
module Generators
|
7
|
-
def self.pregenerate(generator, arguments)
|
8
|
-
environment = Sprockets::Environment.new
|
9
|
-
environment.append_path Joosy.generators_path
|
10
|
-
|
11
|
-
source = environment['base.js'].to_s
|
12
|
-
source << environment["#{generator}.js"].to_s
|
13
|
-
source << <<-JS
|
14
|
-
Generator.prototype.version = function(){return '#{Joosy::VERSION}'};
|
15
|
-
JS
|
16
|
-
|
17
|
-
ExecJS.compile(source).eval("new Generator(#{arguments.to_json}).generate()")
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|