git-commander 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.rubocop.yml +38 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +5 -0
  6. data/.yardopts +1 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +6 -0
  9. data/Gemfile.lock +39 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +196 -0
  12. data/Rakefile +7 -0
  13. data/bin/console +14 -0
  14. data/bin/setup +8 -0
  15. data/exe/git-cmd +35 -0
  16. data/git-commander.gemspec +31 -0
  17. data/lib/git_commander.rb +17 -0
  18. data/lib/git_commander/cli.rb +126 -0
  19. data/lib/git_commander/command.rb +168 -0
  20. data/lib/git_commander/command/configurator.rb +26 -0
  21. data/lib/git_commander/command/loaders/file_loader.rb +35 -0
  22. data/lib/git_commander/command/loaders/raw.rb +43 -0
  23. data/lib/git_commander/command/option.rb +43 -0
  24. data/lib/git_commander/command/runner.rb +45 -0
  25. data/lib/git_commander/command_loader_options.rb +34 -0
  26. data/lib/git_commander/loader.rb +28 -0
  27. data/lib/git_commander/loader_result.rb +18 -0
  28. data/lib/git_commander/logger.rb +39 -0
  29. data/lib/git_commander/plugin.rb +50 -0
  30. data/lib/git_commander/plugin/executor.rb +10 -0
  31. data/lib/git_commander/plugin/loader.rb +77 -0
  32. data/lib/git_commander/plugins/git.rb +31 -0
  33. data/lib/git_commander/plugins/github.rb +35 -0
  34. data/lib/git_commander/plugins/prompt.rb +8 -0
  35. data/lib/git_commander/plugins/system.rb +3 -0
  36. data/lib/git_commander/registry.rb +91 -0
  37. data/lib/git_commander/rspec.rb +3 -0
  38. data/lib/git_commander/rspec/plugin_helpers.rb +82 -0
  39. data/lib/git_commander/system.rb +76 -0
  40. data/lib/git_commander/version.rb +5 -0
  41. metadata +159 -0
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'rspec/plugin_helpers'
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rspec/mocks/matchers/receive"
4
+ require "rspec/mocks/any_instance"
5
+ require "rspec/support/differ"
6
+
7
+ module GitCommander
8
+ module RSpec
9
+ # Contains helper methods and matchers for testing git-commander plugins
10
+ module PluginHelpers
11
+ # nodoc
12
+ class MockGemfile
13
+ DEFAULT_GEM_SOURCE = "https://rubygems.org"
14
+
15
+ attr_reader :gems, :options
16
+
17
+ def initialize
18
+ @gems = {}
19
+ @source = DEFAULT_GEM_SOURCE
20
+ end
21
+
22
+ def gem(name, *options)
23
+ @gems[name] = options || []
24
+ end
25
+
26
+ def source(value = nil)
27
+ return "source: '#{@source}'" if value.nil?
28
+
29
+ @source = value
30
+ end
31
+
32
+ def gemfile_lines
33
+ [
34
+ source,
35
+ *@gems.map { |name, options| gem_definition(name, *options) }
36
+ ]
37
+ end
38
+
39
+ def gem_definition(name, *options)
40
+ ["gem '#{name}'", *Array(options).map { |o| gem_option_to_s(o) }].join(", ")
41
+ end
42
+
43
+ def gem_option_to_s(option)
44
+ return "" if option.to_s.empty?
45
+
46
+ case option
47
+ when Hash
48
+ option.map { |k, v| "#{k}: '#{v}'" }
49
+ else
50
+ "'#{option}'"
51
+ end
52
+ end
53
+ end
54
+
55
+ def stub_inline_gemfile
56
+ mock_gemfile = MockGemfile.new
57
+ allow_any_instance_of(GitCommander::Plugin::Loader).to receive(:gemfile) do |*args, &block|
58
+ mock_gemfile.instance_eval(&block)
59
+ end
60
+ mock_gemfile
61
+ end
62
+
63
+ ::RSpec::Matchers.define :have_defined_gems do |gemfile_lines|
64
+ gemfile_lines.map! { |l| l.gsub(/"/, "'") }
65
+ gemfile_lines.prepend(MockGemfile.new.source) if gemfile_lines.none? { |line| line.start_with?("source:") }
66
+
67
+ match do |block|
68
+ mock_gemfile = stub_inline_gemfile unless GitCommander::Plugin::Loader.new(nil).is_a?(MockGemfile)
69
+
70
+ block.call
71
+
72
+ @actual = mock_gemfile.gemfile_lines
73
+
74
+ values_match? gemfile_lines, @actual
75
+ end
76
+
77
+ diffable
78
+ supports_block_expectations
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "singleton"
4
+ require "open3"
5
+
6
+ module GitCommander
7
+ # @abstract A wrapper for system calls
8
+ class System
9
+ DEFAULT_RUN_OPTIONS = {
10
+ silent: false
11
+ }.freeze
12
+
13
+ # @abstract Wraps a system command with logging, stderr, and stdout capture
14
+ class Command
15
+ attr_accessor :output, :error, :status
16
+ attr_reader :name, :options, :command_with_arguments
17
+ def initialize(command_with_arguments, options = {})
18
+ @command_with_arguments = command_with_arguments
19
+ @name = command_with_arguments.split(/\w/i).first
20
+ @options = DEFAULT_RUN_OPTIONS.merge(options)
21
+ end
22
+
23
+ def run
24
+ log_command_initiated
25
+ @output, @error, @status = Open3.capture3(command_with_arguments)
26
+ log_command_completed
27
+ end
28
+
29
+ private
30
+
31
+ def log_command_initiated
32
+ GitCommander.logger.debug <<~COMMAND_LOG
33
+ [system] Running '#{command_with_arguments}' with options #{options.inspect} ...
34
+ COMMAND_LOG
35
+ end
36
+
37
+ def log_command_completed
38
+ GitCommander.logger.debug <<~COMMAND_LOG
39
+ [system] Ran '#{command_with_arguments}' with options #{options.inspect}.
40
+ \tStatus: #{status}
41
+ \tOutput: #{output.inspect}
42
+ \tError: #{error.inspect}
43
+ COMMAND_LOG
44
+ end
45
+ end
46
+
47
+ class RunError < StandardError; end
48
+
49
+ include Singleton
50
+
51
+ # Runs a system command
52
+ # @param [String] command_with_arguments the command string (with args, flags and switches) to run
53
+ # @param [Hash] options the options to run the command with
54
+ # @option options [Boolean] :silent Supress the output of the command
55
+ # @option options [Boolean] :blocking Supress errors running the command
56
+ def self.run(command_with_arguments, options = {})
57
+ command = Command.new(command_with_arguments, options)
58
+
59
+ command.run
60
+
61
+ unless command.status.success? || command.options[:blocking] == false
62
+ raise RunError, "\"#{command.error}\" \"#{command.name}\" failed to run."
63
+ end
64
+
65
+ puts command.output if command.options[:silent] == false
66
+ command.output.strip
67
+ end
68
+
69
+ # Appends to the output stream
70
+ # @param [String] new_output the string to add to the output stream
71
+ def self.say(new_output)
72
+ GitCommander.logger.info "[System#say] #{new_output}"
73
+ puts new_output
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GitCommander
4
+ VERSION = "0.1.0"
5
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: git-commander
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Valentino Stoll
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-03-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: byebug
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '12.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '12.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rdoc
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '6.2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '6.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "<"
60
+ - !ruby/object:Gem::Version
61
+ version: '4.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "<"
67
+ - !ruby/object:Gem::Version
68
+ version: '4.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.1'
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 1.10.0
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: '2.1'
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 1.10.0
89
+ description: Build custom flexible git workflows with Ruby!
90
+ email:
91
+ - v@codenamev.com
92
+ executables:
93
+ - git-cmd
94
+ extensions: []
95
+ extra_rdoc_files: []
96
+ files:
97
+ - ".gitignore"
98
+ - ".rubocop.yml"
99
+ - ".ruby-version"
100
+ - ".travis.yml"
101
+ - ".yardopts"
102
+ - CODE_OF_CONDUCT.md
103
+ - Gemfile
104
+ - Gemfile.lock
105
+ - LICENSE.txt
106
+ - README.md
107
+ - Rakefile
108
+ - bin/console
109
+ - bin/setup
110
+ - exe/git-cmd
111
+ - git-commander.gemspec
112
+ - lib/git_commander.rb
113
+ - lib/git_commander/cli.rb
114
+ - lib/git_commander/command.rb
115
+ - lib/git_commander/command/configurator.rb
116
+ - lib/git_commander/command/loaders/file_loader.rb
117
+ - lib/git_commander/command/loaders/raw.rb
118
+ - lib/git_commander/command/option.rb
119
+ - lib/git_commander/command/runner.rb
120
+ - lib/git_commander/command_loader_options.rb
121
+ - lib/git_commander/loader.rb
122
+ - lib/git_commander/loader_result.rb
123
+ - lib/git_commander/logger.rb
124
+ - lib/git_commander/plugin.rb
125
+ - lib/git_commander/plugin/executor.rb
126
+ - lib/git_commander/plugin/loader.rb
127
+ - lib/git_commander/plugins/git.rb
128
+ - lib/git_commander/plugins/github.rb
129
+ - lib/git_commander/plugins/prompt.rb
130
+ - lib/git_commander/plugins/system.rb
131
+ - lib/git_commander/registry.rb
132
+ - lib/git_commander/rspec.rb
133
+ - lib/git_commander/rspec/plugin_helpers.rb
134
+ - lib/git_commander/system.rb
135
+ - lib/git_commander/version.rb
136
+ homepage: https://github.com/codenamev/git-commander
137
+ licenses:
138
+ - MIT
139
+ metadata: {}
140
+ post_install_message:
141
+ rdoc_options: []
142
+ require_paths:
143
+ - lib
144
+ required_ruby_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ requirements: []
155
+ rubygems_version: 3.1.2
156
+ signing_key:
157
+ specification_version: 4
158
+ summary: Make your own git commands
159
+ test_files: []