insightly2 0.1.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.
Files changed (240) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +4 -0
  6. data/README.md +113 -0
  7. data/Rakefile +6 -0
  8. data/config/gem_secret.yml.example +1 -0
  9. data/insightly2.gemspec +29 -0
  10. data/lib/insightly2/client.rb +54 -0
  11. data/lib/insightly2/dsl/comments.rb +47 -0
  12. data/lib/insightly2/dsl/contacts.rb +130 -0
  13. data/lib/insightly2/dsl/countries.rb +12 -0
  14. data/lib/insightly2/dsl/currencies.rb +12 -0
  15. data/lib/insightly2/dsl/custom_fields.rb +22 -0
  16. data/lib/insightly2/dsl/emails.rb +57 -0
  17. data/lib/insightly2/dsl/events.rb +52 -0
  18. data/lib/insightly2/dsl/file_attachments.rb +14 -0
  19. data/lib/insightly2/dsl/file_categories.rb +52 -0
  20. data/lib/insightly2/dsl/notes.rb +85 -0
  21. data/lib/insightly2/dsl/opportunities.rb +134 -0
  22. data/lib/insightly2/dsl/opportunity_categories.rb +52 -0
  23. data/lib/insightly2/dsl/opportunity_state_reasons.rb +12 -0
  24. data/lib/insightly2/dsl/organisations.rb +128 -0
  25. data/lib/insightly2/dsl/pipeline_stages.rb +22 -0
  26. data/lib/insightly2/dsl/pipelines.rb +22 -0
  27. data/lib/insightly2/dsl/project_categories.rb +52 -0
  28. data/lib/insightly2/dsl/projects.rb +129 -0
  29. data/lib/insightly2/dsl/relationships.rb +12 -0
  30. data/lib/insightly2/dsl/tags.rb +15 -0
  31. data/lib/insightly2/dsl/task_categories.rb +52 -0
  32. data/lib/insightly2/dsl/tasks.rb +76 -0
  33. data/lib/insightly2/dsl/team_members.rb +53 -0
  34. data/lib/insightly2/dsl/teams.rb +53 -0
  35. data/lib/insightly2/dsl/users.rb +22 -0
  36. data/lib/insightly2/dsl.rb +65 -0
  37. data/lib/insightly2/errors/client_error.rb +10 -0
  38. data/lib/insightly2/errors/resource_not_found_error.rb +8 -0
  39. data/lib/insightly2/errors.rb +10 -0
  40. data/lib/insightly2/resources/comment.rb +10 -0
  41. data/lib/insightly2/resources/contact.rb +8 -0
  42. data/lib/insightly2/resources/country.rb +8 -0
  43. data/lib/insightly2/resources/currency.rb +8 -0
  44. data/lib/insightly2/resources/custom_field.rb +8 -0
  45. data/lib/insightly2/resources/email.rb +8 -0
  46. data/lib/insightly2/resources/event.rb +8 -0
  47. data/lib/insightly2/resources/file_attachment.rb +8 -0
  48. data/lib/insightly2/resources/file_category.rb +8 -0
  49. data/lib/insightly2/resources/note.rb +8 -0
  50. data/lib/insightly2/resources/object/attributes.rb +71 -0
  51. data/lib/insightly2/resources/object/serializers.rb +102 -0
  52. data/lib/insightly2/resources/object.rb +29 -0
  53. data/lib/insightly2/resources/opportunity.rb +8 -0
  54. data/lib/insightly2/resources/opportunity_category.rb +8 -0
  55. data/lib/insightly2/resources/opportunity_state_reason.rb +8 -0
  56. data/lib/insightly2/resources/organisation.rb +8 -0
  57. data/lib/insightly2/resources/pipeline.rb +8 -0
  58. data/lib/insightly2/resources/pipeline_stage.rb +8 -0
  59. data/lib/insightly2/resources/project.rb +8 -0
  60. data/lib/insightly2/resources/project_category.rb +8 -0
  61. data/lib/insightly2/resources/relationship.rb +8 -0
  62. data/lib/insightly2/resources/tag.rb +8 -0
  63. data/lib/insightly2/resources/task.rb +8 -0
  64. data/lib/insightly2/resources/task_category.rb +8 -0
  65. data/lib/insightly2/resources/team.rb +8 -0
  66. data/lib/insightly2/resources/team_member.rb +8 -0
  67. data/lib/insightly2/resources/user.rb +8 -0
  68. data/lib/insightly2/resources.rb +33 -0
  69. data/lib/insightly2/utils/url_helper.rb +17 -0
  70. data/lib/insightly2/utils.rb +8 -0
  71. data/lib/insightly2/version.rb +3 -0
  72. data/lib/insightly2.rb +22 -0
  73. data/spec/fixtures/vcr_cassettes/create_comment_attachment.yml +42 -0
  74. data/spec/fixtures/vcr_cassettes/create_contact.yml +47 -0
  75. data/spec/fixtures/vcr_cassettes/create_contact_image.yml +42 -0
  76. data/spec/fixtures/vcr_cassettes/create_email_comment.yml +47 -0
  77. data/spec/fixtures/vcr_cassettes/create_event.yml +95 -0
  78. data/spec/fixtures/vcr_cassettes/create_file_category.yml +89 -0
  79. data/spec/fixtures/vcr_cassettes/create_note.yml +95 -0
  80. data/spec/fixtures/vcr_cassettes/create_note_comment.yml +47 -0
  81. data/spec/fixtures/vcr_cassettes/create_note_file.yml +42 -0
  82. data/spec/fixtures/vcr_cassettes/create_opportunity.yml +98 -0
  83. data/spec/fixtures/vcr_cassettes/create_opportunity_category.yml +89 -0
  84. data/spec/fixtures/vcr_cassettes/create_opportunity_image.yml +42 -0
  85. data/spec/fixtures/vcr_cassettes/create_organisation.yml +116 -0
  86. data/spec/fixtures/vcr_cassettes/create_organisation_image.yml +42 -0
  87. data/spec/fixtures/vcr_cassettes/create_project.yml +106 -0
  88. data/spec/fixtures/vcr_cassettes/create_project_category.yml +89 -0
  89. data/spec/fixtures/vcr_cassettes/create_project_image.yml +42 -0
  90. data/spec/fixtures/vcr_cassettes/create_task.yml +98 -0
  91. data/spec/fixtures/vcr_cassettes/create_task_category.yml +89 -0
  92. data/spec/fixtures/vcr_cassettes/create_task_comment.yml +47 -0
  93. data/spec/fixtures/vcr_cassettes/create_team.yml +92 -0
  94. data/spec/fixtures/vcr_cassettes/create_team_member.yml +89 -0
  95. data/spec/fixtures/vcr_cassettes/delete_comment.yml +42 -0
  96. data/spec/fixtures/vcr_cassettes/delete_contact.yml +42 -0
  97. data/spec/fixtures/vcr_cassettes/delete_contact_image.yml +42 -0
  98. data/spec/fixtures/vcr_cassettes/delete_email.yml +42 -0
  99. data/spec/fixtures/vcr_cassettes/delete_event.yml +42 -0
  100. data/spec/fixtures/vcr_cassettes/delete_file_category.yml +42 -0
  101. data/spec/fixtures/vcr_cassettes/delete_note.yml +42 -0
  102. data/spec/fixtures/vcr_cassettes/delete_opportunity.yml +42 -0
  103. data/spec/fixtures/vcr_cassettes/delete_opportunity_category.yml +42 -0
  104. data/spec/fixtures/vcr_cassettes/delete_opportunity_image.yml +42 -0
  105. data/spec/fixtures/vcr_cassettes/delete_organisation.yml +42 -0
  106. data/spec/fixtures/vcr_cassettes/delete_organisation_image.yml +42 -0
  107. data/spec/fixtures/vcr_cassettes/delete_project.yml +42 -0
  108. data/spec/fixtures/vcr_cassettes/delete_project_category.yml +42 -0
  109. data/spec/fixtures/vcr_cassettes/delete_project_image.yml +42 -0
  110. data/spec/fixtures/vcr_cassettes/delete_task.yml +42 -0
  111. data/spec/fixtures/vcr_cassettes/delete_task_category.yml +42 -0
  112. data/spec/fixtures/vcr_cassettes/delete_team.yml +42 -0
  113. data/spec/fixtures/vcr_cassettes/delete_team_member.yml +42 -0
  114. data/spec/fixtures/vcr_cassettes/get_comment.yml +47 -0
  115. data/spec/fixtures/vcr_cassettes/get_contact.yml +47 -0
  116. data/spec/fixtures/vcr_cassettes/get_contact_emails.yml +47 -0
  117. data/spec/fixtures/vcr_cassettes/get_contact_image.yml +44 -0
  118. data/spec/fixtures/vcr_cassettes/get_contact_notes.yml +48 -0
  119. data/spec/fixtures/vcr_cassettes/get_contact_tasks.yml +48 -0
  120. data/spec/fixtures/vcr_cassettes/get_contacts.yml +184 -0
  121. data/spec/fixtures/vcr_cassettes/get_countries.yml +85 -0
  122. data/spec/fixtures/vcr_cassettes/get_currencies.yml +124 -0
  123. data/spec/fixtures/vcr_cassettes/get_custom_field.yml +46 -0
  124. data/spec/fixtures/vcr_cassettes/get_custom_fields.yml +46 -0
  125. data/spec/fixtures/vcr_cassettes/get_email.yml +48 -0
  126. data/spec/fixtures/vcr_cassettes/get_email_comments.yml +49 -0
  127. data/spec/fixtures/vcr_cassettes/get_emails.yml +47 -0
  128. data/spec/fixtures/vcr_cassettes/get_event.yml +48 -0
  129. data/spec/fixtures/vcr_cassettes/get_events.yml +48 -0
  130. data/spec/fixtures/vcr_cassettes/get_file_attachment.yml +4057 -0
  131. data/spec/fixtures/vcr_cassettes/get_file_categories.yml +46 -0
  132. data/spec/fixtures/vcr_cassettes/get_file_category.yml +46 -0
  133. data/spec/fixtures/vcr_cassettes/get_note.yml +48 -0
  134. data/spec/fixtures/vcr_cassettes/get_note_comments.yml +48 -0
  135. data/spec/fixtures/vcr_cassettes/get_notes.yml +52 -0
  136. data/spec/fixtures/vcr_cassettes/get_opportunities.yml +81 -0
  137. data/spec/fixtures/vcr_cassettes/get_opportunity.yml +49 -0
  138. data/spec/fixtures/vcr_cassettes/get_opportunity_categories.yml +46 -0
  139. data/spec/fixtures/vcr_cassettes/get_opportunity_category.yml +46 -0
  140. data/spec/fixtures/vcr_cassettes/get_opportunity_emails.yml +48 -0
  141. data/spec/fixtures/vcr_cassettes/get_opportunity_image.yml +44 -0
  142. data/spec/fixtures/vcr_cassettes/get_opportunity_notes.yml +48 -0
  143. data/spec/fixtures/vcr_cassettes/get_opportunity_state_history.yml +83 -0
  144. data/spec/fixtures/vcr_cassettes/get_opportunity_state_reasons.yml +47 -0
  145. data/spec/fixtures/vcr_cassettes/get_opportunity_tasks.yml +49 -0
  146. data/spec/fixtures/vcr_cassettes/get_organisation.yml +55 -0
  147. data/spec/fixtures/vcr_cassettes/get_organisation_emails.yml +48 -0
  148. data/spec/fixtures/vcr_cassettes/get_organisation_image.yml +42 -0
  149. data/spec/fixtures/vcr_cassettes/get_organisation_notes.yml +47 -0
  150. data/spec/fixtures/vcr_cassettes/get_organisation_tasks.yml +48 -0
  151. data/spec/fixtures/vcr_cassettes/get_organisations.yml +2092 -0
  152. data/spec/fixtures/vcr_cassettes/get_pipeline.yml +46 -0
  153. data/spec/fixtures/vcr_cassettes/get_pipeline_stage.yml +46 -0
  154. data/spec/fixtures/vcr_cassettes/get_pipeline_stages.yml +49 -0
  155. data/spec/fixtures/vcr_cassettes/get_pipelines.yml +46 -0
  156. data/spec/fixtures/vcr_cassettes/get_project.yml +52 -0
  157. data/spec/fixtures/vcr_cassettes/get_project_categories.yml +46 -0
  158. data/spec/fixtures/vcr_cassettes/get_project_category.yml +46 -0
  159. data/spec/fixtures/vcr_cassettes/get_project_emails.yml +48 -0
  160. data/spec/fixtures/vcr_cassettes/get_project_image.yml +44 -0
  161. data/spec/fixtures/vcr_cassettes/get_project_notes.yml +47 -0
  162. data/spec/fixtures/vcr_cassettes/get_project_tasks.yml +48 -0
  163. data/spec/fixtures/vcr_cassettes/get_projects.yml +52 -0
  164. data/spec/fixtures/vcr_cassettes/get_task.yml +49 -0
  165. data/spec/fixtures/vcr_cassettes/get_task_categories.yml +47 -0
  166. data/spec/fixtures/vcr_cassettes/get_task_category.yml +46 -0
  167. data/spec/fixtures/vcr_cassettes/get_task_comments.yml +47 -0
  168. data/spec/fixtures/vcr_cassettes/get_tasks.yml +148 -0
  169. data/spec/fixtures/vcr_cassettes/get_team.yml +47 -0
  170. data/spec/fixtures/vcr_cassettes/get_team_member.yml +46 -0
  171. data/spec/fixtures/vcr_cassettes/get_team_members.yml +46 -0
  172. data/spec/fixtures/vcr_cassettes/get_teams.yml +47 -0
  173. data/spec/fixtures/vcr_cassettes/get_user.yml +48 -0
  174. data/spec/fixtures/vcr_cassettes/get_users.yml +48 -0
  175. data/spec/fixtures/vcr_cassettes/update_comment.yml +97 -0
  176. data/spec/fixtures/vcr_cassettes/update_contact.yml +94 -0
  177. data/spec/fixtures/vcr_cassettes/update_contact_image.yml +42 -0
  178. data/spec/fixtures/vcr_cassettes/update_event.yml +97 -0
  179. data/spec/fixtures/vcr_cassettes/update_file_category.yml +91 -0
  180. data/spec/fixtures/vcr_cassettes/update_note.yml +100 -0
  181. data/spec/fixtures/vcr_cassettes/update_opportunity.yml +100 -0
  182. data/spec/fixtures/vcr_cassettes/update_opportunity_category.yml +91 -0
  183. data/spec/fixtures/vcr_cassettes/update_opportunity_image.yml +42 -0
  184. data/spec/fixtures/vcr_cassettes/update_organisation.yml +118 -0
  185. data/spec/fixtures/vcr_cassettes/update_organisation_image.yml +42 -0
  186. data/spec/fixtures/vcr_cassettes/update_project.yml +109 -0
  187. data/spec/fixtures/vcr_cassettes/update_project_category.yml +91 -0
  188. data/spec/fixtures/vcr_cassettes/update_project_image.yml +42 -0
  189. data/spec/fixtures/vcr_cassettes/update_task.yml +100 -0
  190. data/spec/fixtures/vcr_cassettes/update_task_category.yml +91 -0
  191. data/spec/fixtures/vcr_cassettes/update_team.yml +94 -0
  192. data/spec/fixtures/vcr_cassettes/update_team_member.yml +91 -0
  193. data/spec/fixtures/vcr_cassettes/z_insightly_client_status_check.yml +48 -0
  194. data/spec/insightly2/client_spec.rb +12 -0
  195. data/spec/insightly2/dsl/comments_spec.rb +45 -0
  196. data/spec/insightly2/dsl/contacts_spec.rb +130 -0
  197. data/spec/insightly2/dsl/countries_spec.rb +14 -0
  198. data/spec/insightly2/dsl/currencies_spec.rb +14 -0
  199. data/spec/insightly2/dsl/custom_fields_spec.rb +25 -0
  200. data/spec/insightly2/dsl/emails_spec.rb +56 -0
  201. data/spec/insightly2/dsl/events_spec.rb +55 -0
  202. data/spec/insightly2/dsl/file_attachments_spec.rb +15 -0
  203. data/spec/insightly2/dsl/file_categories_spec.rb +55 -0
  204. data/spec/insightly2/dsl/notes_spec.rb +86 -0
  205. data/spec/insightly2/dsl/opportunities_spec.rb +143 -0
  206. data/spec/insightly2/dsl/opportunity_categories_spec.rb +55 -0
  207. data/spec/insightly2/dsl/opportunity_state_reasons_spec.rb +14 -0
  208. data/spec/insightly2/dsl/organisations_spec.rb +131 -0
  209. data/spec/insightly2/dsl/pipeline_stages_spec.rb +25 -0
  210. data/spec/insightly2/dsl/pipelines_spec.rb +25 -0
  211. data/spec/insightly2/dsl/project_categories_spec.rb +55 -0
  212. data/spec/insightly2/dsl/projects_spec.rb +131 -0
  213. data/spec/insightly2/dsl/task_categories_spec.rb +55 -0
  214. data/spec/insightly2/dsl/tasks_spec.rb +75 -0
  215. data/spec/insightly2/dsl/team_members_spec.rb +56 -0
  216. data/spec/insightly2/dsl/teams_spec.rb +55 -0
  217. data/spec/insightly2/dsl/users_spec.rb +25 -0
  218. data/spec/insightly2/resources/comment_spec.rb +27 -0
  219. data/spec/insightly2/resources/contact_spec.rb +28 -0
  220. data/spec/insightly2/resources/custom_field_spec.rb +22 -0
  221. data/spec/insightly2/resources/email_spec.rb +29 -0
  222. data/spec/insightly2/resources/event_spec.rb +29 -0
  223. data/spec/insightly2/resources/file_attachment_spec.rb +31 -0
  224. data/spec/insightly2/resources/file_category_spec.rb +21 -0
  225. data/spec/insightly2/resources/note_spec.rb +29 -0
  226. data/spec/insightly2/resources/opportunity_category_spec.rb +21 -0
  227. data/spec/insightly2/resources/opportunity_spec.rb +30 -0
  228. data/spec/insightly2/resources/organisation_spec.rb +29 -0
  229. data/spec/insightly2/resources/pipeline_spec.rb +21 -0
  230. data/spec/insightly2/resources/pipeline_stage_spec.rb +21 -0
  231. data/spec/insightly2/resources/project_category_spec.rb +21 -0
  232. data/spec/insightly2/resources/project_spec.rb +30 -0
  233. data/spec/insightly2/resources/task_category_spec.rb +21 -0
  234. data/spec/insightly2/resources/task_spec.rb +32 -0
  235. data/spec/insightly2/resources/team_member_spec.rb +21 -0
  236. data/spec/insightly2/resources/team_spec.rb +27 -0
  237. data/spec/insightly2/resources/user_spec.rb +29 -0
  238. data/spec/insightly2_spec.rb +15 -0
  239. data/spec/spec_helper.rb +20 -0
  240. metadata +551 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4042e33e70605bd4800030d09a4fce688cfb66fe
