ruboclean 0.6.0 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eed645db36081518d593efb17c64f3c1566a978548a699d10aecf64893ad0f48
4
- data.tar.gz: 62c988143427e15fa10e551cedb5965be6a81dd7afbba5ec40ef303ce6e6183c
3
+ metadata.gz: 87c2863ba79e2de69359cfa6d5401b391adedcdd0af495ac1bb9d24dab31d712
4
+ data.tar.gz: 96e15d4e14377bae49d5f36822ff41696944098048ff1ca0b55a1eceff686afb
5
5
  SHA512:
6
- metadata.gz: 31f137822127611a4aa5b54df8e7d9222d96937438367ab73a3bdf588e1a854b36a2ba8ce617125ff955948046214ad63037b4ae8a4b5f571f979793c252b2c0
7
- data.tar.gz: c939cd53f18fae460f56d76b6ed1c463b229795ac4518ef246ef12b4dd11135067c329276b5d1a9418aebdcf690c8088a4944ff5b338b314be01246dd0acd26e
6
+ metadata.gz: 220e073ea849964a2c2eceebf7516586855bc2de4dc0ab4fce74dcb2780e09aee57767ba01227fa02b2fcc4fdb8d21b117535e86d8b8ffee7270ec9d3e86a66c
7
+ data.tar.gz: 4572357405026dad1a56dee3871c015327bb44be6d3a979c5ed86c8a78e4cbbec1d112a808681f5f9a7238c766b3f1b0f4346a60f987e1707c7d7d9d77ea7adb
@@ -15,10 +15,10 @@ jobs:
15
15
  fail-fast: false
16
16
  matrix:
17
17
  os: [ubuntu-latest]
18
- ruby: ['2.7', '3.0', '3.1', '3.2', '3.3', head]
18
+ ruby: ['2.7', '3.0', '3.1', '3.2', '3.3', '3.4', head]
19
19
  runs-on: ${{ matrix.os }}
20
20
  steps:
21
- - uses: actions/checkout@v3
21
+ - uses: actions/checkout@v4
22
22
 
23
23
  - uses: ruby/setup-ruby@v1
24
24
  with:
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  *.gem
10
+ .DS_Store
data/.rubocop.yml CHANGED
@@ -4,6 +4,9 @@ require:
4
4
  - rubocop-minitest
5
5
  - rubocop-rake
6
6
 
7
+ Gemspec/AddRuntimeDependency:
8
+ Enabled: true
9
+
7
10
  Gemspec/DeprecatedAttributeAssignment:
8
11
  Enabled: true
9
12
 
@@ -79,6 +82,9 @@ Lint/DuplicateRequire:
79
82
  Lint/DuplicateRescueException:
80
83
  Enabled: true
81
84
 
85
+ Lint/DuplicateSetElement:
86
+ Enabled: true
87
+
82
88
  Lint/EmptyBlock:
83
89
  Enabled: true
84
90
 
@@ -187,6 +193,9 @@ Lint/UnreachableLoop:
187
193
  Lint/UselessMethodDefinition:
188
194
  Enabled: true
189
195
 
196
+ Lint/UselessNumericOperation:
197
+ Enabled: true
198
+
190
199
  Lint/UselessRescue:
191
200
  Enabled: true
192
201
 
@@ -241,6 +250,9 @@ Minitest/DuplicateTestRun:
241
250
  Minitest/EmptyLineBeforeAssertionMethods:
242
251
  Enabled: true
243
252
 
253
+ Minitest/Focus:
254
+ Enabled: true
255
+
244
256
  Minitest/LifecycleHooksOrder:
245
257
  Enabled: true
246
258
 
@@ -419,6 +431,9 @@ Style/MagicCommentFormat:
419
431
  Style/MapCompactWithConditionalBlock:
420
432
  Enabled: true
421
433
 
434
+ Style/MapIntoArray:
435
+ Enabled: true
436
+
422
437
  Style/MapToHash:
423
438
  Enabled: true
424
439
 
@@ -497,6 +512,9 @@ Style/RedundantHeredocDelimiterQuotes:
497
512
  Style/RedundantInitialize:
