hancock 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -27,7 +27,6 @@ Your Rackup File
27
27
  ================
28
28
  # thin start -p PORT -R config.ru
29
29
  require 'rubygems'
30
- gem 'sinatra', '~>0.9.1.1'
31
30
  require 'hancock'
32
31
  gem 'atmos-sinatra-ditties', '~>0.0.3'
33
32
  require 'sinatra/ditties'
@@ -107,7 +106,6 @@ Here's how you setup most frameworks as consumers. In a production environment
107
106
 
108
107
  Possibilities
109
108
  =============
110
- * single sign off
111
109
  * some kinda awesome [oauth][oauth] hooks
112
110
 
113
111
  Sponsored By
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'spec/rake/spectask'
6
6
  require 'cucumber/rake/task'
7
7
 
8
8
  GEM = "hancock"
9
- GEM_VERSION = "0.0.6"
9
+ GEM_VERSION = "0.0.7"
10
10
  AUTHOR = ["Corey Donohoe", "Tim Carey-Smith"]
11
11
  EMAIL = [ "atmos@atmos.org", "tim@spork.in" ]
12
12
  HOMEPAGE = "http://github.com/atmos/hancock"
@@ -25,18 +25,27 @@ spec = Gem::Specification.new do |s|
25
25
  s.homepage = HOMEPAGE
26
26
 
27
27
  # Uncomment this to add a dependency
28
- s.add_dependency "dm-core", "~>0.9.10"
29
- s.add_dependency "ruby-openid", "~>2.1.2"
30
- s.add_dependency "sinatra", "~>0.9.1.1"
31
- s.add_dependency "guid", "~>0.1.1"
28
+ s.add_dependency "ruby-openid", "~>2.1.4"
29
+ s.add_dependency "sinatra", "~>0.9.2"
30
+ s.add_dependency "haml", "~>2.0.9"
31
+ s.add_dependency "guid", "~>0.1.1"
32
+
33
+ s.add_dependency "dm-core", "~>0.9.11"
34
+ s.add_dependency "dm-types", "~>0.9.11"
35
+ s.add_dependency "dm-timestamps", "~>0.9.11"
36
+ s.add_dependency "dm-validations", "~>0.9.11"
32
37
 
33
38
  s.require_path = 'lib'
34
39
  s.autorequire = GEM
35
- s.files = %w(LICENSE README.md Rakefile) + Dir.glob("{lib,spec}/**/*")
40
+ s.files = %w(LICENSE README.md Rakefile) + Dir.glob("{features,lib,spec}/**/*")
36
41
  end
37
42
 
38
43
  task :default => [:spec, :features]
39
44
 
45
+ task :development_deps do |t|
46
+ system("sudo gem install webrat rack-test do_sqlite3")
47
+ end
48
+
40
49
  desc "Run specs"
41
50
  Spec::Rake::SpecTask.new do |t|
42
51
  t.spec_files = FileList['spec/**/*_spec.rb']
@@ -63,10 +72,8 @@ end
63
72
  Cucumber::Rake::Task.new(:features) do |t|
64
73
  t.libs << 'lib'
65
74
  t.cucumber_opts = "--format pretty"
66
- t.step_list = 'spec/features/**/*.rb'
67
- t.feature_list = 'spec/features/**/*.feature'
68
75
  t.rcov = true
69
76
  t.rcov_opts << '--text-summary'
70
77
  t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
71
- t.rcov_opts << '--exclude' << '.gem/,spec,examples'
78
+ t.rcov_opts << '--exclude' << '.gem/,spec,features,examples'
72
79
  end
@@ -21,9 +21,9 @@ Feature: Logging In to an SSO Account
21
21
  When I request authentication
22
22
  Then I should see the login form
23
23
  When I login
24
- Then I should be redirected to the sso provider root on login
24
+ Then I should see a list of consumers
25
25
  Scenario: logging in with a bad return_to cookie set
26
26
  Given a valid consumer and user exists
27
27
  Then I login
28
28
  When I request the login page
29
- Then I should be redirected to the sso provider root
29
+ Then I should see a list of consumers
@@ -23,4 +23,3 @@ Feature: Signing Up for an SSO Account
23
23
  When I signup with valid info
24
24
  Then I should receive a registration url via email
