majesticseo 1.0.1 → 1.0.2
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/.gemtest +0 -0
- data/History.txt +6 -0
- data/Rakefile +3 -3
- data/lib/majesticseo.rb +10 -3
- data/lib/majesticseo/client.rb +54 -12
- data/lib/majesticseo/data_table.rb +3 -2
- data/test/test_helper.rb +11 -1
- data/test/test_majesticseo.rb +56 -15
- metadata +14 -29
data/.gemtest
ADDED
File without changes
|
data/History.txt
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== 1.0.2 2012-01-15
|
2
|
+
* 2 minor enhancements
|
3
|
+
* allow symbol as enviroment variable
|
4
|
+
* Allow supression of stdout msgs if :debug flag is set to false
|
5
|
+
* cherrypicked needed active support extensions (AS v.3.0.0 and up)
|
6
|
+
* majestic escapes pipes in text data in response. Parsing correctly
|
1
7
|
=== 1.0.0 2011-04-09
|
2
8
|
* 2 minor enhancements:
|
3
9
|
* Added installation message
|
data/Rakefile
CHANGED
@@ -7,9 +7,9 @@ require './lib/majesticseo'
|
|
7
7
|
Hoe.plugin :newgem
|
8
8
|
$hoe = Hoe.spec 'majesticseo' do
|
9
9
|
self.developer 'Achilles Charmpilas', 'ac@humbuckercode.co.uk'
|
10
|
-
self.post_install_message = 'PostInstall.txt'
|
11
|
-
self.rubyforge_name = self.name
|
12
|
-
self.extra_deps = [['activesupport','>=
|
10
|
+
self.post_install_message = 'PostInstall.txt'
|
11
|
+
self.rubyforge_name = self.name
|
12
|
+
self.extra_deps = [['activesupport','>= 3.0.0'], ['nokogiri','>= 1.4.0']]
|
13
13
|
|
14
14
|
end
|
15
15
|
|
data/lib/majesticseo.rb
CHANGED
@@ -4,13 +4,20 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
4
4
|
=begin rdoc
|
5
5
|
This module implements a ruby-friendly interface to the Majestic SEO developer API.
|
6
6
|
=end
|
7
|
-
require "active_support"
|
8
7
|
require "nokogiri"
|
9
8
|
require "open-uri"
|
10
9
|
require "ostruct"
|
11
10
|
|
11
|
+
unless Hash.method_defined?(:to_param)
|
12
|
+
require "active_support/core_ext/object/to_query"
|
13
|
+
end
|
14
|
+
|
15
|
+
unless String.method_defined?(:underscore)
|
16
|
+
require "active_support/core_ext/string/inflections"
|
17
|
+
end
|
18
|
+
|
12
19
|
module Majesticseo
|
13
|
-
VERSION = '1.0.
|
20
|
+
VERSION = '1.0.2'
|
14
21
|
class NoMethodError < ArgumentError; end
|
15
22
|
class InvalidAPIKey < ArgumentError; end
|
16
23
|
=begin rdoc
|
@@ -48,4 +55,4 @@ module Majesticseo
|
|
48
55
|
=end
|
49
56
|
class GlobalVars < Majesticseo::Structure; end
|
50
57
|
end
|
51
|
-
%W[data_table client].each { |r| require "#{File.dirname(__FILE__)}/majesticseo/#{r}" }
|
58
|
+
%W[data_table client].each { |r| require "#{File.dirname(__FILE__)}/majesticseo/#{r}" }
|
data/lib/majesticseo/client.rb
CHANGED
@@ -16,20 +16,29 @@ module Majesticseo
|
|
16
16
|
end
|
17
17
|
=end
|
18
18
|
class Client
|
19
|
+
BASE_URI = "http://%s.majesticseo.com/api_command" unless
|
20
|
+
self.const_defined?(:BASE_URI)
|
21
|
+
|
19
22
|
attr_reader :app_api_key, :env, :uri, :response
|
20
23
|
attr_accessor :code, :error_message, :full_error, :data_tables, :global_vars
|
21
24
|
=begin rdoc
|
22
25
|
Initialize a Majestic SEO aPI client passing the following options:
|
23
26
|
app_api_key: You Majesticseo API key, found at: https://www.Majesticseo.com/account/api
|
24
|
-
|
27
|
+
environment (optional): Default to RAILS_ENV, RACK_ENV or default. Determines whether the client uses the sandbox or production API server
|
25
28
|
=end
|
26
29
|
def initialize(opts = {})
|
27
30
|
@app_api_key = opts.delete(:app_api_key)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
@debug = opts.fetch(:debug, true)
|
32
|
+
|
33
|
+
if !@app_api_key || @app_api_key.empty?
|
34
|
+
msg = "API key needs to be a valid Majestic SEO API key. See: "\
|
35
|
+
"https://www.Majesticseo.com/account/api"
|
36
|
+
|
37
|
+
raise Majesticseo::InvalidAPIKey.new(msg)
|
38
|
+
end
|
39
|
+
|
40
|
+
if opts[:environment]
|
41
|
+
@env = opts.delete(:environment)
|
33
42
|
elsif defined?(RAILS_ENV)
|
34
43
|
@env = RAILS_ENV
|
35
44
|
elsif defined?(RACK_ENV)
|
@@ -40,20 +49,35 @@ module Majesticseo
|
|
40
49
|
@response = nil
|
41
50
|
@data_tables = []
|
42
51
|
@global_vars = nil
|
43
|
-
@uri = URI.parse(
|
52
|
+
@uri = URI.parse(build_url)
|
53
|
+
|
44
54
|
puts "Started Majesticseo::Client in #{env} mode"
|
45
55
|
end
|
46
56
|
|
47
57
|
def call method, params
|
48
58
|
params = {} unless params.is_a? Hash
|
49
59
|
request_uri = uri.clone
|
50
|
-
request_uri.query = params.merge({
|
60
|
+
request_uri.query = params.merge({
|
61
|
+
:app_api_key => app_api_key,
|
62
|
+
:cmd => method
|
63
|
+
}).to_param
|
64
|
+
|
51
65
|
@response = Nokogiri::XML(open(request_uri))
|
52
66
|
|
53
67
|
# Set response and global variable attributes
|
54
|
-
|
68
|
+
if response.at("Result")
|
69
|
+
response.at("Result").keys.each do |a|
|
70
|
+
send("#{a.underscore}=".to_sym, response.at("Result").attr(a))
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
55
74
|
@global_vars = GlobalVars.new
|
56
|
-
|
75
|
+
if response.at("GlobalVars")
|
76
|
+
response.at("GlobalVars").keys.each do |a|
|
77
|
+
@global_vars.send("#{a.underscore}=".to_sym, response.at("GlobalVars").attr(a))
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
57
81
|
parse_data if success?
|
58
82
|
end
|
59
83
|
|
@@ -62,11 +86,29 @@ module Majesticseo
|
|
62
86
|
end
|
63
87
|
|
64
88
|
def parse_data
|
65
|
-
@data_tables = @response.search("DataTable").
|
89
|
+
@data_tables = @response.search("DataTable").map do |table|
|
90
|
+
DataTable.create_from_xml(table)
|
91
|
+
end
|
66
92
|
end
|
67
93
|
|
68
94
|
def success?
|
69
95
|
code == "OK" and error_message == ""
|
70
96
|
end
|
97
|
+
|
98
|
+
def build_url
|
99
|
+
subdomain = Hash.new("developer")
|
100
|
+
subdomain[:production] = "enterprise"
|
101
|
+
subdomain['production'] = "enterprise"
|
102
|
+
|
103
|
+
BASE_URI % subdomain[env]
|
104
|
+
end
|
105
|
+
|
106
|
+
def puts(msg)
|
107
|
+
Kernel.puts(msg) if debug?
|
108
|
+
end
|
109
|
+
|
110
|
+
def debug?
|
111
|
+
@debug
|
112
|
+
end
|
71
113
|
end
|
72
|
-
end
|
114
|
+
end
|
@@ -9,7 +9,7 @@ module Majesticseo
|
|
9
9
|
table.rows_count = xml.attr("RowsCount").to_i
|
10
10
|
table.rows = xml.search("Row").map do |r|
|
11
11
|
row = Row.new
|
12
|
-
data = r.content.
|
12
|
+
data = r.content.scan(/(?=<!\|)\|(?=!\|)/)
|
13
13
|
table.headers.each_index { |i| row.send("#{table.headers[i].underscore}=",data[i])}
|
14
14
|
row
|
15
15
|
end
|
@@ -28,4 +28,5 @@ module Majesticseo
|
|
28
28
|
@headers ? @headers : []
|
29
29
|
end
|
30
30
|
end
|
31
|
-
end
|
31
|
+
end
|
32
|
+
|
data/test/test_helper.rb
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
require 'rubygems'
|
1
2
|
require 'stringio'
|
2
3
|
require 'test/unit'
|
3
|
-
require File.
|
4
|
+
require File.expand_path('../../lib/majesticseo', __FILE__)
|
5
|
+
|
6
|
+
def maj_client(key=nil, env=nil)
|
7
|
+
Majesticseo::Client.new(:app_api_key => key, :environment => env)
|
8
|
+
end
|
9
|
+
|
10
|
+
def fake_client(env=nil)
|
11
|
+
maj_client("fake", env)
|
12
|
+
end
|
13
|
+
|
data/test/test_majesticseo.rb
CHANGED
@@ -1,15 +1,56 @@
|
|
1
|
-
require File.
|
2
|
-
|
3
|
-
class TestMajesticseo < Test::Unit::TestCase
|
4
|
-
def test_cannot_initialize_client_without_api_key
|
5
|
-
assert_raise Majesticseo::InvalidAPIKey do
|
6
|
-
Majesticseo::Client.new
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_cannot_initialize_client_with_empty_api_key
|
11
|
-
assert_raise Majesticseo::InvalidAPIKey do
|
12
|
-
Majesticseo::Client.new(:app_api_key => "")
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class TestMajesticseo < Test::Unit::TestCase
|
4
|
+
def test_cannot_initialize_client_without_api_key
|
5
|
+
assert_raise Majesticseo::InvalidAPIKey do
|
6
|
+
Majesticseo::Client.new
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_cannot_initialize_client_with_empty_api_key
|
11
|
+
assert_raise Majesticseo::InvalidAPIKey do
|
12
|
+
Majesticseo::Client.new(:app_api_key => "")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class TestMajesticURL < Test::Unit::TestCase
|
18
|
+
def test_builds_correct_url_for_development
|
19
|
+
assert_equal "http://developer.majesticseo.com/api_command",
|
20
|
+
fake_client("development").build_url
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_builds_correct_url_for_production
|
24
|
+
[:production, "production"].each do |e|
|
25
|
+
assert_equal "http://enterprise.majesticseo.com/api_command",
|
26
|
+
fake_client(e).build_url
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_builds_correct_url_for_default
|
31
|
+
assert_equal "http://developer.majesticseo.com/api_command",
|
32
|
+
fake_client.build_url
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class TestMajesticDebug < Test::Unit::TestCase
|
37
|
+
def setup
|
38
|
+
@_stdout = $stdout
|
39
|
+
@stringio = StringIO.new
|
40
|
+
$stdout = @stringio
|
41
|
+
end
|
42
|
+
|
43
|
+
def teardown
|
44
|
+
$stdout = @_stdout
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_client_in_debug_mode_by_default
|
48
|
+
assert fake_client.debug?
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_suppress_output_when_not_in_debug_mode
|
52
|
+
client = Majesticseo::Client.new(:app_api_key => "test", :debug => false)
|
53
|
+
|
54
|
+
assert_equal "", @stringio.string
|
55
|
+
end
|
56
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: majesticseo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 2
|
10
|
+
version: 1.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Achilles Charmpilas
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2013-01-05 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -26,12 +26,12 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
hash:
|
29
|
+
hash: 7
|
30
30
|
segments:
|
31
|
-
-
|
31
|
+
- 3
|
32
32
|
- 0
|
33
|
-
-
|
34
|
-
version:
|
33
|
+
- 0
|
34
|
+
version: 3.0.0
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
37
|
- !ruby/object:Gem::Dependency
|
@@ -51,37 +51,21 @@ dependencies:
|
|
51
51
|
type: :runtime
|
52
52
|
version_requirements: *id002
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
|
-
name:
|
54
|
+
name: hoe
|
55
55
|
prerelease: false
|
56
56
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
hash:
|
61
|
+
hash: 35
|
62
62
|
segments:
|
63
63
|
- 2
|
64
|
-
-
|
64
|
+
- 9
|
65
65
|
- 4
|
66
|
-
version: 2.
|
66
|
+
version: 2.9.4
|
67
67
|
type: :development
|
68
68
|
version_requirements: *id003
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: hoe
|
71
|
-
prerelease: false
|
72
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ">="
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
hash: 19
|
78
|
-
segments:
|
79
|
-
- 2
|
80
|
-
- 6
|
81
|
-
- 2
|
82
|
-
version: 2.6.2
|
83
|
-
type: :development
|
84
|
-
version_requirements: *id004
|
85
69
|
description: A ruby-friendly interface to the Majestic SEO API.
|
86
70
|
email:
|
87
71
|
- ac@humbuckercode.co.uk
|
@@ -107,6 +91,7 @@ files:
|
|
107
91
|
- script/generate
|
108
92
|
- test/test_helper.rb
|
109
93
|
- test/test_majesticseo.rb
|
94
|
+
- .gemtest
|
110
95
|
has_rdoc: true
|
111
96
|
homepage: http://github.com/Achillefs/majesticseo
|
112
97
|
licenses: []
|
@@ -138,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
123
|
requirements: []
|
139
124
|
|
140
125
|
rubyforge_project: majesticseo
|
141
|
-
rubygems_version: 1.
|
126
|
+
rubygems_version: 1.6.1
|
142
127
|
signing_key:
|
143
128
|
specification_version: 3
|
144
129
|
summary: A ruby-friendly interface to the Majestic SEO API.
|