majestic_seo_api 0.9.3

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.
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'nokogiri'
4
+ gem "faraday", "~> 0.7.6"
5
+ gem "agiley-faraday_middleware", "~> 0.8.3"
6
+ gem 'jruby-openssl', '~> 0.7', :platforms => :jruby
7
+
8
+ group :development, :test do
9
+ gem 'bundler'
10
+ gem 'jeweler'
11
+ gem 'rspec'
12
+ gem "mocha"
13
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,50 @@
1
+
2
+ Version 0.9.3
3
+
4
+ Copyright (c) 2011, Majestic-12 Ltd
5
+
6
+ All rights reserved.
7
+
8
+
9
+
10
+ Redistribution and use in source and binary forms, with or without
11
+
12
+ modification, are permitted provided that the following conditions are met:
13
+
14
+ * Redistributions of source code must retain the above copyright
15
+
16
+ notice, this list of conditions and the following disclaimer.
17
+
18
+ * Redistributions in binary form must reproduce the above copyright
19
+
20
+ notice, this list of conditions and the following disclaimer in the
21
+
22
+ documentation and/or other materials provided with the distribution.
23
+
24
+ * Neither the name of the Majestic-12 Ltd nor the
25
+
26
+ names of its contributors may be used to endorse or promote products
27
+
28
+ derived from this software without specific prior written permission.
29
+
30
+
31
+
32
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
33
+
34
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
35
+
36
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
37
+
38
+ DISCLAIMED. IN NO EVENT SHALL Majestic-12 Ltd BE LIABLE FOR ANY
39
+
40
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
41
+
42
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43
+
44
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45
+
46
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
47
+
48
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
49
+
50
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.markdown ADDED
@@ -0,0 +1,69 @@
1
+ # Majestic SEO Ruby API Client #
2
+
3
+ **This is currently under heavy development (first released 2012-01-27). Get back to me if you run into any bugs.**
4
+
5
+ This is a Ruby Api client/wrapper/connector intended to be used with [Majestic SEO's awesome API](http://developer-support.majesticseo.com/).
6
+
7
+ Majestic SEO currently offers a client/connector over at [Connector Downloads](http://developer-support.majesticseo.com/connectors/downloads/) but this connector wasn't suitable for me because:
8
+
9
+ * It wasn't gemified (thus requiring a bunch of hacking to incorporate it into every respective Rails-app)
10
+ * Didn't have a config file with environment specific client settings (api key, api environment). I need to be able to use different api environments depending on the app environment
11
+ * **Didn't work with JRuby** - this gem does (or well - on 1.6.6-head and 1.7-head).
12
+ * Lacked test/spec coverage. The current test coverage isn't the best, but it's still better than nothing.
13
+
14
+ It is based on the Majestic SEO connector but has pretty much been rewritten from scratch.
15
+
16
+ The original script/test-files included now reside in script/. All of them haven't been completely upgraded yet, but they will.
17
+
18
+ ## Installation ##
19
+ Add to your Gemfile:
20
+ ```
21
+ gem 'majestic_seo_api', :git => 'git://github.com/Agiley/Majestic-SEO-Api.git'
22
+ ```
23
+
24
+ Generate config file:
25
+ ```
26
+ rails generate majestic_seo
27
+ ```
28
+
29
+ ## Tested on ##
30
+ The specs pass on:
31
+
32
+ * Ruby 1.9.2
33
+ * Ruby 1.9.3
34
+ * JRuby 1.6.6-head
35
+ * JRuby 1.7-head
36
+
37
+ *JRuby 1.6.5/1.6.5.1 does not work :(*
38
+
39
+ ## License ##
40
+ Original Majestic SEO License:
41
+
42
+ ---------
43
+
44
+ Version 0.9.3
45
+
46
+ Copyright (c) 2011, Majestic-12 Ltd
47
+
48
+ All rights reserved.
49
+
50
+ Redistribution and use in source and binary forms, with or without
51
+ modification, are permitted provided that the following conditions are met:
52
+
53
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
54
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
55
+ * Neither the name of the Majestic-12 Ltd nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
56
+
57
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
58
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
59
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
60
+ DISCLAIMED. IN NO EVENT SHALL Majestic-12 Ltd BE LIABLE FOR ANY
61
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
62
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
63
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
64
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
65
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
66
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
67
+
68
+ ---------
69
+
data/Rakefile ADDED
@@ -0,0 +1,44 @@
1
+ begin
2
+ require 'bundler'
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ rescue LoadError
6
+ puts "Bundler not available. Install it with: gem install bundler"
7
+ end
8
+
9
+ begin
10
+ # Rspec 2.0
11
+ require 'rspec/core/rake_task'
12
+
13
+ desc 'Default: run specs'
14
+ task :default => :spec
15
+ RSpec::Core::RakeTask.new do |t|
16
+ t.pattern = "spec/**/*_spec.rb"
17
+ end
18
+
19
+ RSpec::Core::RakeTask.new('rcov') do |t|
20
+ t.pattern = "spec/**/*_spec.rb"
21
+ t.rcov = true
22
+ t.rcov_opts = ['--exclude', 'spec']
23
+ end
24
+
25
+ rescue LoadError
26
+ puts "Rspec not available. Install it with: gem install rspec"
27
+ end
28
+
29
+ begin
30
+ require 'jeweler'
31
+
32
+ Jeweler::Tasks.new do |gemspec|
33
+ gemspec.name = "majestic_seo_api"
34
+ gemspec.summary = "Interface for communicating with Majestic SEO's API"
35
+ gemspec.description = "Interface for communicating with Majestic SEO's API"
36
+ gemspec.email = "sebastian@agiley.se"
37
+ gemspec.homepage = "http://developer-support.majesticseo.com/connectors/"
38
+ gemspec.authors = ["Majestic-12 Ltd", "Sebastian Johnsson"]
39
+ end
40
+
41
+ Jeweler::GemcutterTasks.new
42
+ rescue LoadError
43
+ puts "Jeweler not available. Install it with: gem install jeweler"
44
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.9.3
@@ -0,0 +1,18 @@
1
+ require 'generators/helpers/file_helper'
2
+
3
+ module MajesticSeo
4
+ module Generators
5
+ class MajesticSeoGenerator < Rails::Generators::Base
6
+ namespace "majestic_seo"
7
+ source_root File.expand_path("../../templates", __FILE__)
8
+
9
+ desc "Copies majestic_seo.yml to the Rails app's config directory."
10
+
11
+ def copy_config
12
+ template "majestic_seo.template.yml", "config/majestic_seo.yml"
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,13 @@
1
+ ---
2
+ development:
3
+ environment: sandbox
4
+ api_key: "api_key"
5
+
6
+ test:
7
+ environment: sandbox
8
+ api_key: "api_key"
9
+
10
+ production:
11
+ environment: sandbox
12
+ api_key: "api_key"
13
+
@@ -0,0 +1,151 @@
1
+
2
+ =begin
3
+
4
+ Version 0.9.3
5
+
6
+ Copyright (c) 2011, Majestic-12 Ltd
7
+ All rights reserved.
8
+
9
+ Redistribution and use in source and binary forms, with or without
10
+ modification, are permitted provided that the following conditions are met:
11
+ 1. Redistributions of source code must retain the above copyright
12
+ notice, this list of conditions and the following disclaimer.
13
+ 2. Redistributions in binary form must reproduce the above copyright
14
+ notice, this list of conditions and the following disclaimer in the
15
+ documentation and/or other materials provided with the distribution.
16
+ 3. Neither the name of the Majestic-12 Ltd nor the
17
+ names of its contributors may be used to endorse or promote products
18
+ derived from this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL Majestic-12 Ltd BE LIABLE FOR ANY
24
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ =end
32
+
33
+ require 'uri'
34
+ require 'cgi'
35
+ require 'rubygems'
36
+ require 'faraday_middleware'
37
+
38
+ module MajesticSeo
39
+ module Api
40
+
41
+ class Client
42
+ attr_accessor :connection, :api_url, :config, :api_key, :environment
43
+ include MajesticSeo::Api::Logger
44
+
45
+ def initialize(api_key = nil, environment = nil)
46
+ set_config
47
+
48
+ @api_key = api_key || self.config.fetch("api_key", nil)
49
+ @environment = environment || self.config.fetch("environment", :sandbox)
50
+ @environment = @environment.to_sym
51
+
52
+ set_api_url
53
+ set_connection
54
+ end
55
+
56
+ def set_config
57
+ rails_env = defined?(Rails) ? Rails.env : "development"
58
+ self.config = YAML.load_file(File.join(Rails.root, "config/majestic_seo.yml"))[rails_env] rescue nil
59
+ self.config ||= YAML.load_file(File.join(File.dirname(__FILE__), "../../generators/templates/majestic_seo.yml"))[rails_env] rescue nil
60
+ self.config ||= YAML.load_file(File.join(File.dirname(__FILE__), "../../generators/templates/majestic_seo.template.yml"))[rails_env] rescue nil
61
+ self.config ||= {}
62
+ end
63
+
64
+ def set_api_url
65
+ @api_url = case @environment.to_sym
66
+ when :sandbox then "http://developer.majesticseo.com/api_command"
67
+ when :production then "http://enterprise.majesticseo.com/api_command"
68
+ else
69
+ "http://developer.majesticseo.com/api_command"
70
+ end
71
+ end
72
+
73
+ def set_connection
74
+ @connection = Faraday.new(:url => @api_url) do |builder|
75
+ builder.request :url_encoded
76
+ #builder.response :logger
77
+ builder.use FaradayMiddleware::ParseNokogiriXml
78
+ builder.adapter :net_http
79
+ end
80
+ end
81
+
82
+ def get_index_item_info(urls, parameters = {})
83
+ request_parameters = {}
84
+ request_parameters['datasource'] = parameters.fetch(:data_source, "historic")
85
+ request_parameters["items"] = urls.size
86
+
87
+ urls.each_with_index do |url, index|
88
+ request_parameters["item#{index}"] = url
89
+ end
90
+
91
+ timeout = parameters.fetch(:timeout, 5)
92
+ response = self.execute_command("GetIndexItemInfo", request_parameters, timeout)
93
+ response = MajesticSeo::Api::ItemInfoResponse.new(response)
94
+
95
+ return response
96
+ end
97
+
98
+ def get_top_back_links(url, parameters = {})
99
+ request_parameters = {}
100
+ request_parameters['datasource'] = parameters.fetch(:data_source, "historic")
101
+ request_parameters['URL'] = url
102
+ request_parameters["MaxSourceURLs"] = parameters.fetch(:max_source_urls, 100)
103
+ request_parameters["ShowDomainInfo"] = parameters.fetch(:show_domain_info, 0)
104
+ request_parameters["GetUrlData"] = parameters.fetch(:get_url_data, 1)
105
+ request_parameters["GetSubDomainData"] = parameters.fetch(:get_sub_domain_data, 0)
106
+ request_parameters["GetRootDomainData"] = parameters.fetch(:get_root_domain_data, 0)
107
+ request_parameters["MaxSourceURLsPerRefDomain"] = parameters.fetch(:max_source_urls_per_ref_domain, -1)
108
+ request_parameters["DebugForceQueue"] = parameters.fetch(:debug_force_queue, 0)
109
+
110
+ timeout = parameters.fetch(:timeout, 5)
111
+ response = self.execute_command("GetTopBackLinks", request_parameters, timeout)
112
+ response = MajesticSeo::Api::TopBackLinksResponse.new(response)
113
+
114
+ return response
115
+ end
116
+
117
+ # This method will execute the specified command as an api request.
118
+ # 'name' is the name of the command you wish to execute, e.g. GetIndexItemInfo
119
+ # 'parameters' a hash containing the command parameters.
120
+ # 'timeout' specifies the amount of time to wait before aborting the transaction. This defaults to 5 seconds.
121
+ def execute_command(name, parameters, timeout = 5)
122
+ query_parameters = parameters.merge({"app_api_key" => @api_key, "cmd" => name})
123
+ self.execute_request(query_parameters, timeout)
124
+ end
125
+
126
+ # This will execute the specified command as an OpenApp request.
127
+ # 'command_name' is the name of the command you wish to execute, e.g. GetIndexItemInfo
128
+ # 'parameters' a hash containing the command parameters.
129
+ # 'access_token' the token provided by the user to access their resources.
130
+ # 'timeout' specifies the amount of time to wait before aborting the transaction. This defaults to 5 seconds.
131
+ def execute_open_app_request(command_name, parameters, access_token, timeout = 5)
132
+ query_parameters = parameters.merge({"accesstoken" => access_token, "cmd" => command_name, "privatekey" => @api_key})
133
+ self.execute_request(query_parameters, timeout)
134
+ end
135
+
136
+ # 'parameters' a hash containing the command parameters.
137
+ # 'timeout' specifies the amount of time to wait before aborting the transaction. This defaults to 5 seconds.
138
+ def execute_request(parameters, timeout = 5)
139
+ response = @connection.get do |request|
140
+ request.params = parameters
141
+ request.options = {:timeout => timeout}
142
+ end
143
+
144
+ return response
145
+ end
146
+
147
+ end
148
+
149
+ end
150
+ end
151
+
@@ -0,0 +1,90 @@
1
+
2
+ =begin
3
+
4
+ Version 0.9.3
5
+
6
+ Copyright (c) 2011, Majestic-12 Ltd
7
+ All rights reserved.
8
+
9
+ Redistribution and use in source and binary forms, with or without
10
+ modification, are permitted provided that the following conditions are met:
11
+ 1. Redistributions of source code must retain the above copyright
12
+ notice, this list of conditions and the following disclaimer.
13
+ 2. Redistributions in binary form must reproduce the above copyright
14
+ notice, this list of conditions and the following disclaimer in the
15
+ documentation and/or other materials provided with the distribution.
16
+ 3. Neither the name of the Majestic-12 Ltd nor the
17
+ names of its contributors may be used to endorse or promote products
18
+ derived from this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL Majestic-12 Ltd BE LIABLE FOR ANY
24
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ =end
32
+
33
+ module MajesticSeo
34
+ module Api
35
+ class DataTable
36
+ attr_accessor :node, :name, :row_count, :headers, :rows
37
+
38
+ def initialize(node)
39
+ @node = node
40
+
41
+ if (@node)
42
+ @name = @node["Name"] || nil
43
+ @row_count = @node["RowsCount"] || 0
44
+ @headers = @node["Headers"] || []
45
+
46
+ @rows = []
47
+ parse
48
+ end
49
+ end
50
+
51
+ def parse
52
+ rows = @node.xpath("Row")
53
+
54
+ if (@headers && rows && rows.any?)
55
+ @headers = split(@headers)
56
+
57
+ rows.each do |row|
58
+ parse_row(row)
59
+ end
60
+ end
61
+ end
62
+
63
+ def parse_row(row)
64
+ if (row && row.content)
65
+ row = row.content
66
+ row_hash = {}
67
+ splitted_row = split(row)
68
+
69
+ @headers.each_with_index do |header, index|
70
+ value = splitted_row[index].strip
71
+ value = (value && value != "") ? value : nil
72
+ row_hash[header] = value
73
+ end
74
+
75
+ @rows << row_hash if (row_hash && !row_hash.empty?)
76
+ end
77
+ end
78
+
79
+ def split(text)
80
+ splitted = text.split(/\|(?!\|)/)
81
+ end
82
+
83
+ def row_count
84
+ @rows.length
85
+ end
86
+
87
+ end
88
+ end
89
+ end
90
+
@@ -0,0 +1,126 @@
1
+
2
+ =begin
3
+
4
+ Version 0.9.3
5
+
6
+ Copyright (c) 2011, Majestic-12 Ltd
7
+ All rights reserved.
8
+
9
+ Redistribution and use in source and binary forms, with or without
10
+ modification, are permitted provided that the following conditions are met:
11
+ 1. Redistributions of source code must retain the above copyright
12
+ notice, this list of conditions and the following disclaimer.
13
+ 2. Redistributions in binary form must reproduce the above copyright
14
+ notice, this list of conditions and the following disclaimer in the
15
+ documentation and/or other materials provided with the distribution.
16
+ 3. Neither the name of the Majestic-12 Ltd nor the
17
+ names of its contributors may be used to endorse or promote products
18
+ derived from this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL Majestic-12 Ltd BE LIABLE FOR ANY
24
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ =end
32
+
33
+ module MajesticSeo
34
+ module Api
35
+ class ItemInfo
36
+ attr_accessor :response, :mappings
37
+ attr_accessor :index, :type, :url, :result_code, :success, :error_message, :status
38
+ attr_accessor :external_backlinks, :referring_domains, :indexed_urls, :analysis_results_unit_cost, :ac_rank
39
+ attr_accessor :get_top_backlinks_analysis_results_unit_cost, :referring_ip_addresses, :referring_subnets
40
+ attr_accessor :referring_edu_domains, :external_edu_backlinks, :referring_gov_domains, :external_gov_backlinks
41
+ attr_accessor :exact_referring_edu_domains, :exact_external_edu_backlinks, :exact_referring_gov_domains, :exact_external_gov_backlinks
42
+ attr_accessor :crawled, :last_crawl_data, :last_crawl_result, :redirecting, :final_redirect_result
43
+ attr_accessor :outbound_domain_links, :outbound_external_backliks, :outbound_internal_backlinks
44
+ attr_accessor :title, :redirecting_to
45
+
46
+ # This method returns a new instance of the Response class.
47
+ # If one of the parameters are not provided, it will default to nil.
48
+ def initialize(response = nil)
49
+ self.response = response
50
+
51
+ self.mappings = {
52
+ "ItemNum" => {:index => :integer},
53
+ "ItemType" => {:type => :integer},
54
+ "Item" => {:url => :string},
55
+ "ResultCode" => {:result_code => :string},
56
+ "Status" => {:status => :string},
57
+ "ExtBackLinks" => {:external_backlinks => :integer},
58
+ "RefDomains" => {:referring_domains => :integer},
59
+ "IndexedURLs" => {:indexed_urls => :integer},
60
+ "AnalysisResUnitsCost" => {:analysis_results_unit_cost => :integer},
61
+ "ACRank" => {:ac_rank => :integer},
62
+ "GetTopBackLinksAnalysisResUnitsCost" => {:get_top_backlinks_analysis_results_unit_cost => :integer},
63
+ "RefIPs" => {:referring_ip_addresses => :integer},
64
+ "RefSubNets" => {:referring_subnets => :integer},
65
+ "RefDomainsEDU" => {:referring_edu_domains => :integer},
66
+ "ExtBackLinksEDU" => {:external_edu_backlinks => :integer},
67
+ "RefDomainsGOV" => {:referring_gov_domains => :integer},
68
+ "ExtBackLinksGOV" => {:external_gov_backlinks => :integer},
69
+ "RefDomainsEDU_Exact" => {:exact_referring_edu_domains => :integer},
70
+ "ExtBackLinksEDU_Exact" => {:exact_external_edu_backlinks => :integer},
71
+ "RefDomainsGOV_Exact" => {:exact_referring_gov_domains => :integer},
72
+ "ExtBackLinksGOV_Exact" => {:exact_external_gov_backlinks => :integer},
73
+ "CrawledFlag" => {:crawled => :boolean},
74
+ "LastCrawlDate" => {:last_crawl_date => :date},
75
+ "LastCrawlResult" => {:last_crawl_result => :string},
76
+ "RedirectFlag" => {:redirecting => :boolean},
77
+ "FinalRedirectResult" => {:final_redirect_result => :string},
78
+ "OutDomainsExternal" => {:outbound_domain_links => :integer},
79
+ "OutLinksExternal" => {:outbound_external_backliks => :integer},
80
+ "OutLinksInternal" => {:outbound_internal_backlinks => :integer},
81
+ "Title" => {:title => :string},
82
+ "RedirectTo" => {:redirecting_to => :string},
83
+ }
84
+
85
+ parse_item_info
86
+ end
87
+
88
+ def parse_item_info
89
+ self.response.each do |api_column, api_value|
90
+ mapping = self.mappings[api_column]
91
+ value = (!api_value.nil? && !api_value.to_s.eql?("")) ? api_value.to_s : nil
92
+
93
+ mapping.each do |column, data_type|
94
+ converted_value = case data_type
95
+ when :string then value
96
+ when :integer then value.to_i
97
+ when :date then value #Return it as a string for now - need to be able to retrieve a result with a date set to determine date parsing format
98
+ when :boolean then (value.downcase.eql?("true"))
99
+ end
100
+
101
+ self.send("#{column}=", converted_value)
102
+ end if (value)
103
+ end
104
+
105
+ set_result_status
106
+ set_item_type
107
+ end
108
+
109
+ def set_result_status
110
+ self.success = (self.result_code && self.result_code.downcase.eql?("ok"))
111
+ self.error_message = (self.success) ? "" : self.result_code
112
+ end
113
+
114
+ def set_item_type
115
+ self.type = case self.type
116
+ when 1 then :root_domain
117
+ when 2 then :sub_domain
118
+ when 3 then :url
119
+ end
120
+ end
121
+
122
+ end
123
+
124
+ end
125
+ end
126
+
@@ -0,0 +1,58 @@
1
+
2
+ =begin
3
+
4
+ Version 0.9.3
5
+
6
+ Copyright (c) 2011, Majestic-12 Ltd
7
+ All rights reserved.
8
+
9
+ Redistribution and use in source and binary forms, with or without
10
+ modification, are permitted provided that the following conditions are met:
11
+ 1. Redistributions of source code must retain the above copyright
12
+ notice, this list of conditions and the following disclaimer.
13
+ 2. Redistributions in binary form must reproduce the above copyright
14
+ notice, this list of conditions and the following disclaimer in the
15
+ documentation and/or other materials provided with the distribution.
16
+ 3. Neither the name of the Majestic-12 Ltd nor the
17
+ names of its contributors may be used to endorse or promote products
18
+ derived from this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL Majestic-12 Ltd BE LIABLE FOR ANY
24
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ =end
32
+
33
+ module MajesticSeo
34
+ module Api
35
+ class ItemInfoResponse < Response
36
+
37
+ def initialize(response, table_key = "Results")
38
+ self.table_key = table_key
39
+ super(response)
40
+ parse_item_info_objects
41
+ end
42
+
43
+ def parse_item_info_objects
44
+ parsed = []
45
+ item_infos = self.items
46
+
47
+ if (item_infos && item_infos.any?)
48
+ item_infos.each do |item_info|
49
+ parsed << MajesticSeo::Api::ItemInfo.new(item_info)
50
+ end
51
+
52
+ @items = parsed if (parsed.any?)
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,11 @@
1
+ module MajesticSeo
2
+ module Api
3
+ module Logger
4
+
5
+ def log(level, message)
6
+ (defined?(Rails) && Rails.logger) ? Rails.logger.send(level, message) : puts(message)
7
+ end
8
+
9
+ end
10
+ end
11
+ end