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.
@@ -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: []