activerecord_enum 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (C) 2011 by Ian Young
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.markdown CHANGED
@@ -1,18 +1,29 @@
1
- # ActiveRecord Enum
1
+ # ActiveRecord Enum #
2
2
 
3
3
  Provides ActiveRecord support for the nonstandard `ENUM` and `SET` data types.
4
4
 
5
5
  [![Build Status](http://travis-ci.org/iangreenleaf/activerecord_enum.png)](http://travis-ci.org/iangreenleaf/activerecord_enum)
6
6
 
7
- ## Hypothetically asked questions
7
+ ## Hypothetically asked questions ##
8
8
 
9
- ### Y U NO WORK?!
10
- Sorry, it currently only works with Rails 3.0.x and the mysql2 adapter. I plan to support 3.1.x and other adapters at some point.
9
+ ### Y U NO WORK?! ###
11
10
 
12
- ### Why doesn't it validate anything?
13
- Right now it really only supports schema operations - attribute access is left untouched. I'll be working on that too at some point.
11
+ Sorry, it currently only works with Rails 3.0.x and the mysql2 and sqlite adapters. I plan to support 3.1.x and other standard adapters at some point.
12
+
13
+ ### Why doesn't it validate anything? ###
14
+
15
+ Following ActiveRecord's lead, this plugin doesn't do any validation work itself.
16
+
17
+ For ENUM columns, you may be satisfied with something simple:
18
+
19
+ validates_inclusion_of :attr, :in => [ :possible, :values ]
20
+
21
+ Or if you prefer more bells and whistles, try [nofxx/symbolize](https://github.com/nofxx/symbolize).
22
+
23
+ For SET columns, you may be interested in [iangreenleaf/active_set](https://github.com/iangreenleaf/active_set).
24
+
25
+ ### Nonstandard SQL?! What's your problem, jerkweed? ###
14
26
 
15
- ### Nonstandard SQL?! What's your problem, jerkweed?
16
27
  This isn't a plugin everyone should use. There are a number of plugins to simulate enum behavior backed by standard data types. Personally, I like [nofxx/symbolize](https://github.com/nofxx/symbolize).
17
28
 
18
29
  However, sometimes we can't or won't avoid working with these data types. When that happens, I got you covered.
data/Rakefile CHANGED
@@ -27,6 +27,7 @@ namespace :spec do
27
27
  db_config = YAML::load(IO.read(DB_CONFIG))
28
28
  db_config.each do |db,config|
29
29
  ENV["DB"] = db
30
+ Rake::Task["spec"].reenable
30
31
  Rake::Task["spec"].invoke
31
32
  end
32
33
  end
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.add_development_dependency "rake"
19
19
  s.add_development_dependency "bundler"
20
20
  s.add_development_dependency "mysql2", "~> 0.2.0"
21
+ s.add_development_dependency "sqlite3", "~>1.3.4"
21
22
  s.add_development_dependency "rspec", "~> 2.6.0"
22
23
 
23
24
  s.files = `git ls-files`.split("\n")
@@ -1,23 +1,8 @@
1
1
  require 'active_record'
2
2
  require 'active_record/base'
3
3
  require 'active_record/connection_adapters/mysql2_adapter'
4
+ require 'active_record/connection_adapters/sqlite3_adapter'
4
5
  require 'active_record/connection_adapters/abstract/schema_definitions.rb'
5
- require 'active_record/attribute_methods/write'
6
-
7
- module ActiveRecord
8
- module AttributeMethods
9
- module Write
10
- def write_attribute_with_enum(attr_name, value)
11
- if (column = column_for_attribute(attr_name)) && column.set? && value.respond_to?(:join)
12
- value = value.join ","
13
- end
14
- write_attribute_without_enum attr_name, value
15
- end
16
- alias_method :write_attribute_without_enum, :write_attribute
17
- alias_method :write_attribute, :write_attribute_with_enum
18
- end
19
- end
20
- end
21
6
 
22
7
  module ActiveRecord
23
8
  module ConnectionAdapters
@@ -46,6 +31,21 @@ module ActiveRecord
46
31
  end
47
32
  end
48
33
 
34
+ module ActiveRecord
35
+ module ConnectionAdapters
36
+ class SQLite3Adapter < SQLiteAdapter
37
+ def type_to_sql_with_enum type, limit=nil, *args
38
+ if type.to_s == "enum" || type.to_s == "set"
39
+ type, limit = :string, nil
40
+ end
41
+ type_to_sql_without_enum type, limit, *args
42
+ end
43
+ alias_method :type_to_sql_without_enum, :type_to_sql
44
+ alias_method :type_to_sql, :type_to_sql_with_enum
45
+ end
46
+ end
47
+ end
48
+
49
49
  module ActiveRecord
50
50
  module ConnectionAdapters
51
51
  class Column
@@ -1,3 +1,3 @@
1
1
  module ActiverecordEnum
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -2,3 +2,8 @@ mysql:
2
2
  adapter: mysql2
3
3
  database: activerecord_enum_test
4
4
  username:
5
+ supports_enums: true
6
+ sqlite:
7
+ adapter: sqlite3
8
+ database: ":memory:"
9
+ supports_enums: false
@@ -4,3 +4,8 @@ mysql:
4
4
  database: enum_test
5
5
  username: enum_test
6
6
  password: enum_test
7
+ supports_enums: true
8
+ sqlite:
9
+ adapter: sqlite3
10
+ database: ":memory:"
11
+ supports_enums: false
data/spec/enum_spec.rb CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe "ENUM datatype" do
4
4
 
5
- describe "schema dump" do
5
+ describe "schema dump", :db_support => true do
6
6
  before { load_schema "enum_old" }
7
7
  subject { dumped_schema }
8
8
 
@@ -21,23 +21,27 @@ describe "ENUM datatype" do
21
21
 
22
22
  describe "schema loading" do
23
23
  before { load_schema "enum_new" }
24
- subject { ActiveRecord::Base.connection.select_one "SHOW FIELDS FROM balloons WHERE Field='color'" }
24
+ subject { column_props :balloons, :color }
25
25
 
26
- it "loads native format" do
27
- subject[ "Type" ].should == "enum('red','gold')"
26
+ it "loads native format", :db_support => true do
27
+ subject[ :type ].should == "enum('red','gold')"
28
+ end
29
+
30
+ it "falls back to text when missing db support", :db_support => false do
31
+ subject[ :type ].should =~ /varchar/
28
32
  end
29
33
 
30
34
  it "loads default option" do
31
- subject[ "Default" ].should == "gold"
35
+ subject[ :default ].should == "gold"
32
36
  end
33
37
 
34
38
  it "loads null option" do
35
- subject[ "Null" ].should == "NO"
39
+ subject[ :null ].should be_false
36
40
  end
37
41
 
38
- it "loads native column format" do
39
- subject = ActiveRecord::Base.connection.select_one "SHOW FIELDS FROM balloons WHERE Field='size'"
40
- subject[ "Type" ].should == "enum('small','medium','large')"
42
+ it "loads native column format", :db_support => true do
43
+ subject = column_props :balloons, :size
44
+ subject[ :type ].should == "enum('small','medium','large')"
41
45
  end
42
46
  end
43
47
  end
@@ -1,7 +1,7 @@
1
1
  ActiveRecord::Schema.define do
2
2
  create_table :balloons, :force => true do |t|
3
3
  t.integer "id"
4
- t.set "ribbons", :limit => ['red', 'green', 'gold'], :default => ['gold', 'green'], :null => false
4
+ t.set "ribbons", :limit => ['red', 'green', 'gold'], :default => ['green','gold'], :null => false
5
5
  t.column "gasses", :set, :limit => ['helium', 'hydrogen']
6
6
  end
7
7
  end
data/spec/set_spec.rb CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe "SET datatype" do
4
4
 
5
- describe "schema dump" do
5
+ describe "schema dump", :db_support => true do
6
6
  before { load_schema "set_old" }
7
7
  subject { dumped_schema }
8
8
 
@@ -21,60 +21,28 @@ describe "SET datatype" do
21
21
 
22
22
  describe "schema loading" do
23
23
  before { load_schema "set_new" }
24
- subject { ActiveRecord::Base.connection.select_one "SHOW FIELDS FROM balloons WHERE Field='ribbons'" }
24
+ subject { column_props :balloons, :ribbons }
25
25
 
26
- it "loads native format" do
27
- subject[ "Type" ].should == "set('red','green','gold')"
26
+ it "loads native format", :db_support => true do
27
+ subject[ :type ].should == "set('red','green','gold')"
28
28
  end
29
29
 
30
- it "loads default option" do
31
- subject[ "Default" ].should == "green,gold"
32
- end
33
-
34
- it "loads null option" do
35
- subject[ "Null" ].should == "NO"
30
+ it "falls back to text when missing db support", :db_support => false do
31
+ subject[ :type ].should =~ /varchar/
36
32
  end
37
33
 
38
- it "loads native column format" do
39
- subject = ActiveRecord::Base.connection.select_one "SHOW FIELDS FROM balloons WHERE Field='gasses'"
40
- subject[ "Type" ].should == "set('helium','hydrogen')"
34
+ it "loads default option" do
35
+ subject[ :default ].should == "green,gold"
41
36
  end
42
- end
43
37
 
44
- describe "assignment" do
45
- before { load_schema "set_new" }
46
- it "accepts single value" do
47
- b = Balloon.create :gasses => "helium"
48
- b.should be_valid
49
- b.reload.gasses.should == "helium"
50
- end
51
- it "accepts array of values" do
52
- b = Balloon.create :gasses => [ "helium", "hydrogen" ]
53
- b.should be_valid
54
- b.reload.gasses.should == "helium,hydrogen"
55
- end
56
- it "accepts comma-separated values" do
57
- b = Balloon.create :gasses => "helium,hydrogen"
58
- b.should be_valid
59
- b.reload.gasses.should == "helium,hydrogen"
60
- end
61
- it "accepts empty list" do
62
- b = Balloon.create :gasses => [ ]
63
- b.should be_valid
64
- b.reload.gasses.should == ""
38
+ it "loads null option" do
39
+ subject[ :null ].should be_false
65
40
  end
66
- end
67
41
 
68
- describe "getter" do
69
- before do
70
- load_schema "set_new"
71
- ActiveRecord::Base.connection.execute "INSERT INTO balloons (gasses) VALUES ('helium,hydrogen')"
72
- @b = Balloon.first
73
- end
74
- it "returns comma-separated values by default" do
75
- @b.gasses.should == "helium,hydrogen"
42
+ it "loads native column format", :db_support => true do
43
+ subject = column_props :balloons, :gasses
44
+ subject[ :type ].should == "set('helium','hydrogen')"
76
45
  end
77
- it "returns array of values when config option is set"
78
46
  end
79
47
  end
80
48
 
data/spec/spec_helper.rb CHANGED
@@ -20,6 +20,22 @@ def dumped_schema
20
20
  stream.string.lines.select {|l| /^\s*#/.match(l).nil? }.join
21
21
  end
22
22
 
23
- ActiveRecord::Base.configurations = YAML::load(IO.read("spec/database.yml"))
23
+ def column_props table, column
24
+ case ENV["DB"]
25
+ when "mysql"
26
+ result = ActiveRecord::Base.connection.select_one "SHOW FIELDS FROM #{table} WHERE Field='#{column}'"
27
+ { :type => result["Type"], :default => result["Default"], :null => ( result["Null"] == "YES" ) }
28
+ when "sqlite"
29
+ result = ActiveRecord::Base.connection.select_value "SELECT sql FROM sqlite_master WHERE type='table' AND name='#{table}'"
30
+ matches = /"#{column}" ([^[:space:]]+) (?:DEFAULT '([^[:space:]]+)')?( NOT NULL)?,/.match result
31
+ { :type => matches[1], :default => matches[2], :null => matches[3].nil? }
32
+ end
33
+ end
34
+
35
+ db_config = YAML::load(IO.read("spec/database.yml"))
36
+ ActiveRecord::Base.configurations = db_config
24
37
  db = ENV["DB"] || "mysql"
25
38
  ActiveRecord::Base.establish_connection db
39
+ RSpec.configure do |c|
40
+ c.filter_run_excluding :db_support => ! db_config[db]["supports_enums"]
41
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord_enum
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ian Young
@@ -15,8 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-02 00:00:00 -07:00
19
- default_executable:
18
+ date: 2011-11-03 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: activerecord
@@ -79,9 +78,25 @@ dependencies:
79
78
  type: :development
80
79
  version_requirements: *id004
81
80
  - !ruby/object:Gem::Dependency
82
- name: rspec
81
+ name: sqlite3
83
82
  prerelease: false
84
83
  requirement: &id005 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ hash: 19
89
+ segments:
90
+ - 1
91
+ - 3
92
+ - 4
93
+ version: 1.3.4
94
+ type: :development
95
+ version_requirements: *id005
96
+ - !ruby/object:Gem::Dependency
97
+ name: rspec
98
+ prerelease: false
99
+ requirement: &id006 !ruby/object:Gem::Requirement
85
100
  none: false
86
101
  requirements:
87
102
  - - ~>
@@ -93,7 +108,7 @@ dependencies:
93
108
  - 0
94
109
  version: 2.6.0
95
110
  type: :development
96
- version_requirements: *id005
111
+ version_requirements: *id006
97
112
  description: Adds the ENUM data type natively to ActiveRecord.
98
113
  email:
99
114
  - ian.greenleaf+github@gmail.com
@@ -107,6 +122,7 @@ files:
107
122
  - .gitignore
108
123
  - .travis.yml
109
124
  - Gemfile
125
+ - LICENSE
110
126
  - README.markdown
111
127
  - Rakefile
112
128
  - activerecord_enum.gemspec
@@ -121,7 +137,6 @@ files:
121
137
  - spec/schema/set_old.rb
122
138
  - spec/set_spec.rb
123
139
  - spec/spec_helper.rb
124
- has_rdoc: true
125
140
  homepage: ""
126
141
  licenses: []
127
142
 
@@ -151,16 +166,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
166
  requirements: []
152
167
 
153
168
  rubyforge_project: activerecord_enum
154
- rubygems_version: 1.6.2
169
+ rubygems_version: 1.7.2
155
170
  signing_key:
156
171
  specification_version: 3
157
172
  summary: Enum data types for ActiveRecord
158
- test_files:
159
- - spec/database.yml.tmpl
160
- - spec/enum_spec.rb
161
- - spec/schema/enum_new.rb
162
- - spec/schema/enum_old.rb
163
- - spec/schema/set_new.rb
164
- - spec/schema/set_old.rb
165
- - spec/set_spec.rb
166
- - spec/spec_helper.rb
173
+ test_files: []
174
+