dev_oops 0.1.1 → 0.2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a4fc1235dee51577f3b186c51f265c08d75f0f6488828b6d5ed350d762ebead3
4
- data.tar.gz: 29be0998f2a4ea6de8f0134a7dcd9abb093ec0f7b00dcaed5650590e7528ca33
3
+ metadata.gz: 32ee75a41461d7793d454367ce09a989c796df9a50c861d27795a5864e74a9ca
4
+ data.tar.gz: 0351c14d9116a45119a773c69fd1dc493837a48b06366d3b4a2977c34428673a
5
5
  SHA512:
6
- metadata.gz: 97cd48d5a6952c0518e427cdc03310f7e5ef9d8271178649af24e32e293edfd2f97b18cc4a67edd93a12e4b387ba8177f9d9359c6beaa4b3c5baafc227388520
7
- data.tar.gz: daa244988f221b9d2aa115c9394888e3b575bce7ffc4d269277735ec3473e647fc45ff751e26193b073df2ffd53e1775729e434b5ce56471649813001fd2d993
6
+ metadata.gz: 989bb33a56ad674bdfc1a47719648b5111668af45d160c2e971113ca56ccc7dc27c8862962b7c9cae20700f3c2b6e5ff3853239f6a621c96afe066c2871ddc70
7
+ data.tar.gz: 4f967de470975239f896074dea2bf86869647dd3d0f3820f503a0e195539446f99b3e0cdcbc5b5143a884889e4944e20d8d94a07c51a39db1c45a5a14affe1eb
@@ -0,0 +1,58 @@
1
+ name: Test and Release
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ jobs:
9
+ tests:
10
+ strategy:
11
+ matrix:
12
+ ruby: [2.6, 2.7, 3.0]
13
+ runs-on: ubuntu-latest
14
+
15
+ steps:
16
+ - uses: actions/checkout@v2
17
+ - name: Set up Ruby
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: ${{ matrix.ruby }}
21
+ bundler-cache: true
22
+ - name: Run linter
23
+ run: bundle exec rubocop
24
+ - name: Run tests
25
+ run: bundle exec rspec
26
+ prettier:
27
+ runs-on: ubuntu-latest
28
+ steps:
29
+ - uses: actions/checkout@v2
30
+ - name: Set up Node
31
+ uses: actions/setup-node@v2
32
+ with:
33
+ node-version: '14'
34
+ - name: Install yarn dep
35
+ run: yarn install
36
+ - name: Check prettier
37
+ run: yarn prettier -c '**/*.rb'
38
+ release:
39
+ needs: [tests, prettier]
40
+ runs-on: ubuntu-latest
41
+
42
+ steps:
43
+ - uses: actions/checkout@v2
44
+ - name: Set up Ruby
45
+ uses: ruby/setup-ruby@v1
46
+ with:
47
+ ruby-version: 3.0
48
+ bundler-cache: true
49
+ - name: Prepare credentials
50
+ env:
51
+ RUBYGEM_KEY: ${{ secrets.RUBYGEM_KEY }}
52
+ run: "mkdir -p ~/.gem && echo -e \"---\\r\\n:rubygems_api_key: $RUBYGEM_KEY\" > ~/.gem/credentials && chmod 0600 ~/.gem/credentials"
53
+ - name: Setup username/email
54
+ run: "git config --global user.email zaratan@hey.com && git config --global user.name \"Denis <Zaratan> Pasin\""
55
+ - name: Fetch tags from remote
56
+ run: "git fetch -t"
57
+ - name: Publish if version change
58
+ run: 'git diff `git tag | tail -1` -- lib/dev_oops/version.rb | grep -E "^\+.*VERSION" && rake release || echo "No release for now"'
@@ -0,0 +1,37 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches-ignore:
6
+ - main
7
+
8
+ jobs:
9
+ tests:
10
+ strategy:
11
+ matrix:
12
+ ruby: [2.6, 2.7, 3.0]
13
+ runs-on: ubuntu-latest
14
+
15
+ steps:
16
+ - uses: actions/checkout@v2
17
+ - name: Set up Ruby
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: ${{ matrix.ruby }}
21
+ bundler-cache: true
22
+ - name: Run linter
23
+ run: bundle exec rubocop
24
+ - name: Run tests
25
+ run: bundle exec rspec
26
+ prettier:
27
+ runs-on: ubuntu-latest
28
+ steps:
29
+ - uses: actions/checkout@v2
30
+ - name: Set up Node
31
+ uses: actions/setup-node@v2
32
+ with:
33
+ node-version: '14'
34
+ - name: Install yarn dep
35
+ run: yarn install
36
+ - name: Check prettier
37
+ run: yarn prettier -c '**/*.rb'
@@ -0,0 +1,21 @@
1
+ name: Verify version change
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - main
7
+
8
+ jobs:
9
+ version_change:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - uses: actions/checkout@v2
14
+ - name: Fetch main branch
15
+ run: git fetch origin main:main
16
+ - name: Verify if there's a change in version
17
+ run: "git diff main -- lib/dev_oops/version.rb | grep VERSION"
18
+ - name: Print new version
19
+ run: 'git diff main -- lib/dev_oops/version.rb | grep -E "^\+.*VERSION" | grep -E -o "[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?"'
20
+ - name: Verify if higher version
21
+ run: '[[ $(git diff main -- lib/dev_oops/version.rb | grep -E "^\+.*VERSION" | grep -E -o "[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?") > $(git diff main -- lib/dev_oops/version.rb | grep -E "^-.*VERSION" | grep -E -o "[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?") ]]'
data/.rubocop.yml CHANGED
@@ -14,6 +14,7 @@ AllCops:
14
14
  SuggestExtensions: false
15
15
  Exclude:
16
16
  - "bin/*"
17
+ - 'vendor/**/*'
17
18
  - "node_modules/**/*"
18
19
 
19
20
  Gemspec/RequiredRubyVersion:
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.0
data/CHANGELOG.md ADDED
@@ -0,0 +1,32 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.2.0] - 2021-04-03
11
+
12
+ Refactoring architecture + Basic Documentation
13
+
14
+ ### Added
15
+
16
+ - Documentation
17
+
18
+ ### Changed
19
+
20
+ - Overall gem architecture
21
+
22
+ ## [0.1.1] - 2021-04-02
23
+
24
+ First working version
25
+
26
+ ### Added
27
+
28
+ - All the things
29
+
30
+ [unreleased]: https://github.com/zaratan/dev_oops/compare/v0.2.0...HEAD
31
+ [0.2.0]: https://github.com/zaratan/rspec_in_context/releases/tag/v0.2.0
32
+ [0.1.1]: https://github.com/zaratan/rspec_in_context/releases/tag/v0.1.1
data/README.md CHANGED
@@ -1,28 +1,109 @@
1
1
  # DevOops
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/dev_oops`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ This is a gem to help you manage all the scripts and repetitive commands you have written and scatered over the years
6
4
 
7
5
  ## Installation
8
6
 
9
- Add this line to your application's Gemfile:
7
+ $ gem install dev_oops && dev_oops install
8
+
9
+ ## Usage
10
10
 
11
- ```ruby
12
- gem 'dev_oops'
11
+ This gem will install a new command named `dev_oops`. You can use it from anywhere.
12
+
13
+ ### TL;DR example
14
+
15
+ Config (`dev_oops edit hello`):
16
+
17
+ ```json
18
+ {
19
+ "desc": "Say hello.",
20
+ "usage": "[--firstname name]",
21
+ "args": [
22
+ {
23
+ "name": "firstname",
24
+ "desc": "Firstname of the person",
25
+ "aliases": ["f"],
26
+ "required": false,
27
+ "default": "Pierre"
28
+ }
29
+ ]
30
+ }
13
31
  ```
14
32
 
15
- And then execute:
33
+ Script (`dev_oops edit_sh hello`):
16
34
 
17
- $ bundle install
35
+ ```sh
36
+ echo "Hello $firstname !"
37
+ ```
18
38
 
19
- Or install it yourself as:
39
+ Shell:
40
+
41
+ ```sh
42
+ dev_oops hello --firstname Emy # => Hello Emy !
43
+ dev_oops hello -f Chris # => Hello Chris !
44
+ dev_oops hello # => Hello Pierre !
45
+ dev_oops help hello # =>
46
+ # Usage:
47
+ # hello [--firstname name]
48
+ #
49
+ # Options:
50
+ # f, [--firstname=FIRSTNAME] # Firstname of the person
51
+ # # Default: Pierre
52
+ ```
20
53
 
21
- $ gem install dev_oops
54
+ ### Commands
22
55
 
23
- ## Usage
56
+ Which editor will be opened by the gem
57
+
58
+ #### install
59
+
60
+ `dev_oops install` Will create the base directory needed for storing your scripts.
61
+
62
+ #### edit
63
+
64
+ `dev_oops edit name_of_script` Will open in `$EDITOR` your script [configuration](#config-format).
65
+
66
+ #### edit_sh
67
+
68
+ `dev_oops edit_sh name_of_script` Will open in `$EDITOR` your script body. Note that the script will be run in `$SHELL`
24
69
 
25
- TODO: Write usage instructions here
70
+ #### rm
71
+
72
+ `dev_oops rm name_of_script` Will remove the config file and the body file from your disk.
73
+
74
+ #### help
75
+
76
+ `dev_oops help [COMMAND]` Will show help.
77
+
78
+ #### [your command]
79
+
80
+ `dev_oops [your_command]` Will launch the command.
81
+
82
+ ### Config format
83
+
84
+ Most of the fields are optionals. I would advise filling "desc" and "usage".
85
+
86
+ ```json
87
+ {
88
+ "desc": "A description for what the command do. Will be shown in help.",
89
+ "usage": "A short usage description. This will be shown in help. The name of the command will be automatically present at the beggining of the usage",
90
+ "args": [
91
+ {
92
+ "name": "name_of_the_arg",
93
+ "desc": "Description of what the arg does. Will be shown in help.",
94
+ "aliases": ["a"],
95
+ "required": false,
96
+ "default": "aaaaa"
97
+ },
98
+
99
+ ]
100
+ }
101
+ ```
102
+
103
+ #### Arg format
104
+
105
+ The `name` will be used to pass the value in the script as an env variable.
106
+ You can then access the value with `$name` in the shell script.
26
107
 
27
108
  ## Development
28
109
 
@@ -34,7 +115,6 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
34
115
 
35
116
  Bug reports and pull requests are welcome on GitHub at https://github.com/zaratan/dev_oops. 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/zaratan/dev_oops/blob/master/CODE_OF_CONDUCT.md).
36
117
 
37
-
38
118
  ## License
39
119
 
40
120
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
4
 
8
5
  task default: :spec
data/bin/local_do ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'dev_oops'
6
+
7
+ DevOops::Runner.start(ARGV)
data/dev_oops.gemspec CHANGED
@@ -3,36 +3,48 @@
3
3
  require_relative 'lib/dev_oops/version'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = 'dev_oops'
7
- spec.version = DevOops::VERSION
8
- spec.authors = ['Denis <Zaratan> Pasin']
9
- spec.email = ['zaratan@hey.com']
10
-
11
- spec.summary = 'Shell snipets manager'
12
- spec.description = 'Shell snipets manager for those scripts you end up copy pasting over and over'
13
- spec.homepage = 'https://zaratan.fr'
14
- spec.license = 'MIT'
6
+ spec.name = 'dev_oops'
7
+ spec.version = DevOops::VERSION
8
+ spec.authors = ['Denis <Zaratan> Pasin']
9
+ spec.email = ['zaratan@hey.com']
10
+
11
+ spec.summary = 'Shell snipets manager'
12
+ spec.description =
13
+ 'Shell snipets manager for those scripts you end up copy pasting over and over'
14
+ spec.homepage = 'https://zaratan.fr'
15
+ spec.license = 'MIT'
15
16
  spec.required_ruby_version = Gem::Requirement.new('>= 2.6.0')
16
17
 
17
18
  spec.metadata['homepage_uri'] = spec.homepage
19
+
18
20
  # spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
19
21
  # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
20
22
 
21
23
  # Specify which files should be added to the gem when it is released.
22
24
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
- end
26
- spec.bindir = 'exe'
27
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
+ spec.files =
26
+ Dir.chdir(File.expand_path(__dir__)) do
27
+ `git ls-files -z`.split("\x0").reject do |f|
28
+ f.match(%r{^(test|spec|features)/})
29
+ end
30
+ end
31
+ spec.bindir = 'exe'
32
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
33
  spec.require_paths = ['lib']
29
34
 
30
35
  spec.add_runtime_dependency 'thor'
36
+ spec.add_runtime_dependency 'zeitwerk'
31
37
 
38
+ spec.add_development_dependency 'bundler'
39
+ spec.add_development_dependency 'bundler-audit', '> 0.6.0'
32
40
  spec.add_development_dependency 'prettier'
41
+ spec.add_development_dependency 'pry-byebug'
42
+ spec.add_development_dependency 'rake'
43
+ spec.add_development_dependency 'rspec'
33
44
  spec.add_development_dependency 'rubocop'
34
45
  spec.add_development_dependency 'rubocop-performance'
35
46
  spec.add_development_dependency 'solargraph'
36
47
 
37
- spec.post_install_message = 'Run `dev_oops install` to create the base directory for dev_oops'
48
+ spec.post_install_message =
49
+ 'Run `dev_oops install` to create the base directory for dev_oops'
38
50
  end
data/lib/dev_oops.rb CHANGED
@@ -6,165 +6,16 @@ require 'fileutils'
6
6
  require 'json'
7
7
  require 'thor'
8
8
 
9
+ require 'zeitwerk'
10
+ loader = Zeitwerk::Loader.for_gem
11
+ loader.setup # ready!
12
+
9
13
  module DevOops
10
14
  class Error < StandardError
11
15
  end
12
16
 
13
- # Your code goes here...
14
-
17
+ # TODO Refactor
15
18
  CONFIG_DIR = "#{ENV['HOME']}/.dev_oops"
16
-
17
- module ConfigLoader
18
- def self.load
19
- Dir
20
- .glob("#{CONFIG_DIR}/*.json")
21
- .map do |filename|
22
- script_location = filename.gsub(/\.json$/, '.sh')
23
- script_location = '' unless File.exist?(script_location)
24
- json_config = nil
25
- File.open(filename) { |file| json_config = JSON.parse(file.read) }
26
- script_name =
27
- %r{(?<script_name>[^/]+).json$}.match(filename)['script_name']
28
-
29
- OpenStruct.new(
30
- {
31
- name: script_name,
32
- desc: json_config['desc'],
33
- usage: "#{script_name} #{json_config['usage'] || ''}",
34
- command: json_config['command'],
35
- script_location:
36
- json_config['script_location'] || script_location,
37
- args: json_config['args'],
38
- },
39
- )
40
- end
41
- end
42
- end
43
-
44
- class EditScript < Thor::Group
45
- include Thor::Actions
46
-
47
- def self.source_root
48
- "#{File.dirname(__FILE__)}/.."
49
- end
50
-
51
- argument :script_name
52
- def edit
53
- path = "#{CONFIG_DIR}/#{script_name}.json"
54
- template 'templates/empty_script.tt', path unless File.exist?(path)
55
- system("#{ENV['EDITOR'] || 'vim'} #{CONFIG_DIR}/#{script_name}.json")
56
- end
57
- end
58
-
59
- class EditScriptSh < Thor::Group
60
- include Thor::Actions
61
-
62
- def self.source_root
63
- "#{File.dirname(__FILE__)}/.."
64
- end
65
-
66
- argument :script_name
67
- def edit
68
- path = "#{CONFIG_DIR}/#{script_name}.sh"
69
- FileUtils.touch(path) unless File.exist?(path)
70
- FileUtils.chmod(0o750, path)
71
- system("#{ENV['EDITOR'] || 'vim'} #{CONFIG_DIR}/#{script_name}.sh")
72
- end
73
- end
74
-
75
- class RemoveScript < Thor::Group
76
- argument :script_name, desc: 'name of the script'
77
-
78
- def remove_sh
79
- return unless File.exist?("#{CONFIG_DIR}/#{script_name}.sh")
80
- FileUtils.remove "#{CONFIG_DIR}/#{script_name}.sh"
81
- end
82
-
83
- def remove_json
84
- return unless File.exist?("#{CONFIG_DIR}/#{script_name}.json")
85
- FileUtils.remove "#{CONFIG_DIR}/#{script_name}.json"
86
- end
87
- end
88
-
89
- class Runner < Thor
90
- include Thor::Actions
91
- REGISTERED_CLASS_METHODS = {} # rubocop:disable Style/MutableConstant
92
-
93
- def self.source_root
94
- "#{File.dirname(__FILE__)}/.."
95
- end
96
-
97
- def self.register(klass, subcommand_name, usage, description, options = {})
98
- REGISTERED_CLASS_METHODS[subcommand_name] = klass if klass <= Thor::Group
99
- super
100
- end
101
-
102
- configs = ConfigLoader.load
103
- configs.each do |config|
104
- new_action =
105
- Class.new(Thor::Group) do
106
- # (config.args || []).each { |arg| argument arg }
107
- (config.args || []).each do |arg|
108
- if arg.is_a? String
109
- class_option arg
110
- else
111
- class_option arg['name'],
112
- desc: arg['desc'] || '',
113
- aliases: arg['aliases'] || [],
114
- required: arg['required'] || false,
115
- default: arg['default']
116
- end
117
- end
118
-
119
- define_singleton_method('banner') { config.usage }
120
-
121
- define_method('perform') do
122
- env_vars = options.map { |k, v| "#{k}=#{v}" }.join(' ')
123
-
124
- if config.command && !config.command.empty?
125
- system("#{env_vars} #{config.command}")
126
- end
127
- if config.script_location && !config.script_location.empty?
128
- location =
129
- if config.script_location.start_with?('/')
130
- config.script_location
131
- else
132
- "#{ENV['HOME']}/#{config.script_location}"
133
- end
134
- system("#{env_vars} zsh -c #{location}")
135
- end
136
- end
137
- end
138
-
139
- register(new_action, config.name, config.usage, config.desc)
140
- end
141
-
142
- register(EditScript, 'edit', 'edit SCRIPT_NAME', 'Edit a script config')
143
- register(
144
- EditScriptSh,
145
- 'edit_sh',
146
- 'edit_sh SCRIPT_NAME',
147
- 'Edit the script bash',
148
- )
149
- register(RemoveScript, 'rm', 'rm SCRIPT_NAME', 'Remove a script')
150
-
151
- # contents of the Thor class
152
- desc 'install', 'Create the neccesary directory for the gem'
153
- def install
154
- return if Dir.exist?(CONFIG_DIR)
155
-
156
- FileUtils.mkdir CONFIG_DIR
157
- end
158
-
159
- def help(subcommand = nil)
160
- if subcommand && respond_to?(subcommand)
161
- klass = REGISTERED_CLASS_METHODS[subcommand]
162
- klass.start(['-h'])
163
- else
164
- super
165
- end
166
- end
167
-
168
- private
169
- end
170
19
  end
20
+
21
+ loader.eager_load
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+ module DevOops
3
+ module Commands
4
+ class EditScript < Thor::Group
5
+ include Thor::Actions
6
+
7
+ def self.source_root
8
+ "#{File.dirname(__FILE__)}/../../../"
9
+ end
10
+
11
+ argument :script_name
12
+ def edit
13
+ path = "#{CONFIG_DIR}/#{script_name}.json"
14
+ template 'templates/empty_script.tt', path unless File.exist?(path)
15
+ system("#{ENV['EDITOR'] || 'vim'} #{CONFIG_DIR}/#{script_name}.json")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+ module DevOops
3
+ module Commands
4
+ class EditScriptSh < Thor::Group
5
+ include Thor::Actions
6
+
7
+ argument :script_name
8
+ def edit
9
+ path = "#{CONFIG_DIR}/#{script_name}.sh"
10
+ FileUtils.touch(path) unless File.exist?(path)
11
+ FileUtils.chmod(0o750, path)
12
+ system("#{ENV['EDITOR'] || 'vim'} #{CONFIG_DIR}/#{script_name}.sh")
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ module DevOops
3
+ module Commands
4
+ class RemoveScript < Thor::Group
5
+ argument :script_name, desc: 'name of the script'
6
+
7
+ def remove_sh
8
+ return unless File.exist?("#{CONFIG_DIR}/#{script_name}.sh")
9
+ FileUtils.remove "#{CONFIG_DIR}/#{script_name}.sh"
10
+ end
11
+
12
+ def remove_json
13
+ return unless File.exist?("#{CONFIG_DIR}/#{script_name}.json")
14
+ FileUtils.remove "#{CONFIG_DIR}/#{script_name}.json"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+ module DevOops
3
+ class Runner < Thor
4
+ include Thor::Actions
5
+ REGISTERED_CLASS_METHODS = {} # rubocop:disable Style/MutableConstant
6
+
7
+ def self.source_root
8
+ "#{File.dirname(__FILE__)}/.."
9
+ end
10
+
11
+ def self.register(klass, subcommand_name, usage, description, options = {})
12
+ REGISTERED_CLASS_METHODS[subcommand_name] = klass if klass <= Thor::Group
13
+ super
14
+ end
15
+
16
+ configs = ScriptsLoader.load
17
+ configs.each do |config|
18
+ next if ScriptsLoader::FORBIDDEN_NAMES.include?(config.name)
19
+
20
+ new_action = ScriptsLoader.build_action(config)
21
+
22
+ register(new_action, config.name, config.usage, config.desc)
23
+ end
24
+
25
+ register(
26
+ Commands::EditScript,
27
+ 'edit',
28
+ 'edit SCRIPT_NAME',
29
+ 'Edit a script config'
30
+ )
31
+ register(
32
+ Commands::EditScriptSh,
33
+ 'edit_sh',
34
+ 'edit_sh SCRIPT_NAME',
35
+ 'Edit the script bash'
36
+ )
37
+ register(Commands::RemoveScript, 'rm', 'rm SCRIPT_NAME', 'Remove a script')
38
+
39
+ # contents of the Thor class
40
+ desc 'install', 'Create the neccesary directory for the gem'
41
+ def install
42
+ return if Dir.exist?(CONFIG_DIR)
43
+
44
+ FileUtils.mkdir CONFIG_DIR
45
+ end
46
+
47
+ def help(subcommand = nil)
48
+ if subcommand && respond_to?(subcommand)
49
+ klass = REGISTERED_CLASS_METHODS[subcommand]
50
+ klass.start(['-h'])
51
+ else
52
+ super
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+ module DevOops
3
+ module ScriptsLoader
4
+ FORBIDDEN_NAMES = %w[help install edit edit_sh rm].freeze
5
+ ScriptConfig =
6
+ Struct.new(:name, :desc, :usage, :script_location, :args) do
7
+ def self.create(script_name, script_location, json_config)
8
+ new(
9
+ script_name,
10
+ json_config['desc'] || 'Missing description',
11
+ "#{script_name} #{json_config['usage'] || ''}",
12
+ script_location,
13
+ json_config['args']
14
+ )
15
+ end
16
+ end
17
+
18
+ def self.load
19
+ Dir
20
+ .glob("#{CONFIG_DIR}/*.json")
21
+ .map do |filename|
22
+ script_location = filename.gsub(/\.json$/, '.sh')
23
+ script_location = '' unless File.exist?(script_location)
24
+ json_config = nil
25
+ File.open(filename) { |file| json_config = JSON.parse(file.read) }
26
+ script_name =
27
+ %r{(?<script_name>[^/]+).json$}.match(filename)['script_name']
28
+
29
+ ScriptConfig.create(script_name, script_location, json_config)
30
+ end
31
+ end
32
+
33
+ def self.build_action(config)
34
+ Class.new(Thor::Group) do
35
+ (config.args || []).each do |arg|
36
+ class_option(
37
+ arg['name'],
38
+ desc: arg['desc'] || '',
39
+ aliases: arg['aliases'] || [],
40
+ required: arg['required'] || false,
41
+ default: arg['default']
42
+ )
43
+ end
44
+
45
+ define_singleton_method('banner') { config.usage }
46
+
47
+ define_method('perform') do
48
+ env_vars = options.map { |k, v| "#{k}=#{v}" }.join(' ')
49
+
50
+ if config.script_location && !config.script_location.empty?
51
+ location =
52
+ if config.script_location.start_with?('/')
53
+ config.script_location
54
+ else
55
+ "#{ENV['HOME']}/#{config.script_location}"
56
+ end
57
+ system("#{env_vars} #{ENV['SHELL']} -c #{location}")
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DevOops
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.0.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dev_oops
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis <Zaratan> Pasin
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-04-02 00:00:00.000000000 Z
11
+ date: 2021-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -24,6 +24,48 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: zeitwerk
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
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'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler-audit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.6.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.6.0
27
69
  - !ruby/object:Gem::Dependency
28
70
  name: prettier
29
71
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +80,48 @@ dependencies:
38
80
  - - ">="
39
81
  - !ruby/object:Gem::Version
40
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
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: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
41
125
  - !ruby/object:Gem::Dependency
42
126
  name: rubocop
43
127
  requirement: !ruby/object:Gem::Requirement
@@ -89,21 +173,31 @@ executables:
89
173
  extensions: []
90
174
  extra_rdoc_files: []
91
175
  files:
176
+ - ".github/workflows/test_and_publish.yml"
177
+ - ".github/workflows/test_only.yml"
178
+ - ".github/workflows/verify_version_change.yml"
92
179
  - ".gitignore"
93
180
  - ".rspec"
94
181
  - ".rubocop-http---relaxed-ruby-style-rubocop-yml"
95
182
  - ".rubocop.yml"
96
- - ".travis.yml"
183
+ - ".ruby-version"
184
+ - CHANGELOG.md
97
185
  - CODE_OF_CONDUCT.md
98
186
  - Gemfile
99
187
  - LICENSE.txt
100
188
  - README.md
101
189
  - Rakefile
102
190
  - bin/console
191
+ - bin/local_do
103
192
  - bin/setup
104
193
  - dev_oops.gemspec
105
194
  - exe/dev_oops
106
195
  - lib/dev_oops.rb
196
+ - lib/dev_oops/commands/edit_script.rb
197
+ - lib/dev_oops/commands/edit_script_sh.rb
198
+ - lib/dev_oops/commands/remove_script.rb
199
+ - lib/dev_oops/runner.rb
200
+ - lib/dev_oops/scripts_loader.rb
107
201
  - lib/dev_oops/version.rb
108
202
  - package.json
109
203
  - templates/empty_script.tt
@@ -128,8 +222,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
222
  - !ruby/object:Gem::Version
129
223
  version: '0'
130
224
  requirements: []
131
- rubygems_version: 3.1.4
132
- signing_key:
225
+ rubygems_version: 3.2.3
226
+ signing_key:
133
227
  specification_version: 4
134
228
  summary: Shell snipets manager
135
229
  test_files: []
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- ---
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.7.2
6
- before_install: gem install bundler -v 2.1.4