jsus 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/CHANGELOG +5 -0
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +12 -2
  4. data/VERSION +1 -1
  5. data/autotest/discover.rb +1 -0
  6. data/bin/jsus +86 -90
  7. data/cucumber.yml +1 -0
  8. data/features/command-line/basic_dependency_resolution.feature +99 -0
  9. data/features/command-line/extensions.feature +70 -0
  10. data/features/command-line/external_dependency_resolution.feature +120 -0
  11. data/features/command-line/json_package.feature +50 -0
  12. data/features/command-line/structure_json.feature +56 -0
  13. data/features/data/Basic/Source/Library/Color.js +16 -0
  14. data/features/data/Basic/Source/Widget/Input/Input.Color.js +19 -0
  15. data/features/data/Basic/package.yml +9 -0
  16. data/features/data/BasicWrongOrder/Source/Library/Color.js +16 -0
  17. data/features/data/BasicWrongOrder/Source/Widget/Input/Input.Color.js +19 -0
  18. data/features/data/BasicWrongOrder/package.yml +9 -0
  19. data/features/data/Extensions/Mootools/Source/Core.js +16 -0
  20. data/features/data/Extensions/Mootools/package.yml +8 -0
  21. data/features/data/Extensions/Source/Extensions/MootoolsCore.js +16 -0
  22. data/features/data/Extensions/Source/Library/Color.js +19 -0
  23. data/features/data/Extensions/package.yml +9 -0
  24. data/features/data/ExternalDependency/Mootools/Source/Core.js +16 -0
  25. data/features/data/ExternalDependency/Mootools/package.yml +8 -0
  26. data/features/data/ExternalDependency/Source/Library/Color.js +19 -0
  27. data/features/data/ExternalDependency/Source/Widget/Input/Input.Color.js +19 -0
  28. data/features/data/ExternalDependency/package.yml +9 -0
  29. data/features/data/ExternalDependencyWithExternalDependency/Leonardo/Source/Core.js +19 -0
  30. data/features/data/ExternalDependencyWithExternalDependency/Leonardo/package.yml +8 -0
  31. data/features/data/ExternalDependencyWithExternalDependency/Mootools/Source/Core.js +16 -0
  32. data/features/data/ExternalDependencyWithExternalDependency/Mootools/package.yml +8 -0
  33. data/features/data/ExternalDependencyWithExternalDependency/Source/Library/Color.js +19 -0
  34. data/features/data/ExternalDependencyWithExternalDependency/Source/Widget/Input/Input.Color.js +19 -0
  35. data/features/data/ExternalDependencyWithExternalDependency/package.yml +9 -0
  36. data/features/data/JsonPackage/Source/Library/Color.js +16 -0
  37. data/features/data/JsonPackage/Source/Widget/Input/Input.Color.js +19 -0
  38. data/features/data/JsonPackage/package.json +12 -0
  39. data/features/data/tmp2/package.js +35 -0
  40. data/features/data/tmp2/scripts.json +13 -0
  41. data/features/data/tmp2/tree.json +26 -0
  42. data/features/step_definitions/cli_steps.rb +53 -0
  43. data/features/support/env.rb +9 -0
  44. data/jsus.gemspec +42 -5
  45. metadata +45 -8
data/CHANGELOG CHANGED
@@ -1,4 +1,9 @@
1
1
  = Jsus Changelog
2
+ == Version 0.2.1
3
+ * Started adding cucumber features for command-line utility. Look into /features
4
+ directory for reference
5
+ * Removed choice gem from list of dependency. Using stdlib's optparse instead
6
+
2
7
  == Version 0.2.0
3
8
  * Support for mooforge validator (checks if every file has authors && license),
4
9
  more validators at request
data/Gemfile CHANGED
@@ -4,11 +4,11 @@ source "http://rubygems.org"
4
4
  gem "activesupport"
5
5
  gem "json_pure"
6
6
  gem "rgl"
7
- gem "choice"
8
7
 
9
8
  group :development do
10
9
  gem "bundler"
11
10
  gem "rspec"
11
+ gem "cucumber"
12
12
  gem "jeweler"
13
13
  gem "murdoc"
14
14
  end
@@ -2,14 +2,23 @@ GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
4
  activesupport (3.0.3)
