checkthelist 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []