jsus 0.3.6 → 0.4.0

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.
Files changed (71) hide show
  1. data/.travis.yml +2 -0
  2. data/CHANGELOG +5 -0
  3. data/Gemfile +7 -4
  4. data/VERSION +1 -1
  5. data/bin/jsus +1 -5
  6. data/cucumber.yml +1 -1
  7. data/features/command-line/external_dependency_resolution.feature +4 -4
  8. data/features/command-line/generate_includes.feature +34 -0
  9. data/features/command-line/mooforge_compatibility_layer.feature +1 -1
  10. data/features/command-line/postproc.feature +12 -3
  11. data/features/command-line/structure_json.feature +5 -40
  12. data/features/data/ExternalDependencyWithExternalDependency/Leonardo/Source/Core.js +2 -2
  13. data/features/step_definitions/cli_steps.rb +15 -9
  14. data/features/support/env.rb +1 -1
  15. data/jsus.gemspec +25 -7
  16. data/lib/extensions/rgl.rb +2 -1
  17. data/lib/jsus/cli.rb +43 -27
  18. data/lib/jsus/container.rb +71 -51
  19. data/lib/jsus/middleware.rb +2 -3
  20. data/lib/jsus/package.rb +27 -129
  21. data/lib/jsus/packager.rb +10 -6
  22. data/lib/jsus/pool.rb +48 -20
  23. data/lib/jsus/source_file.rb +119 -198
  24. data/lib/jsus/tag.rb +72 -106
  25. data/lib/jsus/util.rb +14 -4
  26. data/lib/jsus/util/compressor.rb +1 -1
  27. data/lib/jsus/util/documenter.rb +1 -1
  28. data/lib/jsus/util/mixins.rb +7 -0
  29. data/lib/jsus/util/mixins/operates_on_sources.rb +29 -0
  30. data/lib/jsus/util/post_processor.rb +35 -0
  31. data/lib/jsus/util/post_processor/base.rb +32 -0
  32. data/lib/jsus/util/post_processor/moocompat12.rb +19 -0
  33. data/lib/jsus/util/post_processor/mooltie8.rb +19 -0
  34. data/lib/jsus/util/post_processor/semicolon.rb +18 -0
  35. data/lib/jsus/util/validator/base.rb +3 -23
  36. data/lib/jsus/util/watcher.rb +8 -6
  37. data/spec/data/Extensions/app/javascripts/Core/Source/Hash.js +13 -0
  38. data/spec/data/Extensions/app/javascripts/Core/Source/Mash.js +13 -0
  39. data/spec/data/Extensions/app/javascripts/Core/package.yml +3 -1
  40. data/spec/data/Extensions/app/javascripts/Orwik/Extensions/Mash.js +16 -0
  41. data/spec/data/Extensions/app/javascripts/Orwik/package.yml +2 -1
  42. data/spec/data/OutsideDependencies/app/javascripts/Orwik/package.yml +3 -3
  43. data/spec/data/SimpleSources/dependent_source_one.js +15 -0
  44. data/spec/data/SimpleSources/replacement_source_one.js +13 -0
  45. data/spec/data/SimpleSources/simple_source_one.js +13 -0
  46. data/spec/data/SimpleSources/simple_source_two.js +13 -0
  47. data/spec/data/extension_1.js +15 -0
  48. data/spec/data/extension_2.js +15 -0
  49. data/spec/data/replacement.js +15 -0
  50. data/spec/jsus/container_spec.rb +72 -14
  51. data/spec/jsus/package_spec.rb +10 -128
  52. data/spec/jsus/packager_spec.rb +11 -11
  53. data/spec/jsus/pool_spec.rb +13 -22
  54. data/spec/jsus/source_file_spec.rb +66 -215
  55. data/spec/jsus/tag_spec.rb +24 -69
  56. data/spec/jsus/util/documenter_spec.rb +1 -1
  57. data/spec/jsus/util/post_processor/moocompat12_spec.rb +23 -0
  58. data/spec/jsus/util/post_processor/mooltie8_spec.rb +23 -0
  59. data/spec/jsus/util/post_processor/semicolon_spec.rb +21 -0
  60. data/spec/jsus/util/post_processors/base_spec.rb +6 -0
  61. data/spec/jsus/util/tree_spec.rb +3 -3
  62. data/spec/jsus/util/validator/base_spec.rb +4 -2
  63. data/spec/jsus/util/watcher_spec.rb +12 -2
  64. data/spec/shared/mixins_segs.rb +38 -0
  65. data/spec/spec_helper.rb +6 -0
  66. metadata +28 -10
  67. data/features/data/tmp2/package.js +0 -35
  68. data/features/data/tmp2/scripts.json +0 -13
  69. data/features/data/tmp2/tree.json +0 -26
  70. data/lib/jsus/compiler.rb +0 -28
  71. data/spec/shared/class_stubs.rb +0 -31