5
- choice (0.1.4)
5
+ builder (3.0.0)
6
+ cucumber (0.10.0)
7
+ builder (>= 2.1.2)
8
+ diff-lcs (~> 1.1.2)
9
+ gherkin (~> 2.3.2)
10
+ json (~> 1.4.6)
11
+ term-ansicolor (~> 1.0.5)
6
12
  diff-lcs (1.1.2)
13
+ gherkin (2.3.3)
14
+ json (~> 1.4.6)
7
15
  git (1.2.5)
8
16
  haml (3.0.25)
9
17
  jeweler (1.5.2)
10
18
  bundler (~> 1.0.0)
11
19
  git (>= 1.2.5)
12
20
  rake
21
+ json (1.4.6)
13
22
  json_pure (1.4.6)
14
23
  murdoc (0.1.5)
15
24
  haml (~> 3.0.0)
@@ -30,6 +39,7 @@ GEM
30
39
  diff-lcs (~> 1.1.2)
31
40
  rspec-mocks (2.4.0)
32
41
  stream (0.5)
42
+ term-ansicolor (1.0.5)
33
43
 
34
44
  PLATFORMS
35
45
  ruby
@@ -37,7 +47,7 @@ PLATFORMS
37
47
  DEPENDENCIES
38
48
  activesupport
39
49
  bundler
40
- choice
50
+ cucumber
41
51
  jeweler
42
52
  json_pure
43
53
  murdoc
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
@@ -1 +1,2 @@
1
1
  Autotest.add_discovery { "rspec2" }
2
+ Autotest.add_discovery { "cucumber" }
data/bin/jsus CHANGED
@@ -1,120 +1,115 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'rubygems'
3
- begin
4
- require 'jsus'
5
- rescue LoadError
6
- $: << File.expand_path(File.dirname(__FILE__) + "/../lib")
7
- require "jsus"
3
+
4
+ if File.exists?('./lib/jsus.rb') # override with local version of jsus
5
+ $:.unshift File.expand_path(Dir.pwd) + "/lib"
6
+ elsif File.exists?(File.expand_path(File.dirname(__FILE__)) + "/../lib/jsus.rb")
7
+ $:.unshift File.expand_path(File.dirname(__FILE__)) + "/../lib"
8
8
  end
9
+ require 'jsus'
9
10
 
10
11
  require "fileutils"
11
- require 'choice'
12
+ require "optparse"
13
+
12
14
  start_time = Time.now
13
15
 
14
- Choice.options do
15
- header "Jsus version #{Jsus.version}"
16
+ options = {}
17
+ cli = OptionParser.new do |opts|
18
+ opts.banner = "jsus #{Jsus.version}. Usage: jsus [options] <input_dir> <output_dir>"
16
19
 
17
- option 'input_directory', :required => true do
18
- short "-i"
19
- long "--input-directory=DIRECTORY"
20
- desc "Path to directory containing your package to compile."
20
+ opts.on('-i', '--input-directory [DIR]', '[DEPRECATED] path to input directory ') do |dir|
21
+ $stderr.puts "DEPRECATION NOTICE: please do not use -i command-line argument"
22
+ options[:input_dir] = dir
21
23
  end
22
-
23
- option 'output_directory', :required => true do
24
- short "-o"
25
- long "--output-directory=DIRECTORY"
26
- desc "Path to directory to output the compiled package."
24
+
25
+ opts.on('-o', '--input-directory [DIR]', '[DEPRECATED] path to output directory ') do |dir|
26
+ $stderr.puts "DEPRECATION NOTICE: please do not use -o command-line argument"
27
+ options[:output_dir] = dir
28
+ end
29
+
30
+ opts.on('-d', '--with-dependencies [DEPS]', 'path to directory containing dependency packages') do |dir|
31
+ options[:deps_dir] = dir
27
32
  end
28
33
 
29
- option "dependencies", :required => false do
30
- short "-d"
31
- long "--with-dependencies=DIRECTORY"
32
- desc "Path to directory containing packages this package relies on. " <<
33
- "If set, all the packages will be compiled into a single file."
34
+ opts.on('-g', '--generate-includes', 'generates includes.js file that you may use for ad-hoc requiring of dependencies') do
35
+ options[:generate_includes] = true
34
36
  end
