jsus 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,4 +1,10 @@
1
1
  = Jsus Changelog
2
+ == Version 0.1.7
3
+ * Added caching to Jsus::Pool#lookup_direct_dependencies. This addresses some performance
4
+ issues appeared in 0.1.6
5
+ * Added --benchmark flag to jsus which shows total compile and total execution time
6
+ * Added --generate-includes option to jsus. If enabled, generates a set of includes into
7
+ includes.js file.
2
8
  == Version 0.1.6
3
9
  * Fixed an issue with jsus not including internal dependencies for external dependencies.
4
10
  First robust solution handles this via Pool and eager dependency load.
data/Manifest CHANGED
@@ -63,5 +63,4 @@ spec/lib/jsus/pool_spec.rb
63
63
  spec/lib/jsus/source_file_spec.rb
64
64
  spec/lib/jsus/tag_spec.rb
65
65
  spec/shared/class_stubs.rb
66
- spec/spec.opts
67
66
  spec/spec_helper.rb
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
- Echoe.new('jsus', '0.1.6') do |g|
4
+ Echoe.new('jsus', '0.1.7') do |g|
5
5
  g.description = "Packager/compiler for js-files that resolves dependencies and can compile everything into one file, providing all the neccessary meta-info."
6
6
  g.url = "http://github.com/markiz/jsus"
7
7
  g.author = "Markiz, idea by Inviz (http://github.com/Inviz)"
data/TODO CHANGED
@@ -1,5 +1,2 @@
1
- * External dependencies mechanism
2
1
  * Disallow circular dependencies
3
- * Package extensions (e.g. package Core.ext that would be able to extend package Core)
4
- * Rails integration
5
- * Documentation, RDocs
2
+ * Rails integration
data/bin/jsus CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'rubygems'
3
3
  require 'jsus'
4
+ start_time = Time.now
4
5
  require 'choice'
5
6
 
6
7
 
@@ -36,16 +37,55 @@ Choice.options do
36
37
  "with tree structure of your package."
37
38
  end
38
39
 
40
+ option "generate_includes", :required => false do
41
+ short "-g"
42
+ long "--generate-includes=[ROOT]"
43
+ desc "Generates includes.js file that you may use for ad-hoc requiring" <<
44
+ "of the needed javascripts. Defaults to output_directory."
45
+ end
46
+
47
+ option "benchmark", :required => false do
48
+ long "--benchmark"
49
+ short "-b"
50
+ desc "Performs a benchmark, indicating how much time you needed to" <<
51
+ "compile the package"
52
+ end
53
+
39
54
  end
40
55
 
41
56
 
42
57
  pool = if Choice.choices[:dependencies]
43
58
  Jsus::Pool.new(Choice.choices[:dependencies])
44
59
  end
60
+ compile_start_time = Time.now
45
61
  package = Jsus::Package.new(Choice.choices[:input_directory], :pool => pool)
46
62
  package.include_dependencies! if Choice.choices[:dependencies]
47
63
  package.include_extensions! if Choice.choices[:dependencies]
48
64
  output_directory = Choice.choices[:output_directory]
49
65
  package.compile(output_directory)
50
66
  package.generate_scripts_info(output_directory) unless Choice.choices[:without_scripts_info]
51
- package.generate_tree(output_directory) unless Choice.choices[:without_tree]
67
+ package.generate_tree(output_directory) unless Choice.choices[:without_tree]
68
+
69
+
70
+ # Hack, hack, hack :[
71
+ if Choice.choices[:generate_includes]
72
+ root = Choice.choices[:generate_includes] == true ? Choice.choices[:output_directory] : Choice.choices[:generate_includes]
73
+ File.open(File.join(Choice.choices[:output_directory], "includes.js"), "w") do |f|
74
+ c = Jsus::Container.new(*(package.source_files.to_a + package.linked_external_dependencies.to_a))
75
+ script = %{(function(prefix) {
76
+ var sources = %sources%;
77
+ for (var i = 0, j = sources.length; i < j; i++) document.write('<scr' + 'ipt src="' + (prefix || '') + sources[i] + "></script>");
78
+ })(window.prefix);}.sub("%sources%", JSON.pretty_generate(c.required_files(root)))
79
+ f.puts script
80
+ end
81
+ end
82
+
83
+
84
+
85
+ finish_time = Time.now
86
+
87
+
88
+ if Choice.choices[:benchmark]
89
+ puts "Total execution time: #{(finish_time - start_time).round(3)}s"
90
+ puts "Total compilation time: #{(finish_time - compile_start_time).round(3)}s"
91
+ end
@@ -2,17 +2,17 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{jsus}
5
- s.version = "0.1.6"
5
+ s.version = "0.1.7"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Markiz, idea by Inviz (http://github.com/Inviz)"]
9
- s.date = %q{2010-08-25}
9
+ s.date = %q{2010-08-30}
10
10
  s.default_executable = %q{jsus}
11
11
  s.description = %q{Packager/compiler for js-files that resolves dependencies and can compile everything into one file, providing all the neccessary meta-info.}
12
12
  s.email = %q{markizko@gmail.com}
13
13
  s.executables = ["jsus"]
14
14
  s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "TODO", "bin/jsus", "lib/jsus.rb", "lib/jsus/container.rb", "lib/jsus/package.rb", "lib/jsus/packager.rb", "lib/jsus/pool.rb", "lib/jsus/source_file.rb", "lib/jsus/tag.rb"]
15
- s.files = ["CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "TODO", "bin/jsus", "jsus.gemspec", "lib/jsus.rb", "lib/jsus/container.rb", "lib/jsus/package.rb", "lib/jsus/packager.rb", "lib/jsus/pool.rb", "lib/jsus/source_file.rb", "lib/jsus/tag.rb", "spec/data/Basic/README", "spec/data/Basic/app/javascripts/Orwik/Source/Library/Color.js", "spec/data/Basic/app/javascripts/Orwik/Source/Widget/Input/Input.Color.js", "spec/data/Basic/app/javascripts/Orwik/Source/Widget/Input/Input.js", "spec/data/Basic/app/javascripts/Orwik/Source/Widget/Widget.js", "spec/data/Basic/app/javascripts/Orwik/package.yml", "spec/data/ChainDependencies/app/javascripts/Class/Source/Class.js", "spec/data/ChainDependencies/app/javascripts/Class/package.yml", "spec/data/ChainDependencies/app/javascripts/Hash/Source/Hash.js", "spec/data/ChainDependencies/app/javascripts/Hash/package.yml", "spec/data/ChainDependencies/app/javascripts/Mash/Source/Mash.js", "spec/data/ChainDependencies/app/javascripts/Mash/package.yml", "spec/data/Extensions/app/javascripts/Core/Source/Class.js", "spec/data/Extensions/app/javascripts/Core/package.yml", "spec/data/Extensions/app/javascripts/Orwik/Extensions/Class.js", "spec/data/Extensions/app/javascripts/Orwik/package.yml", "spec/data/ExternalDependencies/app/javascripts/Orwik/Source/Test.js", "spec/data/ExternalDependencies/app/javascripts/Orwik/package.yml", "spec/data/ExternalInternalDependencies/Core/Class/Source/Class.js", "spec/data/ExternalInternalDependencies/Core/Class/Source/Type.js", "spec/data/ExternalInternalDependencies/Core/Class/package.yml", "spec/data/ExternalInternalDependencies/Core/Hash/Source/Hash.js", "spec/data/ExternalInternalDependencies/Core/Hash/package.yml", "spec/data/ExternalInternalDependencies/Core/Mash/Source/Mash.js", "spec/data/ExternalInternalDependencies/Core/Mash/package.yml", "spec/data/ExternalInternalDependencies/Test/Source/Library/Color.js", "spec/data/ExternalInternalDependencies/Test/Source/Widget/Input/Input.Color.js", "spec/data/ExternalInternalDependencies/Test/Source/Widget/Input/Input.js", "spec/data/ExternalInternalDependencies/Test/Source/Widget/Widget.js", "spec/data/ExternalInternalDependencies/Test/package.yml", "spec/data/OutsideDependencies/README", "spec/data/OutsideDependencies/app/javascripts/Core/Source/Class/Class.Extras.js", "spec/data/OutsideDependencies/app/javascripts/Core/Source/Class/Class.js", "spec/data/OutsideDependencies/app/javascripts/Core/Source/Native/Hash.js", "spec/data/OutsideDependencies/app/javascripts/Core/package.yml", "spec/data/OutsideDependencies/app/javascripts/Orwik/Source/Library/Color.js", "spec/data/OutsideDependencies/app/javascripts/Orwik/Source/Widget/Input/Input.Color.js", "spec/data/OutsideDependencies/app/javascripts/Orwik/Source/Widget/Input/Input.js", "spec/data/OutsideDependencies/app/javascripts/Orwik/Source/Widget/Widget.js", "spec/data/OutsideDependencies/app/javascripts/Orwik/package.yml", "spec/data/bad_test_source_one.js", "spec/data/bad_test_source_two.js", "spec/data/test_source_one.js", "spec/lib/jsus/container_spec.rb", "spec/lib/jsus/package_spec.rb", "spec/lib/jsus/packager_spec.rb", "spec/lib/jsus/pool_spec.rb", "spec/lib/jsus/source_file_spec.rb", "spec/lib/jsus/tag_spec.rb", "spec/shared/class_stubs.rb", "spec/spec.opts", "spec/spec_helper.rb"]
15
+ s.files = ["CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "TODO", "bin/jsus", "lib/jsus.rb", "lib/jsus/container.rb", "lib/jsus/package.rb", "lib/jsus/packager.rb", "lib/jsus/pool.rb", "lib/jsus/source_file.rb", "lib/jsus/tag.rb", "spec/data/Basic/README", "spec/data/Basic/app/javascripts/Orwik/Source/Library/Color.js", "spec/data/Basic/app/javascripts/Orwik/Source/Widget/Input/Input.Color.js", "spec/data/Basic/app/javascripts/Orwik/Source/Widget/Input/Input.js", "spec/data/Basic/app/javascripts/Orwik/Source/Widget/Widget.js", "spec/data/Basic/app/javascripts/Orwik/package.yml", "spec/data/ChainDependencies/app/javascripts/Class/Source/Class.js", "spec/data/ChainDependencies/app/javascripts/Class/package.yml", "spec/data/ChainDependencies/app/javascripts/Hash/Source/Hash.js", "spec/data/ChainDependencies/app/javascripts/Hash/package.yml", "spec/data/ChainDependencies/app/javascripts/Mash/Source/Mash.js", "spec/data/ChainDependencies/app/javascripts/Mash/package.yml", "spec/data/Extensions/app/javascripts/Core/Source/Class.js", "spec/data/Extensions/app/javascripts/Core/package.yml", "spec/data/Extensions/app/javascripts/Orwik/Extensions/Class.js", "spec/data/Extensions/app/javascripts/Orwik/package.yml", "spec/data/ExternalDependencies/app/javascripts/Orwik/Source/Test.js", "spec/data/ExternalDependencies/app/javascripts/Orwik/package.yml", "spec/data/ExternalInternalDependencies/Core/Class/Source/Class.js", "spec/data/ExternalInternalDependencies/Core/Class/Source/Type.js", "spec/data/ExternalInternalDependencies/Core/Class/package.yml", "spec/data/ExternalInternalDependencies/Core/Hash/Source/Hash.js", "spec/data/ExternalInternalDependencies/Core/Hash/package.yml", "spec/data/ExternalInternalDependencies/Core/Mash/Source/Mash.js", "spec/data/ExternalInternalDependencies/Core/Mash/package.yml", "spec/data/ExternalInternalDependencies/Test/Source/Library/Color.js", "spec/data/ExternalInternalDependencies/Test/Source/Widget/Input/Input.Color.js", "spec/data/ExternalInternalDependencies/Test/Source/Widget/Input/Input.js", "spec/data/ExternalInternalDependencies/Test/Source/Widget/Widget.js", "spec/data/ExternalInternalDependencies/Test/package.yml", "spec/data/OutsideDependencies/README", "spec/data/OutsideDependencies/app/javascripts/Core/Source/Class/Class.Extras.js", "spec/data/OutsideDependencies/app/javascripts/Core/Source/Class/Class.js", "spec/data/OutsideDependencies/app/javascripts/Core/Source/Native/Hash.js", "spec/data/OutsideDependencies/app/javascripts/Core/package.yml", "spec/data/OutsideDependencies/app/javascripts/Orwik/Source/Library/Color.js", "spec/data/OutsideDependencies/app/javascripts/Orwik/Source/Widget/Input/Input.Color.js", "spec/data/OutsideDependencies/app/javascripts/Orwik/Source/Widget/Input/Input.js", "spec/data/OutsideDependencies/app/javascripts/Orwik/Source/Widget/Widget.js", "spec/data/OutsideDependencies/app/javascripts/Orwik/package.yml", "spec/data/bad_test_source_one.js", "spec/data/bad_test_source_two.js", "spec/data/test_source_one.js", "spec/lib/jsus/container_spec.rb", "spec/lib/jsus/package_spec.rb", "spec/lib/jsus/packager_spec.rb", "spec/lib/jsus/pool_spec.rb", "spec/lib/jsus/source_file_spec.rb", "spec/lib/jsus/tag_spec.rb", "spec/shared/class_stubs.rb", "spec/spec_helper.rb", "jsus.gemspec"]
16
16
  s.homepage = %q{http://github.com/markiz/jsus}
17
17
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Jsus", "--main", "README"]
18
18
  s.require_paths = ["lib"]
@@ -8,6 +8,7 @@ require 'rgl/adjacency'
8
8
  require 'rgl/topsort'
9
9
 
10
10
  require 'fileutils'
11
+ require 'pathname'
11
12
 
12
13
  require 'jsus/source_file'
13
14
  require 'jsus/package'
@@ -59,6 +59,17 @@ module Jsus
59
59
  self
60
60
  end
61
61
 
62
+ # Lists all the required files (dependencies and extensions) for
63
+ # the sources in the container.
64
+ def required_files(root = nil)
65
+ files = sources.map {|s| s.required_files }.flatten
66
+ if root
67
+ root = Pathname.new(File.expand_path(root))
68
+ files = files.map {|f| Pathname.new(File.expand_path(f)).relative_path_from(root).to_s }
69
+ end
70
+ files
71
+ end
72
+
62
73
  def inspect # :nodoc:
63
74
  "#<#{self.class.name}:#{self.object_id} #{self.sources.inspect}>"
64
75
  end
@@ -26,6 +26,7 @@ module Jsus
26
26
  Package.new(File.dirname(package_path), :pool => self)
27
27
  end
28
28
  end
29
+ flush_cache!
29
30
  end
30
31
 
31
32
 
@@ -123,15 +124,30 @@ module Jsus
123
124
  self
124
125
  end
125
126
 
127
+ #
128
+ # Drops any cached info
129
+ #
130
+ def flush_cache!
131
+ @cached_dependencies = {}
132
+ end
133
+
126
134
  (Array.instance_methods - self.instance_methods).each {|m| delegate m, :to => :sources }
127
135
  # Private API
128
136
 
129
137
  #
130
138
  # Looks up direct dependencies for the given source_file or provides tag.
131
139
  # You probably will find yourself using #include_dependencies instead.
140
+ # This method caches results locally, use flush_cache! to drop.
132
141
  #
133
142
  def lookup_direct_dependencies(source_or_source_key)
134
143
  source = lookup(source_or_source_key)
144
+ @cached_dependencies[source] ||= lookup_direct_dependencies!(source)
145
+ end
146
+
147
+ #
148
+ # Performs the actual lookup for #lookup_direct_dependencies
149
+ #
150
+ def lookup_direct_dependencies!(source)
135
151
  result = source ? (source.dependencies + source.external_dependencies).map {|d| lookup(d)} : []
136
152
  Container.new(*result)
137
153
  end
@@ -169,7 +169,7 @@ module Jsus
169
169
  #
170
170
  # Returns an array of files required by this files including all the filenames for extensions.
171
171
  # SourceFile filename always goes first, all the extensions are unordered.
172
- #
172
+ #
173
173
  def required_files
174
174
  [filename, extensions.map {|e| e.filename}].flatten
175
175
  end
@@ -2,9 +2,9 @@ require 'spec_helper'
2
2
 
3
3
 
4
4
  describe Jsus::Container do
5
- let(:simple_source) { Source.new(:provides => [0], :dependencies => [], :content => "// simple") }
6
- let(:another_simple_source) { Source.new(:provides => [1], :dependencies => [], :content => "// simple 2") }
7
- let(:dependant_source) { Source.new(:provides => [3], :dependencies => [0], :content => "// simple 3") }
5
+ let(:simple_source) { Source.new(:provides => [0], :dependencies => [], :content => "// simple", :filename => "/home/jsus/simple.js") }
6
+ let(:another_simple_source) { Source.new(:provides => [1], :dependencies => [], :content => "// simple 2", :filename => "/home/jsus/other/simple2.js") }
7
+ let(:dependant_source) { Source.new(:provides => [3], :dependencies => [0], :content => "// simple 3", :filename => "/home/dependencies/simple3.js") }
8
8
 
9
9
  let(:simple_container) { Jsus::Container.new(simple_source, another_simple_source) }
10
10
  let(:container_with_dependency) { Jsus::Container.new(dependant_source, simple_source) }
@@ -53,4 +53,15 @@ describe Jsus::Container do
53
53
  }.should_not raise_error
54
54
  end
55
55
  end
56
+
57
+ describe "#required_files" do
58
+ subject { container_with_dependency }
59
+ it "should return includes for all the sources" do
60
+ subject.required_files.should == [simple_source.filename, dependant_source.filename]
61
+ end
62
+
63
+ it "should generate routes from given root" do
64
+ subject.required_files("/home/jsus").should == ["simple.js", "../dependencies/simple3.js"]
65
+ end
66
+ end
56
67
  end
@@ -5,12 +5,17 @@ class Source
5
5
  attr_accessor :provides
6
6
  attr_accessor :dependencies
7
7
  attr_accessor :content
8
+ attr_accessor :filename
8
9
 
9
10
  def initialize(options = {})
10
11
  options.each do |attr, value|
11
12
  send("#{attr}=", value)
12
13
  end
13
14
  end
15
+
16
+ def required_files
17
+ [filename]
18
+ end
14
19
  end
15
20
 
16
21
 
@@ -1,5 +1,5 @@
1
1
  require 'rubygems'
2
- require 'spec'
2
+ require 'rspec'
3
3
  # require 'ruby-debug'
4
4
 
5
5
  $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), ".."))
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsus
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 1
9
- - 6
10
- version: 0.1.6
8
+ - 7
9
+ version: 0.1.7
11
10
  platform: ruby
