eaco 0.5.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.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +18 -0
  5. data/.yardopts +1 -0
  6. data/Appraisals +22 -0
  7. data/Gemfile +4 -0
  8. data/Guardfile +34 -0
  9. data/LICENSE.txt +23 -0
  10. data/README.md +225 -0
  11. data/Rakefile +26 -0
  12. data/eaco.gemspec +27 -0
  13. data/features/active_record.example.yml +8 -0
  14. data/features/active_record.travis.yml +7 -0
  15. data/features/rails_integration.feature +10 -0
  16. data/features/step_definitions/database.rb +7 -0
  17. data/features/step_definitions/resource_authorization.rb +15 -0
  18. data/features/support/env.rb +9 -0
  19. data/gemfiles/rails_3.2.gemfile +9 -0
  20. data/gemfiles/rails_4.0.gemfile +8 -0
  21. data/gemfiles/rails_4.1.gemfile +8 -0
  22. data/gemfiles/rails_4.2.gemfile +8 -0
  23. data/lib/eaco.rb +93 -0
  24. data/lib/eaco/acl.rb +206 -0
  25. data/lib/eaco/actor.rb +86 -0
  26. data/lib/eaco/adapters.rb +14 -0
  27. data/lib/eaco/adapters/active_record.rb +70 -0
  28. data/lib/eaco/adapters/active_record/compatibility.rb +83 -0
  29. data/lib/eaco/adapters/active_record/compatibility/v32.rb +27 -0
  30. data/lib/eaco/adapters/active_record/compatibility/v40.rb +59 -0
  31. data/lib/eaco/adapters/active_record/compatibility/v41.rb +16 -0
  32. data/lib/eaco/adapters/active_record/compatibility/v42.rb +17 -0
  33. data/lib/eaco/adapters/active_record/postgres_jsonb.rb +36 -0
  34. data/lib/eaco/adapters/couchrest_model.rb +37 -0
  35. data/lib/eaco/adapters/couchrest_model/couchdb_lucene.rb +71 -0
  36. data/lib/eaco/controller.rb +158 -0
  37. data/lib/eaco/cucumber.rb +11 -0
  38. data/lib/eaco/cucumber/active_record.rb +163 -0
  39. data/lib/eaco/cucumber/active_record/department.rb +19 -0
  40. data/lib/eaco/cucumber/active_record/document.rb +18 -0
  41. data/lib/eaco/cucumber/active_record/position.rb +21 -0
  42. data/lib/eaco/cucumber/active_record/schema.rb +36 -0
  43. data/lib/eaco/cucumber/active_record/user.rb +24 -0
  44. data/lib/eaco/cucumber/world.rb +136 -0
  45. data/lib/eaco/designator.rb +264 -0
  46. data/lib/eaco/dsl.rb +40 -0
  47. data/lib/eaco/dsl/acl.rb +163 -0
  48. data/lib/eaco/dsl/actor.rb +139 -0
  49. data/lib/eaco/dsl/actor/designators.rb +110 -0
  50. data/lib/eaco/dsl/base.rb +52 -0
  51. data/lib/eaco/dsl/resource.rb +129 -0
  52. data/lib/eaco/dsl/resource/permissions.rb +131 -0
  53. data/lib/eaco/error.rb +36 -0
  54. data/lib/eaco/railtie.rb +46 -0
  55. data/lib/eaco/rake.rb +10 -0
  56. data/lib/eaco/rake/default_task.rb +164 -0
  57. data/lib/eaco/resource.rb +234 -0
  58. data/lib/eaco/version.rb +7 -0
  59. data/spec/eaco/acl_spec.rb +147 -0
  60. data/spec/eaco/actor_spec.rb +13 -0
  61. data/spec/eaco/adapters/active_record/postgres_jsonb_spec.rb +9 -0
  62. data/spec/eaco/adapters/active_record_spec.rb +13 -0
  63. data/spec/eaco/adapters/couchrest_model/couchdb_lucene_spec.rb +9 -0
  64. data/spec/eaco/adapters/couchrest_model_spec.rb +9 -0
  65. data/spec/eaco/controller_spec.rb +12 -0
  66. data/spec/eaco/designator_spec.rb +25 -0
  67. data/spec/eaco/dsl/acl_spec.rb +9 -0
  68. data/spec/eaco/dsl/actor/designators_spec.rb +7 -0
  69. data/spec/eaco/dsl/actor_spec.rb +15 -0
  70. data/spec/eaco/dsl/resource/permissions_spec.rb +7 -0
  71. data/spec/eaco/dsl/resource_spec.rb +17 -0
  72. data/spec/eaco/error_spec.rb +9 -0
  73. data/spec/eaco/resource_spec.rb +31 -0
  74. data/spec/eaco_spec.rb +49 -0
  75. data/spec/spec_helper.rb +71 -0
  76. metadata +296 -0