498
513
  Enabled: true
499
514
 
515
+ Style/RedundantInterpolationUnfreeze:
516
+ Enabled: true
517
+
500
518
  Style/RedundantLineContinuation:
501
519
  Enabled: true
502
520
 
@@ -527,6 +545,9 @@ Style/ReturnNilInPredicateMethodDefinition:
527
545
  Style/SelectByRegexp:
528
546
  Enabled: true
529
547
 
548
+ Style/SendWithLiteralMethodName:
549
+ Enabled: true
550
+
530
551
  Style/SingleArgumentDig:
531
552
  Enabled: true
532
553
 
@@ -549,6 +570,9 @@ Style/StringLiterals:
549
570
  Enabled: true
550
571
  EnforcedStyle: double_quotes
551
572
 
573
+ Style/SuperArguments:
574
+ Enabled: true
575
+
552
576
  Style/SuperWithArgsParentheses:
553
577
  Enabled: true
554
578
 
data/Gemfile.lock CHANGED
@@ -1,41 +1,39 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruboclean (0.6.0)
4
+ ruboclean (0.7.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  ast (2.4.2)
10
- docile (1.4.0)
11
- json (2.7.1)
10
+ docile (1.4.1)
11
+ json (2.7.2)
12
12
  language_server-protocol (3.17.0.3)
13
- minitest (5.20.0)
14
- parallel (1.24.0)
15
- parser (3.2.2.4)
13
+ minitest (5.25.1)
14
+ parallel (1.26.3)
15
+ parser (3.3.5.0)
16
16
  ast (~> 2.4.1)
17
17
  racc
18
- racc (1.7.3)
18
+ racc (1.8.1)
19
19
  rainbow (3.1.1)
20
- rake (13.1.0)
21
- regexp_parser (2.8.3)
22
- rexml (3.2.6)
23
- rubocop (1.59.0)
20
+ rake (13.2.1)
21
+ regexp_parser (2.9.2)
22
+ rubocop (1.67.0)
24
23
  json (~> 2.3)
25
24
  language_server-protocol (>= 3.17.0)
26
25
  parallel (~> 1.10)
27
- parser (>= 3.2.2.4)
26
+ parser (>= 3.3.0.2)
28
27
  rainbow (>= 2.2.2, < 4.0)
29
- regexp_parser (>= 1.8, < 3.0)
30
- rexml (>= 3.2.5, < 4.0)
31
- rubocop-ast (>= 1.30.0, < 2.0)
28
+ regexp_parser (>= 2.4, < 3.0)
29
+ rubocop-ast (>= 1.32.2, < 2.0)
32
30
  ruby-progressbar (~> 1.7)
33
31
  unicode-display_width (>= 2.4.0, < 3.0)
34
- rubocop-ast (1.30.0)
35
- parser (>= 3.2.1.0)
36
- rubocop-minitest (0.34.2)
37
- rubocop (>= 1.39, < 2.0)
38
- rubocop-ast (>= 1.30.0, < 2.0)
32
+ rubocop-ast (1.32.3)
33
+ parser (>= 3.3.1.0)
34
+ rubocop-minitest (0.36.0)
35
+ rubocop (>= 1.61, < 2.0)
36
+ rubocop-ast (>= 1.31.1, < 2.0)
39
37
  rubocop-rake (0.6.0)
40
38
  rubocop (~> 1.0)
41
39
  ruby-progressbar (1.13.0)
@@ -44,7 +42,7 @@ GEM
44
42
  json (>= 1.8, < 3)
45
43
  simplecov-html (~> 0.10.0)
46
44
  simplecov-html (0.10.2)
47
- unicode-display_width (2.5.0)
45
+ unicode-display_width (2.6.0)
48
46
 
49
47
  PLATFORMS
50
48
  ruby
data/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  Finally it orders the configurations **alphabetically** within these groups.
14
14
 
15
- ## Example
15
+ ## Main example
16
16
 
17
17
  ### Input `.rubocop.yml`:
18
18
 
@@ -66,7 +66,7 @@ Rails/ShortI18n:
66
66
  Add this line to your application's Gemfile:
67
67
 
68
68
  ```ruby
69
- gem 'ruboclean', require: false
69
+ gem "ruboclean", require: false
70
70
  ```
71
71
 
72
72
  And then execute:
@@ -84,20 +84,23 @@ gem install ruboclean
84
84
  ## Command synopsis
85
85
 
86
86
  ```shell
87
- ruboclean [path] [--silent] [--preserve-comments] [--preserve-paths] [--verify]
87
+ ruboclean [input] \
88
+ [--stdin] \
89
+ [--output=/path/to/file.yml] \
90
+ [--silent] \
91
+ [--preserve-comments] \
92
+ [--preserve-paths] \
93
+ [--verify]
88
94
  ```
89
95
 
90
96
  ### Parameters
91
97
 
92
- | Parameter | Description |
93
- |:----------------------|:--------------------------------------------------------------------------------------------------------------------------------------|
94
- | `path` | Can be a directory that contains a `.rubocop.yml`, or a path to a `.rubocop.yml` directly. Defaults to the current working directory. |
95
- | `--silent` | Suppress any output displayed on the screen when executing the command. |
96
- | `--preserve-comments` | Preserves **preceding** comments for each top-level entry in the configuration. Inline comments are **not** preserved. |
97
- | `--preserve-paths` | Skips the path cleanup that are applied against `Include:` and `Exclude:` configuration. |
98
- | `--verify` | Executes in dry-run mode. Exits with 1 if changes are needed, otherwise 0. |
98
+ #### `input`
99
99
 
100
- ### Examples
100
+ Can be a directory that contains a `.rubocop.yml`, or a path to a `.rubocop.yml` directly.
101
+ Defaults to the current working directory.
102
+
103
+ ##### Examples
101
104
 
102
105
  ```shell
103
106
  ruboclean # uses `.rubocop.yml` of current working directory
@@ -105,6 +108,60 @@ ruboclean /path/to/dir # uses `.rubocop.yml` of /path/to/dir
105
108
  ruboclean /path/to/dir/.rubocop.yml
106
109
  ```
107
110
 
111
+ #### `--stdin`
112
+
113
+ It's possible to read from `STDIN`, for example:
114
+
115
+ ```shell
116
+ echo "SomeConfig: True" | ruboclean --stdin
117
+ ```
118
+
119
+ Using `STDIN` will automatically set the output to `STDOUT`. You can use the `--output` flag to override this.
120
+
121
+ Also, if you use `STDIN`, your current working directory should be the root directory of your project, so that the
122
+ cleanup of unused paths/references (see `--preserve-paths`) works properly. If your current working directory
123
+ is something else, you have to explicitly provide the project's root directory using the `input` argument.
124
+
125
+ ```shell
126
+ echo "SomeConfig: True" | ruboclean /path/to/the/project/directory --stdin
127
+ ```
128
+
129
+ #### `--output=/path/to/file.yml`
130
+
131
+ Output path where the result is written to.
132
+ Can be absolute or relative to the current working directory.
133
+ `--output=STDOUT` prints it to `STDOUT` and not to a file, and silences all logging (see `--silent`).
134
+
135
+ ##### Examples
136
+
137
+ ```shell
138
+ ruboclean --output=/absolute/path.yml
139
+ ruboclean --output=relative/path.yml # relative to current working directory
140
+ ruboclean --output=STDOUT # does not write anything to a file
141
+ ```
142
+
143
+ #### `--silent`
144
+
145
+ Suppress any log output displayed on the screen when executing the command.
146
+ Using `--output=STDOUT` also forces this.
147
+
148
+ #### `--preserve-comments`
149
+
150
+ Preserves **preceding** comments for each top-level entry in the configuration.
151
+ Inline comments are **not** preserved.
152
+
153
+ See main example above for explanation.
154
+
155
+ #### `--preserve-paths`
156
+
157
+ Skips the path cleanup that are applied against `Include:` and `Exclude:` configurations.
158
+
159
+ See main example above for explanation.
160
+
161
+ #### `--verify`
162
+
163
+ Executes in dry-run mode. Exits with `1` if changes are needed, otherwise `0`.
164
+
108
165
  ## Development
109
166
 
110
167
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -113,7 +170,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
113
170
 
114
171
  ## Contributing
115
172
 
116
- Bug reports and pull requests are welcome on GitHub at https://github.com/lxxxvi/ruboclean. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/lxxxvi/ruboclean/blob/master/CODE_OF_CONDUCT.md).
173
+ Bug reports and pull requests are welcome on GitHub at https://github.com/lxxxvi/ruboclean. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/lxxxvi/ruboclean/blob/main/CODE_OF_CONDUCT.md).
117
174
 
118
175
  ## License
119
176
 
@@ -121,4 +178,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
121
178
 
122
179
  ## Code of Conduct
123
180
 
124
- Everyone interacting in the Ruboclean project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/lxxxvi/ruboclean/blob/master/CODE_OF_CONDUCT.md).
181
+ Everyone interacting in the Ruboclean project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/lxxxvi/ruboclean/blob/main/CODE_OF_CONDUCT.md).
@@ -3,48 +3,78 @@
3
3
  module Ruboclean
