coyote 0.7.0 → 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest +13 -31
- data/README.md +1 -91
- data/Rakefile +8 -4
- data/bin/coyote +9 -32
- data/coyote.gemspec +4 -10
- data/lib/coyote.rb +28 -62
- data/lib/coyote/asset.rb +51 -0
- data/lib/coyote/assets/coffeescript.rb +29 -0
- data/lib/coyote/assets/javascript.rb +4 -0
- data/lib/coyote/bundle.rb +101 -0
- data/lib/coyote/closure_compiler.rb +9 -9
- data/lib/coyote/configuration.rb +23 -77
- data/lib/coyote/notifications.rb +22 -0
- data/test/scripts/input1.js +1 -0
- data/test/scripts/input2.js +1 -0
- data/test/scripts/input3.js +1 -0
- data/test/scripts/input4.js +1 -0
- data/test/scripts/lib/input5.coffee +3 -0
- data/test/scripts/lib/input6.js +1 -0
- data/test/scripts/lib/keystone/input7.js +2 -0
- data/test/scripts/vendor/input8.coffee +1 -0
- metadata +29 -70
- data/config/coyote-icon.png +0 -0
- data/config/coyote-usage.txt +0 -16
- data/config/coyote.yaml +0 -2
- data/lib/coyote/generator.rb +0 -49
- data/lib/coyote/notification.rb +0 -62
- data/lib/coyote/script.rb +0 -124
- data/lib/coyote/scripts/coffeescript.rb +0 -32
- data/lib/coyote/scripts/combine.rb +0 -54
- data/lib/coyote/scripts/javascript.rb +0 -4
- data/test/src/public/assets/javascripts/app/application/interface.coffee +0 -10
- data/test/src/public/assets/javascripts/app/application/main.coffee +0 -14
- data/test/src/public/assets/javascripts/app/application/pages/home.coffee +0 -9
- data/test/src/public/assets/javascripts/app/boot.coffee +0 -1
- data/test/src/public/assets/javascripts/lib/extensions.coffee +0 -8
- data/test/src/public/assets/javascripts/lib/imulus.coffee +0 -7
- data/test/src/public/assets/javascripts/lib/imulus/forms.coffee +0 -46
- data/test/src/public/assets/javascripts/lib/imulus/maps/infowindow.coffee +0 -37
- data/test/src/public/assets/javascripts/lib/imulus/maps/map.coffee +0 -51
- data/test/src/public/assets/javascripts/lib/imulus/maps/marker.coffee +0 -66
- data/test/src/public/assets/javascripts/lib/imulus/maps/point.coffee +0 -5
- data/test/src/public/assets/javascripts/lib/imulus/maps/results.coffee +0 -117
- data/test/src/public/assets/javascripts/lib/imulus/tables.coffee +0 -11
- data/test/src/public/assets/javascripts/lib/imulus/triggers.coffee +0 -26
- data/test/src/public/assets/javascripts/scripts.coffee +0 -14
- data/test/src/public/assets/javascripts/vendor/jquery.js +0 -18
- data/test/src/public/assets/javascripts/vendor/jquery/jquery.cookie.js +0 -89
- data/test/src/public/assets/javascripts/vendor/jquery/jquery.cycle.js +0 -21
- data/test/src/public/assets/javascripts/vendor/jquery/jquery.query.js +0 -224
- data/test/src/public/assets/javascripts/vendor/swfobject.js +0 -4
- data/test/src/public/scripts/scripts.combine +0 -18
- data/test/src/public/scripts/scripts.js +0 -944
data/config/coyote-icon.png
DELETED
Binary file
|
data/config/coyote-usage.txt
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
------------------------------------------
|
2
|
-
Coyote - Command-line Concatenation
|
3
|
-
http://github.com/imulus/coyote
|
4
|
-
------------------------------------------
|
5
|
-
|
6
|
-
Usage : 'coyote Action [Environment] [Options]'
|
7
|
-
|
8
|
-
== Actions
|
9
|
-
build - Execute the compiler
|
10
|
-
watch - Starts the Coyote observe mechanism.
|
11
|
-
new - Create a Coyote configuration in this directory
|
12
|
-
|
13
|
-
== Options
|
14
|
-
-c | --compress - Use Google Closure Compiler
|
15
|
-
-v | --verbose - Verbose CLI logging
|
16
|
-
|
data/config/coyote.yaml
DELETED
data/lib/coyote/generator.rb
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
module Coyote
|
2
|
-
class Generator
|
3
|
-
attr_accessor :files_found
|
4
|
-
|
5
|
-
def initialize
|
6
|
-
@files_found = []
|
7
|
-
end
|
8
|
-
|
9
|
-
def generate
|
10
|
-
if config_exists?
|
11
|
-
Coyote::Notification.new "This directory is already configured for Coyote.\n", "failure"
|
12
|
-
else
|
13
|
-
discover_files
|
14
|
-
copy_config
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def discover_files
|
19
|
-
js_files = File.join("**","*.js")
|
20
|
-
cs_files = File.join("**","*.coffee")
|
21
|
-
Dir.glob(js_files).each do |file|
|
22
|
-
@files_found.push file
|
23
|
-
end
|
24
|
-
Dir.glob(cs_files).each do |file|
|
25
|
-
@files_found.push file
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def config_exists?
|
30
|
-
File.exists?(Coyote::CONFIG_FILENAME)
|
31
|
-
end
|
32
|
-
|
33
|
-
def copy_config
|
34
|
-
Coyote::Notification.new "\nGenerating Coyote\n"
|
35
|
-
Coyote::Notification.new "#{@files_found.length} files discovered\n"
|
36
|
-
|
37
|
-
File.open("#{Coyote::CONFIG_PATH}/#{Coyote::CONFIG_FILENAME}") do |file|
|
38
|
-
output_file = File.open(Coyote::CONFIG_FILENAME, 'w+')
|
39
|
-
generated = file.read
|
40
|
-
@files_found.each do |file|
|
41
|
-
generated += " - #{file}\n"
|
42
|
-
end
|
43
|
-
output_file.write(generated)
|
44
|
-
end
|
45
|
-
|
46
|
-
Coyote::Notification.new "Coyote generated at #{Coyote::CONFIG_FILENAME}\n\n", "success"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
data/lib/coyote/notification.rb
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
module Coyote
|
2
|
-
class Notification
|
3
|
-
|
4
|
-
attr_accessor :growl, :application, :icon, :default_notifications, :notifications, :type, :message
|
5
|
-
|
6
|
-
def initialize(message, type = "message")
|
7
|
-
@message = message
|
8
|
-
@type = type
|
9
|
-
|
10
|
-
console_notify
|
11
|
-
|
12
|
-
if Config::CONFIG['target_os'] =~ /darwin/i
|
13
|
-
require 'appscript'
|
14
|
-
@growl = Appscript.app("GrowlHelperApp");
|
15
|
-
|
16
|
-
if @growl.is_running?
|
17
|
-
growl_register
|
18
|
-
growl_notify
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
|
24
|
-
def console_notify
|
25
|
-
case @type
|
26
|
-
when "success"
|
27
|
-
print @message.green
|
28
|
-
when "warning"
|
29
|
-
print @message.yellow
|
30
|
-
when "failure"
|
31
|
-
print @message.red
|
32
|
-
else
|
33
|
-
print @message.white
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
# trigger a growl notification
|
39
|
-
def growl_notify
|
40
|
-
options = { :title => @application,
|
41
|
-
:description => @message.gsub(/[\n]+/, ""),
|
42
|
-
:application_name => @application,
|
43
|
-
:image_from_location => @icon,
|
44
|
-
:sticky => false,
|
45
|
-
:priority => 0,
|
46
|
-
:with_name => notifications.first }
|
47
|
-
@growl.notify options
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
# register Coyote as an application with Growl
|
52
|
-
def growl_register
|
53
|
-
@application = Coyote::APP_NAME
|
54
|
-
@icon = "#{Coyote::CONFIG_PATH}/#{Coyote::CONFIG_ICON}"
|
55
|
-
@default_notifications = ["Coyote Success"]
|
56
|
-
@notifications = ["Coyote Success", "Coyote Failure"]
|
57
|
-
@growl.register(:as_application => @application, :all_notifications => @notifications, :default_notifications => @default_notifications)
|
58
|
-
end
|
59
|
-
|
60
|
-
|
61
|
-
end
|
62
|
-
end
|
data/lib/coyote/script.rb
DELETED
@@ -1,124 +0,0 @@
|
|
1
|
-
module Coyote
|
2
|
-
autoload :JavaScript, 'coyote/scripts/javascript'
|
3
|
-
autoload :CoffeeScript, 'coyote/scripts/coffeescript'
|
4
|
-
autoload :Combine, 'coyote/scripts/combine'
|
5
|
-
|
6
|
-
class Script
|
7
|
-
attr_reader :filename, :relative_path
|
8
|
-
attr_accessor :contents
|
9
|
-
|
10
|
-
# Class method
|
11
|
-
# Determine the type of file base on the file extension
|
12
|
-
# and return an instance of the proper extended script class
|
13
|
-
def self.select_and_init(filename)
|
14
|
-
case File.extname(filename)
|
15
|
-
when /\.js/i ; JavaScript.new(filename)
|
16
|
-
when /\.coffee/i ; CoffeeScript.new(filename)
|
17
|
-
when /\.combine/i ; Combine.new(filename)
|
18
|
-
else ; self.new(filename)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
|
23
|
-
def initialize(filename, contents = "")
|
24
|
-
@filename = filename
|
25
|
-
@relative_path = @filename.gsub("#{Dir.pwd}/", '')
|
26
|
-
@directory = File.dirname(@filename)
|
27
|
-
|
28
|
-
if contents.empty? and File.exists? @filename
|
29
|
-
@contents = File.open(@filename, 'r').read
|
30
|
-
else
|
31
|
-
@contents = contents
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
|
36
|
-
# Append a string of additional content
|
37
|
-
# to the end of the current script contents
|
38
|
-
def append(string)
|
39
|
-
@contents += "#{string}\n\n"
|
40
|
-
end
|
41
|
-
|
42
|
-
|
43
|
-
# Prepend a string of additional content
|
44
|
-
# to the beginning of the current script contents
|
45
|
-
def prepend(string)
|
46
|
-
@contents = "#{string}\n\n" + @contents
|
47
|
-
end
|
48
|
-
|
49
|
-
|
50
|
-
# Defines the regex pattern for scanning the contents of the
|
51
|
-
# file to look for require directives
|
52
|
-
def require_pattern
|
53
|
-
Regexp.new(/\/\/=\s*require\s*(.*)$/i) # '//= require a/b/c.js' => 'a/b/c.js'
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
# Scan the contents of the file for require directives
|
58
|
-
# By default, it looks for a directive of '//= require a/b/c.js'
|
59
|
-
# It determines the full filepath of the required file,
|
60
|
-
# relative to the current file being read in
|
61
|
-
def requires(pattern = require_pattern)
|
62
|
-
matches = @contents.scan(pattern)
|
63
|
-
matches.collect do |match|
|
64
|
-
File.expand_path(match.last.strip, @directory)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
|
69
|
-
# Clear out the contents of the script, in-place
|
70
|
-
def empty!
|
71
|
-
@contents = ""
|
72
|
-
end
|
73
|
-
|
74
|
-
|
75
|
-
# Run the contents of the script through the Google Closure compile
|
76
|
-
# It compresses the contents of the script in-place
|
77
|
-
def compress!
|
78
|
-
Coyote::Notification.new "Compiling #{@filename}...\n", "warning"
|
79
|
-
compiler = ClosureCompiler.new.compile(@contents)
|
80
|
-
if compiler.success?
|
81
|
-
@contents = compiler.compiled_code
|
82
|
-
elsif compiler.file_too_big?
|
83
|
-
Coyote::Notification.new "Input code too big for API, creating uncompiled file\n", "failure"
|
84
|
-
elsif compiler.errors
|
85
|
-
Coyote::Notification.new "Google closure API failed to compile, creating uncompiled file\n", "failure"
|
86
|
-
Coyote::Notification.new "Errors: \n", "failure"
|
87
|
-
Coyote::Notification.new "#{compiler.errors.to_s}\n\n", "failure"
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
|
92
|
-
# Save the contents of the script to disk
|
93
|
-
def save
|
94
|
-
output = File.open @filename, 'w+'
|
95
|
-
output.write @contents
|
96
|
-
output.close
|
97
|
-
end
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
protected
|
102
|
-
|
103
|
-
# This method converts a JavaScript filepath to a CoffeeScript filepath in the same directory
|
104
|
-
# Given the path /a/b/c.js it will return /a/b/c.coffee
|
105
|
-
def convert_js_path_to_coffee(path)
|
106
|
-
directory, basename = File.split(path)
|
107
|
-
basename = File.basename(basename, '.js')
|
108
|
-
"#{directory}/#{basename}.coffee"
|
109
|
-
end
|
110
|
-
|
111
|
-
# This method converts a CoffeeScript filepath to a JavaScript filepath in the same directory
|
112
|
-
# Given the path /a/b/c.coffee it will return /a/b/c.js
|
113
|
-
def convert_coffee_path_to_js(path)
|
114
|
-
directory, basename = File.split(path)
|
115
|
-
basename = File.basename(basename, '.coffee')
|
116
|
-
"#{directory}/#{basename}.js"
|
117
|
-
end
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module Coyote
|
2
|
-
class CoffeeScript < Script
|
3
|
-
|
4
|
-
# Defines the regex pattern for scanning the contents of the
|
5
|
-
# file to look for require directives
|
6
|
-
def require_pattern
|
7
|
-
Regexp.new(/#=\s*require\s(.*)$/i) # '#= require a/b/c.coffee' => 'a/b/c.coffee'
|
8
|
-
end
|
9
|
-
|
10
|
-
|
11
|
-
# We're defining setters and getters here
|
12
|
-
# for the contents of the script file
|
13
|
-
# because we need to compile the CoffeeScript to JavaScript
|
14
|
-
# on the way out
|
15
|
-
def contents=(string)
|
16
|
-
@contents = string
|
17
|
-
end
|
18
|
-
|
19
|
-
def contents
|
20
|
-
compile!
|
21
|
-
@contents
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
# Run the contents of the script through the CoffeeScript compile
|
26
|
-
# Changes the content of the script in-place
|
27
|
-
def compile!
|
28
|
-
@contents = `cat #{@filename} | coffee -sc`
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
module Coyote
|
2
|
-
|
3
|
-
# This class adds support for .combine files, following the style
|
4
|
-
# of SassAndCoffee for .NET (https://github.com/xpaulbettsx/SassAndCoffee)
|
5
|
-
|
6
|
-
class Combine < Script
|
7
|
-
|
8
|
-
# .combine files serve primarily as a manifest listing files to pull in and combine
|
9
|
-
# In turn, each line of a .combine file is a require directive, so what we do here
|
10
|
-
# to detemine requires is read in each line of the file, do a bit of cleanup,
|
11
|
-
# and return an array of full filepaths of the required files
|
12
|
-
def requires
|
13
|
-
requires = []
|
14
|
-
|
15
|
-
File.open(@filename).readlines.each do |line|
|
16
|
-
# Because the directives in the .combine file are not comments,
|
17
|
-
# we have to strip out the directives from the file's contents
|
18
|
-
@contents.gsub!(/#{line}/, '')
|
19
|
-
|
20
|
-
# Clean up whitespace on the directive, and make sure it's not a blank line
|
21
|
-
if line.strip! != ''
|
22
|
-
|
23
|
-
# The .NET .combine engine automatically detects .js files as their .coffee counterparts
|
24
|
-
# so we need to replicate that functionality and also look for .coffee files with the same filename
|
25
|
-
file = check_for_alternate_filetype(File.expand_path(line, @directory))
|
26
|
-
if file
|
27
|
-
requires << file
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
return requires
|
33
|
-
end
|
34
|
-
|
35
|
-
|
36
|
-
# This method with look for an alternate filetype for a given filepath
|
37
|
-
# If it is given a path of /a/b/c.js it will look for /a/b/c.coffee
|
38
|
-
# and return whichever filetype it finds first
|
39
|
-
# It looks for JavaScript first and then CoffeeScript, returning nil if it doesn't find anything
|
40
|
-
def check_for_alternate_filetype(path)
|
41
|
-
javascript = path
|
42
|
-
coffeescript = convert_js_path_to_coffee(javascript)
|
43
|
-
|
44
|
-
if File.file?(javascript)
|
45
|
-
javascript
|
46
|
-
elsif File.file?(coffeescript)
|
47
|
-
coffeescript
|
48
|
-
else
|
49
|
-
nil
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
@module "Application", ->
|
2
|
-
|
3
|
-
@main = ->
|
4
|
-
new Application.Interface
|
5
|
-
|
6
|
-
initializers = $('body').attr('data-js-init')
|
7
|
-
|
8
|
-
Application.initializers = if initializers? then initializers.replace(" ","").split(",") else []
|
9
|
-
|
10
|
-
for initializer in Application.initializers
|
11
|
-
segments = initializer.split(".")
|
12
|
-
method = window
|
13
|
-
method = method[segment] for segment in segments
|
14
|
-
do method if method?
|
@@ -1 +0,0 @@
|
|
1
|
-
$ -> Application.main()
|
@@ -1,46 +0,0 @@
|
|
1
|
-
@module "Imulus", ->
|
2
|
-
class @Forms
|
3
|
-
constructor: ($form)->
|
4
|
-
do @build
|
5
|
-
|
6
|
-
build: ->
|
7
|
-
if not Imulus.elementSupportsAttribute 'input', 'placeholder'
|
8
|
-
$('input[placeholder]').each ->
|
9
|
-
$input = $(this)
|
10
|
-
placeholder = $input.attr 'placeholder'
|
11
|
-
$input.val(placeholder).addClass 'inactive'
|
12
|
-
$input.bind
|
13
|
-
focus : ->
|
14
|
-
if $input.val() is placeholder
|
15
|
-
$input.val('').removeClass 'inactive'
|
16
|
-
blur : ->
|
17
|
-
if $input.val() is ''
|
18
|
-
$input.val(placeholder).addClass 'inactive'
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
$('fieldset.overlay .row').each ->
|
23
|
-
|
24
|
-
$label = $(this).find 'label'
|
25
|
-
$input = $(this).find 'input'
|
26
|
-
|
27
|
-
if $input.val() isnt ""
|
28
|
-
$label.hide()
|
29
|
-
|
30
|
-
$label.click -> $input.focus()
|
31
|
-
|
32
|
-
$input.bind
|
33
|
-
focus: ->
|
34
|
-
if $input.val() is ""
|
35
|
-
$label.addClass 'faded'
|
36
|
-
|
37
|
-
blur: ->
|
38
|
-
if $input.val() is ""
|
39
|
-
$label.fadeIn().removeClass 'faded'
|
40
|
-
|
41
|
-
change: ->
|
42
|
-
if $input.val() isnt ""
|
43
|
-
$label.fadeOut().removeClass 'faded'
|
44
|
-
|
45
|
-
keypress: ->
|
46
|
-
$label.hide().removeClass 'faded'
|