rfix 1.0.15 → 1.1.0.pre.147

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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/.rspec +0 -1
  4. data/.rubocop.yml +46 -31
  5. data/.travis.yml +5 -12
  6. data/Gemfile.base +10 -3
  7. data/Gemfile.base.lock +172 -0
  8. data/Gemfile.lock +28 -7
  9. data/Guardfile +1 -1
  10. data/Makefile +4 -13
  11. data/Rakefile +16 -95
  12. data/ci/Gemfile.rubocop-0.80.lock +16 -1
  13. data/ci/Gemfile.rubocop-0.81.lock +16 -1
  14. data/ci/Gemfile.rubocop-0.82.lock +16 -1
  15. data/ci/Gemfile.rubocop-0.83.lock +19 -4
  16. data/ci/Gemfile.rubocop-0.84.lock +19 -4
  17. data/ci/Gemfile.rubocop-0.85.1.lock +19 -4
  18. data/ci/Gemfile.rubocop-0.85.lock +16 -1
  19. data/exe/rfix +18 -144
  20. data/lib/rfix.rb +10 -3
  21. data/lib/rfix/box.rb +112 -0
  22. data/lib/rfix/branch.rb +30 -0
  23. data/lib/rfix/branches/base.rb +29 -0
  24. data/lib/rfix/branches/head.rb +11 -0
  25. data/lib/rfix/branches/main.rb +33 -0
  26. data/lib/rfix/branches/name.rb +21 -0
  27. data/lib/rfix/branches/reference.rb +19 -0
  28. data/lib/rfix/branches/upstream.rb +11 -0
  29. data/lib/rfix/cmd.rb +9 -14
  30. data/lib/rfix/commands/all.rb +26 -0
  31. data/lib/rfix/commands/branch.rb +15 -0
  32. data/lib/rfix/commands/extensions/options.rb +8 -0
  33. data/lib/rfix/commands/help.rb +7 -0
  34. data/lib/rfix/commands/helper/args.rb +137 -0
  35. data/lib/rfix/commands/helper/help.rb +6 -0
  36. data/lib/rfix/commands/helper/loader.rb +6 -0
  37. data/lib/rfix/commands/helper/option.rb +0 -0
  38. data/lib/rfix/commands/helper/params.rb +0 -0
  39. data/lib/rfix/commands/helper/rubocop.rb +17 -0
  40. data/lib/rfix/commands/info.rb +30 -0
  41. data/lib/rfix/commands/lint.rb +23 -0
  42. data/lib/rfix/commands/local.rb +12 -0
  43. data/lib/rfix/commands/origin.rb +19 -0
  44. data/lib/rfix/commands/setup.rb +29 -0
  45. data/lib/rfix/commands/welcome.rb +24 -0
  46. data/lib/rfix/deleted.rb +13 -0
  47. data/lib/rfix/error.rb +2 -0
  48. data/lib/rfix/extensions/extensions.rb +4 -26
  49. data/lib/rfix/extensions/offense.rb +2 -1
  50. data/lib/rfix/extensions/string.rb +8 -0
  51. data/lib/rfix/file.rb +46 -0
  52. data/lib/rfix/file_cache.rb +59 -0
  53. data/lib/rfix/formatter.rb +37 -10
  54. data/lib/rfix/git_helper.rb +13 -1
  55. data/lib/rfix/log.rb +104 -7
  56. data/lib/rfix/no_file.rb +13 -0
  57. data/lib/rfix/rake/paths.rb +50 -0
  58. data/lib/rfix/rake/support.rb +75 -0
  59. data/lib/rfix/repository.rb +201 -0
  60. data/lib/rfix/rfix.rb +7 -198
  61. data/lib/rfix/tracked.rb +76 -0
  62. data/lib/rfix/tracked_file.rb +1 -1
  63. data/lib/rfix/untracked.rb +13 -0
  64. data/lib/rfix/version.rb +1 -1
  65. data/path.rb +7 -0
  66. data/rfix.gemspec +6 -2
  67. data/rugged.rb +206 -0
  68. data/tasks/bump.rake +11 -0
  69. data/tasks/bundle.rake +17 -0
  70. data/tasks/complex.rake +54 -0
  71. data/tasks/simple.rake +58 -0
  72. data/tasks/travis.rake +74 -0
  73. data/tasks/vendor.rake +34 -0
  74. metadata +136 -13
  75. data/file.rb +0 -1
  76. data/lib/rfix/gem_helper.rb +0 -12
  77. data/lib/rfix/git_file.rb +0 -36
  78. data/lib/rfix/rake_helper.rb +0 -56
  79. data/lib/rfix/untracked_file.rb +0 -13
