autometal-piwik 0.6.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. data/.gitignore +8 -0
  2. data/.travis.yml +10 -0
  3. data/Gemfile +4 -0
  4. data/License.txt +22 -0
  5. data/README.md +80 -76
  6. data/Rakefile +1 -33
  7. data/autometal-piwik.gemspec +19 -54
  8. data/bin/piwik-console +31 -0
  9. data/lib/piwik.rb +17 -5
  10. data/lib/piwik/actions.rb +59 -0
  11. data/lib/piwik/annotations.rb +41 -0
  12. data/lib/piwik/api.rb +21 -0
  13. data/lib/piwik/api_module.rb +97 -0
  14. data/lib/piwik/api_response.rb +6 -0
  15. data/lib/piwik/api_scope.rb +32 -0
  16. data/lib/piwik/base.rb +156 -69
  17. data/lib/piwik/custom_variables.rb +8 -0
  18. data/lib/piwik/data_methods.rb +54 -0
  19. data/lib/piwik/example_api.rb +15 -0
  20. data/lib/piwik/goals.rb +40 -0
  21. data/lib/piwik/image_graph.rb +7 -0
  22. data/lib/piwik/languages_manager.rb +13 -0
  23. data/lib/piwik/live.rb +8 -0
  24. data/lib/piwik/metadata_api.rb +21 -0
  25. data/lib/piwik/mobile_messaging.rb +16 -0
  26. data/lib/piwik/multi_sites.rb +8 -0
  27. data/lib/piwik/pdf_reports.rb +12 -0
  28. data/lib/piwik/provider.rb +7 -0
  29. data/lib/piwik/referers.rb +62 -0
  30. data/lib/piwik/seo.rb +7 -0
  31. data/lib/piwik/site.rb +50 -250
  32. data/lib/piwik/sites_manager.rb +70 -0
  33. data/lib/piwik/transitions.rb +28 -0
  34. data/lib/piwik/typecast.rb +19 -0
  35. data/lib/piwik/user.rb +7 -126
  36. data/lib/piwik/user_country.rb +12 -0
  37. data/lib/piwik/user_settings.rb +16 -0
  38. data/lib/piwik/users_manager.rb +52 -0
  39. data/lib/piwik/version.rb +3 -0
  40. data/lib/piwik/visit_frequency.rb +7 -0
  41. data/lib/piwik/visit_time.rb +9 -0
  42. data/lib/piwik/visitor_interest.rb +10 -0
  43. data/lib/piwik/visits_summary.rb +53 -0
  44. data/lib/string.rb +11 -0
  45. data/spec/actions_spec.rb +19 -0
  46. data/spec/api_spec.rb +12 -0
  47. data/spec/custom_variables_spec.rb +11 -0
  48. data/spec/files/API.get.xml +28 -0
  49. data/spec/files/API.getDefaultMetricTranslations.xml +39 -0
  50. data/spec/files/API.getDefaultMetrics.xml +8 -0
  51. data/spec/files/API.getDefaultMetricsDocumentation.xml +15 -0
  52. data/spec/files/API.getDefaultProcessedMetrics.xml +9 -0
  53. data/spec/files/API.getHeaderLogoUrl.xml +2 -0
  54. data/spec/files/API.getLogoUrl.xml +2 -0
  55. data/spec/files/API.getMetadata.xml +42 -0
  56. data/spec/files/API.getPiwikVersion.xml +2 -0
  57. data/spec/files/API.getProcessedReport.xml +1227 -0
  58. data/spec/files/API.getReportMetadata.xml +1347 -0
  59. data/spec/files/API.getRowEvolution.xml +4 -0
  60. data/spec/files/API.getSegmentsMetadata.xml +365 -0
  61. data/spec/files/API.getSettings.xml +7 -0
  62. data/spec/files/Actions.GetPageUrl.xml +20 -0
  63. data/spec/files/Actions.get.xml +11 -0
  64. data/spec/files/Actions.getDownloads.xml +19 -0
  65. data/spec/files/Actions.getEntryPageTitles.xml +88 -0
  66. data/spec/files/Actions.getEntryPageUrls.xml +93 -0
  67. data/spec/files/Actions.getExitPageTitles.xml +88 -0
  68. data/spec/files/Actions.getExitPageUrls.xml +93 -0
  69. data/spec/files/Actions.getOutlink.xml +12 -0
  70. data/spec/files/Actions.getOutlinks.xml +100 -0
  71. data/spec/files/Actions.getPageTitles.xml +134 -0
  72. data/spec/files/Actions.getPageUrls.xml +129 -0
  73. data/spec/files/Annotations.add.xml +11 -0
  74. data/spec/files/Annotations.getAll.xml +34 -0
  75. data/spec/files/Annotations.getAnnotationCountForDates.xml +12 -0
  76. data/spec/files/CustomVariables.getCustomVariables.xml +32 -0
  77. data/spec/files/ExampleAPI.getAnswerToLife.xml +2 -0
  78. data/spec/files/ExampleAPI.getCompetitionDatatable.xml +12 -0
  79. data/spec/files/ExampleAPI.getDescriptionArray.xml +8 -0
  80. data/spec/files/ExampleAPI.getMoreInformationAnswerToLife.xml +2 -0
  81. data/spec/files/ExampleAPI.getMultiArray.xml +22 -0
  82. data/spec/files/ExampleAPI.getNull.xml +4 -0
  83. data/spec/files/ExampleAPI.getObject.xml +4 -0
  84. data/spec/files/ExampleAPI.getPiwikVersion.xml +2 -0
  85. data/spec/files/ExampleAPI.getSum.xml +2 -0
  86. data/spec/files/Goals.get.xml +7 -0
  87. data/spec/files/Goals.getDaysToConversion.xml +59 -0
  88. data/spec/files/Goals.getGoals.xml +39 -0
  89. data/spec/files/Goals.getVisitsUntilConversion.xml +55 -0
  90. data/spec/files/ImageGraph.get.xml +0 -0
  91. data/spec/files/LanguagesManager.getAvailableLanguageNames.xml +233 -0
  92. data/spec/files/LanguagesManager.getAvailableLanguages.xml +49 -0
  93. data/spec/files/LanguagesManager.isLanguageAvailable.xml +2 -0
  94. data/spec/files/Live.getCounters.xml +8 -0
  95. data/spec/files/Live.getLastVisitsDetails.xml +768 -0
  96. data/spec/files/MultiSites.getAll.xml +2 -0
  97. data/spec/files/MultiSites.getOne.xml +11 -0
  98. data/spec/files/PDFReports.getReports.xml +35 -0
  99. data/spec/files/Provider.getProvider.xml +113 -0
  100. data/spec/files/Referers.getCampaigns.xml +2 -0
  101. data/spec/files/Referers.getKeywords.xml +145 -0
  102. data/spec/files/Referers.getKeywordsForPageUrl.xml +8 -0
  103. data/spec/files/Referers.getNumberOfDistinctCampaigns.xml +2 -0
  104. data/spec/files/Referers.getNumberOfDistinctKeywords.xml +2 -0
  105. data/spec/files/Referers.getNumberOfDistinctSearchEngines.xml +2 -0
  106. data/spec/files/Referers.getNumberOfDistinctWebsites.xml +2 -0
  107. data/spec/files/Referers.getNumberOfDistinctWebsitesUrls.xml +2 -0
  108. data/spec/files/Referers.getRefererType.xml +82 -0
  109. data/spec/files/Referers.getSearchEngines.xml +112 -0
  110. data/spec/files/Referers.getSocials.xml +2 -0
  111. data/spec/files/Referers.getUrlsForSocial.xml +2 -0
  112. data/spec/files/Referers.getWebsites.xml +386 -0
  113. data/spec/files/SEO.getRank.xml +33 -0
  114. data/spec/files/SitesManager.addSite.xml +1 -0
  115. data/spec/files/SitesManager.getAllSites.xml +63 -0
  116. data/spec/files/SitesManager.getAllSitesId.xml +4 -0
  117. data/spec/files/SitesManager.getCurrencyList.xml +165 -0
  118. data/spec/files/SitesManager.getCurrencySymbols.xml +165 -0
  119. data/spec/files/SitesManager.getDefaultCurrency.xml +2 -0
  120. data/spec/files/SitesManager.getDefaultTimezone.xml +2 -0
  121. data/spec/files/SitesManager.getExcludedIpsGlobal.xml +2 -0
  122. data/spec/files/SitesManager.getExcludedQueryParametersGlobal.xml +2 -0
  123. data/spec/files/SitesManager.getJavascriptTag.xml +14 -0
  124. data/spec/files/SitesManager.getSearchCategoryParametersGlobal.xml +2 -0
  125. data/spec/files/SitesManager.getSearchKeywordParametersGlobal.xml +2 -0
  126. data/spec/files/SitesManager.getSiteFromId.xml +18 -0
  127. data/spec/files/SitesManager.getSiteUrlsFromId.xml +4 -0
  128. data/spec/files/SitesManager.getSitesGroups.xml +4 -0
  129. data/spec/files/SitesManager.getSitesIdFromSiteUrl.xml +2 -0
  130. data/spec/files/SitesManager.getSitesIdWithAdminAccess.xml +4 -0
  131. data/spec/files/SitesManager.getSitesIdWithAtLeastViewAccess.xml +4 -0
  132. data/spec/files/SitesManager.getSitesIdWithViewAccess.xml +2 -0
  133. data/spec/files/SitesManager.getSitesIdWithVisits.xml +2 -0
  134. data/spec/files/SitesManager.getSitesWithAdminAccess.xml +63 -0
  135. data/spec/files/SitesManager.getSitesWithAtLeastViewAccess.xml +18 -0
  136. data/spec/files/SitesManager.getSitesWithViewAccess.xml +2 -0
  137. data/spec/files/SitesManager.getTimezonesList.xml +509 -0
  138. data/spec/files/SitesManager.getUniqueSiteTimezones.xml +4 -0
  139. data/spec/files/Transitions.getTranslations.xml +37 -0
  140. data/spec/files/UserCountry.getCity.xml +221 -0
  141. data/spec/files/UserCountry.getContinent.xml +185 -0
  142. data/spec/files/UserCountry.getCountry.xml +154 -0
  143. data/spec/files/UserCountry.getLocationFromIP.xml +17 -0
  144. data/spec/files/UserCountry.getNumberOfDistinctCountries.xml +2 -0
  145. data/spec/files/UserCountry.getRegion.xml +269 -0
  146. data/spec/files/UserSettings.getBrowser.xml +47 -0
  147. data/spec/files/UserSettings.getBrowserType.xml +58 -0
  148. data/spec/files/UserSettings.getBrowserVersion.xml +39 -0
  149. data/spec/files/UserSettings.getConfiguration.xml +43 -0
  150. data/spec/files/UserSettings.getMobileVsDesktop.xml +36 -0
  151. data/spec/files/UserSettings.getOS.xml +27 -0
  152. data/spec/files/UserSettings.getOSFamily.xml +102 -0
  153. data/spec/files/UserSettings.getPlugin.xml +63 -0
  154. data/spec/files/UserSettings.getResolution.xml +33 -0
  155. data/spec/files/UserSettings.getWideScreen.xml +47 -0
  156. data/spec/files/UsersManager.getSitesAccessFromUser.xml +4 -0
  157. data/spec/files/UsersManager.getUser.xml +10 -0
  158. data/spec/files/UsersManager.getUsers.xml +11 -0
  159. data/spec/files/UsersManager.getUsersAccessFromSite.xml +2 -0
  160. data/spec/files/UsersManager.getUsersLogin.xml +4 -0
  161. data/spec/files/UsersManager.getUsersSitesFromAccess.xml +2 -0
  162. data/spec/files/UsersManager.getUsersWithSiteAccess.xml +2 -0
  163. data/spec/files/UsersManager.userExists.xml +2 -0
  164. data/spec/files/VisitFrequency.get.xml +13 -0
  165. data/spec/files/VisitTime.getByDayOfWeek.xml +43 -0
  166. data/spec/files/VisitTime.getVisitInformationPerLocalTime.xml +83 -0
  167. data/spec/files/VisitTime.getVisitInformationPerServerTime.xml +87 -0
  168. data/spec/files/VisitorInterest.getNumberOfVisitsByDaysSinceLast.xml +63 -0
  169. data/spec/files/VisitorInterest.getNumberOfVisitsByVisitCount.xml +73 -0
  170. data/spec/files/VisitorInterest.getNumberOfVisitsPerPage.xml +43 -0
  171. data/spec/files/VisitorInterest.getNumberOfVisitsPerVisitDuration.xml +43 -0
  172. data/spec/files/VisitsSummary.get.xml +13 -0
  173. data/spec/files/VisitsSummary.getActions.xml +2 -0
  174. data/spec/files/VisitsSummary.getBounceCount.xml +2 -0
  175. data/spec/files/VisitsSummary.getMaxActions.xml +2 -0
  176. data/spec/files/VisitsSummary.getSumVisitsLength.xml +2 -0
  177. data/spec/files/VisitsSummary.getSumVisitsLengthPretty.xml +2 -0
  178. data/spec/files/VisitsSummary.getUniqueVisitors.xml +2 -0
  179. data/spec/files/VisitsSummary.getVisits.xml +2 -0
  180. data/spec/files/VisitsSummary.getVisitsConverted.xml +2 -0
  181. data/spec/files/failure.xml +3 -0
  182. data/spec/files/success.xml +3 -0
  183. data/spec/goals_spec.rb +14 -0
  184. data/spec/image_graph_spec.rb +12 -0
  185. data/spec/languages_manager_spec.rb +13 -0
  186. data/spec/live_spec.rb +13 -0
  187. data/spec/mobile_messaging_spec.rb +10 -0
  188. data/spec/multi_sites_spec.rb +11 -0
  189. data/spec/pdf_reports_spec.rb +11 -0
  190. data/spec/provider_spec.rb +12 -0
  191. data/spec/referers_spec.rb +46 -0
  192. data/spec/seo_spec.rb +15 -0
  193. data/spec/site_spec.rb +104 -0
  194. data/spec/sites_manager_spec.rb +30 -0
  195. data/spec/spec_helper.rb +76 -0
  196. data/spec/transitions_spec.rb +13 -0
  197. data/spec/user_country_spec.rb +33 -0
  198. data/spec/user_settings_spec.rb +50 -0
  199. data/spec/user_spec.rb +32 -0
  200. data/spec/users_manager_spec.rb +26 -0
  201. data/spec/visit_frequency_spec.rb +11 -0
  202. data/spec/visit_time_spec.rb +22 -0
  203. data/spec/visitor_interest_spec.rb +30 -0
  204. data/spec/visits_summary_spec.rb +47 -0
  205. metadata +426 -99
  206. data/.document +0 -5
  207. data/LICENSE +0 -7
  208. data/VERSION +0 -1
  209. data/lib/piwik/trackable.rb +0 -80
  210. data/script/console +0 -10
  211. data/test/files/config/example_piwik.yml +0 -4
  212. data/test/piwik_test.rb +0 -128
  213. data/test/test_helper.rb +0 -12
@@ -0,0 +1,8 @@
1
+ module Piwik
2
+ class CustomVariables < ApiModule
3
+ available_methods %W{
4
+ getCustomVariables
5
+ getCustomVariablesValuesFromNameId
6
+ }
7
+ end
8
+ end
@@ -0,0 +1,54 @@
1
+ module Piwik
2
+ # Provides a more intuitive interface to API responses.
3
+ # Responses may return a value or structured data, and objects will figure out what kind or response they are getting,
4
+ # and stick them in the appropriate instance variable.
5
+ # Value responses are accessed directly:
6
+ # Example:
7
+ #
8
+ # Piwik::VisitsSummary.getVisits(:idSite => 7, :period => :day, :date => Date.today).value
9
+ # => 467
10
+ #
11
+ # Data Responses can be accessed either as a Hash or an object.
12
+ # Example:
13
+ #
14
+ # s = Piwik::API.getSettings
15
+ # => #<Piwik::API::Settings:[snip] @data={"SDK_batch_size"=>"10", "SDK_interval_value"=>"30"}>
16
+ # s.SDK_batch_size
17
+ # => 10
18
+ # s['SDK_batch_size']
19
+ # => 10
20
+ # s.data['SDK_batch_size']
21
+ # => 10
22
+ module DataMethods
23
+ def self.included(base)
24
+ include Piwik::Typecast
25
+ base.send(:include, InstanceMethods)
26
+ attr_accessor :data,:value
27
+ end
28
+
29
+ module InstanceMethods
30
+ def empty?
31
+ data.blank? and value.blank?
32
+ end
33
+
34
+ def value
35
+ typecast(@value)
36
+ end
37
+
38
+ def initialize opts = {}
39
+ opts.map {|k,v| self.send(:"#{k}=",v) }
40
+ end
41
+
42
+ # try to pass method to the data variable
43
+ def method_missing(method, *args, &block)
44
+ if self.data.respond_to?(method)
45
+ typecast(self.data.send(method,*args,&block))
46
+ elsif self.data.is_a?(Hash) && self.data.key?(method.to_s)
47
+ typecast(self.data[method.to_s])
48
+ else
49
+ super
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,15 @@
1
+ module Piwik
2
+ class ExampleApi < ApiModule
3
+ available_methods %W{
4
+ getPiwikVersion
5
+ getAnswerToLife
6
+ getObject
7
+ getSum
8
+ getNull
9
+ getDescriptionArray
10
+ getCompetitionDatatable
11
+ getMoreInformationAnswerToLife
12
+ getMultiArray
13
+ }
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ module Piwik
2
+ class Goals < ApiModule
3
+ available_methods %W{
4
+ getGoals
5
+ addGoal
6
+ updateGoal
7
+ deleteGoal
8
+ getItemsSku
9
+ getItemsName
10
+ getItemsCategory
11
+ get
12
+ getDaysToConversion
13
+ getVisitsUntilConversion
14
+ }
15
+
16
+ scoped_methods do
17
+ def load goal_id, params = {}
18
+ get(defaults.merge(params).merge(:idGoal => goal_id))
19
+ end
20
+
21
+ def all
22
+ getGoals(defaults)
23
+ end
24
+
25
+ # params: (name, matchAttribute, pattern, patternType, caseSensitive = '', revenue = '', allowMultipleConversionsPerVisit = '')
26
+ def add params = {}
27
+ addGoal(defaults.merge(params))
28
+ end
29
+
30
+ # params: (name, matchAttribute, pattern, patternType, caseSensitive = '', revenue = '', allowMultipleConversionsPerVisit = '')
31
+ def update goal_id, params = {}
32
+ updateGoal(defaults.merge(params).merge(:idGoal => goal_id))
33
+ end
34
+
35
+ def delete goal_id
36
+ deleteGoal(defaults.merge(:idGoal => goal_id))
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,7 @@
1
+ module Piwik
2
+ class ImageGraph < ApiModule
3
+ available_methods %W{
4
+ get
5
+ }
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ module Piwik
2
+ class LanguagesManager < ApiModule
3
+ available_methods %W{
4
+ isLanguageAvailable
5
+ getAvailableLanguages
6
+ getAvailableLanguagesInfo
7
+ getAvailableLanguageNames
8
+ getTranslationsForLanguage
9
+ getLanguageForUser
10
+ setLanguageForUser
11
+ }
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ module Piwik
2
+ class Live < ApiModule
3
+ available_methods %W{
4
+ getCounters
5
+ getLastVisitsDetails
6
+ }
7
+ end
8
+ end
@@ -0,0 +1,21 @@
1
+ module Piwik
2
+ class API < ApiModule
3
+ available_methods %W{
4
+ getPiwikVersion
5
+ getSettings
6
+ getDefaultMetricTranslations
7
+ getDefaultMetrics
8
+ getDefaultProcessedMetrics
9
+ getDefaultMetricsDocumentation
10
+ getSegmentsMetadata
11
+ getLogoUrl
12
+ getHeaderLogoUrl
13
+ getMetadata
14
+ getReportMetadata
15
+ getProcessedReport
16
+ get
17
+ getRowEvolution
18
+ getBulkRequest
19
+ }
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module Piwik
2
+ class MobileMessaging < ApiModule
3
+ available_methods %W{
4
+ areSMSAPICredentialProvided
5
+ getSMSProvider
6
+ setSMSAPICredential
7
+ addPhoneNumber
8
+ getCreditLeft
9
+ removePhoneNumber
10
+ validatePhoneNumber
11
+ deleteSMSAPICredential
12
+ setDelegatedManagement
13
+ getDelegatedManagement
14
+ }
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ module Piwik
2
+ class MultiSites < ApiModule
3
+ available_methods %W{
4
+ getAll
5
+ getOne
6
+ }
7
+ end
8
+ end
@@ -0,0 +1,12 @@
1
+ module Piwik
2
+ class PdfReports < ApiModule
3
+ available_methods %W{
4
+ addReport
5
+ updateReport
6
+ deleteReport
7
+ getReports
8
+ generateReport
9
+ sendReport
10
+ }
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ module Piwik
2
+ class Provider < ApiModule
3
+ available_methods %W{
4
+ getProvider
5
+ }
6
+ end
7
+ end
@@ -0,0 +1,62 @@
1
+ module Piwik
2
+ class Referers < ApiModule
3
+ available_methods %W{
4
+ getRefererType
5
+ getKeywords
6
+ getKeywordsForPageUrl
7
+ getKeywordsForPageTitle
8
+ getSearchEnginesFromKeywordId
9
+ getSearchEngines
10
+ getKeywordsFromSearchEngineId
11
+ getCampaigns
12
+ getKeywordsFromCampaignId
13
+ getWebsites
14
+ getSocials
15
+ getUrlsForSocial
16
+ getUrlsFromWebsiteId
17
+ getNumberOfDistinctSearchEngines
18
+ getNumberOfDistinctKeywords
19
+ getNumberOfDistinctCampaigns
20
+ getNumberOfDistinctWebsites
21
+ getNumberOfDistinctWebsitesUrls
22
+ }
23
+
24
+ scoped_methods do
25
+ def websites params = {}
26
+ getWebsites(defaults.merge(params))
27
+ end
28
+
29
+ def websites_count params = {}
30
+ getNumberOfDistinctWebsites(defaults.merge(params)).value
31
+ end
32
+
33
+ def keywords params = {}
34
+ getKeywords(defaults.merge(params))
35
+ end
36
+
37
+ def keywords_for_title(title, params = {})
38
+ getKeywordsForPageTitle(defaults.merge(params).merge(:pageTitle => title))
39
+ end
40
+
41
+ def keywords_for_url(url, params = {})
42
+ getKeywordsForPageUrl(defaults.merge(params).merge(:pageUrl => url))
43
+ end
44
+
45
+ def keywords_count params = {}
46
+ getNumberOfDistinctKeywords(defaults.merge(params)).value
47
+ end
48
+
49
+ def search_engines params = {}
50
+ getSearchEngines(defaults.merge(params))
51
+ end
52
+
53
+ def search_engines_count params = {}
54
+ getNumberOfDistinctSearchEngines(defaults.merge(params)).value
55
+ end
56
+
57
+ def socials params = {}
58
+ getSocials(defaults.merge(params))
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,7 @@
1
+ module Piwik
2
+ class SEO < ApiModule
3
+ available_methods %W{
4
+ getRank
5
+ }
6
+ end
7
+ end
@@ -1,276 +1,76 @@
1
1
  module Piwik
