dropdown 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +23 -0
- data/.travis.yml +4 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +194 -0
- data/Rakefile +41 -0
- data/dropdown.gemspec +37 -0
- data/lib/dropdown.rb +23 -0
- data/lib/dropdown/blog.rb +23 -0
- data/lib/dropdown/configuration.rb +12 -0
- data/lib/dropdown/constants.rb +4 -0
- data/lib/dropdown/dropbox.rb +1 -0
- data/lib/dropdown/dropbox/session.rb +18 -0
- data/lib/dropdown/errors.rb +4 -0
- data/lib/dropdown/inflector.rb +11 -0
- data/lib/dropdown/iterators.rb +3 -0
- data/lib/dropdown/iterators/dropbox_iterator.rb +31 -0
- data/lib/dropdown/iterators/file_iterator.rb +18 -0
- data/lib/dropdown/iterators/iterator_factory.rb +12 -0
- data/lib/dropdown/markdown_renderer.rb +21 -0
- data/lib/dropdown/output_stores.rb +3 -0
- data/lib/dropdown/output_stores/dropbox_store.rb +24 -0
- data/lib/dropdown/output_stores/file_store.rb +23 -0
- data/lib/dropdown/output_stores/output_store_factory.rb +12 -0
- data/lib/dropdown/parsers/excerpt_extractor.rb +38 -0
- data/lib/dropdown/parsers/metadata_parser.rb +30 -0
- data/lib/dropdown/parsers/parser.rb +12 -0
- data/lib/dropdown/post.rb +48 -0
- data/lib/dropdown/processor.rb +39 -0
- data/lib/dropdown/readers.rb +3 -0
- data/lib/dropdown/readers/dropbox_reader.rb +32 -0
- data/lib/dropdown/readers/file_reader.rb +13 -0
- data/lib/dropdown/readers/reader_factory.rb +12 -0
- data/lib/dropdown/renderer_factory.rb +10 -0
- data/lib/dropdown/version.rb +3 -0
- data/spec/dropdown/blog_spec.rb +62 -0
- data/spec/dropdown/configuration_spec.rb +12 -0
- data/spec/dropdown/dropbox/session_spec.rb +26 -0
- data/spec/dropdown/inflector_spec.rb +18 -0
- data/spec/dropdown/iterators/dropbox_iterator_spec.rb +53 -0
- data/spec/dropdown/iterators/file_iterator_spec.rb +43 -0
- data/spec/dropdown/iterators/iterator_factory_spec.rb +10 -0
- data/spec/dropdown/markdown_renderer_spec.rb +31 -0
- data/spec/dropdown/output_stores/dropbox_store_spec.rb +46 -0
- data/spec/dropdown/output_stores/file_store_spec.rb +31 -0
- data/spec/dropdown/output_stores/output_store_factory_spec.rb +9 -0
- data/spec/dropdown/parsers/excerpt_extractor_spec.rb +54 -0
- data/spec/dropdown/parsers/metadata_parser_spec.rb +35 -0
- data/spec/dropdown/parsers/parser_spec.rb +26 -0
- data/spec/dropdown/post_spec.rb +66 -0
- data/spec/dropdown/processor_spec.rb +80 -0
- data/spec/dropdown/readers/dropbox_reader_spec.rb +43 -0
- data/spec/dropdown/readers/file_reader_spec.rb +30 -0
- data/spec/dropdown/readers/reader_factory_spec.rb +9 -0
- data/spec/dropdown/renderer_factory_spec.rb +18 -0
- data/spec/dropdown_spec.rb +13 -0
- data/spec/features/processing_a_markdown_directory_spec.rb +60 -0
- data/spec/fixtures/blog/my-trip-to-africa.md +10 -0
- data/spec/fixtures/processed/my-trip-to-africa.html +16 -0
- data/spec/fixtures/sample_post.md +8 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/support/dummy_dropbox.rb +63 -0
- metadata +278 -0
@@ -0,0 +1,12 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
require_relative '../../lib/dropdown'
|
3
|
+
|
4
|
+
describe Dropdown::Configuration do
|
5
|
+
subject { Dropdown::Configuration.new }
|
6
|
+
it 'sets defaults' do
|
7
|
+
subject.renderer.should == :markdown_renderer
|
8
|
+
subject.dropbox_app_key.should be_nil
|
9
|
+
subject.dropbox_app_secret.should be_nil
|
10
|
+
subject.dropbox_access_token.should be_nil
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require_relative '../../support/dummy_dropbox'
|
3
|
+
require_relative '../../../lib/dropdown/dropbox/session'
|
4
|
+
|
5
|
+
describe Dropdown::Dropbox::Session do
|
6
|
+
let(:app_key) { 'key' }
|
7
|
+
let(:app_secret) { 'secret' }
|
8
|
+
subject { Dropdown::Dropbox::Session.new app_key, app_secret }
|
9
|
+
|
10
|
+
describe '#authorize_url' do
|
11
|
+
it 'returns the url for the user to authorize Dropbox' do
|
12
|
+
subject.authorize_url.should == "https://www.dropbox.com/1/oauth2/authorize?client_id=#{app_key}&response_type=code"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#access_token' do
|
17
|
+
include DummyDropbox
|
18
|
+
|
19
|
+
it 'returns the access token based on the authorize code' do
|
20
|
+
access_token = "12345678"
|
21
|
+
|
22
|
+
stub_dropbox_token app_key, app_secret, access_token
|
23
|
+
subject.access_token('blah').should == access_token
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
require_relative '../../lib/dropdown/inflector'
|
3
|
+
|
4
|
+
describe Dropdown::Inflector do
|
5
|
+
describe '#constant_name' do
|
6
|
+
it 'can get a constant name from a symbol' do
|
7
|
+
Dropdown::Inflector.new(:test).constant_name.should == 'Test'
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'handles underscores' do
|
11
|
+
Dropdown::Inflector.new(:test_this).constant_name.should == 'TestThis'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'handles nil words' do
|
15
|
+
Dropdown::Inflector.new(nil).constant_name.should be_empty
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require_relative '../../support/dummy_dropbox'
|
3
|
+
require_relative '../../../lib/dropdown'
|
4
|
+
|
5
|
+
describe Dropdown::Iterators::DropboxIterator do
|
6
|
+
describe '.initialize' do
|
7
|
+
it 'requires a source path' do
|
8
|
+
expect{ Dropdown::Iterators::DropboxIterator.new(nil) }.to raise_error ArgumentError
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.each' do
|
13
|
+
include DummyDropbox
|
14
|
+
|
15
|
+
let(:access_token) { 'blah' }
|
16
|
+
let(:dir) { 'Documents/test' }
|
17
|
+
before { Dropdown.configure { |c| c.dropbox_access_token = access_token } }
|
18
|
+
|
19
|
+
it 'iterates over markdown files that end in .md' do
|
20
|
+
path = 'Documents/test/test1.md'
|
21
|
+
contents = [{is_dir: false, path: path}]
|
22
|
+
stub_dropbox_metadata access_token, dir, contents
|
23
|
+
|
24
|
+
expect{ |f| Dropdown::Iterators::DropboxIterator.new(dir).each(&f) }.to yield_with_args path
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'iterates over markdown files that end in .markdown' do
|
28
|
+
path = 'Documents/test/test1.markdown'
|
29
|
+
contents = [{is_dir: false, path: path}]
|
30
|
+
stub_dropbox_metadata access_token, dir, contents
|
31
|
+
|
32
|
+
expect{ |f| Dropdown::Iterators::DropboxIterator.new(dir).each(&f) }.to yield_with_args path
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'ignores files that are not markdown files' do
|
36
|
+
path = 'Documents/test/test1.txt'
|
37
|
+
contents = [{is_dir: false, path: path}]
|
38
|
+
stub_dropbox_metadata access_token, dir, contents
|
39
|
+
|
40
|
+
expect{ |f| Dropdown::Iterators::DropboxIterator.new(dir).each(&f) }.not_to yield_control
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'handles an extra slash in the source' do
|
44
|
+
directory = dir + "/"
|
45
|
+
|
46
|
+
path = 'Documents/test/test1.markdown'
|
47
|
+
contents = [{is_dir: false, path: path}]
|
48
|
+
stub_dropbox_metadata access_token, dir, contents
|
49
|
+
|
50
|
+
expect{ |f| Dropdown::Iterators::DropboxIterator.new(directory).each(&f) }.to yield_with_args path
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'pathname'
|
3
|
+
require_relative '../../spec_helper'
|
4
|
+
require_relative '../../../lib/dropdown/iterators/file_iterator'
|
5
|
+
|
6
|
+
describe Dropdown::Iterators::FileIterator do
|
7
|
+
describe '.initialize' do
|
8
|
+
it 'should require a source path' do
|
9
|
+
expect{ Dropdown::Iterators::FileIterator.new(nil) }.to raise_error ArgumentError
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '.each' do
|
14
|
+
it 'should iterate over markdown files that end in .md' do
|
15
|
+
file = Tempfile.new ['test', '.md']
|
16
|
+
dir = Pathname.new(file.path).dirname
|
17
|
+
expect{ |f| Dropdown::Iterators::FileIterator.new(dir).each(&f) }.to yield_with_args file.path
|
18
|
+
file.delete
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should iterate over markdown files that end in .markdown' do
|
22
|
+
file = Tempfile.new ['test', '.markdown']
|
23
|
+
dir = Pathname.new(file.path).dirname
|
24
|
+
expect{ |f| Dropdown::Iterators::FileIterator.new(dir).each(&f) }.to yield_with_args file.path
|
25
|
+
file.delete
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should ignore files that are not markdown files' do
|
29
|
+
file = Tempfile.new 'test'
|
30
|
+
dir = Pathname.new(file.path).dirname
|
31
|
+
expect{ |f| Dropdown::Iterators::FileIterator.new(dir).each(&f) }.not_to yield_control
|
32
|
+
file.delete
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should handle an extra slash in the source' do
|
36
|
+
file = Tempfile.new ['test', '.markdown']
|
37
|
+
dir = "#{Pathname.new(file.path).dirname}/"
|
38
|
+
expect{ |f| Dropdown::Iterators::FileIterator.new(dir).each(&f) }.to yield_with_args file.path
|
39
|
+
file.delete
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require_relative '../../../lib/dropdown/iterators'
|
3
|
+
|
4
|
+
describe Dropdown::Iterators::IteratorFactory do
|
5
|
+
it 'creates an iterator with a type and a source' do
|
6
|
+
iterator = Dropdown::Iterators::IteratorFactory.create :file, 'blah'
|
7
|
+
iterator.should be_a Dropdown::Iterators::FileIterator
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require_relative '../spec_helper'
|
3
|
+
require_relative '../../lib/dropdown'
|
4
|
+
|
5
|
+
describe Dropdown::MarkdownRenderer do
|
6
|
+
subject { Dropdown::MarkdownRenderer.new(@file.path) }
|
7
|
+
|
8
|
+
context 'for a local file' do
|
9
|
+
before do
|
10
|
+
@file = Tempfile.new(['markdown', '.md'])
|
11
|
+
@file.write "This is *great*, yo"
|
12
|
+
@file.close
|
13
|
+
subject.reader = Dropdown::Readers::FileReader.new
|
14
|
+
end
|
15
|
+
after { @file.unlink }
|
16
|
+
|
17
|
+
describe '#render' do
|
18
|
+
it 'produces html from a markdown file' do
|
19
|
+
result = subject.render
|
20
|
+
result.should == "<p>This is <em>great</em>, yo</p>\n"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#output_filename' do
|
25
|
+
it 'produces the file name with the correct extension for input file' do
|
26
|
+
filename = File.basename(@file)
|
27
|
+
subject.output_filename.should == filename.gsub(/\.md/, '.html')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require_relative '../../support/dummy_dropbox'
|
3
|
+
require_relative '../../../lib/dropdown'
|
4
|
+
require_relative '../../../lib/dropdown/output_stores/dropbox_store'
|
5
|
+
|
6
|
+
describe Dropdown::OutputStores::DropboxStore do
|
7
|
+
include DummyDropbox
|
8
|
+
|
9
|
+
let(:access_token) { 'blah' }
|
10
|
+
let(:html) { "<p>This is <em>great</em>, yo</p>\n" }
|
11
|
+
let(:output_path) { '/blog/processed' }
|
12
|
+
before { Dropdown.configure { |c| c.dropbox_access_token = access_token } }
|
13
|
+
after { remove_stubbed_dropbox_files }
|
14
|
+
|
15
|
+
subject { Dropdown::OutputStores::DropboxStore.new output_path }
|
16
|
+
|
17
|
+
describe '#save' do
|
18
|
+
it 'creates an output directory if it does not exist' do
|
19
|
+
filename = 'stuff.html'
|
20
|
+
stub_dropbox_put_file access_token, path(filename), html, true
|
21
|
+
|
22
|
+
subject.save html, filename
|
23
|
+
stubbed_dropbox_pathname(subject.path).should exist
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'names the output file the same as the input file' do
|
27
|
+
filename = 'bar.html'
|
28
|
+
stub_dropbox_put_file access_token, path(filename), html, true
|
29
|
+
subject.save html, filename
|
30
|
+
output_file = stubbed_dropbox_pathname(File.join(output_path, filename))
|
31
|
+
File.exists?(output_file).should be_true
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'writes the content to the file name' do
|
35
|
+
filename = 'bar.html'
|
36
|
+
stub_dropbox_put_file access_token, path(filename), html, true
|
37
|
+
subject.save html, filename
|
38
|
+
output_file = stubbed_dropbox_pathname(File.join(output_path, filename))
|
39
|
+
File.readlines(output_file)[0].should == html
|
40
|
+
end
|
41
|
+
|
42
|
+
def path(filename)
|
43
|
+
File.join(output_path, filename).gsub /^\//, ''
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'tmpdir'
|
3
|
+
require_relative '../../spec_helper'
|
4
|
+
require_relative '../../../lib/dropdown/output_stores/file_store'
|
5
|
+
|
6
|
+
describe Dropdown::OutputStores::FileStore do
|
7
|
+
let(:html) { "<p>This is <em>great</em>, yo</p>\n" }
|
8
|
+
let(:output_path) { File.join(Dir.tmpdir, 'foo') }
|
9
|
+
subject { Dropdown::OutputStores::FileStore.new output_path }
|
10
|
+
|
11
|
+
describe '#save' do
|
12
|
+
after { File.delete subject.path }
|
13
|
+
|
14
|
+
it 'create an output directory if it does not exist' do
|
15
|
+
subject.save html, 'stuff.html'
|
16
|
+
Pathname.new(subject.path).should exist
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'names the output file the same as the input file' do
|
20
|
+
subject.save html, 'bar.html'
|
21
|
+
output_file = File.join(output_path, 'bar.html')
|
22
|
+
File.exists?(output_file).should be_true
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'writes the content to the file name' do
|
26
|
+
subject.save html, 'bar.html'
|
27
|
+
output_file = File.join(output_path, 'bar.html')
|
28
|
+
File.readlines(output_file)[0].should == html
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require_relative '../../../lib/dropdown/output_stores'
|
3
|
+
|
4
|
+
describe Dropdown::OutputStores::OutputStoreFactory do
|
5
|
+
it 'creates an output store with a type and a path' do
|
6
|
+
output_store = Dropdown::OutputStores::OutputStoreFactory.create :dropbox, 'blah'
|
7
|
+
output_store.should be_a Dropdown::OutputStores::DropboxStore
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require_relative '../../../lib/dropdown/parsers/parser'
|
3
|
+
require_relative '../../../lib/dropdown/parsers/excerpt_extractor'
|
4
|
+
|
5
|
+
describe Dropdown::Parsers::ExcerptExtractor do
|
6
|
+
describe '#extract' do
|
7
|
+
it 'extracts the first 120 characters' do
|
8
|
+
subject = Dropdown::Parsers::ExcerptExtractor.new('Hello world')
|
9
|
+
subject.extract.should == 'Hello world'
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'extracts only the html content' do
|
13
|
+
subject = Dropdown::Parsers::ExcerptExtractor.new('<p>Hello world</p>')
|
14
|
+
subject.extract.should == 'Hello world'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'extracts multiple lines' do
|
18
|
+
content = [
|
19
|
+
'<p>Hello world</p>',
|
20
|
+
'<div>I hope the world is fine</div>'
|
21
|
+
].join
|
22
|
+
subject = Dropdown::Parsers::ExcerptExtractor.new content
|
23
|
+
subject.extract.should == "Hello world\nI hope the world is fine"
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'ignores comments' do
|
27
|
+
content = [
|
28
|
+
'<!-- This should be ignored -->',
|
29
|
+
'<p>Hello world</p>'
|
30
|
+
].join
|
31
|
+
subject = Dropdown::Parsers::ExcerptExtractor.new content
|
32
|
+
subject.extract.should == 'Hello world'
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'joins with a blank for non block elements' do
|
36
|
+
content = [
|
37
|
+
'<p>Hello <strong>world</strong></p>',
|
38
|
+
'<div>I hope the world is fine</div>'
|
39
|
+
].join
|
40
|
+
subject = Dropdown::Parsers::ExcerptExtractor.new content
|
41
|
+
subject.extract.should == "Hello world\nI hope the world is fine"
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'ignores elements that are not html' do
|
45
|
+
content = [
|
46
|
+
'<p>Hello </p>',
|
47
|
+
"\n",
|
48
|
+
'<div>world</div>'
|
49
|
+
].join
|
50
|
+
subject = Dropdown::Parsers::ExcerptExtractor.new content
|
51
|
+
subject.extract.should == "Hello \nworld"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require_relative '../../../lib/dropdown/parsers/parser'
|
3
|
+
require_relative '../../../lib/dropdown/parsers/metadata_parser'
|
4
|
+
|
5
|
+
describe Dropdown::Parsers::MetadataParser do
|
6
|
+
describe '.initialize' do
|
7
|
+
|
8
|
+
context 'setting instance variables' do
|
9
|
+
subject { Dropdown::Parsers::MetadataParser.new('Hello world') }
|
10
|
+
|
11
|
+
it 'defaults the headers to an empty hash' do
|
12
|
+
subject.headers.should == {}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#parse' do
|
18
|
+
let(:contents) {
|
19
|
+
file_path = File.join(File.dirname(__FILE__),
|
20
|
+
'../../fixtures/processed/my-trip-to-africa.html')
|
21
|
+
File.new(file_path, 'r').readlines.join
|
22
|
+
}
|
23
|
+
|
24
|
+
subject { Dropdown::Parsers::MetadataParser.new(contents) }
|
25
|
+
|
26
|
+
it 'creates a header variable for each comment line prior to the body' do
|
27
|
+
subject.parse
|
28
|
+
subject.headers.should == {
|
29
|
+
title: 'My trip to Africa',
|
30
|
+
author: 'Jane Goodall',
|
31
|
+
date: '4/4/1989'
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../../spec_helper'
|
2
|
+
require_relative '../../../lib/dropdown/parsers/parser'
|
3
|
+
|
4
|
+
class MyParser
|
5
|
+
include Dropdown::Parsers::Parser
|
6
|
+
end
|
7
|
+
|
8
|
+
describe Dropdown::Parsers::Parser do
|
9
|
+
context 'raising errors' do
|
10
|
+
it 'requires some content' do
|
11
|
+
expect {
|
12
|
+
MyParser.new(nil)
|
13
|
+
}.to raise_error ArgumentError
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'setting instance variables' do
|
18
|
+
let(:content) { "Hello world" }
|
19
|
+
|
20
|
+
subject { MyParser.new(content) }
|
21
|
+
|
22
|
+
it 'sets the content' do
|
23
|
+
subject.content.should == content
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
require_relative '../support/dummy_dropbox'
|
3
|
+
require_relative '../../lib/dropdown'
|
4
|
+
|
5
|
+
describe Dropdown::Post do
|
6
|
+
let(:current_directory) { File.expand_path File.dirname(__FILE__) }
|
7
|
+
let(:processed_file) { File.join current_directory, '../fixtures/processed/my-trip-to-africa.html' }
|
8
|
+
subject { Dropdown::Post.new(processed_file, Dropdown::Readers::FileReader.new) }
|
9
|
+
|
10
|
+
describe '#source' do
|
11
|
+
it 'is initialized with a path to an html file' do
|
12
|
+
source = 'foo'
|
13
|
+
Dropdown::Post.new(source, nil).source.should == source
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'retrieving metadata' do
|
18
|
+
it 'returns the title from the html contents' do
|
19
|
+
subject.title.should == 'My trip to Africa'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'returns the author from the html contents' do
|
23
|
+
subject.author.should == 'Jane Goodall'
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'returns the date from the html contents' do
|
27
|
+
subject.date.should == Date.parse('4/4/1989')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#body' do
|
32
|
+
it 'returns the full html' do
|
33
|
+
subject.body.should == File.new(processed_file, 'r').readlines.join
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#excerpt' do
|
38
|
+
it 'returns the first 120 characters of the html content' do
|
39
|
+
results = "I had so much fun on my trip to Africa.\nHere is just a list of things that I have accomplished:\nRode on an elephant\nTouched a snake\nDid some shopping\nAte some great food\n\nIt was a really good time."
|
40
|
+
subject.excerpt.should == results
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'for a Dropbox file' do
|
45
|
+
include DummyDropbox
|
46
|
+
|
47
|
+
let(:access_token) { 'blah' }
|
48
|
+
let(:processed_file) { 'blog/stuff.html' }
|
49
|
+
let(:contents) { "<p>Hello <span class='test'>world</span></p>" }
|
50
|
+
|
51
|
+
subject { Dropdown::Post.new(processed_file, Dropdown::Readers::DropboxReader.new) }
|
52
|
+
|
53
|
+
before do
|
54
|
+
Dropdown.configure { |c| c.dropbox_access_token = access_token }
|
55
|
+
stub_dropbox_put_file access_token, processed_file, contents, true
|
56
|
+
end
|
57
|
+
after { remove_stubbed_dropbox_files }
|
58
|
+
|
59
|
+
describe '#body' do
|
60
|
+
it 'returns the full html' do
|
61
|
+
stub_dropbox_get_file access_token, processed_file
|
62
|
+
subject.body.should == contents
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|