hisyo 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. data/Changes +15 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +9 -0
  4. data/README.mkd +5 -1
  5. data/Rakefile +1 -0
  6. data/data/generators/assistance/sprockets/Gemfile.erubis +4 -0
  7. data/data/generators/assistance/sprockets/Rakefile.erubis +8 -0
  8. data/data/generators/assistance/sprockets/app/assets/javascripts/app.js +2 -0
  9. data/data/generators/assistance/sprockets/app/assets/javascripts/foo.js +1 -0
  10. data/data/generators/assistance/sprockets/app/sprockets.rb +47 -0
  11. data/data/generators/assistance/test/foo.txt +2 -0
  12. data/data/generators/assistance/test/test.txt.erubis +2 -0
  13. data/data/generators/assistance/travis/.travis.yml.erubis +10 -0
  14. data/data/generators/assistance/travis/Rakefile.erubis +7 -0
  15. data/data/generators/project/Gemfile +1 -0
  16. data/data/generators/project/Rakefile +5 -0
  17. data/data/generators/project/app/app.rb +13 -3
  18. data/data/generators/project/app/controllers.rb +11 -3
  19. data/lib/hisyo.rb +17 -3
  20. data/lib/hisyo/cli.rb +2 -14
  21. data/lib/hisyo/generator.rb +77 -22
  22. data/lib/hisyo/generator/sprockets.rb +13 -0
  23. data/lib/hisyo/generator/test.rb +10 -0
  24. data/lib/hisyo/generator/travis.rb +18 -0
  25. data/lib/hisyo/util.rb +84 -0
  26. data/lib/hisyo/version.rb +1 -1
  27. data/spec/cli_spec.rb +5 -6
  28. data/spec/generate_app_spec.rb +15 -0
  29. data/spec/generate_assistance_spec.rb +36 -0
  30. data/spec/generator_spec.rb +62 -15
  31. data/spec/spec_helper.rb +53 -4
  32. data/spec/support/assistance_context.rb +17 -0
  33. data/spec/support/rackup.rb +26 -0
  34. metadata +24 -4
  35. data/spec/generated_app_spec.rb +0 -49
data/Changes CHANGED
@@ -1,3 +1,18 @@
1
+ = 0.2.0 / 2012-06-09
2
+
3
+ * Added: `-k sprockets` generator
4
+
5
+ * Changed: Rakefile will be generated by default
6
+
7
+ * Changed: Generated app is extend Sinatra::Base instead Sinatra::Application
8
+
9
+ * Changed: MyApp.controllers is deprecated,
10
+ use MyApp.namespace (Sinatra::Namespace at sinatra-contrib)
11
+
12
+ * Added: `-h` or `--help` will be display about assistance(e.g. travis, sprockets)
13
+
14
+ * Changed: if generated file path is exist, Hisyo try merging it
15
+
1
16
  = 0.1.0 / 2012-05-30
2
17
 
3
18
  * Generated app has no dependency on `hisyo`
data/Gemfile CHANGED
@@ -1,6 +1,7 @@
1
1
  source :rubygems
2
2
 
3
3
  gem "sinatra", :require => "sinatra/base"
4
+ gem "erubis"
4
5
  gem "tilt"
5
6
  gem "sinatra-contrib", :require => "sinatra/contrib"
6
7
 
@@ -9,4 +10,7 @@ group :test do
9
10
  gem "rack-test", :require => "rack/test"
10
11
  gem "simplecov", :require => false
11
12
  gem "rake" # for Travis CI
13
+
14
+ # for sprockets generator
15
+ gem "sprockets"
12
16
  end
@@ -3,7 +3,9 @@ GEM
3
3
  specs:
4
4
  backports (2.5.3)
5
5
  diff-lcs (1.1.3)
6
+ erubis (2.7.0)
6
7
  eventmachine (0.12.10)
8
+ hike (1.2.1)
7
9
  multi_json (1.3.5)
8
10
  rack (1.4.1)
9
11
  rack-protection (1.2.0)
@@ -34,16 +36,23 @@ GEM
34
36
  rack-test
35
37
  sinatra (~> 1.3.0)
36
38
  tilt (~> 1.3)
39
+ sprockets (2.4.3)
40
+ hike (~> 1.2)
41
+ multi_json (~> 1.0)
42
+ rack (~> 1.0)
43
+ tilt (~> 1.1, != 1.3.0)
37
44
  tilt (1.3.3)
38
45
 
39
46
  PLATFORMS
40
47
  ruby
41
48
 
42
49
  DEPENDENCIES
50
+ erubis
43
51
  rack-test
44
52
  rake
45
53
  rspec
46
54
  simplecov
47
55
  sinatra
48
56
  sinatra-contrib
57
+ sprockets
49
58
  tilt
data/README.mkd CHANGED
@@ -1,6 +1,6 @@
1
1
  [![Travis CI Build Status](https://secure.travis-ci.org/uu59/hisyo.png?branch=master)](http://travis-ci.org/uu59/hisyo)
2
2
 
3
- Hisyo is a generator that for your Sinatra project to play.
3
+ Hisyo is a generator that for your pure Sinatra project to play.
4
4
 
5
5
  $ gem install hisyo
6
6
  $ rbenv rehash; rehash; # if necessary
@@ -39,6 +39,10 @@ Hisyo is a generator that for your Sinatra project to play.
39
39
  [2012-05-28 02:24:32] INFO WEBrick 1.3.1
40
40
  [2012-05-28 02:24:32] INFO ruby 1.9.3 (2012-02-16) [x86_64-linux]
41
41
  [2012-05-28 02:24:32] INFO WEBrick::HTTPServer#start: pid=11232 port=9292
42
+ ^C
43
+ $ hisyo -r . -k travis
44
+ create: ./.travis.yml
45
+ create: ./Rakefile
42
46
 
43
47
  Generated project(as below) is a purely Sinatra application.
44
48
  That means you can `gem uninstall hisyo` after generation.
data/Rakefile CHANGED
@@ -7,5 +7,6 @@ task :default => :spec
7
7
 
8
8
  desc "Run all examples"
9
9
  RSpec::Core::RakeTask.new(:spec) do |t|
10
+ ENV["SPEC_OPTS"] = "-c -f d"
10
11
  #t.ruby_opts = %w[-w]
11
12
  end
@@ -0,0 +1,4 @@
1
+ <%= yield %>
2
+
3
+ # sprockets
4
+ gem 'sprockets', '~> 2.0'
@@ -0,0 +1,8 @@
1
+ <%= yield %>
2
+
3
+ require "rake/sprocketstask"
4
+ Rake::SprocketsTask.new do |t|
5
+ t.environment = MyApp.sprockets
6
+ t.output = "./public/assets"
7
+ t.assets = %w( * ) # or you want such as %w(application.js style.css)
8
+ end
@@ -0,0 +1,2 @@
1
+ // https://github.com/sstephenson/sprockets
2
+ //= require foo.js
@@ -0,0 +1,47 @@
1
+ MyApp.class_eval do
2
+ set :sprockets, Sprockets::Environment.new(root)
3
+ set :assets_prefix, '/assets'
4
+ set :assets_digest, true
5
+
6
+ configure do
7
+ sprockets.append_path File.join(root, 'app', 'assets', 'stylesheets')
8
+ sprockets.append_path File.join(root, 'app', 'assets', 'javascripts')
9
+
10
+ #sample config for compression
11
+ #sprockets.js_compressor = Uglifier.new
12
+ #sprockets.css_compressor = YUI::CssCompressor.new
13
+ end
14
+
15
+ helpers do
16
+ def javascript_path(path)
17
+ path << ".js" if File.extname(path).empty?
18
+ asset_path(path)
19
+ end
20
+
21
+ def stylesheet_path(path)
22
+ path << ".css" if File.extname(path).empty?
23
+ asset_path(path)
24
+ end
25
+
26
+ def asset_path(path)
27
+ return path if path.match %r!^(?:https?:)//!
28
+
29
+ asset = settings.sprockets.find_asset(path)
30
+ raise "asset not found for '#{path}'" unless asset
31
+ basename = settings.assets_digest ? asset.digest_path : asset.logical_path
32
+ File.join(settings.assets_prefix, basename)
33
+ end
34
+ end
35
+
36
+ get "#{settings.assets_prefix}/*" do
37
+ path = params[:splat].last.sub(%r!^/!, "")
38
+ if digest = path[/-[0-9a-f]+\./]
39
+ path.sub!(digest, ".")
40
+ expires 8640000, :public
41
+ end
42
+ asset = settings.sprockets.index.find_asset path
43
+ halt 404, "asset not found '#{path}'" unless asset
44
+ content_type File.extname(path)
45
+ asset
46
+ end
47
+ end
@@ -0,0 +1,2 @@
1
+ <%= yield %>
2
+ template
@@ -0,0 +1,10 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - rbx-19mode
6
+ - jruby-19mode
7
+ - ruby-head
8
+ notifications:
9
+ email:
10
+ - <%= email %>
@@ -0,0 +1,7 @@
1
+ <%= yield %>
2
+ task :default => :spec
3
+
4
+ desc "Run all examples"
5
+ RSpec::Core::RakeTask.new(:spec) do |t|
6
+ #t.ruby_opts = %w[-w]
7
+ end
@@ -3,6 +3,7 @@ source :rubygems
3
3
  gem "sinatra"
4
4
  gem "sinatra-contrib", :require => "sinatra/contrib"
5
5
  gem "tilt"
6
+ gem "rake"
6
7
 
7
8
  group :test do
8
9
  gem "rspec"
@@ -0,0 +1,5 @@
1
+ require File.expand_path("../spec/spec_helper.rb", __FILE__)
2
+
3
+ require "rspec/core/rake_task"
4
+ require "rspec/core/version"
5
+
@@ -1,12 +1,22 @@
1
1
  # Feel free to rename from "MyApp" to anything
2
2
  # if so, remember changing config.ru, config/boot.rb
3
- class MyApp < Sinatra::Application
3
+ class MyApp < Sinatra::Base
4
4
  set :root, File.expand_path("../../", __FILE__)
5
5
  set :views, File.join(root, "app/views")
6
6
  set :public_folder, File.join(root, "public")
7
7
 
8
- def self.controllers(&block)
9
- instance_eval &block
8
+ register Sinatra::RespondWith
9
+ register Sinatra::Namespace
10
+
11
+ helpers do
12
+ include Sinatra::Streaming
13
+ include Sinatra::ContentFor
14
+ include Sinatra::JSON
15
+ end
16
+
17
+ configure :development do
18
+ MyApp.reset!
19
+ use Rack::Reloader
10
20
  end
11
21
 
12
22
  def self.setup
@@ -1,11 +1,19 @@
1
- MyApp.controllers do
2
- get "/" do
1
+ MyApp.namespace "/" do
2
+ get do
3
3
  # render "index.str" at app/views/index.str
4
4
  render :str, :index
5
5
  end
6
6
 
7
- get "/hi/:name" do
7
+ get "hi/:name" do
8
8
  # `hi` is helper at app/helpers.rb
9
9
  hi(params[:name] || "joe")
10
10
  end
11
+
12
+ # /admin/*
13
+ namespace "admin" do
14
+ before { halt 403, "Secret zone" }
15
+ get "/secret" do
16
+ "foobar"
17
+ end
18
+ end
11
19
  end
@@ -1,6 +1,20 @@
1
- Dir.glob("#{File.dirname(__FILE__)}/hisyo/**/*.rb") do |file|
2
- require file
3
- end
1
+ require "fileutils"
2
+ require "optparse"
3
+ require "find"
4
4
 
5
5
  module Hisyo
6
+ DIR = File.expand_path("../../data/generators", __FILE__)
7
+ HELP = []
8
+
9
+ def self.help(str)
10
+ HELP << str
11
+ end
12
+
13
+ dir = File.dirname(__FILE__)
14
+ $LOAD_PATH.unshift(dir) if $LOAD_PATH.grep(dir).empty?
6
15
  end
16
+
17
+ require "hisyo/util"
18
+ require "hisyo/generator"
19
+ require "hisyo/cli"
20
+ require "hisyo/version"
@@ -1,20 +1,8 @@
1
- require "optparse"
2
-
3
1
  module Hisyo
4
2
  module CLI
5
3
  def self.run(argv)
6
- Hisyo.generate_project parse_options(argv)
7
- end
8
-
9
- def self.parse_options(argv)
10
- options = {}
11
- OptionParser.new do |opts|
12
- opts.on('-n', '--dry-run', 'Do not actually run'){|v| options[:dryrun] = true}
13
- opts.on('-v', '--verbose', 'Verbose mode'){|v| options[:verbose] = true}
14
- opts.on('-r VAL', '--root=VAL', 'Application root directory'){|v| options[:root] = v}
15
- opts.parse!(argv)
16
- end
17
- options
4
+ gen = Generator.new(argv)
5
+ gen.run
18
6
  end
19
7
  end
20
8
  end
@@ -1,34 +1,89 @@
1
- require "fileutils"
1
+ Dir.glob("#{File.dirname(__FILE__)}/generator/*.rb") do |file|
2
+ require file
3
+ end
2
4
 
3
5
  module Hisyo
4
- def self.generate_project(options = {})
5
- root = options[:root] || Dir.pwd
6
- klass = options[:dryrun] ? FileUtils::NoWrite : FileUtils
7
- %w!lib config views public spec app/views app/assets db tmp log!.each do |dir|
8
- dir = File.join(root, dir)
9
- if File.directory?(dir)
10
- puts "\e[31mskip: \e[0m#{dir.gsub(root + "/", "")}/" if options[:verbose]
11
- else
12
- puts "\e[1m\e[32mcreate: \e[0m#{dir.gsub(root + "/", "")}/" if options[:verbose]
13
- klass.mkdir_p dir
6
+ class Generator
7
+ include Hisyo::Util
8
+
9
+ attr_reader :params, :options
10
+
11
+ def initialize(argv = [])
12
+ @params = {}
13
+ @argv = argv
14
+ parse
15
+ end
16
+
17
+ def parse
18
+ @options = begin
19
+ options = {
20
+ :dryrun => false,
21
+ :color => false,
22
+ :verbose => true,
23
+ :root => Dir.pwd,
24
+ }
25
+ OptionParser.new do |opts|
26
+ opts.on('-n', '--dryrun', 'Do not actually run'){|v| options[:dryrun] = true}
27
+ opts.on('-v', '--verbose', 'Verbose mode'){|v| options[:verbose] = true}
28
+ opts.on('-q', '--quite', 'Non-verbose mode'){|v| options[:verbose] = false}
29
+ opts.on('-c', '--color', 'Colorise'){|v| options[:color] = true}
30
+ opts.on('-r VAL', '--root=VAL', 'Application root directory'){|v| options[:root] = v}
31
+
32
+ opts.on('-k VAL', '--kind=VAL', 'What to generate'){|v| options[:kind] = v}
33
+
34
+ opts.on_tail("-h", "--help", "Show this message") do
35
+ puts opts
36
+ puts
37
+ puts "Hisyo assistance help e.g. `hisyo -k foo bar=baz`"
38
+ puts HELP.join("\n")
39
+ exit
40
+ end
41
+
42
+ begin
43
+ opts.parse!(@argv)
44
+ rescue OptionParser::InvalidOption => e
45
+ $stderr.puts e
46
+ $stderr.puts opts.help
47
+ exit 1
48
+ end
49
+ end
50
+ options
51
+ end
52
+
53
+ @argv.each do |kv|
54
+ k,v = kv.split("=")
55
+ @params[k] = v
14
56
  end
15
57
  end
16
58
 
17
- skelton = File.expand_path("../../../data/generators/project", __FILE__)
18
- Dir.glob("#{skelton}/**/*", File::FNM_DOTMATCH) do |file|
19
- next if File.directory?(file)
20
- path = File.join(root, file.gsub(skelton, ""))
21
- if File.file?(path)
22
- puts "\e[31mskip: \e[0m#{path.gsub(root + "/", "")}/" if options[:verbose]
59
+ def run
60
+ if options[:kind]
61
+ gen_assistance
23
62
  else
24
- puts "\e[1m\e[32mcopy to: \e[0m#{path.gsub(root + "/", "")}" if options[:verbose]
25
- klass.cp(file, path)
63
+ gen_project
26
64
  end
27
65
  end
28
66
 
29
- puts "Complete."
30
- puts " $ cd #{root}/"
31
- puts ' $ rackup (or `rspec spec/`, `vim app/helpers.rb`, etc)'
67
+ def gen_project
68
+ root = options[:root]
69
+ src_dir = File.expand_path("project", DIR)
70
+ copy(src_dir)
71
+
72
+ puts "Complete."
73
+ puts " $ cd #{root}/"
74
+ puts ' $ rackup (or `rspec spec/`, `vim app/helpers.rb`, etc)'
75
+ end
76
+
77
+ def generators
78
+ methods.grep(/^generate_/)
79
+ end
80
+
81
+ def gen_assistance
82
+ unless method = generators.find{|g| g.to_s == "generate_#{options[:kind]}"}
83
+ raise "unknown"
84
+ end
85
+ __send__(method)
86
+ end
32
87
  end
33
88
  end
34
89
 
@@ -0,0 +1,13 @@
1
+ module Hisyo
2
+ class Generator
3
+ def generate_sprockets
4
+ src = File.expand_path("assistance/sprockets", DIR)
5
+ root = options[:root]
6
+ copy(src)
7
+ end
8
+ end
9
+
10
+ help <<-TEXT
11
+ -k sprockets: for Sprockets and helpers generation
12
+ TEXT
13
+ end
@@ -0,0 +1,10 @@
1
+ # This is test generator for test
2
+ module Hisyo
3
+ class Generator
4
+ def generate_test
5
+ src = File.expand_path("assistance/test", DIR)
6
+ root = options[:root]
7
+ copy(src)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,18 @@
1
+ module Hisyo
2
+ class Generator
3
+ def generate_travis
4
+ src = File.expand_path("assistance/travis", DIR)
5
+ root = options[:root]
6
+ @params = {
7
+ "email" => command("git config user.email") || "foo@example.com"
8
+ }.merge(@params)
9
+ copy(src)
10
+ end
11
+ end
12
+
13
+ help <<-TEXT
14
+ -k travis: for Travis CI files
15
+ * email=foo@example.com
16
+ Notification email address (default is `git config user.email`)
17
+ TEXT
18
+ end
@@ -0,0 +1,84 @@
1
+ module Hisyo
2
+ module Util
3
+ COLORS = {
4
+ :black => 30,
5
+ :red => 31,
6
+ :green => 32,
7
+ :yellow => 33,
8
+ :blue => 34,
9
+ :magenta => 35,
10
+ :cyan => 36,
11
+ :while => 37,
12
+ }
13
+
14
+ def copy(src)
15
+ Find.find(src) do |file|
16
+ next if file == src
17
+ is_dir = File.directory?(file)
18
+ dest = File.join(options[:root], file.gsub(src, ""))
19
+ dir = is_dir ? dest : File.dirname(dest)
20
+ if File.exists?(dest)
21
+ skip(dest)
22
+ next
23
+ end
24
+ FileUtils.mkdir_p(dir) unless options[:dryrun]
25
+ next if is_dir
26
+
27
+ if file.match(/\.erubis$/)
28
+ dest.gsub!(/\.erubis$/, "")
29
+ template = Tilt.new(file)
30
+ content = template.render(Object.new, @params) do
31
+ File.exist?(dest) ? File.read(dest) : ""
32
+ end
33
+ if File.exist?(dest) && File.file?(dest)
34
+ tmp = template.render(Object.new, @params) { "" }.strip
35
+ if File.read(dest)[tmp]
36
+ skip(dest)
37
+ next
38
+ end
39
+ end
40
+ else
41
+ content = File.read(file)
42
+ if File.exist?(dest) && File.read(dest)[content]
43
+ skip(dest)
44
+ end
45
+ end
46
+
47
+ if File.exist?(dest)
48
+ merge(dest)
49
+ else
50
+ create(dest)
51
+ end
52
+
53
+ unless options[:dryrun]
54
+ File.open(dest, "w"){|f| f.write content}
55
+ end
56
+ end
57
+ end
58
+
59
+ def command(cmd)
60
+ begin
61
+ ret = %x!#{cmd}!
62
+ return ret if $?.exitstatus == 0
63
+ rescue Errno::ENOENT
64
+ nil
65
+ end
66
+ end
67
+
68
+ def color(text, color = :green)
69
+ options[:color] ? "\e[1m\e[#{COLORS[color] || "33"}m#{text}\e[0m" : text
70
+ end
71
+
72
+ def create(dest)
73
+ puts color("create: ", :green) + dest if @options[:verbose]
74
+ end
75
+
76
+ def skip(dest)
77
+ puts color("skip: ", :yellow) + dest if @options[:verbose]
78
+ end
79
+
80
+ def merge(dest)
81
+ puts color("merge: ", :magenta) + dest if @options[:verbose]
82
+ end
83
+ end
84
+ end
@@ -1,3 +1,3 @@
1
1
  module Hisyo
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,10 +1,9 @@
1
1
  require "spec_helper"
2
2
 
3
- describe "Hisyo.parse_options" do
4
- it "should parse options" do
5
- options = Hisyo::CLI.parse_options(%w!-n -v --root=/tmp!)
6
- options[:dryrun].should be_true
7
- options[:verbose].should be_true
8
- options[:root].should == "/tmp"
3
+ describe "Hisyo::CLI options" do
4
+ it "should run Generator.new.run" do
5
+ capture_io do
6
+ lambda { Hisyo::CLI.run(%w!--help!) }.should raise_error(SystemExit)
7
+ end
9
8
  end
10
9
  end
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ describe "Hisyo::Generator app" do
4
+ before(:each) do
5
+ generate(
6
+ :root => @approot,
7
+ )
8
+ end
9
+
10
+ after(:each) do
11
+ FileUtils.rm_rf @approot
12
+ end
13
+
14
+ it_should_behave_like "rackapp"
15
+ end
@@ -0,0 +1,36 @@
1
+ require "spec_helper"
2
+
3
+ describe "Hisyo::Generator assistance" do
4
+ context "travis" do
5
+ let(:kind) { "travis" }
6
+ include_context "assistance"
7
+
8
+ it "should create .travis.yml " do
9
+ File.exists?("#{@approot}/.travis.yml").should be_true
10
+ yml = YAML.load File.read("#{@approot}/.travis.yml")
11
+ yml["notifications"]["email"].should_not be_empty
12
+ end
13
+ end
14
+
15
+ context "sprockets" do
16
+ let(:kind) { "sprockets" }
17
+ include_context "assistance"
18
+
19
+ it "should get under the /assets" do
20
+ genapp do
21
+ get "/assets/app.js"
22
+ last_response.body.should =~ /sprockets/
23
+ end
24
+ end
25
+
26
+ it "should compile by Rake" do
27
+ approot = @approot
28
+ capture_io do
29
+ rake do
30
+ tasks.find{|t| t.name == "assets"}.execute
31
+ end
32
+ end
33
+ Dir.entries("#{approot}/public/assets").should_not be_empty
34
+ end
35
+ end
36
+ end
@@ -1,41 +1,88 @@
1
1
  require "spec_helper"
2
2
 
3
- describe "Hisyo.generate_project" do
3
+ describe "Hisyo::Generator basic" do
4
4
  after(:each) do
5
5
  FileUtils.rm_rf @approot
6
6
  end
7
7
 
8
- it "should same data/ and approot/" do
9
- generate_app(
8
+ it "should parse options" do
9
+ gen = Hisyo::Generator.new(%w!-k travis -n -v --root=/tmp!)
10
+ options = gen.options
11
+ options[:dryrun].should be_true
12
+ options[:verbose].should be_true
13
+ options[:color].should be_false
14
+ options[:root].should == "/tmp"
15
+ options[:kind].should == "travis"
16
+ end
17
+
18
+ it "should parse params" do
19
+ gen = Hisyo::Generator.new(%w!-k travis -n -v --root=/tmp foo=bar!)
20
+ gen.params["foo"].should == "bar"
21
+ end
22
+
23
+ it "should exit invalid option given" do
24
+ out, err = capture_io do
25
+ lambda { Hisyo::Generator.new(%w!--invalid-option!) }.should raise_error(SystemExit)
26
+ end
27
+ err["Usage"].should_not be_nil
28
+ end
29
+
30
+ it "should run command" do
31
+ gen = Hisyo::Generator.new
32
+ gen.command("/bin/true").should == ""
33
+ gen.command("does_not_exists_command").should be_nil
34
+ end
35
+
36
+ it "should same data/project/ and approot/" do
37
+ # https://github.com/rubinius/rubinius/blob/17aa445116/lib/find.rb#L39
38
+ pending "Rubinius's Find.find raise LocalJumpError if no block given" if defined?(Rubinius)
39
+ generate(
10
40
  :root => @approot,
11
41
  )
12
- dest= Dir.glob("#{@approot}/**/*", File::FNM_DOTMATCH).find_all{|f| File.file?(f)}.map{|f| f.gsub(@approot, "")}
42
+ dest = Find.find(@approot).map{|f| f.gsub(@approot, "")}.sort
13
43
  src_dir = "#{@root}/data/generators/project"
14
- src = Dir.glob("#{src_dir}/**/*", File::FNM_DOTMATCH).find_all{|f| File.file?(f)}.map{|f| f.gsub(src_dir, "")}
44
+ src = Find.find(src_dir).map{|f| f.gsub(src_dir, "")}.sort
15
45
  dest.should == src
16
46
  end
17
47
 
18
48
  it "should not create files when :dryrun option given" do
19
- generate_app(
49
+ # https://github.com/rubinius/rubinius/blob/17aa445116/lib/find.rb#L39
50
+ pending "Rubinius's Find.find raise LocalJumpError if no block given" if defined?(Rubinius)
51
+ generate(
20
52
  :root => @approot,
21
53
  :dryrun => true,
22
54
  )
23
- Dir.glob("#{@approot}/**/*", File::FNM_DOTMATCH).to_a.should == []
55
+ lambda { Find.find(@approot).to_a }.should raise_error(Errno::ENOENT)
24
56
  end
25
57
 
26
58
  it "should skip if file exists" do
27
- generate_app(
59
+ generate(
28
60
  :root => @approot,
29
- :verbose => true,
30
61
  )
31
62
 
32
- out, err = generate_app(
63
+ out, err = generate(
33
64
  :root => @approot,
34
- :verbose => true,
65
+ :color => false,
35
66
  )
36
- messages = out.split("\n").map{|line| line.gsub(/\e\[\d+m/, "")}.map{|line| line.split(": ").first}.uniq
37
- messages.include?("copy to").should be_false
38
- messages.include?("create").should be_false
39
- messages.include?("skip").should be_true
67
+ messages = out.split("\n").grep(/^[a-z]+:/i)
68
+ messages.grep(/^create/).should be_empty
69
+ messages.grep(/^skip/).length.should == messages.length
70
+ end
71
+
72
+ it "should merge exists content" do
73
+ generate(:root => @approot)
74
+ File.open("#{@approot}/test.txt", "w"){|f| f.write "original"}
75
+ generate(:root => @approot, :kind => "test")
76
+ File.read("#{@approot}/test.txt").rstrip.should == "original\ntemplate"
77
+ File.read("#{@approot}/foo.txt").rstrip.should == "foo"
78
+ end
79
+
80
+ it "should dedup merge" do
81
+ generate(:root => @approot)
82
+ generate(:root => @approot, :kind => "test")
83
+ File.read("#{@approot}/foo.txt").rstrip.should == "foo"
84
+
85
+ generate(:root => @approot, :kind => "test")
86
+ File.read("#{@approot}/foo.txt").rstrip.should == "foo"
40
87
  end
41
88
  end
@@ -3,10 +3,10 @@ require "bundler/setup"
3
3
  Bundler.require(:default, :test)
4
4
  if ENV["COVERAGE"]
5
5
  require "simplecov"
6
- SimpleCov.start
6
+ SimpleCov.start "test_frameworks"
7
7
  end
8
8
  require File.expand_path("../../lib/hisyo.rb", __FILE__)
9
-
9
+ Dir["./spec/support/**/*.rb"].each{|f| require f}
10
10
 
11
11
  RSpec.configure do |conf|
12
12
  conf.before(:all) do
@@ -38,10 +38,59 @@ RSpec.configure do |conf|
38
38
  $stderr = orig_stderr
39
39
  end
40
40
 
41
- def generate_app(options = {})
41
+ def generate(options = {}, params = {})
42
42
  capture_io do
43
- Hisyo.generate_project(options)
43
+ gen = Hisyo::Generator.new
44
+ gen.instance_variable_set(:@options, options)
45
+ gen.instance_variable_set(:@params, params)
46
+ gen.run
47
+ end
48
+ end
49
+
50
+ def genapp(&block)
51
+ pending "jruby does not support fork" if defined? JRUBY_VERSION
52
+ generate(
53
+ :root => @approot,
54
+ )
55
+ pid = fork do
56
+ @mock = Class.new
57
+ configru = "#{@approot}/config.ru"
58
+ bootrb = "#{@approot}/config/boot.rb"
59
+ @mock.class_eval do
60
+ require bootrb
61
+
62
+ include Rack::Test::Methods
63
+ @configru = configru
64
+
65
+ def self.configru
66
+ @configru
67
+ end
68
+
69
+ def app
70
+ Rack::Builder.parse_file(self.class.configru).first
71
+ end
72
+ end
73
+ @mock.new.instance_eval &block
74
+ end
75
+ Process.wait pid
76
+ end
77
+
78
+ def rake(rakefile = nil, &block)
79
+ pending "jruby does not support fork" if defined? JRUBY_VERSION
80
+ rakefile ||= File.join(@approot, "Rakefile")
81
+ pid = fork do
82
+ Dir.chdir(File.dirname(rakefile))
83
+ app = Rake::Application.new
84
+ Rake.application = app
85
+ app.instance_eval do
86
+ @rakefiles.clear
87
+ @rakefiles << rakefile
88
+ init
89
+ load_rakefile
90
+ self.instance_eval &block
91
+ end
44
92
  end
93
+ Process.waitpid pid
45
94
  end
46
95
 
47
96
  end
@@ -0,0 +1,17 @@
1
+ shared_context "assistance" do
2
+ it_behaves_like "rackapp"
3
+
4
+ before(:each) do
5
+ generate(
6
+ :root => @approot,
7
+ )
8
+ generate(
9
+ :root => @approot,
10
+ :kind => kind,
11
+ )
12
+ end
13
+
14
+ after(:each) do
15
+ FileUtils.rm_rf @approot
16
+ end
17
+ end
@@ -0,0 +1,26 @@
1
+ require "spec_helper"
2
+
3
+ shared_examples_for "rackapp" do
4
+ after(:each) do
5
+ FileUtils.rm_rf @approot
6
+ end
7
+
8
+ it "should rackup" do
9
+ genapp do
10
+ get "/"
11
+ last_response.body.rstrip.should == "Hello, MyApp!"
12
+
13
+ get "/hi/uu59"
14
+ last_response.body.should == "Hi, uu59!"
15
+
16
+ get "/admin/secret"
17
+ last_response.status.should == 403
18
+ last_response.body.should == "Secret zone"
19
+ end
20
+ end
21
+
22
+ it "should rake run" do
23
+ pending "jruby does not support fork" if defined? JRUBY_VERSION
24
+ lambda { rake{} }.should_not raise_error
25
+ end
26
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hisyo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-30 00:00:00.000000000 Z
12
+ date: 2012-06-08 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Create simple Sinatra project template
15
15
  email:
@@ -28,8 +28,18 @@ files:
28
28
  - README.mkd
29
29
  - Rakefile
30
30
  - bin/hisyo
31
+ - data/generators/assistance/sprockets/Gemfile.erubis
32
+ - data/generators/assistance/sprockets/Rakefile.erubis
33
+ - data/generators/assistance/sprockets/app/assets/javascripts/app.js
34
+ - data/generators/assistance/sprockets/app/assets/javascripts/foo.js
35
+ - data/generators/assistance/sprockets/app/sprockets.rb
36
+ - data/generators/assistance/test/foo.txt
37
+ - data/generators/assistance/test/test.txt.erubis
38
+ - data/generators/assistance/travis/.travis.yml.erubis
39
+ - data/generators/assistance/travis/Rakefile.erubis
31
40
  - data/generators/project/.gitignore
32
41
  - data/generators/project/Gemfile
42
+ - data/generators/project/Rakefile
33
43
  - data/generators/project/app/app.rb
34
44
  - data/generators/project/app/controllers.rb
35
45
  - data/generators/project/app/helpers.rb
@@ -42,11 +52,18 @@ files:
42
52
  - lib/hisyo.rb
43
53
  - lib/hisyo/cli.rb
44
54
  - lib/hisyo/generator.rb
55
+ - lib/hisyo/generator/sprockets.rb
56
+ - lib/hisyo/generator/test.rb
57
+ - lib/hisyo/generator/travis.rb
58
+ - lib/hisyo/util.rb
45
59
  - lib/hisyo/version.rb
46
60
  - spec/cli_spec.rb
47
- - spec/generated_app_spec.rb
61
+ - spec/generate_app_spec.rb
62
+ - spec/generate_assistance_spec.rb
48
63
  - spec/generator_spec.rb
49
64
  - spec/spec_helper.rb
65
+ - spec/support/assistance_context.rb
66
+ - spec/support/rackup.rb
50
67
  homepage: https://github.com/uu59/hisyo
51
68
  licenses: []
52
69
  post_install_message:
@@ -73,6 +90,9 @@ specification_version: 3
73
90
  summary: Create simple Sinatra project template
74
91
  test_files:
75
92
  - spec/cli_spec.rb
76
- - spec/generated_app_spec.rb
93
+ - spec/generate_app_spec.rb
94
+ - spec/generate_assistance_spec.rb
77
95
  - spec/generator_spec.rb
78
96
  - spec/spec_helper.rb
97
+ - spec/support/assistance_context.rb
98
+ - spec/support/rackup.rb
@@ -1,49 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Hisyo generated app" do
4
- def genapp(&block)
5
- pending "jruby does not support fork" if defined? JRUBY_VERSION
6
- pid = fork do
7
- generate_app(
8
- :root => @approot,
9
- )
10
- @mock = Class.new
11
- configru = "#{@approot}/config.ru"
12
- bootrb = "#{@approot}/config/boot.rb"
13
- @mock.class_eval do
14
- require bootrb
15
-
16
- include Rack::Test::Methods
17
- @configru = configru
18
-
19
- def self.configru
20
- @configru
21
- end
22
-
23
- def app
24
- Rack::Builder.parse_file(self.class.configru).first
25
- end
26
- end
27
- @mock.new.instance_eval &block
28
- end
29
- Process.wait pid
30
- end
31
-
32
- after(:each) do
33
- FileUtils.rm_rf @approot
34
- end
35
-
36
- it "should rackup" do
37
- genapp do
38
- get "/"
39
- last_response.body.rstrip.should == "Hello, MyApp!"
40
- end
41
- end
42
-
43
- it "controllers" do
44
- genapp do
45
- get "/hi/uu59"
46
- last_response.body.should == "Hi, uu59!"
47
- end
48
- end
49
- end