4
4
  # Reads command line arguments and exposes corresponding reader methods
5
5
  class CliArguments
6
+ FLAG_DEFAULTS = {
7
+ "--stdin" => false,
8
+ "--output" => nil,
9
+ "--silent" => false,
10
+ "--preserve-comments" => false,
11
+ "--preserve-paths" => false,
12
+ "--verify" => false
13
+ }.freeze
14
+
6
15
  def initialize(command_line_arguments = [])
7
16
  @command_line_arguments = Array(command_line_arguments)
8
17
  end
9
18
 
10
- def path
11
- @path ||= find_path
19
+ def input
20
+ @input ||= find_input
21
+ end
22
+
23
+ def stdin?
24
+ flag_arguments.fetch("--stdin")
12
25
  end
13
26
 
14
- def verbose?
15
- !silent?
27
+ def output
28
+ flag_arguments.fetch("--output")
16
29
  end
17
30
 
18
31
  def silent?
19
- @silent ||= find_argument("--silent")
32
+ flag_arguments.fetch("--silent")
20
33
  end
21
34
 
22
35
  def preserve_comments?
23
- @preserve_comments ||= find_argument("--preserve-comments")
36
+ flag_arguments.fetch("--preserve-comments")
24
37
  end
25
38
 
26
39
  def preserve_paths?
