fixturama 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|