jsus 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,5 +1,14 @@
1
1
  = Jsus Changelog
2
2
 
3
+ == Version 0.1.3
4
+ * Updated Pool class with dependency resolvers
5
+ * Added Package#include_external_dependencies!
6
+ * Included external dependencies won't show in its Package#dependencies
7
+ * Same for external provides
8
+
9
+ * Revamped command-line interface for jsus utility
10
+ * Added dependencies compilation
11
+
3
12
  == Version 0.1.2
4
13
  * Removed Bundler class which seemed like totally unneccessary
5
14
  * jsus command-line utility now works in single-project mode
data/Manifest CHANGED
@@ -19,6 +19,14 @@ spec/data/Basic/app/javascripts/Orwik/Source/Widget/Input/Input.Color.js
19
19
  spec/data/Basic/app/javascripts/Orwik/Source/Widget/Input/Input.js
20
20
  spec/data/Basic/app/javascripts/Orwik/Source/Widget/Widget.js
21
21
  spec/data/Basic/app/javascripts/Orwik/package.yml
22
+ spec/data/ChainDependencies/app/javascripts/Class/Source/Class.js
23
+ spec/data/ChainDependencies/app/javascripts/Class/package.yml
24
+ spec/data/ChainDependencies/app/javascripts/Hash/Source/Hash.js
25
+ spec/data/ChainDependencies/app/javascripts/Hash/package.yml
26
+ spec/data/ChainDependencies/app/javascripts/Mash/Source/Mash.js
27
+ spec/data/ChainDependencies/app/javascripts/Mash/package.yml
28
+ spec/data/ExternalDependencies/app/javascripts/Orwik/Source/Test.js
29
+ spec/data/ExternalDependencies/app/javascripts/Orwik/package.yml
22
30
  spec/data/OutsideDependencies/README
23
31
  spec/data/OutsideDependencies/app/javascripts/Core/Source/Class/Class.Extras.js
24
32
  spec/data/OutsideDependencies/app/javascripts/Core/Source/Class/Class.js
data/Rakefile CHANGED
@@ -1,13 +1,13 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
  require 'echoe'
4
- Echoe.new('jsus', '0.1.2') do |g|
4
+ Echoe.new('jsus', '0.1.3') 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)"
8
8
  g.email = "markizko@gmail.com"
9
9
  g.ignore_pattern = ["nbproject/**/*", 'spec/*/public/**/*']
10
- g.runtime_dependencies = ["activesupport", "json_pure", "rgl"]
10
+ g.runtime_dependencies = ["activesupport", "json_pure", "rgl", "optiflag"]
11
11
  g.development_dependencies = ["rake"]
12
12
  g.use_sudo = false
13
13
  end
data/bin/jsus CHANGED
@@ -1,13 +1,47 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'rubygems'
3
3
  require 'jsus'
4
+ require 'optiflag'
4
5
 
5
- unless ARGV.length == 2
6
- puts "SYNOPSYS: jsus <input_directory_with_package> <output_directory_for_package>"
7
- exit
8
- else
9
- package = Jsus::Package.new(ARGV[0])
10
- package.compile(ARGV[1])
11
- package.generate_scripts_info(ARGV[1])
12
- package.generate_tree(ARGV[1])
6
+ module JsusCL
7
+ extend OptiFlagSet
8
+
9
+ flag "input_directory" do
10
+ alternate_forms "i"
11
+ description "Path to directory containing your package to compile."
12
+ end
13
+
14
+ flag "output_directory" do
15
+ alternate_forms "o"
16
+ description "Path to directory to output the compiled package."
17
+ end
18
+
19
+ optional_flag "dependencies" do
20
+ alternate_forms "d"
21
+ description "Path to directory containing packages this package relies on. " <<
22
+ "If set, all the packages will be compiled into a single file"
23
+ end
24
+
25
+ optional_flag "scripts_info" do
26
+ default "yes"
27
+ description "Generates scripts.json file with general info about your package"
28
+ value_in_set ["yes", "no"]
29
+ end
30
+
31
+ optional_flag "tree_info" do
32
+ default "yes"
33
+ description "Generates scripts.json file with tree structure of your package"
34
+ value_in_set ["yes", "no"]
35
+ end
36
+
37
+ and_process!
38
+ end
39
+
40
+ pool = if JsusCL.flags.dependencies?
41
+ Jsus::Pool.new(JsusCL.flags.dependencies)
13
42
  end
