time-sheet 0.14.1 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1d983250fe5929d2a5de7f868b2b55d88b2fe3ba4b0bef3f3083d814f7d033e3
4
- data.tar.gz: d521c6398e4264bec7e4e67e261ec10ba7d045218f6c1247dfaee517ea0ae072
3
+ metadata.gz: 461fe4226d6a5980fa168c7c918b01b35fb27aebef3110ff25d6d295709c6551
4
+ data.tar.gz: 830f66bef87e5925b117e32a2e82647736997381a07efe12a8e8151123e7d9cd
5
5
  SHA512:
6
- metadata.gz: 0e3e8635a39e198c69c14bb3d2727eb117a7ec2c681b7c92352328063cc3eecf10c766fa432bf75d23ac919a4153d4083a09dc1cc5a8faaed94724769856feab
7
- data.tar.gz: 2ce3cfea3bf0728d95278ba0e57de0874bd2d141f85c2cd728246e05f1f7cf840c1d79479a36540ff6c1a2eb96e744fa75e32ac7495154ed8e924b54f65f91a8
6
+ metadata.gz: 6b99531029582021e5eff7c47a1483e24ad6ceb86b0865c2abd7b6af0496225b9e0f222c958538f073553e6ce5b4e4fe36d8e9ec10d3d2ab9b7ed8e1b83523f7
7
+ data.tar.gz: 358e04d3c9f16416d451d192ed5ad2a94545ef135250ecb3836ce75d5f551b3295e65b1d44b3a36f9b71ab95386acd466e866e2c27457e61c8ed4b853d311ad5
@@ -129,7 +129,7 @@ class TimeSheet::Time::Cmd
129
129
  o.boolean '-v', '--verbose', 'be more verbose'
130
130
  o.boolean '--debug', 'drop into a REPL on errors'
131
131
  o.separator "\n invoice options:"
132
- o.integer '--package', 'for invoice output: build packages of this duration in hours', default: 0
132
+ o.float '--package', 'for invoice output: build packages of this duration in hours', default: 0.0
133
133
  o.integer '--petty', 'fold records under a certain threshold into a "misc" activity', default: 0
134
134
  end
135
135
  end
@@ -28,7 +28,8 @@ class TimeSheet::Time::Entry
28
28
  def start
29
29
  @start ||= Time.mktime(
30
30
  date.year, date.month, date.day,
31
- @data['start'].hour, @data['start'].min
31
+ hour_for(@data['start']),
32
+ minute_for(@data['start'])
32
33
  )
33
34
  end
34
35
 
@@ -37,10 +38,31 @@ class TimeSheet::Time::Entry
37
38
 
38
39
  @end ||= Time.mktime(
39
40
  date.year, date.month, date.day,
40
- ends_at.hour, ends_at.min
41
+ hour_for(ends_at),
42
+ minute_for(ends_at)
41
43
  )
42
44
  end
43
45
 
46
+ def hour_for(timish)
47
+ case timish
48
+ when Time then timish.hour
49
+ when DateTime then timish.hour
50
+ when Integer then timish / 60 / 60
51
+ else
52
+ binding.pry
53
+ end
54
+ end
55
+
56
+ def minute_for(timish)
57
+ case timish
58
+ when Time then timish.min
59
+ when DateTime then timish.min
60
+ when Integer then timish / 60 % 60
61
+ else
62
+ binding.pry
63
+ end
64
+ end
65
+
44
66
  def employee
45
67
  @employee ||= @data['employee'] || (self.prev ? self.prev.employee : 'Me')
46
68
  end
@@ -121,7 +143,7 @@ class TimeSheet::Time::Entry
121
143
  self.exception = e
122
144
  false
123
145
  rescue StandardError => e
124
- binding.pry if Timesheet.options[:debug]
146
+ binding.pry if TimeSheet.options[:debug]
125
147
  false
126
148
  end
127
149
 
@@ -1,4 +1,4 @@
1
- require 'spreadsheet'
1
+ require 'roo'
2
2
  require 'httpclient'
3
3
  require 'csv'
4
4
 
@@ -12,7 +12,7 @@ class TimeSheet::Time::Parser
12
12
  results = []
13
13
  @dirs.each do |dir|
14
14
  if File.directory?(dir)
15
- results += Dir["#{dir}/**/*.xls"]
15
+ results += Dir["#{dir}/**/*.xlsx"]
16
16
  else
17
17
  results << dir
18
18
  end
@@ -38,7 +38,6 @@ class TimeSheet::Time::Parser
38
38
  results.sort!
39
39
  results.each do |r|
40
40
  unless r.valid?
41
- # byebug
42
41
  raise r.exception, [
43
42
  r.exception.message, ': ',
44
43
  r.data.inspect,
@@ -57,28 +56,25 @@ class TimeSheet::Time::Parser
57
56
  if f.match(/https:\/\/docs\.google\.com/)
58
57
  parse_google_doc(f)
59
58
  else
60
- parse_xls(f)
59
+ parse_xlsx(f)
61
60
  end
62
61
  end
63
62
  end
64
63
  end
65
64
 
66
- def parse_xls(filename)
65
+ def parse_xlsx(filename)
67
66
  results = []
68
67
 
69
- Spreadsheet.open(filename).worksheets.each do |sheet|
70
- headers = sheet.rows.first.to_a
71
- sheet.rows[1..-1].each.with_index do |row, i|
72
- # TODO find a way to guard against xls sheets with 65535 (empty)
73
- # lines, perhaps:
74
- # break if row[1].nil?
75
- next if row.all?{|cell| [nil, ''].include?(cell)}
68
+ xlsx = Roo::Spreadsheet.open(filename)
69
+ xlsx.each_with_pagename do |name, sheet|
70
+ headers = sheet.row(1).to_h{|e| [e, e]}
71
+ rows = sheet.parse(headers)
76
72
 
77
- record = {}
78
- row.each_with_index do |value, i|
79
- record[headers[i]] = value
80
- end
81
- results << record
73
+ rows.each do |row|
74
+ next unless row['start']
75
+ next if row.values.all?{|v| [nil, ''].include?(v)}
76
+
77
+ results << row
82
78
  end
83
79
  end
84
80
 
@@ -1,3 +1,3 @@
1
1
  module TimeSheet
2
- VERSION = "0.14.1"
2
+ VERSION = "1.0.0"
3
3
  end
data/time_sheet.gemspec CHANGED
@@ -9,6 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Moritz Schepp"]
10
10
  spec.email = ["moritz.schepp@gmail.com"]
11
11
  spec.license = 'GPL-3.0-only'
12
+ spec.homepage = 'https://github.com/moritzschepp/time-sheet'
12
13
 
13
14
  spec.summary = "a time tracking solution based on spreadsheets"
14
15
 
@@ -23,12 +24,12 @@ Gem::Specification.new do |spec|
23
24
  spec.bindir = "exe"
24
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
26
  spec.require_paths = ["lib"]
27
+ spec.required_ruby_version = '>= 3.1.0'
26
28
 
27
- spec.add_dependency 'spreadsheet'
29
+ spec.add_dependency 'roo'
28
30
  spec.add_dependency 'slop'
29
31
  spec.add_dependency 'httpclient'
30
32
 
31
- spec.add_development_dependency "bundler", "~> 2.2.16"
32
33
  spec.add_development_dependency "rake", "~> 13.0"
33
34
  spec.add_development_dependency "rspec", "~> 3.0"
34
35
  spec.add_development_dependency 'pry'
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: time-sheet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Moritz Schepp
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-01-04 00:00:00.000000000 Z
11
+ date: 2025-02-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: spreadsheet
14
+ name: roo
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: bundler
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 2.2.16
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 2.2.16
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: rake
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -134,7 +120,7 @@ files:
134
120
  - lib/time_sheet/time/util.rb
135
121
  - lib/time_sheet/version.rb
136
122
  - time_sheet.gemspec
137
- homepage:
123
+ homepage: https://github.com/moritzschepp/time-sheet
138
124
  licenses:
139
125
  - GPL-3.0-only
140
126
  metadata:
@@ -148,14 +134,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
148
134
  requirements:
149
135
  - - ">="
150
136
  - !ruby/object:Gem::Version
151
- version: '0'
137
+ version: 3.1.0
152
138
  required_rubygems_version: !ruby/object:Gem::Requirement
153
139
  requirements:
154
140
  - - ">="
155
141
  - !ruby/object:Gem::Version
156
142
  version: '0'
157
143
  requirements: []
158
- rubygems_version: 3.4.1
144
+ rubygems_version: 3.5.16
159
145
  signing_key:
160
146
  specification_version: 4
161
147
  summary: a time tracking solution based on spreadsheets