civil 1.1.0 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1bbae03b7c5bb563b1b6e728fefd604be43ba5fe
4
- data.tar.gz: 6d2fe1f7674b416b0d4341dcd06c9e2b1ee96215
3
+ metadata.gz: 8390c4a979faf2430eade2b066f488d1f4513a20
4
+ data.tar.gz: ac8dbd887ea9a374235673365b8684a6b9ad087e
5
5
  SHA512:
6
- metadata.gz: 53b669f68cbc9a2fb46d55b30f35e188ffbc9837efa5ce15491bdd527f8b9aa2e06193bf21e8b802fee68e6ea3a10f4b2eb1100d1d04dde60e4a6153d3c0c6dc
7
- data.tar.gz: 79ab0143ea4e81584384503ad57024dfd3707b3acc96f720ff682042960928cb69f04021af8946ef50a664d9aef9c190719f711e269bf40ce5d7af1b90ed686f
6
+ metadata.gz: 9346f18a5657d97e9c5f954548e75875dc7ee1bab62462024aaca32d03c0bd93624d8b7156415f0f26382e5b6a413b0956607866df81ba0531a82cc5170e8bc7
7
+ data.tar.gz: 3545447288f314cad524427a52d1ab3c0e93bb7aa179c9e68d6968a681c9f3d6c476650db7c2faed530971f056b8e470cadb827d87ec05b838ba2580e2a1b4df
@@ -6,6 +6,19 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [2.0.0] - 2016-12-13
10
+ ### Added
11
+ - `Civil::Hash` and `Civil::Set` utility classes created to enable filtering.
12
+ - `Civil::Set#where` allows filtering result conditions and meta based on
13
+ hashes (e.g., `result.conditions[:foo].where(id: 3)`).
14
+ ### Changed
15
+ - Result conditions and meta are now instances of `Civil::Hash`, whose values
16
+ can contain instances of `Civil::Set`. This change allows you to filter results
17
+ and will allow for other neat tricks in the future.
18
+ - Any time a hash is passed to `add_condition` or `add_meta`, it is
19
+ automatically converted to and stored as a `Civil::Hash` instance to enable
20
+ filtering to work.
21
+
9
22
  ## [1.1.0] - 2016-12-2
10
23
  ### Added
11
24
  - You can now run services by passing in blocks to `call`. The service will
@@ -38,5 +51,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
38
51
  - Documentation and examples in README.md
39
52
  - This changelog :-)
40
53
 
41
- [Unreleased]: https://github.com/earksiinni/civil/compare/v1.0.0...HEAD
54
+ [Unreleased]: https://github.com/earksiinni/civil/compare/v2.0.0...HEAD
55
+ [1.2.0]: https://github.com/earksiinni/civil/compare/v1.1.0...v2.0.0
56
+ [1.1.0]: https://github.com/earksiinni/civil/compare/v1.0.0...v1.1.0
42
57
  [1.0.0]: https://github.com/earksiinni/civil/compare/v0.1.0...v1.0.0
data/README.md CHANGED
@@ -106,7 +106,7 @@ end
106
106
 
107
107
  result = MetadataExample.call doodad: doodad
108
108
 
109
- result.meta # { length: 12.5 }
109
+ result.meta # { length: {12.5} }
110
110
  ```
111
111
 
112
112
  ### Overriding the service block
@@ -129,6 +129,33 @@ end
129
129
  result = MyService.call { step_one; result; }
130
130
  ```
131
131
 
132
+ ### Filtering
133
+
134
+ Filter metadata and results by using `where`:
135
+
136
+ ```ruby
137
+ class BuildCars
138
+ ...
139
+
140
+ def trigger_some_conditions_and_metadata
141
+ if make == 'Wondercar'
142
+ add_condition :cars, { make: 'Wondercar', msg: 'no such make' }
143
+ add_condition :cars, { make: 'Wondercar', msg: 'not a thing' }
144
+ add_meta :cars, { make: 'Wondercar', msg: 'pretty cool name, though' }
145
+ end
146
+ end
147
+ end
148
+
149
+ result = BuildCars.call(makes: ['Wondercar', 'Lamecar', 'Hamilcar'])
150
+
151
+ result.conditions[:cars].where(make: 'Wondercar') # {{ make: 'Wondercar', msg: 'no such make'}, { make: 'Wondercar', msg: 'not a thing'}}
152
+ result.conditions[:cars].where(make: 'Wondercar', msg: 'not a thing') # {{ make: 'Wondercar', msg: 'not a thing'}}
153
+ result.meta[:cars].where(make: 'Wondercar') # {{ make: 'Wondercar', msg: 'pretty cool name, though' }}
154
+ ```
155
+
156
+ For filtering to work properly, you must pass a hash or an instance of
157
+ `Civil::Hash` to `add_condition`/`add_meta`.
158
+
132
159
  ## Development
133
160
 
134
161
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -143,4 +170,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/earksi
143
170
  ## License
144
171
 
145
172
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
146
-
@@ -1,3 +1,5 @@
1
1
  require "civil/version"
2
2
  require "civil/service"
3
3
  require "civil/result"
4
+ require "civil/hash"
5
+ require "civil/set"
@@ -0,0 +1,11 @@
1
+ module Civil
2
+ class Hash < ::Hash
3
+ def =~(attrs)
4
+ attrs.each do |k, v|
5
+ keys.include?(k) && self[k] == v or return false
6
+ end
7
+
8
+ return true
9
+ end
10
+ end
11
+ end
@@ -2,7 +2,7 @@ module Civil
2
2
  class Result
3
3
  attr_reader :data, :conditions, :meta
4
4
 
5
- def initialize(data, conditions = {}, meta = {})
5
+ def initialize(data, conditions = Civil::Hash.new, meta = Civil::Hash.new)
6
6
  @data = data
7
7
  @conditions = conditions
8
8
  @meta = meta
@@ -18,7 +18,7 @@ module Civil
18
18
  # Initiate service execution and return standardized result
19
19
  #
20
20
  # result = MyService.call(foo: 1, bar: 'a')
21
- #
21
+ #
22
22
  # if result.ideal?
23
23
  # ...
24
24
  # else
@@ -40,25 +40,23 @@ module Civil
40
40
  end
41
41
 
42
42
  def add_condition(key, condition)
43
- conditions = (_conditions[key.to_sym] ||= [])
43
+ conditions = (_conditions[key.to_sym] ||= Civil::Set.new)
44
44
 
45
45
  conditions << condition
46
- conditions.compact!
47
46
  end
48
47
 
49
48
  def add_meta(key, metadatum)
50
- meta = (_meta[key.to_sym] ||= [])
49
+ meta = (_meta[key.to_sym] ||= Civil::Set.new)
51
50
 
52
51
  meta << metadatum
53
- meta.compact!
54
52
  end
55
53
 
56
54
  def _conditions
57
- @_conditions ||= {}
55
+ @_conditions ||= Civil::Hash.new
58
56
  end
59
57
 
60
58
  def _meta
61
- @_meta ||= {}
59
+ @_meta ||= Civil::Hash.new
62
60
  end
63
61
  end
64
62
  end
@@ -0,0 +1,27 @@
1
+ module Civil
2
+ class Set < ::Set
3
+ def initialize(enum = nil)
4
+ enum = enum.map { |e| e.is_a?(::Hash) ? Civil::Hash.new.merge(e) : e } if enum
5
+
6
+ super
7
+ end
8
+
9
+ def add(o)
10
+ o and o.is_a?(::Hash) and o = Civil::Hash.new.merge(o)
11
+
12
+ super
13
+ end
14
+
15
+ def <<(o)
16
+ add(o)
17
+ end
18
+
19
+ def where(attrs)
20
+ self.inject(Civil::Set.new) { |set, item|
21
+ item.is_a?(Civil::Hash) and item =~ attrs and set.add(item)
22
+
23
+ set
24
+ }
25
+ end
26
+ end
27
+ end
@@ -1,3 +1,3 @@
1
1
  module Civil
2
- VERSION = "1.1.0"
2
+ VERSION = "2.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: civil
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ersin Akinci
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-03 00:00:00.000000000 Z
11
+ date: 2016-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -90,8 +90,10 @@ files:
90
90
  - bin/setup
91
91
  - civil.gemspec
92
92
  - lib/civil.rb
93
+ - lib/civil/hash.rb
93
94
  - lib/civil/result.rb
94
95
  - lib/civil/service.rb
96
+ - lib/civil/set.rb
95
97
  - lib/civil/version.rb
96
98
  homepage: https://github.com/earksiinni/civil
97
99
  licenses: