balanced 0.8.2 → 1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (359) hide show
  1. checksums.yaml +4 -4
  2. data/.rbenv-version +1 -1
  3. data/.ruby-version +1 -1
  4. data/Gemfile +7 -3
  5. data/README.md +2 -10
  6. data/Rakefile +4 -18
  7. data/balanced.gemspec +8 -10
  8. data/lib/balanced.rb +28 -28
  9. data/lib/balanced/client.rb +15 -6
  10. data/lib/balanced/error.rb +21 -12
  11. data/lib/balanced/pager.rb +66 -25
  12. data/lib/balanced/resources.rb +18 -17
  13. data/lib/balanced/resources/api_key.rb +4 -0
  14. data/lib/balanced/resources/bank_account.rb +26 -75
  15. data/lib/balanced/resources/callback.rb +2 -0
  16. data/lib/balanced/resources/card.rb +15 -65
  17. data/lib/balanced/resources/card_hold.rb +38 -0
  18. data/lib/balanced/resources/credit.rb +6 -50
  19. data/lib/balanced/resources/customer.rb +33 -71
  20. data/lib/balanced/resources/debit.rb +6 -14
  21. data/lib/balanced/resources/event.rb +6 -0
  22. data/lib/balanced/resources/funding_instrument.rb +11 -0
  23. data/lib/balanced/resources/hypermedia.rb +28 -0
  24. data/lib/balanced/resources/marketplace.rb +5 -203
  25. data/lib/balanced/resources/order.rb +71 -0
  26. data/lib/balanced/resources/refund.rb +2 -7
  27. data/lib/balanced/resources/resource.rb +169 -106
  28. data/lib/balanced/resources/reversal.rb +2 -8
  29. data/lib/balanced/resources/transfer.rb +11 -0
  30. data/lib/balanced/response/balanced_exception_middleware.rb +2 -2
  31. data/lib/balanced/utils.rb +47 -14
  32. data/lib/balanced/version.rb +1 -1
  33. data/scenario.cache +526 -380
  34. data/scenarios/api_key_create/definition.rb +1 -0
  35. data/scenarios/api_key_create/request.rb +2 -0
  36. data/scenarios/api_key_create/ruby.mako +21 -0
  37. data/scenarios/api_key_delete/definition.rb +1 -0
  38. data/scenarios/api_key_delete/request.rb +3 -0
  39. data/scenarios/api_key_delete/ruby.mako +12 -0
  40. data/scenarios/api_key_list/definition.rb +1 -0
  41. data/scenarios/api_key_list/request.rb +2 -0
  42. data/scenarios/api_key_list/ruby.mako +28 -0
  43. data/scenarios/api_key_show/definition.rb +1 -0
  44. data/scenarios/api_key_show/request.rb +2 -0
  45. data/scenarios/api_key_show/ruby.mako +18 -0
  46. data/scenarios/{customer_add_bank_account → bank_account_associate_to_customer}/definition.rb +0 -0
  47. data/scenarios/bank_account_associate_to_customer/request.rb +3 -0
  48. data/scenarios/bank_account_associate_to_customer/ruby.mako +49 -0
  49. data/scenarios/bank_account_create/definition.rb +1 -1
  50. data/scenarios/bank_account_create/request.rb +1 -1
  51. data/scenarios/bank_account_create/ruby.mako +44 -7
  52. data/scenarios/{credit_create_existing_bank_account → bank_account_credit}/definition.rb +0 -0
  53. data/scenarios/bank_account_credit/request.rb +3 -0
  54. data/scenarios/bank_account_credit/ruby.mako +42 -0
  55. data/scenarios/bank_account_debit/definition.rb +1 -0
  56. data/scenarios/bank_account_debit/request.rb +5 -0
  57. data/scenarios/bank_account_debit/ruby.mako +50 -0
  58. data/scenarios/bank_account_delete/request.rb +1 -1
  59. data/scenarios/bank_account_delete/ruby.mako +5 -3
  60. data/scenarios/bank_account_list/ruby.mako +76 -2
  61. data/scenarios/bank_account_show/definition.rb +1 -1
  62. data/scenarios/bank_account_show/request.rb +1 -1
  63. data/scenarios/bank_account_show/ruby.mako +41 -5
  64. data/scenarios/bank_account_update/definition.rb +1 -0
  65. data/scenarios/bank_account_update/request.rb +6 -0
  66. data/scenarios/bank_account_update/ruby.mako +56 -0
  67. data/scenarios/bank_account_verification_create/request.rb +1 -1
  68. data/scenarios/bank_account_verification_create/ruby.mako +20 -3
  69. data/scenarios/bank_account_verification_show/definition.rb +1 -1
  70. data/scenarios/bank_account_verification_show/request.rb +1 -1
  71. data/scenarios/bank_account_verification_show/ruby.mako +21 -4
  72. data/scenarios/bank_account_verification_update/definition.rb +1 -1
  73. data/scenarios/bank_account_verification_update/request.rb +5 -5
  74. data/scenarios/bank_account_verification_update/ruby.mako +24 -8
  75. data/scenarios/callback_create/definition.rb +1 -1
  76. data/scenarios/callback_create/request.rb +2 -2
  77. data/scenarios/callback_create/ruby.mako +22 -0
  78. data/scenarios/callback_delete/definition.rb +1 -1
  79. data/scenarios/callback_delete/request.rb +2 -2
  80. data/scenarios/callback_delete/ruby.mako +12 -0
  81. data/scenarios/callback_list/definition.rb +1 -1
  82. data/scenarios/callback_list/request.rb +1 -2
  83. data/scenarios/callback_list/ruby.mako +20 -0
  84. data/scenarios/callback_show/definition.rb +1 -1
  85. data/scenarios/callback_show/request.rb +1 -1
  86. data/scenarios/callback_show/ruby.mako +20 -0
  87. data/scenarios/{customer_add_card → card_associate_to_customer}/definition.rb +0 -0
  88. data/scenarios/card_associate_to_customer/request.rb +3 -0
  89. data/scenarios/card_associate_to_customer/ruby.mako +49 -0
  90. data/scenarios/card_create/request.rb +1 -2
  91. data/scenarios/card_create/ruby.mako +44 -7
  92. data/scenarios/card_debit/definition.rb +1 -0
  93. data/scenarios/card_debit/request.rb +5 -0
  94. data/scenarios/card_debit/ruby.mako +49 -0
  95. data/scenarios/card_delete/request.rb +1 -1
  96. data/scenarios/card_delete/ruby.mako +5 -3
  97. data/scenarios/card_hold_capture/definition.rb +1 -0
  98. data/scenarios/card_hold_capture/request.rb +5 -0
  99. data/scenarios/card_hold_capture/ruby.mako +49 -0
  100. data/scenarios/card_hold_create/definition.rb +1 -0
  101. data/scenarios/card_hold_create/request.rb +5 -0
  102. data/scenarios/card_hold_create/ruby.mako +38 -0
  103. data/scenarios/card_hold_list/definition.rb +1 -0
  104. data/scenarios/card_hold_list/request.rb +2 -0
  105. data/scenarios/card_hold_list/ruby.mako +60 -0
  106. data/scenarios/card_hold_show/definition.rb +1 -0
  107. data/scenarios/card_hold_show/request.rb +2 -0
  108. data/scenarios/card_hold_show/ruby.mako +36 -0
  109. data/scenarios/card_hold_update/definition.rb +1 -0
  110. data/scenarios/card_hold_update/request.rb +7 -0
  111. data/scenarios/card_hold_update/ruby.mako +42 -0
  112. data/scenarios/card_hold_void/definition.rb +1 -0
  113. data/scenarios/card_hold_void/request.rb +3 -0
  114. data/scenarios/card_hold_void/ruby.mako +36 -0
  115. data/scenarios/card_list/definition.rb +1 -1
  116. data/scenarios/card_list/request.rb +1 -1
  117. data/scenarios/card_list/ruby.mako +78 -5
  118. data/scenarios/card_show/definition.rb +1 -1
  119. data/scenarios/card_show/request.rb +1 -1
  120. data/scenarios/card_show/ruby.mako +42 -4
  121. data/scenarios/card_update/definition.rb +1 -1
  122. data/scenarios/card_update/request.rb +1 -1
  123. data/scenarios/card_update/ruby.mako +45 -4
  124. data/scenarios/credit_list/request.rb +1 -3
  125. data/scenarios/credit_list/ruby.mako +34 -4
  126. data/scenarios/{credit_bank_account_list → credit_list_bank_account}/definition.rb +0 -0
  127. data/scenarios/credit_list_bank_account/request.rb +3 -0
  128. data/scenarios/credit_list_bank_account/ruby.mako +13 -0
  129. data/scenarios/credit_show/definition.rb +1 -1
  130. data/scenarios/credit_show/request.rb +1 -3
  131. data/scenarios/credit_show/ruby.mako +35 -5
  132. data/scenarios/{credit_create_new_bank_account → credit_update}/definition.rb +0 -0
  133. data/scenarios/credit_update/request.rb +7 -0
  134. data/scenarios/credit_update/ruby.mako +48 -0
  135. data/scenarios/customer_create/request.rb +4 -1
  136. data/scenarios/customer_create/ruby.mako +60 -3
  137. data/scenarios/customer_delete/request.rb +1 -1
  138. data/scenarios/customer_delete/ruby.mako +4 -2
  139. data/scenarios/customer_list/definition.rb +1 -0
  140. data/scenarios/customer_list/request.rb +2 -0
  141. data/scenarios/customer_list/ruby.mako +105 -0
  142. data/scenarios/customer_show/definition.rb +1 -0
  143. data/scenarios/customer_show/request.rb +2 -0
  144. data/scenarios/customer_show/ruby.mako +58 -0
  145. data/scenarios/customer_update/definition.rb +1 -0
  146. data/scenarios/customer_update/request.rb +7 -0
  147. data/scenarios/customer_update/ruby.mako +64 -0
  148. data/scenarios/debit_list/request.rb +1 -3
  149. data/scenarios/debit_list/ruby.mako +70 -4
  150. data/scenarios/debit_show/definition.rb +1 -1
  151. data/scenarios/debit_show/request.rb +1 -1
  152. data/scenarios/debit_show/ruby.mako +39 -4
  153. data/scenarios/debit_update/definition.rb +1 -1
  154. data/scenarios/debit_update/request.rb +1 -1
  155. data/scenarios/debit_update/ruby.mako +39 -4
  156. data/scenarios/event_list/definition.rb +1 -1
  157. data/scenarios/event_list/request.rb +1 -2
  158. data/scenarios/event_list/ruby.mako +54 -5
  159. data/scenarios/event_show/definition.rb +1 -1
  160. data/scenarios/event_show/request.rb +1 -1
  161. data/scenarios/event_show/ruby.mako +54 -4
  162. data/scenarios/helpers.rb +29 -2
  163. data/scenarios/order_create/definition.rb +1 -0
  164. data/scenarios/order_create/request.rb +5 -0
  165. data/scenarios/order_create/ruby.mako +46 -0
  166. data/scenarios/order_list/definition.rb +1 -0
  167. data/scenarios/order_list/request.rb +2 -0
  168. data/scenarios/order_list/ruby.mako +42 -0
  169. data/scenarios/order_show/definition.rb +1 -0
  170. data/scenarios/order_show/request.rb +2 -0
  171. data/scenarios/order_show/ruby.mako +44 -0
  172. data/scenarios/order_update/definition.rb +1 -0
  173. data/scenarios/order_update/request.rb +7 -0
  174. data/scenarios/order_update/ruby.mako +50 -0
  175. data/scenarios/refund_create/definition.rb +1 -1
  176. data/scenarios/refund_create/request.rb +2 -1
  177. data/scenarios/refund_create/ruby.mako +33 -5
  178. data/scenarios/refund_list/request.rb +1 -3
  179. data/scenarios/refund_list/ruby.mako +30 -4
  180. data/scenarios/refund_show/definition.rb +1 -1
  181. data/scenarios/refund_show/request.rb +1 -1
  182. data/scenarios/refund_show/ruby.mako +32 -4
  183. data/scenarios/refund_update/definition.rb +1 -1
  184. data/scenarios/refund_update/request.rb +1 -1
  185. data/scenarios/refund_update/ruby.mako +32 -4
  186. data/scenarios/render_mako.rb +59 -4
  187. data/scenarios/reversal_create/definition.rb +1 -0
  188. data/scenarios/reversal_create/request.rb +9 -0
  189. data/scenarios/reversal_create/ruby.mako +45 -0
  190. data/scenarios/reversal_list/definition.rb +1 -0
  191. data/scenarios/reversal_list/request.rb +2 -0
  192. data/scenarios/reversal_list/ruby.mako +36 -0
  193. data/scenarios/reversal_show/definition.rb +1 -0
  194. data/scenarios/reversal_show/request.rb +2 -0
  195. data/scenarios/reversal_show/ruby.mako +37 -0
  196. data/scenarios/reversal_update/definition.rb +1 -0
  197. data/scenarios/reversal_update/request.rb +7 -0
  198. data/scenarios/reversal_update/ruby.mako +44 -0
  199. data/spec/balanced/error_spec.rb +7 -7
  200. data/spec/balanced/pager_spec.rb +10 -10
  201. data/spec/balanced/resources/api_key_spec.rb +6 -35
  202. data/spec/balanced/resources/bank_account_spec.rb +123 -218
  203. data/spec/balanced/resources/callback_spec.rb +12 -13
  204. data/spec/balanced/resources/card_hold_spec.rb +103 -0
  205. data/spec/balanced/resources/card_spec.rb +101 -27
  206. data/spec/balanced/resources/credit_spec.rb +69 -35
  207. data/spec/balanced/resources/customer_spec.rb +91 -271
  208. data/spec/balanced/resources/debit_spec.rb +95 -0
  209. data/spec/balanced/resources/marketplace_spec.rb +17 -170
  210. data/spec/balanced/resources/order_spec.rb +364 -0
  211. data/spec/balanced/resources/resource_spec.rb +25 -32
  212. data/spec/balanced_spec.rb +18 -36
  213. data/spec/client_spec.rb +7 -7
  214. data/spec/spec_helper.rb +19 -18
  215. data/spec/utils_spec.rb +5 -5
  216. metadata +123 -165
  217. data/examples/bank_account_debits.rb +0 -57
  218. data/examples/customers.rb +0 -114
  219. data/examples/events_and_callbacks.rb +0 -81
  220. data/examples/examples.rb +0 -162
  221. data/examples/exception_handling.rb +0 -44
  222. data/lib/balanced/resources/account.rb +0 -179
  223. data/lib/balanced/resources/hold.rb +0 -61
  224. data/lib/balanced/resources/invoice.rb +0 -11
  225. data/lib/balanced/resources/merchant.rb +0 -21
  226. data/lib/balanced/resources/transaction.rb +0 -17
  227. data/scenarios/account_add_card/definition.rb +0 -1
  228. data/scenarios/account_add_card/request.rb +0 -3
  229. data/scenarios/account_add_card/ruby.mako +0 -11
  230. data/scenarios/account_capture_hold/definition.rb +0 -1
  231. data/scenarios/account_capture_hold/request.rb +0 -3
  232. data/scenarios/account_capture_hold/ruby.mako +0 -11
  233. data/scenarios/account_create/definition.rb +0 -1
  234. data/scenarios/account_create/request.rb +0 -2
  235. data/scenarios/account_create/ruby.mako +0 -10
  236. data/scenarios/account_create_buyer/definition.rb +0 -1
  237. data/scenarios/account_create_buyer/request.rb +0 -5
  238. data/scenarios/account_create_buyer/ruby.mako +0 -13
  239. data/scenarios/account_create_debit/definition.rb +0 -1
  240. data/scenarios/account_create_debit/request.rb +0 -3
  241. data/scenarios/account_create_debit/ruby.mako +0 -11
  242. data/scenarios/account_create_hold/definition.rb +0 -1
  243. data/scenarios/account_create_hold/request.rb +0 -3
  244. data/scenarios/account_create_hold/ruby.mako +0 -11
  245. data/scenarios/account_create_merchant/definition.rb +0 -1
  246. data/scenarios/account_create_merchant/request.rb +0 -3
  247. data/scenarios/account_create_merchant/ruby.mako +0 -11
  248. data/scenarios/account_underwrite_business/definition.rb +0 -1
  249. data/scenarios/account_underwrite_business/request.rb +0 -17
  250. data/scenarios/account_underwrite_business/ruby.mako +0 -37
  251. data/scenarios/account_underwrite_person/definition.rb +0 -1
  252. data/scenarios/account_underwrite_person/request.rb +0 -18
  253. data/scenarios/account_underwrite_person/ruby.mako +0 -31
  254. data/scenarios/bank_account_find_and_credit/definition.rb +0 -1
  255. data/scenarios/bank_account_find_and_credit/request.rb +0 -5
  256. data/scenarios/bank_account_find_and_credit/ruby.mako +0 -13
  257. data/scenarios/bank_account_find_and_delete/definition.rb +0 -1
  258. data/scenarios/bank_account_find_and_delete/request.rb +0 -3
  259. data/scenarios/bank_account_find_and_delete/ruby.mako +0 -10
  260. data/scenarios/bank_account_invalid_routing_number/definition.rb +0 -1
  261. data/scenarios/bank_account_invalid_routing_number/request.rb +0 -11
  262. data/scenarios/bank_account_invalid_routing_number/ruby.mako +0 -16
  263. data/scenarios/card_invalidate/definition.rb +0 -1
  264. data/scenarios/card_invalidate/request.rb +0 -3
  265. data/scenarios/card_invalidate/ruby.mako +0 -10
  266. data/scenarios/credit_account_list/definition.rb +0 -1
  267. data/scenarios/credit_account_list/request.rb +0 -3
  268. data/scenarios/credit_account_list/ruby.mako +0 -10
  269. data/scenarios/credit_account_merchant_create/definition.rb +0 -1
  270. data/scenarios/credit_account_merchant_create/request.rb +0 -5
  271. data/scenarios/credit_account_merchant_create/ruby.mako +0 -12
  272. data/scenarios/credit_bank_account_list/request.rb +0 -5
  273. data/scenarios/credit_bank_account_list/ruby.mako +0 -12
  274. data/scenarios/credit_create_existing_bank_account/request.rb +0 -5
  275. data/scenarios/credit_create_existing_bank_account/ruby.mako +0 -12
  276. data/scenarios/credit_create_new_bank_account/request.rb +0 -10
  277. data/scenarios/credit_create_new_bank_account/ruby.mako +0 -21
  278. data/scenarios/credit_customer_list/definition.rb +0 -1
  279. data/scenarios/credit_customer_list/request.rb +0 -4
  280. data/scenarios/credit_customer_list/ruby.mako +0 -12
  281. data/scenarios/credit_failed_state/definition.rb +0 -1
  282. data/scenarios/credit_failed_state/request.rb +0 -10
  283. data/scenarios/credit_failed_state/ruby.mako +0 -18
  284. data/scenarios/credit_paid_state/definition.rb +0 -1
  285. data/scenarios/credit_paid_state/request.rb +0 -11
  286. data/scenarios/credit_paid_state/ruby.mako +0 -19
  287. data/scenarios/credit_pending_state/definition.rb +0 -1
  288. data/scenarios/credit_pending_state/request.rb +0 -9
  289. data/scenarios/credit_pending_state/ruby.mako +0 -17
  290. data/scenarios/customer_add_bank_account/request.rb +0 -3
  291. data/scenarios/customer_add_bank_account/ruby.mako +0 -11
  292. data/scenarios/customer_add_card/request.rb +0 -3
  293. data/scenarios/customer_add_card/ruby.mako +0 -11
  294. data/scenarios/customer_capture_hold/definition.rb +0 -1
  295. data/scenarios/customer_capture_hold/request.rb +0 -3
  296. data/scenarios/customer_capture_hold/ruby.mako +0 -0
  297. data/scenarios/customer_create_debit/definition.rb +0 -1
  298. data/scenarios/customer_create_debit/request.rb +0 -3
  299. data/scenarios/customer_create_debit/ruby.mako +0 -11
  300. data/scenarios/customer_create_hold/definition.rb +0 -1
  301. data/scenarios/customer_create_hold/request.rb +0 -3
  302. data/scenarios/customer_create_hold/ruby.mako +0 -11
  303. data/scenarios/customer_credit/definition.rb +0 -1
  304. data/scenarios/customer_credit/request.rb +0 -2
  305. data/scenarios/customer_credit/ruby.mako +0 -8
  306. data/scenarios/debit_account_list/definition.rb +0 -1
  307. data/scenarios/debit_account_list/request.rb +0 -3
  308. data/scenarios/debit_account_list/ruby.mako +0 -10
  309. data/scenarios/debit_create/definition.rb +0 -1
  310. data/scenarios/debit_create/request.rb +0 -5
  311. data/scenarios/debit_create/ruby.mako +0 -15
  312. data/scenarios/debit_customer_list/definition.rb +0 -1
  313. data/scenarios/debit_customer_list/request.rb +0 -4
  314. data/scenarios/debit_customer_list/ruby.mako +0 -12
  315. data/scenarios/debit_refund/definition.rb +0 -1
  316. data/scenarios/debit_refund/request.rb +0 -3
  317. data/scenarios/debit_refund/ruby.mako +0 -10
  318. data/scenarios/delete.rb +0 -7
  319. data/scenarios/event_replay/definition.rb +0 -0
  320. data/scenarios/event_replay/request.rb +0 -1
  321. data/scenarios/event_replay/ruby.mako +0 -0
  322. data/scenarios/execute.rb +0 -27
  323. data/scenarios/hold_account_list/definition.rb +0 -1
  324. data/scenarios/hold_account_list/request.rb +0 -3
  325. data/scenarios/hold_account_list/ruby.mako +0 -10
  326. data/scenarios/hold_capture/definition.rb +0 -1
  327. data/scenarios/hold_capture/request.rb +0 -5
  328. data/scenarios/hold_capture/ruby.mako +0 -15
  329. data/scenarios/hold_create/definition.rb +0 -1
  330. data/scenarios/hold_create/request.rb +0 -5
  331. data/scenarios/hold_create/ruby.mako +0 -14
  332. data/scenarios/hold_customer_list/definition.rb +0 -1
  333. data/scenarios/hold_customer_list/request.rb +0 -3
  334. data/scenarios/hold_customer_list/ruby.mako +0 -11
  335. data/scenarios/hold_list/definition.rb +0 -1
  336. data/scenarios/hold_list/request.rb +0 -4
  337. data/scenarios/hold_list/ruby.mako +0 -11
  338. data/scenarios/hold_show/definition.rb +0 -1
  339. data/scenarios/hold_show/request.rb +0 -2
  340. data/scenarios/hold_show/ruby.mako +0 -10
  341. data/scenarios/hold_update/definition.rb +0 -1
  342. data/scenarios/hold_update/request.rb +0 -7
  343. data/scenarios/hold_update/ruby.mako +0 -16
  344. data/scenarios/hold_void/definition.rb +0 -1
  345. data/scenarios/hold_void/request.rb +0 -3
  346. data/scenarios/hold_void/ruby.mako +0 -10
  347. data/scenarios/refund_account_list/definition.rb +0 -1
  348. data/scenarios/refund_account_list/request.rb +0 -3
  349. data/scenarios/refund_account_list/ruby.mako +0 -10
  350. data/scenarios/refund_customer_list/definition.rb +0 -1
  351. data/scenarios/refund_customer_list/request.rb +0 -3
  352. data/scenarios/refund_customer_list/ruby.mako +0 -11
  353. data/scenarios/render.rb +0 -32
  354. data/scenarios/render_one.rb +0 -32
  355. data/spec/balanced/resources/account_spec.rb +0 -636
  356. data/spec/balanced/resources/hold_spec.rb +0 -48
  357. data/spec/balanced/resources/merchant_spec.rb +0 -6
  358. data/spec/scenarios_spec.rb +0 -39
  359. data/upload_docs.rb +0 -40
