rory 0.3.18 → 0.3.19

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c01333535815f9c10a53f648622dd78dff61f5a8
4
+ data.tar.gz: cee26fdac986fb36670265e865375eb677cadc88
5
+ SHA512:
6
+ metadata.gz: 281dc7c721202e285e41222e76203eb97073abe720672ca5882da410d1a2d4e844bf52d4c40035c19d9141d906c5edc6c2487444c507e5a7ab9708d8c7d30953
7
+ data.tar.gz: 1bf60e9bbb6545df467c1cd8c1454032d41e9cf37b12342dc4258618bcf67f2fa30871ba24dbebf68bf34c27e90098e74f665bb4ffaf1f473ac4ff8fe5014ef6
data/README.md ADDED
@@ -0,0 +1,40 @@
1
+ rory
2
+ ====
3
+
4
+ **A lightweight, opinionated framework with Rails-like conventions.**
5
+
6
+ Introduction
7
+ ------------
8
+
9
+ Rory is an [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) framework for [Ruby](https://www.ruby-lang.org). Its conventions are very similar to that of [Ruby on Rails](http://rubyonrails.org), but fewer.
10
+
11
+ Rory was started as a self-educational project, but has evolved to the point where it is used in production environments. Its design goals, therefore, are a moving target, but are gradually moving from "understanding the design and implementation of Rails" to "creating a lightweight, opinionated framework with Rails-like conventions."
12
+
13
+ History
14
+ -------
15
+
16
+ In 2008, I was first introduced to [Ruby on Rails](http://rubyonrails.org). I'd been an independent contract PHP developer for over 8 years, and I'd never used an MVC framework before, so I was thirsty for something different.
17
+
18
+ I loved Ruby (mostly). And Rails was great for scaffolding - getting a functional web application running quickly. However, all its "magic" (to enable convention over configuration) made it very difficult for a newcomer to understand what was going on, and to actually learn Ruby.
19
+
20
+ I griped and griped about the complexity of Rails, and about the arcane maneuvers necessary to code "outside the box," until finally I decided to take a more empathic approach, and ask the question: *Why is Rails the way it is?*
21
+
22
+ I figured the best way to tackle the question was to start over from scratch. Start with a specification for a web application, and nothing but the Rack gem. And thus was born Rory.
23
+
24
+ Contributing to rory
25
+ --------------------
26
+
27
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
28
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
29
+ * Fork the project.
30
+ * Start a feature/bugfix branch.
31
+ * Commit and push until you are happy with your contribution.
32
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
33
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
34
+
35
+ Copyright
36
+ ---------
37
+
38
+ Copyright (c) 2013 Ravi Gadad. See LICENSE.txt for
39
+ further details.
40
+
data/lib/rory.rb CHANGED
@@ -1,7 +1,13 @@
1
- ENV['RORY_STAGE'] ||= ENV['RACK_ENV'] || 'development'
1
+ if ENV['RORY_STAGE']
2
+ puts "\n\tDEPRECATION: use 'RORY_ENV' instead of 'RORY_STAGE'\n\n"
3
+ ENV['RORY_ENV'] = ENV['RORY_STAGE']
4
+ end
5
+
6
+ ENV['RACK_ENV'] || 'development'
2
7
 
3
8
  require 'yaml'
4
9
  require 'sequel'
10
+ require 'rory/hash_with_dubious_semantics'
5
11
  require 'rory/application'
6
12
  require 'rory/dispatcher'
7
13
  require 'rory/route'
@@ -89,7 +89,7 @@ module Rory
89
89
  )
90
90
  end
91
91
 
92
- def connect_db(environment = ENV['RORY_STAGE'])
92
+ def connect_db(environment = ENV['RORY_ENV'])
93
93
  @db_config = load_config_data(:database)
94
94
  @db = Sequel.connect(@db_config[environment.to_s])
95
95
  @db.loggers << logger
@@ -123,7 +123,7 @@ module Rory
123
123
  def logger
124
124
  @logger ||= begin
125
125
  Dir.mkdir('log') unless File.exists?('log')
126
- file = File.open(File.join('log', "#{ENV['RORY_STAGE']}.log"), 'a')
126
+ file = File.open(File.join('log', "#{ENV['RORY_ENV']}.log"), 'a')
127
127
  Logger.new(file)
128
128
  end
129
129
  end
@@ -50,10 +50,7 @@ module Rory
50
50
  end
51
51
 
52
52
  def params
53
- @converted_params ||= @params.inject({}) { |memo, (key, value)|
54
- memo[key.to_sym] = memo[key.to_s] = value
55
- memo
56
- }
53
+ @converted_params ||= Rory::HashWithDubiousSemantics.new(@params)
57
54
  end
58
55
 
59
56
  def route_template
@@ -0,0 +1,58 @@
1
+ require 'delegate'
2
+
3
+ module Rory
4
+ # ActiveSupport's HashWithIndifferentAccess put it best:
5
+ #
6
+ # "This class has dubious semantics and we only have it so that people
7
+ # can write params[:key] instead of params[‘key’] and they get the
8
+ # same value for both keys."
9
+ class HashWithDubiousSemantics < SimpleDelegator
10
+ def initialize(hash)
11
+ fail ArgumentError unless hash.is_a?(Hash)
12
+ hash_with_no_symbols = convert_hash(hash)
13
+ super( hash_with_no_symbols )
14
+ end
15
+
16
+ def [](key)
17
+ actual_key = convert_key(key)
18
+ __getobj__[actual_key]
19
+ end
20
+
21
+ def []=(key, value)
22
+ actual_key = convert_key(key)
23
+ new_value = convert_value(value)
24
+ __getobj__[actual_key] = new_value
25
+ end
26
+
27
+ def inspect
28
+ "#<#{self.class.name} @hash=#{super}>"
29
+ end
30
+
31
+ private
32
+
33
+ def convert_hash(hash)
34
+ return hash if hash.empty?
35
+
36
+ hash.each_with_object({}) do |(key, value), converted_hash|
37
+ new_key = convert_key(key)
38
+ new_value = convert_value(value)
39
+
40
+ converted_hash[new_key] = new_value
41
+ end
42
+ end
43
+
44
+ def convert_key(key)
45
+ case key
46
+ when Symbol ; key.to_s
47
+ else ; key
48
+ end
49
+ end
50
+
51
+ def convert_value(value)
52
+ case value
53
+ when Hash ; HashWithDubiousSemantics.new(convert_hash(value))
54
+ else ; value
55
+ end
56
+ end
57
+ end
58
+ end
data/lib/rory/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rory
2
- VERSION = '0.3.18'
2
+ VERSION = '0.3.19'
3
3
  end
data/lib/tasks/db.rake CHANGED
@@ -14,7 +14,7 @@ namespace :db do
14
14
 
15
15
  desc "Drop and recreate a database"
16
16
  task :purge => :load_extensions do
17
- config = RORY_APP.db_config[ENV['RORY_STAGE']]
17
+ config = RORY_APP.db_config[ENV['RORY_ENV']]
18
18
  drop_database_from_config(config)
19
19
  create_database_from_config(config)
20
20
  end
@@ -43,7 +43,7 @@ namespace :db do
43
43
 
44
44
  desc "Purges test database"
45
45
  task :purge => :load_extensions do
46
- ENV['RORY_STAGE'] = 'test'
46
+ ENV['RORY_ENV'] = 'test'
47
47
  Rake::Task["db:purge"].invoke
48
48
  end
49
49
 
@@ -58,4 +58,4 @@ namespace :db do
58
58
  def create_database_from_config(config)
59
59
  RORY_APP.db << "CREATE DATABASE \"#{config['database']}\""
60
60
  end
61
- end
61
+ end
data/rory.gemspec CHANGED
@@ -22,9 +22,9 @@ EOF
22
22
  s.required_ruby_version = ">= 1.8.7"
23
23
  s.required_rubygems_version = ">= 1.3.6"
24
24
 
25
- s.extra_rdoc_files = ["LICENSE.txt", "README.rdoc"]
25
+ s.extra_rdoc_files = ["LICENSE.txt", "README.md"]
26
26
  s.files = Dir['{lib/**/*,spec/**/*}'] +
27
- %w(LICENSE.txt Rakefile README.rdoc rory.gemspec)
27
+ %w(LICENSE.txt Rakefile README.md rory.gemspec)
28
28
  s.licenses = ["MIT"]
29
29
  s.require_paths = ["lib"]
30
30
 
@@ -33,7 +33,7 @@ EOF
33
33
  s.add_runtime_dependency 'thin', '~> 1.0'
34
34
 
35
35
  s.add_development_dependency 'rake'
36
- s.add_development_dependency 'rspec'
36
+ s.add_development_dependency 'rspec', '~> 2'
37
37
  s.add_development_dependency 'capybara'
38
38
  s.add_development_dependency 'yard'
39
39
  s.add_development_dependency 'reek'
@@ -1,11 +1,13 @@
1
1
  Fixture::Application.set_routes do
2
2
  match 'foo/:id/bar', :to => 'foo#bar', :methods => [:get, :post]
3
3
  match 'this/:path/is/:very_awesome', :to => 'awesome#rad'
4
- scope :module => 'goose' do
5
- match 'lumpies/:lump', :to => 'lumpies#show', :methods => [:get]
6
- end
7
- scope :module => 'goose/wombat' do
8
- match 'rabbits/:chew', :to => 'rabbits#chew', :methods => [:get]
4
+ scope :method => [:get] do
5
+ scope :module => 'goose' do
6
+ match 'lumpies/:lump', :to => 'lumpies#show'
7
+ end
8
+ scope :module => 'goose/wombat' do
9
+ match 'rabbits/:chew', :to => 'rabbits#chew'
10
+ end
9
11
  end
10
12
  match '/', :to => 'root#vegetable', :methods => [:get]
11
13
  match '/', :to => 'root#no_vegetable', :methods => [:delete]
@@ -26,12 +26,11 @@ describe Rory::Controller do
26
26
  describe '#params' do
27
27
  it 'returns params from request, converted for indifferent key access' do
28
28
  controller = Rory::Controller.new(@request, @routing)
29
- expect(controller.params).to eq({
30
- 'violet' => 'invisibility',
31
- 'dash' => 'superspeed',
32
- :violet => 'invisibility',
33
- :dash => 'superspeed'
34
- })
29
+
30
+ expect( controller.params[:violet] ) .to eq( 'invisibility' )
31
+ expect( controller.params['violet'] ) .to eq( 'invisibility' )
32
+ expect( controller.params[:dash] ) .to eq( 'superspeed' )
33
+ expect( controller.params['dash'] ) .to eq( 'superspeed' )
35
34
  end
36
35
  end
37
36
 
@@ -0,0 +1,64 @@
1
+ describe Rory::HashWithDubiousSemantics do
2
+ subject {
3
+ described_class.new(hash)
4
+ }
5
+
6
+ context "with a variety of keys" do
7
+ let(:hash) { {
8
+ 'violet' => 'invisibility',
9
+ :dash => 'superspeed',
10
+ 42 => 'meaning of life...'
11
+ } }
12
+
13
+ it 'allows indifferent access for a key that was originally a String' do
14
+ expect( subject[:violet] ) .to eq( 'invisibility' )
15
+ expect( subject['violet'] ) .to eq( 'invisibility' )
16
+ end
17
+
18
+ it 'allows indifferent access for a key that was originally a Symbol' do
19
+ expect( subject[:dash] ) .to eq( 'superspeed' )
20
+ expect( subject['dash'] ) .to eq( 'superspeed' )
21
+ end
22
+
23
+ it 'does not allow indifferent access for a key that was not a string or symbol' do
24
+ expect( subject[42] ) .to eq( 'meaning of life...' )
25
+ expect( subject[:'42'] ) .to be( nil )
26
+ expect( subject['42'] ) .to be( nil )
27
+ end
28
+ end
29
+
30
+ context 'nested hashes' do
31
+ let(:hash) { {
32
+ 'violet' => 'invisibility',
33
+ 'spam' => {
34
+ 'eggs' => 'breakfast'
35
+ }
36
+ } }
37
+
38
+ it 'allows indifferent access into sub-hashes' do
39
+ expect( subject[:spam][:eggs]).to eq('breakfast')
40
+ expect( subject['spam']['eggs']).to eq('breakfast')
41
+ expect( subject['spam'][:eggs]).to eq('breakfast')
42
+ expect( subject[:spam]['eggs']).to eq('breakfast')
43
+ end
44
+ end
45
+
46
+ context 'assignment' do
47
+ let(:hash) { {} }
48
+
49
+ it 'allows assignment by string and symbol' do
50
+ subject[:unicorns] = 'rainbows'
51
+ subject['vampires'] = 'sparkly'
52
+
53
+ expect(subject['unicorns']).to eq('rainbows')
54
+ expect(subject[:vampires]).to eq('sparkly')
55
+ end
56
+
57
+ it 'wraps hashes on assignment' do
58
+ subject[:srsly] = { 'omg' => { 'wtf' => 'bbq' } }
59
+
60
+ expect( subject[:srsly][:omg][:wtf] ).to eq( 'bbq' )
61
+ expect( subject['srsly']['omg']['wtf'] ).to eq( 'bbq' )
62
+ end
63
+ end
64
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'simplecov'
2
2
  SimpleCov.start
3
3
 
4
- ENV['RORY_STAGE'] = 'test'
4
+ ENV['RORY_ENV'] = 'test'
5
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
6
  $LOAD_PATH.unshift(File.dirname(__FILE__))
7
7
  require 'rspec'
metadata CHANGED
@@ -1,208 +1,188 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.18
5
- prerelease:
4
+ version: 0.3.19
6
5
  platform: ruby
7
6
  authors:
8
7
  - Ravi Gadad
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-03-31 00:00:00.000000000 Z
11
+ date: 2014-12-18 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rack
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '1.0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: sequel
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
33
  version: '4.0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
40
  version: '4.0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: thin
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ~>
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
47
  version: '1.0'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ~>
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
54
  version: '1.0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rake
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rspec
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - "~>"
84
74
  - !ruby/object:Gem::Version
85
- version: '0'
75
+ version: '2'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - "~>"
92
81
  - !ruby/object:Gem::Version
93
- version: '0'
82
+ version: '2'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: capybara
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - ">="
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - ">="
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: yard
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - ">="
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - ">="
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: reek
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - ">="
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - ">="
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: simplecov
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
- - - ! '>='
129
+ - - ">="
148
130
  - !ruby/object:Gem::Version
149
131
  version: '0'
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
- - - ! '>='
136
+ - - ">="
156
137
  - !ruby/object:Gem::Version
157
138
  version: '0'
158
139
  - !ruby/object:Gem::Dependency
159
140
  name: bundler
160
141
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
142
  requirements:
163
- - - ~>
143
+ - - "~>"
164
144
  - !ruby/object:Gem::Version
165
145
  version: '1.0'
166
146
  type: :development
167
147
  prerelease: false
168
148
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
149
  requirements:
171
- - - ~>
150
+ - - "~>"
172
151
  - !ruby/object:Gem::Version
173
152
  version: '1.0'
174
- description: ! 'An exercise: Untangle the collusion of Rails idioms
175
-
153
+ description: |
154
+ An exercise: Untangle the collusion of Rails idioms
176
155
  from my Ruby knowledge, while trying to understand some
177
-
178
156
  Rails design decisions.
179
157
 
180
-
181
158
  See http://github.com/screamingmuse/rory for more info.
182
-
183
- '
184
159
  email:
185
160
  - ravi@screamingmuse.com
186
161
  executables: []
187
162
  extensions: []
188
163
  extra_rdoc_files:
189
164
  - LICENSE.txt
190
- - README.rdoc
165
+ - README.md
191
166
  files:
167
+ - LICENSE.txt
168
+ - README.md
169
+ - Rakefile
170
+ - lib/rory.rb
192
171
  - lib/rory/application.rb
193
172
  - lib/rory/controller.rb
194
173
  - lib/rory/dispatcher.rb
174
+ - lib/rory/hash_with_dubious_semantics.rb
195
175
  - lib/rory/path_generation.rb
196
- - lib/rory/renderer/context.rb
197
176
  - lib/rory/renderer.rb
177
+ - lib/rory/renderer/context.rb
198
178
  - lib/rory/route.rb
199
179
  - lib/rory/route_mapper.rb
200
180
  - lib/rory/support.rb
201
181
  - lib/rory/tasks.rb
202
182
  - lib/rory/version.rb
203
- - lib/rory.rb
204
183
  - lib/tasks/db.rake
205
184
  - lib/tasks/rory.rake
185
+ - rory.gemspec
206
186
  - spec/fixture_app/config/application.rb
207
187
  - spec/fixture_app/config/routes.rb
208
188
  - spec/fixture_app/controllers/base_filtered_controller.rb
@@ -224,6 +204,7 @@ files:
224
204
  - spec/lib/rory/application_spec.rb
225
205
  - spec/lib/rory/controller_spec.rb
226
206
  - spec/lib/rory/dispatcher_spec.rb
207
+ - spec/lib/rory/hash_with_dubious_semantics_spec.rb
227
208
  - spec/lib/rory/renderer/context_spec.rb
228
209
  - spec/lib/rory/renderer_spec.rb
229
210
  - spec/lib/rory/route_spec.rb
@@ -232,34 +213,29 @@ files:
232
213
  - spec/requests/controller_spec.rb
233
214
  - spec/spec_helper.rb
234
215
  - spec/support/shared_examples/path_generation.rb
235
- - LICENSE.txt
236
- - Rakefile
237
- - README.rdoc
238
- - rory.gemspec
239
216
  homepage: http://github.com/screamingmuse/rory
240
217
  licenses:
241
218
  - MIT
219
+ metadata: {}
242
220
  post_install_message:
243
221
  rdoc_options: []
244
222
  require_paths:
245
223
  - lib
246
224
  required_ruby_version: !ruby/object:Gem::Requirement
247
- none: false
248
225
  requirements:
249
- - - ! '>='
226
+ - - ">="
250
227
  - !ruby/object:Gem::Version
251
228
  version: 1.8.7
252
229
  required_rubygems_version: !ruby/object:Gem::Requirement
253
- none: false
254
230
  requirements:
255
- - - ! '>='
231
+ - - ">="
256
232
  - !ruby/object:Gem::Version
257
233
  version: 1.3.6
258
234
  requirements: []
259
235
  rubyforge_project:
260
- rubygems_version: 1.8.23
236
+ rubygems_version: 2.2.2
261
237
  signing_key:
262
- specification_version: 3
238
+ specification_version: 4
263
239
  summary: Another Ruby web framework. Just what the world needs.
264
240
  test_files: []
265
241
  has_rdoc:
data/README.rdoc DELETED
@@ -1,19 +0,0 @@
1
- = rory
2
-
3
- The Little Framework That Could, but why?
4
-
5
- == Contributing to rory
6
-
7
- * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
8
- * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
9
- * Fork the project.
10
- * Start a feature/bugfix branch.
11
- * Commit and push until you are happy with your contribution.
12
- * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
- * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
-
15
- == Copyright
16
-
17
- Copyright (c) 2013 Ravi Gadad. See LICENSE.txt for
18
- further details.
19
-