time-sheet 0.9.1 → 0.10.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: 1ea92d1c0f3a85e43472835d723ce7489139dec1efec32b6da558139bdcf9403
4
- data.tar.gz: e7c2e958600c472061d767c2334b05ae252ee7ac245955fe586885d687447501
3
+ metadata.gz: 8ee2eec2ca5623ae8ac25ec63d7b1cec543944f39dae960bfb7db38251de2c99
4
+ data.tar.gz: 034a75ad6f3b43444bf719c96c5025dd1228defb1c5f2d1cc78c041d29948f28
5
5
  SHA512:
6
- metadata.gz: 4a5b4644fea3ac676dd841a253694ce1844731b3dcb443a7ab13fd675fe57d5a47d531154b29036f68601efdffb07eee14035c42b194502233814bbc0c3bd183
7
- data.tar.gz: 9682e7ebf7cd265bf29092ae45743e541240c007b13a6a345488a52d94e55b22a4ec1ca91332020f89d195eadf39572dd91119a3d4e240ab5d3ada888d7dcb1c
6
+ metadata.gz: c825f3278431d59904d411eaafd71e42fd827d83931d139aeb36a2c847f02af0edf97e9b55c4eec7bf55367f9c07273d09adfdf89b88938db20ad4a9569e996a
7
+ data.tar.gz: 9a5fb43cc6a19c7ce85b127621d35895c0a2580aee02f34a1862836885bc957e5e41b29bcfcf1cf6dd4824ba616a30b6d9aaa8fdfe4c02088a1f0abe78fc7f03
data/lib/time_sheet.rb CHANGED
@@ -1,5 +1,12 @@
1
1
  require 'time_sheet/version'
2
2
 
3
+ # silence HTTPClient
4
+ module Warning
5
+ def warn(mgs)
6
+ # drop
7
+ end
8
+ end
9
+
3
10
  if defined?(Bundler)
4
11
  begin
5
12
  require 'pry'
@@ -15,4 +22,12 @@ module TimeSheet
15
22
  def self.root
16
23
  @root ||= File.expand_path(File.dirname(__FILE__) + '/..')
17
24
  end
25
+
26
+ def self.options=(options)
27
+ @options = options
28
+ end
29
+
30
+ def self.options
31
+ @options
32
+ end
18
33
  end
@@ -3,6 +3,8 @@ require 'time'
3
3
 
4
4
  class TimeSheet::Time::Cmd
5
5
  def run
6
+ TimeSheet.options = options
7
+
6
8
  if d = options[:from]
7
9
  if d.match(/^\d\d?-\d\d?$/)
8
10
  d = "#{TimeSheet::Time::Util.now.year}-#{d}"
@@ -64,6 +66,10 @@ class TimeSheet::Time::Cmd
64
66
  options[:to] = TimeSheet::Time::Util.month_end(-1)
65
67
  options[:summary] = true
66
68
  report
69
+ when 'year-to-day', 'year'
70
+ options[:from] = TimeSheet::Time::Util.year_start(-1)
71
+ options[:summary] = true
72
+ report
67
73
  when 'overview'
68
74
  overview
69
75
  else
@@ -117,6 +123,7 @@ class TimeSheet::Time::Cmd
117
123
  o.boolean '-s', '--summary', 'when reporting, add summary section'
118
124
  o.boolean '--trim', 'compact the output for processing as CSV', default: false
119
125
  o.boolean '-v', '--verbose', 'be more verbose'
126
+ o.boolean '--debug', 'drop into a REPL on errors'
120
127
  o.separator "\n invoice options:"
121
128
  o.integer '--package', 'for invoice output: build packages of this duration in hours', default: 0
122
129
  o.integer '--petty', 'fold records under a certain threshold into a "misc" activity', default: 0
@@ -105,6 +105,9 @@ class TimeSheet::Time::Entry
105
105
  rescue TimeSheet::Time::Exception => e
106
106
  self.exception = e
107
107
  false
108
+ rescue StandardError => e
109
+ binding.pry if Timesheet.options[:debug]
110
+ false
108
111
  end
109
112
 
110
113
  def valid!
@@ -68,10 +68,11 @@ class TimeSheet::Time::Parser
68
68
 
69
69
  Spreadsheet.open(filename).worksheets.each do |sheet|
70
70
  headers = sheet.rows.first.to_a
71
- sheet.rows[1..-1].each do |row|
71
+ sheet.rows[1..-1].each.with_index do |row, i|
72
72
  # TODO find a way to guard against xls sheets with 65535 (empty)
73
73
  # lines, perhaps:
74
74
  # break if row[1].nil?
75
+ next if row.all?{|cell| [nil, ''].include?(cell)}
75
76
 
76
77
  record = {}
77
78
  row.each_with_index do |value, i|
@@ -84,16 +85,16 @@ class TimeSheet::Time::Parser
84
85
  results
85
86
  end
86
87
 
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"
88
+ def parse_google_doc(url)
89
+ # Chart Tools datasource protocol, see
90
+ # https://developers.google.com/chart/interactive/docs/querylanguage
90
91
  response = HTTPClient.get(url)
91
92
 
92
93
  if response.status == 200
93
- data = CSV.parse(response.body, col_sep: "\t")
94
+ data = CSV.parse(response.body, liberal_parsing: true)
94
95
  headers = data.shift
95
96
  data.map do |row|
96
- record = headers.zip(row).to_h
97
+ record = nullify_empties(headers.zip(row).to_h)
97
98
  parse_date_and_time(record)
98
99
  end
99
100
  else
@@ -108,9 +109,16 @@ class TimeSheet::Time::Parser
108
109
  'end' => (record['end'] ? DateTime.parse(record['end']) : nil)
109
110
  )
110
111
  rescue ArgumentError => e
112
+ binding.pry if TimeSheet.options[:debug]
111
113
  puts "current record: #{record.inspect}"
112
114
  return {}
113
115
  # raise e
114
116
  end
115
117
 
118
+ def nullify_empties(record)
119
+ record.transform_values do |v|
120
+ v == '' ? nil : v
121
+ end
122
+ end
123
+
116
124
  end
@@ -1,3 +1,3 @@
1
1
  module TimeSheet
2
- VERSION = "0.9.1"
2
+ VERSION = "0.10.0"
3
3
  end
data/time_sheet.gemspec CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.add_dependency 'slop'
29
29
  spec.add_dependency 'httpclient'
30
30
 
31
- spec.add_development_dependency "bundler", "~> 1.15"
31
+ spec.add_development_dependency "bundler", "~> 2.2.16"
32
32
  spec.add_development_dependency "rake", "~> 13.0"
33
33
  spec.add_development_dependency "rspec", "~> 3.0"
34
34
  spec.add_development_dependency 'pry'
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.9.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Moritz Schepp
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-25 00:00:00.000000000 Z
11
+ date: 2021-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spreadsheet
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.15'
61
+ version: 2.2.16
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.15'
68
+ version: 2.2.16
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -108,7 +108,7 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
- description:
111
+ description:
112
112
  email:
113
113
  - moritz.schepp@gmail.com
114
114
  executables:
@@ -134,13 +134,13 @@ files:
134
134
  - lib/time_sheet/time/util.rb
135
135
  - lib/time_sheet/version.rb
136
136
  - time_sheet.gemspec
137
- homepage:
137
+ homepage:
138
138
  licenses:
139
139
  - GPL-3.0-only
140
140
  metadata:
141
141
  bug_tracker_uri: https://github.com/moritzschepp/time-sheet/issues
142
142
  documentation_uri: https://github.com/moritzschepp/time-sheet
143
- post_install_message:
143
+ post_install_message:
144
144
  rdoc_options: []
145
145
  require_paths:
146
146
  - lib
@@ -155,9 +155,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
155
155
  - !ruby/object:Gem::Version
156
156
  version: '0'
157
157
  requirements: []
158
- rubyforge_project:
159
- rubygems_version: 2.7.6.2
160
- signing_key:
158
+ rubygems_version: 3.1.6
159
+ signing_key:
161
160
  specification_version: 4
162
161
  summary: a time tracking solution based on spreadsheets
163
162
  test_files: []