fat_zebra 2.0.13 → 3.0.0

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 (233) hide show
  1. checksums.yaml +5 -13
  2. data/.rubocop.yml +42 -0
  3. data/.travis.yml +9 -2
  4. data/Gemfile +1 -1
  5. data/{README.markdown → README.md} +19 -20
  6. data/Rakefile +2 -12
  7. data/fat_zebra.gemspec +27 -0
  8. data/lib/fat_zebra/api_operation/delete.rb +38 -0
  9. data/lib/fat_zebra/api_operation/find.rb +23 -0
  10. data/lib/fat_zebra/api_operation/save.rb +62 -0
  11. data/lib/fat_zebra/api_operation/search.rb +32 -0
  12. data/lib/fat_zebra/api_operation/void.rb +52 -0
  13. data/lib/fat_zebra/api_resource.rb +135 -0
  14. data/lib/fat_zebra/bank_account.rb +21 -0
  15. data/lib/fat_zebra/batch.rb +56 -0
  16. data/lib/fat_zebra/card.rb +22 -0
  17. data/lib/fat_zebra/config.rb +65 -25
  18. data/lib/fat_zebra/customer.rb +27 -0
  19. data/lib/fat_zebra/direct_credit.rb +27 -0
  20. data/lib/fat_zebra/direct_debit.rb +27 -0
  21. data/lib/fat_zebra/errors.rb +18 -4
  22. data/lib/fat_zebra/fat_zebra_object.rb +179 -0
  23. data/lib/fat_zebra/information.rb +25 -0
  24. data/lib/fat_zebra/payment_plan.rb +62 -0
  25. data/lib/fat_zebra/purchase.rb +99 -0
  26. data/lib/fat_zebra/refund.rb +25 -0
  27. data/lib/fat_zebra/request/multipart/epilogue.rb +23 -0
  28. data/lib/fat_zebra/request/multipart/file_io.rb +40 -0
  29. data/lib/fat_zebra/request/multipart/param.rb +37 -0
  30. data/lib/fat_zebra/request/multipart/part.rb +28 -0
  31. data/lib/fat_zebra/request/multipart/stream.rb +55 -0
  32. data/lib/fat_zebra/request.rb +162 -0
  33. data/lib/fat_zebra/util.rb +70 -0
  34. data/lib/fat_zebra/validation.rb +47 -0
  35. data/lib/fat_zebra/version.rb +1 -1
  36. data/lib/fat_zebra/web_hook.rb +23 -0
  37. data/lib/fat_zebra.rb +51 -55
  38. data/spec/cassettes/FatZebra_BankAccount/_create/1_1_1.yml +57 -0
  39. data/spec/cassettes/FatZebra_BankAccount/_create/1_1_2.yml +57 -0
  40. data/spec/cassettes/FatZebra_BankAccount/_create/validations/1_1_3_1.yml +57 -0
  41. data/spec/cassettes/FatZebra_BankAccount/_search/1_2_1.yml +172 -0
  42. data/spec/cassettes/FatZebra_BankAccount/_search/1_2_2.yml +172 -0
  43. data/spec/cassettes/FatZebra_BankAccount/_search/1_2_3.yml +172 -0
  44. data/spec/cassettes/FatZebra_Batch/_create/1_1_1.yml +58 -0
  45. data/spec/cassettes/FatZebra_Batch/_create/1_1_2.yml +58 -0
  46. data/spec/cassettes/FatZebra_Batch/_create/validations/1_1_3_1.yml +57 -0
  47. data/spec/cassettes/FatZebra_Batch/_create/with_file/1_1_1_1.yml +58 -0
  48. data/spec/cassettes/FatZebra_Batch/_create/with_file/1_1_1_2.yml +58 -0
  49. data/spec/cassettes/FatZebra_Batch/_create/with_path/1_1_2_1.yml +58 -0
  50. data/spec/cassettes/FatZebra_Batch/_create/with_path/1_1_2_2.yml +58 -0
  51. data/spec/cassettes/FatZebra_Batch/_find/1_2_1.yml +109 -0
  52. data/spec/cassettes/FatZebra_Batch/_find/1_2_2.yml +109 -0
  53. data/spec/cassettes/FatZebra_Batch/_result/1_4_1.yml +160 -0
  54. data/spec/cassettes/FatZebra_Batch/_search/1_3_1.yml +54 -0
  55. data/spec/cassettes/FatZebra_Batch/_search/1_3_2.yml +54 -0
  56. data/spec/cassettes/FatZebra_Batch/_search/1_3_3.yml +54 -0
  57. data/spec/cassettes/FatZebra_Card/_create/1_1_1.yml +55 -0
  58. data/spec/cassettes/FatZebra_Card/_create/1_1_2.yml +55 -0
  59. data/spec/cassettes/FatZebra_Card/_create/1_1_3.yml +55 -0
  60. data/spec/cassettes/FatZebra_Card/_create/1_1_4.yml +55 -0
  61. data/spec/cassettes/FatZebra_Card/_create/1_1_5.yml +55 -0
  62. data/spec/cassettes/FatZebra_Card/_create/1_1_6.yml +55 -0
  63. data/spec/cassettes/FatZebra_Card/_create/validations/1_1_7_1.yml +56 -0
  64. data/spec/cassettes/FatZebra_Card/_update/1_2_1.yml +105 -0
  65. data/spec/cassettes/FatZebra_Card/_update/1_2_2.yml +105 -0
  66. data/spec/cassettes/FatZebra_Card/_update/1_2_3.yml +105 -0
  67. data/spec/cassettes/FatZebra_Card/_update/validations/1_2_4_1.yml +55 -0
  68. data/spec/cassettes/FatZebra_Customer/_create/1_1_1.yml +59 -0
  69. data/spec/cassettes/FatZebra_Customer/_create/1_1_2.yml +59 -0
  70. data/spec/cassettes/FatZebra_Customer/_create/1_1_3.yml +59 -0
  71. data/spec/cassettes/FatZebra_Customer/_create/1_1_4.yml +59 -0
  72. data/spec/cassettes/FatZebra_Customer/_create/1_1_5.yml +59 -0
  73. data/spec/cassettes/FatZebra_Customer/_create/1_1_6.yml +59 -0
  74. data/spec/cassettes/FatZebra_Customer/_create/validations/1_1_7_1.yml +56 -0
  75. data/spec/cassettes/FatZebra_Customer/_delete/1_4_1.yml +113 -0
  76. data/spec/cassettes/FatZebra_Customer/_delete/1_5_1.yml +113 -0
  77. data/spec/cassettes/FatZebra_Customer/_find/1_2_1.yml +111 -0
  78. data/spec/cassettes/FatZebra_Customer/_find/1_2_2.yml +111 -0
  79. data/spec/cassettes/FatZebra_Customer/_find/1_3_1.yml +111 -0
  80. data/spec/cassettes/FatZebra_Customer/_find/1_3_2.yml +111 -0
  81. data/spec/cassettes/FatZebra_Customer/_search/1_2_1.yml +56 -0
  82. data/spec/cassettes/FatZebra_Customer/_search/1_2_2.yml +56 -0
  83. data/spec/cassettes/FatZebra_Customer/_search/1_2_3.yml +56 -0
  84. data/spec/cassettes/FatZebra_Customer/_update/1_3_1.yml +114 -0
  85. data/spec/cassettes/FatZebra_Customer/_update/1_3_2.yml +114 -0
  86. data/spec/cassettes/FatZebra_Customer/_update/1_4_1.yml +114 -0
  87. data/spec/cassettes/FatZebra_Customer/_update/1_4_2.yml +114 -0
  88. data/spec/cassettes/FatZebra_DirectCredit/_create/1_1_1.yml +56 -0
  89. data/spec/cassettes/FatZebra_DirectCredit/_create/1_1_2.yml +56 -0
  90. data/spec/cassettes/FatZebra_DirectCredit/_create/1_1_3.yml +56 -0
  91. data/spec/cassettes/FatZebra_DirectCredit/_create/1_1_4.yml +56 -0
  92. data/spec/cassettes/FatZebra_DirectCredit/_create/validations/1_1_5_1.yml +59 -0
  93. data/spec/cassettes/FatZebra_DirectCredit/_delete/1_4_1.yml +109 -0
  94. data/spec/cassettes/FatZebra_DirectCredit/_find/1_2_1.yml +107 -0
  95. data/spec/cassettes/FatZebra_DirectCredit/_find/1_2_2.yml +107 -0
  96. data/spec/cassettes/FatZebra_DirectCredit/_search/1_3_1.yml +160 -0
  97. data/spec/cassettes/FatZebra_DirectCredit/_search/1_3_2.yml +160 -0
  98. data/spec/cassettes/FatZebra_DirectDebit/_create/1_1_1.yml +56 -0
  99. data/spec/cassettes/FatZebra_DirectDebit/_create/1_1_2.yml +56 -0
  100. data/spec/cassettes/FatZebra_DirectDebit/_create/1_1_3.yml +56 -0
  101. data/spec/cassettes/FatZebra_DirectDebit/_create/1_1_4.yml +56 -0
  102. data/spec/cassettes/FatZebra_DirectDebit/_create/validations/1_1_5_1.yml +59 -0
  103. data/spec/cassettes/FatZebra_DirectDebit/_delete/1_4_1.yml +109 -0
  104. data/spec/cassettes/FatZebra_DirectDebit/_find/1_2_1.yml +107 -0
  105. data/spec/cassettes/FatZebra_DirectDebit/_find/1_2_2.yml +107 -0
  106. data/spec/cassettes/FatZebra_DirectDebit/_search/1_3_1.yml +160 -0
  107. data/spec/cassettes/FatZebra_DirectDebit/_search/1_3_2.yml +160 -0
  108. data/spec/cassettes/FatZebra_Information/_ping/1_1_1.yml +54 -0
  109. data/spec/cassettes/FatZebra_Information/_ping/1_1_2.yml +54 -0
  110. data/spec/cassettes/FatZebra_PaymentPlan/_active_/1_7_1.yml +238 -0
  111. data/spec/cassettes/FatZebra_PaymentPlan/_active_/1_7_2.yml +238 -0
  112. data/spec/cassettes/FatZebra_PaymentPlan/_active_/1_8_1.yml +238 -0
  113. data/spec/cassettes/FatZebra_PaymentPlan/_active_/1_8_2.yml +238 -0
  114. data/spec/cassettes/FatZebra_PaymentPlan/_create/1_1_1.yml +118 -0
  115. data/spec/cassettes/FatZebra_PaymentPlan/_create/1_1_2.yml +118 -0
  116. data/spec/cassettes/FatZebra_PaymentPlan/_create/1_1_3.yml +118 -0
  117. data/spec/cassettes/FatZebra_PaymentPlan/_create/validations/1_1_4_1.yml +55 -0
  118. data/spec/cassettes/FatZebra_PaymentPlan/_delete/1_5_1.yml +172 -0
  119. data/spec/cassettes/FatZebra_PaymentPlan/_destroy/1_6_1.yml +172 -0
  120. data/spec/cassettes/FatZebra_PaymentPlan/_find/1_2_1.yml +175 -0
  121. data/spec/cassettes/FatZebra_PaymentPlan/_find/1_2_2.yml +175 -0
  122. data/spec/cassettes/FatZebra_PaymentPlan/_find/1_2_3.yml +175 -0
  123. data/spec/cassettes/FatZebra_PaymentPlan/_suspend_/1_6_1.yml +178 -0
  124. data/spec/cassettes/FatZebra_PaymentPlan/_suspend_/1_6_2.yml +178 -0
  125. data/spec/cassettes/FatZebra_PaymentPlan/_suspend_/1_7_1.yml +178 -0
  126. data/spec/cassettes/FatZebra_PaymentPlan/_suspend_/1_7_2.yml +178 -0
  127. data/spec/cassettes/FatZebra_PaymentPlan/_update/1_3_1.yml +172 -0
  128. data/spec/cassettes/FatZebra_PaymentPlan/_update/1_3_2.yml +172 -0
  129. data/spec/cassettes/FatZebra_PaymentPlan/_update/1_3_3.yml +172 -0
  130. data/spec/cassettes/FatZebra_PaymentPlan/_update/1_4_1.yml +178 -0
  131. data/spec/cassettes/FatZebra_PaymentPlan/_update/1_4_2.yml +178 -0
  132. data/spec/cassettes/FatZebra_Purchase/_capture/1_5_1.yml +111 -0
  133. data/spec/cassettes/FatZebra_Purchase/_capture/1_5_2.yml +111 -0
  134. data/spec/cassettes/FatZebra_Purchase/_capture/1_6_1.yml +111 -0
  135. data/spec/cassettes/FatZebra_Purchase/_capture/1_6_2.yml +111 -0
  136. data/spec/cassettes/FatZebra_Purchase/_create/1_1_1.yml +57 -0
  137. data/spec/cassettes/FatZebra_Purchase/_create/1_1_10.yml +57 -0
  138. data/spec/cassettes/FatZebra_Purchase/_create/1_1_11.yml +57 -0
  139. data/spec/cassettes/FatZebra_Purchase/_create/1_1_12.yml +57 -0
  140. data/spec/cassettes/FatZebra_Purchase/_create/1_1_2.yml +57 -0
  141. data/spec/cassettes/FatZebra_Purchase/_create/1_1_3.yml +57 -0
  142. data/spec/cassettes/FatZebra_Purchase/_create/1_1_4.yml +57 -0
  143. data/spec/cassettes/FatZebra_Purchase/_create/1_1_5.yml +57 -0
  144. data/spec/cassettes/FatZebra_Purchase/_create/1_1_6.yml +57 -0
  145. data/spec/cassettes/FatZebra_Purchase/_create/1_1_7.yml +57 -0
  146. data/spec/cassettes/FatZebra_Purchase/_create/1_1_8.yml +57 -0
  147. data/spec/cassettes/FatZebra_Purchase/_create/1_1_9.yml +57 -0
  148. data/spec/cassettes/FatZebra_Purchase/_find/1_2_1.yml +109 -0
  149. data/spec/cassettes/FatZebra_Purchase/_find/1_2_2.yml +109 -0
  150. data/spec/cassettes/FatZebra_Purchase/_find/1_2_3.yml +109 -0
  151. data/spec/cassettes/FatZebra_Purchase/_find/1_4_1.yml +109 -0
  152. data/spec/cassettes/FatZebra_Purchase/_find/1_4_2.yml +109 -0
  153. data/spec/cassettes/FatZebra_Purchase/_find/1_4_3.yml +109 -0
  154. data/spec/cassettes/FatZebra_Purchase/_refund/1_4_1.yml +111 -0
  155. data/spec/cassettes/FatZebra_Purchase/_refund/1_4_2.yml +111 -0
  156. data/spec/cassettes/FatZebra_Purchase/_refund/1_5_1.yml +111 -0
  157. data/spec/cassettes/FatZebra_Purchase/_refund/1_5_2.yml +111 -0
  158. data/spec/cassettes/FatZebra_Purchase/_search/1_3_1.yml +170 -0
  159. data/spec/cassettes/FatZebra_Purchase/_search/1_3_2.yml +170 -0
  160. data/spec/cassettes/FatZebra_Purchase/_search/1_3_3.yml +170 -0
  161. data/spec/cassettes/FatZebra_Purchase/_search/with_data/1_3_2_1.yml +164 -0
  162. data/spec/cassettes/FatZebra_Purchase/_search/with_data/1_3_2_2.yml +165 -0
  163. data/spec/cassettes/FatZebra_Purchase/_search/with_data/1_3_2_3.yml +164 -0
  164. data/spec/cassettes/FatZebra_Purchase/_search/without_data/1_3_1_1.yml +54 -0
  165. data/spec/cassettes/FatZebra_Purchase/_search/without_data/1_3_1_2.yml +54 -0
  166. data/spec/cassettes/FatZebra_Purchase/_search/without_data/1_3_1_3.yml +54 -0
  167. data/spec/cassettes/FatZebra_Purchase/_settlement/1_8_1.yml +613 -0
  168. data/spec/cassettes/FatZebra_Purchase/_settlement/1_8_2.yml +615 -0
  169. data/spec/cassettes/FatZebra_Purchase/_settlement/1_8_3.yml +617 -0
  170. data/spec/cassettes/FatZebra_Purchase/_void/1_6_1.yml +111 -0
  171. data/spec/cassettes/FatZebra_Purchase/_void/1_6_2.yml +111 -0
  172. data/spec/cassettes/FatZebra_Purchase/_void/1_6_3.yml +111 -0
  173. data/spec/cassettes/FatZebra_Purchase/_void/1_7_1.yml +111 -0
  174. data/spec/cassettes/FatZebra_Purchase/_void/1_7_2.yml +111 -0
  175. data/spec/cassettes/FatZebra_Purchase/_void/1_7_3.yml +111 -0
  176. data/spec/cassettes/FatZebra_Refund/_create/1_1_1.yml +111 -0
  177. data/spec/cassettes/FatZebra_Refund/_create/1_1_2.yml +111 -0
  178. data/spec/cassettes/FatZebra_Refund/_create/1_1_3.yml +111 -0
  179. data/spec/cassettes/FatZebra_Refund/_create/1_1_4.yml +111 -0
  180. data/spec/cassettes/FatZebra_Refund/_create/1_1_5.yml +111 -0
  181. data/spec/cassettes/FatZebra_Refund/_create/1_1_6.yml +111 -0
  182. data/spec/cassettes/FatZebra_Refund/_create/1_1_7.yml +111 -0
  183. data/spec/cassettes/FatZebra_Refund/_create/1_1_8.yml +111 -0
  184. data/spec/cassettes/FatZebra_Refund/_create/1_1_9.yml +111 -0
  185. data/spec/cassettes/FatZebra_Refund/_find/1_2_1.yml +163 -0
  186. data/spec/cassettes/FatZebra_Refund/_find/1_2_2.yml +163 -0
  187. data/spec/cassettes/FatZebra_Refund/_search/1_3_1.yml +281 -0
  188. data/spec/cassettes/FatZebra_Refund/_search/1_3_2.yml +281 -0
  189. data/spec/cassettes/FatZebra_Refund/_void/1_4_1.yml +165 -0
  190. data/spec/cassettes/FatZebra_Refund/_void/1_4_2.yml +165 -0
  191. data/spec/cassettes/FatZebra_Refund/_void/1_4_3.yml +165 -0
  192. data/spec/cassettes/FatZebra_WebHook/_create/1_1_1.yml +57 -0
  193. data/spec/cassettes/FatZebra_WebHook/_create/1_1_2.yml +57 -0
  194. data/spec/cassettes/FatZebra_WebHook/_create/1_1_3.yml +57 -0
  195. data/spec/cassettes/FatZebra_WebHook/_create/validations/1_1_4_1.yml +56 -0
  196. data/spec/cassettes/FatZebra_WebHook/_delete/1_4_1.yml +111 -0
  197. data/spec/cassettes/FatZebra_WebHook/_search/1_2_1.yml +222 -0
  198. data/spec/cassettes/FatZebra_WebHook/_search/1_2_2.yml +224 -0
  199. data/spec/cassettes/FatZebra_WebHook/_update/1_3_1.yml +112 -0
  200. data/spec/cassettes/FatZebra_WebHook/_update/1_3_2.yml +112 -0
  201. data/spec/fixtures/batch_test.csv +4 -0
  202. data/spec/lib/fat_zebra/bank_account_spec.rb +34 -0
  203. data/spec/lib/fat_zebra/batch_spec.rb +59 -0
  204. data/spec/lib/fat_zebra/card_spec.rb +41 -0
  205. data/spec/lib/fat_zebra/config_spec.rb +52 -0
  206. data/spec/lib/fat_zebra/customer_spec.rb +53 -0
  207. data/spec/lib/fat_zebra/direct_credit_spec.rb +53 -0
  208. data/spec/lib/fat_zebra/direct_debit_spec.rb +53 -0
  209. data/spec/lib/fat_zebra/fat_zebra_object_spec.rb +116 -0
  210. data/spec/lib/fat_zebra/information_spec.rb +13 -0
  211. data/spec/lib/fat_zebra/payment_plan_spec.rb +94 -0
  212. data/spec/lib/fat_zebra/purchase_spec.rb +92 -0
  213. data/spec/lib/fat_zebra/refund_spec.rb +72 -0
  214. data/spec/lib/fat_zebra/util_spec.rb +24 -0
  215. data/spec/lib/fat_zebra/validation_spec.rb +22 -0
  216. data/spec/lib/fat_zebra/web_hook_spec.rb +50 -0
  217. data/spec/spec_helper.rb +49 -3
  218. data/spec/support/payloads.rb +43 -0
  219. metadata +238 -65
  220. data/FatZebra.gemspec +0 -31
  221. data/lib/fat_zebra/constants.rb +0 -2
  222. data/lib/fat_zebra/gateway.rb +0 -292
  223. data/lib/fat_zebra/models/base.rb +0 -33
  224. data/lib/fat_zebra/models/card.rb +0 -49
  225. data/lib/fat_zebra/models/purchase.rb +0 -185
  226. data/lib/fat_zebra/models/refund.rb +0 -46
  227. data/lib/fat_zebra/models/response.rb +0 -33
  228. data/lib/rest-client/request_ext.rb +0 -15
  229. data/spec/config_spec.rb +0 -37
  230. data/spec/gateway_spec.rb +0 -120
  231. data/spec/models/purchase_spec.rb +0 -55
  232. data/spec/models/refund_spec.rb +0 -9
  233. data/spec/models/response_spec.rb +0 -25
