renuo-cli 3.1.7 → 4.2.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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -37
  3. data/.ruby-version +1 -1
  4. data/.semaphore/main-deploy.yml +1 -1
  5. data/.semaphore/semaphore.yml +2 -2
  6. data/.tool-versions +1 -0
  7. data/Gemfile +2 -0
  8. data/README.md +3 -3
  9. data/Rakefile +2 -0
  10. data/lib/renuo/cli/app/command_helper.rb +2 -0
  11. data/lib/renuo/cli/app/commit_leaderboard.rb +130 -0
  12. data/lib/renuo/cli/app/commit_leaderboard_sync.rb +107 -0
  13. data/lib/renuo/cli/app/configure_semaphore.rb +14 -6
  14. data/lib/renuo/cli/app/configure_sentry.rb +4 -4
  15. data/lib/renuo/cli/app/create_aws_project.rb +5 -3
  16. data/lib/renuo/cli/app/create_heroku_app.rb +3 -3
  17. data/lib/renuo/cli/app/create_new_logins.rb +2 -0
  18. data/lib/renuo/cli/app/create_slidev_presentation.rb +46 -0
  19. data/lib/renuo/cli/app/environments.rb +5 -3
  20. data/lib/renuo/cli/app/fetch_emails.rb +3 -1
  21. data/lib/renuo/cli/app/generate_password.rb +2 -0
  22. data/lib/renuo/cli/app/heroku_apps.rb +3 -3
  23. data/lib/renuo/cli/app/heroku_users.rb +3 -3
  24. data/lib/renuo/cli/app/list_large_git_files.rb +4 -2
  25. data/lib/renuo/cli/app/local_storage.rb +2 -0
  26. data/lib/renuo/cli/app/name_display.rb +7 -5
  27. data/lib/renuo/cli/app/package.json +14 -0
  28. data/lib/renuo/cli/app/redmine/csv_base_service.rb +4 -2
  29. data/lib/renuo/cli/app/redmine/issue.rb +2 -0
  30. data/lib/renuo/cli/app/release_project.rb +8 -4
  31. data/lib/renuo/cli/app/release_xing.rb +2 -0
  32. data/lib/renuo/cli/app/renuo_version.rb +6 -4
  33. data/lib/renuo/cli/app/services/cloudfront_config_service.rb +66 -67
  34. data/lib/renuo/cli/app/services/markdown_parser_service.rb +2 -0
  35. data/lib/renuo/cli/app/services/renuo_cli_config.rb +2 -0
  36. data/lib/renuo/cli/app/setup_uptimerobot.rb +1 -1
  37. data/lib/renuo/cli/app/templates/semaphore/semaphore-deploy.yml.erb +3 -3
  38. data/lib/renuo/cli/app/templates/semaphore/semaphore.yml.erb +38 -63
  39. data/lib/renuo/cli/app/templates/slidev/README.md.erb +11 -0
  40. data/lib/renuo/cli/app/templates/slidev/package.json.erb +16 -0
  41. data/lib/renuo/cli/app/toggl/detail.rb +2 -0
  42. data/lib/renuo/cli/app/toggl/time_entry.rb +2 -0
  43. data/lib/renuo/cli/app/toggl/user.rb +2 -0
  44. data/lib/renuo/cli/app/toggl/workspace.rb +2 -0
  45. data/lib/renuo/cli/app/toggl_redmine_comparator.rb +9 -5
  46. data/lib/renuo/cli/app/upgrade_laptop/upgrade_laptop_execution.rb +2 -0
  47. data/lib/renuo/cli/app/upgrade_laptop/upgrade_mac_os.rb +3 -1
  48. data/lib/renuo/cli/app/upgrade_laptop.rb +2 -0
  49. data/lib/renuo/cli/app/work.rb +3 -1
  50. data/lib/renuo/cli/version.rb +4 -2
  51. data/lib/renuo/cli.rb +78 -21
  52. data/renuo-cli.gemspec +12 -7
  53. metadata +39 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d0c7cb1b6bb3792c2b43d510487bb7e876070c6cdf83e7e4d41d96a556ab782
