fixtury 0.4.1 → 1.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
data/lib/fixtury.rb CHANGED
@@ -1,14 +1,33 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support/concern"
4
+ require "active_support/core_ext/array/extract_options"
4
5
  require "active_support/core_ext/module/attribute_accessors"
5
6
  require "active_support/core_ext/module/delegation"
7
+ require "active_support/core_ext/object/acts_like"
8
+ require "active_support/core_ext/object/blank"
9
+
6
10
  require "fixtury/version"
7
- require "fixtury/schema"
11
+
12
+ require "fixtury/configuration"
13
+ require "fixtury/definition_executor"
14
+ require "fixtury/dependency"
15
+ require "fixtury/dependency_store"
16
+ require "fixtury/errors"
17
+ require "fixtury/hooks"
8
18
  require "fixtury/locator"
19
+ require "fixtury/path_resolver"
20
+ require "fixtury/reference"
9
21
  require "fixtury/store"
10
22
 
11
- # Top level namespace of the gem
23
+ require "fixtury/schema_node"
24
+ require "fixtury/definition"
25
+ require "fixtury/schema"
26
+
27
+
28
+ # Top level namespace of the gem. The accessors provided on the Fixtury namespace are meant to be shared
29
+ # across the entire application. The Fixtury::Schema instance is the primary interface for defining and
30
+ # accessing fixtures and can be accessed via Fixtury.schema.
12
31
  module Fixtury
13
32
 
14
33
  LOG_LEVELS = {
@@ -20,29 +39,79 @@ module Fixtury
20
39
 
21
40
  DEFAULT_LOG_LEVEL = LOG_LEVEL_INFO
22
41
 
42
+ def self.configuration
43
+ @configuration ||= ::Fixtury::Configuration.new
44
+ yield @configuration if block_given?
45
+ @configuration
46
+ end
47
+
48
+ def self.configure(&block)
49
+ self.configuration(&block)
50
+ end
51
+
52
+
23
53
  # Shortcut for opening the top level schema.
24
54
  def self.define(&block)
25
55
  schema.define(&block)
26
56
  schema
27
57
  end
28
58
 
59
+ # Global hooks accessor. Fixtury will call these hooks at various points in the lifecycle of a fixture or setup.
60
+ def self.hooks
61
+ @hooks ||= ::Fixtury::Hooks.new
62
+ end
63
+
29
64
  # The default top level schema. Fixtury::Schema instances can be completely self-contained but most
30
65
  # usage would be through this shared definition.
31
66
  def self.schema
32
- @schema ||= ::Fixtury::Schema.new(parent: nil, name: "")
67
+ @schema ||= ::Fixtury::Schema.new
33
68
  end
34
69
 
35
- def self.log_level
36
- return @log_level if @log_level
70
+ def self.schema=(schema)
71
+ @schema = schema
72
+ end
73
+
74
+ # Default store for fixtures. This is a shared store that can be used across the application.
75
+ def self.store
76
+ @store ||= ::Fixtury::Store.new
77
+ end
78
+
79
+ def self.store=(store)
80
+ @store = store
81
+ end
82
+
83
+ # Require each schema file to ensure that all definitions are loaded.
84
+ def self.load_all_schemas
85
+ configuration.fixture_files.each do |filepath|
86
+ require filepath
87
+ end
88
+ end
37
89
 
38
- @log_level = ENV["FIXTURY_LOG_LEVEL"]
39
- @log_level ||= DEFAULT_LOG_LEVEL
40
- @log_level = @log_level.to_s.to_sym
41
- @log_level
90
+ # Ensure all definitions are loaded and then load all known fixtures.
91
+ def self.load_all_fixtures
92
+ load_all_schemas
93
+ Fixtury.store.load_all
42
94
  end
43
95
 
44
- def self.log(text = nil, level: LOG_LEVEL_DEBUG, name: nil)
45
- desired_level = LOG_LEVELS.fetch(log_level) { DEFAULT_LOG_LEVEL }
96
+ # Remove all references from the active store and reset the dependency file
97
+ def self.reset
98
+ log("resetting", level: LOG_LEVEL_INFO)
99
+
100
+ configuration.reset
101
+ store.reset
102
+ end
103
+
104
+ # Perform a reset if any of the tracked files have changed.
105
+ def self.reset_if_changed
106
+ if configuration.files_changed?
107
+ reset
108
+ else
109
+ log("no changes, skipping reset", level: LOG_LEVEL_INFO)
110
+ end
111
+ end
112
+
113
+ def self.log(text = nil, level: LOG_LEVEL_DEBUG, name: nil, newline: true)
114
+ desired_level = LOG_LEVELS.fetch(configuration.log_level) { DEFAULT_LOG_LEVEL }
46
115
  return if desired_level == LOG_LEVEL_NONE
47
116
 
48
117
  message_level = LOG_LEVELS.fetch(level) { LOG_LEVEL_DEBUG }
@@ -53,7 +122,10 @@ module Fixtury
53
122
  msg << "]"
54
123
  msg << " #{text}" if text
55
124
  msg << " #{yield}" if block_given?
56
- puts msg
125
+ msg << "\n" if newline
126
+
127
+ print msg
128
+ msg
57
129
  end
58
130
 
59
131
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fixtury
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 1.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Nelson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-05 00:00:00.000000000 Z
11
+ date: 2024-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: autotest
14
+ name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -25,21 +25,21 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: bundler
28
+ name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '2.0'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '2.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: byebug
42
+ name: globalid
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: globalid
56
+ name: activerecord
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,21 +67,21 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: minitest
70
+ name: m
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '5.0'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '5.0'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: minitest-reporters
84
+ name: minitest
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -112,18 +112,18 @@ dependencies:
112
112
  name: rake
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - "~>"
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: '13.0'
117
+ version: '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: '13.0'
124
+ version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
- name: sqlite
126
+ name: sqlite3
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
@@ -136,7 +136,7 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
- description:
139
+ description:
140
140
  email:
141
141
  - mike@guideline.com
142
142
  executables: []
@@ -154,24 +154,24 @@ files:
154
154
  - bin/setup
155
155
  - fixtury.gemspec
156
156
  - lib/fixtury.rb
157
+ - lib/fixtury/configuration.rb
157
158
  - lib/fixtury/definition.rb
158
159
  - lib/fixtury/definition_executor.rb
159
- - lib/fixtury/errors/already_defined_error.rb
160
- - lib/fixtury/errors/circular_dependency_error.rb
161
- - lib/fixtury/errors/fixture_not_defined_error.rb
162
- - lib/fixtury/errors/option_collision_error.rb
163
- - lib/fixtury/errors/schema_frozen_error.rb
164
- - lib/fixtury/errors/unrecognizable_locator_error.rb
160
+ - lib/fixtury/dependency.rb
161
+ - lib/fixtury/dependency_store.rb
162
+ - lib/fixtury/errors.rb
163
+ - lib/fixtury/hooks.rb
165
164
  - lib/fixtury/locator.rb
166
165
  - lib/fixtury/locator_backend/common.rb
167
- - lib/fixtury/locator_backend/globalid.rb
166
+ - lib/fixtury/locator_backend/global_id.rb
168
167
  - lib/fixtury/locator_backend/memory.rb
169
- - lib/fixtury/path.rb
168
+ - lib/fixtury/mutation_observer.rb
169
+ - lib/fixtury/path_resolver.rb
170
170
  - lib/fixtury/railtie.rb
171
171
  - lib/fixtury/reference.rb
172
172
  - lib/fixtury/schema.rb
173
+ - lib/fixtury/schema_node.rb
173
174
  - lib/fixtury/store.rb
174
- - lib/fixtury/tasks.rake
175
175
  - lib/fixtury/test_hooks.rb
176
176
  - lib/fixtury/version.rb
177
177
  homepage: https://github.com/guideline-tech/fixtury
@@ -181,7 +181,7 @@ metadata:
181
181
  homepage_uri: https://github.com/guideline-tech/fixtury
182
182
  source_code_uri: https://github.com/guideline-tech/fixtury
183
183
  changelog_uri: https://github.com/guideline-tech/fixtury
184
- post_install_message:
184
+ post_install_message:
185
185
  rdoc_options: []
186
186
  require_paths:
187
187
  - lib
@@ -196,8 +196,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
196
  - !ruby/object:Gem::Version
197
197
  version: '0'
198
198
  requirements: []
199
- rubygems_version: 3.0.6
200
- signing_key:
199
+ rubygems_version: 3.5.6
200
+ signing_key:
201
201
  specification_version: 4
202
202
  summary: Treat fixtures like factories and factories like fixtures
203
203
  test_files: []
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Fixtury
4
- module Errors
5
- class AlreadyDefinedError < ::StandardError
6
-
7
- def initialize(name)
8
- super("An element identified by `#{name}` already exists.")
9
- end
10
-
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Fixtury
4
- module Errors
5
- class CircularDependencyError < ::StandardError
6
-
7
- def initialize(name)
8
- super("One of the dependencies of #{name} is dependent on #{name}.")
9
- end
10
-
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Fixtury
4
- module Errors
5
- class FixtureNotDefinedError < ::StandardError
6
-
7
- def initialize(name)
8
- super("A fixture identified by `#{name}` does not exist.")
9
- end
10
-
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Fixtury
4
- module Errors
5
- class OptionCollisionError < ::StandardError
6
-
7
- def initialize(schema_name, option_key, old_value, new_value)
8
- super("The #{schema_name.inspect} schema #{option_key.inspect} option value of #{old_value.inspect} conflicts with the new value #{new_value.inspect}.")
9
- end
10
-
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Fixtury
4
- module Errors
5
- class SchemaFrozenError < ::StandardError
6
-
7
- def initialize
8
- super("Schema is frozen. New namespaces, definitions, and enhancements are not allowed.")
9
- end
10
-
11
- end
12
- end
13
- end
@@ -1,11 +0,0 @@
1
- module Fixtury
2
- module Errors
3
- class UnrecognizableLocatorError < ::StandardError
4
-
5
- def initialize(action, thing)
6
- super("Locator did not reognize #{thing} during #{action}")
7
- end
8
-
9
- end
10
- end
11
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "./common"
4
- require "globalid"
5
-
6
- module Fixtury
7
- module LocatorBackend
8
- class GlobalID
9
-
10
- include ::Fixtury::LocatorBackend::Common
11
-
12
- MATCHER = %r{^gid://}.freeze
13
-
14
- def recognized_reference?(ref)
15
- ref.is_a?(String) && MATCHER.match?(ref)
16
- end
17
-
18
- def recognized_value?(val)
19
- val.respond_to?(:to_global_id)
20
- end
21
-
22
- def load_recognized_reference(ref)
23
- ::GlobalID::Locator.locate ref
24
- end
25
-
26
- def dump_recognized_value(value)
27
- value.to_global_id.to_s
28
- end
29
-
30
- end
31
- end
32
- end
data/lib/fixtury/path.rb DELETED
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Fixtury
4
- class Path
5
-
6
- def initialize(namespace:, path:)
7
- @namespace = namespace.to_s
8
- @path = path.to_s
9
- @full_path = (
10
- @path.start_with?("/") ?
11
- @path :
12
- File.expand_path(::File.join(@namespace, @path), "/")
13
- )
14
- @segments = @full_path.split("/")
15
- end
16
-
17
- def top_level_namespace
18
- return "" if @segments.size == 1
19
-
20
- @segments.first
21
- end
22
-
23
- def relative?
24
- @path.start_with?(".")
25
- end
26
-
27
- def possible_absolute_paths
28
- @possible_absolute_paths ||= begin
29
- out = [@full_path]
30
- out << @path unless relative?
31
- out
32
- end
33
- end
34
-
35
- end
36
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace :fixtury do
4
- task :setup
5
-
6
- desc "Clear fixtures from your cache. Accepts a pattern or fixture name such as foo/bar or /foo/*. Default pattern is /*"
7
- task :clear_cache, [:pattern] => :setup do |_t, args|
8
- ::Fixtury::Store.instance.clear_cache!(pattern: args[:pattern])
9
- end
10
- end