easy_basecamp 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +0 -0
- data/easy_basecamp.gemspec +30 -0
- data/lib/basecamp/category.rb +26 -0
- data/lib/basecamp/comment.rb +23 -0
- data/lib/basecamp/company.rb +27 -0
- data/lib/basecamp/file.rb +5 -0
- data/lib/basecamp/message.rb +56 -0
- data/lib/basecamp/milestone.rb +25 -0
- data/lib/basecamp/person.rb +53 -0
- data/lib/basecamp/project.rb +30 -0
- data/lib/basecamp/time_tracker.rb +15 -0
- data/lib/basecamp/todo_list.rb +31 -0
- data/lib/basecamp/todo_list_item.rb +29 -0
- data/lib/basecamp.rb +29 -0
- metadata +95 -0
data/README.textile
ADDED
File without changes
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "easy_basecamp"
|
3
|
+
s.version = "0.0.1"
|
4
|
+
s.email = "g.marcilhacy@gmail.com"
|
5
|
+
s.homepage = "https://github.com/gregorym/easy-basecamp"
|
6
|
+
s.summary = "Ruby wrapper of the Basecamp API"
|
7
|
+
s.has_rdoc = false
|
8
|
+
s.authors = ["Grégory Marcilhacy"]
|
9
|
+
|
10
|
+
s.require_paths = %w[lib]
|
11
|
+
s.add_dependency('activeresource', ">= 3.0.0")
|
12
|
+
|
13
|
+
s.files = %w[
|
14
|
+
easy_basecamp.gemspec
|
15
|
+
README.textile
|
16
|
+
lib/basecamp.rb
|
17
|
+
lib/basecamp/category.rb
|
18
|
+
lib/basecamp/comment.rb
|
19
|
+
lib/basecamp/company.rb
|
20
|
+
lib/basecamp/file.rb
|
21
|
+
lib/basecamp/message.rb
|
22
|
+
lib/basecamp/milestone.rb
|
23
|
+
lib/basecamp/person.rb
|
24
|
+
lib/basecamp/project.rb
|
25
|
+
lib/basecamp/time_tracker.rb
|
26
|
+
lib/basecamp/todo_list.rb
|
27
|
+
lib/basecamp/todo_list_item.rb
|
28
|
+
]
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Basecamp
|
2
|
+
|
3
|
+
# Model format
|
4
|
+
# <category>
|
5
|
+
# <id type="integer">#{id}</id>
|
6
|
+
# <name>#{name}</name>
|
7
|
+
# <project-id type="integer">#{project_id}</project-id>
|
8
|
+
# <elements-count type="integer">#{elements_count}</elements-count>
|
9
|
+
# <type>#{type}</type>
|
10
|
+
# </category>
|
11
|
+
class Category < Base
|
12
|
+
TYPE = [:post, :attchment]
|
13
|
+
|
14
|
+
def self.in_project(project_id, type = nil)
|
15
|
+
params = type.present? ? {:type => type} : {}
|
16
|
+
find(:all, :from => "/projects/#{company_id}/categories.xml", :params => params)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Type is required
|
20
|
+
# TODO
|
21
|
+
def self.create
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Basecamp
|
2
|
+
|
3
|
+
# <comment>
|
4
|
+
# <id type="integer">#{id}</id>
|
5
|
+
# <author-id type="integer">#{author_id}</author-id>
|
6
|
+
# <author-name>#{author_name}</author-name>
|
7
|
+
# <commentable-id type="integer">#{commentable_id}</commentable-id>
|
8
|
+
# <commentable-type>#{commentable_type}</commentable-type>
|
9
|
+
# <body>#{body}</body>
|
10
|
+
# <emailed-from nil="true">#{emailed_from}</emailed-from>
|
11
|
+
# <created-at type="datetime">#{created_at}</created-at>
|
12
|
+
#
|
13
|
+
# <attachments-count type="integer">#{attachments_count}</attachments-count>
|
14
|
+
# <attachments type="array">
|
15
|
+
# <attachment>
|
16
|
+
# ...
|
17
|
+
# </attachment>
|
18
|
+
# ...
|
19
|
+
# </attachments>
|
20
|
+
# </comment>
|
21
|
+
class Comment < Base
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Basecamp
|
2
|
+
|
3
|
+
# Model format
|
4
|
+
# <company>
|
5
|
+
# <id type="integer">#{id}</id>
|
6
|
+
# <name>#{name}</name>
|
7
|
+
# <address-one>#{address_one}</address-one>
|
8
|
+
# <address-two>#{address_two}</address-two>
|
9
|
+
# <city>#{city}</city>
|
10
|
+
# <state>#{state}</state>
|
11
|
+
# <zip>#{zip}</zip>
|
12
|
+
# <country>#{country}</country>
|
13
|
+
# <web-address>#{web_address}</web-address>
|
14
|
+
# <phone-number-office>#{phone_number_office></phone-number-office>
|
15
|
+
# <phone-number-fax>#{phone_number_fax}</phone-number-fax>
|
16
|
+
# <time-zone-id>#{time_zone_id}</time-zone-id>
|
17
|
+
# <can-see-private type="boolean">#{can_see_private}</can-see-private>
|
18
|
+
#
|
19
|
+
# <!-- for non-client companies -->
|
20
|
+
# <url-name>#{url_name}</url-name>
|
21
|
+
# </company>
|
22
|
+
class Company < Base
|
23
|
+
def self.in_project(project_id)
|
24
|
+
find(:all, :from => "/projects/#{project_id}/companies.xml")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Basecamp
|
2
|
+
|
3
|
+
# Model format
|
4
|
+
# <post>
|
5
|
+
# <id type="integer">#{id}</id>
|
6
|
+
# <title>#{title}</title>
|
7
|
+
# <body>#{body}</body>
|
8
|
+
# <display-body>#{display_body}</display-body>
|
9
|
+
# <posted-on type="datetime">#{posted_on}</posted-on>
|
10
|
+
# <commented-at type="datetime">#{commented_at}</commented-at>
|
11
|
+
# <project-id type="integer">#{project_id}</project-id>
|
12
|
+
# <category-id type="integer">#{category_id}</category-id>
|
13
|
+
# <author-id type="integer">#{author_id}</author-id>
|
14
|
+
# <author-name>#{author_name}</author-name>
|
15
|
+
# <milestone-id type="integer">#{milestone_id}</milestone-id>
|
16
|
+
# <comments-count type="integer">#{comments_count}</comments-count>
|
17
|
+
# <use-textile type="boolean">#{use_textile}</use-textile>
|
18
|
+
# <extended-body deprecated="true">#{extended_body}</extended-body>
|
19
|
+
# <display-extended-body deprecated="true">#{display_extended_body}</display-extended-body>
|
20
|
+
#
|
21
|
+
# <attachments-count type="integer">#{attachments_count}</attachments-count>
|
22
|
+
# <attachments type="array">
|
23
|
+
# <attachment>
|
24
|
+
# ...
|
25
|
+
# </attachment>
|
26
|
+
# ...
|
27
|
+
# </attachments>
|
28
|
+
#
|
29
|
+
# <!-- if user can see private posts -->
|
30
|
+
# <private type="boolean">#{private}</private>
|
31
|
+
# </post>
|
32
|
+
class Message < Base
|
33
|
+
self.element_name = "post"
|
34
|
+
|
35
|
+
# Get all messages from a project
|
36
|
+
def self.in_project(project_id)
|
37
|
+
get(:all, :from => "/projects/#{project_id}/posts.xml")
|
38
|
+
end
|
39
|
+
|
40
|
+
# Get all messages a project and a specific category
|
41
|
+
def self.in_project_by_category(project_id, category_id)
|
42
|
+
get(:all, :from => "/projects/#{project_id}/cat/#{category_id}/posts.xml")
|
43
|
+
end
|
44
|
+
|
45
|
+
# Get archived messages from a project
|
46
|
+
def self.archived(project_id)
|
47
|
+
get(:all, :from => "/projects/#{project_id}/posts/archive.xml")
|
48
|
+
end
|
49
|
+
|
50
|
+
# Get archived messages a project and a specific category
|
51
|
+
def self.in_project_by_category(project_id, category_id)
|
52
|
+
get(:all, :from => "/projects/#{project_id}/cat/#{category_id}/posts/archived.xml")
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Basecamp
|
2
|
+
|
3
|
+
# <milestone>
|
4
|
+
# <id type="integer">#{id}</id>
|
5
|
+
# <title>#{title}</title>
|
6
|
+
# <deadline type="date">#{deadline}</deadline>
|
7
|
+
# <completed type="boolean">#{true|false}</completed>
|
8
|
+
# <project-id type="integer">#{project_id}</project-id>
|
9
|
+
# <created-on type="datetime">#{created_on}</created-on>
|
10
|
+
# <creator-id type="integer">#{creator_id}</creator-id>
|
11
|
+
# <creator-name>#{creator_name}</creator-name>
|
12
|
+
# <responsible-party-id type="integer">#{responsible_party_id}</responsible-party-id>
|
13
|
+
# <responsible-party-type>#{responsible_party_type}</responsible-party-type>
|
14
|
+
# <responsible-party-name>#{responsible_party_name}</responsible-party-name>
|
15
|
+
# <commented-at type="datetime">#{commented_at}</commented_at>
|
16
|
+
# <comments-count type="integer">#{comments_count}</comments-count>
|
17
|
+
#
|
18
|
+
# <!-- if the milestone has been completed -->
|
19
|
+
# <completed-on type="datetime">#{completed_on}</completed-on>
|
20
|
+
# <completer-id type="integer">#{completer_id}</completer-id>
|
21
|
+
# <completer-name>#{completer_name}</completer-name>
|
22
|
+
# </milestone>
|
23
|
+
class Milestone < Base
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Basecamp
|
2
|
+
|
3
|
+
# Model format
|
4
|
+
# <person>
|
5
|
+
# <id type="integer">#{id}</id>
|
6
|
+
# <first-name>#{first_name}</first-name>
|
7
|
+
# <last-name>#{last_name}</last-name>
|
8
|
+
# <title>#{title}</title>
|
9
|
+
# <email-address>#{email_address}</email-address}
|
10
|
+
# <im-handle>#{im_handle}</im-handle>
|
11
|
+
# <im-service>#{im_service}</im-service>
|
12
|
+
# <phone-number-office>#{phone_number_office}</phone-number-office>
|
13
|
+
# <phone-number-office-ext>#{phone_number_office_ext}</phone-number-office-ext>
|
14
|
+
# <phone-number-mobile>#{phone_number_mobile}</phone-number-mobile>
|
15
|
+
# <phone-number-home>#{phone_number_home}</phone-number-home>
|
16
|
+
# <phone-number-fax>#{phone_number_fax}</phone-number-fax>
|
17
|
+
# <last-login type="datetime">#{last_login}</last-login>
|
18
|
+
# <company-id type="integer">#{company_id}</company-id>
|
19
|
+
# <client-id type="integer">#{client_id}</client-id>
|
20
|
+
#
|
21
|
+
# <avatar-url>#{avatar_url}</avatar-url>
|
22
|
+
|
23
|
+
# <!-- if user is an administrator, or is self -->
|
24
|
+
# <user-name>#{user_name}</user-name>
|
25
|
+
#
|
26
|
+
# <!-- if user is an administrator -->
|
27
|
+
# <administrator type="boolean">#{administrator}</administrator>
|
28
|
+
# <deleted type="boolean">#{deleted}</deleted>
|
29
|
+
# <has-access-to-new-projects type="boolean">#{has_access_to_new_projects}</has-access-to-new-projects>
|
30
|
+
# </person>
|
31
|
+
class Person < Base
|
32
|
+
|
33
|
+
# Current logged in person
|
34
|
+
def self.me
|
35
|
+
get(:me)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns all people visible to (and including) the requesting user.
|
39
|
+
def self.people
|
40
|
+
find(:all)
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.in_project(project_id)
|
44
|
+
find(:all, :from => "/projects/#{project_id}/people.xml")
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.in_company(company_id)
|
48
|
+
find(:all, :from => "/projects/#{company_id}/people.xml")
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Basecamp
|
2
|
+
|
3
|
+
# Model format
|
4
|
+
# <project>
|
5
|
+
# <id type="integer">#{id}</id>
|
6
|
+
# <name>#{name}</name>
|
7
|
+
# <created-on type="datetime">#{created_on}</created-on>
|
8
|
+
# <status>#{status}</status>
|
9
|
+
# <last-changed-on type="datetiem">#{last_changed_on}</last-changed-on>
|
10
|
+
# <company>
|
11
|
+
# <id type="integer">#{id}</id>
|
12
|
+
# <name>#{name}</name>
|
13
|
+
# </company>
|
14
|
+
#
|
15
|
+
# <!-- if user is administrator, or show_announcement is true -->
|
16
|
+
# <announcement>#{announcement}</announcement>
|
17
|
+
#
|
18
|
+
# <!-- if user is administrator -->
|
19
|
+
# <start-page>#{start_page}</start-page>
|
20
|
+
# <show-writeboards type="boolean">#{show_writeboards}</show-writeboards>
|
21
|
+
# <show-announcement type="boolean">#{show_announcement}</show-announcement>
|
22
|
+
# </project>
|
23
|
+
class Project < Base
|
24
|
+
|
25
|
+
def self.count
|
26
|
+
get(:count)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Basecamp
|
2
|
+
|
3
|
+
# <time-entry>
|
4
|
+
# <id type="integer">#{id}</id>
|
5
|
+
# <project-id type="integer">#{project-id}</project-id>
|
6
|
+
# <person-id type="integer">#{person-id}</person-id>
|
7
|
+
# <date type="date">#{date}</date>
|
8
|
+
# <hours>#{hours}</hours>
|
9
|
+
# <description>#{description}</description>
|
10
|
+
# <todo-item-id type="integer">#{todo-item-id}</todo-item-id>
|
11
|
+
# </time-entry>
|
12
|
+
class TimeTracker < Base
|
13
|
+
self.element_name = "time-entry"
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Basecamp
|
2
|
+
|
3
|
+
# <todo-list>
|
4
|
+
# <id type="integer">#{id}</id>
|
5
|
+
# <name>#{name}</name>
|
6
|
+
# <description>#{description}</description>
|
7
|
+
# <project-id type="integer">#{project_id}</project-id>
|
8
|
+
# <milestone-id type="integer">#{milestone_id}</milestone-id>
|
9
|
+
# <position type="integer">#{position}</position>
|
10
|
+
#
|
11
|
+
# <!-- if user can see private lists -->
|
12
|
+
# <private type="boolean">#{private}</private>
|
13
|
+
#
|
14
|
+
# <!-- if the account supports time tracking -->
|
15
|
+
# <tracked type="boolean">#{tracked}</tracked>
|
16
|
+
#
|
17
|
+
# <!-- if todo-items are included in the response -->
|
18
|
+
# <todo-items type="array">
|
19
|
+
# <todo-item>
|
20
|
+
# ...
|
21
|
+
# </todo-item>
|
22
|
+
# <todo-item>
|
23
|
+
# ...
|
24
|
+
# </todo-item>
|
25
|
+
# ...
|
26
|
+
# </todo-items>
|
27
|
+
# </todo-list>
|
28
|
+
class TodoList < Base
|
29
|
+
self.element_name ="todo-list"
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Basecamp
|
2
|
+
|
3
|
+
# <todo-item>
|
4
|
+
# <id type="integer">#{id}</id>
|
5
|
+
# <todo-list-id type="integer">#{todo_list_id}</todo-list-id>
|
6
|
+
# <content>#{content}</content>
|
7
|
+
# <position type="integer">#{position}</position>
|
8
|
+
# <created-on type="datetime">#{created_on}</created-on>
|
9
|
+
# <creator-id type="integer">#{creator_id}</creator-id>
|
10
|
+
# <creator-name>#{creator_name}</creator-name>
|
11
|
+
# <completed type="boolean">#{completed}</completed>
|
12
|
+
# <updated-at type="datetime">#{updated_at}</updated-at>
|
13
|
+
# <commented-at type="datetime">#{commented_at}</commented-at>
|
14
|
+
# <comments-count type="integer">#{comments_count}</comments-count>
|
15
|
+
#
|
16
|
+
# <!-- if the item has a responsible party -->
|
17
|
+
# <responsible-party-type>#{responsible_party_type}</responsible-party-type>
|
18
|
+
# <responsible-party-id type="integer">#{responsible_party_id}</responsible-party-id>
|
19
|
+
# <responsible-party-name>#{responsible_party_name}</responsible-party-name>
|
20
|
+
#
|
21
|
+
# <!-- if the item has been completed -->
|
22
|
+
# <completed-on type="datetime">#{completed_on}</completed-on>
|
23
|
+
# <completer-id type="integer">#{completer_id}</completer-id>
|
24
|
+
# <completer-name>#{completer_name}</completer-name>
|
25
|
+
# </todo-item>
|
26
|
+
class TodoListItem < Base
|
27
|
+
self.element_name = "todo-item"
|
28
|
+
end
|
29
|
+
end
|
data/lib/basecamp.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "active_resource"
|
3
|
+
|
4
|
+
module Basecamp
|
5
|
+
|
6
|
+
class Base < ActiveResource::Base
|
7
|
+
|
8
|
+
def self.establish_connection!(ssl, subdomain, user, password = 'X')
|
9
|
+
site = ssl ? "https://" : "http://"
|
10
|
+
self.site = [site, app, ".basecamphq.com/"].join
|
11
|
+
self.user = api_key
|
12
|
+
self.password = password
|
13
|
+
self
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
require "basecamp/category.rb"
|
20
|
+
require "basecamp/company.rb"
|
21
|
+
require "basecamp/comment.rb"
|
22
|
+
require "basecamp/file.rb"
|
23
|
+
require "basecamp/message.rb"
|
24
|
+
require "basecamp/milestone.rb"
|
25
|
+
require "basecamp/person.rb"
|
26
|
+
require "basecamp/project.rb"
|
27
|
+
require "basecamp/time_tracker.rb"
|
28
|
+
require "basecamp/todo_list.rb"
|
29
|
+
require "basecamp/todo_list_item.rb"
|
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: easy_basecamp
|
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
|
+
- "Gr\xC3\xA9gory Marcilhacy"
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-05-27 00:00:00 +02: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: 7
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
version: 3.0.0
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
description:
|
38
|
+
email: g.marcilhacy@gmail.com
|
39
|
+
executables: []
|
40
|
+
|
41
|
+
extensions: []
|
42
|
+
|
43
|
+
extra_rdoc_files: []
|
44
|
+
|
45
|
+
files:
|
46
|
+
- easy_basecamp.gemspec
|
47
|
+
- README.textile
|
48
|
+
- lib/basecamp.rb
|
49
|
+
- lib/basecamp/category.rb
|
50
|
+
- lib/basecamp/comment.rb
|
51
|
+
- lib/basecamp/company.rb
|
52
|
+
- lib/basecamp/file.rb
|
53
|
+
- lib/basecamp/message.rb
|
54
|
+
- lib/basecamp/milestone.rb
|
55
|
+
- lib/basecamp/person.rb
|
56
|
+
- lib/basecamp/project.rb
|
57
|
+
- lib/basecamp/time_tracker.rb
|
58
|
+
- lib/basecamp/todo_list.rb
|
59
|
+
- lib/basecamp/todo_list_item.rb
|
60
|
+
has_rdoc: true
|
61
|
+
homepage: https://github.com/gregorym/easy-basecamp
|
62
|
+
licenses: []
|
63
|
+
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_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
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
hash: 3
|
84
|
+
segments:
|
85
|
+
- 0
|
86
|
+
version: "0"
|
87
|
+
requirements: []
|
88
|
+
|
89
|
+
rubyforge_project:
|
90
|
+
rubygems_version: 1.6.2
|
91
|
+
signing_key:
|
92
|
+
specification_version: 3
|
93
|
+
summary: Ruby wrapper of the Basecamp API
|
94
|
+
test_files: []
|
95
|
+
|