instapush 0.1.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.
@@ -0,0 +1,27 @@
1
+ InstaPush
2
+ =========
3
+
4
+ Add URLs to Instapaper.
5
+
6
+ Installation
7
+ ------------
8
+
9
+ gem install instapush
10
+
11
+ Usage
12
+ -----
13
+
14
+ # Connect to Instapaper and add "http://kimjoar.net" to the user "kjbekkelund@gmail.com"
15
+ # The password is optional and can be omitted when you don't have a password
16
+ # on Instapaper.
17
+ InstaPush.connect "kjbekkelund@gmail.com", "password" do
18
+ add "http://kimjoar.net"
19
+ end
20
+
21
+ # Similarly you can use:
22
+ conn = InstaPush.connect "kjbekkelund@gmail.com", "password"
23
+ conn.add "http://kimjoar.net"
24
+
25
+ # Just authenticate with Instapaper. Calling this before adding pages is
26
+ # not necessary.
27
+ InstaPush.authenticate "kjbekkelund@gmail.com", "password"
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "instapush"
8
+ gem.summary = "Ruby wrapper for the Instapaper API."
9
+ gem.description = "Ruby wrapper for the Instapaper API."
10
+ gem.email = "kjbekkelund@gmail.com"
11
+ gem.homepage = "http://github.com/kjbekkelund/instapush"
12
+ gem.author = "Kim Joar Bekkelund"
13
+ gem.add_development_dependency "rest_client", ">= 1"
14
+ end
15
+ Jeweler::GemcutterTasks.new
16
+ rescue LoadError
17
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
18
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,50 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{instapush}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Kim Joar Bekkelund"]
12
+ s.date = %q{2010-07-27}
13
+ s.description = %q{Ruby wrapper for the Instapaper API.}
14
+ s.email = %q{kjbekkelund@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "README.md"
17
+ ]
18
+ s.files = [
19
+ "README.md",
20
+ "Rakefile",
21
+ "VERSION",
22
+ "instapush.gemspec",
23
+ "lib/instapush.rb",
24
+ "spec/instapush_spec.rb",
25
+ "spec/spec_helper.rb"
26
+ ]
27
+ s.homepage = %q{http://github.com/kjbekkelund/instapush}
28
+ s.rdoc_options = ["--charset=UTF-8"]
29
+ s.require_paths = ["lib"]
30
+ s.rubygems_version = %q{1.3.7}
31
+ s.summary = %q{Ruby wrapper for the Instapaper API.}
32
+ s.test_files = [
33
+ "spec/instapush_spec.rb",
34
+ "spec/spec_helper.rb"
35
+ ]
36
+
37
+ if s.respond_to? :specification_version then
38
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
39
+ s.specification_version = 3
40
+
41
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
42
+ s.add_development_dependency(%q<rest_client>, [">= 1"])
43
+ else
44
+ s.add_dependency(%q<rest_client>, [">= 1"])
45
+ end
46
+ else
47
+ s.add_dependency(%q<rest_client>, [">= 1"])
48
+ end
49
+ end
50
+
@@ -0,0 +1,61 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'rest_client'
4
+
5
+ class InstaPush
6
+ class AuthFailedError < StandardError; end
7
+
8
+ class << self
9
+ def connect(username, password = nil, &block)
10
+ conn = new username, password
11
+
12
+ if block_given?
13
+ conn.instance_eval(&block)
14
+ else
15
+ conn
16
+ end
17
+ end
18
+
19
+ def authenticate(username, password = nil)
20
+ conn = connect(username, password)
21
+ raise AuthFailedError unless conn.authenticate
22
+ end
23
+ end
24
+
25
+ attr_reader :username, :password, :api_url
26
+
27
+ def initialize(username, password)
28
+ @username = username
29
+ @password = password
30
+ @api_url = "https://www.instapaper.com/api/"
31
+ end
32
+
33
+ def authenticate
34
+ RestClient.post authenticate_url,
35
+ :username => username,
36
+ :password => password
37
+ rescue RestClient::RequestFailed
38
+ errors << $!
39
+ false
40
+ end
41
+
42
+ def add(url, opts = {})
43
+ opts.merge! :url => url,
44
+ :username => username,
45
+ :password => password
46
+
47
+ RestClient.post add_url, opts
48
+ rescue RestClient::RequestFailed
49
+ errors << $!
50
+ false
51
+ end
52
+
53
+ def errors
54
+ @errors ||= []
55
+ end
56
+
57
+ def method_missing(sym)
58
+ raise NoMethodError unless sym.to_s.include? '_url'
59
+ api_url + sym.to_s.chomp('_url')
60
+ end
61
+ end
@@ -0,0 +1,89 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ RSpec::Mocks::setup(RestClient)
4
+
5
+ describe InstaPush do
6
+ before do
7
+ RestClient.stub!(:post).with("https://www.instapaper.com/api/authenticate", hash_including(:username => 'not_working@gmail.com')).and_raise(RestClient::Forbidden)
8
+ RestClient.stub!(:post).with("https://www.instapaper.com/api/authenticate", hash_including(:username => 'kjbekkelund@gmail.com')).and_return("200")
9
+ end
10
+
11
+ describe ".connect" do
12
+ it "should yield an instance of InstaPush if a block is given" do
13
+ yielded = nil
14
+ InstaPush.connect("kjbekkelund@gmail.com") { yielded = self }
15
+ yielded.should be_kind_of(InstaPush)
16
+ end
17
+
18
+ it "should return an instance of InstaPush if a block is not given" do
19
+ conn = InstaPush.connect "kjbekkelund@gmail.com"
20
+ conn.should be_kind_of(InstaPush)
21
+ end
22
+ end
23
+
24
+ describe ".authenticate" do
25
+ it "should raise an exception when it fails" do
26
+ lambda { InstaPush.authenticate("not_working@gmail.com") }.should raise_error(InstaPush::AuthFailedError)
27
+ end
28
+ end
29
+
30
+ describe "#errors" do
31
+ it "should include an error when an api method has failed" do
32
+ InstaPush.connect "not_working@gmail.com" do
33
+ authenticate
34
+ errors.length.should == 1
35
+ end
36
+ end
37
+
38
+ it "should include the exception raised" do
39
+ InstaPush.connect "not_working@gmail.com" do
40
+ authenticate
41
+ errors.first.to_s.should == "Forbidden"
42
+ end
43
+ end
44
+ end
45
+
46
+ context "a connected user" do
47
+ before do
48
+ @conn = InstaPush.connect "kjbekkelund@gmail.com"
49
+ end
50
+
51
+ describe "#authenticate" do
52
+ it "should return a status code of 200 if the authentication is successful" do
53
+ @conn.authenticate.should == "200"
54
+ end
55
+
56
+ it "should return false if the authentication was unsuccessful" do
57
+ @conn = InstaPush.connect "not_working@gmail.com"
58
+ @conn.authenticate.should be_false
59
+ end
60
+ end
61
+
62
+ describe "#add" do
63
+ it "should post the url to Instapaper" do
64
+ RestClient.should_receive(:post).once.with("https://www.instapaper.com/api/add", hash_including(:url => "http://kimjoar.net"))
65
+ @conn.add "http://kimjoar.net"
66
+ end
67
+
68
+ it "should include additional parameters in the call to Instapaper" do
69
+ RestClient.should_receive(:post).once.with("https://www.instapaper.com/api/add", hash_including(:title=>"Kim Joar", :selection=>"description"))
70
+ @conn.add "http://kimjoar.net", :title => "Kim Joar", :selection => "description"
71
+ end
72
+
73
+ it "should return a response code of 201 when successful" do
74
+ RestClient.should_receive(:post).once.with("https://www.instapaper.com/api/add", hash_including(:title=>"Kim Joar", :selection=>"description")).and_return("201")
75
+ @conn.add("http://kimjoar.net", :title => "Kim Joar", :selection => "description").should == "201"
76
+ end
77
+ end
78
+
79
+ describe "#method_missing" do
80
+ it "should return the extended api url if the input ends with _url" do
81
+ @conn.add_url.should == "https://www.instapaper.com/api/add"
82
+ end
83
+
84
+ it "should raise a no method error if the method does not exist and the input does not end with _url" do
85
+ lambda { @conn.method_that_dont_exist }.should raise_error(NoMethodError)
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,2 @@
1
+ require 'rspec'
2
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'instapush')
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: instapush
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Kim Joar Bekkelund
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-07-27 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rest_client
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 1
30
+ segments:
31
+ - 1
32
+ version: "1"
33
+ type: :development
34
+ version_requirements: *id001
35
+ description: Ruby wrapper for the Instapaper API.
36
+ email: kjbekkelund@gmail.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - README.md
43
+ files:
44
+ - README.md
45
+ - Rakefile
46
+ - VERSION
47
+ - instapush.gemspec
48
+ - lib/instapush.rb
49
+ - spec/instapush_spec.rb
50
+ - spec/spec_helper.rb
51
+ has_rdoc: true
52
+ homepage: http://github.com/kjbekkelund/instapush
53
+ licenses: []
54
+
55
+ post_install_message:
56
+ rdoc_options:
57
+ - --charset=UTF-8
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ hash: 3
66
+ segments:
67
+ - 0
68
+ version: "0"
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ hash: 3
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ requirements: []
79
+
80
+ rubyforge_project:
81
+ rubygems_version: 1.3.7
82
+ signing_key:
83
+ specification_version: 3
84
+ summary: Ruby wrapper for the Instapaper API.
85
+ test_files:
86
+ - spec/instapush_spec.rb
87
+ - spec/spec_helper.rb