hexx 7.1.0 → 8.0.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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +2 -0
  3. data/.gitignore +9 -0
  4. data/.metrics +5 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.yml +2 -63
  7. data/.travis.yml +5 -0
  8. data/.yardopts +2 -0
  9. data/Gemfile +3 -0
  10. data/Guardfile +16 -0
  11. data/{LICENSE.rdoc → LICENSE} +2 -2
  12. data/README.md +138 -0
  13. data/Rakefile +8 -14
  14. data/config/initializer.rb +5 -0
  15. data/config/initializers/capture.rb +19 -0
  16. data/config/initializers/sandbox.rb +16 -0
  17. data/config/initializers/sandbox/helpers.rb +38 -0
  18. data/config/initializers/sandbox/matchers.rb +19 -0
  19. data/config/metrics/STYLEGUIDE +230 -0
  20. data/config/metrics/cane.yml +5 -0
  21. data/config/metrics/churn.yml +6 -0
  22. data/config/metrics/flay.yml +2 -0
  23. data/config/metrics/metric_fu.yml +15 -0
  24. data/config/metrics/pippi.yml +3 -0
  25. data/config/metrics/reek.yml +1 -0
  26. data/config/metrics/roodi.yml +24 -0
  27. data/config/metrics/rubocop.yml +79 -0
  28. data/config/metrics/saikuro.yml +3 -0
  29. data/config/metrics/simplecov.yml +6 -0
  30. data/config/metrics/yardstick.yml +37 -0
  31. data/hexx.gemspec +24 -0
  32. data/lib/hexx.rb +8 -15
  33. data/lib/hexx/generator.rb +71 -0
  34. data/lib/hexx/generator/file.rb +83 -0
  35. data/lib/hexx/generator/folder.rb +68 -0
  36. data/lib/hexx/name.rb +122 -46
  37. data/lib/hexx/version.rb +6 -5
  38. data/spec/fixtures/root/_.beta +1 -0
  39. data/spec/fixtures/root/__omega +0 -0
  40. data/spec/fixtures/root/delta.erb.erb +0 -0
  41. data/spec/fixtures/root/gamma.rb.erb +1 -0
  42. data/spec/fixtures/root/subfolder/alfa.yml +0 -0
  43. data/spec/spec_helper.rb +5 -10
  44. data/spec/tests/lib/generator_spec.rb +126 -0
  45. data/spec/tests/lib/name_spec.rb +113 -0
  46. metadata +54 -168
  47. data/README.rdoc +0 -371
  48. data/lib/hexx/coercible.rb +0 -43
  49. data/lib/hexx/configurable.rb +0 -101
  50. data/lib/hexx/creators/base.rb +0 -103
  51. data/lib/hexx/creators/coercion.rb +0 -82
  52. data/lib/hexx/creators/dependency.rb +0 -87
  53. data/lib/hexx/creators/module_dependency.rb +0 -57
  54. data/lib/hexx/creators/parameter.rb +0 -40
  55. data/lib/hexx/dependable.rb +0 -51
  56. data/lib/hexx/helpers/exceptions.rb +0 -53
  57. data/lib/hexx/helpers/messages.rb +0 -26
  58. data/lib/hexx/helpers/parameters.rb +0 -47
  59. data/lib/hexx/helpers/validations.rb +0 -21
  60. data/lib/hexx/message.rb +0 -79
  61. data/lib/hexx/null.rb +0 -218
  62. data/lib/hexx/service.rb +0 -388
  63. data/lib/hexx/service/with_callbacks.rb +0 -104
  64. data/lib/hexx/service_invalid.rb +0 -73
  65. data/spec/hexx/coercible_spec.rb +0 -72
  66. data/spec/hexx/configurable_spec.rb +0 -93
  67. data/spec/hexx/dependable_spec.rb +0 -125
  68. data/spec/hexx/helpers/exceptions_spec.rb +0 -96
  69. data/spec/hexx/helpers/messages_spec.rb +0 -48
  70. data/spec/hexx/helpers/parameters_spec.rb +0 -96
  71. data/spec/hexx/helpers/validations_spec.rb +0 -32
  72. data/spec/hexx/message_spec.rb +0 -83
  73. data/spec/hexx/name_spec.rb +0 -80
  74. data/spec/hexx/null_spec.rb +0 -152
  75. data/spec/hexx/service_invalid_spec.rb +0 -46
  76. data/spec/hexx/service_spec.rb +0 -89
  77. data/spec/support/initializers/focus.rb +0 -5
  78. data/spec/support/initializers/garbage_collection.rb +0 -11
  79. data/spec/support/initializers/i18n.rb +0 -3
  80. data/spec/support/initializers/random_order.rb +0 -4
  81. data/spec/support/initializers/rspec.rb +0 -5
  82. data/spec/support/matchers/methods.rb +0 -11