@@ -13,30 +13,22 @@ module Balanced
13
13
  #
14
14
  class Debit
15
15
  include Balanced::Resource
16
+ include Balanced::HypermediaRegistry
16
17
 
17
- def initialize attributes = {}
18
- Balanced::Utils.stringify_keys! attributes
19
- unless attributes.has_key? 'uri'
20
- attributes['uri'] = self.class.uri
21
- end
22
- super attributes
23
- end
18
+ define_hypermedia_types [:debits]
24
19
 
25
20
  # Refunds this Debit. If no amount is specified it will refund the entire
26
21
  # amount of the Debit, you may create many Refunds up to the sum total
27
22
  # of the original Debit's amount.
28
23
  #
29
24
  # @return [Refund]
30
- def refund *args
31
- warn_on_positional args
25
+ def refund(options={})
32
26
 
33
- options = args.last.is_a?(Hash) ? args.pop : {}
34
- amount = args[0] || options.fetch(:amount) { nil }
35
- description = args[1] || options.fetch(:description) { nil }
27
+ amount = options[:amount]
28
+ description = options[:description]
36
29
 
37
30
  refund = Refund.new(
38
- :uri => self.refunds_uri,
39
- :debit_uri => self.uri,
31
+ :href => self.refunds.href,
40
32
  :amount => amount,
41
33
  :description => description
42
34
  )
