enum_table 0.1.0 → 0.2.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.
- data/CHANGELOG +6 -0
- data/Gemfile +1 -1
- data/lib/enum_table.rb +31 -0
- data/lib/enum_table/railtie.rb +10 -0
- data/lib/enum_table/record.rb +2 -1
- data/lib/enum_table/schema_statements.rb +8 -3
- data/lib/enum_table/version.rb +1 -1
- data/test/database.yml +4 -4
- data/test/enum_table/test_record.rb +23 -0
- data/test/enum_table/test_schema_statements.rb +15 -0
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
== 0.2.0 2013-05-14
|
2
|
+
|
3
|
+
* Memoize enum_table list. Your logs are now less noisy.
|
4
|
+
* #enum no longer requires the table to exist when migrating or loading the
|
5
|
+
schema, so migrations have a chance to create the enum tables.
|
6
|
+
|
1
7
|
== 0.1.0 2012-11-30
|
2
8
|
|
3
9
|
* DB Nazi compliance.
|
data/Gemfile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
gemspec
|
data/lib/enum_table.rb
CHANGED
@@ -4,6 +4,37 @@ module EnumTable
|
|
4
4
|
autoload :Reflection, 'enum_table/reflection'
|
5
5
|
autoload :SchemaDumper, 'enum_table/schema_dumper'
|
6
6
|
autoload :SchemaStatements, 'enum_table/schema_statements'
|
7
|
+
|
8
|
+
# Allow enum tables to be missing until missing_tables_disallowed is
|
9
|
+
# called. This is invoked from rake tasks that create the enum tables, such as
|
10
|
+
# Rails migration tasks.
|
11
|
+
#
|
12
|
+
# Missing table allowance is implemented as a thread-local stack to handle
|
13
|
+
# nested invocations in multi-threaded programs.
|
14
|
+
class << self
|
15
|
+
def missing_tables_allowed
|
16
|
+
missing_tables_allowances.push true
|
17
|
+
end
|
18
|
+
|
19
|
+
def missing_tables_disallowed
|
20
|
+
missing_tables_allowances.pop
|
21
|
+
end
|
22
|
+
|
23
|
+
def missing_tables_allowed?
|
24
|
+
!missing_tables_allowances.empty?
|
25
|
+
end
|
26
|
+
|
27
|
+
# Reset our state. Intended for testing Enum Table.
|
28
|
+
def reset
|
29
|
+
Thread.current[:enum_table_missing_tables_allowed] = nil
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def missing_tables_allowances
|
35
|
+
Thread.current[:enum_table_missing_tables_allowed] ||= []
|
36
|
+
end
|
37
|
+
end
|
7
38
|
end
|
8
39
|
|
9
40
|
require 'enum_table/railtie' if defined?(Rails)
|
data/lib/enum_table/railtie.rb
CHANGED
@@ -5,9 +5,19 @@ module EnumTable
|
|
5
5
|
task :load_schema_dumper do
|
6
6
|
require 'enum_table/schema_dumper'
|
7
7
|
end
|
8
|
+
|
9
|
+
task :allow_missing_tables do
|
10
|
+
EnumTable.missing_tables_allowed
|
11
|
+
end
|
8
12
|
end
|
9
13
|
|
10
14
|
Rake::Task['db:schema:dump'].prerequisites << 'enum_table:load_schema_dumper'
|
15
|
+
|
16
|
+
%w'db:schema:load db:migrate db:migrate:up'.each do |task|
|
17
|
+
task = Rake::Task[task]
|
18
|
+
task.prerequisites.insert 0, 'enum_table:allow_missing_tables'
|
19
|
+
task.enhance { EnumTable.missing_tables_disallowed }
|
20
|
+
end
|
11
21
|
end
|
12
22
|
end
|
13
23
|
end
|
data/lib/enum_table/record.rb
CHANGED
@@ -20,7 +20,7 @@ module EnumTable
|
|
20
20
|
end
|
21
21
|
self.enums = enums.merge(name => reflection, name.to_s => reflection)
|
22
22
|
|
23
|
-
class_eval <<-EOS
|
23
|
+
class_eval <<-EOS, __FILE__, __LINE__ + 1
|
24
24
|
def #{name}
|
25
25
|
read_enum(:#{name})
|
26
26
|
end
|
@@ -60,6 +60,7 @@ module EnumTable
|
|
60
60
|
when String, Symbol, nil
|
61
61
|
map = {}
|
62
62
|
table_name = table || "#{self.table_name.singularize}_#{name.to_s.pluralize}"
|
63
|
+
return {} if EnumTable.missing_tables_allowed? && !connection.tables.include?(table_name)
|
63
64
|
connection.execute("SELECT id, value FROM #{table_name}").each do |row|
|
64
65
|
map[row[1]] = row[0]
|
65
66
|
end
|
@@ -4,6 +4,7 @@ module EnumTable
|
|
4
4
|
table = NewTable.new(self, table_name, options)
|
5
5
|
yield table if block_given?
|
6
6
|
table._create
|
7
|
+
enum_tables_updated
|
7
8
|
end
|
8
9
|
|
9
10
|
def change_enum_table(table_name)
|
@@ -13,13 +14,17 @@ module EnumTable
|
|
13
14
|
def drop_enum_table(table_name)
|
14
15
|
drop_table table_name
|
15
16
|
execute "DELETE FROM enum_tables WHERE table_name = '#{table_name}'"
|
17
|
+
enum_tables_updated
|
16
18
|
end
|
17
19
|
|
18
20
|
def enum_tables
|
19
21
|
return [] if !table_exists?('enum_tables')
|
20
|
-
execute("SELECT table_name FROM enum_tables").
|
21
|
-
row[0]
|
22
|
-
|
22
|
+
@enum_tables ||= execute("SELECT table_name FROM enum_tables").
|
23
|
+
map { |row| row[0] }.sort
|
24
|
+
end
|
25
|
+
|
26
|
+
def enum_tables_updated
|
27
|
+
@enum_tables = nil
|
23
28
|
end
|
24
29
|
|
25
30
|
DEFAULT_VALUE_ATTRIBUTES = {type: :string, limit: 255, null: false}.freeze
|
data/lib/enum_table/version.rb
CHANGED
data/test/database.yml
CHANGED
@@ -3,17 +3,17 @@ sqlite3:
|
|
3
3
|
mysql:
|
4
4
|
username: root
|
5
5
|
password:
|
6
|
-
database:
|
6
|
+
database: enum_table_test
|
7
7
|
mysql2:
|
8
8
|
username: root
|
9
9
|
password:
|
10
|
-
database:
|
10
|
+
database: enum_table_test
|
11
11
|
postgresql:
|
12
12
|
username: postgres
|
13
13
|
password:
|
14
|
-
database:
|
14
|
+
database: enum_table_test
|
15
15
|
min_messages: warning
|
16
16
|
jdbcmysql:
|
17
17
|
username: root
|
18
18
|
password:
|
19
|
-
database:
|
19
|
+
database: enum_table_test
|
@@ -65,6 +65,29 @@ describe EnumTable do
|
|
65
65
|
enum.id_name.must_equal :gender_number
|
66
66
|
end
|
67
67
|
|
68
|
+
describe "when missing tables are not allowed" do
|
69
|
+
it "raises an error if the underlying table does not exist" do
|
70
|
+
# must_raise does not do ancestor lookup in some versions of minitest
|
71
|
+
# (notably the version that ships with Ruby 1.9.3). Avoid it until we
|
72
|
+
# have a testrb that honors the Gemfile.
|
73
|
+
exception = nil
|
74
|
+
begin
|
75
|
+
User.enum(:status)
|
76
|
+
rescue => exception
|
77
|
+
end
|
78
|
+
exception.must_be_kind_of StandardError
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "when missing tables are allowed" do
|
83
|
+
before { EnumTable.missing_tables_allowed }
|
84
|
+
after { EnumTable.reset }
|
85
|
+
|
86
|
+
it "does not raise an error if the underlying table does not exist" do
|
87
|
+
User.enum :status
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
68
91
|
describe "on a subclass" do
|
69
92
|
before do
|
70
93
|
User.inheritance_column = :user_type
|
@@ -110,6 +110,21 @@ describe EnumTable::SchemaStatements do
|
|
110
110
|
connection.drop_enum_table :genders
|
111
111
|
connection.enum_tables.must_equal []
|
112
112
|
end
|
113
|
+
|
114
|
+
it "clears memoized tables when an enum table is created" do
|
115
|
+
connection.create_enum_table :genders
|
116
|
+
connection.enum_tables.must_equal ['genders']
|
117
|
+
connection.create_enum_table :statuses
|
118
|
+
connection.enum_tables.must_equal ['genders', 'statuses']
|
119
|
+
end
|
120
|
+
|
121
|
+
it "clears memoized tables when an enum table is dropped" do
|
122
|
+
connection.create_enum_table :genders
|
123
|
+
connection.create_enum_table :statuses
|
124
|
+
connection.enum_tables.must_equal ['genders', 'statuses']
|
125
|
+
connection.drop_enum_table :genders
|
126
|
+
connection.enum_tables.must_equal ['statuses']
|
127
|
+
end
|
113
128
|
end
|
114
129
|
|
115
130
|
def read_table(name)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enum_table
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-05-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|