adtekio_adnetworks 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +24 -0
  5. data/README.md +333 -0
  6. data/Rakefile +56 -0
  7. data/VERSION +1 -0
  8. data/adtekio_adnetworks.gemspec +297 -0
  9. data/lib/adtekio_adnetworks.rb +6 -0
  10. data/lib/adtekio_adnetworks/api_key_scrapers.rb +59 -0
  11. data/lib/adtekio_adnetworks/api_key_scrapers/adcolony.rb +20 -0
  12. data/lib/adtekio_adnetworks/api_key_scrapers/applift.rb +13 -0
  13. data/lib/adtekio_adnetworks/api_key_scrapers/applovin.rb +13 -0
  14. data/lib/adtekio_adnetworks/api_key_scrapers/chartboost.rb +18 -0
  15. data/lib/adtekio_adnetworks/api_key_scrapers/crossinstall.rb +13 -0
  16. data/lib/adtekio_adnetworks/api_key_scrapers/leadbolt.rb +18 -0
  17. data/lib/adtekio_adnetworks/api_key_scrapers/loopme.rb +12 -0
  18. data/lib/adtekio_adnetworks/api_key_scrapers/mdotm.rb +22 -0
  19. data/lib/adtekio_adnetworks/api_key_scrapers/revmob.rb +22 -0
  20. data/lib/adtekio_adnetworks/api_key_scrapers/tapjoy.rb +19 -0
  21. data/lib/adtekio_adnetworks/api_key_scrapers/unilead.rb +13 -0
  22. data/lib/adtekio_adnetworks/api_key_scrapers/vungle.rb +23 -0
  23. data/lib/adtekio_adnetworks/importers.rb +58 -0
  24. data/lib/adtekio_adnetworks/importers/cost/adcolony.rb +43 -0
  25. data/lib/adtekio_adnetworks/importers/cost/adquant.rb +68 -0
  26. data/lib/adtekio_adnetworks/importers/cost/appia.rb +47 -0
  27. data/lib/adtekio_adnetworks/importers/cost/applifier.rb +64 -0
  28. data/lib/adtekio_adnetworks/importers/cost/applift.rb +41 -0
  29. data/lib/adtekio_adnetworks/importers/cost/applovin.rb +52 -0
  30. data/lib/adtekio_adnetworks/importers/cost/bidmotion.rb +82 -0
  31. data/lib/adtekio_adnetworks/importers/cost/chartboost.rb +40 -0
  32. data/lib/adtekio_adnetworks/importers/cost/crossinstall.rb +34 -0
  33. data/lib/adtekio_adnetworks/importers/cost/facebook.rb +39 -0
  34. data/lib/adtekio_adnetworks/importers/cost/fractionalmedia.rb +104 -0
  35. data/lib/adtekio_adnetworks/importers/cost/fyber.rb +54 -0
  36. data/lib/adtekio_adnetworks/importers/cost/gamegenetics.rb +44 -0
  37. data/lib/adtekio_adnetworks/importers/cost/glispa.rb +59 -0
  38. data/lib/adtekio_adnetworks/importers/cost/googleadwords.rb +99 -0
  39. data/lib/adtekio_adnetworks/importers/cost/jampp.rb +57 -0
  40. data/lib/adtekio_adnetworks/importers/cost/leadbolt.rb +43 -0
  41. data/lib/adtekio_adnetworks/importers/cost/lifestreet.rb +49 -0
  42. data/lib/adtekio_adnetworks/importers/cost/loopme.rb +63 -0
  43. data/lib/adtekio_adnetworks/importers/cost/matomy.rb +65 -0
  44. data/lib/adtekio_adnetworks/importers/cost/mdotm.rb +69 -0
  45. data/lib/adtekio_adnetworks/importers/cost/mmg.rb +67 -0
  46. data/lib/adtekio_adnetworks/importers/cost/mnectar.rb +45 -0
  47. data/lib/adtekio_adnetworks/importers/cost/moboqo.rb +33 -0
  48. data/lib/adtekio_adnetworks/importers/cost/mobpartner.rb +46 -0
  49. data/lib/adtekio_adnetworks/importers/cost/nanigans.rb +114 -0
  50. data/lib/adtekio_adnetworks/importers/cost/revmob.rb +44 -0
  51. data/lib/adtekio_adnetworks/importers/cost/rtbmob.rb +48 -0
  52. data/lib/adtekio_adnetworks/importers/cost/startapp.rb +47 -0
  53. data/lib/adtekio_adnetworks/importers/cost/supersonic.rb +77 -0
  54. data/lib/adtekio_adnetworks/importers/cost/tapjoy.rb +42 -0
  55. data/lib/adtekio_adnetworks/importers/cost/tokenads.rb +46 -0
  56. data/lib/adtekio_adnetworks/importers/cost/unilead.rb +39 -0
  57. data/lib/adtekio_adnetworks/importers/cost/vungle.rb +58 -0
  58. data/lib/adtekio_adnetworks/importers/cost_import.rb +13 -0
  59. data/lib/adtekio_adnetworks/importers/revenue/adcolony.rb +67 -0
  60. data/lib/adtekio_adnetworks/importers/revenue/applifier.rb +55 -0
  61. data/lib/adtekio_adnetworks/importers/revenue/applovin.rb +58 -0
  62. data/lib/adtekio_adnetworks/importers/revenue/chartboost.rb +43 -0
  63. data/lib/adtekio_adnetworks/importers/revenue/flurry.rb +85 -0
  64. data/lib/adtekio_adnetworks/importers/revenue/fyber.rb +61 -0
  65. data/lib/adtekio_adnetworks/importers/revenue/hypr_mx.rb +69 -0
  66. data/lib/adtekio_adnetworks/importers/revenue/lifestreet.rb +59 -0
  67. data/lib/adtekio_adnetworks/importers/revenue/mdotm.rb +38 -0
  68. data/lib/adtekio_adnetworks/importers/revenue/mopub.rb +54 -0
  69. data/lib/adtekio_adnetworks/importers/revenue/nexage.rb +71 -0
  70. data/lib/adtekio_adnetworks/importers/revenue/supersonic.rb +73 -0
  71. data/lib/adtekio_adnetworks/importers/revenue/tapsense.rb +38 -0
  72. data/lib/adtekio_adnetworks/importers/revenue/trialpay.rb +41 -0
  73. data/lib/adtekio_adnetworks/importers/revenue/vungle.rb +75 -0
  74. data/lib/adtekio_adnetworks/importers/revenue_import.rb +27 -0
  75. data/lib/adtekio_adnetworks/postbacks.rb +193 -0
  76. data/lib/adtekio_adnetworks/postbacks/aarki.rb +17 -0
  77. data/lib/adtekio_adnetworks/postbacks/adaction.rb +18 -0
  78. data/lib/adtekio_adnetworks/postbacks/adcash.rb +19 -0
  79. data/lib/adtekio_adnetworks/postbacks/adcolony.rb +90 -0
  80. data/lib/adtekio_adnetworks/postbacks/adgorithms.rb +74 -0
  81. data/lib/adtekio_adnetworks/postbacks/adjapon_nend.rb +39 -0
  82. data/lib/adtekio_adnetworks/postbacks/adknowledge.rb +18 -0
  83. data/lib/adtekio_adnetworks/postbacks/admob.rb +17 -0
  84. data/lib/adtekio_adnetworks/postbacks/adp.rb +18 -0
  85. data/lib/adtekio_adnetworks/postbacks/adperio.rb +19 -0
  86. data/lib/adtekio_adnetworks/postbacks/adquant.rb +39 -0
  87. data/lib/adtekio_adnetworks/postbacks/adstract.rb +15 -0
  88. data/lib/adtekio_adnetworks/postbacks/adxperience.rb +16 -0
  89. data/lib/adtekio_adnetworks/postbacks/airpush.rb +17 -0
  90. data/lib/adtekio_adnetworks/postbacks/app_chocolate.rb +17 -0
  91. data/lib/adtekio_adnetworks/postbacks/appfload.rb +17 -0
  92. data/lib/adtekio_adnetworks/postbacks/appia.rb +18 -0
  93. data/lib/adtekio_adnetworks/postbacks/appintheair.rb +17 -0
  94. data/lib/adtekio_adnetworks/postbacks/applifier.rb +49 -0
  95. data/lib/adtekio_adnetworks/postbacks/applift.rb +88 -0
  96. data/lib/adtekio_adnetworks/postbacks/applovin.rb +127 -0
  97. data/lib/adtekio_adnetworks/postbacks/appnext.rb +17 -0
  98. data/lib/adtekio_adnetworks/postbacks/appredeem.rb +33 -0
  99. data/lib/adtekio_adnetworks/postbacks/appsfire.rb +19 -0
  100. data/lib/adtekio_adnetworks/postbacks/appturbo.rb +18 -0
  101. data/lib/adtekio_adnetworks/postbacks/apsalar.rb +21 -0
  102. data/lib/adtekio_adnetworks/postbacks/bee7.rb +17 -0
  103. data/lib/adtekio_adnetworks/postbacks/bidmotion.rb +80 -0
  104. data/lib/adtekio_adnetworks/postbacks/blindferretmedia.rb +17 -0
  105. data/lib/adtekio_adnetworks/postbacks/chartboost.rb +116 -0
  106. data/lib/adtekio_adnetworks/postbacks/cheetah.rb +32 -0
  107. data/lib/adtekio_adnetworks/postbacks/clickky.rb +30 -0
  108. data/lib/adtekio_adnetworks/postbacks/covus.rb +17 -0
  109. data/lib/adtekio_adnetworks/postbacks/crossinstall.rb +26 -0
  110. data/lib/adtekio_adnetworks/postbacks/cyberagent_ameba.rb +17 -0
  111. data/lib/adtekio_adnetworks/postbacks/cyberagent_amoad.rb +17 -0
  112. data/lib/adtekio_adnetworks/postbacks/cyberagent_imobile.rb +43 -0
  113. data/lib/adtekio_adnetworks/postbacks/cyberagent_kjnw.rb +17 -0
  114. data/lib/adtekio_adnetworks/postbacks/cyberagent_maio.rb +18 -0
  115. data/lib/adtekio_adnetworks/postbacks/cyberagent_nend.rb +40 -0
  116. data/lib/adtekio_adnetworks/postbacks/cyberagent_smartc.rb +17 -0
  117. data/lib/adtekio_adnetworks/postbacks/cyberagent_smartnews.rb +17 -0
  118. data/lib/adtekio_adnetworks/postbacks/cyberz_asta.rb +26 -0
  119. data/lib/adtekio_adnetworks/postbacks/cyberz_bead.rb +26 -0
  120. data/lib/adtekio_adnetworks/postbacks/cyberz_imobile.rb +28 -0
  121. data/lib/adtekio_adnetworks/postbacks/cyberz_nend.rb +30 -0
  122. data/lib/adtekio_adnetworks/postbacks/datalead.rb +17 -0
  123. data/lib/adtekio_adnetworks/postbacks/eccrine.rb +80 -0
  124. data/lib/adtekio_adnetworks/postbacks/eeline.rb +50 -0
  125. data/lib/adtekio_adnetworks/postbacks/f5.rb +30 -0
  126. data/lib/adtekio_adnetworks/postbacks/fiksu.rb +43 -0
  127. data/lib/adtekio_adnetworks/postbacks/fiksu_applift.rb +31 -0
  128. data/lib/adtekio_adnetworks/postbacks/fractionalmedia.rb +78 -0
  129. data/lib/adtekio_adnetworks/postbacks/fyber.rb +36 -0
  130. data/lib/adtekio_adnetworks/postbacks/gamegenetics.rb +17 -0
  131. data/lib/adtekio_adnetworks/postbacks/ginga.rb +26 -0
  132. data/lib/adtekio_adnetworks/postbacks/glispa.rb +96 -0
  133. data/lib/adtekio_adnetworks/postbacks/googleadwords.rb +19 -0
  134. data/lib/adtekio_adnetworks/postbacks/growmobile.rb +36 -0
  135. data/lib/adtekio_adnetworks/postbacks/heyzap.rb +51 -0
  136. data/lib/adtekio_adnetworks/postbacks/inmobi.rb +50 -0
  137. data/lib/adtekio_adnetworks/postbacks/inneractive.rb +17 -0
  138. data/lib/adtekio_adnetworks/postbacks/instal.rb +18 -0
  139. data/lib/adtekio_adnetworks/postbacks/iqu.rb +19 -0
  140. data/lib/adtekio_adnetworks/postbacks/ironsource.rb +19 -0
  141. data/lib/adtekio_adnetworks/postbacks/jampp.rb +48 -0
  142. data/lib/adtekio_adnetworks/postbacks/jestadigital.rb +18 -0
  143. data/lib/adtekio_adnetworks/postbacks/jumpramp.rb +17 -0
  144. data/lib/adtekio_adnetworks/postbacks/jumptap.rb +23 -0
  145. data/lib/adtekio_adnetworks/postbacks/leadbolt.rb +29 -0
  146. data/lib/adtekio_adnetworks/postbacks/lifestreet.rb +97 -0
  147. data/lib/adtekio_adnetworks/postbacks/liftoff.rb +66 -0
  148. data/lib/adtekio_adnetworks/postbacks/loopme.rb +17 -0
  149. data/lib/adtekio_adnetworks/postbacks/magic_solver.rb +18 -0
  150. data/lib/adtekio_adnetworks/postbacks/marimedia.rb +20 -0
  151. data/lib/adtekio_adnetworks/postbacks/matomy.rb +59 -0
  152. data/lib/adtekio_adnetworks/postbacks/mdotm.rb +116 -0
  153. data/lib/adtekio_adnetworks/postbacks/misterbell.rb +18 -0
  154. data/lib/adtekio_adnetworks/postbacks/mmg.rb +20 -0
  155. data/lib/adtekio_adnetworks/postbacks/mnectar.rb +22 -0
  156. data/lib/adtekio_adnetworks/postbacks/moblin.rb +17 -0
  157. data/lib/adtekio_adnetworks/postbacks/moboqo.rb +17 -0
  158. data/lib/adtekio_adnetworks/postbacks/mobpartner.rb +19 -0
  159. data/lib/adtekio_adnetworks/postbacks/mopub.rb +30 -0
  160. data/lib/adtekio_adnetworks/postbacks/motive_interactive.rb +32 -0
  161. data/lib/adtekio_adnetworks/postbacks/mundo.rb +17 -0
  162. data/lib/adtekio_adnetworks/postbacks/nanigans.rb +38 -0
  163. data/lib/adtekio_adnetworks/postbacks/nativex.rb +30 -0
  164. data/lib/adtekio_adnetworks/postbacks/neodau.rb +19 -0
  165. data/lib/adtekio_adnetworks/postbacks/neverblue.rb +19 -0
  166. data/lib/adtekio_adnetworks/postbacks/operamedia.rb +39 -0
  167. data/lib/adtekio_adnetworks/postbacks/pandora.rb +17 -0
  168. data/lib/adtekio_adnetworks/postbacks/phunware.rb +18 -0
  169. data/lib/adtekio_adnetworks/postbacks/pirasin.rb +16 -0
  170. data/lib/adtekio_adnetworks/postbacks/playhaven.rb +31 -0
  171. data/lib/adtekio_adnetworks/postbacks/pocketmath.rb +17 -0
  172. data/lib/adtekio_adnetworks/postbacks/propeller.rb +18 -0
  173. data/lib/adtekio_adnetworks/postbacks/quixey.rb +17 -0
  174. data/lib/adtekio_adnetworks/postbacks/realzeit.rb +60 -0
  175. data/lib/adtekio_adnetworks/postbacks/remerge.rb +66 -0
  176. data/lib/adtekio_adnetworks/postbacks/revmob.rb +17 -0
  177. data/lib/adtekio_adnetworks/postbacks/ripple.rb +18 -0
  178. data/lib/adtekio_adnetworks/postbacks/roostr.rb +17 -0
  179. data/lib/adtekio_adnetworks/postbacks/rtbcom.rb +28 -0
  180. data/lib/adtekio_adnetworks/postbacks/septeni.rb +17 -0
  181. data/lib/adtekio_adnetworks/postbacks/seven_games.rb +51 -0
  182. data/lib/adtekio_adnetworks/postbacks/startapp.rb +48 -0
  183. data/lib/adtekio_adnetworks/postbacks/supersonic.rb +19 -0
  184. data/lib/adtekio_adnetworks/postbacks/tapjoy.rb +36 -0
  185. data/lib/adtekio_adnetworks/postbacks/taptica.rb +21 -0
  186. data/lib/adtekio_adnetworks/postbacks/targetcircle.rb +41 -0
  187. data/lib/adtekio_adnetworks/postbacks/todacell.rb +18 -0
  188. data/lib/adtekio_adnetworks/postbacks/tokenads.rb +18 -0
  189. data/lib/adtekio_adnetworks/postbacks/trademob.rb +48 -0
  190. data/lib/adtekio_adnetworks/postbacks/trademob_magic_solver.rb +22 -0
  191. data/lib/adtekio_adnetworks/postbacks/trialpay.rb +18 -0
  192. data/lib/adtekio_adnetworks/postbacks/unilead.rb +78 -0
  193. data/lib/adtekio_adnetworks/postbacks/uppsmobi.rb +19 -0
  194. data/lib/adtekio_adnetworks/postbacks/vungle.rb +33 -0
  195. data/lib/adtekio_adnetworks/postbacks/w4.rb +17 -0
  196. data/lib/adtekio_adnetworks/postbacks/webmedia.rb +17 -0
  197. data/lib/adtekio_adnetworks/postbacks/yahoo.rb +20 -0
  198. data/lib/adtekio_adnetworks/postbacks/youappi.rb +116 -0
  199. data/lib/adtekio_adnetworks/postbacks/zemail.rb +19 -0
  200. data/test/helper.rb +78 -0
  201. data/test/unit/postbacks/test_chartboost.rb +105 -0
  202. data/test/unit/postbacks/test_mdotm.rb +35 -0
  203. data/test/unit/postbacks/test_playhaven.rb +76 -0
  204. data/test/unit/postbacks/test_trademob_magic_solver.rb +24 -0
  205. data/test/unit/postbacks/test_unilead.rb +67 -0
  206. data/test/unit/test_api_key_scrapers.rb +302 -0
  207. data/test/unit/test_base_postback_class.rb +82 -0
  208. data/test/unit/test_cost_importers.rb +12 -0
  209. data/test/unit/test_postbacks.rb +33 -0
  210. data/test/unit/test_postbacks_definition.rb +111 -0
  211. data/test/unit/test_revenue_importers.rb +12 -0
  212. metadata +500 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8b21db42693f71b714df72dff25cf27036983929
