skyrocket 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.
@@ -1,4 +1,5 @@
1
1
  require 'fileutils'
2
+ require 'digest/md5'
2
3
 
3
4
  module Skyrocket
4
5
  class Asset
@@ -15,15 +16,23 @@ module Skyrocket
15
16
  @processor.post_process_name(@filename)
16
17
  end
17
18
 
19
+ def to_s
20
+ name
21
+ end
22
+
18
23
  def output_path
19
- @output_dir + "/" + @processor.post_process_name(@filename)
24
+ @output_dir + "/" + output_name
25
+ end
26
+
27
+ def output_name
28
+ digest = Digest::MD5.hexdigest(content)
29
+ ppn = @processor.post_process_name(@filename)
30
+ ext = File.extname(ppn)
31
+ "#{ppn.chomp(ext)}_#{digest}#{ext}"
20
32
  end
21
33
 
22
34
  def content
23
- return @content if @content
24
- @content = raw
25
- @content = @processor.process(@content) if @processor
26
- return @content
35
+ return @content ||= @processor.process(raw, name)
27
36
  end
28
37
 
29
38
  def raw
@@ -0,0 +1,24 @@
1
+ module Skyrocket
2
+ class AssetDependency
3
+ attr_reader :asset
4
+
5
+ def initialize(asset, asset_factory)
6
+ @asset = asset
7
+ @af = asset_factory
8
+ end
9
+
10
+ def name
11
+ @asset.to_s
12
+ end
13
+
14
+ def children
15
+ required = DirectiveReader.read_required(@asset)
16
+ required.map { |r| dep_from_name(r) }
17
+ end
18
+
19
+ private
20
+ def dep_from_name(name)
21
+ AssetDependency.new(@af.from_name(name), @af)
22
+ end
23
+ end
24
+ end
@@ -17,14 +17,27 @@ module Skyrocket
17
17
  found = dir_search(name, @asset_dirs + @lib_dirs)
18
18
  if found.length > 0
19
19
  found.each do |file|
20
- if @pf.post_process_name(file) =~ /#{name}$/
20
+ if @pf.post_process_name(file) =~ /#{name}$/ || file =~ /#{name}$/
21
21
  dir, file = parts(file)
22
22
  return Asset.new(dir, file, @output_dir, @pf.processor(file))
23
23
  end
24
24
  end
25
25
  end
26
26
 
27
- raise AssetNotFoundError
27
+ raise AssetNotFoundError.new("Asset not found '#{name}'")
28
+ end
29
+
30
+ def name_exist?(name)
31
+ found = dir_search(name, @asset_dirs + @lib_dirs)
32
+ if found.length > 0
33
+ found.each do |file|
34
+ if @pf.post_process_name(file) =~ /#{name}$/ || file =~ /#{name}$/
35
+ return true
36
+ end
37
+ end
38
+ end
39
+
40
+ return false
28
41
  end
29
42
 
30
43
  private
@@ -46,7 +59,7 @@ module Skyrocket
46
59
  def dir_search(part, dirs)
47
60
  found = Array.new
48
61
  dirs.each do |dir|
49
- found += Dir[dir + "/" + part + ".*"]
62
+ found += (Dir[dir + "/" + part] + Dir[dir + "/" + part + ".*"])
50
63
  end
51
64
  found
52
65
  end
@@ -7,7 +7,7 @@ module Skyrocket
7
7
  end
8
8
 
9
9
  def all_assets
10
- dirs = @af.asset_dirs + @af.lib_dirs
10
+ dirs = @af.asset_dirs
11
11
  paths = Array.new
12
12
  dirs.each do |dir|
13
13
  paths += Dir.glob_files(dir + "/**/*")
@@ -5,9 +5,9 @@ module Skyrocket
5
5
  attr_reader :asset_dirs, :lib_dirs, :output_dir, :base_url, :style
6
6
 
7
7
  def initialize(options)