25
25
  When I hit the registration url and provide a password
26
- Then I should be redirected to the sso provider root
File without changes
@@ -1,12 +1,13 @@
1
1
  Given /^a valid consumer and user exists$/ do
2
2
  @consumer = ::Hancock::Consumer.gen(:internal)
3
3
  @user = ::Hancock::User.gen
4
- get '/sso/logout' # log us out if we're logged in
5
4
  end
6
5
 
7
6
  Then /^I login$/ do
8
- post "/sso/login", :email => @user.email,
9
- :password => @user.password
7
+ fill_in :email, :with => @user.email
8
+ fill_in :password, :with => @user.password
9
+
10
+ click_button 'Login'
10
11
  end
11
12
 
12
13
  Then /^I should be redirected to the consumer app to start the handshake$/ do
@@ -16,21 +17,14 @@ Then /^I should be redirected to the consumer app to start the handshake$/ do
16
17
  redirection.query_values['id'].to_i.should eql(@user.id)
17
18
  end
18
19
 
19
- Then /^I should be redirected to the sso provider root on login$/ do
20
- last_response.headers['Location'].should eql('/')
21
- follow_redirect!
22
- end
23
-
24
20
  When /^I request the landing page$/ do
25
- get '/'
21
+ visit '/'
26
22
  end
27
23
 
28
24
  Then /^I should see a list of consumers$/ do
29
- last_response.headers['Location'].should eql('/')
30
- follow_redirect!
25
+ last_response.should have_selector("h3:contains('#{@user.first_name} #{@user.last_name}')")
31
26
  end
32
27
 
33
28
  When /^I request the login page$/ do
34
- get '/sso/login'
35
- pp last_response
29
+ visit '/sso/login'
36
30
  end
@@ -2,7 +2,6 @@ Given /^I am not logged in on the sso provider$/ do
2
2
  @user = Hancock::User.new(:email => /\w+@\w+\.\w{2,3}/.gen.downcase,
3
3
  :first_name => /\w+/.gen.capitalize,
4
4
  :last_name => /\w+/.gen.capitalize)
5
- get "/sso/logout"
6
5
  end
7
6
 
8
7
  Given /^a valid consumer exists$/ do
@@ -10,11 +9,11 @@ Given /^a valid consumer exists$/ do
10
9
  end
11
10
 
12
11
  Given /^I request authentication$/ do
13
- get "/sso/login"
12
+ visit "/sso/login"
14
13
  end
15
14
 
16
15
  Given /^I request authentication returning to the consumer app$/ do
17
- get "/sso/login?return_to=#{@consumer.url}"
16
+ visit "/sso/login?return_to=#{@consumer.url}"
18
17
  end
19
18
 
20
19
  Then /^I should see the login form$/ do
@@ -22,7 +21,7 @@ Then /^I should see the login form$/ do
22
21
  end
23
22
 
24
23
  Given /^I click signup$/ do
25
- get "/sso/signup"
24
+ visit "/sso/signup"
26
25
  end
27
26
 
28
27
  Then /^I should see the signup form$/ do
@@ -30,10 +29,11 @@ Then /^I should see the signup form$/ do
30
29
  end
31
30
 
32
31
  Given /^I signup with valid info$/ do
33
- post "/sso/signup", 'email' => @user.email,
34
- 'first_name' => @user.first_name,
35
- 'last_name' => @user.last_name
36
- last_response.status.should eql(200)
32
+ fill_in :email, :with => @user.email
33
+ fill_in :first_name, :with => @user.first_name
34
+ fill_in :last_name, :with => @user.last_name
35
+
36
+ click_button 'Signup'
37
37
  end
38
38
 
39
39
  Then /^I should receive a registration url via email$/ do
@@ -42,13 +42,12 @@ Then /^I should receive a registration url via email$/ do
42
42
  end
43
43
 
44
44
  Given /^I hit the registration url and provide a password$/ do
45
- get @confirmation_url
46
- post @confirmation_url, 'user[password]' => @user.password,
47
- 'used[password_confirmation]' => @user.password
48
- end
45
+ visit @confirmation_url
46
+
47
+ fill_in :password, :with => @user.password
48
+ fill_in :password_confirmation, :with => @user.password
49
49
 
50
- Then /^I should be redirected to the sso provider root$/ do
51
- last_response.headers['Location'].should eql('/')
50
+ click_button 'Am I Done Yet?'
52
51
  end
53
52
 
54
53
  Then /^I should be redirected to the consumer app$/ do
@@ -1,7 +1,6 @@
1
1
  When /^I am logged in on the sso provider$/ do
2
2
  @identity_url = "http://example.org/sso/users/#{@user.id}"
3
- post "/sso/login", :email => @user.email,
4
- :password => @user.password
3
+ Then "I login"
5
4
  end
6
5
 
7
6
  When /^I request the sso page with a checkid mode of checkIDSetup$/ do
@@ -1,8 +1,6 @@
1
- require File.expand_path(File.dirname(__FILE__)+'/../../spec_helper')
1
+ require File.expand_path(File.dirname(__FILE__)+'/../../spec/spec_helper')
2
2
  require 'haml'
3
3
 
4
- Hancock::App.set :environment, :development
5
-
6
4
  World do
7
5
  def app
8
6
  @app = Rack::Builder.new do
@@ -14,3 +12,13 @@ World do
14
12
  include Webrat::Matchers
15
13
  include Hancock::Matchers
16
14
  end
15
+
16
+ class Webrat::Field
17
+ def escaped_value
18
+ @value.to_s
19
+ end
20
+ end
21
+
22
+ Before do
23
+ visit '/sso/logout' # log us out if we're logged in
24
+ end
@@ -1,26 +1,27 @@
1
1
  require 'rubygems'
2
2
 
3
- gem 'dm-core', '~>0.9.10'
3
+ gem 'dm-core', '~>0.9.11'
4
4
  require 'dm-core'
5
5
  require 'dm-validations'
6
6
  require 'dm-timestamps'
7
7
 
8
- gem 'ruby-openid', '~>2.1.2'
8
+ gem 'ruby-openid', '~>2.1.4'
9
9
  require 'openid'
10
10
  require 'openid/store/filesystem'
11
11
  require 'openid/extensions/sreg'
12
12
 
13
- gem 'sinatra', '~>0.9.1.1'
13
+ gem 'sinatra', '~>0.9.2'
14
14
  require 'sinatra/base'
15
-
16
- gem 'sinatra-ditties', '~>0.0.3'
17
- require 'sinatra/ditties'
15
+ gem 'haml'
16
+ require 'haml/engine'
17
+ require 'sass'
18
18
 
19
19
  gem 'guid', '~>0.1.1'
20
20
  require 'guid'
21
21
 
22
22
  module Hancock; end
23
23
 
24
+ require File.expand_path(File.dirname(__FILE__)+'/mailer')
24
25
  require File.expand_path(File.dirname(__FILE__)+'/models/user')
25
26
  require File.expand_path(File.dirname(__FILE__)+'/models/consumer')
26
27
  require File.expand_path(File.dirname(__FILE__)+'/sinatra/hancock/defaults')
@@ -44,4 +45,3 @@ module Hancock
44
45
  register Sinatra::Hancock::OpenIDServer
45
46
  end
46
47
  end