@@ -3,36 +3,16 @@ module Jsus
3
3
  # Base for any validator class.
4
4
  module Validator
5
5
  class Base
6
+ include Mixins::OperatesOnSources
7
+
6
8
  # Constructor accepts pool or array or container and adds every file
7
9
  # to its source files set.
8
10
  # @param [Jsus::Pool, Jsus::Container, Array] source files to validate
9
11
  # @api public
10
- def initialize(pool_or_array_or_container)
12
+ def initialize(pool_or_array_or_container = [])
11
13
  self.source_files = pool_or_array_or_container
12
14
  end
13
15
 
14
- # @return [Array] source files for validation
15
- # @api public
16
- def source_files
17
- @source_files ||= []
18
- end
19
- alias_method :sources, :source_files
20
-
21
- # @param [Jsus::Pool, Jsus::Container, Array] pool_or_array_or_container
22
- # source files for validation
23
- # @api public
24
- def source_files=(pool_or_array_or_container)
25
- case pool_or_array_or_container
26
- when Pool
27
- @source_files = pool_or_array_or_container.sources.to_a
28
- when Array
29
- @source_files = pool_or_array_or_container
30
- when Container
31
- @source_files = pool_or_array_or_container.to_a
32
- end
33
- end
34
- alias_method :sources=, :source_files=
35
-
36
16
  # @return [Boolean] whether or not given sources conform to given set of rules
37
17
  # @api public
38
18
  def validate
@@ -3,13 +3,14 @@ class Jsus::Util::Watcher
3
3
  # Watches input directories and their subdirectories for changes in
4
4
  # js source files and package metadata files.
5
5
  # @param [String, Array] input_dirs directory or directories to watch
6
+ # @param [String, Array] ignored_dirs directory or directories to ignore
6
7
  # @yield [filename] Callback to trigger on creation / update / removal of
7
8
  # any file in given directories
8
9
  # @yieldparam [String] filename Updated filename full path
9
10
  # @return [FSSM::Monitor] fssm monitor instance
10
11
  # @api public
11
- def watch(input_dirs, &callback)
12
- new(input_dirs, &callback)
12
+ def watch(input_dirs, ignored_dirs = [], &callback)
13
+ new(input_dirs, ignored_dirs, &callback)
13
14
  end
14
15
  end
15
16
 
@@ -17,12 +18,13 @@ class Jsus::Util::Watcher
17
18
  # Jsus::Util::Watcher.watch instead.
18
19
  # @see .watch
19
20
  # @api semipublic
20
- def initialize(input_dirs, &callback)
21
+ def initialize(input_dirs, ignored_dirs = [], &callback)
21
22
  require 'fssm'
22
23
  @callback = callback
23
24
  input_dirs = Array(input_dirs).compact
24
25
  @semaphore = Mutex.new
25
26
  watcher = self
27
+ @ignored_dirs = Array(ignored_dirs).map {|dir| File.expand_path(dir) }
26
28
  FSSM.monitor do
27
29
  input_dirs.each do |dir|
28
30
  dir = File.expand_path(dir)
@@ -49,9 +51,9 @@ class Jsus::Util::Watcher
49
51
  # @api semipublic
