ocg 1.1.1 → 1.2.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
  SHA256:
3
- metadata.gz: e83ab5f4d11bb896232eec11899760bad56e796defdd58cdb85c924bdd76b1f7
4
- data.tar.gz: 589806f0286556ef6f821e6f75041bf4b08732f09d6428f7fb1c36f8f47234c0
3
+ metadata.gz: 52b0c6aa85ed30a2ae8c65d872e90136d223822fc8d970c26c6515f56ee84b98
4
+ data.tar.gz: 248d46514c8fba336fef0347f5d21d40752651cfc4b3846110e69480f8da02a2
5
5
  SHA512:
6
- metadata.gz: cc0a06788380a7c01e893456f9878ac753c557f4b378ea5b77399010fd3e132056cc39fce6a9b18f647e04c0f621b6b43bd3686ddf8bd623badf59008b8eed8c
7
- data.tar.gz: bac8c658e3682d2ddf4d18ed7aaa7a175c23065fc63f4871d582150f9f4c48964c749b4b6b1531a923929a361443a6b66100ff37234e80159b164d875a2774ce
6
+ metadata.gz: 15fb346aa655fe3cf505439073ccdd8156c1b341b5ddd38ef4ce7a7e89e4982f2c5ebad4e43ebe3bde8172bd2c46776d9a154db37b2acab94bdcd088df5afb69
7
+ data.tar.gz: 4ff7e04a1684f0c073f0366360d1145e0bdaf9323a6d03ff2c828756bf88c53ecf7eae79b2055f3ccce5605c558b09d6804202d1cdc29d1d069e8b1adc0199f2
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Option combination generator
2
2
 
