kindergarten 0.1.1 → 0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f11bca12bbb8759030c18099817047ed865fc155
4
+ data.tar.gz: 56828ce9731aa90462eb5ee37be4cb9f9607b049
5
+ SHA512:
6
+ metadata.gz: 0ef89b539774565243e33c77a768acad748782c73b5b3529ab9451f009be1dec29d59840db383f08412361c5633f47eb1cf61879ef9d2b14356a6a9b08a2887d
7
+ data.tar.gz: 819940c76e100bee350203282d4b8c0d08c2830ae8d31c7f590b730c0abc1b191dc7e0a65b42e3c241626f8a4f6b60a084ea5cc66424b0cec90af611295577a6
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ kita
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.0
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # for travis, use a real gemfile
4
- gem "cancan", "~> 1.6.8"
4
+ gem "cancancan", "~> 1.7"
5
5
  gem "activesupport", "> 3"
6
6
  gem "rufus-json"
7
7
 
data/README.md CHANGED
@@ -6,6 +6,28 @@
6
6
 
7
7
  A way to achieve modularity and modular security with a sandbox on steroids.
8
8
 
9
+ ## Introduction
10
+
11
+ ### Modules
12
+ A Kindergarten could be seen as collection of service objects, each
13
+ representing a 'play area' (think: doll area, lego table, etc. etc.).
14
+
15
+ Within the realm of kindergarten, the service objects are refered to as
16
+ modules.
17
+
18
+ ### Sandboxing
19
+ The modules are plugged into the kindergarten and can be governed, both per
20
+ module and kindergarten wide. There are governesses looking for, and preventing
21
+ trouble.
22
+
23
+ Each module is not just exposed as-is; it is sandboxed. Which means that they
24
+ must specify which methods are to be played with.
25
+
26
+ ### Child
27
+ What good would a kindergarten with a sandbox full of toys be without a child?
28
+ In a Rails context; the most logical choise for a child would be
29
+ the ```current_user```.
30
+
9
31
  ## Installation
10
32
 
11
33
  Add this line to your application's Gemfile:
@@ -23,55 +45,67 @@ Or install it yourself as:
23
45
  ## Usage
24
46
 
25
47
  ```ruby
26
- # define a child
27
- child = User.find(2)
28
-
29
- # define a module (perimeter) for the child to play in
30
- class MyPlayModule < Kindergarten::Perimeter
31
- # use can-can rules to govern the perimeter
32
- govern do
33
- can :watch, Television
34
- cannot :watch, CableTV
35
-
36
- can :eat, Candy do |candy|
37
- child.quotum.allows(candy)
48
+ # define a child
49
+ child = User.find(2)
50
+
51
+ # define a module (perimeter) for the child to play in
52
+ class MyPlayModule < Kindergarten::Perimeter
53
+ # every module must have a purpose.
54
+ # The purpose also serves as a namespace
55
+ #
56
+ purpose :playing
57
+
58
+ # use can-can rules to govern the perimeter
59
+ govern do
60
+ can :watch, Television
61
+ cannot :watch, CableTV
62
+
63
+ can :eat, Candy do |candy|
64
+ child.quotum.allows(candy)
65
+ end
38
66
  end
39
- end
40
67
 
41
- # define methods for the sandbox
42
- sandbox :watch_tv, :eat
68
+ # define exposed methods
69
+ expose :watch_tv, :eat
43
70
 
44
- def watch_tv(tv)
45
- guard(:watch, tv)
46
- child.watch(tv)
71
+ def watch_tv(tv)
72
+ guard(:watch, tv)
73
+ child.watch(tv)
47
74
 
48
- sleep(:four)
49
- end
75
+ sleep(:four)
76
+ end
50
77
 
51
- def eat(candy)
52
- guard(:eat, candy)
53
- child.eat(candy)
54
- end
78
+ def eat(candy)
79
+ guard(:eat, candy)
80
+ child.eat(candy)
81
+ end
82
+
83
+ def sleep(len) # not_accessible_from_outside
84
+ child.sleep(len)
85
+ end
86
+
87
+ # or expose methods in an 'annotation like way'
55
88
 
56
- def sleep(len) # not_accessible_from_outside
57
- child.sleep(len)
89
+ expose :method
90
+ # method that does nothing at all
91
+ def method
92
+ end
58
93
  end
59
- end
60
94
 
61
- # load the child and the module into a sandbox
62
- sandbox = Kindergarten.sandbox(child)
63
- sandbox.load_module(MyPlayPerimeter)
95
+ # load the child (any object) and the module into a sandbox
96
+ sandbox = Kindergarten.sandbox(child)
97
+ sandbox.load_module(MyPlayPerimeter)
64
98
 
65
- # you can now call the sandboxed methods on the sandbox
66
- sandbox.watch_tv(CableTV.new) # fails with Kindergarten::AccessDenied
67
- 30.times do
68
- sandbox.eat(Liquorice.new) # fails after a while
69
- end
99
+ # you can now call the sandboxed methods on the sandbox
100
+ sandbox.playing.watch_tv(CableTV.new) # fails with Kindergarten::AccessDenied
101
+ 30.times do
102
+ sandbox.playing.eat(Liquorice.new) # fails after a while
103
+ end
70
104
 
71
- sandbox.sleep(:long) # fails with NoMethodError
105
+ sandbox.playing.sleep(:long) # fails with NoMethodError
72
106
 
73
- sandbox.allowed?(:watch, Television)
74
- # => true
107
+ sandbox.allows?(:watch, Television)
108
+ # => true
75
109
  ```
