diff --git a/activeresource/lib/active_resource/schema.rb b/activeresource/lib/active_resource/schema.rb index 5758ac95026e10e6d5741bd21d524a455b2b25fd..3fd37a9bb6fdfb7864ff83a22ad82f6e0d3fd1a3 100644 --- a/activeresource/lib/active_resource/schema.rb +++ b/activeresource/lib/active_resource/schema.rb @@ -4,7 +4,7 @@ module ActiveResource # :nodoc: class Schema # :nodoc: # attributes can be known to be one of these types. They are easy to # cast to/from. - KNOWN_ATTRIBUTE_TYPES = %w( string integer float ) + KNOWN_ATTRIBUTE_TYPES = %w( string text integer float decimal datetime timestamp time date binary boolean ) # An array of attribute definitions, representing the attributes that # have been defined. @@ -39,8 +39,6 @@ def attribute(name, type, options = {}) # The following are the attribute types supported by Active Resource # migrations. - # TODO: We should eventually support all of these: - # %w( string text integer float decimal datetime timestamp time date binary boolean ).each do |attr_type| KNOWN_ATTRIBUTE_TYPES.each do |attr_type| class_eval <<-EOV, __FILE__, __LINE__ + 1 def #{attr_type.to_s}(*args) diff --git a/activeresource/test/cases/base/schema_test.rb b/activeresource/test/cases/base/schema_test.rb index 136c827926c2ba8665e3e72dcefd8e3708b8ec32..c27af9422ec8082346aee4805e8ea6030b8048c9 100644 --- a/activeresource/test/cases/base/schema_test.rb +++ b/activeresource/test/cases/base/schema_test.rb @@ -78,14 +78,23 @@ def teardown end test "schema should accept a simple hash" do - new_schema = {'age' => 'integer', 'name' => 'string'} + new_schema = {'age' => 'integer', 'name' => 'string', + 'height' => 'float', 'bio' => 'text', + 'weight' => 'decimal', 'photo' => 'binary', + 'alive' => 'boolean', 'created_at' => 'timestamp', + 'thetime' => 'time', 'thedate' => 'date', 'mydatetime' => 'datetime'} + assert_nothing_raised { Person.schema = new_schema } assert_equal new_schema, Person.schema end test "schema should accept a hash with simple values" do - new_schema = {'age' => 'integer', 'name' => 'string', 'height' => 'float', 'mydatetime' => 'string'} + new_schema = {'age' => 'integer', 'name' => 'string', + 'height' => 'float', 'bio' => 'text', + 'weight' => 'decimal', 'photo' => 'binary', + 'alive' => 'boolean', 'created_at' => 'timestamp', + 'thetime' => 'time', 'thedate' => 'date', 'mydatetime' => 'datetime'} assert_nothing_raised { Person.schema = new_schema } assert_equal new_schema, Person.schema @@ -109,7 +118,12 @@ def teardown end test "schema should accept nil and remove the schema" do - new_schema = {'age' => 'integer', 'name' => 'string'} + new_schema = {'age' => 'integer', 'name' => 'string', + 'height' => 'float', 'bio' => 'text', + 'weight' => 'decimal', 'photo' => 'binary', + 'alive' => 'boolean', 'created_at' => 'timestamp', + 'thetime' => 'time', 'thedate' => 'date', 'mydatetime' => 'datetime'} + assert_nothing_raised { Person.schema = new_schema } assert_equal new_schema, Person.schema # sanity check @@ -120,7 +134,12 @@ def teardown test "schema should be with indifferent access" do - new_schema = {:age => :integer, 'name' => 'string'} + new_schema = {'age' => 'integer', 'name' => 'string', + 'height' => 'float', 'bio' => 'text', + 'weight' => 'decimal', 'photo' => 'binary', + 'alive' => 'boolean', 'created_at' => 'timestamp', + 'thetime' => 'time', 'thedate' => 'date', 'mydatetime' => 'datetime'} + new_schema_syms = new_schema.keys assert_nothing_raised { Person.schema = new_schema } @@ -156,7 +175,12 @@ def teardown test "defining a schema should return it when asked" do assert Person.schema.blank?, "should have a blank class schema" - new_schema = {'name' => 'string', 'age' => 'integer', 'height' => 'float', 'weight' => 'float'} + new_schema = {'age' => 'integer', 'name' => 'string', + 'height' => 'float', 'bio' => 'text', + 'weight' => 'decimal', 'photo' => 'binary', + 'alive' => 'boolean', 'created_at' => 'timestamp', + 'thetime' => 'time', 'thedate' => 'date', 'mydatetime' => 'datetime'} + assert_nothing_raised { Person.schema = new_schema assert_equal new_schema, Person.schema, "should have saved the schema on the class" @@ -167,7 +191,11 @@ def teardown test "defining a schema, then fetching a model should still match the defined schema" do # sanity checks assert Person.schema.blank?, "should have a blank class schema" - new_schema = {'name' => 'string', 'age' => 'integer', 'height' => 'float', 'weight' => 'float'} + new_schema = {'age' => 'integer', 'name' => 'string', + 'height' => 'float', 'bio' => 'text', + 'weight' => 'decimal', 'photo' => 'binary', + 'alive' => 'boolean', 'created_at' => 'timestamp', + 'thetime' => 'time', 'thedate' => 'date', 'mydatetime' => 'datetime'} matz = Person.find(1) assert !matz.schema.blank?, "should have some sort of schema on an instance variable" @@ -368,12 +396,16 @@ def teardown end test "setting schema should set known attributes on class and instance" do - new_schema = {'age' => 'integer', 'name' => 'string'} + new_schema = {'age' => 'integer', 'name' => 'string', + 'height' => 'float', 'bio' => 'text', + 'weight' => 'decimal', 'photo' => 'binary', + 'alive' => 'boolean', 'created_at' => 'timestamp', + 'thetime' => 'time', 'thedate' => 'date', 'mydatetime' => 'datetime'} assert_nothing_raised { Person.schema = new_schema } - assert_equal new_schema.keys, Person.known_attributes - assert_equal new_schema.keys, Person.new.known_attributes + assert_equal new_schema.keys.sort, Person.known_attributes.sort + assert_equal new_schema.keys.sort, Person.new.known_attributes.sort end test "known attributes on a fetched resource should return all the attributes of the instance" do @@ -401,7 +433,11 @@ def teardown test "setting schema then fetching should add schema attributes to the intance attributes" do # an attribute in common with fetched instance and one that isn't - new_schema = {'name' => 'string', 'my_strange_attribute' => 'string'} + new_schema = {'age' => 'integer', 'name' => 'string', + 'height' => 'float', 'bio' => 'text', + 'weight' => 'decimal', 'photo' => 'binary', + 'alive' => 'boolean', 'created_at' => 'timestamp', + 'thetime' => 'time', 'thedate' => 'date', 'mydatetime' => 'datetime'} assert_nothing_raised { Person.schema = new_schema }