4
- data.tar.gz: 851fe36fa4258b8a15a4bfe47186776e20638c453913df29549bb1d90c38398a
3
+ metadata.gz: 32e7195714b090ac3c9288984191e946e2f19b23b8edbc4dd996acb48861cc4f
4
+ data.tar.gz: b39a490ac91d15099381d980591b49704ebfe3d3e33b27f31021cef89a1cfc54
5
5
  SHA512:
6
- metadata.gz: cd6b422735e525fe3f408ca5f30b65af4cb0f8a88b8b6c2d70b4cbc3db3bb077fc1e27b0af776b48b47d2e7590accf68e681d1c676aeb954bc7aae032a9b7a3a
7
- data.tar.gz: f0989fe4f8c88dbbaf52f944c1aeb8053ae2d3199456e742941cd3cbdf2ce15d2f1cb5ba4edad6cabf51de438cc87d5b4580f8ce34f27d816a53600a646d99cd
6
+ metadata.gz: 1f002ed372032ca450b89f2ac6049bcac0a66d77cd219cbac72df50a6f35926e9d175fdb7df22cdfa4dca3c2fdbff0a702e6a31379ab8c4cbf0655b4f1a7727d
7
+ data.tar.gz: d720553fad38e6c1ecfde475823e3535e7e003505bb9d27db6ce1bdd8bd74b2d3d4a12755a483438afb7e2edd8749e0daef276262371350ef1895d9866910021
data/.rubocop.yml CHANGED
@@ -1,43 +1,10 @@
1
- AllCops:
2
- Include:
3
- - 'lib/**/*.rb'
4
- - 'spec/**/*'
5
- - '*.gemspec'
6
- Exclude:
7
- - 'bin/**/*'
8
- - 'lib/renuo/cli.rb'
9
- - 'lib/renuo/cli/app/heroku_users'
10
- - 'lib/renuo/cli/app/fetch_all_emails'
11
- - 'lib/renuo/cli/app/create_heroku_app'
12
- - 'vendor/**/*'
1
+ inherit_gem:
2
+ renuocop: config/base.yml
13
3
 
14
- Layout/LineLength:
15
- Max: 120
16
-
17
- Naming/FileName:
18
- Exclude:
19
- - 'Gemfile'
20
- - 'Rakefile'
21
-
22
- Metrics/BlockLength:
23
- Exclude:
24
- - 'Rakefile'
25
- - '**/*.rake'
26
- - 'spec/**/*.rb'
27
-
28
- Metrics/ClassLength:
29
- Max: 160
30
-
31
- Style/Documentation:
32
- Enabled: false
33
-
34
- Style/NonNilCheck:
35
- IncludeSemanticChanges: true
36
-
37
- Style/FormatStringToken:
4
+ RSpec/MessageSpies:
38
5
  Enabled: false
39
6
 
40
- Style/FrozenStringLiteralComment:
7
+ Rails/Output:
41
8
  Enabled: false
42
9
 
43
10
  Style/GlobalVars:
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.7.5
1
+ 3.3.0
@@ -3,7 +3,7 @@ name: main-deploy
3
3
  agent:
4
4
  machine:
5
5
  type: e1-standard-2
6
- os_image: ubuntu1804
6
+ os_image: ubuntu2004
7
7
 
8
8
  blocks:
9
9
  - name: main-deploy
@@ -3,7 +3,7 @@ name: renuo-cli
3
3
  agent:
4
4
  machine:
5
5
  type: e1-standard-2
6
- os_image: ubuntu1804
6
+ os_image: ubuntu2004
7
7
  auto_cancel:
8
8
  running:
9
9
  when: "true"
@@ -28,7 +28,7 @@ blocks:
28
28
  jobs:
29
29
  - name: tests
30
30
  commands:
31
- - bin/check
31
+ - ENV=CI bin/check
32
32
  promotions:
33
33
  - name: main
