weasel_diesel 1.0.0

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.
@@ -0,0 +1,30 @@
1
+ # Module used to extend {WeaselDiesel} and add {#load_sinatra_route} to services.
2
+ # This code is Sinatra specific and therefore lives outside the {WeaselDiesel}
3
+ # @see {WeaselDiesel}
4
+ # @api public
5
+ module WeaselDieselSinatraExtension
6
+
7
+ # Defines a sinatra service route based on its settings
8
+ #
9
+ # @return [Nil]
10
+ # @api private
11
+ def load_sinatra_route
12
+ service = self
13
+ upcase_verb = service.verb.to_s.upcase
14
+ puts "/#{self.url} -> #{self.controller_name}##{self.action} - (#{upcase_verb})"
15
+
16
+ # Define the route directly to save some object allocations on the critical path
17
+ # Note that we are using a private API to define the route and that unlike sinatra usual DSL
18
+ # we do NOT define a HEAD route for every GET route.
19
+ Sinatra::Base.send(:route, upcase_verb, "/#{self.url}") do
20
+ service.controller_dispatch(self)
21
+ end
22
+
23
+ # Other alternative to the route definition, this time using the public API
24
+ # self.send(verb, "/#{service.url}") do
25
+ # service.controller_dispatch(self)
26
+ # end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,80 @@
1
+ require 'forwardable'
2
+ require File.expand_path('./../params_verification', File.dirname(__FILE__))
3
+
4
+ # Base code shared by all service controllers
5
+ # This allows us to share code between controllers
6
+ # more precisely to render templates and in general to use sinatra helpers
7
+ #
8
+ # @see Sinatra::Base and Sinatra::Helpers
9
+ # @api public
10
+ # @author Matt Aimonetti
11
+ class SinatraServiceController
12
+ extend Forwardable
13
+
14
+ # The service controller might be loaded outside of a Sinatra App
15
+ # in this case, we don't need to load the helpers
16
+ if Object.const_defined?(:Sinatra)
17
+ include Sinatra::Helpers
18
+ end
19
+
20
+ class AuthenticationFailed < StandardError; end
21
+
22
+ # @return [WeaselDiesel] The service served by this controller
23
+ # @api public
24
+ attr_reader :service
25
+
26
+ # @return [Sinatra::Application]
27
+ # @api public
28
+ attr_reader :app
29
+
30
+ # @return [Hash]
31
+ # @api public
32
+ attr_reader :env
33
+
34
+ # @return [Sinatra::Request]
35
+ # @see http://rubydoc.info/github/sinatra/sinatra/Sinatra/Request
36
+ # @api public
37
+ attr_reader :request
38
+
39
+ # @return [Sinatra::Response]
40
+ # @see http://rubydoc.info/github/sinatra/sinatra/Sinatra/Response
41
+ # @api public
42
+ attr_reader :response
43
+
44
+ # @return [Hash]
45
+ # @api public
46
+ attr_accessor :params
47
+
48
+ # @param [Sinatra::Application] app The Sinatra app used as a reference and to access request params
49
+ # @param [WeaselDiesel] service The service served by this controller
50
+ # @raise [ParamError, NoParamsDefined, MissingParam, UnexpectedParam, InvalidParamType, InvalidParamValue]
51
+ # If the params don't validate one of the {ParamsVerification} errors will be raised.
52
+ # @api public
53
+ def initialize(app, service)
54
+ @app = app
55
+ @env = app.env
56
+ @request = app.request
57
+ @response = app.response
58
+ @service = service
59
+
60
+ # raises an exception if the params are not valid
61
+ # otherwise update the app params with potentially new params (using default values)
62
+ # note that if a type if mentioned for a params, the object will be cast to this object type
63
+ @params = app.params = ParamsVerification.validate!(app.params, service.defined_params)
64
+
65
+ # Authentication check
66
+ if service.auth_required
67
+ raise AuthenticationFailed unless logged_in?
68
+ end
69
+ end
70
+
71
+
72
+ # Forwarding some methods to the underlying app object
73
+ def_delegators :app, :settings, :halt, :compile_template, :session
74
+
75
+ # Returns true or false if the player is logged in.
76
+ def logged_in?
77
+ !session[:player_id].nil?
78
+ end
79
+
80
+ end
@@ -0,0 +1,460 @@
1
+ #Copyright (c) 2010 Dan Kubb
2
+
3
+ #Permission is hereby granted, free of charge, to any person obtaining
4
+ #a copy of this software and associated documentation files (the
5
+ #"Software"), to deal in the Software without restriction, including
6
+ #without limitation the rights to use, copy, modify, merge, publish,
7
+ #distribute, sublicense, and/or sell copies of the Software, and to
8
+ #permit persons to whom the Software is furnished to do so, subject to
9
+ #the following conditions:
10
+
11
+ #The above copyright notice and this permission notice shall be
12
+ #included in all copies or substantial portions of the Software.
13
+
14
+ #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ #EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ #MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ #NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ #LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ #OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ #WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ #---
23
+
24
+ # Modified for the need of this software package
25
+
26
+ module ExtlibCopy
27
+
28
+ # Same as Inflection.classify but without the singularization
29
+ def self.classify(name)
30
+ words = name.to_s.sub(/.*\./, '').split('_')
31
+ words.collect { |word| word.capitalize }.join
32
+ end
33
+
34
+ # = English Nouns Number Inflection.
35
+ #
36
+ # This module provides english singular <-> plural noun inflections.
37
+ module Inflection
38
+
39
+ class << self
40
+ # Take an underscored name and make it into a camelized name
41
+ #
42
+ # @example
43
+ # "egg_and_hams".classify #=> "EggAndHam"
44
+ # "enlarged_testes".classify #=> "EnlargedTestis"
45
+ # "post".classify #=> "Post"
46
+ #
47
+ def classify(name)
48
+ words = name.to_s.sub(/.*\./, '').split('_')
49
+ words[-1] = singularize(words[-1])
50
+ words.collect { |word| word.capitalize }.join
51
+ end
52
+
53
+ # By default, camelize converts strings to UpperCamelCase.
54
+ #
55
+ # camelize will also convert '/' to '::' which is useful for converting paths to namespaces
56
+ #
57
+ # @example
58
+ # "active_record".camelize #=> "ActiveRecord"
59
+ # "active_record/errors".camelize #=> "ActiveRecord::Errors"
60
+ #
61
+ def camelize(lower_case_and_underscored_word, *args)
62
+ lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
63
+ end
64
+
65
+
66
+ # The reverse of +camelize+. Makes an underscored form from the expression in the string.
67
+ #
68
+ # Changes '::' to '/' to convert namespaces to paths.
69
+ #
70
+ # @example
71
+ # "ActiveRecord".underscore #=> "active_record"
72
+ # "ActiveRecord::Errors".underscore #=> active_record/errors
73
+ #
74
+ def underscore(camel_cased_word)
75
+ camel_cased_word.to_const_path
76
+ end
77
+
78
+ # Capitalizes the first word and turns underscores into spaces and strips _id.
79
+ # Like titleize, this is meant for creating pretty output.
80
+ #
81
+ # @example
82
+ # "employee_salary" #=> "Employee salary"
83
+ # "author_id" #=> "Author"
84
+ def humanize(lower_case_and_underscored_word)
85
+ lower_case_and_underscored_word.to_s.gsub(/_id$/, '').tr('_', ' ').capitalize
86
+ end
87
+
88
+ # Removes the module part from the expression in the string
89
+ #
90
+ # @example
91
+ # "ActiveRecord::CoreExtensions::String::Inflections".demodulize #=> "Inflections"
92
+ # "Inflections".demodulize #=> "Inflections"
93
+ def demodulize(class_name_in_module)
94
+ class_name_in_module.to_s.gsub(/^.*::/, '')
95
+ end
96
+
97
+ # Create the name of a table like Rails does for models to table names. This method
98
+ # uses the pluralize method on the last word in the string.
99
+ #
100
+ # @example
101
+ # "RawScaledScorer".tableize #=> "raw_scaled_scorers"
102
+ # "EnlargedTestis".tableize #=> "enlarged_testes"
103
+ # "egg_and_ham".tableize #=> "egg_and_hams"
104
+ # "fancyCategory".tableize #=> "fancy_categories"
105
+ def tableize(class_name)
106
+ words = class_name.to_const_path.tr('/', '_').split('_')
107
+ words[-1] = pluralize(words[-1])
108
+ words.join('_')
109
+ end
110
+
111
+ # Creates a foreign key name from a class name.
112
+ #
113
+ # @example
114
+ # "Message".foreign_key #=> "message_id"
115
+ # "Admin::Post".foreign_key #=> "post_id"
116
+ def foreign_key(class_name, key = "id")
117
+ underscore(demodulize(class_name.to_s)) << "_" << key.to_s
118
+ end
119
+
120
+ # Constantize tries to find a declared constant with the name specified
121
+ # in the string. It raises a NameError when the name is not in CamelCase
122
+ # or is not initialized.
123
+ #
124
+ # @example
125
+ # "Module".constantize #=> Module
126
+ # "Class".constantize #=> Class
127
+ def constantize(camel_cased_word)
128
+ unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ camel_cased_word
129
+ raise NameError, "#{camel_cased_word.inspect} is not a valid constant name!"
130
+ end
131
+
132
+ Object.module_eval("::#{$1}", __FILE__, __LINE__)
133
+ end
134
+ end
135
+
136
+ @singular_of = {}
137
+ @plural_of = {}
138
+
139
+ @singular_rules = []
140
+ @plural_rules = []
141
+
142
+ class << self
143
+ # Defines a general inflection exception case.
144
+ #
145
+ # ==== Parameters
146
+ # singular<String>::
147
+ # singular form of the word
148
+ # plural<String>::
149
+ # plural form of the word
150
+ #
151
+ # ==== Examples
152
+ #
153
+ # Here we define erratum/errata exception case:
154
+ #
155
+ # English::Inflect.word "erratum", "errata"
156
+ #
157
+ # In case singular and plural forms are the same omit
158
+ # second argument on call:
159
+ #
160
+ # English::Inflect.word 'information'
161
+ def word(singular, plural=nil)
162
+ plural = singular unless plural
163
+ singular_word(singular, plural)
164
+ plural_word(singular, plural)
165
+ end
166
+
167
+ def clear(type = :all)
168
+ if type == :singular || type == :all
169
+ @singular_of = {}
170
+ @singular_rules = []
171
+ @singularization_rules, @singularization_regex = nil, nil
172
+ end
173
+ if type == :plural || type == :all
174
+ @singular_of = {}
175
+ @singular_rules = []
176
+ @singularization_rules, @singularization_regex = nil, nil
177
+ end
178
+ end
179
+
180
+
181
+ # Define a singularization exception.
182
+ #
183
+ # ==== Parameters
184
+ # singular<String>::
185
+ # singular form of the word
186
+ # plural<String>::
187
+ # plural form of the word
188
+ def singular_word(singular, plural)
189
+ @singular_of[plural] = singular
190
+ @singular_of[plural.capitalize] = singular.capitalize
191
+ end
192
+
193
+ # Define a pluralization exception.
194
+ #
195
+ # ==== Parameters
196
+ # singular<String>::
197
+ # singular form of the word
198
+ # plural<String>::
199
+ # plural form of the word
200
+ def plural_word(singular, plural)
201
+ @plural_of[singular] = plural
202
+ @plural_of[singular.capitalize] = plural.capitalize
203
+ end
204
+
205
+ # Define a general rule.
206
+ #
207
+ # ==== Parameters
208
+ # singular<String>::
209
+ # ending of the word in singular form
210
+ # plural<String>::
211
+ # ending of the word in plural form
212
+ # whole_word<Boolean>::
213
+ # for capitalization, since words can be
214
+ # capitalized (Man => Men) #
215
+ # ==== Examples
216
+ # Once the following rule is defined:
217
+ # English::Inflect.rule 'y', 'ies'
218
+ #
219
+ # You can see the following results:
220
+ # irb> "fly".plural
221
+ # => flies
222
+ # irb> "cry".plural
223
+ # => cries
224
+ # Define a general rule.
225
+
226
+ def rule(singular, plural, whole_word = false)
227
+ singular_rule(singular, plural)
228
+ plural_rule(singular, plural)
229
+ word(singular, plural) if whole_word
230
+ end
231
+
232
+ # Define a singularization rule.
233
+ #
234
+ # ==== Parameters
235
+ # singular<String>::
236
+ # ending of the word in singular form
237
+ # plural<String>::
238
+ # ending of the word in plural form
239
+ #
240
+ # ==== Examples
241
+ # Once the following rule is defined:
242
+ # English::Inflect.singular_rule 'o', 'oes'
243
+ #
244
+ # You can see the following results:
245
+ # irb> "heroes".singular
246
+ # => hero
247
+ def singular_rule(singular, plural)
248
+ @singular_rules << [singular, plural]
249
+ end
250
+
251
+ # Define a plurualization rule.
252
+ #
253
+ # ==== Parameters
254
+ # singular<String>::
255
+ # ending of the word in singular form
256
+ # plural<String>::
257
+ # ending of the word in plural form
258
+ #
259
+ # ==== Examples
260
+ # Once the following rule is defined:
261
+ # English::Inflect.singular_rule 'fe', 'ves'
262
+ #
263
+ # You can see the following results:
264
+ # irb> "wife".plural
265
+ # => wives
266
+ def plural_rule(singular, plural)
267
+ @plural_rules << [singular, plural]
268
+ end
269
+
270
+ # Read prepared singularization rules.
271
+ def singularization_rules
272
+ if defined?(@singularization_regex) && @singularization_regex
273
+ return [@singularization_regex, @singularization_hash]
274
+ end
275
+ # No sorting needed: Regexen match on longest string
276
+ @singularization_regex = Regexp.new("(" + @singular_rules.map {|s,p| p}.join("|") + ")$", "i")
277
+ @singularization_hash = Hash[*@singular_rules.flatten].invert
278
+ [@singularization_regex, @singularization_hash]
279
+ end
280
+
281
+ # Read prepared pluralization rules.
282
+ def pluralization_rules
283
+ if defined?(@pluralization_regex) && @pluralization_regex
284
+ return [@pluralization_regex, @pluralization_hash]
285
+ end
286
+ @pluralization_regex = Regexp.new("(" + @plural_rules.map {|s,p| s}.join("|") + ")$", "i")
287
+ @pluralization_hash = Hash[*@plural_rules.flatten]
288
+ [@pluralization_regex, @pluralization_hash]
289
+ end
290
+
291
+ attr_reader :singular_of, :plural_of
292
+
293
+ # Convert an English word from plural to singular.
294
+ #
295
+ # "boys".singular #=> boy
296
+ # "tomatoes".singular #=> tomato
297
+ #
298
+ # ==== Parameters
299
+ # word<String>:: word to singularize
300
+ #
301
+ # ==== Returns
302
+ # <String>:: singularized form of word
303
+ #
304
+ # ==== Notes
305
+ # Aliased as singularize (a Railism)
306
+ def singular(word)
307
+ if result = singular_of[word]
308
+ return result.dup
309
+ end
310
+ result = word.dup
311
+ regex, hash = singularization_rules
312
+ result.sub!(regex) {|m| hash[m]}
313
+ singular_of[word] = result
314
+ return result
315
+ end
316
+
317
+ # Alias for #singular (a Railism).
318
+ #
319
+ alias_method(:singularize, :singular)
320
+
321
+ # Convert an English word from singular to plural.
322
+ #
323
+ # "boy".plural #=> boys
324
+ # "tomato".plural #=> tomatoes
325
+ #
326
+ # ==== Parameters
327
+ # word<String>:: word to pluralize
328
+ #
329
+ # ==== Returns
330
+ # <String>:: pluralized form of word
331
+ #
332
+ # ==== Notes
333
+ # Aliased as pluralize (a Railism)
334
+ def plural(word)
335
+ # special exceptions
336
+ return "" if word == ""
337
+ if result = plural_of[word]
338
+ return result.dup
339
+ end
340
+ result = word.dup
341
+ regex, hash = pluralization_rules
342
+ result.sub!(regex) {|m| hash[m]}
343
+ plural_of[word] = result
344
+ return result
345
+ end
346
+
347
+ # Alias for #plural (a Railism).
348
+ alias_method(:pluralize, :plural)
349
+ end
350
+
351
+ # One argument means singular and plural are the same.
352
+
353
+ word 'equipment'
354
+ word 'fish'
355
+ word 'grass'
356
+ word 'hovercraft'
357
+ word 'information'
358
+ word 'milk'
359
+ word 'money'
360
+ word 'moose'
361
+ word 'plurals'
362
+ word 'postgres'
363
+ word 'rain'
364
+ word 'rice'
365
+ word 'series'
366
+ word 'sheep'
367
+ word 'species'
368
+ word 'status'
369
+
370
+ # Two arguments defines a singular and plural exception.
371
+ word 'alias' , 'aliases'
372
+ word 'analysis' , 'analyses'
373
+ word 'axis' , 'axes'
374
+ word 'basis' , 'bases'
375
+ word 'buffalo' , 'buffaloes'
376
+ word 'cactus' , 'cacti'
377
+ word 'crisis' , 'crises'
378
+ word 'criterion' , 'criteria'
379
+ word 'cross' , 'crosses'
380
+ word 'datum' , 'data'
381
+ word 'diagnosis' , 'diagnoses'
382
+ word 'drive' , 'drives'
383
+ word 'erratum' , 'errata'
384
+ word 'goose' , 'geese'
385
+ word 'index' , 'indices'
386
+ word 'life' , 'lives'
387
+ word 'louse' , 'lice'
388
+ word 'matrix' , 'matrices'
389
+ word 'medium' , 'media'
390
+ word 'mouse' , 'mice'
391
+ word 'movie' , 'movies'
392
+ word 'octopus' , 'octopi'
393
+ word 'ox' , 'oxen'
394
+ word 'phenomenon' , 'phenomena'
395
+ word 'plus' , 'plusses'
396
+ word 'potato' , 'potatoes'
397
+ word 'quiz' , 'quizzes'
398
+ word 'status' , 'status'
399
+ word 'status' , 'statuses'
400
+ word 'Swiss' , 'Swiss'
401
+ word 'testis' , 'testes'
402
+ word 'thesaurus' , 'thesauri'
403
+ word 'thesis' , 'theses'
404
+ word 'thief' , 'thieves'
405
+ word 'tomato' , 'tomatoes'
406
+ word 'torpedo' , 'torpedoes'
407
+ word 'vertex' , 'vertices'
408
+ word 'wife' , 'wives'
409
+
410
+ # One-way singularization exception (convert plural to singular).
411
+
412
+ # General rules.
413
+ rule 'person' , 'people', true
414
+ rule 'shoe' , 'shoes', true
415
+ rule 'hive' , 'hives', true
416
+ rule 'man' , 'men', true
417
+ rule 'child' , 'children', true
418
+ rule 'news' , 'news', true
419
+ rule 'rf' , 'rves'
420
+ rule 'af' , 'aves'
421
+ rule 'ero' , 'eroes'
422
+ rule 'man' , 'men'
423
+ rule 'ch' , 'ches'
424
+ rule 'sh' , 'shes'
425
+ rule 'ss' , 'sses'
426
+ rule 'ta' , 'tum'
427
+ rule 'ia' , 'ium'
428
+ rule 'ra' , 'rum'
429
+ rule 'ay' , 'ays'
430
+ rule 'ey' , 'eys'
431
+ rule 'oy' , 'oys'
432
+ rule 'uy' , 'uys'
433
+ rule 'y' , 'ies'
434
+ rule 'x' , 'xes'
435
+ rule 'lf' , 'lves'
436
+ rule 'ffe' , 'ffes'
437
+ rule 'afe' , 'aves'
438
+ rule 'ouse' , 'ouses'
439
+ # more cases of words ending in -oses not being singularized properly
440
+ # than cases of words ending in -osis
441
+ # rule 'osis' , 'oses'
442
+ rule 'ox' , 'oxes'
443
+ rule 'us' , 'uses'
444
+ rule '' , 's'
445
+
446
+ # One-way singular rules.
447
+
448
+ singular_rule 'of' , 'ofs' # proof
449
+ singular_rule 'o' , 'oes' # hero, heroes
450
+ singular_rule 'f' , 'ves'
451
+
452
+ # One-way plural rules.
453
+
454
+ #plural_rule 'fe' , 'ves' # safe, wife
455
+ plural_rule 's' , 'ses'
456
+ plural_rule 'ive' , 'ives' # don't want to snag wife
457
+ plural_rule 'fe' , 'ves' # don't want to snag perspectives
458
+
459
+ end
460
+ end