dependence 0.0.4 → 0.0.6
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/bin/dependence +100 -25
- data/lib/dependence/concatenator.rb +55 -0
- data/lib/dependence/file_watcher.rb +7 -3
- data/lib/dependence/js_compiler.rb +11 -23
- data/lib/dependence/module_injector.rb +28 -0
- data/lib/dependence.rb +6 -0
- metadata +8 -8
data/bin/dependence
CHANGED
@@ -1,46 +1,121 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$: << "."
|
4
|
+
require 'rubygems'
|
5
|
+
require 'coffee-script'
|
6
|
+
require 'lib/dependence'
|
2
7
|
require 'optparse'
|
3
8
|
require File.join(File.dirname(__FILE__), "..", "lib/dependence.rb")
|
4
9
|
|
5
|
-
|
10
|
+
class DependenceCompiler
|
11
|
+
def initialize(config)
|
12
|
+
@config = config
|
13
|
+
@src_glob = "**/*.#{@config[:type]}"
|
14
|
+
@concatenator = Dependence::Concatenator.new(
|
15
|
+
:load_path => @config[:src_dir],
|
16
|
+
:source_type => @src_glob
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
def compile
|
21
|
+
@config[:watch] ? compile_with_watcher : run_compile
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def compile_with_watcher
|
27
|
+
FileWatcher.new(:load_path => @config[:src_dir], :glob_str => @src_glob) do
|
28
|
+
run_compile
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def run_compile
|
33
|
+
begin
|
34
|
+
@concatenator.concat do |module_name, module_content|
|
35
|
+
stdout_compile_msg(module_name)
|
36
|
+
output = File.join(@config[:output], "#{module_name}.js")
|
37
|
+
compiled = compile_code(module_content)
|
38
|
+
compiled = ModuleInjector.modularize(module_name, compiled) unless @config[:bare]
|
39
|
+
File.open(output, 'w') { |f| f.syswrite compiled }
|
40
|
+
|
41
|
+
stdout_compile_complete_msg(module_name, output)
|
42
|
+
compress_code(output) if @config[:compress]
|
43
|
+
end
|
44
|
+
|
45
|
+
rescue
|
46
|
+
puts Colors.red("exiting")
|
47
|
+
exit 1
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def stdout_compile_msg(module_name)
|
53
|
+
puts ""
|
54
|
+
puts "================================"
|
55
|
+
puts Colors.green("Detected Module: #{module_name}")
|
56
|
+
puts "================================"
|
57
|
+
end
|
58
|
+
|
59
|
+
def stdout_compile_complete_msg(module_name, output)
|
60
|
+
puts Colors.green("Compiled #{module_name} to #{output}")
|
61
|
+
end
|
62
|
+
|
63
|
+
def compile_code(raw_code)
|
64
|
+
return CoffeeScript.compile(raw_code, :bare => true) if @config[:type] == "coffee"
|
65
|
+
raw_code
|
66
|
+
end
|
67
|
+
|
68
|
+
def compress_code(source_file)
|
69
|
+
JsCompiler.new(source_file).compile
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
options = {
|
75
|
+
:output => ".",
|
76
|
+
:type => "js",
|
77
|
+
:watch => false,
|
78
|
+
:bare => false,
|
79
|
+
:compress => false
|
80
|
+
}
|
81
|
+
|
6
82
|
OptionParser.new do |opts|
|
7
|
-
opts.banner = "Usage:
|
83
|
+
opts.banner = "Usage: src_dir [options]"
|
8
84
|
|
9
|
-
opts.on("-o", "--output
|
10
|
-
options[:output] =
|
85
|
+
opts.on("-o", "--output DIR", "Output directory, defaults to '.'") do |dir|
|
86
|
+
options[:output] = dir
|
11
87
|
end
|
12
88
|
|
13
|
-
opts.on("-
|
89
|
+
opts.on("-t", "--type TYPE", "Source file extension [js, coffee]") do |type|
|
90
|
+
options[:type] = type
|
91
|
+
end
|
92
|
+
|
93
|
+
opts.on("-w", "--watch", "Watch src_dir for changes and recompile") do |bool|
|
14
94
|
options[:watch] = bool
|
15
95
|
end
|
96
|
+
|
97
|
+
opts.on("-b", "--bare", "Do not wrap modules in closures with export var") do |bool|
|
98
|
+
options[:bare] = bool
|
99
|
+
end
|
100
|
+
|
101
|
+
opts.on("-c", "--compress", "Compress output with Googles Closure compiler") do |bool|
|
102
|
+
options[:compress] = bool
|
103
|
+
end
|
104
|
+
|
16
105
|
end.parse(ARGV)
|
17
106
|
|
18
107
|
if ARGV.length < 1
|
19
|
-
puts "You need
|
108
|
+
puts "You need a src directory to compile from!"
|
20
109
|
exit 1
|
21
|
-
elsif !File.directory? ARGV[0]
|
22
|
-
puts "
|
110
|
+
elsif !File.directory? ARGV[0]
|
111
|
+
puts "#{ARGV[0]} is not a directory!"
|
23
112
|
exit 1
|
24
113
|
end
|
25
114
|
|
26
|
-
options[:
|
27
|
-
output_file = options[:output]
|
28
|
-
compiler = JsCompiler.new(options[:input])
|
29
|
-
|
30
|
-
def recompile(compiler, output_file)
|
31
|
-
File.delete(output_file) if File.exists?(output_file)
|
32
|
-
compiler.compile(output_file)
|
33
|
-
end
|
34
|
-
|
35
|
-
recompile compiler, output_file
|
36
|
-
|
37
|
-
if options[:watch]
|
38
|
-
puts "Watching #{options[:input]} for changes. Your javascript files will be compiled automatically"
|
39
|
-
FileWatcher.new "**/*.js" do
|
40
|
-
recompile compiler, output_file
|
41
|
-
end
|
42
|
-
end
|
115
|
+
options[:src_dir] = ARGV[0]
|
43
116
|
|
44
117
|
|
118
|
+
compiler = DependenceCompiler.new options
|
119
|
+
compiler.compile
|
45
120
|
|
46
121
|
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require File.join(File.dirname(__FILE__), 'colors')
|
3
|
+
|
4
|
+
module Dependence
|
5
|
+
# Take a load path + file glob and concat them into 1 file per directory
|
6
|
+
class Concatenator
|
7
|
+
@@defaults = {
|
8
|
+
:load_path => ".",
|
9
|
+
:source_type => "**/*.js"
|
10
|
+
}
|
11
|
+
|
12
|
+
def initialize(opts = {})
|
13
|
+
@options = @@defaults.merge(opts)
|
14
|
+
end
|
15
|
+
|
16
|
+
def concat(&block)
|
17
|
+
get_dirs.each { |dir| concat_module(dir, &block) }
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def concat_module(dir, &block)
|
23
|
+
module_name = File.basename(dir)
|
24
|
+
|
25
|
+
files = Dir.glob File.join(dir, @options[:source_type])
|
26
|
+
no_files_error if files.empty?
|
27
|
+
|
28
|
+
files_list = get_files_in_dependency_order(dir, files)
|
29
|
+
|
30
|
+
block.call module_name, concat_files(files_list)
|
31
|
+
end
|
32
|
+
|
33
|
+
def no_files_error
|
34
|
+
puts Colors.red("No files of the specified type #{File.extname(@options[:source_type])} were found in #{@options[:load_path]}")
|
35
|
+
throw :no_files_to_concatenate
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_files_in_dependency_order(dir, files)
|
39
|
+
resolver = DependencyResolver.new(files, dir)
|
40
|
+
resolver.sorted_files
|
41
|
+
end
|
42
|
+
|
43
|
+
def concat_files(file_list)
|
44
|
+
content = ""
|
45
|
+
file_list.each { |f| content << File.read(f); content << "\n" }
|
46
|
+
content
|
47
|
+
end
|
48
|
+
|
49
|
+
# Top level dirs only
|
50
|
+
def get_dirs
|
51
|
+
Dir.glob("#{@options[:load_path]}/*/**/")
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -1,6 +1,10 @@
|
|
1
1
|
class FileWatcher
|
2
|
-
|
3
|
-
|
2
|
+
@@defaults = {
|
3
|
+
:load_path => ".",
|
4
|
+
:glob_str => "**/*.js"
|
5
|
+
}
|
6
|
+
def initialize(opts, &block)
|
7
|
+
@options = @@defaults.merge(opts)
|
4
8
|
recreate_timetable
|
5
9
|
poll(&block)
|
6
10
|
end
|
@@ -32,7 +36,7 @@ class FileWatcher
|
|
32
36
|
end
|
33
37
|
|
34
38
|
def get_files
|
35
|
-
Dir.glob @
|
39
|
+
Dir.glob File.join(@options[:load_path], @options[:glob_str])
|
36
40
|
end
|
37
41
|
|
38
42
|
def recreate_timetable
|
@@ -2,36 +2,24 @@ require File.join(File.dirname(__FILE__),'dependency_resolver')
|
|
2
2
|
require File.join(File.dirname(__FILE__),'colors')
|
3
3
|
|
4
4
|
class JsCompiler
|
5
|
-
def initialize(
|
6
|
-
|
5
|
+
def initialize(source_file, output_file = nil)
|
6
|
+
output_file = source_file.gsub(".js", ".min.js") unless output_file
|
7
|
+
@source = source_file
|
8
|
+
@output = output_file
|
7
9
|
end
|
8
10
|
|
9
|
-
def compile
|
11
|
+
def compile
|
10
12
|
@cmd = cmd_prefix
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
puts "#{Colors.green('Source Files')}: #{file_order.to_s}"
|
15
|
-
puts ""
|
16
|
-
puts Colors.red "Compiler Output:"
|
17
|
-
file_order.each {|source_file| add_file source_file }
|
18
|
-
execute_compile(output_file)
|
13
|
+
puts Colors.green("Compressing: #{@source}")
|
14
|
+
puts Colors.red "Compressor Output:"
|
15
|
+
execute_compile
|
19
16
|
end
|
20
17
|
|
21
18
|
private
|
22
|
-
def
|
23
|
-
@cmd += " --js
|
24
|
-
end
|
25
|
-
|
26
|
-
def get_source_files
|
27
|
-
Dir.glob File.join(@source_path,"/**/*.js")
|
28
|
-
end
|
29
|
-
|
30
|
-
def execute_compile(output_file)
|
31
|
-
@cmd += " --js_output_file #{output_file}"
|
19
|
+
def execute_compile
|
20
|
+
@cmd += " --js #{@source} --js_output_file #{@output}"
|
32
21
|
`#{@cmd}`
|
33
|
-
puts Colors.green("
|
34
|
-
puts "------------------------------------------------------"
|
22
|
+
puts Colors.green("compressed #{@source} to #{@output}")
|
35
23
|
end
|
36
24
|
|
37
25
|
def cmd_prefix
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Wraps code in a closure that provides an exports object to attach properties to the global namespace
|
2
|
+
module ModuleInjector
|
3
|
+
extend self
|
4
|
+
|
5
|
+
@@module_code = <<MODULE_FUNC
|
6
|
+
var global = (global != undefined)? global : window
|
7
|
+
|
8
|
+
if (global.module == undefined) {
|
9
|
+
global.module = function(name, body) {
|
10
|
+
var exports = global[name]
|
11
|
+
if (exports == undefined) {
|
12
|
+
global[name] = {}
|
13
|
+
}
|
14
|
+
body(exports)
|
15
|
+
}
|
16
|
+
}
|
17
|
+
MODULE_FUNC
|
18
|
+
|
19
|
+
def modularize(name, content)
|
20
|
+
module_code = <<-JS
|
21
|
+
#{@@module_code}
|
22
|
+
|
23
|
+
module('#{name.capitalize}', function(exports) {
|
24
|
+
#{content}
|
25
|
+
})
|
26
|
+
JS
|
27
|
+
end
|
28
|
+
end
|
data/lib/dependence.rb
CHANGED
@@ -1,2 +1,8 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "dependence", "dependency_resolver.rb")
|
2
|
+
require File.join(File.dirname(__FILE__), "dependence", "module_injector.rb")
|
1
3
|
require File.join(File.dirname(__FILE__), 'dependence', 'js_compiler.rb')
|
2
4
|
require File.join(File.dirname(__FILE__), "dependence", "file_watcher.rb")
|
5
|
+
require File.join(File.dirname(__FILE__), "dependence", "concatenator.rb")
|
6
|
+
|
7
|
+
module Dependence
|
8
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dependence
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Joshua Carver
|
@@ -15,8 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable:
|
18
|
+
date: 2011-08-22 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
21
|
name: rgl
|
@@ -44,11 +43,12 @@ files:
|
|
44
43
|
- bin/dependence
|
45
44
|
- compiler/compiler.jar
|
46
45
|
- lib/dependence/colors.rb
|
46
|
+
- lib/dependence/concatenator.rb
|
47
47
|
- lib/dependence/dependency_resolver.rb
|
48
48
|
- lib/dependence/file_watcher.rb
|
49
49
|
- lib/dependence/js_compiler.rb
|
50
|
+
- lib/dependence/module_injector.rb
|
50
51
|
- lib/dependence.rb
|
51
|
-
has_rdoc: true
|
52
52
|
homepage:
|
53
53
|
licenses: []
|
54
54
|
|
@@ -79,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements: []
|
80
80
|
|
81
81
|
rubyforge_project:
|
82
|
-
rubygems_version: 1.
|
82
|
+
rubygems_version: 1.8.7
|
83
83
|
signing_key:
|
84
84
|
specification_version: 3
|
85
85
|
summary: An easy way to handle your client side javascript dependencies
|