@@ -0,0 +1,28 @@
1
+ module FatZebra
2
+ ##
3
+ # == FatZebra \Request \Multipart \Part
4
+ #
5
+ # Define one part
6
+ class Request
7
+ module Multipart
8
+ module Part
9
+
10
+ LINE_BREAK = "\r\n".freeze
11
+
12
+ def boundary
13
+ '----FatZebraMultipartPost'
14
+ end
15
+
16
+ def length
17
+ @io.length
18
+ end
19
+
20
+ def to_io
21
+ @io
22
+ end
23
+
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,55 @@
1
+ module FatZebra
2
+ ##
3
+ # == FatZebra \Request \Multipart \Steam
4
+ #
5
+ # Steam the multipart
6
+ class Request
7
+ module Multipart
8
+ class Stream
9
+
10
+ BINARY_ENCODING = 'BINARY'.freeze
11
+
12
+ def initialize(*ios)
13
+ @ios = ios.flatten
14
+ @index = 0
15
+ end
16
+
17
+ # rubocop:disable Metrics/CyclomaticComplexity
18
+ # rubocop:disable Metrics/PerceivedComplexity
19
+ def read(length = nil, outbuf = nil)
20
+ got_result = false
21
+ outbuf = outbuf ? outbuf.replace('') : ''
22
+
23
+ while current_io
24
+ result = current_io.read(length)
25
+
26
+ if result
27
+ got_result ||= !result.nil?
28
+ result.force_encoding(BINARY_ENCODING) if result.respond_to?(:force_encoding)
29
+ outbuf << result
30
+
31
+ length -= result.length if length
32
+ break if length == 0
33
+ end
34
+
35
+ next_io
36
+ end
37
+
38
+ !got_result && length ? nil : outbuf
39
+ end
40
+
41
+ private
42
+
43
+ def current_io
44
+ @ios[@index]
45
+ end
46
+
47
+ def next_io
48
+ @index += 1
49
+ end
50
+
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,162 @@
1
+ require 'fat_zebra/request/multipart/part'
2
+ require 'fat_zebra/request/multipart/stream'
3
+ require 'fat_zebra/request/multipart/epilogue'
4
+ require 'fat_zebra/request/multipart/file_io'
5
+ require 'fat_zebra/request/multipart/param'
6
+
7
+ module FatZebra
8
+ ##
9
+ # == FatZebra \Request
10
+ #
11
+ # Build request
12
+ class Request
13
+ class << self
14
+
15
+ def execute(params = {})
16
+ klass = new(params)
17
+
18
+ if params[:method] == :post
19
+ klass.post
20
+ elsif params[:method] == :put
21
+ klass.put
22
+ elsif params[:method] == :delete
23
+ klass.delete
24
+ elsif params[:method] == :get
25
+ klass.get
26
+ else
27
+ raise FatZebra::UnknownRequestMethod, "#{params[:method]} haven't been implemented"
28
+ end
29
+ end
30
+
31
+ def post(params = {})
32
+ new(params).post
33
+ end
34
+
35
+ def put(params = {})
36
+ new(params).put
37
+ end
38
+
39
+ def get(params = {})
40
+ new(params).get
41
+ end
42
+
43
+ def delete(params = {})
44
+ new(params).delete
45
+ end
46
+ end
47
+
48
+ attr_reader :params, :http, :request
49
+
50
+ def initialize(params = {})
51
+ @params = params
52
+ @http = Net::HTTP.new(uri.host, uri.port, uri_proxy.host, uri_proxy.port)
53
+
54
+ setup_ssl if params[:use_ssl]
55
+ end
56
+
57
+ def post
58
+ @request = Net::HTTP::Post.new(uri.path)
59
+
60
+ setup_auth_basic if params[:basic_auth]
61
+
62
+ if params[:payload] && params[:payload][:multipart]
63
+ build_multipart_post
64
+ else
65
+ set_header
66
+ request.body = params[:payload].to_json
67
+ end
68
+
69
+ handle_request
70
+ end
71
+
72
+ def put
73
+ @request = Net::HTTP::Put.new(uri.path)
74
+
75
+ setup_auth_basic if params[:basic_auth]
76
+ request.body = params[:payload].to_json
77
+
78
+ handle_request
79
+ end
80
+
81
+ def get
82
+ @request = Net::HTTP::Get.new(uri)
83
+
84
+ setup_auth_basic if params[:basic_auth]
85
+ set_header
86
+
87
+ handle_request
88
+ end
89
+
90
+ def delete
91
+ @request = Net::HTTP::Delete.new(uri.path)
92
+
93
+ setup_auth_basic if params[:basic_auth]
94
+ request.body = params[:payload].to_json
95
+
96
+ handle_request
97
+ end
98
+
99
+ private
100
+
101
+ def handle_request
102
+ response = http.request(request)
103
+
104
+ case [response.code_type]
105
+ when [Net::HTTPBadRequest]
106
+ raise RequestError, 'Bad Data'
107
+ when [Net::HTTPUnauthorized]
108
+ raise RequestError, 'Unauthorized, please check your username and token'
109
+ when [Net::HTTPNotFound]
110
+ raise RequestError, 'Requested Resource not found'
111
+ when [Net::HTTPInternalServerError]
112
+ raise RequestError, 'Server Error, please check with Gateway'
113
+ when [Net::HTTPNotImplemented]
114
+ raise RequestError, 'Problem processing your request - please check your data'
115
+ else
116
+ response
117
+ end
118
+ end
119
+
120
+ def build_multipart_post
121
+ parts = []
122
+ Util.hash_except(params[:payload], :multipart, :content_type).each do |(key, value)|
123
+ parts << (value.is_a?(File) ? Multipart::FileIO.new(params[:payload]) : Multipart::Param.new(key, value))
124
+ end
125
+ parts << Multipart::Epilogue.new
126
+
127
+ request.content_length = parts.inject(0) { |sum, part| sum + part.length }
128
+ request.content_type = 'multipart/form-data; boundary=' + parts.first.boundary
129
+ request.body_stream = Multipart::Stream.new(parts.map(&:to_io))
130
+ end
131
+
132
+ def setup_auth_basic
133
+ request.basic_auth(params[:basic_auth][:user], params[:basic_auth][:password])
134
+ end
135
+
136
+ def set_header
137
+ params[:headers].each do |(type, value)|
138
+ request[type.to_s] = value
139
+ end
140
+ end
141
+
142
+ def setup_ssl
143
+ http.use_ssl = true
144
+ http.ca_file = params[:ca_file]
145
+ http.verify_mode = params[:verify_mode]
146
+ end
147
+
148
+ def uri
149
+ @uri ||= URI(params[:url])
150
+ end
151
+
152
+ def uri_proxy
153
+ @uri_proxy ||=
154
+ if params[:proxy]
155
+ URI(params[:proxy])
156
+ else
157
+ OpenStruct.new
158
+ end
159
+ end
160
+
161
+ end
162
+ end
@@ -0,0 +1,70 @@
1
+ module FatZebra
2
+ module Util
3
+ class << self
4
+
5
+ DATE_FORMAT = '%Y/%m/%d'.freeze
6
+
7
+ ##
8
+ # Remove nil value from hash
9
+ #
10
+ # @return [Hash]
11
+ def compact(hash)
12
+ hash.reject { |_, value| value.nil? }
13
+ end
14
+
15
+ ##
16
+ # Encodes a hash of parameters in a way that's suitable for use as query
17
+ # parameters in a URI or as form parameters in a request body. This mainly
18
+ # involves escaping special characters from parameter keys and values (e.g.
19
+ # `&`).
20
+ def encode_parameters(params)
21
+ params.map { |k, v| "#{url_encode(k)}=#{url_encode(v)}" }.join('&')
22
+ end
23
+
24
+ ##
25
+ # Encodes a string in a way that makes it suitable for use in a set of
26
+ # query parameters in a URI or in a set of form parameters in a request
27
+ # body.
28
+ def url_encode(key)
29
+ CGI.escape(key.to_s).gsub('%5B', '[').gsub('%5D', ']')
30
+ end
31
+
32
+ ##
33
+ # Convert string to underscore
34
+ #
35
+ # @param [String]
36
+ #
37
+ # @example
38
+ # underscore('MyModel') => 'my_model'
39
+ def underscore(string)
40
+ string
41
+ .gsub(/::/, '/')
42
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
43
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
44
+ .tr('-', '_')
45
+ .downcase
46
+ end
47
+
48
+ def hash_except(hash, *keys)
49
+ copy = hash.dup
50
+ keys.each { |key| copy.delete(key) }
51
+ copy
52
+ end
53
+
54
+ ##
55
+ # Format Date attribute in the params
56
+ #
57
+ # @param [Hash] params
58
+ #
59
+ # @return [Hash] date formated params
60
+ def format_dates_in_hash(hash)
61
+ hash.each do |(key, value)|
62
+ hash[key] = value.strftime(DATE_FORMAT) if value.is_a?(DateTime) || value.is_a?(Time) || value.is_a?(Date)
63
+ end
64
+
65
+ hash
66
+ end
67
+
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,47 @@
1
+ module FatZebra
2
+ module Validation
3
+
4
+ def validates(name, options = {})
5
+ validations[name] = options
6
+ end
7
+
8
+ def valid?(params, action = nil)
9
+ @errors = []
10
+
11
+ validations.each do |(field, options)|
12
+ next unless options[:on] == action
13
+
14
+ Util.hash_except(options, :on).each do |(validation_attribute, validation_options)|
15
+ send("validate_#{validation_attribute}", field, validation_options, params)
16
+ end
17
+ end
18
+
19
+ errors.empty?
20
+ end
21
+
22
+ def valid!(params, action = nil)
23
+ raise RequestValidationError, "The following errors prevent the transaction from being submitted: #{errors.join(', ')}" unless valid?(params, action)
24
+ end
25
+
26
+ def errors
27
+ @errors ||= []
28
+ end
29
+
30
+ private
31
+
32
+ def validations
33
+ @validations ||= {}
34
+ end
35
+
36
+ def validate_required(field, options, params)
37
+ return if options.is_a?(Hash) && options[:unless] && options[:unless].any? { |f| params[f] }
38
+
39
+ errors << "'#{field}' is required" if params[field].nil? || params[field] == ''
40
+ end
41
+
42
+ def validate_class_type(field, options, params)
43
+ errors << "'#{field}' is not a '#{options}'" unless params[field].is_a?(options)
44
+ end
45
+
46
+ end
47
+ end
@@ -1,3 +1,3 @@
1
1
  module FatZebra
