helpscout 0.0.3.alpha

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.
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "http://rubygems.org"
2
+
3
+ group :development do
4
+ gem "bundler", "~> 1.1.3"
5
+ gem "jeweler", "~> 1.8.4"
6
+ gem "httparty"
7
+ gem 'simplecov', :require => false
8
+ gem "reek", "~> 1.2.8"
9
+ gem "rdoc"
10
+ end
11
+
12
+ gem "httparty"
data/README.markdown ADDED
@@ -0,0 +1,40 @@
1
+ # Helpscout Developers API gem
2
+
3
+ This gem is in alpha.
4
+
5
+ ## Usage
6
+
7
+ 1. Follow the instructions at [Help Scout's Developers site](http://developer.helpscout.net/) to generate an API key.
8
+
9
+ 2. Initialize your HelpScout client
10
+
11
+ ```ruby
12
+ HelpScout::Base.load!(HELPSCOUT_API_KEY)
13
+ ```
14
+
15
+ #### Fetching Users
16
+
17
+ ```ruby
18
+ users = HelpScout::Base.users
19
+ ```
20
+
21
+ #### Fetching Mailboxes
22
+
23
+ ```ruby
24
+ mailboxes = HelpScout::Base.mailboxes
25
+ ```
26
+
27
+ #### Fetching Customers
28
+
29
+ ```ruby
30
+ customers = HelpScout::Base.customers
31
+ ```
32
+
33
+ #### Fetching Conversations
34
+
35
+ To fetch active conversations:
36
+
37
+ ```ruby
38
+ conversations = HelpScout::Base.conversations(mailboxId, "active", nil)
39
+ ```
40
+
data/Rakefile ADDED
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ require 'base64'
6
+ require 'simplecov'
7
+ begin
8
+ Bundler.setup(:default, :development)
9
+ rescue Bundler::BundlerError => e
10
+ $stderr.puts e.message
11
+ $stderr.puts "Run `bundle install` to install missing gems"
12
+ exit e.status_code
13
+ end
14
+ require 'rake'
15
+
16
+ require 'jeweler'
17
+ Jeweler::Tasks.new do |gem|
18
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
19
+ gem.name = "helpscout"
20
+ gem.homepage = "http://github.com/hramos/helpscout"
21
+ gem.license = "MIT"
22
+ gem.summary = %Q{HelpScout API Wrapper}
23
+ gem.description = %Q{}
24
+ gem.email = Base64.decode64("aGVjdG9yQGhlY3RvcnJhbW9zLmNvbQ==\n")
25
+ gem.authors = ["Héctor Ramos"]
26
+ # dependencies defined in Gemfile
27
+ end
28
+ Jeweler::RubygemsDotOrgTasks.new
29
+
30
+ require 'rake/testtask'
31
+ Rake::TestTask.new(:test) do |test|
32
+ test.libs << 'lib' << 'test'
33
+ test.pattern = 'test/**/test_*.rb'
34
+ test.verbose = true
35
+ end
36
+
37
+ SimpleCov.start
38
+
39
+ require 'reek/rake/task'
40
+ Reek::Rake::Task.new do |t|
41
+ t.fail_on_error = true
42
+ t.verbose = false
43
+ t.source_files = 'lib/**/*.rb'
44
+ end
45
+
46
+ task :default => :test
47
+
48
+ require 'rdoc/task'
49
+ RDoc::Task.new do |rdoc|
50
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
51
+
52
+ rdoc.rdoc_dir = 'rdoc'
53
+ rdoc.title = "helpscout #{version}"
54
+ rdoc.rdoc_files.include('README*')
55
+ rdoc.rdoc_files.include('lib/**/*.rb')
56
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.3.alpha
data/helpscout.gemspec ADDED
@@ -0,0 +1,64 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "helpscout"
8
+ s.version = "0.0.3.alpha"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["H\u{e9}ctor Ramos"]
12
+ s.date = "2012-08-14"
13
+ s.description = ""
14
+ s.email = "hector@hectorramos.com"
15
+ s.extra_rdoc_files = [
16
+ "README.markdown"
17
+ ]
18
+ s.files = [
19
+ "Gemfile",
20
+ "README.markdown",
21
+ "Rakefile",
22
+ "VERSION",
23
+ "helpscout.gemspec",
24
+ "lib/helpscout.rb",
25
+ "lib/helpscout/base.rb",
26
+ "lib/helpscout/models.rb"
27
+ ]
28
+ s.homepage = "http://github.com/hramos/helpscout"
29
+ s.licenses = ["MIT"]
30
+ s.require_paths = ["lib"]
31
+ s.rubygems_version = "1.8.24"
32
+ s.summary = "HelpScout API Wrapper"
33
+
34
+ if s.respond_to? :specification_version then
35
+ s.specification_version = 3
36
+
37
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
38
+ s.add_runtime_dependency(%q<httparty>, [">= 0"])
39
+ s.add_development_dependency(%q<bundler>, ["~> 1.1.3"])
40
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
41
+ s.add_development_dependency(%q<httparty>, [">= 0"])
42
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
43
+ s.add_development_dependency(%q<reek>, ["~> 1.2.8"])
44
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
45
+ else
46
+ s.add_dependency(%q<httparty>, [">= 0"])
47
+ s.add_dependency(%q<bundler>, ["~> 1.1.3"])
48
+ s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
49
+ s.add_dependency(%q<httparty>, [">= 0"])
50
+ s.add_dependency(%q<simplecov>, [">= 0"])
51
+ s.add_dependency(%q<reek>, ["~> 1.2.8"])
52
+ s.add_dependency(%q<rdoc>, [">= 0"])
53
+ end
54
+ else
55
+ s.add_dependency(%q<httparty>, [">= 0"])
56
+ s.add_dependency(%q<bundler>, ["~> 1.1.3"])
57
+ s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
58
+ s.add_dependency(%q<httparty>, [">= 0"])
59
+ s.add_dependency(%q<simplecov>, [">= 0"])
60
+ s.add_dependency(%q<reek>, ["~> 1.2.8"])
61
+ s.add_dependency(%q<rdoc>, [">= 0"])
62
+ end
63
+ end
64
+
data/lib/helpscout.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'helpscout/models.rb'
2
+ require 'helpscout/base.rb'
3
+
4
+ module HelpScout
5
+
6
+ end
@@ -0,0 +1,270 @@
1
+ require "date"
2
+ require "httparty"
3
+ require "helpscout/models"
4
+ require "erb"
5
+
6
+ module HelpScout
7
+ class Base
8
+ include HTTParty
9
+ base_uri 'https://api.helpscout.net/v1'
10
+
11
+ def initialize(key=nil)
12
+ Base.settings
13
+
14
+ if key.nil?
15
+ key = @@settings["api_key"]
16
+ end
17
+
18
+ @auth = { :username => key, :password => "X" }
19
+ @users = []
20
+ @mailboxes = []
21
+ end
22
+
23
+ @@settings ||= nil
24
+
25
+ def self.load!(api_key)
26
+ @auth = { :username => api_key, :password => "X" }
27
+ @users = []
28
+ @mailboxes = []
29
+ @@settings = {"api_key" => api_key}
30
+ end
31
+
32
+ def self.settings
33
+ if @@settings.nil?
34
+ path = "config/helpscout.yml"
35
+ @@settings = YAML.load(ERB.new(File.new(path).read).result)
36
+ @auth = { :username => @@settings["api_key"], :password => "X" }
37
+ end
38
+ @@settings
39
+ end
40
+
41
+ def self.parametrizedUrl(url, params={})
42
+ return url unless params
43
+
44
+ complete_url = url
45
+
46
+ parameterString = ""
47
+
48
+ params.each do |k,v|
49
+ if parameterString.length > 0
50
+ parameterString << "&"
51
+ else
52
+ parameterString << "?"
53
+ end
54
+ parameterString << "#{k}=#{v}"
55
+ end
56
+
57
+ if parameterString.length > 0
58
+ complete_url << parameterString
59
+ end
60
+ complete_url
61
+ end
62
+
63
+ def self.requestItem(url, params={})
64
+ item = nil
65
+ complete_url = Base.parametrizedUrl(url, params)
66
+
67
+ response = Base.get(complete_url, {:basic_auth => @auth})
68
+
69
+ if 200 <= response.code && response.code < 300
70
+ envelope = SingleItemEnvelope.new(response)
71
+ if envelope.item
72
+ item = envelope.item
73
+ end
74
+ elsif 400 <= response.code && response.code < 500
75
+ if response["message"]
76
+ envelope = ErrorEnvelope.new(response)
77
+ raise StandardError, envelope.message
78
+ else
79
+ raise StandardError, response["error"]
80
+ end
81
+ else
82
+ raise StandardError, "Server Response: #{response.code}"
83
+ end
84
+
85
+ item
86
+ end
87
+
88
+ def self.requestItems(url, params={})
89
+ items = []
90
+ complete_url = Base.parametrizedUrl(url, params)
91
+
92
+ response = Base.get(complete_url, {:basic_auth => @auth})
93
+
94
+ if 200 <= response.code && response.code < 300
95
+ envelope = CollectionsEnvelope.new(response)
96
+ if envelope.items
97
+ envelope.items.each do |item|
98
+ items << item
99
+ end
100
+ end
101
+
102
+ if envelope.page < envelope.pages
103
+ params[:page] = envelope.page + 1
104
+ items << Base.requestItems(url, params)
105
+ end
106
+ elsif 400 <= response.code && response.code < 500
107
+ if response["message"]
108
+ envelope = ErrorEnvelope.new(response)
109
+ raise StandardError, envelope.message
110
+ else
111
+ raise StandardError, response["error"]
112
+ end
113
+ else
114
+ raise StandardError, "Server Response: #{response.code}"
115
+ end
116
+
117
+ items
118
+ end
119
+
120
+ def self.user(userId)
121
+ url = "/users/#{userId}.json"
122
+ item = Base.requestItem(url, nil)
123
+ user = nil
124
+ if item
125
+ user = User.new(item)
126
+ end
127
+ user
128
+ end
129
+
130
+ def self.users
131
+ url = "/users.json"
132
+ items = Base.requestItems(url, :page => 1)
133
+ @users = []
134
+ items.each do |item|
135
+ @users << User.new(item)
136
+ end
137
+ @users
138
+ end
139
+
140
+ def self.usersInMailbox(mailboxId)
141
+ url ="/mailboxes/#{mailboxId}/users.json"
142
+ items = Base.requestItems(url, :page => 1)
143
+ users = []
144
+ items.each do |item|
145
+ users << User.new(item)
146
+ end
147
+ users
148
+ end
149
+
150
+ def self.mailboxes
151
+ url = "/mailboxes.json"
152
+ @mailboxes = []
153
+ begin
154
+ items = Base.requestItems(url, {})
155
+ items.each do |item|
156
+ @mailboxes << Mailbox.new(item)
157
+ end
158
+ rescue StandardError => e
159
+ print "Request failed: " + e.message
160
+ end
161
+ @mailboxes
162
+ end
163
+
164
+ def self.foldersInMailbox(mailboxId)
165
+ url ="/mailboxes/#{mailboxId}/folders.json"
166
+ items = Base.requestItems(url, :page => 1)
167
+ folders = []
168
+ items.each do |item|
169
+ folders << Mailbox::Folder.new(item)
170
+ end
171
+ folders
172
+ end
173
+
174
+ def self.conversation(conversationId)
175
+ url = "/conversations/#{conversationId}.json"
176
+ item = Base.requestItem(url, nil)
177
+ conversation = nil
178
+ if item
179
+ conversation = Conversation.new(item)
180
+ end
181
+ conversation
182
+ end
183
+
184
+
185
+ CONVERSATION_STATUS_ACTIVE = "active"
186
+ CONVERSATION_STATUS_ALL = "all"
187
+ CONVERSATION_STATUS_PENDING = "pending"
188
+
189
+ def self.conversations(mailboxId, status, modifiedSince)
190
+ url = "/mailboxes/#{mailboxId}/conversations.json"
191
+
192
+ options = {}
193
+ if status
194
+ options["status"] = status
195
+ end
196
+ if modifiedSince
197
+ # TODO: Check modifiedSince format. Needs to be Datetime in UTC
198
+ options["modifiedSince"] = modifiedSince
199
+ end
200
+
201
+ conversations = []
202
+ begin
203
+ items = Base.requestItems(url, options)
204
+ items.each do |item|
205
+ conversations << Conversation.new(item)
206
+ end
207
+ rescue StandardError => e
208
+ print "Request failed: " + e.message
209
+ end
210
+ conversations
211
+ end
212
+
213
+ def self.customer(customerId)
214
+ url = "/customers/#{customerId}.json"
215
+ item = Base.requestItem(url, nil)
216
+ customer = nil
217
+ if item
218
+ customer = Customer.new(item)
219
+ end
220
+ customer
221
+ end
222
+
223
+ def self.customers
224
+ url = "/customers.json"
225
+ items = Base.requestItems(url, :page => 1)
226
+ customers = []
227
+ items.each do |item|
228
+ customers << Customer.new(item)
229
+ end
230
+ customers
231
+ end
232
+
233
+ def self.attachmentData(attachmentId)
234
+ url = "/attachments/#{attachmentId}/data.json"
235
+ item = Base.requestItem(url, nil)
236
+ attachmentData = nil
237
+ if item
238
+ attachmentData = Conversation::AttachmentData.new(item)
239
+ end
240
+ attachmentData
241
+ end
242
+ end
243
+
244
+ # TODO: check response, if 200, it's one of the first two.
245
+ # If 403, error
246
+ class SingleItemEnvelope
247
+ attr_accessor :item
248
+ def initialize(object)
249
+ @item = object["item"]
250
+ end
251
+ end
252
+
253
+ class CollectionsEnvelope
254
+ attr_accessor :page, :pages, :count, :items
255
+ def initialize(object)
256
+ @page = object["page"]
257
+ @pages = object["pages"]
258
+ @count = object["count"]
259
+ @items = object["items"]
260
+ end
261
+ end
262
+
263
+ class ErrorEnvelope
264
+ attr_accessor :status, :message
265
+ def initialize(object)
266
+ @status = object["status"]
267
+ @message = object["message"]
268
+ end
269
+ end
270
+ end
@@ -0,0 +1,397 @@
1
+ require "date"
2
+ require "httparty"
3
+
4
+ module HelpScout
5
+ class Mailbox
6
+ attr_accessor :id, :name, :slug, :email, :createdAt, :modifiedAt
7
+ def initialize(object)
8
+ @id = object["id"]
9
+ @name = object["name"]
10
+ @slug = object["slug"]
11
+ @email = object["email"]
12
+ @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
13
+ @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
14
+ end
15
+
16
+ class Folder
17
+ attr_accessor :id, :name, :type, :userId, :totalCount, :activeCount, :modifiedAt
18
+
19
+ FOLDER_TYPE_UNASSIGNED = "unassigned"
20
+ FOLDER_TYPE_MY_TICKETS = "mytickets"
21
+ FOLDER_TYPE_DRAFTS = "drafts"
22
+ FOLDER_TYPE_ASSIGNED = "assigned"
23
+ FOLDER_TYPE_CLOSED = "closed"
24
+ FOLDER_TYPE_SPAM = "spam"
25
+
26
+ def initialize(object)
27
+ @id = object["id"]
28
+ @name = object["name"]
29
+ @type = object["type"]
30
+ @userId = object["userId"] # 0, unless type == FOLDER_TYPE_MY_TICKETS
31
+ @totalCount = object["totalCount"]
32
+ @activeCount = object["activeCount"]
33
+ @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
34
+ end
35
+ end
36
+ end
37
+
38
+ class Conversation
39
+ attr_accessor :id, :folderId, :isDraft, :number, :owner, :mailbox, :customer, :threadCount, :status, :subject, :preview, :createdBy, :createdAt, :modifiedAt, :closedAt, :closedBy, :source, :cc, :bcc, :tags, :threads
40
+
41
+ CONVERSATION_STATUS_ACTIVE = "active"
42
+ CONVERSATION_STATUS_PENDING = "pending"
43
+ CONVERSATION_STATUS_CLOSED = "closed"
44
+ CONVERSATION_STATUS_SPAM = "spam"
45
+
46
+ def initialize(object)
47
+ @id = object["id"]
48
+ @folderId = object["folderId"]
49
+ @isDraft = object["isDraft"]
50
+ @number = object["number"]
51
+ @owner = User.new(object["owner"]) if object["owner"]
52
+ @mailbox = Mailbox.new(object["mailbox"]) if object["mailbox"]
53
+ @customer = Customer.new(object["customer"]) if object["customer"]
54
+ @threadCount = object["threadCount"]
55
+ @status = object["status"]
56
+ @subject = object["subject"]
57
+ @preview = object["preview"]
58
+ @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
59
+ @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
60
+ @closedAt = DateTime.iso8601(object["closedAt"]) if object["closedAt"]
61
+ @closedBy = User.new(object["closedBy"]) if object["closedBy"]
62
+
63
+ @source = nil
64
+ if object["source"]
65
+ @source = Source.new(object["source"])
66
+
67
+ if object["createdBy"]
68
+ if @source.type == Source::SOURCE_VIA_CUSTOMER
69
+ @createdBy = Customer.new(object["createdBy"])
70
+ elsif @source.type == Source::SOURCE_VIA_USER
71
+ @createdBy = User.new(object["createdBy"])
72
+ end
73
+ end
74
+ end
75
+
76
+ @cc = object["cc"]
77
+ @bcc = object["bcc"]
78
+ @tags = object["tags"]
79
+
80
+ @threads = []
81
+ if object["threads"]
82
+ object["threads"].each do |thread|
83
+ @threads << Thread.new(thread)
84
+ end
85
+ end
86
+ end
87
+
88
+ def to_s
89
+ "Last Modified: #{@modifiedAt}\nAssigned to: #{@owner}\nSubject: #{@subject}\n#{@preview}"
90
+ end
91
+
92
+ class Attachment
93
+ attr_accessor :id, :mimeType, :filename, :size, :width, :height, :url
94
+
95
+ def initialize(object)
96
+ @id = object["id"]
97
+ @mimeType = object["mimeType"]
98
+ @filename = object["filename"]
99
+ @size = object["size"]
100
+ @width = object["width"]
101
+ @height = object["height"]
102
+ @url = object["url"]
103
+ end
104
+ end
105
+
106
+ class AttachmentData
107
+ attr_accessor :id, :data
108
+
109
+ def initialize(object)
110
+ @id = object["id"]
111
+ @data = object["data"]
112
+ end
113
+ end
114
+
115
+ class Source
116
+ attr_accessor :type, :via
117
+
118
+ SOURCE_TYPE_EMAIL = "email"
119
+ SOURCE_TYPE_WEB = "web"
120
+ SOURCE_TYPE_NOTIFICATION = "notification"
121
+ SOURCE_TYPE_EMAIL_FWD = "emailfwd"
122
+
123
+ SOURCE_VIA_USER = "user"
124
+ SOURCE_VIA_CUSTOMER = "customer"
125
+
126
+ def initialize(object)
127
+ @type = object["type"]
128
+ @via = object["via"]
129
+ end
130
+ end
131
+
132
+ class Thread
133
+ attr_accessor :id, :assignedTo, :status, :createdAt, :createdBy, :source, :fromMailbox, :type, :state, :customer, :body, :to, :cc, :bcc, :attachments
134
+
135
+ THREAD_STATE_PUBLISHED = "published"
136
+ THREAD_STATE_DRAFT = "draft"
137
+ THREAD_STATE_UNDER_REVIEW = "underreview"
138
+
139
+ THREAD_STATUS_ACTIVE = "active"
140
+ THREAD_STATUS_NO_CHANGE = "nochange"
141
+ THREAD_STATUS_PENDING = "pending"
142
+ THREAD_STATUS_CLOSED = "closed"
143
+ THREAD_STATUS_SPAM = "spam"
144
+
145
+ THREAD_TYPE_NOTE = "note"
146
+ THREAD_TYPE_MESSAGE = "message"
147
+ THREAD_TYPE_CUSTOMER = "customer"
148
+
149
+ # A lineitem represents a change of state on the conversation. This could include, but not limited to, the conversation was assigned, the status changed, the conversation was moved from one mailbox to another, etc. A line item won't have a body, to/cc/bcc lists, or attachments.
150
+ THREAD_TYPE_LINEITEM = "lineitem"
151
+
152
+ # When a conversation is forwarded, a new conversation is created to represent the forwarded conversation.
153
+ THREAD_TYPE_FWD_PARENT = "forwardparent" # forwardparent is the type set on the thread of the original conversation that initiated the forward event.
154
+ THREAD_TYPE_FWD_CHILD = "forwardchild" # forwardchild is the type set on the first thread of the new forwarded conversation.
155
+
156
+
157
+ def initialize(object)
158
+ @id = object["id"]
159
+ @assignedTo = User.new(object["assignedTo"]) if object["assignedTo"]
160
+ @status = object["status"]
161
+ @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
162
+
163
+ @source = nil
164
+ if object["source"]
165
+ @source = Source.new(object["source"])
166
+
167
+ if object["createdBy"]
168
+ if @source.type == Source::SOURCE_VIA_CUSTOMER
169
+ @createdBy = Customer.new(object["createdBy"])
170
+ elsif @source.type == Source::SOURCE_VIA_USER
171
+ @createdBy = User.new(object["createdBy"])
172
+ end
173
+ end
174
+ end
175
+
176
+ @fromMailbox = Mailbox.new(object["fromMailbox"]) if object["fromMailbox"]
177
+ @type = object["type"]
178
+ @state = object["state"]
179
+ @customer = Customer.new(object["customer"]) if object["customer"]
180
+ @body = object["body"]
181
+ @to = object["to"]
182
+ @cc = object["cc"]
183
+ @bcc = object["bcc"]
184
+
185
+ @attachments = []
186
+ if object["attachments"]
187
+ object["attachments"].each do |item|
188
+ @attachments << Attachment.new(item)
189
+ end
190
+ end
191
+ end
192
+
193
+ def to_s
194
+ "#{@customer}: #{@body}"
195
+ end
196
+ end
197
+
198
+ end
199
+
200
+ class User
201
+ attr_accessor :id, :firstName, :lastName, :email, :role, :timezone, :photoUrl, :createdAt, :createdBy
202
+
203
+ USER_ROLE_OWNER = "owner"
204
+ USER_ROLE_ADMIN = "admin"
205
+ USER_ROLE_USER = "user"
206
+
207
+ def initialize(object)
208
+ @id = object["id"]
209
+ @firstName = object["firstName"]
210
+ @lastName = object["lastName"]
211
+ @email = object["email"]
212
+ @role = object["role"]
213
+ @timezone = object["timezone"]
214
+ @photoUrl = object["photoUrl"]
215
+ @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
216
+ @createdBy = object["createdBy"]
217
+ end
218
+
219
+ def to_s
220
+ "#{@firstName} #{@lastName}"
221
+ end
222
+ end
223
+
224
+ class Customer
225
+ attr_accessor :id, :firstName, :lastName, :photoUrl, :photoType, :gender, :age, :organization, :jobTitle, :location, :createdAt, :modifiedAt, :background, :address, :socialProfiles, :emails, :phones, :chats, :websites
226
+
227
+ CUSTOMER_PHOTO_TYPE_UNKNOWN = "unknown"
228
+ CUSTOMER_PHOTO_TYPE_GRAVATAR = "gravatar"
229
+ CUSTOMER_PHOTO_TYPE_TWITTER = "twitter"
230
+ CUSTOMER_PHOTO_TYPE_FACEBOOK = "facebook"
231
+ CUSTOMER_PHOTO_TYPE_GOOGLE_PROFILE = "googleprofile"
232
+ CUSTOMER_PHOTO_TYPE_GOOGLE_PLUS = "googleplus"
233
+ CUSTOMER_PHOTO_TYPE_LINKEDIN = "linkedin"
234
+
235
+ CUSTOMER_GENDER_MALE = "male"
236
+ CUSTOMER_GENDER_FEMALE = "female"
237
+ CUSTOMER_GENDER_UNKNOWN = "unknown"
238
+
239
+ def initialize(object)
240
+ @id = object["id"]
241
+ @firstName = object["firstName"]
242
+ @lastName = object["lastName"]
243
+ @photoUrl = object["photoUrl"]
244
+ @photoType = object["photoType"]
245
+ @gender = object["gender"]
246
+ @age = object["age"]
247
+ @organization = object["organization"]
248
+ @jobTitle = object["jobTitle"]
249
+ @location = object["location"]
250
+ @background = object["background"]
251
+
252
+ @address = nil
253
+ if object["address"]
254
+ @address = Address.new(object["address"])
255
+ end
256
+
257
+ @socialProfiles = []
258
+ if object["socialProfiles"]
259
+ object["socialProfiles"].each do |item|
260
+ @socialProfiles << SocialProfile.new(item)
261
+ end
262
+ end
263
+
264
+ @emails = []
265
+ if object["emails"]
266
+ object["emails"].each do |item|
267
+ @emails << Email.new(item)
268
+ end
269
+ end
270
+
271
+ @phones = []
272
+ if object["phones"]
273
+ object["phones"].each do |item|
274
+ @phones << Phone.new(item)
275
+ end
276
+ end
277
+
278
+ @chats = []
279
+ if object["chats"]
280
+ object["chats"].each do |item|
281
+ @chats << Chat.new(item)
282
+ end
283
+ end
284
+
285
+ @websites = []
286
+ if object["websites"]
287
+ object["websites"].each do |item|
288
+ @websites << Website.new(item)
289
+ end
290
+ end
291
+
292
+ @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
293
+ @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
294
+ end
295
+
296
+ def to_s
297
+ "#{@firstName} #{@lastName}"
298
+ end
299
+
300
+ class Address
301
+ attr_accessor :id, :lines, :city, :state, :postalCode, :country, :createdAt, :modifiedAt
302
+ def initialize(object)
303
+ @id = object["id"]
304
+ @lines = object["lines"]
305
+ @city = object["city"]
306
+ @state = object["state"]
307
+ @postalCode = object["postalCode"]
308
+ @country = object["country"]
309
+ @createdAt = DateTime.iso8601(object["createdAt"]) if object["createdAt"]
310
+ @modifiedAt = DateTime.iso8601(object["modifiedAt"]) if object["modifiedAt"]
311
+ end
312
+ end
313
+
314
+ class Chat
315
+ attr_accessor :id, :value, :type
316
+
317
+ CHAT_TYPE_AIM = "aim"
318
+ CHAT_TYPE_GTALK = "gtalk"
319
+ CHAT_TYPE_ICQ = "icq"
320
+ CHAT_TYPE_XMPP = "xmpp"
321
+ CHAT_TYPE_MSN = "msn"
322
+ CHAT_TYPE_SKYPE = "skype"
323
+ CHAT_TYPE_YAHOO = "yahoo"
324
+ CHAT_TYPE_QQ = "qq"
325
+ CHAT_TYPE_OTHER = "other"
326
+
327
+ def initialize(object)
328
+ @id = object["id"]
329
+ @value = object["value"]
330
+ @type = object["type"]
331
+ end
332
+ end
333
+
334
+ class Email
335
+ attr_accessor :id, :value, :location
336
+
337
+ EMAIL_LOCATION_WORK = "work"
338
+ EMAIL_LOCATION_HOME = "home"
339
+ EMAIL_LOCATION_OTHER = "other"
340
+
341
+ def initialize(object)
342
+ @id = object["id"]
343
+ @value = object["value"]
344
+ @location = object["location"]
345
+ end
346
+ end
347
+
348
+ class Phone
349
+ attr_accessor :id, :value, :location
350
+
351
+ PHONE_LOCATION_HOME = "home"
352
+ PHONE_LOCATION_WORK = "work"
353
+ PHONE_LOCATION_MOBILE = "mobile"
354
+ PHONE_LOCATION_FAX = "fax"
355
+ PHONE_LOCATION_PAGER = "pager"
356
+ PHONE_LOCATION_OTHER = "other"
357
+
358
+ def initialize(object)
359
+ @id = object["id"]
360
+ @value = object["value"]
361
+ @location = object["location"]
362
+ end
363
+ end
364
+
365
+ class SocialProfile
366
+ attr_accessor :id, :value, :type
367
+
368
+ SOCIAL_PROFILE_TYPE_TWITTER = "twitter"
369
+ SOCIAL_PROFILE_TYPE_FACEBOOK = "facebook"
370
+ SOCIAL_PROFILE_TYPE_LINKEDIN = "linkedin"
371
+ SOCIAL_PROFILE_TYPE_ABOUTME = "aboutme"
372
+ SOCIAL_PROFILE_TYPE_GOOGLE = "google"
373
+ SOCIAL_PROFILE_TYPE_GOOGLE_PLUS = "googleplus"
374
+ SOCIAL_PROFILE_TYPE_TUNGLEME = "tungleme"
375
+ SOCIAL_PROFILE_TYPE_QUORA = "quora"
376
+ SOCIAL_PROFILE_TYPE_FOURSQUARE = "foursquare"
377
+ SOCIAL_PROFILE_TYPE_YOUTUBE = "youtube"
378
+ SOCIAL_PROFILE_TYPE_FLICKR = "flickr"
379
+ SOCIAL_PROFILE_TYPE_OTHER = "other"
380
+
381
+ def initialize(object)
382
+ @id = object["id"]
383
+ @value = object["value"]
384
+ @type = object["type"] # twitter, facebook, linkedin, aboutme, google, googleplus, tungleme, quora, foursquare, youtube, flickr, other
385
+ end
386
+ end
387
+
388
+ class Website
389
+ attr_accessor :id, :value
390
+ def initialize(object)
391
+ @id = object["id"]
392
+ @value = object["value"]
393
+ end
394
+ end
395
+ end
396
+ end
397
+
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: helpscout
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3.alpha
5
+ prerelease: 6
6
+ platform: ruby
7
+ authors:
8
+ - Héctor Ramos
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-14 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: httparty
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: bundler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 1.1.3
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.1.3
46
+ - !ruby/object:Gem::Dependency
47
+ name: jeweler
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.8.4
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.8.4
62
+ - !ruby/object:Gem::Dependency
63
+ name: httparty
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: simplecov
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: reek
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 1.2.8
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 1.2.8
110
+ - !ruby/object:Gem::Dependency
111
+ name: rdoc
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: ''
127
+ email: hector@hectorramos.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files:
131
+ - README.markdown
132
+ files:
133
+ - Gemfile
134
+ - README.markdown
135
+ - Rakefile
136
+ - VERSION
137
+ - helpscout.gemspec
138
+ - lib/helpscout.rb
139
+ - lib/helpscout/base.rb
140
+ - lib/helpscout/models.rb
141
+ homepage: http://github.com/hramos/helpscout
142
+ licenses:
143
+ - MIT
144
+ post_install_message:
145
+ rdoc_options: []
146
+ require_paths:
147
+ - lib
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ! '>'
158
+ - !ruby/object:Gem::Version
159
+ version: 1.3.1
160
+ requirements: []
161
+ rubyforge_project:
162
+ rubygems_version: 1.8.24
163
+ signing_key:
164
+ specification_version: 3
165
+ summary: HelpScout API Wrapper
166
+ test_files: []