fixturama 0.1.0 → 0.5.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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +99 -0
  3. data/README.md +76 -4
  4. data/lib/fixturama.rb +48 -20
  5. data/lib/fixturama/changes.rb +72 -0
  6. data/lib/fixturama/changes/base.rb +28 -0
  7. data/lib/fixturama/changes/chain.rb +64 -0
  8. data/lib/fixturama/changes/chain/actions.rb +31 -0
  9. data/lib/fixturama/changes/chain/arguments.rb +59 -0
  10. data/lib/fixturama/changes/chain/raise_action.rb +43 -0
  11. data/lib/fixturama/changes/chain/return_action.rb +33 -0
  12. data/lib/fixturama/changes/const.rb +30 -0
  13. data/lib/fixturama/changes/env.rb +35 -0
  14. data/lib/fixturama/changes/request.rb +91 -0
  15. data/lib/fixturama/changes/request/response.rb +62 -0
  16. data/lib/fixturama/changes/request/responses.rb +22 -0
  17. data/lib/fixturama/changes/seed.rb +39 -0
  18. data/lib/fixturama/config.rb +5 -0
  19. data/lib/fixturama/fixture_error.rb +31 -0
  20. data/lib/fixturama/loader.rb +6 -2
  21. data/lib/fixturama/loader/context.rb +14 -5
  22. data/lib/fixturama/loader/value.rb +1 -0
  23. data/lib/fixturama/version.rb +4 -0
  24. metadata +85 -73
  25. data/.gitignore +0 -12
  26. data/.rspec +0 -2
  27. data/.rubocop.yml +0 -22
  28. data/.travis.yml +0 -17
  29. data/Gemfile +0 -9
  30. data/LICENSE.txt +0 -21
  31. data/Rakefile +0 -6
  32. data/fixturama.gemspec +0 -24
  33. data/lib/fixturama/seed.rb +0 -15
  34. data/lib/fixturama/stubs.rb +0 -79
  35. data/lib/fixturama/stubs/chain.rb +0 -90
  36. data/lib/fixturama/stubs/chain/actions.rb +0 -39
  37. data/lib/fixturama/stubs/chain/actions/raise.rb +0 -21
  38. data/lib/fixturama/stubs/chain/actions/return.rb +0 -23
  39. data/lib/fixturama/stubs/chain/arguments.rb +0 -86
  40. data/lib/fixturama/stubs/const.rb +0 -43
  41. data/lib/fixturama/stubs/request.rb +0 -98
  42. data/lib/fixturama/stubs/request/response.rb +0 -43
  43. data/lib/fixturama/stubs/request/responses.rb +0 -20
  44. data/lib/fixturama/utils.rb +0 -39
  45. data/spec/fixturama/load_fixture/_spec.rb +0 -53
  46. data/spec/fixturama/load_fixture/data.json +0 -5
  47. data/spec/fixturama/load_fixture/data.yaml +0 -3
  48. data/spec/fixturama/load_fixture/data.yml +0 -3
  49. data/spec/fixturama/seed_fixture/_spec.rb +0 -36
  50. data/spec/fixturama/seed_fixture/seed.yml +0 -16
  51. data/spec/fixturama/stub_fixture/_spec.rb +0 -120
  52. data/spec/fixturama/stub_fixture/stub.yml +0 -73
  53. data/spec/spec_helper.rb +0 -26
@@ -0,0 +1,22 @@
1
+ class Fixturama::Changes::Request
2
+ #
3
+ # @private
4
+ # Iterate by a consecutive responses to the request
5
+ #
6
+ class Responses
7
+ # @return [Fixturama::Changes::Request::Response]
8
+ def next
9
+ @list.count > 1 ? @list.pop : @list.first
10
+ end
11
+
12
+ private
13
+
14
+ def initialize(*list)
15
+ list = [{ status: 200 }] if list.empty?
16
+ @list = list.flatten.reverse.flat_map do |item|
17
+ response = Response.new(item)
18
+ [response.to_h] * response.repeat
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,39 @@
1
+ class Fixturama::Changes
2
+ #
3
+ # @private
4
+ # Seed objects using the +FactoryBot+
5
+ #
6
+ class Seed < Base
7
+ private
8
+
9
+ def initialize(**options)
10
+ @type = type_from(options)
11
+ @traits = traits_from(options)
12
+ @params = params_from(options)
13
+ @count = count_from(options)
14
+ create_object
15
+ end
16
+
17
+ def type_from(options)
18
+ options[:type]&.to_sym&.tap { |value| return value }
19
+ raise Fixturama::FixtureError.new("a factory", options)
20
+ end
21
+
22
+ def traits_from(options)
23
+ Array(options[:traits]).map(&:to_sym)
24
+ end
25
+
26
+ def params_from(options)
27
+ Hash(options[:params]).transform_keys(&:to_sym)
28
+ end
29
+
30
+ def count_from(options)
31
+ options.fetch(:count, 1).to_i.tap { |val| return val if val.positive? }
32
+ raise Fixturama::FixtureError.new("a valid number of objects", options)
33
+ end
34
+
35
+ def create_object
36
+ FactoryBot.create_list(@type, @count, *@traits, **@params)
37
+ end
38
+ end
39
+ end
@@ -1,3 +1,8 @@
1
+ #
2
+ # @private
3
+ # Configures the gem to exclude conflicts between
4
+ # ids auto-generated by database and hardcoded in fixtures
5
+ #
1
6
  module Fixturama::Config
2
7
  module_function
3
8
 
@@ -0,0 +1,31 @@
1
+ #
2
+ # The exception complaining about invalid definition in some fixture
3
+ #
4
+ class Fixturama::FixtureError < ArgumentError
5
+ # The error message
6
+ # @return [String]
7
+ def message
8
+ <<~MESSAGE
9
+ Cannot infer #{@object} from the following part of the fixture #{@file}:
10
+ #{@data}
11
+ MESSAGE
12
+ end
13
+
14
+ # @private
15
+ # Add reference to the path of the fixture file
16
+ # @param [String] file
17
+ # @return [self]
18
+ def with_file(file)
19
+ @file = file
20
+ self
21
+ end
22
+
23
+ private
24
+
25
+ def initialize(object, data, _cause = nil)
26
+ @object = object
27
+ @data = YAML.dump(data)
28
+
29
+ super message
30
+ end
31
+ end
@@ -1,4 +1,5 @@
1
1
  #
2
+ # @private
2
3
  # Load fixture with some options
3
4
  #
4
5
  class Fixturama::Loader
@@ -14,7 +15,8 @@ class Fixturama::Loader
14
15
 
15
16
  private
16
17
 
17
- def initialize(path, opts = {})
18
+ def initialize(example, path, opts = {})
19
+ @example = example
18
20
  @path = path
19
21
  @opts = opts.to_h
20
22
  end
@@ -32,7 +34,7 @@ class Fixturama::Loader
32
34
  end
33
35
 
34
36
  def context
35
- @context ||= (yaml? || json?) ? Context.new(@opts) : Hashie::Mash.new(@opts)
37
+ @context ||= Context.new(@example, @opts)
36
38
  end
37
39
 
38
40
  def content
@@ -70,6 +72,8 @@ class Fixturama::Loader
70
72
  # @param [String] string
71
73
  # @return [Object]
72
74
  def finalize_string(string)
75
+ Marshal.restore(string)
76
+ rescue TypeError, RuntimeError
73
77
  key = string.match(Value::MATCHER)&.captures&.first&.to_s
74
78
  key ? context[key] : string
75
79
  end
@@ -1,8 +1,13 @@
1
1
  class Fixturama::Loader
2
2
  #
3
- # The context of some fixture
3
+ # @private
4
+ # The context bound to some fixture
4
5
  #
5
6
  class Context
7
+ def object(value)
8
+ Marshal.dump(value).dump
9
+ end
10
+
6
11
  # Get value by key
7
12
  # @param [#to_s] key
8
13
  # @return [Object]
@@ -12,7 +17,8 @@ class Fixturama::Loader
12
17
 
13
18
  private
14
19
 
15
- def initialize(values)
20
+ def initialize(example, values)
21
+ @example = example
16
22
  @values = \
17
23
  Hash(values).each_with_object(Hashie::Mash.new) do |(key, val), obj|
18
24
  obj[key] = Value.new(key, val)
@@ -20,11 +26,14 @@ class Fixturama::Loader
20
26
  end
21
27
 
22
28
  def respond_to_missing?(name, *)
23
- @values.respond_to?(name) || super
29
+ @values.key?(name) || @example.respond_to?(name) || super
24
30
  end
25
31
 
26
- def method_missing(name, *args)
27
- @values.respond_to?(name) ? @values.send(name, *args) : super
32
+ def method_missing(name, *args, &block)
33
+ return @values[name] if @values.key?(name)
34
+ return super unless @example.respond_to?(name)
35
+
36
+ @example.send(name, *args, &block)
28
37
  end
29
38
  end
30
39
  end
