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 +4 -4
- data/lib/time_sheet/time/cmd.rb +1 -1
- data/lib/time_sheet/time/parser.rb +55 -14
- data/lib/time_sheet/version.rb +1 -1
- data/time_sheet.gemspec +1 -0
- metadata +17 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3c7858f7734163ab5688073e5ea9fe214a0994bfbf9644dd6a6b8e6d872bdf1c
|
|
4
|
+
data.tar.gz: 4dc69782f6f4ec97664b5f2cabc941ebc34396a859612c00ccab75e20c314c8e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e44ab0c69ce3c6131259571e8692b54304404a10e1bcc1be20a52b42ec36e08ec239d87ead3429e02c47c2f7a977e0447dc244df74d439401b0475441282f4b3
|
|
7
|
+
data.tar.gz: 78c49a26b85cce835ef3f8f96b944a2932ea683f7762320981ec8ce60ffcbf9f085fa77edd311a6eb0f1b012cdd3f7eb2ae4543305ec2d60c3fdeeb6552ccf64
|
data/lib/time_sheet/time/cmd.rb
CHANGED
|
@@ -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
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
data/lib/time_sheet/version.rb
CHANGED
data/time_sheet.gemspec
CHANGED
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.
|
|
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-
|
|
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
|