8
- @asset_dirs = options[:asset_dirs].map{ |ad| Pathname.new(ad).realpath.to_s }
9
- @lib_dirs = options[:lib_dirs].map{ |ld| Pathname.new(ld).realpath.to_s }
10
- @output_dir = Pathname.new(options[:output_dir]).realpath.to_s
8
+ @asset_dirs = options[:asset_dirs].map{ |ad| File.expand_path(ad) }
9
+ @lib_dirs = options[:lib_dirs].map{ |ld| File.expand_path(ld) }
10
+ @output_dir = File.expand_path(options[:output_dir])
11
11
  @base_url = options[:base_url]
12
12
  @style = options[:style]
13
13
  @af = AssetFactory.new(@asset_dirs, @lib_dirs, @output_dir)
@@ -25,13 +25,23 @@ module Skyrocket
25
25
  gem 'listen', '>=0.4.2'
26
26
  require 'listen'
27
27
 
28
- update_public(&block)
28
+ begin
29
+ update_public(&block)
30
+ rescue Exception => e
31
+ puts e.message
32
+ puts e.backtrace
33
+ end
29
34
 
30
- Listen.to(*(@asset_dirs + @lib_dirs)) do |modified, added, removed|
31
- (modified + added).each { |am| process_change(@af.build_asset(am), &block) }
32
- removed.each do |del|
33
- as = @af.build_asset(del)
34
- process_deleted(as.output_path, &block)
35
+ Listen.to(*(@asset_dirs)) do |modified, added, removed|
36
+ begin
37
+ (modified + added).each { |am| process_change(@af.build_asset(am), &block) }
38
+ removed.each do |del|
39
+ as = @af.build_asset(del)
40
+ process_deleted(as.output_path, &block)
41
+ end
42
+ rescue Exception => e
43
+ puts e.message
44
+ puts e.backtrace
35
45
  end
36
46
  end
37
47
  end
@@ -26,7 +26,7 @@ module Skyrocket
26
26
  dir_parts.length.times do |index|
27
27
  neg_index = -1 - index
28
28
  path = dir_parts[0..neg_index].join(File::SEPARATOR)
29
- if Dir.entries(path).empty?
29
+ if Dir.entries(path) == ['.','..']
30
30
  Dir.rmdir(path)
31
31
  else
32
32
  break
@@ -3,10 +3,11 @@ require 'coffee-script'
3
3
  module Skyrocket
4
4
  class CoffeescriptProcessor
5
5
  include Processor
6
+ include DirectiveProcessor
6
7
 
7
8
  def extension; '.coffee'; end
8
9
 
9
- def process(contents)
10
+ def process_contents(contents, name)
10
11
  CoffeeScript.compile(contents)
11
12
  end
12
13
  end
@@ -0,0 +1,17 @@
1
+ module Skyrocket
2
+ class DependencySearcher
3
+ def self.deps(node)
4
+ build_deps(node)
5
+ end
6
+
7
+ def self.build_deps(node, chain = Array.new)
8
+ results = Array.new
9
+ raise CircularReferenceError.new if chain.include?(node.name)
10
+ chain = chain.clone << node.name
11
+ node.children.each do |child|
12
+ results += build_deps(child, chain)
13
+ end
14
+ (results << node).uniq{ |n| n.name }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Skyrocket
2
+ module DirectiveProcessor
3
+
4
+ def preprocess_contents(contents, name)
5
+ asset = asset_factory.from_name(name)
6
+ start = AssetDependency.new(asset, asset_factory)
7
+ deps = DependencySearcher.deps(start)
8
+ deps.map do |r|
9
+ DirectiveReader.read_body(asset_factory.from_name(r.name))
10
+ end.join("\n")
11
+ end
12
+ end
13
+ end
@@ -1,8 +1,5 @@
1
- require 'shellwords'
2
-
3
- # components of this file were borrowed from ruby sprokets, https://github.com/sstephenson/sprockets
4
1
  module Skyrocket
