aws-sessionstore-dynamodb 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +5 -5
  2. data/.github/PULL_REQUEST_TEMPLATE.md +6 -0
  3. data/.gitignore +1 -0
  4. data/.gitmodules +3 -0
  5. data/.travis.yml +16 -5
  6. data/.yardopts +3 -2
  7. data/CHANGELOG.md +24 -0
  8. data/CODE_OF_CONDUCT.md +4 -0
  9. data/CONTRIBUTING.md +61 -0
  10. data/Gemfile +7 -19
  11. data/{LICENSE.txt → LICENSE} +0 -0
  12. data/README.md +17 -63
  13. data/Rakefile +37 -14
  14. data/VERSION +1 -0
  15. data/aws-sessionstore-dynamodb.gemspec +7 -5
  16. data/doc-src/templates/default/layout/html/footer.erb +10 -0
  17. data/doc-src/templates/default/layout/html/layout.erb +31 -0
  18. data/lib/aws-sessionstore-dynamodb.rb +0 -15
  19. data/lib/aws/session_store/dynamo_db/configuration.rb +2 -29
  20. data/lib/aws/session_store/dynamo_db/errors/base_handler.rb +0 -14
  21. data/lib/aws/session_store/dynamo_db/errors/default_handler.rb +0 -14
  22. data/lib/aws/session_store/dynamo_db/garbage_collection.rb +2 -15
  23. data/lib/aws/session_store/dynamo_db/invalid_id_error.rb +0 -14
  24. data/lib/aws/session_store/dynamo_db/lock_wait_timeout_error.rb +0 -14
  25. data/lib/aws/session_store/dynamo_db/locking/base.rb +14 -17
  26. data/lib/aws/session_store/dynamo_db/locking/null.rb +0 -14
  27. data/lib/aws/session_store/dynamo_db/locking/pessimistic.rb +0 -16
  28. data/lib/aws/session_store/dynamo_db/missing_secret_key_error.rb +0 -14
  29. data/lib/aws/session_store/dynamo_db/rack_middleware.rb +11 -24
  30. data/lib/aws/session_store/dynamo_db/table.rb +1 -14
  31. data/lib/aws/session_store/dynamo_db/version.rb +1 -15
  32. data/spec/aws/session_store/dynamo_db/app_config.yml +6 -6
  33. data/spec/aws/session_store/dynamo_db/configuration_spec.rb +28 -51
  34. data/spec/aws/session_store/dynamo_db/error/default_error_handler_spec.rb +23 -21
  35. data/spec/aws/session_store/dynamo_db/garbage_collection_spec.rb +68 -69
  36. data/spec/aws/session_store/dynamo_db/locking/threaded_sessions_spec.rb +17 -16
  37. data/spec/aws/session_store/dynamo_db/rack_middleware_database_spec.rb +47 -46
  38. data/spec/aws/session_store/dynamo_db/rack_middleware_spec.rb +59 -61
  39. data/spec/aws/session_store/dynamo_db/table_spec.rb +9 -7
  40. data/spec/spec_helper.rb +14 -11
  41. metadata +27 -29
  42. data/lib/aws/session_store/dynamo_db/railtie.rb +0 -28
  43. data/lib/aws/session_store/dynamo_db/tasks/session_table.rake +0 -21
  44. data/lib/rails/generators/sessionstore/dynamodb/dynamodb_generator.rb +0 -55
  45. data/lib/rails/generators/sessionstore/dynamodb/templates/sessionstore/USAGE +0 -13
  46. data/lib/rails/generators/sessionstore/dynamodb/templates/sessionstore/dynamodb.yml +0 -71
  47. data/lib/rails/generators/sessionstore/dynamodb/templates/sessionstore_migration.rb +0 -10
  48. data/spec/aws/session_store/dynamo_db/config/dynamo_db_session.yml +0 -24
  49. data/spec/aws/session_store/dynamo_db/rails_app_config.yml +0 -24
  50. data/tasks/test.rake +0 -29
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
4
  #