50
52
  def watch_callback(base, match)
51
53
  Thread.new do
52
- run do
53
- full_path = File.join(base, match)
54
- @callback.call(full_path)
54
+ full_path = File.join(base, match)
55
+ unless @ignored_dirs.any? {|dir| full_path.index(dir) == 0 }
56
+ run { @callback.call(full_path) }
55
57
  end
56
58
  end
57
59
  end # watch_callback
@@ -0,0 +1,13 @@
1
+ /*
2
+ ---
3
+
4
+ script: Hash.js
5
+
6
+ description: Contains the Hash Function for easily creating, extending, and implementing reusable Hashes.
7
+
8
+ license: MIT-style license.
9
+
10
+ provides: [Hash]
11
+
12
+ ...
13
+ */
@@ -0,0 +1,13 @@
1
+ /*
2
+ ---
3
+
4
+ script: Mash.js
5
+
6
+ description: Contains the Mash Function for easily creating, extending, and implementing reusable Mashes.
7
+
8
+ license: MIT-style license.
9
+
10
+ provides: [Mash]
11
+
12
+ ...
13
+ */
@@ -5,4 +5,6 @@ license: MIT-Style License, http://mootools.net/license
5
5
  copyright: Somebody
6
6
  authors: Someone
7
7
  sources:
8
- - Source/Class.js
8
+ - Source/Class.js
9
+ - Source/Hash.js
10
+ - Source/Mash.js
@@ -0,0 +1,16 @@
1
+ /*
2
+ ---
3
+
4
+ script: Mash.js
5
+
6
+ description: Extension for Core/Mash
7
+
8
+ license: MIT-style license
9
+
10
+ authors:
11
+ - Valerio Proietti
12
+
13
+ extends: "Core/Mash"
14
+
15
+ ...
16
+ */
@@ -5,4 +5,5 @@ license: MIT-Style License, http://mootools.net/license
5
5
  copyright: Somebody
6
6
  authors: Someone
7
7
  sources:
8
- - Extensions/Class.js
8
+ - Extensions/Class.js
9
+ - Extensions/Mash.js
@@ -1,4 +1,4 @@
1
- name: orwik
1
+ name: Orwik
2
2
  filename: orwik.js
3
3
  web: http://orwik.com
4
4
  description: Orwik widgets and essensial things
@@ -6,7 +6,7 @@ license: MIT-Style License, http://mootools.net/license
6
6
  copyright: 2008-2010 Yaroslaff Fedin http://orwik.com/people/inviz
7
7
  authors: Orwik team, http://developers.orwik.com
8
8
  files:
9
- - "Source/Widget/Widget.js"
9
+ - "Source/Widget/Widget.js"
10
10
  - "Source/Widget/Input/Input.js"
11
11
  - "Source/Widget/Input/Input.Color.js" #Files are unsorted. Figure out the order please
