cup 0.0.1 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +0 -1
- data/.pryrc +9 -0
- data/.rdebugrc +0 -0
- data/.rspec +2 -0
- data/Gemfile.lock +115 -0
- data/README.md +82 -2
- data/Rakefile +1 -3
- data/TODO +13 -0
- data/bin/cup +2 -17
- data/cup.gemspec +27 -11
- data/js/extra_matchers.js +29 -0
- data/lib/cup/builder.rb +127 -0
- data/lib/cup/command_line.rb +225 -0
- data/lib/cup/cupfile.rb +116 -0
- data/lib/cup/directory.rb +96 -0
- data/lib/cup/noop_shell.rb +12 -0
- data/lib/cup/server/app.rb +138 -0
- data/lib/cup/server/middleware.rb +27 -0
- data/lib/cup/server/view_scope.rb +108 -0
- data/lib/cup/server/visual_specs.rb +33 -0
- data/lib/cup/version.rb +3 -0
- data/lib/cup.rb +54 -2
- data/spec/cup/builder_spec.rb +164 -0
- data/spec/cup/command_line_spec.rb +182 -0
- data/spec/cup/cupfile_spec.rb +228 -0
- data/spec/cup/directory_spec.rb +223 -0
- data/spec/cup/server/app_spec.rb +63 -0
- data/spec/cup/server/visual_specs_spec.rb +30 -0
- data/spec/env.rb +2 -0
- data/spec/spec_helper.rb +28 -1
- data/spec/support/javascript_load_order_acceptor.rb +63 -0
- data/spec/support/javascripts_matchers.rb +22 -0
- data/spec/support/macros.rb +74 -0
- data/spec/support/stub_helpers.rb +30 -0
- data/views/blank.slim +9 -0
- data/views/cup.coffee +4 -0
- data/views/cup.sass +167 -0
- data/views/layout.slim +53 -0
- data/views/not_found.slim +3 -0
- data/views/root.slim +42 -0
- data/views/spec.slim +5 -0
- data/views/visual.slim +13 -0
- metadata +197 -22
- data/.versionify +0 -1
- data/spec/cup_cli.spec.rb +0 -12
data/.gitignore
CHANGED
data/.pryrc
ADDED
data/.rdebugrc
ADDED
File without changes
|
data/.rspec
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
cup (0.0.2)
|
5
|
+
activemodel
|
6
|
+
coffee-script
|
7
|
+
rake
|
8
|
+
sass
|
9
|
+
sinatra
|
10
|
+
slim
|
11
|
+
therubyracer
|
12
|
+
thor
|
13
|
+
uglifier
|
14
|
+
yard
|
15
|
+
|
16
|
+
GEM
|
17
|
+
remote: http://rubygems.org/
|
18
|
+
specs:
|
19
|
+
activemodel (3.1.1)
|
20
|
+
activesupport (= 3.1.1)
|
21
|
+
builder (~> 3.0.0)
|
22
|
+
i18n (~> 0.6)
|
23
|
+
activesupport (3.1.1)
|
24
|
+
multi_json (~> 1.0)
|
25
|
+
archive-tar-minitar (0.5.2)
|
26
|
+
backports (2.3.0)
|
27
|
+
builder (3.0.0)
|
28
|
+
coffee-script (2.2.0)
|
29
|
+
coffee-script-source
|
30
|
+
execjs
|
31
|
+
coffee-script-source (1.1.2)
|
32
|
+
columnize (0.3.4)
|
33
|
+
daemons (1.1.4)
|
34
|
+
diff-lcs (1.1.3)
|
35
|
+
eventmachine (0.12.10)
|
36
|
+
execjs (1.2.9)
|
37
|
+
multi_json (~> 1.0)
|
38
|
+
i18n (0.6.0)
|
39
|
+
libv8 (3.3.10.2)
|
40
|
+
linecache19 (0.5.12)
|
41
|
+
ruby_core_source (>= 0.1.4)
|
42
|
+
monkey-lib (0.5.4)
|
43
|
+
backports
|
44
|
+
multi_json (1.0.3)
|
45
|
+
rack (1.3.3)
|
46
|
+
rack-protection (1.1.4)
|
47
|
+
rack
|
48
|
+
rack-test (0.6.1)
|
49
|
+
rack (>= 1.0)
|
50
|
+
rake (0.9.2)
|
51
|
+
rspec (2.6.0)
|
52
|
+
rspec-core (~> 2.6.0)
|
53
|
+
rspec-expectations (~> 2.6.0)
|
54
|
+
rspec-mocks (~> 2.6.0)
|
55
|
+
rspec-core (2.6.4)
|
56
|
+
rspec-expectations (2.6.0)
|
57
|
+
diff-lcs (~> 1.1.2)
|
58
|
+
rspec-mocks (2.6.0)
|
59
|
+
ruby-debug-base19 (0.11.25)
|
60
|
+
columnize (>= 0.3.1)
|
61
|
+
linecache19 (>= 0.5.11)
|
62
|
+
ruby_core_source (>= 0.1.4)
|
63
|
+
ruby-debug19 (0.11.6)
|
64
|
+
columnize (>= 0.3.1)
|
65
|
+
linecache19 (>= 0.5.11)
|
66
|
+
ruby-debug-base19 (>= 0.11.19)
|
67
|
+
ruby_core_source (0.1.5)
|
68
|
+
archive-tar-minitar (>= 0.5.2)
|
69
|
+
sass (3.1.10)
|
70
|
+
shoulda (2.11.3)
|
71
|
+
sinatra (1.3.0)
|
72
|
+
rack (~> 1.3)
|
73
|
+
rack-protection (~> 1.1)
|
74
|
+
tilt (~> 1.3)
|
75
|
+
sinatra-advanced-routes (0.5.1)
|
76
|
+
monkey-lib (~> 0.5.0)
|
77
|
+
sinatra (~> 1.0)
|
78
|
+
sinatra-sugar (~> 0.5.0)
|
79
|
+
sinatra-reloader (0.5.0)
|
80
|
+
sinatra (~> 1.0)
|
81
|
+
sinatra-advanced-routes (~> 0.5.0)
|
82
|
+
sinatra-sugar (0.5.1)
|
83
|
+
monkey-lib (~> 0.5.0)
|
84
|
+
sinatra (~> 1.0)
|
85
|
+
slim (1.0.3)
|
86
|
+
temple (~> 0.3.4)
|
87
|
+
tilt (~> 1.3.2)
|
88
|
+
statemachine (1.2.0)
|
89
|
+
temple (0.3.4)
|
90
|
+
therubyracer (0.9.8)
|
91
|
+
libv8 (~> 3.3.10)
|
92
|
+
thin (1.2.11)
|
93
|
+
daemons (>= 1.0.9)
|
94
|
+
eventmachine (>= 0.12.6)
|
95
|
+
rack (>= 1.0.0)
|
96
|
+
thor (0.14.6)
|
97
|
+
tilt (1.3.3)
|
98
|
+
uglifier (1.0.3)
|
99
|
+
execjs (>= 0.3.0)
|
100
|
+
multi_json (>= 1.0.2)
|
101
|
+
yard (0.7.2)
|
102
|
+
|
103
|
+
PLATFORMS
|
104
|
+
ruby
|
105
|
+
|
106
|
+
DEPENDENCIES
|
107
|
+
cup!
|
108
|
+
rack (= 1.3.3)
|
109
|
+
rack-test
|
110
|
+
rspec
|
111
|
+
ruby-debug19
|
112
|
+
shoulda
|
113
|
+
sinatra-reloader
|
114
|
+
statemachine
|
115
|
+
thin
|
data/README.md
CHANGED
@@ -1,6 +1,86 @@
|
|
1
1
|
Cup
|
2
2
|
===
|
3
3
|
|
4
|
-
##
|
4
|
+
## From ruby:
|
5
|
+
|
6
|
+
Cup.build
|
7
|
+
Cup.cup_name
|
8
|
+
Cup.minified
|
9
|
+
Cup.concatenated
|
10
|
+
Cup.version
|
11
|
+
|
12
|
+
|
13
|
+
## CLI helper output
|
14
|
+
|
15
|
+
* INSERT HERE
|
16
|
+
|
17
|
+
|
18
|
+
## Features
|
19
|
+
|
20
|
+
|
21
|
+
* Automatically includes javascripts, easy DSL for customizing their order
|
22
|
+
>>>> but NOT from inside spec/visuals1
|
23
|
+
|
24
|
+
* can uglify your project `cup build`
|
25
|
+
** concatenates lib**/*.js and src/**/*.js into unminified and minified outputs in ./build
|
26
|
+
|
27
|
+
* `cup serve`
|
28
|
+
** landing page for all serve capabilities
|
29
|
+
** serve specs in concatenated and debug modes
|
30
|
+
** serve visual spec index and serve spec/visual/**/*.spec.erb
|
31
|
+
** includes all css files in every request
|
32
|
+
** sinatra server extendable by add `server do <sinatra endpoints> end` to the Cupfile
|
33
|
+
|
34
|
+
@pages ||= {
|
35
|
+
:root => Page.new.tap do |page|
|
36
|
+
page.path = '/'
|
37
|
+
page.name = 'root'
|
38
|
+
page.template = :root
|
39
|
+
page.description = 'List of available pages'
|
40
|
+
end,
|
41
|
+
:debug => Page.new.tap do |page|
|
42
|
+
page.path = '/debug'
|
43
|
+
page.name = 'debug'
|
44
|
+
page.template = :debug
|
45
|
+
page.description = 'Headed page with lib and src javascript included'
|
46
|
+
end,
|
47
|
+
:empty => Page.new.tap do |page|
|
48
|
+
page.path = '/empty'
|
49
|
+
page.name = 'empty'
|
50
|
+
page.template = :debug
|
51
|
+
page.options[:layout] = false
|
52
|
+
page.description = 'Totally blank page with lib and src javascript included'
|
53
|
+
end,
|
54
|
+
:spec => Page.new.tap do |page|
|
55
|
+
page.path = '/spec'
|
56
|
+
page.name = 'specs'
|
57
|
+
page.template = :spec
|
58
|
+
page.options[:javascripts_scheme] = :spec
|
59
|
+
page.description = 'Run Jasmine specs on lib and src'
|
60
|
+
end,
|
61
|
+
:spec_concatenated => Page.new.tap do |page|
|
62
|
+
page.path = '/spec/concatenated'
|
63
|
+
page.name = 'specs on build output'
|
64
|
+
page.template = :spec
|
65
|
+
page.options[:javascripts_scheme] = :spec_concatenated
|
66
|
+
page.description = 'Run Jasmine specs on the build output'
|
67
|
+
end,
|
68
|
+
:spec_minified => Page.new.tap do |page|
|
69
|
+
page.path = '/spec/minified'
|
70
|
+
page.name = 'specs on minified build output'
|
71
|
+
page.template = :spec
|
72
|
+
page.options[:javascripts_scheme] = :spec_minified
|
73
|
+
page.description = 'Run Jasmine specs on minified build output'
|
74
|
+
end,
|
75
|
+
:spec_visual => Page.new.tap do |page|
|
76
|
+
page.path = '/spec/visual'
|
77
|
+
page.name = 'visual specs'
|
78
|
+
page.template = :spec
|
79
|
+
page.description = 'View available visual specs'
|
80
|
+
end
|
81
|
+
}
|
82
|
+
|
83
|
+
* uglified options overridable in Cupfile
|
84
|
+
before_build and after_build hooks are available too
|
85
|
+
* requires git
|
5
86
|
|
6
|
-
`cup <name>`
|
data/Rakefile
CHANGED
data/TODO
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
> RUN every command line task
|
2
|
+
> VISIT every server page
|
3
|
+
|
4
|
+
>> rebuild superview, js-core-ext (rename to js-core-ext)
|
5
|
+
|
6
|
+
> INSPECT concatenated and minified output
|
7
|
+
|
8
|
+
> README
|
9
|
+
---- Later ----
|
10
|
+
|
11
|
+
Rails app integration
|
12
|
+
* integrate with the jasmine-rails gem to run specs on the command line
|
13
|
+
* integrate with the asset pipeline
|
data/bin/cup
CHANGED
@@ -1,19 +1,4 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require 'thor'
|
3
|
-
require 'cup'
|
4
2
|
|
5
|
-
|
6
|
-
|
7
|
-
desc "create NAME", "Creates a new project structure with the specified name. Can also be called like: cup <name> [options]"
|
8
|
-
method_option 'no-jquery'
|
9
|
-
def create(name)
|
10
|
-
puts "create: #{name}"
|
11
|
-
end
|
12
|
-
|
13
|
-
def method_missing (*params)
|
14
|
-
params.length == 1 ? create(*params) : super
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
CupCli.start
|
3
|
+
require 'cup/command_line'
|
4
|
+
Cup::CommandLine.start
|
data/cup.gemspec
CHANGED
@@ -1,26 +1,42 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'cup/version'
|
3
4
|
|
4
5
|
Gem::Specification.new do |s|
|
5
6
|
s.name = 'cup'
|
6
|
-
s.version =
|
7
|
+
s.version = Cup::VERSION
|
7
8
|
s.authors = ['Sam Taylor']
|
8
9
|
s.email = ['sjltaylor@gmail.com']
|
9
10
|
s.homepage = ''
|
10
11
|
s.summary = 'ruby based tools for developing javascript libraries'
|
11
12
|
# s.description = %q{TODO: Write a gem description}
|
12
|
-
|
13
|
-
|
14
|
-
s.add_dependency 'sinatra'
|
15
|
-
s.add_dependency 'versionify'
|
16
|
-
s.add_dependency 'uglifier'
|
17
|
-
s.add_dependency 'therubyracer'
|
18
|
-
s.add_dependency 'thor'
|
19
|
-
|
13
|
+
|
14
|
+
|
20
15
|
s.rubyforge_project = 'cup'
|
21
|
-
|
16
|
+
|
22
17
|
s.files = `git ls-files`.split("\n")
|
23
18
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
24
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
25
20
|
s.require_paths = ['lib']
|
21
|
+
|
22
|
+
s.add_runtime_dependency 'thor'
|
23
|
+
s.add_runtime_dependency 'activemodel'
|
24
|
+
s.add_runtime_dependency 'rake'
|
25
|
+
s.add_runtime_dependency 'therubyracer'
|
26
|
+
s.add_runtime_dependency 'uglifier'
|
27
|
+
s.add_runtime_dependency 'sinatra'
|
28
|
+
s.add_runtime_dependency 'slim'
|
29
|
+
s.add_runtime_dependency 'sass'
|
30
|
+
s.add_runtime_dependency 'coffee-script'
|
31
|
+
s.add_runtime_dependency 'yard'
|
32
|
+
|
33
|
+
s.add_development_dependency 'ruby-debug19'
|
34
|
+
s.add_development_dependency 'rspec'
|
35
|
+
s.add_development_dependency 'shoulda'
|
36
|
+
s.add_development_dependency 'statemachine'
|
37
|
+
s.add_development_dependency 'rack', '=1.3.3'
|
38
|
+
s.add_development_dependency 'rack-test'
|
39
|
+
s.add_development_dependency 'thin'
|
40
|
+
s.add_development_dependency 'sinatra-reloader'
|
41
|
+
|
26
42
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
/*
|
2
|
+
|
3
|
+
These jasmine matchers are included by default when a project is created with cup.
|
4
|
+
|
5
|
+
*/
|
6
|
+
beforeEach(function() {
|
7
|
+
this.addMatchers({
|
8
|
+
toBeAFunction: function() {
|
9
|
+
return typeof this.actual === 'function';
|
10
|
+
},
|
11
|
+
toBeInstanceOf: function (ctor) {
|
12
|
+
return this.actual instanceof ctor;
|
13
|
+
},
|
14
|
+
toContain: function (a) {
|
15
|
+
return this.actual.contains(a);
|
16
|
+
},
|
17
|
+
toBeEmpty: function () {
|
18
|
+
return this.actual.isEmpty();
|
19
|
+
},
|
20
|
+
toThrowAnError: function () {
|
21
|
+
try {
|
22
|
+
this.actual()
|
23
|
+
} catch (e) {
|
24
|
+
return e instanceof Error;
|
25
|
+
}
|
26
|
+
return false;
|
27
|
+
}
|
28
|
+
});
|
29
|
+
});
|
data/lib/cup/builder.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'uglifier'
|
2
|
+
require 'cup/noop_shell'
|
3
|
+
|
4
|
+
module Cup
|
5
|
+
class Builder
|
6
|
+
extend FileUtils
|
7
|
+
|
8
|
+
attr_reader :directory
|
9
|
+
|
10
|
+
def initialize directory
|
11
|
+
@directory = directory
|
12
|
+
@before_build_enabled = true
|
13
|
+
@after_build_enabled = true
|
14
|
+
end
|
15
|
+
|
16
|
+
def build *params
|
17
|
+
cupfile.before_build.call
|
18
|
+
concatenated = concatenate *params
|
19
|
+
minified = minify *params
|
20
|
+
cupfile.after_build.call
|
21
|
+
{
|
22
|
+
:concatenated => concatenated,
|
23
|
+
:minified => minified
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def build! *params
|
28
|
+
cupfile.before_build.call
|
29
|
+
concatenated = concatenate! *params
|
30
|
+
minified = minify! *params
|
31
|
+
cupfile.after_build.call
|
32
|
+
{
|
33
|
+
:concatenated => concatenated,
|
34
|
+
:minified => minified
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def concatenate *params
|
39
|
+
{:status => :ok, :output => (concatenate! *params)}
|
40
|
+
rescue Exception => e
|
41
|
+
{:status => :failed, :exception => e}
|
42
|
+
end
|
43
|
+
|
44
|
+
def minify *params
|
45
|
+
{:status => :ok, :output => (minify! *params)}
|
46
|
+
rescue Exception => e
|
47
|
+
{:status => :failed, :exception => e}
|
48
|
+
end
|
49
|
+
|
50
|
+
def concatenate!(options = {})
|
51
|
+
process(options, :concatenated) do |input_file_content|
|
52
|
+
input_file_content
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def minify!(options = {})
|
57
|
+
uglifier_options = uglifier_defaults.merge directory.cupfile.uglifier_options
|
58
|
+
|
59
|
+
process(options, :minified) do |input_file_content|
|
60
|
+
Uglifier.compile input_file_content, uglifier_options
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def process(options, output_file)
|
67
|
+
|
68
|
+
relative_output_file = directory.send output_file, :relative => true
|
69
|
+
output_file = directory.send output_file
|
70
|
+
|
71
|
+
options = default_options.merge options
|
72
|
+
cli = options[:cli]
|
73
|
+
|
74
|
+
build_directory = "#{directory.path.to_s}/build"
|
75
|
+
mkdir build_directory unless Dir.exists?(build_directory)
|
76
|
+
file = File.open(output_file, 'w')
|
77
|
+
|
78
|
+
file.write(license_header)
|
79
|
+
|
80
|
+
input_files.each do |input_file|
|
81
|
+
file.write(';')
|
82
|
+
file.write(yield File.read(input_file))
|
83
|
+
file.write(';')
|
84
|
+
end
|
85
|
+
|
86
|
+
cli.say("#{relative_output_file}: #{file.pos} bytes written.", :green)
|
87
|
+
|
88
|
+
file.close
|
89
|
+
|
90
|
+
File.read(output_file)
|
91
|
+
end
|
92
|
+
def cupfile
|
93
|
+
directory.cupfile
|
94
|
+
end
|
95
|
+
def default_options
|
96
|
+
{ :cli => NoopShell }
|
97
|
+
end
|
98
|
+
def license_header
|
99
|
+
license = File.read(directory.cupfile.license) rescue nil
|
100
|
+
license.nil? ? '' : "/*\n#{license}\n*/"
|
101
|
+
end
|
102
|
+
def input_files
|
103
|
+
directory.javascripts :build_input
|
104
|
+
end
|
105
|
+
def uglifier_defaults
|
106
|
+
{
|
107
|
+
:mangle => true, # Mangle variables names
|
108
|
+
:toplevel => false, # Mangle top-level variable names
|
109
|
+
:except => [], # Variable names to be excluded from mangling
|
110
|
+
:max_line_length => 32 * 1024, # Maximum line length
|
111
|
+
:squeeze => true, # Squeeze code resulting in smaller, but less-readable code
|
112
|
+
:seqs => true, # Reduce consecutive statements in blocks into single statement
|
113
|
+
:dead_code => true, # Remove dead code (e.g. after return)
|
114
|
+
:unsafe => false, # Optimizations known to be unsafe in some situations
|
115
|
+
:copyright => true, # Show copyright message
|
116
|
+
:beautify => false, # Output indented code
|
117
|
+
:beautify_options => {
|
118
|
+
:indent_level => 2,
|
119
|
+
:indent_start => 0,
|
120
|
+
:quote_keys => false,
|
121
|
+
:space_colon => 0,
|
122
|
+
:ascii_only => false
|
123
|
+
}
|
124
|
+
}
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'pathname'
|
3
|
+
require 'cup'
|
4
|
+
require 'cup/builder'
|
5
|
+
require 'cup/directory'
|
6
|
+
require 'cup/server/app'
|
7
|
+
|
8
|
+
module Cup
|
9
|
+
class CommandLine < Thor
|
10
|
+
|
11
|
+
include Thor::Actions
|
12
|
+
|
13
|
+
class Helper
|
14
|
+
|
15
|
+
JasmineStandaloneDistributionURL = 'http://pivotal.github.com/jasmine/downloads/jasmine-standalone-1.1.0.zip'
|
16
|
+
JQueryURL = 'http://code.jquery.com/jquery.min.js'
|
17
|
+
|
18
|
+
attr_reader :root
|
19
|
+
|
20
|
+
def initialize (path)
|
21
|
+
@root = Pathname.new(path).expand_path
|
22
|
+
end
|
23
|
+
|
24
|
+
def cupfile
|
25
|
+
root + 'Cupfile'
|
26
|
+
end
|
27
|
+
|
28
|
+
def cupfile_default_content(name)
|
29
|
+
<<-CUPFILE
|
30
|
+
# This file describes the javascript project
|
31
|
+
# see: https://github.com/sjltaylor/cup
|
32
|
+
Cup.define do |cup|
|
33
|
+
|
34
|
+
name '#{name}'
|
35
|
+
version '0.0.1'
|
36
|
+
license 'license.txt'
|
37
|
+
|
38
|
+
javascripts do
|
39
|
+
vendor 'jasmine.js', :*
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
CUPFILE
|
44
|
+
end
|
45
|
+
|
46
|
+
def standard_directories
|
47
|
+
%w|src lib vendor spec spec/visual|.map {|dir| root + dir}
|
48
|
+
end
|
49
|
+
|
50
|
+
def jquery_file
|
51
|
+
root + 'vendor' + 'jquery.min.js'
|
52
|
+
end
|
53
|
+
|
54
|
+
def extra_matchers_file
|
55
|
+
root + 'vendor' + 'extra_matchers.js'
|
56
|
+
end
|
57
|
+
|
58
|
+
def rackup_file
|
59
|
+
root + 'config.ru'
|
60
|
+
end
|
61
|
+
|
62
|
+
def cupfile?
|
63
|
+
File.exists?(root + 'Cupfile')
|
64
|
+
end
|
65
|
+
|
66
|
+
def license_file
|
67
|
+
root + 'license.txt'
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_jquery
|
71
|
+
jquery = `curl --silent #{JQueryURL}`
|
72
|
+
return jquery if $?.exitstatus == 0
|
73
|
+
end
|
74
|
+
|
75
|
+
def get_license
|
76
|
+
<<-LICENSE
|
77
|
+
Copyright (C) #{Time.now.year} by #{ENV['USER'] || 'THE_MAN'}
|
78
|
+
|
79
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
80
|
+
of this software and associated documentation files (the "Software"), to deal
|
81
|
+
in the Software without restriction, including without limitation the rights
|
82
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
83
|
+
copies of the Software, and to permit persons to whom the Software is
|
84
|
+
furnished to do so, subject to the following conditions:
|
85
|
+
|
86
|
+
The above copyright notice and this permission notice shall be included in
|
87
|
+
all copies or substantial portions of the Software.
|
88
|
+
|
89
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
90
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
91
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
92
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
93
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
94
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
95
|
+
THE SOFTWARE.
|
96
|
+
LICENSE
|
97
|
+
end
|
98
|
+
|
99
|
+
def get_extra_matchers
|
100
|
+
File.read(File.expand_path('../../../js/extra_matchers.js', __FILE__))
|
101
|
+
end
|
102
|
+
|
103
|
+
def download_jasmine
|
104
|
+
|
105
|
+
%x{
|
106
|
+
set -o errexit # exit if it hits the fan
|
107
|
+
set -o nounset # using unset variables is an error
|
108
|
+
|
109
|
+
cd #{root + 'vendor'}
|
110
|
+
|
111
|
+
curl --silent #{JasmineStandaloneDistributionURL} > jasmine.zip
|
112
|
+
unzip jasmine.zip -d jasmine
|
113
|
+
|
114
|
+
cd jasmine
|
115
|
+
|
116
|
+
cp `find . | grep -E '.*\.(css|js)'` ..
|
117
|
+
|
118
|
+
cd ..
|
119
|
+
|
120
|
+
rm -rf jasmine
|
121
|
+
rm jasmine.zip
|
122
|
+
}
|
123
|
+
|
124
|
+
$?.exitstatus == 0
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
desc "create NAME", "Creates a new directory structure with the specified name. Can also be called like: cup <name> [options]"
|
129
|
+
def create(name)
|
130
|
+
|
131
|
+
unless /^[\w-]+$/ =~ name
|
132
|
+
raise "#{name} is not a valid filename (letters, numbers, underscore and dashes only)"
|
133
|
+
end
|
134
|
+
|
135
|
+
helper = Helper.new(name)
|
136
|
+
|
137
|
+
if Dir.exists? helper.root
|
138
|
+
say_status :halted, "Cannot cup '#{name}'. A directory of that name already exists", :red
|
139
|
+
return
|
140
|
+
end
|
141
|
+
|
142
|
+
empty_directory helper.root
|
143
|
+
helper.standard_directories.each {|dir| empty_directory dir}
|
144
|
+
|
145
|
+
create_file helper.cupfile, helper.cupfile_default_content(name)
|
146
|
+
|
147
|
+
create_file helper.license_file, helper.get_license
|
148
|
+
|
149
|
+
jquery = helper.get_jquery
|
150
|
+
|
151
|
+
if jquery
|
152
|
+
say_status(:downloaded, "#{Helper::JasmineStandaloneDistributionURL}", :green)
|
153
|
+
create_file helper.jquery_file, jquery
|
154
|
+
else
|
155
|
+
say_status(:failed, "download #{Helper::JQueryURL}", :red)
|
156
|
+
end
|
157
|
+
|
158
|
+
if helper.download_jasmine
|
159
|
+
say_status(:downloaded, "#{Helper::JasmineStandaloneDistributionURL} and unpacked into vendor", :green)
|
160
|
+
else
|
161
|
+
say_status(:failed, "download/unpack #{Helper::JasmineStandaloneDistributionURL}", :red)
|
162
|
+
end
|
163
|
+
|
164
|
+
create_file helper.extra_matchers_file, helper.get_extra_matchers
|
165
|
+
end
|
166
|
+
|
167
|
+
desc "build", 'builds and minifies into ./build/'
|
168
|
+
def build
|
169
|
+
Cup.build! :cli => self
|
170
|
+
end
|
171
|
+
|
172
|
+
desc "concatenate", 'builds to STDOUT'
|
173
|
+
def concatenate
|
174
|
+
$stdout.write Cup.concatenate!
|
175
|
+
end
|
176
|
+
|
177
|
+
desc "minify", 'builds to STDOUT'
|
178
|
+
def minify
|
179
|
+
$stdout.write Cup.minify!
|
180
|
+
end
|
181
|
+
|
182
|
+
desc "server [PORT]", 'Starts a sinatra app which serves spec runners etc.'
|
183
|
+
def server(port=5555)
|
184
|
+
|
185
|
+
helper = pwd_helper
|
186
|
+
|
187
|
+
return no_cupfile unless helper.cupfile?
|
188
|
+
|
189
|
+
say(shell.set_color "cup server for '#{Cup.cup_name}' starting on port #{port}", :cyan, true)
|
190
|
+
Cup::Server::App.set :port => port
|
191
|
+
Cup::Server::App.run!
|
192
|
+
end
|
193
|
+
|
194
|
+
desc "version", 'The version of cup and the version of the Cup project in this directory if a Cupfile exists'
|
195
|
+
def version
|
196
|
+
say("#{Cup.cup_name} v#{Cup.version}", :cyan) if File.exist?('Cupfile')
|
197
|
+
say("cup v#{Cup::VERSION}")
|
198
|
+
end
|
199
|
+
|
200
|
+
desc 'rackup', 'Create a config.ru. Do this if you want to use powder'
|
201
|
+
def rackup
|
202
|
+
|
203
|
+
helper = pwd_helper
|
204
|
+
|
205
|
+
return no_cupfile unless helper.cupfile?
|
206
|
+
|
207
|
+
create_file helper.rackup_file, <<-CONFIG_RU
|
208
|
+
require 'rubygems' # for ruby 1.8.x
|
209
|
+
require 'rack'
|
210
|
+
require 'cup/server/app'
|
211
|
+
|
212
|
+
run Cup::Server::App
|
213
|
+
CONFIG_RU
|
214
|
+
end
|
215
|
+
|
216
|
+
private
|
217
|
+
|
218
|
+
def pwd_helper
|
219
|
+
Helper.new(Cup::Directory.current.path.to_s)
|
220
|
+
end
|
221
|
+
def no_cupfile
|
222
|
+
say("Cupfile not present, bailing...", :red)
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|