hexx 7.1.0 → 8.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +2 -0
- data/.gitignore +9 -0
- data/.metrics +5 -0
- data/.rspec +2 -0
- data/.rubocop.yml +2 -63
- data/.travis.yml +5 -0
- data/.yardopts +2 -0
- data/Gemfile +3 -0
- data/Guardfile +16 -0
- data/{LICENSE.rdoc → LICENSE} +2 -2
- data/README.md +138 -0
- data/Rakefile +8 -14
- data/config/initializer.rb +5 -0
- data/config/initializers/capture.rb +19 -0
- data/config/initializers/sandbox.rb +16 -0
- data/config/initializers/sandbox/helpers.rb +38 -0
- data/config/initializers/sandbox/matchers.rb +19 -0
- data/config/metrics/STYLEGUIDE +230 -0
- data/config/metrics/cane.yml +5 -0
- data/config/metrics/churn.yml +6 -0
- data/config/metrics/flay.yml +2 -0
- data/config/metrics/metric_fu.yml +15 -0
- data/config/metrics/pippi.yml +3 -0
- data/config/metrics/reek.yml +1 -0
- data/config/metrics/roodi.yml +24 -0
- data/config/metrics/rubocop.yml +79 -0
- data/config/metrics/saikuro.yml +3 -0
- data/config/metrics/simplecov.yml +6 -0
- data/config/metrics/yardstick.yml +37 -0
- data/hexx.gemspec +24 -0
- data/lib/hexx.rb +8 -15
- data/lib/hexx/generator.rb +71 -0
- data/lib/hexx/generator/file.rb +83 -0
- data/lib/hexx/generator/folder.rb +68 -0
- data/lib/hexx/name.rb +122 -46
- data/lib/hexx/version.rb +6 -5
- data/spec/fixtures/root/_.beta +1 -0
- data/spec/fixtures/root/__omega +0 -0
- data/spec/fixtures/root/delta.erb.erb +0 -0
- data/spec/fixtures/root/gamma.rb.erb +1 -0
- data/spec/fixtures/root/subfolder/alfa.yml +0 -0
- data/spec/spec_helper.rb +5 -10
- data/spec/tests/lib/generator_spec.rb +126 -0
- data/spec/tests/lib/name_spec.rb +113 -0
- metadata +54 -168
- data/README.rdoc +0 -371
- data/lib/hexx/coercible.rb +0 -43
- data/lib/hexx/configurable.rb +0 -101
- data/lib/hexx/creators/base.rb +0 -103
- data/lib/hexx/creators/coercion.rb +0 -82
- data/lib/hexx/creators/dependency.rb +0 -87
- data/lib/hexx/creators/module_dependency.rb +0 -57
- data/lib/hexx/creators/parameter.rb +0 -40
- data/lib/hexx/dependable.rb +0 -51
- data/lib/hexx/helpers/exceptions.rb +0 -53
- data/lib/hexx/helpers/messages.rb +0 -26
- data/lib/hexx/helpers/parameters.rb +0 -47
- data/lib/hexx/helpers/validations.rb +0 -21
- data/lib/hexx/message.rb +0 -79
- data/lib/hexx/null.rb +0 -218
- data/lib/hexx/service.rb +0 -388
- data/lib/hexx/service/with_callbacks.rb +0 -104
- data/lib/hexx/service_invalid.rb +0 -73
- data/spec/hexx/coercible_spec.rb +0 -72
- data/spec/hexx/configurable_spec.rb +0 -93
- data/spec/hexx/dependable_spec.rb +0 -125
- data/spec/hexx/helpers/exceptions_spec.rb +0 -96
- data/spec/hexx/helpers/messages_spec.rb +0 -48
- data/spec/hexx/helpers/parameters_spec.rb +0 -96
- data/spec/hexx/helpers/validations_spec.rb +0 -32
- data/spec/hexx/message_spec.rb +0 -83
- data/spec/hexx/name_spec.rb +0 -80
- data/spec/hexx/null_spec.rb +0 -152
- data/spec/hexx/service_invalid_spec.rb +0 -46
- data/spec/hexx/service_spec.rb +0 -89
- data/spec/support/initializers/focus.rb +0 -5
- data/spec/support/initializers/garbage_collection.rb +0 -11
- data/spec/support/initializers/i18n.rb +0 -3
- data/spec/support/initializers/random_order.rb +0 -4
- data/spec/support/initializers/rspec.rb +0 -5
- data/spec/support/matchers/methods.rb +0 -11
data/lib/hexx/name.rb
CHANGED
@@ -1,72 +1,148 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
2
|
+
require "extlib"
|
3
3
|
|
4
4
|
module Hexx
|
5
5
|
|
6
|
+
# Decorates a string with conventional names
|
6
7
|
class Name
|
7
8
|
|
8
|
-
# @!
|
9
|
-
#
|
10
|
-
#
|
11
|
-
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
# @
|
9
|
+
# @!scope class
|
10
|
+
# @!method new(string)
|
11
|
+
# Constructs the parser object
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# Hexx::Name.new "MyGem::MyClass.methods.chain"
|
15
|
+
#
|
16
|
+
# @param [#to_s] string
|
17
|
+
# The string to be parsed
|
18
|
+
#
|
19
|
+
# @return [Hexx::Name]
|
20
|
+
def initialize(string)
|
21
|
+
@list = string.to_s.snake_case.gsub(/\:{2}|-/, "/").split(".")
|
22
|
+
end
|
16
23
|
|
17
|
-
|
24
|
+
# Returns the last part of the singular name
|
25
|
+
#
|
26
|
+
# @example
|
27
|
+
# source = "cats-wildcats/jaguars::PantherTiger.bite"
|
28
|
+
# name = Hexx::Name.new(source)
|
29
|
+
# name.item
|
30
|
+
# # => "panther_tiger"
|
31
|
+
#
|
32
|
+
# @return [String]
|
33
|
+
def item
|
34
|
+
@item ||= snakes.last.to_s.singular
|
35
|
+
end
|
18
36
|
|
19
|
-
#
|
20
|
-
|
37
|
+
# Returns the last part of the plural name
|
38
|
+
#
|
39
|
+
# @example
|
40
|
+
# source = "cats-wildcats/jaguars::PantherTiger.bite"
|
41
|
+
# name = Hexx::Name.new(source)
|
42
|
+
# name.items
|
43
|
+
# # => "panther_tigers"
|
44
|
+
#
|
45
|
+
# @return [String]
|
46
|
+
def items
|
47
|
+
@items ||= item.plural
|
48
|
+
end
|
21
49
|
|
22
|
-
#
|
23
|
-
#
|
50
|
+
# Returns the dashes-delimited name
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
# source = "cats-wildcats/jaguars::PantherTiger.bite"
|
54
|
+
# name = Hexx::Name.new(source)
|
55
|
+
# name.file
|
56
|
+
# # => "cats-wildcats-jaguars-panther_tiger.bite"
|
24
57
|
#
|
25
|
-
# @
|
26
|
-
|
27
|
-
|
28
|
-
def initialize(object, locale)
|
29
|
-
@object, @locale = object, locale
|
58
|
+
# @return [String]
|
59
|
+
def file
|
60
|
+
@file ||= [snakes.join("-"), method].compact.join(".")
|
30
61
|
end
|
31
62
|
|
32
|
-
#
|
33
|
-
# Returns the name for the current {#object}.
|
63
|
+
# Returns the slash-delimited name
|
34
64
|
#
|
35
|
-
# @
|
36
|
-
|
37
|
-
|
65
|
+
# @example
|
66
|
+
# source = "cats-wildcats/jaguars::PantherTiger.bite"
|
67
|
+
# name = Hexx::Name.new(source)
|
68
|
+
# name.path
|
69
|
+
# # => "cats/wildcats/jaguars/panther_tiger/bite"
|
70
|
+
#
|
71
|
+
# @return [String]
|
72
|
+
def path
|
73
|
+
@path ||= [snakes.join("/"), method].compact.join(".")
|
38
74
|
end
|
39
75
|
|
40
|
-
#
|
76
|
+
# Returns the name as a full constant
|
77
|
+
#
|
78
|
+
# @example
|
79
|
+
# source = "cats-wildcats/jaguars::PantherTiger.bite"
|
80
|
+
# name = Hexx::Name.new(source)
|
81
|
+
# name.type
|
82
|
+
# # => "Cats::Wildcats::Jaguars::PantherTiger.bite"
|
41
83
|
#
|
42
|
-
# @
|
43
|
-
|
44
|
-
|
45
|
-
# @return [String] the name.
|
46
|
-
def self.for(object, locale: I18n.locale)
|
47
|
-
new(object, locale).for
|
84
|
+
# @return [String]
|
85
|
+
def type
|
86
|
+
@type ||= [camels.join("::"), method].compact.join(".")
|
48
87
|
end
|
49
88
|
|
50
|
-
#
|
89
|
+
# Returns the name as a last part of constant
|
90
|
+
#
|
91
|
+
# @example
|
92
|
+
# source = "cats-wildcats/jaguars::PantherTiger.bite"
|
93
|
+
# name = Hexx::Name.new(source)
|
94
|
+
# name.const
|
95
|
+
# # => "PantherTiger.bite"
|
51
96
|
#
|
52
|
-
# @
|
53
|
-
|
54
|
-
|
55
|
-
def t(value, options = {})
|
56
|
-
return value unless value.is_a? Symbol
|
57
|
-
I18n.t value, options.merge(locale: locale, scope: scope)
|
97
|
+
# @return [String]
|
98
|
+
def const
|
99
|
+
@const ||= [camels.last, method].compact.join(".")
|
58
100
|
end
|
59
101
|
|
60
|
-
#
|
61
|
-
#
|
62
|
-
|
63
|
-
|
102
|
+
# Returns the array of namespaces (module names) for the constant
|
103
|
+
#
|
104
|
+
# @example
|
105
|
+
# source = "cats-wildcats/jaguars::PantherTiger.bite"
|
106
|
+
# name = Hexx::Name.new(source)
|
107
|
+
# name.namespaces
|
108
|
+
# # => ["Cats", "Wildcats", "Jaguars"]
|
109
|
+
#
|
110
|
+
# @return [Array<String>]
|
111
|
+
def namespaces
|
112
|
+
@namespaces ||= camels[0..-2]
|
64
113
|
end
|
65
114
|
|
66
115
|
private
|
67
116
|
|
68
|
-
|
69
|
-
|
117
|
+
# String of chained methods
|
118
|
+
#
|
119
|
+
# @return [String]
|
120
|
+
# @return [nil]
|
121
|
+
# if source has no methods
|
122
|
+
#
|
123
|
+
# @api private
|
124
|
+
def method
|
125
|
+
@method ||= @list[1..-1] if @list.count > 1
|
126
|
+
end
|
127
|
+
|
128
|
+
# List of snake-cased parts of the constant
|
129
|
+
#
|
130
|
+
# @return [Array<String>]
|
131
|
+
#
|
132
|
+
# @api private
|
133
|
+
def snakes
|
134
|
+
@snakes ||= @list.first.to_s.split("/")
|
135
|
+
end
|
136
|
+
|
137
|
+
# List of camel-cased parts of the constant
|
138
|
+
#
|
139
|
+
# @return [Array<String>]
|
140
|
+
#
|
141
|
+
# @api private
|
142
|
+
def camels
|
143
|
+
@camels ||= snakes.map(&:camel_case)
|
70
144
|
end
|
71
|
-
|
72
|
-
end
|
145
|
+
|
146
|
+
end # class Name
|
147
|
+
|
148
|
+
end # module Hexx
|
data/lib/hexx/version.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
#
|
2
|
-
module Hexx
|
1
|
+
# encoding: utf-8
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module Hexx
|
4
|
+
# The semantic version of the module.
|
5
|
+
# @see http://semver.org/ Semantic versioning 2.0
|
6
|
+
VERSION = "8.0.0".freeze
|
7
|
+
end # module Hexx
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= 2 * 2 -%>
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= 2 * 2 -%>
|
File without changes
|
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,6 @@
|
|
1
|
-
|
1
|
+
# Loads the RSpec test suit.
|
2
|
+
require "hexx-suit"
|
3
|
+
Hexx::Suit.load_metrics_for(self)
|
2
4
|
|
3
|
-
#
|
4
|
-
|
5
|
-
|
6
|
-
# Support files and Rspec settings
|
7
|
-
Dir[File.join(root, "spec/support/**/*.rb")].each { |file| require file }
|
8
|
-
|
9
|
-
# Application files
|
10
|
-
Coveralls.wear!
|
11
|
-
require File.join(root, "lib/hexx.rb")
|
5
|
+
# Loads the gem.
|
6
|
+
require "hexx"
|
@@ -0,0 +1,126 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# See settings for :sandbox and :capture tags in `config/initializers` folder
|
4
|
+
describe Hexx::Generator do
|
5
|
+
|
6
|
+
# source path is set to spec/fixtures
|
7
|
+
let(:fixtures) { ::File.expand_path "../../../fixtures", __FILE__ }
|
8
|
+
before { allow(described_class).to receive(:source_root).and_return fixtures }
|
9
|
+
|
10
|
+
describe ".new" do
|
11
|
+
|
12
|
+
it "constructs Thor::Group instance" do
|
13
|
+
expect(subject).to be_kind_of Thor::Group
|
14
|
+
end
|
15
|
+
|
16
|
+
it "constructs Thor::Actions instance" do
|
17
|
+
expect(subject).to be_kind_of Thor::Actions
|
18
|
+
end
|
19
|
+
|
20
|
+
end # describe .new
|
21
|
+
|
22
|
+
describe "##source_root" do
|
23
|
+
|
24
|
+
it "returns a source root" do
|
25
|
+
expect(subject.send :source_root)
|
26
|
+
.to eq described_class.send(:source_root)
|
27
|
+
end
|
28
|
+
|
29
|
+
end # describe ##source_root
|
30
|
+
|
31
|
+
describe "#copy_folder", :sandbox, :capture do
|
32
|
+
|
33
|
+
shared_examples "copying files" do
|
34
|
+
|
35
|
+
# target should be described in context
|
36
|
+
|
37
|
+
it "[copy file as is]" do
|
38
|
+
expect("#{ target }/subfolder/alfa.yml").to be_present_in_sandbox
|
39
|
+
end
|
40
|
+
|
41
|
+
end # examples
|
42
|
+
|
43
|
+
shared_examples "removing last .erb only" do
|
44
|
+
|
45
|
+
# target should be described in context
|
46
|
+
|
47
|
+
it "[removes last .erb]" do
|
48
|
+
expect("#{ target }/gamma.rb").to be_present_in_sandbox
|
49
|
+
end
|
50
|
+
|
51
|
+
it "[leaves previous .erb]" do
|
52
|
+
expect("#{ target }/delta.erb").to be_present_in_sandbox
|
53
|
+
end
|
54
|
+
|
55
|
+
end # examples
|
56
|
+
|
57
|
+
shared_examples "removing first underscores only" do
|
58
|
+
|
59
|
+
it "[removes first _]" do
|
60
|
+
expect("#{ target }/.beta").to be_present_in_sandbox
|
61
|
+
end
|
62
|
+
|
63
|
+
it "[leaves later _]" do
|
64
|
+
expect("#{ target }/_omega").to be_present_in_sandbox
|
65
|
+
end
|
66
|
+
|
67
|
+
end # examples
|
68
|
+
|
69
|
+
shared_examples "preprocessing ERB only" do
|
70
|
+
|
71
|
+
# target should be described in context
|
72
|
+
|
73
|
+
it "[preprocesses erb]" do
|
74
|
+
content = read_in_sandbox("#{ target }/gamma.rb")
|
75
|
+
expect(content).not_to include "<%= 2 * 2 -%>"
|
76
|
+
expect(content).to include "4"
|
77
|
+
end
|
78
|
+
|
79
|
+
it "[leaves non-erb]" do
|
80
|
+
content = read_in_sandbox("#{ target }/.beta")
|
81
|
+
expect(content).to include "<%= 2 * 2 -%>"
|
82
|
+
expect(content).not_to include "4"
|
83
|
+
end
|
84
|
+
|
85
|
+
end # examples
|
86
|
+
|
87
|
+
context "when the target isn't set" do
|
88
|
+
|
89
|
+
let(:target) { "root" }
|
90
|
+
|
91
|
+
before { try_in_sandbox { subject.send :copy_folder, "root" } }
|
92
|
+
|
93
|
+
it_behaves_like "copying files"
|
94
|
+
it_behaves_like "removing last .erb only"
|
95
|
+
it_behaves_like "removing first underscores only"
|
96
|
+
it_behaves_like "preprocessing ERB only"
|
97
|
+
|
98
|
+
end # context
|
99
|
+
|
100
|
+
context "with the target is set" do
|
101
|
+
|
102
|
+
let(:target) { "spec" }
|
103
|
+
|
104
|
+
before { try_in_sandbox { subject.send :copy_folder, "root", target } }
|
105
|
+
|
106
|
+
it_behaves_like "copying files"
|
107
|
+
it_behaves_like "removing last .erb only"
|
108
|
+
it_behaves_like "removing first underscores only"
|
109
|
+
it_behaves_like "preprocessing ERB only"
|
110
|
+
|
111
|
+
end # context
|
112
|
+
|
113
|
+
end # describe ##copy_folder
|
114
|
+
|
115
|
+
describe "#from_template", :sandbox, :capture do
|
116
|
+
|
117
|
+
let(:content) { subject.send :from_template, "root/_.beta" }
|
118
|
+
|
119
|
+
it "returns the ERB-preprocessed content of the template" do
|
120
|
+
expect(content).not_to include "<%= 2 * 2 -%>"
|
121
|
+
expect(content).to include "4"
|
122
|
+
end
|
123
|
+
|
124
|
+
end # describe ##from_template
|
125
|
+
|
126
|
+
end # describe Hexx::Generator
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe Hexx::Name do
|
4
|
+
|
5
|
+
describe ".new" do
|
6
|
+
|
7
|
+
it "requires an argument" do
|
8
|
+
expect { described_class.new }.to raise_error
|
9
|
+
expect { described_class.new "" }.not_to raise_error
|
10
|
+
expect { described_class.new "", "" }.to raise_error
|
11
|
+
end
|
12
|
+
|
13
|
+
end # describe .new
|
14
|
+
|
15
|
+
let(:a) { described_class.new nil }
|
16
|
+
let(:b) { described_class.new "cats" }
|
17
|
+
let(:c) { described_class.new "cats.names" }
|
18
|
+
let(:d) { described_class.new "cats-wildcats/jaguars::PantherTiger" }
|
19
|
+
let(:e) { described_class.new "cats-wildcats/jaguars::PantherTigers" }
|
20
|
+
let(:f) { described_class.new "cats-wildcats/jaguars::PantherTiger.a.B.c" }
|
21
|
+
|
22
|
+
describe "#item" do
|
23
|
+
|
24
|
+
it "returns a proper value" do
|
25
|
+
expect(a.item).to eq ""
|
26
|
+
expect(b.item).to eq "cat"
|
27
|
+
expect(c.item).to eq "cat"
|
28
|
+
expect(d.item).to eq "panther_tiger"
|
29
|
+
expect(e.item).to eq "panther_tiger"
|
30
|
+
expect(f.item).to eq "panther_tiger"
|
31
|
+
end
|
32
|
+
|
33
|
+
end # describe #item
|
34
|
+
|
35
|
+
describe "#items" do
|
36
|
+
|
37
|
+
it "returns a proper value" do
|
38
|
+
expect(a.items).to eq ""
|
39
|
+
expect(b.items).to eq "cats"
|
40
|
+
expect(c.items).to eq "cats"
|
41
|
+
expect(d.items).to eq "panther_tigers"
|
42
|
+
expect(e.items).to eq "panther_tigers"
|
43
|
+
expect(f.items).to eq "panther_tigers"
|
44
|
+
end
|
45
|
+
|
46
|
+
end # describe #items
|
47
|
+
|
48
|
+
describe "#file" do
|
49
|
+
|
50
|
+
it "returns a proper value" do
|
51
|
+
expect(a.file).to eq ""
|
52
|
+
expect(b.file).to eq "cats"
|
53
|
+
expect(c.file).to eq "cats.names"
|
54
|
+
expect(d.file).to eq "cats-wildcats-jaguars-panther_tiger"
|
55
|
+
expect(e.file).to eq "cats-wildcats-jaguars-panther_tigers"
|
56
|
+
expect(f.file).to eq "cats-wildcats-jaguars-panther_tiger.a.b.c"
|
57
|
+
end
|
58
|
+
|
59
|
+
end # describe #file
|
60
|
+
|
61
|
+
describe "#path" do
|
62
|
+
|
63
|
+
it "returns a proper value" do
|
64
|
+
expect(a.path).to eq ""
|
65
|
+
expect(b.path).to eq "cats"
|
66
|
+
expect(c.path).to eq "cats.names"
|
67
|
+
expect(d.path).to eq "cats/wildcats/jaguars/panther_tiger"
|
68
|
+
expect(e.path).to eq "cats/wildcats/jaguars/panther_tigers"
|
69
|
+
expect(f.path).to eq "cats/wildcats/jaguars/panther_tiger.a.b.c"
|
70
|
+
end
|
71
|
+
|
72
|
+
end # describe #path
|
73
|
+
|
74
|
+
describe "#type" do
|
75
|
+
|
76
|
+
it "returns a proper value" do
|
77
|
+
expect(a.type).to eq ""
|
78
|
+
expect(b.type).to eq "Cats"
|
79
|
+
expect(c.type).to eq "Cats.names"
|
80
|
+
expect(d.type).to eq "Cats::Wildcats::Jaguars::PantherTiger"
|
81
|
+
expect(e.type).to eq "Cats::Wildcats::Jaguars::PantherTigers"
|
82
|
+
expect(f.type).to eq "Cats::Wildcats::Jaguars::PantherTiger.a.b.c"
|
83
|
+
end
|
84
|
+
|
85
|
+
end # describe #type
|
86
|
+
|
87
|
+
describe "#const" do
|
88
|
+
|
89
|
+
it "returns a proper value" do
|
90
|
+
expect(a.const).to eq ""
|
91
|
+
expect(b.const).to eq "Cats"
|
92
|
+
expect(c.const).to eq "Cats.names"
|
93
|
+
expect(d.const).to eq "PantherTiger"
|
94
|
+
expect(e.const).to eq "PantherTigers"
|
95
|
+
expect(f.const).to eq "PantherTiger.a.b.c"
|
96
|
+
end
|
97
|
+
|
98
|
+
end # describe #const
|
99
|
+
|
100
|
+
describe "#namespaces" do
|
101
|
+
|
102
|
+
it "returns a proper value" do
|
103
|
+
expect(a.namespaces).to eq %w()
|
104
|
+
expect(b.namespaces).to eq %w()
|
105
|
+
expect(c.namespaces).to eq %w()
|
106
|
+
expect(d.namespaces).to eq %w(Cats Wildcats Jaguars)
|
107
|
+
expect(e.namespaces).to eq %w(Cats Wildcats Jaguars)
|
108
|
+
expect(f.namespaces).to eq %w(Cats Wildcats Jaguars)
|
109
|
+
end
|
110
|
+
|
111
|
+
end # describe #namespaces
|
112
|
+
|
113
|
+
end # describe Hexx::Name
|