time_log_robot 0.1.1 → 0.1.2.1
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.
- checksums.yaml +4 -4
- data/.settings.yml +7 -0
- data/Gemfile.lock +25 -1
- data/README.md +53 -2
- data/Rakefile +8 -0
- data/lib/time_log_robot/jira/issue_key_parser.rb +11 -10
- data/lib/time_log_robot/jira/work_logger.rb +1 -1
- data/lib/time_log_robot/version.rb +1 -1
- data/mapping.yml +6 -1
- data/test/test_helper.rb +14 -0
- data/test/time_log_robot/jira/issue_key_parser_test.rb +39 -0
- data/time_log_robot.gemspec +4 -0
- metadata +63 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71827460802d842afc432e63f81e43dc67430b73
|
4
|
+
data.tar.gz: e298a0e013600b8ceecbb17c96f450b1f92eed4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf45dbe4c59830766700c4b413ff40fd69deb342807ddf7cc6be3b662315b6f37f33fc9a4dcc1476c6c9c1da5962698ec89afa97910ab9d3633e00c33468310a
|
7
|
+
data.tar.gz: 3b7f530b071a53e1741167165adcc55d78fdb99a923dc63487b04397c1bc9660299734f79c7205f8bb3ab90f4b912894321c1ea37e7393461e9e1807e4c130d8
|
data/.settings.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
time_log_robot (0.1.
|
4
|
+
time_log_robot (0.1.2)
|
5
5
|
activesupport (~> 4.2, >= 4.2.6)
|
6
6
|
commander (~> 4.1, >= 4.1.6)
|
7
7
|
httparty (~> 0.13, >= 0.13.0)
|
@@ -16,6 +16,9 @@ GEM
|
|
16
16
|
minitest (~> 5.1)
|
17
17
|
thread_safe (~> 0.3, >= 0.3.4)
|
18
18
|
tzinfo (~> 1.1)
|
19
|
+
ansi (1.5.0)
|
20
|
+
builder (3.2.2)
|
21
|
+
coderay (1.1.1)
|
19
22
|
commander (4.1.6)
|
20
23
|
highline (~> 1.6.11)
|
21
24
|
highline (1.6.21)
|
@@ -23,10 +26,27 @@ GEM
|
|
23
26
|
json (~> 1.8)
|
24
27
|
multi_xml (>= 0.5.2)
|
25
28
|
i18n (0.7.0)
|
29
|
+
interception (0.5)
|
26
30
|
json (1.8.3)
|
31
|
+
method_source (0.8.2)
|
27
32
|
minitest (5.8.4)
|
33
|
+
minitest-emoji (2.0.0)
|
34
|
+
minitest-reporters (1.1.9)
|
35
|
+
ansi
|
36
|
+
builder
|
37
|
+
minitest (>= 5.0)
|
38
|
+
ruby-progressbar
|
28
39
|
multi_xml (0.5.5)
|
40
|
+
pry (0.10.3)
|
41
|
+
coderay (~> 1.1.0)
|
42
|
+
method_source (~> 0.8.1)
|
43
|
+
slop (~> 3.4)
|
44
|
+
pry-rescue (1.4.4)
|
45
|
+
interception (>= 0.5)
|
46
|
+
pry
|
29
47
|
rake (10.5.0)
|
48
|
+
ruby-progressbar (1.8.1)
|
49
|
+
slop (3.6.0)
|
30
50
|
thread_safe (0.3.5)
|
31
51
|
tzinfo (1.2.2)
|
32
52
|
thread_safe (~> 0.1)
|
@@ -36,6 +56,10 @@ PLATFORMS
|
|
36
56
|
|
37
57
|
DEPENDENCIES
|
38
58
|
bundler (~> 1.3)
|
59
|
+
minitest
|
60
|
+
minitest-emoji
|
61
|
+
minitest-reporters
|
62
|
+
pry-rescue
|
39
63
|
rake (~> 10.5)
|
40
64
|
time_log_robot!
|
41
65
|
|
data/README.md
CHANGED
@@ -1,6 +1,35 @@
|
|
1
1
|
# Time Log Robot
|
2
2
|
***Let the robot do your work time logging.***
|
3
3
|
|
4
|
+
,--. ,--.
|
5
|
+
((O ))--((O ))
|
6
|
+
,'_`--'____`--'_`.
|
7
|
+
_: ____________ :_
|
8
|
+
| | ||::::::::::|| | |
|
9
|
+
| | ||::::::::::|| | |
|
10
|
+
| | ||::::::::::|| | |
|
11
|
+
|_| |/__________\| |_|
|
12
|
+
|________________|
|
13
|
+
__..-' `-..__
|
14
|
+
.-| : .----------------. : |-.
|
15
|
+
,\ || | |\______________/| | || /.
|
16
|
+
/`.\:| | || __ __ __ || | |;/,'\
|
17
|
+
:`-._\;.| || '--''--''--' || |,:/_.-':
|
18
|
+
| : | || .----------. || | : |
|
19
|
+
| | | || '----SSt---' || | | |
|
20
|
+
| | | || _ _ _ || | | |
|
21
|
+
:,--.; | || (_) (_) (_) || | :,--.;
|
22
|
+
(`-'|) | ||______________|| | (|`-')
|
23
|
+
`--' | |/______________\| | `--'
|
24
|
+
|____________________|
|
25
|
+
`.________________,'
|
26
|
+
(_______)(_______)
|
27
|
+
(_______)(_______)
|
28
|
+
(_______)(_______)
|
29
|
+
(_______)(_______)
|
30
|
+
| || |
|
31
|
+
'--------''--------'
|
32
|
+
|
4
33
|
This is an integration between project management tools (like JIRA) and time logging apps (like Toggl). Currently, it only works as an import from Toggl into JIRA.
|
5
34
|
|
6
35
|
## Installation
|
@@ -39,7 +68,7 @@ Here are some notes about how to find the appropriate values for those environme
|
|
39
68
|
* **TOGGL_TOKEN**: In your Toggl account, go to your profile page and look for the API token at the bottom.
|
40
69
|
* **TOGGL_WORKSPACE_ID**: This is a little trickier. Your workspaces usually only show a human-readable name to you in Toggl's UI, and here you need the workspace's machine ID. But you can do a curl request to find it like this (replacing **TOGGL_TOKEN** with your token from above):
|
41
70
|
|
42
|
-
curl -v -u TOGGL_TOKEN:api_token \ -X GET https://www.toggl.com/api/v8/workspaces
|
71
|
+
`curl -v -u TOGGL_TOKEN:api_token \ -X GET https://www.toggl.com/api/v8/workspaces`
|
43
72
|
|
44
73
|
Look at the result and find the id given for the workspace you want to use.
|
45
74
|
|
@@ -48,6 +77,19 @@ Here are some notes about how to find the appropriate values for those environme
|
|
48
77
|
* **JIRA_USERNAME**: This is your JIRA username, which is not an email, but usually your email minus the "@domain.com"
|
49
78
|
* **JIRA_PASSWORD**: I know there's a lot of jargon, but some of these are pretty self-explanatory. :trollface:
|
50
79
|
|
80
|
+
### Mapping keys
|
81
|
+
|
82
|
+
You can now map JIRA keys to specific phrases so that in your Toggl time entries, you won't need to enter the JIRA key. These mappings are stored in a YAML file in the gem root directory:
|
83
|
+
|
84
|
+
path/to/gem/mapping.yml
|
85
|
+
|
86
|
+
# Example usage
|
87
|
+
# --
|
88
|
+
# phrase: JIRA-KEY
|
89
|
+
weekly planning: PM-1
|
90
|
+
|
91
|
+
With this mapping, when logging time on on Toggl, instead of having to enter "weekly planning [PM-1]", you can just enter "weekly planning" and the robot will get the JIRA key from the `mapping.yml` file.
|
92
|
+
|
51
93
|
### Help
|
52
94
|
|
53
95
|
For more details use the help flag:
|
@@ -72,4 +114,13 @@ To run the app in IRB for debugging run
|
|
72
114
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
73
115
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
74
116
|
4. Push to the branch (`git push origin my-new-feature`)
|
75
|
-
5. Create new Pull Request to Dev
|
117
|
+
5. Create new Pull Request to Dev
|
118
|
+
|
119
|
+
## License
|
120
|
+
|
121
|
+
This program is provided under an MIT open source license, read the [MIT-LICENSE.txt](http://github.com/supremebeing7/jira_toggl_importer/blob/master/LICENSE.txt) file for details.
|
122
|
+
|
123
|
+
|
124
|
+
## Copyright
|
125
|
+
|
126
|
+
Copyright (c) 2016 Mark J. Lehman
|
data/Rakefile
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'rake/testtask'
|
1
2
|
require 'bundler/gem_tasks'
|
2
3
|
|
3
4
|
desc 'Run in IRB for debugging'
|
@@ -8,3 +9,10 @@ task :console do
|
|
8
9
|
ARGV.clear
|
9
10
|
IRB.start
|
10
11
|
end
|
12
|
+
|
13
|
+
# @TODO Uncomment when it works! - `rake test`
|
14
|
+
|
15
|
+
Rake::TestTask.new do |t|
|
16
|
+
t.libs << 'test'
|
17
|
+
t.test_files = FileList['test/**/*_test.rb']
|
18
|
+
end
|
@@ -1,26 +1,27 @@
|
|
1
1
|
module TimeLogRobot
|
2
2
|
module JIRA
|
3
3
|
class IssueKeyParser
|
4
|
+
|
4
5
|
class << self
|
5
|
-
def parse(
|
6
|
-
matches =
|
7
|
-
|
8
|
-
|
9
|
-
else
|
10
|
-
get_key_from_key_mapping(entry['description'])
|
11
|
-
end
|
6
|
+
def parse(description)
|
7
|
+
matches = description.match(/(\[(?<issue_key>[^\]]*)\])/)
|
8
|
+
return matches['issue_key'] unless matches.nil?
|
9
|
+
get_key_from_key_mapping(description)
|
12
10
|
end
|
13
11
|
|
14
12
|
private
|
15
13
|
|
16
14
|
def get_key_from_key_mapping(description)
|
17
|
-
|
18
|
-
if found_key = mappings.keys.find { |key| /#{description}/ =~ key }
|
15
|
+
if found_key = mappings.keys.find { |key| description.include?(key) }
|
19
16
|
mappings[found_key]
|
20
17
|
end
|
21
18
|
end
|
22
19
|
|
23
|
-
def
|
20
|
+
def mappings
|
21
|
+
YAML.load_file(keymap_file_path) || {}
|
22
|
+
end
|
23
|
+
|
24
|
+
def keymap_file_path
|
24
25
|
File.join(TimeLogRobot.root, 'mapping.yml')
|
25
26
|
end
|
26
27
|
end
|
@@ -33,7 +33,7 @@ module TimeLogRobot
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def log(entry)
|
36
|
-
issue_key = JIRA::IssueKeyParser.parse(entry)
|
36
|
+
issue_key = JIRA::IssueKeyParser.parse(entry['description'])
|
37
37
|
payload = build_payload(entry)
|
38
38
|
puts "Attempting to log #{human_readable_duration(parse_duration(entry))}"
|
39
39
|
puts "starting on #{parse_start(entry)}"
|
data/mapping.yml
CHANGED
data/test/test_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/pride'
|
3
|
+
require 'minitest/emoji'
|
4
|
+
require 'minitest/reporters'
|
5
|
+
require 'yaml'
|
6
|
+
require 'active_support'
|
7
|
+
# require 'pry-rescue/minitest'
|
8
|
+
require 'httparty'
|
9
|
+
|
10
|
+
Dir[File.expand_path "lib/**/*.rb"].each{|file| require_relative file }
|
11
|
+
|
12
|
+
reporter_options = { color: true }
|
13
|
+
Minitest::Reporters.use! [Minitest::Reporters::DefaultReporter.new(reporter_options)]
|
14
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
module TimeLogRobot
|
4
|
+
module JIRA
|
5
|
+
class IssueKeyParser
|
6
|
+
def self.mappings
|
7
|
+
{
|
8
|
+
"mapped description" => "HI-5"
|
9
|
+
}
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class TestIssueKeyParser < Minitest::Test
|
14
|
+
def setup
|
15
|
+
@described_class = TimeLogRobot::JIRA::IssueKeyParser
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_that_it_gets_the_issue_key
|
19
|
+
assert_equal "PM-12", @described_class.parse('description [PM-12]')
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_that_it_gives_nothing_with_no_key_present
|
23
|
+
assert_equal nil, @described_class.parse('description')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_that_it_fetches_the_key_from_mapping
|
27
|
+
assert_equal "HI-5", @described_class.parse('mapped description')
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_that_parse_is_not_too_strict_with_mappings
|
31
|
+
assert_equal "HI-5", @described_class.parse('mapped description with more text')
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_that_parse_mappings_works_with_comments
|
35
|
+
assert_equal "HI-5", @described_class.parse('mapped description - {with comment}')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/time_log_robot.gemspec
CHANGED
@@ -21,6 +21,10 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.required_ruby_version = '>= 2.0'
|
22
22
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
23
23
|
spec.add_development_dependency 'rake', '~> 10.5'
|
24
|
+
spec.add_development_dependency 'minitest'
|
25
|
+
spec.add_development_dependency 'minitest-emoji'
|
26
|
+
spec.add_development_dependency 'minitest-reporters'
|
27
|
+
spec.add_development_dependency 'pry-rescue'
|
24
28
|
|
25
29
|
spec.add_runtime_dependency 'activesupport', '~> 4.2', '>= 4.2.6'
|
26
30
|
spec.add_runtime_dependency 'commander', '~> 4.1', '>= 4.1.6'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: time_log_robot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.1
|
4
|
+
version: 0.1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark J. Lehman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,62 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
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: minitest-emoji
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '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'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest-reporters
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry-rescue
|
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'
|
41
97
|
- !ruby/object:Gem::Dependency
|
42
98
|
name: activesupport
|
43
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,6 +199,8 @@ files:
|
|
143
199
|
- lib/time_log_robot/toggl/tagger.rb
|
144
200
|
- lib/time_log_robot/version.rb
|
145
201
|
- mapping.yml
|
202
|
+
- test/test_helper.rb
|
203
|
+
- test/time_log_robot/jira/issue_key_parser_test.rb
|
146
204
|
- time_log_robot.gemspec
|
147
205
|
homepage: https://github.com/supremebeing7/time_log_robot
|
148
206
|
licenses:
|
@@ -168,5 +226,7 @@ rubygems_version: 2.4.8
|
|
168
226
|
signing_key:
|
169
227
|
specification_version: 4
|
170
228
|
summary: Automate work time logging
|
171
|
-
test_files:
|
229
|
+
test_files:
|
230
|
+
- test/test_helper.rb
|
231
|
+
- test/time_log_robot/jira/issue_key_parser_test.rb
|
172
232
|
has_rdoc:
|