4
+ data.tar.gz: 1e5ebb28a292fec9fa7c182deb5a58ac4b034080
5
+ SHA512:
6
+ metadata.gz: 33000247a08f914debf3d9bac0d5ee10e7e8e2da6e1c31b9469bba67fd21d8b3ab543a3913c88de2b4ab002c336434b80d791bbe7e5f5245ef68c28e25cd6f50
7
+ data.tar.gz: d4ef607151ed208ef8e004ab982b1676608c220cc67251d5e9ad9eaf07d6babf42e22f812be57d3bcd9432f9b5e1f73e0128b73353fd78ea59cfe0b91ad47cb9
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ adtekioadnetworks
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.2.3
data/Gemfile ADDED
@@ -0,0 +1,24 @@
1
+ # -*- mode: ruby -*-
2
+ source "http://rubygems.org"
3
+
4
+ gem 'net-http-persistent'
5
+ gem 'addressable'
6
+ gem 'rest-client'
7
+ gem 'oauth2'
8
+ gem 'mechanize'
9
+ gem 'google-adwords-api'
10
+ gem 'google-api-client'
11
+ gem 'curb'
12
+ gem 'uuidtools'
13
+ gem 'erubis'
14
+
15
+ gem 'activesupport'
16
+
17
+ group :development do
18
+ gem 'jeweler'
19
+ gem 'rake'
20
+ gem 'pry'
21
+ gem 'pry-doc'
22
+ gem 'shoulda'
23
+ gem 'rr'
24
+ end
data/README.md ADDED
@@ -0,0 +1,333 @@
1
+ # Adtek.io Adnetworks
2
+
3
+ Dealing with Mobile Advertising Networks can be a non-trivial task, especially
4
+ when it comes to integrating them into reporting tools: each has their own
5
+ report APIs, each of which return their own report-data format.
6
+
7
+ On top of that, each has its own authentication methods, making it difficult
8
+ to obtain the right credentials for the right report. Where possible, this
9
+ gem provides scrapers for adnetworks to obtain API credentials in a transparent
10
+ and common manner.
11
+
12
+ ## Raison d'être
13
+
14
+ Why this gem? The aim is to make mobile advertising and mobile user acquistion
15
+ more flexible and cost effective.
16
+
17
+ In a sense, this gem can help become your own mobile adnetwork aggregator
18
+ by allowing you to easily try out new adnetworks without having to integrate
19
+ their respective SDKs. The gem also provides the raw data for comparing the
20
+ performance of adnetworks and allowing you to make informed choices.
21
+
22
+ Of course, on its own, this gem does does not provide the complete picture.
23
+ What this gem does is provide the raw data in a unified manner so that other
24
+ tools can provide aggegration and comparisons across a number of
25
+ adnetworks. One such tool is [adtek.io][adtek] which provides the neccessary
26
+ infrastructure for flexibility and cost effectiveness for mobile
27
+ marketing and user acquistion.
28
+
29
+ On a technical level, this gem aggregates together all code related to
30
+ interfacing with the adnetworks. This includes importing their reporting
31
+ data, obtaining their [API][api] credentials (which are often confusing and
32
+ difficult to obtain) and providing networks with user tracking data so that
33
+ they can continue to optimise their campaigns.
34
+
35
+ ## Features
36
+
37
+ This gem provides four main features when dealing with mobile advertising
38
+ networks (adnetworks):
39
+
40
+ 1. [Spends importers][simp] which retrieve spending reports from
41
+ various networks.
42
+
43
+ 2. [Revenue importers][rimp] which retrieve revenue reports from various
44
+ adnetworks.
45
+
46
+ 3. [API Key Scrapers][apsc] aim to obtain the API credentials using the login
47
+ details of the adnetwork. That is to say, they automate the retrieval of
48
+ API credentials from adnetworks where possible.
49
+
50
+ So when an adnetwork says something like: ```To obtain your API key, first
51
+ login, then go to your profile page, then click API key ...``` etc, a
52
+ scraper will automagically do that to obtain the API credentials.
53
+
54
+ 4. [Postbacks][pblnk] provide callback links for various adnetworks so
55
+ that user tracking does not come from the mobile application but
56
+ from a backend server. Making the need to integrate a adnetworks
57
+ [SDK][sdk] redundant.
58
+
59
+ ## Integration
60
+
61
+ To include the gem in your project, add this to your favourite Gemfile:
62
+
63
+ ```
64
+ gem 'adtekio_adnetworks', :github => "adtekio/adnetworks"
65
+ ```
66
+
67
+ then run bundle and require the gem:
68
+
69
+ ```
70
+ require 'adtekio_adnetworks'
71
+ ```
72
+
73
+ ## Usage
74
+
75
+ You can play around with the gem by cloning it and then running a
76
+ [pry][pry] shell:
77
+
78
+ ```
79
+ git clone git@github.com:adtekio/adnetworks.git
80
+ cd adnetworks
81
+ bundle
82
+ rake shell
83
+ ```
84
+
85
+ Ideally you are using either [rbenv][rbenv] or [rvm][rvm] to isolate your ruby
86
+ versions and gemsets.
87
+
88
+ ### Spends Importers
89
+
90
+ *Note:* 'Spends Importer' and 'Cost Importer' are used interchangeably but
91
+ represent the same thing: the money spent on marketing and user acquistion.
92
+
93
+ Each cost importer is registered with the `AdtekioAdnetworks::CostImport`
94
+ class, from there you can get a complete list of supported adnetworks:
95
+
96
+ ```
97
+ pry> AdtekioAdnetworks::CostImport.networks
98
+ => {:adcolony=>AdtekioAdnetworks::Cost::Adcolony,
99
+ :adquant=>AdtekioAdnetworks::Cost::Adquant,
100
+ :appia=>AdtekioAdnetworks::Cost::Appia,
101
+ :applifier=>AdtekioAdnetworks::Cost::Applifier,
102
+ :applift=>AdtekioAdnetworks::Cost::Applift,
103
+ :applovin=>AdtekioAdnetworks::Cost::Applovin,
104
+ :bidmotion=>AdtekioAdnetworks::Cost::Bidmotion, ....
105
+ ```
106
+
107
+ This returns a hash with network-name/importer-class pairs of all
108
+ supported cost importers.
109
+
110
+ Each importer requires credentials to obtain the costs, to find out
111
+ what is required, you use the `required_credentials` class method:
112
+
113
+ ```
114
+ pry> importer_klass = AdtekioAdnetworks::CostImport.networks[:adcolony]
115
+ => AdtekioAdnetworks::Cost::Adcolony
116
+ pry> importer_klass.required_credentials
117
+ => [:api_key]
118
+ ```
119
+
120
+ In this example, adcolony requires an api_key. This can either be obtained
121
+ directly from adcolony or using [the corresponding api_scraper][adcapsc].
122
+
123
+ So having obtained the `api_key`, we can now use it by assigning the
124
+ credentials (using a hash instance):
125
+
126
+ ```
127
+ pry> importer = importer_klass.new
128
+ => #<AdtekioAdnetworks::Cost::Adcolony:0x007f822a051730>
129
+ pry> importer.credentials = { :api_key => "xxx" }
130
+ => {:api_key=>"xxx"}
131
+ ```
132
+
133
+ After that, to obtain the costs/spends for the last five days:
134
+
135
+ ```
136
+ pry> importer.campaign_costs(Date.today-5, Date.today)
137
+ => [{:date=>..., :campaign=>"xx", :adgroup=>"xx", :impressions=>..., :clicks=>..., :conversions=>..., :amount=>..., :target_country=>"..."},
138
+ ...etc
139
+ ```
140
+
141
+ The result is always an array of hashes. Hash can be different from importer
142
+ to importer, however they always include the `amount`, `date`, `campaign`,
143
+ and `clicks`.
144
+
145
+ This interface applies to all cost importers, they have the same interface but
146
+ different credentials.
147
+
148
+ ### Revenue Importers
149
+
150
+ Revenue importers retrieve data related to the revenue your mobile
151
+ application is making by showing advertising to your users. Basically
152
+ your revenue for an adnetwork is offsetting the cost for using that
153
+ adnetwork.
154
+
155
+ You might think that is wonderful, but you have to think about what
156
+ advertising they are showing your users. It might well be advertising for
157
+ your competition, so that you the revenue you are obtaining is actually
158
+ compensation for losing your users.
159
+
160
+ Using the revenue importers is very similar to using the cost importers,
161
+ first you get a list of supported adnetworks:
162
+
163
+ ```
164
+ pry> AdtekioAdnetworks::RevenueImport.networks
165
+ => {:adcolony=>AdtekioAdnetworks::Revenue::Adcolony,
166
+ :applifier=>AdtekioAdnetworks::Revenue::Applifier,
167
+ :applovin=>AdtekioAdnetworks::Revenue::Applovin,
168
+ :chartboost=>AdtekioAdnetworks::Revenue::Chartboost, ....
169
+ ```
170
+
171
+ Then you choice one for which you would like to import the revenue data:
172
+
173
+ ```
174
+ pry> importer_klass = AdtekioAdnetworks::RevenueImport.networks[:chartboost]
175
+ => AdtekioAdnetworks::Revenue::Chartboost
176
+ pry> importer_klass.required_credentials
177
+ => [:user_id, :signature]
178
+ ```
179
+
180
+ So we see that we need a `user_id` and `signature` for Chartboost. Since
181
+ we only have our login details, we can use the API key scraper to obtain
182
+ the user_id and signature:
183
+
184
+ ```
185
+ pry> login_details = { "username" => "xxx", "password" => "yyy" }
186
+ => {"username"=>"xxx", "password"=>"yyy"}
187
+ pry> creds = AdtekioAdnetworks::ApiKeyScrapers.new.obtain_key_for("chartboost", login_details)
188
+ => {"user_id"=>"zzz", "signature"=>"aaa"}
189
+ ```
190
+
191
+ Now we can start the chartboost revenue importer for the last five days:
192
+
193
+ ```
194
+ pry> importer = importer_klass.new
195
+ => #<AdtekioAdnetworks::Revenue::Chartboost:0x007ff1039c3460>
196
+ pry> importer.credentials = creds
197
+ => {"user_id"=>"zzz", "signature"=>"aaa"}
198
+ pry> importer.revenues(Date.today-5, Date.today)
199
+ => [{:impressions=>...,
200
+ :amount=>...,
201
+ :date=>...,
202
+ :appname=>....,
203
+ :not_matched=>....},
204
+ ```
205
+
206
+ What the revenue importer returns is an array of hashes containing amounts
207
+ and dates. Data is always aggregated by day.
208
+
209
+ For other adnetworks it is very similar, so just rinse and repeat for all
210
+ the adnetworks you have.
211
+
212
+ ### API Key Scrapers
213
+
214
+ Providing a unified method of obtaining API credentials. Since most adnetworks
215
+ do not use login details for their APIs, a user always has to obtain an
216
+ their API credentials from the adnetworks.
217
+
218
+ Since this can be a confusing task (since most adnetworks squirrel their
219
+ API credentials away somewhere non-intuitive) but using an API scraper,
220
+ this becomes as easy as providing username & password and pressing a
221
+ button!
222
+
223
+ All [supported adnetworks][libscp] all have the same interface:
224
+
225
+ ```
226
+ pry> scraper = AdtekioAdnetworks::ApiKeyScrapers.new
227
+ pry> login_details = {"username" => "username used to login", "password" => "password used to login" }
228
+ pry> credentials = scraper.obtain_key_for("applift",login_details))
229
+ ```
230
+
231
+ The `login_details` is always a hash with "username" and "password" as key.
232
+ Username is whatever the adnetworks requires to login, i.e it could be
233
+ an email or a username or a banana, whatever is required by the adnetwork.
234
+
235
+ `obtain_key_for` always returns a hash but what it contains is adnetwork
236
+ specific. However, for those adnetworks that return one value (i.e. an api
237
+ key or token), the hash always is for the form `{ :token => 'api key value' }`.
238
+
239
+ To get a list of all supported networks:
240
+
241
+ ```
242
+ pry> AdtekioAdnetworks::ApiKeyScrapers.supporter_adnetworks
243
+ => ["adcolony", "applift", "applovin", "chartboost", "crossinstall", "leadbolt", "loopme", "mdotm", "revmob", "tapjoy", "unilead", "vungle"]
244
+ ```
245
+
246
+ ### Postbacks
247
+
248
+ Postback definitions need to be seen in the context of how mobile advertising
249
+ and user acquistion currently works. Postbacks are very specific and if the
250
+ context is not clear, then they make little or no sense!
251
+
252
+ Currently if you want to mobile advertising for your application, you need
253
+ to choose an adnetwork (e.g. adcolony, unilead, etc), sign a deal with them
254
+ and integrate their [SDK][sdk] into your application. Then you can start
255
+ your campaigns to obtain users.
256
+
257
+ If you then discover that their campaigns are not performing, you end up
258
+ repeating the cycle and integrating some other adnetworks SDK into your
259
+ application. In a certain sense, SDKs have become a [vendor lock-in][vnli]
260
+ for the mobile marketing sector.
261
+
262
+ Of course, there are already aggregators on the market (e.g. singular,
263
+ adjust, tenjin, etc) however there you have a similar issues except you
264
+ are relying on a group of adnetworks chosen by the aggregator. If campaigns
265
+ do not perform, you still need to look for something else.
266
+
267
+ Anyone who has developed an mobile application knows that integrating SDKs
268
+ is a non-trival task and, in the case of Apple, results in delays when
269
+ releasing an application.
270
+
271
+ So the question becomes how to avoid the overhead of integrating adnetwork
272
+ SDKs but still have the flexibility of trying out different adnetworks?
273
+
274
+ To answer this, we need to know what these SDKs actually do. Basically they
275
+ provide user-tracking data for adnetworks to optimise their campaigns
276
+ (and also allow them to build up user profiles since adnetworks collect a
277
+ lot of data from lots of mobile applications).
278
+
279
+ Most (all?) of the time this data, collected from your users, is not
280
+ provided to you. Instead, if you are doing [A/B tests][abtst] and trying
281
+ to optimise your application for your users, you will be doing your own
282
+ user-tracking.
283
+
284
+ So your application will end up doing duplicate user tracking, which does
285
+ seem to be a bit of a waste (even in the digital virtual world).
286
+
287
+ This is where postbacks come in, they are simply the same tracking calls
288
+ that an adnetwork would do except you can trigger them. So now,
289
+ putting it all together, the intention is that since you are doing your own
290
+ user tracking, you can pass these tracking calls onto the adnetworks from
291
+ your tracking server and not from your mobile application.
292
+
293
+ Everybody wins: no more duplicate tracking from your mobile application,
294
+ the adnetworks get their tracking calls (in addition, these can become
295
+ more application specific) and the adnetworks can continue to optimise
296
+ their campaigns for your application.
297
+
298
+ If, on the other hand, your are not doing your own user tracking, then
299
+ postbacks are no benefit to you whatsoever. However, you could start using
300
+ [adtek.io][adtek] which also provides tracking and a single SDK.
301
+
302
+
303
+ ## License
304
+
305
+ Released under the GPLv2.
306
+
307
+ See https://www.gnu.org/licenses/gpl-2.0 for details.
308
+
309
+ ## Contributing to Gem
310
+
311
+ 1. Fork it ( https://github.com/adtekio/adnetworks/fork )
312
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
313
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
314
+ 4. Push to the branch (`git push origin my-new-feature`)
315
+ 5. Make sure to add tests (`rake test`)
316
+ 6. Please try not to mess with the Rakefile, version, or history
317
+ 7. Create new Pull Request
318
+
319
+ <!-- references, link endpoints, no need to look any further -->
320
+ [abtst]: https://en.wikipedia.org/wiki/A/B_testing
321
+ [adtek]: https://www.adtek.io
322
+ [adcapsc]: /lib/adtekio_adnetworks/api_key_scrapers/adcolony.rb
323
+ [api]: https://en.wikipedia.org/wiki/Application_programming_interface
324
+ [apsc]: /lib/adtekio_adnetworks/api_key_scrapers
325
+ [libscp]: /lib/adtekio_adnetworks/api_key_scrapers
326
+ [pblnk]: /lib/adtekio_adnetworks/postbacks
327
+ [pry]: http://pryrepl.org/
328
+ [rbenv]: https://github.com/rbenv/rbenv
329
+ [rimp]: /lib/adtekio_adnetworks/importers/revenue
330
+ [rvm]: https://rvm.io/
331
+ [sdk]: https://en.wikipedia.org/wiki/Software_development_kit
332
+ [simp]: /lib/adtekio_adnetworks/importers/cost
333
+ [vnli]: https://en.wikipedia.org/wiki/Vendor_lock-in
data/Rakefile ADDED
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
+ gem.name = "adtekio_adnetworks"
18
+ gem.homepage = "https://github.com/adtekio/adnetworks"
19
+ gem.license = "MIT"
20
+ gem.summary = %Q{Encapsulate mobile adnetworks support code.}
21
+ gem.description = %Q{Why this gem?
22
+ The aim is to make mobile advertising and mobile user acquistion
23
+ more flexible and cost effective.
24
+
25
+ In a sense, this gem can help become your own mobile adnetwork aggregator
26
+ by allowing you to easily try out new adnetworks without having to integrate
27
+ their respective SDKs. The gem also provides the raw data for comparing the
28
+ performance of adnetworks and allowing you to make informed choices.
29
+ }
30
+ gem.email = "gerrit.riessen@gmail.com"
31
+ gem.authors = ["Gerrit Riessen"]
32
+ # dependencies defined in Gemfile
33
+ end
34
+ Jeweler::RubygemsDotOrgTasks.new
35
+
36
+ require 'rake/testtask'
37
+ Rake::TestTask.new(:test) do |test|
38
+ test.libs << 'lib' << 'test'
39
+ test.pattern = 'test/**/test_*.rb'
40
+ test.verbose = true
41
+ test.warning = false
42
+ end
43
+
44
+ task :default => :test
45
+
46
+ task :environment do
47
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
48
+ require_relative 'lib/adtekio_adnetworks'
49
+ end
50
+
51
+ desc "Start a pry shell and load all gems"
52
+ task :shell => :environment do
53
+ require 'pry'
54
+ Pry.editor = "emacs"
55
+ Pry.start
56
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.4
@@ -0,0 +1,297 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+ # stub: adtekio_adnetworks 0.0.4 ruby lib
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "adtekio_adnetworks"
9
+ s.version = "0.0.4"
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
13
+ s.authors = ["Gerrit Riessen"]
14
+ s.date = "2016-09-09"
15
+ s.description = "Why this gem?\nThe aim is to make mobile advertising and mobile user acquistion\nmore flexible and cost effective.\n\nIn a sense, this gem can help become your own mobile adnetwork aggregator\nby allowing you to easily try out new adnetworks without having to integrate\ntheir respective SDKs. The gem also provides the raw data for comparing the\nperformance of adnetworks and allowing you to make informed choices.\n"
16
+ s.email = "gerrit.riessen@gmail.com"
17
+ s.extra_rdoc_files = [
18
+ "README.md"
19
+ ]
20
+ s.files = [
21
+ ".ruby-gemset",
22
+ ".ruby-version",
23
+ "Gemfile",
24
+ "README.md",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "adtekio_adnetworks.gemspec",
28
+ "lib/adtekio_adnetworks.rb",
29
+ "lib/adtekio_adnetworks/api_key_scrapers.rb",
30
+ "lib/adtekio_adnetworks/api_key_scrapers/adcolony.rb",
31
+ "lib/adtekio_adnetworks/api_key_scrapers/applift.rb",
32
+ "lib/adtekio_adnetworks/api_key_scrapers/applovin.rb",
33
+ "lib/adtekio_adnetworks/api_key_scrapers/chartboost.rb",
34
+ "lib/adtekio_adnetworks/api_key_scrapers/crossinstall.rb",
35
+ "lib/adtekio_adnetworks/api_key_scrapers/leadbolt.rb",
36
+ "lib/adtekio_adnetworks/api_key_scrapers/loopme.rb",
37
+ "lib/adtekio_adnetworks/api_key_scrapers/mdotm.rb",
38
+ "lib/adtekio_adnetworks/api_key_scrapers/revmob.rb",
39
+ "lib/adtekio_adnetworks/api_key_scrapers/tapjoy.rb",
40
+ "lib/adtekio_adnetworks/api_key_scrapers/unilead.rb",
41
+ "lib/adtekio_adnetworks/api_key_scrapers/vungle.rb",
42
+ "lib/adtekio_adnetworks/importers.rb",
43
+ "lib/adtekio_adnetworks/importers/cost/adcolony.rb",
44
+ "lib/adtekio_adnetworks/importers/cost/adquant.rb",
45
+ "lib/adtekio_adnetworks/importers/cost/appia.rb",
46
+ "lib/adtekio_adnetworks/importers/cost/applifier.rb",
47
+ "lib/adtekio_adnetworks/importers/cost/applift.rb",
48
+ "lib/adtekio_adnetworks/importers/cost/applovin.rb",
49
+ "lib/adtekio_adnetworks/importers/cost/bidmotion.rb",
50
+ "lib/adtekio_adnetworks/importers/cost/chartboost.rb",
51
+ "lib/adtekio_adnetworks/importers/cost/crossinstall.rb",
52
+ "lib/adtekio_adnetworks/importers/cost/facebook.rb",
53
+ "lib/adtekio_adnetworks/importers/cost/fractionalmedia.rb",
54
+ "lib/adtekio_adnetworks/importers/cost/fyber.rb",
55
+ "lib/adtekio_adnetworks/importers/cost/gamegenetics.rb",
56
+ "lib/adtekio_adnetworks/importers/cost/glispa.rb",
57
+ "lib/adtekio_adnetworks/importers/cost/googleadwords.rb",
58
+ "lib/adtekio_adnetworks/importers/cost/jampp.rb",
59
+ "lib/adtekio_adnetworks/importers/cost/leadbolt.rb",
60
+ "lib/adtekio_adnetworks/importers/cost/lifestreet.rb",
61
+ "lib/adtekio_adnetworks/importers/cost/loopme.rb",
62
+ "lib/adtekio_adnetworks/importers/cost/matomy.rb",
63
+ "lib/adtekio_adnetworks/importers/cost/mdotm.rb",
64
+ "lib/adtekio_adnetworks/importers/cost/mmg.rb",
65
+ "lib/adtekio_adnetworks/importers/cost/mnectar.rb",
66
+ "lib/adtekio_adnetworks/importers/cost/moboqo.rb",
67
+ "lib/adtekio_adnetworks/importers/cost/mobpartner.rb",
68
+ "lib/adtekio_adnetworks/importers/cost/nanigans.rb",
69
+ "lib/adtekio_adnetworks/importers/cost/revmob.rb",
70
+ "lib/adtekio_adnetworks/importers/cost/rtbmob.rb",
71
+ "lib/adtekio_adnetworks/importers/cost/startapp.rb",
72
+ "lib/adtekio_adnetworks/importers/cost/supersonic.rb",
73
+ "lib/adtekio_adnetworks/importers/cost/tapjoy.rb",
74
+ "lib/adtekio_adnetworks/importers/cost/tokenads.rb",
75
+ "lib/adtekio_adnetworks/importers/cost/unilead.rb",
76
+ "lib/adtekio_adnetworks/importers/cost/vungle.rb",
77
+ "lib/adtekio_adnetworks/importers/cost_import.rb",
78
+ "lib/adtekio_adnetworks/importers/revenue/adcolony.rb",
79
+ "lib/adtekio_adnetworks/importers/revenue/applifier.rb",
80
+ "lib/adtekio_adnetworks/importers/revenue/applovin.rb",
81
+ "lib/adtekio_adnetworks/importers/revenue/chartboost.rb",
82
+ "lib/adtekio_adnetworks/importers/revenue/flurry.rb",
83
+ "lib/adtekio_adnetworks/importers/revenue/fyber.rb",
84
+ "lib/adtekio_adnetworks/importers/revenue/hypr_mx.rb",
85
+ "lib/adtekio_adnetworks/importers/revenue/lifestreet.rb",
86
+ "lib/adtekio_adnetworks/importers/revenue/mdotm.rb",
87
+ "lib/adtekio_adnetworks/importers/revenue/mopub.rb",
88
+ "lib/adtekio_adnetworks/importers/revenue/nexage.rb",
89
+ "lib/adtekio_adnetworks/importers/revenue/supersonic.rb",
90
+ "lib/adtekio_adnetworks/importers/revenue/tapsense.rb",
91
+ "lib/adtekio_adnetworks/importers/revenue/trialpay.rb",
92
+ "lib/adtekio_adnetworks/importers/revenue/vungle.rb",
93
+ "lib/adtekio_adnetworks/importers/revenue_import.rb",
94
+ "lib/adtekio_adnetworks/postbacks.rb",
95
+ "lib/adtekio_adnetworks/postbacks/aarki.rb",
96
+ "lib/adtekio_adnetworks/postbacks/adaction.rb",
97
+ "lib/adtekio_adnetworks/postbacks/adcash.rb",
98
+ "lib/adtekio_adnetworks/postbacks/adcolony.rb",
99
+ "lib/adtekio_adnetworks/postbacks/adgorithms.rb",
100
+ "lib/adtekio_adnetworks/postbacks/adjapon_nend.rb",
101
+ "lib/adtekio_adnetworks/postbacks/adknowledge.rb",
102
+ "lib/adtekio_adnetworks/postbacks/admob.rb",
103
+ "lib/adtekio_adnetworks/postbacks/adp.rb",
104
+ "lib/adtekio_adnetworks/postbacks/adperio.rb",
105
+ "lib/adtekio_adnetworks/postbacks/adquant.rb",
106
+ "lib/adtekio_adnetworks/postbacks/adstract.rb",
107
+ "lib/adtekio_adnetworks/postbacks/adxperience.rb",
108
+ "lib/adtekio_adnetworks/postbacks/airpush.rb",
109
+ "lib/adtekio_adnetworks/postbacks/app_chocolate.rb",
110
+ "lib/adtekio_adnetworks/postbacks/appfload.rb",
111
+ "lib/adtekio_adnetworks/postbacks/appia.rb",
112
+ "lib/adtekio_adnetworks/postbacks/appintheair.rb",
113
+ "lib/adtekio_adnetworks/postbacks/applifier.rb",
114
+ "lib/adtekio_adnetworks/postbacks/applift.rb",
115
+ "lib/adtekio_adnetworks/postbacks/applovin.rb",
116
+ "lib/adtekio_adnetworks/postbacks/appnext.rb",
117
+ "lib/adtekio_adnetworks/postbacks/appredeem.rb",
118
+ "lib/adtekio_adnetworks/postbacks/appsfire.rb",
119
+ "lib/adtekio_adnetworks/postbacks/appturbo.rb",
120
+ "lib/adtekio_adnetworks/postbacks/apsalar.rb",
121
+ "lib/adtekio_adnetworks/postbacks/bee7.rb",
122
+ "lib/adtekio_adnetworks/postbacks/bidmotion.rb",
123
+ "lib/adtekio_adnetworks/postbacks/blindferretmedia.rb",
124
+ "lib/adtekio_adnetworks/postbacks/chartboost.rb",
125
+ "lib/adtekio_adnetworks/postbacks/cheetah.rb",
126
+ "lib/adtekio_adnetworks/postbacks/clickky.rb",
127
+ "lib/adtekio_adnetworks/postbacks/covus.rb",
128
+ "lib/adtekio_adnetworks/postbacks/crossinstall.rb",
129
+ "lib/adtekio_adnetworks/postbacks/cyberagent_ameba.rb",
130
+ "lib/adtekio_adnetworks/postbacks/cyberagent_amoad.rb",
131
+ "lib/adtekio_adnetworks/postbacks/cyberagent_imobile.rb",
132
+ "lib/adtekio_adnetworks/postbacks/cyberagent_kjnw.rb",
133
+ "lib/adtekio_adnetworks/postbacks/cyberagent_maio.rb",
134
+ "lib/adtekio_adnetworks/postbacks/cyberagent_nend.rb",
135
+ "lib/adtekio_adnetworks/postbacks/cyberagent_smartc.rb",
136
+ "lib/adtekio_adnetworks/postbacks/cyberagent_smartnews.rb",
137
+ "lib/adtekio_adnetworks/postbacks/cyberz_asta.rb",
138
+ "lib/adtekio_adnetworks/postbacks/cyberz_bead.rb",
139
+ "lib/adtekio_adnetworks/postbacks/cyberz_imobile.rb",
140
+ "lib/adtekio_adnetworks/postbacks/cyberz_nend.rb",
141
+ "lib/adtekio_adnetworks/postbacks/datalead.rb",
142
+ "lib/adtekio_adnetworks/postbacks/eccrine.rb",
143
+ "lib/adtekio_adnetworks/postbacks/eeline.rb",
144
+ "lib/adtekio_adnetworks/postbacks/f5.rb",
145
+ "lib/adtekio_adnetworks/postbacks/fiksu.rb",
146
+ "lib/adtekio_adnetworks/postbacks/fiksu_applift.rb",
147
+ "lib/adtekio_adnetworks/postbacks/fractionalmedia.rb",
148
+ "lib/adtekio_adnetworks/postbacks/fyber.rb",
149
+ "lib/adtekio_adnetworks/postbacks/gamegenetics.rb",
150
+ "lib/adtekio_adnetworks/postbacks/ginga.rb",
151
+ "lib/adtekio_adnetworks/postbacks/glispa.rb",
152
+ "lib/adtekio_adnetworks/postbacks/googleadwords.rb",
153
+ "lib/adtekio_adnetworks/postbacks/growmobile.rb",
154
+ "lib/adtekio_adnetworks/postbacks/heyzap.rb",
155
+ "lib/adtekio_adnetworks/postbacks/inmobi.rb",
156
+ "lib/adtekio_adnetworks/postbacks/inneractive.rb",
157
+ "lib/adtekio_adnetworks/postbacks/instal.rb",
158
+ "lib/adtekio_adnetworks/postbacks/iqu.rb",
159
+ "lib/adtekio_adnetworks/postbacks/ironsource.rb",
160
+ "lib/adtekio_adnetworks/postbacks/jampp.rb",
161
+ "lib/adtekio_adnetworks/postbacks/jestadigital.rb",
162
+ "lib/adtekio_adnetworks/postbacks/jumpramp.rb",
163
+ "lib/adtekio_adnetworks/postbacks/jumptap.rb",
164
+ "lib/adtekio_adnetworks/postbacks/leadbolt.rb",
165
+ "lib/adtekio_adnetworks/postbacks/lifestreet.rb",
166
+ "lib/adtekio_adnetworks/postbacks/liftoff.rb",
167
+ "lib/adtekio_adnetworks/postbacks/loopme.rb",
168
+ "lib/adtekio_adnetworks/postbacks/magic_solver.rb",
169
+ "lib/adtekio_adnetworks/postbacks/marimedia.rb",
170
+ "lib/adtekio_adnetworks/postbacks/matomy.rb",
171
+ "lib/adtekio_adnetworks/postbacks/mdotm.rb",
172
+ "lib/adtekio_adnetworks/postbacks/misterbell.rb",
173
+ "lib/adtekio_adnetworks/postbacks/mmg.rb",
174
+ "lib/adtekio_adnetworks/postbacks/mnectar.rb",
175
+ "lib/adtekio_adnetworks/postbacks/moblin.rb",
176
+ "lib/adtekio_adnetworks/postbacks/moboqo.rb",
177
+ "lib/adtekio_adnetworks/postbacks/mobpartner.rb",
178
+ "lib/adtekio_adnetworks/postbacks/mopub.rb",
179
+ "lib/adtekio_adnetworks/postbacks/motive_interactive.rb",
180
+ "lib/adtekio_adnetworks/postbacks/mundo.rb",
181
+ "lib/adtekio_adnetworks/postbacks/nanigans.rb",
182
+ "lib/adtekio_adnetworks/postbacks/nativex.rb",
183
+ "lib/adtekio_adnetworks/postbacks/neodau.rb",
184
+ "lib/adtekio_adnetworks/postbacks/neverblue.rb",
185
+ "lib/adtekio_adnetworks/postbacks/operamedia.rb",
186
+ "lib/adtekio_adnetworks/postbacks/pandora.rb",
187
+ "lib/adtekio_adnetworks/postbacks/phunware.rb",
188
+ "lib/adtekio_adnetworks/postbacks/pirasin.rb",
189
+ "lib/adtekio_adnetworks/postbacks/playhaven.rb",
190
+ "lib/adtekio_adnetworks/postbacks/pocketmath.rb",
191
+ "lib/adtekio_adnetworks/postbacks/propeller.rb",
192
+ "lib/adtekio_adnetworks/postbacks/quixey.rb",
193
+ "lib/adtekio_adnetworks/postbacks/realzeit.rb",
194
+ "lib/adtekio_adnetworks/postbacks/remerge.rb",
195
+ "lib/adtekio_adnetworks/postbacks/revmob.rb",
196
+ "lib/adtekio_adnetworks/postbacks/ripple.rb",
197
+ "lib/adtekio_adnetworks/postbacks/roostr.rb",
198
+ "lib/adtekio_adnetworks/postbacks/rtbcom.rb",
199
+ "lib/adtekio_adnetworks/postbacks/septeni.rb",
200
+ "lib/adtekio_adnetworks/postbacks/seven_games.rb",
201
+ "lib/adtekio_adnetworks/postbacks/startapp.rb",
202
+ "lib/adtekio_adnetworks/postbacks/supersonic.rb",
203
+ "lib/adtekio_adnetworks/postbacks/tapjoy.rb",
204
+ "lib/adtekio_adnetworks/postbacks/taptica.rb",
205
+ "lib/adtekio_adnetworks/postbacks/targetcircle.rb",
206
+ "lib/adtekio_adnetworks/postbacks/todacell.rb",
207
+ "lib/adtekio_adnetworks/postbacks/tokenads.rb",
208
+ "lib/adtekio_adnetworks/postbacks/trademob.rb",
209
+ "lib/adtekio_adnetworks/postbacks/trademob_magic_solver.rb",
210
+ "lib/adtekio_adnetworks/postbacks/trialpay.rb",
211
+ "lib/adtekio_adnetworks/postbacks/unilead.rb",
212
+ "lib/adtekio_adnetworks/postbacks/uppsmobi.rb",
213
+ "lib/adtekio_adnetworks/postbacks/vungle.rb",
214
+ "lib/adtekio_adnetworks/postbacks/w4.rb",
215
+ "lib/adtekio_adnetworks/postbacks/webmedia.rb",
216
+ "lib/adtekio_adnetworks/postbacks/yahoo.rb",
217
+ "lib/adtekio_adnetworks/postbacks/youappi.rb",
218
+ "lib/adtekio_adnetworks/postbacks/zemail.rb",
219
+ "test/helper.rb",
220
+ "test/unit/postbacks/test_chartboost.rb",
221
+ "test/unit/postbacks/test_mdotm.rb",
222
+ "test/unit/postbacks/test_playhaven.rb",
223
+ "test/unit/postbacks/test_trademob_magic_solver.rb",
224
+ "test/unit/postbacks/test_unilead.rb",
225
+ "test/unit/test_api_key_scrapers.rb",
226
+ "test/unit/test_base_postback_class.rb",
227
+ "test/unit/test_cost_importers.rb",
228
+ "test/unit/test_postbacks.rb",
229
+ "test/unit/test_postbacks_definition.rb",
230
+ "test/unit/test_revenue_importers.rb"
231
+ ]
232
+ s.homepage = "https://github.com/adtekio/adnetworks"
233
+ s.licenses = ["MIT"]
234
+ s.rubygems_version = "2.4.5.1"
235
+ s.summary = "Encapsulate mobile adnetworks support code."
236
+
237
+ if s.respond_to? :specification_version then
238
+ s.specification_version = 4
239
+
240
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
241
+ s.add_runtime_dependency(%q<net-http-persistent>, [">= 0"])
242
+ s.add_runtime_dependency(%q<addressable>, [">= 0"])
243
+ s.add_runtime_dependency(%q<rest-client>, [">= 0"])
244
+ s.add_runtime_dependency(%q<oauth2>, [">= 0"])
245
+ s.add_runtime_dependency(%q<mechanize>, [">= 0"])
246
+ s.add_runtime_dependency(%q<google-adwords-api>, [">= 0"])
247
+ s.add_runtime_dependency(%q<google-api-client>, [">= 0"])
248
+ s.add_runtime_dependency(%q<curb>, [">= 0"])
249
+ s.add_runtime_dependency(%q<uuidtools>, [">= 0"])
250
+ s.add_runtime_dependency(%q<erubis>, [">= 0"])
251
+ s.add_runtime_dependency(%q<activesupport>, [">= 0"])
252
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
253
+ s.add_development_dependency(%q<rake>, [">= 0"])
254
+ s.add_development_dependency(%q<pry>, [">= 0"])
255
+ s.add_development_dependency(%q<pry-doc>, [">= 0"])
256
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
257
+ s.add_development_dependency(%q<rr>, [">= 0"])
258
+ else
259
+ s.add_dependency(%q<net-http-persistent>, [">= 0"])
260
+ s.add_dependency(%q<addressable>, [">= 0"])
261
+ s.add_dependency(%q<rest-client>, [">= 0"])
262
+ s.add_dependency(%q<oauth2>, [">= 0"])
263
+ s.add_dependency(%q<mechanize>, [">= 0"])
264
+ s.add_dependency(%q<google-adwords-api>, [">= 0"])
265
+ s.add_dependency(%q<google-api-client>, [">= 0"])
266
+ s.add_dependency(%q<curb>, [">= 0"])
267
+ s.add_dependency(%q<uuidtools>, [">= 0"])
268
+ s.add_dependency(%q<erubis>, [">= 0"])
269
+ s.add_dependency(%q<activesupport>, [">= 0"])
270
+ s.add_dependency(%q<jeweler>, [">= 0"])
271
+ s.add_dependency(%q<rake>, [">= 0"])
272
+ s.add_dependency(%q<pry>, [">= 0"])
273
+ s.add_dependency(%q<pry-doc>, [">= 0"])
274
+ s.add_dependency(%q<shoulda>, [">= 0"])
275
+ s.add_dependency(%q<rr>, [">= 0"])
276
+ end
277
+ else
278
+ s.add_dependency(%q<net-http-persistent>, [">= 0"])
279
+ s.add_dependency(%q<addressable>, [">= 0"])
280
+ s.add_dependency(%q<rest-client>, [">= 0"])
281
+ s.add_dependency(%q<oauth2>, [">= 0"])
282
+ s.add_dependency(%q<mechanize>, [">= 0"])
283
+ s.add_dependency(%q<google-adwords-api>, [">= 0"])
284
+ s.add_dependency(%q<google-api-client>, [">= 0"])
285
+ s.add_dependency(%q<curb>, [">= 0"])
286
+ s.add_dependency(%q<uuidtools>, [">= 0"])
287
+ s.add_dependency(%q<erubis>, [">= 0"])
288
+ s.add_dependency(%q<activesupport>, [">= 0"])
289
+ s.add_dependency(%q<jeweler>, [">= 0"])
290
+ s.add_dependency(%q<rake>, [">= 0"])
291
+ s.add_dependency(%q<pry>, [">= 0"])
292
+ s.add_dependency(%q<pry-doc>, [">= 0"])
293
+ s.add_dependency(%q<shoulda>, [">= 0"])
294
+ s.add_dependency(%q<rr>, [">= 0"])
295
+ end
296
+ end
297
+