34
34
  pipeline_file: main-deploy.yml
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 3.2.3
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gemspec
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Renuo CLI
2
2
 
3
- The [Renuo](http://renuo.ch) command line. Used for various Renuo tasks
3
+ The [Renuo](https://www.renuo.ch) command line. Used for various Renuo tasks
4
4
 
5
5
  ## Installation
6
6
 
@@ -49,8 +49,8 @@ gem push renuo-cli-*.gem
49
49
 
50
50
  Bug reports and pull requests are welcome on GitHub at <https://github.com/renuo/renuo-cli>. This project is intended to
51
51
  be a safe, welcoming space for collaboration, and contributors are expected to adhere to
52
- the [Contributor Covenant](contributor-covenant.org) code of conduct.
52
+ the [Contributor Covenant](https://www.contributor-covenant.org) code of conduct.
53
53
 
54
54
  ## License
55
55
 
56
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
56
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/license/MIT).
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
  require 'cucumber/rake/task'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module CommandHelper
2
4
  def run_command(command)
3
5
  say "\n#{command.yellow}"
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CommitLeaderboard
4
+ attr_accessor :queue_file_path, :author_username, :auhor_avatar_url
5
+
6
+ def run(args)
7
+ abort 'No author username given.' if args[0].nil?
8
+ abort 'No author avatar url given.' if args[1].nil?
9
+
10
+ @author_username = args[0]
11
+ @author_avatar_url = args[1]
12
+
13
+ @queue_file_path = args[2] || '~/.renuo-commit-leaderboard.json'
14
+ @queue_file_path = File.expand_path(@queue_file_path)
15
+
16
+ check_required_tools
17
+ check_if_repository_is_present
18
+ check_if_commit_is_present
19
+
20
+ append_to_queue(build_commit_payload)
21
+ end
22
+
23
+ private
24
+
25
+ def check_required_tools
26
+ return if system('git --version', out: File::NULL)
27
+
28
+ abort('>> Git is not installed. Please install it first.')
29
+ end
30
+
31
+ def check_if_repository_is_present
32
+ return if system('git rev-parse --is-inside-work-tree', out: File::NULL)
33
+
34
+ abort('>> Not a git repository. Please run this command in a git repository.')
35
+ end
36
+
37
+ def check_if_commit_is_present
38
+ return if system('git rev-parse --verify HEAD', out: File::NULL)
39
+
40
+ abort('>> No commits found. Please commit your changes first.')
41
+ end
42
+
43
+ def build_commit_payload
44
+ {
45
+ sha: `git rev-parse HEAD`.strip,
46
+ message: `git log -1 --pretty=%B`.strip,
47
+ repository: `basename $(git rev-parse --show-toplevel)`.strip,
48
+ branch: `git rev-parse --abbrev-ref HEAD`.strip,
49
+ author: {
50
+ username: @author_username,
51
+ avatar_url: @author_avatar_url
52
+ }
53
+ }
54
+ end
55
+
56
+ def append_to_queue(payload)
57
+ `echo [] > #{@queue_file_path}` unless File.exist?(@queue_file_path)
58
+
59
+ commits = read_commits_from_queue(payload)
60
+
61
+ puts '>> Adding commit to the queue:'
62
+
63
+ print_queue_item(payload)
64
+ File.open(@queue_file_path, 'w') do |file|
65
+ commits << payload
66
+ file.write(JSON.generate(commits))
67
+ end
68
+ end
69
+
70
+ def read_commits_from_queue(payload)
71
+ commits = nil
72
+
73
+ File.open(@queue_file_path, 'r') do |file|
74
+ commits = JSON.parse(file.read)
75
+
76
+ if commits.any? { |commit| commit['sha'] == payload[:sha] }
77
+ abort('>> Commit has already been added to the queue')
78
+ end
79
+ rescue JSON::ParserError
80
+ abort('>> Invalid JSON format in the queue file.')
81
+ end
82
+
83
+ commits
84
+ end
85
+
86
+ # rubocop:disable Metrics/AbcSize
87
+ def print_queue_item(payload)
88
+ sha = format_text_truncate(payload[:sha], COLOR_CODES[:green], 6)
89
+ repository = format_text("#{payload[:repository]}##{payload[:branch]}", COLOR_CODES[:blue])
90
+ message = format_text_elipsis(payload[:message], COLOR_CODES[:yellow], 50)
91
+ username = format_text(payload[:author][:username], COLOR_CODES[:magenta])
92
+ avatar_url = format_text(payload[:author][:avatar_url], COLOR_CODES[:cyan])
93
+
94
+ puts "#{sha} #{repository} - #{username} (#{avatar_url}) - #{message}"
95
+ end
96
+ # rubocop:enable Metrics/AbcSize
97
+
98
+ def format_text(text, color)
99
+ "\e[#{color}m#{text}\e[0m"
100
+ end
101
+
102
+ def wrap_in_color(text, color)
103
+ "\e[#{color}m#{text}\e[0m"
104
+ end
105
+
106
+ def format_text_truncate(text, color, truncate_length)
107
+ format_text(text[0..truncate_length], color)
108
+ end
109
+
110
+ def format_text_elipsis(text, color, truncate_length)
111
+ if text.length > truncate_length
112
+ format_text("#{truncate_text(text, truncate_length)}...", color)
113
+ else
114
+ format_text(text, color)
115
+ end
116
+ end
117
+
118
+ def truncate_text(text, truncate_length)
119
+ text[0..truncate_length]
120
+ end
121
+ end
122
+
123
+ COLOR_CODES = {
124
+ red: 31,
125
+ green: 32,
126
+ yellow: 33,
127
+ blue: 34,
128
+ magenta: 35,
129
+ cyan: 36
130
+ }.freeze
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/http'
4
+
5
+ class SyncError < StandardError; end
6
+
7
+ class CommitLeaderboardSync
8
+ attr_accessor :queue_file_path, :leaderboard_api_url, :api_secret
9
+
10
+ def run(args)
11
+ process_args(args)
12
+
13
+ unless File.exist?(@queue_file_path)
14
+ abort('>> Commit queue file does not exist.')
15
+ end
16
+
17
+ unless @leaderboard_api_url.match?(URI::DEFAULT_PARSER.make_regexp)
18
+ abort('>> Invalid API URL.')
19
+ end
20
+
21
+ commits = JSON.parse(File.read(@queue_file_path))
22
+ send_commits(commits)
23
+ end
24
+
25
+ private
26
+
27
+ def process_args(args)
28
+ if args[0].blank?
29
+ abort('>> No API secret given.')
30
+ end
31
+
32
+ @api_secret = args[0]
33
+ @queue_file_path = File.expand_path(args[1] || '~/.renuo_commit_leaderboard.json')
34
+ @leaderboard_api_url = args[2] || 'https://dashboard.renuo.ch/api/v1/add_commits'
35
+ end
36
+
37
+ def print_configuration
38
+ puts 'Running commit leaderboard sync with:'
39
+ puts '-----------------------------'
40
+ puts "API secret: #{@api_secret}"
41
+ puts "Queue file path: #{@queue_file_path}"
42
+ puts "Leaderboard API URL: #{@leaderboard_api_url}"
43
+ end
44
+
45
+ # rubocop:disable Metrics/MethodLength
46
+ def send_commits(commits)
47
+ next_queue = []
48
+
49
+ until commits.empty?
50
+ commit = commits.shift
51
+ payload = { commit: commit }.to_json
52
+
53
+ puts 'Sending commit to leaderboard...'
54
+ print_payload(payload)
55
+
56
+ begin
57
+ handle_response(send_commit(payload))
58
+ rescue SyncError => e
59
+ puts e.message
60
+ next_queue << commit
61
+ end
62
+ end
63
+
64
+ File.write(@queue_file_path, JSON.generate(next_queue))
65
+ end
66
+ # rubocop:enable Metrics/MethodLength
67
+
68
+ def send_commit(payload)
69
+ uri = URI(@leaderboard_api_url)
70
+ http = Net::HTTP.new(uri.host, uri.port)
71
+ request = Net::HTTP::Post.new(uri.path, { 'Content-Type' => 'application/json', 'Accept' => 'application/json' })
72
+ request['LEADERBOARD_SIGNATURE'] = generate_signature_for_payload(@api_secret, payload)
73
+ request.body = payload
74
+
75
+ http.request(request)
76
+ end
77
+
78
+ def print_payload(payload)
79
+ puts JSON.pretty_generate(payload)
80
+ end
81
+
82
+ # rubocop:disable Metrics/MethodLength
83
+ def handle_response(response)
84
+ case response.code.to_i
85
+ when 200
86
+ puts '>> Successfully sent commits to the leaderboard.'
87
+ when 401
88
+ abort('>> Unauthorized. Please check your secret.')
89
+ when 403
90
+ abort('>> Forbidden. Please check your secret.')
91
+ when 404
92
+ abort('>> Not found. Please check the URL.')
93
+ else
94
+ raise SyncError, "Failed to send commits to the leaderboard:\n#{response.code} - #{response.body}"
95
+ end
96
+ end
97
+ # rubocop:enable Metrics/MethodLength
98
+
99
+ def clear_queue
100
+ File.write(@queue_file_path, '[]')
101
+ end
102
+
103
+ def generate_signature_for_payload(secret_key, payload)
104
+ signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), secret_key, payload)
105
+ "sig=#{signature}"
106
+ end
107
+ end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'commander'
2
- require_relative './environments'
4
+ require_relative 'environments'
3
5
 
