klipbook 2.1.3 → 3.0.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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -0
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +1 -1
  5. data/CHANGELOG.txt +11 -0
  6. data/Gemfile +2 -15
  7. data/Gemfile.lock +73 -113
  8. data/LICENSE.txt +18 -17
  9. data/README.md +63 -69
  10. data/Rakefile +3 -30
  11. data/bin/klipbook +3 -221
  12. data/klipbook.gemspec +32 -118
  13. data/lib/klipbook/cli.rb +69 -0
  14. data/lib/klipbook/commands/command.rb +39 -0
  15. data/lib/klipbook/commands/export.rb +50 -0
  16. data/lib/klipbook/commands/exporters/exporter.rb +49 -0
  17. data/lib/klipbook/{tohtml → commands/exporters}/html_book_summary.erb +1 -1
  18. data/lib/klipbook/commands/exporters/html_exporter.rb +25 -0
  19. data/lib/klipbook/commands/exporters/json_exporter.rb +17 -0
  20. data/lib/klipbook/commands/exporters/markdown_book_summary.erb +12 -0
  21. data/lib/klipbook/commands/exporters/markdown_exporter.rb +19 -0
  22. data/lib/klipbook/commands/list.rb +17 -0
  23. data/lib/klipbook/config.rb +18 -10
  24. data/lib/klipbook/logger.rb +15 -0
  25. data/lib/klipbook/sources/amazon_site/book_scraper.rb +0 -2
  26. data/lib/klipbook/sources/book.rb +36 -21
  27. data/lib/klipbook/sources/clipping.rb +10 -8
  28. data/lib/klipbook/sources/kindle_device/entry.rb +8 -6
  29. data/lib/klipbook/sources/kindle_device/entry_parser.rb +66 -64
  30. data/lib/klipbook/sources/kindle_device/file.rb +45 -43
  31. data/lib/klipbook/sources/kindle_device/file_parser.rb +23 -21
  32. data/lib/klipbook/sources/source.rb +30 -0
  33. data/lib/klipbook/version.rb +1 -1
  34. data/lib/klipbook.rb +11 -11
  35. metadata +56 -113
  36. data/.document +0 -5
  37. data/.yardopts +0 -1
  38. data/Guardfile +0 -19
  39. data/features/fixtures/clippings-for-three-books.txt +0 -105
  40. data/features/list.feature +0 -31
  41. data/features/step_definitions/list_steps.rb +0 -15
  42. data/features/step_definitions/tohtml_steps.rb +0 -61
  43. data/features/step_definitions/tojson_steps.rb +0 -17
  44. data/features/support/env.rb +0 -16
  45. data/features/tohtml.feature +0 -51
  46. data/features/tojson.feature +0 -11
  47. data/lib/klipbook/colours.rb +0 -16
  48. data/lib/klipbook/commands/list_books.rb +0 -19
  49. data/lib/klipbook/commands/tohtml.rb +0 -17
  50. data/lib/klipbook/commands/tojson.rb +0 -18
  51. data/lib/klipbook/sources/invalid_source_error.rb +0 -12
  52. data/lib/klipbook/tohtml/html_printer.rb +0 -39
  53. data/lib/klipbook/tojson/book_file.rb +0 -58
  54. data/spec/lib/klipbook/commands/list_books_spec.rb +0 -43
  55. data/spec/lib/klipbook/commands/tohtml_spec.rb +0 -36
  56. data/spec/lib/klipbook/sources/book_spec.rb +0 -33
  57. data/spec/lib/klipbook/sources/kindle_device/entry_parser_spec.rb +0 -339
  58. data/spec/lib/klipbook/sources/kindle_device/file_parser_spec.rb +0 -68
  59. data/spec/lib/klipbook/sources/kindle_device/file_spec.rb +0 -163
  60. data/spec/lib/klipbook/tohtml/html_printer_spec.rb +0 -88
  61. data/spec/lib/klipbook/tojson/book_file_spec.rb +0 -76
  62. data/spec/spec_helper.rb +0 -7
