nucleo-client 0.1.0

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 (108) hide show
  1. checksums.yaml +7 -0
  2. data/.env.sample +2 -0
  3. data/.gitignore +16 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +31 -0
  7. data/Rakefile +37 -0
  8. data/lib/nucleo/client.rb +172 -0
  9. data/lib/nucleo/client/version.rb +5 -0
  10. data/lib/nucleo/configuration.rb +83 -0
  11. data/lib/nucleo/configurations.rb +6 -0
  12. data/lib/nucleo/configurations/default.rb +100 -0
  13. data/lib/nucleo/connection.rb +44 -0
  14. data/lib/nucleo/errors.rb +7 -0
  15. data/lib/nucleo/errors/invalid_uri_error.rb +6 -0
  16. data/lib/nucleo/errors/record_not_found.rb +6 -0
  17. data/lib/nucleo/logger.rb +36 -0
  18. data/lib/nucleo/models.rb +50 -0
  19. data/lib/nucleo/models/change_types.rb +10 -0
  20. data/lib/nucleo/models/change_types/base.rb +81 -0
  21. data/lib/nucleo/models/change_types/seo.rb +13 -0
  22. data/lib/nucleo/models/change_types/seo/base.rb +50 -0
  23. data/lib/nucleo/models/change_types/seo/meta_description.rb +10 -0
  24. data/lib/nucleo/models/change_types/seo/page_title.rb +10 -0
  25. data/lib/nucleo/models/changes.rb +50 -0
  26. data/lib/nucleo/models/check_js.rb +41 -0
  27. data/lib/nucleo/models/check_types.rb +11 -0
  28. data/lib/nucleo/models/check_types/base.rb +25 -0
  29. data/lib/nucleo/models/check_types/count.rb +26 -0
  30. data/lib/nucleo/models/check_types/length.rb +26 -0
  31. data/lib/nucleo/models/check_types/not_exists.rb +8 -0
  32. data/lib/nucleo/models/checks.rb +56 -0
  33. data/lib/nucleo/models/concerns.rb +7 -0
  34. data/lib/nucleo/models/concerns/count.rb +57 -0
  35. data/lib/nucleo/models/concerns/length.rb +57 -0
  36. data/lib/nucleo/models/date_range.rb +66 -0
  37. data/lib/nucleo/models/element.rb +40 -0
  38. data/lib/nucleo/models/elements.rb +47 -0
  39. data/lib/nucleo/models/feed.rb +141 -0
  40. data/lib/nucleo/models/feed_types.rb +11 -0
  41. data/lib/nucleo/models/feed_types/analytics.rb +18 -0
  42. data/lib/nucleo/models/feed_types/analytics/base.rb +12 -0
  43. data/lib/nucleo/models/feed_types/analytics/page/channels.rb +61 -0
  44. data/lib/nucleo/models/feed_types/analytics/page/pages.rb +58 -0
  45. data/lib/nucleo/models/feed_types/analytics/page/referrers.rb +61 -0
  46. data/lib/nucleo/models/feed_types/analytics/page/social.rb +61 -0
  47. data/lib/nucleo/models/feed_types/analytics/site/channels.rb +61 -0
  48. data/lib/nucleo/models/feed_types/analytics/site/pages.rb +61 -0
  49. data/lib/nucleo/models/feed_types/analytics/site/referrers.rb +61 -0
  50. data/lib/nucleo/models/feed_types/analytics/site/social.rb +61 -0
  51. data/lib/nucleo/models/feed_types/base.rb +182 -0
  52. data/lib/nucleo/models/feed_types/seo.rb +22 -0
  53. data/lib/nucleo/models/feed_types/seo/page/base.rb +47 -0
  54. data/lib/nucleo/models/feed_types/seo/page/img_alt.rb +90 -0
  55. data/lib/nucleo/models/feed_types/seo/page/meta_description.rb +49 -0
  56. data/lib/nucleo/models/feed_types/seo/page/meta_robots.rb +48 -0
  57. data/lib/nucleo/models/feed_types/seo/page/page_title.rb +48 -0
  58. data/lib/nucleo/models/feed_types/seo/page/seo_summary.rb +53 -0
  59. data/lib/nucleo/models/feed_types/seo/page/summary.rb +52 -0
  60. data/lib/nucleo/models/feed_types/seo/site/base.rb +22 -0
  61. data/lib/nucleo/models/feed_types/seo/site/img_alt.rb +14 -0
  62. data/lib/nucleo/models/feed_types/seo/site/meta_description.rb +14 -0
  63. data/lib/nucleo/models/feed_types/seo/site/meta_robots.rb +14 -0
  64. data/lib/nucleo/models/feed_types/seo/site/page_title.rb +14 -0
  65. data/lib/nucleo/models/feeds.rb +126 -0
  66. data/lib/nucleo/models/metric.rb +54 -0
  67. data/lib/nucleo/models/metric_period.rb +97 -0
  68. data/lib/nucleo/models/metric_period_row.rb +125 -0
  69. data/lib/nucleo/models/metric_period_rows.rb +34 -0
  70. data/lib/nucleo/models/metric_period_totals.rb +121 -0
  71. data/lib/nucleo/models/metric_periods.rb +78 -0
  72. data/lib/nucleo/models/metric_periods_comparison.rb +80 -0
  73. data/lib/nucleo/models/metric_periods_comparisons.rb +73 -0
  74. data/lib/nucleo/models/metric_periods_totals.rb +58 -0
  75. data/lib/nucleo/models/page.rb +147 -0
  76. data/lib/nucleo/models/page_alerts.rb +27 -0
  77. data/lib/nucleo/models/page_metric.rb +58 -0
  78. data/lib/nucleo/models/page_rank.rb +28 -0
  79. data/lib/nucleo/models/pages.rb +40 -0
  80. data/lib/nucleo/models/seo_score.rb +28 -0
  81. data/lib/nucleo/models/site_feed.rb +82 -0
  82. data/lib/nucleo/models/tag.rb +48 -0
  83. data/lib/nucleo/models/tags.rb +35 -0
  84. data/lib/nucleo/requests.rb +14 -0
  85. data/lib/nucleo/requests/analyzer.rb +35 -0
  86. data/lib/nucleo/requests/check_js.rb +56 -0
  87. data/lib/nucleo/requests/feed.rb +58 -0
  88. data/lib/nucleo/requests/page.rb +113 -0
  89. data/lib/nucleo/requests/page_alerts.rb +36 -0
  90. data/lib/nucleo/requests/page_changes.rb +44 -0
  91. data/lib/nucleo/requests/site.rb +26 -0
  92. data/lib/nucleo/requests/site_changes.rb +56 -0
  93. data/lib/nucleo/requests/site_feed.rb +41 -0
  94. data/lib/nucleo/response.rb +52 -0
  95. data/lib/nucleo/utilities.rb +7 -0
  96. data/lib/nucleo/utilities/status_code_mapper.rb +53 -0
  97. data/lib/nucleo/webhook.rb +26 -0
  98. data/nucleo-client.gemspec +35 -0
  99. data/spec/data/models/feed_types/seo/heading_tag_length.json +55 -0
  100. data/spec/data/models/feed_types/seo/internal_link_count.json +149 -0
  101. data/spec/data/models/feed_types/seo/no_follow_link_count.json +142 -0
  102. data/spec/spec_helper.rb +15 -0
  103. data/spec/unit/nucleo/models/concerns/count_spec.rb +103 -0
  104. data/spec/unit/nucleo/models/concerns/length_spec.rb +79 -0
  105. data/spec/unit/nucleo/models/feed_types/analytics/site/pages_no_data_spec.rb +39 -0
  106. data/spec/unit/nucleo/models/metric_periods_comparison_spec.rb +50 -0
  107. data/spec/unit/nucleo/models/metric_periods_comparisons_spec.rb +58 -0
  108. metadata +341 -0