3
5
  # Licensed under the Apache License, Version 2.0 (the "License"). You
@@ -22,19 +24,19 @@ module Aws
22
24
  before { @options = {} }
23
25
 
24
26
  def ensure_data_updated(mutated_data)
25
- dynamo_db_client.should_receive(:update_item) do |options|
27
+ expect(dynamo_db_client).to receive(:update_item) do |options|
26
28
  if mutated_data
27
- options[:attribute_updates]["data"].should_not be_nil
29
+ expect(options[:attribute_updates]['data']).not_to be_nil
28
30
  else
29
- options[:attribute_updates]["data"].should be_nil
31
+ expect(options[:attribute_updates]['data']).to be_nil
30
32
  end
31
33
  end
32
34
  end
33
35
 
34
36
  before do
35
37
  @options = {
36
- :dynamo_db_client => dynamo_db_client,
37
- :secret_key => 'watermelon_cherries'
38
+ dynamo_db_client: dynamo_db_client,
39
+ secret_key: 'watermelon_cherries'
38
40
  }
39
41
  end
40
42
 
@@ -42,105 +44,101 @@ module Aws
42
44
  let(:app) { RackMiddleware.new(base_app, @options) }
43
45
 
44
46
  let(:sample_packed_data) do
45
- [Marshal.dump("multiplier" => 1)].pack("m*")
47
+ [Marshal.dump('multiplier' => 1)].pack('m*')
46
48
  end
47
49
 
48
50
  let(:dynamo_db_client) do
49
- client = double('Aws::DynamoDB::Client')
50
- client.stub(:delete_item) { 'Deleted' }
51
- client.stub(:list_tables) { {:table_names => ['Sessions']} }
52
- client.stub(:get_item) do
53
- { :item => { 'data' => sample_packed_data } }
54
- end
55
- client.stub(:update_item) do
56
- { :attributes => { :created_at => 'now' } }
57
- end
58
- client
51
+ double(
52
+ 'Aws::DynamoDB::Client',
53
+ delete_item: 'Deleted',
54
+ list_tables: { table_names: ['Sessions'] },
55
+ get_item: { item: { 'data' => sample_packed_data } },
56
+ update_item: { attributes: { created_at: 'now' } }
57
+ )
59
58
  end
60
59
 
61
- context "Testing best case session storage with mock client" do
62
- it "stores session data in session object" do
63
- get "/"
64
- last_request.session.to_hash.should eq("multiplier" => 1)
60
+ context 'Testing best case session storage with mock client' do
61
+ it 'stores session data in session object' do
62
+ get '/'
63
+ expect(last_request.session.to_hash).to eq('multiplier' => 1)
65
64
  end
66
65
 
67
- it "creates a new HTTP cookie when Cookie not supplied" do
68
- get "/"
69
- last_response.body.should eq('All good!')
70
- last_response['Set-Cookie'].should be_truthy
66
+ it 'creates a new HTTP cookie when Cookie not supplied' do
67
+ get '/'
68
+ expect(last_response.body).to eq('All good!')
69
+ expect(last_response['Set-Cookie']).to be_truthy
71
70
  end
72
71
 
73
- it "loads/manipulates a session based on id from HTTP-Cookie" do
74
- get "/"
75
- last_request.session.to_hash.should eq("multiplier" => 1)
72
+ it 'loads/manipulates a session based on id from HTTP-Cookie' do
73
+ get '/'
74
+ expect(last_request.session.to_hash).to eq('multiplier' => 1)
76
75
 
77
- get "/"
78
- last_request.session.to_hash.should eq("multiplier" => 2)
76
+ get '/'
77
+ expect(last_request.session.to_hash).to eq('multiplier' => 2)
79
78
  end
80
79
 