35
-
36
- option "without_scripts_info", :required => false do
37
- long "--without-scripts-info"
38
- desc "When this flag is set, jsus doesn't generate scripts.json" <<
39
- "file with general info about your package."
37
+
38
+ opts.on('--generate-docs [*CLASSES]', Array, "generate docs for some of the sources. When given empty array, defaults to /**/*") do |docs|
39
+ if !docs
40
+ options[:documented_classes] = ["/**/*"]
41
+ else
42
+ options[:documented_classes] = docs
43
+ end
40
44
  end
41
-
42
- option "without_tree", :required => false do
43
- long "--without-tree"
44
- desc "When this flag is set, jsus doesn't generate tree.json file" <<
45
- "with tree structure of your package."
45
+
46
+ opts.on('--no-syntax-highlight', 'if you turned on docs generation, it will use syntax highlighting by default. This option prevents it') do
47
+ options[:no_syntax_highlight] = true
46
48
  end
47
-
48
- option "generate_includes", :required => false do
49
- short "-g"
50
- long "--generate-includes=[ROOT]"
51
- desc "Generates includes.js file that you may use for ad-hoc requiring" <<
52
- "of the needed javascripts. Defaults to output_directory."
49
+
50
+ opts.on('--validate-with [*VALIDATORS]', Array, 'performs a check against some of the validators. Available validators: mooforge') do |validators|
51
+ options[:validators] = (validators || []).map {|v| v.downcase }
53
52
  end
54
-
55
- option "benchmark", :required => false do
56
- long "--benchmark"
57
- short "-b"
58
- desc "Performs a benchmark, indicating how much time you needed to" <<
59
- "compile the package"
53
+
54
+ opts.on_tail('-v', '--verbose', 'verbose mode, shows various debug messages') do
55
+ options[:verbose] = true
60
56
  end
61
57
 
62
- option "docs_classes", :required => false do
63
- default []
64
- long "--generate-docs *CLASSES"
65
- desc "Generate documentation for classes via murdoc. You need to use FULL PATHS, e.g.: " <<
66
- "/mootools/*, /LSD/*, /**/*"
67
-
58
+ opts.on_tail('-b', '--benchmark', 'shows time spent on various stages') do
59
+ options[:benchmark] = true
68
60
  end
69
-
70
- option "no_syntax_highlight", :required => false do
71
- default false
72
- long "--no-syntax-highlight"
73
- desc "Disable syntax highlighting in murdoc. Greatly increases docs generation speed. " <<
74
- "Note: This option won't have any effect unless you have Pygments installed."
61
+
62
+ opts.on_tail('--without-scripts-info', 'do not generate scripts.json') do
63
+ options[:without_scripts_info] = true
75
64
  end
76
-
77
- option "verbose", :required => false do
78
- default false
79
- short "-v"
80
- long "--verbose"
81
- desc "When verbose mode is enabled, some debug information is displayed. Defaults to false."
65
+
66
+ opts.on_tail('--without-tree-info', 'do not generate tree.json') do
67
+ options[:without_tree_info] = true
82
68
  end
83
-
84
- option "validate_with", :required => false do
85
- default []
86
- long "--validate-with *VALIDATORS"
87
- desc "performs validation of the resulting source. " <<
88
- "Available validators: mooforge"
69
+
70
+
71
+
72
+ opts.on_tail('-h', '--help', 'Show this message') do
73
+ puts opts
74
+ exit
89
75
  end
90
76
  end
77
+ cli.parse!
91
78
 
92
- compile_start_time = Time.now
79
+ options[:input_dir] ||= ARGV[0]
80
+ options[:output_dir] ||= ARGV[1]
93
81
 
94
- Jsus.verbose = Choice.choices[:verbose]
82
+ if !(options[:input_dir] && options[:output_dir])
83
+ puts cli
84
+ exit
85
+ end
95
86
 
87
+ compile_start_time = Time.now
88
+
89
+ Jsus.verbose = options[:verbose]
90
+
96
91
  pool_load_start_time = Time.now
97
- pool = if Choice.choices[:dependencies]
98
- Jsus::Pool.new(Choice.choices[:dependencies])
92
+ pool = if options[:deps_dir]
93
+ Jsus::Pool.new(options[:deps_dir])
99
94
  else
100
95
  Jsus::Pool.new
101
96
  end
102
97
  pool_load_finish_time = Time.now
103
98
 
