semrush 3.0.23 → 3.0.25

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba1021c3162200e8f84abaf0a1e8f197714351110975d0165b1329e0741c297a
4
- data.tar.gz: ced8d6a56e0ad8ff0277fad603af85c4c5ac215d4bf6ba74d253873fa25a8f9c
3
+ metadata.gz: 10cb05ec42e77de2e49cc3c374e330478cf5f09666f62519c2ce8cb3045cfbf3
4
+ data.tar.gz: ffb593df0c6ff6c41a28958d1912ce0ffb4d90243c5cac50f54a5f0ba683c505
5
5
  SHA512:
6
- metadata.gz: c9a309ffbb1f25da7c72be4435639ae02f9dc15a563ba62d4931e179b3605d1ed9a6ed7f3e54fd169727d97b8d9d3b8fba0d5c22cccf0cc817a801cc562a25a9
7
- data.tar.gz: 53d8f38e2a48cd9ebc856d7dd6d28df1ae6c30a09bb8e5997ef254112dfd985736ea0633629f04f974070059c5e7991a7c1e261acceb751182ff052009683953
6
+ metadata.gz: fd0ea77440b7c8fac7eb81406847a1e09277f13e144527d56c79d9f4b3372f4cef504f5f6880178694e5300636467ef192bc3bfe00b088997f0023f8c46bccd3
7
+ data.tar.gz: af1fdf963f5ec2244462b9c5e12f0382adb275356604d87eec894c057fa7cea052c371b9d2f6a85faa799c0aaebd3beade463c27677675d554bb8c9ae6744533
data/README.rdoc CHANGED
@@ -4,7 +4,7 @@ Semrush is a ruby wrapper for the SEMRush API.
4
4
 
5
5
  == Requirements
6
6
 
7
- - Ruby 1.9 or 2.x
7
+ - Ruby 1.9, 2.x, 3.1<
8
8
  - ActiveSupport
9
9
 
10
10
  == Installation
@@ -70,6 +70,9 @@ or
70
70
  report = Semrush::Report.domain("seobook.com")
71
71
  data = report.basics(:db => 'us', :limit => 100)
72
72
 
73
+ or
74
+ analytics = Semrush::Analytics.backlinks_refdomains("seobook.com")
75
+
73
76
  You will find more information about these parameters at http://www.semrush.com/api.html
74
77
 
75
78
  == Reports
@@ -101,6 +104,10 @@ For more information about the report types, please read http://www.semrush.com/
101
104
 
102
105
  == ChangeLog
103
106
 
107
+ === 3.0.24, 2023-05-15
108
+
109
+ * Added Analytics class for the new Analytics API, not covered all the reports yet
110
+
104
111
  === 3.0.23, 2020-03-19
105
112
 
106
113
  * Add New Zealand 'nz' to allowed databases (countries)
