aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
diff options
context:
space:
mode:
authorJoshua Peek <josh@joshpeek.com>2009-06-17 10:37:39 -0500
committerJoshua Peek <josh@joshpeek.com>2009-06-17 10:37:39 -0500
commit1c4d28ba314c8cdd0039becf3bc9e678219b8f46 (patch)
tree67a4b6db06cc9c26145de94f06f3fe8e1adf7953 /activemodel
parent85f2f34d5ec8ccdea4755740b810ac514d9f3dd9 (diff)
downloadrails-1c4d28ba314c8cdd0039becf3bc9e678219b8f46.tar.gz
rails-1c4d28ba314c8cdd0039becf3bc9e678219b8f46.tar.bz2
rails-1c4d28ba314c8cdd0039becf3bc9e678219b8f46.zip
Move model naming into ActiveModel
Diffstat (limited to 'activemodel')
-rw-r--r--activemodel/lib/active_model.rb2
-rw-r--r--activemodel/lib/active_model/naming.rb25
-rw-r--r--activemodel/test/cases/naming_test.rb27
3 files changed, 54 insertions, 0 deletions
diff --git a/activemodel/lib/active_model.rb b/activemodel/lib/active_model.rb
index 73cee9b88f..f8e5725e9c 100644
--- a/activemodel/lib/active_model.rb
+++ b/activemodel/lib/active_model.rb
@@ -29,6 +29,8 @@ module ActiveModel
autoload :Base, 'active_model/base'
autoload :DeprecatedErrorMethods, 'active_model/deprecated_error_methods'
autoload :Errors, 'active_model/errors'
+ autoload :Name, 'active_model/naming'
+ autoload :Naming, 'active_model/naming'
autoload :Observer, 'active_model/observing'
autoload :Observing, 'active_model/observing'
autoload :StateMachine, 'active_model/state_machine'
diff --git a/activemodel/lib/active_model/naming.rb b/activemodel/lib/active_model/naming.rb
new file mode 100644
index 0000000000..ffb44e3824
--- /dev/null
+++ b/activemodel/lib/active_model/naming.rb
@@ -0,0 +1,25 @@
+require 'active_support/inflector'
+
+module ActiveModel
+ class Name < String
+ attr_reader :singular, :plural, :element, :collection, :partial_path
+ alias_method :cache_key, :collection
+
+ def initialize(name)
+ super
+ @singular = ActiveSupport::Inflector.underscore(self).tr('/', '_').freeze
+ @plural = ActiveSupport::Inflector.pluralize(@singular).freeze
+ @element = ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self)).freeze
+ @collection = ActiveSupport::Inflector.tableize(self).freeze
+ @partial_path = "#{@collection}/#{@element}".freeze
+ end
+ end
+
+ module Naming
+ # Returns an ActiveModel::Name object for module. It can be
+ # used to retrieve all kinds of naming-related information.
+ def model_name
+ @_model_name ||= ActiveModel::Name.new(name)
+ end
+ end
+end
diff --git a/activemodel/test/cases/naming_test.rb b/activemodel/test/cases/naming_test.rb
new file mode 100644
index 0000000000..e75d4541a3
--- /dev/null
+++ b/activemodel/test/cases/naming_test.rb
@@ -0,0 +1,27 @@
+require 'cases/helper'
+
+class NamingTest < Test::Unit::TestCase
+ def setup
+ @model_name = ActiveModel::Name.new('Post::TrackBack')
+ end
+
+ def test_singular
+ assert_equal 'post_track_back', @model_name.singular
+ end
+
+ def test_plural
+ assert_equal 'post_track_backs', @model_name.plural
+ end
+
+ def test_element
+ assert_equal 'track_back', @model_name.element
+ end
+
+ def test_collection
+ assert_equal 'post/track_backs', @model_name.collection
+ end
+
+ def test_partial_path
+ assert_equal 'post/track_backs/track_back', @model_name.partial_path
+ end
+end