falls_back_on 0.0.3 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,11 @@
1
+ # .document is used by rdoc and yard to know how to generate documentation
2
+ # for example, it can be used to control how rdoc gets built when you do `gem install foo`
3
+
4
+ README.rdoc
5
+ lib/**/*.rb
6
+ bin/*
7
+
8
+ # Files below this - are treated as 'extra files', and aren't parsed for ruby code
9
+ -
10
+ features/**/*.feature
11
+ LICENSE
@@ -0,0 +1,11 @@
1
+ # rcov generated
2
+ coverage
3
+
4
+ # rdoc generated
5
+ rdoc
6
+
7
+ # yard generated
8
+ doc
9
+ .yardoc
10
+
11
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in falls_back_on.gemspec
4
+ gemspec
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010 Derek Kastner
1
+ Copyright (c) 2011 Seamus Abshere, Derek Kastner
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -0,0 +1,25 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake'
5
+ require 'rake/testtask'
6
+ Rake::TestTask.new(:test) do |test|
7
+ test.libs << 'lib' << 'test'
8
+ test.pattern = 'test/**/test_*.rb'
9
+ test.verbose = true
10
+ end
11
+
12
+ begin
13
+ require 'rake/rdoctask'
14
+ Rake::RDocTask.new do |rdoc|
15
+ rdoc.rdoc_dir = 'rdoc'
16
+ rdoc.title = 'falls_back_on'
17
+ rdoc.options << '--line-numbers' << '--inline-source'
18
+ rdoc.rdoc_files.include('README*')
19
+ rdoc.rdoc_files.include('lib/**/*.rb')
20
+ end
21
+ rescue LoadError
22
+ puts "Rdoc is not available"
23
+ end
24
+
25
+ task :default => :test
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "falls_back_on/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "falls_back_on"
7
+ s.version = FallsBackOn::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Seamus Abshere', 'Derek Kastner']
10
+ s.email = ["seamus@abshere.net"]
11
+ s.homepage = 'http://github.com/dkastner/falls_back_on'
12
+ s.summary = 'Adds ActiveRecord::Base.falls_back_on and ActiveRecord::Base.fallback'
13
+ s.description = 'ActiveRecord extension to intelligently fall back on another column when a given column is unavailable'
14
+
15
+ s.rubyforge_project = "falls_back_on"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency 'cache_method'
23
+ s.add_dependency 'lock_method'
24
+ s.add_development_dependency 'test-unit'
25
+ s.add_development_dependency 'memcached'
26
+ s.add_development_dependency 'activerecord'
27
+ s.add_development_dependency 'sqlite3-ruby'
28
+ s.add_development_dependency 'weighted_average'
29
+ if RUBY_VERSION >= '1.9'
30
+ s.add_development_dependency 'ruby-debug19'
31
+ else
32
+ s.add_development_dependency 'ruby-debug'
33
+ end
34
+ end
@@ -1,54 +1,36 @@
1
- module FallsBackOn
2
- def falls_back_on(options = {})
3
- class_eval do
4
- class_inheritable_accessor :fallback_options
5
- end
6
- self.fallback_options = options
7
- extend FallsBackOn::InstanceMethods
8
- end
1
+ require 'cache_method'
2
+ require 'lock_method'
9
3
 
10
- module InstanceMethods
11
- def class_name
12
- self.to_s
13
- end
4
+ require 'falls_back_on/version'
14
5
 
15
- def fallback
16
- Fallback.get_for(class_name)
17
- end
18
-
19
- def fallback_value_for(k)
20
- v = fallback_options[k]
21
- case v
22
- when :random
23
- fallback_value_for_random(k)
24
- when Numeric
25
- v
26
- when String
27
- v.upcase.starts_with?('SELECT') ? ActiveRecord::Base.connection.select_value(v) : v
28
- when Proc
29
- v.call
30
- end
31
- end
32
-
33
- def fallback_value_for_name
34
- { :name => "Fallback #{class_name.underscore.gsub('_', ' ')}" }
35
- end
36
-
37
- def fallback_value_for_random(k)
38
- random = rand(1e8)
39
- return fallback_value_for_random(k) unless send("find_by_#{k}", random).nil?
40
- random
41
- end
42
-
43
- def destroy_fallback
44
- Fallback.destroy_for(class_name)
45
- end
6
+ module FallsBackOn
7
+ autoload :Definition, 'falls_back_on/definition'
46
8
 
