roger 0.0.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +8 -8
  2. data/.gitignore +2 -0
  3. data/.travis.yml +12 -0
  4. data/CHANGELOG.md +102 -0
  5. data/Gemfile +5 -0
  6. data/MIT_LICENSE +20 -0
  7. data/README.md +10 -10
  8. data/Rakefile +9 -0
  9. data/bin/roger +5 -0
  10. data/doc/cli.md +46 -0
  11. data/doc/mockupfile.md +3 -0
  12. data/doc/templating.md +88 -0
  13. data/examples/default_template/.gitignore +2 -0
  14. data/examples/default_template/CHANGELOG +0 -0
  15. data/examples/default_template/Gemfile +3 -0
  16. data/examples/default_template/Mockupfile +1 -0
  17. data/examples/default_template/html/.empty_directory +0 -0
  18. data/examples/default_template/partials/.empty_directory +0 -0
  19. data/lib/roger/cli/command.rb +23 -0
  20. data/lib/roger/cli/generate.rb +5 -0
  21. data/lib/roger/cli/release.rb +10 -0
  22. data/lib/roger/cli/serve.rb +29 -0
  23. data/lib/roger/cli.rb +123 -0
  24. data/lib/roger/extractor.rb +95 -0
  25. data/lib/roger/generators/generator.rb +23 -0
  26. data/lib/roger/generators/new.rb +67 -0
  27. data/lib/roger/generators/templates/generator.tt +13 -0
  28. data/lib/roger/generators.rb +23 -0
  29. data/lib/roger/mockupfile.rb +63 -0
  30. data/lib/roger/project.rb +92 -0
  31. data/lib/roger/rack/html_validator.rb +26 -0
  32. data/lib/roger/rack/roger.rb +52 -0
  33. data/lib/roger/rack/sleep.rb +21 -0
  34. data/lib/roger/release/cleaner.rb +47 -0
  35. data/lib/roger/release/finalizers/dir.rb +29 -0
  36. data/lib/roger/release/finalizers/git_branch.rb +92 -0
  37. data/lib/roger/release/finalizers/rsync.rb +77 -0
  38. data/lib/roger/release/finalizers/zip.rb +42 -0
  39. data/lib/roger/release/finalizers.rb +19 -0
  40. data/lib/roger/release/injector.rb +99 -0
  41. data/lib/roger/release/processors/mockup.rb +93 -0
  42. data/lib/roger/release/processors/url_relativizer.rb +45 -0
  43. data/lib/roger/release/processors.rb +17 -0
  44. data/lib/roger/release/scm/git.rb +101 -0
  45. data/lib/roger/release/scm.rb +32 -0
  46. data/lib/roger/release.rb +363 -0
  47. data/lib/roger/resolver.rb +119 -0
  48. data/lib/roger/server.rb +117 -0
  49. data/lib/roger/template.rb +206 -0
  50. data/lib/roger/w3c_validator.rb +129 -0
  51. data/roger.gemspec +35 -0
  52. data/test/Mockupfile-syntax.rb +85 -0
  53. data/test/project/.rvmrc +1 -0
  54. data/test/project/Gemfile +7 -0
  55. data/test/project/Gemfile.lock +38 -0
  56. data/test/project/Mockupfile +13 -0
  57. data/test/project/html/formats/erb.html.erb +5 -0
  58. data/test/project/html/formats/index.html +1 -0
  59. data/test/project/html/formats/json.json.erb +0 -0
  60. data/test/project/html/formats/markdown.md +3 -0
  61. data/test/project/html/formats/mockup.html +5 -0
  62. data/test/project/html/front_matter/erb.html.erb +16 -0
  63. data/test/project/html/front_matter/markdown.md +7 -0
  64. data/test/project/html/layouts/content-for.html.erb +17 -0
  65. data/test/project/html/layouts/erb.html.erb +19 -0
  66. data/test/project/html/mockup/encoding.html +3 -0
  67. data/test/project/html/partials/erb.html.erb +10 -0
  68. data/test/project/html/partials/load_path.html.erb +3 -0
  69. data/test/project/html/partials/mockup.html +13 -0
  70. data/test/project/html/static/non-relative.html.erb +9 -0
  71. data/test/project/html/static/relative.html.erb +9 -0
  72. data/test/project/layouts/test.html.erb +34 -0
  73. data/test/project/layouts/yield.html.erb +1 -0
  74. data/test/project/lib/generators/test.rb +9 -0
  75. data/test/project/partials/formats/erb.html.erb +1 -0
  76. data/test/project/partials/partials-test.html.erb +1 -0
  77. data/test/project/partials/test/erb.html.erb +1 -0
  78. data/test/project/partials/test/front_matter.html.erb +1 -0
  79. data/test/project/partials/test/json.json.erb +1 -0
  80. data/test/project/partials/test/markdown.md +1 -0
  81. data/test/project/partials/test/mockup.part.html +1 -0
  82. data/test/project/partials/test/simple.html.erb +1 -0
  83. data/test/project/partials2/partials2-test.html.erb +1 -0
  84. data/test/unit/cli_test.rb +12 -0
  85. data/test/unit/generators_test.rb +75 -0
  86. data/test/unit/release/cleaner_test.rb +47 -0
  87. data/test/unit/resolver_test.rb +92 -0
  88. data/test/unit/template_test.rb +127 -0
  89. metadata +202 -8
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- M2FhYzgyZDQ3NDY5NjI2ODgxMDViMThkMDAxMWM3NTM5MjY4YThjMw==
4
+ MDYwN2JiYWE4N2QzYjdkYzhjNTRiYWQ3NTdkMWU3OGU4NWI0MTIxMg==
5
5
  data.tar.gz: !binary |-