@@ -0,0 +1,97 @@
1
+ require File.expand_path('../metric_period_rows', __FILE__)
2
+
3
+ module Nucleo
4
+ module Models
5
+ class MetricPeriod
6
+ include Comparable
7
+
8
+ # Returns an instance of the Metric Period domain model
9
+ #
10
+ # @param attributes [Hash]
11
+ #
12
+ # @return [Nucleo::Models::MetricPeriod]
13
+ def initialize(attributes={})
14
+ @attributes = attributes
15
+ end
16
+
17
+ # Implement Comparable
18
+ def <=>(other)
19
+ if self.current?
20
+ 1
21
+ elsif self.prior?
22
+ 0
23
+ else
24
+ -1
25
+ end
26
+ end
27
+
28
+ # Returns the type of the metric
29
+ #
30
+ # @return [String]
31
+ def metric
32
+ @attributes['metric']
33
+ end
34
+
35
+ # Returns the dimension
36
+ #
37
+ # @return [String]
38
+ def dimension
39
+ @attributes['dimension']
40
+ end
41
+
42
+ # Returns the name of the period
43
+ #
44
+ # @return [String]
45
+ def period_name
46
+ @attributes['period_name']
47
+ end
48
+
49
+ # Returns true if this is current
50
+ #
51
+ # @return [Boolean]
52
+ def current?
53
+ 'current' == self.period_name
54
+ end
55
+
56
+ # Returns true if this is for the prior period
57
+ #
58
+ # @return [Boolean]
59
+ def prior?
60
+ 'prior' == self.period_name
61
+ end
62
+
63
+ # Returns the totals for this type of metric
64
+ #
65
+ # @return [Integer]
66
+ def totals
67
+ totals_hash.fetch(self.metric, 0).to_i
68
+ end
69
+
70
+ # Returns the instance of the DateRange domain model
71
+ #
72
+ # @return [Nucleo::Models::DateRange]
73
+ def date_range
74
+ Nucleo::Models::DateRange.new(@attributes.fetch('date_range', {}))
75
+ end
76
+
77
+ # Returns an instance of the MetricPeriodRows domain model
78
+ #
79
+ # @return [Nucleo::Models::MetricPeriodRows]
80
+ def rows
81
+ Nucleo::Models::MetricPeriodRows.new(self.metric, self.dimension, self.period_name, @attributes.fetch('rows', []))
82
+ end
83
+
84
+ # Returns true if there are any rows
85
+ #
86
+ # @return [Boolean]
87
+ def rows?
88
+ self.rows.any?
89
+ end
90
+
91
+ private
92
+ def totals_hash
93
+ @attributes.fetch('totals', {})
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,125 @@
1
+ module Nucleo
2
+ module Models
3
+ class MetricPeriodRow
4
+ # Returns an instance of the Metric Period Row domain model
5
+ #
6
+ # @param attributes [Hash]
7
+ #
8
+ # @return [Nucleo::Models::MetricPeriodRow]
9
+ def initialize(attributes={})
10
+ @attributes = attributes
11
+ end
12
+
13
+ # Returns the type of the row
14
+ #
15
+ # @return [String]
16
+ def metric
17
+ @attributes['metric']
18
+ end
19
+
20
+ # Returns the dimension
21
+ #
22
+ # @return [String]
23
+ def dimension
24
+ @attributes['dimension']
25
+ end
26
+
27
+ # Returns the dimension name
28
+ #
29
+ # @return [String]
30
+ def dimension_name
31
+ if self.page?
32
+ self.page.title
33
+ else
34
+ row.fetch(self.dimension, '')
35
+ end
36
+ end
37
+
38
+ # Returns the period name
39
+ #
40
+ # @return [String]
41
+ def period_name
42
+ @attributes['period_name']
43
+ end
44
+
45
+ # Returns true if this is the current period
46
+ #
47
+ # @return [Boolean]
48
+ def current?
49
+ 'current' == self.period_name
50
+ end
51
+
52
+ # Returns true if this is the prior period
53
+ #
54
+ # @return [Boolean]
55
+ def prior?
56
+ 'prior' == self.period_name
57
+ end
58
+
59
+ # Returns an instance of the Page domain model
60
+ #
61
+ # @return [Nucleo::Models::Page]
62
+ def page
63
+ val = row['page']
64
+
65
+ return nil if val.nil? || val.empty?
66
+
67
+ Nucleo::Models::Page.new(val)
68
+ end
69
+
70
+ # Returns true if there is a page
71
+ #
72
+ # @return [Boolean]
73
+ def page?
74
+ !self.page.nil?
75
+ end
76
+
77
+ # Return the value for this metric
78
+ #
79
+ # @return [Integer]
80
+ def value
81
+ row.fetch(self.metric, 0).to_i
82
+ end
83
+
84
+ # Returns the change
85
+ #
86
+ # @return [Float]
87
+ def change
88
+ row[translated_key_name(:change)].to_f
89
+ end
90
+
91
+ # Returns the percent total
92
+ #
93
+ # @return [Float]
94
+ def pct_total
95
+ row[translated_key_name(:pct_total)].to_f
96
+ end
97
+ alias :percent_total :pct_total
98
+
99
+ # Returns the rank change
100
+ #
101
+ # @return [Integer]
102
+ def rank_change
103
+ row[translated_key_name(:rank_change)].to_i
104
+ end
105
+
106
+ # Returns the rank
107
+ #
108
+ # @return [Integer]
109
+ def rank
110
+ row[translated_key_name(:rank)].to_i
111
+ end
112
+
113
+ private
114
+ def translated_key_name(key)
115
+ key = key.to_s
116
+
117
+ [self.metric, key].join('_')
118
+ end
119
+
120
+ def row
121
+ @attributes.fetch('row', {})
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,34 @@
1
+ require File.expand_path('../metric_period_row', __FILE__)
2
+
3
+ module Nucleo
4
+ module Models
5
+ class MetricPeriodRows
6
+ include Enumerable
7
+
8
+ def initialize(metric, dimension, period_name, collection)
9
+ @metric = metric
10
+ @dimension = dimension
11
+ @period_name = period_name
12
+ @collection = Array(collection)
13
+ end
14
+
15
+ def each(&block)
16
+ internal_collection.each(&block)
17
+ end
18
+
19
+ private
20
+ def internal_collection
21
+ @collection.map do |r|
22
+ params = {
23
+ 'metric' => @metric,
24
+ 'dimension' => @dimension,
25
+ 'period_name' => @period_name,
26
+ 'row' => r
27
+ }
28
+
29
+ Nucleo::Models::MetricPeriodRow.new(params)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,121 @@
1
+ module Nucleo
2
+ module Models
3
+ class MetricPeriodTotals
4
+ # Returns an instance of the Metric Period Totals
5
+ #
6
+ # This is specific to the period being returned.
7
+ #
8
+ # @param attributes [Hash]
9
+ #
10
+ # @return [Nucleo::Models::MetricPeriodTotals]
11
+ def initialize(attributes={})
12
+ @attributes = attributes
13
+ end
14
+
15
+ # Returns the type of metric
16
+ #
17
+ # @return [String]
18
+ def metric
19
+ @attributes['metric']
20
+ end
21
+
22
+ # Returns the dimension
23
+ #
24
+ # @return [String]
25
+ def dimension
26
+ @attributes['dimension']
27
+ end
28
+
29
+ # Returns the period for the totals
30
+ #
31
+ # @return [Hash]
32
+ def period
33
+ @attributes.fetch('period', {})
34
+ end
35
+
36
+ # Returns the site change totals
37
+ #
38
+ # @return [Float]
39
+ def site_change
40
+ self.period[translated_key_name(:site_change)].to_f
41
+ end
42
+
43
+ # Returns true if there is a site change
44
+ #
45
+ # @return [Boolean]
46
+ def site_change?
47
+ self.site_change > 0
48
+ end
49
+
50
+ # Returns the site change percentage
51
+ #
52
+ # @return [Float]
53
+ def site_change_percent
54
+ if self.site_change?
55
+ self.site_change
56
+ else
57
+ (self.site_change * -1)
58
+ end
59
+ end
60
+
61
+ # Returns the dimension change
62
+ #
63
+ # @return [Float]
64
+ def dimension_change
65
+ self.period[translated_key_name(:dimension_change)].to_f
66
+ end
67
+
68
+ # Returns the site total
69
+ #
70
+ # @return [Float]
71
+ def site
72
+ self.period[translated_key_name(:site)].to_f
73
+ end
74
+
75
+ # Returns the dimension percentage of site change
76
+ #
77
+ # @return [Float]
78
+ def dimension_pct_of_site_change
79
+ self.period[translated_key_name(:dimension_pct_of_site_change)].to_f
80
+ end
81
+ alias :dimension_percent_of_site_change :dimension_pct_of_site_change
82
+
83
+ # Returns true if there is a dimension percent of site change
84
+ #
85
+ # @return [Boolean]
86
+ def dimension_percent_of_site_change?
87
+ self.dimension_percent_of_site_change > 0
88
+ end
89
+
90
+ def dimension_percent_of_site_change_percent
91
+ if self.dimension_percent_of_site_change?
92
+ self.dimension_percent_of_site_change
93
+ else
94
+ (self.dimension_percent_of_site * -1)
95
+ end
96
+ end
97
+
98
+ # Returns the dimension percentage of site
99
+ #
100
+ # @return [Float]
101
+ def dimension_pct_of_site
102
+ self.period[translated_key_name(:dimension_pct_of_site)].to_f
103
+ end
104
+ alias :dimension_percent_of_site :dimension_pct_of_site
105
+
106
+ # Returns the dimension total
107
+ #
108
+ # @return [Float]
109
+ def dimension
110
+ self.period[translated_key_name(:dimension)].to_f
111
+ end
112
+
113
+ private
114
+ def translated_key_name(key)
115
+ key = key.to_s
116
+
117
+ [self.metric, key].join('_')
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,78 @@
1
+ require File.expand_path('../metric_period', __FILE__)
2
+ require File.expand_path('../metric_periods_totals', __FILE__)
3
+
4
+ module Nucleo
5
+ module Models
6
+ class MetricPeriods
7
+ # Returns an instance of the Metric Periods domain models
8
+ #
9
+ # This takes in the `totals`, `current_period`, and `prior_period`
10
+ # and wraps their response bodies in specific objects for comparisons.
11
+ #
12
+ # @param attributes [Hash]
13
+ #
14
+ # @return [Nucleo::Models::MetricPeriods]
15
+ def initialize(attributes={})
16
+ @attributes = attributes
17
+ end
18
+
19
+ # Returns the type of metric for period
20
+ #
21
+ # @return [String]
22
+ def type
23
+ @attributes['type']
24
+ end
25
+
26
+ # Returns the type of the metric
27
+ #
28
+ # @return [String]
29
+ def metric
30
+ @attributes['metric']
31
+ end
32
+
33
+ # Returns the dimension
34
+ #
35
+ # @return [String]
36
+ def dimension
37
+ @attributes['dimension']
38
+ end
39
+
40
+ # Returns the metric period totals
41
+ #
42
+ # @return [Nucleo::Models::MetricPeriodTotals]
43
+ def totals
44
+ params = {
45
+ 'metric' => self.metric,
46
+ 'dimension' => self.dimension,
47
+ 'totals' => @attributes['totals']
48
+ }
49
+
50
+ Nucleo::Models::MetricPeriodsTotals.new(params)
51
+ end
52
+
53
+ # Returns the metric period
54
+ #
55
+ # @return [Nucleo::Models::MetricPeriod]
56
+ def current_period
57
+ params = @attributes.fetch('current_period', {}).merge!('metric' => self.metric, 'dimension' => self.dimension, 'period_name' => 'current')
58
+ Nucleo::Models::MetricPeriod.new(params)
59
+ end
60
+
61
+ # Returns the prior metric period
62
+ #
63
+ # @return [Nucleo::Models::MetricPeriod]
64
+ def prior_period
65
+ params = @attributes.fetch('prior_period', {}).merge!('metric' => self.metric, 'dimension' => self.dimension, 'period_name' => 'prior')
66
+ Nucleo::Models::MetricPeriod.new(params)
67
+ end
68
+ alias :previous_period :prior_period
69
+
70
+ # Returns a metric periods comparisons collection domain model
71
+ #
72
+ # @return [Array]
73
+ def periods_comparisons
74
+ Nucleo::Models::MetricPeriodsComparisons.new(self.current_period, self.prior_period)
75
+ end
76
+ end
77
+ end
78
+ end