hoboken 0.0.1.beta → 0.0.1.beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3f1a0724865d4b6998165c52a8e631a96f43f636
4
- data.tar.gz: e76a4320fb46db77356346d6d5fa905c7c9b0f13
3
+ metadata.gz: d93ed494dde1289a45fcfb75ffa80285d0995020
4
+ data.tar.gz: cd9319eef83037bf07083d0cc0740fc94fc0b415
5
5
  SHA512:
6
- metadata.gz: bd597e454af06c4981761c4d46541d67c54febbd53defb223d07ff958f8df5f0b3357f667ae0577f201bc5d5f84d4743cae1f4fed8084039707b52b4c77b6f51
7
- data.tar.gz: 15ae3353f633cbcbbb1b362381809beb38729d7df2aa26b4f5e6302083bb3fb7f6297e50022959915890c4420b87f72892609cba0efafa02ed058e5c7751c507
6
+ metadata.gz: 2b4f2c2ccccb2ac0fecd1e76236fe52669478facb48a61d0791ab574fac940001e0dfa7f3b9127d4436d3b323010968432a86e72cb4844df6bce31cb405bb2f0
7
+ data.tar.gz: 6019310cb5cdb8005948b4ed8a9b5fc275a2c927ba40a771a9c3a72fa13881db4891339964b67f2f87c3a95aef779d308e743161d8959cf4437d3155bd19c645
data/README.md CHANGED
@@ -38,9 +38,10 @@ To see a list of options for the generate command:
38
38
 
39
39
  Additional generators are available for existing projects generated using Hoboken:
40
40
 
41
- $ hoboken add:metrics # Add Rake tasks for metrics (flog, flay, simplecov)
42
- $ hoboken add:i18n # Internationalization support using sinatra-r18n
43
41
  $ hoboken add:heroku # Heroku deployment support
42
+ $ hoboken add:i18n # Internationalization support using sinatra-r18n
43
+ $ hoboken add:metrics # Add metrics (flog, flay, simplecov)
44
+ $ hoboken add:omniauth # OmniAuth authentication (allows you to select a provider)
44
45
  $ hoboken add:sprockets # Rack-based asset packaging system
45
46
 
46
47
  ## Contributing
data/Rakefile CHANGED
@@ -1 +1,11 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ task :default => "test:unit"
5
+
6
+ namespace :test do
7
+ Rake::TestTask.new(:unit) do |t|
8
+ t.libs << 'test/unit'
9
+ t.test_files = Dir["test/unit/**/*_test.rb"]
10
+ end
11
+ end
@@ -3,10 +3,122 @@ require "thor/util"
3
3
  require "fileutils"
4
4
  require_relative "hoboken/version"
5
5
  require_relative "hoboken/generate"
6
+ require_relative "hoboken/actions"
6
7
 
7
8
  module Hoboken
