prefactory 0.7.0 → 0.8.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.
- checksums.yaml +4 -4
- data/README.md +10 -0
- data/lib/prefactory/version.rb +1 -1
- data/lib/rspec/core/prefactory.rb +137 -124
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f879df086b73a9de646cc17f9a1f994d888957b
|
4
|
+
data.tar.gz: a8232c6538a32d3de8e65acb24ba1ff5cb7de924
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03e35db9745634b13cc2d87a5f7beb8bde287b8962da5256a64f10b5f5d09897034c8cf355f10e8282873c73fb2b6e570f4f9e84918ad1f7c7c46355484db7bc
|
7
|
+
data.tar.gz: d21a6f09b96f915bd3382c84b13521b1203a11d9986dea71002b19370e5e00d7f7d072af9544a8fab88e7e8dbc90a117d6b72a803f4694ade6d5823a090ea8cc
|
data/README.md
CHANGED
@@ -103,6 +103,16 @@ end
|
|
103
103
|
|
104
104
|
See also: [An example rails application with Prefactory configured](https://github.com/seanwalbran/prefactory-example)
|
105
105
|
|
106
|
+
If desired, it is also possible to only include the `set!` method and related
|
107
|
+
lookup functionality for e.g. specs that cannot use transactional isolation
|
108
|
+
(like some threaded Capybara feature specs, or similar):
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
RSpec.configure do |config|
|
112
|
+
config.include Prefactory::Lookups
|
113
|
+
end
|
114
|
+
```
|
115
|
+
|
106
116
|
## Contributing
|
107
117
|
|
108
118
|
1. Fork it ( http://github.com/socialcast/prefactory/fork )
|
data/lib/prefactory/version.rb
CHANGED
@@ -29,156 +29,169 @@ module Prefactory
|
|
29
29
|
class NotDefined
|
30
30
|
end
|
31
31
|
|
32
|
-
def
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
# instantiate, or access an already-instantiated-and-memoized, prefabricated object.
|
37
|
-
def prefactory(key)
|
38
|
-
@prefactory_memo ||= {}
|
39
|
-
@prefactory_memo[key] ||= begin
|
40
|
-
lookup = prefactory_lookup(key)
|
41
|
-
if lookup.present?
|
42
|
-
if lookup[:result_class]
|
43
|
-
lookup[:result_class].constantize.find(lookup[:result_id])
|
44
|
-
else
|
45
|
-
YAML.load(lookup[:result_value])
|
46
|
-
end
|
47
|
-
else
|
48
|
-
Prefactory::NotDefined
|
49
|
-
end
|
50
|
-
rescue
|
51
|
-
end
|
32
|
+
def self.included(base)
|
33
|
+
base.include Transactionality
|
34
|
+
base.include Lookups
|
52
35
|
end
|
53
36
|
|
54
|
-
|
55
|
-
|
56
|
-
|
37
|
+
module Lookups
|
38
|
+
def self.included(base)
|
39
|
+
PrefactoryLookup.create_table
|
40
|
+
|
41
|
+
base.instance_eval do
|
42
|
+
def before_with_detect_before_all(*args, &block)
|
43
|
+
before_all_context = (args.first == :all)
|
44
|
+
modified_block = proc do
|
45
|
+
@before_all_context = before_all_context
|
46
|
+
instance_eval(&block)
|
47
|
+
@before_all_context = nil
|
48
|
+
end
|
49
|
+
before_without_detect_before_all(*args, &modified_block)
|
50
|
+
end
|
57
51
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
raise "prefactory_add can only be used in a before(:all) context. Change to a before(:all) or set!, or use let/let! instead." unless in_before_all?
|
62
|
-
result = nil
|
63
|
-
clear_prefactory_memoizations
|
64
|
-
if block
|
65
|
-
result = yield
|
66
|
-
else
|
67
|
-
result = create(key, *args) if respond_to?(:create)
|
68
|
-
end
|
69
|
-
if result.present?
|
70
|
-
if result.respond_to?(:id)
|
71
|
-
PrefactoryLookup.where(:key => key).first_or_initialize.tap do |lookup|
|
72
|
-
lookup.result_class = result.class.name
|
73
|
-
lookup.result_id = result.id
|
74
|
-
lookup.result_value = nil
|
75
|
-
lookup.save!
|
52
|
+
class << self
|
53
|
+
alias_method :before_without_detect_before_all, :before
|
54
|
+
alias_method :before, :before_with_detect_before_all
|
76
55
|
end
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
56
|
+
|
57
|
+
def set!(key, *args, &set_block)
|
58
|
+
before(:all) do
|
59
|
+
modified_block = proc { instance_eval(&set_block) } if set_block
|
60
|
+
prefactory_add(key, *args, &modified_block)
|
61
|
+
end
|
83
62
|
end
|
84
63
|
end
|
85
|
-
else
|
86
|
-
warn "WARNING: Failed to add #{key} to prefactory: block result not present"
|
87
|
-
end
|
88
|
-
clear_prefactory_memoizations
|
89
|
-
result
|
90
|
-
end
|
91
|
-
|
92
|
-
def self.included(base)
|
93
|
-
base.extend RSpecAroundAll
|
94
|
-
PrefactoryLookup.create_table
|
95
64
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
65
|
+
# allow shorthand access to a prefabricated object
|
66
|
+
# e.g. with prefactory_add(:active_user), calling the method active_user will return the (memoized) object,
|
67
|
+
# by invoking the 'prefactory' method.
|
68
|
+
base.class_eval do
|
69
|
+
def method_missing(key, *args, &block)
|
70
|
+
result = prefactory(key)
|
71
|
+
result == Prefactory::NotDefined ? super : result
|
72
|
+
end
|
73
|
+
end
|
105
74
|
end
|
106
75
|
|
107
|
-
|
108
|
-
|
109
|
-
base.around(:each) do |example|
|
110
|
-
clear_prefactory_memoizations
|
111
|
-
ActiveRecord::Base.with_disposable_transaction { example.run }
|
112
|
-
clear_prefactory_memoizations
|
76
|
+
def prefactory_lookup(key)
|
77
|
+
PrefactoryLookup.where(:key => key).first
|
113
78
|
end
|
114
79
|
|
115
|
-
#
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
end
|
126
|
-
after(:all) { clear_prefactory_memoizations }
|
80
|
+
# instantiate, or access an already-instantiated-and-memoized, prefabricated object.
|
81
|
+
def prefactory(key)
|
82
|
+
@prefactory_memo ||= {}
|
83
|
+
@prefactory_memo[key] ||= begin
|
84
|
+
lookup = prefactory_lookup(key)
|
85
|
+
if lookup.present?
|
86
|
+
if lookup[:result_class]
|
87
|
+
lookup[:result_class].constantize.find(lookup[:result_id])
|
88
|
+
else
|
89
|
+
YAML.load(lookup[:result_value])
|
127
90
|
end
|
128
|
-
instance_eval(&block)
|
129
|
-
end
|
130
|
-
|
131
|
-
caller_metadata = { :caller => original_caller }
|
132
|
-
if args.last.is_a?(Hash)
|
133
|
-
args.last.merge!(caller_metadata)
|
134
91
|
else
|
135
|
-
|
92
|
+
Prefactory::NotDefined
|
136
93
|
end
|
137
|
-
|
138
|
-
describe_without_transaction(*args, &modified_block)
|
94
|
+
rescue
|
139
95
|
end
|
96
|
+
end
|
140
97
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
@before_all_context = before_all_context
|
145
|
-
instance_eval(&block)
|
146
|
-
@before_all_context = nil
|
147
|
-
end
|
148
|
-
before_without_detect_before_all(*args, &modified_block)
|
149
|
-
end
|
98
|
+
def in_before_all?
|
99
|
+
@before_all_context
|
100
|
+
end
|
150
101
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
102
|
+
# prefabricate an object. Can be passed any block that returns a class accessible by Klass.find(id),
|
103
|
+
# or, if no block is passed, invokes create(key, options) to use e.g. a FactoryGirl factory of that key name.
|
104
|
+
def prefactory_add(key, *args, &block)
|
105
|
+
raise "prefactory_add can only be used in a before(:all) context. Change to a before(:all) or set!, or use let/let! instead." unless in_before_all?
|
106
|
+
result = nil
|
107
|
+
clear_prefactory_memoizations
|
108
|
+
if block
|
109
|
+
result = yield
|
110
|
+
else
|
111
|
+
result = create(key, *args) if respond_to?(:create)
|
155
112
|
end
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
113
|
+
if result.present?
|
114
|
+
if result.respond_to?(:id)
|
115
|
+
PrefactoryLookup.where(:key => key).first_or_initialize.tap do |lookup|
|
116
|
+
lookup.result_class = result.class.name
|
117
|
+
lookup.result_id = result.id
|
118
|
+
lookup.result_value = nil
|
119
|
+
lookup.save!
|
120
|
+
end
|
121
|
+
else
|
122
|
+
PrefactoryLookup.where(:key => key).first_or_initialize.tap do |lookup|
|
123
|
+
lookup.result_class = nil
|
124
|
+
lookup.result_id = nil
|
125
|
+
lookup.result_value = YAML.dump(result)
|
126
|
+
lookup.save!
|
127
|
+
end
|
161
128
|
end
|
129
|
+
else
|
130
|
+
warn "WARNING: Failed to add #{key} to prefactory: block result not present"
|
162
131
|
end
|
132
|
+
clear_prefactory_memoizations
|
133
|
+
result
|
134
|
+
end
|
163
135
|
|
136
|
+
def clear_prefactory_memoizations
|
137
|
+
@prefactory_memo = {}
|
164
138
|
end
|
139
|
+
end
|
165
140
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
141
|
+
module Transactionality
|
142
|
+
def self.included(base)
|
143
|
+
base.extend RSpecAroundAll
|
144
|
+
# Wrap outermost describe block in a transaction, so before(:all) data is rolled back at the end of this suite.
|
145
|
+
base.before(:all) do
|
146
|
+
clear_prefactory_memoizations
|
147
|
+
end
|
148
|
+
base.around(:all) do |group|
|
149
|
+
ActiveRecord::Base.with_disposable_transaction { group.run_examples }
|
150
|
+
end
|
151
|
+
base.after(:all) do
|
152
|
+
clear_prefactory_memoizations
|
173
153
|
end
|
174
|
-
end
|
175
154
|
|
176
|
-
|
155
|
+
# Wrap each example in a transaction, instead of using Rails' transactional
|
156
|
+
# fixtures, which does not support itself being wrapped in an outermost transaction.
|
157
|
+
base.around(:each) do |example|
|
158
|
+
clear_prefactory_memoizations
|
159
|
+
ActiveRecord::Base.with_disposable_transaction { example.run }
|
160
|
+
clear_prefactory_memoizations
|
161
|
+
end
|
177
162
|
|
178
|
-
|
163
|
+
# Wrap each ExampleGroup in a transaction, so group-level before(:all) settings
|
164
|
+
# are scoped only to the group.
|
165
|
+
base.instance_eval do
|
166
|
+
def describe_with_transaction(*args, &block)
|
167
|
+
original_caller = caller
|
168
|
+
modified_block = proc do
|
169
|
+
instance_eval do
|
170
|
+
before(:all) { clear_prefactory_memoizations }
|
171
|
+
around(:all) do |group|
|
172
|
+
ActiveRecord::Base.with_disposable_transaction { group.run_examples }
|
173
|
+
end
|
174
|
+
after(:all) { clear_prefactory_memoizations }
|
175
|
+
end
|
176
|
+
instance_eval(&block)
|
177
|
+
end
|
179
178
|
|
180
|
-
|
181
|
-
|
182
|
-
|
179
|
+
caller_metadata = { :caller => original_caller }
|
180
|
+
if args.last.is_a?(Hash)
|
181
|
+
args.last.merge!(caller_metadata)
|
182
|
+
else
|
183
|
+
args << caller_metadata
|
184
|
+
end
|
183
185
|
|
186
|
+
describe_without_transaction(*args, &modified_block)
|
187
|
+
end
|
188
|
+
|
189
|
+
class << self
|
190
|
+
alias_method :describe_without_transaction, :describe
|
191
|
+
alias_method :describe, :describe_with_transaction
|
192
|
+
alias_method :context, :describe
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
184
197
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prefactory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- developers@socialcast.com
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec_around_all
|