basecamper 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +4 -0
  3. data/README.md +64 -0
  4. data/Rakefile +17 -0
  5. data/basecamper.gemspec +31 -0
  6. data/features/support/env.rb +37 -0
  7. data/lib/basecamper/connection.rb +25 -0
  8. data/lib/basecamper/resource.rb +64 -0
  9. data/lib/basecamper/resources/attachment.rb +7 -0
  10. data/lib/basecamper/resources/category.rb +7 -0
  11. data/lib/basecamper/resources/comment.rb +7 -0
  12. data/lib/basecamper/resources/company.rb +7 -0
  13. data/lib/basecamper/resources/message.rb +9 -0
  14. data/lib/basecamper/resources/milestone.rb +15 -0
  15. data/lib/basecamper/resources/person.rb +13 -0
  16. data/lib/basecamper/resources/project.rb +7 -0
  17. data/lib/basecamper/resources/time_entry.rb +7 -0
  18. data/lib/basecamper/resources/todo_item.rb +8 -0
  19. data/lib/basecamper/resources/todo_list.rb +8 -0
  20. data/lib/basecamper/version.rb +3 -0
  21. data/lib/basecamper.rb +30 -0
  22. data/spec/basecamper/connection_spec.rb +152 -0
  23. data/spec/basecamper/resource_spec.rb +118 -0
  24. data/spec/basecamper/resources/attachment_spec.rb +14 -0
  25. data/spec/basecamper/resources/category_spec.rb +14 -0
  26. data/spec/basecamper/resources/comment_spec.rb +22 -0
  27. data/spec/basecamper/resources/company_spec.rb +14 -0
  28. data/spec/basecamper/resources/message_spec.rb +21 -0
  29. data/spec/basecamper/resources/milestone_spec.rb +14 -0
  30. data/spec/basecamper/resources/person_spec.rb +26 -0
  31. data/spec/basecamper/resources/project_spec.rb +42 -0
  32. data/spec/basecamper/resources/time_entry_spec.rb +18 -0
  33. data/spec/basecamper/resources/todo_item_spec.rb +20 -0
  34. data/spec/basecamper/resources/todo_list_spec.rb +20 -0
  35. data/spec/basecamper_spec.rb +21 -0
  36. data/spec/fixtures/basecamp.yml.sample +4 -0
  37. data/spec/spec_helper.rb +6 -0
  38. metadata +199 -0
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ *.yml
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in basecamper.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,64 @@
1
+ Basecamper
2
+ ==========
3
+
4
+ Basecamper is a Ruby wrapper to the 37 Signals [Basecamp API](http://developer.37signals.com/basecamp)
5
+
6
+ Installation
7
+ ------------
8
+
9
+ Simply add the gem to your Gemfile
10
+
11
+ gem 'basecamper'
12
+
13
+
14
+ Usage
15
+ -----
16
+
17
+ Configuration:
18
+
19
+ Basecamper.configure do |config|
20
+ config.token = '123abc'
21
+ config.domain = 'dummy.basecamphq.com'
22
+ end
23
+
24
+ Basecamper also enables one to authenticate with one's username and password:
25
+
26
+ Basecamper.configure do |config|
27
+ config.user = '123abc'
28
+ config.password = 'dummy.basecamphq.com'
29
+ end
30
+
31
+ Use SSL?
32
+
33
+ Basecamper.configure {|c| c.use_ssl = true }
34
+
35
+
36
+ That's it. You're done!
37
+
38
+ View your account info:
39
+
40
+ Basecamper.account
41
+
42
+ Return the current user:
43
+
44
+ Basecamper::Person.me
45
+
46
+ Returns resource index:
47
+
48
+ Basecamper::Project.all
49
+ returns: [#<Basecamper::Project:0x266e458 @attributes={"company"=>..}>]
50
+
51
+ Utilize has_many assocations:
52
+
53
+ project = Basecamper::Project.find(:first)
54
+ messages = project.messages
55
+
56
+ Utilize belongs_to associations:
57
+
58
+ message = messages.first
59
+ message.project
60
+
61
+ Add query params.
62
+
63
+ Basecamper::TodoList.all(:params => { :project_id => 1234 })
64
+ Basecamper::TodoList.find(:all, :params => { :project_id => 1234, :responsible_party => 9124 })
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ require 'bundler'
2
+ require 'cucumber/rake/task'
3
+ require 'rspec/core/rake_task'
4
+
5
+ Bundler::GemHelper.install_tasks
6
+
7
+ desc 'Run all specs in spec directory'
8
+ RSpec::Core::RakeTask.new(:spec) do |t|
9
+ t.pattern = "spec/**/*_spec.rb"
10
+ t.rspec_opts = %w(-fd -c)
11
+ end
12
+
13
+ Cucumber::Rake::Task.new(:features) do |t|
14
+ t.cucumber_opts = "features --format pretty"
15
+ end
16
+
17
+ task :default => [:spec, :features]
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "basecamper/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "basecamper"
7
+ s.version = Basecamper::VERSION
8
+ s.authors = ["Ryan Closner"]
9
+ s.email = ["ryan.closner@gmail.com"]
10
+ s.homepage = "http://rubygems.org/gems/basecamper"
11
+ s.summary = %q{Basecamp API Wrapper}
12
+ s.description = %q{Basecamp API Wrapper}
13
+
14
+ s.rubyforge_project = "basecamper"
15
+
16
+ {
17
+ 'activeresource' => '>= 2.3.10',
18
+ }.each {|lib, version| s.add_runtime_dependency lib, version }
19
+
20
+ {
21
+ 'bundler' => '~> 1.0.0',
22
+ 'cucumber' => '~> 0.10.0',
23
+ 'rake' => '~> 0.8.7',
24
+ 'rspec' => '~> 2.5.0',
25
+ }.each {|lib, version| s.add_development_dependency lib, version }
26
+
27
+ s.files = `git ls-files`.split("\n")
28
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
29
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
30
+ s.require_paths = ["lib"]
31
+ end
@@ -0,0 +1,37 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'basecamper'
4
+
5
+ module BasecamperMethods
6
+ def basecamp_user
7
+ basecamp['user']
8
+ end
9
+
10
+ def basecamp_password
11
+ basecamp['password']
12
+ end
13
+
14
+ def basecamp_token
15
+ basecamp['token']
16
+ end
17
+
18
+ def basecamp_domain
19
+ basecamp['domain']
20
+ end
21
+
22
+ def basecamp
23
+ @basecamp ||= YAML::load_file(File.dirname(__FILE__) + "../../spec/fixtures/basecamp.yml")
24
+ end
25
+ end
26
+
27
+
28
+ World(BasecamperMethods)
29
+
30
+ Before do
31
+ Basecamper::Connection.configure do |config|
32
+ config.user = basecamp_user
33
+ config.password = basecamp_password
34
+ config.token = basecamp_token
35
+ config.domain = basecamp_domain
36
+ end
37
+ end
@@ -0,0 +1,25 @@
1
+ module Basecamper
2
+ class Connection
3
+ class << self
4
+
5
+ attr_accessor :token, :use_ssl
6
+ attr_writer :user, :password, :domain
7
+
8
+ def user
9
+ token.present? ? token : @user
10
+ end
11
+
12
+ def password
13
+ token.present? ? 'X' : @password
14
+ end
15
+
16
+ def domain
17
+ !!use_ssl ? "https://#{@domain}" : "http://#{@domain}"
18
+ end
19
+
20
+ def configure(&block)
21
+ yield self
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,64 @@
1
+ module Basecamper
2
+ class Resource < ActiveResource::Base
3
+
4
+ class << self
5
+
6
+ protected
7
+ alias :old_find :find
8
+ public
9
+
10
+ def find(*args)
11
+ self.site = Basecamper::Connection.domain
12
+ self.user = Basecamper::Connection.user
13
+ self.password = Basecamper::Connection.password
14
+
15
+ old_find(*args)
16
+ end
17
+
18
+ def parent_resources(*parents)
19
+ parents.each do |parent|
20
+
21
+ define_method(parent) do
22
+ resource = "Basecamper::#{parent.to_s.classify}".constantize
23
+
24
+ parent_id_key = "#{resource.element_name}_id"
25
+ id_value = attributes[parent_id_key]
26
+
27
+ resource.find(id_value) rescue nil
28
+ end
29
+ end
30
+ end
31
+
32
+ def child_resources(*children)
33
+ children.each do |child|
34
+ define_method(child) do
35
+ resource = "Basecamper::#{child.to_s.singularize.classify}".constantize
36
+
37
+ parent_id_key = "#{self.class.element_name}_id"
38
+ resource.prefix = "/#{self.class.collection_name}/:#{parent_id_key}/"
39
+
40
+ resource.all(:params => { parent_id_key => id }) rescue []
41
+ end
42
+ end
43
+ end
44
+
45
+ def all(*args)
46
+ find(:all, *args)
47
+ end
48
+
49
+ def first(*args)
50
+ find(:first, *args)
51
+ end
52
+
53
+ def last(*args)
54
+ find(:last, *args)
55
+ end
56
+
57
+ def prefix_source
58
+ '/'
59
+ end
60
+
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,7 @@
1
+ module Basecamper
2
+ class Attachment < Resource
3
+
4
+ parent_resources :project
5
+
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Basecamper
2
+ class Category < Resource
3
+
4
+ parent_resources :project
5
+
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Basecamper
2
+ class Comment < Resource
3
+
4
+ parent_resources :message, :milestone, :todo_item
5
+
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Basecamper
2
+ class Company < Resource
3
+
4
+ parent_resources :project
5
+
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module Basecamper
2
+ class Message < Resource
3
+
4
+ self.element_name = 'post'
5
+
6
+ parent_resources :project
7
+
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ module Basecamper
2
+ class Milestone < Resource
3
+
4
+ parent_resources :project
5
+
6
+ class << self
7
+
8
+ def collection_path(prefix_options = {}, query_options = nil)
9
+ prefix_options, query_options = split_options(prefix_options) if query_options.nil?
10
+ "#{prefix(prefix_options)}#{collection_name}/list.#{format.extension}#{query_string(query_options)}"
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Basecamper
2
+ class Person < Resource
3
+
4
+ parent_resources :project, :company
5
+
6
+
7
+ class << self
8
+ def me
9
+ find(:one, :from => '/me.xml')
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ module Basecamper
2
+ class Project < Resource
3
+
4
+ child_resources :attachments, :categories, :companies, :messages, :milestones, :people, :time_entries, :todo_lists
5
+
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Basecamper
2
+ class TimeEntry < Resource
3
+
4
+ parent_resources :project, :todo_item
5
+
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ module Basecamper
2
+ class TodoItem < Resource
3
+
4
+ parent_resources :todo_list
5
+ child_resources :time_entries
6
+
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Basecamper
2
+ class TodoList < Resource
3
+
4
+ parent_resources :project
5
+ child_resources :todo_items
6
+
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ module Basecamper
2
+ VERSION = "0.0.1"
3
+ end
data/lib/basecamper.rb ADDED
@@ -0,0 +1,30 @@
1
+ require "basecamper/version"
2
+
3
+ # Basecamper Utilities
4
+ require "basecamper/connection"
5
+ require "basecamper/resource"
6
+
7
+ # Basecamp Resources
8
+ require "basecamper/resources/attachment"
9
+ require "basecamper/resources/category"
10
+ require "basecamper/resources/comment"
11
+ require "basecamper/resources/company"
12
+ require "basecamper/resources/message"
13
+ require "basecamper/resources/milestone"
14
+ require "basecamper/resources/person"
15
+ require "basecamper/resources/project"
16
+ require "basecamper/resources/time_entry"
17
+ require "basecamper/resources/todo_list"
18
+ require "basecamper/resources/todo_item"
19
+
20
+ module Basecamper
21
+ class << self
22
+ def account
23
+ Resource.find(:one, :from => "/account.xml")
24
+ end
25
+
26
+ def configure(&block)
27
+ Connection.configure(&block)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,152 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe Connection do
5
+
6
+ let(:domain) { 'dummy.basecamphq.com' }
7
+ let(:user) { 'dummy' }
8
+ let(:password) { 'secret' }
9
+ let(:token) { '123456' }
10
+
11
+ subject { Connection }
12
+
13
+ describe ".token=" do
14
+ it "sets @token to the passed value" do
15
+ subject.token = token
16
+ subject.instance_variable_get(:@token).should == token
17
+ end
18
+ end
19
+
20
+ describe ".token" do
21
+ it "returns the value of @token" do
22
+ subject.instance_variable_set(:@token, token)
23
+ subject.token.should == token
24
+ end
25
+ end
26
+
27
+ describe ".use_ssl=" do
28
+ it "sets @use_ssl to the passed value" do
29
+ subject.use_ssl = true
30
+ subject.instance_variable_get(:@use_ssl).should be_true
31
+ end
32
+ end
33
+
34
+
35
+ describe ".use_ssl" do
36
+ it "returns the value of @token" do
37
+ subject.instance_variable_set(:@use_ssl, true)
38
+ subject.use_ssl.should == true
39
+ end
40
+ end
41
+
42
+ describe ".user=" do
43
+ it "sets @user to the passed value" do
44
+ subject.user = user
45
+ subject.instance_variable_get(:@user).should == user
46
+ end
47
+ end
48
+
49
+ describe ".user" do
50
+ before(:each) do
51
+ subject.instance_variable_set(:@user, user)
52
+ end
53
+
54
+ context ".token is present" do
55
+ before(:each) do
56
+ subject.stub(:token).and_return(token)
57
+ end
58
+
59
+ it "returns the token" do
60
+ subject.user.should == token
61
+ end
62
+ end
63
+
64
+ context ".token is not present" do
65
+ before(:each) do
66
+ subject.stub(:token).and_return(nil)
67
+ end
68
+
69
+ it "returns @user" do
70
+ subject.user.should == user
71
+ end
72
+ end
73
+ end
74
+
75
+ describe ".password" do
76
+ before(:each) do
77
+ subject.instance_variable_set(:@password, password)
78
+ end
79
+
80
+ context ".token is present" do
81
+ before(:each) do
82
+ subject.stub(:token).and_return(token)
83
+ end
84
+
85
+ it "returns 'X'" do
86
+ subject.password.should == 'X'
87
+ end
88
+ end
89
+
90
+ context ".token is not present" do
91
+ before(:each) do
92
+ subject.stub(:token).and_return(nil)
93
+ end
94
+
95
+ it "returns @password" do
96
+ subject.password.should == password
97
+ end
98
+ end
99
+ end
100
+
101
+ describe ".domain=" do
102
+ it "sets @domain to the passed value" do
103
+ subject.domain = domain
104
+ subject.instance_variable_get(:@domain).should == domain
105
+ end
106
+ end
107
+
108
+ describe ".domain" do
109
+ before(:each) do
110
+ subject.instance_variable_set(:@domain, domain)
111
+ end
112
+
113
+ context ".use_ssl is nil" do
114
+ before(:each) do
115
+ subject.stub(:use_ssl).and_return(nil)
116
+ end
117
+
118
+ it "returns the domain prepended by 'http://'" do
119
+ subject.domain.should == "http://#{domain}"
120
+ end
121
+ end
122
+
123
+ context ".use_ssl is false" do
124
+ before(:each) do
125
+ subject.stub(:use_ssl).and_return(false)
126
+ end
127
+
128
+ it "returns the domain prepended by 'http://'" do
129
+ subject.domain.should == "http://#{domain}"
130
+ end
131
+ end
132
+
133
+ context ".use_ssl is true" do
134
+ before(:each) do
135
+ subject.stub(:use_ssl).and_return(true)
136
+ end
137
+
138
+ it "returns the domain prepended by 'https://'" do
139
+ subject.domain.should == "https://#{domain}"
140
+ end
141
+ end
142
+ end
143
+
144
+ describe ".configure" do
145
+ it "yields Basecamper::Connection" do
146
+ subject.configure do |config|
147
+ config.should == Basecamper::Connection
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,118 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe Resource do
5
+
6
+ class Foo < Resource
7
+ child_resources :bars
8
+
9
+ def attributes
10
+ {'id' => 123}
11
+ end
12
+ end
13
+
14
+ class Bar < Resource
15
+ parent_resources :foo
16
+
17
+ def attributes
18
+ {'foo_id' => 456}
19
+ end
20
+ end
21
+
22
+ subject { Resource }
23
+
24
+ it "inherits from ActiveResource::Base" do
25
+ subject.new.should be_a(ActiveResource::Base)
26
+ end
27
+
28
+ describe ".parent_resources" do
29
+ context "Bar" do
30
+
31
+ let(:bar_instance) { Bar.new }
32
+
33
+ describe "#foo" do
34
+ it "calls Foo.find with its parent id" do
35
+ Foo.should_receive(:find).with(456)
36
+ bar_instance.foo
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ describe ".child_resources" do
43
+ context "Foo" do
44
+
45
+ let(:foo) { Foo.new }
46
+
47
+ describe "#bars" do
48
+ it "calls Bar.all with its parent id" do
49
+ Bar.should_receive(:all).with(:params => {"foo_id" => 123})
50
+ foo.bars
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ describe ".find" do
57
+
58
+ let(:domain) { 'https://dummy.basecamphq.com' }
59
+ let(:user) { 'dummy' }
60
+ let(:password) { 'secret' }
61
+
62
+ before(:each) do
63
+ Basecamper::Connection.stub(:domain).and_return(domain)
64
+ Basecamper::Connection.stub(:user).and_return(user)
65
+ Basecamper::Connection.stub(:password).and_return(password)
66
+
67
+ subject.stub(:old_find)
68
+ end
69
+
70
+ it "sets the site to Connection.domain" do
71
+ subject.should_receive(:site=).with(domain)
72
+ subject.find
73
+ end
74
+
75
+ it "sets the user to Connection.user" do
76
+ subject.should_receive(:user=).with(user)
77
+ subject.find
78
+ end
79
+
80
+ it "sets the password to Connection.password" do
81
+ subject.should_receive(:password=).with(password)
82
+ subject.find
83
+ end
84
+
85
+ it "calls .old_find" do
86
+ subject.should_receive(:old_find).with(:all, {})
87
+ subject.find(:all, {})
88
+ end
89
+ end
90
+
91
+ describe ".all" do
92
+ it "aliases find(:all)" do
93
+ subject.should_receive(:find).with(:all, {})
94
+ subject.all({})
95
+ end
96
+ end
97
+
98
+ describe ".first" do
99
+ it "aliases find(:first)" do
100
+ subject.should_receive(:find).with(:first, {})
101
+ subject.first({})
102
+ end
103
+ end
104
+
105
+ describe ".last" do
106
+ it "aliases find(:last)" do
107
+ subject.should_receive(:find).with(:last, {})
108
+ subject.last({})
109
+ end
110
+ end
111
+
112
+ describe ".prefix_source" do
113
+ it "equals '/'" do
114
+ subject.prefix_source.should == '/'
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe Attachment do
5
+
6
+ subject { Attachment.new }
7
+
8
+ describe "belongs to" do
9
+ it "project" do
10
+ subject.should respond_to(:project)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe Category do
5
+
6
+ subject { Category.new }
7
+
8
+ describe "belongs to" do
9
+ it "project" do
10
+ subject.should respond_to(:project)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe Comment do
5
+
6
+ subject { Comment.new }
7
+
8
+ describe "belongs to" do
9
+ it "message" do
10
+ subject.should respond_to(:message)
11
+ end
12
+
13
+ it "milestone" do
14
+ subject.should respond_to(:milestone)
15
+ end
16
+
17
+ it "todo_item" do
18
+ subject.should respond_to(:todo_item)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe Company do
5
+
6
+ subject { Company.new }
7
+
8
+ describe "belongs to" do
9
+ it "project" do
10
+ subject.should respond_to(:project)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe Message do
5
+
6
+ subject { Message }
7
+ let(:message) { subject.new}
8
+
9
+ describe ".element_name" do
10
+ it "returns 'post'" do
11
+ subject.element_name.should == 'post'
12
+ end
13
+ end
14
+
15
+ describe "belongs to" do
16
+ it "project" do
17
+ message.should respond_to(:project)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe Milestone do
5
+
6
+ subject { Milestone.new }
7
+
8
+ describe "belongs to" do
9
+ it "project" do
10
+ subject.should respond_to(:project)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe Person do
5
+
6
+ subject { Person }
7
+ let(:person) { subject.new }
8
+
9
+ describe "belongs to" do
10
+ it "project" do
11
+ person.should respond_to(:project)
12
+ end
13
+
14
+ it "company" do
15
+ person.should respond_to(:company)
16
+ end
17
+ end
18
+
19
+ describe ".me" do
20
+ it "returns the current users information" do
21
+ subject.should_receive(:find).with(:one, :from => '/me.xml')
22
+ subject.me
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe Project do
5
+
6
+ subject { Project.new }
7
+
8
+ describe "has_many" do
9
+ it "attachments" do
10
+ subject.should respond_to(:attachments)
11
+ end
12
+
13
+ it "categories" do
14
+ subject.should respond_to(:categories)
15
+ end
16
+
17
+ it "companies" do
18
+ subject.should respond_to(:companies)
19
+ end
20
+
21
+ it "messages" do
22
+ subject.should respond_to(:messages)
23
+ end
24
+
25
+ it "milestones" do
26
+ subject.should respond_to(:milestones)
27
+ end
28
+
29
+ it "people" do
30
+ subject.should respond_to(:people)
31
+ end
32
+
33
+ it "time_entries" do
34
+ subject.should respond_to(:time_entries)
35
+ end
36
+
37
+ it "todo_lists" do
38
+ subject.should respond_to(:todo_lists)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe TimeEntry do
5
+
6
+ subject { TimeEntry.new }
7
+
8
+ describe "belongs to" do
9
+ it "project" do
10
+ subject.should respond_to(:project)
11
+ end
12
+
13
+ it "todo_item" do
14
+ subject.should respond_to(:todo_item)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe TodoItem do
5
+
6
+ subject { TodoItem.new }
7
+
8
+ describe "belongs to" do
9
+ it "todo_list" do
10
+ subject.should respond_to(:todo_list)
11
+ end
12
+ end
13
+
14
+ describe "has many" do
15
+ it "time_entries" do
16
+ subject.should respond_to(:time_entries)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ module Basecamper
4
+ describe TodoList do
5
+
6
+ subject { TodoList.new }
7
+
8
+ describe "belongs to" do
9
+ it "project" do
10
+ subject.should respond_to(:project)
11
+ end
12
+ end
13
+
14
+ describe "has many" do
15
+ it "todo_items" do
16
+ subject.should respond_to(:todo_items)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ describe Basecamper do
4
+
5
+ subject { Basecamper }
6
+
7
+ describe ".account" do
8
+ it "retrieves account information" do
9
+ Basecamper::Resource.should_receive(:find).with(:one, :from => '/account.xml')
10
+ subject.account
11
+ end
12
+ end
13
+
14
+ describe ".configure" do
15
+ it "yields a Basecamper::Connection" do
16
+ Basecamper.configure do |config|
17
+ config.should == Basecamper::Connection
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,4 @@
1
+ user: dummy
2
+ password: secret
3
+ token: 123456
4
+ domain: dummy.basecamphq.com
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'rspec'
4
+ require 'active_resource'
5
+
6
+ require File.expand_path('../../lib/basecamper', __FILE__)
metadata ADDED
@@ -0,0 +1,199 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: basecamper
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Ryan Closner
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-07-14 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: activeresource
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 23
30
+ segments:
31
+ - 2
32
+ - 3
33
+ - 10
34
+ version: 2.3.10
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rake
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 49
46
+ segments:
47
+ - 0
48
+ - 8
49
+ - 7
50
+ version: 0.8.7
51
+ type: :development
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: rspec
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ hash: 27
62
+ segments:
63
+ - 2
64
+ - 5
65
+ - 0
66
+ version: 2.5.0
67
+ type: :development
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ hash: 23
78
+ segments:
79
+ - 1
80
+ - 0
81
+ - 0
82
+ version: 1.0.0
83
+ type: :development
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ name: cucumber
87
+ prerelease: false
88
+ requirement: &id005 !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ hash: 55
94
+ segments:
95
+ - 0
96
+ - 10
97
+ - 0
98
+ version: 0.10.0
99
+ type: :development
100
+ version_requirements: *id005
101
+ description: Basecamp API Wrapper
102
+ email:
103
+ - ryan.closner@gmail.com
104
+ executables: []
105
+
106
+ extensions: []
107
+
108
+ extra_rdoc_files: []
109
+
110
+ files:
111
+ - .gitignore
112
+ - Gemfile
113
+ - README.md
114
+ - Rakefile
115
+ - basecamper.gemspec
116
+ - features/support/env.rb
117
+ - lib/basecamper.rb
118
+ - lib/basecamper/connection.rb
119
+ - lib/basecamper/resource.rb
120
+ - lib/basecamper/resources/attachment.rb
121
+ - lib/basecamper/resources/category.rb
122
+ - lib/basecamper/resources/comment.rb
123
+ - lib/basecamper/resources/company.rb
124
+ - lib/basecamper/resources/message.rb
125
+ - lib/basecamper/resources/milestone.rb
126
+ - lib/basecamper/resources/person.rb
127
+ - lib/basecamper/resources/project.rb
128
+ - lib/basecamper/resources/time_entry.rb
129
+ - lib/basecamper/resources/todo_item.rb
130
+ - lib/basecamper/resources/todo_list.rb
131
+ - lib/basecamper/version.rb
132
+ - spec/basecamper/connection_spec.rb
133
+ - spec/basecamper/resource_spec.rb
134
+ - spec/basecamper/resources/attachment_spec.rb
135
+ - spec/basecamper/resources/category_spec.rb
136
+ - spec/basecamper/resources/comment_spec.rb
137
+ - spec/basecamper/resources/company_spec.rb
138
+ - spec/basecamper/resources/message_spec.rb
139
+ - spec/basecamper/resources/milestone_spec.rb
140
+ - spec/basecamper/resources/person_spec.rb
141
+ - spec/basecamper/resources/project_spec.rb
142
+ - spec/basecamper/resources/time_entry_spec.rb
143
+ - spec/basecamper/resources/todo_item_spec.rb
144
+ - spec/basecamper/resources/todo_list_spec.rb
145
+ - spec/basecamper_spec.rb
146
+ - spec/fixtures/basecamp.yml.sample
147
+ - spec/spec_helper.rb
148
+ has_rdoc: true
149
+ homepage: http://rubygems.org/gems/basecamper
150
+ licenses: []
151
+
152
+ post_install_message:
153
+ rdoc_options: []
154
+
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ hash: 3
163
+ segments:
164
+ - 0
165
+ version: "0"
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ none: false
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ hash: 3
172
+ segments:
173
+ - 0
174
+ version: "0"
175
+ requirements: []
176
+
177
+ rubyforge_project: basecamper
178
+ rubygems_version: 1.6.2
179
+ signing_key:
180
+ specification_version: 3
181
+ summary: Basecamp API Wrapper
182
+ test_files:
183
+ - features/support/env.rb
184
+ - spec/basecamper/connection_spec.rb
185
+ - spec/basecamper/resource_spec.rb
186
+ - spec/basecamper/resources/attachment_spec.rb
187
+ - spec/basecamper/resources/category_spec.rb
188
+ - spec/basecamper/resources/comment_spec.rb
189
+ - spec/basecamper/resources/company_spec.rb
190
+ - spec/basecamper/resources/message_spec.rb
191
+ - spec/basecamper/resources/milestone_spec.rb
192
+ - spec/basecamper/resources/person_spec.rb
193
+ - spec/basecamper/resources/project_spec.rb
194
+ - spec/basecamper/resources/time_entry_spec.rb
195
+ - spec/basecamper/resources/todo_item_spec.rb
196
+ - spec/basecamper/resources/todo_list_spec.rb
197
+ - spec/basecamper_spec.rb
198
+ - spec/fixtures/basecamp.yml.sample
199
+ - spec/spec_helper.rb