9
+ class OmniAuth < Thor::Group
10
+ include Thor::Actions
11
+ include Hoboken::Actions
12
+
13
+ attr_reader :provider
14
+
15
+ def self.source_root
16
+ File.dirname(__FILE__)
17
+ end
18
+
19
+ def add_gem
20
+ @provider = ask("Specify a provider (i.e. twitter, facebook. etc.): ").downcase
21
+ provider_version = ask("Specify provider version: ")
22
+ gem gem_name, provider_version
23
+ end
24
+
25
+ def setup_middleware
26
+ insert_into_file("app.rb", after: /require "sinatra("|\/base")/) do
27
+ "\nrequire \"#{gem_name}\""
28
+ end
29
+
30
+ snippet = <<-CODE
31
+
32
+ use OmniAuth::Builder do
33
+ provider :#{provider}, ENV["#{provider.upcase}_KEY"], ENV["#{provider.upcase}_SECRET"]
34
+ end
35
+
36
+ CODE
37
+
38
+ text = modular? ? indent(snippet, 4) : snippet
39
+ insert_into_file("app.rb", after: /use Rack::Session::Cookie.+\n/) { text }
40
+ end
41
+
42
+ def add_routes
43
+ routes = <<-CODE
44
+
45
+
46
+ get "/login" do
47
+ '<a href="/auth/#{provider}">Login</a>'
48
+ end
49
+
50
+ get "/auth/:provider/callback" do
51
+ # TODO: Insert real authentication logic...
52
+ MultiJson.encode(request.env['omniauth.auth'])
53
+ end
54
+
55
+ get "/auth/failure" do
56
+ # TODO: Insert real error handling logic...
57
+ halt 401, params[:message]
58
+ end
59
+ CODE
60
+
61
+ if modular?
62
+ insert_into_file("app.rb", after: /get.+?end$/m) { indent(routes, 4) }
63
+ else
64
+ append_file("app.rb", routes)
65
+ end
66
+ end
67
+
68
+ def add_tests
69
+ inject_into_class("test/unit/app_test.rb", "AppTest") do
70
+ <<-CODE
71
+ setup do
72
+ OmniAuth.config.test_mode = true
73
+ end
74
+
75
+ test "GET /login" do
76
+ get "/login"
77
+ assert_equal('<a href="/auth/#{provider}">Login</a>', last_response.body)
78
+ end
79
+
80
+ test "GET /auth/#{provider}/callback" do
81
+ auth_hash = {
82
+ "provider" => "#{provider}",
83
+ "uid" => "123545",
84
+ "info" => {
85
+ "name" => "John Doe"
86
+ }
87
+ }
88
+
89
+ OmniAuth.config.mock_auth[:#{provider}] = auth_hash
90
+ get "/auth/fitbit/callback"
91
+ assert_equal(MultiJson.encode(auth_hash), last_response.body)
92
+ end
93
+
94
+ test "GET /auth/failure" do
95
+ OmniAuth.config.mock_auth[:#{provider}] = :invalid_credentials
96
+ get "/auth/failure"
97
+ assert_response :not_authorized
98
+ end
99
+
100
+ CODE
101
+ end
102
+ end
103
+
104
+ def reminders
105
+ say "\nGemfile updated... don't forget to 'bundle install'"
106
+ end
107
+
108
+ private
109
+
110
+ def gem_name
111
+ "omniauth-#{provider}"
112
+ end
113
+
114
+ def modular?
115
+ @modular ||= File.readlines("app.rb").grep(/Sinatra::Base/).any?
116
+ end
117
+ end
118
+
8
119
  class Sprockets < Thor::Group
9
120
  include Thor::Actions
121
+ include Hoboken::Actions
10
122
 
11
123
  def self.source_root
12
124
  File.dirname(__FILE__)
@@ -19,9 +131,9 @@ module Hoboken
19
131
  end
20
132
 
21
133
  def add_gems
22
- append_file("Gemfile", "\ngem \"sprockets\", \"~> 2.10.0\", group: :assets")
23
- append_file("Gemfile", "\ngem \"uglifier\", \"~> 2.1.1\", group: :assets")
24
- append_file("Gemfile", "\ngem \"yui-compressor\", \"~> 0.9.6\", group: :assets")
134
+ gem "sprockets", "2.10.0", group: :assets
135
+ gem "uglifier", "2.1.1", group: :assets
136
+ gem "yui-compressor", "0.9.6", group: :assets
25
137
  end
26
138
 
27
139
  def copy_sprockets_helpers
@@ -107,13 +219,14 @@ TEXT
107
219
 
108
220
  class Heroku < Thor::Group
109
221
  include Thor::Actions
222
+ include Hoboken::Actions
110
223
 
111
224
  def self.source_root
112
225
  File.dirname(__FILE__)
113
226
  end
114
227
 
115
228
  def add_gem
116
- append_file("Gemfile", "\ngem \"foreman\", \"~> 0.63.0\", group: :development")
229
+ gem "foreman", "0.63.0", group: :development
117
230
  end
118
231
 
119
232
  def procfile
@@ -157,13 +270,14 @@ TASK
157
270
 
158
271
  class Internationalization < Thor::Group
159
272
  include Thor::Actions
273
+ include Hoboken::Actions
160
274
 
161
275
  def self.source_root
162
276
  File.dirname(__FILE__)
163
277
  end
164
278
 
165
279
  def add_gem
166
- append_file("Gemfile", "\ngem \"sinatra-r18n\", \"~> 1.1.5\"")
280
+ gem "sinatra-r18n", "1.1.5"
167
281
  insert_into_file("app.rb", after: /require "sinatra("|\/base")/) do
168
282
  "\nrequire \"sinatra/r18n\""
169
283
  end
@@ -184,15 +298,16 @@ TASK
184
298
 
185
299
  class Metrics < Thor::Group
186
300
  include Thor::Actions
301
+ include Hoboken::Actions
187
302
 
188
303
  def self.source_root
189
304
  File.dirname(__FILE__)
190
305
  end
191
306
 
192
307
  def add_gems
193
- append_file("Gemfile", "\ngem \"flog\", \"~> 2.5.3\", group: :test")
194
- append_file("Gemfile", "\ngem \"flay\", \"~> 1.4.3\", group: :test")
195
- append_file("Gemfile", "\ngem \"simplecov\", \"~> 0.7.1\", require: false, group: :test")
308
+ gem "flog", "2.5.3", group: :test
309
+ gem "flay", "1.4.3", group: :test
310
+ gem "simplecov", "0.7.1", require: false, group: :test
196
311
  end
197
312
 
198
313
  def copy_task_templates
@@ -231,6 +346,7 @@ CODE
231
346
  register(Metrics, "add:metrics", "add:metrics", "Add metrics (flog, flay, simplecov)")
232
347
  register(Internationalization, "add:i18n", "add:i18n", "Internationalization support using sinatra-r18n")
233
348
  register(Heroku, "add:heroku", "add:heroku", "Heroku deployment support")
349
+ register(OmniAuth, "add:omniauth", "add:omniauth", "OmniAuth authentication (allows you to select a provider)")
234
350
  register(Sprockets, "add:sprockets", "add:sprockets", "Rack-based asset packaging system")
235
351
  end
236
352
  end
@@ -0,0 +1,16 @@
1
+ module Hoboken
2
+ module Actions
3
+ def gem(name, version, opts={})
4
+ verbose = opts.has_key?(:verbose) ? opts.delete(:verbose) : true
5
+
6
+ parts = [name.inspect, "~> #{version}".inspect]
7
+ opts.each { |k, v| parts << "#{k}: #{v.inspect}" }
8
+
9
+ append_file("Gemfile", "\ngem #{parts.join(", ")}", verbose: verbose)
10
+ end
11
+
12
+ def indent(text, num_spaces)
13
+ text.gsub(/^/, 1.upto(num_spaces).map { |n| " " }.join)
14
+ end
15
+ end
16
+ end
@@ -29,6 +29,30 @@ module Rack::Test::Assertions
29
29
  end
30
30
  end
31
31
 
32
+ def assert_has_session(message=nil)
33
+ msg = build_message(message, "expected a valid session")
34
+ assert_block(msg) do
35
+ last_request.env["rack.session"]
36
+ end
37
+ end
38
+
39
+ def assert_session_has_key(key, message=nil)
40
+ assert_has_session
41
+ msg = build_message(message, "expected session to have key named <?>", key)
42
+ assert_block(msg) do
43
+ last_request.env["rack.session"].keys.include?(key)
44
+ end
45
+ end
46
+
47
+ def assert_session(key, expected, message=nil)
48
+ assert_session_has_key(key)
49
+ actual = last_request.env["rack.session"][key]
50
+ msg = build_message(message, "expected session key <?> to be <?>, but was <?>", key, expected, actual)
51
+ assert_block(msg) do
52
+ expected == actual
53
+ end
54
+ end
55
+
32
56
  def assert_response(expected, message=nil)
33
57
  status = last_response.status
34
58
  msg = build_message(
@@ -1,4 +1,4 @@
1
- require "test_helper"
1
+ require_relative "test_helper"
2
2
 
3
3
  class AppTest < Rack::Test::TestCase
4
4
  test "GET /" do
@@ -1,3 +1,3 @@
1
1
  module Hoboken
2
- VERSION = "0.0.1.beta"
2
+ VERSION = "0.0.1.beta2"
3
3
  end
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+ ruby "2.0.0"
3
+
4
+ gem "sinatra", "~> 1.4.4", require: false, group: [:test, :development]
@@ -0,0 +1,2 @@
1
+ source "https://rubygems.org"
2
+ ruby "2.0.0"
@@ -0,0 +1,129 @@
1
+ require "test/unit"
2
+ require_relative "../../lib/hoboken/actions.rb"
3
+
4
+ module Hoboken
5
+ require "thor"
6
+ class Target < Thor::Group
7
+ include Thor::Actions
8
+ include Hoboken::Actions
9
+ end
10
+
11
+ class GemActionsTest < Test::Unit::TestCase
12
+ attr_reader :gemfile_path, :gemfile, :target
13
+
14
+ def setup
15
+ @gemfile_path = File.join("test", "fixtures")
16
+ @gemfile = File.join(gemfile_path, "Gemfile")
17
+ @target = Target.new([], {}, destination_root: gemfile_path)
18
+ FileUtils.copy(File.join(gemfile_path, "Gemfile.pristine"), gemfile)
19
+ end
20
+
21
+ def test_gem_appends_to_gemfile
22
+ target.gem "sinatra", "1.4.4", verbose: false
23
+ expected =
24
+ "source \"https://rubygems.org\"\n" +
25
+ "ruby \"2.0.0\"\n\n" +
26
+ "gem \"sinatra\", \"~> 1.4.4\""
27
+
28
+ assert_equal(expected, File.read(gemfile))
29
+ end
30
+
31
+ def test_gem_with_group
32
+ target.gem "sinatra", "1.4.4", group: :test, verbose: false
33
+ expected =
34
+ "source \"https://rubygems.org\"\n" +
35
+ "ruby \"2.0.0\"\n\n" +
36
+ "gem \"sinatra\", \"~> 1.4.4\", group: :test"
37
+
38
+ assert_equal(expected, File.read(gemfile))
39
+ end
40
+
41
+ def test_gem_with_multiple_groups
42
+ target.gem "sinatra", "1.4.4", group: [:test, :development], verbose: false
43
+ expected =
44
+ "source \"https://rubygems.org\"\n" +
45
+ "ruby \"2.0.0\"\n\n" +
46
+ "gem \"sinatra\", \"~> 1.4.4\", group: [:test, :development]"
47
+
48
+ assert_equal(expected, File.read(gemfile))
49
+ end
50
+
51
+ def test_gem_with_require
52
+ target.gem "sinatra", "1.4.4", require: false, verbose: false
53
+ expected =
54
+ "source \"https://rubygems.org\"\n" +
55
+ "ruby \"2.0.0\"\n\n" +
56
+ "gem \"sinatra\", \"~> 1.4.4\", require: false"
57
+
58
+ assert_equal(expected, File.read(gemfile))
59
+ end
60
+
61
+ def test_gem_with_require_and_group
62
+ target.gem "sinatra", "1.4.4", require: false, group: :test, verbose: false
63
+ expected =
64
+ "source \"https://rubygems.org\"\n" +
65
+ "ruby \"2.0.0\"\n\n" +
66
+ "gem \"sinatra\", \"~> 1.4.4\", require: false, group: :test"
67
+
68
+ assert_equal(expected, File.read(gemfile))
69
+ end
70
+
71
+ def test_gem_with_require_and_multiple_groups
72
+ target.gem "sinatra", "1.4.4", require: false, group: [:test, :development], verbose: false
73
+ expected =
74
+ "source \"https://rubygems.org\"\n" +
75
+ "ruby \"2.0.0\"\n\n" +
76
+ "gem \"sinatra\", \"~> 1.4.4\", require: false, group: [:test, :development]"
77
+
78
+ assert_equal(expected, File.read(gemfile))
79
+ end
80
+
81
+ def test_gem_multiple
82
+ target.gem "sinatra", "1.4.4", verbose: false
83
+ target.gem "thin", "1.4.4", verbose: false
84
+ expected =
85
+ "source \"https://rubygems.org\"\n" +
86
+ "ruby \"2.0.0\"\n\n" +
87
+ "gem \"sinatra\", \"~> 1.4.4\"\n" +
88
+ "gem \"thin\", \"~> 1.4.4\""
89
+
90
+ assert_equal(expected, File.read(gemfile))
91
+ end
92
+ end
93
+
94
+ class IndentActionsTest < Test::Unit::TestCase
95
+ attr_reader :text, :target
96
+
97
+ def setup
98
+ @target = Target.new
99
+ @text = <<-TEXT
100
+
101
+ This is some
102
+ text that needs
103
+ to be indented.
104
+ TEXT
105
+ end
106
+
107
+ def test_indent_with_one_space
108
+ expected = <<-TEXT
109
+
110
+ This is some
111
+ text that needs
112
+ to be indented.
113
+ TEXT
114
+
115
+ assert_equal(expected, target.indent(text, 1))
116
+ end
117
+
118
+ def test_indent_with_two_spaces
119
+ expected = <<-TEXT
120
+
121
+ This is some
122
+ text that needs
123
+ to be indented.
124
+ TEXT
125
+
126
+ assert_equal(expected, target.indent(text, 2))
127
+ end
128
+ end
129
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hoboken
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.beta
4
+ version: 0.0.1.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bob Nadler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-23 00:00:00.000000000 Z
11
+ date: 2014-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -68,6 +68,7 @@ files:
68
68
  - bin/hoboken
69
69
  - hoboken.gemspec
70
70
  - lib/hoboken.rb
71
+ - lib/hoboken/actions.rb
71
72
  - lib/hoboken/generate.rb
72
73
  - lib/hoboken/templates/Gemfile.erb.tt
73
74
  - lib/hoboken/templates/README.md.tt
@@ -91,6 +92,9 @@ files:
91
92
  - lib/hoboken/templates/views/index.erb.tt
92
93
  - lib/hoboken/templates/views/layout.erb.tt
93
94
  - lib/hoboken/version.rb
95
+ - test/fixtures/Gemfile
96
+ - test/fixtures/Gemfile.pristine
97
+ - test/unit/hoboken_actions_test.rb
94
98
  homepage: https://github.com/bnadlerjr/hoboken
95
99
  licenses:
96
100
  - MIT
@@ -115,4 +119,7 @@ rubygems_version: 2.0.3
115
119
  signing_key:
116
120
  specification_version: 4
117
121
  summary: Sinatra project generator.
118
- test_files: []
122
+ test_files:
123
+ - test/fixtures/Gemfile
124
+ - test/fixtures/Gemfile.pristine
125
+ - test/unit/hoboken_actions_test.rb