81
- it "does not rewrite Cookie if cookie previously/accuarately set" do
82
- get "/"
83
- last_response['Set-Cookie'].should_not be_nil
80
+ it 'does not rewrite Cookie if cookie previously/accuarately set' do
81
+ get '/'
82
+ expect(last_response['Set-Cookie']).not_to be_nil
84
83
 
85
- get "/"
86
- last_response['Set-Cookie'].should be_nil
84
+ get '/'
85
+ expect(last_response['Set-Cookie']).to be_nil
87
86
  end
88
87
 
89
- it "does not set cookie when defer option is specifed" do
88
+ it 'does not set cookie when defer option is specifed' do
90
89
  @options[:defer] = true
91
- get "/"
92
- last_response['Set-Cookie'].should eq(nil)
90
+ get '/'
91
+ expect(last_response['Set-Cookie']).to be_nil
93
92
  end
94
93
 
95
- it "creates new sessopm with false/nonexistant http-cookie id" do
96
- get "/"
97
- last_response['Set-Cookie'].should_not eq('1234')
98
- last_response['Set-Cookie'].should_not be_nil
94
+ it 'creates new session with false/nonexistant http-cookie id' do
95
+ get '/'
96
+ expect(last_response['Set-Cookie']).not_to eq('1234')
97
+ expect(last_response['Set-Cookie']).not_to be_nil
99
98
  end
100
99
 
101
- it "expires after specified time and sets date for cookie to expire" do
100
+ it 'expires after specified time and sets date for cookie to expire' do
102
101
  @options[:expire_after] = 0
103
- get "/"
102
+ get '/'
104
103
  session_cookie = last_response['Set-Cookie']
105
104
 
106
- get "/"
107
- last_response['Set-Cookie'].should_not be_nil
108
- last_response['Set-Cookie'].should_not eq(session_cookie)
105
+ get '/'
106
+ expect(last_response['Set-Cookie']).not_to be_nil
107
+ expect(last_response['Set-Cookie']).not_to eq(session_cookie)
109
108
  end
110
109
 
111
110
  it "doesn't reset Cookie if not outside expire date" do
112
111
  @options[:expire_after] = 3600
113
- get "/"
112
+ get '/'
114
113
  session_cookie = last_response['Set-Cookie']
115
- get "/"
116
- last_response['Set-Cookie'].should eq(session_cookie)
114
+ get '/'
115
+ expect(last_response['Set-Cookie']).to eq(session_cookie)
117
116
  end
118
117
 
119
- it "will not set a session cookie when defer is true" do
118
+ it 'will not set a session cookie when defer is true' do
120
119
  @options[:defer] = true
121
- get "/"
122
- last_response['Set-Cookie'].should eq(nil)
120
+ get '/'
121
+ expect(last_response['Set-Cookie']).to be_nil
123
122
  end
124
123
 
125
- it "generates sid and migrates data to new sid when renew is selected" do
124
+ it 'generates sid and migrates data to new sid when renew is selected' do
126
125
  @options[:renew] = true
127
- get "/"
128
- last_request.session.to_hash.should eq("multiplier" => 1)
126
+ get '/'
127
+ expect(last_request.session.to_hash).to eq('multiplier' => 1)
129
128
  session_cookie = last_response['Set-Cookie']
130
129
 
131
- get "/" , "HTTP_Cookie" => session_cookie
132
- last_response['Set-Cookie'].should_not eq(session_cookie)
133
- last_request.session.to_hash.should eq("multiplier" => 2)
134
- session_cookie = last_response['Set-Cookie']
130
+ get '/', 'HTTP_Cookie' => session_cookie
131
+ expect(last_response['Set-Cookie']).not_to eq(session_cookie)
132
+ expect(last_request.session.to_hash).to eq('multiplier' => 2)
135
133
  end
136
134
 
137
135
  it "doesn't resend unmutated data" do
138
136
  ensure_data_updated(true)
139
137
  @options[:renew] = true
