greengoose 0.0.1.pre1

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,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in greengoose.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ # GreenGoose
2
+
3
+ Ruby wrapper for the [GreenGoose](http://www.greengoose.com) [API](http://apiwiki.greengoose.com/index.php/REST_API).
4
+
5
+ **WIP:** This gem is still a work in progress. It's not fully functional
6
+ yet.
7
+
8
+ ## Quick Start
9
+
10
+ If using Bundler (recommended), add to Gemfile:
11
+
12
+ ```ruby
13
+ gem 'greengoose'
14
+ ```
15
+
16
+ Create a client object and authenticate with a username and password
17
+ ([signup](http://www.greengoose.com/signup))
18
+
19
+ ```ruby
20
+ client = Greengoose::Client.new
21
+ client.authenticate "username", "password"
22
+ ```
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require "rspec/core/rake_task"
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task :default => :spec
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "greengoose/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "greengoose"
7
+ s.version = GreenGoose::VERSION
8
+ s.authors = ["Andy Lindeman"]
9
+ s.email = ["alindeman@gmail.com"]
10
+ s.homepage = "https://github.com/alindeman/greengoose"
11
+ s.summary = %q{Provides a Ruby interface to the GreenGoose REST API}
12
+ s.description = %q{The GreenGoose API enables developers to build fun applications that interact with the GreenGoose real-world sensor platform
13
+ }
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_development_dependency "rspec", "~>2.7.0"
21
+ s.add_development_dependency "mocha", "~>0.10.0"
22
+ s.add_development_dependency "webmock", "~>1.7.8"
23
+ s.add_development_dependency "pry"
24
+ s.add_development_dependency "rake"
25
+
26
+ s.add_runtime_dependency "faraday", "~>0.7"
27
+ s.add_runtime_dependency "multi_json", "~>1.0"
28
+ end
@@ -0,0 +1,8 @@
1
+ require "faraday"
2
+ require "multi_json"
3
+
4
+ require File.expand_path("greengoose/version", File.dirname(__FILE__))
5
+
6
+ require File.expand_path("greengoose/client", File.dirname(__FILE__))
7
+ require File.expand_path("greengoose/credentials", File.dirname(__FILE__))
8
+ require File.expand_path("greengoose/middleware", File.dirname(__FILE__))
@@ -0,0 +1,47 @@
1
+ module GreenGoose
2
+ # Green Goose API client
3
+ class Client
4
+ extend Forwardable
5
+
6
+ # Defines get, post, etc...
7
+ def_delegators :connection, *Faraday::Connection::METHODS
8
+
9
+ attr_reader :credentials
10
+
11
+ API_URL = "http://api.greengoose.com"
12
+ API_VERSION = 1
13
+
14
+ # Creates a new API client
15
+ def initialize
16
+ end
17
+
18
+ # Authenticates against the API using a username and password
19
+ #
20
+ # @param [String] username API Username
21
+ # @param [String] password API Password
22
+ def authenticate(username, password)
23
+ @credentials = Credentials::Basic.new(username, password)
24
+ @credentials.configure_connection(connection)
25
+
26
+ self
27
+ end
28
+
29
+ private
30
+
31
+ def connection
32
+ @connection ||= Faraday.new api_url,
33
+ :headers => { "User-Agent" => user_agent } do |builder|
34
+ builder.use Middleware::JSON
35
+ builder.adapter ::Faraday.default_adapter
36
+ end
37
+ end
38
+
39
+ def api_url
40
+ "#{API_URL}/v#{API_VERSION}"
41
+ end
42
+
43
+ def user_agent
44
+ "Ruby:GreenGoose:#{VERSION}"
45
+ end
46
+ end
47
+ end
@@ -0,0 +1 @@
1
+ require File.expand_path("credentials/basic", File.dirname(__FILE__))
@@ -0,0 +1,16 @@
1
+ module GreenGoose
2
+ module Credentials
3
+ class Basic
4
+ attr_reader :username, :password
5
+
6
+ def initialize(username, password)
7
+ @username = username
8
+ @password = password
9
+ end
10
+
11
+ def configure_connection(connection)
12
+ connection.basic_auth(username, password)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1 @@
1
+ require File.expand_path("middleware/json", File.dirname(__FILE__))
@@ -0,0 +1,32 @@
1
+ module GreenGoose
2
+ module Middleware
3
+ class JSON < ::Faraday::Request::UrlEncoded
4
+ self.mime_type = "application/json".freeze
5
+
6
+ dependency 'multi_json'
7
+
8
+ def call(env)
9
+ match_content_type(env) do |data|
10
+ env[:body] = ::MultiJson.encode(data)
11
+ end
12
+
13
+ @app.call(env).on_complete do
14
+ env[:body] = parse(env[:body])
15
+ end
16
+ end
17
+
18
+ def parse(body)
19
+ case body
20
+ when ''
21
+ nil
22
+ when 'true'
23
+ true
24
+ when 'false'
25
+ false
26
+ else
27
+ ::MultiJson.decode(body)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ module GreenGoose
2
+ VERSION = "0.0.1.pre1"
3
+ end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ describe GreenGoose::Client do
4
+ it "sets the User Agent as requested by GreenGoose" do
5
+ # http://apiwiki.greengoose.com/index.php/User_Agents
6
+ req = stub_request(:get, "http://api.greengoose.com").with do |req|
7
+ req.headers["User-Agent"] =~ /Ruby:GreenGoose:#{GreenGoose::VERSION}/
8
+ end
9
+
10
+ res = subject.get '/'
11
+ end
12
+
13
+ describe "authentication" do
14
+ context "username and password" do
15
+ before { subject.authenticate("andy", "1234") }
16
+
17
+ it "authenticates against the API with the provided credentials" do
18
+ req = stub_request(:get, "http://andy:1234@api.greengoose.com/")
19
+
20
+ res = subject.get '/'
21
+ req.should have_been_requested
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+
3
+ describe GreenGoose::Credentials::Basic do
4
+ it "accepts and stores a username and password" do
5
+ credentials = described_class.new("andy", "1234")
6
+
7
+ credentials.username.should == "andy"
8
+ credentials.password.should == "1234"
9
+ end
10
+
11
+ describe "#configure_connection" do
12
+ it "configures the Faraday connection to use the credentials" do
13
+ connection = stub
14
+ connection.expects(:basic_auth).with("andy", "1234")
15
+
16
+ credentials = described_class.new("andy", "1234")
17
+ credentials.configure_connection(connection)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,45 @@
1
+ require "spec_helper"
2
+
3
+ describe GreenGoose::Middleware::JSON do
4
+ let(:connection) {
5
+ Faraday.new("http://api.greengoose.com") do |builder|
6
+ builder.use described_class
7
+ builder.adapter Faraday.default_adapter
8
+ end
9
+ }
10
+
11
+ describe "request" do
12
+ it "sends the content type as application/json" do
13
+ req = stub_request(:post, "api.greengoose.com").with do |req|
14
+ req.headers["Content-Type"] == "application/json"
15
+ end
16
+
17
+ res = connection.post "/" do |req|
18
+ req.body = { }
19
+ end
20
+
21
+ req.should have_been_requested
22
+ end
23
+
24
+ it "sends the request body encoded as JSON" do
25
+ req = stub_request(:post, "api.greengoose.com").
26
+ with(:body => "{\"foo\":\"bar\"}")
27
+
28
+ res = connection.post "/" do |req|
29
+ req.body = { :foo => "bar" }
30
+ end
31
+
32
+ req.should have_been_requested
33
+ end
34
+ end
35
+
36
+ describe "response" do
37
+ it "parses the body as JSON" do
38
+ req = stub_request(:get, "api.greengoose.com").
39
+ to_return(:body => "{\"foo\":\"bar\"}")
40
+
41
+ res = connection.get "/"
42
+ res.body.should == { "foo" => "bar" }
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path("../lib/greengoose", File.dirname(__FILE__))
2
+
3
+ require "mocha"
4
+ require "webmock/rspec"
5
+ require "pry"
6
+
7
+ RSpec.configure do |c|
8
+ c.mock_with :mocha
9
+
10
+ c.before(:each) do
11
+ WebMock.enable!
12
+ WebMock.disable_net_connect!
13
+ end
14
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: greengoose
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.pre1
5
+ prerelease: 6
6
+ platform: ruby
7
+ authors:
8
+ - Andy Lindeman
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-12-31 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70322071249240 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.7.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70322071249240
25
+ - !ruby/object:Gem::Dependency
26
+ name: mocha
27
+ requirement: &70322071208960 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 0.10.0
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70322071208960
36
+ - !ruby/object:Gem::Dependency
37
+ name: webmock
38
+ requirement: &70322071208400 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 1.7.8
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70322071208400
47
+ - !ruby/object:Gem::Dependency
48
+ name: pry
49
+ requirement: &70322071207600 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70322071207600
58
+ - !ruby/object:Gem::Dependency
59
+ name: rake
60
+ requirement: &70322071206760 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70322071206760
69
+ - !ruby/object:Gem::Dependency
70
+ name: faraday
71
+ requirement: &70322071205600 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: '0.7'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *70322071205600
80
+ - !ruby/object:Gem::Dependency
81
+ name: multi_json
82
+ requirement: &70322071204560 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: '1.0'
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *70322071204560
91
+ description: ! "The GreenGoose API enables developers to build fun applications that
92
+ interact with the GreenGoose real-world sensor platform\n "
93
+ email:
94
+ - alindeman@gmail.com
95
+ executables: []
96
+ extensions: []
97
+ extra_rdoc_files: []
98
+ files:
99
+ - .gitignore
100
+ - Gemfile
101
+ - README.md
102
+ - Rakefile
103
+ - greengoose.gemspec
104
+ - lib/greengoose.rb
105
+ - lib/greengoose/client.rb
106
+ - lib/greengoose/credentials.rb
107
+ - lib/greengoose/credentials/basic.rb
108
+ - lib/greengoose/middleware.rb
109
+ - lib/greengoose/middleware/json.rb
110
+ - lib/greengoose/version.rb
111
+ - spec/greengoose/client_spec.rb
112
+ - spec/greengoose/credentials/basic_spec.rb
113
+ - spec/greengoose/middleware/json_spec.rb
114
+ - spec/spec_helper.rb
115
+ homepage: https://github.com/alindeman/greengoose
116
+ licenses: []
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ segments:
128
+ - 0
129
+ hash: -1129379011405296523
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
+ none: false
132
+ requirements:
133
+ - - ! '>'
134
+ - !ruby/object:Gem::Version
135
+ version: 1.3.1
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 1.8.10
139
+ signing_key:
140
+ specification_version: 3
141
+ summary: Provides a Ruby interface to the GreenGoose REST API
142
+ test_files:
143
+ - spec/greengoose/client_spec.rb
144
+ - spec/greengoose/credentials/basic_spec.rb
145
+ - spec/greengoose/middleware/json_spec.rb
146
+ - spec/spec_helper.rb