6
- Y2YxYWE1MTcxN2FjOTI4NDNjZDQzNTljN2IwNzc1M2I3Yzc1NDA3Yg==
6
+ YzZjMjM2MjcyY2U5ODBhMTk5MDBiNTQ3OGFjODNlNGVmZWM2ZmZlMA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MDQyODc0ZGRmMTQ3OWEyZDNlNDc5NDBlZTVkYTFlYTBmZjZmMzAwZWI3OGE3
10
- Y2JlYjU3OWI5ZTFjODg3YTFiMmVmNWJlMWQ4ZjY0ZDEwODM5MWU2Yjg3YzVj
11
- NTJiNjA3NGM5MTNmNzc2MjFkZjQ3ODU5N2UzNWIxZWZhYjQ1Yjg=
9
+ ZTM3NmYzNjkyNTIzZmUzMzI1OGZlOTQ2M2JkZDNkMjg1MWE5ODQ5Mjk4MGI3
10
+ ZTQ1ZTUyNzY4OGJiNzM5ZTQwNDk4OTAxMDIxNzIxMjJlOGFkN2E4YjMzNGQy
11
+ YmRhZjUxODk1Mzc3MmM1N2I5ZjJjYjVlNTI5MTIxNzhjYjBkZWY=
12
12
  data.tar.gz: !binary |-