@@ -1,5 +1,6 @@
1
1
  class Fixturama::Loader
2
2
  #
3
+ # @private
3
4
  # Wraps a value with a reference to its key
4
5
  # in the [Fixturama::Loader::Context]
5
6
  #
@@ -0,0 +1,4 @@
1
+ module Fixturama
2
+ # The current version of the gem
3
+ VERSION = "0.5.0"
4
+ end
metadata CHANGED
@@ -1,114 +1,138 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fixturama
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kozin (nepalez)
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-09 00:00:00.000000000 Z
11
+ date: 2021-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ name: factory_bot
14
15
  requirement: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - "~>"
17
18
  - !ruby/object:Gem::Version
18
19
  version: '4.0'
19
- name: factory_bot
20
- prerelease: false
21
20
  type: :runtime
21
+ prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.0'
27
27
  - !ruby/object:Gem::Dependency
28
+ name: rspec
28
29
  requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - "~>"
31
32
  - !ruby/object:Gem::Version
32
33
  version: '3.0'
33
- name: rspec
34
- prerelease: false
35
34
  type: :runtime
35
+ prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.0'
41
41
  - !ruby/object:Gem::Dependency
42
+ name: hashie
42
43
  requirement: !ruby/object:Gem::Requirement
43
44
  requirements:
44
- - - "~>"
45
+ - - ">"
45
46
  - !ruby/object:Gem::Version
46
- version: '3.0'
47
- name: hashie
48
- prerelease: false
47
+ version: '3'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '5'
49
51
  type: :runtime
52
+ prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
51
54
  requirements:
52
- - - "~>"
55
+ - - ">"
53
56
  - !ruby/object:Gem::Version
54
- version: '3.0'
57
+ version: '3'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '5'
55
61
  - !ruby/object:Gem::Dependency
62
+ name: webmock
56
63
  requirement: !ruby/object:Gem::Requirement
57
64
  requirements:
58
65
  - - "~>"
59
66
  - !ruby/object:Gem::Version
60
67
  version: '3.0'
61
- name: webmock
62
- prerelease: false
63
68
  type: :runtime
69
+ prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
72
  - - "~>"
67
73
  - !ruby/object:Gem::Version
68
74
  version: '3.0'
69
75
  - !ruby/object:Gem::Dependency
76
+ name: rake
70
77
  requirement: !ruby/object:Gem::Requirement
71
78
  requirements:
72
79
  - - "~>"
73
80
  - !ruby/object:Gem::Version
74
- version: '10'
75
- name: rake
76
- prerelease: false
81
+ version: '13.0'
77
82
  type: :development
83
+ prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
86
  - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: '10'
88
+ version: '13.0'
83
89
  - !ruby/object:Gem::Dependency
90
+ name: rspec-its
84
91
  requirement: !ruby/object:Gem::Requirement
85
92
  requirements:
86
93
  - - "~>"
87
94
  - !ruby/object:Gem::Version
88
- version: '1.0'
89
- name: rspec-its
90
- prerelease: false
95
+ version: '1.3'
91
96
  type: :development
97
+ prerelease: false
92
98
  version_requirements: !ruby/object:Gem::Requirement
93
99
  requirements:
94
100
  - - "~>"
95
101
  - !ruby/object:Gem::Version
96
- version: '1.0'
102
+ version: '1.3'
97
103
  - !ruby/object:Gem::Dependency
104
+ name: rubocop
98
105
  requirement: !ruby/object:Gem::Requirement
99
106
  requirements:
100
107
  - - "~>"
101
108
  - !ruby/object:Gem::Version
102
- version: '0.49'
103
- name: rubocop
104
- prerelease: false
109
+ version: '0.80'
105
110
  type: :development
111
+ prerelease: false
106
112
  version_requirements: !ruby/object:Gem::Requirement
107
113
  requirements:
108
114
  - - "~>"
109
115
  - !ruby/object:Gem::Version
110
- version: '0.49'
111
- description:
116
+ version: '0.80'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rubocop-packaging
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ description: |
132
+ Use fixtures to extract verbosity from RSpec specifications:
133
+ - load data,
134
+ - stub classes, modules and constants,
135
+ - seed the database via FactoryBot.
112
136
  email: andrew.kozin@gmail.com
113
137
  executables: []
114
138
  extensions: []
@@ -116,49 +140,47 @@ extra_rdoc_files:
116
140
  - README.md
117
141
  - CHANGELOG.md
118
142
  files:
119
- - ".gitignore"
120
- - ".rspec"
121
- - ".rubocop.yml"
122
- - ".travis.yml"
123
143
  - CHANGELOG.md
124
- - Gemfile
125
- - LICENSE.txt
126
144
  - README.md
127
- - Rakefile
128
- - fixturama.gemspec
129
145
  - lib/fixturama.rb
146
+ - lib/fixturama/changes.rb
147
+ - lib/fixturama/changes/base.rb
148
+ - lib/fixturama/changes/chain.rb
149
+ - lib/fixturama/changes/chain/actions.rb
150
+ - lib/fixturama/changes/chain/arguments.rb
151
+ - lib/fixturama/changes/chain/raise_action.rb
152
+ - lib/fixturama/changes/chain/return_action.rb
153
+ - lib/fixturama/changes/const.rb
154
+ - lib/fixturama/changes/env.rb
155
+ - lib/fixturama/changes/request.rb
156
+ - lib/fixturama/changes/request/response.rb
157
+ - lib/fixturama/changes/request/responses.rb
158
+ - lib/fixturama/changes/seed.rb
130
159
  - lib/fixturama/config.rb
160
+ - lib/fixturama/fixture_error.rb
131
161
  - lib/fixturama/loader.rb
132
162
  - lib/fixturama/loader/context.rb
133
163
  - lib/fixturama/loader/value.rb
134
164
  - lib/fixturama/rspec.rb
135
- - lib/fixturama/seed.rb
136
- - lib/fixturama/stubs.rb
137
- - lib/fixturama/stubs/chain.rb
138
- - lib/fixturama/stubs/chain/actions.rb
139
- - lib/fixturama/stubs/chain/actions/raise.rb
140
- - lib/fixturama/stubs/chain/actions/return.rb
141
- - lib/fixturama/stubs/chain/arguments.rb
142
- - lib/fixturama/stubs/const.rb
143
- - lib/fixturama/stubs/request.rb
144
- - lib/fixturama/stubs/request/response.rb
145
- - lib/fixturama/stubs/request/responses.rb
146
- - lib/fixturama/utils.rb
147
- - spec/fixturama/load_fixture/_spec.rb
148
- - spec/fixturama/load_fixture/data.json
149
- - spec/fixturama/load_fixture/data.yaml
150
- - spec/fixturama/load_fixture/data.yml
151
- - spec/fixturama/seed_fixture/_spec.rb
152
- - spec/fixturama/seed_fixture/seed.yml
153
- - spec/fixturama/stub_fixture/_spec.rb
154
- - spec/fixturama/stub_fixture/stub.yml
155
- - spec/spec_helper.rb
165
+ - lib/fixturama/version.rb
156
166
  homepage: https://github.com/nepalez/fixturama
157
167
  licenses:
158
168
  - MIT
159
- metadata: {}
160
- post_install_message:
161
- rdoc_options: []
169
+ metadata:
170
+ bug_tracker_uri: https://github.com/nepalez/fixturama/issues
171
+ changelog_uri: https://github.com/nepalez/fixturama/blob/master/CHANGELOG.md
172
+ documentation_uri: https://www.rubydocs.info/gems/fixturama
173
+ homepage_uri: https://github.com/nepalez/fixturama
174
+ source_code_uri: https://github.com/nepalez/fixturama
175
+ post_install_message:
176
+ rdoc_options:
177
+ - "--title"
178
+ - Fixturama - fixtures on steroids
179
+ - "--main"
180
+ - README.md
181
+ - "--line-numbers"
182
+ - "--inline-source"
183
+ - "--quiet"
162
184
  require_paths:
163
185
  - lib
164
186
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -172,18 +194,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
172
194
  - !ruby/object:Gem::Version
173
195
  version: '0'
174
196
  requirements: []
175
- rubyforge_project:
176
- rubygems_version: 2.7.6
177
- signing_key:
197
+ rubygems_version: 3.0.8
198
+ signing_key:
178
199
  specification_version: 4
179
200
  summary: A set of helpers to prettify specs with fixtures
180
- test_files:
181
- - spec/fixturama/load_fixture/_spec.rb
182
- - spec/fixturama/load_fixture/data.json
183
- - spec/fixturama/load_fixture/data.yaml
184
- - spec/fixturama/load_fixture/data.yml
185
- - spec/fixturama/seed_fixture/_spec.rb
186
- - spec/fixturama/seed_fixture/seed.yml
187
- - spec/fixturama/stub_fixture/_spec.rb
188
- - spec/fixturama/stub_fixture/stub.yml
189
- - spec/spec_helper.rb
201
+ test_files: []