basecampx 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/basecampx.gemspec +2 -0
- data/lib/basecampx.rb +6 -0
- data/lib/basecampx/base.rb +39 -18
- data/lib/basecampx/relations.rb +47 -0
- data/lib/basecampx/resource.rb +5 -2
- data/lib/basecampx/resources/attachment.rb +14 -0
- data/lib/basecampx/resources/calendar.rb +30 -0
- data/lib/basecampx/resources/comment.rb +4 -7
- data/lib/basecampx/resources/document.rb +29 -0
- data/lib/basecampx/resources/event.rb +14 -0
- data/lib/basecampx/resources/message.rb +23 -0
- data/lib/basecampx/resources/person.rb +16 -2
- data/lib/basecampx/resources/project.rb +43 -20
- data/lib/basecampx/resources/todo.rb +6 -1
- data/lib/basecampx/resources/todo_list.rb +5 -2
- data/lib/basecampx/resources/topic.rb +14 -0
- data/lib/basecampx/version.rb +1 -1
- metadata +25 -2
data/basecampx.gemspec
CHANGED
data/lib/basecampx.rb
CHANGED
@@ -4,9 +4,15 @@ require 'yaml'
|
|
4
4
|
|
5
5
|
require "basecampx/version"
|
6
6
|
require 'basecampx/base'
|
7
|
+
require 'basecampx/relations'
|
7
8
|
require 'basecampx/resource'
|
9
|
+
require 'basecampx/resources/attachment'
|
10
|
+
require 'basecampx/resources/calendar'
|
8
11
|
require 'basecampx/resources/comment'
|
12
|
+
require 'basecampx/resources/document'
|
13
|
+
require 'basecampx/resources/event'
|
9
14
|
require 'basecampx/resources/person'
|
10
15
|
require 'basecampx/resources/project'
|
11
16
|
require 'basecampx/resources/todo'
|
12
17
|
require 'basecampx/resources/todo_list'
|
18
|
+
require 'basecampx/resources/topic'
|
data/lib/basecampx/base.rb
CHANGED
@@ -16,17 +16,7 @@ module Basecampx
|
|
16
16
|
}
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
{
|
21
|
-
:basic_auth => {
|
22
|
-
:username => @connect_details['username'],
|
23
|
-
:password => @connect_details['password']
|
24
|
-
},
|
25
|
-
:headers => {
|
26
|
-
"User-Agent" => @connect_details['username']
|
27
|
-
}
|
28
|
-
}
|
29
|
-
end
|
19
|
+
|
30
20
|
|
31
21
|
def account_endpoint
|
32
22
|
if @project.nil?
|
@@ -39,22 +29,53 @@ module Basecampx
|
|
39
29
|
def handle response
|
40
30
|
if response.code == 200
|
41
31
|
JSON.parse(response.body)
|
32
|
+
elsif response.code == 204
|
33
|
+
true
|
34
|
+
elsif response.code == 404
|
35
|
+
raise Exception, "API can't find specified URL #{response.request.path}"
|
42
36
|
else
|
43
37
|
raise Exception, response
|
44
38
|
end
|
45
39
|
end
|
46
40
|
|
47
|
-
def
|
48
|
-
|
41
|
+
def request url, params={}
|
42
|
+
url = url.sub /https\:\/\/basecamp\.com\/\d*\/api\/v1/, ''
|
43
|
+
|
44
|
+
handle HTTParty.send(params[:method] || :get, "#{account_endpoint}/#{url.sub(/^\//, '')}", request_credentials )
|
45
|
+
end
|
46
|
+
|
47
|
+
def get url, params={}
|
48
|
+
params[:method] = :get
|
49
|
+
request url, params
|
49
50
|
end
|
50
51
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
52
|
+
def put url, params={}
|
53
|
+
params[:method] = :put
|
54
|
+
request url, params
|
54
55
|
end
|
55
56
|
|
56
|
-
def
|
57
|
-
|
57
|
+
def post url, params={}
|
58
|
+
params[:method] = :post
|
59
|
+
request url, params
|
60
|
+
end
|
61
|
+
|
62
|
+
def delete url, params={}
|
63
|
+
params[:method] = :delete
|
64
|
+
request url, params
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def request_credentials
|
70
|
+
{
|
71
|
+
:basic_auth => {
|
72
|
+
:username => @connect_details['username'],
|
73
|
+
:password => @connect_details['password']
|
74
|
+
},
|
75
|
+
:headers => {
|
76
|
+
"User-Agent" => @connect_details['username']
|
77
|
+
}
|
78
|
+
}
|
58
79
|
end
|
59
80
|
|
60
81
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Basecampx
|
2
|
+
module Relations
|
3
|
+
|
4
|
+
def mount method, klass
|
5
|
+
self.class_eval <<-EOB
|
6
|
+
|
7
|
+
def #{method.to_s}
|
8
|
+
@#{method.to_s}
|
9
|
+
end
|
10
|
+
|
11
|
+
def #{method.to_s}=#{method.to_s}_obj
|
12
|
+
@#{method.to_s} ||= #{klass.to_s.titleize}.new #{method.to_s}_obj
|
13
|
+
end
|
14
|
+
|
15
|
+
EOB
|
16
|
+
end
|
17
|
+
|
18
|
+
def has_one method, klass
|
19
|
+
self.class_eval <<-EOB
|
20
|
+
|
21
|
+
def #{method.to_s}
|
22
|
+
@#{method.to_s}
|
23
|
+
end
|
24
|
+
|
25
|
+
def #{method.to_s}=#{method.to_s}_obj
|
26
|
+
@#{method.to_s} ||= #{klass.to_s.titleize}.new #{method.to_s}_obj
|
27
|
+
end
|
28
|
+
|
29
|
+
EOB
|
30
|
+
end
|
31
|
+
|
32
|
+
def has_many method, klass
|
33
|
+
self.class_eval <<-EOB
|
34
|
+
|
35
|
+
def #{method.to_s}
|
36
|
+
@#{method.to_s}
|
37
|
+
end
|
38
|
+
|
39
|
+
def #{method.to_s}=#{method.to_s}_obj
|
40
|
+
@#{method.to_s} ||= #{klass.to_s.titleize}.parse #{method.to_s}_obj
|
41
|
+
end
|
42
|
+
|
43
|
+
EOB
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
data/lib/basecampx/resource.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
module Basecampx
|
2
2
|
class Resource
|
3
|
+
|
4
|
+
extend Basecampx::Relations
|
5
|
+
|
3
6
|
class << self
|
4
7
|
def parse json
|
5
8
|
output = []
|
@@ -13,10 +16,10 @@ module Basecampx
|
|
13
16
|
end
|
14
17
|
|
15
18
|
def initialize args=[]
|
16
|
-
self.
|
19
|
+
self.update_attributes args
|
17
20
|
end
|
18
21
|
|
19
|
-
def
|
22
|
+
def update_attributes args
|
20
23
|
args.each do |key, value|
|
21
24
|
self.send(key.to_s+'=', value) if self.respond_to?((key.to_s+'=').to_s)
|
22
25
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Basecampx
|
2
|
+
class Attachment < Basecampx::Resource
|
3
|
+
|
4
|
+
attr_accessor :key, :name, :byte_size, :content_type, :created_at, :url, :attachable
|
5
|
+
|
6
|
+
has_one :creator, :person
|
7
|
+
|
8
|
+
# GET /attachments.json
|
9
|
+
def self.all
|
10
|
+
self.parse Basecampx.request "/attachments.json"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Basecampx
|
2
|
+
class Calendar < Basecampx::Resource
|
3
|
+
|
4
|
+
attr_accessor :id, :name, :created_at, :updated_at, :accesses, :calendar_events
|
5
|
+
|
6
|
+
has_one :creator, :person
|
7
|
+
|
8
|
+
def self.find calendar_id
|
9
|
+
self.new Basecampx.request "calendars/#{calendar_id}.json"
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.all
|
13
|
+
self.parse Basecampx.request "calendars.json"
|
14
|
+
end
|
15
|
+
|
16
|
+
def save
|
17
|
+
# PUT /calendars/1.json
|
18
|
+
if self.id
|
19
|
+
params = JSON.parse self.to_json
|
20
|
+
params.delete 'id'
|
21
|
+
|
22
|
+
Basecampx.put "calendars/#{self.id}.json", params
|
23
|
+
else
|
24
|
+
params = JSON.parse self.to_json
|
25
|
+
Basecampx.post "calendars.json", params
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module Basecampx
|
2
2
|
class Comment < Basecampx::Resource
|
3
3
|
|
4
|
-
attr_accessor :id, :content, :created_at, :updated_at, :
|
4
|
+
attr_accessor :id, :content, :created_at, :updated_at, :topic_url
|
5
|
+
|
6
|
+
has_one :creator, :person
|
7
|
+
has_many :attachments, :attachment
|
5
8
|
|
6
9
|
def self.find person_id
|
7
10
|
self.new Basecampx.request "people/#{person_id}.json"
|
@@ -16,11 +19,5 @@ module Basecampx
|
|
16
19
|
TodoList.parse Basecampx.request "people/#{self.id}/assigned_todos.json"
|
17
20
|
end
|
18
21
|
|
19
|
-
def details
|
20
|
-
resp = Basecampx.request self.url
|
21
|
-
update_details resp
|
22
|
-
self
|
23
|
-
end
|
24
|
-
|
25
22
|
end
|
26
23
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# https://github.com/37signals/bcx-api/blob/master/sections/documents.md
|
2
|
+
|
3
|
+
module Basecampx
|
4
|
+
class Document < Basecampx::Resource
|
5
|
+
|
6
|
+
attr_accessor :id, :title, :content, :created_at, :updated_at, :url
|
7
|
+
|
8
|
+
has_one :last_updater, :person
|
9
|
+
has_many :comments, :comment
|
10
|
+
has_many :subscribers, :person
|
11
|
+
|
12
|
+
# GET /documents.json
|
13
|
+
def self.all
|
14
|
+
self.parse Basecampx.request "/documents.json"
|
15
|
+
end
|
16
|
+
|
17
|
+
def details
|
18
|
+
update_details self.url
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def update_details url=nil
|
24
|
+
self.update_attributes Basecampx.request(url || "documents/#{self.id}.json")
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Basecampx
|
2
|
+
class Event < Basecampx::Resource
|
3
|
+
|
4
|
+
attr_accessor :id, :created_at, :updated_at, :summary, :url
|
5
|
+
|
6
|
+
mount :creator, :person
|
7
|
+
mount :bucket, :project
|
8
|
+
|
9
|
+
def self.all since=1.day.ago
|
10
|
+
Event.parse Basecampx.request "events.json?since=#{since.to_time.iso8601}"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Basecampx
|
2
|
+
class Message < Basecampx::Resource
|
3
|
+
|
4
|
+
attr_accessor :id, :subject, :created_at, :updated_at, :content
|
5
|
+
|
6
|
+
has_one :creator, :person
|
7
|
+
has_many :comments, :comment
|
8
|
+
has_many :subscribers, :person
|
9
|
+
|
10
|
+
#def save
|
11
|
+
# if self.id
|
12
|
+
# params = JSON.parse self.to_json
|
13
|
+
# params.delete 'id'
|
14
|
+
#
|
15
|
+
# Basecampx.put "calendars/#{self.id}.json", params
|
16
|
+
# else
|
17
|
+
# params = JSON.parse self.to_json
|
18
|
+
# Basecampx.post "calendars.json", params
|
19
|
+
# end
|
20
|
+
#end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -18,8 +18,22 @@ module Basecampx
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def details
|
21
|
-
|
22
|
-
|
21
|
+
update_details self.url
|
22
|
+
end
|
23
|
+
|
24
|
+
def last_events since=1.day.ago
|
25
|
+
Event.parse Basecampx.request "people/#{self.id}/events.json?since=#{since.to_time.iso8601}"
|
26
|
+
end
|
27
|
+
|
28
|
+
# GET /projects/1/topics.json
|
29
|
+
def topics
|
30
|
+
Topic.parse Basecampx.request "projects/#{self.id}/topics.json"
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def update_details url=nil
|
36
|
+
self.update_attributes Basecampx.request(url || "people/#{self.id}.json")
|
23
37
|
self
|
24
38
|
end
|
25
39
|
|
@@ -11,26 +11,6 @@ module Basecampx
|
|
11
11
|
Project.new Basecampx.request "projects/#{project_id}.json"
|
12
12
|
end
|
13
13
|
|
14
|
-
def initialize args
|
15
|
-
self.update_details args
|
16
|
-
end
|
17
|
-
|
18
|
-
def update_details args
|
19
|
-
args.each do |key, value|
|
20
|
-
self.send(key.to_s+'=', value) if self.respond_to?((key.to_s+'=').to_s)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.parse json
|
25
|
-
output = []
|
26
|
-
|
27
|
-
json.each do |user|
|
28
|
-
output << self.new(user)
|
29
|
-
end
|
30
|
-
|
31
|
-
output
|
32
|
-
end
|
33
|
-
|
34
14
|
# GET /projects/1/todos/1.json will return the specified todo.
|
35
15
|
def todo todo_id
|
36
16
|
Todo.new Basecampx.request "projects/#{self.id}/todos/#{todo_id}.json"
|
@@ -47,5 +27,48 @@ module Basecampx
|
|
47
27
|
TodoList.new Basecampx.request "projects/#{self.id}/todolists/#{todo_list_id}.json"
|
48
28
|
end
|
49
29
|
|
30
|
+
def events since=1.day.ago
|
31
|
+
Event.parse Basecampx.request "/projects/#{self.id}/events.json?since=#{since.to_time.iso8601}"
|
32
|
+
end
|
33
|
+
|
34
|
+
# GET /projects/1/attachments.json
|
35
|
+
def attachments
|
36
|
+
Attachment.parse Basecampx.request "projects/#{self.id}/attachments.json"
|
37
|
+
end
|
38
|
+
|
39
|
+
# GET /projects/1/documents.json
|
40
|
+
def documents
|
41
|
+
Document.parse Basecampx.request "projects/#{self.id}/documents.json"
|
42
|
+
end
|
43
|
+
|
44
|
+
# GET /projects/1/documents/1.json
|
45
|
+
def document document_id
|
46
|
+
Document.new Basecampx.request "projects/#{self.id}/documents/#{document_id}.json"
|
47
|
+
end
|
48
|
+
|
49
|
+
# GET /projects/1/accesses.json
|
50
|
+
def accesses
|
51
|
+
Person.parse Basecampx.request "projects/#{self.id}/accesses.json"
|
52
|
+
end
|
53
|
+
|
54
|
+
# POST /projects/1/accesses.json
|
55
|
+
#def grant_access ids, emails
|
56
|
+
# Basecampx.post "projects/#{self.id}/accesses.json"
|
57
|
+
#end
|
58
|
+
|
59
|
+
# DELETE /projects/1/accesses/1.json
|
60
|
+
def revoke_access person_id
|
61
|
+
if person_id.class.name == 'Basecampx::Person'
|
62
|
+
person_id = person_id.id
|
63
|
+
end
|
64
|
+
|
65
|
+
Basecampx.delete "projects/#{self.id}/accesses/#{person_id}.json"
|
66
|
+
end
|
67
|
+
|
68
|
+
# GET /projects/1/messages/1.json
|
69
|
+
def message message_id
|
70
|
+
Message.parse Basecampx.request "projects/#{self.id}/messages/#{message_id}.json"
|
71
|
+
end
|
72
|
+
|
50
73
|
end
|
51
74
|
end
|
@@ -2,7 +2,12 @@ module Basecampx
|
|
2
2
|
class Todo < Basecampx::Resource
|
3
3
|
|
4
4
|
attr_accessor :id, :todolist_id, :position, :content, :completed, :due_at, :created_at, :updated_at,
|
5
|
-
:comments_count, :
|
5
|
+
:comments_count, :attachments
|
6
|
+
|
7
|
+
has_many :comments, :comment
|
8
|
+
has_many :subscribers, :person
|
9
|
+
has_one :creator, :person
|
10
|
+
has_one :assignee, :person
|
6
11
|
|
7
12
|
def self.find project_id, todo_id
|
8
13
|
Todo.new Basecampx.request "projects/#{project_id}/todos/#{todo_id}.json"
|
@@ -2,7 +2,10 @@ module Basecampx
|
|
2
2
|
class TodoList < Basecampx::Resource
|
3
3
|
|
4
4
|
attr_accessor :id, :name, :description, :created_at, :updated_at, :completed, :position, :remaining_count,
|
5
|
-
:completed_count, :
|
5
|
+
:completed_count, :url, :bucket
|
6
|
+
|
7
|
+
has_one :creator, :person
|
8
|
+
has_many :assigned_todos, :todo
|
6
9
|
|
7
10
|
# GET /todolists.json shows active todolists for all projects.
|
8
11
|
def self.all
|
@@ -19,7 +22,7 @@ module Basecampx
|
|
19
22
|
end
|
20
23
|
|
21
24
|
def todos
|
22
|
-
|
25
|
+
assigned_todos
|
23
26
|
end
|
24
27
|
|
25
28
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Basecampx
|
2
|
+
class Topic < Basecampx::Resource
|
3
|
+
|
4
|
+
attr_accessor :id, :title, :excerpt, :created_at, :updated_at, :attachments, :topicable
|
5
|
+
|
6
|
+
has_one :last_updater, :person
|
7
|
+
|
8
|
+
# GET /topics.json
|
9
|
+
def self.all
|
10
|
+
self.parse Basecampx.request "/topics.json"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
data/lib/basecampx/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: basecampx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-11-
|
13
|
+
date: 2012-11-28 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httparty
|
@@ -44,6 +44,22 @@ dependencies:
|
|
44
44
|
- - ! '>='
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: debugger
|
49
|
+
requirement: !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: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
47
63
|
description: Basecamp new ruby api wrapper
|
48
64
|
email:
|
49
65
|
- ! '"me@antonzaytsev.com"'
|
@@ -59,12 +75,19 @@ files:
|
|
59
75
|
- basecampx.gemspec
|
60
76
|
- lib/basecampx.rb
|
61
77
|
- lib/basecampx/base.rb
|
78
|
+
- lib/basecampx/relations.rb
|
62
79
|
- lib/basecampx/resource.rb
|
80
|
+
- lib/basecampx/resources/attachment.rb
|
81
|
+
- lib/basecampx/resources/calendar.rb
|
63
82
|
- lib/basecampx/resources/comment.rb
|
83
|
+
- lib/basecampx/resources/document.rb
|
84
|
+
- lib/basecampx/resources/event.rb
|
85
|
+
- lib/basecampx/resources/message.rb
|
64
86
|
- lib/basecampx/resources/person.rb
|
65
87
|
- lib/basecampx/resources/project.rb
|
66
88
|
- lib/basecampx/resources/todo.rb
|
67
89
|
- lib/basecampx/resources/todo_list.rb
|
90
|
+
- lib/basecampx/resources/topic.rb
|
68
91
|
- lib/basecampx/version.rb
|
69
92
|
- lib/generators/basecampx/install/install_generator.rb
|
70
93
|
- lib/generators/basecampx/install/templates/basecampx.yaml
|