27
- @preserve_paths ||= find_argument("--preserve-paths")
40
+ flag_arguments.fetch("--preserve-paths")
28
41
  end
29
42
 
30
43
  def verify?
31
- @verify ||= find_argument("--verify")
44
+ flag_arguments.fetch("--verify")
32
45
  end
33
46
 
34
47
  private
35
48
 
36
49
  attr_reader :command_line_arguments
37
50
 
38
- def find_path
39
- command_line_arguments.first.then do |argument|
40
- return Dir.pwd if argument.nil? || argument.start_with?("--")
51
+ def find_input
52
+ first_argument = command_line_arguments.first
41
53
 
42
- argument
43
- end
54
+ return nil if first_argument.nil? || first_argument.start_with?("--")
55
+
56
+ first_argument
57
+ end
58
+
59
+ def flag_arguments
60
+ @flag_arguments ||= FLAG_DEFAULTS.dup.merge(custom_flag_arguments)
44
61
  end
45
62
 
46
- def find_argument(name)
47
- command_line_arguments.any? { |argument| argument == name }
63
+ def custom_flag_arguments
64
+ command_line_arguments.each_with_object({}) do |item, hash|
65
+ next unless item.start_with?("--")
66
+
67
+ flag_name, flag_value = item.split("=")
68
+
69
+ raise ArgumentError, "invalid argument '#{item}'" unless FLAG_DEFAULTS.include?(flag_name)
70
+
71
+ flag_default_value = FLAG_DEFAULTS[flag_name]
72
+
73
+ hash[flag_name] = flag_value
74
+
75
+ # Subject to change: We may need to find another way to determine if an argument has Boolean characteristics
76
+ hash[flag_name] = !flag_value if flag_default_value.is_a?(FalseClass)
77
+ end
48
78
  end
49
79
  end
50
80
  end
@@ -8,12 +8,14 @@ module Ruboclean
8
8
  # If all entries in `Include` or `Exclude` are removed, the entire property is removed.
9
9
  # If a Cop gets entirely truncated due to removing all `Includes` and/or `Exclude`, the Cop itself will be removed.
10
10
  class PathCleanup
11
- def initialize(configuration_hash, root_directory)
11
+ def initialize(configuration_hash, options:)
12
12
  @configuration_hash = configuration_hash
13
- @root_directory = root_directory
13
+ @options = options
14
14
  end
15
15
 
16
16
  def cleanup
17
+ return configuration_hash if options.preserve_paths?
18
+
17
19
  configuration_hash.each_with_object({}) do |(top_level_key, top_level_value), hash|
18
20
  result = process_top_level_value(top_level_value)
19
21
 
@@ -25,7 +27,11 @@ module Ruboclean
25
27
 
26
28
  private
27
29
 
28
- attr_reader :configuration_hash, :root_directory
30
+ attr_reader :configuration_hash, :options
31
+
32
+ def root_directory
33
+ options.input_path.dirname
34
+ end
29
35
 
30
36
  # top_level_value could be something like this:
31
37
  #
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ruboclean
4
+ class Runner
5
+ class Options
6
+ # Determines the input stream
7
+ class Input
8
+ def initialize(cli_arguments:)
9
+ @cli_arguments = cli_arguments
10
+ end
11
+
12
+ def stream
13
+ @stream ||= determine_input_stream
14
+ end
15
+
16
+ def input_path
17
+ @input_path ||= find_input_path
18
+ end
19
+
20
+ def stdin?
21
+ cli_arguments.stdin?
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :cli_arguments
27
+
28
+ def determine_input_stream
29
+ return $stdin if stdin?
30
+
31
+ return input_path if input_path.exist?
32
+
33
+ raise ArgumentError, "input path does not exist: '#{input_path}'"
34
+ end
35
+
36
+ def find_input_path
37
+ pathname = cli_arguments.input.nil? ? Pathname.new(Dir.pwd) : Pathname.new(cli_arguments.input)
38
+ pathname = pathname.join(".rubocop.yml") if pathname.directory?
39
+ pathname
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ruboclean
4
+ class Runner
5
+ class Options
6
+ # Determines the output stream
7
+ class Output
8
+ def initialize(cli_arguments:, input:)
9
+ @cli_arguments = cli_arguments
10
+ @input = input
11
+ end
12
+
13
+ def stream
14
+ @stream ||= determine_output_stream
15
+ end
16
+
17
+ def stdout?
18
+ (cli_arguments.output.nil? && input.stdin?) ||
19
+ cli_arguments.output == "STDOUT"
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :cli_arguments, :input
25
+
26
+ def determine_output_stream
27
+ return $stdout if stdout?
28
+
29
+ output_path
30
+ end
31
+
32
+ def output_path
33
+ @output_path ||= find_output_path
34
+ end
35
+
36
+ def find_output_path
37
+ return input.stream if cli_arguments.output.nil?
38
+
39
+ pathname = Pathname.new(cli_arguments.output)
40
+ pathname = Pathname.new(Dir.pwd).join(pathname) if pathname.relative?
41
+
42
+ return pathname unless pathname.directory?
43
+
44
+ raise ArgumentError, "output path (--output=#{pathname}) cannot be a directory"
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ruboclean
4
+ class Runner
5
+ # Consolidates cli_arguments with "smart" defaults
6
+ class Options
7
+ def initialize(cli_arguments:)
8
+ @cli_arguments = cli_arguments
9
+ end
10
+
11
+ def input_stream
12
+ input.stream
13
+ end
14
+
15
+ def input_path
16
+ input.input_path
17
+ end
18
+
19
+ def output_stream
20
+ output.stream
21
+ end
22
+
23
+ def verbose?
24
+ !silent?
25
+ end
26
+
27
+ def silent?
28
+ cli_arguments.silent? || output.stdout?
29
+ end
30
+
31
+ def preserve_comments?
32
+ cli_arguments.preserve_comments?
33
+ end
34
+
35
+ def preserve_paths?
36
+ cli_arguments.preserve_paths?
37
+ end
38
+
39
+ def verify?
40
+ cli_arguments.verify?
41
+ end
42
+
43
+ private
44
+
45
+ attr_reader :cli_arguments
46
+
47
+ def input
48
+ @input ||= Ruboclean::Runner::Options::Input.new(cli_arguments: cli_arguments)
49
+ end
50
+
51
+ def output
52
+ @output ||= Ruboclean::Runner::Options::Output.new(cli_arguments: cli_arguments, input: input)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -6,18 +6,19 @@ require "yaml"
6
6
  module Ruboclean