47
- def set_fallback
48
- values = {}
49
- values = values.merge(fallback_value_for_name) if column_names.include?('name')
50
- values = fallback_options.keys.inject({}) { |memo, k| memo.merge(k => fallback_value_for(k)) }
51
- Fallback.set_for(class_name, values)
9
+ def self.clear
10
+ ::FallsBackOn::Definition.all.each { |definition| definition.clear }
11
+ end
12
+
13
+ def falls_back_on(attrs)
14
+ definition = ::FallsBackOn::Definition.new self
15
+ definition.attrs = attrs
16
+ end
17
+
18
+ def fallback
19
+ obj = new
20
+ definition = ::FallsBackOn::Definition.new self
21
+ begin
22
+ definition.attrs.each do |k, v|
23
+ obj.send "#{k}=", v
24
+ end
25
+ rescue ::LockMethod::Locked
26
+ $stderr.puts "#{self.to_s} was locked, retrying in 0.5 seconds..."
27
+ sleep 0.5
28
+ retry
52
29
  end
30
+ obj
53
31
  end
54
32
  end
33
+
34
+ unless ::Class.method_defined?(:falls_back_on)
35
+ ::Class.send :include, ::FallsBackOn
36
+ end
@@ -0,0 +1,50 @@
1
+ module FallsBackOn
2
+ class Definition
3
+ autoload :Storage, 'falls_back_on/definition/storage'
4
+
5
+ def self.all
6
+ Storage.instance.keys.map { |parent| new parent }
7
+ end
8
+
9
+ attr_reader :parent
10
+
11
+ def initialize(parent)
12
+ @parent = parent.to_s
13
+ end
14
+
15
+ def clear
16
+ clear_method_cache :calculate
17
+ clear_method_cache :attrs
18
+ clear_method_lock :attrs
19
+ end
20
+
21
+ def attrs=(attrs)
22
+ Storage.instance[parent] = attrs
23
+ end
24
+
25
+ def attrs
26
+ Storage.instance[parent].inject({}) do |memo, (k, v)|
27
+ memo[k] = calculate k
28
+ memo
29
+ end
30
+ end
31
+ lock_method :attrs
32
+ cache_method :attrs
33
+
34
+ def calculate(k)
35
+ v = Storage.instance[parent][k]
36
+ case v
37
+ when Proc
38
+ v.call
39
+ else
40
+ v
41
+ end
42
+ end
43
+ cache_method :calculate
44
+
45
+ # for cache_method and lock_method
46
+ def hash
47
+ parent.hash
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,8 @@
1
+ require 'singleton'
2
+ module FallsBackOn
3
+ class Definition
4
+ class Storage < ::Hash
5
+ include ::Singleton
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ module FallsBackOn
2
+ VERSION = '0.1.1'
3
+ end
@@ -0,0 +1,40 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.setup
4
+ require 'test/unit'
5
+ require 'active_record'
6
+ require 'active_support/all'
7
+ require 'weighted_average'
8
+ require 'memcached'
9
+ require 'timeout'
10
+ require 'ruby-debug'
11
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
12
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
+ require 'falls_back_on'
14
+
15
+ # thanks authlogic!
16
+ ActiveRecord::Schema.verbose = false
17
+ begin
18
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
19
+ rescue ArgumentError
20
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:")
21
+ end
22
+
23
+ my_client = Memcached.new
24
+ CacheMethod.config.storage = my_client
25
+ LockMethod.config.storage = my_client
26
+
27
+ class Test::Unit::TestCase
28
+ def setup
29
+ CacheMethod.config.storage.flush
30
+ LockMethod.config.storage.flush
31
+ @old_abort_on_exception = Thread.abort_on_exception
32
+ Thread.abort_on_exception = true
33
+ end
34
+
35
+ def teardown
36
+ Thread.abort_on_exception = @old_abort_on_exception
37
+ end
38
+ end
39
+
40
+ ENV['FALLS_BACK_ON_DEBUG'] = 'true'
@@ -0,0 +1,108 @@
1
+ require 'helper'
2
+
3
+ class Car1
4
+ attr_accessor :fuel
5
+ attr_accessor :random_number
6
+ attr_accessor :some_place_in_the_mall
7
+ falls_back_on :fuel => 'gasoline',
8
+ :random_number => lambda { rand },
9
+ :some_place_in_the_mall => lambda { some_place_in_the_mall }
10
+ def self.some_place_in_the_mall
11
+ "Orange Julius at #{Time.now}"
12
+ end
13
+ end
14
+
15
+ class Car2 < ActiveRecord::Base
16
+ set_table_name :cars2
17
+ def self.create_table
18
+ connection.create_table :cars2, :force => true do |t|
19
+ t.string :fuel
20
+ t.float :efficiency
21
+ t.integer :popularity
22
+ end
23
+ end
24
+
25
+ attr_accessor :efficiency2
26
+
27
+ falls_back_on :fuel => 'diesel',
28
+ :efficiency => lambda { calculate(:average, :efficiency) },
29
+ :efficiency2 => lambda { weighted_average(:efficiency, :weighted_by => :popularity ) }
30
+ end
31
+
32
+ Car2.create_table
33
+ Car2.create! :efficiency => 10.0, :popularity => 1_000_000
34
+ Car2.create! :efficiency => 1.0, :popularity => 1
35
+
36
+ class Car3
37
+ attr_accessor :long_running_calculation
38
+ falls_back_on :long_running_calculation => lambda { sleep 3 }
39
+ end
40
+
41
+ class TestFallsBackOn < Test::Unit::TestCase
42
+ def test_fallback
43
+ assert_equal 'gasoline', Car1.fallback.fuel
44
+ end
45
+
46
+ def test_active_record
47
+ assert_equal 'diesel', Car2.fallback.fuel
48
+ end
49
+
50
+ def test_proc
51
+ assert Car1.fallback.random_number.is_a?(Numeric)
52
+ end
53
+
54
+ def test_proc_calling_class_method
55
+ assert(Car1.fallback.some_place_in_the_mall =~ /Orange Julius/)
56
+ end
57
+
58
+ def test_active_record_calculations
59
+ assert_equal 5.5, Car2.fallback.efficiency
60
+ end
61
+
62
+ def test_weighted_average
63
+ assert_equal 10, Car2.fallback.efficiency2.round
64
+ end
65
+
66
+ def test_cache
67
+ random_number = Car1.fallback.random_number
68
+ assert_equal random_number, Car1.fallback.random_number
69
+ assert_equal random_number, Car1.fallback.random_number
70
+ end
71
+
72
+ def test_retries_if_lock
73
+ blocker = Thread.new { Car3.fallback.long_running_calculation }
74
+
75
+ assert_raises(::Timeout::Error) do
76
+ Timeout.timeout(2) do
77
+ Car3.fallback.long_running_calculation
78
+ end
79
+ end
80
+
81
+ blocker.join
82
+ end
83
+
84
+ def test_caches_calculations_separately
85
+ definition = ::FallsBackOn::Definition.new Car3
86
+ definition.calculate :long_running_calculation
87
+ end
88
+
89
+ def test_clear
90
+ # sanity check
91
+ assert_nothing_raised do
92
+ Timeout.timeout(4) do
93
+ blocker = Thread.new { Car3.fallback.long_running_calculation }
94
+ sleep 1
95
+ Car3.fallback.long_running_calculation
96
+ end
97
+ end
98
+
99
+ assert_raises(Timeout::Error) do
100
+ Timeout.timeout(4) do
101
+ blocker = Thread.new { Car3.fallback.long_running_calculation }
102
+ sleep 1
103
+ clearer = Thread.new { ::FallsBackOn.clear }
104
+ Car3.fallback.long_running_calculation
105
+ end
106
+ end
107
+ end
108
+ end
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 0
9
- - 3
10
- version: 0.0.3
8
+ - 1
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Seamus Abshere
@@ -16,14 +16,13 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-08-31 00:00:00 -04:00
19
+ date: 2011-02-24 00:00:00 -06:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
- type: :runtime
23
+ name: cache_method
24
24
  prerelease: false
