fat_zebra 2.0.13 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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