2
- VERSION = "2.0.13"
2
+ VERSION = '3.0.0'.freeze
3
3
  end
@@ -0,0 +1,23 @@
1
+ module FatZebra
2
+ ##
3
+ # == FatZebra \Web \Hook
4
+ #
5
+ # Manage web hook for the API
6
+ #
7
+ # * search
8
+ # * save
9
+ # * delete
10
+ #
11
+ class WebHook < APIResource
12
+
13
+ extend FatZebra::APIOperation::Search
14
+
15
+ include FatZebra::APIOperation::Save
16
+ include FatZebra::APIOperation::Delete
17
+
18
+ validates :events, required: true, on: :create
19
+ validates :mode, required: true, on: :create
20
+ validates :address, required: true, on: :create
21
+
22
+ end
23
+ end
data/lib/fat_zebra.rb CHANGED
@@ -1,61 +1,57 @@
1
+ # Libraries
1
2
  require 'securerandom'
2
- require 'json'
3
- require 'rest_client'
4
- require 'active_support'
5
- require 'active_support/core_ext'
6
- require 'forwardable'
7
-
8
- require_relative 'rest-client/request_ext'
9
- require_relative 'fat_zebra/config'
10
- require_relative 'fat_zebra/errors'
11
- require_relative 'fat_zebra/version'
12
- require_relative 'fat_zebra/constants'
13
- require_relative 'fat_zebra/gateway'
14
- require_relative 'fat_zebra/models/base'
15
- require_relative 'fat_zebra/models/purchase'
16
- require_relative 'fat_zebra/models/refund'
17
- require_relative 'fat_zebra/models/card'
18
- require_relative 'fat_zebra/models/response'
19
-
20
- RestClient::Request.class_eval do
21
- include RestClientExt::ProxyRequest
22
- end
23
3
 
