time-sheet 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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