@@ -0,0 +1,30 @@
1
+ require "rfix/repository"
2
+ require "rfix/error"
3
+
4
+ module Rfix
5
+ module Branch
6
+ class UnknownBranchError < Rfix::Error
7
+ end
8
+
9
+ class NotYetImplementedError < Rfix::Error
10
+ end
11
+ end
12
+ end
13
+
14
+ Pathname(__dir__).glob("branches/*.rb").each(&method(:require))
15
+
16
+ module Rfix
17
+ module Branch
18
+ UPSTREAM = Branch::Upstream.new
19
+ MAIN = Branch::Main.new
20
+ HEAD = Branch::Head.new
21
+
22
+ def self.local(at: Dir.pwd)
23
+ repo(at: at).branches.each_name(:local).sort
24
+ end
25
+
26
+ def self.repo(at:)
27
+ Rugged::Repository.new(at)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ class Rfix::Branch::Base
2
+ def resolve(with:)
3
+ raise Rfix::NotYetImplementedError.new("#resolved")
4
+ end
5
+
6
+ def to_s
7
+ raise Rfix::NotYetImplementedError.new("#to_s")
8
+ end
9
+
10
+ def branch(using:)
11
+ names(using: using).last or raise Rfix::Error.new("No named branch found for {{error:#{self}}}")
12
+ end
13
+
14
+ def names(using:)
15
+ oid = resolve(with: using).oid
16
+ locals = using.branches.each_name(:local).to_a
17
+
18
+ using.branches.select do |branch|
19
+ next false unless locals.include?(branch.name)
20
+ branch.target_id == oid
21
+ end
22
+ end
23
+
24
+ def revparse(using:, ref:)
25
+ using.rev_parse(ref)
26
+ rescue Rugged::InvalidError
27
+ raise Rfix::Branch::UnknownBranchError.new("Could not find reference {{error:#{ref}}}")
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ module Rfix
2
+ class Branch::Head < Branch::Base
3
+ def resolve(with:)
4
+ with.lookup(with.head.target_id)
5
+ end
6
+
7
+ def to_s
8
+ "HEAD"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,33 @@
1
+ require "rugged"
2
+
3
+ module Rfix
4
+ class Branch::Main < Branch::Base
5
+ KEY = "rfix.main.branch"
6
+
7
+ def resolve(with:)
8
+ unless name = with.config[KEY]
9
+ raise Error.new("Please run {{command:rfix setup}} first")
10
+ end
11
+
12
+ String.new(name).resolve(with: with)
13
+ end
14
+
15
+ def self.set(branch, at: Dir.pwd)
16
+ unless branch.is_a?(String)
17
+ raise Rfix::Error.new("Branch must be a string, got {{error:#{branch.class}}}")
18
+ end
19
+
20
+ check = Branch::Name.new(branch)
21
+ repo = Branch.repo(at: at)
22
+ Branch.repo(at: at).config[KEY] = check.branch(using: repo).name
23
+ end
24
+
25
+ def self.get(at: Dir.pwd)
26
+ Branch.repo(at: at).config[KEY]
27
+ end
28
+
29
+ def to_s
30
+ "configured main branch"
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ module Rfix
2
+ class Branch::Name < Branch::Base
3
+ attr_reader :name
4
+
5
+ def initialize(name)
6
+ @name = name
7
+ end
8
+
9
+ def resolve(with:)
10
+ unless branch = with.branches[name]
11
+ raise Branch::UnknownBranchError.new("Could not find branch {{error:#{name}}}")
12
+ end
13
+
14
+ with.lookup(with.merge_base(branch.target_id, with.head.target_id))
15
+ rescue Rugged::ReferenceError
16
+ raise Branch::UnknownBranchError.new("Could not find branch {{error:#{name}}}")
17
+ end
18
+
19
+ alias to_s name
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module Rfix
2
+ class Branch::Reference < Branch::Base
3
+ attr_reader :reference
4
+
5
+ def initialize(reference)
6
+ @reference = reference
7
+ end
8
+
9
+ def resolve(with:)
10
+ Branch::Name.new(reference).resolve(with: with)
11
+ rescue Branch::UnknownBranchError
12
+ revparse(using: with, ref: reference)
13
+ rescue Rugged::InvalidError
14
+ raise Branch::UnknownBranchError.new("Branch with reference {{error:#{reference}}} not found")
15
+ end
16
+
17
+ alias to_s reference
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ module Rfix
2
+ class Branch::Upstream < Branch::Base
3
+ def resolve(with:)
4
+ with.rev_parse("@{upstream}")
5
+ end
6
+
7
+ def to_s
8
+ "upstream"
9
+ end
10
+ end
11
+ end
@@ -9,20 +9,15 @@ module Rfix::Cmd
9
9
 