47
-
@@ -0,0 +1,155 @@
1
+ # Shamelssly stolen from Merb::Mailer
2
+ # http://merbivore.com
3
+
4
+ require 'net/smtp'
5
+ require 'mailfactory'
6
+ require 'tlsmail'
7
+
8
+ Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)
9
+
10
+ class MailFactory
11
+ attr_reader :html, :text
12
+ end
13
+
14
+ module Sinatra
15
+ # = Sinatra::Mailer
16
+ #
17
+ # Adds an #email method to your email handlers, that receives a hash of
18
+ # values to create your email.
19
+ #
20
+ # For example:
21
+ #
22
+ # post "/signup" do
23
+ # # sign up the user, and then:
24
+ # email :to => @user.email,
25
+ # :from => "awesomeness@example.com",
26
+ # :subject => "Welcome to Awesomeness!",
27
+ # :body => haml(:some_template)
28
+ # end
29
+ #
30
+ # == Configuration
31
+ #
32
+ # This plugin is very dirty yet :) Since it's just a port to Sinatra of
33
+ # Merb::Mailer[merbivore.com/documentation/1.0/doc/rdoc/merb-mailer-1.0].
34
+ # So the configuration is not Sinatra-y, yet. But we'll get to that.
35
+ #
36
+ # == Using SMTP
37
+ #
38
+ # Sinatra::Mailer.config = {
39
+ # :host => 'smtp.yourserver.com',
40
+ # :port => '25',
41
+ # :user => 'user',
42
+ # :pass => 'pass',
43
+ # :auth => :plain # :plain, :login, :cram_md5, the default is no auth
44
+ # :domain => "localhost.localdomain" # HELO domain provided by the client
45
+ # }
46
+ #
47
+ # == Using Gmail SMTP
48
+ #
49
+ # You need smtp-tls[http://github.com/ambethia/smtp-tls], a gem that improves
50
+ # Net::HTTP to add support for secure servers such as Gmail.
51
+ #
52
+ # require "smtp-tls"
53
+ #
54
+ # Sinatra::Mailer.config = {
55
+ # :host => 'smtp.gmail.com',
56
+ # :port => '587',
57
+ # :user => 'user@gmail.com',
58
+ # :pass => 'pass',
59
+ # :auth => :plain
60
+ # }
61
+ #
62
+ # Make sure that when you call your #email method you pass the
63
+ # +:text+ option and not +:body+.
64
+ #
65
+ # == Using sendmail
66
+ #
67
+ # Sinatra::Mailer.config = {:sendmail_path => '/somewhere/odd'}
68
+ # Sinatra::Mailer.delivery_method = :sendmail
69
+ #
70
+ # == Credits
71
+ #
72
+ # This has been blatantly adapted from
73
+ # Merb::Mailer[merbivore.com/documentation/1.0/doc/rdoc/merb-mailer-1.0]
74
+ # so all credit is theirs, I just ported it to Sinatra.
75
+ module Mailer
76
+ class << self
77
+ attr_accessor :config, :delivery_method
78
+ end
79
+
80
+ def email(mail_options={})
81
+ Email.new(mail_options).deliver!
82
+ end
83
+
84
+ class Email
85
+ attr_accessor :mail, :config
86
+ def self.deliveries=(value)
87
+ @deliveries = value
88
+ end
89
+ def self.deliveries
90
+ @deliveries ||= [ ]
91
+ end
92
+
93
+ # Sends the mail using sendmail.
94
+ def sendmail
95
+ sendmail = IO.popen("#{config[:sendmail_path]} #{@mail.to}", 'w+')
96
+ sendmail.puts @mail.to_s
97
+ sendmail.close
98
+ end
99
+
100
+ # Sends the mail using SMTP.
101
+ def net_smtp
102
+ Net::SMTP.start(config[:host], config[:port].to_i, config[:domain],
103
+ config[:user], config[:pass], config[:auth]) { |smtp|
104
+ smtp.send_message(@mail.to_s, @mail.from.first, @mail.to.to_s.split(/[,;]/))
105
+ }
106
+ end
107
+
108
+ def test_send
109
+ self.class.deliveries << @mail
110
+ end
111
+
112
+ # Delivers the mail with the specified delivery method, defaulting to
113
+ # net_smtp.
114
+ def deliver!
115
+ send(Mailer.delivery_method || :net_smtp)
116
+ end
117
+
118
+ # ==== Parameters
119
+ # file_or_files<File, Array[File]>:: File(s) to attach.
120
+ # filename<String>::
121
+ # type<~to_s>::
122
+ # The attachment MIME type. If left out, it will be determined from
123
+ # file_or_files.
124
+ # headers<String, Array>:: Additional attachment headers.
125
+ #
126
+ # ==== Raises
127
+ # ArgumentError::
128
+ # file_or_files was not a File or an Array of File instances.
129
+ def attach(file_or_files, filename = file_or_files.is_a?(File) ? File.basename(file_or_files.path) : nil,
130
+ type = nil, headers = nil)
131
+ if file_or_files.is_a?(Array)
132
+ file_or_files.each {|k,v| @mail.add_attachment_as k, *v}
133
+ else
134
+ raise ArgumentError, "You did not pass in a file. Instead, you sent a #{file_or_files.class}" if !file_or_files.is_a?(File)
135
+ @mail.add_attachment_as(file_or_files, filename, type, headers)
136
+ end
137
+ end
138
+
139
+ # ==== Parameters
140
+ # o<Hash{~to_s => Object}>:: Configuration commands to send to MailFactory.
141
+ def initialize(o={})
142
+ self.config = Mailer.config || {:sendmail_path => '/usr/sbin/sendmail'}
143
+ o[:rawhtml] = o.delete(:html)
144
+ m = MailFactory.new()
145
+ o.each { |k,v| m.send "#{k}=", v }
146
+ @mail = m
147
+ end
148
+
149
+ end
150
+ end
151
+
152
+ class EventContext
153
+ include Mailer
154
+ end
155
+ end
@@ -1,51 +1,11 @@
1
1
  require File.expand_path(File.dirname(__FILE__)+'/../spec_helper')
