waves 0.7.6 → 0.7.7
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.
- data/app/Rakefile +64 -6
- data/app/configurations/development.rb.erb +2 -1
- data/app/configurations/mapping.rb.erb +1 -0
- data/app/configurations/production.rb.erb +1 -0
- data/app/lib/application.rb.erb +2 -2
- data/bin/waves +36 -1
- data/doc/HISTORY +44 -0
- data/doc/LICENSE +22 -0
- data/doc/rdoc/classes/Erubis/Context.html +218 -0
- data/doc/rdoc/classes/Kernel.html +145 -0
- data/doc/rdoc/classes/Symbol.html +154 -0
- data/doc/rdoc/classes/Tempfile.html +161 -0
- data/doc/rdoc/classes/Waves.html +455 -0
- data/doc/rdoc/classes/Waves/Application.html +371 -0
- data/doc/rdoc/classes/Waves/Blackboard.html +296 -0
- data/doc/rdoc/classes/Waves/Configurations.html +283 -0
- data/doc/rdoc/classes/Waves/Configurations/Base.html +209 -0
- data/doc/rdoc/classes/Waves/Configurations/Default.html +237 -0
- data/doc/rdoc/classes/Waves/Console.html +187 -0
- data/doc/rdoc/classes/Waves/Controllers.html +203 -0
- data/doc/rdoc/classes/Waves/Controllers/Base.html +151 -0
- data/doc/rdoc/classes/Waves/Controllers/Mixin.html +312 -0
- data/doc/rdoc/classes/Waves/Dispatchers.html +118 -0
- data/doc/rdoc/classes/Waves/Dispatchers/Base.html +198 -0
- data/doc/rdoc/classes/Waves/Dispatchers/Default.html +224 -0
- data/doc/rdoc/classes/Waves/Dispatchers/NotFoundError.html +122 -0
- data/doc/rdoc/classes/Waves/Dispatchers/Redirect.html +173 -0
- data/doc/rdoc/classes/Waves/Foundations.html +131 -0
- data/doc/rdoc/classes/Waves/Foundations/Default.html +179 -0
- data/doc/rdoc/classes/Waves/Foundations/Simple.html +167 -0
- data/doc/rdoc/classes/Waves/Helpers.html +176 -0
- data/doc/rdoc/classes/Waves/Helpers/AssetHelper.html +212 -0
- data/doc/rdoc/classes/Waves/Helpers/Common.html +213 -0
- data/doc/rdoc/classes/Waves/Helpers/Default.html +135 -0
- data/doc/rdoc/classes/Waves/Helpers/Form.html +201 -0
- data/doc/rdoc/classes/Waves/Helpers/Formatting.html +232 -0
- data/doc/rdoc/classes/Waves/Helpers/Model.html +194 -0
- data/doc/rdoc/classes/Waves/Helpers/NumberHelper.html +165 -0
- data/doc/rdoc/classes/Waves/Helpers/TagHelper.html +226 -0
- data/doc/rdoc/classes/Waves/Helpers/UrlHelper.html +242 -0
- data/doc/rdoc/classes/Waves/Helpers/View.html +163 -0
- data/doc/rdoc/classes/Waves/Inflect/InflectorMethods.html +475 -0
- data/doc/rdoc/classes/Waves/Layers.html +175 -0
- data/doc/rdoc/classes/Waves/Layers/DefaultErrors.html +161 -0
- data/doc/rdoc/classes/Waves/Layers/Inflect.html +119 -0
- data/doc/rdoc/classes/Waves/Layers/Inflect/English.html +168 -0
- data/doc/rdoc/classes/Waves/Layers/Inflect/English/Rules.html +112 -0
- data/doc/rdoc/classes/Waves/Layers/Inflect/English/StringMethods.html +194 -0
- data/doc/rdoc/classes/Waves/Layers/MVC.html +204 -0
- data/doc/rdoc/classes/Waves/Layers/ORM/ActiveRecord.html +239 -0
- data/doc/rdoc/classes/Waves/Layers/ORM/ActiveRecord/ControllerMethods.html +246 -0
- data/doc/rdoc/classes/Waves/Layers/ORM/ActiveRecord/Symbol.html +132 -0
- data/doc/rdoc/classes/Waves/Layers/ORM/DataMapper.html +166 -0
- data/doc/rdoc/classes/Waves/Layers/ORM/Filebase.html +157 -0
- data/doc/rdoc/classes/Waves/Layers/ORM/Sequel.html +232 -0
- data/doc/rdoc/classes/Waves/Layers/ORM/Sequel/ControllerMethods.html +246 -0
- data/doc/rdoc/classes/Waves/Layers/Simple.html +169 -0
- data/doc/rdoc/classes/Waves/Layers/SimpleErrors.html +159 -0
- data/doc/rdoc/classes/Waves/Logger.html +288 -0
- data/doc/rdoc/classes/Waves/Mapping.html +760 -0
- data/doc/rdoc/classes/Waves/Mapping/PrettyUrls.html +129 -0
- data/doc/rdoc/classes/Waves/Mapping/PrettyUrls/GetRules.html +174 -0
- data/doc/rdoc/classes/Waves/Mapping/PrettyUrls/RestRules.html +180 -0
- data/doc/rdoc/classes/Waves/MimeTypes.html +200 -0
- data/doc/rdoc/classes/Waves/Renderers/Erubis.html +162 -0
- data/doc/rdoc/classes/Waves/Renderers/Haml.html +160 -0
- data/doc/rdoc/classes/Waves/Renderers/Markaby.html +167 -0
- data/doc/rdoc/classes/Waves/Renderers/Mixin.html +191 -0
- data/doc/rdoc/classes/Waves/Renderers/Scope.html +181 -0
- data/doc/rdoc/classes/Waves/Request.html +441 -0
- data/doc/rdoc/classes/Waves/Request/ParseError.html +111 -0
- data/doc/rdoc/classes/Waves/Response.html +283 -0
- data/doc/rdoc/classes/Waves/ResponseMixin.html +460 -0
- data/doc/rdoc/classes/Waves/ResponseProxy.html +269 -0
- data/doc/rdoc/classes/Waves/Server.html +488 -0
- data/doc/rdoc/classes/Waves/Session.html +330 -0
- data/doc/rdoc/classes/Waves/Utilities/Hash.html +185 -0
- data/doc/rdoc/classes/Waves/Utilities/Integer.html +424 -0
- data/doc/rdoc/classes/Waves/Utilities/Module.html +174 -0
- data/doc/rdoc/classes/Waves/Utilities/Object.html +155 -0
- data/doc/rdoc/classes/Waves/Utilities/Proc.html +145 -0
- data/doc/rdoc/classes/Waves/Utilities/String.html +290 -0
- data/doc/rdoc/classes/Waves/Views.html +278 -0
- data/doc/rdoc/classes/Waves/Views/Base.html +118 -0
- data/doc/rdoc/classes/Waves/Views/Mixin.html +279 -0
- data/doc/rdoc/classes/Waves/Views/NoTemplateError.html +111 -0
- data/doc/rdoc/created.rid +1 -0
- data/doc/rdoc/files/README_rdoc.html +415 -0
- data/doc/rdoc/files/bin/waves.html +135 -0
- data/doc/rdoc/files/doc/HISTORY.html +265 -0
- data/doc/rdoc/files/lib/commands/waves-console_rb.html +110 -0
- data/doc/rdoc/files/lib/commands/waves-server_rb.html +108 -0
- data/doc/rdoc/files/lib/controllers/base_rb.html +101 -0
- data/doc/rdoc/files/lib/controllers/mixin_rb.html +101 -0
- data/doc/rdoc/files/lib/dispatchers/base_rb.html +101 -0
- data/doc/rdoc/files/lib/dispatchers/default_rb.html +101 -0
- data/doc/rdoc/files/lib/foundations/default_rb.html +101 -0
- data/doc/rdoc/files/lib/foundations/simple_rb.html +101 -0
- data/doc/rdoc/files/lib/helpers/asset_helper_rb.html +101 -0
- data/doc/rdoc/files/lib/helpers/common_rb.html +101 -0
- data/doc/rdoc/files/lib/helpers/default_rb.html +101 -0
- data/doc/rdoc/files/lib/helpers/form_rb.html +101 -0
- data/doc/rdoc/files/lib/helpers/formatting_rb.html +108 -0
- data/doc/rdoc/files/lib/helpers/model_rb.html +101 -0
- data/doc/rdoc/files/lib/helpers/number_helper_rb.html +101 -0
- data/doc/rdoc/files/lib/helpers/tag_helper_rb.html +101 -0
- data/doc/rdoc/files/lib/helpers/url_helper_rb.html +101 -0
- data/doc/rdoc/files/lib/helpers/view_rb.html +101 -0
- data/doc/rdoc/files/lib/layers/default_errors_rb.html +101 -0
- data/doc/rdoc/files/lib/layers/inflect/english/rules_rb.html +101 -0
- data/doc/rdoc/files/lib/layers/inflect/english/string_rb.html +101 -0
- data/doc/rdoc/files/lib/layers/inflect/english_rb.html +109 -0
- data/doc/rdoc/files/lib/layers/mvc_rb.html +101 -0
- data/doc/rdoc/files/lib/layers/orm/active_record/tasks/generate_rb.html +101 -0
- data/doc/rdoc/files/lib/layers/orm/active_record/tasks/schema_rb.html +101 -0
- data/doc/rdoc/files/lib/layers/orm/active_record_rb.html +108 -0
- data/doc/rdoc/files/lib/layers/orm/data_mapper_rb.html +108 -0
- data/doc/rdoc/files/lib/layers/orm/filebase_rb.html +101 -0
- data/doc/rdoc/files/lib/layers/orm/migration_rb.html +101 -0
- data/doc/rdoc/files/lib/layers/orm/sequel/tasks/generate_rb.html +101 -0
- data/doc/rdoc/files/lib/layers/orm/sequel/tasks/schema_rb.html +101 -0
- data/doc/rdoc/files/lib/layers/orm/sequel_rb.html +108 -0
- data/doc/rdoc/files/lib/layers/simple_errors_rb.html +101 -0
- data/doc/rdoc/files/lib/layers/simple_rb.html +101 -0
- data/doc/rdoc/files/lib/mapping/mapping_rb.html +101 -0
- data/doc/rdoc/files/lib/mapping/pretty_urls_rb.html +101 -0
- data/doc/rdoc/files/lib/renderers/erubis_rb.html +108 -0
- data/doc/rdoc/files/lib/renderers/haml_rb.html +108 -0
- data/doc/rdoc/files/lib/renderers/markaby_rb.html +108 -0
- data/doc/rdoc/files/lib/renderers/mixin_rb.html +101 -0
- data/doc/rdoc/files/lib/runtime/application_rb.html +107 -0
- data/doc/rdoc/files/lib/runtime/blackboard_rb.html +101 -0
- data/doc/rdoc/files/lib/runtime/configuration_rb.html +101 -0
- data/doc/rdoc/files/lib/runtime/console_rb.html +101 -0
- data/doc/rdoc/files/lib/runtime/debugger_rb.html +101 -0
- data/doc/rdoc/files/lib/runtime/logger_rb.html +108 -0
- data/doc/rdoc/files/lib/runtime/mime_types_rb.html +101 -0
- data/doc/rdoc/files/lib/runtime/request_rb.html +101 -0
- data/doc/rdoc/files/lib/runtime/response_mixin_rb.html +101 -0
- data/doc/rdoc/files/lib/runtime/response_proxy_rb.html +101 -0
- data/doc/rdoc/files/lib/runtime/response_rb.html +101 -0
- data/doc/rdoc/files/lib/runtime/server_rb.html +108 -0
- data/doc/rdoc/files/lib/runtime/session_rb.html +101 -0
- data/doc/rdoc/files/lib/tasks/cluster_rb.html +101 -0
- data/doc/rdoc/files/lib/tasks/gem_rb.html +108 -0
- data/doc/rdoc/files/lib/tasks/generate_rb.html +101 -0
- data/doc/rdoc/files/lib/utilities/hash_rb.html +101 -0
- data/doc/rdoc/files/lib/utilities/inflect_rb.html +111 -0
- data/doc/rdoc/files/lib/utilities/integer_rb.html +101 -0
- data/doc/rdoc/files/lib/utilities/module_rb.html +101 -0
- data/doc/rdoc/files/lib/utilities/object_rb.html +101 -0
- data/doc/rdoc/files/lib/utilities/proc_rb.html +101 -0
- data/doc/rdoc/files/lib/utilities/string_rb.html +101 -0
- data/doc/rdoc/files/lib/utilities/symbol_rb.html +101 -0
- data/doc/rdoc/files/lib/utilities/tempfile_rb.html +115 -0
- data/doc/rdoc/files/lib/views/base_rb.html +101 -0
- data/doc/rdoc/files/lib/views/mixin_rb.html +101 -0
- data/doc/rdoc/files/lib/waves_rb.html +195 -0
- data/doc/rdoc/fr_class_index.html +104 -0
- data/doc/rdoc/fr_file_index.html +97 -0
- data/doc/rdoc/fr_method_index.html +233 -0
- data/doc/rdoc/index.html +24 -0
- data/doc/rdoc/rdoc-style.css +208 -0
- data/lib/foundations/default.rb +1 -0
- data/lib/layers/default_errors.rb +10 -13
- data/lib/layers/inflect/english.rb +24 -0
- data/lib/layers/inflect/english/rules.rb +88 -0
- data/lib/layers/inflect/english/string.rb +24 -0
- data/lib/layers/mvc.rb +31 -35
- data/lib/layers/orm/active_record.rb +83 -32
- data/lib/layers/orm/active_record/tasks/generate.rb +28 -0
- data/lib/layers/orm/active_record/tasks/schema.rb +7 -15
- data/lib/layers/orm/data_mapper.rb +12 -16
- data/lib/layers/orm/migration.rb +20 -11
- data/lib/layers/orm/sequel.rb +53 -49
- data/lib/layers/orm/sequel/tasks/generate.rb +28 -0
- data/lib/layers/orm/sequel/tasks/schema.rb +6 -14
- data/lib/layers/simple.rb +6 -13
- data/lib/layers/simple_errors.rb +5 -8
- data/lib/renderers/haml.rb +45 -0
- data/lib/runtime/application.rb +0 -2
- data/lib/tasks/cluster.rb +1 -1
- data/lib/utilities/inflect.rb +86 -168
- data/lib/utilities/integer.rb +23 -16
- data/lib/utilities/module.rb +19 -15
- data/lib/utilities/object.rb +22 -14
- data/lib/utilities/proc.rb +13 -7
- data/lib/utilities/string.rb +0 -12
- data/lib/utilities/symbol.rb +4 -1
- data/lib/utilities/tempfile.rb +9 -0
- data/lib/waves.rb +3 -1
- data/samples/blog/Rakefile +14 -0
- data/samples/blog/bin/waves-console +3 -0
- data/samples/blog/bin/waves-server +3 -0
- data/samples/blog/blog.db +0 -0
- data/samples/blog/configurations/development.rb +31 -0
- data/samples/blog/configurations/mapping.rb +23 -0
- data/samples/blog/configurations/production.rb +30 -0
- data/samples/blog/doc/EMTPY +0 -0
- data/samples/blog/lib/application.rb +5 -0
- data/samples/blog/models/comment.rb +14 -0
- data/samples/blog/models/entry.rb +14 -0
- data/samples/blog/public/css/site.css +2 -0
- data/samples/blog/public/javascript/site.js +13 -0
- data/samples/blog/schema/migrations/001_initial_schema.rb +17 -0
- data/samples/blog/schema/migrations/002_add_comments.rb +18 -0
- data/samples/blog/schema/migrations/templates/empty.rb.erb +9 -0
- data/samples/blog/startup.rb +6 -0
- data/samples/blog/templates/comment/add.mab +10 -0
- data/samples/blog/templates/comment/list.mab +6 -0
- data/samples/blog/templates/entry/editor.mab +13 -0
- data/samples/blog/templates/entry/list.mab +11 -0
- data/samples/blog/templates/entry/show.mab +9 -0
- data/samples/blog/templates/entry/summary.mab +5 -0
- data/samples/blog/templates/errors/not_found_404.mab +2 -0
- data/samples/blog/templates/errors/server_error_500.mab +2 -0
- data/samples/blog/templates/layouts/default.mab +17 -0
- data/samples/jub/Rakefile +72 -0
- data/samples/jub/bin/waves-console +4 -0
- data/samples/jub/bin/waves-server +4 -0
- data/samples/jub/configurations/development.rb +31 -0
- data/samples/jub/configurations/mapping.rb +18 -0
- data/samples/jub/configurations/production.rb +31 -0
- data/samples/jub/lib/application.rb +5 -0
- data/samples/jub/startup.rb +6 -0
- data/samples/jub/templates/errors/not_found_404.mab +2 -0
- data/samples/jub/templates/errors/server_error_500.mab +2 -0
- data/samples/jub/templates/layouts/default.mab +14 -0
- data/verify/app_generation/helpers.rb +24 -0
- data/verify/app_generation/startup.rb +39 -0
- data/verify/blackboard/blackboard_verify.rb +92 -0
- data/verify/blackboard/helpers.rb +5 -0
- data/verify/configurations/attributes.rb +37 -0
- data/verify/configurations/helpers.rb +1 -0
- data/verify/configurations/rack_integration.rb +29 -0
- data/verify/controllers/base.rb +37 -0
- data/verify/controllers/helpers.rb +13 -0
- data/verify/controllers/interface.rb +51 -0
- data/verify/core/helpers.rb +3 -0
- data/verify/core/utilities.rb +177 -0
- data/verify/foundations/default.rb +86 -0
- data/verify/foundations/default_application/Rakefile +14 -0
- data/verify/foundations/default_application/bin/waves-console +3 -0
- data/verify/foundations/default_application/bin/waves-server +3 -0
- data/verify/foundations/default_application/configurations/development.rb +26 -0
- data/verify/foundations/default_application/configurations/mapping.rb +14 -0
- data/verify/foundations/default_application/configurations/production.rb +30 -0
- data/verify/foundations/default_application/controllers/default.rb +15 -0
- data/verify/foundations/default_application/controllers/loaded.rb +15 -0
- data/verify/foundations/default_application/defaultapplication.db +0 -0
- data/verify/foundations/default_application/helpers/loaded.rb +10 -0
- data/verify/foundations/default_application/lib/application.rb +5 -0
- data/verify/foundations/default_application/models/default.rb +13 -0
- data/verify/foundations/default_application/models/loaded.rb +13 -0
- data/verify/foundations/default_application/schema/migrations/templates/empty.rb.erb +9 -0
- data/verify/foundations/default_application/startup.rb +7 -0
- data/verify/foundations/default_application/templates/errors/not_found_404.mab +2 -0
- data/verify/foundations/default_application/templates/errors/server_error_500.mab +2 -0
- data/verify/foundations/default_application/templates/layouts/default.mab +14 -0
- data/verify/foundations/default_application/views/default.rb +7 -0
- data/verify/foundations/default_application/views/loaded.rb +15 -0
- data/verify/foundations/helpers.rb +1 -0
- data/verify/foundations/simple.rb +25 -0
- data/verify/helpers.rb +76 -0
- data/verify/layers/data_mapper/association_verify.rb +87 -0
- data/verify/layers/default_errors.rb +29 -0
- data/verify/layers/helpers.rb +1 -0
- data/verify/layers/migration.rb +33 -0
- data/verify/layers/sequel/model.rb +41 -0
- data/verify/layers/sequeltest.db +0 -0
- data/verify/mapping/always.rb +19 -0
- data/verify/mapping/filters.rb +65 -0
- data/verify/mapping/handle.rb +24 -0
- data/verify/mapping/helpers.rb +7 -0
- data/verify/mapping/matches.rb +27 -0
- data/verify/mapping/named.rb +29 -0
- data/verify/mapping/options.rb +17 -0
- data/verify/mapping/path.rb +40 -0
- data/verify/mapping/response_proxy.rb +50 -0
- data/verify/mapping/threaded.rb +25 -0
- data/verify/requests/helpers.rb +16 -0
- data/verify/requests/request.rb +73 -0
- data/verify/requests/response.rb +59 -0
- data/verify/requests/session.rb +54 -0
- data/verify/views/helpers.rb +1 -0
- data/verify/views/rendering.rb +34 -0
- data/verify/views/templates/foo.erb +0 -0
- data/verify/views/templates/moo.erb +0 -0
- data/verify/views/templates/moo.mab +0 -0
- metadata +597 -224
- data/lib/utilities/kernel.rb +0 -34
|
@@ -15,27 +15,23 @@ module Waves
|
|
|
15
15
|
@adapter ||= ::DataMapper.setup(:main_repository, config.database[:database])
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
app.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
auto_load true, :directories => [:models]
|
|
22
|
-
end
|
|
18
|
+
app.auto_eval :Models do
|
|
19
|
+
auto_load true, :directories => [:models]
|
|
20
|
+
end
|
|
23
21
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
end
|
|
22
|
+
app.auto_eval :Configurations do
|
|
23
|
+
auto_eval :Mapping do
|
|
24
|
+
before true do
|
|
25
|
+
app.database #force adapter init if not already done
|
|
26
|
+
::DataMapper::Repository.context.push(::DataMapper::Repository.new(:main_repository))
|
|
27
|
+
end
|
|
28
|
+
always true do
|
|
29
|
+
::DataMapper::Repository.context.pop
|
|
33
30
|
end
|
|
34
31
|
end
|
|
35
|
-
|
|
36
32
|
end
|
|
33
|
+
|
|
37
34
|
end
|
|
38
|
-
|
|
39
35
|
end
|
|
40
36
|
end
|
|
41
37
|
end
|
data/lib/layers/orm/migration.rb
CHANGED
|
@@ -1,21 +1,30 @@
|
|
|
1
1
|
module Waves
|
|
2
|
-
module
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
# stuff in this file largely lifted from Sequel. Thanks, bro.
|
|
2
|
+
module Layers
|
|
3
|
+
|
|
4
|
+
# Helper methods to establish inter-ORM standards
|
|
5
|
+
module ORM
|
|
7
6
|
|
|
8
7
|
# Glob pattern
|
|
9
8
|
MIGRATION_FILE_PATTERN = '[0-9][0-9][0-9]_*.rb'.freeze
|
|
10
9
|
|
|
10
|
+
def self.create_migration_for(orm)
|
|
11
|
+
source = migration_template(orm.to_s.snake_case, ENV['template'])
|
|
12
|
+
destination = migration_destination(ENV['name'])
|
|
13
|
+
migration_name = migration_name(ENV['name'])
|
|
14
|
+
|
|
15
|
+
context = {:class_name => migration_name.camel_case}
|
|
16
|
+
|
|
17
|
+
write_migration(context, source, destination)
|
|
18
|
+
end
|
|
19
|
+
|
|
11
20
|
# Where Waves keeps its migration files
|
|
12
|
-
def self.
|
|
21
|
+
def self.migration_directory
|
|
13
22
|
:schema / :migrations
|
|
14
23
|
end
|
|
15
24
|
|
|
16
25
|
# Returns any found migration files in the supplied directory.
|
|
17
26
|
def self.migration_files(range = nil)
|
|
18
|
-
pattern =
|
|
27
|
+
pattern = migration_directory / MIGRATION_FILE_PATTERN
|
|
19
28
|
files = Dir[pattern].inject([]) do |m, path|
|
|
20
29
|
m[File.basename(path).to_i] = path
|
|
21
30
|
m
|
|
@@ -45,20 +54,20 @@ module Waves
|
|
|
45
54
|
|
|
46
55
|
# Returns the path to the migration template file for the given ORM.
|
|
47
56
|
# <em>orm</em> can be a symbol or string
|
|
48
|
-
def self.
|
|
57
|
+
def self.migration_template(orm, name=nil)
|
|
49
58
|
file = ( name || 'empty' ) + '.rb.erb'
|
|
50
59
|
source = File.dirname(__FILE__) / orm / :migrations / file
|
|
51
60
|
end
|
|
52
61
|
|
|
53
62
|
# Given a migration name, returns the path of the file that would be created.
|
|
54
|
-
def self.
|
|
63
|
+
def self.migration_destination(name)
|
|
55
64
|
version = next_migration_version
|
|
56
|
-
|
|
65
|
+
migration_directory / "#{'%03d' % version}_#{migration_name(name)}.rb"
|
|
57
66
|
end
|
|
58
67
|
|
|
59
68
|
# Takes an assigns hash as the Erubis context. Keys in the hash become
|
|
60
69
|
# instance variable names.
|
|
61
|
-
def self.
|
|
70
|
+
def self.write_migration(context, source, destination)
|
|
62
71
|
code = Erubis::Eruby.new( File.read( source ) ).evaluate( context )
|
|
63
72
|
puts "Creating #{destination}"
|
|
64
73
|
File.write( destination, code )
|
data/lib/layers/orm/sequel.rb
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
gem 'sequel', '>= 2.0.0'
|
|
2
|
-
require 'sequel'
|
|
3
|
-
require File.dirname(__FILE__) / :sequel / :tasks / :schema if defined?(Rake)
|
|
4
|
-
|
|
5
1
|
module Waves
|
|
6
2
|
module Layers
|
|
7
3
|
module ORM # :nodoc:
|
|
@@ -24,59 +20,67 @@ module Waves
|
|
|
24
20
|
#
|
|
25
21
|
def self.included(app)
|
|
26
22
|
|
|
23
|
+
gem 'sequel', '>= 2.0.0'
|
|
24
|
+
require 'sequel'
|
|
25
|
+
require "#{File.dirname(__FILE__)}/sequel/tasks/schema" if defined?(Rake)
|
|
26
|
+
require "#{File.dirname(__FILE__)}/sequel/tasks/generate" if defined?(Rake)
|
|
27
|
+
|
|
27
28
|
def app.database ; @sequel ||= ::Sequel.open( config.database ) ; end
|
|
29
|
+
|
|
30
|
+
app.auto_create_module( :Models ) do
|
|
31
|
+
include AutoCode
|
|
32
|
+
auto_create_class :Default, ::Sequel::Model
|
|
33
|
+
auto_load :Default, :directories => [ :models ]
|
|
34
|
+
end
|
|
28
35
|
|
|
29
|
-
app.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
# note that this is not done for app::Models::Default, as it isn't
|
|
42
|
-
# supposed to represent a table
|
|
43
|
-
auto_eval true do
|
|
44
|
-
default = superclass.basename.snake_case.pluralize.intern
|
|
45
|
-
if @dataset && @dataset.opts[:from] != [ default ]
|
|
46
|
-
# don't clobber dataset from autoloaded file
|
|
47
|
-
else
|
|
48
|
-
set_dataset Waves.application.database[ basename.snake_case.pluralize.intern ]
|
|
49
|
-
end
|
|
36
|
+
app.auto_eval :Models do
|
|
37
|
+
auto_create_class true, app::Models::Default
|
|
38
|
+
auto_load true, :directories => [ :models ]
|
|
39
|
+
# set the Sequel dataset based on the model class name
|
|
40
|
+
# note that this is not done for app::Models::Default, as it isn't
|
|
41
|
+
# supposed to represent a table
|
|
42
|
+
auto_eval true do
|
|
43
|
+
default = superclass.basename.snake_case.pluralize.intern
|
|
44
|
+
if @dataset && @dataset.opts[:from] != [ default ]
|
|
45
|
+
# don't clobber dataset from autoloaded file
|
|
46
|
+
else
|
|
47
|
+
set_dataset Waves.application.database[ basename.snake_case.pluralize.intern ]
|
|
50
48
|
end
|
|
51
49
|
end
|
|
50
|
+
end
|
|
52
51
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def find( name ) #:nodoc:
|
|
59
|
-
model[ :name => name ] or not_found
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def create #:nodoc:
|
|
63
|
-
model.create( attributes )
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def delete( name ) #:nodoc:
|
|
67
|
-
find( name ).destroy
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def update( name ) #:nodoc:
|
|
71
|
-
instance = find( name )
|
|
72
|
-
instance.update_with_params( attributes )
|
|
73
|
-
instance
|
|
74
|
-
end
|
|
75
|
-
end
|
|
52
|
+
Waves::Controllers::Base.instance_eval do
|
|
53
|
+
include Waves::Layers::ORM::Sequel::ControllerMethods
|
|
54
|
+
end
|
|
76
55
|
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Mixed into Waves::Controllers::Base. Provides ORM-specific helper methods for model access.
|
|
59
|
+
module ControllerMethods
|
|
60
|
+
def all
|
|
61
|
+
model.all
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def find( name )
|
|
65
|
+
model[ :name => name ] or not_found
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def create
|
|
69
|
+
model.create( attributes )
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def delete( name )
|
|
73
|
+
find( name ).destroy
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def update( name )
|
|
77
|
+
instance = find( name )
|
|
78
|
+
instance.update_with_params( attributes )
|
|
79
|
+
instance
|
|
77
80
|
end
|
|
78
81
|
end
|
|
79
|
-
|
|
82
|
+
|
|
83
|
+
end
|
|
80
84
|
end
|
|
81
85
|
end
|
|
82
86
|
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
namespace :generate do
|
|
2
|
+
|
|
3
|
+
desc 'Generate a Sequel model, with name=<name>'
|
|
4
|
+
task :model do |task|
|
|
5
|
+
name = ENV['name']
|
|
6
|
+
model_name = name.camel_case
|
|
7
|
+
raise "Cannot generate Default yet" if model_name == 'Default'
|
|
8
|
+
|
|
9
|
+
filename = File.expand_path "models/#{name}.rb"
|
|
10
|
+
if File.exist?(filename)
|
|
11
|
+
$stderr.puts "#{filename} already exists"
|
|
12
|
+
exit
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
model = <<TEXT
|
|
16
|
+
module #{Waves.application.name}
|
|
17
|
+
module Models
|
|
18
|
+
class #{model_name} < Default
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
TEXT
|
|
24
|
+
|
|
25
|
+
File.write( filename, model )
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
@@ -1,24 +1,16 @@
|
|
|
1
|
-
require File.dirname(__FILE__)
|
|
2
|
-
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../../migration"
|
|
2
|
+
|
|
3
3
|
namespace :schema do
|
|
4
4
|
|
|
5
|
-
desc "Create a new Sequel Migration
|
|
5
|
+
desc "Create a new Sequel Migration with name=<name>"
|
|
6
6
|
task :migration do |task|
|
|
7
|
-
|
|
8
|
-
source = Migration.template(:sequel, ENV['template'])
|
|
9
|
-
destination = Migration.destination(ENV['name'])
|
|
10
|
-
migration_name = Migration.migration_name(ENV['name'])
|
|
11
|
-
|
|
12
|
-
context = {:class_name => migration_name.camel_case}
|
|
13
|
-
|
|
14
|
-
Migration.write_erb(context, source, destination)
|
|
15
|
-
|
|
7
|
+
Waves::Layers::ORM.create_migration_for(Sequel)
|
|
16
8
|
end
|
|
17
9
|
|
|
18
|
-
desc
|
|
10
|
+
desc "Performs Sequel migrations to version=<version>"
|
|
19
11
|
task :migrate do |task|
|
|
20
12
|
version = ENV['version']; version = version.to_i unless version.nil?
|
|
21
|
-
Sequel::Migrator.apply( Waves.application.database,
|
|
13
|
+
Sequel::Migrator.apply( Waves.application.database, Waves::Layers::ORM.migration_directory , version )
|
|
22
14
|
end
|
|
23
15
|
|
|
24
16
|
end
|
data/lib/layers/simple.rb
CHANGED
|
@@ -17,20 +17,13 @@ module Waves
|
|
|
17
17
|
def app.config ; Waves.config ; end
|
|
18
18
|
def app.configurations ; self::Configurations ; end
|
|
19
19
|
|
|
20
|
-
app.instance_eval
|
|
21
|
-
|
|
20
|
+
app.instance_eval { include AutoCode }
|
|
21
|
+
|
|
22
|
+
app.auto_create_module( :Configurations ) do
|
|
22
23
|
include AutoCode
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
auto_create_class true, Waves::Configurations::Default
|
|
27
|
-
auto_load :Mapping, :directories => [:configurations]
|
|
28
|
-
auto_load true, :directories => [:configurations]
|
|
29
|
-
auto_eval :Mapping do
|
|
30
|
-
extend Waves::Mapping
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
24
|
+
auto_create_class true, Waves::Configurations::Default
|
|
25
|
+
auto_load :Mapping, :directories => [:configurations]
|
|
26
|
+
auto_load true, :directories => [:configurations]
|
|
34
27
|
end
|
|
35
28
|
end
|
|
36
29
|
end
|
data/lib/layers/simple_errors.rb
CHANGED
|
@@ -9,17 +9,14 @@ module Waves
|
|
|
9
9
|
|
|
10
10
|
def self.included( app )
|
|
11
11
|
|
|
12
|
-
app.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
handle(Waves::Dispatchers::NotFoundError) do
|
|
17
|
-
response.status = 404; response.body = "404 Not Found"
|
|
18
|
-
end
|
|
12
|
+
app.auto_eval :Configurations do
|
|
13
|
+
auto_eval :Mapping do
|
|
14
|
+
handle(Waves::Dispatchers::NotFoundError) do
|
|
15
|
+
response.status = 404; response.body = "404 Not Found"
|
|
19
16
|
end
|
|
20
17
|
end
|
|
21
|
-
|
|
22
18
|
end
|
|
19
|
+
|
|
23
20
|
end
|
|
24
21
|
end
|
|
25
22
|
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'haml'
|
|
2
|
+
|
|
3
|
+
module Waves
|
|
4
|
+
|
|
5
|
+
module Renderers
|
|
6
|
+
|
|
7
|
+
class Scope
|
|
8
|
+
include Waves::Helpers::Common
|
|
9
|
+
include Waves::Helpers::Model
|
|
10
|
+
include Waves::Helpers::TagHelper
|
|
11
|
+
include Waves::Helpers::UrlHelper
|
|
12
|
+
include Waves::Helpers::View
|
|
13
|
+
|
|
14
|
+
def <<(s)
|
|
15
|
+
eval("@haml_buffer", @binding).push_text s # add to rendered output
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def capture(&block)
|
|
19
|
+
capture_haml(nil, &block)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class Haml
|
|
25
|
+
|
|
26
|
+
include Renderers::Mixin
|
|
27
|
+
|
|
28
|
+
extension :haml
|
|
29
|
+
|
|
30
|
+
def self.render( path, assigns )
|
|
31
|
+
engine = ::Haml::Engine.new( template( path ) )
|
|
32
|
+
scope = Scope.new
|
|
33
|
+
helper = helper( path )
|
|
34
|
+
scope.meta_eval { include( helper ) }
|
|
35
|
+
scope.instance_eval do
|
|
36
|
+
assigns.each { |key,val| instance_variable_set("@#{key}",val) unless key == :request }
|
|
37
|
+
end
|
|
38
|
+
engine.render(scope, assigns)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
end
|
data/lib/runtime/application.rb
CHANGED
|
@@ -7,10 +7,8 @@ module Waves
|
|
|
7
7
|
attr_reader :application
|
|
8
8
|
|
|
9
9
|
# Register a module as a Waves application.
|
|
10
|
-
# Also, initialize the database connection if necessary.
|
|
11
10
|
def << ( app )
|
|
12
11
|
@application = app if Module === app
|
|
13
|
-
# app.database if app.respond_to? 'database'
|
|
14
12
|
end
|
|
15
13
|
|
|
16
14
|
def instance ; Waves::Application.instance ; end
|
data/lib/tasks/cluster.rb
CHANGED
|
@@ -2,7 +2,7 @@ namespace :cluster do
|
|
|
2
2
|
|
|
3
3
|
desc 'Start a cluster of waves applications.'
|
|
4
4
|
task :start do |task|
|
|
5
|
-
using_waves_src = defined?(WAVES) || ENV['WAVES'] || File.exist( File.dirname(__FILE__) / :waves )
|
|
5
|
+
using_waves_src = defined?(WAVES) || ENV['WAVES'] || File.exist?( File.dirname(__FILE__) / :waves )
|
|
6
6
|
script = using_waves_src ? :bin / 'waves-server' : 'waves-server'
|
|
7
7
|
( Waves::Console.config.ports || [ Waves::Console.config.port ] ).each do |port|
|
|
8
8
|
cmd = "#{script} -p #{port} -c #{ENV['mode']||'development'} -d"
|
data/lib/utilities/inflect.rb
CHANGED
|
@@ -4,189 +4,107 @@
|
|
|
4
4
|
# of rules for different languages
|
|
5
5
|
# NOTE: this is NOT implemented yet.
|
|
6
6
|
# plural and singular work directly with the English class
|
|
7
|
+
module Waves
|
|
8
|
+
module Inflect # :nodoc:
|
|
9
|
+
module InflectorMethods
|
|
10
|
+
|
|
11
|
+
# Define a general exception.
|
|
12
|
+
def word(singular, plural=nil)
|
|
13
|
+
plural = singular unless plural
|
|
14
|
+
singular_word(singular, plural)
|
|
15
|
+
plural_word(singular, plural)
|
|
16
|
+
end
|
|
7
17
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def word(singular, plural=nil)
|
|
13
|
-
plural = singular unless plural
|
|
14
|
-
singular_word(singular, plural)
|
|
15
|
-
plural_word(singular, plural)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# Define a singularization exception.
|
|
19
|
-
def singular_word(singular, plural)
|
|
20
|
-
@singular_of[plural] = singular
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# Define a pluralization exception.
|
|
24
|
-
def plural_word(singular, plural)
|
|
25
|
-
@plural_of[singular] = plural
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# Define a general rule.
|
|
29
|
-
def rule(singular, plural)
|
|
30
|
-
singular_rule(singular, plural)
|
|
31
|
-
plural_rule(singular, plural)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Define a singularization rule.
|
|
35
|
-
def singular_rule(singular, plural)
|
|
36
|
-
@singular_rules << [singular, plural]
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
# Define a plurualization rule.
|
|
40
|
-
def plural_rule(singular, plural)
|
|
41
|
-
@plural_rules << [singular, plural]
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# Read prepared singularization rules.
|
|
45
|
-
def singularization_rules
|
|
46
|
-
return @singularization_rules if @singularization_rules
|
|
47
|
-
sorted = @singular_rules.sort_by{ |s, p| "#{p}".size }.reverse
|
|
48
|
-
@singularization_rules = sorted.collect do |s, p|
|
|
49
|
-
[ /#{p}$/, "#{s}" ]
|
|
18
|
+
# Define a singularization exception.
|
|
19
|
+
def singular_word(singular, plural)
|
|
20
|
+
@singular_of ||= {}
|
|
21
|
+
@singular_of[plural] = singular
|
|
50
22
|
end
|
|
51
|
-
end
|
|
52
23
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
@pluralization_rules = sorted.collect do |s, p|
|
|
58
|
-
[ /#{s}$/, "#{p}" ]
|
|
24
|
+
# Define a pluralization exception.
|
|
25
|
+
def plural_word(singular, plural)
|
|
26
|
+
@plural_of ||= {}
|
|
27
|
+
@plural_of[singular] = plural
|
|
59
28
|
end
|
|
60
|
-
end
|
|
61
29
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
30
|
+
# Define a general rule.
|
|
31
|
+
def rule(singular, plural)
|
|
32
|
+
singular_rule(singular, plural)
|
|
33
|
+
plural_rule(singular, plural)
|
|
34
|
+
end
|
|
66
35
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
36
|
+
# Define a singularization rule.
|
|
37
|
+
def singular_rule(singular, plural)
|
|
38
|
+
(@singular_rules ||= []) << [singular, plural]
|
|
39
|
+
end
|
|
71
40
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
# "tomatoes".singular #=> tomato
|
|
76
|
-
#
|
|
77
|
-
def singular(word)
|
|
78
|
-
if result = singular_of[word]
|
|
79
|
-
return result.dup
|
|
41
|
+
# Define a plurualization rule.
|
|
42
|
+
def plural_rule(singular, plural)
|
|
43
|
+
(@plural_rules ||= []) << [singular, plural]
|
|
80
44
|
end
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
45
|
+
|
|
46
|
+
# Read prepared singularization rules.
|
|
47
|
+
def singularization_rules
|
|
48
|
+
@singular_rules ||= []
|
|
49
|
+
return @singularization_rules if @singularization_rules
|
|
50
|
+
sorted = @singular_rules.sort_by{ |s, p| "#{p}".size }.reverse
|
|
51
|
+
@singularization_rules = sorted.collect do |s, p|
|
|
52
|
+
[ /#{p}$/, "#{s}" ]
|
|
53
|
+
end
|
|
84
54
|
end
|
|
85
|
-
return result
|
|
86
|
-
end
|
|
87
55
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
56
|
+
# Read prepared pluralization rules.
|
|
57
|
+
def pluralization_rules
|
|
58
|
+
@plural_rules ||= []
|
|
59
|
+
return @pluralization_rules if @pluralization_rules
|
|
60
|
+
sorted = @plural_rules.sort_by{ |s, p| "#{s}".size }.reverse
|
|
61
|
+
@pluralization_rules = sorted.collect do |s, p|
|
|
62
|
+
[ /#{s}$/, "#{p}" ]
|
|
63
|
+
end
|
|
96
64
|
end
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
65
|
+
|
|
66
|
+
#
|
|
67
|
+
def plural_of
|
|
68
|
+
@plural_of ||= {}
|
|
101
69
|
end
|
|
102
|
-
return result
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
70
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
71
|
+
#
|
|
72
|
+
def singular_of
|
|
73
|
+
@singular_of ||= {}
|
|
74
|
+
end
|
|
109
75
|
|
|
110
|
-
|
|
111
|
-
|
|
76
|
+
# Convert an English word from plural to singular.
|
|
77
|
+
#
|
|
78
|
+
# "boys".singular #=> boy
|
|
79
|
+
# "tomatoes".singular #=> tomato
|
|
80
|
+
#
|
|
81
|
+
def singular(word)
|
|
82
|
+
if result = singular_of[word]
|
|
83
|
+
return result.dup
|
|
84
|
+
end
|
|
85
|
+
result = word.dup
|
|
86
|
+
singularization_rules.each do |(match, replacement)|
|
|
87
|
+
break if result.gsub!(match, replacement)
|
|
88
|
+
end
|
|
89
|
+
return result
|
|
90
|
+
end
|
|
112
91
|
|
|
113
|
-
|
|
114
|
-
|
|
92
|
+
# Convert an English word from singular to plurel.
|
|
93
|
+
#
|
|
94
|
+
# "boy".plural #=> boys
|
|
95
|
+
# "tomato".plural #=> tomatoes
|
|
96
|
+
#
|
|
97
|
+
def plural(word)
|
|
98
|
+
if result = plural_of[word]
|
|
99
|
+
return result.dup
|
|
100
|
+
end
|
|
101
|
+
#return self.dup if /s$/ =~ self # ???
|
|
102
|
+
result = word.dup
|
|
103
|
+
pluralization_rules.each do |(match, replacement)|
|
|
104
|
+
break if result.gsub!(match, replacement)
|
|
105
|
+
end
|
|
106
|
+
return result
|
|
107
|
+
end
|
|
115
108
|
end
|
|
116
|
-
|
|
117
|
-
# One argument means singular and plural are the same.
|
|
118
|
-
word 'equipment'
|
|
119
|
-
word 'information'
|
|
120
|
-
word 'money'
|
|
121
|
-
word 'species'
|
|
122
|
-
word 'series'
|
|
123
|
-
word 'fish'
|
|
124
|
-
word 'sheep'
|
|
125
|
-
word 'moose'
|
|
126
|
-
word 'hovercraft'
|
|
127
|
-
|
|
128
|
-
# Two arguments defines a singular and plural exception.
|
|
129
|
-
word 'Swiss' , 'Swiss'
|
|
130
|
-
word 'life' , 'lives'
|
|
131
|
-
word 'wife' , 'wives'
|
|
132
|
-
word 'cactus' , 'cacti'
|
|
133
|
-
word 'goose' , 'geese'
|
|
134
|
-
word 'criterion' , 'criteria'
|
|
135
|
-
word 'alias' , 'aliases'
|
|
136
|
-
word 'status' , 'statuses'
|
|
137
|
-
word 'axis' , 'axes'
|
|
138
|
-
word 'crisis' , 'crises'
|
|
139
|
-
word 'testis' , 'testes'
|
|
140
|
-
word 'child' , 'children'
|
|
141
|
-
word 'person' , 'people'
|
|
142
|
-
word 'potato' , 'potatoes'
|
|
143
|
-
word 'tomato' , 'tomatoes'
|
|
144
|
-
word 'buffalo' , 'buffaloes'
|
|
145
|
-
word 'torpedo' , 'torpedoes'
|
|
146
|
-
word 'quiz' , 'quizes'
|
|
147
|
-
word 'matrix' , 'matrices'
|
|
148
|
-
word 'vertex' , 'vetices'
|
|
149
|
-
word 'index' , 'indices'
|
|
150
|
-
word 'ox' , 'oxen'
|
|
151
|
-
word 'mouse' , 'mice'
|
|
152
|
-
word 'louse' , 'lice'
|
|
153
|
-
word 'thesis' , 'theses'
|
|
154
|
-
word 'thief' , 'thieves'
|
|
155
|
-
word 'analysis' , 'analyses'
|
|
156
|
-
|
|
157
|
-
# One-way singularization exception (convert plural to singular).
|
|
158
|
-
singular_word 'cactus', 'cacti'
|
|
159
|
-
|
|
160
|
-
# General rules.
|
|
161
|
-
rule 'hive' , 'hives'
|
|
162
|
-
rule 'rf' , 'rves'
|
|
163
|
-
rule 'af' , 'aves'
|
|
164
|
-
rule 'ero' , 'eroes'
|
|
165
|
-
rule 'man' , 'men'
|
|
166
|
-
rule 'ch' , 'ches'
|
|
167
|
-
rule 'sh' , 'shes'
|
|
168
|
-
rule 'ss' , 'sses'
|
|
169
|
-
rule 'ta' , 'tum'
|
|
170
|
-
rule 'ia' , 'ium'
|
|
171
|
-
rule 'ra' , 'rum'
|
|
172
|
-
rule 'ay' , 'ays'
|
|
173
|
-
rule 'ey' , 'eys'
|
|
174
|
-
rule 'oy' , 'oys'
|
|
175
|
-
rule 'uy' , 'uys'
|
|
176
|
-
rule 'y' , 'ies'
|
|
177
|
-
rule 'x' , 'xes'
|
|
178
|
-
rule 'lf' , 'lves'
|
|
179
|
-
rule 'us' , 'uses'
|
|
180
|
-
rule '' , 's'
|
|
181
|
-
|
|
182
|
-
# One-way singular rules.
|
|
183
|
-
singular_rule 'of' , 'ofs' # proof
|
|
184
|
-
singular_rule 'o' , 'oes' # hero, heroes
|
|
185
|
-
singular_rule 'f' , 'ves'
|
|
186
|
-
|
|
187
|
-
# One-way plural rules.
|
|
188
|
-
plural_rule 'fe' , 'ves' # safe, wife
|
|
189
|
-
plural_rule 's' , 'ses'
|
|
190
109
|
end
|
|
191
110
|
end
|
|
192
|
-
|