kindergarten 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe Kindergarten::Sandbox do
4
+ it "should allow an instance for any child" do
5
+ expect {
6
+ Kindergarten::Sandbox.new(:any)
7
+ }.to_not raise_error
8
+ end
9
+
10
+ it "should know it's child" do
11
+ sandbox = Kindergarten::Sandbox.new(:its)
12
+ sandbox.child.should eq :its
13
+ end
14
+
15
+ it "should create an empty governess for the object" do
16
+ sandbox = Kindergarten::Sandbox.new(:object)
17
+ sandbox.governess.should be_kind_of(Kindergarten::HeadGoverness)
18
+ sandbox.governess.should be_empty
19
+ end
20
+
21
+ it "should define an empty perimeter" do
22
+ sandbox = Kindergarten::Sandbox.new(:child)
23
+ sandbox.perimeter.should be_empty
24
+ end
25
+
26
+ it "should provide a extend_perimeter function" do
27
+ sandbox = Kindergarten::Sandbox.new(:child)
28
+ sandbox.should respond_to(:extend_perimeter)
29
+
30
+ expect {
31
+ sandbox.extend_perimeter(SpecPerimeter)
32
+ }.to change {
33
+ sandbox.perimeter.empty?
34
+ }
35
+ end
36
+
37
+ describe :HeadGoverness do
38
+ before(:each) do
39
+ @sandbox = Kindergarten::Sandbox.new(:child)
40
+ @sandbox.extend_perimeter(SpecPerimeter, PuppetPerimeter)
41
+ end
42
+
43
+ it "should tell the outside what is allowed" do
44
+ @sandbox.should be_allowed(:view, "string")
45
+ end
46
+
47
+ it "should know the rules accross perimeters" do
48
+ puppet = @sandbox.grab_puppet
49
+ @sandbox.should be_disallowed(:bbq, puppet)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe Kindergarten do
4
+ it "should have a version constant" do
5
+ Kindergarten::VERSION.should_not be_nil
6
+ end
7
+
8
+ it "should have a sandbox method" do
9
+ res = Kindergarten.sandbox("string")
10
+ res.should be_kind_of(Kindergarten::Sandbox)
11
+ end
12
+ end
@@ -0,0 +1,125 @@
1
+ require 'spec_helper'
2
+ require 'orm_helper'
3
+
4
+ class Migration < ActiveRecord::Migration
5
+ def up
6
+ create_table :bars do |t|
7
+ t.string :name
8
+ t.text :description
9
+ t.string :city
10
+ t.string :street
11
+ t.string :type
12
+ end
13
+
14
+ create_table :restaurants do |t|
15
+ t.string :name
16
+ t.text :description
17
+ t.integer :stars
18
+ t.decimal :avg_meal_price, :precision => 5, :scale => 2
19
+ end
20
+ end
21
+ end
22
+
23
+ class Bar < ActiveRecord::Base
24
+ include Kindergarten::ORM::Governess
25
+ end
26
+
27
+ class Joint < Bar
28
+ # for STI tests
29
+ end
30
+
31
+ class Restaurant < ActiveRecord::Base
32
+ include Kindergarten::ORM::Governess
33
+
34
+ force_rinsed
35
+ end
36
+
37
+ describe Kindergarten::ORM::ActiveRecord do
38
+ before(:all) do
39
+ begin
40
+ mig = Migration.new
41
+ mig.suppress_messages do
42
+ mig.up
43
+ end
44
+
45
+ rescue => ex
46
+ unless ex.message =~ /already exists/
47
+ $stderr.puts "!!! #{ex.class}: #{ex.message}"
48
+ end
49
+ end
50
+ end
51
+
52
+ describe :Drinking do
53
+ before(:each) do
54
+ @sandbox = Kindergarten.sandbox(:child)
55
+ @sandbox.extend_perimeter(DrinkingPerimeter)
56
+ end
57
+
58
+ it "should create a bar" do
59
+ bar = nil
60
+ expect {
61
+ bar = @sandbox.create_bar( name: "foo", decription: "bar" )
62
+ }.to_not raise_error
63
+
64
+ bar.should be_kind_of(Bar)
65
+ end
66
+
67
+ it "should not create a bar w/o scrubbing" do
68
+ expect {
69
+ @sandbox.create_bar_wo( name: "foo", decription: "bar" )
70
+ }.to raise_error(Kindergarten::ORM::Unscrubbed)
71
+ end
72
+
73
+ it "should protect the Joint" do
74
+ expect {
75
+ @sandbox.create_joint( name: "foo", decription: "bar" )
76
+ }.to raise_error(Kindergarten::ORM::Unscrubbed)
77
+ end
78
+
79
+ it "should build a clean joint" do
80
+ expect {
81
+ @sandbox.build_joint(name: "clean")
82
+ }.to_not raise_error(Kindergarten::ORM::Unscrubbed)
83
+ end
84
+
85
+ it "should not build a dirty joint" do
86
+ expect {
87
+ @sandbox.build_dirty_joint
88
+ }.to raise_error(Kindergarten::ORM::Unscrubbed)
89
+ end
90
+
91
+ it "should update a bar" do
92
+ bar = @sandbox.create_bar(name: "Whiskey Inn")
93
+ expect {
94
+ @sandbox.update_bar(bar, name: "Whiskey Out")
95
+ }.to_not raise_error(Kindergarten::ORM::Unscrubbed)
96
+ end
97
+
98
+ it "should not update a dirty bar" do
99
+ bar = @sandbox.create_bar(name: "Whiskey Inn")
100
+ expect {
101
+ @sandbox.update_bar_dirty(bar, name: "Whiskey Out")
102
+ }.to raise_error(Kindergarten::ORM::Unscrubbed)
103
+ end
104
+ end
105
+
106
+ describe :Dining do
107
+ before(:each) do
108
+ @sandbox = Kindergarten.sandbox(:child)
109
+ @sandbox.extend_perimeter(DiningPerimeter)
110
+ end
111
+
112
+ it "should not create a scrubbed restaurant" do
113
+ expect {
114
+ @sandbox.create_restaurant_scrubbed(name: "China Wok")
115
+ }.to raise_error(Kindergarten::ORM::Unscrubbed)
116
+ end
117
+
118
+ it "should create a rinsed restaurant" do
119
+ expect {
120
+ @sandbox.create_restaurant(name: "Lobster Inn")
121
+ }.to_not raise_error(Kindergarten::ORM::Unscrubbed)
122
+ end
123
+ end
124
+
125
+ end
@@ -0,0 +1,15 @@
1
+ require 'sqlite3'
2
+ require 'active_record'
3
+ require "kindergarten/orm/governess"
4
+
5
+ logger = Logger.new File.expand_path( "../support/log/test.log", __FILE__)
6
+ logger.formatter = proc { |severity, datetime, progname, msg|
7
+ "[#{severity}] #{msg}\n"
8
+ }
9
+
10
+ ActiveRecord::Base.logger = logger
11
+ ActiveRecord::Base.establish_connection(
12
+ :adapter => 'sqlite3',
13
+ :database => File.expand_path( "../support/db/test.db", __FILE__),
14
+ )
15
+
@@ -0,0 +1,8 @@
1
+ require 'kindergarten'
2
+
3
+ Dir[File.expand_path( "../support/**/*.rb", __FILE__)].sort.each { |f| require f }
4
+
5
+ RSpec.configure do |config|
6
+ config.tty = true
7
+ # config.mock_with :mocha
8
+ end
@@ -0,0 +1,9 @@
1
+ module RSpecWorldHelper
2
+ def RWorld(constant)
3
+ RSpec.configure do |config|
4
+ config.include constant
5
+ end
6
+ end
7
+ end
8
+
9
+ include RSpecWorldHelper
File without changes
@@ -0,0 +1,14 @@
1
+ class DiningPerimeter < Kindergarten::Perimeter
2
+ # should raise Unscrubbed
3
+ def create_restaurant_scrubbed(args)
4
+ Restaurant.create(scrub(args, :name, :description))
5
+ end
6
+
7
+ # should work
8
+ def create_restaurant(args)
9
+ safe = rinse(args, :name => /([\w\s\-]+)/, :description => :pass)
10
+ Restaurant.create(safe)
11
+ end
12
+
13
+ sandbox :create_restaurant_scrubbed, :create_restaurant
14
+ end
@@ -0,0 +1,39 @@
1
+ class DrinkingPerimeter < Kindergarten::Perimeter
2
+ # supposed to work
3
+ def create_bar(args)
4
+ Bar.create(scrub(args, :name, :description))
5
+ end
6
+
7
+ # should raise Unscrubbed
8
+ def create_bar_wo(args)
9
+ Bar.create(args)
10
+ end
11
+
12
+ # should raise Unscrubbed
13
+ def create_joint(args)
14
+ Joint.create(args)
15
+ end
16
+
17
+ # should not raise Unscrubbed
18
+ def build_joint(args)
19
+ Joint.new(scrub(args, :name))
20
+ end
21
+
22
+ # should raise Unscrubbed
23
+ def build_dirty_joint
24
+ Joint.new(name: "dirty")
25
+ end
26
+
27
+ # should not raise Unscrubbed
28
+ def update_bar(bar, args)
29
+ bar.update_attributes(scrub(args, :name, :city, :street))
30
+ end
31
+
32
+ # should raise
33
+ def update_bar_dirty(bar, args)
34
+ bar.update_attributes(args)
35
+ end
36
+
37
+ sandbox :create_bar, :create_bar_wo, :create_joint, :build_joint,
38
+ :build_dirty_joint, :update_bar, :update_bar_dirty
39
+ end
File without changes
@@ -0,0 +1,19 @@
1
+ class PuppetPerimeter < Kindergarten::Perimeter
2
+ class Puppet
3
+ end
4
+
5
+ govern do |child|
6
+ can [:play_with,:dress,:nappy_change], Puppet
7
+ cannot [:tear, :bbq], Puppet
8
+ end
9
+
10
+ def grab_puppet
11
+ guard(:play_with, Puppet.new)
12
+ end
13
+
14
+ def play_puppet(puppet, action)
15
+ guard(:action, puppet)
16
+ end
17
+
18
+ sandbox :grab_puppet, :play_puppet
19
+ end
@@ -0,0 +1,35 @@
1
+ class SpecPerimeter < Kindergarten::Perimeter
2
+ governess Kindergarten::StrictGoverness
3
+
4
+ govern do |child|
5
+ can :view, String
6
+ end
7
+
8
+ # should pass and return the child
9
+ def sandboxed
10
+ guard(:view, child)
11
+ end
12
+
13
+ # should raise AccessDenied
14
+ def guarded
15
+ guard(:somethings, child)
16
+ end
17
+
18
+ # should not be accessible
19
+ def unboxed
20
+ $stderr.puts "I should never happen"
21
+ end
22
+
23
+ # should return "OK"
24
+ def not_guarded
25
+ unguarded
26
+ "OK"
27
+ end
28
+
29
+ # should raise Unguarded
30
+ def unsafe
31
+ return child.reverse
32
+ end
33
+
34
+ sandbox :sandboxed, :not_guarded, :guarded, :unsafe
35
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kindergarten
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Hartog C. de Mik
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: cancan
16
+ requirement: &29385360 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.6.8
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *29385360
25
+ - !ruby/object:Gem::Dependency
26
+ name: activesupport
27
+ requirement: &29381580 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '3.2'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *29381580
36
+ - !ruby/object:Gem::Dependency
37
+ name: rake
38
+ requirement: &29380560 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *29380560
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: &29379620 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.10'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *29379620
58
+ - !ruby/object:Gem::Dependency
59
+ name: activerecord
60
+ requirement: &29378540 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: '3.2'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *29378540
69
+ - !ruby/object:Gem::Dependency
70
+ name: sqlite3
71
+ requirement: &29377500 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *29377500
80
+ description: A kindergarten with a perimeter, a governess and a sandbox
81
+ email:
82
+ - hartog@organisedminds.com
83
+ executables: []
84
+ extensions: []
85
+ extra_rdoc_files: []
86
+ files:
87
+ - .gitignore
88
+ - .rspec
89
+ - .travis.yml
90
+ - Gemfile
91
+ - LICENSE
92
+ - README.md
93
+ - Rakefile
94
+ - TODO.md
95
+ - kindergarten.gemspec
96
+ - lib/kindergarten.rb
97
+ - lib/kindergarten/exceptions.rb
98
+ - lib/kindergarten/governesses.rb
99
+ - lib/kindergarten/governesses/easy_governess.rb
100
+ - lib/kindergarten/governesses/head_governess.rb
101
+ - lib/kindergarten/governesses/strict_governess.rb
102
+ - lib/kindergarten/orm/active_record.rb
103
+ - lib/kindergarten/orm/governess.rb
104
+ - lib/kindergarten/perimeter.rb
105
+ - lib/kindergarten/sandbox.rb
106
+ - lib/kindergarten/version.rb
107
+ - spec/kindergarten/governess_spec.rb
108
+ - spec/kindergarten/perimeter_spec.rb
109
+ - spec/kindergarten/sandbox_spec.rb
110
+ - spec/kindergarten_spec.rb
111
+ - spec/orm/active_record_spec.rb
112
+ - spec/orm_helper.rb
113
+ - spec/spec_helper.rb
114
+ - spec/support/01_rspec_helper.rb
115
+ - spec/support/db/.gitkeep
116
+ - spec/support/dining_perimeter.rb
117
+ - spec/support/drinking_perimeter.rb
118
+ - spec/support/log/.gitkeep
119
+ - spec/support/puppet_perimeter.rb
120
+ - spec/support/spec_perimeter.rb
121
+ homepage: ''
122
+ licenses: []
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ none: false
135
+ requirements:
136
+ - - ! '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ requirements: []
140
+ rubyforge_project:
141
+ rubygems_version: 1.8.11
142
+ signing_key:
143
+ specification_version: 3
144
+ summary: Provide a kindergarten for your code to play in
145
+ test_files: []
146
+ has_rdoc: