ector-multi 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a20f20adbf811c03f487888057135de8267b17e5484792d7ab5a9096379321d4
4
- data.tar.gz: f3011de86fd858e580b782059ffc5e36399183252a90c11936f8ffbc114b94a1
3
+ metadata.gz: c8e4aa1f612414eaba5439d00789aa46958ed335b12c998fcc9bb9147dfb1b82
4
+ data.tar.gz: 9ae7cca3656321979588be273ae48ee1e08c0a89a2bc97f1abb62fe2497f882b
5
5
  SHA512:
6
- metadata.gz: 3897ed4e2e54db0fbf30a9a5c63a9ab5265c1c7fd2f810893d913ade99e8f8e8207ac58680efe0d4b334b4f7ca780178010cbff770a9c7936f4033466f4f10cb
7
- data.tar.gz: 79472b2e945fe5bb44597a68d042a099cff5019600f066244df1f9d123edad5df2623d181cbdc9bd519bb769cd7e335fb13629246b03a9ba27e3950e6fc85793
6
+ metadata.gz: b52d9f63225f8a9c994b6e69d431fe5f072d19fc3fbb54b92d088bd5ba0bba8c9ee34af054656414ac0c55ed1937a7af4807a5bef9a016b29beb35be38b6ad88
7
+ data.tar.gz: 8803a86bb7224de8a6b2dd5fc26c55b55c8bff89963fedb7d1ff1331b3a925cb030ddcd4fcc4dee320b0ab10b76f3d7ec2eeeecb84112e620bf5079f38bb3638
data/README.md CHANGED
@@ -1,2 +1,103 @@
1
- # multi
2
- `Multi` is an object for grouping multiple DB operations that should be performed in a single database transaction.
1
+ # Ector::Multi
2
+ [![Gem Version](https://badge.fury.io/rb/ector-multi.svg)](http://badge.fury.io/rb/ector-multi)
3
+ [![Build Status](https://travis-ci.org/emancu/ector-multi.svg)](https://travis-ci.org/emancu/ector-multi)
4
+ [![Code Climate](https://codeclimate.com/github/emancu/ector-multi/badges/gpa.svg)](https://codeclimate.com/github/emancu/ector-multi)
5
+ [![RubyGem](https://img.shields.io/gem/dt/ector-multi.svg)](https://rubygems.org/gems/ector-multi)
6
+
7
+ `Ector::Multi` is an object for grouping multiple DB operations that should be performed in a single database transaction.
8
+
9
+ I literally copy the API and idea from [Ecto::Multi](https://hexdocs.pm/ecto/Ecto.Multi.html), so I'm gonna copy the documentation as well.
10
+
11
+ ## Dependencies
12
+
13
+ At this moment, `Ector::Multi` requires `ActiveRecord` as a dependency and relies on it for CRUD operations and transactions.
14
+ Eventually, I would like to be ORM-agnostic and be able to configure different ORMs and remove the hard dependency.
15
+
16
+ ## Getting started
17
+
18
+ `Ector::Multi` is an object for grouping multiple database operations.
19
+
20
+ `Ector::Multi` makes it possible to pack operations that should be performed in a single database transaction and gives a way to introspect the queued operations without actually performing them. Each operation is given a name that is unique and will identify its result in case of success or failure.
21
+
22
+ All operations will be executed in the order they were added.
23
+
24
+ The `Ector::Multi` object should be considered opaque. You can use common ruby techniques to dig into it, but accessing fields or directly modifying them is not advised.
25
+
26
+
27
+ ## Run
28
+
29
+ `Ector::Multi` allows you to run arbitrary functions as part of your transaction via `run`.
30
+ This is especially useful when an operation depends on the value of a previous operation.
31
+ For this reason, the function given as a callback to run will receive all changes performed by the multi so far.
32
+
33
+ The function given to `run` must return _something_ or raise a `Ector::Multi::OperationFailure`. Raising an error will abort any further operations and make the whole multi fail.
34
+
35
+ ## Example
36
+
37
+ Let’s look at an example definition and usage. The use case we’ll be looking into is resetting a password.
38
+ We need to update the account with proper information, log the request and remove all current sessions:
39
+
40
+ ```ruby
41
+ module PasswordManager
42
+ def self.reset(account, params)
43
+ Ector::Multi.new
44
+ .update(:account, account, params)
45
+ .create(:log, Log, account_id: account.id, changed_at: Time.now)
46
+ .destroy_all(:clear_sessions, Session.where(account_id: account.id))
47
+ end
48
+ end
49
+ ```
50
+
51
+ We can later execute it in the integration layer using `#commit`:
52
+
53
+ ```ruby
54
+ result = PasswordManager.reset(account, params).commit
55
+ ```
56
+
57
+ The resulting object, a `Ector::Multi::Result`, will tell you if it succeeded or failed. Also, it is possible to dig into the results of each operation.
58
+
59
+ ## Functions
60
+
61
+ `multi.append(second_mutli)`
62
+
63
+ Appends the second multi to the first one
64
+
65
+ `multi.destroy(name, instance)`
66
+
67
+ Adds a destroy operation to the multi
68
+
69
+ `multi.delete_all(name, queryable)`
70
+
71
+ Adds a destroy_all operation to the multi
72
+
73
+ `multi.error(name, value)`
74
+
75
+ Causes the multi to fail with the given value
76
+
77
+ `multi.create(name, model, attributes, &block = nil)`
78
+
79
+ Adds a create operation to the multi
80
+
81
+ `Ector::Multi.new`
82
+
83
+ Returns an empty Ector::Multi object
84
+
85
+ `multi.prepend(second_multi)`
86
+
87
+ Prepends the second multi to the first one
88
+
89
+ `multi.run(name, &run)`
90
+
91
+ Adds a function to run as part of the multi
92
+
93
+ `multi.to_list`
94
+
95
+ Returns the list of operations stored in multi
96
+
97
+ `multi.update(name, instance, updates, &block = nil)`
98
+
99
+ Adds an update operation to the multi
100
+
101
+ `multi.update_all(name, queryable, updates, &block = nil)`
102
+
103
+ Adds an update_all operation to the multi
@@ -23,6 +23,6 @@ Gem::Specification.new do |s|
23
23
  s.required_ruby_version = '>= 2.2'
24
24
 
25
25
  s.add_dependency 'activerecord', '~> 5.2'
26
- s.add_development_dependency 'protest', '~> 0'
26
+ s.add_development_dependency 'protest', '~> 0.6'
27
27
  s.add_development_dependency 'sqlite3', '~> 0'
28
28
  end
@@ -8,5 +8,5 @@ require_relative 'ector-multi/operations'
8
8
  require_relative 'ector-multi/multi'
9
9
 
10
10
  module Ector
11
- VERSION = '0.0.1'
11
+ VERSION = '0.0.2'
12
12
  end
@@ -32,10 +32,6 @@ module Ector
32
32
  add_operation Operation::Error.new(name, operation_block(value, nil))
33
33
  end
34
34
 
35
- def merge(multi)
36
- raise NotImplemented
37
- end
38
-
39
35
  def prepend(multi)
40
36
  check_operation_uniqueness!(multi.to_list)
41
37
 
@@ -59,7 +55,8 @@ module Ector
59
55
  def commit
60
56
  results = {}
61
57
 
62
- operations.find(&:fail_fast?)&.run(results)
58
+ fail_fast = operations.find(&:fail_fast?)
59
+ fail_fast.run(results) if fail_fast
63
60
 
64
61
  ::ActiveRecord::Base.transaction(joinable: false, requires_new: true) do
65
62
  operations.each do |operation|
@@ -151,13 +151,6 @@ Protest.describe 'Ector::Multi' do
151
151
  end
152
152
  end
153
153
 
154
- context '#merge'
155
-
156
- # test 'returns self' do
157
- # assert_equal @multi, @multi.merge(:dummy, ???)
158
- # end
159
- # end
160
-
161
154
  context '#prepend' do
162
155
  setup do
163
156
  @left_multi = @multi.run(:left) { }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ector-multi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emiliano Mancuso
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-28 00:00:00.000000000 Z
11
+ date: 2018-12-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '0.6'
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: '0'
40
+ version: '0.6'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: sqlite3
43
43
  requirement: !ruby/object:Gem::Requirement