@@ -0,0 +1,7 @@
1
+ module Eaco
2
+
3
+ # Current version
4
+ #
5
+ VERSION = '0.5.0'
6
+
7
+ end
@@ -0,0 +1,147 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::ACL do
6
+
7
+ describe '#initialize' do
8
+ subject { described_class.new(plain_acl) }
9
+
10
+ let(:plain_acl) { Hash['user:42' => 'reader', 'group:fropper' => 'editor'] }
11
+
12
+ it { expect(subject).to be_a(described_class) }
13
+ it { expect(subject).to eq({'user:42' => :reader, 'group:fropper' => :editor}) }
14
+ end
15
+
16
+ describe '#add' do
17
+ let(:designator) { Eaco::Designator.new 'test' }
18
+
19
+ subject { acl.add(:reader, designator) }
20
+
21
+ context 'when adding non-existing permissions' do
22
+ let(:acl) { described_class.new }
23
+
24
+ it { expect(subject).to be_a(described_class) }
25
+ it { expect(subject).to include({designator => :reader}) }
26
+ end
27
+
28
+ context 'when replacing existing permissions' do
29
+ let(:acl) { described_class.new(designator => :editor) }
30
+
31
+ it { expect(subject).to be_a(described_class) }
32
+ it { expect(subject).to include({designator => :reader}) }
33
+ end
34
+ end
35
+
36
+ describe '#del' do
37
+ let(:designator) { Eaco::Designator.new 'test' }
38
+
39
+ subject { acl.del(designator) }
40
+
41
+ context 'when removing non-existing permissions' do
42
+ let(:acl) { described_class.new }
43
+ it { expect(subject).to eq({}) }
44
+ end
45
+
46
+ context 'when removing existing permissions' do
47
+ let(:acl) { described_class.new(designator => :editor) }
48
+ it { expect(subject).to eq({}) }
49
+ end
50
+ end
51
+
52
+ describe '#find_by_role' do
53
+ let(:reader1) { Eaco::Designator.new 'Tom.Fropp' }
54
+ let(:reader2) { Eaco::Designator.new 'Bob.Prutz' }
55
+ let(:editor) { Eaco::Designator.new 'Jake.Boon' }
56
+
57
+ let(:acl) do
58
+ described_class.new({
59
+ reader1 => :reader,
60
+ reader2 => :reader,
61
+ editor => :editor,
62
+ })
63
+ end
64
+
65
+ context 'when looking up valid roles' do
66
+ subject { acl.find_by_role(:reader) }
67
+
68
+ it { expect(subject).to eq(Set.new([reader1, reader2])) }
69
+ end
70
+
71
+ context 'when looking up nonexisting roles' do
72
+ subject { acl.find_by_role(:froober) }
73
+
74
+ it { expect(subject).to eq(Set.new) }
75
+ end
76
+ end
77
+
78
+ describe '#all' do
79
+ let(:reader) { Eaco::Designator.new 'John.Loom' }
80
+ let(:editor) { Eaco::Designator.new 'Mark.Poof' }
81
+
82
+ let(:acl) do
83
+ described_class.new({
84
+ reader => :reader,
85
+ editor => :editor,
86
+ })
87
+ end
88
+
89
+ subject { acl.all }
90
+
91
+ it { expect(subject).to eq(Set.new([reader, editor])) }
92
+ end
93
+
94
+ describe '#designators_map_for_role' do
95
+ let(:reader) { Eaco::Designator.new 'Pete.Raid' }
96
+ let(:editor1) { Eaco::Designator.new 'John.Alls' }
97
+ let(:editor2) { Eaco::Designator.new 'Bob.Prutz' }
98
+
99
+ let(:acl) do
100
+ described_class.new({
101
+ reader => :reader,
102
+ editor1 => :editor,
103
+ editor2 => :editor,
104
+ })
105
+ end
106
+
107
+ subject { acl.designators_map_for_role(:editor) }
108
+
109
+ before do
110
+ expect(editor1).to receive(:resolve) { ['John Alls'] }
111
+ expect(editor2).to receive(:resolve) { ['Robert Prutzon'] }
112
+ end
113
+
114
+ example do
115
+ expect(subject).to eq({
116
+ editor1 => Set.new(['John Alls']),
117
+ editor2 => Set.new(['Robert Prutzon'])
118
+ })
119
+ end
120
+ end
121
+
122
+ describe '#actors_by_role' do
123
+ let(:reader) { Eaco::Designator.new 'Pete.Raid' }
124
+ let(:editor1) { Eaco::Designator.new 'John.Alls' }
125
+ let(:editor2) { Eaco::Designator.new 'Bob.Prutz' }
126
+
127
+ let(:acl) do
128
+ described_class.new({
129
+ reader => :reader,
130
+ editor1 => :editor,
131
+ editor2 => :editor,
132
+ })
133
+ end
134
+
135
+ subject { acl.actors_by_role(:editor) }
136
+
137
+ before do
138
+ expect(editor1).to receive(:resolve) { ['John Alls'] }
139
+ expect(editor2).to receive(:resolve) { ['Robert Prutzon'] }
140
+ end
141
+
142
+ example do
143
+ expect(subject).to eq(['John Alls', 'Robert Prutzon'])
144
+ end
145
+ end
146
+
147
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::Actor do
6
+
7
+ pending '#designators'
8
+
9
+ pending '#is_admin?'
10
+
11
+ pending '#can?'
12
+
13
+ end
@@ -0,0 +1,9 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::Adapters::ActiveRecord::PostgresJSONb do
6
+
7
+ pending '.accessible_by'
8
+
9
+ end
@@ -0,0 +1,13 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::Adapters::ActiveRecord do
6
+
7
+ pending '.included'
8
+
9
+ pending '#acl'
10
+
11
+ pending '#acl='
12
+
13
+ end
@@ -0,0 +1,9 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::Adapters::CouchrestModel::CouchDBLucene do
6
+
7
+ pending '.accessible_by'
8
+
9
+ end
@@ -0,0 +1,9 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::Adapters::CouchrestModel do
6
+
7
+ pending '.included'
8
+
9
+ end
@@ -0,0 +1,12 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+ require 'eaco/controller'
5
+
6
+ RSpec.describe Eaco::Controller do
7
+
8
+ pending '.authorize'
9
+
10
+ pending '.permission_for'
11
+
12
+ end
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::Designator do
6
+
7
+ pending '#make'
8
+
9
+ pending '#parse'
10
+
11
+ pending '#resolve'
12
+
13
+ pending '#configure!'
14
+
15
+ pending '#harvest'
16
+
17
+ pending '#label'
18
+
19
+ pending '#id'
20
+
21
+ pending '#search'
22
+
23
+ pending '#new'
24
+
25
+ end
@@ -0,0 +1,9 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::DSL::ACL do
6
+
7
+ pending '#new'
8
+
9
+ end
@@ -0,0 +1,7 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::DSL::Actor::Designators do
6
+
7
+ end
@@ -0,0 +1,15 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::DSL::Actor do
6
+
7
+ pending '#new'
8
+
9
+ pending '#designators'
10
+
11
+ pending '#admin_logic'
12
+
13
+ pending '.find_designator'
14
+
15
+ end
@@ -0,0 +1,7 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::DSL::Resource::Permissions do
6
+
7
+ end
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::DSL::Resource do
6
+
7
+ pending '#new'
8
+
9
+ pending '#permissions'
10
+
11
+ pending '#roles'
12
+
13
+ pending '#roles_priority'
14
+
15
+ pending '#roles_with_labels'
16
+
17
+ end
@@ -0,0 +1,9 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::Error do
6
+
7
+ pending '#new'
8
+
9
+ end
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco::Resource do
6
+
7
+ pending '.role?'
8
+
9
+ pending '.allows?'
10
+
11
+ pending '.role_of'
12
+
13
+ pending '.permissions'
14
+
15
+ pending '.roles'
16
+
17
+ pending '.roles_priority'
18
+
19
+ pending '.roles_with_labels'
20
+
21
+ pending '#allows?'
22
+
23
+ pending '#role_of'
24
+
25
+ pending '#grant'
26
+
27
+ pending '#revoke'
28
+
29
+ pending '#batch_grant'
30
+
31
+ end
data/spec/eaco_spec.rb ADDED
@@ -0,0 +1,49 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Eaco do
6
+
7
+ describe '.parse_default_rules_file!' do
8
+ subject { Eaco.parse_default_rules_file! }
9
+
10
+ before { expect(Eaco).to receive(:parse_rules!).with(Eaco::DEFAULT_RULES) }
11
+
12
+ it { expect(subject).to be(nil) }
13
+ end
14
+
15
+
16
+ describe '.parse_rules!' do
17
+ subject { Eaco.parse_rules! file }
18
+
19
+ context 'when the file does exist' do
20
+ let(:file) { double() }
21
+
22
+ before do
23
+ expect(file).to receive(:exist?).and_return(true)
24
+ expect(file).to receive(:read).and_return('')
25
+ expect(file).to receive(:realpath).and_return('test')
26
+ end
27
+
28
+ it { expect(subject).to be(true) }
29
+ end
30
+
31
+ context 'when the file does not exist' do
32
+ let(:file) { Pathname('/nonexistant') }
33
+
34
+ it { expect { subject }.to raise_error(Eaco::Malformed, /Please create \/nonexistant/) }
35
+ end
36
+ end
37
+
38
+ describe '.eval!' do
39
+ let(:source) { '' }
40
+ let(:path) { '' }
41
+
42
+ subject { Eaco.eval! source, path }
43
+
44
+ before { expect(Eaco::DSL).to receive(:eval).with(source, nil, path, 1) }
45
+
46
+ it { expect(subject).to be(true) }
47
+ end
48
+
49
+ end
@@ -0,0 +1,71 @@
1
+ require 'rspec'
2
+ require 'eaco'
3
+ require 'byebug'
4
+
5
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
6
+ #
7
+ RSpec.configure do |config|
8
+
9
+ config.expect_with :rspec do |expectations|
10
+ # This option will default to `true` in RSpec 4. It makes the `description`
11
+ # and `failure_message` of custom matchers include text for helper methods
12
+ # defined using `chain`, e.g.:
13
+ # be_bigger_than(2).and_smaller_than(4).description
14
+ # # => "be bigger than 2 and smaller than 4"
15
+ # ...rather than:
16
+ # # => "be bigger than 2"
17
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
18
+ end
19
+
20
+ config.mock_with :rspec do |mocks|
21
+ # Prevents you from mocking or stubbing a method that does not exist on
22
+ # a real object. This is generally recommended, and will default to
23
+ # `true` in RSpec 4.
24
+ mocks.verify_partial_doubles = true
25
+ end
26
+
27
+ # These two settings work together to allow you to limit a spec run
28
+ # to individual examples or groups you care about by tagging them with
29
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
30
+ # get run.
31
+ config.filter_run :focus
32
+ config.run_all_when_everything_filtered = true
33
+
34
+ # Limits the available syntax to the non-monkey patched syntax that is
35
+ # recommended. For more details, see:
36
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
37
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
38
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
39
+ config.disable_monkey_patching!
40
+
41
+ # This setting enables warnings. It's recommended, but in some cases may
42
+ # be too noisy due to issues in dependencies.
43
+ config.warnings = true
44
+
45
+ # Many RSpec users commonly either run the entire suite or an individual
46
+ # file, and it's useful to allow more verbose output when running an
47
+ # individual spec file.
48
+ if config.files_to_run.one?
49
+ # Use the documentation formatter for detailed output,
50
+ # unless a formatter has already been configured
51
+ # (e.g. via a command-line flag).
52
+ config.default_formatter = 'doc'
53
+ end
54
+
55
+ # Print the 5 slowest examples and example groups at the
56
+ # end of the spec run, to help surface which specs are running
57
+ # particularly slow.
58
+ config.profile_examples = 5
59
+
60
+ # Run specs in random order to surface order dependencies. If you find an
61
+ # order dependency and want to debug it, you can fix the order by providing
62
+ # the seed, which is printed after each run.
63
+ # --seed 1234
64
+ config.order = :random
65
+
66
+ # Seed global randomization in this process using the `--seed` CLI option.
67
+ # Setting this allows you to use `--seed` to deterministically reproduce
68
+ # test failures related to randomization by passing the same `--seed` value
69
+ # as the one that triggered the failure.
70
+ Kernel.srand config.seed
71
+ end