policy 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/Guardfile +4 -4
  3. data/README.md +177 -78
  4. data/config/metrics/flay.yml +1 -1
  5. data/config/metrics/roodi.yml +2 -2
  6. data/lib/policy.rb +52 -33
  7. data/lib/policy/base.rb +122 -0
  8. data/lib/policy/base/and.rb +38 -0
  9. data/lib/policy/base/negator.rb +52 -0
  10. data/lib/policy/base/node.rb +59 -0
  11. data/lib/policy/base/not.rb +42 -0
  12. data/lib/policy/base/or.rb +39 -0
  13. data/lib/policy/base/xor.rb +39 -0
  14. data/lib/policy/cli.rb +8 -3
  15. data/lib/policy/cli/attribute.rb +49 -0
  16. data/lib/policy/cli/locale.erb +1 -2
  17. data/lib/policy/cli/policy.erb +33 -6
  18. data/lib/policy/cli/spec.erb +31 -11
  19. data/lib/policy/follower.rb +54 -94
  20. data/lib/policy/follower/name_error.rb +53 -0
  21. data/lib/policy/follower/policies.rb +104 -0
  22. data/lib/policy/follower/violation_error.rb +60 -0
  23. data/lib/policy/version.rb +2 -2
  24. data/policy.gemspec +2 -3
  25. data/spec/support/composer.rb +28 -0
  26. data/spec/tests/lib/policy/base/and_spec.rb +62 -0
  27. data/spec/tests/lib/policy/base/negator_spec.rb +49 -0
  28. data/spec/tests/lib/policy/base/not_spec.rb +50 -0
  29. data/spec/tests/lib/policy/base/or_spec.rb +62 -0
  30. data/spec/tests/lib/policy/base/xor_spec.rb +73 -0
  31. data/spec/tests/lib/policy/base_spec.rb +123 -0
  32. data/spec/tests/lib/policy/cli/attribute_spec.rb +52 -0
  33. data/spec/tests/{policy → lib/policy}/cli_spec.rb +25 -24
  34. data/spec/tests/lib/policy/follower/name_error_spec.rb +51 -0
  35. data/spec/tests/lib/policy/follower/policies_spec.rb +156 -0
  36. data/spec/tests/lib/policy/follower/violation_error_spec.rb +60 -0
  37. data/spec/tests/lib/policy/follower_spec.rb +153 -0
  38. data/spec/tests/lib/policy_spec.rb +52 -0
  39. metadata +43 -44
  40. data/lib/policy/follower/followed_policies.rb +0 -45
  41. data/lib/policy/follower/followed_policy.rb +0 -104
  42. data/lib/policy/follower/names.rb +0 -29
  43. data/lib/policy/interface.rb +0 -48
  44. data/lib/policy/validations.rb +0 -28
  45. data/lib/policy/violation_error.rb +0 -52
  46. data/spec/features/follower_spec.rb +0 -95
  47. data/spec/tests/policy/follower/followed_policies_spec.rb +0 -87
  48. data/spec/tests/policy/follower/followed_policy_spec.rb +0 -117
  49. data/spec/tests/policy/follower/names_spec.rb +0 -19
  50. data/spec/tests/policy/follower_spec.rb +0 -220
  51. data/spec/tests/policy/interface_spec.rb +0 -83
  52. data/spec/tests/policy/validations_spec.rb +0 -13
  53. data/spec/tests/policy/violation_error_spec.rb +0 -75
  54. data/spec/tests/policy_spec.rb +0 -35
