fixtury 0.1.0.alpha2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 75498846db5af5a720586eee8dbd16a231b326ccbd3e11867235d048dd161aa1
4
- data.tar.gz: 9205f55fed52ac282da960130416db10d8cf52c8a528e5b28b3ef2b94eccbc1a
3
+ metadata.gz: 43cad01d0dda49953fb41782235cb0786d60a0b84eb3d8e9f4145d6fa4268f04
4
+ data.tar.gz: 5f4347bcf7a8ef5b7c72d42802e260f7ecc1b0e8d3772f4681bbef2aa7e9a963
5
5
  SHA512:
6
- metadata.gz: 0bb9a8d6f1cad6e929679f004e806d6160c25b195608cdaed9e3083120bb91ade8e3452710602f3311c5980b7a4d94f7179d8b411ca5a37bf7631c256e665690
7
- data.tar.gz: da048dd34fc8e4d665bdf2c7b4fd5029ef15a2251a370aa014ae38799f9a15e9ff84ec65713ce5398d3f21dbebaa0f14884cea2185f0af7fddd3e25c0a237e48
6
+ metadata.gz: adc92b02ad90ae0afd4f4b10d146e26663d3dfd0d428f9739d9cfcf147dde7d2e09b05f84e956f116af62123477bc453f343ca3bda0a3bf17ae6d7edf61d7f35
7
+ data.tar.gz: 4a5720793e764bc4f366512b8d172b31d64b68c89abd86862d2d199f68bd36b590e706bba56c8fa5471d071c5d84e370c30de0b7bf93109df3476d75caf22dca
@@ -1,26 +1,26 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fixtury (0.1.0.alpha)
4
+ fixtury (0.1.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
- activesupport (6.0.1)
9
+ activesupport (6.0.3.1)
10
10
  concurrent-ruby (~> 1.0, >= 1.0.2)
11
11
  i18n (>= 0.7, < 2)
12
12
  minitest (~> 5.1)
13
13
  tzinfo (~> 1.1)
14
- zeitwerk (~> 2.2)
14
+ zeitwerk (~> 2.2, >= 2.2.2)
15
15
  ansi (1.5.0)
16
16
  autotest (5.0.0)
17
17
  minitest-autotest (~> 1.0)
18
18
  builder (3.2.3)
19
19
  byebug (11.0.1)
20
- concurrent-ruby (1.1.5)
20
+ concurrent-ruby (1.1.6)
21
21
  globalid (0.4.2)
22
22
  activesupport (>= 4.2.0)
23
- i18n (1.7.0)
23
+ i18n (1.8.2)
24
24
  concurrent-ruby (~> 1.0)
25
25
  metaclass (0.0.4)
26
26
  minitest (5.13.0)
@@ -37,13 +37,13 @@ GEM
37
37
  mocha (1.8.0)
38
38
  metaclass (~> 0.0.1)
39
39
  path_expander (1.1.0)
40
- rake (10.5.0)
40
+ rake (13.0.1)
41
41
  ruby-progressbar (1.10.1)
42
42
  sqlite (1.0.2)
43
43
  thread_safe (0.3.6)
44
- tzinfo (1.2.5)
44
+ tzinfo (1.2.7)
45
45
  thread_safe (~> 0.1)
46
- zeitwerk (2.2.2)
46
+ zeitwerk (2.3.0)
47
47
 
48
48
  PLATFORMS
49
49
  ruby
@@ -57,8 +57,8 @@ DEPENDENCIES
57
57
  minitest (~> 5.0)
58
58
  minitest-reporters
59
59
  mocha
60
- rake (~> 10.0)
60
+ rake (~> 13.0)
61
61
  sqlite
62
62
 
63
63
  BUNDLED WITH
64
- 2.0.2
64
+ 2.1.4
@@ -34,6 +34,6 @@ Gem::Specification.new do |spec|
34
34
  spec.add_development_dependency "minitest", "~> 5.0"
35
35
  spec.add_development_dependency "minitest-reporters"
36
36
  spec.add_development_dependency "mocha"
37
- spec.add_development_dependency "rake", "~> 10.0"
37
+ spec.add_development_dependency "rake", "~> 13.0"
38
38
  spec.add_development_dependency "sqlite"
39
39
  end
@@ -7,7 +7,6 @@ require "fixtury/version"
7
7
  require "fixtury/schema"
8
8
  require "fixtury/locator"
9
9
  require "fixtury/store"
10
- require "fixtury/execution_context"
11
10
 
12
11
  module Fixtury
13
12
 
@@ -44,9 +44,7 @@ module Fixtury
44
44
  end
45
45
  end
46
46
 
47
- def run_callable(store:, callable:, execution_context:, value:)
48
- execution_context ||= self
49
-
47
+ def run_callable(store:, callable:, execution_context: nil, value:)
50
48
  args = []
51
49
  args << value unless value.nil?
52
50
  if callable.arity > args.length
@@ -55,11 +53,26 @@ module Fixtury
55
53
  args << store
56
54
  end
57
55
 
58
- if args.length.positive?
59
- execution_context.instance_exec(*args, &callable)
56
+ provide_execution_context_hooks(execution_context) do |ctxt|
57
+ if args.length.positive?
58
+ ctxt.instance_exec(*args, &callable)
59
+ else
60
+ ctxt.instance_eval(&callable)
61
+ end
62
+ end
63
+ end
64
+
65
+ def provide_execution_context_hooks(execution_context)
66
+ return yield self unless execution_context
67
+
68
+ execution_context.before_fixture(self) if execution_context.respond_to?(:before_fixture)
69
+ value = if execution_context.respond_to?(:around_fixture)
70
+ execution_context.around_fixture(self) { yield execution_context }
60
71
  else
61
- execution_context.instance_eval(&callable)
72
+ yield execution_context
62
73
  end
74
+ execution_context.after_fixture(self, value) if execution_context.respond_to?(:after_fixture)
75
+ value
63
76
  end
64
77
 
65
78
  end
@@ -24,6 +24,12 @@ module Fixtury
24
24
  @backend = backend
25
25
  end
26
26
 
27
+ def recognize?(ref)
28
+ raise ArgumentError, "Unable to recognize a nil ref" if ref.nil?
29
+
30
+ backend.recognized_reference?(ref)
31
+ end
32
+
27
33
  def load(ref)
28
34
  raise ArgumentError, "Unable to load a nil ref" if ref.nil?
29
35
 
@@ -67,7 +67,7 @@ module Fixtury
67
67
  ensure_no_conflict!(name: name, definitions: true, namespaces: false)
68
68
 
69
69
  child = find_or_create_child_schema(name: name)
70
- child.instance_eval(&block)
70
+ child.instance_eval(&block) if block_given?
71
71
  child
72
72
  end
73
73
 
@@ -5,33 +5,41 @@ require "singleton"
5
5
  require "yaml"
6
6
  require "fixtury/locator"
7
7
  require "fixtury/errors/circular_dependency_error"
8
- require "fixtury/execution_context"
9
8
  require "fixtury/reference"
10
9
 
11
10
  module Fixtury
12
11
  class Store
13
12
 
13
+ LOG_LEVELS = {
14
+ (LOG_LEVEL_NONE = :none) => 0,
15
+ (LOG_LEVEL_INFO = :info) => 1,
16
+ (LOG_LEVEL_DEBUG = :debug) => 2,
17
+ }.freeze
18
+
14
19
  cattr_accessor :instance
15
20
 
16
21
  attr_reader :filepath, :references, :ttl, :auto_refresh_expired
17
22
  attr_reader :schema, :locator
18
- attr_reader :verbose
23
+ attr_reader :log_level
19
24
  attr_reader :execution_context
20
25
 
21
26
  def initialize(
22
27
  filepath: nil,
23
28
  locator: ::Fixtury::Locator.instance,
24
- verbose: false,
29
+ log_level: nil,
25
30
  ttl: nil,
26
31
  schema: nil,
32
+ execution_context: nil,
27
33
  auto_refresh_expired: false
28
34
  )
29
35
  @schema = schema || ::Fixtury.schema
30
- @verbose = verbose
36
+ @log_level = log_level.nil? ? ENV["FIXTURY_LOG_LEVEL"] : log_level
37
+ @log_level ||= LOG_LEVEL_NONE
38
+ @log_level = @log_level.to_s.to_sym
31
39
  @locator = locator
32
40
  @filepath = filepath
33
41
  @references = @filepath && ::File.file?(@filepath) ? ::YAML.load_file(@filepath) : {}
34
- @execution_context = ::Fixtury::ExecutionContext.new
42
+ @execution_context = execution_context
35
43
  @ttl = ttl ? ttl.to_i : ttl
36
44
  @auto_refresh_expired = !!auto_refresh_expired
37
45
  self.class.instance ||= self
@@ -53,8 +61,8 @@ module Fixtury
53
61
  return unless ttl
54
62
 
55
63
  references.delete_if do |name, ref|
56
- is_expired = ref_expired?(ref)
57
- log { "expiring #{name}" } if is_expired
64
+ is_expired = ref_invalid?(ref)
65
+ log(level: LOG_LEVEL_INFO) { "expiring #{name}" } if is_expired
58
66
  is_expired
59
67
  end
60
68
  end
@@ -76,7 +84,7 @@ module Fixtury
76
84
  pattern = pattern[0...-1] if glob
77
85
  references.delete_if do |key, _value|
78
86
  hit = glob ? key.start_with?(pattern) : key == pattern
79
- log(true) { "clearing #{key}" } if hit
87
+ log(level: LOG_LEVEL_INFO) { "clearing #{key}" } if hit
80
88
  hit
81
89
  end
82
90
  dump_to_file
@@ -95,7 +103,7 @@ module Fixtury
95
103
  full_name = dfn.name
96
104
  ref = references[full_name]
97
105
  result = ref&.real?
98
- log { result ? "hit #{full_name}" : "miss #{full_name}" }
106
+ log(level: LOG_LEVEL_DEBUG) { result ? "hit #{full_name}" : "miss #{full_name}" }
99
107
  result
100
108
  end
101
109
 
@@ -108,8 +116,8 @@ module Fixtury
108
116
  raise ::Fixtury::Errors::CircularDependencyError, full_name
109
117
  end
110
118
 
111
- if ref && auto_refresh_expired && ref_expired?(ref)
112
- log { "refreshing #{full_name}" }
119
+ if ref && auto_refresh_expired && ref_invalid?(ref)
120
+ log(level: LOG_LEVEL_INFO) { "refreshing #{full_name}" }
113
121
  clear_ref(full_name)
114
122
  ref = nil
115
123
  end
@@ -117,11 +125,11 @@ module Fixtury
117
125
  value = nil
118
126
 
119
127
  if ref
120
- log { "hit #{full_name}" }
128
+ log(level: LOG_LEVEL_DEBUG) { "hit #{full_name}" }
121
129
  value = load_ref(ref.value)
122
130
  if value.nil?
123
131
  clear_ref(full_name)
124
- log { "missing #{full_name}" }
132
+ log(level: LOG_LEVEL_DEBUG) { "missing #{full_name}" }
125
133
  end
126
134
  end
127
135
 
@@ -131,7 +139,7 @@ module Fixtury
131
139
 
132
140
  value = dfn.call(store: self, execution_context: execution_context)
133
141
 
134
- log { "store #{full_name}" }
142
+ log(level: LOG_LEVEL_INFO) { "store #{full_name}" }
135
143
 
136
144
  ref = dump_ref(full_name, value)
137
145
  ref = ::Fixtury::Reference.new(full_name, ref)
@@ -154,16 +162,20 @@ module Fixtury
154
162
  references.delete(name)
155
163
  end
156
164
 
157
- def ref_expired?(ref)
158
- return false unless ttl
165
+ def ref_invalid?(ref)
166
+ return true if ttl && ref.created_at < (Time.now.to_i - ttl)
159
167
 
160
- ref.created_at < (Time.now.to_i - ttl)
168
+ !locator.recognize?(ref.value)
161
169
  end
162
170
 
163
- def log(local_verbose = false, &block)
164
- return unless verbose || local_verbose
171
+ def log(level: LOG_LEVEL_DEBUG, name: "store")
172
+ desired_level = LOG_LEVELS.fetch(log_level) { LOG_LEVEL_NONE }
173
+ return if desired_level == LOG_LEVEL_NONE
174
+
175
+ message_level = LOG_LEVELS.fetch(level) { LOG_LEVEL_DEBUG }
176
+ return unless desired_level >= message_level
165
177
 
166
- puts "[fixtury|store] #{block.call}"
178
+ puts "[fixtury|#{name}] #{yield}"
167
179
  end
168
180
 
169
181
  end
@@ -3,7 +3,7 @@
3
3
  require "fixtury/store"
4
4
 
5
5
  module Fixtury
6
- module Hooks
6
+ module TestHooks
7
7
 
8
8
  extend ::ActiveSupport::Concern
9
9
 
@@ -18,15 +18,45 @@ module Fixtury
18
18
  self.fixtury_dependencies += names.flatten.compact.map(&:to_s)
19
19
  end
20
20
 
21
+ def define_fixture(name, &block)
22
+ fixture_name = name
23
+ namespace_names = self.name.underscore.split("/")
24
+
25
+ ns = ::Fixtury.schema
26
+
27
+ namespace_names.each do |ns_name|
28
+ ns = ns.namespace(ns_name){}
29
+ end
30
+
31
+ ns.fixture(fixture_name, &block)
32
+
33
+ fixtury("#{namespace_names.join("/")}/#{fixture_name}")
34
+ end
35
+
21
36
  end
22
37
 
23
38
  def fixtury(name)
24
- raise ArgumentError unless self.fixtury_dependencies.include?(name.to_s)
39
+ return nil unless ::Fixtury::Store.instance
40
+
41
+ name = name.to_s
42
+
43
+ unless name.include?("/")
44
+ local_name = "#{self.class.name.underscore}/#{name}"
45
+ if self.fixtury_dependencies.include?(local_name)
46
+ return ::Fixtury::Store.instance.get(local_name)
47
+ end
48
+ end
49
+
50
+ unless self.fixtury_dependencies.include?(name)
51
+ raise ArgumentError, "Unrecognized fixtury dependency `#{name}` for #{self.class}"
52
+ end
25
53
 
26
54
  ::Fixtury::Store.instance.get(name)
27
55
  end
28
56
 
29
57
  def fixtury_loaded?(name)
58
+ return false unless ::Fixtury::Store.instance
59
+
30
60
  ::Fixtury::Store.instance.loaded?(name)
31
61
  end
32
62
 
@@ -70,6 +100,8 @@ module Fixtury
70
100
  end
71
101
 
72
102
  def clear_expired_fixtury_fixtures!
103
+ return unless ::Fixtury::Store.instance
104
+
73
105
  ::Fixtury::Store.instance.clear_expired_references!
74
106
  end
75
107
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Fixtury
4
4
 
5
- VERSION = "0.1.0.alpha2"
5
+ VERSION = "0.2.0"
6
6
 
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fixtury
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.alpha2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Nelson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-01 00:00:00.000000000 Z
11
+ date: 2020-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: autotest
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '10.0'
117
+ version: '13.0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '10.0'
124
+ version: '13.0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: sqlite
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -160,8 +160,6 @@ files:
160
160
  - lib/fixtury/errors/fixture_not_defined_error.rb
161
161
  - lib/fixtury/errors/schema_frozen_error.rb
162
162
  - lib/fixtury/errors/unrecognizable_locator_error.rb
163
- - lib/fixtury/execution_context.rb
164
- - lib/fixtury/hooks.rb
165
163
  - lib/fixtury/locator.rb
166
164
  - lib/fixtury/locator_backend/common.rb
167
165
  - lib/fixtury/locator_backend/globalid.rb
@@ -172,6 +170,7 @@ files:
172
170
  - lib/fixtury/schema.rb
173
171
  - lib/fixtury/store.rb
174
172
  - lib/fixtury/tasks.rake
173
+ - lib/fixtury/test_hooks.rb
175
174
  - lib/fixtury/version.rb
176
175
  homepage: https://github.com/guideline-tech/fixtury
177
176
  licenses: []
@@ -191,9 +190,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
191
190
  version: '0'
192
191
  required_rubygems_version: !ruby/object:Gem::Requirement
193
192
  requirements:
194
- - - ">"
193
+ - - ">="
195
194
  - !ruby/object:Gem::Version
196
- version: 1.3.1
195
+ version: '0'
197
196
  requirements: []
198
197
  rubygems_version: 3.0.6
199
198
  signing_key:
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # a class made available so helper methods can be provided within the fixture dsl
4
- module Fixtury
5
- class ExecutionContext
6
-
7
- end
8
- end