13
- MDYwMDM3ZTVjMzM2MTE0OWIwMmQ5YjI5MTE1ZDU4YmY2MmQ5ZmMxNDY1NDc1
14
- NDg5ZWQ2ZGFkY2U5NTM2MGMyNzljMzBhMmZiMDkxNDVkMTdhMTdlOTcyYmE3
15
- ZDE1M2RkMmZhNDM3NDJmNzE1MjhkNDgyY2I5NjA5ZGRmMWNlMGQ=
13
+ YTA2OGU2NDg0MTFjMWI4ZWU2YzNiZmU2NzE1ZjhlOTk0MTQ5ZTNmMGY3Nzg0
14
+ MTY2ZGMxMzJmODQ0Y2M2MzhlODQyMGY2YTUxMTQ0NWQ2MjkzMjEwYThlYzRh
15
+ MzMyMzc1Y2Q4Zjc3OGVhNWU3OTYwODgwODk1NWQxN2UyZmQ5ZGY=
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ pkg/*
2
+ Gemfile.lock
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.1
6
+ - rbx-2
7
+ - jruby
8
+ matrix:
9
+ allow_failures:
10
+ - rvm: rbx-2
11
+ - rvm: jruby
12
+ fast_finish: true
data/CHANGELOG.md ADDED
@@ -0,0 +1,102 @@
1
+ # Changelog
2
+
3
+ ## Version 0.10.0
4
+ * Welcome **Roger**
5
+ * Removed requirejs, sass and yuicompressor processors in favour of separate gems
6
+ * Removed legacy templates using `<!-- [START:...] -->` partials (still available in separate gem)
7
+
8
+ ## Version 0.9.0
9
+ * More documentation!
10
+ * More tests! (and CI!)
11
+ * Thor and Tilt updates
12
+ * Add possibility to load external generators from gems (with the `Roger::Generators::Base.register` method)
13
+ * Partials now automatically prefer templates of the same extension as the parent
14
+ * ERB Templates now support `content_for(:name) do ... end` blocks which can be yielded by `:name` in the layout
15
+ * Multiple load paths for partials are now supported
16
+ * Minor changes and fixes
17
+ * First preparations for version 1.0.0. which will be called **Roger**
18
+
19
+ ## Version 0.8.4
20
+ * Fix requirejs processor to clean up the correct paths
21
+ * Allow typing of Y to rsync instead of full "yes"
22
+
23
+ ## Version 0.8.3
24
+ * Make the url relativizer respect :skip parameter
25
+
26
+ ## Version 0.8.2
27
+ * If bundler is installed we're running Bundler.require automatically.
28
+
29
+ ## Version 0.8.1
30
+ * Don't crash on non-existent partials/layouts path
31
+ * Add more logging in verbose mode when extracting mockup
32
+ * Fix the passing of env options to mockup release processor
33
+
34
+ ## Version 0.8.0
35
+ * Set content type header in response when rendering templates
36
+ * Add option to prompt user before performing rsync finalizer (defaults to true)
37
+ * Fix zip finalizer to use options[:zip] in actuall executed command too
38
+ * Logger now outputs color and has support for warning messages
39
+ * Mockup templating is now fully handled with Tilt
40
+ * Mockup extraction and URL relativization etc. for release are now done in their respective processors (will be added automatically if you haven't added them yourself.) This gives a fine-grained control over the point in time when these processors are ran.
41
+ * Add a testproject to the repository
42
+ * Add support for layouts
43
+ * Add a `git_branch` finalizer that allows us to release to a branch on a repository (this makes it easy to release github pages)
44
+ * Allow requirejs processor to work wih single files as well
45
+ * Expose server options to mockup so you can configure a https server if you want
46
+ * Minor fixes
47
+
48
+ ## Version 0.7.4
49
+ * Allow for underscores in .scss files when releasing
50
+
51
+ ## Version 0.7.3
52
+ * Set a sensible `load_path` for sass in release mode (defaults to `build_path + "stylesheets"`)
53
+ * Also automatically require the rsync finalizers
54
+
55
+ ## Version 0.7.2
56
+ * Add zip finalizers
57
+ * Instead of complaining about existing build path, just clean it up
58
+ * Instead of complaining about unexisting target path, just create it
59
+ * Automatically require all built-in procssors
60
+
61
+ ## Version 0.7.1
62
+ * Pass target_file to the ERBTemplate to files with erb errors
63
+ * Fix env["MOCKUP_PROJECT"] setting in extractor
64
+
65
+ ## Version 0.7.0
66
+ * Replace --quiet with -s in as it's no longer supported in newer GIT versions
67
+ * Add support for ENV passing to the partials
68
+ * Add support for single file processing and env passing in the extractor (release)
69
+ * Refactor path and url resolving
70
+ * Allow `.html` files to be processed by ERB (both in release and serve)
71
+ * Pass "MOCKUP_PROJECT" variable to env (both in release and serve)
72
+
73
+ ## Version 0.6.5
74
+ * Allow disabling of URL relativizing in the extractor with `release.extract :url_relativize => false`
75
+ * Add missing Hpricot dependency to gem
76
+
77
+ ## Version 0.6.4
78
+ * Add RsyncFinalizer to automatically upload your mockup
79
+
80
+ ## Version 0.6.3
81
+ * Add license to gemspec
82
+ * Fix default_template in gem
83
+ * Add option to allow for resolving urls in custom attributes in the extractor (via `release.extract(options_hash)`)
84
+ * Add more unified interface to finalizers and processors
85
+ * Fix error if node can't be found in Processors::Requirejs
86
+
87
+ ## Version 0.6.2
88
+ * Improved cleaner with more robust tests
89
+
90
+ ## Version 0.6.1
91
+ * Correctly pass file and linenumber to Mockupfile evaluation
92
+ * Add the tilt gem as a requirement (needed for injectors in release)
93
+ * Make the cleaner also remove directories, also make it more safe (it will never delete stuff above the build_path)
94
+
95
+ ## Version 0.6.0
96
+ * Pass command line options to underlying objets
97
+ * Update docs
98
+ * The different Processors, injections and cleanups are run in order as specified. Finalizers will always be run last in their own order.
99
+ * Replace CLI "generate" command with "new" subcommand and add support for remote git skeletons based on Thor templating.
100
+ * Add most simple mockup directory as default_template
101
+ * Requirejs processor updated so it will search for a global r.js command, a local npm r.js command and a vendored r.js command
102
+ * Minor fixes and changes
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec :name => "roger"
4
+
5
+ gem "rake"
data/MIT_LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Flurin Egger, DigitPaint (http://www.digitpaint.nl)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -1,11 +1,11 @@
1
- # HtmlMockup
1
+ # Roger
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/html_mockup.png)](http://badge.fury.io/rb/html_mockup)
4
- [![Build Status](https://travis-ci.org/DigitPaint/html_mockup.png?branch=master)](https://travis-ci.org/DigitPaint/html_mockup)
3
+ [![Gem Version](https://badge.fury.io/rb/roger.png)](http://badge.fury.io/rb/roger)
4
+ [![Build Status](https://travis-ci.org/DigitPaint/roger.png?branch=master)](https://travis-ci.org/DigitPaint/roger)
5
5
 
6
6
  ## What is it?
7
7
 
8
- HtmlMockup is your friendly front-end development toolbox! It helps you with these 4 things:
8
+ Roger is your friendly front-end development toolbox! It helps you with these 4 things:
9
9
 
10
10
  1. **Generate** : Set up your projects
11
11
  1. **Serve** : Development server
@@ -16,10 +16,10 @@ HtmlMockup is your friendly front-end development toolbox! It helps you with the
16
16
 
17
17
  We assume you have a working Ruby 1.9.x or higher running.
18
18
 
19
- 1. Install HtmlMockup
19
+ 1. Install Roger
20
20
 
21
21
  ```shell
22
- gem install html_mockup
22
+ gem install roger
23
23
  ```
24
24
 
25
25
  1. Create a new project
@@ -48,15 +48,15 @@ We assume you have a working Ruby 1.9.x or higher running.
48
48
 
49
49
  Read more documentation:
50
50
 
51
- * [**Templating** Learn the power of HtmlMockup built in templating](doc/templating.md)
51
+ * [**Templating** Learn the power of Roger built in templating](doc/templating.md)
52
52
  * [**CLI** Learn about the different `mockup` commands](doc/cli.md)
53
53
  * [**Mockupfile** Learn how to configure and extend your Project](doc/mockupfile.md)
54
54
 
55
55
  ## Why?
56
56
 
57
- When we started with HtmlMockup there was no Grunt/Gulp/whatever and with us being a Ruby shop we wrote HtmlMockup. Since its beginning it has evolved into quite a powerful tool.
57
+ When we started with Roger there was no Grunt/Gulp/whatever and with us being a Ruby shop we wrote Roger. Since its beginning it has evolved into quite a powerful tool.
58
58
 
59
- Why would HtmlMockup be better than any other?
59
+ Why would Roger be better than any other?
60
60
  It's not it just does some things differently.
61
61
 
62
62
  * Ruby
@@ -67,7 +67,7 @@ It's not it just does some things differently.
67
67
 
68
68
  ## Contributors
69
69
 
70
- [View contributors](https://github.com/digitpaint/html_mockup/graphs/contributors)
70
+ [View contributors](https://github.com/digitpaint/roger/graphs/contributors)
71
71
 
72
72
  ## License
73
73
 
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'rake/testtask'
2
+
3
+ task :default => [:test]
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.libs << "test"
7
+ t.test_files = FileList['test/unit/**/*_test.rb']
8
+ t.verbose = true
9
+ end
data/bin/roger ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + "/../lib/roger/cli"
4
+
5
+ Roger::Cli::Base.start
data/doc/cli.md ADDED
@@ -0,0 +1,46 @@
1
+ # Command Line Interface
2
+
3
+ The easiest way to get help is through the commandline by running
4
+
5
+ ```shell
6
+ mockup help
7
+ ```
8
+
9
+ or to get help on a specific subcommand
10
+
11
+ ```shell
12
+ mockup help [subcommand]
13
+ ```
14
+
15
+ ## Generate
16
+
17
+ ```shell
18
+ mockup generate [generator] [options]
19
+ ```
20
+
21
+ ## Serve
22
+
23
+ ```shell
24
+ mockup serve [options]
25
+ ```
26
+
27
+ Starts a webserver (port 9000 by default)
28
+
29
+
30
+ ## Release
31
+
32
+ ```shell
33
+ mockup release [options]
34
+ ```
35
+
36
+ Releases the project
37
+
38
+ ## Global options
39
+
40
+ All commands accept these options.
41
+
42
+ ```
43
+ Options:
44
+ -v, [--verbose] # Set's verbose output
45
+ -h, [--help] # Help
46
+ ```
data/doc/mockupfile.md ADDED
@@ -0,0 +1,3 @@
1
+ # Mockupfile
2
+
3
+ The mockupfile is where all the project configuration for releasing, serving etc. happens.
data/doc/templating.md ADDED
@@ -0,0 +1,88 @@
1
+ # Templating
2
+
3
+ ## Directories
4
+
5
+ Before we get started, it's good to know that there are a couple of "special" folders within any Roger project. Don't worry, you can configure these; they're not hard-coded. The folders are:
6
+
7
+ * **project-path** this is the main directory containing the Mockupfile and all other directories.
8
+ * **html-path** this is the directory where all your HTML/CSS/Javascript will go (in subdirectories of course).
9
+ * **partials-path** this is the directory where all partials reside.
10
+ * **layouts-path** this is the directory where the layouts hang out.
11
+
12
+ The default project tree looks like this:
13
+
14
+ ```
15
+ project-path
16
+ |
17
+ |- html (html-path)
18
+ |
19
+ |- partials (partials-path)
20
+ |
21
+ \- layouts (layouts-path)
22
+ ```
23
+
24
+ Only the html-path has to exist. The others are not required.
25
+
26
+ ## HTML
27
+
28
+ The html-path is actually the root for all you front-end code. This is what will be served as the document-root with `mockup serve` and will be the base for a release when using `mockup release`.
29
+
30
+ In the html-path you can put static files (images, documents, etc.) but also templates. Anything that the [Tilt Engine](https://github.com/rtomayko/tilt) can handle is ok. The only thing Mockup adds is handling for front-matter, layouts and partials.
31
+
32
+ ## Front-matter
33
+
34
+ Every template can optionally start with a bit of front-matter. Front-matter is defined as follows:
35
+
36
+ ```yaml
37
+ ---
38
+ key: value
39
+ ---
40
+ ```
41
+
42
+ Front-matter is parsed as YAML and can contain data to be used in the template, layout or partial. You can access
43
+ these values in the templates (layouts and partials included) by using `document.KEY`.
44
+
45
+ ## Layouts
46
+
47
+ Layouts are basically "wrap" templates. The layout will wrap around the rendered template. In the template front-matter you define what layout it should use by setting the `layout` key.
48
+
49
+ ### An example
50
+
51
+
52
+ #### html/template.html.erb
53
+ ```erb
54
+ ---
55
+ layout: default
56
+ ---
57
+ Template
58
+ ```
59
+
60
+ #### layouts/default.html.erb
61
+ ```erb
62
+ Layout (before)
63
+ <% yield %>
64
+ Layout (after)
65
+ ```
66
+
67
+ #### Results
68
+ This would result in:
69
+
70
+ ```
71
+ Layout (before)
72
+ Template
73
+ Layout (after)
74
+ ```
75
+
76
+ ## Partials
77
+
78
+ Partials are little pieces of template that can be easily reused. You can access the partials throught the `partial("partialpath")` method. You can optionall pass variables to the partial by passing a ruby hash of options as a second parameter. This works like this:
79
+
80
+ ```ruby
81
+ partial("path/to/partial/relative/to/partials-path", {:key => "value"})
82
+ ```
83
+
84
+ In the partial these can be accessed as local variables. So for instance in you `test.html.erb` partial that would look like this:
85
+
86
+ ```erb
87
+ <%= key %>
88
+ ```
@@ -0,0 +1,2 @@
1
+ # Ignore apple specific files
2
+ .DS_Store
File without changes
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gem "roger"
@@ -0,0 +1 @@
1
+ # Configure your mockup here
File without changes
@@ -0,0 +1,23 @@
1
+ module Roger
2
+
3
+ class Cli::Command < Thor::Group
4
+
5
+ class_option :verbose,
6
+ :desc => "Set's verbose output",
7
+ :aliases => ["-v"],
8
+ :default => false,
9
+ :type => :boolean
10
+
11
+ def initialize_project
12
+ @project = Cli::Base.project
13
+ end
14
+
15
+ protected
16
+
17
+ def project_banner(project)
18
+ puts " Html: \"#{project.html_path}\""
19
+ puts " Partials: \"#{project.partial_path}\""
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,5 @@
1
+ module Roger
2
+ class Cli::Generate < Thor
3
+
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ module Roger
2
+ class Cli::Release < Cli::Command
3
+
4
+ desc "Release the current project"
5
+
6
+ def release
7
+ @project.release.run!
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,29 @@
1
+ module Roger
2
+ class Cli::Serve < Cli::Command
3
+
4
+
5
+ desc "Serve the current project"
6
+
7
+ class_options :port => :string, # Defaults to 9000
8
+ :handler => :string, # The handler to use (defaults to mongrel)
9
+ :validate => :boolean # Run validation?
10
+
11
+ def serve
12
+
13
+ server_options = {}
14
+ options.each{|k,v| server_options[k.to_sym] = v }
15
+ server_options[:server] = {}
16
+ [:port, :handler, :validate].each do |k|
17
+ server_options[:server][k] = server_options.delete(k) if server_options.has_key?(k)
18
+ end
19
+
20
+ server = @project.server
21
+ server.set_options(server_options[:server])
22
+
23
+ puts "Running Roger with #{server.handler.inspect} on port #{server.port}"
24
+ puts project_banner(@project)
25
+
26
+ server.run!
27
+ end
28
+ end
29
+ end
data/lib/roger/cli.rb ADDED
@@ -0,0 +1,123 @@
1
+ require 'rubygems'
2
+
3
+ # Require bundler gems if available
4
+ if Object.const_defined?(:Bundler)
5
+ Bundler.require(:default)
6
+ end
7
+
8
+
9
+ require 'thor'
10
+ require 'thor/group'
11
+
12
+ require 'pathname'
13
+ require 'fileutils'
14
+ include FileUtils
15
+
16
+ require File.dirname(__FILE__) + "/template"
17
+ require File.dirname(__FILE__) + "/project"
18
+ require File.dirname(__FILE__) + "/w3c_validator"
19
+
20
+
21
+ module Roger
22
+ module Cli; end
23
+ end
24
+
25
+ require File.dirname(__FILE__) + "/cli/command"
26
+ require File.dirname(__FILE__) + "/cli/serve"
27
+ require File.dirname(__FILE__) + "/cli/release"
28
+ require File.dirname(__FILE__) + "/cli/generate"
29
+
30
+ require File.dirname(__FILE__) + "/generators"
31
+
32
+
33
+ module Roger
34
+ class Cli::Base < Thor
35
+
36
+ def initialize(*args)
37
+ super
38
+ self.class.project = initialize_project
39
+ end
40
+
41
+ class << self
42
+ attr_accessor :project
43
+ end
44
+
45
+ class_option :path,
46
+ :desc => "Project root path",
47
+ :type => :string,
48
+ :required => false,
49
+ :default => "."
50
+
51
+ class_option :html_path,
52
+ :desc => 'The document root, defaults to "[directory]/html"',
53
+ :type => :string
54
+
55
+
56
+ class_option :partial_path,
57
+ :desc => 'Defaults to [directory]/partials',
58
+ :type => :string
59
+
60
+ register Cli::Generate, "generate", "generate [COMMAND]", "Run a generator"
61
+
62
+ register Cli::Serve, "serve", "serve #{Cli::Serve.arguments.map{ |arg| arg.banner }.join(" ")}", Cli::Serve.desc
63
+ self.tasks["serve"].options = Cli::Serve.class_options
64
+
65
+ register Cli::Release, "release", "release #{Cli::Release.arguments.map{ |arg| arg.banner }.join(" ")}", Cli::Release.desc
66
+ self.tasks["release"].options = Cli::Release.class_options
67
+
68
+ desc "validate [directory/file]", "Validates the file or all HTML in directory"
69
+ method_options :show_valid => :boolean, # Also print a line for each valid file
70
+ :filter => :string # What files should be found, defaults to [^_]*.html
71
+ def validate(path=".")
72
+ filter = options["filter"] || "[^_]*.html"
73
+
74
+ puts "Filtering on #{options["filter"]}" if options["filter"]
75
+
76
+ if File.directory?(path)
77
+ any_invalid = false
78
+
79
+ if (files = Dir.glob("#{path}/**/#{filter}")).any?
80
+ files.each do |file|
81
+ if !self.w3cvalidate(file)
82
+ any_invalid = true
83
+ end
84
+ end
85
+ if !any_invalid
86
+ puts "All files were considered valid"
87
+ end
88
+ else
89
+ puts "No files matched \"#{filter}\""
90
+ end
91
+ elsif File.readable?(path)
92
+ self.w3cvalidate(path)
93
+ else
94
+ puts "No such file/directory #{path}"
95
+ end
96
+ end
97
+
98
+ protected
99
+
100
+ # TODO: handle options
101
+ def initialize_project
102
+ if((Pathname.new(options[:path]) + "../partials").exist?)
103
+ puts "[ERROR]: Don't use the \"html\" path, use the project base path instead"
104
+ exit(1)
105
+ end
106
+
107
+ Project.new(options[:path], {:shell => self.shell}.update(options))
108
+ end
109
+
110
+
111
+ def w3cvalidate(file)
112
+ validator = W3CValidator.new(File.read(file))
113
+ validator.validate!
114
+ if !options["show_valid"] && !validator.valid || options["show_valid"]
115
+ print "- #{file} "
116
+ print "(errors: #{validator.errors}, warnings: #{validator.warnings})\n"
117
+ end
118
+ validator.valid
119
+ end
120
+
121
+ end
122
+
123
+ end