newsfeed 0.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.
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "faraday-stack", "0.1.3"
4
+
5
+ group :development do
6
+ gem "shoulda", ">= 0"
7
+ gem "bundler", "~> 1.0.0"
8
+ gem "jeweler", "~> 1.6.4"
9
+ gem "rcov", ">= 0"
10
+ end
@@ -0,0 +1,30 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ addressable (2.2.6)
5
+ faraday (0.7.4)
6
+ addressable (~> 2.2.6)
7
+ multipart-post (~> 1.1.0)
8
+ rack (< 2, >= 1.1.0)
9
+ faraday-stack (0.1.3)
10
+ faraday (~> 0.6)
11
+ git (1.2.5)
12
+ jeweler (1.6.4)
13
+ bundler (~> 1.0)
14
+ git (>= 1.2.5)
15
+ rake
16
+ multipart-post (1.1.3)
17
+ rack (1.2.3)
18
+ rake (0.9.2)
19
+ rcov (0.9.10)
20
+ shoulda (2.11.3)
21
+
22
+ PLATFORMS
23
+ ruby
24
+
25
+ DEPENDENCIES
26
+ bundler (~> 1.0.0)
27
+ faraday-stack (= 0.1.3)
28
+ jeweler (~> 1.6.4)
29
+ rcov
30
+ shoulda
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Adeel Raza
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,19 @@
1
+ = newsfeed
2
+
3
+ Description goes here.
4
+
5
+ == Contributing to newsfeed
6
+
7
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
8
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
9
+ * Fork the project
10
+ * Start a feature/bugfix branch
11
+ * Commit and push until you are happy with your contribution
12
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
13
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2011 Adeel Raza. See LICENSE.txt for
18
+ further details.
19
+
@@ -0,0 +1,43 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ gem.name = "newsfeed"
17
+ gem.homepage = "http://github.com/adeelraza/newsfeed-rb"
18
+ gem.summary = %Q{Ruby wrapper for Newsfeed Lab. Implements a simple way to add news feeds and activity streams to your apps.}
19
+ gem.description = %Q{Ruby wrapper for Newsfeed Lab. Implements a simple way to add news feeds and activity streams to your apps.}
20
+ gem.email = "adeelr@gmail.com"
21
+ gem.authors = ["Adeel Raza"]
22
+ bundle = Bundler::Definition.build('Gemfile', 'Gemfile.lock', nil)
23
+ bundle.dependencies.each do |dep|
24
+ if dep.groups.include?(:development)
25
+ gem.add_development_dependency(dep.name, dep.requirement.to_s)
26
+ else
27
+ gem.add_dependency(dep.name, dep.requirement.to_s)
28
+ end
29
+ end
30
+ end
31
+ Jeweler::RubygemsDotOrgTasks.new
32
+
33
+ task :default => :test
34
+
35
+ require 'rdoc/task'
36
+ Rake::RDocTask.new do |rdoc|
37
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
38
+
39
+ rdoc.rdoc_dir = 'rdoc'
40
+ rdoc.title = "newsfeed #{version}"
41
+ rdoc.rdoc_files.include('README*')
42
+ rdoc.rdoc_files.include('lib/**/*.rb')
43
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.2
@@ -0,0 +1,21 @@
1
+ require 'faraday_stack'
2
+ require 'uri'
3
+
4
+ directory = File.expand_path(File.dirname(__FILE__))
5
+ require File.join(directory, 'newsfeed', 'client')
6
+
7
+ module Newsfeed
8
+ VERSION = "1.0"
9
+
10
+ def self.setup_connection(url)
11
+ @conn = Faraday::Connection.new(:url => url) do |builder|
12
+ builder.use FaradayStack::ResponseJSON
13
+ yield builder if block_given?
14
+ builder.adapter Faraday.default_adapter
15
+ end
16
+ @uri = URI.parse(url)
17
+ @conn.basic_auth @uri.user,@uri.password
18
+ @conn.headers['User-Agent'] = "Newsfeed-Ruby/#{VERSION}"
19
+ @conn
20
+ end
21
+ end
@@ -0,0 +1,57 @@
1
+ require 'newsfeed/project'
2
+ require 'uri'
3
+
4
+ module Newsfeed
5
+ class Client
6
+ attr_reader :uri
7
+
8
+ def initialize(api_url)
9
+ @uri = api_url
10
+ @conn = Newsfeed.setup_connection(api_url) do |faraday|
11
+ faraday.use ClientResponseHandler
12
+ end
13
+ end
14
+
15
+ def projects(codename = nil)
16
+ if codename.nil?
17
+ list_projects
18
+ else
19
+ get_project(codename)
20
+ end
21
+ end
22
+
23
+ private
24
+ def list_projects
25
+ projects = @conn.get("/projects").body
26
+ projects
27
+ end
28
+
29
+ def get_project(codename)
30
+ raise InvalidArgument, "Name too long. max is 512 bytes and got #{String(codename).bytesize}" unless String(codename).bytesize <= 512
31
+ raise InvalidParameters if codename.blank?
32
+ Project.new("#{@uri}/project/#{codename}")
33
+ end
34
+ end
35
+
36
+ class ClientResponseHandler < Faraday::Response::Middleware
37
+ def on_complete(env)
38
+ case env[:status]
39
+ when 200
40
+ nil
41
+ when 204
42
+ nil
43
+ when 401
44
+ raise InvalidApiKey
45
+ when 402
46
+ raise ProjectNotFound
47
+ else
48
+ raise UnexpectedHTTPException, env[:body]
49
+ end
50
+ end
51
+
52
+ def initialize(app)
53
+ super
54
+ @parser = nil
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,9 @@
1
+ module Newsfeed
2
+ class ProjectAlreadyExists < StandardError; end
3
+ class ProjectNotFound < StandardError; end
4
+ class EntryNotFound < StandardError; end
5
+ class TooManyProjects < StandardError; end
6
+ class InvalidApiKey < StandardError; end
7
+ class InvalidArgument < StandardError; end
8
+ class UnexpectedHTTPException < StandardError; end
9
+ end
@@ -0,0 +1,79 @@
1
+ require 'faraday'
2
+
3
+ module Newsfeed
4
+ class Feed
5
+ def initialize(feed_url)
6
+ params = feed_url.split("/")
7
+ base_name = params[-2]
8
+ feed_id = params[-1]
9
+ @feed_key = "#{base_name}:#{feed_id}"
10
+ raise InvalidArgument , "Paramaters too long. max is 512 bytes and got #{String(@feed_key).bytesize}" unless String(@feed_key).bytesize <= 512
11
+
12
+ @conn = Newsfeed.setup_connection(feed_url) do |faraday|
13
+ faraday.use FeedResponseHandler
14
+ end
15
+ end
16
+
17
+ def fetch(start=0, count=49)
18
+ feed = @conn.get do |req|
19
+ req.url "?start=#{start}&count=#{count}"
20
+ end
21
+ feed.body
22
+ end
23
+
24
+ def push(obj)
25
+ resp = @conn.post do |req|
26
+ req.url ""
27
+ req.body = obj.to_json
28
+ end
29
+
30
+ resp.status
31
+ end
32
+
33
+ def pull(obj)
34
+ resp = @conn.delete do |req|
35
+ req.url ""
36
+ req.body = obj.to_json
37
+ end
38
+
39
+ resp.status
40
+ end
41
+
42
+ def count
43
+ resp = @conn.get do |req|
44
+ req.url "count"
45
+ end
46
+
47
+ resp.body
48
+ end
49
+
50
+ def reset
51
+ resp = @conn.get do |req|
52
+ req.url "reset"
53
+ end
54
+
55
+ resp.status
56
+ end
57
+ end
58
+
59
+ class FeedResponseHandler < Faraday::Response::Middleware
60
+ def on_complete(env)
61
+ case env[:status]
62
+ when 200
63
+ nil # this is the expected code
64
+ when 204
65
+ nil # this is another expected code, for empty responses
66
+ when 401
67
+ raise InvalidApiKey
68
+ when 402
69
+ raise ProjectNotFound
70
+ when 404
71
+ raise EntryNotFound
72
+ when 400
73
+ raise DuplicateEntry
74
+ else
75
+ raise UnexpectedHTTPException, env[:body]
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,56 @@
1
+ require 'newsfeed/exceptions'
2
+ require 'newsfeed/feed'
3
+
4
+ module Newsfeed
5
+ class Project
6
+ def initialize(project_url)
7
+ @uri = project_url
8
+ @conn = Newsfeed.setup_connection(@uri) do |faraday|
9
+ faraday.use ClientResponseHandler
10
+ end
11
+ end
12
+
13
+ def show
14
+ project = @conn.get.body
15
+ project
16
+ end
17
+
18
+ def create(options={})
19
+ response = @conn.post do |req|
20
+ req.url ""
21
+ req.body = options.to_json unless options.length == 0
22
+ end
23
+ case response.status
24
+ when 200
25
+ true
26
+ when 201
27
+ true
28
+ when 403
29
+ raise InvalidParameters
30
+ when 405
31
+ raise ProjectAlreadyExists
32
+ when 409
33
+ raise TooManyProjects
34
+ else
35
+ raise UnexpectedHTTPException, env[:body]
36
+ end
37
+ end
38
+
39
+ def delete
40
+ response = @conn.delete('')
41
+ case response.status
42
+ when 200
43
+ true
44
+ when 201
45
+ true
46
+ when 402
47
+ raise ProjectNotFound
48
+ end
49
+ end
50
+
51
+ def feed(base_name, feed_id)
52
+ feed_url = "#{@uri}/feed/#{base_name}/#{feed_id}"
53
+ Feed.new(feed_url)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,80 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "newsfeed"
8
+ s.version = "0.0.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Adeel Raza"]
12
+ s.date = "2011-08-29"
13
+ s.description = "Ruby wrapper for Newsfeed Lab. Implements a simple way to add news feeds and activity streams to your apps."
14
+ s.email = "adeelr@gmail.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "Gemfile",
22
+ "Gemfile.lock",
23
+ "LICENSE.txt",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "lib/newsfeed.rb",
28
+ "lib/newsfeed/client.rb",
29
+ "lib/newsfeed/exceptions.rb",
30
+ "lib/newsfeed/feed.rb",
31
+ "lib/newsfeed/project.rb",
32
+ "newsfeed.gemspec",
33
+ "test/helper.rb",
34
+ "test/test_newsfeed.rb"
35
+ ]
36
+ s.homepage = "http://github.com/adeelraza/newsfeed-rb"
37
+ s.require_paths = ["lib"]
38
+ s.rubygems_version = "1.8.10"
39
+ s.summary = "Ruby wrapper for Newsfeed Lab. Implements a simple way to add news feeds and activity streams to your apps."
40
+
41
+ if s.respond_to? :specification_version then
42
+ s.specification_version = 3
43
+
44
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
45
+ s.add_runtime_dependency(%q<faraday-stack>, ["= 0.1.3"])
46
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
47
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
48
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
49
+ s.add_development_dependency(%q<rcov>, [">= 0"])
50
+ s.add_runtime_dependency(%q<faraday-stack>, ["= 0.1.3"])
51
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
52
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
53
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
54
+ s.add_development_dependency(%q<rcov>, [">= 0"])
55
+ else
56
+ s.add_dependency(%q<faraday-stack>, ["= 0.1.3"])
57
+ s.add_dependency(%q<shoulda>, [">= 0"])
58
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
59
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
60
+ s.add_dependency(%q<rcov>, [">= 0"])
61
+ s.add_dependency(%q<faraday-stack>, ["= 0.1.3"])
62
+ s.add_dependency(%q<shoulda>, [">= 0"])
63
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
64
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
65
+ s.add_dependency(%q<rcov>, [">= 0"])
66
+ end
67
+ else
68
+ s.add_dependency(%q<faraday-stack>, ["= 0.1.3"])
69
+ s.add_dependency(%q<shoulda>, [">= 0"])
70
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
71
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
72
+ s.add_dependency(%q<rcov>, [">= 0"])
73
+ s.add_dependency(%q<faraday-stack>, ["= 0.1.3"])
74
+ s.add_dependency(%q<shoulda>, [">= 0"])
75
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
76
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
77
+ s.add_dependency(%q<rcov>, [">= 0"])
78
+ end
79
+ end
80
+
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'newsfeed'
16
+
17
+ class Test::Unit::TestCase
18
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestNewsfeed < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,181 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: newsfeed
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.2
6
+ platform: ruby
7
+ authors:
8
+ - Adeel Raza
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-08-29 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: faraday-stack
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - "="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.1.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: shoulda
28
+ requirement: &id002 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: bundler
39
+ requirement: &id003 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ version: 1.0.0
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *id003
48
+ - !ruby/object:Gem::Dependency
49
+ name: jeweler
50
+ requirement: &id004 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: 1.6.4
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *id004
59
+ - !ruby/object:Gem::Dependency
60
+ name: rcov
61
+ requirement: &id005 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *id005
70
+ - !ruby/object:Gem::Dependency
71
+ name: faraday-stack
72
+ requirement: &id006 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - "="
76
+ - !ruby/object:Gem::Version
77
+ version: 0.1.3
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: *id006
81
+ - !ruby/object:Gem::Dependency
82
+ name: shoulda
83
+ requirement: &id007 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: "0"
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: *id007
92
+ - !ruby/object:Gem::Dependency
93
+ name: bundler
94
+ requirement: &id008 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ~>
98
+ - !ruby/object:Gem::Version
99
+ version: 1.0.0
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: *id008
103
+ - !ruby/object:Gem::Dependency
104
+ name: jeweler
105
+ requirement: &id009 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 1.6.4
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *id009
114
+ - !ruby/object:Gem::Dependency
115
+ name: rcov
116
+ requirement: &id010 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: "0"
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *id010
125
+ description: Ruby wrapper for Newsfeed Lab. Implements a simple way to add news feeds and activity streams to your apps.
126
+ email: adeelr@gmail.com
127
+ executables: []
128
+
129
+ extensions: []
130
+
131
+ extra_rdoc_files:
132
+ - LICENSE.txt
133
+ - README.rdoc
134
+ files:
135
+ - .document
136
+ - Gemfile
137
+ - Gemfile.lock
138
+ - LICENSE.txt
139
+ - README.rdoc
140
+ - Rakefile
141
+ - VERSION
142
+ - lib/newsfeed.rb
143
+ - lib/newsfeed/client.rb
144
+ - lib/newsfeed/exceptions.rb
145
+ - lib/newsfeed/feed.rb
146
+ - lib/newsfeed/project.rb
147
+ - newsfeed.gemspec
148
+ - test/helper.rb
149
+ - test/test_newsfeed.rb
150
+ homepage: http://github.com/adeelraza/newsfeed-rb
151
+ licenses: []
152
+
153
+ post_install_message:
154
+ rdoc_options: []
155
+
156
+ require_paths:
157
+ - lib
158
+ required_ruby_version: !ruby/object:Gem::Requirement
159
+ none: false
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ hash: -3994240186905592635
164
+ segments:
165
+ - 0
166
+ version: "0"
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ none: false
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: "0"
173
+ requirements: []
174
+
175
+ rubyforge_project:
176
+ rubygems_version: 1.8.10
177
+ signing_key:
178
+ specification_version: 3
179
+ summary: Ruby wrapper for Newsfeed Lab. Implements a simple way to add news feeds and activity streams to your apps.
180
+ test_files: []
181
+