scaffoldhub 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scaffold_hub (0.0.1)
4
+ scaffoldhub (0.0.2)
5
5
  rails
6
6
 
7
7
  GEM
@@ -87,4 +87,4 @@ DEPENDENCIES
87
87
  mocha (~> 0.9.10)
88
88
  rake (~> 0.8.7)
89
89
  rspec (~> 2.3.0)
90
- scaffold_hub!
90
+ scaffoldhub!
@@ -0,0 +1,5 @@
1
+ =ScaffoldHub
2
+
3
+ Browse different scaffold generators on {scaffoldhub.org}[http://scaffoldhub.org] and run any of them in your Rails 3 app with this gem.
4
+
5
+ More info, documentation and examples coming soon... :)
data/Rakefile CHANGED
@@ -1,2 +1,11 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core'
5
+ require 'rspec/core/rake_task'
6
+
7
+ RSpec::Core::RakeTask.new(:spec) do |spec|
8
+ spec.pattern = FileList['spec/**/*_spec.rb']
9
+ end
10
+
11
+ task :default => :spec
@@ -0,0 +1,20 @@
1
+ require 'rails/generators/active_record'
2
+ require 'rails/generators/active_record/model/model_generator'
3
+
4
+ module ActiveRecord
5
+ class ScaffoldhubGenerator < ActiveRecord::Generators::ModelGenerator
6
+
7
+ include Scaffoldhub::Helper
8
+
9
+ source_root File.join(base_root, 'active_record', 'model', 'templates')
10
+
11
+ class_option :scaffold, :default => 'default', :banner => "SCAFFOLD_NAME", :type => :string, :desc => "Scaffold to use"
12
+ class_option :local, :default => false, :banner => "LOCAL SCAFFOLD", :type => :boolean, :desc => "Use a local scaffold, not scaffoldhub.org"
13
+
14
+ def create_model_file
15
+ model_template = find_template_file('active_record', 'templates/model.rb')
16
+ template model_template.src, File.join('app/models', class_path, "#{file_name}.rb") if model_template
17
+ end
18
+
19
+ end
20
+ end
@@ -10,8 +10,15 @@ module Erb
10
10
 
11
11
  def copy_view_files
12
12
  each_template_file(:erb) do |erb_template_file|
13
- template erb_template_file.src, File.join("app/views", controller_file_path, erb_template_file.dest)
13
+ unless erb_template_file.dest == 'app/views/layouts/layout.erb'
14
+ template erb_template_file.src, File.join("app/views", controller_file_path, erb_template_file.dest)
15
+ end
14
16
  end
15
17
  end
18
+
19
+ def copy_layout_file
20
+ layout_template = find_template_file('erb', 'templates/layout.erb')
21
+ template layout_template.src, File.join('app/views/layouts', "#{controller_file_name}.html.erb") if layout_template
22
+ end
16
23
  end
17
24
  end
@@ -13,7 +13,7 @@ module ScaffoldController
13
13
 
14
14
  def create_controller_files
15
15
  each_template_file(:controller) do |controller_template_file|
16
- template controller_template_file.src, File.join('app/controllers', class_path, controller_template_file.dest)
16
+ template controller_template_file.src, File.join('app/controllers', class_path, "#{controller_file_name}_controller.rb")
17
17
  end
18
18
  end
19
19
  end
@@ -7,6 +7,9 @@ class ScaffoldhubGenerator < Rails::Generators::ScaffoldGenerator
7
7
  remove_hook_for :scaffold_controller
8
8
  hook_for :scaffold_controller, :as => :scaffoldhub
9
9
 
10
+ remove_hook_for :orm
11
+ hook_for :orm, :as= => :scaffoldhub
12
+
10
13
  class_option :scaffold, :default => 'default', :banner => "SCAFFOLD_NAME", :type => :string, :desc => "Scaffold to use"
11
14
  class_option :local, :default => false, :banner => "LOCAL SCAFFOLD", :type => :boolean, :desc => "Use a local scaffold, not scaffoldhub.org"
12
15
 
@@ -1,9 +1,9 @@
1
1
  require 'scaffoldhub/remote_file'
2
- require 'scaffoldhub/spec_file'
2
+ require 'scaffoldhub/specification'
3
+ require 'scaffoldhub/scaffold_spec'
3
4
  require 'scaffoldhub/template_file'
4
- require 'scaffoldhub/scaffold'
5
5
  require 'scaffoldhub/helper'
6
6
 
7
7
  module Scaffoldhub
8
- VERSION = '0.0.1'
8
+ VERSION = '0.0.2'
9
9
  end
@@ -1,36 +1,73 @@
1
1
  module Scaffoldhub
2
2
  module Helper
3
3
 
4
- def self.scaffold
5
- @scaffold
6
- end
4
+ class << self
5
+ def scaffold_spec
6
+ @scaffold_spec
7
+ end
7
8
 