4
+ require 'fat_zebra/version'
5
+ require 'fat_zebra/util'
6
+ require 'fat_zebra/config'
7
+ require 'fat_zebra/errors'
8
+ require 'fat_zebra/validation'
9
+ require 'fat_zebra/fat_zebra_object'
10
+ require 'fat_zebra/request'
11
+ require 'fat_zebra/api_resource'
12
+
13
+ # API Operations
14
+ require 'fat_zebra/api_operation/find'
15
+ require 'fat_zebra/api_operation/search'
16
+ require 'fat_zebra/api_operation/save'
17
+ require 'fat_zebra/api_operation/delete'
18
+ require 'fat_zebra/api_operation/void'
19
+
20
+ # API Resources
21
+ require 'fat_zebra/purchase'
22
+ require 'fat_zebra/information'
23
+ require 'fat_zebra/card'
24
+ require 'fat_zebra/refund'
25
+ require 'fat_zebra/payment_plan'
26
+ require 'fat_zebra/customer'
27
+ require 'fat_zebra/direct_debit'
28
+ require 'fat_zebra/direct_credit'
29
+ require 'fat_zebra/bank_account'
30
+ require 'fat_zebra/web_hook'
31
+ require 'fat_zebra/batch'
32
+
33
+ ##
34
+ # Implementation of the FatZebra
24
35
  module FatZebra
