newjs 1.0.0

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.
Files changed (69) hide show
  1. data/History.txt +4 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +68 -0
  4. data/README.txt +9 -0
  5. data/Rakefile +4 -0
  6. data/app_generators/newjs/USAGE +9 -0
  7. data/app_generators/newjs/newjs_generator.rb +113 -0
  8. data/app_generators/newjs/templates/History.txt.erb +4 -0
  9. data/app_generators/newjs/templates/License.txt.erb +20 -0
  10. data/app_generators/newjs/templates/README.txt +1 -0
  11. data/app_generators/newjs/templates/Rakefile.erb +82 -0
  12. data/app_generators/newjs/templates/config/javascript_test_autotest.yml.sample +15 -0
  13. data/app_generators/newjs/templates/lib/jstest.rb +382 -0
  14. data/app_generators/newjs/templates/lib/protodoc.rb +36 -0
  15. data/app_generators/newjs/templates/script/js_autotest +1 -0
  16. data/app_generators/newjs/templates/script/rstakeout +98 -0
  17. data/app_generators/newjs/templates/src/HEADER.erb +8 -0
  18. data/app_generators/newjs/templates/src/library.js.erb +7 -0
  19. data/app_generators/newjs/templates/tasks/environment.rake +7 -0
  20. data/app_generators/newjs/templates/tasks/javascript_test_autotest_tasks.rake +44 -0
  21. data/app_generators/newjs/templates/test/assets/prototype.js +4236 -0
  22. data/app_generators/newjs/templates/test/assets/unittest.css +50 -0
  23. data/app_generators/newjs/templates/test/assets/unittest.js +556 -0
  24. data/bin/newjs +17 -0
  25. data/config/hoe.rb +75 -0
  26. data/config/requirements.rb +17 -0
  27. data/javascript_test_generators/javascript_test/USAGE +2 -0
  28. data/javascript_test_generators/javascript_test/javascript_test_generator.rb +54 -0
  29. data/javascript_test_generators/javascript_test/templates/test/test.html.erb +58 -0
  30. data/lib/newjs.rb +7 -0
  31. data/lib/newjs/autotest.rb +3 -0
  32. data/lib/newjs/autotest/javascript_test_autotest.rb +22 -0
  33. data/lib/newjs/autotest/javascript_test_autotest/config.rb +20 -0
  34. data/lib/newjs/autotest/javascript_test_ext.rb +29 -0
  35. data/lib/newjs/jstest.rb +382 -0
  36. data/lib/newjs/version.rb +9 -0
  37. data/log/debug.log +0 -0
  38. data/newjs_generators/install_website/USAGE +5 -0
  39. data/newjs_generators/install_website/install_website_generator.rb +79 -0
  40. data/newjs_generators/install_website/templates/script/txt2html +74 -0
  41. data/newjs_generators/install_website/templates/script/win_script.cmd +1 -0
  42. data/newjs_generators/install_website/templates/tasks/website.rake +17 -0
  43. data/newjs_generators/install_website/templates/website/index.html +11 -0
  44. data/newjs_generators/install_website/templates/website/index.txt +37 -0
  45. data/newjs_theme_generators/plain_theme/USAGE +0 -0
  46. data/newjs_theme_generators/plain_theme/plain_theme_generator.rb +54 -0
  47. data/newjs_theme_generators/plain_theme/templates/website/javascripts/rounded_corners_lite.inc.js +285 -0
  48. data/newjs_theme_generators/plain_theme/templates/website/stylesheets/screen.css +138 -0
  49. data/newjs_theme_generators/plain_theme/templates/website/template.html.erb +48 -0
  50. data/script/destroy +14 -0
  51. data/script/generate +14 -0
  52. data/script/txt2html +74 -0
  53. data/setup.rb +1585 -0
  54. data/tasks/deployment.rake +34 -0
  55. data/tasks/environment.rake +7 -0
  56. data/tasks/website.rake +17 -0
  57. data/test/test_generator_helper.rb +20 -0
  58. data/test/test_helper.rb +4 -0
  59. data/test/test_install_website_generator.rb +39 -0
  60. data/test/test_javascript_test_generator.rb +43 -0
  61. data/test/test_newjs_generator.rb +63 -0
  62. data/test/test_plain_theme_generator.rb +37 -0
  63. data/website/images/example-unittest-log.jpg +0 -0
  64. data/website/index.html +271 -0
  65. data/website/index.txt +181 -0
  66. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  67. data/website/stylesheets/screen.css +138 -0
  68. data/website/template.html.erb +48 -0
  69. metadata +168 -0