8
- def self.scaffold=(scaffold)
9
- @scaffold = scaffold
9
+ def scaffold_spec=(scaffold)
10
+ @scaffold_spec = scaffold
11
+ end
10
12
  end
11
13
 
12
14
  def each_template_file(type)
13
15
  begin
14
- Scaffoldhub::Helper.scaffold ||= Scaffoldhub::Scaffold.new(options[:scaffold], options[:local], status_proc)
15
- Scaffoldhub::SpecFile.new(status_proc).select_files(type).each do |template_file|
16
- if options[:local]
17
- raise Errno::ENOENT.new(template_file.src) unless File.exists?(template_file.src)
18
- else
19
- template_file.download
20
- end
21
- yield template_file
16
+ scaffold_spec.select_files(type).each do |template_file|
17
+ yield template_file.download!
22
18
  end
23
- rescue Errno::ENOENT
24
- say_status :error, "File not found error for #{File.expand_path(options[:scaffold])}", :red
19
+ rescue Errno::ENOENT => e
20
+ say_status :error, e.message, :red
21
+ rescue Scaffoldhub::NotFoundException => e
22
+ say_status :error, "HTTP 404 not found error for #{e.message}", :red
23
+ rescue Scaffoldhub::NetworkErrorException => e
24
+ say_status :error, "HTTP error connecting to #{e.message}", :red
25
+ end
26
+ end
27
+
28
+ def find_template_file(type, name)
29
+ begin
30
+ template_file = scaffold_spec.find_file(type, name)
31
+ template_file.download! unless template_file.nil?
32
+ rescue Errno::ENOENT => e
33
+ say_status :error, e.message, :red
34
+ nil
25
35
  rescue Scaffoldhub::NotFoundException => e
26
36
  say_status :error, "HTTP 404 not found error for #{e.message}", :red
37
+ nil
27
38
  rescue Scaffoldhub::NetworkErrorException => e
28
39
  say_status :error, "HTTP error connecting to #{e.message}", :red
40
+ nil
29
41
  end
30
42
  end
31
43
 
44
+ def scaffold_spec
45
+ Helper.scaffold_spec ||= download_scaffold_spec!
46
+ end
47
+
48
+ def download_scaffold_spec!
49
+ scaffold_spec = ScaffoldSpec.new(scaffold_name, options[:local], status_proc)
50
+ scaffold_spec.download_and_parse!
51
+ scaffold_spec
52
+ end
53
+
54
+ def scaffold_name
55
+ parse_scaffold_option(0)
56
+ end
57
+
58
+ def scaffold_parameter
59
+ parse_scaffold_option(1)
60
+ end
61
+
32
62
  def status_proc
33
- @proc ||= lambda { |url| say_status :download, url }
63
+ @status_proc ||= lambda { |url| say_status :download, url }
34
64
  end
65
+
66
+ private
67
+
68
+ def parse_scaffold_option(index)
69
+ options[:scaffold].split(':')[index]
70
+ end
71
+
35
72
  end
36
73
  end
@@ -1,4 +1,4 @@
1
- require 'net/http'
1
+ require 'net/https'
2
2
 
3
3
  module Scaffoldhub
4
4
 
@@ -14,18 +14,20 @@ module Scaffoldhub
14
14
  @status_proc = status_proc
15
15
  end
16
16
 
17
- def download
17
+ def remote_file_contents!
18
18
  begin
19
19
  uri = URI.parse(url)
20
20
  @status_proc.call(url)
21
- Net::HTTP.start(uri.host, uri.port) do |http|
22
- resp = http.get(uri.path)
23
- if resp.code.to_i == 200
24
- resp.body
25
- elsif resp.code.to_i == 404
26
- raise NotFoundException.new(url)
27
- else
28
- raise NetworkErrorException.new(url)
21
+ if uri.port == 443
22
+ https = Net::HTTP.new(uri.host, uri.port)
23
+ https.use_ssl = true
24
+ https.verify_mode = OpenSSL::SSL::VERIFY_NONE
25
+ https.start do |https|
26
+ response_body(https.get(uri.path))
27
+ end
28
+ else
29
+ Net::HTTP.start(uri.host, uri.port) do |http|
30
+ response_body(http.get(uri.path))
29
31
  end
30
32
  end
31
33
  rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Errno::ECONNREFUSED,
@@ -34,5 +36,15 @@ module Scaffoldhub
34
36
  end
35
37
  end
36
38
 
39
+ def response_body(resp)
40
+ if resp.code.to_i == 200
41
+ resp.body
42
+ elsif resp.code.to_i == 404
43
+ raise NotFoundException.new(url)
44
+ else
45
+ raise NetworkErrorException.new(url)
46
+ end
47
+ end
48
+
37
49
  end
38
50
  end