25
- extend self
26
- extend Forwardable
27
-
28
- attr_accessor :config
29
- attr_accessor :_gateway
30
-
31
- # Configure the Fat Zebra gateway
32
- def configure(auth = nil, &block)
33
- raise ArgumentError, "missing authentication parameters or block" unless auth || block_given?
34
-
35
- if !auth
36
- self.config = Config.new
37
- if (block.arity > 0)
38
- block.call(self.config)
39
- else
40
- self.config.instance_eval(&block)
41
- end
42
- else
43
- self.config = Config.from_hash(auth)
36
+ class << self
37
+
38
+ ##
39
+ # @return [FatZebra::Config] configurations
40
+ attr_reader :configurations
41
+
42
+ ##
43
+ # Configures the FatZebra API
44
+ #
45
+ # @example Default configuration
46
+ # FatZebra.configure do |config|
47
+ # config.username = 'my-username'
48
+ # config.token = 'my-token'
49
+ # end
50
+ def configure
51
+ yield @configurations = FatZebra::Config.new
52
+
53
+ FatZebra.configurations.valid!
44
54
  end
45
55
 
46
- self.config.validate!
47
-
48
- self.configure_gateway
49
-
50
- self.config
51
- end
52
-
53
- def configure_gateway
54
- self._gateway = Gateway.configure(self.config)
55
56
  end
56
-
57
- def gateway
58
- raise GatewayError.new("Please configure the Gateway before use. See FatZebra.configure { }") if self.config.nil?
59
- self._gateway
60
- end
61
- end
57
+ end
@@ -0,0 +1,57 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://gateway.sandbox.fatzebra.com.au/v1.0/bank_accounts
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"bsb":"123-123","account_name":"Test name","account_number":"012345678","test":true}'
9
+ headers:
10
+ Accept:
11
+ - application/json
12
+ Accept-Encoding:
13
+ - gzip, deflate
14
+ Content-Type:
15
+ - application/json
16
+ Content-Length:
17
+ - '85'
18
+ User-Agent:
19
+ - Ruby
20
+ Authorization:
21
+ - Basic VEVTVDpURVNU
22
+ response:
23
+ status:
24
+ code: 201
25
+ message: Created
26
+ headers:
27
+ Date:
28
+ - Tue, 27 Jun 2017 06:03:13 GMT
29
+ Content-Type:
30
+ - application/json; charset=utf-8
31
+ Transfer-Encoding:
32
+ - chunked
33
+ Connection:
34
+ - keep-alive
35
+ Status:
36
+ - 201 Created
37
+ Cache-Control:
38
+ - no-store
39
+ X-Request-Version:
40
+ - 1.19.41
41
+ Pragma:
42
+ - no-cache
43
+ X-Request-Id:
44
+ - de3cf0db3bb8c6a56e6e9ad1614a2558
45
+ X-Runtime:
46
+ - '0.042060'
47
+ X-Rack-Cache:
48
+ - invalidate, pass
49
+ X-Backend:
50
+ - sbox-priv-gateway-a
51
+ body:
52
+ encoding: UTF-8
53
+ string: '{"successful":true,"response":{"id":"071-B-A3LWXEL7","account_name":"Test
54
+ name","account_number":"012345678","bsb":"123-123","created_at":"2017-06-27T16:03:13+10:00"},"errors":[],"test":true}'
55
+ http_version:
56
+ recorded_at: Tue, 27 Jun 2017 06:03:13 GMT
57
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,57 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://gateway.sandbox.fatzebra.com.au/v1.0/bank_accounts
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"bsb":"123-123","account_name":"Test name","account_number":"012345678","test":true}'
9
+ headers:
10
+ Accept:
11
+ - application/json
12
+ Accept-Encoding:
13
+ - gzip, deflate
14
+ Content-Type:
15
+ - application/json
16
+ Content-Length:
17
+ - '85'
18
+ User-Agent:
19
+ - Ruby
20
+ Authorization:
21
+ - Basic VEVTVDpURVNU
22
+ response:
23
+ status:
24
+ code: 201
25
+ message: Created
26
+ headers:
27
+ Date:
28
+ - Tue, 27 Jun 2017 06:03:13 GMT
29
+ Content-Type:
30
+ - application/json; charset=utf-8
31
+ Transfer-Encoding:
32
+ - chunked
33
+ Connection:
34
+ - keep-alive
35
+ Status:
36
+ - 201 Created
37
+ X-Rack-Cache:
38
+ - invalidate, pass
39
+ Cache-Control:
40
+ - no-store
41
+ X-Request-Version:
42
+ - 1.19.41
43
+ X-Runtime:
44
+ - '0.036444'
45
+ Pragma:
46
+ - no-cache
47
+ X-Request-Id:
48
+ - 45e878faeee4a085eebe7adf4fea65d6
49
+ X-Backend:
50
+ - sbox-priv-gateway-a
51
+ body:
52
+ encoding: UTF-8
53
+ string: '{"successful":true,"response":{"id":"071-B-BSDDYDAK","account_name":"Test
54
+ name","account_number":"012345678","bsb":"123-123","created_at":"2017-06-27T16:03:13+10:00"},"errors":[],"test":true}'
55
+ http_version:
56
+ recorded_at: Tue, 27 Jun 2017 06:03:13 GMT
57
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,57 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://gateway.sandbox.fatzebra.com.au/v1.0/bank_accounts
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"test":true}'
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - application/json
14
+ User-Agent:
15
+ - Ruby
16
+ Authorization:
17
+ - Basic VEVTVDpURVNU
18
+ Content-Type:
19
+ - application/json
20
+ response:
21
+ status:
22
+ code: 422
23
+ message: Unprocessable Entity
24
+ headers:
25
+ Date:
26
+ - Mon, 03 Jul 2017 03:55:54 GMT
27
+ Content-Type:
28
+ - application/json; charset=utf-8
29
+ Transfer-Encoding:
30
+ - chunked
31
+ Connection:
32
+ - keep-alive
33
+ Status:
34
+ - 422 Unprocessable Entity
35
+ Cache-Control:
36
+ - no-store
37
+ X-Request-Version:
38
+ - 1.19.41
39
+ Pragma:
40
+ - no-cache
41
+ X-Request-Id:
42
+ - 9f14b2bf87766520c5c867e4ab88dc69
43
+ X-Runtime:
44
+ - '0.035684'
45
+ X-Rack-Cache:
46
+ - invalidate, pass
47
+ X-Backend:
48
+ - sbox-priv-gateway-a
49
+ body:
50
+ encoding: UTF-8
51
+ string: '{"successful":false,"response":{"id":"071-B-X3Z3G0QG","account_name":"","account_number":"","bsb":"","created_at":null},"errors":["Number
52
+ can''t be blank","Number is too short (minimum is 4 characters)","Number is
53
+ not a number","Bsb can''t be blank","Bsb is the incorrect format - please
54
+ use 123-456","Name can''t be blank"],"test":true}'
55
+ http_version:
56
+ recorded_at: Mon, 03 Jul 2017 03:55:54 GMT
57
+ recorded_with: VCR 3.0.3