3
- | Travis | AppVeyor | Cirrus | Circle |
4
- | :---: | :---: | :---: | :---: |
5
- | [![Travis test status](https://travis-ci.com/andrew-aladev/ocg.svg?branch=master)](https://travis-ci.com/andrew-aladev/ocg) | [![AppVeyor test status](https://ci.appveyor.com/api/projects/status/github/andrew-aladev/ocg?branch=master&svg=true)](https://ci.appveyor.com/project/andrew-aladev/ocg/branch/master) | [![Cirrus test status](https://api.cirrus-ci.com/github/andrew-aladev/ocg.svg?branch=master)](https://cirrus-ci.com/github/andrew-aladev/ocg) | [![Circle test status](https://circleci.com/gh/andrew-aladev/ocg/tree/master.svg?style=shield)](https://circleci.com/gh/andrew-aladev/ocg/tree/master) |
3
+ | Travis | AppVeyor | Circle | Codecov | Gem |
4
+ | :---: | :---: | :---: | :---: | :---: |
5
+ | [![Travis test status](https://travis-ci.com/andrew-aladev/ocg.svg?branch=master)](https://travis-ci.com/andrew-aladev/ocg) | [![AppVeyor test status](https://ci.appveyor.com/api/projects/status/github/andrew-aladev/ocg?branch=master&svg=true)](https://ci.appveyor.com/project/andrew-aladev/ocg/branch/master) | [![Circle test status](https://circleci.com/gh/andrew-aladev/ocg/tree/master.svg?style=shield)](https://circleci.com/gh/andrew-aladev/ocg/tree/master) | [![Codecov](https://codecov.io/gh/andrew-aladev/ocg/branch/master/graph/badge.svg)](https://codecov.io/gh/andrew-aladev/ocg) | [![Gem](https://img.shields.io/gem/v/ocg.svg)](https://rubygems.org/gems/ocg) |
6
6
 
7
7
  ## Installation
8
8
 
@@ -17,6 +17,8 @@ rake gem
17
17
  gem install pkg/ocg-*.gem
18
18
  ```
19
19
 
20
+ You can also use [overlay](https://github.com/andrew-aladev/overlay) for gentoo.
21
+
20
22
  ## Usage
21
23
 
22
24
  ```ruby
@@ -39,13 +41,31 @@ generator = OCG.new(
39
41
  :h => 7..8
40
42
  )
41
43
 
42
- puts generator.next until generator.finished?
44
+ generator.each { |combination| puts combination }
43
45
  ```
44
46
 
45
47
  It will populate all option combinations.
46
48
 
47
49
  ## Docs
48
50
 
51
+ `OCG.new options` will prepare a generator.
52
+ It will provide all possible option combinations.
53
+
54
+ | Method | Description |
55
+ |-------------|-------------|
56
+ | `and` | provides all combinations between generators |
57
+ | `mix` | merges combinations without combining, guarantees that both left and right generator combinations will be provided at least once |
58
+ | `or` | concats generator combinations without merging |
59
+ | `reset` | allows to receive combinations once again |
60
+ | `next` | returns next combination |
61
+ | `last` | returns last combination |
62
+ | `started?` | returns true when at least one combination was generated |
63
+ | `finished?` | returns true when all combination were generated |
64
+ | `length` | returns combinations length |
65
+
66
+ Generator is responsible to any method from [`Enumerable`](https://ruby-doc.org/core-2.7.2/Enumerable.html).
67
+ You can combine generators using `and`, `mix` and `or`.
68
+
49
69
  Options should be prepared in the following form:
50
70
 
51
71
  ```ruby
@@ -60,29 +80,6 @@ Options hash should not be empty.
60
80
  `option_values` should be convertable to array using `to_a`.
61
81
  `option_values` should not be empty.
62
82
 
63
- `OCG.new options` will prepare a generator.
64
- It will provide all possible option combinations.
65
-
66
- You can combine generators using `and`, `mix` and `or`.
67
-
68
- `and` method will provide all combinations between generators.
69
- `mix` method will merge combinations without combining. `mix` guarantees that both left and right generator combinations will be provided at least once.
70
- `or` method will concat generator combinations without merging.
71
-
72
- `reset` method allows to receive combinations once again.
73
-
74
- `next` method returns next combination.
75
-
76
- `last` method returns last combination.
77
-
78
- `started?` method returns true when at least one combination was generated.
79
-
80
- `finished?` method returns true when all combination were generated.
81
-
82
- `length` returns combinations length.
83
-
84
- `to_a` returns combinations array.
85
-
86
83
  ## Why?
87
84
 
88
85
  Many software uses multiple options and have complex relations between them.
@@ -159,10 +156,10 @@ complete_generator = almost_complete_generator.mix(
159
156
 
160
157
  ## CI
161
158
 
162
- Travis and Appveyor CI uses [scripts/toolchains.sh](scripts/toolchains.sh) directly.
163
- Cirrus and Circle CI uses prebuilt [scripts/test-images](scripts/test-images).
164
- Cirrus CI uses amd64 image, Circle CI - i686.
159
+ Please visit [scripts/test-images](scripts/test-images).
160
+ See universal test script [scripts/ci_test.sh](scripts/ci_test.sh) for CI.
161
+ You can run this script using many native and cross images.
165
162
 
166
163
  ## License
167
164
 
168
- MIT license, see LICENSE and AUTHORS.
165
+ MIT license, see [LICENSE](LICENSE) and [AUTHORS](AUTHORS).
@@ -7,6 +7,7 @@ require_relative "error"
7
7
  require_relative "options"
8
8
 
9
9
  class OCG
10
+ include ::Enumerable
10
11
  extend ::Forwardable
11
12
 
12
13
  DELEGATORS = %i[reset next last started? finished? length].freeze
@@ -35,15 +36,14 @@ class OCG
35
36
  Operator::OR.new self, generator_or_options
36
37
  end
37
38
 
38
- def to_a
39
+ def each(&_block)
39
40
  reset
40
41
 
41
- result = []
42
- result << send("next") until finished?
42
+ yield send("next") until finished?
43
43
 
44
44
  reset
45
45
 
46
- result
46
+ nil
47
47
  end
48
48
  end
49
49
 
@@ -6,7 +6,7 @@ require_relative "../error"
6
6
  class OCG
7
7
  module Operator
8
8
  class Abstract < OCG
9
- def initialize(left_generator_or_options, right_generator_or_options)
9
+ def initialize(left_generator_or_options, right_generator_or_options) # rubocop:disable Lint/MissingSuper
10
10
  @left_generator = OCG.prepare_generator left_generator_or_options
11
11
  @right_generator = OCG.prepare_generator right_generator_or_options
12
12
 
@@ -20,6 +20,7 @@ class OCG
20
20
  nil
21
21
  end
22
22
 
23
+ # :nocov:
23
24
  def next
24
25
  raise NotImplementedError, "\"next\" is not implemented"
25
26
  end
@@ -39,6 +40,7 @@ class OCG
39
40
  def length
40
41
  raise NotImplementedError, "\"length\" is not implemented"
41
42
  end
43
+ # :nocov:
42
44
  end
43
45
  end
44
46
  end
@@ -7,7 +7,7 @@ class OCG
7
7
  class Options
8
8
  def initialize(options)
9
9
  Validation.validate_options options
10
- @options = Hash[options.map { |name, values| [name, values.to_a] }]
10
+ @options = options.transform_values(&:to_a)
11
11
 
12
12
  # End to start is more traditional way of making combinations.
13
13
  @keys = @options.keys.reverse
@@ -20,7 +20,7 @@ class OCG
20
20
  end
21
21
 
22
22
  protected def reset_value_indexes
23
- @value_indexes = Hash[@options.map { |name, _values| [name, 0] }]
23
+ @value_indexes = @options.transform_values { |_values| 0 }
24
24
  end
25
25
 
26
26
  def reset
@@ -2,5 +2,5 @@
2
2
  # Copyright (c) 2019 AUTHORS, MIT License.
3
3
 
4
4
  class OCG
5
- VERSION = "1.1.1".freeze
5
+ VERSION = "1.2.0".freeze
6
6
  end
metadata CHANGED
@@ -1,71 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ocg
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Aladjev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-13 00:00:00.000000000 Z
11
+ date: 2020-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: codecov
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: minitest
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '5.12'
33
+ version: '5.14'
20
34
  type: :development
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '5.12'
40
+ version: '5.14'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: rubocop
29
57
  requirement: !ruby/object:Gem::Requirement
30
58
  requirements:
31
59
  - - "~>"
32
60
  - !ruby/object:Gem::Version
33
- version: '0.75'
61
+ version: '0.93'
34
62
  type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
66
  - - "~>"
39
67
  - !ruby/object:Gem::Version
40
- version: '0.75'
68
+ version: '0.93'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: rubocop-performance
43
71
  requirement: !ruby/object:Gem::Requirement
44
72
  requirements:
45
73
  - - "~>"
46
74
  - !ruby/object:Gem::Version
47
- version: '1.5'
75
+ version: '1.8'
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
80
  - - "~>"
53
81
  - !ruby/object:Gem::Version
54
- version: '1.5'
82
+ version: '1.8'
55
83
  - !ruby/object:Gem::Dependency
56
- name: rubocop-rails
84
+ name: simplecov
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
- - - "~>"
87
+ - - ">="
60
88
  - !ruby/object:Gem::Version
61
- version: '2.3'
89
+ version: '0'
62
90
  type: :development
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
- - - "~>"
94
+ - - ">="
67
95
  - !ruby/object:Gem::Version
68
- version: '2.3'
96
+ version: '0'
69
97
  description:
70
98
  email: aladjev.andrew@gmail.com
71
99
  executables: []
@@ -97,14 +125,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
125
  requirements:
98
126
  - - ">="
99
127
  - !ruby/object:Gem::Version
100
- version: '0'
128
+ version: '2.5'
101
129
  required_rubygems_version: !ruby/object:Gem::Requirement
102
130
  requirements:
103
131
  - - ">="
104
132
  - !ruby/object:Gem::Version
105
133
  version: '0'
106
134
  requirements: []
107
- rubygems_version: 3.0.6
135
+ rubygems_version: 3.1.4
108
136
  signing_key:
109
137
  specification_version: 4
110
138
  summary: Option combination generator.