7
7
  # Entry point for processing
8
8
  class Runner
9
- def initialize(args = [])
10
- @cli_arguments = CliArguments.new(args)
9
+ def initialize(command_line_arguments = [])
10
+ cli_arguments = CliArguments.new(command_line_arguments)
11
+ @options = Runner::Options.new(cli_arguments: cli_arguments)
11
12
  end
12
13
 
13
14
  def run!
14
- return if source_file_pathname.empty?
15
+ return if source_yaml.empty?
15
16
 
16
- load_file.then(&method(:order))
17
- .then(&method(:cleanup_paths))
18
- .then(&method(:convert_to_yaml))
19
- .then(&method(:write_file!))
20
- .then(&method(:changed?))
17
+ parse_yaml.then(&method(:order))
18
+ .then(&method(:cleanup_paths))
19
+ .then(&method(:convert_to_yaml))
20
+ .then(&method(:write_stream!))
21
+ .then(&method(:changed?))
21
22
  end
22
23
 
23
24
  def changed?(target_yaml)
@@ -25,26 +26,26 @@ module Ruboclean
25
26
  end
26
27
 
27
28
  def verbose?
28
- cli_arguments.verbose?
29
+ options.verbose?
29
30
  end
30
31
 
31
32
  def verify?
32
- cli_arguments.verify?
33
+ options.verify?
33
34
  end
34
35
 
35
- def path
36
- cli_arguments.path
36
+ def input_path
37
+ options.input_path
37
38
  end
38
39
 
39
40
  private
40
41
 
41
- attr_reader :cli_arguments
42
+ attr_reader :options
42
43
 
43
44
  def source_yaml
44
- @source_yaml ||= source_file_pathname.read
45
+ @source_yaml ||= options.input_stream.read
45
46
  end
46
47
 
47
- def load_file
48
+ def parse_yaml
48
49
  YAML.safe_load(source_yaml, permitted_classes: [Regexp])
49
50
  end
50
51
 
@@ -53,33 +54,15 @@ module Ruboclean
53
54
  end
54
55
 
55
56
  def cleanup_paths(configuration_hash)
56
- return configuration_hash if cli_arguments.preserve_paths?
57
-
58
- PathCleanup.new(configuration_hash, source_file_pathname.dirname).cleanup
57
+ PathCleanup.new(configuration_hash, options: options).cleanup
59
58
  end
60
59
 
61
60
  def convert_to_yaml(configuration_hash)
62
- ToYamlConverter.new(configuration_hash, cli_arguments.preserve_comments?, source_yaml).to_yaml
63
- end
64
-
65
- def write_file!(target_yaml)
66
- target_yaml.tap do |content|
67
- source_file_pathname.write(content) unless verify?
68
- end
69
- end
70
-
71
- def source_file_pathname
72
- @source_file_pathname ||= find_source_file_pathname
61
+ ToYamlConverter.new(configuration_hash, source_yaml, options: options).to_yaml
73
62
  end
74
63
 
75
- def find_source_file_pathname
76
- source_path = Pathname.new(cli_arguments.path)
77
-
78
- source_path = source_path.join(".rubocop.yml") if source_path.directory?
79
-
80
- return source_path if source_path.exist?
81
-
82
- raise ArgumentError, "path does not exist: '#{source_path}'"
64
+ def write_stream!(target_yaml)
65
+ StreamWriter.new(target_yaml, options: options).write!
83
66
  end