@@ -0,0 +1,94 @@
1
+ module Semrush
2
+ # = Analytics Class
3
+ # Most of these methods take a hash parameter that may contain the following keys :
4
+ # There is no db filter for analytics api but you can use :display_filter to filter the results,
5
+ # example: :display_filter => "+|country||us" will only return results from the US.
6
+ # See https://developer.semrush.com/api/v3/analytics/basic-docs/
7
+ # * :api_key (ex: :api_key => 'gt97s6d4a6w')
8
+ # * :limit (ex: :limit => 2000)
9
+ # * :offset (ex: :offset => 5)
10
+ # * :export_columns (ex: :export_columns => "Dn,Rk")
11
+ class Analytics < Base
12
+ ANALYTIC_TYPES = [:backlinks_refdomains]
13
+ REQUEST_TYPES = [:root_domain, :domain, :url]
14
+
15
+ def initialize params = {}
16
+ @parameters = params
17
+ @target_types = REQUEST_TYPES
18
+ @api_report_url = API_ANALYTICS_URL
19
+ end
20
+
21
+ # Get lists domains pointing to the queried domain, root domain, or URL.
22
+ # * :api_key (ex: :api_key => 'gt97s6d4a6w')
23
+ # * :limit (ex: :limit => "")
24
+ # * :offset (ex: :offset => "")
25
+ # * :target_type (ex: :target_type => "") One of `REQUEST_TYPES`
26
+ # * :export_columns (ex: :export_columns => "")
27
+ # * :display_filter one or many of "zone, country, ip, newdomain, lostdomain, category"
28
+ # See: https://developer.semrush.com/api/v3/analytics/backlinks/#reffering_domains
29
+ def self.backlinks_refdomains(domain, params = {})
30
+ export_columns = params.delete(:export_columns).presence ||
31
+ "domain_ascore,domain,backlinks_num,ip,country,first_seen,last_seen"
32
+
33
+ self.new(params.merge(:report_type => :backlinks_refdomains, :target => domain,
34
+ :export_columns => export_columns))
35
+ .request
36
+ end
37
+
38
+ # Compare your and your competitors' backlink profiles and link-building progress.
39
+ # * :api_key (ex: :api_key => 'gt97s6d4a6w')
40
+ # * :targets (ex: :targets => ["domain1.com", "domain2.com"]) Array of domains to compare
41
+ # * :target_types (ex: :target_type => ["root_domain", "root_domain"]) Array to match with corresponding targets index
42
+ # * :export_columns (ex: :export_columns => ""), available columns: "target,target_type,ascore,backlinks_num,domains_num,ips_num,follows_num,nofollows_num,texts_num,images_num,forms_num,frames_num"
43
+ #
44
+ # * Return array of data
45
+ # @see https://developer.semrush.com/api/v3/analytics/backlinks/#batch_comparason
46
+ # @see https://www.semrush.com/batch/report/ for UI demo
47
+ def self.backlinks_comparison(targets, target_types, params = {})
48
+ target_types.each do |target_type|
49
+ raise Exception::BadArgument.new(self, "One of `target_types` is not valid: #{target_type}") unless REQUEST_TYPES.include?(target_type.to_sym)
50
+ end
51
+
52
+ raise Exception::BadArgument.new(self, "`targets` and `target_types` must be the same size") unless targets.size == target_types.size
53
+
54
+ export_columns = params.delete(:export_columns).presence ||
55
+ "target,target_type,ascore,backlinks_num,domains_num,ips_num,follows_num,nofollows_num,texts_num,images_num,forms_num,frames_num"
56
+ # Have to add target and target_type to params to cleaup API_ANALYTICS_URL (in #request v.blank? check)
57
+ self.new(params.merge(:report_type => :backlinks_comparison, :targets => targets, :target_types => target_types,
58
+ :export_columns => export_columns,
59
+ ))
60
+ .request
61
+ end
62
+
63
+ private
64
+
65
+ # All parameters:
66
+ # * report_type - type of the report
67
+ # * api_key - user identification key, you can find it in your profile on the Semrush site
68
+ # * target_type - type of the request.
69
+ # * target - your domain/url
70
+ # * limit - number of results returned
71
+ # * offset - says to skip that many results before beginning to return results to you
72
+ # * export_columns - list of column names, separated by coma. You may list just the column names you need in an order you need.
73
+ # * display_sort - a sorting as a String eg: 'am_asc' or 'am_desc'(read http://www.semrush.com/api)
74
+ # * display_filter - list of filters separated by "|" (maximum number - 25). A filter consists of <sign>|<field>|<operation>|<value> (read http://www.semrush.com/api)
75
+ #
76
+ # more details in http://www.semrush.com/api.html
77
+ def validate_parameters params = {}
78
+ params.symbolize_keys!
79
+ params.delete(:report_type) unless ANALYTIC_TYPES.include?(params[:report_type].try(:to_sym))
80
+ params.delete(:target_type) unless @target_types.include?(params[:target_type].try(:to_sym)) unless params[:targets]
81
+ @parameters = {:api_key => Semrush.api_key, :limit => "", :offset => "", :export_columns => "",
82
+ :target => "", :target_type => "", :targets => "", :target_types => "",
83
+ :display_sort => "", :display_filter => "", :display_date => ""}.merge(@parameters).merge(params)
84
+ # When(if) we will have another method that use `targets` as an Array(like backlinks_comparison) improve this
85
+ # and move validations from backlinks_comparison to here
86
+ unless @parameters[:targets]
87
+ raise Semrush::Exception::Nolimit.new(self, "The limit parameter is missing: a limit is required.") unless @parameters[:limit].present? && @parameters[:limit].to_i>0
88
+ raise Semrush::Exception::BadArgument.new(self, "Target parameter is missing: Domain name, URL.") unless @parameters[:target].present?
89
+ raise Semrush::Exception::BadArgument.new(self, "Bad report_type: #{@parameters[:report_type]}") unless ANALYTIC_TYPES.include?(@parameters[:report_type].try(:to_sym))
90
+ raise Semrush::Exception::BadArgument.new(self, "Bad target_type: #{@parameters[:target_type]}") unless @target_types.include?(@parameters[:target_type].try(:to_sym))
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,78 @@
1
+ module Semrush
2
+ # = Base Class for all Semrush API classes
3
+ class Base
4
+ def request params = {}
5
+ validate_parameters params
6
+ temp_url = "#{@api_report_url}" #do not copy the constant as is or else the constant would be modified !!
7
+ @parameters.each {|k, v|
8
+ if v.blank?
9
+ temp_url.gsub!(/&[^&=]+=%#{k.to_s}%/i, '')
10
+ elsif k.to_sym==:display_filter
11
+ temp_url.gsub!("%#{k.to_s.upcase}%", CGI.escape(v.to_s).gsub('&', '%26').gsub('+', '%2B'))
12
+ elsif v.is_a?(Array)
13
+ # remove placeholder with value into query string of array of values
14
+ temp_url.gsub!("#{k}=%#{k.to_s.upcase}%", v.to_query(k.to_s))
15
+ else
16
+ temp_url.gsub!("%#{k.to_s.upcase}%", CGI.escape(v.to_s).gsub('&', '%26'))
17
+ end
18
+ }
19
+ puts "[Semrush query] URL: #{temp_url}" if Semrush.debug
20
+ url = URI.parse(temp_url)
21
+ Semrush.before.call(@parameters.merge(:url => url))
22
+ response = Net::HTTP.start(url.host, url.port, :use_ssl => true) {|http|
23
+ http.get(url.path+"?"+url.query)
24
+ }.body rescue "ERROR :: RESPONSE ERROR (-1)" # Make this error up
25
+ response.force_encoding("utf-8")
26
+ output = response.starts_with?("ERROR") ? error(response) : parse(response)
27
+ Semrush.after.call(@parameters.merge(:url => url), output)
28
+ output
29
+ end
30
+
31
+ # Format and raise an error
32
+ def error(text = "")
33
+ e = /ERROR\s(\d+)\s::\s(.*)/.match(text) || {}
34
+ name = (e[2] || "UnknownError").titleize
35
+ code = e[1] || -1
36
+ error_class = name.gsub(/\s/, "")
37
+
38
+ if error_class == "NothingFound"
39
+ []
40
+ else
41
+ begin
42
+ raise Semrush::Exception.const_get(error_class).new(self, "#{name} (#{code})")
43
+ rescue
44
+ raise Semrush::Exception::Base.new(self, "#{name} (#{code}) *** error_class=#{error_class} not implemented ***")
45
+ end
46
+ end
47
+ end
48
+
49
+ def parse(text = "")
50
+ return [] if text.empty?
51
+ csv = CSV.parse(text.to_s, :col_sep => ";")
52
+ format_key = lambda do |k|
53
+ r = {
54
+ /\s/ => "_",
55
+ /[|\.|\)|\(]/ => "",
56
+ /%/ => "percent",
57
+ /\*/ => "times"
58
+ }
59
+ k = k.to_s.downcase
60
+ r.each_pair {|pattern, replace| k.gsub!(pattern, replace) }
61
+ k.to_sym
62
+ end
63
+
64
+ # (thanks http://snippets.dzone.com/posts/show/3899)
65
+ keys = csv.shift.map(&format_key)
66
+ string_data = csv.map {|row| row.map {|cell| cell.to_s } }
67
+ string_data.map {|row| Hash[*keys.zip(row).flatten] }
68
+ rescue CSV::MalformedCSVError => csvife
69
+ tries ||= 0
70
+ if (tries += 1) < 3
71
+ retry
72
+ else
73
+ raise CSV::MalformedCSVError.new("Bad format for CSV: #{text.inspect}").tap{|e|
74
+ e.set_backtrace(csvife.backtrace)}
75
+ end
76
+ end
77
+ end
78
+ end
@@ -6,14 +6,13 @@ module Semrush
6
6
  # * :limit (ex: :limit => 2000)
7
7
  # * :offset (ex: :offset => 5)
8
8
  # * :export_columns (ex: :export_columns => "Dn,Rk")
9
- class Report
9
+ class Report < Base
10
10
  DBS = [:us, :uk, :ca, :ru, :de, :fr, :es, :it, :br, :au, :ar, :be, :ch, :dk, :fi, :hk, :ie, :il, :mx, :nl, :no, :pl, :se, :sg, :tr, :in, :nz] #"us" - for Google.com, "uk" - for Google.co.uk, "ru" - for Google.ru, "de" for Google.de, "fr" for Google.fr, "es" for Google.es, "it" for Google.it Beta, "br" for Google.com.br Beta, "au" for Google.com.au Beta, etc
11
11
  REPORT_TYPES = [:domain_rank, :domain_organic, :domain_adwords, :domain_organic_organic, :domain_adwords_adwords, :domain_organic_adwords, :domain_adwords_organic, :domain_adwords_historical,
12
12
  :phrase_this, :phrase_organic, :phrase_related, :phrase_adwords_historical, :phrase_fullsearch, :phrase_kdi,
13
13
  :url_organic, :url_adwords]
14
14
  REQUEST_TYPES = [:domain, :phrase, :url]
15
15
 
16
-
17
16
  # Tries to make the api call for the report called as method (see samples on http://www.semrush.com/api.html).
18
17
  # Allows calls like:
19
18
  # * Semrush::Report.new.domain_rank(:request_type => :domain, :request => 'thedomain.com')
@@ -22,11 +21,14 @@ module Semrush
22
21
  # * Semrush::Report.new.phrase_fullsearch(:request_type => :phrase, :request => 'the+phrase')
23
22
  def method_missing(method, *args)
24
23
  return super unless REPORT_TYPES.include?(method) && args.first.is_a?(Hash)
24
+
25
25
  request args.first.merge(:report_type => method)
26
26
  end
27
27
 
28
28
  def initialize params = {}
29
29
  @parameters = params
30
+ @request_types = REQUEST_TYPES
31
+ @api_report_url = API_REPORT_URL
30
32
  end
31
33
 
32
34
  # Initializes a report for a specific domain.
@@ -39,6 +41,7 @@ module Semrush
39
41
  def self.domain domain, params = {}
40
42
  self.new(params.merge(:request_type => :domain, :request => domain))
41
43
  end
44
+
42
45
  # Initializes a report for a specific phrase (or keyword).
43
46
  # Takes a hash parameter that may contain the following keys :
44
47
  # * :db (ex: :db => "us")
@@ -49,6 +52,7 @@ module Semrush
49
52
  def self.phrase phrase, params = {}
50
53
  self.new(params.merge(:request_type => :phrase, :request => phrase))
51
54
  end
55
+
52
56
  # Initializes a report for a specific domain.
53
57
  # Takes a hash parameter that may contain the following keys :
54
58
  # * :db (ex: :db => "us")
@@ -71,7 +75,7 @@ module Semrush
71
75
  if v.blank?
72
76
  temp_url.gsub!(/&[^&=]+=%#{k.to_s}%/i, '')
73
77
  else
74
- temp_url.gsub!("%#{k.to_s.upcase}%", URI.escape(v.to_s).gsub('&', '%26'))
78
+ temp_url.gsub!("%#{k.to_s.upcase}%", CGI.escape(v.to_s).gsub('&', '%26'))
75
79
  end
76
80
  }
77
81
  temp_url
@@ -261,7 +265,7 @@ module Semrush
261
265
  def fullsearch params = {}
262
266
  request(params.merge(:report_type => :phrase_fullsearch))
263
267
  end
264
-
268
+
265
269
  # Keyword Difficulty report
266
270
  # Usage:
267
271
  # > report = Semrush::Report.phrase(phrases.join(';'), database: 'us', limit: 100).kdi
@@ -274,30 +278,6 @@ module Semrush
274
278
 
275
279
  private
276
280
 
277
- def request params = {}
278
- validate_parameters params
279
- temp_url = "#{API_REPORT_URL}" #do not copy the constant as is or else the constant would be modified !!
280
- @parameters.each {|k, v|
281
- if v.blank?
282
- temp_url.gsub!(/&[^&=]+=%#{k.to_s}%/i, '')
283
- elsif k.to_sym==:display_filter
284
- temp_url.gsub!("%#{k.to_s.upcase}%", URI.escape(v.to_s).gsub('&', '%26').gsub('+', '%2B'))
285
- else
286
- temp_url.gsub!("%#{k.to_s.upcase}%", URI.escape(v.to_s).gsub('&', '%26'))
287
- end
288
- }
289
- puts "[Semrush query] URL: #{temp_url}" if Semrush.debug
290
- url = URI.parse(temp_url)
291
- Semrush.before.call(@parameters.merge(:url => url))
292
- response = Net::HTTP.start(url.host, url.port, :use_ssl => true) {|http|
293
- http.get(url.path+"?"+url.query)
294
- }.body rescue "ERROR :: RESPONSE ERROR (-1)" # Make this error up
295
- response.force_encoding("utf-8")
296
- output = response.starts_with?("ERROR") ? error(response) : parse(response)
297
- Semrush.after.call(@parameters.merge(:url => url), output)
298
- output
299
- end
300
-
301
281
  # All parameters:
302
282
  # * db - requested database
303
283
  # * report_type - type of the report
@@ -324,64 +304,16 @@ module Semrush
324
304
  raise Semrush::Exception::BadArgument.new(self, "Bad request type: #{@parameters[:request_type]}") unless REQUEST_TYPES.include?(@parameters[:request_type].try(:to_sym))
325
305
  end
326
306
 
327
- # Format and raise an error
328
- def error(text = "")
329
- e = /ERROR\s(\d+)\s::\s(.*)/.match(text) || {}
330
- name = (e[2] || "UnknownError").titleize
331
- code = e[1] || -1
332
- error_class = name.gsub(/\s/, "")
333
-
334
- if error_class == "NothingFound"
335
- []
336
- else
337
- begin
338
- raise Semrush::Exception.const_get(error_class).new(self, "#{name} (#{code})")
339
- rescue
340
- raise Semrush::Exception::Base.new(self, "#{name} (#{code}) *** error_class=#{error_class} not implemented ***")
341
- end
342
- end
343
- end
344
-
345
- def parse(text = "")
346
- return [] if text.empty?
347
- csv = CSV.parse(text.to_s, :col_sep => ";")
348
- data = {}
349
- format_key = lambda do |k|
350
- r = {
351
- /\s/ => "_",
352
- /[|\.|\)|\(]/ => "",
353
- /%/ => "percent",
354
- /\*/ => "times"
355
- }
356
- k = k.to_s.downcase
357
- r.each_pair {|pattern, replace| k.gsub!(pattern, replace) }
358
- k.to_sym
359
- end
360
-
361
- # (thanks http://snippets.dzone.com/posts/show/3899)
362
- keys = csv.shift.map(&format_key)
363
- string_data = csv.map {|row| row.map {|cell| cell.to_s } }
364
- string_data.map {|row| Hash[*keys.zip(row).flatten] }
365
- rescue CSV::MalformedCSVError => csvife
366
- tries ||= 0
367
- if (tries += 1) < 3
368
- retry
369
- else
370
- raise CSV::MalformedCSVError.new("Bad format for CSV: #{text.inspect}").tap{|e|
371
- e.set_backtrace(csvife.backtrace)}
372
- end
373
- end
374
-
375
307
  def domain?
376
- @parameters[:request_type].present? && REQUEST_TYPES.include?(@parameters[:request_type].to_sym) && @parameters[:request_type].to_sym==:domain
308
+ @parameters[:request_type].present? && @request_types.include?(@parameters[:request_type].to_sym) && @parameters[:request_type].to_sym==:domain
377
309
  end
310
+
378
311
  def url?
379
- @parameters[:request_type].present? && REQUEST_TYPES.include?(@parameters[:request_type].to_sym) && @parameters[:request_type].to_sym==:url
312
+ @parameters[:request_type].present? && @request_types.include?(@parameters[:request_type].to_sym) && @parameters[:request_type].to_sym==:url
380
313
  end
314
+
381
315
  def phrase?
382
- @parameters[:request_type].present? && REQUEST_TYPES.include?(@parameters[:request_type].to_sym) && @parameters[:request_type].to_sym==:phrase
316
+ @parameters[:request_type].present? && @request_types.include?(@parameters[:request_type].to_sym) && @parameters[:request_type].to_sym==:phrase
383
317
  end
384
-
385
-
386
318
  end
387
319
  end
@@ -1,3 +1,3 @@
1
1
  module Semrush
2
- VERSION = "3.0.23" # we want to follow the API version: for API 3.0, the gem will be version 3.0.x
2
+ VERSION = "3.0.25" # we want to follow the API version: for API 3.0, the gem will be version 3.0.x
3
3
  end
data/lib/semrush.rb CHANGED
@@ -5,10 +5,14 @@ require 'csv'
5
5
  require 'rubygems'
6
6
  require 'active_support/all'
7
7
  require 'semrush/exception'
8
+ require 'semrush/base'
8
9
  require 'semrush/report'
10
+ require 'semrush/analytics'
9
11
 
10
12
  module Semrush
13
+ # See https://developer.semrush.com/api/v3/analytics/basic-docs/
11
14
  API_REPORT_URL = "https://api.semrush.com/?type=%REPORT_TYPE%&%REQUEST_TYPE%=%REQUEST%&key=%API_KEY%&display_limit=%LIMIT%&display_offset=%OFFSET%&export=api&database=%DB%&export_columns=%EXPORT_COLUMNS%&display_sort=%DISPLAY_SORT%&display_filter=%DISPLAY_FILTER%&display_date=%DISPLAY_DATE%"
15
+ API_ANALYTICS_URL = "https://api.semrush.com/analytics/v1?type=%REPORT_TYPE%&targets=%TARGETS%&target_types=%TARGET_TYPES%&target=%TARGET%&target_type=%TARGET_TYPE%&key=%API_KEY%&display_limit=%LIMIT%&display_offset=%OFFSET%&export_columns=%EXPORT_COLUMNS%&display_sort=%DISPLAY_SORT%&display_filter=%DISPLAY_FILTER%"
12
16
  API_UNITS_URL = "https://www.semrush.com/users/countapiunits.html?key=%API_KEY%"
13
17
  mattr_accessor :api_key
14
18
  @@api_key = ""
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semrush
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.23
4
+ version: 3.0.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - arambert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-19 00:00:00.000000000 Z
11
+ date: 2023-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.2.0
19
+ version: 6.1.5
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 3.2.0
26
+ version: 6.1.5
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 2.0.0
47
+ version: 3.11.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 2.0.0
54
+ version: 3.11.0
55
55
  description: This gem is a ruby client for the SemRush API.
56
56
  email:
57
57
  - adrien@rambert.me
@@ -63,6 +63,8 @@ files:
63
63
  - README.rdoc
64
64
  - Rakefile
65
65
  - lib/semrush.rb
66
+ - lib/semrush/analytics.rb
67
+ - lib/semrush/base.rb
66
68
  - lib/semrush/exception.rb
67
69
  - lib/semrush/exception/api_access_disabled.rb
68
70
  - lib/semrush/exception/api_report_type_disabled.rb
@@ -93,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
95
  - !ruby/object:Gem::Version
94
96
  version: '0'
95
97
  requirements: []
96
- rubygems_version: 3.0.2
98
+ rubygems_version: 3.1.4
97
99
  signing_key:
98
100
  specification_version: 4
99
101
  summary: This gem is a ruby client for the SemRush API.