fixturama 0.4.1 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +24 -0
- data/README.md +32 -0
- data/lib/fixturama.rb +1 -1
- data/lib/fixturama/changes/base.rb +1 -1
- data/lib/fixturama/changes/chain.rb +1 -1
- data/lib/fixturama/loader.rb +5 -2
- data/lib/fixturama/loader/context.rb +13 -5
- data/lib/fixturama/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e21218a92d62cab4b0bbc73fe1f2ac02eb5c66a7315357a68189067d138d92a
|
4
|
+
data.tar.gz: 81861ef1dbf1eba81874fb929875c89f04dc3ebdeba9694ae02989762dd7aca5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f09063278691d752987cc1b9bbc8d20a715624cce81f81e9c61b521d52af28b9fbe03e09ac9357e01c154b987608558231b3c0ca8d1bdd5677303f887630b3ad
|
7
|
+
data.tar.gz: b93be44d444875df3d793bb7947bbd9c906a0fcc699c3b1ec4625186a38eed3b58b8a11f11d6e7ae421db4615534533029c2fece7d592a357649ef24598e63a9
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,29 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
6
6
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
7
7
|
|
8
|
+
## [0.5.0] - [2021-04-03]
|
9
|
+
|
10
|
+
### Added
|
11
|
+
|
12
|
+
- Support for <de>serialization PORO objects (nepalez)
|
13
|
+
|
14
|
+
```yaml
|
15
|
+
# target.yml
|
16
|
+
---
|
17
|
+
number: <%= object(be_positive) %>
|
18
|
+
```
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
RSpec.describe "something" do
|
22
|
+
subject { { "number" => 42 } }
|
23
|
+
|
24
|
+
# no explicit params is needed here
|
25
|
+
let(:target) { load_fixture "target.yml" }
|
26
|
+
|
27
|
+
it { is_expected.to match(target) }
|
28
|
+
end
|
29
|
+
```
|
30
|
+
|
8
31
|
## [0.4.1] - [2021-03-31]
|
9
32
|
|
10
33
|
### Fixed
|
@@ -275,3 +298,4 @@ This is a first public release with features extracted from production app.
|
|
275
298
|
[0.3.0]: https://github.com/nepalez/fixturama/compare/v0.2.0...v0.3.0
|
276
299
|
[0.4.0]: https://github.com/nepalez/fixturama/compare/v0.3.0...v0.4.0
|
277
300
|
[0.4.1]: https://github.com/nepalez/fixturama/compare/v0.4.0...v0.4.1
|
301
|
+
[0.5.0]: https://github.com/nepalez/fixturama/compare/v0.4.1...v0.5.0
|
data/README.md
CHANGED
@@ -99,6 +99,38 @@ This feature can also be useful to produce a "partially defined" fixtures with [
|
|
99
99
|
subject { load_fixture "#{__dir__}/data.yml", user: kind_of(ActiveRecord::Base) }
|
100
100
|
```
|
101
101
|
|
102
|
+
Since the v0.5.0 we support another way to serialize PORO objects in fixtures. Just wrap them to the `object()` method:
|
103
|
+
|
104
|
+
```yaml
|
105
|
+
---
|
106
|
+
:account: <%= object(user) %>
|
107
|
+
```
|
108
|
+
|
109
|
+
This time you don't need sending objects explicitly.
|
110
|
+
|
111
|
+
```ruby
|
112
|
+
RSpec.describe "example" do
|
113
|
+
subject { load_fixture "#{__dir__}/data.yml" }
|
114
|
+
|
115
|
+
let(:user) { FactoryBot.create(:user) }
|
116
|
+
|
117
|
+
# The same object will be returned
|
118
|
+
it { is_expected.to eq(account: user) }
|
119
|
+
end
|
120
|
+
```
|
121
|
+
|
122
|
+
Under the hood we use `Marshal.dump` and `Marshal.restore` to serialize and deserialize the object back.
|
123
|
+
|
124
|
+
**Notice**, that deserialization creates a new instance of the object which is not equivalent to the source (`user` in the example above)!
|
125
|
+
In most cases this is enough. For example, you can provide matchers like:
|
126
|
+
|
127
|
+
```yaml
|
128
|
+
---
|
129
|
+
number: <%= object(be_positive) %>
|
130
|
+
```
|
131
|
+
|
132
|
+
The loaded object would contain `{ "number" => be_positive }`.
|
133
|
+
|
102
134
|
### Seeding
|
103
135
|
|
104
136
|
The seed (`seed_fixture`) file should be a YAML/JSON with opinionated parameters, namely:
|
data/lib/fixturama.rb
CHANGED
@@ -14,7 +14,7 @@ class Fixturama::Changes
|
|
14
14
|
# @return [Fixturama::Changes::Base]
|
15
15
|
def merge(other)
|
16
16
|
# By default just take the other change if applicable
|
17
|
-
other.
|
17
|
+
other.instance_of?(self.class) && other.key == key ? other : self
|
18
18
|
end
|
19
19
|
|
20
20
|
# @abstract
|
@@ -14,7 +14,7 @@ class Fixturama::Changes
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def merge(other)
|
17
|
-
return self unless other.
|
17
|
+
return self unless other.instance_of?(self.class) && other.key == key
|
18
18
|
|
19
19
|
tap { @arguments = (other.arguments | arguments).sort_by(&:order) }
|
20
20
|
end
|
data/lib/fixturama/loader.rb
CHANGED
@@ -15,7 +15,8 @@ class Fixturama::Loader
|
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
-
def initialize(path, opts = {})
|
18
|
+
def initialize(example, path, opts = {})
|
19
|
+
@example = example
|
19
20
|
@path = path
|
20
21
|
@opts = opts.to_h
|
21
22
|
end
|
@@ -33,7 +34,7 @@ class Fixturama::Loader
|
|
33
34
|
end
|
34
35
|
|
35
36
|
def context
|
36
|
-
@context ||=
|
37
|
+
@context ||= Context.new(@example, @opts)
|
37
38
|
end
|
38
39
|
|
39
40
|
def content
|
@@ -71,6 +72,8 @@ class Fixturama::Loader
|
|
71
72
|
# @param [String] string
|
72
73
|
# @return [Object]
|
73
74
|
def finalize_string(string)
|
75
|
+
Marshal.restore(string)
|
76
|
+
rescue TypeError, RuntimeError
|
74
77
|
key = string.match(Value::MATCHER)&.captures&.first&.to_s
|
75
78
|
key ? context[key] : string
|
76
79
|
end
|
@@ -1,9 +1,13 @@
|
|
1
1
|
class Fixturama::Loader
|
2
2
|
#
|
3
3
|
# @private
|
4
|
-
# The context
|
4
|
+
# The context bound to some fixture
|
5
5
|
#
|
6
6
|
class Context
|
7
|
+
def object(value)
|
8
|
+
Marshal.dump(value).dump
|
9
|
+
end
|
10
|
+
|
7
11
|
# Get value by key
|
8
12
|
# @param [#to_s] key
|
9
13
|
# @return [Object]
|
@@ -13,7 +17,8 @@ class Fixturama::Loader
|
|
13
17
|
|
14
18
|
private
|
15
19
|
|
16
|
-
def initialize(values)
|
20
|
+
def initialize(example, values)
|
21
|
+
@example = example
|
17
22
|
@values = \
|
18
23
|
Hash(values).each_with_object(Hashie::Mash.new) do |(key, val), obj|
|
19
24
|
obj[key] = Value.new(key, val)
|
@@ -21,11 +26,14 @@ class Fixturama::Loader
|
|
21
26
|
end
|
22
27
|
|
23
28
|
def respond_to_missing?(name, *)
|
24
|
-
@values.respond_to?(name) || super
|
29
|
+
@values.key?(name) || @example.respond_to?(name) || super
|
25
30
|
end
|
26
31
|
|
27
|
-
def method_missing(name, *args)
|
28
|
-
@values
|
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)
|
29
37
|
end
|
30
38
|
end
|
31
39
|
end
|
data/lib/fixturama/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fixturama
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kozin (nepalez)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03
|
11
|
+
date: 2021-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: factory_bot
|