reading 0.6.0 → 0.6.1
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/bin/reading +3 -3
- data/lib/reading/attribute/all_attributes.rb +2 -2
- data/lib/reading/config.rb +5 -4
- data/lib/reading/csv.rb +20 -11
- data/lib/reading/errors.rb +3 -0
- data/lib/reading/row/compact_planned_row.rb +1 -1
- data/lib/reading/row/regular_row.rb +12 -7
- data/lib/reading/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4145847e60a6045a1381afe207be44d30636ca7b058d4c1c1e0db70009af0b4
|
4
|
+
data.tar.gz: 833b042be4b575e4ed166d0269610504c031d03460a0f75c4dedc214b1eaf152
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09f08e0be8d6cd97481097d4193209af3cda404e076f2d5529c7c4bdee5f146afbf980a2cb05f2435c06633b89954067ee8bea9d02dae4eddd924f86626a9f63'
|
7
|
+
data.tar.gz: 3a50b075c63f2a8b0082b309bef201a8351344c729e90b18482b5796a53bedee1af7fad71af3a0dd884d1245440cfd14dbf6d28aa38bdf5d09717059bd22e7f8
|
data/bin/reading
CHANGED
@@ -7,8 +7,8 @@
|
|
7
7
|
# reading "<CSV string>" "<optional comma-separated names of enabled columns>`
|
8
8
|
#
|
9
9
|
# Examples:
|
10
|
-
# reading '3|📕Trying|
|
11
|
-
# reading '📕Trying|
|
10
|
+
# reading '3|📕Trying|Little Library 1970147288'
|
11
|
+
# reading '📕Trying|Little Library 1970147288' 'head, sources'
|
12
12
|
|
13
13
|
|
14
14
|
require_relative "../lib/reading/csv"
|
@@ -16,7 +16,7 @@ require "amazing_print"
|
|
16
16
|
|
17
17
|
input = ARGV[0]
|
18
18
|
unless input
|
19
|
-
raise ArgumentError, "CSV string argument required, such as '3|📕Trying|
|
19
|
+
raise ArgumentError, "CSV string argument required, such as '3|📕Trying|Little Library 1970147288'"
|
20
20
|
end
|
21
21
|
|
22
22
|
config = {}
|
@@ -63,9 +63,9 @@ module Reading
|
|
63
63
|
|
64
64
|
class NotesAttribute < Attribute
|
65
65
|
def parse
|
66
|
-
return nil unless columns[:
|
66
|
+
return nil unless columns[:notes]
|
67
67
|
|
68
|
-
columns[:
|
68
|
+
columns[:notes]
|
69
69
|
.presence
|
70
70
|
&.chomp
|
71
71
|
&.remove(/#{config.deep_fetch(:csv, :long_separator).rstrip}\s*\z/)
|
data/lib/reading/config.rb
CHANGED
@@ -133,9 +133,7 @@ module Reading
|
|
133
133
|
dates_finished
|
134
134
|
genres
|
135
135
|
length
|
136
|
-
|
137
|
-
blurb
|
138
|
-
private_notes
|
136
|
+
notes
|
139
137
|
history
|
140
138
|
],
|
141
139
|
# Custom columns are listed in a hash with default values, like simple columns in item[:template] above.
|
@@ -146,6 +144,8 @@ module Reading
|
|
146
144
|
separator: ",",
|
147
145
|
short_separator: " - ",
|
148
146
|
long_separator: " -- ",
|
147
|
+
date_separator: "/",
|
148
|
+
date_range_separator: "..",
|
149
149
|
dnf_string: "DNF",
|
150
150
|
series_prefix: "in",
|
151
151
|
group_emoji: "🤝🏼",
|
@@ -172,6 +172,7 @@ module Reading
|
|
172
172
|
time_length = /(?<time>\d+:\d\d)/
|
173
173
|
pages_length = /p?(?<pages>\d+)p?/
|
174
174
|
url = /https?:\/\/[^\s#{@hash.deep_fetch(:csv, :separator)}]+/
|
175
|
+
date_sep = @hash.deep_fetch(:csv, :date_separator)
|
175
176
|
|
176
177
|
isbn_lookbehind = "(?<=\\A|\\s|#{@hash.deep_fetch(:csv, :separator)})"
|
177
178
|
isbn_lookahead = "(?=\\z|\\s|#{@hash.deep_fetch(:csv, :separator)})"
|
@@ -191,7 +192,7 @@ module Reading
|
|
191
192
|
progress: /(?<=#{dnf_string}|\A)\s*(?:(?<percent>\d?\d)%|#{time_length}|#{pages_length})\s+/,
|
192
193
|
group_experience: /#{@hash.deep_fetch(:csv, :group_emoji)}\s*(.*)\s*\z/,
|
193
194
|
variant_index: /\s+v(\d+)/,
|
194
|
-
date: /\d{4}
|
195
|
+
date: /\d{4}#{date_sep}\d?\d#{date_sep}\d?\d/,
|
195
196
|
time_length: /\A#{time_length}(?<each>\s+each)?\z/,
|
196
197
|
time_length_in_variant: time_length,
|
197
198
|
pages_length: /\A#{pages_length}(?<each>\s+each)?\z/,
|
data/lib/reading/csv.rb
CHANGED
@@ -26,17 +26,7 @@ module Reading
|
|
26
26
|
# @param config [Hash] a custom config which overrides the defaults,
|
27
27
|
# e.g. { errors: { styling: :html } }
|
28
28
|
def initialize(feed = nil, path: nil, config: {})
|
29
|
-
|
30
|
-
raise ArgumentError, "No file given to load."
|
31
|
-
end
|
32
|
-
|
33
|
-
if path
|
34
|
-
if !File.exist?(path)
|
35
|
-
raise FileError, "File not found! #{@path}"
|
36
|
-
elsif File.directory?(path)
|
37
|
-
raise FileError, "The reading log must be a file, but the path given is a directory: #{@path}"
|
38
|
-
end
|
39
|
-
end
|
29
|
+
validate_feed_or_path(feed, path)
|
40
30
|
|
41
31
|
@feed = feed
|
42
32
|
@path = path
|
@@ -63,5 +53,24 @@ module Reading
|
|
63
53
|
ensure
|
64
54
|
feed&.close if feed.respond_to?(:close)
|
65
55
|
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
# Checks on the given feed and path (arguments to #initialize).
|
60
|
+
# @raise [FileError] if the given path is invalid.
|
61
|
+
# @raise [ArgumentError] if both feed and path are nil.
|
62
|
+
def validate_feed_or_path(feed, path)
|
63
|
+
return true if feed
|
64
|
+
|
65
|
+
if path
|
66
|
+
if !File.exist?(path)
|
67
|
+
raise FileError, "File not found! #{path}"
|
68
|
+
elsif File.directory?(path)
|
69
|
+
raise FileError, "The reading log must be a file, but the path given is a directory: #{path}"
|
70
|
+
end
|
71
|
+
else
|
72
|
+
raise ArgumentError, "Either a feed (String, File, etc.) or a file path must be provided."
|
73
|
+
end
|
74
|
+
end
|
66
75
|
end
|
67
76
|
end
|
data/lib/reading/errors.rb
CHANGED
@@ -60,6 +60,9 @@ module Reading
|
|
60
60
|
|
61
61
|
# VALIDATION # # # # # # # # # # # # # # # # # # # # # # #
|
62
62
|
|
63
|
+
# Means there are too many columns in a row.
|
64
|
+
class TooManyColumnsError < Reading::Error; end
|
65
|
+
|
63
66
|
# Means a date is unparsable, or a set of dates does not make logical sense.
|
64
67
|
class InvalidDateError < Reading::Error; end
|
65
68
|
|
@@ -57,7 +57,7 @@ module Reading
|
|
57
57
|
|
58
58
|
if item_match[:sources_column]
|
59
59
|
if item_match[:sources_column].include?(config.deep_fetch(:csv, :column_separator))
|
60
|
-
raise
|
60
|
+
raise TooManyColumnsError, "Too many columns (only Sources allowed) " \
|
61
61
|
"after #{item_head} in compact planned row"
|
62
62
|
end
|
63
63
|
|
@@ -62,13 +62,18 @@ module Reading
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def set_columns
|
65
|
-
|
66
|
-
config.deep_fetch(:csv, :
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
65
|
+
column_names = config.deep_fetch(:csv, :enabled_columns) +
|
66
|
+
config.deep_fetch(:csv, :custom_numeric_columns).keys +
|
67
|
+
config.deep_fetch(:csv, :custom_text_columns).keys
|
68
|
+
|
69
|
+
columns_count = string.count(config.deep_fetch(:csv, :column_separator))
|
70
|
+
if columns_count >= column_names.count
|
71
|
+
raise TooManyColumnsError, "Too many columns"
|
72
|
+
end
|
73
|
+
|
74
|
+
column_contents = string.split(config.deep_fetch(:csv, :column_separator))
|
75
|
+
|
76
|
+
@columns = column_names.zip(column_contents).to_h
|
72
77
|
end
|
73
78
|
|
74
79
|
def ensure_head_column_present
|
data/lib/reading/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reading
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felipe Vogel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pastel
|