juggle 0.0.1 → 0.0.2
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/Rakefile +2 -1
- data/lib/juggle.rb +43 -0
- data/lib/juggle/context.rb +16 -0
- data/lib/juggle/jug.rb +52 -0
- data/lib/juggle/ops.rb +7 -0
- data/lib/juggle/ops/base.rb +33 -0
- data/lib/juggle/ops/closure.rb +31 -0
- data/lib/juggle/ops/coffee.rb +29 -0
- data/lib/juggle/ops/file.rb +23 -0
- data/lib/juggle/ops/remote.rb +23 -0
- data/lib/juggle/ops/template.rb +34 -0
- data/lib/juggle/rake_task.rb +44 -0
- data/lib/juggle/sinatra.rb +11 -0
- data/lib/juggle/sinatra/helpers.rb +17 -0
- data/lib/juggle/version.rb +9 -0
- metadata +18 -4
data/Rakefile
CHANGED
data/lib/juggle.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'juggle/context'
|
2
|
+
require 'juggle/jug'
|
3
|
+
require 'juggle/ops'
|
4
|
+
require 'juggle/version'
|
5
|
+
|
6
|
+
require 'closure-compiler'
|
7
|
+
|
8
|
+
include Juggle::Context
|
9
|
+
|
10
|
+
module Juggle
|
11
|
+
extend self
|
12
|
+
|
13
|
+
attr_accessor :root, :settings, :jugs
|
14
|
+
|
15
|
+
def default_settings
|
16
|
+
{
|
17
|
+
:jugfile => './Jugfile',
|
18
|
+
:templates => './app/templates',
|
19
|
+
:indent => 2
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def settings
|
24
|
+
@settings ||= default_settings
|
25
|
+
end
|
26
|
+
|
27
|
+
def jugfile_path
|
28
|
+
File.expand_path(File.join(root, settings[:jugfile]))
|
29
|
+
end
|
30
|
+
|
31
|
+
def clear_jugs!
|
32
|
+
self.jugs = {}
|
33
|
+
end
|
34
|
+
|
35
|
+
def load_jugfile!
|
36
|
+
load jugfile_path
|
37
|
+
end
|
38
|
+
|
39
|
+
def compiler
|
40
|
+
@compiler ||= Closure::Compiler.new
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
data/lib/juggle/jug.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
|
3
|
+
module Juggle
|
4
|
+
class Jug
|
5
|
+
attr_accessor :name, :opts
|
6
|
+
attr_accessor :ops
|
7
|
+
|
8
|
+
def initialize(opts={}, &blk)
|
9
|
+
self.ops, self.opts = [], opts
|
10
|
+
instance_eval &blk
|
11
|
+
end
|
12
|
+
|
13
|
+
def file(path, opts={})
|
14
|
+
self.ops << Op::File.new(self, opts, path)
|
15
|
+
end
|
16
|
+
|
17
|
+
def curl(path, opts={})
|
18
|
+
self.ops << Op::Remote.new(self, opts, path)
|
19
|
+
end
|
20
|
+
|
21
|
+
def closure(opts={}, &blk)
|
22
|
+
self.ops << Op::Closure.new(self, opts, &blk)
|
23
|
+
end
|
24
|
+
|
25
|
+
def coffee(path, opts={})
|
26
|
+
self.ops << Op::Coffee.new(self, opts, path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def template(path, opts={})
|
30
|
+
self.ops << Op::Template.new(self, opts, path)
|
31
|
+
end
|
32
|
+
|
33
|
+
def render
|
34
|
+
ops.map {|op| op.render}.join("\n") + "\n"
|
35
|
+
end
|
36
|
+
|
37
|
+
def compile
|
38
|
+
Juggle.compiler.compile render
|
39
|
+
end
|
40
|
+
|
41
|
+
def manifest
|
42
|
+
ops.inject([]) do |files, op|
|
43
|
+
files | op.manifest
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def cache_key
|
48
|
+
Digest::MD5.hexdigest manifest.map{|f| File.mtime(f)}.join
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
data/lib/juggle/ops.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module Juggle
|
2
|
+
module Op
|
3
|
+
class Base
|
4
|
+
|
5
|
+
attr_accessor :env, :opts
|
6
|
+
|
7
|
+
class NotImplemented < RuntimeError; end
|
8
|
+
|
9
|
+
def self.default_opts
|
10
|
+
{}
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(env, opts, *args, &blk)
|
14
|
+
self.env = env
|
15
|
+
self.opts = self.class.default_opts.merge!(opts)
|
16
|
+
make(*args, &blk)
|
17
|
+
end
|
18
|
+
|
19
|
+
def make(*args, &blk)
|
20
|
+
raise NotImplemented
|
21
|
+
end
|
22
|
+
|
23
|
+
def render
|
24
|
+
raise NotImplemented
|
25
|
+
end
|
26
|
+
|
27
|
+
def manifest
|
28
|
+
raise NotImplemented
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Juggle
|
2
|
+
module Op
|
3
|
+
class Closure < Base
|
4
|
+
|
5
|
+
attr_accessor :env, :jug
|
6
|
+
|
7
|
+
def self.default_opts
|
8
|
+
{
|
9
|
+
:nowrap => true
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def make(&blk)
|
14
|
+
self.jug = Juggle::Jug.new(opts, &blk)
|
15
|
+
end
|
16
|
+
|
17
|
+
def render
|
18
|
+
[
|
19
|
+
'(function(){',
|
20
|
+
jug.render.gsub(/^/, ' '*Juggle.settings[:indent]),
|
21
|
+
'}).call(this);'
|
22
|
+
].join("\n")
|
23
|
+
end
|
24
|
+
|
25
|
+
def manifest
|
26
|
+
jug.manifest
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Juggle
|
2
|
+
module Op
|
3
|
+
class Coffee < Base
|
4
|
+
|
5
|
+
attr_accessor :glob
|
6
|
+
|
7
|
+
def make(glob)
|
8
|
+
self.glob = glob
|
9
|
+
end
|
10
|
+
|
11
|
+
def render
|
12
|
+
coffee glob
|
13
|
+
end
|
14
|
+
|
15
|
+
def manifest
|
16
|
+
Dir[glob].map {|f| ::File.expand_path(f)}
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def coffee(glob)
|
22
|
+
args = ['--print']
|
23
|
+
args << '--no-wrap' if env.opts[:nowrap]
|
24
|
+
`coffee #{args.join(' ')} #{glob}`
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Juggle
|
2
|
+
module Op
|
3
|
+
class File < Base
|
4
|
+
|
5
|
+
attr_accessor :glob
|
6
|
+
|
7
|
+
def make(glob)
|
8
|
+
self.glob = glob
|
9
|
+
end
|
10
|
+
|
11
|
+
def render
|
12
|
+
Dir[glob].map {|path|
|
13
|
+
::File.read(path)
|
14
|
+
}.join("\n")
|
15
|
+
end
|
16
|
+
|
17
|
+
def manifest
|
18
|
+
Dir[glob].map {|f| ::File.expand_path(f)}
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
module Juggle
|
4
|
+
module Op
|
5
|
+
class Remote < Base
|
6
|
+
|
7
|
+
attr_accessor :url
|
8
|
+
|
9
|
+
def make(url)
|
10
|
+
self.url = url
|
11
|
+
end
|
12
|
+
|
13
|
+
def render
|
14
|
+
open(url).read
|
15
|
+
end
|
16
|
+
|
17
|
+
def manifest
|
18
|
+
raise "Cannot cache remote url #{url}"
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Juggle
|
4
|
+
module Op
|
5
|
+
class Template < Base
|
6
|
+
|
7
|
+
attr_accessor :glob
|
8
|
+
|
9
|
+
def make(glob)
|
10
|
+
self.glob = glob
|
11
|
+
end
|
12
|
+
|
13
|
+
def render
|
14
|
+
Dir[glob].map do |path|
|
15
|
+
path = ::File.expand_path(path)
|
16
|
+
file = ::File.read(path)
|
17
|
+
|
18
|
+
path.sub!('.mustache', '')
|
19
|
+
|
20
|
+
prefix = ::File.expand_path(opts[:prefix] || Juggle.settings[:templates]) + '/'
|
21
|
+
|
22
|
+
path.sub!(prefix, '')
|
23
|
+
|
24
|
+
"Template[#{path.to_json}] = #{file.to_json};"
|
25
|
+
end.join("\n")
|
26
|
+
end
|
27
|
+
|
28
|
+
def manifest
|
29
|
+
Dir[glob].map {|f| ::File.expand_path(f)}
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/tasklib'
|
3
|
+
|
4
|
+
module Juggle
|
5
|
+
class RakeTask < ::Rake::TaskLib
|
6
|
+
|
7
|
+
attr_accessor :name, :targets, :root, :settings
|
8
|
+
|
9
|
+
def pour(targets)
|
10
|
+
self.targets = targets
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(*args)
|
14
|
+
self.name = args.shift || :juggle
|
15
|
+
self.root = Dir.pwd
|
16
|
+
|
17
|
+
yield self if block_given?
|
18
|
+
|
19
|
+
if Kernel.const_defined?('CLOBBER')
|
20
|
+
targets.each do |target, path|
|
21
|
+
CLOBBER.add path
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
desc 'Compiles Juggle files' unless ::Rake.application.last_comment
|
26
|
+
task name do
|
27
|
+
targets.each do |target, path|
|
28
|
+
|
29
|
+
Juggle.root = root
|
30
|
+
|
31
|
+
Juggle.clear_jugs!
|
32
|
+
Juggle.load_jugfile!
|
33
|
+
|
34
|
+
File.open(path, 'w') do |file|
|
35
|
+
file.write Juggle.jugs[target].compile
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Juggle
|
2
|
+
module Sinatra
|
3
|
+
module Helpers
|
4
|
+
|
5
|
+
def juggle(name)
|
6
|
+
Juggle.root = settings.root
|
7
|
+
Juggle.clear_jugs!
|
8
|
+
Juggle.load_jugfile!
|
9
|
+
|
10
|
+
content_type :js
|
11
|
+
etag Juggle.jugs[name].cache_key
|
12
|
+
Juggle.jugs[name].render
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Chris Lloyd
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-11-
|
17
|
+
date: 2010-11-08 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -31,7 +31,7 @@ dependencies:
|
|
31
31
|
type: :runtime
|
32
32
|
version_requirements: *id001
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
34
|
+
name: json
|
35
35
|
prerelease: false
|
36
36
|
requirement: &id002 !ruby/object:Gem::Requirement
|
37
37
|
none: false
|
@@ -57,6 +57,20 @@ files:
|
|
57
57
|
- LICENSE
|
58
58
|
- README
|
59
59
|
- Rakefile
|
60
|
+
- lib/juggle.rb
|
61
|
+
- lib/juggle/context.rb
|
62
|
+
- lib/juggle/jug.rb
|
63
|
+
- lib/juggle/ops.rb
|
64
|
+
- lib/juggle/ops/base.rb
|
65
|
+
- lib/juggle/ops/closure.rb
|
66
|
+
- lib/juggle/ops/coffee.rb
|
67
|
+
- lib/juggle/ops/file.rb
|
68
|
+
- lib/juggle/ops/remote.rb
|
69
|
+
- lib/juggle/ops/template.rb
|
70
|
+
- lib/juggle/rake_task.rb
|
71
|
+
- lib/juggle/sinatra.rb
|
72
|
+
- lib/juggle/sinatra/helpers.rb
|
73
|
+
- lib/juggle/version.rb
|
60
74
|
has_rdoc: true
|
61
75
|
homepage: http://chrislloyd.github.com/juggle
|
62
76
|
licenses: []
|