@@ -7,21 +7,27 @@ module Balanced
7
7
  #
8
8
  class Event
9
9
  include Balanced::Resource
10
+ include Balanced::HypermediaRegistry
10
11
 
12
+ define_hypermedia_types [:events]
11
13
  end
12
14
 
13
15
  # Represents a single event being sent to a callback.
14
16
  #
15
17
  class EventCallback
16
18
  include Balanced::Resource
19
+ include Balanced::HypermediaRegistry
17
20
 
21
+ define_hypermedia_types [:event_callbacks]
18
22
  end
19
23
 
20
24
  # Represents a single log of an event sent to a callback.
21
25
  #
22
26
  class Log
23
27
  include Balanced::Resource
28
+ include Balanced::HypermediaRegistry
24
29
 
30
+ define_hypermedia_types [:logs]
25
31
  end
26
32
 
27
33
  end
@@ -0,0 +1,11 @@
1
+ module Balanced
2
+
3
+ class FundingInstrument
4
+
5
+ end
6
+
7
+ class DebitableFundingInstrument < FundingInstrument
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,28 @@
1
+ module Balanced
2
+
3
+ module HypermediaRegistry
4
+
5
+ def self.included(base) # :nodoc:
6
+ base.extend ClassMethods
7
+ end
8
+
9
+ module ClassMethods
10
+
11
+ def define_hypermedia_types(types)
12
+ @hypermedia_types = types.map! do |t|
13
+ t.to_s
14
+ end.sort!.freeze
15
+
16
+ @hypermedia_types.each do |type|
17
+ Balanced.hypermedia_registry[type] = self
18
+ end
19
+ end
20
+
21
+ # @return [Array, nil] The list of hypermedia types this class is
22
+ # mapped to for interacting with the resource.
23
+ attr_reader :hypermedia_types
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -3,8 +3,9 @@ module Balanced
3
3
  #
