fixturama 0.1.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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: []