140
- get "/"
138
+ get '/'
141
139
 
142
140
  ensure_data_updated(false)
143
- get "/", {}, { "rack.session" => { "multiplier" => nil } }
141
+ get '/', {}, { 'rack.session' => { 'multiplier' => nil } }
144
142
  end
145
143
  end
146
144
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
4
  #
3
5
  # Licensed under the Apache License, Version 2.0 (the "License"). You
@@ -19,22 +21,22 @@ module Aws
19
21
  module SessionStore
20
22
  module DynamoDB
21
23
  describe Table do
22
- context "Mock Table Methods Tests", :integration => true do
24
+ context 'Mock Table Methods Tests', integration: true do
23
25
  let(:table_name) { "sessionstore-integration-test-#{Time.now.to_i}" }
24
- let(:options) { {:table_name => table_name} }
26
+ let(:options) { { table_name: table_name } }
25
27
  let(:io) { StringIO.new }
26
28
 
27
- before { Table.stub(:logger) { Logger.new(io) } }
29
+ before { allow(Table).to receive(:logger) { Logger.new(io) } }
28
30
 
29
- it "Creates and deletes a new table" do
31
+ it 'Creates and deletes a new table' do
30
32
  Table.create_table(options)
31
33
 
32
34
  # second attempt should warn
33
35
  Table.create_table(options)
34
36
 
35
- io.string.should include("Table #{table_name} created, waiting for activation...\n")
36
- io.string.should include("Table #{table_name} is now ready to use.\n")
37
- io.string.should include("Table #{table_name} already exists, skipping creation.\n")
37
+ expect(io.string).to include("Table #{table_name} created, waiting for activation...\n")
38
+ expect(io.string).to include("Table #{table_name} is now ready to use.\n")
39
+ expect(io.string).to include("Table #{table_name} already exists, skipping creation.\n")
38
40
 
39
41
  # now delete table
40
42
  Table.delete_table(options)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
4
  #
3
5
  # Licensed under the Apache License, Version 2.0 (the "License"). You
@@ -19,7 +21,7 @@ begin
19
21
  rescue LoadError
20
22
  end
21
23
 
22
- $: << File.join(File.dirname(File.dirname(__FILE__)), "lib")
24
+ $LOAD_PATH << File.join(File.dirname(File.dirname(__FILE__)), 'lib')
23
25
 
24
26
  require 'rspec'
25
27
  require 'aws-sessionstore-dynamodb'
@@ -33,35 +35,36 @@ class MultiplierApplication
33
35
  else
34
36
  env['rack.session'][:multiplier] = 1
35
37
  end
36
- [200, {'Content-Type' => 'text/plain'}, ['All good!']]
38
+ [200, { 'Content-Type' => 'text/plain' }, ['All good!']]
37
39
  end
38
40
  end
39
41
 
40
42
  ConstantHelpers = lambda do
41
43
  let(:token_error_msg) { 'The security token included in the request is invalid' }
42
- let(:resource_error) {
44
+ let(:resource_error) do
43
45
  Aws::DynamoDB::Errors::ResourceNotFoundException.new(double('Seahorse::Client::RequestContext'), resource_error_msg)
44
- }
46
+ end
45
47
  let(:resource_error_msg) { 'The Resource is not found.' }
46
48
  let(:key_error) { Aws::DynamoDB::Errors::ValidationException.new(double('Seahorse::Client::RequestContext'), key_error_msg) }
47
49
  let(:key_error_msg) { 'The provided key element does not match the schema' }
48
- let(:client_error) {
50
+ let(:client_error) do
49
51
  Aws::DynamoDB::Errors::UnrecognizedClientException.new(double('Seahorse::Client::RequestContext'), client_error_msg)
50
- }
52
+ end
51
53
  let(:client_error_msg) { 'Unrecognized Client.'}