12
- - "Source/Library/Color.js"
12
+ - "Source/Library/Color.js"
@@ -0,0 +1,15 @@
1
+ /*
2
+ ---
3
+
4
+ script: DependentSourceOne.js
5
+
6
+ description: Provides Two, requires Zero
7
+
8
+ license: MIT-style license.
9
+
10
+ provides: Two
11
+
12
+ requires: Zero
13
+
14
+ ...
15
+ */
@@ -0,0 +1,13 @@
1
+ /*
2
+ ---
3
+
4
+ script: ReplacementSourceOne.js
5
+
6
+ description: Replaces One
7
+
8
+ license: MIT-style license.
9
+
10
+ replaces: One
11
+
12
+ ...
13
+ */
@@ -0,0 +1,13 @@
1
+ /*
2
+ ---
3
+
4
+ script: SimpleSourceOnce.js
5
+
6
+ description: Provides Zero, requires nothing
7
+
8
+ license: MIT-style license.
9
+
10
+ provides: Zero
11
+
12
+ ...
13
+ */
@@ -0,0 +1,13 @@
1
+ /*
2
+ ---
3
+
4
+ script: SimpleSourceTwo.js
5
+
6
+ description: Provides One, requires nothing
7
+
8
+ license: MIT-style license.
9
+
10
+ provides: One
11
+
12
+ ...
13
+ */
@@ -0,0 +1,15 @@
1
+ /*
2
+ ---
3
+
4
+ script: ExtensionOne.js
5
+
6
+ description: Extends Chain
7
+
8
+ license: MIT-style license.
9
+
10
+ extends: Core/Chain
11
+
12
+ ...
13
+ */
14
+
15
+ var extension_1 = true;
@@ -0,0 +1,15 @@
1
+ /*
2
+ ---
3
+
4
+ script: ExtensionTwo.js
5
+
6
+ description: Extends Chain
7
+
8
+ license: MIT-style license.
9
+
10
+ extends: Core/Chain
11
+
12
+ ...
13
+ */
14
+
15
+ var extension_2 = true;
@@ -0,0 +1,15 @@
1
+ /*
2
+ ---
3
+
4
+ script: ChainReplacement.js
5
+
6
+ description: Replaces Chain
7
+
8
+ license: MIT-style license.
9
+
10
+ replaces: Core/Chain
11
+
12
+ ...
13
+ */
14
+
15
+ var Chain = "Replaced";
@@ -2,10 +2,10 @@ require 'spec_helper'
2
2
 
3
3
 
4
4
  describe Jsus::Container do
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
- let(:replacement_source) { Source.new(:provides => [0,4,6], :dependencies => [], :replaces => 0, :content => "// simple replaced", :filename => "/home/jsus/simple_replaced.js") }
5
+ let(:simple_source) { Jsus::SourceFile.from_file("spec/data/SimpleSources/simple_source_one.js", :namespace => "Test") }
6
+ let(:another_simple_source) { Jsus::SourceFile.from_file("spec/data/SimpleSources/simple_source_two.js", :namespace => "Test") }
7
+ let(:dependant_source) { Jsus::SourceFile.from_file("spec/data/SimpleSources/dependent_source_one.js", :namespace => "Test") }
8
+ let(:replacement_source) { Jsus::SourceFile.from_file("spec/data/SimpleSources/replacement_source_one.js", :namespace => "Test") }
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) }
11
11
 
@@ -14,6 +14,12 @@ describe Jsus::Container do
14
14
  simple_container.should have_exactly(2).sources
15
15
  simple_container.sources.should include(simple_source, another_simple_source)
16
16
  end
17
+
18
+ it "should not lose data when initialized from another container" do
19
+ container = Jsus::Container.new(simple_source, replacement_source, another_simple_source)
20
+ container.to_a.should =~ [simple_source, replacement_source]
21
+ Jsus::Container.new(container).to_a.should =~ [simple_source, replacement_source]
22
+ end
17
23
  end
18
24
 
19
25
  describe "#<<" do
@@ -59,19 +65,13 @@ describe Jsus::Container do
59
65
  end
60
66
 
61
67
  it "should generate routes from given root" do
62
- subject.required_files("/home/jsus").should == ["simple.js", "../dependencies/simple3.js"]
68
+ subject.required_files(File.expand_path("spec/data/SimpleSources")).should == [File.basename(simple_source.filename), File.basename(dependant_source.filename)]
63
69
  end
64
70
  end
65
71
 
66
72
  context "lazy sorting" do
67
73
  subject { container_with_dependency.sort! }
68
74
 
69
- it "should remove replaced files" do
70
- subject << replacement_source
71
- subject.should include(replacement_source)
72
- subject.should_not include(simple_source)
73
- end
74
-
75
75
  it "should only call topsort when it's needed" do
76
76
  subject.should_not_receive(:topsort)
77
77
  subject.sort!
@@ -82,11 +82,69 @@ describe Jsus::Container do
82
82
  subject.should_not_receive(:topsort)
83
83
  subject << simple_source
84
84
  end
85
-
85
+
86
86
  it "should call topsort for kicker methods" do
87
87
  subject << simple_source
88
- subject.should_receive(:topsort)
88
+ subject.should_receive(:topsort).and_return([])
89
89
  subject.each {|source| }
90
90
  end
91
91
  end
92
- end
92
+
93
+ context "when extensions are present" do
94
+ let(:klass) { Jsus::SourceFile.from_file("spec/data/Extensions/app/javascripts/Core/Source/Class.js", :namespace => "Core") }
95
+ let(:hash) { Jsus::SourceFile.from_file("spec/data/Extensions/app/javascripts/Core/Source/Hash.js", :namespace => "Core") }
96
+ let(:mash) { Jsus::SourceFile.from_file("spec/data/Extensions/app/javascripts/Core/Source/Mash.js", :namespace => "Core") }
97
+ let(:sources) { [klass, hash, mash] }
98
+ let(:klass_ext) { Jsus::SourceFile.from_file("spec/data/Extensions/app/javascripts/Orwik/Extensions/Class.js", :namespace => "Orwik") }
99
+ let(:mash_ext) { Jsus::SourceFile.from_file("spec/data/Extensions/app/javascripts/Orwik/Extensions/Mash.js", :namespace => "Orwik") }
100
+ let(:extensions) { [klass_ext, mash_ext] }
101
+
102
+ subject { described_class.new }
103
+ before(:each) do
104
+ sources.each {|sf| subject << sf }
105
+ extensions.each {|sf| subject << sf }
106
+ end
107
+
108
+ it "should return extensions immediately after the sources they extend" do
109
+ subject.to_a.should =~ sources + extensions
110
+ subject.to_a.index(klass).should == subject.to_a.index(klass_ext) - 1
111
+ subject.to_a.index(mash).should == subject.to_a.index(mash_ext) - 1
112
+ end
113
+ end
114
+
115
+ context "when replacements are present" do
116
+ let(:source) { Jsus::SourceFile.from_file("spec/data/OutsideDependencies/app/javascripts/Core/Source/Class/Class.Extras.js", :namespace => "Core") }
117
+ let(:replacement) { Jsus::SourceFile.from_file("spec/data/replacement.js", :namespace => "Test") }
118
+ subject { described_class.new(source, replacement) }
119
+
120
+ it "should only include replacement in the output" do
121
+ subject.sources.should == [replacement]
122
+ end
123
+ end
124
+
125
+ describe "#provides" do
126
+ let(:source) { Jsus::SourceFile.from_file("features/data/Basic/Source/Library/Color.js", :namespace => "Base") }
127
+ let(:another_source) { Jsus::SourceFile.from_file("features/data/Basic/Source/Widget/Input/Input.Color.js", :namespace => "Base") }
128
+ subject { described_class.new(source, another_source) }
129
+
130
+ it "should include provided tags of all sources" do
131
+ subject.provides.map {|tag| tag.to_s}.should =~ ["Base/Color", "Base/Input.Color"]
132
+ end
133
+ end
134
+
135
+ describe "#requires" do
136
+ let(:source) { Jsus::SourceFile.from_file("features/data/Basic/Source/Library/Color.js", :namespace => "Base") }
137
+ let(:another_source) { Jsus::SourceFile.from_file("features/data/Basic/Source/Widget/Input/Input.Color.js", :namespace => "Base") }
138
+ subject { described_class.new(another_source) }
139
+
140
+ it "should include required tags of all sources" do
141
+ subject.provides.map {|tag| tag.to_s}.should =~ ["Base/Input.Color"]
142
+ subject.requires.map {|tag| tag.to_s}.should =~ ["Base/Color"]
143
+ end
144
+
145
+ it "should exclude tags which are provided by other files" do
146
+ subject << source
147
+ subject.requires.map {|tag| tag.to_s}.should == []
148
+ end
149
+ end
150
+ end
@@ -14,29 +14,26 @@ describe Jsus::Package do
14
14
  let(:output_dir) { "spec/data/OutsideDependencies/public/javascripts/Orwik" }
15
15
 
16
16
  it "should load header from package.yml" do
17
- subject.name.should == "orwik"
17
+ subject.name.should == "Orwik"
18
18
  subject.filename.should == "orwik.js"
19
19
  end
20
20
 
21
- it "should pass pool in options and register itself in the pool" do
22
- pool = Jsus::Pool.new
23
- package = Jsus::Package.new(input_dir, :pool => pool)
24
- package.pool.should == pool
25
- pool.packages.should include(package)
26
- end
27
-
28
21
  it "should set provided modules from source files" do
29
22
  subject.provides.should have_exactly(4).items
30
- subject.provides_names.should include("Color", "Input", "Input.Color", "Widget")
23
+ subject.provides.map {|p| p.to_s }.should include("Orwik/Color", "Orwik/Input", "Orwik/Input.Color", "Orwik/Widget")
31
24
  end
32
25
 
33
26
  it "should set up outside dependencies" do
34
- subject.dependencies_names.should == ['Core/Class']
27
+ subject.requires.map {|r| r.to_s}.should =~ ["Core/Class"]
35
28
  end
36
29
 
37
30
  it "should set directory field" do
38
31
  subject.directory.should == File.expand_path(input_dir)
39
32
  end
33
+
34
+ it "should assign source file itself as a package" do
35
+ subject.source_files.each {|sf| sf.package.should == subject }
36
+ end
40
37
  end
41
38
 
42
39
  context "with a package.json" do
@@ -45,139 +42,24 @@ describe Jsus::Package do
45
42
 
46
43
  it "should load header from package.json" do
47
44
  subject.name.should == "Sheet"
48
- subject.provides_names.should =~ ["Sheet", "SheetParser.CSS"]
49
- subject.dependencies_names.should =~ ["combineRegExp"]
45
+ subject.provides.map {|p| p.to_s}.should =~ ["Sheet/Sheet", "Sheet/SheetParser.CSS"]
46
+ subject.requires.map {|r| r.to_s}.should =~ ["Sheet/CombineRegExp"]
50
47
  end
51
48
 
52
49
  end
53
50
  end
54
51
  end
55
52
 
56
- describe "#compile" do
57
- it "should create a merged js package from given files" do
58
- subject.compile(output_dir)
59
- File.exists?("#{output_dir}/orwik.js").should be_true
60
- compiled_content = IO.read("#{output_dir}/orwik.js")
61
- required_files = Dir["#{input_dir}/**/*.js"].map {|f| IO.read(f) }
62
- required_files.each {|f| compiled_content.should include(f)}
63
- end
64
-
65
- context "when given nil" do
66
- it "should not raise errors" do
67
- lambda { subject.compile(nil) }.should_not raise_error
68
- end
69
-
70
- it "should return a string with compiled content" do
71
- compiled_content = subject.compile(nil)
72
- required_files = Dir["#{input_dir}/**/*.js"].map {|f| IO.read(f) }
73
- required_files.each {|f| compiled_content.should include(f)}
74
- end
75
- end
76
- end
77
-
78
- describe "#generate_scripts_info" do
79
- it "should create scripts.json file containing all the info about the package" do
80
- subject.generate_scripts_info(output_dir)
81
- File.exists?("#{output_dir}/scripts.json").should be_true
82
- info = JSON.parse(IO.read("#{output_dir}/scripts.json"))
83
- info = info["Orwik"]
84
- info["provides"].should have_exactly(4).items
85
- info["provides"].should include("Color", "Widget", "Input", "Input.Color")
86
- end
87
-
88
- context "when external dependencies are included" do
89
- let(:lib_dir) { "spec/data/ChainDependencies/app/javascripts" }
90
- let(:pool) { Jsus::Pool.new(lib_dir) }
91
- subject { Jsus::Package.new("spec/data/ExternalDependencies/app/javascripts/Orwik", :pool => pool) }
92
-
93
- it "should show included external dependencies as provided" do
94
- subject.include_dependencies!
95
- subject.generate_scripts_info(output_dir)
96
- info = JSON.parse(IO.read("#{output_dir}/scripts.json"))
97
- info = info["Orwik"]
98
- info["provides"].should have_exactly(4).items
99
- info["provides"].should include("Test", "Hash/Hash", "Class/Class", 'Mash/Mash')
100
- end
101
-
102
- it "should not show included external dependencies as required" do
103
- subject.include_dependencies!
104
- subject.generate_scripts_info(output_dir)
105
- info = JSON.parse(IO.read("#{output_dir}/scripts.json"))
106
- info = info["Orwik"]
107
- info["requires"].should == ["Class"]
108
- end
109
- end
110
- end
111
-
112
- describe "#generate_tree" do
113
- it "should create a json file containing tree information and dependencies" do
114
- subject.generate_tree(output_dir)
115
- File.exists?("#{output_dir}/tree.json").should be_true
116
- tree = JSON.parse(IO.read("#{output_dir}/tree.json"))
117
- tree["Library"]["Color"]["provides"].should == ["Color"]
118
- tree["Widget"]["Widget"]["provides"].should == ["Widget"]
119
- tree["Widget"]["Input"]["Input"]["requires"].should == ["Widget"]
120
- tree["Widget"]["Input"]["Input"]["provides"].should == ["Input"]
121
- tree["Widget"]["Input"]["Input.Color"]["requires"].should have_exactly(2).elements
122
- tree["Widget"]["Input"]["Input.Color"]["requires"].should include("Input", "Color")
123
- tree["Widget"]["Input"]["Input.Color"]["provides"].should == ["Input.Color"]
124
- end
125
-
126
- it "should allow different filenames" do
127
- subject.generate_tree(output_dir, "structure.json")
128
- File.exists?("#{output_dir}/structure.json").should be_true
129
- tree = JSON.parse(IO.read("#{output_dir}/structure.json"))
130
- tree["Library"]["Color"]["provides"].should == ["Color"]
131
- end
132
- end
133
-
134
53
  describe "#required_files" do