104
- package = Jsus::Package.new(Choice.choices[:input_directory], :pool => pool)
105
- package.include_dependencies! if Choice.choices[:dependencies]
106
- output_directory = Choice.choices[:output_directory]
107
- package.compile(output_directory)
108
- package.generate_scripts_info(output_directory) unless Choice.choices[:without_scripts_info]
109
- package.generate_tree(output_directory) unless Choice.choices[:without_tree]
99
+ package = Jsus::Package.new(options[:input_dir], :pool => pool)
100
+ package.include_dependencies!
101
+ output_dir = options[:output_dir]
102
+ package.compile(output_dir)
103
+ package.generate_scripts_info(output_dir) unless options[:without_scripts_info]
104
+ package.generate_tree(output_dir) unless options[:without_tree_info]
110
105
 
111
106
  # Validations
112
107
  validators_map = {"mooforge" => Jsus::Validator::Mooforge}
113
- Choice.choices[:validate_with].each do |validator_name|
114
- if validator = validators_map[validator_name.downcase]
108
+ (options[:validators] || []).each do |validator_name|
109
+ if validator = validators_map[validator_name]
115
110
  errors = validator.new(pool.sources.to_a & package.source_files.to_a).validation_errors
116
111
  unless errors.empty?
117
- puts "Validator found errors: "
112
+ puts "Validator #{validator_name} found errors: "
118
113
  errors.each {|e| puts " * #{e}"}
119
114
  end
120
115
  else
@@ -123,35 +118,36 @@ Choice.choices[:validate_with].each do |validator_name|
123
118
  end
124
119
 
125
120
  # Hack, hack, hack :[
126
- if Choice.choices[:generate_includes]
127
- root = Choice.choices[:generate_includes] == true ? Choice.choices[:output_directory] : Choice.choices[:generate_includes]
128
- File.open(File.join(Choice.choices[:output_directory], "includes.js"), "w") do |f|
121
+ if options[:generate_includes]
122
+ File.open(File.join(output_dir, "includes.js"), "w") do |f|
129
123
  c = Jsus::Container.new(*(package.source_files.to_a + package.linked_external_dependencies.to_a))
130
124
  script = %{(function(prefix) {
131
125
  var sources = %sources%;
132
126
  for (var i = 0, j = sources.length; i < j; i++) document.write('<scr' + 'ipt src="' + (prefix || '') + sources[i] + '"></script>');
133
- })(window.prefix);}.sub("%sources%", JSON.pretty_generate(c.required_files(root)))
127
+ })(window.prefix);}.sub("%sources%", JSON.pretty_generate(c.required_files(output_dir)))
134
128
  f.puts script
135
129
  end
136
130
  end
137
131
 
132
+ docs_start_time = Time.now
138
133
  # Generate documentation
139
- unless Choice.choices[:docs_classes].empty?
140
- documenter = Jsus::Documenter.new(:highlight_source => !Choice.choices[:no_syntax_highlight])
134
+ if options[:documented_classes] && !options[:documented_classes].empty?
135
+ documenter = Jsus::Documenter.new(:highlight_source => !options[:no_syntax_highlight])
141
136
  package.source_files.each {|source| documenter << source }
142
137
  pool.sources.each {|source| documenter << source } if pool
143
- documenter.only(Choice.choices[:docs_classes]).generate(Choice.choices[:output_directory] + "/docs")
138
+ documenter.only(options[:documented_classes]).generate(output_dir + "/docs")
144
139
  end
145
-
140
+ docs_finish_time = Time.now
146
141
 
147
142
  finish_time = Time.now
148
143
 
149
144
 
150
- if Choice.choices[:benchmark]
145
+ if options[:benchmark]
151
146
  puts "Benchmarking results:"
152
147
  puts "Total execution time: #{format("%.3f" ,finish_time - start_time)}s"
153
148
  puts ""
154
149
  puts "Of them:"
155
150
  puts "Pool preloading time: #{format("%.3f", pool_load_finish_time - pool_load_start_time)}s"
151
+ puts "Docs generation time: #{format("%.3f", docs_finish_time - docs_start_time)}s" if options[:documented_classes]
156
152
  puts "Total compilation time: #{format("%.3f", finish_time - compile_start_time - (pool_load_finish_time - pool_load_start_time))}s"
157
153
  end
