juggle 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -16,7 +16,8 @@ begin
16
16
  gem.email = 'christopher.lloyd@gmail.com'
17
17
 
18
18
  gem.add_dependency 'closure-compiler'
19
- gem.add_dependency 'fssm'
19
+ gem.add_dependency 'json'
20
+ # gem.add_dependency 'fssm'
20
21
  end
21
22
  Jeweler::GemcutterTasks.new
22
23
  rescue LoadError
@@ -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
@@ -0,0 +1,16 @@
1
+ module Juggle
2
+ module Context
3
+
4
+ def templates(path)
5
+ Juggle.settings[:templates] = File.join(Juggle.root, path)
6
+ end
7
+
8
+ def js(name, &blk)
9
+ f = Juggle::Jug.new(&blk)
10
+ f.name = name
11
+
12
+ Juggle.jugs[f.name] = f
13
+ end
14
+
15
+ end
16
+ end
@@ -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
@@ -0,0 +1,7 @@
1
+ require 'juggle/ops/base'
2
+
3
+ require 'juggle/ops/closure'
4
+ require 'juggle/ops/coffee'
5
+ require 'juggle/ops/file'
6
+ require 'juggle/ops/remote'
7
+ require 'juggle/ops/template'
@@ -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,11 @@
1
+ require 'juggle/sinatra/helpers'
2
+
3
+ module Juggle
4
+ module Sinatra
5
+
6
+ def self.registered(app)
7
+ app.helpers Helpers
8
+ end
9
+
10
+ end
11
+ end
@@ -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
@@ -0,0 +1,9 @@
1
+ module Juggle
2
+
3
+ VERSION = '0.0.2'
4
+
5
+ def self.version
6
+ VERSION
7
+ end
8
+
9
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
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-07 00:00:00 +01:00
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: fssm
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: []