enum_table 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a5ae29ffdc710d5a06627e243e256b7a8b46ae55
4
+ data.tar.gz: aaa6e9b0c95804dd10760b8b67289f9121d23738
5
+ SHA512:
6
+ metadata.gz: 47f827c8bbd52a3102c06df809be0ef29031ec1d194ed5a186da9698127eba253a01efad0d10487949829a019a5ce896969c2e973c92f432b3a49faac1ad4e0b
7
+ data.tar.gz: a0ffcf59c9ae8d1c3330eb18909d04c6462b95fa8c659b3f41a1615c01f95584d323358130448f43c65f74985c9f7f284d0d40233aed07929219cdad6d261b87
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  /Gemfile.lock
2
- /*.gem
2
+ /.bundle
3
+ /*.gem
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ == 0.4.0 2014-02-10
2
+
3
+ * Allow missing tables when migrating. [Kenneth Lay]
4
+
1
5
  == 0.3.0 2013-12-12
2
6
 
3
7
  * Fix initialize_attributes when options are passed. [Rebecca Miller-Webster]
data/Gemfile CHANGED
@@ -2,4 +2,5 @@ source 'https://rubygems.org'
2
2
  gem 'sqlite3'
3
3
  gem 'mysql2'
4
4
  gem 'pg'
5
+ gem 'minitest', '~> 4.0'
5
6
  gemspec
data/README.markdown CHANGED
@@ -123,6 +123,24 @@ it less disruptive to use strings instead. Do that with the `:type` option:
123
123
 
124
124
  enum :genders, type: :string
125
125
 
126
+ ### I can't set up my Rails app!
127
+
128
+ If you load any models during Rails' initialization phase (e.g. from
129
+ `config/application.rb`, or an initializer), and these models depend on the
130
+ existence of enum tables, you may wind up with a circular dependency: your app
131
+ startup depends on an enum table existing, and creating the enum table requires
132
+ loading the app (via `db:schema:load`). This might only manifest itself when you
133
+ try to load your schema on an empty database.
134
+
135
+ It is strongly recommended to avoid loading models during
136
+ initialization. However if you cannot avoid this there is an escape hatch:
137
+
138
+ config.enum_tables.allow_missing_tables = true
139
+
140
+ This will silently return an empty enum mapping while this flag is true. Of
141
+ course, this may have knock on effects if your model expects certain values to
142
+ be present. Consider yourself warned!
143
+
126
144
  ## Contributing
127
145
 
128
146
  * [Bug reports](https://github.com/howaboutwe/enum_table/issues)
@@ -1,13 +1,27 @@
1
1
  module EnumTable
2
2
  class Railtie < Rails::Railtie
3
+ config.enum_table = ActiveSupport::OrderedOptions.new
4
+
3
5
  rake_tasks do
4
6
  namespace :enum_table do
5
7
  task :load_schema_dumper do
6
8
  require 'enum_table/schema_dumper'
7
9
  end
10
+
11
+ task :allow_missing_tables do
12
+ EnumTable.missing_tables_allowed
13
+ end
8
14
  end
9
15
 
10
16
  Rake::Task['db:schema:dump'].prerequisites << 'enum_table:load_schema_dumper'
17
+
18
+ if config.enum_table.allow_missing_tables
19
+ %w'db:schema:load db:migrate db:migrate:up'.each do |task|
20
+ task = Rake::Task[task]
21
+ task.prerequisites.insert 0, 'enum_table:allow_missing_tables'
22
+ task.enhance { EnumTable.missing_tables_disallowed }
23
+ end
24
+ end
11
25
  end
12
26
  end
13
27
  end
@@ -62,6 +62,7 @@ module EnumTable
62
62
  else
63
63
  map = {}
64
64
  table_name = table || "#{self.table_name.singularize}_#{name.to_s.pluralize}"
65
+ return {} if EnumTable.missing_tables_allowed? && !connection.tables.include?(table_name)
65
66
  connection.execute("SELECT id, value FROM #{connection.quote_table_name table_name}").each do |row|
66
67
  map[row[1]] = row[0]
67
68
  end
@@ -1,5 +1,5 @@
1
1
  module EnumTable
2
- VERSION = [0, 3, 0]
2
+ VERSION = [0, 4, 0]
3
3
 
4
4
  class << VERSION
5
5
  include Comparable
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)
@@ -9,9 +9,9 @@ describe EnumTable do
9
9
  t.integer :status_id
10
10
  t.string :user_type
11
11
  end
12
+ Object.const_set :User, Class.new(ActiveRecord::Base)
12
13
  end
13
14
 
14
- before { Object.const_set :User, Class.new(ActiveRecord::Base) }
15
15
  after { Object.send :remove_const, :User }
16
16
 
17
17
  describe '.enum' do
@@ -90,6 +90,17 @@ describe EnumTable do
90
90
  exception.must_be_kind_of StandardError
91
91
  end
92
92
 
93
+ describe "when missing tables are allowed" do
94
+ before { EnumTable.missing_tables_allowed }
95
+ after { EnumTable.reset }
96
+
97
+ it "does not cry when you first use the enum if the table does not exist" do
98
+ User.enum(:status)
99
+ User.enum_id(:status, 'awesome').must_equal nil
100
+ end
101
+ end
102
+
103
+
93
104
  describe "on a subclass" do
94
105
  before do
95
106
  User.inheritance_column = :user_type
data/test/test_helper.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  ROOT = File.expand_path('..', File.dirname(__FILE__))
2
2
  $:.unshift "#{ROOT}/lib"
3
3
 
4
- require 'minitest/spec'
4
+ require 'minitest/autorun'
5
5
  require 'active_record'
6
6
  require 'enum_table'
7
7
 
@@ -47,7 +47,12 @@ MiniTest::Spec.class_eval do
47
47
  end
48
48
 
49
49
  def self.use_database
50
- before { recreate_database }
51
- after { drop_database }
50
+ mod = Module.new do
51
+ extend Minitest::Spec::DSL
52
+
53
+ before { recreate_database }
54
+ after { drop_database }
55
+ end
56
+ include mod
52
57
  end
53
58
  end
metadata CHANGED
@@ -1,46 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enum_table
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
5
- prerelease:
4
+ version: 0.4.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - George Ogata
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-12-12 00:00:00.000000000 Z
11
+ date: 2014-02-10 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activerecord
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: 3.2.0
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: 3.2.0
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: ritual
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
33
  version: 0.4.1
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
40
  version: 0.4.1
46
41
  description:
@@ -50,7 +45,7 @@ executables: []
50
45
  extensions: []
51
46
  extra_rdoc_files: []
52
47
  files:
53
- - .gitignore
48
+ - ".gitignore"
54
49
  - CHANGELOG
55
50
  - Gemfile
56
51
  - LICENSE
@@ -73,33 +68,26 @@ files:
73
68
  homepage: http://github.com/howaboutwe/enum_table
74
69
  licenses:
75
70
  - MIT
71
+ metadata: {}
76
72
  post_install_message:
77
73
  rdoc_options: []
78
74
  require_paths:
79
75
  - lib
80
76
  required_ruby_version: !ruby/object:Gem::Requirement
81
- none: false
82
77
  requirements:
83
- - - ! '>='
78
+ - - ">="
84
79
  - !ruby/object:Gem::Version
85
80
  version: '0'
86
- segments:
87
- - 0
88
- hash: 932469567180106626
89
81
  required_rubygems_version: !ruby/object:Gem::Requirement
90
- none: false
91
82
  requirements:
92
- - - ! '>='
83
+ - - ">="
93
84
  - !ruby/object:Gem::Version
94
85
  version: '0'
95
- segments:
96
- - 0
97
- hash: 932469567180106626
98
86
  requirements: []
99
87
  rubyforge_project:
100
- rubygems_version: 1.8.25
88
+ rubygems_version: 2.2.0
101
89
  signing_key:
102
- specification_version: 3
90
+ specification_version: 4
103
91
  summary: Enumeration tables for ActiveRecord
104
92
  test_files:
105
93
  - test/database.yml