@@ -0,0 +1,71 @@
1
+ module Scaffoldhub
2
+ class ScaffoldSpec < RemoteFile
3
+
4
+ SCAFFOLD_HUB_SERVER = 'scaffoldhub.org'
5
+
6
+ def initialize(url, local, status_proc)
7
+ @scaffold = url
8
+ @local = local
9
+ @status_proc = status_proc
10
+ super(@status_proc)
11
+ end
12
+
13
+ def download_and_parse!
14
+ if @local
15
+ parse_local
16
+ else
17
+ parse_remote!
18
+ end
19
+ end
20
+
21
+ def select_files(type)
22
+ template_file_specs.select { |file_spec| file_spec[:type] == type.to_s }.collect do |file_spec|
23
+ TemplateFile.new file_spec[:src], file_spec[:dest], @local, base_url, @status_proc
24
+ end
25
+ end
26
+
27
+ def find_file(type, name)
28
+ file_spec = template_file_specs.detect { |file_spec| file_spec[:src] == name && file_spec[:type] == type.to_s }
29
+ unless file_spec.nil?
30
+ TemplateFile.new file_spec[:src], file_spec[:dest], @local, base_url, @status_proc
31
+ end
32
+ end
33
+
34
+ def parse_local
35
+ if File.exists?(url)
36
+ require url
37
+ else
38
+ raise Errno::ENOENT.new(url)
39
+ end
40
+ end
41
+
42
+ def parse_remote!
43
+ @spec = YAML::load(remote_file_contents!)
44
+ end
45
+
46
+ def template_file_specs
47
+ if @local
48
+ Specification.files
49
+ else
50
+ @spec[:files]
51
+ end
52
+ end
53
+
54
+ def url
55
+ if @local
56
+ @scaffold
57
+ else
58
+ "http://#{SCAFFOLD_HUB_SERVER}/scaffolds/#{@scaffold}/spec"
59
+ end
60
+ end
61
+
62
+ def base_url
63
+ if @local
64
+ File.dirname(File.expand_path(@scaffold))
65
+ else
66
+ @spec[:base_url]
67
+ end
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,48 @@
1
+ require 'yaml'
2
+
3
+ module Scaffoldhub
4
+ class Specification
5
+
6
+ @@files = []
7
+ @@base_url = nil
8
+
9
+ class << self
10
+ def files
11
+ @@files
12
+ end
13
+
14
+ def files=(files)
15
+ @@files = files
16
+ end
17
+
18
+ def add_file(type, src, dest)
19
+ @@files << { :type => type, :src => src, :dest => dest }
20
+ end
21
+
22
+ def base_url
23
+ @@base_url
24
+ end
25
+
26
+ def base_url=(url)
27
+ @@base_url = url
28
+ end
29
+
30
+ def to_yaml
31
+ { :base_url => base_url, :files => files }.to_yaml
32
+ end
33
+ end
34
+
35
+ def initialize
36
+ yield self
37
+ end
38
+
39
+ def method_missing(name, *args, &blk)
40
+ if name.to_s =~ /(.*)_file/ && args[0].is_a?(Hash)
41
+ self.class.add_file($1, args[0][:src], args[0][:dest])
42
+ elsif name == :base_url
43
+ self.class.base_url = args[0]
44
+ end
45
+ end
46
+
47
+ end
48
+ end
@@ -1,15 +1,16 @@
1
1
  module Scaffoldhub
2
2
  class TemplateFile < RemoteFile
3
3
 
4
- def initialize(src, dest, status_proc)
4
+ def initialize(src, dest, local, base_url, status_proc)
5
5
  @src = src
6
6
  @dest = dest || ''
7
- @base_url = Scaffoldhub::Helper.scaffold.base_url
7
+ @local = local
8
+ @base_url = base_url
8
9
  super(status_proc)
9
10
  end
10
11
 
11
12
  def src
12
- if Scaffoldhub::Helper.scaffold.local
13
+ if @local
13
14
  File.join(@base_url, @src)
14
15
  else
15
16
  @local_path
@@ -20,11 +21,16 @@ module Scaffoldhub
20
21
  File.join(@dest, File.basename(@src))
21
22
  end
22
23
 
23
- def download
24
- @local_path = Tempfile.new(File.basename(@src)).path
25
- open(@local_path, "wb") do |file|
26
- file.write(super)
24
+ def download!
25
+ if @local
26
+ raise Errno::ENOENT.new(src) unless File.exists?(src)
27
+ else
28
+ @local_path = Tempfile.new(File.basename(@src)).path
29
+ open(@local_path, "wb") do |file|
30
+ file.write(remote_file_contents!)
31
+ end
27
32
  end
33
+ self
28
34
  end
29
35
 
30
36
  def url
@@ -10,10 +10,8 @@ Gem::Specification.new do |s|
10
10
  s.authors = ['Pat Shaughnessy']
11
11
  s.email = ['pat@patshaughnessy.net']
