scaffoldhub 0.0.4 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +0 -6
- data/Gemfile.lock +3 -3
- data/bin/scaffoldhub +7 -0
- data/lib/generators/active_record/scaffoldhub_generator.rb +2 -2
- data/lib/generators/erb/scaffoldhub_generator.rb +1 -1
- data/lib/generators/new_scaffoldhub/new_scaffoldhub_generator.rb +37 -0
- data/lib/generators/new_scaffoldhub/templates/scaffold_spec.rb.erb +49 -0
- data/lib/generators/new_scaffoldhub/templates/screenshot.png +0 -0
- data/lib/generators/scaffold_controller/scaffoldhub_generator.rb +2 -3
- data/lib/generators/scaffoldhub/scaffoldhub_generator.rb +5 -2
- data/lib/scaffoldhub.rb +3 -1
- data/lib/scaffoldhub/helper.rb +2 -2
- data/lib/scaffoldhub/remote_file.rb +26 -22
- data/lib/scaffoldhub/runner.rb +90 -0
- data/lib/scaffoldhub/scaffold_spec.rb +20 -11
- data/lib/scaffoldhub/specification.rb +146 -20
- data/lib/scaffoldhub/template_file.rb +1 -1
- data/spec/fixtures/local_template_file.txt +1 -0
- data/spec/fixtures/test_scaffold.rb +85 -0
- data/spec/remote_file_spec.rb +39 -32
- data/spec/scaffold_spec_spec.rb +137 -35
- data/spec/template_file_spec.rb +3 -3
- metadata +15 -9
- data/spec/fixtures/test_scaffoldspec.rb +0 -21
- data/util/spec_to_yaml.rb +0 -7
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
scaffoldhub (0.0.
|
4
|
+
scaffoldhub (0.0.6)
|
5
5
|
rails
|
6
6
|
|
7
7
|
GEM
|
@@ -40,7 +40,7 @@ GEM
|
|
40
40
|
erubis (2.6.6)
|
41
41
|
abstract (>= 1.0.0)
|
42
42
|
i18n (0.5.0)
|
43
|
-
mail (2.2.
|
43
|
+
mail (2.2.19)
|
44
44
|
activesupport (>= 2.3.6)
|
45
45
|
i18n (>= 0.4.0)
|
46
46
|
mime-types (~> 1.16)
|
@@ -78,7 +78,7 @@ GEM
|
|
78
78
|
thor (0.14.6)
|
79
79
|
treetop (1.4.9)
|
80
80
|
polyglot (>= 0.3.1)
|
81
|
-
tzinfo (0.3.
|
81
|
+
tzinfo (0.3.26)
|
82
82
|
|
83
83
|
PLATFORMS
|
84
84
|
ruby
|
data/bin/scaffoldhub
ADDED
@@ -16,13 +16,13 @@ module ActiveRecord
|
|
16
16
|
class_option :parent, :type => :string, :desc => "The parent class for the generated model"
|
17
17
|
|
18
18
|
def create_model_file
|
19
|
-
model_template = find_template_file(
|
19
|
+
model_template = find_template_file(:model)
|
20
20
|
template model_template.src, File.join('app/models', class_path, "#{file_name}.rb") if model_template
|
21
21
|
end
|
22
22
|
|
23
23
|
def create_migration_file
|
24
24
|
return unless options[:migration] && options[:parent].nil?
|
25
|
-
migration_template = find_template_file(
|
25
|
+
migration_template = find_template_file(:migration)
|
26
26
|
migration_template migration_template.src, "db/migrate/create_#{table_name}.rb" if migration_template
|
27
27
|
end
|
28
28
|
|
@@ -9,7 +9,7 @@ module Erb
|
|
9
9
|
class_option :local, :default => false, :banner => "LOCAL SCAFFOLD", :type => :boolean, :desc => "Use a local scaffold, not scaffoldhub.org"
|
10
10
|
|
11
11
|
def copy_view_files
|
12
|
-
each_template_file(:
|
12
|
+
each_template_file(:view) do |erb_template_file|
|
13
13
|
if is_layout_erb?(erb_template_file)
|
14
14
|
copy_layout_file(erb_template_file)
|
15
15
|
else
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rails/generators/erb/scaffold/scaffold_generator'
|
2
|
+
require 'rails/generators/rails/scaffold_controller/scaffold_controller_generator'
|
3
|
+
require 'rails/generators/active_record/model/model_generator'
|
4
|
+
|
5
|
+
class NewScaffoldhubGenerator < Rails::Generators::NamedBase
|
6
|
+
|
7
|
+
def self.source_root
|
8
|
+
File.expand_path('../templates', __FILE__)
|
9
|
+
end
|
10
|
+
|
11
|
+
def copy_scaffold_spec
|
12
|
+
template 'scaffold_spec.rb.erb', "#{singular_name}_scaffold/scaffold_spec.rb"
|
13
|
+
end
|
14
|
+
|
15
|
+
def copy_scaffold_screenshot
|
16
|
+
copy_file 'screenshot.png', "#{singular_name}_scaffold/#{singular_name}_screenshot.png"
|
17
|
+
end
|
18
|
+
|
19
|
+
def copy_rails_erb_templates
|
20
|
+
%w[ _form.html.erb edit.html.erb index.html.erb new.html.erb show.html.erb ].each do |file_name|
|
21
|
+
copy_file File.join(Erb::Generators::ScaffoldGenerator.default_source_root, file_name),
|
22
|
+
"#{singular_name}_scaffold/templates/#{file_name}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def copy_rails_model_template
|
27
|
+
copy_file File.join(ActiveRecord::Generators::ModelGenerator.default_source_root, 'model.rb'),
|
28
|
+
"#{singular_name}_scaffold/templates/model.rb"
|
29
|
+
copy_file File.join(ActiveRecord::Generators::ModelGenerator.default_source_root, 'migration.rb'),
|
30
|
+
"#{singular_name}_scaffold/templates/migration.rb"
|
31
|
+
end
|
32
|
+
|
33
|
+
def copy_rails_controller_template
|
34
|
+
copy_file File.join(Rails::Generators::ScaffoldControllerGenerator.default_source_root, 'controller.rb'),
|
35
|
+
"#{singular_name}_scaffold/templates/controller.rb"
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
Scaffoldhub::Specification.new do
|
2
|
+
|
3
|
+
# Github URL where you will post your scaffold - the speciied folder must contain this file
|
4
|
+
base_url 'https://github.com/your_name/your_repo'
|
5
|
+
|
6
|
+
# The name of your new scaffold: should be a single word
|
7
|
+
name '<%= singular_name %>'
|
8
|
+
|
9
|
+
# Metadata about this scaffold - this info is only used for display on scaffoldhub.org:
|
10
|
+
metadata do
|
11
|
+
|
12
|
+
# A short paragraph describing what this scaffold does
|
13
|
+
description 'The <%= singular_name %> scaffold.'
|
14
|
+
|
15
|
+
# 4x3 aspect ratio screen shot
|
16
|
+
screenshot 'screenshot.png'
|
17
|
+
|
18
|
+
# Tag(s) to help scaffoldhub.org users find your scaffold
|
19
|
+
tag 'jquery'
|
20
|
+
tag 'autocomplete'
|
21
|
+
end
|
22
|
+
|
23
|
+
# Optionally specify an example of a scaffold parameter
|
24
|
+
parameter_example 'FIELD_NAME'
|
25
|
+
|
26
|
+
# Optionally post a link to an article you write explaining how the scaffold works.
|
27
|
+
blog_post 'http://patshaughnessy.net/2011/3/13/view-mapper-for-rails-3-scaffoldhub'
|
28
|
+
|
29
|
+
# Define a model template - this ERB file will be used to generate a new
|
30
|
+
# model class with this path & filename: app/models/NAME.rb
|
31
|
+
model 'templates/model.rb'
|
32
|
+
|
33
|
+
# Define an ActiveRecord migration template - this ERB file will be used to generate a new
|
34
|
+
# migration class with this path & filename: db/migrate/TIMESTAMP_create_PLURAL_NAME.rb
|
35
|
+
migration 'templates/migration.rb'
|
36
|
+
|
37
|
+
# Define a controller template - this ERB file will be used to generate a new
|
38
|
+
# controller class with this path & filename: app/controllers/PLURAL_NAME.rb
|
39
|
+
controller 'templates/controller.rb'
|
40
|
+
|
41
|
+
# You can use "with_options" to specify the same source folder for a series of templates:
|
42
|
+
with_options :src => 'templates' do
|
43
|
+
view '_form.html.erb'
|
44
|
+
view 'new.html.erb'
|
45
|
+
view 'edit.html.erb'
|
46
|
+
view 'index.html.erb'
|
47
|
+
view 'show.html.erb'
|
48
|
+
end
|
49
|
+
end
|
Binary file
|
@@ -12,9 +12,8 @@ module ScaffoldController
|
|
12
12
|
class_option :local, :default => false, :banner => "LOCAL SCAFFOLD", :type => :boolean, :desc => "Use a local scaffold, not scaffoldhub.org"
|
13
13
|
|
14
14
|
def create_controller_files
|
15
|
-
|
16
|
-
|
17
|
-
end
|
15
|
+
controller_template_file = find_template_file(:controller)
|
16
|
+
template controller_template_file.src, File.join('app/controllers', class_path, "#{controller_file_name}_controller.rb") if controller_template_file
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
@@ -14,8 +14,11 @@ class ScaffoldhubGenerator < Rails::Generators::ScaffoldGenerator
|
|
14
14
|
class_option :local, :default => false, :banner => "LOCAL SCAFFOLD", :type => :boolean, :desc => "Use a local scaffold, not scaffoldhub.org"
|
15
15
|
|
16
16
|
def download_and_copy_other_files
|
17
|
-
each_template_file(:
|
18
|
-
template
|
17
|
+
each_template_file(:template) do |template_file|
|
18
|
+
template template_file.src, template_file.dest
|
19
|
+
end
|
20
|
+
each_template_file(:file) do |template_file|
|
21
|
+
copy_file template_file.src, template_file.dest
|
19
22
|
end
|
20
23
|
end
|
21
24
|
end
|
data/lib/scaffoldhub.rb
CHANGED
@@ -3,7 +3,9 @@ require 'scaffoldhub/specification'
|
|
3
3
|
require 'scaffoldhub/scaffold_spec'
|
4
4
|
require 'scaffoldhub/template_file'
|
5
5
|
require 'scaffoldhub/helper'
|
6
|
+
require 'scaffoldhub/runner'
|
6
7
|
|
7
8
|
module Scaffoldhub
|
8
|
-
VERSION = '0.0.
|
9
|
+
VERSION = '0.0.6'
|
10
|
+
SCAFFOLD_HUB_SERVER = 'scaffoldhub.org'
|
9
11
|
end
|
data/lib/scaffoldhub/helper.rb
CHANGED
@@ -25,9 +25,9 @@ module Scaffoldhub
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
def find_template_file(type
|
28
|
+
def find_template_file(type)
|
29
29
|
begin
|
30
|
-
template_file = scaffold_spec.find_file(type
|
30
|
+
template_file = scaffold_spec.find_file(type)
|
31
31
|
template_file.download! unless template_file.nil?
|
32
32
|
rescue Errno::ENOENT => e
|
33
33
|
say_status :error, e.message, :red
|
@@ -10,33 +10,19 @@ module Scaffoldhub
|
|
10
10
|
|
11
11
|
class RemoteFile
|
12
12
|
|
13
|
-
|
13
|
+
attr_accessor :url
|
14
|
+
|
15
|
+
def initialize(url = nil, status_proc = nil)
|
14
16
|
@status_proc = status_proc
|
17
|
+
@url = url
|
15
18
|
end
|
16
19
|
|
17
|
-
def
|
18
|
-
|
19
|
-
uri = URI.parse(url)
|
20
|
-
@status_proc.call(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))
|
31
|
-
end
|
32
|
-
end
|
33
|
-
rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Errno::ECONNREFUSED,
|
34
|
-
Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
|
35
|
-
raise NetworkErrorException.new(url)
|
36
|
-
end
|
20
|
+
def exists?
|
21
|
+
http_request.code.to_i == 200
|
37
22
|
end
|
38
23
|
|
39
|
-
def
|
24
|
+
def remote_file_contents!
|
25
|
+
resp = http_request
|
40
26
|
if resp.code.to_i == 200
|
41
27
|
resp.body
|
42
28
|
elsif resp.code.to_i == 404
|
@@ -46,5 +32,23 @@ module Scaffoldhub
|
|
46
32
|
end
|
47
33
|
end
|
48
34
|
|
35
|
+
def http_request
|
36
|
+
begin
|
37
|
+
@status_proc.call(url) if @status_proc
|
38
|
+
uri = URI.parse(url)
|
39
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
40
|
+
if uri.port == 443
|
41
|
+
http.use_ssl = true
|
42
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
43
|
+
end
|
44
|
+
http.start do |http|
|
45
|
+
http.get(uri.path)
|
46
|
+
end
|
47
|
+
rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Errno::ECONNREFUSED,
|
48
|
+
Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
|
49
|
+
raise NetworkErrorException.new(url)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
49
53
|
end
|
50
54
|
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'uri'
|
3
|
+
require 'yaml'
|
4
|
+
require 'thor'
|
5
|
+
|
6
|
+
module Scaffoldhub
|
7
|
+
class Runner < Thor
|
8
|
+
desc "push /path/to/scaffold_spec.rb", "Compile specified scaffold spec and push it to scaffoldhub.org"
|
9
|
+
def push(scaffold_spec)
|
10
|
+
if load_spec(scaffold_spec)
|
11
|
+
if Specification.valid?
|
12
|
+
post_spec(scaffold_spec)
|
13
|
+
else
|
14
|
+
say "Unable to post your new scaffold. Please resolve these errors:"
|
15
|
+
Specification.errors.each { |error| say error }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def load_spec(scaffold_spec)
|
23
|
+
begin
|
24
|
+
require scaffold_spec
|
25
|
+
true
|
26
|
+
rescue Exception => e
|
27
|
+
say "There was an error parsing your scaffold spec file."
|
28
|
+
say e.message
|
29
|
+
say e.backtrace[0]
|
30
|
+
false
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def post_spec(scaffold_spec)
|
35
|
+
|
36
|
+
begin
|
37
|
+
config = load_config
|
38
|
+
username = config[:username]
|
39
|
+
password = config[:password]
|
40
|
+
rescue
|
41
|
+
say "Please enter your scaffoldhub.org credentials..."
|
42
|
+
username = ask "Username: "
|
43
|
+
password = ask "Password: "
|
44
|
+
end
|
45
|
+
|
46
|
+
url = URI.parse("http://#{SCAFFOLD_HUB_SERVER}/admin/scaffolds")
|
47
|
+
req = Net::HTTP::Post.new(url.path)
|
48
|
+
req.basic_auth username, password
|
49
|
+
req.set_form_data({'scaffold' => Specification.to_yaml, 'spec_file_name' => File.basename(scaffold_spec) }, ';')
|
50
|
+
response = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }
|
51
|
+
say response.body
|
52
|
+
save_config(username, password) unless response.body == 'Invalid username or password.'
|
53
|
+
end
|
54
|
+
|
55
|
+
def config_file
|
56
|
+
File.join(find_home, '.scaffoldhub')
|
57
|
+
end
|
58
|
+
|
59
|
+
def load_config
|
60
|
+
YAML::load(File.read(config_file))
|
61
|
+
end
|
62
|
+
|
63
|
+
def save_config(username, password)
|
64
|
+
File.open(config_file, 'w') {|f| f.write({ :username => username, :password => password }.to_yaml) }
|
65
|
+
end
|
66
|
+
|
67
|
+
# Ripped from rubygems
|
68
|
+
def find_home
|
69
|
+
unless RUBY_VERSION > '1.9' then
|
70
|
+
['HOME', 'USERPROFILE'].each do |homekey|
|
71
|
+
return File.expand_path(ENV[homekey]) if ENV[homekey]
|
72
|
+
end
|
73
|
+
|
74
|
+
if ENV['HOMEDRIVE'] && ENV['HOMEPATH'] then
|
75
|
+
return File.expand_path("#{ENV['HOMEDRIVE']}#{ENV['HOMEPATH']}")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
File.expand_path "~"
|
80
|
+
rescue
|
81
|
+
if File::ALT_SEPARATOR then
|
82
|
+
drive = ENV['HOMEDRIVE'] || ENV['SystemDrive']
|
83
|
+
File.join(drive.to_s, '/')
|
84
|
+
else
|
85
|
+
"/"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
@@ -1,13 +1,11 @@
|
|
1
1
|
module Scaffoldhub
|
2
2
|
class ScaffoldSpec < RemoteFile
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
def initialize(url, local, status_proc)
|
7
|
-
@scaffold = url
|
4
|
+
def initialize(scaffold, local, status_proc)
|
5
|
+
@scaffold = scaffold
|
8
6
|
@local = local
|
9
7
|
@status_proc = status_proc
|
10
|
-
super(@status_proc)
|
8
|
+
super(url, @status_proc)
|
11
9
|
end
|
12
10
|
|
13
11
|
def download_and_parse!
|
@@ -19,23 +17,23 @@ module Scaffoldhub
|
|
19
17
|
end
|
20
18
|
|
21
19
|
def select_files(type)
|
22
|
-
template_file_specs.select { |file_spec| file_spec[:type] == type
|
20
|
+
template_file_specs.select { |file_spec| file_spec[:type].to_sym == type }.collect do |file_spec|
|
23
21
|
TemplateFile.new file_spec[:src], file_spec[:dest], @local, base_url, @status_proc
|
24
22
|
end
|
25
23
|
end
|
26
24
|
|
27
|
-
def find_file(type
|
28
|
-
file_spec = template_file_specs.detect { |file_spec| file_spec[:
|
25
|
+
def find_file(type)
|
26
|
+
file_spec = template_file_specs.detect { |file_spec| file_spec[:type].to_sym == type }
|
29
27
|
unless file_spec.nil?
|
30
28
|
TemplateFile.new file_spec[:src], file_spec[:dest], @local, base_url, @status_proc
|
31
29
|
end
|
32
30
|
end
|
33
31
|
|
34
32
|
def parse_local
|
35
|
-
if File.exists?(
|
36
|
-
|
33
|
+
if File.exists?(@scaffold)
|
34
|
+
eval(File.read(@scaffold))
|
37
35
|
else
|
38
|
-
raise Errno::ENOENT.new(
|
36
|
+
raise Errno::ENOENT.new(@scaffold)
|
39
37
|
end
|
40
38
|
end
|
41
39
|
|
@@ -67,5 +65,16 @@ module Scaffoldhub
|
|
67
65
|
end
|
68
66
|
end
|
69
67
|
|
68
|
+
def blog_post
|
69
|
+
if @local
|
70
|
+
Specification.blog_post
|
71
|
+
else
|
72
|
+
@spec[:blog_post]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def to_yaml
|
77
|
+
Specification.to_yaml if @local
|
78
|
+
end
|
70
79
|
end
|
71
80
|
end
|
@@ -1,48 +1,174 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
|
3
|
+
def mattr_accessor(*syms)
|
4
|
+
syms.each do |sym|
|
5
|
+
class_eval(<<-EOS, __FILE__, __LINE__)
|
6
|
+
@@#{sym} = nil
|
7
|
+
|
8
|
+
def self.#{sym}
|
9
|
+
@@#{sym}
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.#{sym}=(obj)
|
13
|
+
@@#{sym} = obj
|
14
|
+
end
|
15
|
+
EOS
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def define_dsl_attributes(*syms)
|
20
|
+
syms.each do |sym|
|
21
|
+
class_eval(<<-EOS, __FILE__, __LINE__)
|
22
|
+
def #{sym}(val)
|
23
|
+
self.class.#{sym} = val
|
24
|
+
end
|
25
|
+
EOS
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def define_dsl_file_keyword(*syms)
|
30
|
+
syms.each do |sym|
|
31
|
+
class_eval(<<-EOS, __FILE__, __LINE__)
|
32
|
+
def #{sym}(src, options = {})
|
33
|
+
file(src, options, :#{sym})
|
34
|
+
end
|
35
|
+
EOS
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
3
39
|
module Scaffoldhub
|
4
40
|
class Specification
|
5
41
|
|
42
|
+
mattr_accessor :name, :description, :base_url, :blog_post, :screenshot, :parameter_example
|
43
|
+
define_dsl_attributes :name, :description, :base_url, :blog_post, :screenshot, :parameter_example
|
44
|
+
|
45
|
+
mattr_accessor :files, :errors, :tags
|
6
46
|
@@files = []
|
7
|
-
@@
|
47
|
+
@@errors = []
|
48
|
+
@@tags = []
|
49
|
+
|
50
|
+
define_dsl_file_keyword :model, :migration, :controller, :view, :layout
|
8
51
|
|
9
52
|
class << self
|
10
|
-
|
11
|
-
|
53
|
+
|
54
|
+
def add_file(src, dest, type)
|
55
|
+
@@files << { :type => type, :src => src, :dest => dest }
|
12
56
|
end
|
13
57
|
|
14
|
-
def
|
15
|
-
@@
|
58
|
+
def add_tag(keyword)
|
59
|
+
@@tags << keyword
|
16
60
|
end
|
17
61
|
|
18
|
-
def
|
19
|
-
|
62
|
+
def to_yaml
|
63
|
+
{
|
64
|
+
:name => name,
|
65
|
+
:description => description,
|
66
|
+
:base_url => adjusted_base_url,
|
67
|
+
:blog_post => blog_post,
|
68
|
+
:files => files,
|
69
|
+
:screenshot => screenshot,
|
70
|
+
:tags => tags,
|
71
|
+
:parameter_example => parameter_example
|
72
|
+
}.to_yaml
|
20
73
|
end
|
21
74
|
|
22
|
-
def
|
23
|
-
|
75
|
+
def adjusted_base_url
|
76
|
+
if base_url =~ /github.com\/(\w+\/\w+)\/(tree|blob)\/(.*)$/
|
77
|
+
"https://github.com/#{$1}/raw/#{$3}"
|
78
|
+
elsif base_url =~ /github.com\/(\w+\/\w+)\/?$/
|
79
|
+
"https://github.com/#{$1}/raw/master"
|
80
|
+
else
|
81
|
+
base_url
|
82
|
+
end
|
24
83
|
end
|
25
84
|
|
26
|
-
def
|
27
|
-
|
85
|
+
def valid?
|
86
|
+
has_name? && has_description? && has_base_url? && has_screenshot? && all_template_files_exist?
|
28
87
|
end
|
29
88
|
|
30
|
-
def
|
31
|
-
|
89
|
+
def has_name?
|
90
|
+
has_string_value?(:name)
|
91
|
+
end
|
92
|
+
|
93
|
+
def has_description?
|
94
|
+
has_string_value?(:description)
|
95
|
+
end
|
96
|
+
|
97
|
+
def has_base_url?
|
98
|
+
has_string_value?(:base_url)
|
99
|
+
end
|
100
|
+
|
101
|
+
def has_string_value?(value)
|
102
|
+
val = send(value)
|
103
|
+
valid = (val && val != '')
|
104
|
+
errors.push("Error: missing scaffold #{value}.") unless valid
|
105
|
+
valid
|
106
|
+
end
|
107
|
+
|
108
|
+
def has_screenshot?
|
109
|
+
has_string_value?(:screenshot) && remote_file_exists?(File.join(adjusted_base_url, screenshot))
|
110
|
+
end
|
111
|
+
|
112
|
+
def all_template_files_exist?
|
113
|
+
files.all? { |file| remote_file_exists?(File.join(adjusted_base_url, file[:src])) }
|
114
|
+
end
|
115
|
+
|
116
|
+
def remote_file_exists?(url)
|
117
|
+
valid = RemoteFile.new(url).exists?
|
118
|
+
errors.push("Error: unable to access remote URL #{url}") unless valid
|
119
|
+
valid
|
32
120
|
end
|
33
121
|
end
|
34
122
|
|
35
|
-
def initialize
|
36
|
-
|
123
|
+
def initialize(&block)
|
124
|
+
@context_stack = []
|
125
|
+
@context_options = {}
|
126
|
+
instance_eval(&block) if block_given?
|
37
127
|
end
|
38
128
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
129
|
+
def with_options(options, &block)
|
130
|
+
@context_stack.push(@context_options)
|
131
|
+
@context_options = options_relative_to_parent(@context_options, options)
|
132
|
+
yield if block_given?
|
133
|
+
@context_options = @context_stack.pop
|
134
|
+
end
|
135
|
+
|
136
|
+
def metadata
|
137
|
+
yield if block_given?
|
138
|
+
end
|
139
|
+
|
140
|
+
def file(src, options = {}, type = :file)
|
141
|
+
self.class.add_file(
|
142
|
+
join_with_parent(@context_options[:src], src),
|
143
|
+
join_with_parent(@context_options[:dest], options[:dest]),
|
144
|
+
type
|
145
|
+
)
|
146
|
+
end
|
147
|
+
|
148
|
+
def template(src, options = {})
|
149
|
+
raise ':dest option is required for templates' unless options[:dest]
|
150
|
+
file(src, options, :template)
|
151
|
+
end
|
152
|
+
|
153
|
+
def tag(keyword)
|
154
|
+
self.class.add_tag(keyword)
|
155
|
+
end
|
156
|
+
|
157
|
+
protected
|
158
|
+
|
159
|
+
def join_with_parent(parent_value, new_value)
|
160
|
+
if parent_value && new_value
|
161
|
+
File.join(parent_value, new_value)
|
162
|
+
else
|
163
|
+
parent_value || new_value
|
44
164
|
end
|
45
165
|
end
|
46
166
|
|
167
|
+
def options_relative_to_parent(parent_options, options)
|
168
|
+
{
|
169
|
+
:src => join_with_parent(parent_options[:src], options[:src]),
|
170
|
+
:dest => join_with_parent(parent_options[:dest], options[:dest])
|
171
|
+
}
|
172
|
+
end
|
47
173
|
end
|
48
174
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
TEMPLATE
|
@@ -0,0 +1,85 @@
|
|
1
|
+
Scaffoldhub::Specification.new do
|
2
|
+
|
3
|
+
# Github URL where you will post your scaffold - the speciied folder must contain this file
|
4
|
+
base_url 'https://github.com/your_name/your_repo'
|
5
|
+
|
6
|
+
# The name of your new scaffold: should be a single word
|
7
|
+
name 'test_scaffold'
|
8
|
+
|
9
|
+
# Metadata about this scaffold - this info is only used for display on scaffoldhub.org:
|
10
|
+
metadata do
|
11
|
+
|
12
|
+
# A short paragraph describing what this scaffold does
|
13
|
+
description 'The test_scaffold scaffold.'
|
14
|
+
|
15
|
+
# 4x3 aspect ratio screen shot
|
16
|
+
screenshot 'screenshot.png'
|
17
|
+
|
18
|
+
# Tag(s) to help scaffoldhub.org users find your scaffold
|
19
|
+
tag 'jquery'
|
20
|
+
tag 'autocomplete'
|
21
|
+
end
|
22
|
+
|
23
|
+
# Optionally specify an example of a scaffold parameter
|
24
|
+
parameter_example 'FIELD_NAME'
|
25
|
+
|
26
|
+
# Optionally post a link to an article you write explaining how the scaffold works.
|
27
|
+
blog_post 'http://patshaughnessy.net/2011/3/13/view-mapper-for-rails-3-scaffoldhub'
|
28
|
+
|
29
|
+
# Define a model template - this ERB file will be used to generate a new
|
30
|
+
# model class with this path & filename: app/models/NAME.rb
|
31
|
+
model 'templates/model.rb'
|
32
|
+
|
33
|
+
# Define a controller template - this ERB file will be used to generate a new
|
34
|
+
# controller class with this path & filename: app/controllers/PLURAL_NAME.rb
|
35
|
+
controller 'templates/controller.rb'
|
36
|
+
|
37
|
+
# Define a view template - this ERB file will be used to generate a new
|
38
|
+
# view file with this path & filename: app/views/PLURAL_NAME/view_file_name.rb
|
39
|
+
view 'templates/_form.html.erb'
|
40
|
+
|
41
|
+
# Define a view layout template - this ERB file will be used to generate a new
|
42
|
+
# view layout file with this path & filename: app/views/layouts/PLURAL_NAME.rb
|
43
|
+
layout 'templates/layout.erb'
|
44
|
+
|
45
|
+
# You can use "with_options" to specify the same source folder for a series of templates:
|
46
|
+
with_options :src => 'templates' do
|
47
|
+
view 'new.html.erb'
|
48
|
+
view 'edit.html.erb'
|
49
|
+
view 'index.html.erb'
|
50
|
+
view 'show.html.erb'
|
51
|
+
end
|
52
|
+
|
53
|
+
# Specify some other code file that should be generated from an ERB template; use
|
54
|
+
# the :dest option is required to indicate where the generated file should go
|
55
|
+
template 'templates/other_code_file.erb', :dest => 'lib/other_code_file.rb'
|
56
|
+
|
57
|
+
# Specify some other file that should be simply copied into the target app somwhere
|
58
|
+
# the :dest option is required to indicate where the generated file should go
|
59
|
+
file 'templates/jquery/jquery-1.4.4.min.js', :dest => 'public/javascripts'
|
60
|
+
|
61
|
+
# You can use with_options recursively - both the :src and :dest options values
|
62
|
+
# will be constructed relative to the parent with_option values.
|
63
|
+
with_options :src => 'templates/jquery', :dest => 'public/javascripts' do
|
64
|
+
file 'jquery-ui-1.8.10.custom.min.js'
|
65
|
+
with_options :src => 'ui-lightness', :dest => 'ui-lightness' do
|
66
|
+
file 'jquery-ui-1.8.10.custom.css'
|
67
|
+
with_options :src => 'images', :dest => 'images' do
|
68
|
+
file 'ui-bg_diagonals-thick_18_b81900_40x40.png'
|
69
|
+
file 'ui-bg_diagonals-thick_20_666666_40x40.png'
|
70
|
+
file 'ui-bg_flat_10_000000_40x100.png'
|
71
|
+
file 'ui-bg_glass_100_f6f6f6_1x400.png'
|
72
|
+
file 'ui-bg_glass_100_fdf5ce_1x400.png'
|
73
|
+
file 'ui-bg_glass_65_ffffff_1x400.png'
|
74
|
+
file 'ui-bg_gloss-wave_35_f6a828_500x100.png'
|
75
|
+
file 'ui-bg_highlight-soft_100_eeeeee_1x100.png'
|
76
|
+
file 'ui-bg_highlight-soft_75_ffe45c_1x100.png'
|
77
|
+
file 'ui-icons_222222_256x240.png'
|
78
|
+
file 'ui-icons_228ef1_256x240.png'
|
79
|
+
file 'ui-icons_ef8c08_256x240.png'
|
80
|
+
file 'ui-icons_ffd27a_256x240.png'
|
81
|
+
end
|
82
|
+
file 'images/ui-icons_ffffff_256x240.png', :dest => 'images'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
data/spec/remote_file_spec.rb
CHANGED
@@ -1,21 +1,20 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
-
|
4
|
-
class HTTP
|
3
|
+
class MockHTTP
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
def self.set_mock_http(mock_http)
|
6
|
+
@mock_http = mock_http
|
7
|
+
end
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
end
|
9
|
+
def start
|
10
|
+
yield self
|
13
11
|
end
|
14
12
|
end
|
15
13
|
|
16
14
|
describe Scaffoldhub::RemoteFile do
|
17
15
|
|
18
16
|
FAKE_SCAFFOLDHUB_URL = 'http://fake.scaffoldhub.org:1234/scaffolds/autocomplete/spec'
|
17
|
+
FAKE_GITHUB_URL = 'https://fake.github.com/patshaughnessy/scaffolds'
|
19
18
|
|
20
19
|
describe '#remote_file_contents' do
|
21
20
|
|
@@ -23,14 +22,13 @@ describe Scaffoldhub::RemoteFile do
|
|
23
22
|
subject do
|
24
23
|
@status_proc = mock
|
25
24
|
@status_proc.expects(:call).with(FAKE_SCAFFOLDHUB_URL)
|
26
|
-
Scaffoldhub::RemoteFile.new(@status_proc)
|
25
|
+
Scaffoldhub::RemoteFile.new(FAKE_SCAFFOLDHUB_URL, @status_proc)
|
27
26
|
end
|
28
|
-
before do
|
29
|
-
subject.stubs(:url).returns(FAKE_SCAFFOLDHUB_URL)
|
30
|
-
end
|
31
|
-
|
32
27
|
it 'should call the status proc with the url' do
|
33
|
-
Net::HTTP.stubs(:
|
28
|
+
Net::HTTP.stubs(:new).returns(http = mock)
|
29
|
+
http.stubs(:start).returns(response = mock)
|
30
|
+
response.stubs(:code).returns(200)
|
31
|
+
response.stubs(:body).returns('')
|
34
32
|
subject.remote_file_contents!
|
35
33
|
end
|
36
34
|
end
|
@@ -39,44 +37,53 @@ describe Scaffoldhub::RemoteFile do
|
|
39
37
|
|
40
38
|
subject do
|
41
39
|
(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)
|
40
|
+
Scaffoldhub::RemoteFile.new(FAKE_SCAFFOLDHUB_URL, status_proc)
|
46
41
|
end
|
47
42
|
|
48
43
|
it 'should call Net::HTTP with the proper host and port' do
|
49
|
-
Net::HTTP.expects(:
|
44
|
+
Net::HTTP.expects(:new).with('fake.scaffoldhub.org', 1234).returns(http = mock)
|
45
|
+
http.stubs(:start).returns(response = mock)
|
46
|
+
response.stubs(:code).returns(200)
|
47
|
+
response.stubs(:body).returns('')
|
50
48
|
subject.remote_file_contents!
|
51
49
|
end
|
52
50
|
|
53
51
|
it 'should call GET on the url path and return the response body' do
|
54
|
-
mock_http =
|
55
|
-
mock_http.expects(:get).with('/scaffolds/autocomplete/spec').returns(
|
56
|
-
|
57
|
-
|
58
|
-
Net::HTTP.set_mock_http(mock_http)
|
52
|
+
Net::HTTP.stubs(:new).returns(mock_http = MockHTTP.new)
|
53
|
+
mock_http.expects(:get).with('/scaffolds/autocomplete/spec').returns(response = mock)
|
54
|
+
response.stubs(:code).returns(200)
|
55
|
+
response.stubs(:body).returns('RESPONSE')
|
59
56
|
subject.remote_file_contents!.should == 'RESPONSE'
|
60
57
|
end
|
61
58
|
|
62
59
|
it 'should throw a NotFoundException on 404' do
|
63
|
-
mock_http =
|
64
|
-
mock_http.expects(:get).
|
65
|
-
|
66
|
-
Net::HTTP.set_mock_http(mock_http)
|
60
|
+
Net::HTTP.stubs(:new).returns(mock_http = MockHTTP.new)
|
61
|
+
mock_http.expects(:get).returns(response = mock)
|
62
|
+
response.stubs(:code).returns(404)
|
67
63
|
lambda { subject.remote_file_contents! }.should raise_error(Scaffoldhub::NotFoundException)
|
68
64
|
end
|
69
65
|
|
70
66
|
it 'should throw a NetworkErrorException on some other error' do
|
71
|
-
mock_http =
|
72
|
-
mock_http.expects(:get).
|
73
|
-
Net::HTTP.set_mock_http(mock_http)
|
67
|
+
Net::HTTP.stubs(:new).returns(mock_http = MockHTTP.new)
|
68
|
+
mock_http.expects(:get).raises(Errno::ECONNREFUSED)
|
74
69
|
lambda { subject.remote_file_contents! }.should raise_error(Scaffoldhub::NetworkErrorException)
|
75
70
|
end
|
76
71
|
end
|
77
72
|
|
78
73
|
describe 'Net:HTTP SSL calls' do
|
79
|
-
|
74
|
+
subject do
|
75
|
+
(status_proc = mock).stubs(:call).with(FAKE_GITHUB_URL)
|
76
|
+
Scaffoldhub::RemoteFile.new(FAKE_GITHUB_URL, status_proc)
|
77
|
+
end
|
78
|
+
it 'should call Net::HTTP with the proper SSL options' do
|
79
|
+
Net::HTTP.expects(:new).with('fake.github.com', 443).returns(http = mock)
|
80
|
+
http.expects(:use_ssl=).with(true)
|
81
|
+
http.expects(:verify_mode=).with(OpenSSL::SSL::VERIFY_NONE)
|
82
|
+
http.stubs(:start).returns(response = mock)
|
83
|
+
response.stubs(:code).returns(200)
|
84
|
+
response.stubs(:body).returns('')
|
85
|
+
subject.remote_file_contents!
|
86
|
+
end
|
80
87
|
end
|
81
88
|
|
82
89
|
end
|
data/spec/scaffold_spec_spec.rb
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
+
def find_spec(scaffold_spec, type, src)
|
4
|
+
find_spec_in_array(scaffold_spec.template_file_specs, type, src)
|
5
|
+
end
|
6
|
+
|
7
|
+
def find_spec_in_array(array, type, src)
|
8
|
+
array.detect { |spec| spec[:type] == type && spec[:src] == src }
|
9
|
+
end
|
10
|
+
|
3
11
|
describe Scaffoldhub::ScaffoldSpec do
|
4
12
|
|
5
13
|
before do
|
@@ -12,41 +20,94 @@ describe Scaffoldhub::ScaffoldSpec do
|
|
12
20
|
describe 'parsing local scaffold spec' do
|
13
21
|
|
14
22
|
subject do
|
15
|
-
test_spec_path = File.join(File.dirname(__FILE__), 'fixtures', '
|
16
|
-
Scaffoldhub::ScaffoldSpec.new(test_spec_path, true, @status_proc)
|
23
|
+
test_spec_path = File.join(File.dirname(__FILE__), 'fixtures', 'test_scaffold.rb')
|
24
|
+
scaffold = Scaffoldhub::ScaffoldSpec.new(test_spec_path, true, @status_proc)
|
25
|
+
scaffold.download_and_parse!
|
26
|
+
scaffold
|
17
27
|
end
|
18
28
|
|
19
|
-
|
20
|
-
|
21
|
-
Scaffoldhub::Specification.base_url = nil
|
29
|
+
it 'should set the base_url to the scaffold specs folder' do
|
30
|
+
subject.base_url.should == File.expand_path(File.join(File.dirname(__FILE__), 'fixtures'))
|
22
31
|
end
|
23
32
|
|
24
|
-
it 'should
|
25
|
-
subject.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
33
|
+
it 'should parse the blog_post' do
|
34
|
+
subject.blog_post.should == 'http://patshaughnessy.net/2011/3/13/view-mapper-for-rails-3-scaffoldhub'
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should parse the model file' do
|
38
|
+
model_spec = subject.template_file_specs.detect { |spec| spec[:type] == :model }
|
39
|
+
find_spec(subject, :model, 'templates/model.rb').should_not be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should parse the controller file' do
|
43
|
+
find_spec(subject, :controller, 'templates/controller.rb').should_not be_nil
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should parse a view file' do
|
47
|
+
find_spec(subject, :view, 'templates/_form.html.erb').should_not be_nil
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should parse a layout file' do
|
51
|
+
find_spec(subject, :layout, 'templates/layout.erb').should_not be_nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should parse with_options and use :src as a folder for the given file' do
|
55
|
+
find_spec(subject, :view, 'templates/new.html.erb').should_not be_nil
|
56
|
+
find_spec(subject, :view, 'templates/edit.html.erb').should_not be_nil
|
57
|
+
find_spec(subject, :view, 'templates/index.html.erb').should_not be_nil
|
58
|
+
find_spec(subject, :view, 'templates/show.html.erb').should_not be_nil
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should parse a vanilla template file with a dest attribute' do
|
62
|
+
template_spec = find_spec(subject, :template, 'templates/other_code_file.erb')
|
63
|
+
template_spec.should_not be_nil
|
64
|
+
template_spec[:dest].should == 'lib/other_code_file.rb'
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should parse a normal file with a dest attribute' do
|
68
|
+
template_spec = find_spec(subject, :file, 'templates/jquery/jquery-1.4.4.min.js')
|
69
|
+
file_spec = subject.template_file_specs.detect { |spec| spec[:type] == :file }
|
70
|
+
file_spec.should_not be_nil
|
71
|
+
file_spec[:dest].should == 'public/javascripts'
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should recursively parse with_options' do
|
75
|
+
template_spec1 = find_spec(subject, :file, 'templates/jquery/jquery-ui-1.8.10.custom.min.js')
|
76
|
+
template_spec1.should_not be_nil
|
77
|
+
template_spec1[:dest].should == 'public/javascripts'
|
78
|
+
template_spec2 = find_spec(subject, :file, 'templates/jquery/ui-lightness/jquery-ui-1.8.10.custom.css')
|
79
|
+
template_spec2.should_not be_nil
|
80
|
+
template_spec2[:dest].should == 'public/javascripts/ui-lightness'
|
81
|
+
template_spec3 = find_spec(subject, :file, 'templates/jquery/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png')
|
82
|
+
template_spec3.should_not be_nil
|
83
|
+
template_spec3[:dest].should == 'public/javascripts/ui-lightness/images'
|
84
|
+
template_spec4 = find_spec(subject, :file, 'templates/jquery/ui-lightness/images/ui-icons_ffffff_256x240.png')
|
85
|
+
template_spec4.should_not be_nil
|
86
|
+
template_spec4[:dest].should == 'public/javascripts/ui-lightness/images'
|
32
87
|
end
|
33
88
|
end
|
34
89
|
|
90
|
+
|
35
91
|
describe 'parsing remote scaffold spec' do
|
36
92
|
|
93
|
+
before do
|
94
|
+
Scaffoldhub::Specification.files = []
|
95
|
+
Scaffoldhub::Specification.base_url = nil
|
96
|
+
end
|
97
|
+
|
37
98
|
TEST_YAML = <<YAML
|
38
99
|
---
|
39
100
|
:base_url: http://github.com/patshaughnessy/scaffolds/default
|
40
101
|
:files:
|
41
102
|
- :src: templates/index3.html.erb
|
42
103
|
:dest:
|
43
|
-
:type:
|
104
|
+
:type: view
|
44
105
|
- :src: templates/index2.html.erb
|
45
106
|
:dest:
|
46
107
|
:type: controller
|
47
108
|
- :src: templates/index.html.erb
|
48
109
|
:dest: app/views/welcome
|
49
|
-
:type:
|
110
|
+
:type: file
|
50
111
|
YAML
|
51
112
|
|
52
113
|
subject do
|
@@ -59,18 +120,66 @@ YAML
|
|
59
120
|
subject.expects(:remote_file_contents!).returns(TEST_YAML)
|
60
121
|
end
|
61
122
|
|
62
|
-
it 'should
|
123
|
+
it 'should parse a remote yaml scaffold' do
|
63
124
|
subject.download_and_parse!
|
64
125
|
subject.template_file_specs.should == [
|
65
|
-
{ :type => '
|
126
|
+
{ :type => 'view', :src => 'templates/index3.html.erb', :dest => nil },
|
66
127
|
{ :type => 'controller', :src => 'templates/index2.html.erb', :dest => nil },
|
67
|
-
{ :type => '
|
128
|
+
{ :type => 'file', :src => 'templates/index.html.erb', :dest => 'app/views/welcome' }
|
68
129
|
]
|
69
130
|
subject.base_url.should == 'http://github.com/patshaughnessy/scaffolds/default'
|
70
131
|
end
|
71
132
|
end
|
72
133
|
end
|
73
134
|
|
135
|
+
describe 'generating yaml' do
|
136
|
+
|
137
|
+
subject do
|
138
|
+
test_spec_path = File.join(File.dirname(__FILE__), 'fixtures', 'test_scaffold.rb')
|
139
|
+
scaffold = Scaffoldhub::ScaffoldSpec.new(test_spec_path, true, @status_proc)
|
140
|
+
scaffold.download_and_parse!
|
141
|
+
scaffold
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'should generate yaml from a scaffold spec' do
|
145
|
+
yaml = subject.to_yaml
|
146
|
+
parsed_yaml = YAML::load(yaml)
|
147
|
+
parsed_yaml[:base_url].should == 'https://github.com/your_name/your_repo/raw/master'
|
148
|
+
parsed_yaml[:blog_post].should == 'http://patshaughnessy.net/2011/3/13/view-mapper-for-rails-3-scaffoldhub'
|
149
|
+
parsed_yaml[:name].should == 'test_scaffold'
|
150
|
+
parsed_yaml[:description].should == 'The test_scaffold scaffold.'
|
151
|
+
parsed_yaml[:parameter_example].should == 'FIELD_NAME'
|
152
|
+
model_spec = find_spec_in_array(parsed_yaml[:files], :model, 'templates/model.rb')
|
153
|
+
model_spec.should_not be_nil
|
154
|
+
some_file_spec = find_spec_in_array(parsed_yaml[:files], :file, 'templates/jquery/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png')
|
155
|
+
some_file_spec.should_not be_nil
|
156
|
+
end
|
157
|
+
|
158
|
+
describe '#adjusted_base_url' do
|
159
|
+
|
160
|
+
it 'should use the raw github url when a repo root is specified' do
|
161
|
+
Scaffoldhub::Specification.base_url = 'https://github.com/your_name/your_repo'
|
162
|
+
Scaffoldhub::Specification.adjusted_base_url.should == 'https://github.com/your_name/your_repo/raw/master'
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'should use the raw github url when a repo root is specified with a trailing slash' do
|
166
|
+
Scaffoldhub::Specification.base_url = 'https://github.com/your_name/your_repo/'
|
167
|
+
Scaffoldhub::Specification.adjusted_base_url.should == 'https://github.com/your_name/your_repo/raw/master'
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'should use the raw github url when a blob url is specified' do
|
171
|
+
Scaffoldhub::Specification.base_url = 'https://github.com/patshaughnessy/scaffolds/blob/master/autocomplete/scaffold_spec.rb'
|
172
|
+
Scaffoldhub::Specification.adjusted_base_url.should == 'https://github.com/patshaughnessy/scaffolds/raw/master/autocomplete/scaffold_spec.rb'
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'should use the raw github url when a tree url is specified' do
|
176
|
+
Scaffoldhub::Specification.base_url = 'https://github.com/patshaughnessy/scaffolds/tree/master/autocomplete/scaffold_spec.rb'
|
177
|
+
Scaffoldhub::Specification.adjusted_base_url.should == 'https://github.com/patshaughnessy/scaffolds/raw/master/autocomplete/scaffold_spec.rb'
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
74
183
|
describe '#select_files' do
|
75
184
|
|
76
185
|
subject do
|
@@ -79,10 +188,10 @@ YAML
|
|
79
188
|
|
80
189
|
before do
|
81
190
|
subject.stubs(:template_file_specs).returns([
|
82
|
-
{ :type =>
|
83
|
-
{ :type =>
|
84
|
-
{ :type =>
|
85
|
-
{ :type =>
|
191
|
+
{ :type => :type1, :src => 'some_src', :dest => 'some_dest' },
|
192
|
+
{ :type => :type1, :src => 'some_src2', :dest => 'some_dest' },
|
193
|
+
{ :type => :type1, :src => 'some_src3', :dest => 'some_dest' },
|
194
|
+
{ :type => :type2, :src => 'some_src4', :dest => 'some_dest' }
|
86
195
|
])
|
87
196
|
end
|
88
197
|
|
@@ -90,7 +199,7 @@ YAML
|
|
90
199
|
Scaffoldhub::TemplateFile.expects(:new).returns(mock1 = mock)
|
91
200
|
Scaffoldhub::TemplateFile.expects(:new).returns(mock2 = mock)
|
92
201
|
Scaffoldhub::TemplateFile.expects(:new).returns(mock3 = mock)
|
93
|
-
files = subject.select_files(
|
202
|
+
files = subject.select_files(:type1)
|
94
203
|
files.include?(mock1).should be_true
|
95
204
|
files.include?(mock2).should be_true
|
96
205
|
files.include?(mock3).should be_true
|
@@ -105,27 +214,20 @@ YAML
|
|
105
214
|
|
106
215
|
before do
|
107
216
|
subject.stubs(:template_file_specs).returns([
|
108
|
-
{ :type =>
|
109
|
-
{ :type =>
|
110
|
-
{ :type => 'type1', :src => 'some_src3', :dest => 'some_dest' },
|
111
|
-
{ :type => 'type2', :src => 'some_src4', :dest => 'some_dest' }
|
217
|
+
{ :type => :type1, :src => 'some_src', :dest => 'some_dest' },
|
218
|
+
{ :type => :type2, :src => 'some_src2', :dest => 'some_dest' }
|
112
219
|
])
|
113
220
|
subject.stubs(:base_url).returns('base')
|
114
221
|
end
|
115
222
|
|
116
223
|
it 'should find the file with the given type and src' do
|
117
|
-
Scaffoldhub::TemplateFile.expects(:new).with('
|
118
|
-
subject.find_file(
|
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
|
224
|
+
Scaffoldhub::TemplateFile.expects(:new).with('some_src', 'some_dest', true, 'base', @status_proc).returns(mock1 = mock)
|
225
|
+
subject.find_file(:type1).should == mock1
|
124
226
|
end
|
125
227
|
|
126
228
|
it 'should return nil if the type is not found' do
|
127
229
|
Scaffoldhub::TemplateFile.expects(:new).never
|
128
|
-
subject.find_file(
|
230
|
+
subject.find_file(:type3).should be_nil
|
129
231
|
end
|
130
232
|
end
|
131
233
|
end
|
data/spec/template_file_spec.rb
CHANGED
@@ -19,11 +19,11 @@ describe Scaffoldhub::TemplateFile do
|
|
19
19
|
|
20
20
|
describe 'remote template file' do
|
21
21
|
|
22
|
-
|
22
|
+
FAKE_TEMPLATE_FILE_URL = 'http://github.com/patshaughnessy/scaffolds/default'
|
23
23
|
|
24
|
-
subject { Scaffoldhub::TemplateFile.new('templates/index.html', 'public', false,
|
24
|
+
subject { Scaffoldhub::TemplateFile.new('templates/index.html', 'public', false, FAKE_TEMPLATE_FILE_URL, @status_proc) }
|
25
25
|
|
26
|
-
its(:url) { should ==
|
26
|
+
its(:url) { should == FAKE_TEMPLATE_FILE_URL + '/templates/index.html' }
|
27
27
|
its(:dest) { should == File.join('public', 'index.html') }
|
28
28
|
|
29
29
|
describe '#download!' do
|
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:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
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-
|
18
|
+
date: 2011-04-29 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -83,8 +83,8 @@ dependencies:
|
|
83
83
|
description: Run Rails scaffold generator with customized templates downloaded from scaffoldhub.org
|
84
84
|
email:
|
85
85
|
- pat@patshaughnessy.net
|
86
|
-
executables:
|
87
|
-
|
86
|
+
executables:
|
87
|
+
- scaffoldhub
|
88
88
|
extensions: []
|
89
89
|
|
90
90
|
extra_rdoc_files: []
|
@@ -95,24 +95,29 @@ files:
|
|
95
95
|
- Gemfile.lock
|
96
96
|
- README.rdoc
|
97
97
|
- Rakefile
|
98
|
+
- bin/scaffoldhub
|
98
99
|
- lib/generators/active_record/scaffoldhub_generator.rb
|
99
100
|
- lib/generators/erb/scaffoldhub_generator.rb
|
101
|
+
- lib/generators/new_scaffoldhub/new_scaffoldhub_generator.rb
|
102
|
+
- lib/generators/new_scaffoldhub/templates/scaffold_spec.rb.erb
|
103
|
+
- lib/generators/new_scaffoldhub/templates/screenshot.png
|
100
104
|
- lib/generators/scaffold_controller/scaffoldhub_generator.rb
|
101
105
|
- lib/generators/scaffoldhub/scaffoldhub_generator.rb
|
102
106
|
- lib/scaffoldhub.rb
|
103
107
|
- lib/scaffoldhub/helper.rb
|
104
108
|
- lib/scaffoldhub/remote_file.rb
|
109
|
+
- lib/scaffoldhub/runner.rb
|
105
110
|
- lib/scaffoldhub/scaffold_spec.rb
|
106
111
|
- lib/scaffoldhub/specification.rb
|
107
112
|
- lib/scaffoldhub/template_file.rb
|
108
113
|
- scaffoldhub.gemspec
|
109
|
-
- spec/fixtures/
|
114
|
+
- spec/fixtures/local_template_file.txt
|
115
|
+
- spec/fixtures/test_scaffold.rb
|
110
116
|
- spec/helper_spec.rb
|
111
117
|
- spec/remote_file_spec.rb
|
112
118
|
- spec/scaffold_spec_spec.rb
|
113
119
|
- spec/spec_helper.rb
|
114
120
|
- spec/template_file_spec.rb
|
115
|
-
- util/spec_to_yaml.rb
|
116
121
|
has_rdoc: true
|
117
122
|
homepage: http://scaffoldhub.org
|
118
123
|
licenses: []
|
@@ -148,7 +153,8 @@ signing_key:
|
|
148
153
|
specification_version: 3
|
149
154
|
summary: Generate customized Rails scaffolding from scaffoldhub.org
|
150
155
|
test_files:
|
151
|
-
- spec/fixtures/
|
156
|
+
- spec/fixtures/local_template_file.txt
|
157
|
+
- spec/fixtures/test_scaffold.rb
|
152
158
|
- spec/helper_spec.rb
|
153
159
|
- spec/remote_file_spec.rb
|
154
160
|
- spec/scaffold_spec_spec.rb
|
@@ -1,21 +0,0 @@
|
|
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
|