5
- class AssetLoader
2
+ class DirectiveReader
6
3
  HEADER_PATTERN = /
7
4
  \A (
8
5
  (?m:\s*) (
@@ -13,28 +10,30 @@ module Skyrocket
13
10
  )
14
11
  )+
15
12
  /x
16
-
13
+
17
14
  DIRECTIVE_PATTERN = /
18
15
  ^ [\W]* = \s* (\w+.*?) (\*\/)? $
19
16
  /x
20
17
 
21
- attr_reader :headers, :body
22
-
23
- def initialize(filepath)
24
- raw = File.read(filepath)
25
- @headers = raw[HEADER_PATTERN, 0].lines || [""]
26
- @body = $' || data
27
- # Ensure body ends in a new line
28
- @body += "\n" if @body != "" && @body !~ /\n\Z/m
18
+ def self.read_body(asset)
19
+ split_parts(asset)[1]
20
+ end
21
+
22
+ def self.read_required(asset)
23
+ split_parts(asset)[0]
29
24
  end
30
25
 
31
- def requires
32
- @requires ||= @headers.each.map do |line|
26
+ def self.split_parts(asset)
27
+ raw = asset.raw
28
+ headers = raw[HEADER_PATTERN, 0].to_s.lines || [""]
29
+ body = $' || raw
30
+ headers = headers.each.map do |line|
33
31
  if directive = line[DIRECTIVE_PATTERN, 1]
34
32
  name, arg = Shellwords.shellwords(directive)
35
33
  arg if name == 'require'
36
34
  end
37
35
  end.compact
36
+ [headers, body]
38
37
  end
39
38
  end
40
39
  end
@@ -3,7 +3,6 @@ module Skyrocket
3
3
  include Processor
4
4
 
5
5
  def extension; ''; end
6
- def process(contents); contents; end;
7
-
6
+ def process_contents(contents, name); contents; end;
8
7
  end
9
8
  end
@@ -6,7 +6,7 @@ module Skyrocket
6
6
 
7
7
  def extension; '.erb'; end
8
8
 
9
- def process(contents)
9
+ def process_contents(contents, name)
10
10
  template = ERB.new(contents, nil, '-', '@out')
11
11
  results = template.result(get_binding { |name=nil| '' })
12
12
  if(@layout)
@@ -16,7 +16,7 @@ module Skyrocket
16
16
  if name == nil
17
17
  results
18
18
  else
19
- @content_for[name.to_sym]
19
+ cf[name.to_sym] || ''
20
20
  end
21
21
  end)
22
22
  end
@@ -40,7 +40,7 @@ module Skyrocket
40
40
  "<script src=\"#{resolve(path)}\"></script>"
41
41
  end
42
42
 
43
- def link_to(content, path, options)
43
+ def link_to(content, path, options = Hash.new)
44
44
  opt_s = to_opt_s(options)
45
45
  "<a href=\"#{resolve(path)}\"#{opt_s}>#{content}</a>"
46
46
  end
@@ -62,8 +62,7 @@ module Skyrocket
62
62
  @out = ''
63
63
  results = yield.chomp
64
64
  @out = old
65
- @content_for ||= Hash.new
66
- @content_for[key.to_sym] = results
65
+ cf[key.to_sym] = results
67
66
  nil
68
67
  end
69
68
 
@@ -76,7 +75,7 @@ module Skyrocket
76
75
  if name == nil
77
76
  results
78
77
  else
79
- @content_for[name.to_sym]
78
+ cf[name.to_sym]
80
79
  end
81
80
  end)
82
81
  @out = old