2
- class Site < Piwik::Base
3
- attr_accessor :name, :main_url
4
- attr_reader :id, :created_at, :config
2
+ # <tt>Piwik::Site</tt> is a wrapper class used to expose a more ruby-friendly (and sane) interface to the Piwik API.
3
+ # The Piwik API is under development, and there are quite a few incosistencies that are ironed out
4
+ # when it is used through the <tt>Piwik::Site</tt> metaclass.
5
+ #
6
+ # Example usage using the bundled terminal script. Uses the official Piwik demo server as a sandbox
7
+ #
8
+ # $ ./script/terminal -u http://demo.piwik.org -t anonymous
9
+ # > site = Piwik::Site.load(7)
10
+ # => #<Piwik::Site[snip]>
11
+ # > summary = site.visits.summary
12
+ # => #<Piwik::VisitsSummary[snip]>
13
+ # > summary.bounce_rate
14
+ # => "68%"
15
+ # > site.visits.count
16
+ # => 467
17
+ # > site.annotations.all
18
+ # => #<Piwik::Annotations::All[snip]>
19
+ # > site.annotations.add(:date => 'today', :note => 'twitter account online', :starred => '1')
20
+ # => Piwik::ApiError: The current user is not allowed to add notes for site #7
21
+ # > site.referers.website_count
22
+ # => 12
23
+ #
24
+ # This class creates site-aware proxies (called <tt>api_scopes</tt>) to the various client classes.
25
+ # This lets you call api methods for a selected site without having to resubmit the site id all the time.
26
+ # Furthermore, API methods are redefined as proxy_methods,
27
+ # allowing for ruby-friendlier names, default parameters and other nice things.
28
+ class Site < Base
29
+ api_scope :referers
30
+ api_scope :visits, :class_name => 'VisitsSummary'
31
+ api_scope :actions
32
+ api_scope :transitions
33
+ api_scope :annotations
34
+ api_scope :goals
5
35
 
6
- # Initializes a new <tt>Piwik::Site</tt> object, with the supplied attributes.
7
- #
8
- # You can pass the URL for your Piwik install and an authorization token as
9
- # the second and third parameters. If you don't, than it will try to find
10
- # them in a <tt>'~/.piwik'</tt> or <tt>RAILS_ROOT/config/piwik.yml</tt>
11
- # (and create the file with an empty template if it doesn't exists).
12
- #
13
- # Valid (and required) attributes are:
14
- # * <tt>:name</tt> - the site's name
15
- # * <tt>:main_url</tt> - the site's url
16
- def initialize(attributes={}, piwik_url=nil, auth_token=nil)
17
- raise ArgumentError, "expected an attributes Hash, got #{attributes.inspect}" unless attributes.is_a?(Hash)
18
- @config = if piwik_url.nil? || auth_token.nil?
19
- self.class.load_config
20
- else
21
- {:piwik_url => piwik_url, :auth_token => auth_token}
22
- end
23
- load_attributes(attributes)
24
- end
25
-
26
- # Returns an instance of <tt>Piwik::Site</tt> representing the site identified by
27
- # the supplied <tt>site_id</tt>. Raises a <tt>Piwik::ApiError</tt> if the site doesn't
28
- # exists or if the user associated with the supplied auth_token does not
29
- # have at least 'view' access to the site.
30
- #
31
- # You can pass the URL for your Piwik install and an authorization token as
32
- # the second and third parameters. If you don't, than it will try to find
33
- # them in a <tt>'~/.piwik'</tt> (and create the file with an empty template if it
34
- # doesn't exists).
35
- def self.load(site_id, piwik_url=nil, auth_token=nil)
36
- raise ArgumentError, "expected a site Id" if site_id.nil?
37
- @config = if piwik_url.nil? || auth_token.nil?
38
- load_config
39
- else
40
- {:piwik_url => piwik_url, :auth_token => auth_token}
41
- end
42
- attributes = get_site_attributes_by_id(site_id, @config[:piwik_url], @config[:auth_token])
43
- new(attributes, @config[:piwik_url], @config[:auth_token])
44
- end
45
-
46
- # Returns <tt>true</tt> if the current site does not exists in the Piwik yet.
47
- def new?
48
- id.nil? && created_at.nil?
49
- end
50
-
51
- # Saves the current site in Piwik.
52
- #
53
- # Calls <tt>create</tt> it it's a new site, <tt>update</tt> otherwise.
54
- def save
55
- new? ? create : update
56
- end
57
-
58
- # Saves the current new site in Piwik.
59
- #
60
- # Equivalent Piwik API call: SitesManager.addSite (siteName, urls)
61
- def create
62
- raise ArgumentError, "Site already exists in Piwik, call 'update' instead" unless new?
63
- raise ArgumentError, "Name can not be blank" if name.blank?
64
- raise ArgumentError, "Main URL can not be blank" if main_url.blank?
65
- result = call('SitesManager.addSite', :siteName => name, :urls => main_url)
66
- @id = result['value'].to_i
67
- @created_at = Time.current
68
- id && id > 0 ? true : false
69
- end
70
-
71
- # Saves the current site in Piwik, updating it's data.
72
- #
73
- # Equivalent Piwik API call: SitesManager.updateSite (idSite, siteName, urls)
74
- def update
75
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
76
- raise ArgumentError, "Name can not be blank" if name.blank?
77
- raise ArgumentError, "Main URL can not be blank" if main_url.blank?
78
- result = call('SitesManager.updateSite', :idSite => id, :siteName => name, :urls => main_url)
79
- result['result'] == 'success' ? true : false
80
- end
81
-
82
- def reload
83
- #TODO
84
- end
85
-
86
- # Deletes the current site from Piwik.
87
- #
88
- # Equivalent Piwik API call: SitesManager.deleteSite (idSite)
89
- def destroy
90
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
91
- result = call('SitesManager.deleteSite', :idSite => id)
92
- #puts "\n destroy #{result} \n"
93
- freeze
94
- result['result'] == 'success' ? true : false
36
+ # Returns search engine information for site home
37
+ def seo_info
38
+ Piwik::SEO.getRank(:url => self.main_url)
95
39
  end
96
40
 
97
- # Gives read access (<tt>'view'</tt>) to the supplied user login for the current
98
- # site.
41
+ # Gives read access (<tt>'view'</tt>) to the supplied user login for the current site.
99
42
  def give_view_access_to(login)
100
43
  give_access_to(:view, login)
101
44
  end
102
45
 
103
- # Gives read and write access (<tt>'admin'</tt>) for the supplied user login for the
104
- # current site.
46
+ # Gives read and write access (<tt>'admin'</tt>) for the supplied user login for the current site.
105
47
  def give_admin_access_to(login)
106
48
  give_access_to(:admin, login)
107
49
  end
108
50
 
109
- # Removes all access (gives an <tt>'noaccess'</tt>) for the supplied user login for
110
- # the current site.
51
+ # Removes all access (gives a <tt>'noaccess'</tt>) for the supplied user login for the current site.
111
52
  def give_no_access_to(login)
112
53
  give_access_to(:noaccess, login)
113
54
  end
114
- alias_method :remove_access_from, :give_no_access_to
115
-
116
-
117
- # Returns a hash with a summary of access information for the current site
118
- # (visits, unique visitors, actions / pageviews, maximum actions per visit,
119
- # bounces and total time spent in all visits in seconds), filtered by the
120
- # supplied period and date.
121
- #
122
- # * <tt>period</tt> should be one of <tt>:day</tt>, <tt>:week</tt>, <tt>:month</tt> or <tt>:year</tt> (default: <tt>:day</tt>)
123
- # * <tt>date</tt> should be a <tt>Date</tt> object (default: <tt>Date.today</tt>)
124
- #
125
- # Equivalent Piwik API call: VisitsSummary.get (idSite, period, date)
126
- def summary(period=:day, date=Date.today)
127
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
128
- result = call('VisitsSummary.get', :idSite => id, :period => period, :date => date)
129
- {
130
- :visits => result['nb_visits'].to_i,
131
- :unique_visitors => result['nb_uniq_visitors'].to_i,
132
- :actions => result['nb_actions'].to_i,
133
- :max_actions_per_visit => result['max_actions'].to_i,
134
- :bounces => result['bounce_count'].to_i,
135
- :total_time_spent => result['sum_visit_length'].to_i, # in seconds
136
- }
137
- end
138
-
139
- # Returns the amount of visits for the current site, filtered by the
140
- # supplied period and date.
141
- #
142
- # * <tt>period</tt> should be one of <tt>:day</tt>, <tt>:week</tt>, <tt>:month</tt> or <tt>:year</tt> (default: <tt>:day</tt>)
143
- # * <tt>date</tt> should be a <tt>Date</tt> object (default: <tt>Date.today</tt>)
144
- #
145
- # Equivalent Piwik API call: VisitsSummary.getVisits (idSite, period, date)
146
- def visits(period=:day, date=Date.today)
147
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
148
- result = call('VisitsSummary.getVisits', :idSite => id, :period => period, :date => date)
149
- result['value']
150
- end
55
+ alias_method :remove_access_for, :give_no_access_to
151
56
 