135
- it "should list required files in correct order" do
136
- required_files = subject.required_files
137
- input_index = required_files.index {|s| s=~ /\/Input.js$/}
138
- color_index = required_files.index {|s| s=~ /\/Color.js$/}
139
- input_color_index = required_files.index {|s| s=~ /\/Input.Color.js$/}
140
- input_index.should < input_color_index
141
- color_index.should < input_color_index
142
- end
143
-
144
54
  it "should not include extensions" do
145
55
  required_files = Jsus::Package.new("spec/data/Extensions/app/javascripts/Orwik").required_files
146
56
  required_files.should be_empty
147
57
  end
148
58
  end
149
59
 
150
- describe "#include_dependencies!" do
151
- let(:lib_dir) { "spec/data/ChainDependencies/app/javascripts" }
152
- let(:pool) { Jsus::Pool.new(lib_dir) }
153
- subject { Jsus::Package.new("spec/data/ExternalDependencies/app/javascripts/Orwik", :pool => pool) }
154
-
155
- it "should include external dependencies into self" do
156
- subject.include_dependencies!
157
- subject.should have(3).linked_external_dependencies
158
- compiled = subject.compile(output_dir)
159
- ["Class", "Hash", "Mash"].each do |name|
160
- compiled.should include(IO.read("#{lib_dir}/#{name}/Source/#{name}.js"))
161
- end
162
- end
163
- end
164
-
165
- describe "#include_extensions!" do
166
- let(:lib_dir) { "spec/data/Extensions/app/javascripts" }
167
- let(:pool) { Jsus::Pool.new(lib_dir) }
168
- subject { Jsus::Package.new("spec/data/Extensions/app/javascripts/Core", :pool => pool) }
169
-
170
- it "should include extensions into source files" do
171
- subject.source_files[0].extensions.should be_empty
172
- subject.include_extensions!
173
- subject.source_files[0].extensions.should have_exactly(1).item
174
- end
175
-
176
- end
177
-
178
60
  describe "#filename" do
179
61
  it "should convert package name to snake_case" do
180
62
  subject.filename.should == "orwik.js"
181
63
  end
182
64
  end
183
- end
65
+ end