@@ -0,0 +1 @@
1
+ default: --format pretty --color
@@ -0,0 +1,99 @@
1
+ Feature: resolve dependencies
2
+ In order to resolve dependencies, jsus should use topological sort on the
3
+ dependency list.
4
+
5
+ Scenario: internal dependencies in correct order
6
+ When I run "jsus -i Basic -o tmp"
7
+ Then the following files should exist:
8
+ | tmp/package.js |
9
+ And file "tmp/package.js" should contain
10
+ """
11
+ /*
12
+ ---
13
+
14
+ script: Color.js
15
+
16
+ description: A library to work with colors
17
+
18
+ license: MIT-style license
19
+
20
+ authors:
21
+ - Valerio Proietti
22
+
23
+ provides: [Color]
24
+
25
+ ...
26
+ */
27
+ """
28
+ And file "tmp/package.js" should contain
29
+ """
30
+ /*
31
+ ---
32
+
33
+ script: Input.Color.js
34
+
35
+ description: Cool colorpicker for everyone to enjoy
36
+
37
+ license: MIT-style license
38
+
39
+ authors:
40
+ - Yaroslaff Fedin
41
+
42
+ requires:
43
+ - Color
44
+
45
+ provides: [Input.Color]
46
+
47
+ ...
48
+ */
49
+ """
50
+ And file "tmp/package.js" should have "script: Color.js" before "script: Input.Color.js"
51
+
52
+
53
+
54
+ Scenario: internal dependencies in wrong order
55
+ When I run "jsus -i BasicWrongOrder -o tmp"
56
+ Then the following files should exist:
57
+ | tmp/package.js |
58
+ And file "tmp/package.js" should contain
59
+ """
60
+ /*
61
+ ---
62
+
63
+ script: Color.js
64
+
65
+ description: A library to work with colors
66
+
67
+ license: MIT-style license
68
+
69
+ authors:
70
+ - Valerio Proietti
71
+
72
+ provides: [Color]
73
+
74
+ ...
75
+ */
76
+ """
77
+ And file "tmp/package.js" should contain
78
+ """
79
+ /*
80
+ ---
81
+
82
+ script: Input.Color.js
83
+
84
+ description: Cool colorpicker for everyone to enjoy
85
+
86
+ license: MIT-style license
87
+
88
+ authors:
89
+ - Yaroslaff Fedin
90
+
91
+ requires:
92
+ - Color
93
+
94
+ provides: [Input.Color]
95
+
96
+ ...
97
+ */
98
+ """
99
+ And file "tmp/package.js" should have "script: Color.js" before "script: Input.Color.js"
@@ -0,0 +1,70 @@
1
+ Feature: extensions
2
+ In order to monkeypatch other libraries, I should be able to cook some
3
+ extensions.
4
+
5
+ Scenario: monkeypatch for external dependency
6
+ When I run "jsus -i Extensions -o tmp -d Extensions/Mootools"
7
+ Then the following files should exist:
8
+ | tmp/package.js |
9
+ And file "tmp/package.js" should contain
10
+ """
11
+ /*
12
+ ---
13
+
14
+ script: Core.js
15
+
16
+ description: Mootools fake core
17
+
18
+ license: MIT-style license
19
+
20
+ authors:
21
+ - Valerio Proietti
22
+
23
+ provides: [Core]
24
+
25
+ ...
26
+ */
27
+ """
28
+ And file "tmp/package.js" should contain
29
+ """
30
+ /*
31
+ ---
32
+
33
+ script: MootooolsCore.js
34
+
35
+ description: Extension for mootools core
36
+
37
+ license: MIT-style license
38
+
39
+ authors:
40
+ - Mark Abramov
41
+
42
+ extends: Mootools/Core
43
+
44
+ ...
45
+ */
46
+ """
47
+ And file "tmp/package.js" should contain
48
+ """
49
+ /*
50
+ ---
51
+
52
+ script: Color.js
53
+
54
+ description: A library to work with colors
55
+
56
+ license: MIT-style license
57
+
58
+ authors:
59
+ - Valerio Proietti
60
+
61
+ requires:
62
+ - Mootools/Core
63
+
64
+ provides: [Color]
65
+
66
+ ...
67
+ */
68
+ """
69
+ And file "tmp/package.js" should have "MootooolsCore.js" after "script: Core.js"
70
+ And file "tmp/package.js" should have "MootooolsCore.js" before "script: Color.js"