152
- # Returns the amount of unique visitors for the current site, filtered by
153
- # the supplied period and date.
154
- #
155
- # * <tt>period</tt> should be one of <tt>:day</tt>, <tt>:week</tt>, <tt>:month</tt> or <tt>:year</tt> (default: <tt>:day</tt>)
156
- # * <tt>date</tt> should be a <tt>Date</tt> object (default: <tt>Date.today</tt>)
157
- #
158
- # Equivalent Piwik API call: VisitsSummary.getUniqueVisitors (idSite, period, date)
159
- def unique_visitors(period=:day, date=Date.today)
160
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
161
- result = call('VisitsSummary.getUniqueVisitors', :idSite => id, :period => period, :date => date)
162
- result['value']
57
+ class << self
58
+ def collection
59
+ Piwik::SitesManager
60
+ end
61
+
62
+ def id_attr
63
+ :idSite
64
+ end
163
65
  end
164
66
 
165
- # Returns the amount of actions (pageviews) for the current site, filtered
166
- # by the supplied period and date.
167
- #
168
- # * <tt>period</tt> should be one of <tt>:day</tt>, <tt>:week</tt>, <tt>:month</tt> or <tt>:year</tt> (default: <tt>:day</tt>)
169
- # * <tt>date</tt> should be a <tt>Date</tt> object (default: <tt>Date.today</tt>)
170
- #
171
- # Equivalent Piwik API call: VisitsSummary.getActions (idSite, period, date)
172
- def actions(period=:day, date=Date.today)
173
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
174
- result = call('VisitsSummary.getActions', :idSite => id, :period => period, :date => date)
175
- result['value']
176
- end
177
- alias_method :pageviews, :actions
178
-
179
- # Returns a string with the javascript tracking code for the current site.
180
- #
181
- # Equivalent Piwik API call: SitesManager.getJavascriptTag (idSite)
182
- def get_javascript_tag
183
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
184
- result = call('SitesManager.getJavascriptTag', :idSite => id)
185
- #puts "get_javascript_tag #{result.to_s}"
186
- result['value']
187
- end
188
-
189
- # Returns a big Array of Hashes with all page titles along with standard Actions metrics for each row, for the current site.
190
- #
191
- # Example result:
192
- # => [{"label"=>" Izdelava spletnih strani | Spletnik d.o.o.", "nb_visits"=>36, "nb_uniq_visitors"=>35, "nb_hits"=>41, "sum_time_spent"=>240, "entry_nb_uniq_visitors"=>"33", "entry_nb_visits"=>"36", "entry_nb_actions"=>"92", "entry_sum_visit_length"=>"3422", "entry_bounce_count"=>"20", "exit_nb_uniq_visitors"=>"19", "exit_nb_visits"=>"22", "avg_time_on_page"=>7, "bounce_rate"=>"56%", "exit_rate"=>"61%"}]
193
- #
194
- # Equivalent Piwik API call: Actions.getPageTitles (idSite, period, date, segment = '', expanded = '', idSubtable = '')
195
- def get_page_titles(params={})
196
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
197
- result = call('Actions.getPageTitles', {:idSite => id, :period => :day, :date => Date.today, :segment => '', :expanded => '', :idSubtable => ''}.update(params))
198
- #puts "get_page_titles: #{result}"
199
- result
200
- end
201
-
202
- # Returns a big Array of Hashes with all page urls along with standard Actions metrics for each row, for the current site.
203
- #
204
- # Example result:
205
- # => [{"label"=>"spletnik", "nb_visits"=>69, "nb_hits"=>87, "sum_time_spent"=>4762, "entry_nb_visits"=>40, "entry_nb_actions"=>101, "entry_sum_visit_length"=>6752, "entry_bounce_count"=>26, "exit_nb_visits"=>39, "avg_time_on_page"=>69, "bounce_rate"=>"65%", "exit_rate"=>"57%", "idsubdatatable"=>1}]
206
- #
207
- # Example call:
208
- #
209
- # Piwik::Site.load(203).get_page_urls(:expanded=>1)
210
- #
211
- # Equivalent Piwik API call: Actions.getPageUrls (idSite, period, date, segment = '', expanded = '', idSubtable = '')
212
- def get_page_urls(params={})
213
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
214
- result = call('Actions.getPageUrls', { :idSite => id, :period => :day, :date => Date.today, :segment => '', :expanded => '', :idSubtable => '' }.update(params))
215
- #puts "get_page_urls: #{result}"
216
- result
217
- end
218
-
219
- def bounce_count(period=:day, date=Date.today)
220
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
221
- result = call('VisitsSummary.getBounceCount', :idSite => id, :period => period, :date => date)
222
- result['value']
223
- end
224
-
225
- def sum_visits_length(period=:day, date=Date.today)
226
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
227
- result = call('VisitsSummary.getSumVisitsLength', :idSite => id, :period => period, :date => date)
228
- result['value']
229
- end
230
-
231
- def website_referrers(period=:day, date=Date.today)
232
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
233
- call('Referers.getWebsites', :idSite => id, :period => period, :date => date)
234
- end
235
-
236
67
  private
