klipbook 1.0.1 → 1.0.2

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.
data/CHANGELOG.txt ADDED
@@ -0,0 +1,6 @@
1
+ == 1.0.2 / 2012-12-12
2
+
3
+ * Bug fixes
4
+
5
+ * Updated site scraping code to ensure it still works
6
+
data/Gemfile.lock CHANGED
@@ -16,7 +16,7 @@ GEM
16
16
  gherkin (~> 2.11.0)
17
17
  json (>= 1.4.6)
18
18
  diff-lcs (1.1.3)
19
- domain_name (0.5.3)
19
+ domain_name (0.5.6)
20
20
  unf (~> 0.0.3)
21
21
  ffi (1.1.5)
22
22
  gherkin (2.11.2)
@@ -51,7 +51,7 @@ GEM
51
51
  method_source (0.8)
52
52
  mime-types (1.19)
53
53
  net-http-digest_auth (1.2.1)
54
- net-http-persistent (2.7)
54
+ net-http-persistent (2.8)
55
55
  nokogiri (1.5.5)
56
56
  ntlm-http (0.1.1)
57
57
  pry (0.9.10)
data/README.md CHANGED
@@ -18,8 +18,8 @@ canonical source and will contain all of your notes and highlights from across a
18
18
  your Kindle devices and applications. Currently the Amazon highlights site only shows
19
19
  clippings for books you've purchased on Amazon.
20
20
 
21
- If your books are personal documents and you've read them on your kindle device
22
- itself then you should use the file from that device as a source i.e. you Kindle
21
+ If your books are personal documents and you've read them on your Kindle device
22
+ itself then you should use the file from that device as a source i.e. your Kindle
23
23
  device only keeps clippings that you made directly on it.
24
24
 
25
25
  ## How does it work?
@@ -40,23 +40,28 @@ Then write out a list of your clippings via:
40
40
  $ klipbook collate "file:My Clippings.txt"
41
41
 
42
42
  This command will write the collected clippings for the latest annotated book to a file in the current
43
- directory. You can override the output directory with the `--output-dir` flag.
43
+ directory. You can override the output directory with the `--output-dir` switch.
44
+
45
+ You can also specify a maximum count of books you'd like collated with the `--num-books` switch.
44
46
 
45
47
  Klipbook will not overwrite an exiting file by default. You can change this with
46
48
  the `--force` flag.
47
49
 
48
- You can also specify a maximum count of books you'd like collated with the `--num-books` flag.
49
-
50
50
  #### From the site
51
51
 
52
- Specify your amazon username and password to klipbook and it will scrape the site and
52
+ Specify your Amazon username and password to klipbook and it will scrape the site and
53
53
  output a clippings file.
54
54
 
55
55
  $ klipbook collate site:my-username@blah.com:my-password
56
56
 
57
57
  The same flags above apply.
58
58
 
59
- If you don't feel like having your credentials in your shell history you can set your
59
+ Note that the scraping requires a network connection (obviously) and can take a while
60
+ so please be patient.
61
+
62
+ ### Set up defaults
63
+
64
+ If you don't feel like having your Amazon credentials in your shell history you can set your
60
65
  default source in the klipbook rc file: `~/.klipbookrc`.
61
66
 
62
67
  This is simply a YAML file and you can specify default values for the source and the
@@ -78,6 +83,9 @@ The list command lists the books avaiable in the specified source.
78
83
  [1] The Big Sleep by Raymond Chandler
79
84
  [2] How to jump out of a plane without a parachute and survive by Rip Rockjaw
80
85
 
86
+ By default it will only list the latest book. This can be overrided with the
87
+ `--num-books` switch.
88
+
81
89
  ## Installation
82
90
 
83
91
  Klipbook is a Ruby gem. To install simply run:
data/klipbook.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "klipbook"
8
- s.version = "1.0.1"
8
+ s.version = "1.0.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ray Grasso"]
12
- s.date = "2012-09-08"
12
+ s.date = "2012-12-12"
13
13
  s.description = "Process your Kindle clippings file to generate a nicely formatted compilation of the clippings of the books you've read"
14
14
  s.email = "ray.grasso@gmail.com"
15
15
  s.executables = ["klipbook"]
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
21
21
  ".document",
22
22
  ".rspec",
23
23
  ".yardopts",
24
+ "CHANGELOG.txt",
24
25
  "Gemfile",
25
26
  "Gemfile.lock",
26
27
  "Guardfile",
@@ -49,7 +50,7 @@ Gem::Specification.new do |s|
49
50
  "lib/klipbook/output/html_summary_writer.rb",
50
51
  "lib/klipbook/printer.rb",
51
52
  "lib/klipbook/sources/amazon_site/book_scraper.rb",
52
- "lib/klipbook/sources/amazon_site/scraper.rb",
53
+ "lib/klipbook/sources/amazon_site/site_scraper.rb",
53
54
  "lib/klipbook/sources/kindle_device/entry.rb",
54
55
  "lib/klipbook/sources/kindle_device/entry_parser.rb",
55
56
  "lib/klipbook/sources/kindle_device/file.rb",
data/lib/klipbook.rb CHANGED
@@ -7,7 +7,7 @@ require 'klipbook/sources/kindle_device/entry_parser'
7
7
  require 'klipbook/sources/kindle_device/entry'
8
8
  require 'klipbook/sources/kindle_device/file'
9
9
 
10
- require 'klipbook/sources/amazon_site/scraper'
10
+ require 'klipbook/sources/amazon_site/site_scraper'
11
11
  require 'klipbook/sources/amazon_site/book_scraper'
12
12
 
13
13
  require 'klipbook/invalid_source_error'
@@ -9,7 +9,7 @@ module Klipbook
9
9
  elsif (source_spec =~ /site:(.+):(.+)/)
10
10
  username = $1
11
11
  password = $2
12
- @source = Klipbook::Sources::AmazonSite::Scraper.new(username, password, max_books)
12
+ @source = Klipbook::Sources::AmazonSite::SiteScraper.new(username, password, max_books)
13
13
  else
14
14
  raise InvalidSourceError("Unrecognised source type. Only 'file' and 'site' are supported")
15
15
  end
@@ -2,7 +2,7 @@ require 'mechanize'
2
2
 
3
3
  module Klipbook::Sources
4
4
  module AmazonSite
5
- class Scraper
5
+ class SiteScraper
6
6
  def initialize(username, password, max_books,
7
7
  book_scraper=Klipbook::Sources::AmazonSite::BookScraper.new,
8
8
  message_stream=$stdout)
@@ -10,29 +10,31 @@ module Klipbook::Sources
10
10
  @password = password
11
11
  @max_books = max_books
12
12
  @message_stream = message_stream
13
- @agent = Mechanize.new
13
+ @agent = Mechanize.new do |a|
14
+ a.user_agent_alias = 'Mac Safari'
15
+ end
14
16
  @book_scraper = book_scraper
15
17
  end
16
18
 
17
19
  def books
18
- @books ||= fetch_books
20
+ @books ||= fetch_up_to_max_books
19
21
  end
20
22
 
21
23
  private
22
24
 
23
- def fetch_books
24
- login_form = login
25
-
26
- signin_submission = @agent.submit(login_form)
25
+ def fetch_up_to_max_books
26
+ scrape_books(fetch_first_books_page)
27
+ end
27
28
 
28
- raise 'Invalid Username or password' unless signin_submission.title == "Amazon Kindle: Home"
29
+ def fetch_first_books_page
30
+ welcome_page = get_welcome_page
29
31
 
30
- page = @agent.click(signin_submission.link_with(:text => /Your Highlights/))
32
+ raise 'Invalid Username or password' unless welcome_page.title == 'Amazon Kindle: Home'
31
33
 
32
- scrape_books(page)
34
+ @agent.click(welcome_page.link_with(:text => /Your Highlights/))
33
35
  end
34
36
 
35
- def login
37
+ def get_welcome_page
36
38
  @message_stream.puts 'Logging into site'
37
39
 
38
40
  begin
@@ -41,12 +43,12 @@ module Klipbook::Sources
41
43
  raise 'Could not connect to Amazon Kindle Site'
42
44
  end
43
45
 
44
- login_form = page.form('signIn')
45
-
46
- login_form.email = @username
47
- login_form.password = @password
46
+ login_form = page.form('signIn').tap do |f|
47
+ f.email = @username
48
+ f.password = @password
49
+ end
48
50
 
49
- login_form
51
+ @agent.submit(login_form)
50
52
  end
51
53
 
52
54
  def scrape_books(page)
@@ -66,9 +68,9 @@ module Klipbook::Sources
66
68
  end
67
69
 
68
70
  def get_next_page(page)
69
- ret = page.search(".//a[@id='nextBookLink']").first
70
- if ret and ret.attribute("href")
71
- @agent.get("https://kindle.amazon.com" + ret.attribute("href").value)
71
+ next_book_link = page.link_with(:dom_id => "nextBookLink")
72
+ if next_book_link
73
+ @agent.click(next_book_link)
72
74
  else
73
75
  nil
74
76
  end
@@ -1,3 +1,3 @@
1
1
  module Klipbook
2
- VERSION = '1.0.1'
2
+ VERSION = '1.0.2'
3
3
  end
@@ -20,12 +20,12 @@ describe Klipbook::Fetcher do
20
20
  let(:fetcher) { Klipbook::Fetcher.new('site:username@example.com:password', 2) }
21
21
 
22
22
  before(:each) do
23
- stub(Klipbook::Sources::AmazonSite::Scraper).new { fake_source }
23
+ stub(Klipbook::Sources::AmazonSite::SiteScraper).new { fake_source }
24
24
  end
25
25
 
26
26
  it 'creates a site scraper with the provided credentials' do
27
27
  subject
28
- Klipbook::Sources::AmazonSite::Scraper.should have_received.new('username@example.com', 'password', 2)
28
+ Klipbook::Sources::AmazonSite::SiteScraper.should have_received.new('username@example.com', 'password', 2)
29
29
  end
30
30
 
31
31
  describe '#fetch_books' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: klipbook
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-08 00:00:00.000000000 Z
12
+ date: 2012-12-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: gli
@@ -264,6 +264,7 @@ files:
264
264
  - .document
265
265
  - .rspec
266
266
  - .yardopts
267
+ - CHANGELOG.txt
267
268
  - Gemfile
268
269
  - Gemfile.lock
269
270
  - Guardfile
@@ -292,7 +293,7 @@ files:
292
293
  - lib/klipbook/output/html_summary_writer.rb
293
294
  - lib/klipbook/printer.rb
294
295
  - lib/klipbook/sources/amazon_site/book_scraper.rb
295
- - lib/klipbook/sources/amazon_site/scraper.rb
296
+ - lib/klipbook/sources/amazon_site/site_scraper.rb
296
297
  - lib/klipbook/sources/kindle_device/entry.rb
297
298
  - lib/klipbook/sources/kindle_device/entry_parser.rb
298
299
  - lib/klipbook/sources/kindle_device/file.rb
@@ -324,7 +325,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
324
325
  version: '0'
325
326
  segments:
326
327
  - 0
327
- hash: -4508748763061441065
328
+ hash: -4595890160696464397
328
329
  required_rubygems_version: !ruby/object:Gem::Requirement
329
330
  none: false
330
331
  requirements: