ettin 1.2.1 → 1.3.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/.rubocop.yml +90 -9
- data/.travis.yml +4 -12
- data/Gemfile +1 -0
- data/README.md +2 -2
- data/bin/ettin +13 -11
- data/ettin.gemspec +3 -1
- data/lib/ettin/method_name.rb +42 -0
- data/lib/ettin/options.rb +22 -40
- data/lib/ettin/source.rb +3 -1
- data/lib/ettin/sources/yaml_source.rb +1 -0
- data/lib/ettin/version.rb +1 -1
- metadata +34 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41fed733a48804c578d61f4a59536f3ba63a25bd3cb5595395189333309aba22
|
4
|
+
data.tar.gz: 6fce18aa306ba1415d5d8a723472f30c84e45f9a98ff0ad071545163ae3df76b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21b8171268a52679f6a6b3e21597b78368c09f7897c505bac79f7430ca6198ba366c6a8bf295c11a38bacb695f23df9ace31012358a74cfdc28529436ac4f951
|
7
|
+
data.tar.gz: 197dc51c977d51908e420b89a47007240df6de55d9b249ad2df6290afb88c8598a4d70d0501decab2299d950eda3db9120df15092da13163b91c939e6f1d659a
|
data/.rubocop.yml
CHANGED
@@ -1,21 +1,38 @@
|
|
1
|
+
require:
|
2
|
+
- rubocop-performance
|
3
|
+
- rubocop-rspec
|
1
4
|
inherit_from: .rubocop_todo.yml
|
2
5
|
|
3
6
|
AllCops:
|
4
7
|
DisplayCopNames: true
|
5
8
|
TargetRubyVersion: 2.3
|
6
9
|
Exclude:
|
10
|
+
- 'lib/ettin/deep_transform.rb'
|
11
|
+
- '.bundle/**/*'
|
12
|
+
- 'vendor/bundle/**/*'
|
7
13
|
- '*.gemspec'
|
14
|
+
- 'spec/fixtures/**/*'
|
8
15
|
|
9
16
|
Naming/FileName:
|
10
17
|
ExpectMatchingDefinition: true
|
11
18
|
Exclude:
|
19
|
+
- 'bin/**/*'
|
20
|
+
- 'lib/core_extensions/**/*'
|
12
21
|
- 'spec/**/*'
|
13
22
|
- 'lib/*/version.rb'
|
14
23
|
|
24
|
+
RSpec/FilePath:
|
25
|
+
Exclude:
|
26
|
+
- 'spec/**/*.rb' # rubocop error
|
27
|
+
|
15
28
|
Style/Documentation:
|
16
29
|
Exclude:
|
17
30
|
- 'spec/**/*'
|
18
31
|
|
32
|
+
# Enabling this cop can break rescue statements in ruby <= 2.4
|
33
|
+
Style/RedundantBegin:
|
34
|
+
Enabled: false
|
35
|
+
|
19
36
|
# We disable this cop because we want to use Pathname#/
|
20
37
|
# and this cop is not configurable at all.
|
21
38
|
Layout/SpaceAroundOperators:
|
@@ -29,7 +46,7 @@ Style/Alias:
|
|
29
46
|
EnforcedStyle: prefer_alias_method
|
30
47
|
|
31
48
|
Metrics/LineLength:
|
32
|
-
Max:
|
49
|
+
Max: 90
|
33
50
|
AllowHeredoc: true
|
34
51
|
AllowURI: true
|
35
52
|
URISchemes:
|
@@ -38,15 +55,16 @@ Metrics/LineLength:
|
|
38
55
|
|
39
56
|
Metrics/BlockLength:
|
40
57
|
Exclude:
|
58
|
+
- 'spec/support/**/*.rb'
|
41
59
|
- 'spec/**/*_spec.rb'
|
42
60
|
|
43
61
|
Layout/ElseAlignment:
|
44
62
|
Enabled: false
|
45
63
|
|
46
|
-
Layout/
|
64
|
+
Layout/IndentFirstArgument:
|
47
65
|
EnforcedStyle: consistent
|
48
66
|
|
49
|
-
Layout/
|
67
|
+
Layout/AlignArguments:
|
50
68
|
EnforcedStyle: with_fixed_indentation
|
51
69
|
|
52
70
|
Layout/CaseIndentation:
|
@@ -58,6 +76,10 @@ Layout/ClosingParenthesisIndentation:
|
|
58
76
|
Style/ClassAndModuleChildren:
|
59
77
|
EnforcedStyle: nested
|
60
78
|
|
79
|
+
Metrics/ModuleLength:
|
80
|
+
Exclude:
|
81
|
+
- 'spec/**/*_spec.rb'
|
82
|
+
|
61
83
|
Style/CommentAnnotation:
|
62
84
|
Enabled: false
|
63
85
|
|
@@ -83,10 +105,10 @@ Style/GuardClause:
|
|
83
105
|
Style/IfUnlessModifier:
|
84
106
|
Enabled: false
|
85
107
|
|
86
|
-
Layout/
|
108
|
+
Layout/IndentFirstArrayElement:
|
87
109
|
EnforcedStyle: consistent
|
88
110
|
|
89
|
-
Layout/
|
111
|
+
Layout/IndentFirstHashElement:
|
90
112
|
EnforcedStyle: consistent
|
91
113
|
|
92
114
|
Layout/AlignHash:
|
@@ -125,14 +147,13 @@ Layout/SpaceInsideBlockBraces:
|
|
125
147
|
Style/SymbolArray:
|
126
148
|
EnforcedStyle: brackets
|
127
149
|
|
128
|
-
|
150
|
+
Layout/BlockAlignment:
|
129
151
|
EnforcedStyleAlignWith: start_of_block
|
130
|
-
#EnforcedStyleAlignWith: start_of_line
|
131
152
|
|
132
|
-
|
153
|
+
Layout/EndAlignment:
|
133
154
|
EnforcedStyleAlignWith: start_of_line
|
134
155
|
|
135
|
-
|
156
|
+
Layout/DefEndAlignment:
|
136
157
|
EnforcedStyleAlignWith: def
|
137
158
|
|
138
159
|
Performance/RedundantMerge:
|
@@ -141,3 +162,63 @@ Performance/RedundantMerge:
|
|
141
162
|
Style/WordArray:
|
142
163
|
EnforcedStyle: brackets
|
143
164
|
|
165
|
+
Style/RescueModifier:
|
166
|
+
Exclude:
|
167
|
+
- 'spec/**/*_spec.rb'
|
168
|
+
|
169
|
+
# This cop just adds extra work when you want to write an integration test,
|
170
|
+
# or test something like a jbuilder view.
|
171
|
+
RSpec/DescribeClass:
|
172
|
+
Enabled: false
|
173
|
+
|
174
|
+
# Using let! is fine, and can be easier to manage than a before block.
|
175
|
+
RSpec/LetSetup:
|
176
|
+
Enabled: false
|
177
|
+
|
178
|
+
RSpec/BeEql:
|
179
|
+
Enabled: false
|
180
|
+
|
181
|
+
RSpec/ExampleWithoutDescription:
|
182
|
+
EnforcedStyle: single_line_only
|
183
|
+
|
184
|
+
RSpec/HookArgument:
|
185
|
+
EnforcedStyle: each
|
186
|
+
|
187
|
+
RSpec/ImplicitSubject:
|
188
|
+
EnforcedStyle: disallow
|
189
|
+
|
190
|
+
RSpec/LeadingSubject:
|
191
|
+
Enabled: false
|
192
|
+
|
193
|
+
RSpec/MultipleExpectations:
|
194
|
+
Enabled: true
|
195
|
+
Max: 3
|
196
|
+
|
197
|
+
# Change this as needed.
|
198
|
+
RSpec/NestedGroups:
|
199
|
+
Max: 3
|
200
|
+
|
201
|
+
RSpec/VerifiedDoubles:
|
202
|
+
Enabled: false
|
203
|
+
|
204
|
+
RSpec/ExampleLength:
|
205
|
+
Max: 10
|
206
|
+
|
207
|
+
RSpec/MessageSpies:
|
208
|
+
EnforcedStyle: receive
|
209
|
+
|
210
|
+
RSpec/EmptyExampleGroup:
|
211
|
+
CustomIncludeMethods:
|
212
|
+
- it_allows
|
213
|
+
- it_disallows
|
214
|
+
|
215
|
+
RSpec/ContextWording:
|
216
|
+
Prefixes:
|
217
|
+
- as
|
218
|
+
- when
|
219
|
+
- with
|
220
|
+
- without
|
221
|
+
|
222
|
+
Lint/AmbiguousBlockAssociation:
|
223
|
+
Exclude:
|
224
|
+
- 'spec/**/*.rb'
|
data/.travis.yml
CHANGED
@@ -11,20 +11,12 @@ branches:
|
|
11
11
|
- master
|
12
12
|
- develop
|
13
13
|
|
14
|
-
env:
|
15
|
-
global:
|
16
|
-
- CC_TEST_REPORTER_ID=dfb947d165289cdfab764c2f143dc0b5097878f4100b5580cca3b06932e04840
|
17
|
-
|
18
14
|
before_install: gem install bundler
|
19
15
|
|
20
|
-
before_script:
|
21
|
-
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
22
|
-
- chmod +x ./cc-test-reporter
|
23
|
-
- ./cc-test-reporter before-build
|
24
|
-
|
25
16
|
script:
|
26
17
|
- bundle exec rspec --order=random
|
27
18
|
|
28
|
-
|
29
|
-
|
30
|
-
|
19
|
+
matrix:
|
20
|
+
include:
|
21
|
+
- rvm: ruby-head
|
22
|
+
script: bundle exec rubocop
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Ettin
|
2
2
|
|
3
3
|
[](https://travis-ci.org/mlibrary/ettin)
|
4
|
-
[](https://coveralls.io/github/mlibrary/ettin?branch=master)
|
5
|
+
[](https://www.rubydoc.info/github/mlibrary/ettin)
|
6
6
|
|
7
7
|
## Summary
|
8
8
|
|
data/bin/ettin
CHANGED
@@ -8,21 +8,23 @@ require "optparse"
|
|
8
8
|
|
9
9
|
options = {}
|
10
10
|
parser = OptionParser.new do |opts|
|
11
|
-
opts.banner = "Creates the standard, empty config files starting from the given
|
12
|
-
"
|
11
|
+
opts.banner = "Creates the standard, empty config files starting from the given " \
|
12
|
+
"path.\nUsage: ettin STARTPATH"
|
13
13
|
|
14
|
-
opts.on("-p", "--path STARTPATH",
|
15
|
-
|
16
|
-
|
14
|
+
opts.on("-p", "--path STARTPATH",
|
15
|
+
"The root under which the files will be created.") do |p|
|
16
|
+
options[:start_path] = p
|
17
|
+
end
|
17
18
|
|
18
19
|
opts.on("-v", "--[no-]verbose", "Print paths created") do |v|
|
19
20
|
options[:verbose] = v
|
20
21
|
end
|
21
22
|
|
22
23
|
options[:compat] = false
|
23
|
-
opts.on("-c", "--[no-]compat",
|
24
|
-
|
25
|
-
|
24
|
+
opts.on("-c", "--[no-]compat",
|
25
|
+
"Create extra config files for compatibility with railsconfig gem.") do |c|
|
26
|
+
options[:compat] = c
|
27
|
+
end
|
26
28
|
|
27
29
|
opts.on("-h", "--help", "Prints this help") do
|
28
30
|
puts opts
|
@@ -45,7 +47,7 @@ files = ["development", "production", "test"]
|
|
45
47
|
.uniq
|
46
48
|
|
47
49
|
unless options[:compat]
|
48
|
-
files.reject!{|path| path.dirname.basename.to_s == "environments" }
|
50
|
+
files.reject! {|path| path.dirname.basename.to_s == "environments" }
|
49
51
|
end
|
50
52
|
|
51
53
|
files.each do |path|
|
@@ -57,7 +59,7 @@ end
|
|
57
59
|
puts "\nAdding .local.yml files to .gitignore" if options[:verbose]
|
58
60
|
`echo "\n# Ignore local configuration files" >> .gitignore`
|
59
61
|
files
|
60
|
-
.select{|path| path.basename.to_s.include?("local")}
|
61
|
-
.each{|path| `echo "#{path}" >> .gitignore`}
|
62
|
+
.select {|path| path.basename.to_s.include?("local") }
|
63
|
+
.each {|path| `echo "#{path}" >> .gitignore` }
|
62
64
|
|
63
65
|
puts "" if options[:verbose]
|
data/ettin.gemspec
CHANGED
@@ -24,8 +24,10 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_runtime_dependency "deep_merge"
|
25
25
|
|
26
26
|
spec.add_development_dependency "bundler"
|
27
|
+
spec.add_development_dependency "coveralls"
|
27
28
|
spec.add_development_dependency "rake"
|
28
29
|
spec.add_development_dependency "rspec"
|
29
30
|
spec.add_development_dependency "rubocop"
|
30
|
-
spec.add_development_dependency "
|
31
|
+
spec.add_development_dependency "rubocop-performance"
|
32
|
+
spec.add_development_dependency "rubocop-rspec"
|
31
33
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Ettin
|
4
|
+
|
5
|
+
# A class for analyzing and manipulating a method's name
|
6
|
+
class MethodName
|
7
|
+
ASSIGN_CHAR = "="
|
8
|
+
BANG_CHAR = "!"
|
9
|
+
|
10
|
+
def initialize(method)
|
11
|
+
@method = method.to_s
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_sym
|
15
|
+
method.to_sym
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
method
|
20
|
+
end
|
21
|
+
|
22
|
+
def clean
|
23
|
+
@clean ||= if bang? || assignment?
|
24
|
+
method.chop
|
25
|
+
else
|
26
|
+
method
|
27
|
+
end.to_sym
|
28
|
+
end
|
29
|
+
|
30
|
+
def bang?
|
31
|
+
method[-1] == BANG_CHAR
|
32
|
+
end
|
33
|
+
|
34
|
+
def assignment?
|
35
|
+
method[-1] == ASSIGN_CHAR
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
attr_reader :method
|
41
|
+
end
|
42
|
+
end
|
data/lib/ettin/options.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require "deep_merge/rails_compat"
|
4
4
|
require "forwardable"
|
5
|
+
require "ettin/method_name"
|
5
6
|
|
6
7
|
module Ettin
|
7
8
|
|
@@ -18,37 +19,16 @@ module Ettin
|
|
18
19
|
@hash.default = nil
|
19
20
|
end
|
20
21
|
|
21
|
-
def method_missing(method, *args, &block)
|
22
|
-
|
23
|
-
if !key?(debang(method))
|
24
|
-
if bang?(method)
|
25
|
-
raise KeyError, "key #{debang(method)} not found"
|
26
|
-
else
|
27
|
-
self[debang(method)]
|
28
|
-
end
|
29
|
-
else
|
30
|
-
self[debang(method)]
|
31
|
-
end
|
32
|
-
else
|
33
|
-
super(method, *args, &block)
|
34
|
-
end
|
22
|
+
def method_missing(method, *args, &block) # rubocop:disable Style/MethodMissingSuper
|
23
|
+
return super(method, *args, &block) unless handles?(method)
|
35
24
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
else
|
43
|
-
super(method, *args, &block)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def handle_bang_method(method)
|
48
|
-
if key?(debang(method))
|
49
|
-
self[debang(method)]
|
25
|
+
method = MethodName.new(method)
|
26
|
+
if method.bang?
|
27
|
+
handle_bang_method(method)
|
28
|
+
elsif method.assignment?
|
29
|
+
handle_assignment_method(method, *args)
|
50
30
|
else
|
51
|
-
|
31
|
+
self[method.clean]
|
52
32
|
end
|
53
33
|
end
|
54
34
|
|
@@ -66,7 +46,9 @@ module Ettin
|
|
66
46
|
alias_method :has_key?, :key?
|
67
47
|
|
68
48
|
def merge(other)
|
69
|
-
new_hash = {}
|
49
|
+
new_hash = {}
|
50
|
+
.deeper_merge(hash)
|
51
|
+
.deeper_merge!(other.to_h, overwrite_arrays: true)
|
70
52
|
self.class.new(new_hash)
|
71
53
|
end
|
72
54
|
|
@@ -101,20 +83,20 @@ module Ettin
|
|
101
83
|
|
102
84
|
attr_reader :hash
|
103
85
|
|
104
|
-
def
|
105
|
-
|
86
|
+
def handle_bang_method(method)
|
87
|
+
if key?(method.clean)
|
88
|
+
self[method.clean]
|
89
|
+
else
|
90
|
+
raise KeyError, "key #{method.clean} not found"
|
91
|
+
end
|
106
92
|
end
|
107
93
|
|
108
|
-
def
|
109
|
-
method.
|
94
|
+
def handle_assignment_method(method, *args)
|
95
|
+
self[method.clean] = args.first
|
110
96
|
end
|
111
97
|
|
112
|
-
def
|
113
|
-
|
114
|
-
method.to_s.chop.to_sym
|
115
|
-
else
|
116
|
-
method
|
117
|
-
end
|
98
|
+
def handles?(method)
|
99
|
+
/^[a-zA-Z_0-9]*(\!|=)?$/.match(method.to_s)
|
118
100
|
end
|
119
101
|
|
120
102
|
def convert_key(key)
|
data/lib/ettin/source.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Ettin
|
4
|
+
|
5
|
+
# Generic interface for data sources containing configuration information.
|
4
6
|
class Source
|
5
7
|
def self.for(target)
|
6
8
|
registry.find {|candidate| candidate.handles?(target) }
|
@@ -8,7 +10,7 @@ module Ettin
|
|
8
10
|
end
|
9
11
|
|
10
12
|
def self.registry
|
11
|
-
@@registry ||= []
|
13
|
+
@@registry ||= [] # rubocop:disable Style/ClassVars
|
12
14
|
end
|
13
15
|
|
14
16
|
def self.register(candidate)
|
data/lib/ettin/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ettin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Hockey
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deep_merge
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: coveralls
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rake
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,7 +95,21 @@ dependencies:
|
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
98
|
+
name: rubocop-performance
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-rspec
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
115
|
- - ">="
|
@@ -119,6 +147,7 @@ files:
|
|
119
147
|
- lib/ettin/config_files.rb
|
120
148
|
- lib/ettin/deep_transform.rb
|
121
149
|
- lib/ettin/hash_factory.rb
|
150
|
+
- lib/ettin/method_name.rb
|
122
151
|
- lib/ettin/options.rb
|
123
152
|
- lib/ettin/source.rb
|
124
153
|
- lib/ettin/sources/hash_source.rb
|
@@ -144,7 +173,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
173
|
- !ruby/object:Gem::Version
|
145
174
|
version: '0'
|
146
175
|
requirements: []
|
147
|
-
|
176
|
+
rubyforge_project:
|
177
|
+
rubygems_version: 2.7.6
|
148
178
|
signing_key:
|
149
179
|
specification_version: 4
|
150
180
|
summary: The best way to add settings in any ruby project.
|