neptune_coffee 0.0.1
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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +105 -0
- data/Rakefile +1 -0
- data/bin/neptune_coffee +43 -0
- data/examples/geometry/box.js +4 -0
- data/examples/geometry/circle.js +4 -0
- data/examples/geometry/namespace.js +2 -0
- data/examples/geometry/neptune.js +8 -0
- data/examples/geometry/solids/cone.js +4 -0
- data/examples/geometry/solids/namespace.js +8 -0
- data/examples/geometry/solids/neptune.js +6 -0
- data/examples/geometry/solids.js +8 -0
- data/examples/geometry.js +10 -0
- data/lib/neptune_coffee/generator.rb +197 -0
- data/lib/neptune_coffee/version.rb +3 -0
- data/lib/neptune_coffee.rb +9 -0
- data/neptune_coffee.gemspec +28 -0
- metadata +150 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d5b05ce443964e8ab650ce0c787589d943dc6e76
|
4
|
+
data.tar.gz: 8b0a2df013a6b1b14bd8b430aa50f8229d01d552
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dc0ce6a4a247fd6893cb3aa97d8f534b6ef99031a0c3b8687f65116069cfab3c1921a494c2a5c3184a4651151936c49e90bb408b4a5952a3f4ebbeb1007e0a86
|
7
|
+
data.tar.gz: 226f4651948441d3bd97552094dc143c4c288fed3e118719d5b2e50118c7fc6bd57d1e7e87042cb61d55a968b5e17081f10410dedd3b9ddee8b3a99e228b88aa
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Shane Brinkman-Davis
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
# NeptuneCoffee
|
2
|
+
|
3
|
+
## WORK IN PROGRESS
|
4
|
+
This is a work in progress. The basic idea of directories-define-modules is core, as is including the directory_name.js file to included the module. However, the other generated files are still experimental as-is the requirements pattern for module internals.
|
5
|
+
|
6
|
+
## What is it?
|
7
|
+
|
8
|
+
* opinionated javascript-AMD-module generator
|
9
|
+
|
10
|
+
## Purpose
|
11
|
+
|
12
|
+
* make working with javascript AMD modules easier
|
13
|
+
* minimize refactoring complexity
|
14
|
+
* minimize the amount of code you have to write
|
15
|
+
|
16
|
+
If you are working with dozens or hundreds of Javascript files, wouldn't you like some way to easily organize them into modules?
|
17
|
+
|
18
|
+
NeptuneCoffee is an opinionated module generator. All you have to do is organize your files into a directory structure where the directory names are module names and the hierarchy reflects sub-modules.
|
19
|
+
|
20
|
+
NeptuneCoffee generates the .js files to define your AMD modules.
|
21
|
+
|
22
|
+
## Optionated?
|
23
|
+
NeptuneCoffee has an opinion about how you should organize your javascript for AMD modules. It is:
|
24
|
+
|
25
|
+
* Directories are AMD modules
|
26
|
+
* Directory names the AMD module names
|
27
|
+
* Directory names snake_case
|
28
|
+
* generated AMD module names are CamelCase
|
29
|
+
* require "foo/bar" includes all files in the module defined by the directory "foo/bar"
|
30
|
+
* Defines a global namespace for accessing AMD modules: window.Neptune.YourRootModule.YourSubModule
|
31
|
+
|
32
|
+
## Benefit
|
33
|
+
|
34
|
+
Refactoring module structure is as simple as renaming and moving directories and files. Often you won't have to change a line of code.
|
35
|
+
|
36
|
+
## What does it do?
|
37
|
+
|
38
|
+
For every $subdir, NeptuneCoffee generates:
|
39
|
+
|
40
|
+
$subdir/neptune.js // loads and attaches all sub-namespaces to $subdir's namespace object
|
41
|
+
$subdir/namespace.js // defines $subdir's namespace object
|
42
|
+
$subdir.js // loads all .js files in $subdir recursively
|
43
|
+
// all three files return $subdir's namespace object
|
44
|
+
|
45
|
+
# How to Use
|
46
|
+
|
47
|
+
Install neptune_coffee (see below). Then, whenever your directory structure changes or you move/add/rename/delete files, run:
|
48
|
+
|
49
|
+
neptune_coffee -r source/root
|
50
|
+
|
51
|
+
* Client should require: **$subdir.js** for the AMD module **source/root/$subdir**
|
52
|
+
* Source files in **source/root/$subdir/** should require: **$subdir/neptune.js** or **$subdir/namespace.js**
|
53
|
+
|
54
|
+
## Example
|
55
|
+
|
56
|
+
Given this directory structure and files:
|
57
|
+
|
58
|
+
geometry/solids/cone.js
|
59
|
+
geometry/box.js
|
60
|
+
geometry/circle.js
|
61
|
+
|
62
|
+
NeptineCoffee generates:
|
63
|
+
|
64
|
+
geometry.js
|
65
|
+
geometry/namespace.js
|
66
|
+
geometry/neptune.js
|
67
|
+
geometry/solids.js
|
68
|
+
geometry/solids/namespace.js
|
69
|
+
geometry/solids/neptune.js
|
70
|
+
|
71
|
+
geometry.js might look like:
|
72
|
+
|
73
|
+
// Generated by NeptuneCoffee 0.0.1
|
74
|
+
define([
|
75
|
+
"geometry/namespace",
|
76
|
+
"geometry/box",
|
77
|
+
"geometry/circle",
|
78
|
+
"geometry/neptune",
|
79
|
+
"geometry/solids"
|
80
|
+
], function(Geometry) {
|
81
|
+
return Geometry;
|
82
|
+
});
|
83
|
+
|
84
|
+
## Installation
|
85
|
+
|
86
|
+
Add this line to your application's Gemfile:
|
87
|
+
|
88
|
+
gem 'neptune_coffee'
|
89
|
+
|
90
|
+
And then execute:
|
91
|
+
|
92
|
+
$ bundle
|
93
|
+
|
94
|
+
Or install it yourself as:
|
95
|
+
|
96
|
+
$ gem install neptune_coffee
|
97
|
+
|
98
|
+
|
99
|
+
## Contributing
|
100
|
+
|
101
|
+
1. Fork it
|
102
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
103
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
104
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
105
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/neptune_coffee
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
require 'trollop'
|
4
|
+
require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','neptune_coffee'))
|
5
|
+
|
6
|
+
options = Trollop::options ARGV do
|
7
|
+
banner <<ENDBANNER
|
8
|
+
NeptuneCoffee
|
9
|
+
|
10
|
+
An opinionated javascript AMD module generator.
|
11
|
+
|
12
|
+
For every $subdir, generates:
|
13
|
+
$subdir/neptune.js // adds all sub-namespaces to $subdir's namespace object
|
14
|
+
$subdir/namespace.js // defines $subdir's namespace object
|
15
|
+
$subdir.js // loads all .js files in $subdir recursively
|
16
|
+
|
17
|
+
* All three generated files return $subdir's namespace object.
|
18
|
+
* Client's should require $subdir.js.
|
19
|
+
* Source files in $subdir/ should require $subdir/neptune.js
|
20
|
+
|
21
|
+
Options:
|
22
|
+
ENDBANNER
|
23
|
+
|
24
|
+
opt :root, "recursively generate files in root and all subdirectories", :type => :string
|
25
|
+
opt :force, "force file generation"
|
26
|
+
opt :overwrite, "overwrite all existing files. Otherwise, generated/source-file name conflicts report a warning and do not overwrite the source."
|
27
|
+
opt :files, "(DEBUG) only generate these files", :type => :strings
|
28
|
+
opt :dirs, "(DEBUG) show dirs affected by files option (no actions are taken)"
|
29
|
+
opt :verbose, "show contents of generated files"
|
30
|
+
end
|
31
|
+
|
32
|
+
Trollop::die "root options is required" unless options.root
|
33
|
+
Trollop::die "dirs option requires files option" if options.dirs and not options.files
|
34
|
+
|
35
|
+
generator = NeptuneCoffee::Generator.new options
|
36
|
+
if options.dirs
|
37
|
+
puts "files: #{options.files.join ', '}"
|
38
|
+
puts "effects: #{generator.dirs_effected(options.files).inspect}"
|
39
|
+
elsif options.files
|
40
|
+
generator.generate_on_changes options.files
|
41
|
+
else
|
42
|
+
generator.generate_all
|
43
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
require 'extlib'
|
2
|
+
require 'guard/guard'
|
3
|
+
require "coderay"
|
4
|
+
|
5
|
+
module ::Guard
|
6
|
+
module UI
|
7
|
+
class << self
|
8
|
+
def success(message, options = {})
|
9
|
+
_filtered_logger_message(message, :info, :green, options)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module NeptuneCoffee
|
16
|
+
class Generator
|
17
|
+
|
18
|
+
SAFE_GENERATE_FIRST_LINE = "// Generated by NeptuneCoffee"
|
19
|
+
|
20
|
+
def initialize(options)
|
21
|
+
@root = options[:root].chomp "/"
|
22
|
+
@force = options[:force]
|
23
|
+
@verbose = options[:verbose]
|
24
|
+
@overwrite = options[:overwrite]
|
25
|
+
reset_file_info
|
26
|
+
end
|
27
|
+
|
28
|
+
attr_accessor :root
|
29
|
+
|
30
|
+
def error(message) Guard::UI.error "NeptuneCoffee: "+message; end
|
31
|
+
def warning(message) Guard::UI.warning "NeptuneCoffee: "+message; end
|
32
|
+
def info(message) Guard::UI.info "NeptuneCoffee: "+message; end
|
33
|
+
def success(message) Guard::UI.success "NeptuneCoffee: "+message; end
|
34
|
+
|
35
|
+
def in_root
|
36
|
+
Dir.chdir @root do
|
37
|
+
yield
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def reset_file_info
|
42
|
+
@generated_files = {}
|
43
|
+
@to_generate_files = {}
|
44
|
+
@current_files = {}
|
45
|
+
@skipped_files = {}
|
46
|
+
end
|
47
|
+
|
48
|
+
def generate_all
|
49
|
+
reset_file_info
|
50
|
+
success "generating all files in: #{@root}"
|
51
|
+
generate_on_changes Dir.glob "#{@root}/**/*.js"
|
52
|
+
success "#{@current_files.length}/#{@to_generate_files.length} files current"
|
53
|
+
success "#{@generated_files.length} files geneated" if @generated_files.length > 0
|
54
|
+
warning "#{@skipped_files.length} files skipped (this is a name conflict. We recommend renaming your source file(s)." if @skipped_files.length> 0
|
55
|
+
end
|
56
|
+
|
57
|
+
def dirs_effected files
|
58
|
+
dirs = files.map do |path|
|
59
|
+
p = path.split(@root+"/", 2)[1] || ""
|
60
|
+
dir = File.dirname p
|
61
|
+
subdir = join dir, File.basename(p, File.extname(p))
|
62
|
+
if subdir.length>0 && File.directory?(join @root, subdir)
|
63
|
+
[dir,subdir]
|
64
|
+
else
|
65
|
+
dir
|
66
|
+
end
|
67
|
+
end.flatten.uniq.sort.reverse
|
68
|
+
end
|
69
|
+
|
70
|
+
def generate_on_changes(paths)
|
71
|
+
dirs = dirs_effected paths
|
72
|
+
in_root do
|
73
|
+
dirs.each do |dir|
|
74
|
+
generate_neptune dir
|
75
|
+
generate_namespace dir
|
76
|
+
generate_loader dir
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def file_is_safe_to_overwrite file
|
82
|
+
return true unless File.exists? file
|
83
|
+
File.open(file, "r") do |file|
|
84
|
+
return SAFE_GENERATE_FIRST_LINE == file.read(SAFE_GENERATE_FIRST_LINE.length)
|
85
|
+
end
|
86
|
+
false
|
87
|
+
end
|
88
|
+
|
89
|
+
def safe_generate file
|
90
|
+
@to_generate_files[file] = true
|
91
|
+
return if !File.exists? File.dirname file
|
92
|
+
info_file = join @root, file.split(@root)[-1]
|
93
|
+
if @overwrite || file_is_safe_to_overwrite(file)
|
94
|
+
new_contents = SAFE_GENERATE_FIRST_LINE + " #{NeptuneCoffee::VERSION}\n" + yield
|
95
|
+
if @force || !File.exists?(file) || (File.read(file) != new_contents)
|
96
|
+
@generated_files[file] = true
|
97
|
+
success "generating: #{info_file}"
|
98
|
+
highlighted = CodeRay.scan(new_contents, :javascript).terminal
|
99
|
+
info "output:\n "+highlighted.gsub("\n","\n ") if @verbose
|
100
|
+
File.write file, new_contents
|
101
|
+
else
|
102
|
+
@current_files[file] = true
|
103
|
+
# success "unchanged: #{info_file}"
|
104
|
+
end
|
105
|
+
else
|
106
|
+
@skipped_files[file] = true
|
107
|
+
warning "skipping: #{info_file}"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def js_files_to_load dir
|
112
|
+
files = Dir.glob(dir+"/*.js").map {|f| f.chomp ".js"}
|
113
|
+
files.select {|file| !file[/\/namespaces?$/]}.sort
|
114
|
+
end
|
115
|
+
|
116
|
+
def generate_loader dir
|
117
|
+
return if dir == "."
|
118
|
+
files = js_files_to_load dir
|
119
|
+
files = [join(dir, "namespace")]+files
|
120
|
+
namespace_name = File.basename(dir).camel_case
|
121
|
+
safe_generate dir+".js" do
|
122
|
+
<<-ENDJS
|
123
|
+
define([
|
124
|
+
"#{files.join "\",\n \""}"
|
125
|
+
], function(#{namespace_name}) {
|
126
|
+
return #{namespace_name};
|
127
|
+
});
|
128
|
+
ENDJS
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def join(dir, file)
|
133
|
+
if dir == "." || dir == ""
|
134
|
+
file
|
135
|
+
else
|
136
|
+
File.join dir, file
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def sub_namespaces_to_include dir
|
141
|
+
Dir.glob(dir+"/*").select {|f| File.directory?(f) && File.exists?(File.join f, "namespace.js")}.sort
|
142
|
+
end
|
143
|
+
|
144
|
+
def generate_neptune dir
|
145
|
+
path = join dir, "neptune.js"
|
146
|
+
root = dir == "."
|
147
|
+
sub_namespaces = sub_namespaces_to_include dir
|
148
|
+
camel_subs = sub_namespaces.map {|s| s.split("/")[-1].camel_case}
|
149
|
+
subs_files = sub_namespaces.map {|s| File.join s, "neptune"}
|
150
|
+
namespace_name = File.basename(dir).camel_case
|
151
|
+
namespace_name = "Neptune" if dir == "."
|
152
|
+
subs_files = [join(dir, "namespace")]+subs_files unless root
|
153
|
+
function_params = camel_subs
|
154
|
+
function_params = [namespace_name] + function_params unless root
|
155
|
+
safe_generate path do
|
156
|
+
<<-ENDJS
|
157
|
+
define([
|
158
|
+
"#{subs_files.join "\",\n \""}"
|
159
|
+
], function(#{function_params.join ", "}) {#{"
|
160
|
+
Neptune = window.Neptune = {};" if root}#{
|
161
|
+
camel_subs.map do |s|"
|
162
|
+
#{namespace_name}.#{s} = #{s}; #{s}.namespace = #{namespace_name};"
|
163
|
+
end.join
|
164
|
+
}
|
165
|
+
return #{namespace_name};
|
166
|
+
});
|
167
|
+
ENDJS
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
def generate_namespace dir
|
173
|
+
path = join dir, "namespace.js"
|
174
|
+
parent_namespace_name = File.basename(File.dirname dir).camel_case
|
175
|
+
parent_namespace_name = "Root" if parent_namespace_name == "."
|
176
|
+
namespace_name = File.basename(dir).camel_case
|
177
|
+
safe_generate path do
|
178
|
+
if dir == "." || dir == ""
|
179
|
+
<<-ENDJS
|
180
|
+
define([], function() {return window;})
|
181
|
+
ENDJS
|
182
|
+
else
|
183
|
+
parent_namespace = join File.dirname(dir), "namespace"
|
184
|
+
<<-ENDJS
|
185
|
+
define(["#{parent_namespace}"], function(#{parent_namespace_name}) {
|
186
|
+
return #{parent_namespace_name}.#{namespace_name} = (function() {
|
187
|
+
function #{namespace_name}() {}
|
188
|
+
#{namespace_name}.namespace = #{parent_namespace_name};
|
189
|
+
return #{namespace_name};
|
190
|
+
})();
|
191
|
+
});
|
192
|
+
ENDJS
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'neptune_coffee/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "neptune_coffee"
|
8
|
+
spec.version = NeptuneCoffee::VERSION
|
9
|
+
spec.authors = ["Shane Brinkman-Davis"]
|
10
|
+
spec.email = ["shanebdavis@gmail.com"]
|
11
|
+
spec.description = %q{Opinonated CoffeeScript client-side development}
|
12
|
+
spec.summary = %q{NeptuneCoffee is an opinionated module generator. All you have to do is organize your files into a directory structure where the directory names are module names and the hierarchy reflects sub-modules.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "trollop"
|
22
|
+
spec.add_dependency "extlib"
|
23
|
+
spec.add_dependency "coderay"
|
24
|
+
spec.add_dependency "guard"
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
27
|
+
spec.add_development_dependency "rake"
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: neptune_coffee
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Shane Brinkman-Davis
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: trollop
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: extlib
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: coderay
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: guard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.3'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.3'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: Opinonated CoffeeScript client-side development
|
98
|
+
email:
|
99
|
+
- shanebdavis@gmail.com
|
100
|
+
executables:
|
101
|
+
- neptune_coffee
|
102
|
+
extensions: []
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- .gitignore
|
106
|
+
- Gemfile
|
107
|
+
- LICENSE.txt
|
108
|
+
- README.md
|
109
|
+
- Rakefile
|
110
|
+
- bin/neptune_coffee
|
111
|
+
- examples/geometry.js
|
112
|
+
- examples/geometry/box.js
|
113
|
+
- examples/geometry/circle.js
|
114
|
+
- examples/geometry/namespace.js
|
115
|
+
- examples/geometry/neptune.js
|
116
|
+
- examples/geometry/solids.js
|
117
|
+
- examples/geometry/solids/cone.js
|
118
|
+
- examples/geometry/solids/namespace.js
|
119
|
+
- examples/geometry/solids/neptune.js
|
120
|
+
- lib/neptune_coffee.rb
|
121
|
+
- lib/neptune_coffee/generator.rb
|
122
|
+
- lib/neptune_coffee/version.rb
|
123
|
+
- neptune_coffee.gemspec
|
124
|
+
homepage: ''
|
125
|
+
licenses:
|
126
|
+
- MIT
|
127
|
+
metadata: {}
|
128
|
+
post_install_message:
|
129
|
+
rdoc_options: []
|
130
|
+
require_paths:
|
131
|
+
- lib
|
132
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - '>='
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
requirements: []
|
143
|
+
rubyforge_project:
|
144
|
+
rubygems_version: 2.0.7
|
145
|
+
signing_key:
|
146
|
+
specification_version: 4
|
147
|
+
summary: NeptuneCoffee is an opinionated module generator. All you have to do is organize
|
148
|
+
your files into a directory structure where the directory names are module names
|
149
|
+
and the hierarchy reflects sub-modules.
|
150
|
+
test_files: []
|