4
6
  class ConfigureSemaphore
5
7
  attr_accessor :project_name, :environment
@@ -24,6 +26,7 @@ class ConfigureSemaphore
24
26
 
25
27
  create_semaphore_notification
26
28
  create_semaphore_secrets
29
+ create_semaphore_deployment_targets
27
30
  end
28
31
  # rubocop:enable Metrics/MethodLength
29
32
 
@@ -36,15 +39,20 @@ class ConfigureSemaphore
36
39
  end
37
40
 
38
41
  def create_semaphore_notification
39
- system("sem create notifications #{project_name} "\
40
- "--projects #{project_name} "\
41
- '--branches "main,develop" '\
42
- "--slack-channels \"#project-#{project_name}\" "\
42
+ system("sem create notifications #{project_name} " \
43
+ "--projects #{project_name} " \
44
+ '--branches "main,develop" ' \
45
+ "--slack-channels \"#project-#{project_name}\" " \
43
46
  '--slack-endpoint "https://hooks.slack.com/services/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"')
44
47
  end
45
48
 
46
49
  def create_semaphore_secrets
47
- system("sem create secret #{project_name}")
50
+ system("sem create secret -p #{project_name} #{project_name}")
51
+ end
52
+
53
+ def create_semaphore_deployment_targets
54
+ system("sem create dt main -p #{project_name}")
55
+ system("sem create dt develop -p #{project_name}")
48
56
  end
49
57
 
50
58
  def render(template_file)
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'commander'
2
- require_relative './environments'
4
+ require_relative 'environments'
3
5
 
4
6
  class ConfigureSentry
5
- ADMIN_EMAIL = 'admin@renuo.ch'.freeze
6
-
7
- def initialize; end
7
+ ADMIN_EMAIL = 'admin@renuo.ch'
8
8
 
9
9
  def run(args)
10
10
  project_name = args[0]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'renuo/cli/app/services/cloudfront_config_service'
2
4
 
3
5
  class CreateAwsProject
@@ -39,7 +41,7 @@ class CreateAwsProject
39
41
  end
40
42
 
41
43
  def collect_cloudfront_information
42
- @setup_cloudfront = agree('Would you like to setup also AWS CloudFront? '\
44
+ @setup_cloudfront = agree('Would you like to setup also AWS CloudFront? ' \
43
45
  '(Default: yes, if you want to deliver assets/images from S3)')
44
46
  end
45
47
 
@@ -52,7 +54,7 @@ class CreateAwsProject
52
54
  def ensure_aws_profile_existing?
53
55
  ensure_is_setup?('aws configure --profile renuo-app-setup list > /dev/null',
54
56
  'aws configure --profile renuo-app-setup',
55
- 'Would you like set up a profile for AWS '\
57
+ 'Would you like set up a profile for AWS ' \
56
58
  '`aws configure --profile renuo-app-setup`? (User/Password in keystore)')
57
59
  end
58
60
 
@@ -105,7 +107,7 @@ class CreateAwsProject
105
107
  end
106
108
 
107
109
  def aws_cloudfront_setup(profile, bucket, redmine_project)
108
- tags = [{ "Key": 'redmine_project', "Value": redmine_project }]
110
+ tags = [{ Key: 'redmine_project', Value: redmine_project }]
109
111
  cloudfront_config_string = CloudfrontConfigService.new(bucket, tags).to_s
110
112
 
111
113
  <<~CLOUDFRONT_COMMANDS
@@ -1,7 +1,7 @@
1
- class CreateHerokuApp
2
- ADMIN_EMAIL = 'operations@renuo.ch'.freeze
1
+ # frozen_string_literal: true
3
2
 
4
- def initialize; end
3
+ class CreateHerokuApp
4
+ ADMIN_EMAIL = 'operations@renuo.ch'
5
5
 
6
6
  def run(args)
7
7
  project_name = args[0]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class CreateNewLogins
2
4
  include CommandHelper
3
5
 
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'commander'
4
+
5
+ class CreateSlidevPresentation
6
+ EXAMPLE_SLIDES_URL = 'https://raw.githubusercontent.com/renuo/slidev-theme-renuo/main/example.md'
7
+ SLIDEV_THEME_NAME = 'renuo'
8
+ TEMPLATE_DIRECTORY = 'templates/slidev'
9
+
10
+ attr_accessor :presentation_name, :presentation_author
11
+
12
+ def initialize
13
+ @presentation_name = nil
14
+ @presentation_author = nil
15
+ end
16
+
17
+ def run(args)
18
+ presentation_name = args[0]
19
+ abort('>> No presentation name given.') unless presentation_name
20
+
21
+ say '# Commands to setup Slidev project with the Renuo theme:'.colorize :green
22
+ @presentation_name = presentation_name
23
+ @presentation_author = args[1] || 'Renuo AG'
24
+ print_slidev_project_commands
25
+ end
26
+
27
+ private
28
+
29
+ def print_slidev_project_commands
30
+ say "mkdir #{@presentation_name}"
31
+ say "cd #{@presentation_name}"
32
+ say "curl -o slides.md #{EXAMPLE_SLIDES_URL}"
33
+ say "echo '#{render('README.md.erb')}' > README.md"
34
+ say "sed -ig 's/theme: .\\//theme: renuo/' slides.md"
35
+ say "echo '#{render('package.json.erb')}' > package.json"
36
+ say 'npm install'
37
+ say 'npm run dev'
38
+ end
39
+
40
+ def render(filename)
41
+ file_path = File.join(File.dirname(__FILE__), TEMPLATE_DIRECTORY, filename)
42
+ template = File.read(file_path)
43
+ renderer = ERB.new(template)
44
+ renderer.result(binding)
45
+ end
46
+ end
@@ -1,4 +1,6 @@
1
- MAIN = 'main'.freeze
2
- MASTER = 'master'.freeze
3
- DEVELOP = 'develop'.freeze
1
+ # frozen_string_literal: true
2
+
3
+ MAIN = 'main'
4
+ MASTER = 'master'
5
+ DEVELOP = 'develop'
4
6
  ENVIRONMENTS = [MAIN, DEVELOP].freeze
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'net/http'
2
4
  require 'uri'
3
5
 
@@ -30,6 +32,6 @@ class FetchEmails
30
32
  end
31
33
 
32
34
  def format_response(response)
33
- response.body.gsub(/\r\n/, "\n").split("\n").reject { |add| add == 'n/a' }
35
+ response.body.gsub("\r\n", "\n").split("\n").reject { |add| add == 'n/a' }
34
36
  end
35
37
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'securerandom'
2
4
 
3
5
  class GeneratePassword
@@ -1,8 +1,8 @@
1
- class HerokuApps
2
- def initialize; end
1
+ # frozen_string_literal: true
3
2
 
3
+ class HerokuApps
4
4
  def run
5
- JSON.parse(run_command).map { |app| app['name'] }
5
+ JSON.parse(run_command).pluck('name')
6
6
  end
7
7
 
8
8
  private
@@ -1,8 +1,8 @@
1
- require_relative './heroku_apps'
1
+ # frozen_string_literal: true
2
2
 
3
- class HerokuUsers
4
- def initialize; end
3
+ require_relative 'heroku_apps'
5
4
 
5
+ class HerokuUsers
6
6
  def run(args)
7
7
  action, email_address = args
8
8
  abort('>> action is either add or remove') unless %w[add remove].include? action
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ListLargeGitFiles
2
4
  def run
3
- cmd = 'bash -c "join -o \'1.1 1.2 2.3\' <(git rev-list --objects --all | sort) '\
4
- '<(git verify-pack -v objects/pack/*.idx | sort -k3 -n | tail -5 | sort) | sort -k3 -n"'
5
+ cmd = 'bash -c "join -o \'1.1 1.2 2.3\' <(git rev-list --objects --all | sort) ' \
6
+ '<(git verify-pack -v objects/pack/*.idx | sort -k3 -n | tail -5 | sort) | sort -k3 -n"'
5
7
  puts `#{cmd}`
6
8
  end
7
9
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
 
3
5
  class LocalStorage
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'command_helper'
2
4
 
3
5
  class NameDisplay
@@ -15,11 +17,11 @@ class NameDisplay
15
17
 
16
18
  private
17
19
 
18
- HEROKU_APP_NAME = '-a renuo-dashboard-main'.freeze
19
- HEROKU_CLI = 'heroku run'.freeze
20
- RENUO_CLI = 'rails renuo:welcome'.freeze
21
- SLIDES = 'https://docs.google.com/presentation/d/1mPhQjArZnlUWUa2ik5R9IlGmdCKCwc2_H8Qq-AWgV-A/edit'.freeze
22
- WELCOME_MESSAGE = 'Welcome to Renuo'.freeze
20
+ HEROKU_APP_NAME = '-a renuo-dashboard-main'
21
+ HEROKU_CLI = 'heroku run'
22
+ RENUO_CLI = 'rails renuo:welcome'
23
+ SLIDES = 'https://docs.google.com/presentation/d/1mPhQjArZnlUWUa2ik5R9IlGmdCKCwc2_H8Qq-AWgV-A/edit'
24
+ WELCOME_MESSAGE = 'Welcome to Renuo'
23
25
 
24
26
  def display_name(name)
25
27
  text_message = [WELCOME_MESSAGE, name, '🥳🔥'].compact.join(' ')
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "app",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/renuo/renuo-cli.git"
12
+ },
13
+ "private": true
14
+ }
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'csv'
2
4
 
3
5
  module Redmine
4
6
  class CsvBaseService
5
- API_LOCATION = 'https://redmine.renuo.ch'.freeze
7
+ API_LOCATION = 'https://redmine.renuo.ch'
6
8
 
7
9
  def initialize(token)
8
10
  @token = token
@@ -40,7 +42,7 @@ module Redmine
40
42
  separated_csv_entries = CSV.parse(body, col_sep: ',')
41
43
  keys = separated_csv_entries.shift[1..-2]
42
44
  entries = separated_csv_entries.shift[1..-2]
43
- Hash[keys.zip(entries)]
45
+ keys.zip(entries).to_h
44
46
  rescue CSV::MalformedCSVError
45
47
  raise_bad_data_error
46
48
  end