time-sheet 0.7.0 → 0.8.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: 790973ca70322810e9000108c07cc90d32fe466c1e34eb5afeb0120afb438296
4
- data.tar.gz: 1ee803b2a25bd8d30c43987bf332fbfa398043ac6a8485d8e3733eb9a46b4dc8
3
+ metadata.gz: 3c7858f7734163ab5688073e5ea9fe214a0994bfbf9644dd6a6b8e6d872bdf1c
4
+ data.tar.gz: 4dc69782f6f4ec97664b5f2cabc941ebc34396a859612c00ccab75e20c314c8e
5
5
  SHA512:
6
- metadata.gz: f9eaa5dd328e9e952d394cadd895a8151f567a4ee28a7885f53287ec8b2beae8203c97f315fdc45da5d066bc81283ff2b691324c4f02f7fd8b872b296aa75d40
7
- data.tar.gz: 50da6fcc3e30a29269aa52347eba0cc320dc3efe1140222aca130179f77f99e85df2293c56eb60ba93305a35297486e9036fa5581e7bcd675801b26a24f06759
6
+ metadata.gz: e44ab0c69ce3c6131259571e8692b54304404a10e1bcc1be20a52b42ec36e08ec239d87ead3429e02c47c2f7a977e0447dc244df74d439401b0475441282f4b3
7
+ data.tar.gz: 78c49a26b85cce835ef3f8f96b944a2932ea683f7762320981ec8ce60ffcbf9f085fa77edd311a6eb0f1b012cdd3f7eb2ae4543305ec2d60c3fdeeb6552ccf64
@@ -104,7 +104,7 @@ class TimeSheet::Time::Cmd
104
104
 
105
105
  o.boolean '-h', '--help', 'show help'
106
106
  o.boolean '--version', 'show the version'
107
- o.array('-l', '--location', 'a location to gather data from (file or directory)',
107
+ o.array('-l', '--location', 'a location to gather data from (file, directory or google docs share-url)',
108
108
  default: default_location
109
109
  )
110
110
  o.string '-f', '--from', 'ignore entries older than the date given'
@@ -1,4 +1,6 @@
1
1
  require 'spreadsheet'
2
+ require 'httpclient'
3
+ require 'csv'
2
4
 
3
5
  class TimeSheet::Time::Parser
4
6
 
@@ -52,24 +54,63 @@ class TimeSheet::Time::Parser
52
54
  def hashes_per_file
53
55
  @hashes_per_file ||= begin
54
56
  files.map do |f|
55
- results = []
56
- Spreadsheet.open(f).worksheets.each do |sheet|
57
- headers = sheet.rows.first.to_a
58
- sheet.rows[1..-1].each do |row|
59
- # TODO find a way to guard against xls sheets with 65535 (empty)
60
- # lines, perhaps:
61
- # break if row[1].nil?
57
+ if f.match(/https:\/\/docs\.google\.com/)
58
+ parse_google_doc(f)
59
+ else
60
+ parse_xls(f)
61
+ end
62
+ end
63
+ end
64
+ end
62
65
 
63
- record = {}
64
- row.each_with_index do |value, i|
65
- record[headers[i]] = value
66
- end
67
- results << record
68
- end
66
+ def parse_xls(filename)
67
+ results = []
68
+
69
+ Spreadsheet.open(filename).worksheets.each do |sheet|
70
+ headers = sheet.rows.first.to_a
71
+ sheet.rows[1..-1].each do |row|
72
+ # TODO find a way to guard against xls sheets with 65535 (empty)
73
+ # lines, perhaps:
74
+ # break if row[1].nil?
75
+
76
+ record = {}
77
+ row.each_with_index do |value, i|
78
+ record[headers[i]] = value
69
79
  end
70
- results
80
+ results << record
71
81
  end
72
82
  end
83
+
84
+ results
85
+ end
86
+
87
+ def parse_google_doc(share_url)
88
+ id = share_url.match(/\/d\/([^\/]+)\//)[1]
89
+ url = "https://docs.google.com/spreadsheets/d/#{id}/export?exportFormat=tsv"
90
+ response = HTTPClient.get(url)
91
+
92
+ if response.status == 200
93
+ data = CSV.parse(response.body, col_sep: "\t")
94
+ headers = data.shift
95
+ data.map do |row|
96
+ record = headers.zip(row).to_h
97
+ parse_date_and_time(record)
98
+ end
99
+ else
100
+ raise "request to google docs failed (#{response.status}):\n#{response.body}"
101
+ end
102
+ end
103
+
104
+ def parse_date_and_time(record)
105
+ record.merge(
106
+ 'date' => (record['date'] ? Date.parse(record['date']) : nil),
107
+ 'start' => (record['start'] ? DateTime.parse(record['start']) : nil),
108
+ 'end' => (record['end'] ? DateTime.parse(record['end']) : nil)
109
+ )
110
+ rescue ArgumentError => e
111
+ puts "current record: #{record.inspect}"
112
+ return {}
113
+ # raise e
73
114
  end
74
115
 
75
116
  end
@@ -1,3 +1,3 @@
1
1
  module TimeSheet
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.0"
3
3
  end
data/time_sheet.gemspec CHANGED
@@ -26,6 +26,7 @@ Gem::Specification.new do |spec|
26
26
 
27
27
  spec.add_dependency 'spreadsheet'
28
28
  spec.add_dependency 'slop'
29
+ spec.add_dependency 'httpclient'
29
30
 
30
31
  spec.add_development_dependency "bundler", "~> 1.15"
31
32
  spec.add_development_dependency "rake", "~> 10.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: time-sheet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.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: 2019-07-13 00:00:00.000000000 Z
11
+ date: 2019-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spreadsheet
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: httpclient
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -142,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
156
  version: '0'
143
157
  requirements: []
144
158
  rubyforge_project:
145
- rubygems_version: 2.7.6
159
+ rubygems_version: 2.7.6.2
146
160
  signing_key:
147
161
  specification_version: 4
148
162
  summary: a time tracking solution based on spreadsheets