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 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: []