2
2
 
3
3
  describe "visiting /sso/signup" do
4
- def app
5
- Hancock::App
6
- end
7
4
  before(:each) do
8
5
  @user = Hancock::User.new(:email => /\w+@\w+\.\w{2,3}/.gen.downcase,
9
6
  :first_name => /\w+/.gen.capitalize,
10
7
  :last_name => /\w+/.gen.capitalize)
11
8
  end
12
- describe "when signing up" do
13
- it "should sign the user up" do
14
- get '/sso/signup'
15
-
16
- post '/sso/signup', :email => @user.email,
17
- :first_name => @user.first_name,
18
- :last_name => @user.last_name
19
-
20
- confirmation_url = last_response.body.to_s.match(%r!/sso/register/\w{40}!)
21
- confirmation_url.should_not be_nil
22
-
23
- get "#{confirmation_url}"
24
- password = /\w+{9,32}/.gen
25
-
26
- last_response.body.to_s.should have_selector("form[action='#{confirmation_url}']")
27
-
28
- post "#{confirmation_url}", :password => password, :password_confirmation => password
29
- follow_redirect!
30
-
31
- last_response.body.to_s.should have_selector("h3:contains('Hello #{@user.first_name} #{@user.last_name}')")
32
- end
33
-
34
- describe "and form hacking" do
35
- it "should be unauthorized" do
36
- get '/sso/signup'
37
-
38
- post '/sso/signup', :email => @user.email,
39
- :first_name => @user.first_name,
40
- :last_name => @user.last_name
41
-
42
- fake_url = /\w+{9,40}/.gen
43
- get "/sso/register/#{fake_url}"
44
- last_response.body.to_s.should match(/BadRequest/)
45
- end
46
- end
47
- end
48
-
49
9
  if ENV['WATIR']
50
10
  begin
51
11
  require 'safariwatir'
@@ -42,12 +42,14 @@ module Hancock
42
42
  include Webrat::Methods
43
43
  include Webrat::Matchers
44
44
  include Spec::Matchers
45
+
45
46
  def matches?(target)
46
- target.header['Content-Type'].should eql('application/xrds+xml')
47
+ target.headers['Content-Type'].should eql('application/xrds+xml')
47
48
  target.body.should have_xpath("//xrd/service[uri='http://example.org/sso']")
48
49
  target.body.should have_xpath("//xrd/service[type='http://specs.openid.net/auth/2.0/server']")
49
50
  true
50
51
  end
52
+
51
53
  def failure_message
52
54
  puts "Expected a identity provider yadis document"
53
55
  end
@@ -2,15 +2,14 @@ require 'rubygems'
2
2
  require 'pp'
3
3
  gem 'rspec', '~>1.2.0'
4
4
  require 'spec'
5
- require 'sinatra/test'
6
5
  require 'dm-sweatshop'
7
6
 
8
7
  $:.push File.join(File.dirname(__FILE__), '..', 'lib')
9
8
  require 'hancock'
10
- gem 'webrat', '~>0.4.2'
11
- require 'webrat/sinatra'
9
+ gem 'webrat', '~>0.4.4'
10
+ require 'webrat'
12
11
 
13
- gem 'rack-test', '~>0.1.0'
12
+ gem 'rack-test', '~>0.3.0'
14
13
  require 'rack/test'
15
14
 
16
15
  require File.expand_path(File.dirname(__FILE__) + '/app')
@@ -23,9 +22,9 @@ Sinatra::Mailer.delivery_method = :test_send
23
22
 
