renuo-cli 1.6.0 → 1.7.0

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: df319b290efddcc2508f9a66d6fd91be5ed699ddba6445022e38e9778e53ee87
4
- data.tar.gz: 36109dd81622f8e1fcf40fd0b38ace7f79eee1e5399d1157b2032a5a38ed2b87
3
+ metadata.gz: b56cf8eda01fe283362ccc2975af7a8b41caf506387c3bf4b9d4028b08315ba2
4
+ data.tar.gz: c86c1b56f7a1495c2e84e8dcbbcff1189ab3d6fd621195d07ac3303601eaff5e
5
5
  SHA512:
6
- metadata.gz: 2a2dc996e454224ec4f00bd9615dce746cbe4f399f61e4dba8fc94dc14b422895404b1732c176dc4e6247c3116a903a292239707b86924b25c593deb5502b428
7
- data.tar.gz: d71a3793f8f3f9abb31e0893731e2eba33b5aa2ddc254c9b9a920836ff1a64f87307bcd87eb2ad10dd2321a6689746a9fa3723e5cb8de803d7f30fedc30b5fde
6
+ metadata.gz: fcab1fcac348715b901b6ce0c928e891331fb7c1dfaa84e4736b13cace7fbeddd6c75554e44d4575ca1ab04e8889fb14a1f78902f54d7e7fa245c379f06d2b36
7
+ data.tar.gz: 006d062c2c0d8a04d65abb0a45c181db41d6afa397fc784a1736819bc50eddab9a3330a639bdb2dbe10a409a3a93c9c209877d3d3e99db65a2ef93cf4e6424fc
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
- --format documentation
2
1
  --color
2
+ --require spec_helper
@@ -9,6 +9,7 @@ AllCops:
9
9
  - 'lib/renuo/cli/app/heroku_users'
10
10
  - 'lib/renuo/cli/app/fetch_all_emails'
11
11
  - 'lib/renuo/cli/app/create_heroku_app'
12
+ - 'vendor/**/*'
12
13
 
13
14
  Naming/FileName:
14
15
  Exclude:
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
1
  [![Build Status Master](https://semaphoreci.com/api/v1/projects/a6f6bfd7-e48b-4035-858d-fc7cfa190608/1707289/badge.svg)](https://semaphoreci.com/renuo/renuo-cli)
2
- [![Coverage Status](https://coveralls.io/repos/renuo/renuo-cli/badge.svg?branch=master&service=github)](https://coveralls.io/github/renuo/renuo-cli?branch=master)
3
2
  [![Code Climate](https://codeclimate.com/github/renuo/renuo-cli/badges/gpa.svg)](https://codeclimate.com/github/renuo/renuo-cli)
4
3
 
5
4
  # Renuo::Cli
data/Rakefile CHANGED
@@ -1,11 +1,8 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
- require 'coveralls/rake/task'
4
3
  require 'cucumber/rake/task'
5
4
 
6
5
  RSpec::Core::RakeTask.new(:spec)
7
6
  Cucumber::Rake::Task.new
8
- Coveralls::RakeTask.new
9
7
 
10
- task test_with_coveralls: [:spec, :cucumber, 'coveralls:push']
11
8
  task default: %i[spec cucumber]
@@ -2,6 +2,7 @@ require 'renuo/cli/version'
2
2
  require 'rubygems'
3
3
  require 'gems'
4
4
  require 'colorize'
5
+ require 'renuo/cli/app/services/renuo_cli_config'
5
6
  require 'renuo/cli/app/name_display'
6
7
  require 'renuo/cli/app/local_storage'
7
8
  require 'renuo/cli/app/list_large_git_files'
@@ -11,12 +12,14 @@ require 'renuo/cli/app/create_aws_project'
11
12
  require 'renuo/cli/app/create_heroku_app'
12
13
  require 'renuo/cli/app/configure_sentry'
13
14
  require 'renuo/cli/app/create_new_logins'
14
- require 'renuo/cli/app/release_project.rb'
15
- require 'renuo/cli/app/fetch_emails.rb'
16
- require 'renuo/cli/app/heroku_users.rb'
15
+ require 'renuo/cli/app/work'
16
+ require 'renuo/cli/app/release_project'
17
+ require 'renuo/cli/app/fetch_emails'
18
+ require 'renuo/cli/app/heroku_users'
17
19
  require 'renuo/cli/app/setup_uptimerobot'
18
20
  require 'renuo/cli/app/release_xing'
19
21
  require 'renuo/cli/app/configure_semaphore'
22
+ require 'renuo/cli/app/toggl_redmine_comparator'
20
23
 
21
24
  module Renuo
22
25
  class CLI
@@ -129,6 +132,19 @@ module Renuo
129
132
  end
130
133
  end
131
134
 
135
+ command 'work' do |c|
136
+ c.syntax = 'renuo work'
137
+ c.summary = 'A utility command to start working on a ticket.'
138
+ c.description = 'When you start working on a feature, it will jump to the project folder, '\
139
+ 'start a new feature with the ticket number,'\
140
+ 'move the ticket in "In progress" state on Redmine and start Toggl with the '\
141
+ 'ticket number or add the ticket number to the running one if there was none.'
142
+ c.example 'renuo work start kinova 1234', 'start working on ticket 1234 on kinova project'
143
+ c.action do|args|
144
+ Work.new.run(args)
145
+ end
146
+ end
147
+
132
148
  command 'release' do |c|
133
149
  c.syntax = 'renuo release'
134
150
  c.summary = 'Release a projects state of develop (on github) to master in one command.'
@@ -214,6 +230,16 @@ module Renuo
214
230
  ConfigureSemaphore.new.call
215
231
  end
216
232
  end
233
+
234
+ command 'toggl-redmine' do |c|
235
+ c.syntax = 'renuo toggl-redmine'
236
+ c.summary = 'Compares your time entries between Toggl and Redmine'
237
+ c.description = 'This command extracts your time entries in Toggl and in Redmine and checks if they are'\
238
+ ' consistant. It can help you in your time booking to find if you booked something wrong'
239
+ c.action do |args|
240
+ TogglRedmineComparator.call
241
+ end
242
+ end
217
243
  end
218
244
  end
219
245
  end
@@ -22,7 +22,7 @@ class ConfigureSemaphore
22
22
  private
23
23
 
24
24
  def semaphore_cli_installed?
25
- semaphore_cli_installed = `sem context`.strip == '* renuo_semaphoreci_com'
25
+ semaphore_cli_installed = `sem context | grep '*'`.strip == '* renuo_semaphoreci_com'
26
26
  warn('You need to install and configure Semaphore CLI to run this command.') unless semaphore_cli_installed
27
27
  semaphore_cli_installed
28
28
  end
@@ -0,0 +1,54 @@
1
+ require 'csv'
2
+
3
+ module Redmine
4
+ class CsvBaseService
5
+ API_LOCATION = 'https://redmine.renuo.ch'.freeze
6
+
7
+ def initialize(token)
8
+ @token = token
9
+ end
10
+
11
+ def get
12
+ http_response = http_request(generate_url)
13
+ encoded_body = http_response.body.force_encoding('ISO-8859-1').encode('UTF-8')
14
+ csv = parse_csv(encoded_body)
15
+ parse_results(csv)
16
+ end
17
+
18
+ private
19
+
20
+ def generate_url
21
+ URI("#{API_LOCATION}/time_entries/report.csv?#{query}&key=#{@token}")
22
+ end
23
+
24
+ def http_request(url)
25
+ req = Net::HTTP::Get.new(url)
26
+ Net::HTTP.start(url.hostname, url.port, use_ssl: true) do |http|
27
+ http.request(req)
28
+ end
29
+ end
30
+
31
+ def query
32
+ # to be implemented in concrete service
33
+ end
34
+
35
+ def parse_results(_csv)
36
+ # to be implemented in concrete service
37
+ end
38
+
39
+ def parse_csv(body)
40
+ separated_csv_entries = CSV.parse(body, col_sep: ',')
41
+ keys = separated_csv_entries.shift[1..-2]
42
+ entries = separated_csv_entries.shift[1..-2]
43
+ Hash[keys.zip(entries)]
44
+ rescue CSV::MalformedCSVError
45
+ raise_bad_data_error
46
+ end
47
+
48
+ def raise_bad_data_error
49
+ error = 'Malformed CSV, please use comma delimiters (Redmine language setting?)'
50
+ Rails.logger.error error
51
+ raise Redmine::BadData, error
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,23 @@
1
+ require 'active_resource'
2
+
3
+ module Redmine
4
+ class Issue < ActiveResource::Base
5
+ STATUSES = {
6
+ to_start: 9,
7
+ planned: 15,
8
+ in_progress: 2,
9
+ qa: 12
10
+ }.freeze
11
+
12
+ self.site = 'https://redmine.renuo.ch'
13
+ self.include_root_in_json = true
14
+
15
+ def self.headers
16
+ { 'X-Redmine-API-Key' => RenuoCliConfig.redmine_api_key }
17
+ end
18
+
19
+ def html_url
20
+ "#{self.class.site}issues/#{id}"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ require 'yaml'
2
+
3
+ class RenuoCliConfig
4
+ CONFIG_FILE_PATH = "#{File.expand_path('~')}/.renuo_cli".freeze
5
+
6
+ class << self
7
+ def redmine_api_key
8
+ get_config_value('REDMINE_API_KEY', 'https://redmine.renuo.ch/my/account')
9
+ end
10
+
11
+ def toggl_api_token
12
+ get_config_value('TOGGL_API_TOKEN', 'https://toggl.com/app/profile')
13
+ end
14
+
15
+ private
16
+
17
+ def get_config_value(name, open_url)
18
+ FileUtils.touch(CONFIG_FILE_PATH)
19
+ config = YAML.load_file(CONFIG_FILE_PATH, fallback: {})
20
+ value = config[name]
21
+ return value if value
22
+ system("open #{open_url}")
23
+ value = ask("You haven't set your #{name}, yet. Please provide one:")
24
+ config[name] = value
25
+ File.write(CONFIG_FILE_PATH, config.to_yaml)
26
+ value
27
+ end
28
+ end
29
+ end
@@ -16,7 +16,7 @@ blocks:
16
16
  jobs:
17
17
  - name: <%= environment %>-deploy
18
18
  commands:
19
- - checkout --use-cache
19
+ - checkout
20
20
  - ssh-keyscan -H heroku.com >> ~/.ssh/known_hosts
21
21
  - chmod 600 ~/.ssh/id_rsa_semaphore_heroku
22
22
  - ssh-add ~/.ssh/id_rsa_semaphore_heroku
@@ -7,8 +7,11 @@ agent:
7
7
  auto_cancel:
8
8
  running:
9
9
  when: "true"
10
+
10
11
  blocks:
11
12
  - name: cache
13
+ execution_time_limit:
14
+ minutes: 10
12
15
  dependencies: []
13
16
  task:
14
17
  secrets:
@@ -23,6 +26,8 @@ blocks:
23
26
  - bin/yarn install --cache-folder ~/.cache/yarn
24
27
  - cache store
25
28
  - name: tests
29
+ execution_time_limit:
30
+ minutes: 10
26
31
  dependencies: ['cache']
27
32
  task:
28
33
  secrets:
@@ -37,6 +42,12 @@ blocks:
37
42
  - checkout
38
43
  - cache restore
39
44
  - bundle install --deployment --path vendor/bundle
45
+ - sem-service start postgres
46
+ - bundle exec rails db:create db:schema:load
47
+ jobs:
48
+ - name: tests
49
+ commands:
50
+ - bin/check
40
51
  promotions:
41
52
  - name: develop
42
53
  pipeline_file: develop-deploy.yml
@@ -0,0 +1,30 @@
1
+ require 'active_resource'
2
+
3
+ module Toggl
4
+ module CustomJsonFormat
5
+ include ActiveResource::Formats::JsonFormat
6
+
7
+ # rubocop:disable Style/ModuleFunction
8
+ extend self
9
+ # rubocop:enable Style/ModuleFunction
10
+
11
+ def decode(json)
12
+ ActiveSupport::JSON.decode(json)['data']
13
+ end
14
+ end
15
+
16
+ class Detail < ActiveResource::Base
17
+ self.format = CustomJsonFormat
18
+ self.site = 'https://toggl.com/reports/api/v2'
19
+ self.include_root_in_json = true
20
+ self.include_format_in_path = false
21
+
22
+ def self.user
23
+ RenuoCliConfig.toggl_api_token
24
+ end
25
+
26
+ def self.password
27
+ 'api_token'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ require 'active_resource'
2
+
3
+ module Toggl
4
+ class TimeEntry < ActiveResource::Base
5
+ self.site = 'https://www.toggl.com/api/v8/'
6
+ self.include_root_in_json = true
7
+ self.include_format_in_path = false
8
+
9
+ def self.user
10
+ RenuoCliConfig.toggl_api_token
11
+ end
12
+
13
+ def self.password
14
+ 'api_token'
15
+ end
16
+
17
+ def self.current
18
+ data = get(:current)['data']
19
+ data ? new(data) : nil
20
+ end
21
+
22
+ def self.start(params)
23
+ post(:start, {}, params.to_json)
24
+ end
25
+
26
+ def stop
27
+ put(:stop)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,24 @@
1
+ module Toggl
2
+ class User < ActiveResource::Base
3
+ self.site = 'https://www.toggl.com/api/v8/'
4
+ self.include_root_in_json = true
5
+ self.include_format_in_path = false
6
+
7
+ def self.user
8
+ RenuoCliConfig.toggl_api_token
9
+ end
10
+
11
+ def self.password
12
+ 'api_token'
13
+ end
14
+
15
+ def self.custom_method_collection_url(method_name, options)
16
+ prefix_options, query_options = split_options(options)
17
+ "#{prefix(prefix_options)}#{method_name}#{format_extension}#{query_string(query_options)}"
18
+ end
19
+
20
+ def self.me
21
+ new(get(:me)['data'])
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ require 'active_resource'
2
+
3
+ module Toggl
4
+ class Workspace < ActiveResource::Base
5
+ self.site = 'https://www.toggl.com/api/v8/'
6
+ self.include_root_in_json = true
7
+ self.include_format_in_path = false
8
+
9
+ def self.user
10
+ RenuoCliConfig.toggl_api_token
11
+ end
12
+
13
+ def self.password
14
+ 'api_token'
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,145 @@
1
+ require 'commander'
2
+ require 'csv'
3
+ require_relative './environments'
4
+ require_relative './fetch_emails'
5
+ require 'renuo/cli/app/toggl/workspace'
6
+ require 'renuo/cli/app/toggl/detail'
7
+ require 'renuo/cli/app/toggl/user'
8
+ require 'terminal-table'
9
+ require 'colorize'
10
+
11
+ class TogglRedmineComparator
12
+ class << self
13
+ def call(days_behind = 7)
14
+ report = {}
15
+ since_date = days_behind.days.before(Date.yesterday).strftime('%F')
16
+ until_date = Date.yesterday.strftime('%F')
17
+ extract_redmine(report, since_date, until_date)
18
+ extract_toggl(report, since_date, until_date)
19
+ report = report.sort.reverse.to_h
20
+ print_table(report)
21
+ report
22
+ end
23
+
24
+ private
25
+
26
+ def print_table(report)
27
+ rows = []
28
+ report.each do |date, value|
29
+ rows << colorize_table_row(date, value)
30
+ rows << :separator
31
+ end
32
+ rows.pop
33
+ table = Terminal::Table.new headings: %w[Day Redmine Toggl].map(&:cyan), rows: rows,
34
+ style: { padding_left: 2, padding_right: 2,
35
+ border_x: '-'.blue, border_y: '|'.blue, border_i: '+'.blue }
36
+ puts table
37
+ end
38
+
39
+ def colorize_table_row(date, value)
40
+ printed_day = date.strftime('%F %a')
41
+ printed_redmine = to_time(value[:redmine])
42
+ printed_toggl = to_time(value[:toggl])
43
+ colorize_method = colorization_for_value(value)
44
+ [printed_day, printed_redmine, printed_toggl].map { |v| v.colorize(colorize_method) }
45
+ end
46
+
47
+ def colorization_for_value(value)
48
+ if more_toggl?(value)
49
+ :red
50
+ elsif more_redmine?(value)
51
+ :default
52
+ else
53
+ :green
54
+ end
55
+ end
56
+
57
+ def extract_redmine(report, since_date, _until_date)
58
+ encoded_body = perform_redmine_call(since_date)
59
+ csv = convert_redmine_csv(encoded_body)
60
+ csv.each do |date, entry|
61
+ report[Date.parse(date)] ||= default_value
62
+ report[Date.parse(date)][:redmine] = to_seconds(entry) if entry.present?
63
+ end
64
+ end
65
+
66
+ def convert_redmine_csv(encoded_body)
67
+ separated_csv_entries = CSV.parse(encoded_body, col_sep: ',')
68
+ keys = separated_csv_entries.shift[1..-2]
69
+ entries = separated_csv_entries.shift[1..-2]
70
+ keys.zip(entries)
71
+ end
72
+
73
+ def perform_redmine_call(since_date)
74
+ query = generate_redmine_query(since_date)
75
+ url = URI("https://redmine.renuo.ch/time_entries/report.csv?#{query}")
76
+ req = Net::HTTP::Get.new(url)
77
+ req['X-Redmine-API-Key'] = RenuoCliConfig.redmine_api_key
78
+ response = Net::HTTP.start(url.hostname, url.port, use_ssl: true) { |http| http.request(req) }
79
+ response.body.force_encoding('ISO-8859-1').encode('UTF-8')
80
+ end
81
+
82
+ def generate_redmine_query(since_date)
83
+ URI.encode_www_form(
84
+ [['utf8', '✓'], ['criteria[]', 'user'],
85
+ ['f[]', 'spent_on'], ['f[]', 'user_id'],
86
+ ['op[spent_on]', '>='], ['op[user_id]', '='],
87
+ ['v[spent_on][]', since_date], ['v[user_id][]', 'me'],
88
+ ['f[]', ''],
89
+ ['c[]', 'project'], ['c[]', 'spent_on'], ['c[]', 'user'], ['c[]', 'activity'], ['c[]', 'issue'],
90
+ ['c[]', 'comments'], ['c[]', 'hours'], %w[columns day], ['criteria[]', '']]
91
+ )
92
+ end
93
+
94
+ def extract_toggl(report, since_date, until_date)
95
+ user_id = Toggl::User.me.id
96
+ workspace_ids = Toggl::Workspace.all.map(&:id)
97
+
98
+ workspace_ids.each do |workspace_id|
99
+ time_entries = Toggl::Detail.where(since: since_date, until: until_date,
100
+ user_agent: 'renuo-cli', workspace_id: workspace_id, user_ids: user_id)
101
+ parse_toggl_entries(report, time_entries)
102
+ end
103
+ end
104
+
105
+ def parse_toggl_entries(report, time_entries)
106
+ time_entries
107
+ .reject { |te| te.end.nil? }
108
+ .group_by { |time_entry| Date.parse(time_entry.end) }
109
+ .each do |date, grouped_time_entries|
110
+ report[date] ||= default_value
111
+ report[date][:toggl] += grouped_time_entries.sum(&:dur)
112
+ end
113
+ end
114
+
115
+ def default_value
116
+ { redmine: 0.0, toggl: 0.0 }
117
+ end
118
+
119
+ def to_time(value)
120
+ sec = value / 1000.0
121
+ min, _sec = sec.divmod(60.0)
122
+ hour, min = min.divmod(60.0)
123
+ format('%02d:%02d', hour, min)
124
+ end
125
+
126
+ def to_seconds(value)
127
+ hours, minutes = value.to_d.divmod(1.0)
128
+ (hours * 60 * 60 * 1000) + (minutes * 60 * 60 * 1000)
129
+ end
130
+
131
+ def non_working_day?(value)
132
+ [value[:redmine], value[:toggl]].all? { |v| v == 0.0 }
133
+ end
134
+
135
+ BUFFER = 20_000
136
+
137
+ def more_toggl?(value)
138
+ (value[:toggl] - value[:redmine]) > BUFFER
139
+ end
140
+
141
+ def more_redmine?(value)
142
+ (value[:redmine] - value[:toggl]) > BUFFER
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,94 @@
1
+ require 'fileutils'
2
+ require 'renuo/cli/app/redmine/issue'
3
+ require 'renuo/cli/app/toggl/time_entry'
4
+
5
+ class Work
6
+ ACTIONS = %w[start].freeze
7
+
8
+ def run(args)
9
+ ActiveResource::Base.logger = Logger.new(STDOUT)
10
+ @action, @project_name, @ticket_number = args
11
+ validate_action
12
+ validate_project_name
13
+ validate_ticket_number
14
+ start_feature_branch
15
+ update_redmine_ticket
16
+ start_toggl
17
+ end
18
+
19
+ private
20
+
21
+ # TODO: I want to implement also the stop action.
22
+ def validate_action
23
+ abort('>> No action given. It must be start') unless ACTIONS.include? @action
24
+ end
25
+
26
+ def validate_project_name
27
+ abort('>> No project name given.') unless @project_name
28
+ end
29
+
30
+ def validate_ticket_number
31
+ abort('>> No ticket number given.') unless @ticket_number
32
+ issue = Redmine::Issue.find(@ticket_number)
33
+ open_statuses = Redmine::Issue::STATUSES.values_at(:to_start, :planned, :in_progress, :qa)
34
+ return if open_statuses.include?(issue.status.id)
35
+
36
+ system("open #{issue.html_url}")
37
+ abort('>> Ticket should be in an open status')
38
+ end
39
+
40
+ def start_feature_branch
41
+ project_folder = `autojump #{@project_name}`.strip
42
+ system("cd #{project_folder} && git stash && git checkout develop "\
43
+ "&& git pull && git flow feature start #{@ticket_number}")
44
+ end
45
+
46
+ def update_redmine_ticket
47
+ issue = Redmine::Issue.find(@ticket_number)
48
+ issue.status_id = Redmine::Issue::STATUSES[:in_progress]
49
+ issue.save
50
+ system("open #{issue.html_url}")
51
+ end
52
+
53
+ def start_toggl
54
+ current_time_entry = Toggl::TimeEntry.current
55
+ if current_time_entry.nil?
56
+ create_toggl_time_entry
57
+ elsif current_time_entry.description.nil?
58
+ update_toggl_time_entry(current_time_entry.id)
59
+ else
60
+ existing_toggl(current_time_entry)
61
+ end
62
+ end
63
+
64
+ def existing_toggl(current_time_entry)
65
+ say("A timer '#{current_time_entry.description}' was already running.")
66
+ if current_time_entry.description.to_i == @ticket_number.to_i
67
+ say('I will keep using it')
68
+ else
69
+ say('I stopped it and started a new time entry.')
70
+ stop_toggl_time_entry(current_time_entry.id)
71
+ create_toggl_time_entry
72
+ end
73
+ end
74
+
75
+ def update_toggl_time_entry(time_entry_id)
76
+ say('A timer was already running but without a project assigned. I updated the current time entry.')
77
+
78
+ time_entry = Toggl::TimeEntry.find(time_entry_id)
79
+ time_entry.description = @ticket_number.to_s
80
+ time_entry.tags = [@project_name.to_s]
81
+ time_entry.created_with = 'curl'
82
+ time_entry.save
83
+ end
84
+
85
+ def create_toggl_time_entry
86
+ Toggl::TimeEntry.start(time_entry: { description: @ticket_number.to_s,
87
+ tags: [@project_name.to_s],
88
+ created_with: 'curl' })
89
+ end
90
+
91
+ def stop_toggl_time_entry(time_entry_id)
92
+ Toggl::TimeEntry.find(time_entry_id).stop
93
+ end
94
+ end
@@ -1,6 +1,6 @@
1
1
  module Renuo
2
2
  module Cli
3
- VERSION = '1.6.0'.freeze
3
+ VERSION = '1.7.0'.freeze
4
4
  NAME = 'renuo-cli'.freeze
5
5
  end
6
6
  end
@@ -17,14 +17,15 @@ Gem::Specification.new do |spec|
17
17
  spec.executables << 'renuo'
18
18
  spec.require_paths = ['lib']
19
19
 
20
+ spec.add_dependency 'activeresource', '~> 5.1.0'
20
21
  spec.add_dependency 'colorize', '~> 0'
21
22
  spec.add_dependency 'commander', '~> 4.0'
22
23
  spec.add_dependency 'gems', '~> 1.1'
23
24
  spec.add_dependency 'redcarpet', '~> 3.0'
25
+ spec.add_dependency 'terminal-table'
24
26
 
25
27
  spec.add_development_dependency 'aruba', '~> 0.14.5'
26
28
  spec.add_development_dependency 'bundler', '~> 2.0'
27
- spec.add_development_dependency 'coveralls', '~> 0.8.9'
28
29
  spec.add_development_dependency 'cucumber', '~> 3.1'
29
30
  spec.add_development_dependency 'dotenv', '~> 2.7.2'
30
31
  spec.add_development_dependency 'mdl', '~> 0.4.0'
@@ -32,7 +33,8 @@ Gem::Specification.new do |spec|
32
33
  spec.add_development_dependency 'rake', '~> 10.0'
33
34
  spec.add_development_dependency 'rspec', '~> 3.5'
34
35
  spec.add_development_dependency 'rubocop', '0.55.0'
35
- spec.add_development_dependency 'simplecov', '0.10.0' # TODO: update and fix coverage
36
+ spec.add_development_dependency 'simplecov'
37
+ spec.add_development_dependency 'simplecov-console'
36
38
  spec.add_development_dependency 'vcr', '~> 4.0.0'
37
39
  spec.add_development_dependency 'webmock', '~> 3.5.1'
38
40
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: renuo-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Renuo AG
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-31 00:00:00.000000000 Z
11
+ date: 2020-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activeresource
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 5.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 5.1.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: colorize
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -67,47 +81,47 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '3.0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: aruba
84
+ name: terminal-table
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - "~>"
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: 0.14.5
76
- type: :development
89
+ version: '0'
90
+ type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - "~>"
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: 0.14.5
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
- name: bundler
98
+ name: aruba
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '2.0'
103
+ version: 0.14.5
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '2.0'
110
+ version: 0.14.5
97
111
  - !ruby/object:Gem::Dependency
98
- name: coveralls
112
+ name: bundler
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: 0.8.9
117
+ version: '2.0'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: 0.8.9
124
+ version: '2.0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: cucumber
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -210,16 +224,30 @@ dependencies:
210
224
  name: simplecov
211
225
  requirement: !ruby/object:Gem::Requirement
212
226
  requirements:
213
- - - '='
227
+ - - ">="
214
228
  - !ruby/object:Gem::Version
215
- version: 0.10.0
229
+ version: '0'
216
230
  type: :development
217
231
  prerelease: false
218
232
  version_requirements: !ruby/object:Gem::Requirement
219
233
  requirements:
220
- - - '='
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: simplecov-console
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
221
242
  - !ruby/object:Gem::Version
222
- version: 0.10.0
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
223
251
  - !ruby/object:Gem::Dependency
224
252
  name: vcr
225
253
  requirement: !ruby/object:Gem::Requirement
@@ -257,14 +285,12 @@ executables:
257
285
  extensions: []
258
286
  extra_rdoc_files: []
259
287
  files:
260
- - ".coveralls.yml"
261
288
  - ".editorconfig"
262
289
  - ".gitignore"
263
290
  - ".mdlrc"
264
291
  - ".rspec"
265
292
  - ".rubocop.yml"
266
293
  - ".ruby-version"
267
- - ".travis.yml"
268
294
  - CODE_OF_CONDUCT.md
269
295
  - Gemfile
270
296
  - LICENSE.txt
@@ -289,17 +315,26 @@ files:
289
315
  - lib/renuo/cli/app/list_large_git_files.rb
290
316
  - lib/renuo/cli/app/local_storage.rb
291
317
  - lib/renuo/cli/app/name_display.rb
318
+ - lib/renuo/cli/app/redmine/csv_base_service.rb
319
+ - lib/renuo/cli/app/redmine/issue.rb
292
320
  - lib/renuo/cli/app/release_project.rb
293
321
  - lib/renuo/cli/app/release_xing.rb
294
322
  - lib/renuo/cli/app/services/cloudfront_config_service.rb
295
323
  - lib/renuo/cli/app/services/markdown_parser_service.rb
324
+ - lib/renuo/cli/app/services/renuo_cli_config.rb
296
325
  - lib/renuo/cli/app/setup_uptimerobot.rb
297
326
  - lib/renuo/cli/app/templates/semaphore-deploy.yml.erb
298
327
  - lib/renuo/cli/app/templates/semaphore.yml.erb
328
+ - lib/renuo/cli/app/toggl/detail.rb
329
+ - lib/renuo/cli/app/toggl/time_entry.rb
330
+ - lib/renuo/cli/app/toggl/user.rb
331
+ - lib/renuo/cli/app/toggl/workspace.rb
332
+ - lib/renuo/cli/app/toggl_redmine_comparator.rb
299
333
  - lib/renuo/cli/app/upgrade_laptop.rb
300
334
  - lib/renuo/cli/app/upgrade_laptop/run_command.rb
301
335
  - lib/renuo/cli/app/upgrade_laptop/upgrade_laptop_execution.rb
302
336
  - lib/renuo/cli/app/upgrade_laptop/upgrade_mac_os.rb
337
+ - lib/renuo/cli/app/work.rb
303
338
  - lib/renuo/cli/version.rb
304
339
  - renuo-cli.gemspec
305
340
  - vcr_cassettes/successful_uptimerobot_calls.yml
@@ -1 +0,0 @@
1
-
@@ -1,12 +0,0 @@
1
- language: ruby
2
- cache: bundler
3
- rvm:
4
- - 2.1
5
- - 2.2
6
- - 2.3.1
7
- before_install: gem install bundler -v 1.10.6
8
- install:
9
- - bundle install --retry=3
10
- script:
11
- - bundle exec rake test_with_coveralls
12
- - bundle exec rubocop