43
+ package = Jsus::Package.new(JsusCL.flags.input_directory, :pool => pool)
44
+ package.include_dependencies! if JsusCL.flags.dependencies?
45
+ package.compile(JsusCL.flags.output_directory)
46
+ package.generate_scripts_info(JsusCL.flags.output_directory) if JsusCL.flags.scripts_info == "yes"
47
+ package.generate_tree(JsusCL.flags.output_directory) if JsusCL.flags.scripts_info == "yes"
@@ -2,17 +2,17 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{jsus}
5
- s.version = "0.1.2"
5
+ s.version = "0.1.3"
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-06-04}
9
+ s.date = %q{2010-06-06}
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/topsortable.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/topsortable.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/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/topsortable_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", "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/topsortable.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/ExternalDependencies/app/javascripts/Orwik/Source/Test.js", "spec/data/ExternalDependencies/app/javascripts/Orwik/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/topsortable_spec.rb", "spec/shared/class_stubs.rb", "spec/spec.opts", "spec/spec_helper.rb"]
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"]
@@ -28,17 +28,20 @@ Gem::Specification.new do |s|
28
28
  s.add_runtime_dependency(%q<activesupport>, [">= 0"])
29
29
  s.add_runtime_dependency(%q<json_pure>, [">= 0"])
30
30
  s.add_runtime_dependency(%q<rgl>, [">= 0"])
31
+ s.add_runtime_dependency(%q<optiflag>, [">= 0"])
31
32
  s.add_development_dependency(%q<rake>, [">= 0"])
32
33
  else
33
34
  s.add_dependency(%q<activesupport>, [">= 0"])
34
35
  s.add_dependency(%q<json_pure>, [">= 0"])
35
36
  s.add_dependency(%q<rgl>, [">= 0"])
37
+ s.add_dependency(%q<optiflag>, [">= 0"])
36
38
  s.add_dependency(%q<rake>, [">= 0"])
37
39
  end
38
40
  else
39
41
  s.add_dependency(%q<activesupport>, [">= 0"])
40
42
  s.add_dependency(%q<json_pure>, [">= 0"])
41
43
  s.add_dependency(%q<rgl>, [">= 0"])
44
+ s.add_dependency(%q<optiflag>, [">= 0"])
42
45
  s.add_dependency(%q<rake>, [">= 0"])
43
46
  end
44
47
  end
@@ -11,13 +11,8 @@ require 'jsus/topsortable'
11
11
  require 'jsus/source_file'
12
12
  require 'jsus/container'
13
13
  require 'jsus/packager'
14
- require 'jsus/pool'
15
14
  require 'jsus/package'
15
+ require 'jsus/pool'
16
16
 
17
17
  module Jsus
18
- # Shortcut for Bundler.new
19
- def self.new(*args, &block)
20
- Bundler.new(*args, &block)
21
- end
22
-
23
18
  end
@@ -8,18 +8,33 @@ module Jsus
8
8
  end
9
9
  end
10
10
 
11
+
12
+ # PRO TIP: #<< sorts upon every invokation
13
+ # #push doesn't
11
14
  def <<(source)
15
+ push(source)
16
+ sort!
17
+ end
18
+
19
+ def push(source)
12
20
  if source
13
21
  if source.kind_of?(Array) || source.kind_of?(Container)
14
- source.each {|s| self << s }
22
+ source.each {|s| self.push(s) }
15
23
  else
16
- sources << source
17
- sort!
24
+ sources.push(source)
18
25
  end
19
26
  end
20
27
  self
21
28
  end
22
29
 
30
+ def flatten
31
+ map {|item| item.respond_to?(:flatten) ? item.flatten : item }.flatten
32
+ end
33
+
34
+ def to_a
35
+ sources
36
+ end
37
+
23
38
  def sources
24
39
  @sources ||= []
25
40
  end
@@ -30,6 +45,7 @@ module Jsus
30
45
 
31
46
  def sort!
32
47
  self.sources = topsort(:sources)
48
+ self
33
49
  end
34
50
 
35
51
  def inspect
@@ -37,6 +53,11 @@ module Jsus
37
53
  end
