reading 0.8.0 → 0.9.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/bin/reading +80 -10
- data/lib/reading/config.rb +27 -5
- data/lib/reading/errors.rb +4 -1
- data/lib/reading/item/time_length.rb +60 -23
- data/lib/reading/item/view.rb +14 -19
- data/lib/reading/item.rb +321 -54
- data/lib/reading/parsing/attributes/attribute.rb +0 -7
- data/lib/reading/parsing/attributes/experiences/dates_and_head_transformer.rb +10 -11
- data/lib/reading/parsing/attributes/experiences/history_transformer.rb +27 -18
- data/lib/reading/parsing/attributes/experiences/spans_validator.rb +18 -19
- data/lib/reading/parsing/attributes/experiences.rb +5 -5
- data/lib/reading/parsing/attributes/shared.rb +13 -6
- data/lib/reading/parsing/attributes/variants.rb +9 -6
- data/lib/reading/parsing/csv.rb +38 -35
- data/lib/reading/parsing/parser.rb +23 -24
- data/lib/reading/parsing/rows/blank.rb +23 -0
- data/lib/reading/parsing/rows/comment.rb +6 -7
- data/lib/reading/parsing/rows/compact_planned.rb +9 -9
- data/lib/reading/parsing/rows/compact_planned_columns/head.rb +2 -2
- data/lib/reading/parsing/rows/custom_config.rb +42 -0
- data/lib/reading/parsing/rows/regular.rb +15 -14
- data/lib/reading/parsing/rows/regular_columns/length.rb +8 -8
- data/lib/reading/parsing/rows/regular_columns/sources.rb +15 -9
- data/lib/reading/parsing/transformer.rb +13 -17
- data/lib/reading/stats/filter.rb +738 -0
- data/lib/reading/stats/grouping.rb +243 -0
- data/lib/reading/stats/operation.rb +313 -0
- data/lib/reading/stats/query.rb +37 -0
- data/lib/reading/stats/terminal_result_formatters.rb +91 -0
- data/lib/reading/util/exclude.rb +12 -0
- data/lib/reading/util/hash_to_data.rb +2 -2
- data/lib/reading/version.rb +1 -1
- data/lib/reading.rb +36 -21
- metadata +10 -6
- data/bin/readingfile +0 -31
- data/lib/reading/util/string_remove.rb +0 -28
- data/lib/reading/util/string_truncate.rb +0 -22
@@ -15,16 +15,16 @@ module Reading
|
|
15
15
|
)
|
16
16
|
(\s+|\z)
|
17
17
|
)
|
18
|
-
# each
|
18
|
+
# each and repetitions are used in conjunction with the History column
|
19
|
+
# each
|
19
20
|
(
|
20
|
-
# each
|
21
21
|
(?<each>each)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
)
|
22
|
+
(\s+|\z)
|
23
|
+
)?
|
24
|
+
# repetitions
|
25
|
+
(
|
26
|
+
x
|
27
|
+
(?<repetitions>\d+)
|
28
28
|
)?
|
29
29
|
\z}x]
|
30
30
|
end
|
@@ -6,17 +6,12 @@ module Reading
|
|
6
6
|
# and https://github.com/fpsvogel/reading/blob/main/doc/csv-format.md#sources-column-variants
|
7
7
|
class Sources < Column
|
8
8
|
SOURCES_PARSING_ERRORS = {
|
9
|
-
"
|
10
|
-
->(source) {
|
11
|
-
source.match?(/\shttps?:\/\//) || source.scan(/https?:\/\//).count > 1
|
12
|
-
},
|
13
|
-
"The ISBN/ASIN must be placed after sources in the Sources column" =>
|
9
|
+
"The ISBN/ASIN must be placed last in the Sources column" =>
|
14
10
|
->(source) {
|
15
11
|
source.match?(/\A#{ISBN_REGEX}/o) || source.match(/\A#{ASIN_REGEX}/o)
|
16
12
|
},
|
17
13
|
}
|
18
14
|
|
19
|
-
|
20
15
|
def self.split_by_format?
|
21
16
|
true
|
22
17
|
end
|
@@ -32,7 +27,18 @@ module Reading
|
|
32
27
|
def self.tweaks
|
33
28
|
{
|
34
29
|
sources: -> {
|
35
|
-
|
30
|
+
comma = /\s*,\s*/
|
31
|
+
space_before_url = / (?=https?:\/\/)/
|
32
|
+
sources = _1.split(Regexp.union(comma, space_before_url))
|
33
|
+
|
34
|
+
# Split by space after URL.
|
35
|
+
sources = sources.flat_map { |src|
|
36
|
+
if src.match?(/\Ahttps?:\/\//)
|
37
|
+
src.split(" ", 2)
|
38
|
+
else
|
39
|
+
src
|
40
|
+
end
|
41
|
+
}
|
36
42
|
|
37
43
|
SOURCES_PARSING_ERRORS.each do |message, check|
|
38
44
|
if sources.any? { |source| check.call(source) }
|
@@ -58,7 +64,7 @@ module Reading
|
|
58
64
|
|
|
59
65
|
(?<length_time>\d+:\d\d)
|
60
66
|
)?
|
61
|
-
\z}x if
|
67
|
+
\z}x if segment_index.zero?),
|
62
68
|
# sources, ISBN/ASIN, length
|
63
69
|
(%r{\A
|
64
70
|
(
|
@@ -78,7 +84,7 @@ module Reading
|
|
78
84
|
|
|
79
85
|
(?<length_time>\d+:\d\d)
|
80
86
|
)?
|
81
|
-
\z}xo if
|
87
|
+
\z}xo if segment_index.zero?),
|
82
88
|
*Column::SHARED_REGEXES[:series_and_extra_info],
|
83
89
|
].compact
|
84
90
|
end
|
@@ -1,12 +1,12 @@
|
|
1
|
-
require_relative
|
2
|
-
require_relative
|
3
|
-
require_relative
|
4
|
-
require_relative
|
5
|
-
require_relative
|
6
|
-
require_relative
|
7
|
-
require_relative
|
8
|
-
require_relative
|
9
|
-
require_relative
|
1
|
+
require_relative 'attributes/shared'
|
2
|
+
require_relative 'attributes/attribute'
|
3
|
+
require_relative 'attributes/rating'
|
4
|
+
require_relative 'attributes/author'
|
5
|
+
require_relative 'attributes/title'
|
6
|
+
require_relative 'attributes/genres'
|
7
|
+
require_relative 'attributes/variants'
|
8
|
+
require_relative 'attributes/experiences'
|
9
|
+
require_relative 'attributes/notes'
|
10
10
|
|
11
11
|
module Reading
|
12
12
|
module Parsing
|
@@ -20,13 +20,9 @@ module Reading
|
|
20
20
|
using Util::HashArrayDeepFetch
|
21
21
|
using Util::HashCompactByTemplate
|
22
22
|
|
23
|
-
attr_reader :config
|
24
23
|
private attr_reader :attributes
|
25
24
|
|
26
|
-
|
27
|
-
def initialize(config)
|
28
|
-
@config = config
|
29
|
-
|
25
|
+
def initialize
|
30
26
|
set_attributes
|
31
27
|
end
|
32
28
|
|
@@ -40,7 +36,7 @@ module Reading
|
|
40
36
|
raise InvalidHeadError, "Blank or missing Head column"
|
41
37
|
end
|
42
38
|
|
43
|
-
template =
|
39
|
+
template = Config.hash.deep_fetch(:item, :template)
|
44
40
|
|
45
41
|
parsed_row[:head].map.with_index { |_head, head_index|
|
46
42
|
template.map { |attribute_name, default_value|
|
@@ -58,11 +54,11 @@ module Reading
|
|
58
54
|
# Sets the attributes classes which do all the transforming work.
|
59
55
|
# See parsing/attributes/*.
|
60
56
|
def set_attributes
|
61
|
-
@attributes ||=
|
57
|
+
@attributes ||= Config.hash.deep_fetch(:item, :template).map { |attribute_name, _default|
|
62
58
|
attribute_name_camelcase = attribute_name.to_s.split("_").map(&:capitalize).join
|
63
59
|
attribute_class = Attributes.const_get(attribute_name_camelcase)
|
64
60
|
|
65
|
-
[attribute_name, attribute_class.new
|
61
|
+
[attribute_name, attribute_class.new]
|
66
62
|
}.to_h
|
67
63
|
end
|
68
64
|
end
|