jsus 0.3.6 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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