policy 1.0.5 → 1.1.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 +4 -4
- data/.metrics +5 -2
- data/Guardfile +2 -0
- data/README.md +14 -0
- data/bin/policy +16 -0
- data/lib/policy/cli/locale.erb +14 -0
- data/lib/policy/cli/policy.erb +29 -0
- data/lib/policy/cli/spec.erb +30 -0
- data/lib/policy/cli.rb +85 -0
- data/lib/policy/version.rb +1 -1
- data/policy.gemspec +3 -1
- data/spec/tests/bin/policy_spec.rb +18 -0
- data/spec/tests/policy/cli_spec.rb +127 -0
- metadata +29 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c43acc2f25d6b3056f4702697e77e317b6aca3e2
|
4
|
+
data.tar.gz: b79816c8eb97f48bfab2e17269942b88bec0f3f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de03f24c1ef2c65f67e6ad2a1f10c62da9e9cb31e47fa4860ed4e38fa02b887777bea518a885cd5a5ddd447e5292990b422fb8740344f79a1d66f2bee82b8ce4
|
7
|
+
data.tar.gz: 0903e3428ce0f25221340ff9f9ea7919f32f811204448da80cbd31f697e75b7f846e2116a4d2bc7be7a8d1759d9df0bc7de1b82216c52ca75d908677ee5a4544
|
data/.metrics
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Settings for metric_fu and its packages are collected in the `config/metrics`
|
2
2
|
# and loaded by the Hexx::Suit::Metrics::MetricFu.
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
begin
|
5
|
+
require "hexx-suit"
|
6
|
+
Hexx::Suit::Metrics::MetricFu.load
|
7
|
+
rescue LoadError
|
8
|
+
end
|
data/Guardfile
CHANGED
data/README.md
CHANGED
@@ -101,6 +101,20 @@ end
|
|
101
101
|
|
102
102
|
Note a policy knows nothing about the complex nature of its attributes until their quack like transactions with `#sum` method defined.
|
103
103
|
|
104
|
+
### Scaffolding a Policy
|
105
|
+
|
106
|
+
You can scaffold the policy with its specification and necessary translations using the generator:
|
107
|
+
|
108
|
+
```
|
109
|
+
policy new
|
110
|
+
```
|
111
|
+
|
112
|
+
For a list of available options call the generator with a `-h` option:
|
113
|
+
|
114
|
+
```
|
115
|
+
policy new -h
|
116
|
+
```
|
117
|
+
|
104
118
|
[Struct]: http://ruby-doc.org//core-2.2.0/Struct.html
|
105
119
|
[ActiveModel::Validations]: http://apidock.com/rails/ActiveModel/Validations
|
106
120
|
|
data/bin/policy
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "policy/cli"
|
3
|
+
|
4
|
+
# Scaffolders runner from the command line
|
5
|
+
class CLI < Thor
|
6
|
+
|
7
|
+
register(
|
8
|
+
Policy::CLI,
|
9
|
+
"new",
|
10
|
+
"new NAME[ -a attribute[ attribute]][ -l en[ ru]][ -n namespace]",
|
11
|
+
"Scaffolds a policy object with a specification and translations."
|
12
|
+
)
|
13
|
+
|
14
|
+
end # class CLI
|
15
|
+
|
16
|
+
CLI.start
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# Translations for error messages, generated by policy objects of type:
|
3
|
+
# <%= policy.type %>
|
4
|
+
---
|
5
|
+
# <%= @locale %>:
|
6
|
+
# activemodel:
|
7
|
+
# errors:
|
8
|
+
# models:
|
9
|
+
# <%= policy.path %>:
|
10
|
+
# attributes:
|
11
|
+
# base:
|
12
|
+
<% attributes.each do |item| -%>
|
13
|
+
# <%= item %>:
|
14
|
+
<% end -%>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
<% tabs = 0 -%>
|
3
|
+
<% policy.namespaces.each do |item| -%>
|
4
|
+
|
5
|
+
<%= " " * tabs %>module <%= item %>
|
6
|
+
<% tabs += 1 -%>
|
7
|
+
<% end -%>
|
8
|
+
|
9
|
+
<%= " " * tabs %># Implements the following policy (invariant):
|
10
|
+
<%= " " * tabs %>#
|
11
|
+
<%= " " * tabs %># @todo: describe the policy
|
12
|
+
<%= " " * tabs %>#
|
13
|
+
<%= " " * tabs %># @example
|
14
|
+
<%= " " * tabs %># <%= policy.type %>.new(<%= attributes.join(", ") %>)
|
15
|
+
<%= " " * tabs %>#
|
16
|
+
<% attributes.each do |item| -%>
|
17
|
+
<%= " " * tabs %># @param [@todo] <%= item %>
|
18
|
+
<%= " " * tabs %># @todo: describe the attribute
|
19
|
+
<% end -%>
|
20
|
+
<%= " " * tabs %>class <%= policy.const %> < Hexx::Policy.new(<%= attributes.map { |item| ":#{ item }" }.join(", ") %>)
|
21
|
+
|
22
|
+
<%= " " * tabs %> # Define necessary validations using `validates` or `validate` declarations.
|
23
|
+
|
24
|
+
<%= " " * tabs %>end # class <%= policy.const %>
|
25
|
+
<% policy.namespaces.reverse.each do |item| -%>
|
26
|
+
|
27
|
+
<% tabs -= 1 -%>
|
28
|
+
<%= " " * tabs %>end # module <%= item %>
|
29
|
+
<% end -%>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe <%= policy.type %> do
|
4
|
+
|
5
|
+
# The specification checks whether the policy object is valid or not,
|
6
|
+
# depending on values of its attributes.
|
7
|
+
|
8
|
+
# default attributes for a valid policy
|
9
|
+
<% attributes.each do |item| -%>
|
10
|
+
# let(:<%= item %>) { @todo }
|
11
|
+
<% end -%>
|
12
|
+
|
13
|
+
subject { described_class.new <%= attributes.join(", ") %> }
|
14
|
+
|
15
|
+
context "when @todo: describe the context" do
|
16
|
+
|
17
|
+
it { is_expected.to be_valid }
|
18
|
+
|
19
|
+
end # context
|
20
|
+
<% attributes.each do |item| -%>
|
21
|
+
|
22
|
+
context "when <%= item %> @todo" do
|
23
|
+
|
24
|
+
# let(:<%= item %>) { @todo }
|
25
|
+
it { is_expected.not_to be_valid }
|
26
|
+
|
27
|
+
end # context
|
28
|
+
<% end -%>
|
29
|
+
|
30
|
+
end # describe <%= policy.type %>
|
data/lib/policy/cli.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "hexx-cli"
|
3
|
+
|
4
|
+
module Policy
|
5
|
+
|
6
|
+
# Scaffolds a policy with a specification and translations
|
7
|
+
class CLI < Hexx::CLI::Base
|
8
|
+
|
9
|
+
# @private
|
10
|
+
def self.source_root
|
11
|
+
::File.expand_path "../cli", __FILE__
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "Scaffolds a policy object with a specification and translations."
|
15
|
+
namespace :new
|
16
|
+
|
17
|
+
argument(
|
18
|
+
:name,
|
19
|
+
banner: "NAME",
|
20
|
+
desc: "The name of the policy.",
|
21
|
+
type: :string
|
22
|
+
)
|
23
|
+
|
24
|
+
class_option(
|
25
|
+
:attributes,
|
26
|
+
aliases: %w(-a),
|
27
|
+
banner: " debet credit",
|
28
|
+
default: %w(),
|
29
|
+
desc: "The list of attributes of the policy (the order is essential).",
|
30
|
+
type: :array
|
31
|
+
)
|
32
|
+
|
33
|
+
class_option(
|
34
|
+
:namespace,
|
35
|
+
aliases: %w(-n),
|
36
|
+
banner: " policies financial",
|
37
|
+
default: %w(policies),
|
38
|
+
desc: "The namespace for the policy.",
|
39
|
+
type: :array
|
40
|
+
)
|
41
|
+
|
42
|
+
class_option(
|
43
|
+
:locales,
|
44
|
+
aliases: %w(-l),
|
45
|
+
banner: " en jp",
|
46
|
+
default: %w(en ru),
|
47
|
+
desc: "The list of locales for policy messages' translations.",
|
48
|
+
type: :array
|
49
|
+
)
|
50
|
+
|
51
|
+
# @private
|
52
|
+
def add_spec
|
53
|
+
template "spec.erb", "spec/tests/#{ policy.path }_spec.rb"
|
54
|
+
end
|
55
|
+
|
56
|
+
# @private
|
57
|
+
def add_policy
|
58
|
+
template "policy.erb", "app/#{ policy.path }.rb"
|
59
|
+
end
|
60
|
+
|
61
|
+
# @private
|
62
|
+
def add_locales
|
63
|
+
locales.each do |locale|
|
64
|
+
@locale = locale
|
65
|
+
template "locale.erb", "config/locales/#{ policy.path }/#{ locale }.yml"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def policy
|
72
|
+
@policy ||= Hexx::CLI::Name.new [options[:namespace], name].join("/")
|
73
|
+
end
|
74
|
+
|
75
|
+
def attributes
|
76
|
+
@attributes ||= options[:attributes].map(&:downcase)
|
77
|
+
end
|
78
|
+
|
79
|
+
def locales
|
80
|
+
@locales ||= options[:locales].map(&:downcase)
|
81
|
+
end
|
82
|
+
|
83
|
+
end # class CLI
|
84
|
+
|
85
|
+
end # module Policy
|
data/lib/policy/version.rb
CHANGED
data/policy.gemspec
CHANGED
@@ -13,6 +13,7 @@ Gem::Specification.new do |gem|
|
|
13
13
|
gem.license = "MIT"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
16
|
+
gem.executables = ["policy"]
|
16
17
|
gem.test_files = Dir["spec/**/*.rb"]
|
17
18
|
gem.extra_rdoc_files = Dir["README.md", "LICENSE"]
|
18
19
|
gem.require_paths = ["lib"]
|
@@ -20,6 +21,7 @@ Gem::Specification.new do |gem|
|
|
20
21
|
gem.required_ruby_version = "~> 2.0"
|
21
22
|
gem.add_runtime_dependency "activemodel", ">= 3.1"
|
22
23
|
gem.add_runtime_dependency "adamantium", "~> 0.2"
|
23
|
-
gem.
|
24
|
+
gem.add_runtime_dependency "hexx-cli", "~> 0.0"
|
25
|
+
gem.add_development_dependency "hexx-rspec", "~> 0.3"
|
24
26
|
|
25
27
|
end # Gem::Specification
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe "$ policy new", :sandbox, :capture do
|
4
|
+
|
5
|
+
let(:argv) { %w(foo) }
|
6
|
+
|
7
|
+
before { try_in_sandbox { `policy new #{ argv.join(" ") }` } }
|
8
|
+
|
9
|
+
it "runs a scaffolder" do
|
10
|
+
%w(
|
11
|
+
app/policies/foo.rb
|
12
|
+
config/locales/policies/foo/en.yml
|
13
|
+
config/locales/policies/foo/ru.yml
|
14
|
+
spec/tests/policies/foo_spec.rb
|
15
|
+
).each { |file| expect(file).to be_present_in_sandbox }
|
16
|
+
end
|
17
|
+
|
18
|
+
end # describe $ policy new
|
@@ -0,0 +1,127 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "policy/cli"
|
3
|
+
|
4
|
+
describe Policy::CLI, :sandbox, :capture do
|
5
|
+
|
6
|
+
describe ".start" do
|
7
|
+
|
8
|
+
subject { try_in_sandbox { described_class.start options } }
|
9
|
+
|
10
|
+
shared_examples "adding a policy" do |folder:|
|
11
|
+
|
12
|
+
let(:filename) { File.join("app", folder, "foo.rb") }
|
13
|
+
|
14
|
+
it "[creates file]" do
|
15
|
+
expect(filename).to be_present_in_sandbox
|
16
|
+
end
|
17
|
+
|
18
|
+
end # examples
|
19
|
+
|
20
|
+
shared_examples "adding a spec" do |folder:|
|
21
|
+
|
22
|
+
let(:filename) { File.join("spec/tests", folder, "foo_spec.rb") }
|
23
|
+
|
24
|
+
it "[creates file]" do
|
25
|
+
expect(filename).to be_present_in_sandbox
|
26
|
+
end
|
27
|
+
|
28
|
+
end # examples
|
29
|
+
|
30
|
+
shared_examples "adding locales" do |locales, folder:|
|
31
|
+
|
32
|
+
let(:dirname) { File.join("config/locales", folder, "foo") }
|
33
|
+
|
34
|
+
it "[creates files]" do
|
35
|
+
locales.each do |locale|
|
36
|
+
expect("#{ dirname }/#{ locale }.yml").to be_present_in_sandbox
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end # examples
|
41
|
+
|
42
|
+
context "foo" do
|
43
|
+
|
44
|
+
let(:options) { %w(foo) }
|
45
|
+
before { subject }
|
46
|
+
|
47
|
+
it_behaves_like "adding a policy", folder: "policies"
|
48
|
+
it_behaves_like "adding a spec", folder: "policies"
|
49
|
+
it_behaves_like "adding locales", %w(en ru), folder: "policies"
|
50
|
+
|
51
|
+
end # context
|
52
|
+
|
53
|
+
context "foo -a bar baz" do
|
54
|
+
|
55
|
+
let(:options) { %w(foo -a bar baz) }
|
56
|
+
before { subject }
|
57
|
+
|
58
|
+
it_behaves_like "adding a policy", folder: "policies"
|
59
|
+
it_behaves_like "adding a spec", folder: "policies"
|
60
|
+
it_behaves_like "adding locales", %w(en ru), folder: "policies"
|
61
|
+
|
62
|
+
it "adds attributes to the policy" do
|
63
|
+
content = read_in_sandbox "app/policies/foo.rb"
|
64
|
+
expect(content).to include "class Foo < Hexx::Policy.new(:bar, :baz)"
|
65
|
+
end
|
66
|
+
|
67
|
+
it "checks attributes" do
|
68
|
+
content = read_in_sandbox "spec/tests/policies/foo_spec.rb"
|
69
|
+
expect(content).to include "let(:bar) {"
|
70
|
+
expect(content).to include "let(:baz) {"
|
71
|
+
end
|
72
|
+
|
73
|
+
end # context
|
74
|
+
|
75
|
+
context "foo -n bar/baz" do
|
76
|
+
|
77
|
+
let(:options) { %w(foo -n bar/baz) }
|
78
|
+
before { subject }
|
79
|
+
|
80
|
+
it_behaves_like "adding a policy", folder: "bar/baz"
|
81
|
+
it_behaves_like "adding a spec", folder: "bar/baz"
|
82
|
+
it_behaves_like "adding locales", %w(en ru), folder: "bar/baz"
|
83
|
+
|
84
|
+
it "adds namespace to the policy" do
|
85
|
+
content = read_in_sandbox "app/bar/baz/foo.rb"
|
86
|
+
expect(content).to include "module Bar"
|
87
|
+
expect(content).to include " module Baz"
|
88
|
+
end
|
89
|
+
|
90
|
+
it "describes the specification" do
|
91
|
+
content = read_in_sandbox "spec/tests/bar/baz/foo_spec.rb"
|
92
|
+
expect(content).to include "describe Bar::Baz::Foo do"
|
93
|
+
end
|
94
|
+
|
95
|
+
it "creates the proper locale" do
|
96
|
+
content = read_in_sandbox "config/locales/bar/baz/foo/en.yml"
|
97
|
+
expect(content).to include "# en:"
|
98
|
+
expect(content).to include " bar/baz/foo:"
|
99
|
+
end
|
100
|
+
|
101
|
+
end # context
|
102
|
+
|
103
|
+
context "foo -n bar baz" do
|
104
|
+
|
105
|
+
let(:options) { %w(foo -n bar baz) }
|
106
|
+
before { subject }
|
107
|
+
|
108
|
+
it_behaves_like "adding a policy", folder: "bar/baz"
|
109
|
+
it_behaves_like "adding a spec", folder: "bar/baz"
|
110
|
+
it_behaves_like "adding locales", %w(en ru), folder: "bar/baz"
|
111
|
+
|
112
|
+
end # context
|
113
|
+
|
114
|
+
context "foo -l ua jp" do
|
115
|
+
|
116
|
+
let(:options) { %w(foo -l ua jp) }
|
117
|
+
before { subject }
|
118
|
+
|
119
|
+
it_behaves_like "adding a policy", folder: "policies"
|
120
|
+
it_behaves_like "adding a spec", folder: "policies"
|
121
|
+
it_behaves_like "adding locales", %w(ua jp), folder: "policies"
|
122
|
+
|
123
|
+
end # context
|
124
|
+
|
125
|
+
end # describe .start
|
126
|
+
|
127
|
+
end # describe Policy::CLI
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: policy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kozin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -38,23 +38,38 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: hexx-cli
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: hexx-rspec
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
61
|
+
version: '0.3'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0.
|
68
|
+
version: '0.3'
|
55
69
|
description: A tiny library implementing the Policy Object pattern.
|
56
70
|
email: andrew.kozin@gmail.com
|
57
|
-
executables:
|
71
|
+
executables:
|
72
|
+
- policy
|
58
73
|
extensions: []
|
59
74
|
extra_rdoc_files:
|
60
75
|
- README.md
|
@@ -72,6 +87,7 @@ files:
|
|
72
87
|
- LICENSE
|
73
88
|
- README.md
|
74
89
|
- Rakefile
|
90
|
+
- bin/policy
|
75
91
|
- config/metrics/STYLEGUIDE
|
76
92
|
- config/metrics/cane.yml
|
77
93
|
- config/metrics/churn.yml
|
@@ -85,6 +101,10 @@ files:
|
|
85
101
|
- config/metrics/simplecov.yml
|
86
102
|
- config/metrics/yardstick.yml
|
87
103
|
- lib/policy.rb
|
104
|
+
- lib/policy/cli.rb
|
105
|
+
- lib/policy/cli/locale.erb
|
106
|
+
- lib/policy/cli/policy.erb
|
107
|
+
- lib/policy/cli/spec.erb
|
88
108
|
- lib/policy/follower.rb
|
89
109
|
- lib/policy/follower/followed_policies.rb
|
90
110
|
- lib/policy/follower/followed_policy.rb
|
@@ -96,6 +116,8 @@ files:
|
|
96
116
|
- policy.gemspec
|
97
117
|
- spec/features/follower_spec.rb
|
98
118
|
- spec/spec_helper.rb
|
119
|
+
- spec/tests/bin/policy_spec.rb
|
120
|
+
- spec/tests/policy/cli_spec.rb
|
99
121
|
- spec/tests/policy/follower/followed_policies_spec.rb
|
100
122
|
- spec/tests/policy/follower/followed_policy_spec.rb
|
101
123
|
- spec/tests/policy/follower/names_spec.rb
|
@@ -131,6 +153,8 @@ summary: Policy Objects for Ruby.
|
|
131
153
|
test_files:
|
132
154
|
- spec/spec_helper.rb
|
133
155
|
- spec/tests/policy_spec.rb
|
156
|
+
- spec/tests/bin/policy_spec.rb
|
157
|
+
- spec/tests/policy/cli_spec.rb
|
134
158
|
- spec/tests/policy/follower_spec.rb
|
135
159
|
- spec/tests/policy/interface_spec.rb
|
136
160
|
- spec/tests/policy/validations_spec.rb
|