@@ -0,0 +1,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
@@ -0,0 +1,17 @@
1
+ desc 'Generate website files'
2
+ task :website_generate => :ruby_env do
3
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
+ end
6
+ end
7
+
8
+ desc 'Upload website files to rubyforge'
9
+ task :website_upload do
10
+ host = "#{rubyforge_username}@rubyforge.org"
11
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
+ local_dir = 'website'
13
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
+ end
15
+
16
+ desc 'Generate and upload website files'
17
+ task :website => [:website_generate, :website_upload, :publish_docs]
@@ -0,0 +1,20 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'fileutils'
3
+
4
+ # Must set before requiring generator libs.
5
+ TMP_ROOT = File.dirname(__FILE__) + "/tmp" unless defined?(TMP_ROOT)
6
+ PROJECT_NAME = "myproject" unless defined?(PROJECT_NAME)
7
+ app_root = File.join(TMP_ROOT, PROJECT_NAME)
8
+ if defined?(APP_ROOT)
9
+ APP_ROOT.replace(app_root)
10
+ else
11
+ APP_ROOT = app_root
12
+ end
13
+
14
+ begin
15
+ require 'rubigen'
16
+ rescue LoadError
17
+ require 'rubygems'
18
+ require 'rubigen'
19
+ end
20
+ require 'rubigen/helpers/generator_test_helper'
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'test/unit'
4
+ require File.dirname(__FILE__) + '/../lib/newjs'
@@ -0,0 +1,39 @@
1
+ require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
2
+
3
+ class TestInstallWebsiteGenerator < Test::Unit::TestCase
4
+ include RubiGen::GeneratorTestHelper
5
+
6
+ def setup
7
+ bare_setup
8
+ end
9
+
10
+ def teardown
11
+ bare_teardown
12
+ end
13
+
14
+ def test_generator_without_options
15
+ name = "myapp"
16
+ run_generator(generator_name, [name], sources)
17
+
18
+ %w[index.txt index.html template.html.erb stylesheets/screen.css javascripts/rounded_corners_lite.inc.js].each do |file|
19
+ assert_generated_file("website/#{file}")
20
+ end
21
+ assert_generated_file("script/txt2html")
22
+ assert_generated_file("tasks/website.rake")
23
+ end
24
+
25
+ private
26
+ def sources
27
+ [ RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__), "..", generator_path)),
28
+ RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__), "..", "newjs_theme_generators"))
29
+ ]
30
+ end
31
+
32
+ def generator_path
33
+ "newjs_generators"
34
+ end
35
+
36
+ def generator_name
37
+ 'install_website'
38
+ end
39
+ end
@@ -0,0 +1,43 @@
1
+ require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
2
+
3
+ class TestJavascriptTestGenerator < Test::Unit::TestCase
4
+ include RubiGen::GeneratorTestHelper
5
+
6
+ def setup
7
+ bare_setup
8
+ end
9
+
10
+ def teardown
11
+ bare_teardown
12
+ end
13
+
14
+ # Some generator-related assertions:
15
+ # assert_generated_file(name, &block) # block passed the file contents
16
+ # assert_directory_exists(name)
17
+ # assert_generated_class(name, &block)
18
+ # assert_generated_module(name, &block)
19
+ # assert_generated_test_for(name, &block)
20
+ # The assert_generated_(class|module|test_for) &block is passed the body of the class/module within the file
21
+ # assert_has_method(body, *methods) # check that the body has a list of methods (methods with parentheses not supported yet)
22
+ #
23
+ # Other helper methods are:
24
+ # app_root_files - put this in teardown to show files generated by the test method (e.g. p app_root_files)
25
+ # bare_setup - place this in setup method to create the APP_ROOT folder for each test
26
+ # bare_teardown - place this in teardown method to destroy the TMP_ROOT or APP_ROOT folder after each test
27
+
28
+ def test_generator_without_options
29
+ name = "library"
30
+ run_generator('javascript_test', [name], sources)
31
+ assert_generated_file("test/library_test.html")
32
+ end
33
+
34
+ private
35
+ def sources
36
+ [RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__),"..", generator_path))
37
+ ]
38
+ end
39
+
40
+ def generator_path
41
+ "javascript_test_generators"
42
+ end
43
+ end
@@ -0,0 +1,63 @@
1
+ require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
2
+
3
+ class TestNewjsGenerator < Test::Unit::TestCase
4
+ include RubiGen::GeneratorTestHelper
5
+
6
+ def setup
7
+ bare_setup
8
+ end
9
+
10
+ def teardown
11
+ bare_teardown
12
+ end
13
+
14
+ # Some generator-related assertions:
15
+ # assert_generated_file(name, &block) # block passed the file contents
16
+ # assert_directory_exists(name)
17
+ # assert_generated_class(name, &block)
18
+ # assert_generated_module(name, &block)
19
+ # assert_generated_test_for(name, &block)
20
+ # The assert_generated_(class|module|test_for) &block is passed the body of the class/module within the file
21
+ # assert_has_method(body, *methods) # check that the body has a list of methods (methods with parentheses not supported yet)
22
+ #
23
+ # Other helper methods are:
24
+ # app_root_files - put this in teardown to show files generated by the test method (e.g. p app_root_files)
25
+ # bare_setup - place this in setup method to create the APP_ROOT folder for each test
26
+ # bare_teardown - place this in teardown method to destroy the TMP_ROOT or APP_ROOT folder after each test
27
+
28
+ def test_generator_without_options
29
+ run_generator('newjs', [APP_ROOT], sources)
30
+ assert_directory_exists "lib"
31
+ assert_directory_exists "config"
32
+ assert_directory_exists "src"
33
+ assert_directory_exists "script"
34
+ assert_directory_exists "tasks"
35
+ assert_directory_exists "test/assets"
36
+ assert_generated_file "test/assets/unittest.css"
37
+ assert_generated_file "test/assets/unittest.js"
38
+ assert_generated_file "test/assets/prototype.js"
39
+ assert_generated_file "Rakefile"
40
+ assert_generated_file "README.txt"
41
+ assert_generated_file "License.txt"
42
+ assert_generated_file "History.txt"
43
+ assert_generated_file "script/rstakeout"
44
+ assert_generated_file "script/js_autotest"
45
+ assert_generated_file "tasks/javascript_test_autotest_tasks.rake"
46
+ assert_generated_file "tasks/environment.rake"
47
+ assert_generated_file "config/javascript_test_autotest.yml.sample"
48
+ assert_generated_file "src/myproject.js"
49
+ assert_generated_file "src/HEADER"
50
+ assert_generated_file "lib/protodoc.rb"
51
+ assert_generated_file "lib/jstest.rb"
52
+ end
53
+
54
+ private
55
+ def sources
56
+ [RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__),"..", generator_path))
57
+ ]
58
+ end
59
+
60
+ def generator_path
61
+ "app_generators"
62
+ end
63
+ end
@@ -0,0 +1,37 @@
1
+ require File.join(File.dirname(__FILE__), "test_generator_helper.rb")
2
+
3
+ class TestPlainThemeGenerator < Test::Unit::TestCase
4
+ include RubiGen::GeneratorTestHelper
5
+
6
+ def setup
7
+ bare_setup
8
+ end
9
+
10
+ def teardown
11
+ bare_teardown
12
+ end
13
+
14
+ def test_generator_without_options
15
+ run_generator('plain_theme', [], sources)
16
+ %w[template.html.erb stylesheets/screen.css javascripts/rounded_corners_lite.inc.js].each do |file|
17
+ assert_generated_file("website/#{file}")
18
+ end
19
+ end
20
+
21
+ def test_generator_with_author_and_email
22
+ run_generator('plain_theme', [], sources, {:author => "AUTHOR", :email => "EMAIL"})
23
+ %w[template.html.erb stylesheets/screen.css javascripts/rounded_corners_lite.inc.js].each do |file|
24
+ assert_generated_file("website/#{file}")
25
+ end
26
+ end
27
+
28
+ private
29
+ def sources
30
+ [RubiGen::PathSource.new(:test, File.join(File.dirname(__FILE__),"..", generator_path))
31
+ ]
32
+ end
33
+
34
+ def generator_path
35
+ "newjs_theme_generators"
36
+ end
37
+ end
@@ -0,0 +1,271 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
+ <title>
8
+ JavaScript Project Generator
9
+ </title>
10
+ <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
+ <style>
12
+
13
+ </style>
14
+ <script type="text/javascript">
15
+ window.onload = function() {
16
+ settings = {
17
+ tl: { radius: 10 },
18
+ tr: { radius: 10 },
19
+ bl: { radius: 10 },
20
+ br: { radius: 10 },
21
+ antiAlias: true,
22
+ autoPad: true,
23
+ validTags: ["div"]
24
+ }
25
+ var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
+ versionBox.applyCornersToAll();
27
+ }
28
+ </script>
29
+ </head>
30
+ <body>
31
+ <div id="main">
32
+
33
+ <h1>JavaScript Project Generator</h1>
34
+ <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/newjs"; return false'>
35
+ <p>Get Version</p>
36
+ <a href="http://rubyforge.org/projects/newjs" class="numbers">1.0.0</a>
37
+ </div>
38
+ <h1>&#x2192; &#8216;newjs&#8217;</h1>
39
+
40
+
41
+ <h2>What</h2>
42
+
43
+
44
+ <p>A simple command-line tool to create the folders and helper files
45
+ for a new JavaScript project/library. As a bonus, you can quickly
46
+ create a website to promote your project.</p>
47
+
48
+
49
+ <p>When you start a new JavaScript library, how do you layout the source files,
50
+ the tests, the distribution files? Do you have support scripts to
51
+ generate distributions from source files? Run your JavaScript unit tests?
52
+ Generators to create new unit test <span class="caps">HTML</span> files?</p>
53
+
54
+
55
+ <p><strong>No? Me neither</strong>, so I created the JavaScript Project Generator.</p>
56
+
57
+
58
+ <p>Once <code>newjs</code> has finished helping you write your source libraries,
59
+ write test <span class="caps">HTML</span> files, providing autotesting scripts to make <span class="caps">TDD</span> a piece of cake,
60
+ it finally helps you bundle all your source files into a single JavaScript file
61
+ for distribution.</p>
62
+
63
+
64
+ <p>What a nice helpful tool it is!</p>
65
+
66
+
67
+ <h2>Installing</h2>
68
+
69
+
70
+ <p>Installation and maintenance of generated JavaScript projects
71
+ requires the installation of <a href="http://www.ruby-lang.org/">Ruby</a> and <a href="http://rubygems.org/">RubyGems</a>.</p>
72
+
73
+
74
+ <p>The command-line application <code>newjs</code> is installed as below,
75
+ for any operating system (except the &#8216;sudo&#8217; part &#8211; use as necessary):</p>
76
+
77
+
78
+ <pre>sudo gem install newjs</pre>
79
+
80
+ <h2>Getting started</h2>
81
+
82
+
83
+ <p>To kick-off your new project/library, run the command-line app <code>newjs</code>:</p>
84
+
85
+
86
+ <pre>$ newjs mylib
87
+ create config
88
+ create lib
89
+ create src
90
+ create script
91
+ create tasks
92
+ create test/assets
93
+ create test/assets/unittest.css
94
+ create test/assets/unittest.js
95
+ create test/assets/prototype.js
96
+ create tasks/javascript_test_autotest_tasks.rake
97
+ create tasks/environment.rake
98
+ create config/javascript_test_autotest.yml.sample
99
+ create lib/protodoc.rb
100
+ create README.txt
101
+ create Rakefile
102
+ create History.txt
103
+ create License.txt
104
+ create src/HEADER
105
+ create src/mylib.js
106
+ create script/rstakeout
107
+ create script/js_autotest
108
+ dependency install_rubigen_scripts
109
+ exists script
110
+ create script/generate
111
+ create script/destroy
112
+ </pre>
113
+
114
+ <p>Look at all that!</p>
115
+
116
+
117
+ <p>Unit testing uses the <code>unittest.js</code> library
118
+ developed within <a href="http://www.prototypejs.org/">prototypejs</a>. It should
119
+ also support JavaScript development using any non-prototype.js libraries.</p>
120
+
121
+
122
+ <p>Your raw, unconcatenated library/source files go in <code>src/</code></p>
123
+
124
+
125
+ <p>Your unit test <span class="caps">HTML</span> files, go in <code>test/</code> (see test generator below).</p>
126
+
127
+
128
+ When you&#8217;ve got a new version to release, edit <code>Rakefile</code> and modify the
129
+ <code>APP_VERSION</code> string (see Distribution section below).
130
+
131
+ <p>To merge your <code>src/</code> files into a distribution file, see below.</p>
132
+
133
+
134
+ <h2>Generating test <span class="caps">HTML</span> files</h2>
135
+
136
+
137
+ <p>If you are going to have a <code>src/some_lib.js</code> file, then you&#8217;ll want a unit
138
+ test file(s). By default you&#8217;d call it <code>test/some_lib_test.html</code>.</p>
139
+
140
+
141
+ <p>And then what? Personally, I can never remember what basic <span class="caps">HTML</span> + JavaScript
142
+ goes in the test <span class="caps">HTML</span> files. I quite like the <a href="http://drnicwilliams.com/2008/01/04/autotesting-javascript-in-rails/">javascript_test plugin</a> for <a href="http://www.rubyonrails.org/">Ruby
143
+ on Rails</a>, which allows you to generate a
144
+ test <span class="caps">HTML</span> stub. So I&#8217;ve included a version of it
145
+ here. That is, your JavaScript project comes with a generator to create new
146
+ test <span class="caps">HTML</span> files, ready to rock and roll.</p>
147
+
148
+
149
+ <pre>$ script/generate javascript_test some_lib
150
+ exists test
151
+ create test/some_lib_test.html</pre>
152
+
153
+ <p>Now edit <code>test/some_lib_test.html</code> and follow the comments
154
+ that tell you what to do to write your unit tests.</p>
155
+
156
+
157
+ <p>Want to name your test file something different? Specify the target
158
+ library as an additional parameter.</p>
159
+
160
+
161
+ <pre>$ script/generate javascript_test my_library_tests some_lib
162
+ exists test
163
+ create test/my_library_tests_test.html</pre>
164
+
165
+ <h2>Running unit tests</h2>
166
+
167
+
168
+ <p>Each test <span class="caps">HTML</span> file should be self-executable: just open it in a target
169
+ browser. That is, to run the <code>test/some_lib_test.html</code> tests
170
+ in Firefox, open the file in Firefox.</p>
171
+
172
+
173
+ <p>It will print out a beautiful log success/error messages for each test.</p>
174
+
175
+
176
+ <p><img src="images/example-unittest-log.jpg" width="647" height="427" alt="Example Unittest Log"></p>
177
+
178
+
179
+ <h2>Distribution of library</h2>
180
+
181
+
182
+ <p>Your project comes with the ability to concatenate all your <code>src/*.js</code>
183
+ files into a single file for distribution, as <code>dist/project_name.js</code>.</p>
184
+
185
+
186
+ <p>First, edit <code>src/HEADER</code> with information that will be included
187
+ at the top of the generated distribution file.</p>
188
+
189
+
190
+ <p>Second, edit <code>src/project_name.js</code> to include the names of
191
+ all the <code>src/</code> files that will be concatenated together
192
+ in your required order.</p>
193
+
194
+
195
+ <p>Finally, run the command:</p>
196
+
197
+
198
+ <pre>rake dist</pre>
199
+
200
+ <h2>Create a website for your project</h2>
201
+
202
+
203
+ <p>You can quickly create a clean, readable website for your project
204
+ that prominently displays the current version number (which is a
205
+ clickable link through to the download page), just like this page.</p>
206
+
207
+
208
+ <pre>script/generate install_website</pre>
209
+
210
+ <p>Now edit the generated <code>website/index.txt</code> file (<a href="http://www.textism.com/tools/textile/">Textile</a> format).</p>
211
+
212
+
213
+ <p>To convert it to <span class="caps">HTML</span>, run:</p>
214
+
215
+
216
+ <pre>rake website_generate</pre>
217
+
218
+ <p>And open <code>website/index.html</code> in your browser to preview.
219
+ The project&#8217;s version number is automatically inserted into the page
220
+ (change version numbers via <code>APP_VERSION</code> in <code>Rakefile</code>).</p>
221
+
222
+
223
+ <p>To upload the website (and its <span class="caps">CSS</span>)</p>
224
+
225
+
226
+ <h2>Screencast coming soon</h2>
227
+
228
+
229
+ <p>A hard-core, &#8220;how to do JavaScript unit testing&#8221; screencast will
230
+ soon be published by <a href="http://peepcode.com/">PeepCode</a>. It will cost $9
231
+ and you&#8217;ll love every minute of it.</p>
232
+
233
+
234
+ <p>Subscribe to PeepCode&#8217;s blog for announcement details.</p>
235
+
236
+
237
+ <h2>Forum</h2>
238
+
239
+
240
+ <p><a href="http://groups.google.com/group/javascript-project-generator">http://groups.google.com/group/javascript-project-generator</a></p>
241
+
242
+
243
+ <h2>How to submit patches</h2>
244
+
245
+
246
+ <p>Read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people&#8217;s code</a> and for section <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups">8b: Submit patch to Google Groups</a>, use the Google Group above.</p>
247
+
248
+
249
+ <p>The source project is a <a href="http://git.or.cz/">Git</a> repository. See Dr Nic&#8217;s <a href="http://github.com/drnic/newjs/tree/master">master branch</a> for clone/checkout details.</p>
250
+
251
+
252
+ <h2>License</h2>
253
+
254
+
255
+ <p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
256
+
257
+
258
+ <h2>Contact</h2>
259
+
260
+
261
+ <p>Comments are welcome. Send an email to <a href="mailto:drnicwilliams@gmail.com">Dr Nic Williams</a> via the <a href="http://groups.google.com/group/javascript-project-generator">forum</a></p>
262
+ <p class="coda">
263
+ <a href="drnicwilliams@gmail.com">Dr Nic Williams</a>, 15th February 2008<br>
264
+ Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
265
+ </p>
266
+ </div>
267
+
268
+ <!-- insert site tracking codes here, like Google Urchin -->
269
+
270
+ </body>
271
+ </html>