chartmogul-ruby 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/ChartMogul_Metrics_MRRChurnRate/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +40 -0
  6. data/ChartMogul_Metrics_MRRChurnRate/behaves_like_Metrics_API_resource/should_have_entries.yml +40 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +82 -0
  10. data/Rakefile +6 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/changelog.md +8 -0
  14. data/chartmogul-ruby.gemspec +29 -0
  15. data/fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_interracts_with_the_API.yml +189 -0
  16. data/fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_raises_errors_on_404.yml +46 -0
  17. data/fixtures/vcr_cassettes/ChartMogul_DataSource/API_Interactions/correctly_raises_errors_on_422.yml +48 -0
  18. data/fixtures/vcr_cassettes/ChartMogul_Enrichment_Customer/API_Interactions/adds_custom_attributes.yml +80 -0
  19. data/fixtures/vcr_cassettes/ChartMogul_Enrichment_Customer/API_Interactions/adds_required_tags.yml +79 -0
  20. data/fixtures/vcr_cassettes/ChartMogul_Enrichment_Customer/API_Interactions/raises_404_if_no_customers_found.yml +38 -0
  21. data/fixtures/vcr_cassettes/ChartMogul_Enrichment_Customer/API_Interactions/removes_custom_attributes.yml +80 -0
  22. data/fixtures/vcr_cassettes/ChartMogul_Enrichment_Customer/API_Interactions/removes_tags.yml +80 -0
  23. data/fixtures/vcr_cassettes/ChartMogul_Enrichment_Customer/API_Interactions/returns_all_customers_through_list_all_endpoint.yml +47 -0
  24. data/fixtures/vcr_cassettes/ChartMogul_Enrichment_Customer/API_Interactions/returns_customer_through_retrieve_endpoint.yml +42 -0
  25. data/fixtures/vcr_cassettes/ChartMogul_Enrichment_Customer/API_Interactions/returns_right_customers_through_search_endpoint.yml +43 -0
  26. data/fixtures/vcr_cassettes/ChartMogul_Enrichment_Customer/API_Interactions/updates_custom_attributes.yml +82 -0
  27. data/fixtures/vcr_cassettes/ChartMogul_Import_Customer/API_Interactions/correctly_handles_a_422_response.yml +50 -0
  28. data/fixtures/vcr_cassettes/ChartMogul_Import_Customer/API_Interactions/correctly_interracts_with_the_API.yml +240 -0
  29. data/fixtures/vcr_cassettes/ChartMogul_Import_CustomerInvoices/API_Interactions/correctly_interracts_with_the_API.yml +298 -0
  30. data/fixtures/vcr_cassettes/ChartMogul_Import_DataSource/API_Interactions/correctly_interracts_with_the_API.yml +189 -0
  31. data/fixtures/vcr_cassettes/ChartMogul_Import_DataSource/API_Interactions/correctly_raises_errors_on_404.yml +46 -0
  32. data/fixtures/vcr_cassettes/ChartMogul_Import_DataSource/API_Interactions/correctly_raises_errors_on_422.yml +48 -0
  33. data/fixtures/vcr_cassettes/ChartMogul_Import_Plan/API_Interractions/correctly_handles_a_422_error.yml +51 -0
  34. data/fixtures/vcr_cassettes/ChartMogul_Import_Plan/API_Interractions/correctly_interracts_with_the_API.yml +152 -0
  35. data/fixtures/vcr_cassettes/ChartMogul_Import_Subscription/API_Interactions/correctly_interracts_with_the_API.yml +340 -0
  36. data/fixtures/vcr_cassettes/ChartMogul_Import_Transactions_Payment/API_Interactions/correctly_interracts_with_the_API.yml +243 -0
  37. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ARPA/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +42 -0
  38. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ARPA/behaves_like_Metrics_API_resource/should_have_entries.yml +42 -0
  39. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ARR/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +42 -0
  40. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ARR/behaves_like_Metrics_API_resource/should_have_entries.yml +42 -0
  41. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ASP/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +40 -0
  42. data/fixtures/vcr_cassettes/ChartMogul_Metrics_ASP/behaves_like_Metrics_API_resource/should_have_entries.yml +40 -0
  43. data/fixtures/vcr_cassettes/ChartMogul_Metrics_Activity/behaves_like_Pageable/should_be_pageable.yml +41 -0
  44. data/fixtures/vcr_cassettes/ChartMogul_Metrics_Activity/should_have_Activity_entries.yml +41 -0
  45. data/fixtures/vcr_cassettes/ChartMogul_Metrics_AllKeyMetric/should_have_entries.yml +42 -0
  46. data/fixtures/vcr_cassettes/ChartMogul_Metrics_CustomerChurnRate/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +40 -0
  47. data/fixtures/vcr_cassettes/ChartMogul_Metrics_CustomerChurnRate/behaves_like_Metrics_API_resource/should_have_entries.yml +40 -0
  48. data/fixtures/vcr_cassettes/ChartMogul_Metrics_CustomerCount/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +42 -0
  49. data/fixtures/vcr_cassettes/ChartMogul_Metrics_CustomerCount/behaves_like_Metrics_API_resource/should_have_entries.yml +42 -0
  50. data/fixtures/vcr_cassettes/ChartMogul_Metrics_LTV/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +40 -0
  51. data/fixtures/vcr_cassettes/ChartMogul_Metrics_LTV/behaves_like_Metrics_API_resource/should_have_entries.yml +40 -0
  52. data/fixtures/vcr_cassettes/ChartMogul_Metrics_MRR/behaves_like_Summary/should_have_summary.yml +42 -0
  53. data/fixtures/vcr_cassettes/ChartMogul_Metrics_MRR/should_have_entries.yml +42 -0
  54. data/fixtures/vcr_cassettes/ChartMogul_Metrics_MRRChurnRate/behaves_like_Metrics_API_resource/behaves_like_Summary/should_have_summary.yml +40 -0
  55. data/fixtures/vcr_cassettes/ChartMogul_Metrics_MRRChurnRate/behaves_like_Metrics_API_resource/should_have_entries.yml +40 -0
  56. data/fixtures/vcr_cassettes/ChartMogul_Metrics_Subscription/behaves_like_Pageable/should_be_pageable.yml +40 -0
  57. data/fixtures/vcr_cassettes/ChartMogul_Metrics_Subscription/should_have_Subscription_entries.yml +40 -0
  58. data/lib/chartmogul.rb +77 -0
  59. data/lib/chartmogul/api/actions/all.rb +28 -0
  60. data/lib/chartmogul/api/actions/create.rb +39 -0
  61. data/lib/chartmogul/api/actions/custom.rb +42 -0
  62. data/lib/chartmogul/api/actions/destroy.rb +14 -0
  63. data/lib/chartmogul/api/actions/update.rb +19 -0
  64. data/lib/chartmogul/api_resource.rb +57 -0
  65. data/lib/chartmogul/concerns/entries.rb +37 -0
  66. data/lib/chartmogul/concerns/pageable.rb +14 -0
  67. data/lib/chartmogul/concerns/summary.rb +20 -0
  68. data/lib/chartmogul/config_attributes.rb +15 -0
  69. data/lib/chartmogul/configuration.rb +6 -0
  70. data/lib/chartmogul/enrichment/customer.rb +114 -0
  71. data/lib/chartmogul/errors/chartmogul_error.rb +19 -0
  72. data/lib/chartmogul/errors/configuration_error.rb +4 -0
  73. data/lib/chartmogul/errors/forbidden_error.rb +4 -0
  74. data/lib/chartmogul/errors/not_found_error.rb +4 -0
  75. data/lib/chartmogul/errors/resource_invalid_error.rb +4 -0
  76. data/lib/chartmogul/errors/schema_invalid_error.rb +4 -0
  77. data/lib/chartmogul/import/customer.rb +38 -0
  78. data/lib/chartmogul/import/customer_invoices.rb +40 -0
  79. data/lib/chartmogul/import/data_source.rb +19 -0
  80. data/lib/chartmogul/import/invoice.rb +64 -0
  81. data/lib/chartmogul/import/line_items/one_time.rb +25 -0
  82. data/lib/chartmogul/import/line_items/subscription.rb +31 -0
  83. data/lib/chartmogul/import/plan.rb +21 -0
  84. data/lib/chartmogul/import/subscription.rb +30 -0
  85. data/lib/chartmogul/import/transactions/payment.rb +26 -0
  86. data/lib/chartmogul/import/transactions/refund.rb +26 -0
  87. data/lib/chartmogul/metrics/activity.rb +32 -0
  88. data/lib/chartmogul/metrics/all_key_metrics.rb +25 -0
  89. data/lib/chartmogul/metrics/arpa.rb +19 -0
  90. data/lib/chartmogul/metrics/arr.rb +19 -0
  91. data/lib/chartmogul/metrics/asp.rb +19 -0
  92. data/lib/chartmogul/metrics/base.rb +56 -0
  93. data/lib/chartmogul/metrics/customer_churn_rate.rb +19 -0
  94. data/lib/chartmogul/metrics/customer_count.rb +19 -0
  95. data/lib/chartmogul/metrics/ltv.rb +19 -0
  96. data/lib/chartmogul/metrics/mrr.rb +26 -0
  97. data/lib/chartmogul/metrics/mrr_churn_rate.rb +19 -0
  98. data/lib/chartmogul/metrics/subscription.rb +35 -0
  99. data/lib/chartmogul/object.rb +119 -0
  100. data/lib/chartmogul/resource_path.rb +42 -0
  101. data/lib/chartmogul/summary.rb +7 -0
  102. data/lib/chartmogul/utils/hash_snake_caser.rb +50 -0
  103. data/lib/chartmogul/utils/json_parser.rb +11 -0
  104. data/lib/chartmogul/version.rb +3 -0
  105. metadata +232 -0