52
- let(:invalid_cookie) { {"HTTP_COOKIE" => "rack.session=ApplePieBlueberries"} }
53
- let(:invalid_session_data) { {"rack.session"=>{"multiplier" => 1}} }
54
+ let(:invalid_cookie) { { 'HTTP_COOKIE' => 'rack.session=ApplePieBlueberries' } }
55
+ let(:invalid_session_data) { { 'rack.session' => { 'multiplier' => 1 } } }
54
56
  let(:rack_default_error_msg) { "Warning! Aws::SessionStore::DynamoDB failed to save session. Content dropped.\n" }
55
57
  let(:missing_key_error) { Aws::SessionStore::DynamoDB::MissingSecretKeyError }
56
58
  end
57
59
 
58
60
  RSpec.configure do |c|
59
- c.before(:each, :integration => true) do
60
- opts = {:table_name => 'sessionstore-integration-test'}
61
+ c.raise_errors_for_deprecations!
62
+ c.before(:each, integration: true) do
63
+ opts = { table_name: 'sessionstore-integration-test' }
61
64
 
62
65
  defaults = Aws::SessionStore::DynamoDB::Configuration::DEFAULTS
63
66
  defaults = defaults.merge(opts)
64
- stub_const("Aws::SessionStore::DynamoDB::Configuration::DEFAULTS", defaults)
67
+ stub_const('Aws::SessionStore::DynamoDB::Configuration::DEFAULTS', defaults)
65
68
  Aws::SessionStore::DynamoDB::Table.create_table(opts)
66
69
  end
67
70
  end
metadata CHANGED
@@ -1,57 +1,67 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-sessionstore-dynamodb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - Ruby Robinson
8
- autorequire:
7
+ - Amazon Web Services
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-14 00:00:00.000000000 Z
11
+ date: 2020-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: aws-sdk
14
+ name: aws-sdk-dynamodb
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rack
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.6.4
33
+ version: '2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.6.4
41
- description:
42
- email:
40
+ version: '2'
41
+ description:
42
+ email:
43
+ - mamuller@amazon.com
44
+ - alexwoo@amazon.com
43
45
  executables: []
44
46
  extensions: []
45
47
  extra_rdoc_files: []
46
48
  files:
49
+ - ".github/PULL_REQUEST_TEMPLATE.md"
47
50
  - ".gitignore"
51
+ - ".gitmodules"
48
52
  - ".travis.yml"
49
53
  - ".yardopts"
54
+ - CHANGELOG.md
55
+ - CODE_OF_CONDUCT.md
56
+ - CONTRIBUTING.md
50
57
  - Gemfile
51
- - LICENSE.txt
58
+ - LICENSE
52
59
  - README.md
53
60
  - Rakefile
61
+ - VERSION
54
62
  - aws-sessionstore-dynamodb.gemspec
63
+ - doc-src/templates/default/layout/html/footer.erb
64
+ - doc-src/templates/default/layout/html/layout.erb
55
65
  - lib/aws-sessionstore-dynamodb.rb
56
66
  - lib/aws/session_store/dynamo_db/configuration.rb
57
67
  - lib/aws/session_store/dynamo_db/errors/base_handler.rb
@@ -64,31 +74,22 @@ files:
64
74
  - lib/aws/session_store/dynamo_db/locking/pessimistic.rb
65
75
  - lib/aws/session_store/dynamo_db/missing_secret_key_error.rb
66
76
  - lib/aws/session_store/dynamo_db/rack_middleware.rb
67
- - lib/aws/session_store/dynamo_db/railtie.rb
68
77
  - lib/aws/session_store/dynamo_db/table.rb
69
- - lib/aws/session_store/dynamo_db/tasks/session_table.rake
70
78
  - lib/aws/session_store/dynamo_db/version.rb
71
- - lib/rails/generators/sessionstore/dynamodb/dynamodb_generator.rb
72
- - lib/rails/generators/sessionstore/dynamodb/templates/sessionstore/USAGE
73
- - lib/rails/generators/sessionstore/dynamodb/templates/sessionstore/dynamodb.yml
74
- - lib/rails/generators/sessionstore/dynamodb/templates/sessionstore_migration.rb
75
79
  - spec/aws/session_store/dynamo_db/app_config.yml
76
- - spec/aws/session_store/dynamo_db/config/dynamo_db_session.yml
77
80
  - spec/aws/session_store/dynamo_db/configuration_spec.rb
78
81
  - spec/aws/session_store/dynamo_db/error/default_error_handler_spec.rb
79
82
  - spec/aws/session_store/dynamo_db/garbage_collection_spec.rb
80
83
  - spec/aws/session_store/dynamo_db/locking/threaded_sessions_spec.rb
81
84
  - spec/aws/session_store/dynamo_db/rack_middleware_database_spec.rb
82
85
  - spec/aws/session_store/dynamo_db/rack_middleware_spec.rb
83
- - spec/aws/session_store/dynamo_db/rails_app_config.yml
84
86
  - spec/aws/session_store/dynamo_db/table_spec.rb
85
87
  - spec/spec_helper.rb
86
- - tasks/test.rake
87
88
  homepage: http://github.com/aws/aws-sessionstore-dynamodb-ruby
88
89
  licenses:
89
90
  - Apache License 2.0
90
91
  metadata: {}
91
- post_install_message:
92
+ post_install_message:
92
93
  rdoc_options: []
93
94
  require_paths:
94
95
  - lib
@@ -103,21 +104,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
104
  - !ruby/object:Gem::Version
104
105
  version: '0'
105
106
  requirements: []
106
- rubyforge_project:
107
- rubygems_version: 2.5.2
108
- signing_key:
107
+ rubygems_version: 3.0.3
108
+ signing_key:
109
109
  specification_version: 4
110
110
  summary: The Amazon DynamoDB Session Store handles sessions for Ruby web applications
111
111
  using a DynamoDB backend.
112
112
  test_files:
113
113
  - spec/aws/session_store/dynamo_db/app_config.yml
114
- - spec/aws/session_store/dynamo_db/config/dynamo_db_session.yml
115
114
  - spec/aws/session_store/dynamo_db/configuration_spec.rb
116
115
  - spec/aws/session_store/dynamo_db/error/default_error_handler_spec.rb
117
116
  - spec/aws/session_store/dynamo_db/garbage_collection_spec.rb
118
117
  - spec/aws/session_store/dynamo_db/locking/threaded_sessions_spec.rb
119
118
  - spec/aws/session_store/dynamo_db/rack_middleware_database_spec.rb
120
119
  - spec/aws/session_store/dynamo_db/rack_middleware_spec.rb
121
- - spec/aws/session_store/dynamo_db/rails_app_config.yml
122
120
  - spec/aws/session_store/dynamo_db/table_spec.rb
123
121
  - spec/spec_helper.rb
@@ -1,28 +0,0 @@
1
- # Copyright 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License"). You
4
- # may not use this file except in compliance with the License. A copy of
5
- # the License is located at
6
- #
7
- # http://aws.amazon.com/apache2.0/
8
- #
9
- # or in the "license" file accompanying this file. This file is
10
- # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
11
- # ANY KIND, either express or implied. See the License for the specific
12
- # language governing permissions and limitations under the License.
13
-
14
-
15
- module Aws::SessionStore::DynamoDB
16
- class Railtie < Rails::Railtie
17
- initializer 'aws-sessionstore-dynamodb-rack-middleware' do
18
- ActionDispatch::Session::DynamodbStore = Aws::SessionStore::DynamoDB::RackMiddleware
19
- end
20
-
21
- # Load all rake tasks
22
- rake_tasks do
23
- Dir[File.expand_path("../tasks/*.rake", __FILE__)].each do |rake_task|
24
- load rake_task
25
- end
26
- end
27
- end
28
- end