@@ -88,10 +87,19 @@ module Skyrocket
88
87
  if(path.start_with?("/") || path =~ /^\w+:\/\//)
89
88
  path
90
89
  else
91
- base_url == '/' ? "#{base_url}#{path}" : "#{base_url}/#{path}"
90
+ if asset_factory.name_exist?(path)
91
+ on = asset_factory.from_name(path).output_name
92
+ base_url == '/' ? "#{base_url}#{on}" : "#{base_url}/#{on}"
93
+ else
94
+ base_url == '/' ? "#{base_url}#{path}" : "#{base_url}/#{path}"
95
+ end
92
96
  end
93
97
  end
94
98
 
99
+ def cf
100
+ @content_for ||= Hash.new
101
+ end
102
+
95
103
  def to_opt_s(options)
96
104
  opt_s = options.keys.map{ |k| "#{k}=\"#{options[k]}\"" }.join(' ')
97
105
  opt_s = " " + opt_s unless opt_s == ''
@@ -1,5 +1,6 @@
1
1
  module Skyrocket
2
2
  class AssetNotFoundError < Exception; end;
3
+ class CircularReferenceError < Exception; end;
3
4
  class PathNotInAssetsError < Exception; end;
4
5
  class NoValidProcessorError < Exception; end;
5
6
  end
@@ -0,0 +1,13 @@
1
+ module Skyrocket
2
+ class JavascriptProcessor
3
+ include Processor
4
+ include DirectiveProcessor
5
+
6
+ def extension; '.js'; end
7
+ def post_process_name(file); file.chomp; end
8
+
9
+ def process_contents(contents, name)
10
+ contents
11
+ end
12
+ end
13
+ end
@@ -6,7 +6,7 @@ module Skyrocket
6
6
 
7
7
  def extension; '.less'; end
8
8
 
9
- def process(contents)
9
+ def process_contents(contents, name)
10
10
  tree = parser.parse(contents)
11
11
  tree.to_css
12
12
  end
@@ -4,8 +4,9 @@ module Skyrocket
4
4
  raise NotImplimentedError.new("must impliment #{caller[0][/`.*'/][1..-2]} for #{self.class.name}")
5
5
  end
6
6
 
7
- def process(contents)
8
- raise NotImplimentedError.new("must impliment #{caller[0][/`.*'/][1..-2]} for #{self.class.name}")
7
+ def process(contents, name)
8
+ contents = preprocess_contents(contents, name) if self.respond_to?(:preprocess_contents)
9
+ process_contents(contents, name)
9
10
  end
10
11
 
11
12
  def process?(file)
@@ -1,7 +1,7 @@
1
1
  module Skyrocket
2
2
  class ProcessorFactory
3
3
 
4
- PROCESSORS = [ CoffeescriptProcessor, ErbProcessor, LessProcessor, EmptyProcessor ]
4
+ PROCESSORS = [ CoffeescriptProcessor, ErbProcessor, JavascriptProcessor, LessProcessor, EmptyProcessor ]
5
5
 
6
6
  def process?(filename)
7
7
  PROCESSORS.each do |processor|
@@ -1,3 +1,3 @@
1
1
  module Skyrocket
2
- VERSION = "0.0.1"
3
- end
2
+ VERSION = "0.0.2"
3
+ end
data/lib/skyrocket.rb CHANGED
@@ -2,18 +2,24 @@ require 'skyrocket/version'
2
2
 
3
3
  module Skyrocket
4
4
  autoload :Asset, "skyrocket/asset"
5
+ autoload :AssetDependency, "skyrocket/asset_dependency"
5
6
  autoload :AssetLocator, "skyrocket/asset_locator"
6
7
  autoload :AssetFactory, "skyrocket/asset_factory"
7
8
  autoload :AssetManager, "skyrocket/asset_manager"
8
9
  autoload :AssetWriter, "skyrocket/asset_writer"
9
10
  autoload :CoffeescriptProcessor, "skyrocket/coffeescript_processor"
11
+ autoload :DependencySearcher, "skyrocket/dependency_searcher"
12
+ autoload :DirectiveProcessor, "skyrocket/directive_processor"
13
+ autoload :DirectiveReader, "skyrocket/directive_reader"
10
14
  autoload :EmptyProcessor, "skyrocket/empty_processor"
11
15
  autoload :ErbProcessor, "skyrocket/erb_processor"
16
+ autoload :JavascriptProcessor, "skyrocket/javascript_processor"
12
17
  autoload :LessProcessor, "skyrocket/less_processor"
13
18
  autoload :Processor, "skyrocket/processor"
14
19
  autoload :ProcessorFactory, "skyrocket/processor_factory"
15
20
 
16
21
  autoload :AssetNotFoundError, "skyrocket/errors"
22
+ autoload :CircularReferenceError, "skyrocket/errors"
17
23
  autoload :NoValidProcessorError, "skyrocket/errors"
18
24
  autoload :PathNotInAssetsError, "skyrocket/errors"
19
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skyrocket
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-09 00:00:00.000000000Z
12
+ date: 2012-06-25 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: therubyracer
16
- requirement: &70197185909260 !ruby/object:Gem::Requirement
16
+ requirement: &70096236593860 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70197185909260
24
+ version_requirements: *70096236593860
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: less
27
- requirement: &70197185908840 !ruby/object:Gem::Requirement
27
+ requirement: &70096236593440 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70197185908840
35
+ version_requirements: *70096236593440
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: coffee-script
38
- requirement: &70197185908420 !ruby/object:Gem::Requirement
38
+ requirement: &70096236593020 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70197185908420
46
+ version_requirements: *70096236593020
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rack-test
49
- requirement: &70197185908000 !ruby/object:Gem::Requirement
49
+ requirement: &70096236592600 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70197185908000
57
+ version_requirements: *70096236592600
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rspec
60
- requirement: &70197185907500 !ruby/object:Gem::Requirement
60
+ requirement: &70096236592100 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '2.0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70197185907500
68
+ version_requirements: *70096236592100
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
- requirement: &70197185907080 !ruby/object:Gem::Requirement
71
+ requirement: &70096236591680 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,11 +76,11 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70197185907080
79
+ version_requirements: *70096236591680
80
80
  description: An alternative and opinionated static content/ asset management tool
81
81
  that will concatenate/ render javascript, coffeescript, css, less, erb and html
82
82
  email:
83
- - michael@raveld.com
83
+ - michael.m.wasser@gmail.com
84
84
  executables:
85
85
  - skyrocket
86
86
  extensions: []
@@ -89,25 +89,29 @@ files:
89
89
  - README.md
90
90
  - LICENSE
91
91
  - lib/skyrocket/asset.rb
92
+ - lib/skyrocket/asset_dependency.rb
92
93
  - lib/skyrocket/asset_factory.rb
93
- - lib/skyrocket/asset_loader.rb
94
94
  - lib/skyrocket/asset_locator.rb
95
95
  - lib/skyrocket/asset_manager.rb
96
96
  - lib/skyrocket/asset_writer.rb
97
97
  - lib/skyrocket/cmd.rb
98
98
  - lib/skyrocket/coffeescript_processor.rb
99
+ - lib/skyrocket/dependency_searcher.rb
99
100
  - lib/skyrocket/dir_ext.rb
101
+ - lib/skyrocket/directive_processor.rb
102
+ - lib/skyrocket/directive_reader.rb
100
103
  - lib/skyrocket/empty_processor.rb
101
104
  - lib/skyrocket/erb_processor.rb
102
105
  - lib/skyrocket/errors.rb
103
106
  - lib/skyrocket/file_ext.rb
107
+ - lib/skyrocket/javascript_processor.rb
104
108
  - lib/skyrocket/less_processor.rb
105
109
  - lib/skyrocket/processor.rb
106
110
  - lib/skyrocket/processor_factory.rb
107
111
  - lib/skyrocket/version.rb
108
112
  - lib/skyrocket.rb
109
113
  - bin/skyrocket
110
- homepage: http://www.raveld.com/
114
+ homepage: http://www.mikewasser.com/
111
115
  licenses: []
112
116
  post_install_message:
113
117
  rdoc_options: []