chartmogul-ruby 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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