@@ -0,0 +1,42 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.chartmogul.com/v1/metrics/mrr?end-date=2015-02-01&start-date=2015-01-01
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.2
12
+ Content-Type:
13
+ - application/json
14
+ Authorization:
15
+ - Basic YzU0NjYwNDU5ZTMzODBkYzUyNmVhYjNiZjlhZGIyOGQ6N2MyMDEzOTYzZjQ2NGZiMmQ3ZjVjOTJkZDZiMjk2NDQ=
16
+ response:
17
+ status:
18
+ code: 200
19
+ message:
20
+ headers:
21
+ server:
22
+ - nginx/1.9.10
23
+ date:
24
+ - Fri, 01 Jul 2016 14:47:47 GMT
25
+ content-type:
26
+ - application/json
27
+ content-length:
28
+ - '4199'
29
+ connection:
30
+ - close
31
+ vary:
32
+ - Accept-Encoding
33
+ status:
34
+ - 200 OK
35
+ access-control-allow-credentials:
36
+ - 'true'
37
+ body:
38
+ encoding: UTF-8
39
+ string: '{"entries":[{"date":"2015-01-01","mrr":0,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-02","mrr":0,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-03","mrr":0,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-04","mrr":0,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-05","mrr":0,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-06","mrr":0,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-07","mrr":0,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-08","mrr":0,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-09","mrr":34112,"mrr-new-business":34112,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-10","mrr":34112,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-11","mrr":34112,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-12","mrr":64366,"mrr-new-business":30254,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-13","mrr":64366,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-14","mrr":55853,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":-30254,"mrr-reactivation":21741},{"date":"2015-01-15","mrr":55853,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-16","mrr":55853,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-17","mrr":55853,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-18","mrr":65853,"mrr-new-business":10000,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-19","mrr":65853,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-20","mrr":65853,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-21","mrr":65853,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-22","mrr":54982,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":-10871,"mrr-reactivation":0},{"date":"2015-01-23","mrr":53895,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":-1087,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-24","mrr":53895,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-25","mrr":53895,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-26","mrr":0,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":-64766,"mrr-reactivation":10871},{"date":"2015-01-27","mrr":10000,"mrr-new-business":10000,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-28","mrr":10000,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-29","mrr":6871,"mrr-new-business":4750,"mrr-expansion":12121,"mrr-contraction":0,"mrr-churn":-20000,"mrr-reactivation":0},{"date":"2015-01-30","mrr":15620,"mrr-new-business":0,"mrr-expansion":8749,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-01-31","mrr":15620,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0},{"date":"2015-02-01","mrr":15620,"mrr-new-business":0,"mrr-expansion":0,"mrr-contraction":0,"mrr-churn":0,"mrr-reactivation":0}],"summary":{"current":43371,"previous":43371,"percentage-change":0.0}}'
40
+ http_version:
41
+ recorded_at: Fri, 01 Jul 2016 14:47:47 GMT
42
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,40 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.chartmogul.com/v1/metrics/mrr-churn-rate?end-date=2015-02-01&start-date=2015-01-01
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.2
12
+ Content-Type:
13
+ - application/json
14
+ Authorization:
15
+ - Basic YzU0NjYwNDU5ZTMzODBkYzUyNmVhYjNiZjlhZGIyOGQ6N2MyMDEzOTYzZjQ2NGZiMmQ3ZjVjOTJkZDZiMjk2NDQ=
16
+ response:
17
+ status:
18
+ code: 200
19
+ message:
20
+ headers:
21
+ server:
22
+ - nginx/1.9.10
23
+ date:
24
+ - Fri, 01 Jul 2016 16:56:26 GMT
25
+ content-type:
26
+ - application/json
27
+ content-length:
28
+ - '160'
29
+ connection:
30
+ - close
31
+ status:
32
+ - 200 OK
33
+ access-control-allow-credentials:
34
+ - 'true'
35
+ body:
36
+ encoding: UTF-8
37
+ string: '{"entries":[{"date":"2015-01-31","mrr-churn-rate":0.0},{"date":"2015-02-01","mrr-churn-rate":0.0}],"summary":{"current":0,"previous":0,"percentage-change":0.0}}'
38
+ http_version:
39
+ recorded_at: Fri, 01 Jul 2016 16:56:26 GMT
40
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,40 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.chartmogul.com/v1/metrics/mrr-churn-rate?end-date=2015-02-01&start-date=2015-01-01
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.2
12
+ Content-Type:
13
+ - application/json
14
+ Authorization:
15
+ - Basic YzU0NjYwNDU5ZTMzODBkYzUyNmVhYjNiZjlhZGIyOGQ6N2MyMDEzOTYzZjQ2NGZiMmQ3ZjVjOTJkZDZiMjk2NDQ=
16
+ response:
17
+ status:
18
+ code: 200
19
+ message:
20
+ headers:
21
+ server:
22
+ - nginx/1.9.10
23
+ date:
24
+ - Fri, 01 Jul 2016 16:56:25 GMT
25
+ content-type:
26
+ - application/json
27
+ content-length:
28
+ - '160'
29
+ connection:
30
+ - close
31
+ status:
32
+ - 200 OK
33
+ access-control-allow-credentials:
34
+ - 'true'
35
+ body:
36
+ encoding: UTF-8
37
+ string: '{"entries":[{"date":"2015-01-31","mrr-churn-rate":0.0},{"date":"2015-02-01","mrr-churn-rate":0.0}],"summary":{"current":0,"previous":0,"percentage-change":0.0}}'
38
+ http_version:
39
+ recorded_at: Fri, 01 Jul 2016 16:56:25 GMT
40
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,40 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.chartmogul.com/v1/customers/cus_91af761e-9d0a-11e5-b514-1feab446feac/subscriptions
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.2
12
+ Content-Type:
13
+ - application/json
14
+ Authorization:
15
+ - Basic YzU0NjYwNDU5ZTMzODBkYzUyNmVhYjNiZjlhZGIyOGQ6N2MyMDEzOTYzZjQ2NGZiMmQ3ZjVjOTJkZDZiMjk2NDQ=
16
+ response:
17
+ status:
18
+ code: 200
19
+ message:
20
+ headers:
21
+ server:
22
+ - nginx/1.9.10
23
+ date:
24
+ - Fri, 01 Jul 2016 14:47:48 GMT
25
+ content-type:
26
+ - application/json
27
+ content-length:
28
+ - '308'
29
+ connection:
30
+ - close
31
+ status:
32
+ - 200 OK
33
+ access-control-allow-credentials:
34
+ - 'true'
35
+ body:
36
+ encoding: UTF-8
37
+ string: '{"entries":[{"id":9201273,"plan":"Yael Cohen","quantity":1,"mrr":10871,"arr":130452,"status":"active","billing-cycle":"day","billing-cycle-count":7,"start-date":"2015-10-15T13:41:40+00:00","end-date":"2015-10-22T13:41:40+00:00","currency":"USD","currency-sign":"$"}],"has_more":false,"per_page":200,"page":1}'
38
+ http_version:
39
+ recorded_at: Fri, 01 Jul 2016 14:47:48 GMT
40
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,40 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.chartmogul.com/v1/customers/cus_91af761e-9d0a-11e5-b514-1feab446feac/subscriptions
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Faraday v0.9.2
12
+ Content-Type:
13
+ - application/json
14
+ Authorization:
15
+ - Basic YzU0NjYwNDU5ZTMzODBkYzUyNmVhYjNiZjlhZGIyOGQ6N2MyMDEzOTYzZjQ2NGZiMmQ3ZjVjOTJkZDZiMjk2NDQ=
16
+ response:
17
+ status:
18
+ code: 200
19
+ message:
20
+ headers:
21
+ server:
22
+ - nginx/1.9.10
23
+ date:
24
+ - Fri, 01 Jul 2016 14:47:47 GMT
25
+ content-type:
26
+ - application/json
27
+ content-length:
28
+ - '308'
29
+ connection:
30
+ - close
31
+ status:
32
+ - 200 OK
33
+ access-control-allow-credentials:
34
+ - 'true'
35
+ body:
36
+ encoding: UTF-8
37
+ string: '{"entries":[{"id":9201273,"plan":"Yael Cohen","quantity":1,"mrr":10871,"arr":130452,"status":"active","billing-cycle":"day","billing-cycle-count":7,"start-date":"2015-10-15T13:41:40+00:00","end-date":"2015-10-22T13:41:40+00:00","currency":"USD","currency-sign":"$"}],"has_more":false,"per_page":200,"page":1}'
38
+ http_version:
39
+ recorded_at: Fri, 01 Jul 2016 14:47:47 GMT
40
+ recorded_with: VCR 3.0.3
data/lib/chartmogul.rb ADDED
@@ -0,0 +1,77 @@
1
+ require 'time'
2
+ require 'json'
3
+ require 'faraday'
4
+
5
+ require "chartmogul/version"
6
+
7
+ require "chartmogul/utils/hash_snake_caser"
8
+ require "chartmogul/utils/json_parser"
9
+
10
+ require "chartmogul/errors/chartmogul_error"
11
+ require "chartmogul/errors/not_found_error"
12
+ require "chartmogul/errors/configuration_error"
13
+ require "chartmogul/errors/resource_invalid_error"
14
+ require "chartmogul/errors/schema_invalid_error"
15
+
16
+ require "chartmogul/config_attributes"
17
+ require "chartmogul/configuration"
18
+
19
+ require "chartmogul/object"
20
+ require "chartmogul/resource_path"
21
+ require "chartmogul/api_resource"
22
+ require "chartmogul/summary"
23
+
24
+ require "chartmogul/api/actions/all"
25
+ require "chartmogul/api/actions/create"
26
+ require "chartmogul/api/actions/update"
27
+ require "chartmogul/api/actions/destroy"
28
+ require "chartmogul/api/actions/custom"
29
+
30
+ require "chartmogul/import/line_items/one_time"
31
+ require "chartmogul/import/line_items/subscription"
32
+
33
+ require "chartmogul/import/transactions/payment"
34
+ require "chartmogul/import/transactions/refund"
35
+
36
+ require "chartmogul/import/invoice"
37
+ require "chartmogul/import/customer_invoices"
38
+
39
+ require "chartmogul/import/subscription"
40
+ require "chartmogul/import/customer"
41
+ require "chartmogul/import/data_source"
42
+ require "chartmogul/import/plan"
43
+
44
+ require "chartmogul/concerns/entries"
45
+ require "chartmogul/concerns/summary"
46
+ require "chartmogul/concerns/pageable"
47
+
48
+ require "chartmogul/metrics/arpa"
49
+ require "chartmogul/metrics/arr"
50
+ require "chartmogul/metrics/asp"
51
+ require "chartmogul/metrics/customer_churn_rate"
52
+ require "chartmogul/metrics/customer_count"
53
+ require "chartmogul/metrics/ltv"
54
+ require "chartmogul/metrics/mrr"
55
+ require "chartmogul/metrics/mrr_churn_rate"
56
+ require "chartmogul/metrics/all_key_metrics"
57
+ require "chartmogul/metrics/base"
58
+
59
+ require "chartmogul/metrics/activity"
60
+ require "chartmogul/metrics/subscription"
61
+
62
+ require "chartmogul/enrichment/customer"
63
+
64
+ module ChartMogul
65
+ API_BASE = 'https://api.chartmogul.com'
66
+
67
+ class << self
68
+ extend ConfigAttributes
69
+
70
+ def config
71
+ @config ||= ChartMogul::Configuration.new
72
+ end
73
+
74
+ config_accessor :account_token
75
+ config_accessor :secret_key
76
+ end
77
+ end
@@ -0,0 +1,28 @@
1
+ module ChartMogul
2
+ module API
3
+ module Actions
4
+ module All
5
+ def self.included(base)
6
+ base.extend ClassMethods
7
+ end
8
+
9
+ module ClassMethods
10
+ def all(options = {})
11
+ resp = handling_errors do
12
+ connection.get(resource_path.apply_with_get_params(options)) do |req|
13
+ req.headers['Content-Type'] = 'application/json'
14
+ end
15
+ end
16
+ json = ChartMogul::Utils::JSONParser.parse(resp.body)
17
+
18
+ if resource_root_key && json.key?(resource_root_key)
19
+ json[resource_root_key].map { |attributes| new_from_json(attributes) }
20
+ else
21
+ new_from_json(json)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,39 @@
1
+ module ChartMogul
2
+ module API
3
+ module Actions
4
+ module Create
5
+ def self.included(base)
6
+ base.extend ClassMethods
7
+ end
8
+
9
+ def create!
10
+ resp = handling_errors do
11
+ connection.post(resource_path.apply(self.instance_attributes)) do |req|
12
+ req.headers['Content-Type'] = 'application/json'
13
+ req.body = JSON.dump(self.serialize_for_write)
14
+ end
15
+ end
16
+ json = ChartMogul::Utils::JSONParser.parse(resp.body)
17
+
18
+ assign_all_attributes(json)
19
+ end
20
+
21
+ module ClassMethods
22
+ def create!(attributes = {})
23
+ resource = new(attributes)
24
+
25
+ resp = handling_errors do
26
+ connection.post(resource_path.apply(attributes)) do |req|
27
+ req.headers['Content-Type'] = 'application/json'
28
+ req.body = JSON.dump(resource.serialize_for_write)
29
+ end
30
+ end
31
+ json = ChartMogul::Utils::JSONParser.parse(resp.body)
32
+
33
+ new_from_json(json)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,42 @@
1
+ module ChartMogul
2
+ module API
3
+ module Actions
4
+ module Custom
5
+ def self.included(base)
6
+ base.extend ClassMethods
7
+ end
8
+
9
+ def custom_without_assign!(http_method, http_path, body_data = {})
10
+ self.class.custom_without_assign!(http_method, http_path, body_data)
11
+ end
12
+
13
+ def custom!(http_method, http_path, body_data = {})
14
+ json = custom_without_assign!(http_method, http_path, body_data = {})
15
+ assign_all_attributes(json)
16
+ end
17
+
18
+ module ClassMethods
19
+ def custom_without_assign!(http_method, http_path, body_data = {})
20
+ resp = handling_errors do
21
+ connection.send(http_method, http_path) do |req|
22
+ req.headers['Content-Type'] = 'application/json'
23
+ req.body = JSON.dump(body_data)
24
+ end
25
+ end
26
+ ChartMogul::Utils::JSONParser.parse(resp.body)
27
+ end
28
+
29
+ def custom!(http_method, http_path, body_data = {})
30
+ json = custom_without_assign!(http_method, http_path, body_data = {})
31
+
32
+ if resource_root_key && json.key?(resource_root_key)
33
+ json[resource_root_key].map { |attributes| new_from_json(attributes) }
34
+ else
35
+ new_from_json(json)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,14 @@
1
+ module ChartMogul
2
+ module API
3
+ module Actions
4
+ module Destroy
5
+ def destroy!
6
+ handling_errors do
7
+ connection.delete("#{resource_path.apply(self.instance_attributes)}/#{uuid}")
8
+ end
9
+ true
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ module ChartMogul
2
+ module API
3
+ module Actions
4
+ module Update
5
+ def update!
6
+ resp = handling_errors do
7
+ connection.patch("#{resource_path.apply(self.instance_attributes)}/#{uuid}") do |req|
8
+ req.headers['Content-Type'] = 'application/json'
9
+ req.body = JSON.dump(self.serialize_for_write)
10
+ end
11
+ end
12
+ json = ChartMogul::Utils::JSONParser.parse(resp.body)
13
+
14
+ assign_all_attributes(json)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,57 @@
1
+ require 'forwardable'
2
+
3
+ module ChartMogul
4
+ class APIResource < ChartMogul::Object
5
+ extend Forwardable
6
+
7
+ class << self; attr_reader :resource_path, :resource_name, :resource_root_key end
8
+
9
+ def self.set_resource_path(path)
10
+ @resource_path = ChartMogul::ResourcePath.new(path)
11
+ end
12
+
13
+ def self.set_resource_name(name)
14
+ @resource_name = name
15
+ end
16
+
17
+ def self.set_resource_root_key(root_key)
18
+ @resource_root_key = root_key
19
+ end
20
+
21
+ def self.connection
22
+ @connection ||= Faraday.new(url: ChartMogul::API_BASE) do |faraday|
23
+ faraday.use Faraday::Request::BasicAuthentication, ChartMogul.account_token, ChartMogul.secret_key
24
+ faraday.use Faraday::Response::RaiseError
25
+ faraday.use Faraday::Adapter::NetHttp
26
+ end
27
+ end
28
+
29
+ def self.handling_errors
30
+ yield
31
+ rescue Faraday::ClientError => exception
32
+ response = exception.response[:body]
33
+ http_status = exception.response[:status]
34
+ case http_status
35
+ when 400
36
+ message = "JSON schema validation hasn't passed."
37
+ raise ChartMogul::SchemaInvalidError.new(message, http_status: 400, response: response)
38
+ when 403
39
+ message = "The requested action is forbidden."
40
+ raise ChartMogul::ForbiddenError.new(message, http_status: 403, response: response)
41
+ when 404
42
+ message = "The requested #{resource_name} could not be found."
43
+ raise ChartMogul::NotFoundError.new(message, http_status: 404, response: response)
44
+ when 422
45
+ message = "The #{resource_name} could not be created or updated."
46
+ raise ChartMogul::ResourceInvalidError.new(message, http_status: 422, response: response)
47
+ else
48
+ message = "#{resource_name} request error has occurred."
49
+ raise ChartMogul::ChartMogulError.new(message, http_status: http_status, response: response)
50
+ end
51
+ rescue => exception
52
+ raise ChartMogul::ChartMogulError.new(exception.message)
53
+ end
54
+
55
+ def_delegators 'self.class', :resource_path, :resource_name, :resource_root_key, :connection, :handling_errors
56
+ end
57
+ end