neptune_coffee 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in neptune_coffee.gemspec
4
+ gemspec
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"
@@ -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,4 @@
1
+ // example source file
2
+ function(){
3
+ window.box = "box";
4
+ }();
@@ -0,0 +1,4 @@
1
+ // example source file
2
+ function(){
3
+ window.circle = "circle";
4
+ }();
@@ -0,0 +1,2 @@
1
+ // Generated by NeptuneCoffee 0.0.1
2
+ define([], function() {return window;})
@@ -0,0 +1,8 @@
1
+ // Generated by NeptuneCoffee 0.0.1
2
+ define([
3
+ "./solids/neptune"
4
+ ], function(Solids) {
5
+ Neptune = window.Neptune = {};
6
+ Neptune.Solids = Solids; Solids.namespace = Neptune;
7
+ return Neptune;
8
+ });
@@ -0,0 +1,4 @@
1
+ // example source file
2
+ function(){
3
+ window.cone = "cone";
4
+ }();
@@ -0,0 +1,8 @@
1
+ // Generated by NeptuneCoffee 0.0.1
2
+ define(["namespace"], function(Root) {
3
+ return Root.Solids = (function() {
4
+ function Solids() {}
5
+ Solids.namespace = Root;
6
+ return Solids;
7
+ })();
8
+ });
@@ -0,0 +1,6 @@
1
+ // Generated by NeptuneCoffee 0.0.1
2
+ define([
3
+ "solids/namespace"
4
+ ], function(Solids) {
5
+ return Solids;
6
+ });
@@ -0,0 +1,8 @@
1
+ // Generated by NeptuneCoffee 0.0.1
2
+ define([
3
+ "solids/namespace",
4
+ "solids/cone",
5
+ "solids/neptune"
6
+ ], function(Solids) {
7
+ return Solids;
8
+ });
@@ -0,0 +1,10 @@
1
+ // Generated by NeptuneCoffee 0.0.1
2
+ define([
3
+ "geometry/namespace",
4
+ "geometry/box",
5
+ "geometry/circle",
6
+ "geometry/neptune",
7
+ "geometry/solids"
8
+ ], function(Geometry) {
9
+ return Geometry;
10
+ });
@@ -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,3 @@
1
+ module NeptuneCoffee
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,9 @@
1
+ %w{
2
+ version
3
+ generator
4
+ }.each do |mod|
5
+ require File.join(File.dirname(__FILE__),"neptune_coffee", mod)
6
+ end
7
+
8
+ module NeptuneCoffee
9
+ 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: []