25
- name: activerecord
26
- version_requirements: &id001 !ruby/object:Gem::Requirement
25
+ requirement: &id001 !ruby/object:Gem::Requirement
27
26
  none: false
28
27
  requirements:
29
28
  - - ">="
@@ -32,12 +31,12 @@ dependencies:
32
31
  segments:
33
32
  - 0
34
33
  version: "0"
35
- requirement: *id001
34
+ type: :runtime
35
+ version_requirements: *id001
36
36
  - !ruby/object:Gem::Dependency
37
- type: :development
37
+ name: lock_method
38
38
  prerelease: false
39
- name: rake
40
- version_requirements: &id002 !ruby/object:Gem::Requirement
39
+ requirement: &id002 !ruby/object:Gem::Requirement
41
40
  none: false
42
41
  requirements:
43
42
  - - ">="
@@ -46,12 +45,12 @@ dependencies:
46
45
  segments:
47
46
  - 0
48
47
  version: "0"
49
- requirement: *id002
48
+ type: :runtime
49
+ version_requirements: *id002
50
50
  - !ruby/object:Gem::Dependency
51
- type: :development
51
+ name: test-unit
52
52
  prerelease: false
53
- name: jeweler
54
- version_requirements: &id003 !ruby/object:Gem::Requirement
53
+ requirement: &id003 !ruby/object:Gem::Requirement
55
54
  none: false
56
55
  requirements:
57
56
  - - ">="
@@ -60,12 +59,12 @@ dependencies:
60
59
  segments:
61
60
  - 0
62
61
  version: "0"
63
- requirement: *id003
64
- - !ruby/object:Gem::Dependency
65
62
  type: :development
63
+ version_requirements: *id003
64
+ - !ruby/object:Gem::Dependency
65
+ name: memcached
66
66
  prerelease: false
67
- name: bundler
68
- version_requirements: &id004 !ruby/object:Gem::Requirement
67
+ requirement: &id004 !ruby/object:Gem::Requirement
69
68
  none: false
70
69
  requirements:
71
70
  - - ">="
@@ -74,12 +73,12 @@ dependencies:
74
73
  segments:
75
74
  - 0
76
75
  version: "0"
77
- requirement: *id004
78
- - !ruby/object:Gem::Dependency
79
76
  type: :development
77
+ version_requirements: *id004
78
+ - !ruby/object:Gem::Dependency
79
+ name: activerecord
80
80
  prerelease: false
81
- name: sqlite3-ruby
82
- version_requirements: &id005 !ruby/object:Gem::Requirement
81
+ requirement: &id005 !ruby/object:Gem::Requirement
83
82
  none: false
84
83
  requirements:
85
84
  - - ">="
@@ -88,69 +87,81 @@ dependencies:
88
87
  segments:
89
88
  - 0
90
89
  version: "0"
91
- requirement: *id005
90
+ type: :development
91
+ version_requirements: *id005
92
92
  - !ruby/object:Gem::Dependency
93
+ name: sqlite3-ruby
94
+ prerelease: false
95
+ requirement: &id006 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ hash: 3
101
+ segments:
102
+ - 0
103
+ version: "0"
93
104
  type: :development
105
+ version_requirements: *id006
106
+ - !ruby/object:Gem::Dependency
107
+ name: weighted_average
94
108
  prerelease: false
95
- name: rspec
96
- version_requirements: &id006 !ruby/object:Gem::Requirement
109
+ requirement: &id007 !ruby/object:Gem::Requirement
97
110
  none: false
98
111
  requirements:
99
112
  - - ">="
100
113
  - !ruby/object:Gem::Version
101
- hash: 62196427
114
+ hash: 3
102
115
  segments:
103
- - 2
104
116
  - 0
117
+ version: "0"
118
+ type: :development
119
+ version_requirements: *id007
120
+ - !ruby/object:Gem::Dependency
121
+ name: ruby-debug
122
+ prerelease: false
123
+ requirement: &id008 !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ hash: 3
129
+ segments:
105
130
  - 0
106
- - beta
107
- - 20
108
- version: 2.0.0.beta.20
109
- requirement: *id006
110
- description: |
111
- = falls_back_on
112
-
113
- Description goes here.
114
-
115
- == Note on Patches/Pull Requests
116
-
117
- * Fork the project.
118
- * Make your feature addition or bug fix.
119
- * Add tests for it. This is important so I don't break it in a
120
- future version unintentionally.
121
- * Commit, do not mess with rakefile, version, or history.
122
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
123
- * Send me a pull request. Bonus points for topic branches.
124
-
125
- == Copyright
126
-
127
- Copyright (c) 2010 Derek Kastner. See LICENSE for details.
128
-
129
- email: seamus@brighterplanet.com
131
+ version: "0"
132
+ type: :development
133
+ version_requirements: *id008
134
+ description: ActiveRecord extension to intelligently fall back on another column when a given column is unavailable
135
+ email:
136
+ - seamus@abshere.net
130
137
  executables: []
131
138
 
132
139
  extensions: []
133
140
 
134
- extra_rdoc_files:
141
+ extra_rdoc_files: []
142
+
143
+ files:
144
+ - .document
145
+ - .gitignore
146
+ - Gemfile
135
147
  - LICENSE
136
148
  - README.rdoc
137
- files:
149
+ - Rakefile
150
+ - falls_back_on.gemspec
138
151
  - lib/falls_back_on.rb
139
- - lib/falls_back_on/active_record_ext.rb
140
- - lib/falls_back_on/app/models/fallback.rb
152
+ - lib/falls_back_on/definition.rb
153
+ - lib/falls_back_on/definition/storage.rb
154
+ - lib/falls_back_on/version.rb
141
155
  - rails/init.rb
142
- - LICENSE
143
- - README.rdoc
144
- - spec/lib/falls_back_on/app/models/fallback_spec.rb
145
- - spec/lib/falls_back_on_spec.rb
146
- - spec/spec_helper.rb
156
+ - test/helper.rb
157
+ - test/test_falls_back_on.rb
147
158
  has_rdoc: true
148
159
  homepage: http://github.com/dkastner/falls_back_on
149
160
  licenses: []
150
161
 
151
162
  post_install_message:
152
- rdoc_options:
153
- - --charset=UTF-8
163
+ rdoc_options: []
164
+
154
165
  require_paths:
155
166
  - lib
156
167
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -173,12 +184,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
184
  version: "0"
174
185
  requirements: []
175
186
 
176
- rubyforge_project:
187
+ rubyforge_project: falls_back_on
177
188
  rubygems_version: 1.3.7
178
189
  signing_key:
179
190
  specification_version: 3
180
- summary: ActiveRecord extension to intelligently fall back on another column when a given column is unavailable
191
+ summary: Adds ActiveRecord::Base.falls_back_on and ActiveRecord::Base.fallback
181
192
  test_files:
182
- - spec/lib/falls_back_on/app/models/fallback_spec.rb
183
- - spec/lib/falls_back_on_spec.rb
184
- - spec/spec_helper.rb
193
+ - test/helper.rb
194
+ - test/test_falls_back_on.rb
@@ -1,5 +0,0 @@
1
- require 'falls_back_on/app/models/fallback'
2
-
3
- ActiveRecord::Base.class_eval do
4
- extend FallsBackOn
5
- end
@@ -1,35 +0,0 @@
1
- class Fallback < ActiveRecord::Base
2
- index :name if respond_to? :index
3
-
4
- serialize :values
5
-
6
- class << self
7
- def get_for(name)
8
- klass = name.constantize
9
- if fallback = find_by_name(name)
10
- begin
11
- f = klass.new(fallback.values)
12
- rescue ActiveRecord::UnknownAttributeError
13
- raise $!, "while trying to use #{fallback.values.inspect} with #{name} #{$!.inspect}"
14
- end
15
- f.readonly!
16
- f
17
- elsif klass.set_fallback
18
- get_for(name)
19
- end
20
- end
21
-
22
- def set_for(name, values = {})
23
- raise "fallback race condition" if Fallback.count > 100
24
- fallback = find_or_create_by_name(name)
25
- fallback.update_attributes(:values => values)
26
- true
27
- end
28
-
29
- def destroy_for(name)
30
- fallback = find_by_name(name.to_s)
31
- fallback.destroy unless fallback.nil?
32
- true
33
- end
34
- end
35
- end
@@ -1,19 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class Arcade < ActiveRecord::Base
4
- attr_accessor :pinball_count, :video_game_count
5
-
6
- falls_back_on :pinball_count => 73
7
- end
8
-
9
- describe Fallback do
10
- describe '.destroy_for' do
11
- it 'should destroy a fallback' do
12
- Fallback.create :name => 'Arcade'
13
- expect do
14
- Fallback.destroy_for Arcade
15
- end.should change(Fallback, :count).by(-1)
16
- end
17
- end
18
- end
19
-
@@ -1,24 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class State < ActiveRecord::Base
4
- falls_back_on :area => 10000
5
- end
6
-
7
- describe FallsBackOn do
8
- describe '.class_name' do
9
- it 'should return the class name' do
10
- State.class_name.should == 'State'
11
- end
12
- end
13
-
14
- describe '.set_fallback' do
15
- it 'should create a Fallback for a class' do
16
- State.set_fallback
17
-
18
- fallback = Fallback.find_by_name 'State'
19
- fallback.should be_an_instance_of(Fallback)
20
- fallback.values.should == {:area => 10000 }
21
- end
22
- end
23
- end
24
-
@@ -1,33 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
-
11
- require 'active_record'
12
- require 'logger'
13
-
14
- $:.unshift File.expand_path('../lib', __FILE__)
15
- require 'falls_back_on'
16
- require 'falls_back_on/active_record_ext'
17
- require 'falls_back_on/app/models/fallback'
18
-
19
- ActiveRecord::Base.logger = Logger.new nil
20
- ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => ':memory:'
21
-
22
- ActiveRecord::Schema.define(:version => 1) do
23
- create_table "fallbacks", :force => true do |t|
24
- t.string "name"
25
- t.text "values"
26
- t.datetime "created_at"
27
- t.datetime "updated_at"
28
- end
29
-
30
- create_table 'states' do |t|
31
- t.integer 'area'
32
- end
33
- end