84
67
  end
85
68
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ruboclean
4
+ # Orders the items within the groups alphabetically
5
+ class StreamWriter
6
+ def initialize(content, options:)
7
+ @content = content
8
+ @options = options
9
+ end
10
+
11
+ def write!
12
+ options.output_stream.write(content) unless options.verify?
13
+
14
+ content
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :content, :options
20
+ end
21
+ end
@@ -3,27 +3,23 @@
3
3
  module Ruboclean
4
4
  # Converts the configuration hash to YAML and applies modifications on it, if requested
5
5
  class ToYamlConverter
6
- def initialize(configuration_hash, preserve_comments, source_yaml)
6
+ def initialize(configuration_hash, source_yaml, options:)
7
7
  @configuration_hash = configuration_hash
8
- @preserve_comments = preserve_comments
9
8
  @source_yaml = source_yaml
9
+ @options = options
10
10
  end
11
11
 
12
12
  def to_yaml
13
13
  target_yaml = sanitize_yaml(configuration_hash.transform_keys(&:to_s).to_yaml)
14
14
 
15
- return target_yaml unless preserve_comments?
15
+ return target_yaml unless options.preserve_comments?
16
16
 
17
17
  preserve_preceding_comments(source_yaml, target_yaml)
18
18
  end
19
19
 
20
20
  private
21
21
 
22
- attr_reader :configuration_hash, :preserve_comments, :source_yaml
23
-
24
- def preserve_comments?
25
- preserve_comments
26
- end
22
+ attr_reader :configuration_hash, :source_yaml, :options
27
23
 
28
24
  def sanitize_yaml(data)
29
25
  data.gsub(/^([a-zA-Z]+)/, "\n\\1")
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ruboclean
4
- VERSION = "0.6.0"
4
+ VERSION = "0.7.0"
5
5
  end
data/lib/ruboclean.rb CHANGED
@@ -6,6 +6,10 @@ require "ruboclean/logger"
6
6
  require "ruboclean/grouper"
7
7
  require "ruboclean/path_cleanup"
8
8
  require "ruboclean/runner"
9
+ require "ruboclean/runner/options"
10
+ require "ruboclean/runner/options/input"
11
+ require "ruboclean/runner/options/output"
12
+ require "ruboclean/stream_writer"
9
13
  require "ruboclean/to_yaml_converter"
10
14
  require "ruboclean/version"
11
15
 
@@ -15,7 +19,7 @@ module Ruboclean
15
19
  runner = Runner.new(args)
16
20
  logger = Ruboclean::Logger.new(runner.verbose? ? :verbose : :none)
17
21
 
18
- logger.verbose "Using path '#{runner.path}' ... "
22
+ logger.verbose "Using input path '#{runner.input_path}' ... "
19
23
  changed = runner.run!
20
24
  logger.verbose post_execution_message(changed, runner.verify?)
21
25
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruboclean
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - lxxxvi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-07 00:00:00.000000000 Z
11
+ date: 2024-12-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Cleans and orders settings in .rubocop.yml
14
14
  email:
@@ -38,6 +38,10 @@ files:
38
38
  - lib/ruboclean/orderer.rb
39
39
  - lib/ruboclean/path_cleanup.rb
40
40
  - lib/ruboclean/runner.rb
41
+ - lib/ruboclean/runner/options.rb
42
+ - lib/ruboclean/runner/options/input.rb
43
+ - lib/ruboclean/runner/options/output.rb
44
+ - lib/ruboclean/stream_writer.rb
41
45
  - lib/ruboclean/to_yaml_converter.rb
42
46
  - lib/ruboclean/version.rb
43
47
  - ruboclean.gemspec
@@ -64,7 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
64
68
  - !ruby/object:Gem::Version
65
69
  version: '0'
66
70
  requirements: []
67
- rubygems_version: 3.5.3
71
+ rubygems_version: 3.5.23
68
72
  signing_key:
69
73
  specification_version: 4
70
74
  summary: Cleans and orders settings in .rubocop.yml