casegen 2.0.0 → 3.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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.rubocop.yml +109 -0
  4. data/.ruby-version +1 -1
  5. data/Gemfile +3 -1
  6. data/Gemfile.lock +51 -6
  7. data/README.md +10 -119
  8. data/Rakefile +9 -7
  9. data/bin/casegen +2 -1
  10. data/casegen.gemspec +13 -9
  11. data/doc/bounding_box.rb +37 -0
  12. data/doc/cart.rb +43 -0
  13. data/doc/expect_only.rb +28 -0
  14. data/doc/pricing.rb +50 -0
  15. data/doc/ruby_array.rb +41 -0
  16. data/lib/case_gen/combination.rb +38 -0
  17. data/lib/case_gen/combo_matcher.rb +15 -0
  18. data/lib/case_gen/exclude_rule.rb +50 -0
  19. data/lib/case_gen/expect_rule.rb +24 -0
  20. data/lib/case_gen/generator.rb +40 -0
  21. data/lib/case_gen/output/exclude.rb +6 -0
  22. data/lib/case_gen/output/exclude_as_table.rb +13 -0
  23. data/lib/case_gen/output/exclude_as_text.rb +12 -0
  24. data/lib/case_gen/output/exclude_inline.rb +13 -0
  25. data/lib/case_gen/output/exclude_inline_footnotes.rb +20 -0
  26. data/lib/case_gen/output.rb +66 -0
  27. data/lib/case_gen/rule_description.rb +11 -0
  28. data/lib/case_gen/set.rb +16 -0
  29. data/lib/casegen.rb +15 -183
  30. data/spec/cart_sample_spec.rb +46 -0
  31. data/spec/case_gen/combination_spec.rb +11 -0
  32. data/spec/case_gen/exclude_rule_spec.rb +17 -0
  33. data/spec/exclude_as_table_spec.rb +39 -0
  34. data/spec/exclude_as_text_spec.rb +58 -0
  35. data/spec/exclude_inline_footnotes_spec.rb +58 -0
  36. data/spec/exclude_inline_spec.rb +50 -0
  37. data/spec/expect_only_spec.rb +30 -0
  38. data/spec/spec_helper.rb +113 -0
  39. metadata +101 -35
  40. data/.idea/encodings.xml +0 -5
  41. data/.idea/misc.xml +0 -5
  42. data/.idea/modules.xml +0 -9
  43. data/.idea/vcs.xml +0 -7
  44. data/doc/calc.sample.txt +0 -13
  45. data/doc/cart.sample.rb +0 -3
  46. data/doc/cart.sample.txt +0 -33
  47. data/doc/ruby_array.sample.rb +0 -26
  48. data/lib/agents/sets/enum/by.rb +0 -244
  49. data/lib/agents/sets/enum/cluster.rb +0 -164
  50. data/lib/agents/sets/enum/inject.rb +0 -50
  51. data/lib/agents/sets/enum/nest.rb +0 -117
  52. data/lib/agents/sets/enum/op.rb +0 -283
  53. data/lib/agents/sets/enum/pipe.rb +0 -160
  54. data/lib/agents/sets/enum/tree.rb +0 -442
  55. data/lib/agents/sets.rb +0 -313
  56. data/test/agents/console_output_test.rb +0 -27
  57. data/test/agents/sets.test.rb +0 -227
  58. data/test/agents_test.rb +0 -41
  59. data/test/casegen.tests.rb +0 -0
  60. data/test/parser_test.rb +0 -163
  61. data/test/test_helper.rb +0 -2