10
10
  def cmd(*args, quiet: false)
11
11
  out, err, status = Open3.capture3(*args)
12
- say_debug "[Cmd] {{command:#{args.join(' ')}}}"
13
-
14
- unless status.success?
15
- return yield if block_given?
16
- return if quiet
17
-
18
- say_error "[Cmd] {{italic:#{args.join(' ')}}}"
19
- say_error "[Pwd] {{italic:#{Dir.pwd}}}"
20
- say_error "[Err] {{error:#{err.strip}}}"
21
-
22
- exit status.exitstatus
23
- end
24
-
25
- out.lines.map(&:chomp)
12
+ box = Rfix::Box.new(out, err, status, args, quiet)
13
+ return box.stdout if box.success?
14
+ return yield if block_given?
15
+ return if quiet
16
+
17
+ box.render(color: :red)
18
+ exit box.exit_status
19
+ ensure
20
+ # box.render(debug: false)
26
21
  end
27
22
 
28
23
  def cmd_succeeded?(*cmd)
@@ -0,0 +1,26 @@
1
+ # helper("help", binding)
2
+ # helper("rubocop", binding)
3
+ # helper("args", binding)
4
+ #
5
+ # summary "All"
6
+ #
7
+ # run do |opts, args, cmd|
8
+ # setup(opts, args) do |repo, files|
9
+ # q1 = "Are you sure you want to {{warning:auto-fix}} the {{warning:the entire folder}}"
10
+ # q2 = "Are you sure you want to {{warning:auto-fix}} everything in {{warning:#{files.join(", ")}?}}"
11
+ #
12
+ # begin
13
+ # if files.empty?
14
+ # unless CLI::UI.confirm(q1)
15
+ # exit 1
16
+ # end
17
+ # elsif CLI::UI.confirm(q2)
18
+ # exit 1
19
+ # end
20
+ # rescue Interrupt
21
+ # exit 1
22
+ # end
23
+ #
24
+ # Rfix.global_enable!
25
+ # end
26
+ # end
@@ -0,0 +1,15 @@
1
+ r_args = []
2
+
3
+ helper("help", binding)
4
+ helper("rubocop", binding)
5
+ helper("args", binding)
6
+
7
+ param :branch
8
+ usage "rfix branch BRANCH [opts] [-p path ..]"
9
+ option :p, :path, "Path to be passed to RuboCop", argument: :required, multiple: true
10
+ summary "Fix changes made between HEAD and <branch>"
11
+
12
+ run do |opts, args, _cmd|
13
+ branch = Rfix::Branch::Reference.new(args[:branch])
14
+ setup(r_args, opts, args, files: opts[:path] || [], reference: branch)
15
+ end
@@ -0,0 +1,8 @@
1
+ module Rfix::Ext::Opt
2
+ def define_options
3
+ @define_options ||= super
4
+ end
5
+ alias opts define_options
6
+ end
7
+
8
+ RuboCop::Options.prepend(Rfix::Ext::Opt)
@@ -0,0 +1,7 @@
1
+ extend Rfix::Log
2
+
3
+ summary "Displays help"
4
+
5
+ run do |_opts, _args, cmd|
6
+ prt cmd.supercommand.help
7
+ end
@@ -0,0 +1,137 @@
1
+ option :r, :root, "{{*}} Project root path", default: Dir.pwd, argument: :required
2
+ option :b, :"main-branch", "{{*}} Branch to use", default: "master", argument: :required
3
+ option :l, :limit, "{{*}} Limit number of files", argument: :required, transform: method(:Integer)
4
+
5
+ flag nil, :dry, "{{*}} Run in dry mode"
6
+ flag nil, :untracked, "{{*}} Load untracked files"
7
+ flag nil, :"clear-cache", "{{*}} Clear Rubocop`s cache"
8
+ flag nil, :test, "{{*}} Used in tests"
9
+
10
+ def validate!(files:)
11
+ return [] unless files.is_a?(Array)
12
+
13
+ files.each do |file|
14
+ unless File.exist?(file)
15
+ say_abort "Passed file {{error:#{file}}} does not exist"
16
+ end
17
+ end
18
+
19
+ files
20
+ end
21
+
22
+ def setup(r_args = [], opts, _args, files: [], reference:)
23
+ # files = validate!(files: files)
24
+ options = RuboCop::Options.new
25
+ store = RuboCop::ConfigStore.new
26
+
27
+ params = {
28
+ force_exclusion: true,
29
+ formatters: ["Rfix::Formatter"],
30
+ auto_correct: true
31
+ }
32
+
33
+ if opts.key?(:format)
34
+ params.delete(:formatters)
35
+ end
36
+
37
+ if opts.key?(:dry)
38
+ params[:auto_correct] = false
39
+ end
40
+
41
+ if opts.key?(:test)
42
+ params.delete(:formatters)
43
+ params[:format] = "json"
44
+ params[:cache] = "false"
45
+ Rfix.test = true
46
+
47
+ unless opts.key?(:root)
48
+ raise "No --root passed with --test"
49
+ end
50
+
51
+ unless opts.key?(:config)
52
+ raise "No --config passed with --test"
53
+ end
54
+ end
55
+
56
+ if opts[:cache] == "false"
57
+ params[:cache] = "false"
58
+ end
59
+
60
+ begin
61
+ Rfix.repo = repo = Rfix::Repository.new(
62
+ root_path: opts[:root],
63
+ load_untracked: opts[:untracked],
64
+ reference: reference,
65
+ paths: files || []
66
+ )
67
+ rescue Rugged::RepositoryError => e
68
+ say_abort e.to_s
69
+ rescue Rfix::Error => e
70
+ say_abort e.to_s
71
+ end
72
+
73
+ # RuboCop::ResultCache.cleanup(store, true)
74
+
75
+ if opts[:"clear-cache"]
76
+ RuboCop::ResultCache.cleanup(store, true)
77
+ params[:cache] = "false"
78
+ say_debug "Cleared Rubocop`s cache"
79
+ end
80
+
81
+ if block_given?
82
+ yield(repo, [])
83
+ end
84
+
85
+ begin
86
+ params2, paths = options.parse(r_args)
87
+ rescue OptionParser::MissingArgument => e
88
+ say_abort e.to_s
89
+ end
90
+
91
+ params2.merge!(params)
92
+
93
+ begin
94
+ if config = opts[:config]
95
+ store.options_config = config
96
+ elsif root_path = opts[:root]
97
+ store.for(root_path)
98
+ end
99
+ rescue RuboCop::Error => e
100
+ say_abort e.to_s
101
+ rescue TypeError => e
102
+ say_abort e.to_s
103
+ rescue Psych::SyntaxError => e
104
+ say_abort e.to_s
105
+ end
106
+
107
+ # unless files.empty?
108
+ # say "Loading files from {{italic:#{files.join(', ')}}}"
109
+ # end
110
+
111
+ if !files.empty?
112
+ paths = files
113
+ elsif paths.empty? && repo.paths.empty?
114
+ if opts[:format] == "json"
115
+ prt JSON.pretty_generate({"files": []})
116
+ exit 0
117
+ else
118
+ say_exit "Everything looks good, nothing to lint"
119
+ end
120
+ elsif paths.empty?
121
+ paths = repo.paths
122
+ end
123
+
124
+ if limit = opts[:limit]
125
+ paths = paths.take(limit)
126
+ end
127
+
128
+ env = RuboCop::CLI::Environment.new(params2, store, paths)
129
+
130
+ begin
131
+ exit RuboCop::CLI::Command::ExecuteRunner.new(env).run
132
+ rescue RuboCop::Runner::InfiniteCorrectionLoop => e
133
+ say_abort e.to_s
134
+ rescue RuboCop::Error => e
135
+ say_abort e.to_s
136
+ end
137
+ end
@@ -0,0 +1,6 @@
1
+ extend Rfix::Log
2
+
3
+ flag :h, :help, "show help for this command" do |_value, cmd|
4
+ prt cmd.help
5
+ exit 0
6
+ end
@@ -0,0 +1,6 @@
1
+ module Rfix::Loader
2
+ def helper(file, bind)
3
+ path = File.join(__dir__, file + ".rb")
4
+ eval(IO.read(path), bind, path)
5
+ end
6
+ end
File without changes
File without changes
@@ -0,0 +1,17 @@
1
+ RuboCop::Options.new.opts.instance_eval("@stack", __FILE__, __LINE__).map(&:list).flatten.each do |opt|
2
+ short = opt.short.map { |arg| arg.delete_prefix("-") }
3
+ long = opt.long.map { |arg| arg.delete_prefix("--") }
4
+
5
+ short.unshift(nil) if opt.short.empty?
6
+ long.unshift(nil) if opt.long.empty?
7
+
8
+ if opt.arg
9
+ option(*short, *long, opt.desc.join(" "), argument: :optional) do |value|
10
+ r_args.append(*opt.long, value)
11
+ end
12
+ else
13
+ flag(*short, *long, opt.desc.join(" ")) do
14
+ r_args.append(*opt.long)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,30 @@
1
+ require "rbconfig"
2
+ require "rugged"
3
+
4
+ extend Rfix::Log
5
+ extend Rfix::Cmd
6
+
7
+ def git_version
8
+ cmd("git --version").last.split(/\s+/, 3).last
9
+ end
10
+
11
+ def ruby_version
12
+ RbConfig::CONFIG["ruby_version"] || "<unknown>"
13
+ end
14
+
15
+ def current_os
16
+ RbConfig::CONFIG["host_os"] || "<unknown>"
17
+ end
18
+
19
+ helper("help", binding)
20
+
21
+ summary "Display runtime dependencies and their version"
22
+
23
+ run do |_opts, _args|
24
+ say "Using RuboCop {{info:#{RuboCop::Version.version}}}"
25
+ say "Using Rugged {{info:#{Rugged::VERSION}}}"
26
+ say "Using Rfix {{info:#{Rfix::VERSION}}}"
27
+ say "Using OS {{info:#{current_os}}}"
28
+ say "Using Git {{info:#{git_version}}}"
29
+ say "Using Ruby {{info:#{ruby_version}}}"
30
+ end