dovico 1.0.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.
- checksums.yaml +7 -0
- data/.dockerignore +1 -0
- data/.gitignore +4 -0
- data/.gitlab-ci.yml +15 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/Dockerfile +28 -0
- data/Gemfile +3 -0
- data/Makefile +66 -0
- data/README.md +106 -0
- data/Rakefile +11 -0
- data/bin/console +6 -0
- data/bin/dovico +4 -0
- data/doc/API.md +135 -0
- data/dovico-client.gemspec +39 -0
- data/dovico.yml.example +26 -0
- data/lib/dovico.rb +9 -0
- data/lib/dovico/api_client.rb +67 -0
- data/lib/dovico/app.rb +138 -0
- data/lib/dovico/model/assignment.rb +26 -0
- data/lib/dovico/model/employee.rb +27 -0
- data/lib/dovico/model/project.rb +18 -0
- data/lib/dovico/model/task.rb +6 -0
- data/lib/dovico/model/time_entry.rb +83 -0
- data/lib/dovico/model/time_entry_generator.rb +58 -0
- data/lib/dovico/version.rb +3 -0
- data/spec/helper.rb +24 -0
- data/spec/unit/dovico/api_client_spec.rb +81 -0
- data/spec/unit/dovico/model/assignment_spec.rb +26 -0
- data/spec/unit/dovico/model/employee_spec.rb +44 -0
- data/spec/unit/dovico/model/project_spec.rb +56 -0
- data/spec/unit/dovico/model/task_spec.rb +26 -0
- data/spec/unit/dovico/model/time_entry_generator_spec.rb +86 -0
- data/spec/unit/dovico/model/time_entry_spec.rb +168 -0
- metadata +332 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 67d5d34d0fb717d92b72759aaa52d4f859e06c18
|
4
|
+
data.tar.gz: a0661c8ada849a06068b0c5c998881a1ed679b92
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c1b6046789cdfed1e55347c610254c5f4154ac414c3c56ead42e5135f1ca72849ffa02ac5353c77777332fdaf10866a165c44fcbd746a3b24ad31dd95add0c19
|
7
|
+
data.tar.gz: a03029e6d62076b85c2ac5f2a7995dca2e8f50f3fd529720b0664f0c9a466a02f1ef06774fd8fa1d43f5f2f5663d0784f70be03a37ea916244fa535d9a29eecb
|
data/.dockerignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
.git/
|
data/.gitignore
ADDED
data/.gitlab-ci.yml
ADDED
data/.rspec
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.4.0
|
data/Dockerfile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
FROM ruby:2.4
|
2
|
+
|
3
|
+
# System dependencies: Add here any librairies needed for certain gems
|
4
|
+
RUN apt-get update \
|
5
|
+
&& apt-get install -y libpq-dev \
|
6
|
+
&& apt-get clean \
|
7
|
+
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
8
|
+
|
9
|
+
# Application working directory
|
10
|
+
WORKDIR /home/dovico
|
11
|
+
|
12
|
+
# WARNING The following line is important to keep bundle config
|
13
|
+
# inside the app directory
|
14
|
+
ENV BUNDLE_APP_CONFIG /home/dovico/.bundle/
|
15
|
+
# Copy dependency file
|
16
|
+
COPY ./dovico-client.gemspec /home/dovico/dovico-client.gemspec
|
17
|
+
COPY ./lib/dovico/version.rb /home/dovico/lib/dovico/version.rb
|
18
|
+
COPY ./Gemfile /home/dovico/Gemfile
|
19
|
+
|
20
|
+
# Bundle
|
21
|
+
RUN bundle install
|
22
|
+
|
23
|
+
# Copy code
|
24
|
+
COPY ./ /home/dovico
|
25
|
+
|
26
|
+
# What to launch on container startup
|
27
|
+
ENTRYPOINT ["make"]
|
28
|
+
CMD ["run"]
|
data/Gemfile
ADDED
data/Makefile
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
WEEK ?= $(shell date +%V)
|
2
|
+
YEAR ?= $(shell date +%Y)
|
3
|
+
DAY ?= $(shell date +%F)
|
4
|
+
TAG ?= $(shell git log -1 --abbrev=10 --format=%h)
|
5
|
+
|
6
|
+
# Update the specified dependencies
|
7
|
+
install:
|
8
|
+
@command -v ruby >/dev/null 2>&1 || { echo >&2 "I require ruby but it's not installed. Aborting."; exit 1; }
|
9
|
+
@command -v bundle >/dev/null 2>&1 || gem install bundler;
|
10
|
+
bundle check || bundle install
|
11
|
+
|
12
|
+
# Run all the tests
|
13
|
+
test: bundler
|
14
|
+
bundle exec rake spec
|
15
|
+
|
16
|
+
build:
|
17
|
+
bundle exec gem build dovico-client.gemspec
|
18
|
+
|
19
|
+
help:
|
20
|
+
bundle exec bin/dovico --help
|
21
|
+
|
22
|
+
tasks:
|
23
|
+
bundle exec bin/dovico --tasks
|
24
|
+
|
25
|
+
myself:
|
26
|
+
bundle exec bin/dovico --myself
|
27
|
+
|
28
|
+
# Fill actions
|
29
|
+
current_week:
|
30
|
+
bundle exec bin/dovico --fill --current-week
|
31
|
+
|
32
|
+
week:
|
33
|
+
bundle exec bin/dovico --fill --year=$(YEAR) --week=$(WEEK)
|
34
|
+
|
35
|
+
today:
|
36
|
+
bundle exec bin/dovico --fill --today
|
37
|
+
|
38
|
+
day:
|
39
|
+
bundle exec bin/dovico --fill --day=$(DAY)
|
40
|
+
|
41
|
+
# Submit actions
|
42
|
+
submit-current-week:
|
43
|
+
bundle exec bin/dovico --submit --current-week
|
44
|
+
|
45
|
+
submit-week:
|
46
|
+
bundle exec bin/dovico --submit --year=$(YEAR) --week=$(WEEK)
|
47
|
+
|
48
|
+
submit-day:
|
49
|
+
bundle exec bin/dovico --submit --day=$(DAY)
|
50
|
+
|
51
|
+
submit-today:
|
52
|
+
bundle exec bin/dovico --submit --today
|
53
|
+
|
54
|
+
# Private - ensure gems are up-to-date
|
55
|
+
bundler:
|
56
|
+
bundle check>/dev/null || bundle install
|
57
|
+
|
58
|
+
docker-build-image:
|
59
|
+
docker images | grep capitainetrain/dovico | grep $(TAG) || docker build --force-rm -t capitainetrain/dovico:$(TAG) -f Dockerfile .
|
60
|
+
|
61
|
+
# Run tests in Docker image
|
62
|
+
docker-test: docker-build-image
|
63
|
+
docker run --rm capitainetrain/dovico:$(TAG) test
|
64
|
+
|
65
|
+
|
66
|
+
.PHONY: install test help tasks myself current_week week today day submit-current-week submit-week submit-day submit-today bundler docker-build-image docker-test
|
data/README.md
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
[](https://scm.capitainetrain.com/capitainetrain/dovico-client/commits/master)
|
2
|
+
[](https://scm.capitainetrain.com/capitainetrain/dovico-client/commits/master)
|
3
|
+
|
4
|
+
Repository for Dovico API management.
|
5
|
+
|
6
|
+
# Installation
|
7
|
+
## Dovico authentication
|
8
|
+
Dovico provide a way to generate a 3rd party token. This token provide a full access to your account:
|
9
|
+
- Do not expose your token.
|
10
|
+
- If you believe your token has been exposed publicly, regenerate a new one. The previous token will be invalidated.
|
11
|
+
|
12
|
+
To generate a token:
|
13
|
+
* Login to https://login.dovico.com/index.aspx
|
14
|
+
* In **Options** tab, in the **Apps** part, click on the `Reset` button and copy your token
|
15
|
+
|
16
|
+
## Local configuration
|
17
|
+
* Create a new YAML file `~/.dovico/dovico.yml` with the following content:
|
18
|
+
|
19
|
+
~~~ruby
|
20
|
+
# Personal token. Can be reset through Dovico setting page
|
21
|
+
user_token: "<token you have copied from dovico.net page>"
|
22
|
+
# Your company's token
|
23
|
+
client_token: "<token given by your company's dovico admin>"
|
24
|
+
~~~
|
25
|
+
|
26
|
+
## Install required libraries
|
27
|
+
* Install Ruby 2.4.0
|
28
|
+
* `make install`
|
29
|
+
|
30
|
+
## Setup your default timesheet
|
31
|
+
* List the available tasks with `make tasks`
|
32
|
+
|
33
|
+
~~~
|
34
|
+
$ make tasks
|
35
|
+
== List of available projects ==
|
36
|
+
Project | Task | Description
|
37
|
+
1200 | 100 | Sauron Project: Forge the One Ring
|
38
|
+
1200 | 110 | Sauron Project: Attack Gondor
|
39
|
+
1400 | 100 | Gandalf Project: Meet Bilbo
|
40
|
+
1400 | 120 | Gandalf Project: Convince Frodo
|
41
|
+
1600 | 100 | Frodo Project: Go home
|
42
|
+
~~~
|
43
|
+
|
44
|
+
* For each tasks you work on, note the Project, Task and hours spent. You should have a total of 7 hours of work each day.
|
45
|
+
* In your `~/.dovico/dovico.yml` file, *append* it with the following content
|
46
|
+
|
47
|
+
~~~ruby
|
48
|
+
# Personal token. Can be reset through Dovico setting page
|
49
|
+
user_token: "...."
|
50
|
+
# Your company's token
|
51
|
+
client_token: "...."
|
52
|
+
assignments:
|
53
|
+
default_day:
|
54
|
+
- project_id: 1234
|
55
|
+
task_id: 100
|
56
|
+
hours: 3
|
57
|
+
- project_id: 9999
|
58
|
+
task_id: 120
|
59
|
+
hours: 2
|
60
|
+
- project_id: 4321
|
61
|
+
task_id: 424
|
62
|
+
hours: 2
|
63
|
+
# Quotes around day are mandatory
|
64
|
+
# On leave: use an empty array
|
65
|
+
'2016-01-17': []
|
66
|
+
# Specific day: redefine each tasks
|
67
|
+
'2017-12-19':
|
68
|
+
- project_id: 1234
|
69
|
+
task_id: 456
|
70
|
+
hours: 6
|
71
|
+
- project_id: 4321
|
72
|
+
task_id: 424
|
73
|
+
hours: 1
|
74
|
+
~~~
|
75
|
+
|
76
|
+
# Usage
|
77
|
+
## Display informations on your account
|
78
|
+
`make myself`
|
79
|
+
|
80
|
+
## Display the list of the tasks
|
81
|
+
`make tasks`
|
82
|
+
|
83
|
+
## Fill the timesheet
|
84
|
+
### For the current week
|
85
|
+
`make current_week`
|
86
|
+
|
87
|
+
### For today
|
88
|
+
`make today`
|
89
|
+
|
90
|
+
### For a specific [commercial week](http://www.epochconverter.com/weeks/)
|
91
|
+
`make week WEEK=49`
|
92
|
+
|
93
|
+
Year can be set too:
|
94
|
+
`make week YEAR=2015 WEEK=40`
|
95
|
+
|
96
|
+
### For a specific day
|
97
|
+
`make day DAY=2017-12-31`
|
98
|
+
|
99
|
+
# Restrictions and known issues
|
100
|
+
* The timesheet are currently created, but not submitted. You still need to login and submit your timesheet
|
101
|
+
* The client can't edit already created timesheets for now.
|
102
|
+
|
103
|
+
You are warmly welcome to contribute to the project!
|
104
|
+
|
105
|
+
# Dovico API Documentation
|
106
|
+
* http://apideveloper.dovico.com/
|
data/Rakefile
ADDED
data/bin/console
ADDED
data/bin/dovico
ADDED
data/doc/API.md
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
# Dovico API
|
2
|
+
|
3
|
+
## `/Employees`
|
4
|
+
### Query myself
|
5
|
+
Query : `GET /Employees/me`
|
6
|
+
|
7
|
+
Response :
|
8
|
+
~~~json
|
9
|
+
{
|
10
|
+
"Employees": [
|
11
|
+
{
|
12
|
+
"ID": "860",
|
13
|
+
"FirstName": "Theophile",
|
14
|
+
"LastName": "Helleboid",
|
15
|
+
"GetItemURI": "https://api.dovico.com/Employees/860/?version=5"
|
16
|
+
}
|
17
|
+
]
|
18
|
+
}
|
19
|
+
~~~
|
20
|
+
|
21
|
+
## `/TimeEntries`
|
22
|
+
### Get Time Entries for one employee
|
23
|
+
Query `GET TimeEntries/Employee/860`
|
24
|
+
|
25
|
+
Response:
|
26
|
+
~~~json
|
27
|
+
{
|
28
|
+
"TimeEntries": [
|
29
|
+
{
|
30
|
+
"ID": "T4d5ba65f-9ebc-4587-a72c-8243b2612a2b",
|
31
|
+
"Sheet": {"ID":"0", "Status":"N", "RejectedReason":""},
|
32
|
+
"Client": {"ID":"0", "Name":"[None]", "GetItemURI":"N/A"},
|
33
|
+
"Project": {"ID":"1269", "Name":"Non-Project Related", "GetItemURI":"https://api.dovico.com/Projects/1269/?version=5"},
|
34
|
+
"Task": {"ID":"482", "Name":"Other", "GetItemURI":"https://api.dovico.com/Tasks/482/?version=5"},
|
35
|
+
"Employee": {"ID":"860", "Name":"Helleboid, Theophile", "GetItemURI":"https://api.dovico.com/Employees/860/?version=5"},
|
36
|
+
"Date": "2017-01-02",
|
37
|
+
"StartTime": "0900",
|
38
|
+
"StopTime": "1600",
|
39
|
+
"TotalHours": "7",
|
40
|
+
"Description":"",
|
41
|
+
"Billable": "T",
|
42
|
+
"Charge": "0",
|
43
|
+
"ChargeCurrency": {"ID":"-1", "Symbol":"£", "GetItemURI":"N/A"},
|
44
|
+
"OTCharge": "1",
|
45
|
+
"Wage": "0",
|
46
|
+
"WageCurrency":{"ID":"-1", "Symbol":"£", "GetItemURI":"N/A"},
|
47
|
+
"OTWage": "1",
|
48
|
+
"Prorate": "0",
|
49
|
+
"Integrate": "",
|
50
|
+
"CustomFields":[]
|
51
|
+
}
|
52
|
+
],
|
53
|
+
"PrevPageURI": "N/A",
|
54
|
+
"NextPageURI": "N/A"
|
55
|
+
}
|
56
|
+
~~~
|
57
|
+
|
58
|
+
### Create a new TimeEntry
|
59
|
+
Query `POST /TimeEntries/`
|
60
|
+
Body :
|
61
|
+
~~~json
|
62
|
+
[
|
63
|
+
{
|
64
|
+
"ProjectID": "1297",
|
65
|
+
"TaskID": "4917",
|
66
|
+
"EmployeeID": "111",
|
67
|
+
"Date": "2011-06-01",
|
68
|
+
"TotalHours": "1"
|
69
|
+
}
|
70
|
+
]
|
71
|
+
~~~
|
72
|
+
|
73
|
+
|
74
|
+
## `/Assignments`
|
75
|
+
### Get a list of Assignments (ie, projects)
|
76
|
+
Query: `GET /Assignments`
|
77
|
+
|
78
|
+
Response
|
79
|
+
~~~json
|
80
|
+
{
|
81
|
+
"Assignments": [
|
82
|
+
{
|
83
|
+
"AssignmentID": "P1238",
|
84
|
+
"ItemID": "1238",
|
85
|
+
"Name": "C004 - iOS Optimisation",
|
86
|
+
"StartDate": "2017-01-04",
|
87
|
+
"FinishDate": "2018-01-04",
|
88
|
+
"EstimatedHours":"N/A",
|
89
|
+
"TimeBillableByDefault":"N/A",
|
90
|
+
"ExpensesBillableByDefault":"T",
|
91
|
+
"Charge": "N/A",
|
92
|
+
"ChargeCurrency":{"ID":"N/A", "Symbol":"N/A", "GetItemURI":"N/A"},
|
93
|
+
"Wage": "N/A",
|
94
|
+
"WageCurrency": {"ID":"N/A", "Symbol":"N/A", "GetItemURI":"N/A"},
|
95
|
+
"Prorate": "N/A",
|
96
|
+
"ETC": "N/A",
|
97
|
+
"Hide": "N/A",
|
98
|
+
"GetAssignmentsURI":"https://api.dovico.com/Assignments/P1238/?version=5",
|
99
|
+
"GetItemURI":"https://api.dovico.com/Projects/1238/?version=5"
|
100
|
+
}
|
101
|
+
]
|
102
|
+
}
|
103
|
+
~~~
|
104
|
+
|
105
|
+
### Get a list of task linked to a Project (ie Task)
|
106
|
+
Query: `GET /Assignements/P1238`
|
107
|
+
|
108
|
+
Response
|
109
|
+
~~~json
|
110
|
+
{
|
111
|
+
"Assignments": [
|
112
|
+
{
|
113
|
+
"AssignmentID": "T32197",
|
114
|
+
"ItemID": "100",
|
115
|
+
"Name": "Core Development",
|
116
|
+
"StartDate": "N/A",
|
117
|
+
"FinishDate": "N/A",
|
118
|
+
"EstimatedHours":"N/A",
|
119
|
+
"TimeBillableByDefault":"N/A",
|
120
|
+
"ExpensesBillableByDefault":"N/A",
|
121
|
+
"Charge": "N/A",
|
122
|
+
"ChargeCurrency": {"ID":"N/A", "Symbol":"N/A", "GetItemURI":"N/A"},
|
123
|
+
"Wage": "N/A",
|
124
|
+
"WageCurrency": {"ID":"N/A", "Symbol":"N/A", "GetItemURI":"N/A"},
|
125
|
+
"Prorate": "N/A",
|
126
|
+
"ETC": "N/A",
|
127
|
+
"Hide": "N/A",
|
128
|
+
"GetAssignmentsURI":"https://api.dovico.com/Assignments/T32197/?version=5",
|
129
|
+
"GetItemURI": "https://api.dovico.com/Tasks/100/?version=5"}],
|
130
|
+
"PrevPageURI": "N/A",
|
131
|
+
"NextPageURI": "N/A"
|
132
|
+
}
|
133
|
+
]
|
134
|
+
}
|
135
|
+
~~~
|
@@ -0,0 +1,39 @@
|
|
1
|
+
$: << File.expand_path("../lib", __FILE__)
|
2
|
+
require 'dovico/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'dovico'
|
6
|
+
s.licenses = ['MIT']
|
7
|
+
s.version = Dovico::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ['Théophile Helleboid', 'Paul Bonaud']
|
10
|
+
s.email = ['theophile.helleboid@trainline.com']
|
11
|
+
s.homepage = 'https://rubygems.org/gems/dovico'
|
12
|
+
s.summary = %q(Simple client & tools for http://www.dovico.com/.)
|
13
|
+
s.description = %q(Simple client & tools for http://www.dovico.com/.)
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
18
|
+
s.require_paths = ['lib']
|
19
|
+
|
20
|
+
s.add_dependency 'easy_app_helper'
|
21
|
+
s.add_dependency 'active_attr'
|
22
|
+
s.add_dependency 'typhoeus'
|
23
|
+
|
24
|
+
s.add_development_dependency 'pry'
|
25
|
+
s.add_development_dependency 'guard'
|
26
|
+
s.add_development_dependency 'guard-rspec'
|
27
|
+
s.add_development_dependency 'guard-rubocop'
|
28
|
+
s.add_development_dependency 'rubocop'
|
29
|
+
s.add_development_dependency 'ci_reporter'
|
30
|
+
s.add_development_dependency 'ci_reporter_rspec'
|
31
|
+
s.add_development_dependency 'rack-test'
|
32
|
+
s.add_development_dependency 'rake'
|
33
|
+
s.add_development_dependency 'rspec'
|
34
|
+
s.add_development_dependency 'rspec-its'
|
35
|
+
s.add_development_dependency 'simplecov'
|
36
|
+
s.add_development_dependency 'simplecov-rcov'
|
37
|
+
s.add_development_dependency 'timecop'
|
38
|
+
s.add_development_dependency 'webmock'
|
39
|
+
end
|