klipbook 1.0.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/CHANGELOG.txt +13 -0
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +17 -6
  4. data/LICENSE.txt +1 -1
  5. data/README.md +64 -32
  6. data/bin/klipbook +45 -9
  7. data/features/collate.feature +6 -46
  8. data/features/pretty_print.feature +51 -0
  9. data/features/step_definitions/collate_steps.rb +8 -52
  10. data/features/step_definitions/pretty_print_steps.rb +61 -0
  11. data/klipbook.gemspec +25 -20
  12. data/lib/klipbook/collate/book_file.rb +54 -0
  13. data/lib/klipbook/commands/collate.rb +17 -0
  14. data/lib/klipbook/commands/list_books.rb +19 -0
  15. data/lib/klipbook/commands/pretty_print.rb +17 -0
  16. data/lib/klipbook/{output/html_summary_writer.rb → pretty_print/html_printer.rb} +4 -5
  17. data/lib/klipbook/sources/amazon_site/book_scraper.rb +3 -3
  18. data/lib/klipbook/sources/book.rb +28 -0
  19. data/lib/klipbook/{fetcher.rb → sources/book_source.rb} +7 -10
  20. data/lib/klipbook/sources/clipping.rb +11 -0
  21. data/lib/klipbook/sources/kindle_device/file.rb +4 -4
  22. data/lib/klipbook/util/struct_to_json.rb +11 -0
  23. data/lib/klipbook/version.rb +1 -1
  24. data/lib/klipbook.rb +13 -10
  25. data/spec/lib/klipbook/collate/book_file_spec.rb +73 -0
  26. data/spec/lib/klipbook/{printer_spec.rb → commands/list_books_spec.rb} +5 -5
  27. data/spec/lib/klipbook/commands/pretty_print_spec.rb +40 -0
  28. data/spec/lib/klipbook/{output/html_summary_writer_spec.rb → pretty_print/html_printer_spec.rb} +4 -4
  29. data/spec/lib/klipbook/{fetcher_spec.rb → sources/book_source_spec.rb} +12 -12
  30. data/spec/lib/klipbook/{book_spec.rb → sources/book_spec.rb} +2 -2
  31. data/spec/lib/klipbook/sources/kindle_device/file_spec.rb +24 -4
  32. metadata +24 -19
  33. data/lib/klipbook/book.rb +0 -18
  34. data/lib/klipbook/clipping.rb +0 -9
  35. data/lib/klipbook/collator.rb +0 -17
  36. data/lib/klipbook/output/book_helpers.rb +0 -12
  37. data/lib/klipbook/printer.rb +0 -18
  38. data/spec/lib/klipbook/collator_spec.rb +0 -40
  39. /data/lib/klipbook/{output → pretty_print}/html_book_summary.erb +0 -0
  40. /data/lib/klipbook/{invalid_source_error.rb → sources/invalid_source_error.rb} +0 -0
  41. /data/lib/klipbook/{blank.rb → util/blank.rb} +0 -0
data/CHANGELOG.txt CHANGED
@@ -1,3 +1,16 @@
1
+ == 2.0.0 / 2013-02-12
2
+
3
+ * Feature changes
4
+
5
+ * Renamed the collate command to pretty print which describes what it does better.
6
+
7
+ * Introduces a _new_ collate command that collates all clippings into a single JSON
8
+ file.
9
+
10
+ * Other unexposed changes
11
+
12
+ * Internally refactored much of the codebase into a more sensible structure.
13
+
1
14
  == 1.0.2 / 2012-12-12
2
15
 
3
16
  * Bug fixes
data/Gemfile CHANGED
@@ -10,7 +10,7 @@ group :development do
10
10
  gem 'bundler'
11
11
  gem 'jeweler', '~> 1.6.4'
12
12
  gem 'rcov', '>= 0'
13
- gem 'pry'
13
+ gem 'pry-debugger'
14
14
  gem 'cucumber'
15
15
  gem 'aruba'
16
16
  gem 'guard'
data/Gemfile.lock CHANGED
@@ -9,12 +9,20 @@ GEM
9
9
  builder (3.0.0)
10
10
  childprocess (0.3.5)
11
11
  ffi (~> 1.0, >= 1.0.6)
12
- coderay (1.0.7)
12
+ coderay (1.0.8)
13
+ columnize (0.3.6)
13
14
  cucumber (1.2.1)
14
15
  builder (>= 2.1.2)
15
16
  diff-lcs (>= 1.1.3)
16
17
  gherkin (~> 2.11.0)
17
18
  json (>= 1.4.6)
19
+ debugger (1.2.4)
20
+ columnize (>= 0.3.1)
21
+ debugger-linecache (~> 1.1.1)
22
+ debugger-ruby_core_source (~> 1.1.7)
23
+ debugger-linecache (1.1.2)
24
+ debugger-ruby_core_source (>= 1.1.1)
25
+ debugger-ruby_core_source (1.1.8)
18
26
  diff-lcs (1.1.3)
19
27
  domain_name (0.5.6)
20
28
  unf (~> 0.0.3)
@@ -48,16 +56,19 @@ GEM
48
56
  nokogiri (~> 1.4)
49
57
  ntlm-http (~> 0.1, >= 0.1.1)
50
58
  webrobots (~> 0.0, >= 0.0.9)
51
- method_source (0.8)
59
+ method_source (0.8.1)
52
60
  mime-types (1.19)
53
61
  net-http-digest_auth (1.2.1)
54
62
  net-http-persistent (2.8)
55
63
  nokogiri (1.5.5)
56
64
  ntlm-http (0.1.1)
57
- pry (0.9.10)
65
+ pry (0.9.11.4)
58
66
  coderay (~> 1.0.5)
59
67
  method_source (~> 0.8)
60
- slop (~> 3.3.1)
68
+ slop (~> 3.4)
69
+ pry-debugger (0.2.1)
70
+ debugger (~> 1.2.0)
71
+ pry (~> 0.9.10)
61
72
  rainbow (1.1.4)
62
73
  rake (0.9.2.2)
63
74
  rb-fchange (0.0.5)
@@ -75,7 +86,7 @@ GEM
75
86
  rspec-expectations (2.7.0)
76
87
  diff-lcs (~> 1.1.2)
77
88
  rspec-mocks (2.7.0)
78
- slop (3.3.3)
89
+ slop (3.4.3)
79
90
  terminal-notifier-guard (1.5.3)
80
91
  thor (0.16.0)
81
92
  unf (0.0.5)
@@ -96,7 +107,7 @@ DEPENDENCIES
96
107
  guard-rspec
97
108
  jeweler (~> 1.6.4)
98
109
  mechanize
99
- pry
110
+ pry-debugger
100
111
  rainbow
101
112
  rcov
102
113
  rr
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011 Ray Grasso
1
+ Copyright (c) 2013 Ray Grasso
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,20 +1,23 @@
1
1
  # Klipbook
2
2
 
3
- Klipbook collates highlights and notes that you've created on your Kindle into a nice html file.
3
+ Klipbook takes the highlights and notes that you've created on your Kindle and
4
+ outputs them into nice html or JSON.
4
5
 
5
- ## An example of a clippings file generated by Klipbook
6
+ ## An example of a html clippings file generated by Klipbook
6
7
 
7
- <img src="https://github.com/grassdog/klipbook/raw/master/example.png" alt="Example of a clippings file" />
8
+ <img src="https://github.com/grassdog/klipbook/raw/master/example.png" alt="Example
9
+ of a clippings file" />
8
10
 
9
11
  ## What sources does it support?
10
12
 
11
13
  Klipbook can take your highlights from a clippings file off a physical Kindle device
12
- or from the [Kindle highlights site](https://kindle.amazon.com/your_highlights) itself.
14
+ or from the [Kindle highlights site](https://kindle.amazon.com/your_highlights)
15
+ itself.
13
16
 
14
17
  ## When should I use the file and when should I use the site?
15
18
 
16
19
  If your books are purchased from Amazon directly then use the site. The site is the
17
- canonical source and will contain all of your notes and highlights from across all of
20
+ canonical source and will contain all of your notes and highlights from across all of
18
21
  your Kindle devices and applications. Currently the Amazon highlights site only shows
19
22
  clippings for books you've purchased on Amazon.
20
23
 
@@ -24,36 +27,43 @@ device only keeps clippings that you made directly on it.
24
27
 
25
28
  ## How does it work?
26
29
 
27
- Klipbook supports two main commands: `collate` and `list`.
30
+ Klipbook supports three commands: `list`, `pprint`, and `collate`.
28
31
 
29
- ### Collate
32
+ ### Pretty print
30
33
 
31
- `collate` pulls together the clippings from your latest annotated book and combines them
32
- into a simple html file.
34
+ `pprint` retrieves the clippings from your latest annotated books and writes them
35
+ out into a pretty html file for each book.
33
36
 
34
37
  #### From a file
35
38
 
36
- Copy your clippings file (called "My Clippings.txt" on a 3rd generation Kindle) from your Kindle device to your local drive via USB.
39
+ Copy your clippings file (called "My Clippings.txt" on a 3rd generation Kindle) from
40
+ your Kindle device to your local drive via USB.
37
41
 
38
42
  Then write out a list of your clippings via:
39
43
 
40
- $ klipbook collate "file:My Clippings.txt"
44
+ ```sh
45
+ $ klipbook pprint "file:My Clippings.txt"
46
+ ```
41
47
 
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` switch.
48
+ This command will write the collected clippings for the latest annotated book to a
49
+ file in the current directory. You can override the output directory with the
50
+ `--output-dir` switch.
44
51
 
45
- You can also specify a maximum count of books you'd like collated with the `--num-books` switch.
52
+ You can also specify a maximum count of books you'd like collated with the
53
+ `--num-books` switch.
46
54
 
47
- Klipbook will not overwrite an exiting file by default. You can change this with
48
- the `--force` flag.
55
+ Klipbook will not overwrite an exiting file by default. You can change this with the
56
+ `--force` flag.
49
57
 
50
58
  #### From the site
51
59
 
52
60
  Specify your Amazon username and password to klipbook and it will scrape the site and
53
61
  output a clippings file.
54
62
 
55
- $ klipbook collate site:my-username@blah.com:my-password
56
-
63
+ ```sh
64
+ $ klipbook pprint site:my-username@blah.com:my-password
65
+ ```
66
+
57
67
  The same flags above apply.
58
68
 
59
69
  Note that the scraping requires a network connection (obviously) and can take a while
@@ -61,40 +71,61 @@ so please be patient.
61
71
 
62
72
  ### Set up defaults
63
73
 
64
- If you don't feel like having your Amazon credentials in your shell history you can set your
65
- default source in the klipbook rc file: `~/.klipbookrc`.
74
+ If you don't feel like having your Amazon credentials in your shell history you can
75
+ set your default source in the klipbook rc file: `~/.klipbookrc`.
66
76
 
67
77
  This is simply a YAML file and you can specify default values for the source and the
68
78
  output directory, e.g.
69
79
 
70
- $ cat ~/.klipbookrc
71
- source: site:my-username@blah.com:my-password
72
- output: my/default/output/directory
80
+ ```sh
81
+ $ cat ~/.klipbookrc
82
+
83
+ :source: site:my-username@blah.com:my-password
84
+ :output: /path/to/my/default/output/directory
85
+ ```
73
86
 
74
87
  Command line options override the defaults stored in the rc file.
75
88
 
76
89
  ### List
77
90
 
78
- The list command lists the books avaiable in the specified source.
91
+ The `list` command lists the books available in the specified source.
79
92
 
80
- $ klipbook list file:"My Clippings.txt"
93
+ ```sh
94
+ $ klipbook list file:"My Clippings.txt"
81
95
 
82
- Book list:
83
- [1] The Big Sleep by Raymond Chandler
84
- [2] How to jump out of a plane without a parachute and survive by Rip Rockjaw
96
+ Book list:
97
+ [1] The Big Sleep by Raymond Chandler
98
+ [2] How to jump out of a plane without a parachute and survive by Rip Rockjaw
99
+ ```
85
100
 
86
101
  By default it will only list the latest book. This can be overrided with the
87
102
  `--num-books` switch.
88
103
 
104
+ ### Collate
105
+
106
+ `collate` pulls together the clippings from your latest annotated books and combines
107
+ them into a single JSON file.
108
+
109
+ ```sh
110
+ $ klipbook collate -c books.json "file:My Clippings.txt"
111
+ ```
112
+
113
+ You can rerun collate on an existing JSON file to add new books. By default existing
114
+ books in the JSON file will not be overwritten. This can be changed with the `force`
115
+ flag.
116
+
89
117
  ## Installation
90
118
 
91
119
  Klipbook is a Ruby gem. To install simply run:
92
120
 
93
- gem install klipbook
121
+ ```sh
122
+ $ gem install klipbook
123
+ ```
94
124
 
95
125
  ## Supported Devices
96
126
 
97
- Klipbook has been tested on clippings files from 3rd generation Kindles and the Kindle Touch.
127
+ Klipbook has been tested on clippings files from 3rd generation Kindles and the
128
+ Kindle Touch.
98
129
 
99
130
  ## Tested platforms
100
131
 
@@ -102,9 +133,10 @@ Klipbook has been tested on Mac OSX Mountain Lion using MRI 1.9.3.
102
133
 
103
134
  ## Contributing to Klipbook
104
135
 
105
- Fork the project on [Github](https://github.com/grassdog/klipbook), add tests for your changes, and submit a well described pull request.
136
+ Fork the project on [Github](https://github.com/grassdog/klipbook), add tests for
137
+ your changes, and submit a well described pull request.
106
138
 
107
139
  ## Copyright
108
140
 
109
- Copyright (c) 2012 Ray Grasso. See LICENSE.txt for further details.
141
+ Copyright (c) 2013 Ray Grasso. See LICENSE.txt for further details.
110
142
 
data/bin/klipbook CHANGED
@@ -25,32 +25,52 @@ arg_name 'count'
25
25
  default_value 1
26
26
  flag [:n, :'num-books']
27
27
 
28
- desc 'Collate your clippings into a html file for each book'
28
+ desc 'Collate your clippings into a single json file'
29
29
  arg_name 'source'
30
- long_desc "Clippings are fetched from the specified source before being collated into html " +
31
- "files and written into the current directory.\n\n" + SOURCE_HELP
30
+ long_desc "Clippings are fetched from the specified source, collated, and written into a single json file.\n\n" +
31
+ SOURCE_HELP
32
32
  command :collate do |c|
33
33
 
34
- c.desc 'Override the directory path where collated files are written'
34
+ c.desc 'Specify the name of the json file to be written to.'
35
+ c.arg_name 'File-name'
36
+ c.flag [:c, :'output-file']
37
+
38
+ c.desc 'Force overwrite of any existing book entries within the output file'
39
+ c.switch [:f, :force]
40
+
41
+ c.action do |globals,options,args|
42
+ book_file_path = output_file(options)
43
+ books = fetch_books(args, globals)
44
+ Klipbook::Commands::Collate.new(books, book_file(book_file_path)).call(book_file_path, options[:f])
45
+ end
46
+ end
47
+
48
+ desc 'Pretty print your clippings into a html file for each book'
49
+ arg_name 'source'
50
+ long_desc "Clippings are fetched from the specified source before being written to html " +
51
+ "files in the output directory.\n\n" + SOURCE_HELP
52
+ command :pprint do |c|
53
+
54
+ c.desc 'Override the directory path where html files are written'
35
55
  c.arg_name 'Directory'
36
56
  c.flag [:o, :'output-dir']
37
57
 
38
- c.desc 'Force overwrite of any existing collated files'
58
+ c.desc 'Force overwrite of any existing files'
39
59
  c.switch [:f, :force]
40
60
 
41
61
  c.action do |globals,options,args|
42
62
  books = fetch_books(args, globals)
43
- Klipbook::Collator.new(books).collate_books(output_dir(options), options[:f])
63
+ Klipbook::Commands::PrettyPrint.new(books).call(output_dir(options), options[:f])
44
64
  end
45
65
  end
46
66
 
47
67
  desc 'List available books'
48
68
  arg_name 'source'
49
- long_desc "Clippings are fetched from the specified source before being listed to screen.\n\n" + SOURCE_HELP
69
+ long_desc "List the books from the specified source to screen.\n\n" + SOURCE_HELP
50
70
  command :list do |c|
51
71
  c.action do |globals,options,args|
52
72
  books = fetch_books(args, globals)
53
- Klipbook::Printer.new(books).print
73
+ Klipbook::Commands::ListBooks.new(books).call
54
74
  end
55
75
  end
56
76
 
@@ -75,17 +95,33 @@ on_error do |exception|
75
95
  true
76
96
  end
77
97
 
98
+ def book_file(file_path)
99
+ raw_json = if File.exist?(file_path)
100
+ File.open(file_path, 'r') do |f|
101
+ f.read
102
+ end
103
+ else
104
+ ''
105
+ end
106
+
107
+ Klipbook::Collate::BookFile.from_json(raw_json)
108
+ end
109
+
78
110
  def source_spec(args)
79
111
  @source_spec ||= (args[0] || Klipbook::Config.new.read[:source])
80
112
  end
81
113
 
82
114
  def fetch_books(args, globals)
83
- Klipbook::Fetcher.new(source_spec(args), globals[:n].to_i).fetch_books
115
+ Klipbook::Sources::BookSource.new(source_spec(args), globals[:n].to_i).books
84
116
  end
85
117
 
86
118
  def output_dir(options)
87
119
  @output_dir ||= (options[:o] || Klipbook::Config.new.read[:output] || Dir.pwd)
88
120
  end
89
121
 
122
+ def output_file(options)
123
+ @output_file ||= (options[:c] || Klipbook::Config.new.read[:output_file] || File.join(Dir.pwd, 'books.json'))
124
+ end
125
+
90
126
  exit run(ARGV)
91
127
 
@@ -1,51 +1,11 @@
1
- Feature: klipbook collates the clippings from a clippings file
1
+ Feature: klipbook collates clippings from a clippings file
2
2
  As an avid reader and note taker
3
- I want to see a pretty html collation for books that I've read
4
- So that I can refer to a nice summary of passages I enjoyed in the book
3
+ I want to see a single JSON file collating the clippings of the books that I've read
4
+ So that I can export them to other tools for my enjoyment
5
5
 
6
6
  Scenario: File with clippings for a book
7
- Given a directory named "output"
8
- And a file that contains clippings for 3 books called "input.txt"
9
- When I collate clippings for "3" books from the file "input.txt" to the output directory "output"
10
- Then I should find a file in the folder "output" named "Lean Software Development: An Agile Toolkit by Mary Poppendieck and Tom Poppendieck.html" that contains "13" clippings
11
- Then I should find a file in the folder "output" named "Instapaper: Long Reads by Instapaper: Long Reads.html" that contains "4" clippings
12
- Then I should find a file in the folder "output" named "Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin.html" that contains "3" clippings
13
- And the exit status should be 0
14
-
15
- Scenario: Attempting to write to an existing file
16
- Given a directory named "output"
17
- And a file in "output" named "Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin.html"
18
- And a file that contains clippings for 3 books called "input.txt"
19
- When I collate clippings for "3" books from the file "input.txt" to the output directory "output"
20
- Then the output should contain "Skipping Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin.html"
21
- And the exit status should be 0
22
-
23
- Scenario: Force overwrite of an existing file
24
- Given a directory named "output"
25
- And a file in "output" named "Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin.html"
26
- And a file that contains clippings for 3 books called "input.txt"
27
- When I collate clippings for "3" books from the file "input.txt" to the output directory "output" forcefully
28
- Then the output should contain "Writing Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin.html"
29
- And the exit status should be 0
30
-
31
- Scenario: Attempt to write with a bad number of books
32
- Given a directory named "output"
33
- And a file that contains clippings for 3 books called "input.txt"
34
- When I collate clippings for "notanumber" books from the file "input.txt" to the output directory "output"
35
- Then the output should contain "error: Specify a number of books greater than 0"
36
- And the exit status should be 1
37
-
38
- Scenario: Attempt to write to a non-existent directory
39
- Given there is not a directory named "output"
40
- And a file that contains clippings for 3 books called "input.txt"
41
- When I collate clippings for "3" books from the file "input.txt" to the output directory "output"
42
- Then the output should contain "error: Output directory doesn't exist: output"
43
- And the exit status should be 1
44
-
45
- @slow
46
- Scenario: Site with clippings for a book
47
- Given a directory named "output"
48
- When I collate clippings for "1" books from the kindle site to the output directory "output"
49
- Then I should find "1" collated files containing clippings in the directory "output"
7
+ Given a file that contains clippings for 3 books called "input.txt"
8
+ When I collate clippings for "3" books from the file "input.txt" to the output file "books.json"
9
+ Then I should find a file called "books.json" that contains "Lean Software Development: An Agile Toolkit"
50
10
  And the exit status should be 0
51
11
 
@@ -0,0 +1,51 @@
1
+ Feature: klipbook pretty prints the clippings from a clippings file
2
+ As an avid reader and note taker
3
+ I want to see a pretty html summary for each of the books that I've read
4
+ So that I can refer to a nice summary of passages I enjoyed in the book
5
+
6
+ Scenario: File with clippings for a book
7
+ Given a directory named "output"
8
+ And a file that contains clippings for 3 books called "input.txt"
9
+ When I pretty print clippings for "3" books from the file "input.txt" to the output directory "output"
10
+ Then I should find a file in the folder "output" named "Lean Software Development: An Agile Toolkit by Mary Poppendieck and Tom Poppendieck.html" that contains "13" clippings
11
+ Then I should find a file in the folder "output" named "Instapaper: Long Reads by Instapaper: Long Reads.html" that contains "4" clippings
12
+ Then I should find a file in the folder "output" named "Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin.html" that contains "3" clippings
13
+ And the exit status should be 0
14
+
15
+ Scenario: Attempting to write to an existing file
16
+ Given a directory named "output"
17
+ And a file in "output" named "Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin.html"
18
+ And a file that contains clippings for 3 books called "input.txt"
19
+ When I pretty print clippings for "3" books from the file "input.txt" to the output directory "output"
20
+ Then the output should contain "Skipping Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin.html"
21
+ And the exit status should be 0
22
+
23
+ Scenario: Force overwrite of an existing file
24
+ Given a directory named "output"
25
+ And a file in "output" named "Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin.html"
26
+ And a file that contains clippings for 3 books called "input.txt"
27
+ When I pretty print clippings for "3" books from the file "input.txt" to the output directory "output" forcefully
28
+ Then the output should contain "Writing Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin.html"
29
+ And the exit status should be 0
30
+
31
+ Scenario: Attempt to write with a bad number of books
32
+ Given a directory named "output"
33
+ And a file that contains clippings for 3 books called "input.txt"
34
+ When I pretty print clippings for "notanumber" books from the file "input.txt" to the output directory "output"
35
+ Then the output should contain "error: Specify a number of books greater than 0"
36
+ And the exit status should be 1
37
+
38
+ Scenario: Attempt to write to a non-existent directory
39
+ Given there is not a directory named "output"
40
+ And a file that contains clippings for 3 books called "input.txt"
41
+ When I pretty print clippings for "3" books from the file "input.txt" to the output directory "output"
42
+ Then the output should contain "error: Output directory doesn't exist: output"
43
+ And the exit status should be 1
44
+
45
+ @slow
46
+ Scenario: Site with clippings for a book
47
+ Given a directory named "output"
48
+ When I pretty print clippings for "1" books from the kindle site to the output directory "output"
49
+ Then I should find "1" pretty formated files containing clippings in the directory "output"
50
+ And the exit status should be 0
51
+
@@ -1,61 +1,17 @@
1
- CLIPPING_FILE = File.join(File.dirname(__FILE__), '../fixtures/clippings-for-three-books.txt')
2
1
 
3
- Given /^a file in "([^"]*)" named "([^"]*)"$/ do |output_dir, file_name|
4
- in_current_dir { FileUtils.touch(File.join(output_dir, file_name)) }
2
+ When /^I collate clippings for "([^"]*)" books from the file "([^"]*)" to the output file "([^"]*)"$/ do |book_count, input_file, output_file|
3
+ run_collate(book_count, output_file, input_file)
5
4
  end
6
5
 
7
- Given /^there is not a directory named "([^"]*)"$/ do |directory_name|
6
+ Then /^I should find a file called "([^"]*)" that contains "([^"]*)"$/ do |output_file, expected_text|
8
7
  in_current_dir do
9
- FileUtils.rm_f(directory_name)
10
- end
11
- end
12
-
13
- Given /^a file that contains clippings for 3 books called "([^"]*)"$/ do |file_name|
14
- in_current_dir { FileUtils.cp(CLIPPING_FILE, file_name) }
15
- end
16
-
17
- When /^I collate clippings for "([^"]*)" books from the file "([^"]*)" to the output directory "([^"]*)"$/ do |book_count, input_file, output_dir|
18
- run_collate_file(book_count, output_dir, input_file, false)
19
- end
20
-
21
- When /^I collate clippings for "([^"]*)" books from the file "([^"]*)" to the output directory "([^"]*)" forcefully$/ do |book_count, input_file, output_dir|
22
- run_collate_file(book_count, output_dir, input_file, true)
23
- end
24
-
25
- Then /^I should find a file in the folder "([^"]*)" named "([^"]*)" that contains "([^"]*)" clippings$/ do |output_folder, file_name, clipping_count|
26
- in_current_dir do
27
- file_path = File.join(output_folder, file_name)
28
- File.exists?(file_path).should be_true
29
- File.open(file_path, 'r') do |f|
30
- f.read.should match(/<footer>\s+#{clipping_count} clippings &bull;/m)
8
+ File.exists?(output_file).should be_true
9
+ File.open(output_file, 'r') do |f|
10
+ f.read.should match(/#{expected_text}/m)
31
11
  end
32
12
  end
33
13
  end
34
14
 
35
- # FIXME This step currently assumes you have site: set up in your klipbookrc
36
- When /^I collate clippings for "([^"]*)" books from the kindle site to the output directory "([^"]*)"$/ do |book_count, output_dir|
37
- run_simple(unescape("klipbook -n #{book_count} collate -o #{output_dir}"), false)
15
+ def run_collate(book_count, output_file, input_file)
16
+ run_simple(unescape("klipbook -n #{book_count} collate -c #{output_file} file:#{input_file}"), false)
38
17
  end
39
-
40
- Then /^I should find "([^"]*)" collated files containing clippings in the directory "([^"]*)"$/ do |file_count, output_dir|
41
- in_current_dir do
42
- files = Dir['output/*.html']
43
- files.should have(file_count.to_i).items
44
- files.each do |fname|
45
- File.open(fname, 'r') do |f|
46
- f.read.should match(/<footer>\s+\d+ clippings &bull;/m)
47
- end
48
- end
49
- end
50
- end
51
-
52
- def run_collate_file(book_count, output, input, force=false)
53
- force_str = if force
54
- '-f'
55
- else
56
- ''
57
- end
58
-
59
- run_simple(unescape("klipbook -n #{book_count} collate #{force_str} -o #{output} file:#{input}"), false)
60
- end
61
-
@@ -0,0 +1,61 @@
1
+ CLIPPING_FILE = File.join(File.dirname(__FILE__), '../fixtures/clippings-for-three-books.txt')
2
+
3
+ Given /^a file in "([^"]*)" named "([^"]*)"$/ do |output_dir, file_name|
4
+ in_current_dir { FileUtils.touch(File.join(output_dir, file_name)) }
5
+ end
6
+
7
+ Given /^there is not a directory named "([^"]*)"$/ do |directory_name|
8
+ in_current_dir do
9
+ FileUtils.rm_f(directory_name)
10
+ end
11
+ end
12
+
13
+ Given /^a file that contains clippings for 3 books called "([^"]*)"$/ do |file_name|
14
+ in_current_dir { FileUtils.cp(CLIPPING_FILE, file_name) }
15
+ end
16
+
17
+ When /^I pretty print clippings for "([^"]*)" books from the file "([^"]*)" to the output directory "([^"]*)"$/ do |book_count, input_file, output_dir|
18
+ run_pretty_print_file(book_count, output_dir, input_file, false)
19
+ end
20
+
21
+ When /^I pretty print clippings for "([^"]*)" books from the file "([^"]*)" to the output directory "([^"]*)" forcefully$/ do |book_count, input_file, output_dir|
22
+ run_pretty_print_file(book_count, output_dir, input_file, true)
23
+ end
24
+
25
+ Then /^I should find a file in the folder "([^"]*)" named "([^"]*)" that contains "([^"]*)" clippings$/ do |output_folder, file_name, clipping_count|
26
+ in_current_dir do
27
+ file_path = File.join(output_folder, file_name)
28
+ File.exists?(file_path).should be_true
29
+ File.open(file_path, 'r') do |f|
30
+ f.read.should match(/<footer>\s+#{clipping_count} clippings &bull;/m)
31
+ end
32
+ end
33
+ end
34
+
35
+ # FIXME This step currently assumes you have site: set up in your klipbookrc
36
+ When /^I pretty print clippings for "([^"]*)" books from the kindle site to the output directory "([^"]*)"$/ do |book_count, output_dir|
37
+ run_simple(unescape("klipbook -n #{book_count} pprint -o #{output_dir}"), false)
38
+ end
39
+
40
+ Then /^I should find "([^"]*)" pretty printed files containing clippings in the directory "([^"]*)"$/ do |file_count, output_dir|
41
+ in_current_dir do
42
+ files = Dir['output/*.html']
43
+ files.should have(file_count.to_i).items
44
+ files.each do |fname|
45
+ File.open(fname, 'r') do |f|
46
+ f.read.should match(/<footer>\s+\d+ clippings &bull;/m)
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ def run_pretty_print_file(book_count, output, input, force=false)
53
+ force_str = if force
54
+ '-f'
55
+ else
56
+ ''
57
+ end
58
+
59
+ run_simple(unescape("klipbook -n #{book_count} pprint #{force_str} -o #{output} file:#{input}"), false)
60
+ end
61
+