@@ -1,73 +0,0 @@
1
- require_relative "message"
2
-
3
- module Hexx
4
-
5
- # The exception to be risen by invalid services.
6
- #
7
- # @example
8
- # service GetItem < Hexx::Service
9
- # allow_params :uuid
10
- # validates :uuid, presence: true
11
- # def run
12
- # validate!
13
- # end
14
- # end
15
- #
16
- # service = GetItem.new
17
- # service.run # => fails with the {Hexx::ServiceInvalid}.
18
- class ServiceInvalid < ::RuntimeError
19
-
20
- # @!attribute [r] service
21
- # @return [Hexx::Service] The invalid service object.
22
- attr_reader :service
23
-
24
- # @!scope class
25
- # @!method new(service)
26
- # Initializes the exception.
27
- #
28
- # @example
29
- # fail Hexx::ServiceInvalid.new service
30
- #
31
- # @param [Hexx::Service] service The invalid service.
32
- # @raise [ArgumentError] if the argument is not a service object.
33
- # @return [Hexx::ServiceInvalid] The exception.
34
-
35
- # @api hide
36
- def initialize(service)
37
- @service = service
38
- end
39
-
40
- # @!attribute [r] message
41
- # Returns a default text message for the exception.
42
- #
43
- # @example
44
- # error = Hexx::ServiceInvalid.new service
45
- # error.message # => "Service invalid: #<Hexx::Service... >"
46
- #
47
- # @return [String] The message.
48
- def message
49
- "Service invalid: #{ service.inspect }"
50
- end
51
-
52
- # @!attribute [r] messages
53
- # Returns a list of error messages from the service.
54
- #
55
- # @example
56
- # service.errors.add :base, "some error"
57
- #
58
- # error = Hexx::ServiceInvalid.new service
59
- # error.messages
60
- # # => [#<Hexx::Message @type="error" @text="some error" >]
61
- #
62
- # @return [Array<Hexx::Message>] The list of error messages.
63
- def messages
64
- errors.map { |text| Message.new type: "error", text: text }
65
- end
66
-
67
- private
68
-
69
- def errors
70
- service.errors.messages.values.flatten
71
- end
72
- end
73
- end
@@ -1,72 +0,0 @@
1
- require "spec_helper"
2
-
3
- module Hexx
4
- describe Coercible do
5
-
6
- # ==========================================================================
7
- # Prepare environment
8
- # ==========================================================================
9
-
10
- before { class TestModel; extend Coercible; end }
11
- before { module TestModule; end }
12
- before { class TestCoercion < Struct.new(:string); end }
13
-
14
- let(:test_model) { TestModel }
15
- let(:test_module) { TestModule }
16
- let(:test_coercion) { TestCoercion }
17
-
18
- after { Hexx.send :remove_const, :TestCoercion }
19
- after { Hexx.send :remove_const, :TestModule }
20
- after { Hexx.send :remove_const, :TestModel }
21
-
22
- # ==========================================================================
23
- # Run tests
24
- # ==========================================================================
25
-
26
- describe ".attr_coerced" do
27
-
28
- context "when the name is neither type nor symbol" do
29
-
30
- it "fails with TypeError" do
31
- expect { test_model.send :attr_coerced, 1, type: test_coercion }
32
- .to raise_error(TypeError)
33
- end
34
- end
35
-
36
- context "when the name is empty" do
37
-
38
- it "fails with ArgumentError" do
39
- expect { test_model.send :attr_coerced, "", type: test_coercion }
40
- .to raise_error(ArgumentError)
41
- end
42
- end
43
-
44
- context "when no type is set" do
45
-
46
- it "fails with ArgumentError" do
47
- expect { test_model.send :attr_coerced, :name }
48
- .to raise_error(ArgumentError)
49
- end
50
- end
51
-
52
- context "when a type is not a class" do
53
-
54
- it "fails with TypeError" do
55
- expect { test_model.send :attr_coerced, :name, type: test_module }
56
- .to raise_error(TypeError)
57
- end
58
- end
59
-
60
- context "with valid arguments" do
61
-
62
- before { test_model.send :attr_coerced, :name, type: test_coercion }
63
- subject { test_model.new }
64
-
65
- it "coerces an attribute with given type" do
66
- subject.name = "some name"
67
- expect(subject.name).to be_kind_of test_coercion
68
- end
69
- end
70
- end
71
- end
72
- end
@@ -1,93 +0,0 @@
1
- require "spec_helper"
2
-
3
- module Hexx
4
- describe Configurable do
5
-
6
- # Mocks gem core module to test dependencies from
7
- before { module Test; extend Configurable; end }
8
- after { Hexx.send :remove_const, :Test }
9
-
10
- let(:described_module) { Test }
11
-
12
- describe ".configure" do
13
-
14
- it "is defined" do
15
- expect(described_module).to respond_to :configure
16
- end
17
-
18
- it "yields block with self" do
19
- described_module.configure do |config|
20
- expect(config).to eq described_module
21
- end
22
- end
23
- end
24
-
25
- describe ".depends_on" do
26
-
27
- it "is defined" do
28
- expect(described_module).to respond_to :depends_on
29
- end
30
-
31
- it "accepts symbolic attributes" do
32
- expect { described_module.depends_on :item }.not_to raise_error
33
- end
34
-
35
- it "accepts string attributes" do
36
- expect { described_module.depends_on "item" }.not_to raise_error
37
- end
38
-
39
- it "accepts arrays" do
40
- expect { described_module.depends_on "item", [:item] }
41
- .not_to raise_error
42
- end
43
-
44
- it "accepts default option" do
45
- expect { described_module.depends_on :item, default: Hexx::Service }
46
- .not_to raise_error
47
- end
48
-
49
- it "fails when wrong object given" do
50
- expect { described_module.depends_on 1 }.to raise_error TypeError
51
- end
52
-
53
- it "fails when blank object given" do
54
- expect { described_module.depends_on "" }.to raise_error ArgumentError
55
- end
56
-
57
- it "adds dependencies getters" do
58
- described_module.depends_on :item, "user"
59
- expect(described_module).to respond_to :item
60
- expect(described_module).to respond_to :user
61
- end
62
-
63
- it "adds dependencies setters" do
64
- described_module.depends_on :item, "user"
65
- expect(described_module).to respond_to :item=
66
- expect(described_module).to respond_to :user=
67
- end
68
-
69
- context ":item" do
70
-
71
- before { described_module.depends_on :item }
72
-
73
- it "makes a setter to allow modules" do
74
- described_module.item = String
75
- expect(described_module.item).to eq String
76
- end
77
-
78
- it "makes a setter to require modules" do
79
- expect { described_module.item = :String }.to raise_error TypeError
80
- end
81
- end
82
-
83
- context ":item, default: Hexx::Service" do
84
-
85
- before { described_module.depends_on :item, default: Hexx::Service }
86
-
87
- it "sets default value for the item" do
88
- expect(described_module.item).to eq Hexx::Service
89
- end
90
- end
91
- end
92
- end
93
- end
@@ -1,125 +0,0 @@
1
- require "spec_helper"
2
-
3
- module Hexx
4
- describe Dependable do
5
-
6
- # ==========================================================================
7
- # Prepare environment
8
- # ==========================================================================
9
-
10
- before { class Test; extend Dependable; end }
11
- before { module TestModule; end }
12
- before { class TestClass; end }
13
-
14
- let(:described_class) { Test }
15
- let(:test_module) { TestModule }
16
- let(:test_class) { TestModule }
17
-
18
- after { Hexx.send :remove_const, :TestClass }
19
- after { Hexx.send :remove_const, :TestModule }
20
- after { Hexx.send :remove_const, :Test }
21
-
22
- # ==========================================================================
23
- # Run tests
24
- # ==========================================================================
25
-
26
- describe ".depends_on" do
27
-
28
- it "is private" do
29
- expect { described_class.depends_on :item }.to raise_error
30
- expect { described_class.send :depends_on, :item }.not_to raise_error
31
- end
32
-
33
- it "accepts string argument" do
34
- expect { described_class.send :depends_on, "item" }.not_to raise_error
35
- end
36
-
37
- it "requires non-empty argument" do
38
- expect { described_class.send :depends_on, "" }
39
- .to raise_error(ArgumentError)
40
- end
41
-
42
- it "requires string or symbol" do
43
- expect { described_class.send :depends_on, 1 }
44
- .to raise_error(TypeError)
45
- end
46
-
47
- it "accepts the :default option with class value" do
48
- expect { described_class.send :depends_on, :item, default: test_class }
49
- .not_to raise_error
50
- end
51
-
52
- it "accepts the :default option with module value" do
53
- expect { described_class.send :depends_on, :item, default: test_module }
54
- .not_to raise_error
55
- end
56
-
57
- it "accepts the :default option with nil" do
58
- expect { described_class.send :depends_on, :item, default: nil }
59
- .not_to raise_error
60
- end
61
-
62
- it "requires the :default option to be nil, class or module" do
63
- expect { described_class.send :depends_on, :item, default: 1 }
64
- .to raise_error { TypeError }
65
- end
66
-
67
- context "with a default implementation" do
68
-
69
- before { described_class.send :depends_on, :item, default: test_class }
70
- subject { described_class.new }
71
-
72
- it "declares a getter" do
73
- expect(subject).to respond_to :item
74
- end
75
-
76
- it "declares a setter" do
77
- expect(subject).to respond_to :item=
78
- expect { subject.item = described_class }
79
- .to change { subject.item }.to described_class
80
- end
81
-
82
- it "makes a setter to require module or class" do
83
- expect { subject.item = 1 }.to raise_error { TypeError }
84
- end
85
-
86
- it "sets implementation by default" do
87
- expect(subject.item).to eq test_class
88
- end
89
-
90
- it "resets implementation to default" do
91
- expect { subject.item = nil }.not_to change { subject.item }
92
- end
93
- end
94
-
95
- context "without a default implementation" do
96
-
97
- before { described_class.send :depends_on, :item }
98
- subject { described_class.new }
99
-
100
- it "declares a getter" do
101
- expect(subject).to respond_to :item
102
- end
103
-
104
- it "declares a setter" do
105
- expect(subject).to respond_to :item=
106
- subject.item = test_class
107
- expect(subject.item).to be test_class
108
- end
109
-
110
- it "makes a setter to require module or class" do
111
- expect { subject.item = 1 }.to raise_error(TypeError)
112
- end
113
-
114
- it "fails before the dependency not implemented" do
115
- expect { subject.item }.to raise_error(NotImplementedError)
116
- end
117
-
118
- it "fails when the dependency implementation resets" do
119
- subject.item = test_class
120
- expect { subject.item = nil }.to raise_error(NotImplementedError)
121
- end
122
- end
123
- end
124
- end
125
- end
@@ -1,96 +0,0 @@
1
- # encoding: utf-8
2
- require "spec_helper"
3
-
4
- module Hexx
5
- describe Helpers::Exceptions do
6
-
7
- before { class Test; include Helpers::Exceptions; end }
8
- after { Hexx.send :remove_const, :Test }
9
-
10
- let(:service_invalid) { Hexx::ServiceInvalid }
11
- let(:message) { Hexx::Message.new type: "error", text: "text" }
12
- let(:described_class) { Test }
13
- subject { described_class.new }
14
-
15
- it "includes Messages" do
16
- expect(described_class).to include Helpers::Messages
17
- end
18
-
19
- describe ".raises" do
20
-
21
- it "declares the specific StandardError exception(s)" do
22
- described_class.send :raises, :TestException
23
- exception = described_class.const_get :TestException
24
- expect(exception.new).to be_kind_of StandardError
25
- end
26
-
27
- it "accepts a list of values" do
28
- expect { described_class.send :raises, :One, :Two }.not_to raise_error
29
- expect(described_class.const_defined? :One).to be_truthy
30
- expect(described_class.const_defined? :Two).to be_truthy
31
- end
32
-
33
- it "accepts an array of values" do
34
- expect { described_class.send :raises, %w(One Two) }.not_to raise_error
35
- expect(described_class.const_defined? :One).to be_truthy
36
- expect(described_class.const_defined? :Two).to be_truthy
37
- end
38
-
39
- it "requires value" do
40
- expect { described_class.send :raises }.to raise_error ArgumentError
41
- end
42
-
43
- it "fails if non-string or non-symbol value given" do
44
- expect { described_class.send :raises, 1 }.to raise_error TypeError
45
- end
46
- end
47
-
48
- describe "#on_error" do
49
-
50
- it "fails with ServiceInvalid" do
51
- expect { subject.on_error [message] }.to raise_error service_invalid
52
- end
53
-
54
- it "adds errors to the service" do
55
- begin; subject.on_error [message]; rescue; end
56
- expect(subject.errors.messages).to eq(base: ["text"])
57
- end
58
- end
59
-
60
- describe "#escape" do
61
-
62
- it "yields a block" do
63
- value = "Hello!"
64
- result = subject.escape { value }
65
- expect(result).to eq value
66
- end
67
-
68
- context "when a block raises ServiceInvalid error" do
69
-
70
- let!(:exception) { service_invalid.new(subject) }
71
-
72
- it "re-raises the exception" do
73
- expect { subject.escape { fail exception } }
74
- .to raise_error { exception }
75
- end
76
- end
77
-
78
- context "when a block raises StandardError" do
79
-
80
- let(:run) { subject.escape { fail "text" } }
81
-
82
- it "re-raises the ServiceInvalid" do
83
- expect { run }.to raise_error service_invalid
84
- end
85
-
86
- it "adds error to the messages" do
87
- begin
88
- run
89
- rescue => err
90
- expect(err.messages).to contain_exactly message
91
- end
92
- end
93
- end
94
- end
95
- end
96
- end