@@ -1,83 +0,0 @@
1
- # encoding: utf-8
2
-
3
- describe Policy::Interface do
4
-
5
- before { Test = Class.new.send :include, described_class }
6
- after { Object.send :remove_const, :Test }
7
-
8
- let(:test_class) { Test }
9
- subject { test_class.new }
10
-
11
- it "includes Policy::Validations" do
12
- expect(test_class).to include Policy::Validations
13
- end
14
-
15
- describe "#apply" do
16
-
17
- context "when #valid? returns true" do
18
-
19
- before { allow(subject).to receive(:valid?).and_return true }
20
-
21
- it "doesn't raise error" do
22
- expect { subject.apply }.not_to raise_error
23
- end
24
- end
25
-
26
- context "when #valid? returns false" do
27
-
28
- before { allow(subject).to receive(:valid?).and_return false }
29
-
30
- it "raises ViolationError" do
31
- expect { subject.apply }.to raise_error(Policy::ViolationError)
32
- end
33
-
34
- it "adds the policy to Exception" do
35
- expect(Policy::ViolationError).to receive(:new).with(subject).once
36
- subject.apply rescue nil
37
- end
38
- end
39
-
40
- end # describe #apply
41
-
42
- describe "#messages" do
43
-
44
- context "when #errors are present" do
45
-
46
- let(:messages) { %w(foo bar) }
47
- let(:errors) { double :errors, messages: { foo: messages } }
48
-
49
- it "extracts a plain array of error messages" do
50
- allow(subject).to receive(:errors) { errors }
51
- expect(subject.messages).to eq messages
52
- end
53
-
54
- end # context
55
-
56
- context "when #errors are absent" do
57
-
58
- it "returns an empty array" do
59
- expect(subject.messages).to eq []
60
- end
61
-
62
- end # context
63
-
64
- end # describe #messages
65
-
66
- describe ".apply" do
67
-
68
- let(:attributes) { %i(foo bar) }
69
- let(:follower) { double apply: nil }
70
-
71
- it "creates a policy object with the attributes" do
72
- expect(test_class).to receive(:new).with(attributes) { follower }
73
- test_class.apply attributes
74
- end
75
-
76
- it "validates the policy object" do
77
- expect(test_class).to receive_message_chain :new, :apply
78
- test_class.apply attributes
79
- end
80
-
81
- end # describe .apply
82
-
83
- end # describe Policy::Inteface
@@ -1,13 +0,0 @@
1
- # encoding: utf-8
2
-
3
- describe Policy::Validations do
4
-
5
- let(:validations) { ActiveModel::Validations }
6
- let(:methods) { validations.public_instance_methods }
7
- let(:test_class) { Class.new.send :include, described_class }
8
-
9
- it "includes ActiveModel::Validatons" do
10
- expect(test_class).to include validations
11
- end
12
-
13
- end
@@ -1,75 +0,0 @@
1
- # encoding: utf-8
2
- require "ostruct"
3
-
4
- describe Policy::ViolationError do
5
-
6
- # OpenStruct is used instead of double because it should be frozen
7
- let(:policy) { OpenStruct.new(messages: ["foo"]) }
8
-
9
- subject { described_class.new policy }
10
-
11
- describe ".new" do
12
-
13
- it "takes a policy" do
14
- expect { described_class.new }.to raise_error ArgumentError
15
- expect { subject }.not_to raise_error
16
- end
17
-
18
- it "is a RuntimeError" do
19
- expect(subject).to be_kind_of RuntimeError
20
- end
21
-
22
- it "is immutable" do
23
- expect(subject).to be_frozen
24
- end
25
-
26
- end # describe .new
27
-
28
- describe "#policy" do
29
-
30
- it "returns the policy" do
31
- expect(subject.policy).to eq policy
32
- end
33
-
34
- it "is immutable" do
35
- expect(subject.policy).to be_frozen
36
- end
37
-
38
- it "doesn't freeze the source policy object" do
39
- subject
40
- expect(policy).not_to be_frozen
41
- end
42
-
43
- end # describe #policy
44
-
45
- describe "#messages" do
46
-
47
- it "delegated to the policy" do
48
- expect(subject.messages).to eq subject.policy.messages
49
- end
50
-
51
- it "is immutable" do
52
- expect(subject.messages).to be_frozen
53
- end
54
-
55
- end # describe #messages
56
-
57
- describe "#inspect" do
58
-
59
- it "returns a proper text" do
60
- expect(subject.inspect)
61
- .to eq "#<Policy::ViolationError: #{ subject.message }>"
62
- end
63
-
64
- end # describe #inspect
65
-
66
- describe "#message" do
67
-
68
- it "returns a proper text" do
69
- expect(subject.message)
70
- .to eq "#{ policy.inspect } violated: #{ subject.messages }"
71
- end
72
-
73
- end # describe #message
74
-
75
- end # describe Policy::ViolationError
@@ -1,35 +0,0 @@
1
- # encoding: utf-8
2
-
3
- describe Policy do
4
-
5
- describe ".new" do
6
-
7
- subject { described_class.new :debet, :credit }
8
-
9
- it "builds the Struct" do
10
- expect(subject.ancestors).to include Struct
11
- end
12
-
13
- it "adds required attributes" do
14
- methods = subject.instance_methods
15
-
16
- %i(debet debet= credit credit=).each do |method|
17
- expect(methods).to include method
18
- end
19
- end
20
-
21
- it "includes Policy::Interface" do
22
- expect(subject).to include(Policy::Interface)
23
- end
24
-
25
- end # describe .new
26
-
27
- describe ".name" do
28
-
29
- subject { described_class.name }
30
-
31
- it { is_expected.to eq "Policy" }
32
-
33
- end
34
-
35
- end # describe Policy