basecampx 0.0.3 → 0.0.4

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.
@@ -22,4 +22,6 @@ Gem::Specification.new do |gem|
22
22
  # Dependencies
23
23
  gem.add_runtime_dependency "httparty"
24
24
  gem.add_runtime_dependency "json"
25
+
26
+ gem.add_development_dependency "debugger"
25
27
  end
@@ -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'
@@ -16,17 +16,7 @@ module Basecampx
16
16
  }
17
17
  end
18
18
 
19
- def params
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 projects
48
- self.request "#{account_endpoint}/projects.json"
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 project id
52
- response = HTTParty.get "#{@account_endpoint}/projects/#{id}.json", params
53
- handle response
52
+ def put url, params={}
53
+ params[:method] = :put
54
+ request url, params
54
55
  end
55
56
 
56
- def request url
57
- handle HTTParty.get "#{account_endpoint}/#{url.sub(/^\//, '')}", params
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
@@ -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.update_details args
19
+ self.update_attributes args
17
20
  end
18
21
 
19
- def update_details args
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, :attachments, :creator, :topic_url
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
- resp = Basecampx.request self.url
22
- update_details resp
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, :creator, :assignee, :comments, :subscribers, :attachments
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, :creator, :url, :assigned_todos, :bucket
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
@@ -1,3 +1,3 @@
1
1
  module Basecampx
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
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.3
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-15 00:00:00.000000000 Z
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