237
- # Loads the attributes in the instance variables.
238
- def load_attributes(attributes)
239
- @id = attributes[:id]
240
- @name = attributes[:name]
241
- @main_url = attributes[:main_url] ? attributes[:main_url].gsub(/\/$/, '') : nil
242
- @created_at = attributes[:created_at]
243
- end
244
-
245
68
  # Gives the supplied access for the supplied user, for the current site.
246
69
  #
247
70
  # * <tt>access</tt> can be one of <tt>:view</tt>, <tt>:admin</tt> or <tt>:noaccess</tt>
248
71
  # * <tt>login</tt> is the user login on Piwik
249
- #
250
- # Equivalent Piwik API call: UsersManager.setUserAccess (userLogin, access, idSites)
251
72
  def give_access_to(access, login)
252
- raise UnknownSite, "Site not existent in Piwik yet, call 'save' first" if new?
253
- result = call('UsersManager.setUserAccess', :idSites => id, :access => access.to_s, :userLogin => login.to_s)
254
- #result['success'] ? true : false
255
- result['result'] == 'success' ? true : false
256
- end
257
-
258
- # Returns a hash with the attributes of the supplied site, identified
259
- # by it's Id in <tt>site_id</tt>.
260
- #
261
- # Equivalent Piwik API call: SitesManager.getSiteFromId (idSite)
262
- def self.get_site_attributes_by_id(site_id, piwik_url, auth_token)
263
- result = call('SitesManager.getSiteFromId', {:idSite => site_id}, piwik_url, auth_token)
264
- #puts "get_site_attributes_by_id #{result.to_s}"
265
- raise UnknownSite, "Site not existent in Piwik" if result.kind_of?(Hash) && result['value'] == false
266
- attributes = {
267
- :id => result[0]['idsite'].to_i,
268
- :name => result[0]['name'],
269
- :main_url => result[0]['main_url'],
270
- :created_at => Time.parse(result[0]['ts_created'])
271
- }
272
- attributes
73
+ Piwik::UsersManager.setUserAccess(:idSites => id, :access => access.to_s, :userLogin => login.to_s).data
273
74
  end
274
-
275
75
  end
276
- end
76
+ end