4
4
  class Marketplace
5
5
  include Balanced::Resource
6
+ include Balanced::HypermediaRegistry
6
7
 
7
- @@marketplace_uri = nil
8
+ define_hypermedia_types [:marketplaces]
8
9
 
9
10
  class << self
10
11
 
@@ -13,37 +14,13 @@ module Balanced
13
14
  #
14
15
  # @return [Marketplace]
15
16
  def my_marketplace
16
- marketplace = Balanced::Merchant.me.marketplace
17
- @@marketplace_uri = marketplace.uri if marketplace
18
- marketplace
19
- end
20
- alias mine my_marketplace
21
-
22
- # @return [String, nil] the marketplace's URI
23
- def marketplace_uri
24
- if !@@marketplace_uri and Balanced.is_configured_with_api_key?
25
- begin
26
- mine
27
- rescue Balanced::Error
28
- # do nothing..
29
- end
30
- end
31
- @@marketplace_uri
17
+ Balanced::Marketplace.where.first
32
18
  end
33
19
 
34
- def marketplace_exists?
35
- !!marketplace_uri
36
- end
20
+ alias mine my_marketplace
37
21
 
38
22
  end
39
23
 
40
- # @return [Marketplace]
41
- def save
42
- marketplace = super
43
- @@marketplace_uri = marketplace.uri
44
- marketplace
45
- end
46
-
47
24
  # Returns an instance representing the marketplace associated with
