local_unfuddle_notebook 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ *.gem
2
+ .bundle
3
+ .local_unfuddle_notebook.yaml
4
+ .geanyprj
5
+ Gemfile.lock
6
+ files/*
7
+ pages/*
8
+ pkg/*
9
+ tmp/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in local_unfuddle_notebook.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,17 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec', :cli => '--color', :version => 1 do
5
+ watch(%r{^spec/.+_spec\.rb})
6
+ watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+
9
+ # Rails example
10
+ watch('spec/spec_helper.rb') { "spec" }
11
+ watch('config/routes.rb') { "spec/routing" }
12
+ watch('app/controllers/application_controller.rb') { "spec/controllers" }
13
+ watch(%r{^spec/.+_spec\.rb})
14
+ watch(%r{^app/(.+)\.rb}) { |m| "spec/#{m[1]}_spec.rb" }
15
+ watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
16
+ watch(%r{^app/controllers/(.+)_(controller)\.rb}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
17
+ end
data/README.markdown ADDED
@@ -0,0 +1,27 @@
1
+ > lunbook help
2
+
3
+ Tasks:
4
+ lunbook checkout # Download unfuddle notebook and save locally.
5
+ lunbook help [TASK] # Describe available tasks or one specific task
6
+ lunbook pull # Update the local copy of your unfuddle notebook
7
+ lunbook push # Upload updated pages to your unfuddle notebook
8
+ lunbook status # Check which pages have been updated locally
9
+
10
+
11
+ Usage:
12
+ lunbook checkout
13
+
14
+ Options:
15
+ -p, [--password=PASSWORD] # Unfuddle password (required)
16
+ -s, [--subdomain=SUBDOMAIN] # Unfuddle subdomain (required)
17
+ -u, [--username=USERNAME] # Unfuddle username (required)
18
+ -r, [--project-id=PROJECT_ID] # Unfuddle project id (required)
19
+ -n, [--notebook-id=NOTEBOOK_ID] # Unfuddle notebook id (required)
20
+ -o, [--protocol=PROTOCOL] # http/https (default: http)
21
+
22
+ Usage:
23
+ lunbook push
24
+
25
+ Options:
26
+ -m, [--message=MESSAGE] # Message
27
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/lunbook ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'local_unfuddle_notebook'
3
+
4
+ LocalUnfuddleNotebook::App.start
@@ -0,0 +1,8 @@
1
+ require 'pow'
2
+
3
+ Pow("lib/local_unfuddle_notebook").glob("/**/*").each do |file|
4
+ require file unless file == "lib/local_unfuddle_notebook/version.rb"
5
+ end
6
+
7
+ module LocalUnfuddleNotebook
8
+ end
@@ -0,0 +1,36 @@
1
+ require 'thor'
2
+
3
+ module LocalUnfuddleNotebook
4
+ class App < Thor
5
+ desc "checkout", "Download unfuddle notebook and save locally."
6
+ method_option :subdomain, :aliases => '-s', :desc => "Unfuddle subdomain (required)"
7
+ method_option :username, :aliases => '-u', :desc => "Unfuddle username (required)"
8
+ method_option :password, :aliases => '-p', :desc => "Unfuddle password (required)"
9
+ method_option :project_id, :aliases => '-r', :desc => "Unfuddle project id (required)"
10
+ method_option :notebook_id, :aliases => '-n', :desc => "Unfuddle notebook id (required)"
11
+ method_option :protocol, :aliases => '-o', :desc => "http/https (default: http)"
12
+ def checkout
13
+ Notebook.with_attributes(options).pull
14
+ end
15
+
16
+ desc "pull", "Update the local copy of your unfuddle notebook"
17
+ def pull
18
+ Notebook.local.pull
19
+ end
20
+
21
+ desc "push", "Upload updated pages to your unfuddle notebook"
22
+ method_option :message, :aliases => '-m', :desc => "Message"
23
+ def push
24
+ Notebook.local.push options[:message]
25
+ end
26
+
27
+ desc "status", "Check which pages have been updated locally"
28
+ def status
29
+ puts "Pages changed locally:"
30
+ puts Notebook.local.local_pages.select(&:changed?).map{|page|
31
+ page.local_file.name(true)
32
+ }.sort
33
+ end
34
+ end
35
+ end
36
+
@@ -0,0 +1,110 @@
1
+ require 'crack'
2
+ require 'rest-client'
3
+
4
+ module LocalUnfuddleNotebook
5
+ class Notebook < RestClient::Resource
6
+ class << self
7
+ def attributes_path
8
+ ".local_unfuddle_notebook.yaml"
9
+ end
10
+
11
+ def local
12
+ with_attributes(saved_attributes)
13
+ end
14
+
15
+ def local_pages_path
16
+ "pages"
17
+ end
18
+
19
+ def saved_attributes
20
+ YAML::load(Pow(attributes_path).read) if Pow(attributes_path).file?
21
+ end
22
+
23
+ def with_attributes(attributes)
24
+ attributes[:protocol] ||= 'http'
25
+ url = "#{attributes[:protocol]}://#{attributes[:subdomain]}.unfuddle.com/api/v1/projects/#{attributes[:project_id]}/notebooks/#{attributes[:notebook_id]}"
26
+ Notebook.new(url, attributes[:username], attributes[:password]).tap do |notebook|
27
+ notebook.last_updated_at = attributes[:last_updated_at]
28
+ end
29
+ end
30
+ end
31
+
32
+ attr_accessor :last_updated_at
33
+
34
+ def local_attributes
35
+ {
36
+ :subdomain => subdomain,
37
+ :username => user,
38
+ :password => password,
39
+ :project_id => project_id,
40
+ :notebook_id => notebook_id,
41
+ :last_updated_at => last_updated_at,
42
+ :protocol => protocol
43
+ }
44
+ end
45
+
46
+ def local_pages
47
+ Pow(Notebook.local_pages_path).files.map do |file|
48
+ Page.new(YAML.load(file.read)).tap do |page|
49
+ page.notebook = self
50
+ page.local_file = file
51
+ end
52
+ end
53
+ end
54
+
55
+ def notebook_id
56
+ url.match(%r{notebooks/(\d+)})[1].to_i
57
+ end
58
+
59
+ def project_id
60
+ url.match(%r{projects/(\d+)})[1].to_i
61
+ end
62
+
63
+ def protocol
64
+ url.match(%r{^(\w*)://})[1]
65
+ end
66
+
67
+ def pull
68
+ if Pow(self.class.local_pages_path).exists?
69
+ Pow(self.class.local_pages_path).delete!
70
+ end
71
+
72
+ remote_pages.each do |page|
73
+ page.save
74
+ end
75
+
76
+ self.last_updated_at = Time.now
77
+ self.update_attributes_file
78
+ end
79
+
80
+ def push(message)
81
+ local_pages.select{|page| page.changed?}.each do |page|
82
+ page.message = message
83
+ page.push
84
+ end
85
+
86
+ pull
87
+ end
88
+
89
+ def remote_pages
90
+ Crack::XML.parse(self["pages/unique"].get)['pages'].map do |remote_page_hash|
91
+ page_attributes = remote_page_hash.delete_if{|k, v| ! Page.attributes.include?(k.to_sym) }
92
+ Page.new(page_attributes).tap do |page|
93
+ page.notebook = self
94
+ end
95
+ end
96
+ end
97
+
98
+ def subdomain
99
+ url.match(%r{http.*://(.*)\.unfuddle.com})[1]
100
+ end
101
+
102
+ def update_attributes_file
103
+ Pow(self.class.attributes_path).write local_attributes.to_yaml
104
+ end
105
+
106
+ def url_with_basic_auth(suburl)
107
+ self[suburl].url.sub("#{protocol}://", "#{protocol}://#{user}:#{password}@")
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,44 @@
1
+ require 'valuable'
2
+
3
+ module LocalUnfuddleNotebook
4
+ class Page < Valuable
5
+ has_value :body
6
+ has_value :id
7
+ has_value :notebook
8
+ has_value :local_file
9
+ has_value :message
10
+ has_value :title
11
+
12
+ def basename
13
+ "#{title.gsub(/\W/, '-')}.yaml".downcase
14
+ end
15
+
16
+ def changed?
17
+ notebook.last_updated_at < local_file.mtime
18
+ end
19
+
20
+ def local_attributes
21
+ {
22
+ :body => body,
23
+ :id => id,
24
+ :title => title
25
+ }
26
+ end
27
+
28
+ def push
29
+ notebook["/pages/#{id}"].put :page => remote_attributes
30
+ end
31
+
32
+ def remote_attributes
33
+ {
34
+ :title => title,
35
+ :body => body,
36
+ :message => message
37
+ }
38
+ end
39
+
40
+ def save
41
+ (Pow(Notebook.local_pages_path)/basename).write(local_attributes.to_yaml)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,3 @@
1
+ module LocalUnfuddleNotebook
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "local_unfuddle_notebook/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "local_unfuddle_notebook"
7
+ s.version = LocalUnfuddleNotebook::VERSION
8
+ s.authors = ["George Mendoza"]
9
+ s.email = ["gsmendoza@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = "Download unfuddle notebook and save locally"
12
+ s.description = "Download unfuddle notebook and save locally"
13
+
14
+ s.rubyforge_project = "local_unfuddle_notebook"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_development_dependency "guard", '~> 0.6.2'
22
+ s.add_development_dependency 'guard-rspec', '~> 0.3.1'
23
+ s.add_development_dependency 'guard-rspec', '~> 0.3.1'
24
+ s.add_development_dependency "rspec", '~> 1.3.2'
25
+ s.add_development_dependency 'ruby-debug', '~> 0.10.4'
26
+ s.add_development_dependency 'webmock', '~> 1.6.2'
27
+
28
+ s.add_runtime_dependency "pow", '~> 0.2.3'
29
+ s.add_runtime_dependency "rest-client", '~> 1.6.3'
30
+ s.add_runtime_dependency 'thor', '~> 0.14.6'
31
+ s.add_runtime_dependency "valuable", '~> 0.8.5'
32
+ end
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <pages type="array">
3
+ <page>
4
+ <author-id type="integer">23</author-id>
5
+ <body>Body
6
+ # Head
7
+ code
8
+ </body>
9
+ <body-format>markdown</body-format>
10
+ <id type="integer">268</id>
11
+ <message>This is a message.</message>
12
+ <message-format>markdown</message-format>
13
+ <notebook-id type="integer">11</notebook-id>
14
+ <number type="integer">8</number>
15
+ <title>This is the title.</title>
16
+ <version type="integer">12</version>
17
+ <created-at>2011-10-12T08:29:21Z</created-at>
18
+ <updated-at>2011-10-12T08:29:21Z</updated-at>
19
+ </page>
20
+ </pages>
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ module LocalUnfuddleNotebook
4
+ describe App do
5
+ end
6
+ end
@@ -0,0 +1,278 @@
1
+ require 'spec_helper'
2
+
3
+ module LocalUnfuddleNotebook
4
+ describe Notebook do
5
+ let :last_updated_at do
6
+ Time.now
7
+ end
8
+
9
+ let :attributes do
10
+ {
11
+ :subdomain => 'hmsinc',
12
+ :username => 'gsmendoza',
13
+ :password => '12345678',
14
+ :project_id => 15,
15
+ :notebook_id => 11,
16
+ :last_updated_at => last_updated_at,
17
+ :protocol => 'http'
18
+ }
19
+ end
20
+
21
+ describe "with_attributes(settings)" do
22
+ it "should build a new notebook with the given settings" do
23
+ attributes[:protocol] = 'https'
24
+ notebook = Notebook.with_attributes(attributes)
25
+ notebook.url.should == "https://hmsinc.unfuddle.com/api/v1/projects/15/notebooks/11"
26
+ notebook.user.should == 'gsmendoza'
27
+ notebook.password.should == '12345678'
28
+ notebook.last_updated_at.should == last_updated_at
29
+ notebook.protocol.should == 'https'
30
+ end
31
+
32
+ it "should set the protocol to http by default" do
33
+ notebook = Notebook.with_attributes({})
34
+ notebook.protocol.should == 'http'
35
+ end
36
+ end
37
+
38
+ describe "pull" do
39
+ it "should save the notebook pages in the local pages path" do
40
+ Pow(Notebook.local_pages_path).should_not exist
41
+
42
+ notebook = Notebook.with_attributes(attributes)
43
+
44
+ stub_request(:get, notebook.url_with_basic_auth('pages/unique')).
45
+ to_return(:body => Pow('spec/fixtures/webmock/unique_pages_with_single_page.xml').read)
46
+
47
+ notebook.pull
48
+
49
+ notebook.remote_pages.should have(1).page
50
+ Pow(Notebook.local_pages_path).should exist
51
+ Pow(Notebook.local_pages_path).files.should have(1).file
52
+ end
53
+
54
+ it "should clear the local pages page before downloading the pages from remote" do
55
+ Pow(Notebook.local_pages_path).create_directory do
56
+ Pow("1-title.yaml").create_file
57
+ end
58
+ Pow(Notebook.local_pages_path).files.should have(1).file
59
+
60
+ notebook = Notebook.with_attributes(attributes)
61
+
62
+ no_pages_in_response_body = <<-EOS
63
+ <?xml version="1.0" encoding="UTF-8"?>
64
+ <pages type="array">
65
+ </pages>
66
+ EOS
67
+
68
+ stub_request(:get, notebook.url_with_basic_auth('pages/unique')).
69
+ to_return(:body => no_pages_in_response_body)
70
+
71
+ notebook.pull
72
+
73
+ Pow(Notebook.local_pages_path).should_not exist
74
+ end
75
+
76
+ it "should set the last_updated_at time of the notebook to now" do
77
+ time_now = Time.now
78
+ Time.stub(:now).and_return(time_now)
79
+
80
+ notebook = Notebook.with_attributes(attributes)
81
+ notebook.last_updated_at = nil
82
+
83
+ stub_request(:get, notebook.url_with_basic_auth('pages/unique')).
84
+ to_return(:body => Pow('spec/fixtures/webmock/unique_pages_with_single_page.xml').read)
85
+
86
+ notebook.pull
87
+ notebook.last_updated_at.should == time_now
88
+ end
89
+
90
+ it "should save the local attributes of the notebook" do
91
+ time_now = Time.now
92
+ Time.stub(:now).and_return(time_now)
93
+
94
+ notebook = Notebook.with_attributes(attributes)
95
+
96
+ stub_request(:get, notebook.url_with_basic_auth('pages/unique')).
97
+ to_return(:body => Pow('spec/fixtures/webmock/unique_pages_with_single_page.xml').read)
98
+
99
+ notebook.pull
100
+
101
+ local_attributes = {
102
+ :subdomain => 'hmsinc',
103
+ :username => 'gsmendoza',
104
+ :password => '12345678',
105
+ :project_id => 15,
106
+ :notebook_id => 11,
107
+ :last_updated_at => time_now,
108
+ :protocol => 'http'
109
+ }
110
+
111
+ Pow(Notebook.attributes_path).should be_a_file
112
+ Pow(Notebook.attributes_path).read.should == local_attributes.to_yaml
113
+ end
114
+ end
115
+
116
+ describe "remote_pages" do
117
+ it "should be the pages of the notebook from unfuddle" do
118
+ notebook = Notebook.with_attributes(attributes)
119
+
120
+ response_body = <<-EOS
121
+ <?xml version="1.0" encoding="UTF-8"?>
122
+ <pages type="array">
123
+ <page>
124
+ <author-id type="integer">23</author-id>
125
+ <body>Body
126
+ # Head
127
+ code
128
+ </body>
129
+ <body-format>markdown</body-format>
130
+ <id type="integer">268</id>
131
+ <message>This is a message.</message>
132
+ <message-format>markdown</message-format>
133
+ <notebook-id type="integer">11</notebook-id>
134
+ <number type="integer">8</number>
135
+ <title>This is the title.</title>
136
+ <version type="integer">12</version>
137
+ <created-at>2011-10-12T08:29:21Z</created-at>
138
+ <updated-at>2011-10-12T08:29:21Z</updated-at>
139
+ </page>
140
+ </pages>
141
+ EOS
142
+
143
+ stub_request(:get, notebook.url_with_basic_auth('pages/unique')).
144
+ to_return(:body => response_body)
145
+
146
+ remote_pages = notebook.remote_pages
147
+ remote_pages.should have(1).page
148
+
149
+ page = remote_pages[0]
150
+ page.id.should == 268
151
+ page.title.should == 'This is the title.'
152
+ page.notebook.should == notebook
153
+ end
154
+ end
155
+
156
+ describe "saved_attributes" do
157
+ it "should get the connection settings from the local connection settings file" do
158
+ Pow(Notebook.attributes_path).should_not exist
159
+ Notebook.saved_attributes.should be_nil
160
+
161
+ content = <<-EOS
162
+ --- !map:Thor::CoreExt::HashWithIndifferentAccess
163
+ notebook_id: "11"
164
+ project_id: "15"
165
+ username: gsmendoza
166
+ subdomain: hmsinc
167
+ password: 12345678
168
+ EOS
169
+
170
+ Pow(Notebook.attributes_path).write(content)
171
+
172
+ settings = Notebook.saved_attributes
173
+ settings[:username].should == 'gsmendoza'
174
+ end
175
+ end
176
+
177
+ describe "url_with_basic_auth(suburl)" do
178
+ it "should be add the user and password to the suburl" do
179
+ notebook = Notebook.with_attributes(attributes)
180
+
181
+ notebook.url_with_basic_auth('pages/unique').should ==
182
+ "http://gsmendoza:12345678@hmsinc.unfuddle.com/api/v1/projects/15/notebooks/11/pages/unique"
183
+ end
184
+ end
185
+
186
+ describe "local_attributes" do
187
+ it "should be the attributes of the notebook intended for saving" do
188
+ notebook = Notebook.with_attributes(attributes)
189
+ notebook.last_updated_at = time_now = Time.now
190
+
191
+ notebook.local_attributes.should == {
192
+ :subdomain => 'hmsinc',
193
+ :username => 'gsmendoza',
194
+ :password => '12345678',
195
+ :project_id => 15,
196
+ :notebook_id => 11,
197
+ :last_updated_at => time_now,
198
+ :protocol => 'http'
199
+ }
200
+ end
201
+ end
202
+
203
+ describe "subdomain" do
204
+ it "should come from the url" do
205
+ notebook = Notebook.new("http://sub.domain.unfuddle.com")
206
+ notebook.subdomain.should == "sub.domain"
207
+ end
208
+ end
209
+
210
+ describe "project_id" do
211
+ it "should come from the url" do
212
+ notebook = Notebook.new("http://hmsinc.unfuddle.com/api/v1/projects/15/notebooks/11/pages/unique")
213
+ notebook.project_id.should == 15
214
+ end
215
+ end
216
+
217
+ describe "notebook_id" do
218
+ it "should come from the url" do
219
+ notebook = Notebook.new("http://hmsinc.unfuddle.com/api/v1/projects/15/notebooks/11/pages/unique")
220
+ notebook.notebook_id.should == 11
221
+ end
222
+ end
223
+
224
+ describe "local_pages" do
225
+ it "should be the pages stored locally" do
226
+
227
+ attributes = {
228
+ :id => 1,
229
+ :title => 'This is a title',
230
+ :body => 'This is a body',
231
+ :message => 'This is a message'
232
+ }
233
+ (Pow(Notebook.local_pages_path) / "1-this-is-a-title.yaml").write attributes.to_yaml
234
+
235
+ notebook = Notebook.new("url")
236
+ local_pages = notebook.local_pages
237
+ local_pages.should have(1).page
238
+
239
+ local_page = local_pages.first
240
+
241
+ local_page.id.should == 1
242
+ local_page.notebook.should == notebook
243
+ local_page.local_file.name(true).should == "1-this-is-a-title.yaml"
244
+ local_page.title.should == 'This is a title'
245
+ end
246
+ end
247
+
248
+ describe "push" do
249
+ it "should upload a changed page to unfuddle" do
250
+ page = Page.new
251
+ page.should_receive(:changed?).and_return(true)
252
+ page.should_receive(:message=).with("message")
253
+ page.should_receive(:push)
254
+
255
+ notebook = Notebook.with_attributes(attributes)
256
+ notebook.should_receive(:local_pages).and_return([page])
257
+ notebook.should_receive :pull
258
+ notebook.push 'message'
259
+ end
260
+
261
+ it "should pull afterwards to update the ids and the last_updated_at" do
262
+ Pow(Notebook.local_pages_path).create_directory
263
+
264
+ notebook = Notebook.with_attributes(attributes)
265
+ notebook.should_receive :pull
266
+ notebook.push 'message'
267
+ end
268
+ end
269
+
270
+ describe "protocol" do
271
+ it "should come from the url" do
272
+ notebook = Notebook.new("https://hmsinc.unfuddle.com")
273
+ notebook.protocol.should == 'https'
274
+ end
275
+ end
276
+ end
277
+ end
278
+
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ module LocalUnfuddleNotebook
4
+ describe Page do
5
+ describe "save" do
6
+ it "should save the page in the local pages path" do
7
+ Pow(Notebook.local_pages_path).should_not exist
8
+
9
+ attributes = {
10
+ :id => 1,
11
+ :title => 'This is a title',
12
+ :body => 'This is a body',
13
+ :message => 'This is a message'
14
+ }
15
+
16
+ page = Page.new(attributes)
17
+ page.save
18
+
19
+ page_local_file = (Pow(Notebook.local_pages_path)/page.basename)
20
+ page_local_file.should exist
21
+ page_local_file.read.should == page.local_attributes.to_yaml
22
+ end
23
+ end
24
+
25
+ describe "basename" do
26
+ it "should be the basename of the page's local file" do
27
+ page = Page.new(:id => 1, :title => 'Testing: Title')
28
+ page.basename.should == 'testing--title.yaml'
29
+ end
30
+ end
31
+
32
+ describe "local_attributes" do
33
+ it "should be the attributes of the page that can be saved locally" do
34
+ attributes = {
35
+ :id => 1,
36
+ :title => 'This is a title',
37
+ :body => 'This is a body',
38
+ :message => 'This is a message'
39
+ }
40
+
41
+ page = Page.new(attributes)
42
+ page.local_attributes.should == {
43
+ :id => 1,
44
+ :title => 'This is a title',
45
+ :body => 'This is a body'
46
+ }
47
+ end
48
+ end
49
+
50
+ describe "changed?" do
51
+ it "should be true if the page's local file was updated after the notebook's last pull timestamp" do
52
+ notebook = Notebook.new('')
53
+ notebook.last_updated_at = Time.now
54
+
55
+ file = (Pow(Notebook.local_pages_path) / "1-title.yaml").create
56
+ file.should_receive(:mtime).and_return(notebook.last_updated_at + 60)
57
+
58
+ page = Page.new(:notebook => notebook, :local_file => file)
59
+ page.should be_changed
60
+ end
61
+
62
+ it "should be false if the page's local file is the same as last pull timestamp" do
63
+ notebook = Notebook.new('')
64
+ notebook.last_updated_at = Time.now
65
+
66
+ file = (Pow(Notebook.local_pages_path) / "1-title.yaml").create
67
+ file.should_receive(:mtime).and_return(notebook.last_updated_at)
68
+
69
+ page = Page.new(:notebook => notebook, :local_file => file)
70
+ page.should_not be_changed
71
+ end
72
+ end
73
+
74
+ describe "push" do
75
+ it "should push the page's remote attributes to unfuddle" do
76
+ notebook = Notebook.new('http://test.unfuddle.com')
77
+ stub_request(:put, notebook["pages/1"].url.to_s).to_return(:body => '')
78
+
79
+ page = Page.new(:notebook => notebook, :id => 1)
80
+ page.push
81
+ end
82
+ end
83
+
84
+ describe "remote_attributes" do
85
+ it "should be the attributes that can be put to unfuddle" do
86
+ expected_attributes = {
87
+ :title => 'This is a title',
88
+ :body => 'This is a body',
89
+ :message => 'This is a message'
90
+ }
91
+
92
+ page = Page.new(expected_attributes.merge(:id => 1))
93
+ page.remote_attributes.should == expected_attributes
94
+ end
95
+ end
96
+ end
97
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,19 @@
1
+ require 'local_unfuddle_notebook'
2
+ require 'bundler/setup'
3
+ require 'ruby-debug'
4
+ require 'webmock/rspec'
5
+
6
+ Spec::Runner.configure do |config|
7
+ config.before :each do
8
+ LocalUnfuddleNotebook::Notebook.stub(:local_pages_path).and_return("tmp/pages")
9
+ if Pow(LocalUnfuddleNotebook::Notebook.local_pages_path).exists?
10
+ Pow(LocalUnfuddleNotebook::Notebook.local_pages_path).delete!
11
+ end
12
+
13
+ LocalUnfuddleNotebook::Notebook.stub(:attributes_path).and_return("tmp/local_unfuddle_notebook.yaml")
14
+ if Pow(LocalUnfuddleNotebook::Notebook.attributes_path).exists?
15
+ Pow(LocalUnfuddleNotebook::Notebook.attributes_path).delete
16
+ end
17
+ end
18
+ end
19
+
metadata ADDED
@@ -0,0 +1,242 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: local_unfuddle_notebook
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease:
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
11
+ platform: ruby
12
+ authors:
13
+ - George Mendoza
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-10-31 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: guard
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ - 6
32
+ - 2
33
+ version: 0.6.2
34
+ type: :development
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: guard-rspec
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ hash: 17
45
+ segments:
46
+ - 0
47
+ - 3
48
+ - 1
49
+ version: 0.3.1
50
+ type: :development
51
+ version_requirements: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: guard-rspec
54
+ prerelease: false
55
+ requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ hash: 17
61
+ segments:
62
+ - 0
63
+ - 3
64
+ - 1
65
+ version: 0.3.1
66
+ type: :development
67
+ version_requirements: *id003
68
+ - !ruby/object:Gem::Dependency
69
+ name: rspec
70
+ prerelease: false
71
+ requirement: &id004 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ hash: 31
77
+ segments:
78
+ - 1
79
+ - 3
80
+ - 2
81
+ version: 1.3.2
82
+ type: :development
83
+ version_requirements: *id004
84
+ - !ruby/object:Gem::Dependency
85
+ name: ruby-debug
86
+ prerelease: false
87
+ requirement: &id005 !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ~>
91
+ - !ruby/object:Gem::Version
92
+ hash: 63
93
+ segments:
94
+ - 0
95
+ - 10
96
+ - 4
97
+ version: 0.10.4
98
+ type: :development
99
+ version_requirements: *id005
100
+ - !ruby/object:Gem::Dependency
101
+ name: webmock
102
+ prerelease: false
103
+ requirement: &id006 !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ~>
107
+ - !ruby/object:Gem::Version
108
+ hash: 11
109
+ segments:
110
+ - 1
111
+ - 6
112
+ - 2
113
+ version: 1.6.2
114
+ type: :development
115
+ version_requirements: *id006
116
+ - !ruby/object:Gem::Dependency
117
+ name: pow
118
+ prerelease: false
119
+ requirement: &id007 !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ hash: 17
125
+ segments:
126
+ - 0
127
+ - 2
128
+ - 3
129
+ version: 0.2.3
130
+ type: :runtime
131
+ version_requirements: *id007
132
+ - !ruby/object:Gem::Dependency
133
+ name: rest-client
134
+ prerelease: false
135
+ requirement: &id008 !ruby/object:Gem::Requirement
136
+ none: false
137
+ requirements:
138
+ - - ~>
139
+ - !ruby/object:Gem::Version
140
+ hash: 9
141
+ segments:
142
+ - 1
143
+ - 6
144
+ - 3
145
+ version: 1.6.3
146
+ type: :runtime
147
+ version_requirements: *id008
148
+ - !ruby/object:Gem::Dependency
149
+ name: thor
150
+ prerelease: false
151
+ requirement: &id009 !ruby/object:Gem::Requirement
152
+ none: false
153
+ requirements:
154
+ - - ~>
155
+ - !ruby/object:Gem::Version
156
+ hash: 43
157
+ segments:
158
+ - 0
159
+ - 14
160
+ - 6
161
+ version: 0.14.6
162
+ type: :runtime
163
+ version_requirements: *id009
164
+ - !ruby/object:Gem::Dependency
165
+ name: valuable
166
+ prerelease: false
167
+ requirement: &id010 !ruby/object:Gem::Requirement
168
+ none: false
169
+ requirements:
170
+ - - ~>
171
+ - !ruby/object:Gem::Version
172
+ hash: 53
173
+ segments:
174
+ - 0
175
+ - 8
176
+ - 5
177
+ version: 0.8.5
178
+ type: :runtime
179
+ version_requirements: *id010
180
+ description: Download unfuddle notebook and save locally
181
+ email:
182
+ - gsmendoza@gmail.com
183
+ executables:
184
+ - lunbook
185
+ extensions: []
186
+
187
+ extra_rdoc_files: []
188
+
189
+ files:
190
+ - .gitignore
191
+ - Gemfile
192
+ - Guardfile
193
+ - README.markdown
194
+ - Rakefile
195
+ - bin/lunbook
196
+ - lib/local_unfuddle_notebook.rb
197
+ - lib/local_unfuddle_notebook/app.rb
198
+ - lib/local_unfuddle_notebook/notebook.rb
199
+ - lib/local_unfuddle_notebook/page.rb
200
+ - lib/local_unfuddle_notebook/version.rb
201
+ - local_unfuddle_notebook.gemspec
202
+ - spec/fixtures/webmock/unique_pages_with_single_page.xml
203
+ - spec/lib/local_unfuddle_notebook/app_spec.rb
204
+ - spec/lib/local_unfuddle_notebook/notebook_spec.rb
205
+ - spec/lib/local_unfuddle_notebook/page_spec.rb
206
+ - spec/spec.opts
207
+ - spec/spec_helper.rb
208
+ homepage: ""
209
+ licenses: []
210
+
211
+ post_install_message:
212
+ rdoc_options: []
213
+
214
+ require_paths:
215
+ - lib
216
+ required_ruby_version: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ">="
220
+ - !ruby/object:Gem::Version
221
+ hash: 3
222
+ segments:
223
+ - 0
224
+ version: "0"
225
+ required_rubygems_version: !ruby/object:Gem::Requirement
226
+ none: false
227
+ requirements:
228
+ - - ">="
229
+ - !ruby/object:Gem::Version
230
+ hash: 3
231
+ segments:
232
+ - 0
233
+ version: "0"
234
+ requirements: []
235
+
236
+ rubyforge_project: local_unfuddle_notebook
237
+ rubygems_version: 1.8.10
238
+ signing_key:
239
+ specification_version: 3
240
+ summary: Download unfuddle notebook and save locally
241
+ test_files: []
242
+