checkthelist 0.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.
- data/lib/checklist/checklist.rb +33 -0
- data/lib/checklist/exceptions.rb +12 -0
- data/lib/checklist/item.rb +25 -0
- data/lib/checklist/list.rb +71 -0
- data/lib/checklist.rb +16 -0
- data/spec/checklist_spec.rb +117 -0
- metadata +52 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
2
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
3
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
4
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
5
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
6
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
7
|
+
# THE SOFTWARE.
|
8
|
+
|
9
|
+
module Checklist
|
10
|
+
|
11
|
+
def checklist
|
12
|
+
self.class.get_checklist(self)
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
|
17
|
+
# entry point
|
18
|
+
def checklist(&block)
|
19
|
+
@checklist ||= List.new self
|
20
|
+
@checklist.update(&block) if block_given?
|
21
|
+
@checklist
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_checklist(context = nil)
|
25
|
+
@checklist.context = context
|
26
|
+
@checklist
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.included(base)
|
31
|
+
base.extend(ClassMethods)
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
2
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
3
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
4
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
5
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
6
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
7
|
+
# THE SOFTWARE.
|
8
|
+
|
9
|
+
module Checklist
|
10
|
+
class InstanceMissingError < StandardError
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
2
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
3
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
4
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
5
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
6
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
7
|
+
# THE SOFTWARE.
|
8
|
+
|
9
|
+
module Checklist
|
10
|
+
class Item
|
11
|
+
attr_reader :explain, :key, :list
|
12
|
+
|
13
|
+
def initialize(explain, list = nil, &block)
|
14
|
+
@list = list
|
15
|
+
@block = block
|
16
|
+
@explain = explain
|
17
|
+
end
|
18
|
+
|
19
|
+
def checked?
|
20
|
+
raise Checklist::InstanceMissingError unless list.context
|
21
|
+
list.context.instance_eval(&@block) == true
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
2
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
3
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
4
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
5
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
6
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
7
|
+
# THE SOFTWARE.
|
8
|
+
|
9
|
+
|
10
|
+
require 'forwardable'
|
11
|
+
|
12
|
+
module Checklist
|
13
|
+
class List
|
14
|
+
extend ::Forwardable
|
15
|
+
|
16
|
+
def_delegators :@list, :each, :map, :select, :first, :last
|
17
|
+
|
18
|
+
attr_reader :items, :context
|
19
|
+
|
20
|
+
def initialize(klass, &block)
|
21
|
+
@klass, @items = klass, []
|
22
|
+
update(&block)
|
23
|
+
end
|
24
|
+
|
25
|
+
def update(&block)
|
26
|
+
instance_eval(&block) if block_given?
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
# return true if all items are validated
|
31
|
+
def valid?
|
32
|
+
items.each do |item|
|
33
|
+
return false unless item.checked?
|
34
|
+
end
|
35
|
+
return true
|
36
|
+
end
|
37
|
+
|
38
|
+
def context= (instance)
|
39
|
+
@context = instance
|
40
|
+
end
|
41
|
+
|
42
|
+
# = Example
|
43
|
+
# each_checked do |explain, checked|
|
44
|
+
# puts "#{explain} = #{checked}"
|
45
|
+
# end
|
46
|
+
def each_checked(&block)
|
47
|
+
items.each do |item|
|
48
|
+
block.call(item.explain, item.checked?)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def map_checked(&block)
|
53
|
+
if block_given?
|
54
|
+
items.map {|item| block.call(item.explain, item.checked?) }
|
55
|
+
else
|
56
|
+
items.map {|item| [item.explain, item.checked?] }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def errors
|
61
|
+
items.select { |item| !item.checked? }
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def it(explain, &block)
|
67
|
+
@items << Item.new(explain, self, &block)
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
data/lib/checklist.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
2
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
3
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
4
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
5
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
6
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
7
|
+
# THE SOFTWARE.
|
8
|
+
|
9
|
+
module Checklist
|
10
|
+
%w(
|
11
|
+
checklist
|
12
|
+
item
|
13
|
+
list
|
14
|
+
exceptions
|
15
|
+
).each { |file| require File.join(File.dirname(__FILE__), 'checklist', file) }
|
16
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
2
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
3
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
4
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
5
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
6
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
7
|
+
# THE SOFTWARE.
|
8
|
+
|
9
|
+
require_relative '../lib/checklist'
|
10
|
+
|
11
|
+
class TestingChecklist
|
12
|
+
include Checklist
|
13
|
+
|
14
|
+
attr_accessor :world
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
@world = "World"
|
18
|
+
@true = true
|
19
|
+
end
|
20
|
+
|
21
|
+
checklist do
|
22
|
+
it "World should contains the world string" do
|
23
|
+
world == "World"
|
24
|
+
end
|
25
|
+
it "the truth" do
|
26
|
+
@true == true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# verify if there is no collapsing in the rules
|
32
|
+
class TestingChecklist2
|
33
|
+
include Checklist
|
34
|
+
|
35
|
+
attr_accessor :world
|
36
|
+
|
37
|
+
def initialize
|
38
|
+
@world = "Monde"
|
39
|
+
end
|
40
|
+
|
41
|
+
checklist do
|
42
|
+
it "World should contains the world string" do
|
43
|
+
world == "Monde"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
describe Checklist do
|
50
|
+
|
51
|
+
let(:instance){ TestingChecklist.new }
|
52
|
+
let(:instance2){ TestingChecklist2.new }
|
53
|
+
let(:invalid){ a = TestingChecklist.new; a.world = "Blabla"; a }
|
54
|
+
|
55
|
+
describe 'checklist' do
|
56
|
+
it 'should return an array of ChecklistItem' do
|
57
|
+
instance.checklist.items.first.should be_a(Checklist::Item)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should not share items between classes' do
|
61
|
+
instance.checklist.items.size.should == 2
|
62
|
+
instance2.checklist.items.size.should == 1
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe 'valid?' do
|
67
|
+
context 'when calling from instance' do
|
68
|
+
it 'should return true if all conditions return true' do
|
69
|
+
instance.checklist.should be_valid
|
70
|
+
instance2.checklist.should be_valid
|
71
|
+
end
|
72
|
+
it 'should return false if one fails' do
|
73
|
+
invalid.checklist.should_not be_valid
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'when calling from class' do
|
79
|
+
it 'should raise an exception' do
|
80
|
+
lambda do
|
81
|
+
TestingChecklist.get_checklist.valid?
|
82
|
+
end.should raise_exception Checklist::InstanceMissingError
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe 'each_checked' do
|
88
|
+
it 'should iterate and give the block the message and the true/false value' do
|
89
|
+
instance.checklist.each_checked do |explain, checked|
|
90
|
+
explain.should be_a(String)
|
91
|
+
checked.should be
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe 'map_checked' do
|
97
|
+
context 'without block' do
|
98
|
+
it 'should return an array of array' do
|
99
|
+
invalid.checklist.map_checked.should == [
|
100
|
+
["World should contains the world string", false],
|
101
|
+
["the truth", true],
|
102
|
+
]
|
103
|
+
end
|
104
|
+
end
|
105
|
+
context 'with block' do
|
106
|
+
it 'should work as the regular map but give the message and the true/false' do
|
107
|
+
invalid.checklist.map_checked do |sms, checked|
|
108
|
+
[checked, sms]
|
109
|
+
end.should == [
|
110
|
+
[false, "World should contains the world string"],
|
111
|
+
[true, "the truth"]
|
112
|
+
]
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
metadata
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: checkthelist
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Diego d'Ursel
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-11-19 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Lets you create your list of rules and see them checked once the provided
|
15
|
+
block return true
|
16
|
+
email: diegodurs@gmail/com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/checklist.rb
|
22
|
+
- lib/checklist/checklist.rb
|
23
|
+
- lib/checklist/exceptions.rb
|
24
|
+
- lib/checklist/item.rb
|
25
|
+
- lib/checklist/list.rb
|
26
|
+
- spec/checklist_spec.rb
|
27
|
+
homepage: http://rubygems.org/gems/checkmylist
|
28
|
+
licenses:
|
29
|
+
- MIT
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
require_paths:
|
33
|
+
- lib
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
36
|
+
requirements:
|
37
|
+
- - ! '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
requirements: []
|
47
|
+
rubyforge_project:
|
48
|
+
rubygems_version: 1.8.23
|
49
|
+
signing_key:
|
50
|
+
specification_version: 3
|
51
|
+
summary: Checklist helper
|
52
|
+
test_files: []
|