48
25
  # the current API key.
49
26
  #
@@ -51,183 +28,8 @@ module Balanced
51
28
  def my_marketplace
52
29
  self.class.my_marketplace
53
30
  end
54
- alias mine my_marketplace
55
-
56
- # Create an Account associated with this Marketplace. This account
57
- # will have no roles associated with it.
58
- #
59
- # @return [Account]
60
- def create_account options={}
61
- email_address = options.fetch(:email_address) { nil }
62
- name = options.fetch(:name) { nil }
63
- meta = options.fetch(:meta) { nil }
64
-
65
- account_attributes = {
66
- :uri => self.accounts_uri,
67
- :email_address => email_address,
68
- :name => name,
69
- :meta => meta
70
- }
71
-
72
- account = Account.new account_attributes
73
- account.save
74
- end
75
-
76
-
77
- # Create a buyer Account associated with this Marketplace.
78
- #
79
- # @return [Account]
80
- def create_buyer *args
81
- warn_on_positional args
82
31
 
83
- options = args.last.is_a?(Hash) ? args.pop : {}
84
- email_address = args[0] || options.fetch(:email_address) { nil }
85
- card = args[1] || options.fetch(:card_uri) { options.fetch(:card) { nil} }
86
- name = args[2] || options.fetch(:name) { nil }
87
- meta = args[3] || options.fetch(:meta) { nil }
88
-
89
- account_attributes = {
90
- :uri => self.accounts_uri,
91
- :email_address => email_address,
92
- :name => name,
93
- :meta => meta,
94
- }
95
-
96
- if card.respond_to? :keys
97
- account_attributes[:card] = card
98
- else
99
- account_attributes[:card_uri] = card
100
- end
101
-
102
- account = Account.new account_attributes
103
- account.save
104
- end
105
-
106
- # Creates a Merchant Account associated with this Marketplace.
107
- #
108
- # This method may return 300 if you have not supplied enough information
109
- # for Balanced to identify the Merchant. You may re-submit the request
110
- # with more information, or redirect the Merchant to the supplied url
111
- # so they may manually sign up.
112
- #
113
- # When you receive a merchant_uri from balanced, just pass it in:
114
- #
115
- # @example
116
- # Account.create_merchant('bob@example.com', '/v1/TEST-MRxxxx')
117
- #
118
- # @return [Account]
119
- def create_merchant *args
120
- warn_on_positional args
121
-
122
- options = args.last.is_a?(Hash) ? args.pop : {}
123
- email_address = args[0] || options.fetch(:email_address) { nil }
124
- merchant = args[1] || options.fetch(:merchant) { nil }
125
- bank_account_uri = args[2] || options.fetch(:bank_account_uri) { nil }
126
- name = args[3] || options.fetch(:name) { nil }
127
- meta = args[4] || options.fetch(:meta) { nil }
128
- bank_account = args[5] || options.fetch(:bank_account) { nil }
129
-
130
- account_attributes = {
131
- :uri => self.accounts_uri,
132
- :email_address => email_address,
133
- :bank_account_uri => bank_account_uri,
134
- :name => name,
135
- :meta => meta,
136
- :bank_account => bank_account
137
- }
138
-
139
- if merchant.respond_to? :keys
140
- account_attributes[:merchant] = merchant
141
- else
142
- account_attributes[:merchant_uri] = merchant
143
- end
144
-
145
- account = Account.new account_attributes
146
- account.save
147
- end
148
-
149
- # Creates a BankAccount object tied to this marketplace, for use with
150
- # accounts
151
- #
152
- # @return [BankAccount]
153
- def create_bank_account *args
154
- warn_on_positional args
155
-
156
- options = args.last.is_a?(Hash) ? args.pop : {}
157
- name = args[0] || options.fetch(:name) { }
158
- account_number = args[1] || options.fetch(:account_number) { nil }
159
- bank_code = args[2] || options.fetch(:bank_code) {
160
- options.fetch(:routing_number) {
161
- nil
162
- }
163
- }
164
- meta = args[3] || options.fetch(:meta) { nil }
165
-
166
- bank_account = BankAccount.new(
167
- :uri => self.bank_accounts_uri,
168
- :name => name,
169
- :account_number => account_number,
170
- :bank_code => bank_code,
171
- :meta => meta
172
- )
173
-
174
- bank_account.save
175
- end
176
-
177
- # Creates a Card object tied to this marketplace, for use with
178
- # accounts
179
- #
180
- # @return [Card]
181
- def create_card *args
182
- warn_on_positional args
183
-
184
- options = args.last.is_a?(Hash) ? args.pop : {}
185
- card_number = args[0] || options.fetch(:card_number) { nil }
186
- expiration_month = args[1] || options.fetch(:expiration_month) { nil }
187
- expiration_year = args[2] || options.fetch(:expiration_year) { nil }
188
- security_code = args[3] || options.fetch(:security_code) { nil }
189
- postal_code = args[4] || options.fetch(:postal_code) { nil }
190
- name = args[5] || options.fetch(:name) { nil }
191
- phone_number = args[6] || options.fetch(:phone_number) { nil }
192
- street_address = args[7] || options.fetch(:street_address) { nil }
193
- city = args[8] || options.fetch(:city) { nil }
194
- country_code = args[9] || options.fetch(:country_code) { nil }
195
- meta = args[10] || options.fetch(:meta) { nil }
196
-
197
- card = Card.new(
198
- :uri => self.cards_uri,
199
- :card_number => card_number,
200
- :expiration_month => expiration_month,
201
- :expiration_year => expiration_year,
202
- :name => name,
203
- :security_code => security_code,
204
- :street_address => street_address,
205
- :city => city,
206
- :postal_code => postal_code,
207
- :country_code => country_code,
208
- :phone_number => phone_number,
209
- :meta => meta
210
- )
211
- card.save
212
- end
213
-
214
- def create_customer(options = {})
215
- customer = Customer.new(options)
216
- customer.save
217
- end
218
-
219
- def create_callback *args
220
- warn_on_positional args
221
-
222
- options = args.last.is_a?(Hash) ? args.pop : {}
223
- url = args[0] || options.fetch(:url) { nil }
224
-
225
- callback = Callback.new(
226
- 'uri' => self.callbacks_uri,
227
- 'url' => url
228
- )
229
- callback.save
230
- end
32
+ alias mine my_marketplace
231
33
 