38
54
 
39
55
  # delegate undefined methods to #sources
40
- (Array.instance_methods - self.instance_methods).each {|m| delegate m, :to => :sources }
56
+ DELEGATED_METHODS = [
57
+ "==", "map", "map!", "each", "inject", "reject",
58
+ "detect", "size", "length", "[]", "empty?",
59
+ "index", "include?"
60
+ ]
61
+ (DELEGATED_METHODS).each {|m| delegate m, :to => :sources }
41
62
  end
42
63
  end
@@ -5,15 +5,18 @@ module Jsus
5
5
  attr_accessor :pool
6
6
  # Constructors
7
7
  def initialize(directory, options = {})
8
- self.relative_directory = directory #Pathname.new(directory).relative_path_from(Pathname.new(".")).to_s
8
+ self.relative_directory = directory
9
9
  self.directory = File.expand_path(directory)
10
10
  self.header = YAML.load_file(File.join(directory, 'package.yml'))
11
- self.pool = options[:pool]
12
11
  Dir.chdir(directory) do
13
12
  files.each do |source|
14
13
  source_files << SourceFile.from_file(source, :package => self)
15
14
  end
16
15
  end
16
+ if options[:pool]
17
+ self.pool = options[:pool]
18
+ self.pool << self
19
+ end
17
20
  end
18
21
 
19
22
 
@@ -35,11 +38,8 @@ module Jsus
35
38
  end
36
39
 
37
40
  def provides
38
- @provides ||= provides!
39
- end
40
-
41
- def provides!
42
- source_files.map {|source| source.provides }.flatten
41
+ source_files.map {|source| source.provides(:short => true) }.flatten +
42
+ external_dependencies.map {|d| d.provides }.flatten
43
43
  end
44
44
 
45
45
  def files
@@ -49,11 +49,15 @@ module Jsus
49
49
  alias_method :sources, :files
50
50
 
51
51
  def dependencies
52
- @dependencies ||= dependencies!
52
+ source_files.map {|source| source.dependencies(:short => true) }.flatten.compact.uniq - provides
53
+ end
54
+
55
+ def external_dependencies
56
+ @external_dependencies ||= Container.new
53
57
  end
54
58
 
55
- def dependencies!
56
- source_files.map {|source| source.dependencies }.flatten.compact.uniq - provides!
59
+ def external_dependencies=(new_value)
60
+ @external_dependencies = new_value
57
61
  end
58
62
 
59
63
  def description
@@ -61,7 +65,7 @@ module Jsus
61
65
  end
62
66
 
63
67
  def compile(directory = ".")
64
- Packager.new(*source_files).pack(File.join(directory, filename))
68
+ Packager.new(*(source_files.to_a + external_dependencies.to_a)).pack(File.join(directory, filename))
65
69
  end
66
70
 
67
71
  def generate_tree(directory = ".", filename = "tree.json")
@@ -88,6 +92,12 @@ module Jsus
88
92
  self.to_hash
89
93
  end
90
94
 
95
+ def include_dependencies!
96
+ source_files.each do |source|
97
+ self.external_dependencies << pool.lookup_dependencies(source)
98
+ end
99
+ end
100
+
91
101
 
92
102
  def required_files
93
103
  source_files.map {|s| s.filename }
@@ -1,22 +1,75 @@
1
1
  module Jsus
2
2
  class Pool
3
+
4
+ def initialize(dir = nil)
5
+ if dir
6
+ Dir[File.join(dir, '**', 'package.yml')].each do |package_path|
7
+ Package.new(Pathname.new(package_path).parent.to_s, :pool => self)
8
+ end
9
+ end
10
+ end
11
+
12
+ def packages
13
+ @packages ||= []
14
+ @packages.uniq!
15
+ @packages
16
+ end
17
+
3
18
  def sources
4
19
  @sources ||= Container.new
5
20
  end
6
21
 
7
- def lookup(key)
8
- @provides_map[key]
22
+ def lookup(source_or_key)
23
+ case source_or_key
24
+ when String
25
+ provides_map[source_or_key]
26
+ when Jsus::SourceFile
27
+ source_or_key
28
+ else
29
+ raise "Illegal lookup query. Expected String or SourceFile, given #{source_or_key.class.name}."
30
+ end
9
31
  end
10
32
 
11
- def <<(source)
12
- sources << source
13
- @provides_map = sources.inject({}) do |result, source|
14
- source.provides(:full => true).each {|p| result[p] = source }
15
- result
33
+ def lookup_direct_dependencies(source_or_source_key)
34
+ source = lookup(source_or_source_key)
35
+ result = source.dependencies(:short => true).select {|d| d =~ %r(/)}.map {|d| lookup(d)}
36
+ Container.new(*result)
37
+ end
38
+
39
+ def lookup_dependencies(source_or_source_key)
40
+ source = lookup(source_or_source_key)
41
+ result = Container.new
42
+ dependencies = lookup_direct_dependencies(source).to_a
43
+ while !dependencies.empty?
44
+ dependencies.each { |d| result.push(d) }
45
+ dependencies = dependencies.map {|d| lookup_direct_dependencies(d).to_a }.flatten.compact.uniq
46
+ end
47
+ result.sort!
48
+ end
49
+
50
+ def <<(source_or_sources_or_package)
51
+ case
52
+ when source_or_sources_or_package.kind_of?(SourceFile)
53
+ source = source_or_sources_or_package
54
+ sources << source
55
+ source.provides.each {|p| provides_map[p] = source }
56
+ when source_or_sources_or_package.kind_of?(Package)
57
+ package = source_or_sources_or_package
58
+ packages << package
59
+ package.source_files.each {|s| self << s}
60
+ when source_or_sources_or_package.kind_of?(Array) || source_or_sources_or_package.kind_of?(Container)
61
+ sources = source_or_sources_or_package
62
+ sources.each {|s| self << s}
16
63
  end
17
64
  self
18
65
  end
19
66
 
20
67
  (Array.instance_methods - self.instance_methods).each {|m| delegate m, :to => :sources }
68
+
69
+ protected
70
+
71
+ def provides_map
72
+ @provides_map ||= {}
73
+ end
21
74
  end
22
75
  end
@@ -38,8 +38,8 @@ module Jsus
38
38
  def dependencies(options = {})
39
39
  header["requires"] = [header["requires"] || []].flatten
40
40
  header["requires"].map! {|r| r.gsub(/^\//, "") }
41
- if options[:full] && package
42
- header["requires"].map {|r| "#{package.name}/#{r}"}
41
+ if !options[:short] && package
42
+ header["requires"].map {|r| r.index("/") ? r : "#{package.name}/#{r}"}
43
43
  else
44
44
  header["requires"]
45
45
  end
@@ -48,7 +48,7 @@ module Jsus
48
48
 
49
49
  def provides(options = {})
50
50
  header["provides"] = [header["provides"] || []].flatten
51
- if options[:full] && package
51
+ if !options[:short] && package
52
52
  header["provides"].map {|p| "#{package.name}/#{p}"}
53
53
  else
54
54
  header["provides"]
@@ -62,8 +62,8 @@ module Jsus
62
62
  def to_hash
63
63
  {
64
64
  "desc" => description,
65
- "requires" => dependencies,
66
- "provides" => provides
65
+ "requires" => dependencies(:short => true),
66
+ "provides" => provides(:short => true)
67
67
  }
68
68
  end
69
69
 
@@ -0,0 +1,13 @@
1
+ /*
2
+ ---
3
+
4
+ script: Class.js
5
+
6
+ description: Contains the Class Function for easily creating, extending, and implementing reusable Classes.
7
+
8
+ license: MIT-style license.
9
+
10
+ provides: [Class]
11
+
12
+ ...
13
+ */
@@ -0,0 +1,8 @@
1
+ name: Class
2
+ filename: class.js
3
+ description: Class class
4
+ license: MIT-Style License, http://mootools.net/license
5
+ copyright: Somebody
6
+ authors: Someone
7
+ sources:
8
+ - Source/Class.js
@@ -0,0 +1,16 @@
1
+ /*
2
+ ---
3
+
4
+ script: Hash.js
5
+
6
+ description: Contains the Hash extensions for objects
7
+
8
+ license: MIT-style license.
9
+
10
+ requires:
11
+ - Class/Class
12
+
13
+ provides: [Hash]
14
+
15
+ ...
16
+ */
@@ -0,0 +1,8 @@
1
+ name: Hash
2
+ filename: hash.js
3
+ description: Hash class
4
+ license: MIT-Style License, http://mootools.net/license
5
+ copyright: Somebody
6
+ authors: Someone
7
+ sources:
8
+ - Source/Hash.js
@@ -0,0 +1,16 @@
1
+ /*
2
+ ---
3
+
4
+ script: Mash.js
5
+
6
+ description: Contains the Mash extensions for objects
7
+
8
+ license: MIT-style license.
9
+
10
+ requires:
11
+ - Hash/Hash
12
+
13
+ provides: [Mash]
14
+
15
+ ...
16
+ */
@@ -0,0 +1,8 @@
1
+ name: Mash
2
+ filename: mash.js
3
+ description: Mash class
4
+ license: MIT-Style License, http://mootools.net/license
5
+ copyright: Somebody
6
+ authors: Someone
7
+ sources:
8
+ - Source/Mash.js
@@ -0,0 +1,17 @@
1
+ /*
2
+ ---
3
+
4
+ script: Test.js
5
+
6
+ description: A library to work with tests
7
+
8
+ license: MIT-style license
9
+
10
+ authors:
11
+ - Valerio Proietti
12
+ requires:
13
+ - Mash/Mash
14
+ provides: [Test]
15
+
16
+ ...
17
+ */
@@ -0,0 +1,9 @@
1
+ name: orwik
2
+ filename: orwik.js
3
+ web: http://orwik.com
4
+ description: Orwik widgets and essensial things
5
+ license: MIT-Style License, http://mootools.net/license
6
+ copyright: 2008-2010 Yaroslaff Fedin http://orwik.com/people/inviz
7
+ authors: Orwik team, http://developers.orwik.com
8
+ sources:
9
+ - "Source/Test.js"
@@ -16,9 +16,11 @@ describe Jsus::Package do
16
16
  subject.filename.should == "orwik.js"
17
17
  end
18
18
 
19
- it "should pass pool in options" do
20
- pool = Object.new
21
- Jsus::Package.new(input_dir, :pool => pool).pool.should == pool
19
+ it "should pass pool in options and register itself in the pool" do
20
+ pool = Jsus::Pool.new
21
+ package = Jsus::Package.new(input_dir, :pool => pool)
22
+ package.pool.should == pool
23
+ pool.packages.should include(package)
22
24
  end
23
25
 
24
26
  it "should set provided modules from source files" do
@@ -56,6 +58,29 @@ describe Jsus::Package do
56
58
  info["provides"].should have_exactly(4).items
57
59
  info["provides"].should include("Color", "Widget", "Input", "Input.Color")
58
60
  end
61
+
62
+ context "when external dependencies are included" do
63
+ let(:lib_dir) { "spec/data/ChainDependencies/app/javascripts" }
64
+ let(:pool) { Jsus::Pool.new(lib_dir) }
65
+ subject { Jsus::Package.new("spec/data/ExternalDependencies/app/javascripts/Orwik", :pool => pool) }
66
+
67
+ it "should show included external dependencies as provided" do
68
+ subject.include_dependencies!
69
+ subject.generate_scripts_info(output_dir)
70
+ info = JSON.parse(IO.read("#{output_dir}/scripts.json"))
71
+ info = info["orwik"]
72
+ info["provides"].should have_exactly(4).items
73
+ info["provides"].should include("Test", "Hash/Hash", "Class/Class", 'Mash/Mash')
74
+ end
75
+
76
+ it "should not show included external dependencies as required" do
77
+ subject.include_dependencies!
78
+ subject.generate_scripts_info(output_dir)
79
+ info = JSON.parse(IO.read("#{output_dir}/scripts.json"))
80
+ info = info["orwik"]
81
+ info["requires"].should == []
82
+ end
83
+ end
59
84
  end
60
85
 
61
86
  describe "#generate_tree" do
@@ -90,4 +115,19 @@ describe Jsus::Package do
90
115
  color_index.should < input_color_index
91
116
  end
92
117
  end
118
+
119
+ describe "#include_dependencies!" do
120
+ let(:lib_dir) { "spec/data/ChainDependencies/app/javascripts" }
121
+ let(:pool) { Jsus::Pool.new(lib_dir) }
122
+ subject { Jsus::Package.new("spec/data/ExternalDependencies/app/javascripts/Orwik", :pool => pool) }
123
+
124
+ it "should include external dependencies into self" do
125
+ subject.include_dependencies!
126
+ subject.should have(3).external_dependencies
127
+ compiled = subject.compile
128
+ ["Class", "Hash", "Mash"].each do |name|
129
+ compiled.should include(IO.read("#{lib_dir}/#{name}/Source/#{name}.js"))
130
+ end
131
+ end
132
+ end
93
133
  end
@@ -1,19 +1,77 @@
1
1
  require 'spec/spec_helper'
2
2
  describe Jsus::Pool do
3
- let(:package) { Jsus::Package.new("spec/data/OutsideDependencies/app/javascripts/Core") }
3
+ let(:input_dir) { "spec/data/ChainDependencies/app/javascripts" }
4
+ let(:packages) {
5
+ [
6
+ Jsus::Package.new("#{input_dir}/Mash", :pool => subject),
7
+ Jsus::Package.new("#{input_dir}/Class", :pool => subject),
8
+ Jsus::Package.new("#{input_dir}/Hash", :pool => subject)
9
+ ]
10
+ }
11
+
12
+ let(:sources) {
13
+ packages.map {|p| p.source_files[0] }
14
+ }
15
+
4
16
  subject { Jsus::Pool.new }
5
17
 
6
- before(:each) do
7
- subject << package.source_files
18
+ context "initialization" do
19
+ context "without any arguments" do
20
+ subject { Jsus::Pool.new }
21
+ it "should be available" do
22
+ lambda {
23
+ subject
24
+ }.should_not raise_error
25
+ end
26
+ end
27
+
28
+ context "from directory" do
29
+ subject { Jsus::Pool.new(input_dir)}
30
+ it "should search for packages recursively and add them to itself" do
31
+ subject.should have_exactly(3).packages
32
+ subject.packages.map {|p| p.name }.should include("Mash", "Hash", "Class")
33
+ end
34
+
35
+ it "should add all the source files to pool" do
36
+ subject.should have_exactly(3).sources
37
+ subject.sources.map {|s| s.provides }.flatten.should include("Mash/Mash", "Hash/Hash", "Class/Class")
38
+ end
39
+ end
8
40
  end
9
41
 
42
+
10
43
  describe "#lookup" do
44
+ before(:each) do
45
+ packages.each {|package| subject << package.source_files }
46
+ end
47
+
11
48
  it "should find a source file providing given full name" do
12
- subject.lookup("Core/Hash").should be_kind_of(Jsus::SourceFile)
49
+ subject.lookup("Class/Class").should == sources[1]
13
50
  end
14
51
 
15
52
  it "should return nil if nothing could be found" do
16
53
  subject.lookup("Core/WTF").should be_nil
17
54
  end
18
55
  end
56
+
57
+ describe "#lookup_direct_dependencies" do
58
+ before(:each) do
59
+ packages.each {|package| subject << package.source_files }
60
+ end
61
+
62
+ it "should return a container with direct dependencies" do
63
+ subject.lookup_direct_dependencies("Mash/Mash").should be_a(Jsus::Container)
64
+ subject.lookup_direct_dependencies("Mash/Mash").should == [sources[2]]
65
+ end
66
+ end
67
+
68
+ describe "#lookup_dependencies" do
69
+ before(:each) do
70
+ packages.each {|package| subject << package.source_files }
71
+ end
72
+
73
+ it "should return a container with files and dependencies" do
74
+ subject.lookup_dependencies("Mash/Mash").should == [sources[1], sources[2]]
75
+ end
76
+ end
19
77
  end
@@ -52,32 +52,42 @@ describe Jsus::SourceFile do
52
52
  end
53
53
 
54
54
  describe "#provides" do
55
- it "should return the stuff it provides" do
56
- subject.provides.should == ["Chain", "Events", "Options"]
55
+ it "should return the stuff it provides in full form" do
56
+ subject.provides.should == ["Core/Chain", "Core/Events", "Core/Options"]
57
57
  end
58
58
 
59
- it "should prepend package prefix if asked for fully formed provides" do
60
- subject.provides(:full => true).should == ["Core/Chain", "Core/Events", "Core/Options"]
59
+ it "should cut package prefix if asked for short-formed provides" do
60
+ subject.provides(:short => true).should == ["Chain", "Events", "Options"]
61
61
  end
62
62
 
63
63
  it "should work well when given single string instead of array" do
64
64
  subject.header["provides"] = "Mash"
65
- subject.provides.should == ["Mash"]
65
+ subject.provides.should == ["Core/Mash"]
66
66
  end
67
67
  end
68
68
 
69
69
  describe "#dependencies" do
70
70
  it "should truncate leading slash" do
71
- subject.dependencies.should == ["Class"]
71
+ subject.dependencies.should == ["Core/Class"]
72
72
  end
73
73
 
74
- it "should prepend package prefix if asked for fully formed dependencies" do
75
- subject.dependencies(:full => true).should == ["Core/Class"]
74
+ it "should cut package prefix if asked for short-formed dependencies" do
75
+ subject.dependencies(:short => true).should == ["Class"]
76
76
  end
77
77
 
78
78
  it "should work well when given single string instead of array" do
79
79
  subject.header["requires"] = "Class"
80
- subject.dependencies.should == ["Class"]
80
+ subject.dependencies.should == ["Core/Class"]
81
+ end
82
+
83
+ it "should not truncate package name in short form for external dependencies" do
84
+ subject.header["requires"] = "Mash/Mash"
85
+ subject.dependencies(:short => true).should == ["Mash/Mash"]
86
+ end
87
+
88
+ it "should not prepend package name in full form for external dependencies" do
89
+ subject.header["requires"] = "Mash/Mash"
90
+ subject.dependencies.should == ["Mash/Mash"]
81
91
  end
82
92
  end
83
93
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 2
9
- version: 0.1.2
8
+ - 3
9
+ version: 0.1.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Markiz, idea by Inviz (http://github.com/Inviz)
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-06-04 00:00:00 +04:00
17
+ date: 2010-06-06 00:00:00 +04:00
18
18
  default_executable: jsus
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -54,7 +54,7 @@ dependencies:
54
54
  type: :runtime
55
55
  version_requirements: *id003
56
56
  - !ruby/object:Gem::Dependency
57
- name: rake
57
+ name: optiflag
58
58
  prerelease: false
59
59
  requirement: &id004 !ruby/object:Gem::Requirement
60
60
  requirements:
@@ -63,8 +63,20 @@ dependencies:
63
63
  segments:
64
64
  - 0
65
65
  version: "0"
66
- type: :development
66
+ type: :runtime
67
67
  version_requirements: *id004
68
+ - !ruby/object:Gem::Dependency
69
+ name: rake
70
+ prerelease: false
71
+ requirement: &id005 !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ type: :development
79
+ version_requirements: *id005
68
80
  description: Packager/compiler for js-files that resolves dependencies and can compile everything into one file, providing all the neccessary meta-info.
69
81
  email: markizko@gmail.com
70
82
  executables:
@@ -106,6 +118,14 @@ files:
106
118
  - spec/data/Basic/app/javascripts/Orwik/Source/Widget/Input/Input.js
107
119
  - spec/data/Basic/app/javascripts/Orwik/Source/Widget/Widget.js
108
120
  - spec/data/Basic/app/javascripts/Orwik/package.yml
121
+ - spec/data/ChainDependencies/app/javascripts/Class/Source/Class.js
122
+ - spec/data/ChainDependencies/app/javascripts/Class/package.yml
123
+ - spec/data/ChainDependencies/app/javascripts/Hash/Source/Hash.js
124
+ - spec/data/ChainDependencies/app/javascripts/Hash/package.yml
125
+ - spec/data/ChainDependencies/app/javascripts/Mash/Source/Mash.js
126
+ - spec/data/ChainDependencies/app/javascripts/Mash/package.yml
127
+ - spec/data/ExternalDependencies/app/javascripts/Orwik/Source/Test.js
128
+ - spec/data/ExternalDependencies/app/javascripts/Orwik/package.yml
109
129
  - spec/data/OutsideDependencies/README
110
130
  - spec/data/OutsideDependencies/app/javascripts/Core/Source/Class/Class.Extras.js
111
131
  - spec/data/OutsideDependencies/app/javascripts/Core/Source/Class/Class.js