24
23
  Webrat.configure do |config|
25
24
  if ENV['SELENIUM'].nil?
26
- config.mode = :sinatra
25
+ config.mode = :rack_test
27
26
  else
28
- gem 'selenium-client', '~>1.2.10'
27
+ gem 'selenium-client', '~>1.2.15'
29
28
  config.mode = :selenium
30
29
  config.application_framework = :sinatra
31
30
  config.application_port = 4567
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hancock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Corey Donohoe
@@ -10,38 +10,38 @@ autorequire: hancock
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-05-01 00:00:00 -06:00
13
+ date: 2009-06-15 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
- name: dm-core
17
+ name: ruby-openid
18
18
  type: :runtime
19
19
  version_requirement:
20
20
  version_requirements: !ruby/object:Gem::Requirement
21
21
  requirements:
22
22
  - - ~>
23
23
  - !ruby/object:Gem::Version
24
- version: 0.9.10
24
+ version: 2.1.4
25
25
  version:
26
26
  - !ruby/object:Gem::Dependency
27
- name: ruby-openid
27
+ name: sinatra
28
28
  type: :runtime
29
29
  version_requirement:
30
30
  version_requirements: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - ~>
33
33
  - !ruby/object:Gem::Version
34
- version: 2.1.2
34
+ version: 0.9.2
35
35
  version:
36
36
  - !ruby/object:Gem::Dependency
37
- name: sinatra
37
+ name: haml
38
38
  type: :runtime
39
39
  version_requirement:
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  requirements:
42
42
  - - ~>
43
43
  - !ruby/object:Gem::Version
44
- version: 0.9.1.1
44
+ version: 2.0.9
45
45
  version:
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: guid
@@ -53,6 +53,46 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.1.1
55
55
  version:
56
+ - !ruby/object:Gem::Dependency
57
+ name: dm-core
58
+ type: :runtime
59
+ version_requirement:
60
+ version_requirements: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ~>
63
+ - !ruby/object:Gem::Version
64
+ version: 0.9.11
65
+ version:
66
+ - !ruby/object:Gem::Dependency
67
+ name: dm-types
68
+ type: :runtime
69
+ version_requirement:
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ~>
73
+ - !ruby/object:Gem::Version
74
+ version: 0.9.11
75
+ version:
76
+ - !ruby/object:Gem::Dependency
77
+ name: dm-timestamps
78
+ type: :runtime
79
+ version_requirement:
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ~>
83
+ - !ruby/object:Gem::Version
84
+ version: 0.9.11
85
+ version:
86
+ - !ruby/object:Gem::Dependency
87
+ name: dm-validations
88
+ type: :runtime
89
+ version_requirement:
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ version: 0.9.11
95
+ version:
56
96
  description: A gem that provides a Single Sign On server
57
97
  email:
58
98
  - atmos@atmos.org
@@ -68,7 +108,17 @@ files:
68
108
  - LICENSE
69
109
  - README.md
70
110
  - Rakefile
111
+ - features/sessions.feature
112
+ - features/signup.feature
113
+ - features/sso.feature
114
+ - features/step_definitions
115
+ - features/step_definitions/sessions_steps.rb
116
+ - features/step_definitions/signup_steps.rb
117
+ - features/step_definitions/sso_steps.rb
118
+ - features/support
119
+ - features/support/env.rb
71
120
  - lib/hancock.rb
121
+ - lib/mailer.rb
72
122
  - lib/models
73
123
  - lib/models/consumer.rb
74
124
  - lib/models/user.rb
@@ -90,16 +140,6 @@ files:
90
140
  - spec/acceptance
91
141
  - spec/acceptance/signing_up_spec.rb
92
142
  - spec/app.rb
93
- - spec/features
94
- - spec/features/sessions.feature
95
- - spec/features/signup.feature
96
- - spec/features/sso.feature
97
- - spec/features/step_definitions
98
- - spec/features/step_definitions/sessions_steps.rb
99
- - spec/features/step_definitions/signup_steps.rb
100
- - spec/features/step_definitions/sso_steps.rb
101
- - spec/features/support
102
- - spec/features/support/env.rb
103
143
  - spec/fixtures.rb
104
144
  - spec/matchers.rb
105
145
  - spec/spec_helper.rb