232
34
  end
233
35
 
@@ -0,0 +1,71 @@
1
+ module Balanced
2
+
3
+ class Error
4
+
5
+ class OrderCancelFailure < Balanced::StandardError;
6
+
7
+ end
8
+
9
+ end
10
+
11
+ class Order
12
+ include Balanced::Resource
13
+ include Balanced::HypermediaRegistry
14
+
15
+ define_hypermedia_types [:orders]
16
+
17
+ def cancel
18
+ reload
19
+
20
+ # shouldn't fail unless there's a network outage
21
+ # let's just hope there's not (for the sake of time)
22
+ self.debits.map { |d|
23
+ begin
24
+ d.refund rescue d.refunds.to_a
25
+ end }.flatten
26
+ end
27
+
28
+ alias refund cancel
29
+
30
+ def debit_from(options={})
31
+ Balanced::Utils.assert_required_keys(options, :required => [:source, :amount])
32
+
33
+ source = options[:source]
34
+ amount = options[:amount]
35
+
36
+ debit = source.debit(
37
+ :amount => amount,
38
+ :order => self.href
39
+ )
40
+
41
+ debit
42
+ end
43
+
44
+ def credit_to(options={})
45
+ Balanced::Utils.assert_required_keys(options, :required => [:destination, :amount])
46
+ destination = options[:destination]
47
+ amount = options[:amount]
48
+ # should have a way here to disburse more funds to another account, but not required
49
+ destination.credit(:amount => amount, :order => self.href)
50
+ end
51
+
52
+ private
53
+
54
+ def has_initiated_credits?
55
+ self.credits.total != 0
56
+ end
57
+
58
+ def has_initiated_refunds?
59
+ self.refunds.total != 0
60
+ end
61
+
62
+ def has_initiated_reversals?
63
+ self.reversals.total != 0
64
+ end
65
+
66
+ def has_initiated_debits?
67
+ self.debits.total != 0
68
+ end
69
+
70
+ end
71
+ end
@@ -6,14 +6,9 @@ module Balanced
6
6
  #
7
7
  class Refund
8
8
  include Balanced::Resource
9
+ include Balanced::HypermediaRegistry
9
10
 
10
- def initialize attributes = {}
11
- Balanced::Utils.stringify_keys! attributes
12
- unless attributes.has_key? 'uri'
13
- attributes['uri'] = self.class.uri
14
- end
15
- super attributes
16
- end
11
+ define_hypermedia_types [:refunds]
17
12
 
18
13
  end
19
14
 
@@ -1,95 +1,160 @@
1
1
  require File.expand_path('../../pager', __FILE__)
2
+ require File.expand_path('../../utils', __FILE__)
3
+ require 'addressable/template'
4
+ require 'pp'
5
+
2
6
 
3
7
  module Balanced
8
+
4
9
  module Resource
10
+
5
11
  attr_accessor :attributes
12
+ attr_accessor :hyperlinks
13
+
14
+ attr_accessor :id
15
+ attr_accessor :href
16
+ attr_accessor :links
17
+
18
+ def initialize(attributes = {})
19
+ @attributes = Utils.indifferent_read_access attributes
20
+ @hyperlinks = {}
21
+ end
22
+
23
+ def id
24
+ (attributes[:id] ||= nil)
25
+ end
6
26
 
7
- def initialize attributes = {}
8
- @attributes = attributes
27
+ def id=(value)
28
+ attributes[:id] = value
29
+ end
30
+
31
+ def href
32
+ (attributes[:href] ||= self.class.collection_name)
33
+ end
34
+
35
+ def links
36
+ (attributes[:links] ||= {})
37
+ end
38
+
39
+ def links=(value)
40
+ attributes[:links] = value
41
+ end
42
+
43
+ def hydrate(links, meta)
44
+ # links here is 'marketplaces.events'
45
+ links.each do |key, uri|
46
+ # key is 'marketplaces.events'
47
+ property = key.sub(/.*?\./, '')
48
+ # property here is events
49
+ # if marketplace.links is a hash
50
+ # for each property and uri, we want to set them on the instance
51
+ # as pagers.
52
+ #
53
+ # right?
54
+ if self.links.include? property
55
+ link_value = self.links[property]
56
+ # expands /customers/{marketplaces.owner_customer} to /customers/ACxxxxx
57
+ template = Addressable::Template.new(uri)
58
+ uri = template.expand("#{key}" => link_value).to_s
59
+ @hyperlinks[property] = Balanced::Utils.callable(
60
+ link_value.nil? ? link_value : lambda { self.class.find(uri) }
61
+ )
62
+ else
63
+ unless uri.nil? || uri.is_a?(Hash)
64
+ # matches something like '/blah/{class.attribute}/bliakdf'
65
+ begin
66
+ match_data = /\{(#{self.class.collection_name}\.(\w+))\}/.match(uri)
67
+ rescue TypeError => ex
68
+ puts 'what the fuck'
69
+ raise ex
70
+ end
71
+ unless match_data.nil?
72
+ attribute_path = match_data[1]
73
+ attribute_name = match_data[2]
74
+ template = Addressable::Template.new(uri)
75
+ uri = template.expand("#{attribute_path}" => @attributes[attribute_name]).to_s
76
+ end
77
+ end
78
+ @hyperlinks[property] = Balanced::Utils.callable(Balanced::Pager.new(uri, {}))
79
+ end
80
+ end
9
81
  end
10
82
 
11
83
  # delegate the query to the pager module
12
84
 
13
- def find *arguments
85
+ def fetch(*arguments)
14
86
  self.class.find *arguments
15
87
  end
88
+
89
+ alias find fetch
16
90
 
17
91
  def save
18
- uri = @attributes.delete('uri')
92
+ href = @attributes.delete('href')
19
93
  method = :post
20
- if uri.nil?
21
- uri = self.class.collection_path
22
- elsif !Balanced.is_collection(uri)
94
+ if href.nil?
95
+ href = self.class.collection_path
96
+ elsif !Balanced.is_collection(href)
23
97
  method = :put
24
98
  end
99
+
25
100
  attributes_to_submit = self.sanitize
26
- @response = Balanced.send(method, uri, attributes_to_submit)
101
+ begin
102
+ @response = Balanced.send(method, href, attributes_to_submit)
103
+ rescue Balanced::Error
104
+ # restore the href on the instance if there was an exception
105
+ # this will allow us to try to fix any attributes and save again
106
+ @attributes['href'] = href
107
+ raise
108
+ end
109
+
27
110
  reload @response
28
111
  end
29
112
 
30
113
  def sanitize
31
114
  to_submit = {}
32
115
  @attributes.each do |key, value|
33
- if not value.is_a? Balanced::Resource
116
+ unless value.is_a? Balanced::Resource
34
117
  to_submit[key] = value
35
118
  end
36
119
  end
37
120
  to_submit
38
121
  end
39
122
 
40
- def warn_on_positional args
41
- msg = <<-WARNING
42
- Called from: #{caller[1]}
43
- #############################################################
44
- # WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! #
45
- #############################################################
46
-
47
- Using positional arguments is **DEPRECATED**. Please use the
48
- keyword options pattern instead. Version __0.7.0__ of the
49
- Ruby client will not support positional arguments.
50
-
51
- If you need help, please hop on irc.freenode.net #balanced
52
- or contact support@balancedpayments.com
53
- WARNING
54
- # warn if [...] otherwise, it's ok if it's: [], [{}] or [{...}]
55
- unless (args.size == 1 and args.last.is_a? Hash) or (args.size == 0)
56
- warn msg
57
- end
58
- end
59
-
60
123
  def response
61
124
  @response
62
125
  end
63
- private :response
64
126
 
65
- def destroy
66
- Balanced.delete @attributes[:uri]
67
- end
127
+ private :response
68
128
 
69
129
  def unstore
70
- destroy
130
+ Balanced.unstore @attributes[:href]
71
131
  end
132
+ alias_method :destroy, :unstore
72
133
 
73
- def reload the_response = nil
134
+ def reload(the_response = nil)
74
135
  if the_response
75
136
  return if the_response.body.to_s.length.zero?
76
137
  fresh = self.class.construct_from_response the_response.body
77
138
  else
78
- fresh = self.find(@attributes[:uri])
139
+ fresh = self.find(@attributes[:href])
79
140
  end
80
141
  fresh and copy_from fresh
81
142
  self
82
143
  end
83
144
 
84
- def copy_from other
145
+ def copy_from(other)
85
146
  other.instance_variables.each do |ivar|
86
147
  instance_variable_set ivar, other.instance_variable_get(ivar)
87
148
  end
88
149
  end
89
150
 
90
151
  def method_missing(method, *args, &block)
152
+ if @attributes.has_key?(method.to_s)
153
+ return @attributes[method.to_s]
154
+ end
155
+
91
156
  case method.to_s
92
- when /(.+)\=$/
157
+ when /(.+)=$/
93
158
  attr = method.to_s.chop
94
159
  @attributes[attr] = args[0]
95
160
  else
@@ -105,29 +170,36 @@ module Balanced
105
170
  # method requests that are essentially #{method}_uri.
106
171
  #
107
172
  # This solves the acute problem, for now.
108
- if @attributes.has_key? "#{method}_uri"
109
- value = @attributes["#{method}_uri"]
110
- values_class = Balanced.from_uri(value)
111
- # if uri is a collection -> this would definitely be if
112
- # it ends in a symbol then we should allow a lazy executor of
113
- # the query pager
114
- if Balanced.is_collection(value)
115
- pager = Balanced::Pager.new value, {}
116
- return pager.to_a
117
- else
118
- return values_class.find(value)
119
- end
173
+ if @hyperlinks.has_key? "#{method}"
174
+ value = @hyperlinks["#{method}"]
175
+ result = value.call
176
+ return result
120
177
  else
121
178
  super
122
179
  end
123
180
  end
124
181
  end
125
-
182
+
183
+ if RUBY_VERSION < '1.9'
184
+ def respond_to?(method_name, include_private=false)
185
+ does_resource_respond_to?(method_name) || super
186
+ end
187
+ else
188
+ def respond_to_missing?(method_name, include_private=false)
189
+ does_resource_respond_to?(method_name) || super
190
+ end
191
+ end
192
+
193
+ def does_resource_respond_to?(method_name)
194
+ @attributes.has_key?(method_name.to_s) or @hyperlinks.has_key?(method_name.to_s)
195
+ end
196
+
126
197
  def self.included(base)
127
198
  base.extend ClassMethods
128
199
  end
129
200
 
130
201
  module ClassMethods
202
+
131
203
  def resource_name
132
204
  Utils.demodulize name
133
205
  end
@@ -137,86 +209,77 @@ module Balanced
137
209
  end
138
210
 
139
211
  def collection_path
140
- ["/v#{Balanced.config[:version]}", collection_name].compact.join '/'
212
+ # this is to just support version1 stuff, but in reality, if we get here
213
+ # we should throw an exception since we do not want to use v1 ever.
214
+ if Balanced.config[:version] == '1'
215
+ # XXX: we should raise an exception if we get here.
216
+ ["/v#{Balanced.config[:version]}", collection_name].compact.join '/'
217
+ else
218
+ collection_name
219
+ end
141
220
  end
142
221
 
143
- def member_name
144
- Utils.underscore resource_name
222
+ def href
223
+ collection_path
145
224
  end
146
225
 
147
- # Returns the resource URI for a given class.
148
- #
149
- # @example A Balanced::Account resource
150
- # Balanced::Account.uri # => "/v1/marketplaces/TEST-MP72zVdg2j9IiqRffW9lczRZ/accounts"
151
- #
152
- # @return [String] the uri of the instance or the class
153
- def uri
154
- # the uri of a particular resource depends if there's a marketplace
155
- # created or not. if there's a marketplace, then all resources have their
156
- # own uri from there and the top level ones. if there's not a marketplace
157
- #
158
- # if there's an api key, then the merchant is available
159
- # if there's no api key, the only resources exposed are purely top level
160
- if self == Balanced::Merchant || self == Balanced::Marketplace || self == Balanced::ApiKey
161
- collection_path
162
- else
163
- unless Balanced::Marketplace.marketplace_exists?
164
- raise Balanced::StandardError, "#{self.name} is nested under a marketplace, which is not created or configured."
165
- end
166
-
167
- Balanced::Marketplace.marketplace_uri + "/#{collection_name}"
168
- end
226
+ def member_name
227
+ Utils.underscore resource_name
169
228
  end
170
229
 
171
- def construct_from_response payload
172
- payload = Balanced::Utils.hash_with_indifferent_read_access payload
173
- return payload if payload[:uri].nil?
174
- klass = Balanced.from_uri(payload[:uri])
175
- instance = klass.new payload
230
+ def construct_from_response(payload)
231
+ payload = Balanced::Utils.indifferent_read_access payload
176
232
 
177
- # http://stackoverflow.com/a/2495650/133514
178
- instance_eigen = class << instance; self; end
233
+ links = payload.delete('links') || {}
234
+ meta = payload.delete('meta') || {}
179
235
 
180
- payload.each do |name, value|
236
+ if payload.length > 1
237
+ raise 'NOT SUPPORTED YET'
238
+ end
181
239
 
182
- # here is where our interpretations will begin.
183
- # if the value is a sub-resource, lets instantiate the class
184
- # and set it correctly
185
- if value.instance_of? Hash and value.has_key? 'uri'
186
- value = construct_from_response value
240
+ instance = nil
241
+ # the remaining keys here are just hypermedia resources
242
+ payload.each do |key, value|
243
+ # > If the length of an array at a resource key is greater than one,
244
+ # the value represents a list of documents.
245
+ if value.length > 1
246
+ # key is a collection, this should never happen
247
+ raise 'This should basically never happen'
187
248
  end
188
-
189
- # Get attribute
190
- instance.class.send(:define_method, name, proc{@attributes[name]})
191
- # Set attribute
192
- instance.class.send(:define_method, "#{name}=", proc{ |value| @attributes[name] = value })
193
- # Is attribute present?
194
- instance.class.send(:define_method, "#{name}?", proc{ !!@attributes[name] })
195
-
196
- instance.send("#{name}=".to_s, value)
249
+ # > Singular resources are represented as JSON objects. However,
250
+ # they are still wrapped inside an array:
251
+ resource_body = value.first
252
+ cls = Balanced.from_hypermedia_registry(key)
253
+ instance = cls.new resource_body
254
+ instance.hydrate(links, meta)
197
255
  end
198
256
  instance
199
257
  end
200
258
 
201
- def find *arguments
202
- scope = arguments.slice!(0)
259
+ def fetch(*arguments)
260
+ scope = arguments.slice!(0)
203
261
  options = arguments.slice!(0) || {}
204
262
  case scope
205
- when :all then all(options)
206
- when :first then paginate(options).first
263
+ when :all then
264
+ all(options)
265
+ when :first then
266
+ paginate(options).first
207
267
  else
208
268
  response = Balanced.get scope, options
209
269
  construct_from_response response.body
210
270
  end
211
271
  end
212
272
 
213
- def paginate options = {}
214
- Balanced::Pager.new uri, options
273
+ alias find fetch
274
+
275
+ def paginate(options = {})
276
+ Balanced::Pager.new href, options
215
277
  end
278
+
216
279
  alias scoped paginate
217
- alias where paginate
280
+ alias where paginate
218
281
 
219
- def all options = {}
282
+ def all(options = {})
220
283
  pager = paginate(options)
221
284
  pager.to_a
222
285
  end