@@ -1,26 +0,0 @@
1
- require_relative '../lib/casegen'
2
-
3
- CLabs::CaseGen::CaseGen.new(DATA.read)
4
-
5
- __END__
6
-
7
- sets
8
- ----
9
- role: admin, standard
10
- authorization code: none, invalid, valid
11
- submit enabled: true, false
12
-
13
- rules(sets)
14
- -----------
15
- exclude role = admin AND submit enabled = false
16
- Admin role can always submit
17
-
18
- exclude role = standard AND authorization code = none AND submit enabled = true
19
- exclude role = standard AND authorization code = invalid AND submit enabled = true
20
- exclude role = standard AND authorization code = valid AND submit enabled = false
21
- Standard role can only submit when authorization code is valid
22
-
23
-
24
- ruby_array(rules)
25
- -------------
26
- DataSubmitCase
@@ -1,244 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- module Enumerable
4
-
5
- class LinkedListDelegator
6
- include Enumerable
7
-
8
- attr_reader :first, :next_name, :next_map, :args
9
-
10
- def initialize first, next_spec = nil, *args, &next_proc
11
- @first = first
12
- @args = args
13
-
14
- case next_spec
15
- when Symbol
16
- @next_name = next_spec
17
- when String
18
- @next_name = next_spec.intern
19
- when nil
20
- @next_map = next_proc
21
- else
22
- unless next_spec.respond_to? :[]
23
- raise ArgumentError,
24
- "next_spec must be a method name or respond to []."
25
- end
26
- @next_map = next_spec
27
- end
28
-
29
- unless @next_name or @next_map
30
- raise ArgumentError,
31
- "no next-getter specified."
32
- end
33
- end
34
-
35
- def each
36
- cur = @first
37
- if @next_name
38
- next_name = @next_name
39
- message = next_name, *@args
40
- while cur
41
- yield cur
42
- cur = cur.send *message
43
- end
44
- elsif @next_map
45
- next_map = @next_map
46
- args = @args
47
- while cur
48
- yield cur
49
- cur = next_map[cur, *args]
50
- end
51
- end
52
-
53
- self
54
- end
55
-
56
- end
57
-
58
- end
59
-
60
- class Object
61
- def by next_spec = nil, *args, &next_proc
62
- Enumerable::LinkedListDelegator.new self, next_spec, *args, &next_proc
63
- end
64
- end
65
-
66
-
67
- =begin
68
-
69
- ==class Object
70
- ===instance method
71
- ---Object#by next_spec = nil, *args, &next_proc
72
-
73
- Allows use of (({Enumerable})) methods, such as (({each})), (({collect})),
74
- (({select})), etc., to iterate over arbitrary objects. The caller supplies a
75
- way of calculating the successor of each object, such as an accessor method for
76
- the next element of a linked list.
77
-
78
- Object#by returns an (({Enumerable})) object whose (({each})) method
79
- iterates over the sequence beginning with (({self})) and continuing as
80
- specified by the arguments. Only the current element of the sequence is
81
- kept in memory. No attempt is made to avoid cycles.
82
-
83
- If (({next_spec})) is a string or symbol, (({next_proc})) is ignored and
84
- (({next_spec})) is treated as a method name. This method name is sent, along
85
- with arguments (({args})), to each element of the sequence to generate the next
86
- element. The sequence terminates at the first element for which the method
87
- returns (({nil})) or (({false})).
88
-
89
- If (({next_spec})) is anything else, except (({nil})), (({next_proc})) is
90
- ignored and (({next_spec})) is required to be an object that responds to
91
- (({[]})), such as a proc or a hash. The (({[]})) method of (({next_spec}))
92
- is called with each element of the sequence in turn as an argument, along
93
- with (({args})), to generate the next element. The sequence terminates at
94
- the first element for which (({[]})) returns (({nil})) or (({false})).
95
-
96
- If (({next_spec})) is not given, or is (({nil})), a block is required. In this
97
- case, the block is converted to a proc and iteration proceeds as in the
98
- preceding paragraph.
99
-
100
- The return value is not an array, but an (({Enumerable})) object that refers
101
- to the original objects. In this sense, (({Object#by})) is a ((*delegator*)).
102
- Typically, (({by})) is used with the (({for .. in ..})) construct, or
103
- (equivalently) with (({each})), or with (({collect})), (({select})), and so on.
104
- In these cases, the dependence on the original sequence does not matter. To get
105
- the array of entries produced by (({by})) as an independent data structure, use
106
- (({Enumerable#entries})) or (({Enumerable#to_a})).
107
-
108
- ===examples
109
-
110
- require 'enum/by'
111
-
112
- class A; end
113
- class B < A; end
114
- class C < B; end
115
-
116
- for cl in C.by :superclass
117
- print cl, " "
118
- end
119
-
120
- # prints: C B A Object
121
-
122
- steps = proc { |x, incr, limit| y = x + incr; y <= limit ? y : nil }
123
- p 0.by(steps, 10, 50).to_a
124
-
125
- # prints: [0, 10, 20, 30, 40, 50]
126
-
127
- See the end of the source file for more examples.
128
-
129
- ==version
130
-
131
- Enumerable tools 1.6
132
-
133
- The current version of this software can be found at
134
- ((<"http://redshift.sourceforge.net/enum
135
- "|URL:http://redshift.sourceforge.net/enum>)).
136
-
137
- ==license
138
- This software is distributed under the Ruby license.
139
- See ((<"http://www.ruby-lang.org"|URL:http://www.ruby-lang.org>)).
140
-
141
- ==author
142
- Joel VanderWerf,
143
- ((<vjoel@users.sourceforge.net|URL:mailto:vjoel@users.sourceforge.net>))
144
-
145
- ==acknowledgement
146
- Thanks to David Alan Black for his helpful comments on the Ruby mailing
147
- list
148
- ((<"http://blade.nagaokaut.ac.jp/ruby/ruby-talk
149
- "|URL:http://blade.nagaokaut.ac.jp/ruby/ruby-talk>)).
150
-
151
- =end
152
-
153
-
154
- if __FILE__ == $0
155
-
156
- class Foo
157
- attr_reader :value, :next_foo
158
-
159
- def initialize value, next_foo = nil
160
- @value = value
161
- @next_foo = next_foo
162
- end
163
- end
164
-
165
- list = Foo.new(0, Foo.new(1, Foo.new(2, Foo.new(3))))
166
-
167
- puts "Iterating over a linked list by method next_foo:"
168
- for foo in list.by :next_foo
169
- print "#{foo.value} "
170
- end
171
- print "\n\n"
172
-
173
- puts "By proc { |foo| foo.next_foo.next_foo }:"
174
- for foo in list.by { |foo| foo.next_foo.next_foo }
175
- print "#{foo.value} "
176
- end
177
- print "\n\n"
178
-
179
- puts "Down a tree, taking a random branch at each node:"
180
- puts "First, with a proc:"
181
- tree = [[0, [1, 2]], 3, [4, 5, [6, 7, 8]], 9]
182
- at_random = proc { |x| x.kind_of?(Array) && x.at(rand(x.size)) }
183
- for node in tree.by at_random
184
- p node
185
- end
186
- puts "Second, with methods:"
187
- class Object
188
- def at_random
189
- nil
190
- end
191
- end
192
- class Array
193
- def at_random
194
- at(rand(size))
195
- end
196
- end
197
- for node in tree.by :at_random
198
- p node
199
- end
200
- puts
201
-
202
- puts "With numbers (but watch out for cycles!):"
203
- p 0.by { |x| x<10 ? x+1 : nil }.to_a
204
- puts
205
-
206
- puts "With numbers using a proc and an argument:"
207
- steps = proc { |x, incr, limit| y = x + incr; y <= limit ? y : nil }
208
- p 0.by(steps, 10, 50).to_a
209
- puts
210
-
211
- puts "Up the superclass relation:"
212
- class A; end
213
- class B < A; end
214
- class C < B; end
215
- for cl in C.by :superclass
216
- print cl, " "
217
- end
218
- puts "\n\n"
219
-
220
- puts "Popping down a stack:"
221
- p [0,1,2,3,4].by { |y| y.pop; y != [] && y.dup }.entries
222
- puts
223
-
224
- puts "#by behaves correctly with self==nil"
225
- p nil.by(:something).entries
226
- puts
227
-
228
- puts "By hash, or other class responding to []:"
229
- h = { :a => :b, :b => :c, :c => :d }
230
- p :a.by {|x| h[x]}.entries
231
- puts "The same effect, but simpler:"
232
- p :a.by(h).entries
233
- puts
234
-
235
- puts "Around and around we go..."
236
- n = 0;
237
- for x in 0.by([1,2,3,4,0])
238
- n += 1
239
- print x, " "
240
- break if n > 12
241
- end
242
- puts "..."
243
-
244
- end
@@ -1,164 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- module Enumerable
4
-
5
- def each_cluster n = 2
6
- tuple = [nil] * n
7
-
8
- count = n-1
9
- each { |x|
10
- tuple.shift
11
- tuple.push x
12
- if count == 0
13
- yield tuple
14
- else
15
- count -= 1
16
- end
17
- }
18
- end
19
-
20
- def each_with_neighbors n = 1, empty = nil
21
- nbrs = [empty] * (2 * n + 1)
22
- offset = n
23
-
24
- each { |x|
25
- nbrs.shift
26
- nbrs.push x
27
- if offset == 0 # offset is now the offset of the first element, x0,
28
- yield nbrs # of the sequence from the center of nbrs, or 0,
29
- else # if x0 has already passed the center.
30
- offset -= 1
31
- end
32
- }
33
-
34
- n.times {
35
- nbrs.shift
36
- nbrs.push empty
37
- if offset == 0
38
- yield nbrs
39
- else
40
- offset -= 1
41
- end
42
- }
43
-
44
- self
45
- end
46
-
47
- end
48
-
49
-
50
- =begin
51
-
52
- ==module Enumerable
53
- ===instance methods
54
- ---Enumerable#each_cluster n = 2
55
- ---Enumerable#each_with_neighbors n = 1, empty = nil
56
-
57
- Both methods iterate over a collection of arrays whose elements are drawn
58
- in sequence from the original collection.
59
-
60
- In the case of (({each_cluster})), the iteration yields all contiguous
61
- subsequences of length ((|n|)). If the argument to (({each_cluster})) is 0
62
- or larger than the size of the collection, the iteration yields no values.
63
-
64
- In the case of (({each_with_neighbors})), the iteration yields one
65
- sequence for each element ((|x|)) of the collection. The yielded sequence
66
- includes the ((|n|)) elements before and after ((|x|)). Elements out of
67
- bounds are filled with ((|empty|)). The first argument can be any
68
- nonnegative integer.
69
-
70
- ===examples
71
-
72
- require 'enum/cluster'
73
-
74
- (0..5).each_with_neighbors { |x| p x }
75
-
76
- # prints:
77
- # [nil, 0, 1]
78
- # [0, 1, 2]
79
- # [1, 2, 3]
80
- # [2, 3, 4]
81
- # [3, 4, 5]
82
- # [4, 5, nil]
83
-
84
- [1,2,3,4].each_with_neighbors(8, 0) { |x| p x }
85
-
86
- # prints:
87
- # [0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0]
88
- # [0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0]
89
- # [0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0]
90
- # [0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0]
91
-
92
- ('a'..'g').each_cluster(5) { |x| p x.join '' }
93
-
94
- # prints:
95
- # "abcde"
96
- # "bcdef"
97
- # "cdefg"
98
-
99
- See the end of the source file for more examples.
100
-
101
- ==version
102
-
103
- Enumerable tools 1.6
104
-
105
- The current version of this software can be found at
106
- ((<"http://redshift.sourceforge.net/enum
107
- "|URL:http://redshift.sourceforge.net/enum>)).
108
-
109
- ==license
110
- This software is distributed under the Ruby license.
111
- See ((<"http://www.ruby-lang.org"|URL:http://www.ruby-lang.org>)).
112
-
113
- ==author
114
- Joel VanderWerf,
115
- ((<vjoel@users.sourceforge.net|URL:mailto:vjoel@users.sourceforge.net>))
116
-
117
- =end
118
-
119
-
120
- if __FILE__ == $0
121
-
122
- (0..5).each_with_neighbors { |x| p x }
123
-
124
- puts
125
-
126
- [1,2,3,4].each_with_neighbors(8, 0) { |x| p x }
127
-
128
- puts
129
-
130
- ('a'..'g').each_cluster(5) { |x| p x.join '' }
131
-
132
- puts
133
-
134
- begin
135
- require 'enum/by'
136
-
137
- # each_with_neighbors is useful for successive comparisons:
138
- 2.by {|x| x<10000 && x**2}.each_with_neighbors(1, 1) {
139
- |prev_x, x, next_x|
140
- printf "%d - %d = %d\n", x, prev_x, x - prev_x
141
- }
142
- puts
143
-
144
- # Construct a doubly linked list:
145
- Node = Struct.new "Node", :value, :prev_node, :next_node
146
-
147
- list = (1..10).collect { |i| Node.new i }
148
-
149
- list.each_with_neighbors { |prev_node, node, next_node|
150
- node.prev_node = prev_node
151
- node.next_node = next_node
152
- }
153
-
154
- list[0].by(:next_node).each { |node| print node.value, " " }
155
- puts
156
-
157
- # We constructed the list and interated over it without ever
158
- # explicitly mentioning nil.
159
-
160
- rescue LoadError
161
- puts "File enum/by.rb not available. You're missing the best part!"
162
- end
163
-
164
- end
@@ -1,50 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- =begin
4
- ---Enumerable#inject
5
- ---Enumerable#sum [block]
6
-
7
- Code adapted from Pickaxe book, p.102.
8
- See source file for examples.
9
-
10
- ==version
11
-
12
- Enumerable tools 1.6
13
-
14
- =end
15
-
16
- # module Enumerable
17
- #
18
- # def inject n
19
- # each { |i|
20
- # n = yield n, i
21
- # }
22
- # n
23
- # end
24
- # alias :accumulate :inject
25
- #
26
- # def sum
27
- # if block_given?
28
- # inject(0) { |n, i| n + yield(i) }
29
- # else
30
- # inject(0) { |n, i| n + i }
31
- # end
32
- # end
33
- #
34
- # def product
35
- # if block_given?
36
- # inject(1) { |n, i| n * yield(i) }
37
- # else
38
- # inject(1) { |n, i| n * i }
39
- # end
40
- # end
41
- #
42
- # end
43
-
44
- if __FILE__ == $0
45
-
46
- x = (0..9).collect { |i| [i, i*i] }
47
- p x
48
- p x.sum { |v| v[1] }
49
-
50
- end