@@ -1,163 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe Klipbook::Sources::KindleDevice::File do
4
-
5
- let(:file) { Klipbook::Sources::KindleDevice::File.new(input_file, max_books, file_parser) }
6
-
7
- let(:max_books) { 30 }
8
-
9
- let(:entries) { [] }
10
-
11
- let(:file_parser) { double(extract_entries: entries) }
12
-
13
- let(:input_file) { double(read: 'file text') }
14
-
15
- describe '#books' do
16
- subject { file.books }
17
-
18
- it 'parses the file text with the file parser' do
19
- subject
20
- expect(file_parser).to have_received(:extract_entries).with('file text')
21
- end
22
-
23
- context 'with entries for three books' do
24
- let(:entries) do
25
- [
26
- Klipbook::Sources::KindleDevice::Entry.new do |e|
27
- e.title = 'Book one'
28
- e.author = 'Author one'
29
- e.type = :highlight
30
- e.added_on = DateTime.new(2012, 10, 10)
31
- end,
32
- Klipbook::Sources::KindleDevice::Entry.new do |e|
33
- e.title = 'Book one'
34
- e.author = 'Author one'
35
- e.type = :highlight
36
- e.added_on = DateTime.new(2012, 10, 10)
37
- end,
38
- Klipbook::Sources::KindleDevice::Entry.new do |e|
39
- e.title = 'Book two'
40
- e.author = 'Author two'
41
- e.type = :highlight
42
- e.added_on = DateTime.new(2012, 10, 12)
43
- end,
44
- Klipbook::Sources::KindleDevice::Entry.new do |e|
45
- e.title = 'Book three'
46
- e.author = 'Author two'
47
- e.type = :highlight
48
- e.added_on = DateTime.new(2012, 10, 11)
49
- end
50
- ]
51
- end
52
-
53
- it 'returns three books' do
54
- expect(subject.size).to eq 3
55
- end
56
-
57
- it 'returns books sorted by last_update descending' do
58
- expect(subject.map(&:title)).to eq [ 'Book two', 'Book three', 'Book one' ]
59
- end
60
-
61
- context 'and max_books set to 2' do
62
-
63
- let (:max_books) { 2 }
64
-
65
- it 'returns two books' do
66
- expect(subject.size).to eq 2
67
- end
68
- end
69
- end
70
-
71
- context 'with entries for a single book' do
72
- let(:entries) do
73
- [
74
- Klipbook::Sources::KindleDevice::Entry.new do |e|
75
- e.title = 'Book one'
76
- e.author = 'Author one'
77
- e.type = :bookmark
78
- e.location = 1
79
- e.page = 1
80
- e.added_on = DateTime.new(2012, 10, 10)
81
- e.text = 'First one'
82
- end,
83
- Klipbook::Sources::KindleDevice::Entry.new do |e|
84
- e.title = 'Book one'
85
- e.author = 'Author one'
86
- e.type = :highlight
87
- e.location = 10
88
- e.page = 3
89
- e.added_on = DateTime.new(2012, 10, 11)
90
- e.text = 'Second one'
91
- end,
92
- Klipbook::Sources::KindleDevice::Entry.new do |e|
93
- e.title = 'Book one'
94
- e.author = 'Author one'
95
- e.type = :highlight
96
- e.location = 3
97
- e.page = 2
98
- e.added_on = DateTime.new(2012, 10, 1)
99
- e.text = 'Third one'
100
- end,
101
- Klipbook::Sources::KindleDevice::Entry.new do |e|
102
- e.title = 'Book one'
103
- e.author = 'Author one'
104
- e.type = :note
105
- e.location = 2
106
- e.page = 1
107
- e.added_on = DateTime.new(2012, 10, 21)
108
- e.text = 'Fourth one'
109
- end
110
- ]
111
- end
112
-
113
- it 'returns a single book with the correct title and author information' do
114
- expect(subject.first.title).to eq 'Book one'
115
- expect(subject.first.author).to eq 'Author one'
116
- end
117
-
118
- it "returns a single book with last update equal to the latest added on date of the book's entries" do
119
- expect(subject.first.last_update).to eq DateTime.new(2012, 10, 21)
120
- end
121
-
122
- it "ignores bookmarks when building the book's clipping list" do
123
- expect(subject.first.clippings.size).to eq 3
124
- expect(subject.first.clippings.map(&:type)).not_to include(:bookmark)
125
- end
126
-
127
- it 'returns a single book whose clippings are sorted by location' do
128
- expect(subject.first.clippings.map(&:location)).to eq [2, 3, 10]
129
- expect(subject.first.clippings.map(&:text)).to eq ['Fourth one', 'Third one', 'Second one']
130
- expect(subject.first.clippings.map(&:page)).to eq [1, 2, 3]
131
- end
132
- end
133
-
134
- context 'with entries for a single book that are all bookmarks' do
135
- let(:entries) do
136
- [
137
- Klipbook::Sources::KindleDevice::Entry.new do |e|
138
- e.title = 'Book one'
139
- e.author = 'Author one'
140
- e.type = :bookmark
141
- e.location = 1
142
- e.page = 1
143
- e.added_on = DateTime.new(2012, 10, 10)
144
- e.text = 'First one'
145
- end,
146
- Klipbook::Sources::KindleDevice::Entry.new do |e|
147
- e.title = 'Book one'
148
- e.author = 'Author one'
149
- e.type = :bookmark
150
- e.location = 10
151
- e.page = 3
152
- e.added_on = DateTime.new(2012, 10, 11)
153
- e.text = 'Second one'
154
- end
155
- ]
156
- end
157
-
158
- it 'should be empty' do
159
- expect(subject).to be_empty
160
- end
161
- end
162
- end
163
- end
@@ -1,88 +0,0 @@
1
- require 'spec_helper'
2
-
3
- # This is more of an integration test but what the heck
4
- # it can live in here for now
5
-
6
- describe Klipbook::ToHtml::HtmlPrinter do
7
-
8
- before(:all) do
9
- @output_dir = Dir.mktmpdir
10
- end
11
-
12
- after(:all) do
13
- FileUtils.rm_f(@output_dir)
14
- end
15
-
16
- let(:book) do
17
- Klipbook::Book.new.tap do |b|
18
- b.title = 'Fake book title'
19
- b.author = 'Fake Author'
20
- b.clippings = []
21
- end
22
- end
23
-
24
- let(:message_stream) do
25
- double(puts: nil)
26
- end
27
-
28
- describe '#print_to_file' do
29
-
30
- subject { Klipbook::ToHtml::HtmlPrinter.new(message_stream).print_to_file(book, @output_dir, force) }
31
-
32
- let(:force) { false }
33
-
34
- let(:expected_filename) { "Fake book title by Fake Author.html" }
35
- let(:expected_filepath) { "#{@output_dir}/Fake book title by Fake Author.html" }
36
-
37
- context 'with no existing summary file' do
38
- before(:each) do
39
- FileUtils.rm_f(File.join(@output_dir, '*'))
40
- end
41
-
42
- it 'writes a file named after the book into the output directory' do
43
- subject
44
- expect(File.exists?(expected_filepath)).to be_truthy
45
- end
46
-
47
- it 'writes a html summary to the file' do
48
- subject
49
- expect(File.read(expected_filepath)).to include("<h1>Fake book title</h1>")
50
- end
51
- end
52
-
53
- context 'with an existing summary file' do
54
- before(:each) do
55
- FileUtils.rm_f(expected_filepath)
56
- FileUtils.touch(expected_filepath)
57
- end
58
-
59
- context "and 'force' set to false" do
60
- let(:force) { false }
61
-
62
- it "won't write to the file" do
63
- subject
64
- expect(File.size(expected_filepath)).to eq 0
65
- end
66
-
67
- it 'prints a message informing that the file is being skipped' do
68
- subject
69
- expect(message_stream).to have_received(:puts).with("\e[33mSkipping \e[0m#{expected_filename}")
70
- end
71
- end
72
-
73
- context "and 'force' set to true" do
74
- let(:force) { true }
75
-
76
- it 'overwrites the file' do
77
- subject
78
- expect(File.size(expected_filepath)).to be > 0
79
- end
80
-
81
- it 'prints a message informing that the file is being written' do
82
- subject
83
- expect(message_stream).to have_received(:puts).with("\e[32mWriting \e[0m#{expected_filename}")
84
- end
85
- end
86
- end
87
- end
88
- end
@@ -1,76 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Klipbook::ToJson::BookFile do
4
-
5
- describe '.from_json' do
6
-
7
- subject { Klipbook::ToJson::BookFile.from_json(json) }
8
-
9
- context 'with empty json' do
10
-
11
- let(:json) { '' }
12
-
13
- it 'returns an object with no books' do
14
- expect(subject.books).to be_empty
15
- end
16
- end
17
- end
18
-
19
- describe '#add_books' do
20
- let (:message_stream) do
21
- double(puts: nil)
22
- end
23
-
24
- let(:it) do
25
- books = [
26
- Klipbook::Book.new.tap do |b|
27
- b.title = "Book one"
28
- b.author = "Author one"
29
- end,
30
- Klipbook::Book.new.tap do |b|
31
- b.title = "Book two"
32
- b.author = "Author two"
33
- end
34
- ]
35
- Klipbook::ToJson::BookFile.new(books)
36
- end
37
-
38
- it "adds any books that don't already exist" do
39
- new_book = Klipbook::Book.new.tap do |b|
40
- b.title = 'Book three'
41
- b.author = 'Author two'
42
- end
43
-
44
- it.add_books([ new_book ], false, message_stream)
45
-
46
- expect(it.books.size).to eq 3
47
- expect(it.books).to include(new_book)
48
- end
49
-
50
- it "replaces books that exist if force is true" do
51
- new_book = Klipbook::Book.new.tap do |b|
52
- b.title = 'Book one'
53
- b.author = 'Author one'
54
- b.asin = 'new asin'
55
- end
56
-
57
- it.add_books([ new_book ], true, message_stream)
58
-
59
- expect(it.books.size).to eq 2
60
- expect(it.books).to include(new_book)
61
- end
62
-
63
- it "does not replace existing books if force is false" do
64
- new_book = Klipbook::Book.new.tap do |b|
65
- b.title = 'Book one'
66
- b.author = 'Author one'
67
- b.asin = 'new asin'
68
- end
69
-
70
- it.add_books([ new_book ], false, message_stream)
71
-
72
- expect(it.books.size).to eq 2
73
- expect(it.books).not_to include(new_book)
74
- end
75
- end
76
- end
data/spec/spec_helper.rb DELETED
@@ -1,7 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
3
-
4
- require 'rspec'
5
-
6
- $LOAD_PATH << File.expand_path('../../../lib', __FILE__)
7
- require 'klipbook'