seetemap-client 0.0.14 → 0.0.15
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/lib/seetemap_client.rb +181 -0
- data/lib/seetemap_client/version.rb +3 -0
- metadata +4 -2
@@ -0,0 +1,181 @@
|
|
1
|
+
$:.<< File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'sinatra'
|
4
|
+
require 'httparty'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'yaml'
|
7
|
+
|
8
|
+
require 'seetemap_client/version'
|
9
|
+
|
10
|
+
module SeetemapClient
|
11
|
+
SITEMAP_PATH = "tmp/sitemap.xml"
|
12
|
+
|
13
|
+
class Seetemap
|
14
|
+
include HTTParty
|
15
|
+
base_uri 'https://seetemap.com'
|
16
|
+
|
17
|
+
# hack: don't auto parse result
|
18
|
+
NO_PARSER = Proc.new { |body, format| body }
|
19
|
+
|
20
|
+
def self.config(auth_token, site_token)
|
21
|
+
@@auth_token = auth_token
|
22
|
+
@@site_token = site_token
|
23
|
+
end
|
24
|
+
|
25
|
+
# You must be certain that fetch! returns a valid status code before calling
|
26
|
+
# this function.
|
27
|
+
#
|
28
|
+
# @return [String] sitemap content
|
29
|
+
def self.sitemap
|
30
|
+
get("/fr/dashboard/websites/#{@@site_token}.xml",
|
31
|
+
:format => :xml,
|
32
|
+
:query => { :auth_token => @@auth_token },
|
33
|
+
:parser => NO_PARSER)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Cache the audit list inside the Seetemap class. Must be called for each
|
37
|
+
# interaction with the server that need fresh information about the audits.
|
38
|
+
#
|
39
|
+
# This call returns an http code matching the current situation:
|
40
|
+
# - 404 : no remote audit found, check your api_key
|
41
|
+
# - 401 : your not authorized to get this site map, check your token
|
42
|
+
# - 500 : server error / malformed response
|
43
|
+
# - 204 : no audit is available
|
44
|
+
# - 200 : an audit is available
|
45
|
+
#
|
46
|
+
# @return[Integer] response code
|
47
|
+
def self.fetch!
|
48
|
+
@@response = get("/fr/dashboard/websites/#{@@site_token}/audits.json",
|
49
|
+
:query => { :auth_token => @@auth_token })
|
50
|
+
|
51
|
+
return @@response.code if @@response.nil? || @@response.code != 200
|
52
|
+
|
53
|
+
@@last_audit = @@response.parsed_response.first
|
54
|
+
@@last_finished_audit = @@response.parsed_response.find {|audit| audit["finished_at"]}
|
55
|
+
|
56
|
+
if @@last_audit.nil? or @@last_finished_audit.nil?
|
57
|
+
204
|
58
|
+
else
|
59
|
+
200
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Get the most recent timestamp that can be applyied to the audit when
|
64
|
+
# there is no fresher audit available.
|
65
|
+
#
|
66
|
+
# @param [Time] actual timestamp of the current cached sitemap
|
67
|
+
# @return [nil|Time] nil if there is a fresher audit available or the time to update
|
68
|
+
def self.fresh?(time)
|
69
|
+
if @@last_audit.nil? or @@last_finished_audit.nil?
|
70
|
+
nil
|
71
|
+
else
|
72
|
+
result = if @@last_audit["finished_at"].nil?
|
73
|
+
Time.parse(@@last_audit["requested_at"]) rescue time
|
74
|
+
else
|
75
|
+
Time.now
|
76
|
+
end
|
77
|
+
last_modified = Time.parse(@@last_finished_audit["finished_at"]) rescue time
|
78
|
+
time > last_modified ? result : nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.ping_google(mount_point)
|
83
|
+
url = mount_point.chomp('/') << '/sitemap.xml'
|
84
|
+
escaped_url = URI.escape(url, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
85
|
+
HTTParty.get('http://www.google.com/webmasters/tools/ping?sitemap=' + escaped_url)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
class Application < Sinatra::Base
|
90
|
+
get '/sitemap' do
|
91
|
+
content_type 'text/xml'
|
92
|
+
render_sitemap(params[:force_reload])
|
93
|
+
end
|
94
|
+
|
95
|
+
get '/sitemap.xml' do
|
96
|
+
content_type 'text/xml'
|
97
|
+
render_sitemap(params[:force_reload])
|
98
|
+
end
|
99
|
+
|
100
|
+
get '/seetemap/version' do
|
101
|
+
content_type 'application/json'
|
102
|
+
"{\"version\":\"#{SeetemapClient::VERSION}\"}"
|
103
|
+
end
|
104
|
+
|
105
|
+
get '/seetemap/purge' do
|
106
|
+
remove_sitemap_file
|
107
|
+
nil
|
108
|
+
end
|
109
|
+
|
110
|
+
get '/seetemap/ping' do
|
111
|
+
Seetemap.config(configuration["auth_token"], configuration["site_token"])
|
112
|
+
code = Seetemap.fetch!
|
113
|
+
unless code != 200
|
114
|
+
remove_sitemap_file
|
115
|
+
create_sitemap_file
|
116
|
+
if params[:fwd_google] && mount_point
|
117
|
+
Seetemap.ping_google(mount_point)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
status code
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
def environment
|
126
|
+
@environment ||= ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"
|
127
|
+
end
|
128
|
+
|
129
|
+
def configuration
|
130
|
+
@configuration ||= YAML.load(File.open("config/seetemap.yml"))[environment]
|
131
|
+
end
|
132
|
+
|
133
|
+
def mount_point
|
134
|
+
configuration["mount_point"]
|
135
|
+
end
|
136
|
+
|
137
|
+
def locally_fresh?(time)
|
138
|
+
time > (Time.now - configuration["keep_delay"] || 3600)
|
139
|
+
end
|
140
|
+
|
141
|
+
def render_sitemap(force_reload)
|
142
|
+
Seetemap.config(configuration["auth_token"], configuration["site_token"])
|
143
|
+
code = Seetemap.fetch!
|
144
|
+
case code
|
145
|
+
when 200
|
146
|
+
if File.exists?(SeetemapClient::SITEMAP_PATH)
|
147
|
+
time = File.mtime(SeetemapClient::SITEMAP_PATH)
|
148
|
+
if force_reload
|
149
|
+
create_sitemap_file
|
150
|
+
elsif locally_fresh?(time)
|
151
|
+
File.read(SeetemapClient::SITEMAP_PATH)
|
152
|
+
elsif (time_to_update = Seetemap.fresh?(time))
|
153
|
+
FileUtils.touch SeetemapClient::SITEMAP_PATH, :mtime => time_to_update
|
154
|
+
File.read(SeetemapClient::SITEMAP_PATH)
|
155
|
+
else
|
156
|
+
create_sitemap_file
|
157
|
+
end
|
158
|
+
else
|
159
|
+
create_sitemap_file
|
160
|
+
end
|
161
|
+
else
|
162
|
+
status code
|
163
|
+
nil
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def remove_sitemap_file
|
168
|
+
if File.exists?(SeetemapClient::SITEMAP_PATH)
|
169
|
+
File.delete(SeetemapClient::SITEMAP_PATH)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def create_sitemap_file
|
174
|
+
base_path = File.dirname(SeetemapClient::SITEMAP_PATH)
|
175
|
+
Dir.mkdir(base_path) unless Dir.exists?(base_path)
|
176
|
+
sitemap = Seetemap.sitemap
|
177
|
+
File.open(SeetemapClient::SITEMAP_PATH, "w+") { |file| file.write(sitemap) }
|
178
|
+
sitemap.to_s
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seetemap-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.15
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
@@ -50,6 +50,8 @@ executables: []
|
|
50
50
|
extensions: []
|
51
51
|
extra_rdoc_files: []
|
52
52
|
files:
|
53
|
+
- lib/seetemap_client.rb
|
54
|
+
- lib/seetemap_client/version.rb
|
53
55
|
- README.md
|
54
56
|
- CHANGELOG.md
|
55
57
|
homepage: https://github.com/synbioz/seetemap-client
|