dovico 1.0.0 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 67d5d34d0fb717d92b72759aaa52d4f859e06c18
4
- data.tar.gz: a0661c8ada849a06068b0c5c998881a1ed679b92
3
+ metadata.gz: b6d0fc89e13ae40ce8fba111ea73420cb03dced3
4
+ data.tar.gz: 2e41cc97b937deb844a8d6da1c24eb3e3f2d3483
5
5
  SHA512:
6
- metadata.gz: c1b6046789cdfed1e55347c610254c5f4154ac414c3c56ead42e5135f1ca72849ffa02ac5353c77777332fdaf10866a165c44fcbd746a3b24ad31dd95add0c19
7
- data.tar.gz: a03029e6d62076b85c2ac5f2a7995dca2e8f50f3fd529720b0664f0c9a466a02f1ef06774fd8fa1d43f5f2f5663d0784f70be03a37ea916244fa535d9a29eecb
6
+ metadata.gz: 44898ec1528b4f6e4c40cba7d2e44ff3b6b8101cc6b00b39ff5736e80ac87dd6fb0853b459fb8c34e56c8e2068479e4401da83ff3a547447c65b9feebdd9d64a
7
+ data.tar.gz: 60fa2fd23b39d6a76ed0279a655efce636b3406aafefdfb8b6a04bd1b410190af5610b6b5d383d8a58065aa8c07298571e3549f01708b9d275a8b5948301942e
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.2.2
5
+ - 2.3.3
6
+ - 2.4.0
7
+
8
+ before_install:
9
+ - gem update --system # https://github.com/bundler/bundler/issues/5357
10
+ - make install
11
+
12
+ script:
13
+ - make test
@@ -0,0 +1,12 @@
1
+ # Next version
2
+
3
+ # Version 1.1.0
4
+ - Remove `bin/console` from the Gem
5
+ - Add a ConfigParser and extract code into models
6
+ - Update Gem metadata
7
+ - Specify ruby 2.2 as minimum ruby version for the gem
8
+ - Add --show option to print TimeEntries registered
9
+ - Add --start=2017-01-31 --end=2017-02-10 options for date options. Beware: it includes Saturdays and Sundays
10
+
11
+ # Version 1.0.0
12
+ - Initial release
data/Dockerfile CHANGED
@@ -17,6 +17,9 @@ COPY ./dovico-client.gemspec /home/dovico/dovico-client.gemspec
17
17
  COPY ./lib/dovico/version.rb /home/dovico/lib/dovico/version.rb
18
18
  COPY ./Gemfile /home/dovico/Gemfile
19
19
 
20
+ # Ensure UTF8 strings can be used
21
+ ENV LANG C.UTF-8
22
+
20
23
  # Bundle
21
24
  RUN bundle install
22
25
 
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Trainline.com Ltd
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
- [![build status](https://scm.capitainetrain.com/capitainetrain/dovico-client/badges/master/build.svg)](https://scm.capitainetrain.com/capitainetrain/dovico-client/commits/master)
2
- [![coverage report](https://scm.capitainetrain.com/capitainetrain/dovico-client/badges/master/coverage.svg)](https://scm.capitainetrain.com/capitainetrain/dovico-client/commits/master)
1
+ [![Build Status](https://travis-ci.org/trainline-eu/dovico.svg?branch=master)](https://travis-ci.org/trainline-eu/dovico)
3
2
 
4
3
  Repository for Dovico API management.
5
4
 
@@ -97,7 +96,6 @@ Year can be set too:
97
96
  `make day DAY=2017-12-31`
98
97
 
99
98
  # Restrictions and known issues
100
- * The timesheet are currently created, but not submitted. You still need to login and submit your timesheet
101
99
  * The client can't edit already created timesheets for now.
102
100
 
103
101
  You are warmly welcome to contribute to the project!
@@ -12,11 +12,13 @@ Gem::Specification.new do |s|
12
12
  s.summary = %q(Simple client & tools for http://www.dovico.com/.)
13
13
  s.description = %q(Simple client & tools for http://www.dovico.com/.)
14
14
 
15
- s.files = `git ls-files`.split("\n")
15
+ s.files = `git ls-files`.split("\n") - ['bin/console']
16
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
17
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
18
18
  s.require_paths = ['lib']
19
19
 
20
+ s.required_ruby_version = '>= 2.2.2'
21
+
20
22
  s.add_dependency 'easy_app_helper'
21
23
  s.add_dependency 'active_attr'
22
24
  s.add_dependency 'typhoeus'
@@ -1,7 +1,12 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext/hash'
3
+
1
4
  require 'dovico/version'
2
5
  require 'dovico/api_client'
3
6
  require 'dovico/app'
7
+ require 'dovico/config_parser'
4
8
  require 'dovico/model/assignment'
9
+ require 'dovico/model/time_entry_formatter'
5
10
  require 'dovico/model/time_entry_generator'
6
11
  require 'dovico/model/employee'
7
12
  require 'dovico/model/project'
@@ -29,22 +29,30 @@ EOL
29
29
  slop.on :tasks, 'Display info on tasks', argument: false
30
30
  end
31
31
  config.add_command_line_section('Fill the timesheets') do |slop|
32
- slop.on :fill, 'Fill the timesheet', argument: false
32
+ slop.on :fill, 'Fill the timesheet', argument: false
33
+ end
34
+ config.add_command_line_section('Show the timesheets') do |slop|
35
+ slop.on :show, 'Show the filled timesheets', argument: false
33
36
  end
34
37
  config.add_command_line_section('Submit the timesheets') do |slop|
35
- slop.on :submit, 'Submit timesheets', argument: false
38
+ slop.on :submit, 'Submit timesheets', argument: false
36
39
  end
37
- config.add_command_line_section('Date options (for --fill and --submit)') do |slop|
40
+ config.add_command_line_section('Date options (required for --show, --fill and --submit)') do |slop|
38
41
  slop.on :current_week, 'Current week', argument: false
39
42
  slop.on :today, 'Current day', argument: false
40
43
  slop.on :day, 'Specific day', argument: true
44
+ slop.on :start, 'Specific start day', argument: true
45
+ slop.on :end, 'Specific end day', argument: true
41
46
  slop.on :week, 'Specific "commercial" week. See https://www.epochconverter.com/weeks/', argument: true, as: Integer
42
47
  slop.on :year, '[optional] Specifiy year (for --week option), default current year', argument: true, as: Integer
43
48
  end
44
49
  end
45
50
 
46
51
  def run
47
- if config[:help] || !(config[:myself] || config[:tasks] || config[:fill] || config[:submit])
52
+ settings = ConfigParser.new(config)
53
+ start_date, end_date = settings.date_options
54
+
55
+ if settings.needs_help?
48
56
  display_help
49
57
  exit 0
50
58
  end
@@ -57,16 +65,15 @@ EOL
57
65
  display_tasks
58
66
  end
59
67
 
60
- if config[:fill] || config[:submit]
61
- start_date, end_date = parse_date_options
68
+ if config[:show]
69
+ display_time_entries(start_date, end_date)
70
+ end
62
71
 
72
+ if config[:fill]
63
73
  time_entry_generator = TimeEntryGenerator.new(
64
74
  assignments: config["assignments"],
65
75
  employee_id: myself.id,
66
76
  )
67
- end
68
-
69
- if config[:fill]
70
77
  time_entries = time_entry_generator.generate(start_date, end_date)
71
78
 
72
79
  saved_time_entries = TimeEntry.batch_create!(time_entries)
@@ -87,48 +94,22 @@ EOL
87
94
 
88
95
  def display_myself
89
96
  puts "Informations about yourself"
90
- puts " - ID: #{myself.id}"
91
- puts " - First Name: #{myself.first_name}"
92
- puts " - Last Name: #{myself.last_name}"
97
+ puts myself
93
98
  puts ""
94
99
  end
95
100
 
96
101
  def display_tasks
97
- projects = Project.all
98
-
99
102
  puts "== List of available projects =="
100
- puts " Project | Task | Description"
101
- projects.each do |project|
102
- if project.tasks.count > 0
103
- project.tasks.each do |task|
104
- puts sprintf ' %7d | %4d | %s: %s', project.id, task.id, project.name, task.name
105
- end
106
- else
107
- puts sprintf " %7d | | %s (No tasks linked)", project.id, task.name
108
- end
109
- end
103
+ puts Project.format_all
110
104
  puts ""
111
105
  end
112
106
 
113
- def parse_date_options
114
- if config[:week]
115
- year = config[:year] || Date.current.year
116
- start_date = Date.commercial(year, config[:week]).beginning_of_week
117
- end_date = start_date.advance(days: 4)
118
- elsif config[:current_week]
119
- start_date = Date.current.beginning_of_week
120
- end_date = start_date.advance(days: 4)
121
- elsif config[:day]
122
- start_date = end_date = Date.parse(config[:day])
123
- elsif config[:today]
124
- start_date = end_date = Date.current
125
- else
126
- puts "Error : You must precise one date options"
127
- display_help
128
- exit 1
129
- end
130
-
131
- [start_date, end_date]
107
+ def display_time_entries(start_date, end_date)
108
+ puts "== List of Time Entries between #{start_date} and #{end_date} =="
109
+ formatter = TimeEntryFormatter.new(Project.all)
110
+ time_entries = TimeEntry.search(start_date, end_date)
111
+ puts formatter.format_entries(time_entries)
112
+ puts ""
132
113
  end
133
114
 
134
115
  def display_help
@@ -0,0 +1,51 @@
1
+ module Dovico
2
+ class ConfigParser
3
+ AVAILABLE_ACTIONS = [:myself, :tasks, :show, :fill, :submit]
4
+
5
+ def initialize(config)
6
+ @config = config
7
+ @start_date, @end_date = parse_date_options
8
+ end
9
+
10
+ def needs_help?
11
+ if config[:help]
12
+ true
13
+ elsif AVAILABLE_ACTIONS.map{|action| config[action] }.compact.empty?
14
+ true
15
+ elsif (config[:fill] || config[:submit]) && !(@start_date && @end_date)
16
+ true
17
+ else
18
+ false
19
+ end
20
+ end
21
+
22
+ def date_options
23
+ [start_date, end_date]
24
+ end
25
+
26
+ private
27
+ attr_accessor :config, :start_date, :end_date
28
+
29
+ def parse_date_options
30
+ start_date, end_date = nil
31
+
32
+ if config[:week]
33
+ year = config[:year] || Date.current.year
34
+ start_date = Date.commercial(year, config[:week]).beginning_of_week
35
+ end_date = start_date.advance(days: 4)
36
+ elsif config[:current_week]
37
+ start_date = Date.current.beginning_of_week
38
+ end_date = start_date.advance(days: 4)
39
+ elsif config[:day]
40
+ start_date = end_date = Date.parse(config[:day])
41
+ elsif config[:today]
42
+ start_date = end_date = Date.current
43
+ elsif config[:start] && config[:end]
44
+ start_date = Date.parse(config[:start])
45
+ end_date = Date.parse(config[:end])
46
+ end
47
+
48
+ [start_date, end_date]
49
+ end
50
+ end
51
+ end
@@ -23,5 +23,11 @@ module Dovico
23
23
 
24
24
  parse(employees["Employees"].first)
25
25
  end
26
+
27
+ def to_s
28
+ %{ - ID: #{id}
29
+ - First Name: #{first_name}
30
+ - Last Name: #{last_name}}
31
+ end
26
32
  end
27
33
  end
@@ -5,6 +5,12 @@ module Dovico
5
5
 
6
6
  attribute :tasks
7
7
 
8
+ def self.parse(hash)
9
+ project = super(hash)
10
+ project.tasks ||= []
11
+ project
12
+ end
13
+
8
14
  def self.all
9
15
  projects_search = ApiClient.get(URL_PATH)
10
16
  projects = projects_search["Assignments"].map {|project_hash| parse(project_hash) }
@@ -13,6 +19,27 @@ module Dovico
13
19
  tasks_search = ApiClient.get("#{URL_PATH}#{project.assignement_id}")
14
20
  project.tasks = tasks_search["Assignments"].map {|task_hash| Task.parse(task_hash) }
15
21
  end
22
+
23
+ projects
24
+ end
25
+
26
+ def self.format_all
27
+ text = " Project | Task | Description"
28
+ text += all.map(&:to_s).join("\n")
29
+ end
30
+
31
+ def to_s
32
+ text = ''
33
+
34
+ if tasks.count > 0
35
+ tasks.each do |task|
36
+ text += sprintf ' %7d | %4d | %s: %s', id, task.id, name, task.name
37
+ end
38
+ else
39
+ text += sprintf " %7d | | %s (No tasks linked)", id, name
40
+ end
41
+
42
+ text
16
43
  end
17
44
  end
18
45
  end
@@ -12,6 +12,8 @@ module Dovico
12
12
  attribute :project_id
13
13
  attribute :task_id
14
14
  attribute :employee_id
15
+ attribute :sheet_id
16
+ attribute :sheet_status
15
17
  attribute :date
16
18
  attribute :total_hours
17
19
  attribute :description
@@ -24,6 +26,8 @@ module Dovico
24
26
  project_id: hash['Project']['ID'],
25
27
  task_id: hash['Task']['ID'],
26
28
  employee_id:hash['Employee']['ID'],
29
+ sheet_id: hash['Sheet']['ID'],
30
+ sheet_status: hash['Sheet']['Status'],
27
31
  date: hash['Date'],
28
32
  total_hours:hash['TotalHours'],
29
33
  description:hash['Description']
@@ -35,6 +39,19 @@ module Dovico
35
39
  TimeEntry.parse(entry)
36
40
  end
37
41
 
42
+ def self.search(start_date, end_date)
43
+ api_response = ApiClient.get(
44
+ "#{URL_PATH}",
45
+ params: {
46
+ daterange: "#{start_date} #{end_date}"
47
+ },
48
+ )
49
+
50
+ api_response["TimeEntries"].map do |time_entry|
51
+ TimeEntry.parse(time_entry)
52
+ end
53
+ end
54
+
38
55
  def self.batch_create!(assignments)
39
56
  api_assignements = assignments.map(&:to_api)
40
57
  ApiClient.post(URL_PATH, body: api_assignements.to_json)
@@ -72,6 +89,19 @@ module Dovico
72
89
  }.compact.stringify_keys
73
90
  end
74
91
 
92
+ def formal_sheet_status
93
+ case sheet_status
94
+ when "N"
95
+ :not_submitted
96
+ when "A"
97
+ :approved
98
+ when "U"
99
+ :under_review
100
+ when "R"
101
+ :rejected
102
+ end
103
+ end
104
+
75
105
  private
76
106
 
77
107
  def self.parse_id(long_id)
@@ -0,0 +1,41 @@
1
+ module Dovico
2
+ class TimeEntryFormatter
3
+
4
+ def initialize(projects)
5
+ @projects = projects
6
+ end
7
+
8
+ def format_entries(time_entries)
9
+ text = ""
10
+ time_entries.map do |time_entry|
11
+ text += "#{}"
12
+ time_entry_text(time_entry)
13
+ end.join("\n")
14
+ end
15
+
16
+ private
17
+ attr_accessor :projects
18
+
19
+ def time_entry_text(time_entry)
20
+ project, task = project_task(time_entry.project_id, time_entry.task_id)
21
+
22
+ progress_bar_width = (time_entry.total_hours.to_f * 2).to_i
23
+ sprintf("%s [%s] %s : [%8s] %2sh %s %s",
24
+ time_entry.date,
25
+ "×" * progress_bar_width,
26
+ " " * [16 - progress_bar_width, 0].max,
27
+ time_entry.formal_sheet_status,
28
+ time_entry.total_hours,
29
+ project.name,
30
+ task.name,
31
+ )
32
+ end
33
+
34
+ def project_task(project_id, task_id)
35
+ project = projects.select{ |project| project.id == project_id }.first
36
+ task = project.tasks.select{ |task| task.id == task_id }.first
37
+
38
+ [project, task]
39
+ end
40
+ end
41
+ end
@@ -1,5 +1,3 @@
1
- require 'active_attr'
2
-
3
1
  module Dovico
4
2
  class TimeEntryGenerator
5
3
  DEFAULT_START_HOUR = 9
@@ -1,3 +1,3 @@
1
1
  module Dovico
2
- VERSION = '1.0.0'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -7,6 +7,7 @@ SimpleCov.formatters = [
7
7
  SimpleCov.start do
8
8
  add_filter "db/"
9
9
  add_filter "spec/"
10
+ add_filter "lib/dovico/app.rb"
10
11
  add_group "Dovico", "lib/dovico"
11
12
  end
12
13
  require "rspec"
@@ -0,0 +1,99 @@
1
+ require "helper"
2
+
3
+ module Dovico
4
+ describe Dovico::ConfigParser do
5
+ let(:config) { {} }
6
+
7
+ subject do
8
+ Dovico::ConfigParser.new(config)
9
+ end
10
+
11
+ describe "#date_options" do
12
+ context 'with no date options' do
13
+ let(:config) { {} }
14
+
15
+ it 'returns nil, nil' do
16
+ expect(subject.date_options).to eq([nil, nil])
17
+ end
18
+ end
19
+
20
+ context 'with week option' do
21
+ let(:config) { { week: 10, year: 2017 } }
22
+
23
+ it 'returns first day of specified week, friday of the week' do
24
+ expect(subject.date_options).to eq([Date.parse('2017-03-06'), Date.parse('2017-03-10')])
25
+ end
26
+ end
27
+
28
+ context 'with day options' do
29
+ let(:config) { { day: '2017-10-12' } }
30
+
31
+ it 'returns specified date twice' do
32
+ expect(subject.date_options).to eq([Date.parse('2017-10-12'), Date.parse('2017-10-12')])
33
+ end
34
+ end
35
+
36
+ context 'with current_week options' do
37
+ let(:config) { { current_week: true } }
38
+
39
+ it 'returns monday, friday of the current week' do
40
+ Timecop.freeze(Date.parse('2017-10-12')) do
41
+ expect(subject.date_options).to eq([Date.parse('2017-10-09'), Date.parse('2017-10-13')])
42
+ end
43
+ end
44
+
45
+ context 'with start and end options' do
46
+ let(:config) { { start: '2017-10-12', end: '2017-12-13' } }
47
+
48
+ it 'returns the provided dates' do
49
+ expect(subject.date_options).to eq([Date.parse('2017-10-12'), Date.parse('2017-12-13')])
50
+ end
51
+ end
52
+ end
53
+
54
+ context 'with today options' do
55
+ let(:config) { { today: true } }
56
+
57
+ it 'returns current day twice' do
58
+ Timecop.freeze(Date.parse('2017-10-22')) do
59
+ expect(subject.date_options).to eq([Date.parse('2017-10-22'), Date.parse('2017-10-22')])
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ describe '#needs_help?' do
66
+ context 'with no config options' do
67
+ let(:config) { {} }
68
+
69
+ it 'returns true' do
70
+ expect(subject.needs_help?).to be true
71
+ end
72
+ end
73
+
74
+ context 'with --help' do
75
+ let(:config) { { help: true } }
76
+
77
+ it 'returns true' do
78
+ expect(subject.needs_help?).to be true
79
+ end
80
+ end
81
+
82
+ context 'with --fill and not date options' do
83
+ let(:config) { { fill: true } }
84
+
85
+ it 'returns true' do
86
+ expect(subject.needs_help?).to be true
87
+ end
88
+ end
89
+
90
+ context 'with --fill and date options' do
91
+ let(:config) { { fill: true, week: 42 } }
92
+
93
+ it 'returns false' do
94
+ expect(subject.needs_help?).to be false
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -10,6 +10,10 @@ module Dovico
10
10
  }.stringify_keys
11
11
  end
12
12
 
13
+ subject do
14
+ Dovico::Employee.parse(employee_api_hash)
15
+ end
16
+
13
17
  describe ".parse" do
14
18
  it "parses the hash" do
15
19
  employee = Dovico::Employee.parse(employee_api_hash)
@@ -40,5 +44,11 @@ module Dovico
40
44
  expect(myself.id).to eq('123')
41
45
  end
42
46
  end
47
+
48
+ describe '#to_s' do
49
+ it 'returns object with formatted text' do
50
+ expect(subject.to_s).to eq(" - ID: 123\n - First Name: James\n - Last Name: Bond")
51
+ end
52
+ end
43
53
  end
44
54
  end
@@ -2,6 +2,10 @@ require "helper"
2
2
 
3
3
  module Dovico
4
4
  describe Dovico::Project do
5
+ subject do
6
+ Dovico::Project.parse(project_api_hash)
7
+ end
8
+
5
9
  let(:project_api_hash) do
6
10
  {
7
11
  "ItemID": "123",
@@ -52,5 +56,22 @@ module Dovico
52
56
  expect(task.name).to eq('Task write specs')
53
57
  end
54
58
  end
59
+
60
+ describe ".format_all" do
61
+ before do
62
+ allow(ApiClient).to receive(:get).with(Dovico::Project::URL_PATH).and_return(projects_api_hash)
63
+ allow(ApiClient).to receive(:get).with("#{Dovico::Project::URL_PATH}T456").and_return(tasks_api_hash)
64
+ end
65
+
66
+ it 'returns projects with formatted text' do
67
+ expect(Dovico::Project.format_all).to eq(" Project | Task | Description 123 | 789 | Project Dovico API Client: Task write specs")
68
+ end
69
+ end
70
+
71
+ describe '#to_s' do
72
+ it 'returns object with formatted text' do
73
+ expect(subject.to_s).to eq(" 123 | | Project Dovico API Client (No tasks linked)")
74
+ end
75
+ end
55
76
  end
56
77
  end
@@ -0,0 +1,28 @@
1
+ require "helper"
2
+
3
+ module Dovico
4
+ describe Dovico::TimeEntryFormatter do
5
+ let(:task) { Dovico::Task.new(id: "1212", name: "TestTask") }
6
+ let(:project) { Dovico::Project.new(id: "9898", name: "TestProject", tasks: [task]) }
7
+ let(:time_entry) do
8
+ Dovico::TimeEntry.new(
9
+ project_id: "9898",
10
+ task_id: "1212",
11
+ start_time: "0900",
12
+ stop_time: "1200",
13
+ total_hours: "3",
14
+ sheet_status: "U"
15
+ )
16
+ end
17
+
18
+ subject do
19
+ Dovico::TimeEntryFormatter.new([project])
20
+ end
21
+
22
+ describe "#format_entries" do
23
+ it 'returns formatted tasks' do
24
+ expect(subject.format_entries([time_entry])).to eq(' [××××××] : [under_review] 3h TestProject TestTask')
25
+ end
26
+ end
27
+ end
28
+ end
@@ -20,6 +20,13 @@ module Dovico
20
20
  "ID": "333"
21
21
  }.stringify_keys
22
22
  end
23
+ let(:sheet_status) { "U" }
24
+ let(:sheet_hash) do
25
+ {
26
+ "ID": "444",
27
+ "Status": sheet_status,
28
+ }.stringify_keys
29
+ end
23
30
  let(:time_entry_api_hash) do
24
31
  {
25
32
  "ID": "456",
@@ -28,6 +35,7 @@ module Dovico
28
35
  "Project": project_hash,
29
36
  "Task": task_hash,
30
37
  "Employee": employee_hash,
38
+ "Sheet": sheet_hash,
31
39
  "Date": "2017-01-05",
32
40
  "TotalHours": "3",
33
41
  "Description": "Unit test",
@@ -42,6 +50,7 @@ module Dovico
42
50
  expect(time_entry.start_time).to eq('0800')
43
51
  expect(time_entry.project_id).to eq('111')
44
52
  expect(time_entry.employee_id).to eq('333')
53
+ expect(time_entry.sheet_id).to eq('444')
45
54
  expect(time_entry.total_hours).to eq('3')
46
55
  end
47
56
 
@@ -78,6 +87,30 @@ module Dovico
78
87
  end
79
88
  end
80
89
 
90
+ describe ".search" do
91
+ let(:time_entry_list_api) do
92
+ {
93
+ "TimeEntries": [ time_entry_api_hash ]
94
+ }.stringify_keys
95
+ end
96
+
97
+ before do
98
+ allow(ApiClient).to receive(:get).and_return(time_entry_list_api)
99
+ end
100
+
101
+ it 'calls the API and return an TimeEntry object' do
102
+ time_entries = Dovico::TimeEntry.search(Date.parse('2017-01-10'), Date.parse('2017-01-20'))
103
+
104
+ expect(time_entries.count).to eq(1)
105
+
106
+ time_entry = time_entries.first
107
+
108
+ expect(ApiClient).to have_received(:get).with("#{Dovico::TimeEntry::URL_PATH}", { params: { daterange: "2017-01-10 2017-01-20" } })
109
+ expect(time_entry).to be_an(Dovico::TimeEntry)
110
+ expect(time_entry.id).to eq('456')
111
+ end
112
+ end
113
+
81
114
  describe ".batch_create!" do
82
115
  let(:assignments) do
83
116
  [ subject ]
@@ -164,5 +197,39 @@ module Dovico
164
197
  )
165
198
  end
166
199
  end
200
+
201
+ describe "#formal_sheet_status" do
202
+ context 'not submitted' do
203
+ let(:sheet_status) { "N" }
204
+
205
+ it 'returns the correct symbol for the status' do
206
+ expect(subject.formal_sheet_status).to eq(:not_submitted)
207
+ end
208
+ end
209
+
210
+ context 'approved' do
211
+ let(:sheet_status) { "A" }
212
+
213
+ it 'returns the correct symbol for the status' do
214
+ expect(subject.formal_sheet_status).to eq(:approved)
215
+ end
216
+ end
217
+
218
+ context 'under review' do
219
+ let(:sheet_status) { "U" }
220
+
221
+ it 'returns the correct symbol for the status' do
222
+ expect(subject.formal_sheet_status).to eq(:under_review)
223
+ end
224
+ end
225
+
226
+ context 'rejected' do
227
+ let(:sheet_status) { "R" }
228
+
229
+ it 'returns the correct symbol for the status' do
230
+ expect(subject.formal_sheet_status).to eq(:rejected)
231
+ end
232
+ end
233
+ end
167
234
  end
168
235
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dovico
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Théophile Helleboid
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-01-31 00:00:00.000000000 Z
12
+ date: 2017-02-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: easy_app_helper
@@ -277,8 +277,11 @@ files:
277
277
  - ".gitlab-ci.yml"
278
278
  - ".rspec"
279
279
  - ".ruby-version"
280
+ - ".travis.yml"
281
+ - CHANGELOG.md
280
282
  - Dockerfile
281
283
  - Gemfile
284
+ - LICENSE.md
282
285
  - Makefile
283
286
  - README.md
284
287
  - Rakefile
@@ -290,19 +293,23 @@ files:
290
293
  - lib/dovico.rb
291
294
  - lib/dovico/api_client.rb
292
295
  - lib/dovico/app.rb
296
+ - lib/dovico/config_parser.rb
293
297
  - lib/dovico/model/assignment.rb
294
298
  - lib/dovico/model/employee.rb
295
299
  - lib/dovico/model/project.rb
296
300
  - lib/dovico/model/task.rb
297
301
  - lib/dovico/model/time_entry.rb
302
+ - lib/dovico/model/time_entry_formatter.rb
298
303
  - lib/dovico/model/time_entry_generator.rb
299
304
  - lib/dovico/version.rb
300
305
  - spec/helper.rb
301
306
  - spec/unit/dovico/api_client_spec.rb
307
+ - spec/unit/dovico/config_parser_spec.rb
302
308
  - spec/unit/dovico/model/assignment_spec.rb
303
309
  - spec/unit/dovico/model/employee_spec.rb
304
310
  - spec/unit/dovico/model/project_spec.rb
305
311
  - spec/unit/dovico/model/task_spec.rb
312
+ - spec/unit/dovico/model/time_entry_formatter_spec.rb
306
313
  - spec/unit/dovico/model/time_entry_generator_spec.rb
307
314
  - spec/unit/dovico/model/time_entry_spec.rb
308
315
  homepage: https://rubygems.org/gems/dovico
@@ -317,7 +324,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
317
324
  requirements:
318
325
  - - ">="
319
326
  - !ruby/object:Gem::Version
320
- version: '0'
327
+ version: 2.2.2
321
328
  required_rubygems_version: !ruby/object:Gem::Requirement
322
329
  requirements:
323
330
  - - ">="