76
110
 
77
111
  You are not restricted to only one perimeter/module - that would be most
data/kindergarten.gemspec CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Kindergarten::VERSION
17
17
 
18
- gem.add_dependency('cancan', ['~> 1.6.8'])
18
+ gem.add_dependency('cancancan', ['~> 1.7'])
19
19
  gem.add_dependency('activesupport', ['> 3'])
20
20
  gem.add_dependency('rufus-json')
21
21
 
data/lib/kindergarten.rb CHANGED
@@ -1,4 +1,7 @@
1
- require 'cancan'
1
+ require 'cancan/ability'
2
+ require 'cancan/rule'
3
+ require 'cancan/exceptions'
4
+
2
5
  require 'active_support/core_ext'
3
6
 
4
7
  require "kindergarten/version"
@@ -1,3 +1,3 @@
1
1
  module Kindergarten
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,115 +1,141 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kindergarten
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
5
- prerelease:
4
+ version: 0.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Hartog C. de Mik
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-11-27 00:00:00.000000000 Z
11
+ date: 2014-03-17 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- name: cancan
16
- requirement: &14791540 !ruby/object:Gem::Requirement
17
- none: false
14
+ name: cancancan
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 1.6.8
19
+ version: '1.7'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *14791540
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: activesupport
27
- requirement: &14790580 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ! '>'
31
+ - - ">"
31
32
  - !ruby/object:Gem::Version
32
33
  version: '3'
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *14790580
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">"
39
+ - !ruby/object:Gem::Version
40
+ version: '3'
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: rufus-json
38
- requirement: &14789580 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
- - - ! '>='
45
+ - - ">="
42
46
  - !ruby/object:Gem::Version
43
47
  version: '0'
44
48
  type: :runtime
45
49
  prerelease: false
46
- version_requirements: *14789580
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: rake
49
- requirement: &14788540 !ruby/object:Gem::Requirement
50
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
51
58
  requirements:
52
- - - ! '>='
59
+ - - ">="
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
55
62
  type: :development
56
63
  prerelease: false
57
- version_requirements: *14788540
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: rspec
60
- requirement: &14787760 !ruby/object:Gem::Requirement
61
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
62
72
  requirements:
63
- - - ~>
73
+ - - "~>"
64
74
  - !ruby/object:Gem::Version