4
+ data.tar.gz: de8a94d18de1cfb5b3cbdd687cee6e22e83ac26d
5
+ SHA512:
6
+ metadata.gz: b9bc887e4711454f4740e04da84a8132be583a6148ce539e561cd6f5c3554ee63e89478845c500f621f656dba9c60fdeb9915b49eac0cb7ee5f882703cb9e5eb
7
+ data.tar.gz: 73beb7c63bd6af0ae1ad06f9063c84c2927d7ca6d3634afead77eec2664e5b882448089a5c7794917050ab3570c4d89c5286cb2587cbe56b7580a5288c5f2580
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .idea/
11
+ *.bundle
12
+ *.so
13
+ *.o
14
+ *.a
15
+ *.gem
16
+ mkmf.log
17
+ /config/gem_secret.yml
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3-p547
4
+ - 2.1.2
5
+ - 2.0.0-p481
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in insightly.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,113 @@
1
+ # Insightly2
2
+
3
+ Ruby Library for the Insightly REST API.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'insightly2'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install insightly2
20
+
21
+ The gem requires Ruby 2.0.0 and above.
22
+
23
+ ## Sample Code
24
+
25
+ Set client the API key.
26
+ ```ruby
27
+ Insightly2.api_key = <your API key>
28
+ ```
29
+
30
+ Get contacts.
31
+ ```ruby
32
+ contacts = Insightly2.client.get_contacts
33
+ ```
34
+
35
+ Get a contact.
36
+ ```ruby
37
+ contact = Insightly2.client.get_contact(id: 1)
38
+ ```
39
+
40
+ Create a contact.
41
+
42
+ ```ruby
43
+ # Build JSON serialized attributes.
44
+ # The gem won't do this for you. You need to build a serializer that meets your needs."
45
+ contact_attributes = {
46
+ "first_name"=>"Tyler",
47
+ "last_name"=>"Durden",
48
+ "image_url"=>"https://fakedomain.imgix.net/user_photos/man.jpg?crop=faces&fit=crop&h=96&w=96",
49
+ "contactinfos"=>[{"contact_id"=>0, "type"=>"Email", "subtype"=>"", "label"=>"Work", "detail"=>"tylerdurden@ucsv.edu"}],
50
+ "links"=>[],
51
+ "tags"=>[],
52
+ "date_created_utc"=>"2014-10-11 23:20:04",
53
+ "date_updated_utc"=>"2014-10-23 17:27:25",
54
+ "contact_id"=>81126408
55
+ }
56
+
57
+ # Create the contact.
58
+ contact = Insightly2.client.create_contact(contact: contact_attributes)
59
+ ```
60
+
61
+ Update a contact.
62
+ ```ruby
63
+ # Build JSON serialized attributes.
64
+ # The gem won't do this for you. You need to build a serializer that meets your needs."
65
+ # contact_attributes = <same as create>
66
+
67
+ # Update the contact.
68
+ contact = Insightly2.client.update_contact(contact: contact_attributes)
69
+ ```
70
+
71
+ Delete a contact.
72
+ ```ruby
73
+ Insightly2.client.delete_contact(id: 1)
74
+ ```
75
+
76
+ ## Error handling
77
+
78
+ The client will raise an ```Insightly2::Errors::ClientError``` if the action failed or
79
+ an ```Insightly2::Errors::ResourceNotFoundError``` if the target resource cannot be found in the API.
80
+
81
+ Depending on your implementation you may want to rescue these errors as follows:
82
+
83
+ ```ruby
84
+ begin
85
+ Insightly2.client.delete_contact(id: 1)
86
+ rescue Insightly2::Errors::ResourceNotFoundError => e
87
+ Rails.logger.error "Insightly contact not found: #{e.response}"
88
+ rescue Insightly2::Errors::ClientError => e
89
+ Rails.logger.error "Insightly contact delete failed: #{e.response}"
90
+ end
91
+ ```
92
+ If you don't care whether or not the resource is found you can simply do the following:
93
+
94
+ ```ruby
95
+ begin
96
+ Insightly2.client.delete_contact(id: 1)
97
+ rescue Insightly2::Errors::ClientError => e
98
+ Rails.logger.error "Insightly contact delete failed: #{e.response}"
99
+ end
100
+ ```
101
+ This will also catch ```Insightly2::Errors::ResourceNotFoundError``` but is less specific.
102
+
103
+ ## API docs
104
+
105
+ [Insightly API Documentation](https://api.insight.ly/v2.1/Help)
106
+
107
+ ## Contributing
108
+
109
+ 1. Fork it ( https://github.com/insightly/ruby/fork )
110
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
111
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
112
+ 4. Push to the branch (`git push origin my-new-feature`)
113
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1 @@
1
+ insightly_api_key: 'YOUR TESTING API KEY GOES HERE'
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'insightly2/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'insightly2'
8
+ spec.version = Insightly2::VERSION
9
+ spec.authors = ['Alexander Semyonov', 'Michael Kompanets', 'David Iorns']
10
+ spec.email = ['al@semyonov.us', 'michael@scienceexchange.com', 'david@scienceexchange.com']
11
+ spec.summary = 'A Ruby wrapper for the Insightly v2.1 API https://api.insight.ly/v2.1/Help'
12
+ spec.homepage = 'https://github.com/insightly/ruby'
13
+
14
+ spec.files = `git ls-files -z`.split("\x0")
15
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.require_paths = ['lib']
18
+
19
+ spec.required_ruby_version = '>= 2.0.0'
20
+
21
+ spec.add_dependency 'faraday'
22
+ spec.add_dependency 'activesupport'
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.6'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec', '~> 3.0.0'
27
+ spec.add_development_dependency 'webmock', '~> 1.18.0'
28
+ spec.add_development_dependency 'vcr'
29
+ end
@@ -0,0 +1,54 @@
1
+ require 'faraday'
2
+ require 'json'
3
+ require 'openssl'
4
+ require 'active_support/all'
5
+ require 'insightly2/dsl'
6
+ require 'insightly2/errors'
7
+
8
+ module Insightly2
9
+ class Client
10
+ include DSL
11
+ include Errors
12
+
13
+ URL = 'https://api.insight.ly/v2.1/'
14
+ REQUESTS = [:get, :post, :put, :delete]
15
+ HEADERS = {'Accept' => 'application/json', 'Content-Type' => 'application/json'}
16
+
17
+ # @param [String] api_key
18
+ def initialize(api_key = Insightly2.api_key)
19
+ @api_key = api_key
20
+
21
+ # Setup HTTP request connection to insightly.
22
+ @connection ||= Faraday.new do |builder|
23
+ builder.basic_auth @api_key, ''
24
+ builder.request :url_encoded
25
+ builder.response :logger if Insightly2.logger
26
+ builder.adapter Faraday.default_adapter
27
+ end
28
+ end
29
+
30
+ # @param [:get, :post, :put, :delete] method.
31
+ # @param [String] path.
32
+ # @param [Hash] query (optional).
33
+ # @param [Hash] headers request headers (optional).
34
+ # @raise [ArgumentError] If the response is blank.
35
+ # @raise [ResourceNotFoundError] If the response code is 404.
36
+ # @raise [ClientError] If the response code is not in the success range.
37
+ # @return [Faraday::Response] server response.
38
+ def request(method, path, query = {}, headers = HEADERS)
39
+ raise ArgumentError, "Unsupported method #{method.inspect}. Only :get, :post, :put, :delete are allowed" unless REQUESTS.include?(method)
40
+
41
+ payload = !query.empty? ? JSON.generate(query) : ''
42
+ response = @connection.run_request(method, "#{URL}#{path}", payload, headers)
43
+
44
+ case response.status.to_i
45
+ when 200..299
46
+ return response
47
+ when 404
48
+ raise ResourceNotFoundError.new(response: response)
49
+ else
50
+ raise ClientError.new(response: response)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,47 @@
1
+ require 'insightly2/dsl'
2
+
3
+ module Insightly2
4
+ module DSL::Comments
5
+ # GET /v2.1/Comments/{id}
6
+ # Get a comment.
7
+ # @param [String, Fixnum] id A comment's ID.
8
+ # @raise [ArgumentError] If the method arguments are blank.
9
+ # @return [Insightly2::Resources::Comment, nil].
10
+ def get_comment(id:)
11
+ raise ArgumentError, "ID cannot be blank" if id.blank?
12
+ Resources::Comment.parse(request(:get, "Comments/#{id}"))
13
+ end
14
+
15
+ # POST /v2.1/Comments?c_id={c_id}&filename={filename}
16
+ # Adds a file attachment to a comment.
17
+ # @param [String, Fixnum] id A comment's ID.
18
+ # @param [String] filename The name of the attachment.
19
+ # @raise [ArgumentError] If the method arguments are blank.
20
+ # @return [Faraday::Response].
21
+ def create_comment_attachment(id:, filename:)
22
+ raise ArgumentError, "ID cannot be blank" if id.blank?
23
+ raise ArgumentError, "Filename cannot be blank" if filename.blank?
24
+ request(:post, "Comments/?c_id=#{id}&filename=#{filename}")
25
+ end
26
+
27
+ # PUT /v2.1/Comments
28
+ # Updates a comment.
29
+ # @param [Hash] comment The comment to update.
30
+ # @raise [ArgumentError] If the method arguments are blank.
31
+ # @return [Insightly2::Resources::Comment, nil].
32
+ def update_comment(comment:)
33
+ raise ArgumentError, "Comment cannot be blank" if comment.blank?
34
+ Resources::Comment.parse(request(:put, "Comments", comment))
35
+ end
36
+
37
+ # DELETE /v2.1/Comments/{id}
38
+ # Deletes a comment.
39
+ # @param [String, Fixnum] id A comment's ID.
40
+ # @raise [ArgumentError] If the method arguments are blank.
41
+ # @return [Faraday::Response].
42
+ def delete_comment(id:)
43
+ raise ArgumentError, "ID cannot be blank" if id.blank?
44
+ request(:delete, "Comments/#{id}")
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,130 @@
1
+ require 'insightly2/dsl'
2
+
3
+ module Insightly2
4
+ module DSL::Contacts
5
+ # GET /v2.1/Contacts/{id}
6
+ # Gets a contact by id.
7
+ # @param [String, Fixnum] id The ID of the contact.
8
+ # @raise [ArgumentError] If the method arguments are blank.
9
+ # @return [Insightly2::Resources::Contact, nil].
10
+ def get_contact(id:)
11
+ raise ArgumentError, "ID cannot be blank" if id.blank?
12
+ Resources::Contact.parse(request(:get, "Contacts/#{id}"))
13
+ end
14
+
15
+ # GET /v2.1/Contacts/{c_id}/Emails
16
+ # Gets a contact's emails.
17
+ # @param [id:] id of the contact.
18
+ # @raise [ArgumentError] If the method arguments are blank.
19
+ # @return [Array, nil].
20
+ def get_contact_emails(id:)
21
+ raise ArgumentError, "ID cannot be blank" if id.blank?
22
+ Resources::Email.parse(request(:get, "Contacts/#{id}/Emails"))
23
+ end
24
+
25
+ # GET /v2.1/Contacts/{c_id}/Image
26
+ # Gets a contact's image.
27
+ # @param [String, Fixnum] id The ID of the contact.
28
+ # @raise [ArgumentError] If the method arguments are blank.
29
+ # @return [Faraday::Response].
30
+ def get_contact_image(id:)
31
+ raise ArgumentError, "ID cannot be blank" if id.blank?
32
+ request(:get, "Contacts/#{id}/Image")
33
+ end
34
+
35
+ # GET /v2.1/Contacts/{c_id}/Notes
36
+ # Gets a contact's notes.
37
+ # @param [String, Fixnum] id The ID of the contact.
38
+ # @raise [ArgumentError] If the method arguments are blank.
39
+ # @return [Array, nil].
40
+ def get_contact_notes(id:)
41
+ raise ArgumentError, "ID cannot be blank" if id.blank?
42
+ Resources::Note.parse(request(:get, "Contacts/#{id}/Notes"))
43
+ end
44
+
45
+ # GET /v2.1/Contacts/{c_id}/Tasks
46
+ # Gets a contact's tasks.
47
+ # @param [String, Fixnum] id The ID of the contact.
48
+ # @raise [ArgumentError] If the method arguments are blank.
49
+ # @return [Array, nil].
50
+ def get_contact_tasks(id:)
51
+ raise ArgumentError, "ID cannot be blank" if id.blank?
52
+ Resources::Task.parse(request(:get, "Contacts/#{id}/Tasks"))
53
+ end
54
+
55
+ # GET /v2.1/Contacts?ids={ids}&email={email}&tag={tag}
56
+ # Get a list of contacts.
57
+ # @param [Array] ids The contact ids of the contacts to return (optional).
58
+ # @param [String] email The email address of the contact to return (optional).
59
+ # @param [String] tag The tag that has been applied to contacts (optional).
60
+ # @return [Array, nil].
61
+ def get_contacts(ids: [], email: '', tag: '')
62
+ url = Utils::UrlHelper.build_url(path: "Contacts", params: {ids: ids.join(','), email: email, tag: tag})
63
+ Resources::Contact.parse(request(:get, url))
64
+ end
65
+
66
+ # POST /v2.1/Contacts
67
+ # Creates a contact.
68
+ # @param [Hash] contact The contact to create.
69
+ # @raise [ArgumentError] If the method arguments are blank.
70
+ # @return [Insightly2::Resources::Contact, nil].
71
+ def create_contact(contact:)
72
+ raise ArgumentError, "Contact cannot be blank" if contact.blank?
73
+ Resources::Contact.parse(request(:post, "Contacts", contact))
74
+ end
75
+
76
+ # POST /v2.1/Contacts/{c_id}/Image/{filename}
77
+ # Adds a contact's image.
78
+ # @param [String, Fixnum] id The ID of the contact.
79
+ # @param [String] filename The name of image file to be attached to the contact.
80
+ # @raise [ArgumentError] If the method arguments are blank.
81
+ # @return [Faraday::Response].
82
+ def create_contact_image(id:, filename:)
83
+ raise ArgumentError, "ID cannot be blank" if id.blank?
84
+ raise ArgumentError, "Filename cannot be blank" if filename.blank?
85
+ request(:post, "Contacts/#{id}/Image/#{filename}")
86
+ end
87
+
88
+ # PUT /v2.1/Contacts
89
+ # Updates a contact.
90
+ # @param [Hash] contact The contact to update.
91
+ # @raise [ArgumentError] If the method arguments are blank.
92
+ # @return [Insightly2::Resources::Contact, nil].
93
+ def update_contact(contact:)
94
+ raise ArgumentError, "Contact cannot be blank" if contact.blank?
95
+ Resources::Contact.parse(request(:put, "Contacts", contact))
96
+ end
97
+
98
+ # PUT /v2.1/Contacts/{c_id}/Image/{filename}
99
+ # Updates a contact's image.
100
+ # @param [String, Fixnum] id The ID of the contact.
101
+ # @param [String] filename The name of image file to be attached to the contact.
102
+ # @raise [ArgumentError] If the method arguments are blank.
103
+ # @return [Faraday::Response].
104
+ def update_contact_image(id:, filename:)
105
+ raise ArgumentError, "ID cannot be blank" if id.blank?
106
+ raise ArgumentError, "Filename cannot be blank" if filename.blank?
107
+ request(:put, "Contacts/#{id}/Image/#{filename}")
108
+ end
109
+
110
+ # DELETE /v2.1/Contacts/{id}
111
+ # Deletes a contact.
112
+ # @param [String, Fixnum] id The ID of the contact to delete.
113
+ # @raise [ArgumentError] If the method arguments are blank.
114
+ # @return [Faraday::Response].
115
+ def delete_contact(id:)
116
+ raise ArgumentError, "ID cannot be blank" if id.blank?
117
+ request(:delete, "Contacts/#{id}")
118
+ end
119
+
120
+ # DELETE /v2.1/Contacts/{c_id}/Image
121
+ # Deletes a contact's image.
122
+ # @param [String, Fixnum] id The ID of the contact with the image to delete.
123
+ # @raise [ArgumentError] If the method arguments are blank.
124
+ # @return [Faraday::Response].
125
+ def delete_contact_image(id:)
126
+ raise ArgumentError, "ID cannot be blank" if id.blank?
127
+ request(:delete, "Contacts/#{id}/Image")
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,12 @@
1
+ require 'insightly2/dsl'
2
+
3
+ module Insightly2
4
+ module DSL::Countries
5
+ # GET /v2.1/Countries
6
+ # Get a list of countries.
7
+ # @return [Array, nil].
8
+ def get_countries
9
+ Resources::Country.parse(request(:get, "Countries"))
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'insightly2/dsl'
2
+
3
+ module Insightly2
4
+ module DSL::Currencies
5
+ # GET /v2.1/Currencies
6
+ # Get a list of currencies.
7
+ # @return [Array, nil].
8
+ def get_currencies
9
+ Resources::Currency.parse(request(:get, "Currencies"))
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,22 @@
1
+ require 'insightly2/dsl'
2
+
3
+ module Insightly2
4
+ module DSL::CustomFields
5
+ # GET /v2.1/CustomFields/{id}
6
+ # Get a custom field.
7
+ # @param [String, Fixnum] id A CustomField's ID.
8
+ # @raise [ArgumentError] If the method arguments are blank.
9
+ # @return [Insightly2::Resources::CustomField, nil].
10
+ def get_custom_field(id:)
11
+ raise ArgumentError, "ID cannot be blank" if id.blank?
12
+ Resources::CustomField.parse(request(:get, "CustomFields/#{id}"))
13
+ end
14
+
15
+ # GET /v2.1/CustomFields
16
+ # Get a list of custom fields.
17
+ # @return [Array, nil].
18
+ def get_custom_fields
19
+ Resources::CustomField.parse(request(:get, "CustomFields"))
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,57 @@
1
+ require 'insightly2/dsl'
2
+
3
+ module Insightly2
4
+ module DSL::Emails
5
+ # GET /v2.1/Emails/{id}
6
+ # Gets an email.
7
+ # @param [String, Fixnum] id The ID of the email.
8
+ # @raise [ArgumentError] If the method arguments are blank.
9
+ # @return [Insightly2::Resources::Email, nil]
10
+ def get_email(id:)
11
+ raise ArgumentError, "ID cannot be blank" if id.blank?
12
+ Resources::Email.parse(request(:get, "Emails/#{id}"))
13
+ end
14
+
15
+ # GET /v2.1/Emails/{c_id}/Comments
16
+ # Gets an email's comments.
17
+ # @param [String, Fixnum] id The ID of the email.
18
+ # @raise [ArgumentError] If the method arguments are blank.
19
+ # @return [Array, nil].
20
+ def get_email_comments(id:)
21
+ raise ArgumentError, "ID cannot be blank" if id.blank?
22
+ Resources::Comment.parse(request(:get, "Emails/#{id}/Comments"))
23
+ end
24
+
25
+ # GET /v2.1/Emails?ids={ids}&tag={tag}
26
+ # Gets a list of Emails.
27
+ # @param [Array] ids The list of email IDs (optional).
28
+ # @param [String] tag Emails tagged with this tag (optional).
29
+ # @return [Array, nil].
30
+ def get_emails(ids: [], tag: '')
31
+ url = Utils::UrlHelper.build_url(path: "Emails", params: {ids: ids.join(','), tag: tag})
32
+ Resources::Email.parse(request(:get, url))
33
+ end
34
+
35
+ # POST /v2.1/Emails/{c_id}/Comments
36
+ # Create a comment for a task.
37
+ # @param [String, Fixnum] id A task's ID.
38
+ # @param [Hash] comment The comment to create.
39
+ # @raise [ArgumentError] If the method arguments are blank.
40
+ # @return [Faraday::Response].
41
+ def create_email_comment(id:, comment:)
42
+ raise ArgumentError, "ID cannot be blank" if id.blank?
43
+ raise ArgumentError, "Comment cannot be blank" if comment.blank?
44
+ request(:post, "Emails/#{id}/Comments", comment)
45
+ end
46
+
47
+ # DELETE /v2.1/Emails/{id}
48
+ # Deletes an email.
49
+ # @param [String, Fixnum] id The ID of the email to delete.
50
+ # @raise [ArgumentError] If the method arguments are blank.
51
+ # @return [Faraday::Response].
52
+ def delete_email(id:)
53
+ raise ArgumentError, "ID cannot be blank" if id.blank?
54
+ request(:delete, "Emails/#{id}")
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,52 @@
1
+ require 'insightly2/dsl'
2
+
3
+ module Insightly2
4
+ module DSL::Events
5
+ # GET /v2.1/Events/{id}
6
+ # Get an event.
7
+ # @param [String, Fixnum] id An event's ID.
8
+ # @raise [ArgumentError] If the method arguments are blank.
9
+ # @return [Insightly2::Resources::Event, nil].
10
+ def get_event(id:)
11
+ raise ArgumentError, "ID cannot be blank" if id.blank?
12
+ Resources::Event.parse(request(:get, "Events/#{id}"))
13
+ end
14
+
15
+ # GET /v2.1/Events
16
+ # Get a list of events.
17
+ # @return [Insightly2::Resources::Event, nil]
18
+ def get_events
19
+ Resources::Event.parse(request(:get, "Events"))
20
+ end
21
+
22
+ # POST /v2.1/Events
23
+ # Create an event.
24
+ # @param [Hash] event The event to create.
25
+ # @raise [ArgumentError] If the method arguments are blank.
26
+ # @return [Insightly2::Resources::Event, nil]
27
+ def create_event(event:)
28
+ raise ArgumentError, "Event cannot be blank" if event.blank?
29
+ Resources::Event.parse(request(:post, "Events", event))
30
+ end
31
+
32
+ # PUT /v2.1/Events
33
+ # Update an event.
34
+ # @param [Hash] event The event to update.
35
+ # @raise [ArgumentError] If the method arguments are blank.
36
+ # @return [Insightly2::Resources::Event, nil]
37
+ def update_event(event:)
38
+ raise ArgumentError, "Event cannot be blank" if event.blank?
39
+ Resources::Event.parse(request(:put, "Events", event))
40
+ end
41
+
42
+ # DELETE /v2.1/Events/{id}
43
+ # Delete an event.
44
+ # @param [String, Fixnum] id An event's ID.
45
+ # @raise [ArgumentError] If the method arguments are blank.
46
+ # @return [Faraday::Response].
47
+ def delete_event(id:)
48
+ raise ArgumentError, "ID cannot be blank" if id.blank?
49
+ request(:delete, "Events/#{id}")
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,14 @@
1
+ require 'insightly2/dsl'
2
+
3
+ module Insightly2
4
+ module DSL::FileAttachments
5
+ # GET /v2.1/FileAttachments/{id}
6
+ # @param [String, Fixnum] id A file attachment's ID.
7
+ # @raise [ArgumentError] If the method arguments are blank.
8
+ # @return [Faraday::Response].
9
+ def get_file_attachment(id:)
10
+ raise ArgumentError, "ID cannot be blank" if id.blank?
11
+ request(:get, "FileAttachments/#{id}")
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,52 @@
1
+ require 'insightly2/dsl'
2
+
3
+ module Insightly2
4
+ module DSL::FileCategories
5
+ # GET /v2.1/FileCategories/{id}
6
+ # Get a file category.
7
+ # @param [String, Fixnum] id: A file category's ID.
8
+ # @raise [ArgumentError] If the method arguments are blank.
9
+ # @return [Insightly2::Resources::FileCategory, nil].
10
+ def get_file_category(id:)
11
+ raise ArgumentError, "ID cannot be blank" if id.blank?
12
+ Resources::FileCategory.parse(request(:get, "FileCategories/#{id}"))
13
+ end
14
+
15
+ # GET /v2.1/FileCategories
16
+ # Get a list of file categories.
17
+ # @return [Array, nil].
18
+ def get_file_categories
19
+ Resources::FileCategory.parse(request(:get, "FileCategories"))
20
+ end
21
+
22
+ # POST /v2.1/FileCategories
23
+ # Create a file category.
24
+ # @param [Hash] category: File Category attributes.
25
+ # @raise [ArgumentError] If the method arguments are blank.
26
+ # @return [Insightly2::Resources::FileCategory, nil].
27
+ def create_file_category(category:)
28
+ raise ArgumentError, "Category cannot be blank" if category.blank?
29
+ Resources::FileCategory.parse(request(:post, "FileCategories", category))
30
+ end
31
+
32
+ # PUT /v2.1/FileCategories
33
+ # Update a file category.
34
+ # @param [Hash] category: File Category attributes.
35
+ # @raise [ArgumentError] If the method arguments are blank.
36
+ # @return [Insightly2::Resources::FileCategory].
37
+ def update_file_category(category:)
38
+ raise ArgumentError, "Category cannot be blank" if category.blank?
39
+ Resources::FileCategory.parse(request(:put, "FileCategories", category))
40
+ end
41
+
42
+ # DELETE /v2.1/FileCategories/{id}
43
+ # Delete a file category.
44
+ # @param [String, Fixnum] id: A file category's ID.
45
+ # @raise [ArgumentError] If the method arguments are blank.
46
+ # @return [Faraday::Response].
47
+ def delete_file_category(id:)
48
+ raise ArgumentError, "ID cannot be blank" if id.blank?
49
+ request(:delete, "FileCategories/#{id}")
50
+ end
51
+ end
52
+ end