12
12
  s.homepage = "http://scaffoldhub.org"
13
- s.summary = %q{Generate Rails scaffolding from scaffoldhub.org}
14
- s.description = %q{Generate Rails scaffolding from scaffoldhub.org}
15
-
16
- #s.rubyforge_project = "scaffoldhub"
13
+ s.summary = %q{Generate customized Rails scaffolding from scaffoldhub.org}
14
+ s.description = %q{Run Rails scaffold generator with customized templates downloaded from scaffoldhub.org}
17
15
 
18
16
  s.files = `git ls-files`.split("\n")
19
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -0,0 +1,21 @@
1
+ Scaffoldhub::Specification.new do |s|
2
+ s.base_url 'http://github.com/patshaughnessy/scaffolds/default'
3
+ s.erb_file :src => 'templates/index3.html.erb', :dest => ''
4
+ s.controller_file :src => 'templates/index2.html.erb', :dest => ''
5
+ s.other_file :src => 'templates/index.html.erb', :dest => 'app/views/welcome'
6
+ end
7
+
8
+ # Yaml hash of scaffold options
9
+ #
10
+ #---
11
+ #:base_url: http://github.com/patshaughnessy/scaffolds/default
12
+ #:files:
13
+ #- :src: templates/index.html.erb
14
+ # :dest: app/views/welcome
15
+ # :type: other
16
+ #- :src: templates/index2.html.erb
17
+ # :dest:
18
+ # :type: controller
19
+ #- :src: templates/index3.html.erb
20
+ # :dest:
21
+ # :type: erb
@@ -0,0 +1,139 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ class FakeGenerator
4
+ include Scaffoldhub::Helper
5
+
6
+ attr_accessor :files
7
+
8
+ def initialize(local, options = 'some_scaffold:some_parameter')
9
+ @files = []
10
+ @local = local
11
+ @options = options
12
+ end
13
+
14
+ def copy_files
15
+ each_template_file(:sometype) do |template_file|
16
+ files << template_file
17
+ end
18
+ end
19
+
20
+ def options
21
+ { :scaffold => @options, :local => @local }
22
+ end
23
+ end
24
+
25
+ describe Scaffoldhub::Helper do
26
+
27
+ describe 'local scaffold' do
28
+
29
+ before(:all) do
30
+ Scaffoldhub::Helper.scaffold_spec = nil
31
+ status_proc = mock
32
+ status_proc.stubs(:call)
33
+ mock_spec = mock
34
+ Scaffoldhub::ScaffoldSpec.stubs(:new).with('some_scaffold', true, status_proc).returns(mock_spec)
35
+ mock_spec.stubs(:download_and_parse!)
36
+ mock_template_file_array = [
37
+ Scaffoldhub::TemplateFile.new('src1', 'dest1', true, '/some/path', status_proc),
38
+ Scaffoldhub::TemplateFile.new('src2', 'dest2', true, '/some/path', status_proc),
39
+ Scaffoldhub::TemplateFile.new('src3', 'dest3', true, '/some/path', status_proc)
40
+ ]
41
+ mock_spec.stubs(:select_files).with(:sometype).returns(mock_template_file_array)
42
+ @gen = FakeGenerator.new(true)
43
+ @gen.stubs(:status_proc).returns(status_proc)
44
+ end
45
+
46
+ it 'should yield the template files' do
47
+ File.expects(:exists?).with('/some/path/src1').returns(true)
48
+ File.expects(:exists?).with('/some/path/src2').returns(true)
49
+ File.expects(:exists?).with('/some/path/src3').returns(true)
50
+ @gen.copy_files
51
+ @gen.files[0].src.should == '/some/path/src1'
52
+ @gen.files[1].src.should == '/some/path/src2'
53
+ @gen.files[2].src.should == '/some/path/src3'
54
+ end
55
+
56
+ it 'should raise an exception if the template file doesn\'t exist' do
57
+ File.expects(:exists?).with('/some/path/src1').returns(false)
58
+ @gen.expects(:say_status).with(:error, 'No such file or directory - /some/path/src1', :red)
59
+ @gen.copy_files
60
+ end
61
+ end
62
+
63
+ describe 'remote scaffold' do
64
+
65
+ before do
66
+ Scaffoldhub::Helper.scaffold_spec = nil
67
+ status_proc = mock
68
+ status_proc.stubs(:call)
69
+ mock_spec = mock
70
+ Scaffoldhub::ScaffoldSpec.stubs(:new).with('some_scaffold', false, status_proc).returns(mock_spec)
71
+ mock_spec.stubs(:download_and_parse!)
72
+ template1 = Scaffoldhub::TemplateFile.new('src1', 'dest1', false, 'http://some.server/some/path', status_proc)
73
+ template1.expects(:download!).returns(template1)
74
+ template1.stubs(:src).returns('src1')
75
+ template2 = Scaffoldhub::TemplateFile.new('src2', 'dest2', false, 'http://some.server/some/path', status_proc)
76
+ template2.expects(:download!).returns(template2)
77
+ template2.stubs(:src).returns('src2')
78
+ template3 = Scaffoldhub::TemplateFile.new('src3', 'dest3', false, 'http://some.server/some/path', status_proc)
79
+ template3.expects(:download!).returns(template3)
80
+ template3.stubs(:src).returns('src3')
81
+ mock_template_file_array = [ template1, template2, template3 ]
82
+ mock_spec.stubs(:select_files).with(:sometype).returns(mock_template_file_array)
83
+ @gen = FakeGenerator.new(false)
84
+ @gen.stubs(:status_proc).returns(status_proc)
85
+ end
86
+
87
+ it 'should yield the template files' do
88
+ @gen.copy_files
89
+ @gen.files[0].src.should == 'src1'
90
+ @gen.files[1].src.should == 'src2'
91
+ @gen.files[2].src.should == 'src3'
92
+ end
93
+ end
94
+
95
+ describe 'sharing scaffold spec among generators' do
96
+
97
+ before do
98
+ Scaffoldhub::Helper.scaffold_spec = nil
99
+ @mock_spec = mock
100
+ @mock_spec.stubs(:download_and_parse!)
101
+ status_proc = mock
102
+ Scaffoldhub::ScaffoldSpec.expects(:new).once.with('some_scaffold', false, status_proc).returns(@mock_spec)
103
+ @gen = FakeGenerator.new(false)
104
+ @gen.stubs(:status_proc).returns(status_proc)
105
+ @gen2 = FakeGenerator.new(false)
106
+ @gen2.stubs(:status_proc).returns(status_proc)
107
+ end
108
+
109
+ it 'should save the scaffold spec in the module among different generators' do
110
+ @gen.scaffold_spec.should == @mock_spec
111
+ @gen2.scaffold_spec.should == @mock_spec
112
+ end
113
+ end
114
+
115
+ describe '#find_template_file' do
116
+
117
+ it 'should call find_file on the scaffold spec' do
118
+ gen = FakeGenerator.new(false)
119
+ gen.expects(:find_file).with('type', 'name')
120
+ gen.find_file('type', 'name')
121
+ end
122
+ end
123
+
124
+ describe '#scaffold_name' do
125
+
126
+ describe 'both values present' do
127
+ subject { FakeGenerator.new(false) }
128
+ its(:scaffold_name) { should == 'some_scaffold' }
129
+ its(:scaffold_parameter) { should == 'some_parameter' }
130
+ end
131
+
132
+ describe 'only scaffold name present' do
133
+ subject { FakeGenerator.new(false, 'scaffold_name_only') }
134
+ its(:scaffold_name) { should == 'scaffold_name_only' }
135
+ its(:scaffold_parameter) { should == nil }
136
+ end
137
+
138
+ end
139
+ end
@@ -0,0 +1,83 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ module Net
4
+ class HTTP
5
+
6
+ def self.set_mock_http(mock_http)
7
+ @mock_http = mock_http
8
+ end
9
+
10
+ def self.start(host, port)
11
+ yield @mock_http
12
+ end
13
+ end
14
+ end
15
+
16
+ describe Scaffoldhub::RemoteFile do
17
+
18
+ FAKE_SCAFFOLDHUB_URL = 'http://fake.scaffoldhub.org:1234/scaffolds/autocomplete/spec'
19
+
20
+ describe '#remote_file_contents' do
21
+
22
+ describe 'status proc' do
23
+ subject do
24
+ @status_proc = mock
25
+ @status_proc.expects(:call).with(FAKE_SCAFFOLDHUB_URL)
26
+ Scaffoldhub::RemoteFile.new(@status_proc)
27
+ end
28
+ before do
29
+ subject.stubs(:url).returns(FAKE_SCAFFOLDHUB_URL)
30
+ end
31
+
32
+ it 'should call the status proc with the url' do
33
+ Net::HTTP.stubs(:start)
34
+ subject.remote_file_contents!
35
+ end
36
+ end
37
+
38
+ describe 'Net:HTTP calls' do
39
+
40
+ subject do
41
+ (status_proc = mock).stubs(:call).with(FAKE_SCAFFOLDHUB_URL)
42
+ Scaffoldhub::RemoteFile.new(status_proc)
43
+ end
44
+ before do
45
+ subject.stubs(:url).returns(FAKE_SCAFFOLDHUB_URL)
46
+ end
47
+
48
+ it 'should call Net::HTTP with the proper host and port' do
49
+ Net::HTTP.expects(:start).with('fake.scaffoldhub.org', 1234)
50
+ subject.remote_file_contents!
51
+ end
52
+
53
+ it 'should call GET on the url path and return the response body' do
54
+ mock_http = mock
55
+ mock_http.expects(:get).with('/scaffolds/autocomplete/spec').returns(mock_response = mock)
56
+ mock_response.stubs(:code).returns(200)
57
+ mock_response.stubs(:body).returns('RESPONSE')
58
+ Net::HTTP.set_mock_http(mock_http)
59
+ subject.remote_file_contents!.should == 'RESPONSE'
60
+ end
61
+
62
+ it 'should throw a NotFoundException on 404' do
63
+ mock_http = mock
64
+ mock_http.expects(:get).with('/scaffolds/autocomplete/spec').returns(mock_response = mock)
65
+ mock_response.stubs(:code).returns(404)
66
+ Net::HTTP.set_mock_http(mock_http)
67
+ lambda { subject.remote_file_contents! }.should raise_error(Scaffoldhub::NotFoundException)
68
+ end
69
+
70
+ it 'should throw a NetworkErrorException on some other error' do
71
+ mock_http = mock
72
+ mock_http.expects(:get).with('/scaffolds/autocomplete/spec').raises(Errno::ECONNREFUSED)
73
+ Net::HTTP.set_mock_http(mock_http)
74
+ lambda { subject.remote_file_contents! }.should raise_error(Scaffoldhub::NetworkErrorException)
75
+ end
76
+ end
77
+
78
+ describe 'Net:HTTP SSL calls' do
79
+ #TBD
80
+ end
81
+
82
+ end
83
+ end
@@ -0,0 +1,131 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Scaffoldhub::ScaffoldSpec do
4
+
5
+ before do
6
+ @status_proc = mock
7
+ @status_proc.stubs(:call)
8
+ end
9
+
10
+ describe 'parsing scaffold spec' do
11
+
12
+ describe 'parsing local scaffold spec' do
13
+
14
+ subject do
15
+ test_spec_path = File.join(File.dirname(__FILE__), 'fixtures', 'test_scaffoldspec.rb')
16
+ Scaffoldhub::ScaffoldSpec.new(test_spec_path, true, @status_proc)
17
+ end
18
+
19
+ before do
20
+ Scaffoldhub::Specification.files = []
21
+ Scaffoldhub::Specification.base_url = nil
22
+ end
23
+
24
+ it 'should require a local scaffold spec and parse the file list' do
25
+ subject.download_and_parse!
26
+ subject.template_file_specs.should == [
27
+ { :type => 'erb', :src => 'templates/index3.html.erb', :dest => '' },
28
+ { :type => 'controller', :src => 'templates/index2.html.erb', :dest => '' },
29
+ { :type => 'other', :src => 'templates/index.html.erb', :dest => 'app/views/welcome' }
30
+ ]
31
+ subject.base_url.should == File.expand_path(File.join(File.dirname(__FILE__), 'fixtures'))
32
+ end
33
+ end
34
+
35
+ describe 'parsing remote scaffold spec' do
36
+
37
+ TEST_YAML = <<YAML
38
+ ---
39
+ :base_url: http://github.com/patshaughnessy/scaffolds/default
40
+ :files:
41
+ - :src: templates/index3.html.erb
42
+ :dest:
43
+ :type: erb
44
+ - :src: templates/index2.html.erb
45
+ :dest:
46
+ :type: controller
47
+ - :src: templates/index.html.erb
48
+ :dest: app/views/welcome
49
+ :type: other
50
+ YAML
51
+
52
+ subject do
53
+ Scaffoldhub::ScaffoldSpec.new('http://fake.scaffoldhub.org:1234/scaffolds/autocomplete/spec', false, @status_proc)
54
+ end
55
+
56
+ before do
57
+ Scaffoldhub::Specification.files = []
58
+ Scaffoldhub::Specification.base_url = nil
59
+ subject.expects(:remote_file_contents!).returns(TEST_YAML)
60
+ end
61
+
62
+ it 'should require a local scaffold spec' do
63
+ subject.download_and_parse!
64
+ subject.template_file_specs.should == [
65
+ { :type => 'erb', :src => 'templates/index3.html.erb', :dest => nil },
66
+ { :type => 'controller', :src => 'templates/index2.html.erb', :dest => nil },
67
+ { :type => 'other', :src => 'templates/index.html.erb', :dest => 'app/views/welcome' }
68
+ ]
69
+ subject.base_url.should == 'http://github.com/patshaughnessy/scaffolds/default'
70
+ end
71
+ end
72
+ end
73
+
74
+ describe '#select_files' do
75
+
76
+ subject do
77
+ Scaffoldhub::ScaffoldSpec.new('unused', true, @status_proc)
78
+ end
79
+
80
+ before do
81
+ subject.stubs(:template_file_specs).returns([
82
+ { :type => 'type1', :src => 'some_src', :dest => 'some_dest' },
83
+ { :type => 'type1', :src => 'some_src2', :dest => 'some_dest' },
84
+ { :type => 'type1', :src => 'some_src3', :dest => 'some_dest' },
85
+ { :type => 'type2', :src => 'some_src4', :dest => 'some_dest' }
86
+ ])
87
+ end
88
+
89
+ it 'should select the files with the given type' do
90
+ Scaffoldhub::TemplateFile.expects(:new).returns(mock1 = mock)
91
+ Scaffoldhub::TemplateFile.expects(:new).returns(mock2 = mock)
92
+ Scaffoldhub::TemplateFile.expects(:new).returns(mock3 = mock)
93
+ files = subject.select_files('type1')
94
+ files.include?(mock1).should be_true
95
+ files.include?(mock2).should be_true
96
+ files.include?(mock3).should be_true
97
+ end
98
+ end
99
+
100
+ describe '#find_file' do
101
+
102
+ subject do
103
+ Scaffoldhub::ScaffoldSpec.new('unused', true, @status_proc)
104
+ end
105
+
106
+ before do
107
+ subject.stubs(:template_file_specs).returns([
108
+ { :type => 'type1', :src => 'some_src', :dest => 'some_dest' },
109
+ { :type => 'type1', :src => 'some_src2', :dest => 'some_dest' },
110
+ { :type => 'type1', :src => 'some_src3', :dest => 'some_dest' },
111
+ { :type => 'type2', :src => 'some_src4', :dest => 'some_dest' }
112
+ ])
113
+ subject.stubs(:base_url).returns('base')
114
+ end
115
+
116
+ it 'should find the file with the given type and src' do
117
+ Scaffoldhub::TemplateFile.expects(:new).with('some_src2', 'some_dest', true, 'base', @status_proc).returns(mock1 = mock)
118
+ subject.find_file('type1', 'some_src2').should == mock1
119
+ end
120
+
121
+ it 'should return nil if the name is not found' do
122
+ Scaffoldhub::TemplateFile.expects(:new).never
123
+ subject.find_file('type1', 'some_src5').should be_nil
124
+ end
125
+
126
+ it 'should return nil if the type is not found' do
127
+ Scaffoldhub::TemplateFile.expects(:new).never
128
+ subject.find_file('type3', 'some_src2').should be_nil
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,13 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'mocha'
5
+ require 'scaffoldhub'
6
+
7
+ # Requires supporting ruby files with custom matchers and macros, etc,
8
+ # in spec/support/ and its subdirectories.
9
+ Dir[File.join(File.dirname(__FILE__), "spec/support/**/*.rb")].each {|f| require f}
10
+
11
+ RSpec.configure do |config|
12
+ config.mock_with :mocha
13
+ end
@@ -0,0 +1,50 @@
1
+ require 'tempfile'
2
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
+
4
+ describe Scaffoldhub::TemplateFile do
5
+
6
+ before do
7
+ @status_proc = mock
8
+ @status_proc.stubs(:call)
9
+ end
10
+
11
+ describe 'local template file' do
12
+
13
+ subject { Scaffoldhub::TemplateFile.new('templates/index.html', 'public', true, File.expand_path(File.dirname(__FILE__)), @status_proc) }
14
+
15
+ its(:src) { should == File.expand_path(File.join(File.dirname(__FILE__), 'templates', 'index.html')) }
16
+ its(:url) { should == File.expand_path(File.join(File.dirname(__FILE__), 'templates', 'index.html')) }
17
+ its(:dest) { should == File.join('public', 'index.html') }
18
+ end
19
+
20
+ describe 'remote template file' do
21
+
22
+ FAKE_GITHUB_URL = 'http://github.com/patshaughnessy/scaffolds/default'
23
+
24
+ subject { Scaffoldhub::TemplateFile.new('templates/index.html', 'public', false, FAKE_GITHUB_URL, @status_proc) }
25
+
26
+ its(:url) { should == FAKE_GITHUB_URL + '/templates/index.html' }
27
+ its(:dest) { should == File.join('public', 'index.html') }
28
+
29
+ describe '#download!' do
30
+
31
+ before do
32
+ @local_path = File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'local_template_file.txt'))
33
+ File.delete(@local_path) if File.exists?(@local_path)
34
+ subject.stubs(:remote_file_contents!).returns('TEMPLATE')
35
+ tempfile = mock
36
+ Tempfile.stubs(:new).returns(tempfile)
37
+ tempfile.stubs(:path).returns(@local_path)
38
+ subject.download!
39
+ end
40
+
41
+ it 'should set the src to the local path after a download' do
42
+ subject.src.should == @local_path
43
+ end
44
+
45
+ it 'should write the template file contents into a local file' do
46
+ File.new(@local_path).read.should == 'TEMPLATE'
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,7 @@
1
+ require 'yaml'
2
+ require '../lib/scaffoldhub/specification'
3
+ require ARGV[0]
4
+
5
+ open('scaffold_spec.yaml', 'wb') do |file|
6
+ file.write(Scaffoldhub::Specification.to_yaml)
7
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scaffoldhub
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Pat Shaughnessy
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-04 00:00:00 -05:00
18
+ date: 2011-03-07 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -80,7 +80,7 @@ dependencies:
80
80
  version: 0.9.10
81
81
  type: :development
82
82
  version_requirements: *id004
83
- description: Generate Rails scaffolding from scaffoldhub.org
83
+ description: Run Rails scaffold generator with customized templates downloaded from scaffoldhub.org
84
84
  email:
85
85
  - pat@patshaughnessy.net
86
86
  executables: []
@@ -93,17 +93,26 @@ files:
93
93
  - .gitignore
94
94
  - Gemfile
95
95
  - Gemfile.lock
96
+ - README.rdoc
96
97
  - Rakefile
98
+ - lib/generators/active_record/scaffoldhub_generator.rb
97
99
  - lib/generators/erb/scaffoldhub_generator.rb
98
100
  - lib/generators/scaffold_controller/scaffoldhub_generator.rb
99
101
  - lib/generators/scaffoldhub/scaffoldhub_generator.rb
100
102
  - lib/scaffoldhub.rb
101
103
  - lib/scaffoldhub/helper.rb
102
104
  - lib/scaffoldhub/remote_file.rb
103
- - lib/scaffoldhub/scaffold.rb
104
- - lib/scaffoldhub/spec_file.rb
105
+ - lib/scaffoldhub/scaffold_spec.rb
106
+ - lib/scaffoldhub/specification.rb
105
107
  - lib/scaffoldhub/template_file.rb