65
75
  version: '2.11'
66
76
  type: :development
67
77
  prerelease: false
68
- version_requirements: *14787760
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.11'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: mocha
71
- requirement: &14803080 !ruby/object:Gem::Requirement
72
- none: false
85
+ requirement: !ruby/object:Gem::Requirement
73
86
  requirements:
74
- - - ! '>='
87
+ - - ">="
75
88
  - !ruby/object:Gem::Version
76
89
  version: '0'
77
90
  type: :development
78
91
  prerelease: false
79
- version_requirements: *14803080
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
80
97
  - !ruby/object:Gem::Dependency
81
98
  name: activerecord
82
- requirement: &14802040 !ruby/object:Gem::Requirement
83
- none: false
99
+ requirement: !ruby/object:Gem::Requirement
84
100
  requirements:
85
- - - ! '>'
101
+ - - ">"
86
102
  - !ruby/object:Gem::Version
87
103
  version: '3'
88
104
  type: :development
89
105
  prerelease: false
90
- version_requirements: *14802040
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">"
109
+ - !ruby/object:Gem::Version
110
+ version: '3'
91
111
  - !ruby/object:Gem::Dependency
92
112
  name: mysql2
93
- requirement: &14801140 !ruby/object:Gem::Requirement
94
- none: false
113
+ requirement: !ruby/object:Gem::Requirement
95
114
  requirements:
96
- - - ! '>='
115
+ - - ">="
97
116
  - !ruby/object:Gem::Version
98
117
  version: '0'
99
118
  type: :development
100
119
  prerelease: false
101
- version_requirements: *14801140
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
102
125
  - !ruby/object:Gem::Dependency
103
126
  name: jdbc-mysql
104
- requirement: &14800340 !ruby/object:Gem::Requirement
105
- none: false
127
+ requirement: !ruby/object:Gem::Requirement
106
128
  requirements:
107
- - - ! '>='
129
+ - - ">="
108
130
  - !ruby/object:Gem::Version
109
131
  version: '0'
110
132
  type: :development
111
133
  prerelease: false
112
- version_requirements: *14800340
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
113
139
  description: A kindergarten with a perimeter, a governess and a sandbox
114
140
  email:
115
141
  - hartog@organisedminds.com
@@ -117,9 +143,11 @@ executables: []
117
143
  extensions: []
118
144
  extra_rdoc_files: []
119
145
  files:
120
- - .gitignore
121
- - .rspec
122
- - .travis.yml
146
+ - ".gitignore"
147
+ - ".rspec"
148
+ - ".ruby-gemset"
149
+ - ".ruby-version"
150
+ - ".travis.yml"
123
151
  - Gemfile
124
152
  - LICENSE
125
153
  - README.md
@@ -159,27 +187,25 @@ files:
159
187
  - spec/support/spec_perimeter.rb
160
188
  homepage: ''
161
189
  licenses: []
190
+ metadata: {}
162
191
  post_install_message:
163
192
  rdoc_options: []
164
193
  require_paths:
165
194
  - lib
166
195
  required_ruby_version: !ruby/object:Gem::Requirement
167
- none: false
168
196
  requirements:
169
- - - ! '>='
197
+ - - ">="
170
198
  - !ruby/object:Gem::Version
171
199
  version: '0'
172
200
  required_rubygems_version: !ruby/object:Gem::Requirement
173
- none: false
174
201
  requirements:
175
- - - ! '>='
202
+ - - ">="
176
203
  - !ruby/object:Gem::Version
177
204
  version: '0'
178
205
  requirements: []
179
206
  rubyforge_project:
180
- rubygems_version: 1.8.11
207
+ rubygems_version: 2.2.2
181
208
  signing_key:
182
- specification_version: 3
209
+ specification_version: 4
183
210
  summary: Provide a kindergarten for your code to play in
184
211
  test_files: []
185
- has_rdoc: