jsus 0.1.2 → 0.1.3

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/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