12
11
  authors:
13
12
  - Markiz, idea by Inviz (http://github.com/Inviz)
@@ -15,8 +14,8 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-08-25 00:00:00 +04:00
19
- default_executable:
17
+ date: 2010-08-30 00:00:00 +04:00
18
+ default_executable: jsus
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: activesupport
@@ -26,7 +25,6 @@ dependencies:
26
25
  requirements:
27
26
  - - ">="
28
27
  - !ruby/object:Gem::Version
29
- hash: 3
30
28
  segments:
31
29
  - 0
32
30
  version: "0"
@@ -40,7 +38,6 @@ dependencies:
40
38
  requirements:
41
39
  - - ">="
42
40
  - !ruby/object:Gem::Version
43
- hash: 3
44
41
  segments:
45
42
  - 0
46
43
  version: "0"
@@ -54,7 +51,6 @@ dependencies:
54
51
  requirements:
55
52
  - - ">="
56
53
  - !ruby/object:Gem::Version
57
- hash: 3
58
54
  segments:
59
55
  - 0
60
56
  version: "0"
@@ -68,7 +64,6 @@ dependencies:
68
64
  requirements:
69
65
  - - ">="
70
66
  - !ruby/object:Gem::Version
71
- hash: 3
72
67
  segments:
73
68
  - 0
74
69
  version: "0"
@@ -82,7 +77,6 @@ dependencies:
82
77
  requirements:
83
78
  - - ">="
84
79
  - !ruby/object:Gem::Version
85
- hash: 3
86
80
  segments:
87
81
  - 0
88
82
  version: "0"
@@ -115,7 +109,6 @@ files:
115
109
  - Rakefile
116
110
  - TODO
117
111
  - bin/jsus
118
- - jsus.gemspec
119
112
  - lib/jsus.rb
120
113
  - lib/jsus/container.rb
121
114
  - lib/jsus/package.rb
@@ -173,8 +166,8 @@ files:
173
166
  - spec/lib/jsus/source_file_spec.rb
174
167
  - spec/lib/jsus/tag_spec.rb
175
168
  - spec/shared/class_stubs.rb
176
- - spec/spec.opts
177
169
  - spec/spec_helper.rb
170
+ - jsus.gemspec
178
171
  has_rdoc: true
179
172
  homepage: http://github.com/markiz/jsus
180
173
  licenses: []
@@ -194,7 +187,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
194
187
  requirements:
195
188
  - - ">="
196
189
  - !ruby/object:Gem::Version
197
- hash: 3
198
190
  segments:
199
191
  - 0
200
192
  version: "0"
@@ -203,7 +195,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
203
195
  requirements:
204
196
  - - ">="
205
197
  - !ruby/object:Gem::Version
206
- hash: 11
207
198
  segments:
208
199
  - 1
209
200
  - 2
@@ -1,4 +0,0 @@
1
- --colour
2
- --format progress
3
- --loadby mtime
4
- --reverse