106
108
  - scaffoldhub.gemspec
109
+ - spec/fixtures/test_scaffoldspec.rb
110
+ - spec/helper_spec.rb
111
+ - spec/remote_file_spec.rb
112
+ - spec/scaffold_spec_spec.rb
113
+ - spec/spec_helper.rb
114
+ - spec/template_file_spec.rb
115
+ - util/spec_to_yaml.rb
107
116
  has_rdoc: true
108
117
  homepage: http://scaffoldhub.org
109
118
  licenses: []
@@ -137,6 +146,11 @@ rubyforge_project:
137
146
  rubygems_version: 1.4.2
138
147
  signing_key:
139
148
  specification_version: 3
140
- summary: Generate Rails scaffolding from scaffoldhub.org
141
- test_files: []
142
-
149
+ summary: Generate customized Rails scaffolding from scaffoldhub.org
150
+ test_files:
151
+ - spec/fixtures/test_scaffoldspec.rb
152
+ - spec/helper_spec.rb
153
+ - spec/remote_file_spec.rb
154
+ - spec/scaffold_spec_spec.rb
155
+ - spec/spec_helper.rb
156
+ - spec/template_file_spec.rb
@@ -1,38 +0,0 @@
1
- module Scaffoldhub
2
- class Scaffold < RemoteFile
3
-
4
- SERVER_NAME = 'scaffoldhub.org'
5
-
6
- def initialize(scaffold, local, status_proc)
7
- @scaffold = scaffold
8
- @local = local
9
- super(status_proc)
10
- end
11
-
12
- def base_url
13
- if @local
14
- File.dirname(File.expand_path(@scaffold))
15
- else
16
- spec_url.split(/\/(?=[^\/]+(?: |$))/)[0]
17
- end
18
- end
19
-
20
- def spec_url
21
- @spec_url ||=
22
- if @local
23
- @scaffold
24
- else
25
- download.strip
26
- end
27
- end
28
-
29
- def local
30
- @local
31
- end
32
-
33
- def url
34
- "http://#{SERVER_NAME}/scaffolds/#{@scaffold}/spec"
35
- end
36
-
37
- end
38
- end
@@ -1,42 +0,0 @@
1
- module Scaffoldhub
2
- class SpecFile < RemoteFile
3
-
4
- def initialize(status_proc)
5
- @status_proc = status_proc
6
- super(status_proc)
7
- end
8
-
9
- def url
10
- Scaffoldhub::Helper.scaffold.spec_url
11
- end
12
-
13
- def select_files(type)
14
- if Scaffoldhub::Helper.scaffold.local
15
- load_local
16
- else
17
- load_remote
18
- end
19
- @spec[:files].select { |file_spec| file_spec[:type] == type.to_s }.collect do |file_spec|
20
- TemplateFile.new file_spec[:src], file_spec[:dest], @status_proc
21
- end
22
- end
23
-
24
- protected
25
-
26
- def load_local
27
- parse(File.new(url).read)
28
- end
29
-
30
- def load_remote
31
- parse(download)
32
- end
33
-
34
- def parse(data)
35
- @spec = YAML::load(data) unless data.nil?
36
- end
37
-
38
- #def method_missing(name, *args, &blk)
39
- ##@spec.send(name)
40
- #end
41
- end
42
- end