easy_sitemap 0.0.1
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +15 -0
- data/README.md +47 -0
- data/Rakefile +17 -0
- data/bin/generate +17 -0
- data/bin/rails +14 -0
- data/bin/runner +25 -0
- data/lib/easy_sitemap.rb +22 -0
- data/lib/easy_sitemap/engine.rb +7 -0
- data/lib/easy_sitemap/generator.rb +40 -0
- data/lib/easy_sitemap/parser.rb +10 -0
- data/lib/easy_sitemap/runner.rb +57 -0
- data/lib/easy_sitemap/version.rb +3 -0
- data/lib/tasks/easy_sitemap_tasks.rake +27 -0
- data/spec/factories/factory.rb +7 -0
- data/spec/features/feature_spec.rb +6 -0
- data/spec/models/model_spec.rb +7 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/support/support.rb +6 -0
- metadata +109 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: aaf66bb4a6ba700872042b3ccdcf77183e73e2b18d4da3f8abd3db27d2cb65b0
|
4
|
+
data.tar.gz: '078063ff7007c1ea296ee78b38901eb64f7f5f53d0e490b708b46cf098f61c59'
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 10121f35cf43d2a31aabf55c11eca85f4ee09b81443376b2952ccd9b624cdf11ffdbdaec47ac01145e9df3ba0052d3ee36c4d5e35b4acf23b412e4bacc35a119
|
7
|
+
data.tar.gz: ac3c2c0126a5959ab8e749fad871f6b4764fd50afdbe1815326c953fd4756dfe16fc2d8c420f8917551c58748b1d897aec8b8029642804b7836bd400d2d67849
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# Changelog
|
2
|
+
All notable changes to this project will be documented in this file.
|
3
|
+
|
4
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
|
+
|
7
|
+
|
8
|
+
## [Unreleased]
|
9
|
+
|
10
|
+
- Increase version
|
11
|
+
- Release it
|
12
|
+
|
13
|
+
## [1.0.0.beta] - 2020-07-13
|
14
|
+
### Added
|
15
|
+
- Created EasySitemap
|
data/README.md
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# EasySitemap
|
2
|
+
|
3
|
+
<!--
|
4
|
+
-- Replace for true repository location
|
5
|
+
--
|
6
|
+
[](https://git.easy.cz/rysy/features/easy_sitemap/commits/master)
|
7
|
+
--
|
8
|
+
-->
|
9
|
+
|
10
|
+
## How to install
|
11
|
+
|
12
|
+
Add to your Gemfile or gems.rb
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
# From gems server
|
16
|
+
source 'https://gems.easysoftware.com' do
|
17
|
+
gem 'easy_sitemap'
|
18
|
+
end
|
19
|
+
|
20
|
+
# From git server
|
21
|
+
gem 'easy_sitemap', git: 'git@git.easy.cz:rysy/features/easy_sitemap.git', branch: 'master'
|
22
|
+
```
|
23
|
+
|
24
|
+
## Development
|
25
|
+
|
26
|
+
Please follow our [Guidelines](https://git.easy.cz/external/guidelines/wikis/home)
|
27
|
+
|
28
|
+
For full feature list of RYS see [RYS wiki](https://github.com/easysoftware/rys/wiki)
|
29
|
+
|
30
|
+
### 1) From the platform gemfile
|
31
|
+
|
32
|
+
1. Open gemfile (e.g: APP_ROOT/Gemfile.local)
|
33
|
+
2. Add `gem 'easy_sitemap', path: GENERATED_RYS_LOCATION`
|
34
|
+
3. Run `bundle install`
|
35
|
+
4. Run the server and develop
|
36
|
+
|
37
|
+
### 2) Link to redmine plugin
|
38
|
+
|
39
|
+
1. Make a symlink into `plugins/easysoftware/local`
|
40
|
+
2. Run `bundle install`
|
41
|
+
3. Run the server and develop
|
42
|
+
|
43
|
+
### 3) From generated rys itself
|
44
|
+
|
45
|
+
1. Symlink the platform (dummy app) into `test/dummy`
|
46
|
+
2. Run `bundle install`
|
47
|
+
3. Run the server and develop
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
|
3
|
+
possible_app_dirs = [
|
4
|
+
ENV['DUMMY_PATH'],
|
5
|
+
File.join(Dir.pwd, 'test/dummy')
|
6
|
+
]
|
7
|
+
dir = possible_app_dirs.compact.first
|
8
|
+
|
9
|
+
if !File.directory?(dir)
|
10
|
+
abort("Directory '#{dir}' does not exists")
|
11
|
+
end
|
12
|
+
|
13
|
+
APP_RAKEFILE = File.expand_path(File.join(dir, 'Rakefile'), __dir__)
|
14
|
+
load 'rails/tasks/engine.rake'
|
15
|
+
load 'rails/tasks/statistics.rake'
|
16
|
+
|
17
|
+
Bundler::GemHelper.install_tasks
|
data/bin/generate
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
lib_path = File.expand_path('../../lib', __FILE__)
|
4
|
+
$:.unshift(lib_path)
|
5
|
+
|
6
|
+
require "bundler/setup"
|
7
|
+
require 'optparse'
|
8
|
+
require "easy_sitemap"
|
9
|
+
|
10
|
+
options = {}
|
11
|
+
OptionParser.new do |opts|
|
12
|
+
opts.banner = "Usage: bin/generate [options]"
|
13
|
+
|
14
|
+
opts.on('-f', '--filename NAME', 'Path or file name of created XML file') { |v| options[:filename] = v }
|
15
|
+
end.parse!
|
16
|
+
|
17
|
+
EasySitemap.create(options[:filename] || 'sitemap.xml')
|
data/bin/rails
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails gems
|
3
|
+
# installed from the root of your application.
|
4
|
+
|
5
|
+
ENGINE_ROOT = File.expand_path('..', __dir__)
|
6
|
+
ENGINE_PATH = File.expand_path('../lib/blorgh/engine', __dir__)
|
7
|
+
APP_PATH = File.expand_path('../test/dummy/config/application', __dir__)
|
8
|
+
|
9
|
+
# Set up gems listed in the Gemfile.
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
|
11
|
+
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
12
|
+
|
13
|
+
require 'rails/all'
|
14
|
+
require 'rails/engine/commands'
|
data/bin/runner
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
lib_path = File.expand_path('../../lib', __FILE__)
|
4
|
+
$:.unshift(lib_path)
|
5
|
+
|
6
|
+
require "bundler/setup"
|
7
|
+
require 'optparse'
|
8
|
+
require "nokogiri"
|
9
|
+
require "httparty"
|
10
|
+
require 'active_support/all'
|
11
|
+
require "easy_sitemap/runner"
|
12
|
+
require "easy_sitemap/parser"
|
13
|
+
require "pp"
|
14
|
+
|
15
|
+
options = {}
|
16
|
+
OptionParser.new do |opts|
|
17
|
+
opts.banner = "Usage: bin/generate [options]"
|
18
|
+
|
19
|
+
opts.on('-f', '--filename NAME', 'Path or file name of created XML file') { |v| options[:filename] = v }
|
20
|
+
opts.on('-c', '--thread_count NUMBER', 'Thread count') { |v| options[:thread_count] = v.to_i }
|
21
|
+
opts.on('-k', '--api_key API_KEY', 'Api key to Redmine') { |v| options[:api_key] = v }
|
22
|
+
end.parse!
|
23
|
+
|
24
|
+
result = EasySitemap::Runner.perform(**options)
|
25
|
+
pp EasySitemap::Parser.group_result(result)
|
data/lib/easy_sitemap.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'httparty'
|
3
|
+
|
4
|
+
require 'easy_sitemap/version'
|
5
|
+
require 'easy_sitemap/engine'
|
6
|
+
|
7
|
+
module EasySitemap
|
8
|
+
|
9
|
+
autoload :Generator, "easy_sitemap/generator"
|
10
|
+
autoload :Runner, "easy_sitemap/runner"
|
11
|
+
autoload :Parser, "easy_sitemap/parser"
|
12
|
+
|
13
|
+
def self.create(file_path)
|
14
|
+
f = File.open(file_path, "w")
|
15
|
+
generator = Generator.new(::Issue.on_active_project)
|
16
|
+
#generator = Generator.new(::Issue.limit(10))
|
17
|
+
f.write(generator.to_xml)
|
18
|
+
ensure
|
19
|
+
f.close
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module EasySitemap
|
2
|
+
class Generator
|
3
|
+
|
4
|
+
def initialize(entities_scope, options = {})
|
5
|
+
@entities_scope = entities_scope
|
6
|
+
@options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_xml
|
10
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
11
|
+
xml.urlset do
|
12
|
+
@entities_scope.find_each(batch_size: 1) do |entity|
|
13
|
+
xml.url do
|
14
|
+
xml.loc url(entity)
|
15
|
+
if entity.respond_to?(:updated_at)
|
16
|
+
xml.lastmod entity.updated_at
|
17
|
+
elsif entity.respond_to?(:updated_on)
|
18
|
+
xml.lastmod entity.updated_on
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
builder.to_xml
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
|
29
|
+
def url(entity)
|
30
|
+
u = [@options[:host] || "http://localhost:3000"]
|
31
|
+
u << case entity
|
32
|
+
when Issue
|
33
|
+
"issues"
|
34
|
+
end
|
35
|
+
u << entity.id
|
36
|
+
u.join("/")
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module EasySitemap
|
2
|
+
class Runner
|
3
|
+
|
4
|
+
attr_reader :result
|
5
|
+
|
6
|
+
def initialize(urls, api_key: nil)
|
7
|
+
@urls = urls
|
8
|
+
@api_key = api_key
|
9
|
+
@result = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.perform(filename: 'sitemap.xml', thread_count: 5, api_key: nil)
|
13
|
+
doc = File.open(filename) { |f| Nokogiri::XML(f) }
|
14
|
+
|
15
|
+
runners = doc.xpath("//loc").
|
16
|
+
map(&:text).
|
17
|
+
in_groups(thread_count, false).
|
18
|
+
map { |group| Runner.new(group, api_key: api_key) }
|
19
|
+
|
20
|
+
threads = runners.map { |runner| Thread.new { runner.perform } }
|
21
|
+
threads.each { |thr| thr.join }
|
22
|
+
|
23
|
+
runners.map(&:result).inject(:merge)
|
24
|
+
end
|
25
|
+
|
26
|
+
def perform
|
27
|
+
@urls.each do |url|
|
28
|
+
ping_url(url)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def ping_url(url)
|
35
|
+
r = {}
|
36
|
+
|
37
|
+
starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
38
|
+
|
39
|
+
begin
|
40
|
+
h = {}
|
41
|
+
h['X-Redmine-API-Key'] = @api_key if @api_key.present?
|
42
|
+
|
43
|
+
response = HTTParty.get(url, follow_redirects: false, headers: h)
|
44
|
+
|
45
|
+
r['status'] = response.code
|
46
|
+
rescue Errno::ECONNREFUSED
|
47
|
+
r['status'] = 410
|
48
|
+
end
|
49
|
+
|
50
|
+
ending = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
51
|
+
r['time'] = (ending - starting).round(2)
|
52
|
+
|
53
|
+
@result[url] = r
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
begin
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
namespace :easy_sitemap do
|
5
|
+
desc 'Runs rspec tests'
|
6
|
+
RSpec::Core::RakeTask.new(:spec) do |task, _task_args|
|
7
|
+
args = []
|
8
|
+
args << '--require' << Ryspec::Engine.root.join('spec/spec_helper')
|
9
|
+
|
10
|
+
task.rspec_opts = args
|
11
|
+
task.pattern = EasySitemap::Engine.root.join('spec/**/*_spec.rb')
|
12
|
+
end
|
13
|
+
|
14
|
+
desc <<-END_DESC
|
15
|
+
Generate sitemap from DB
|
16
|
+
|
17
|
+
Example:
|
18
|
+
bundle exec rails easy_sitemap:generate filename="path_or_file_name"
|
19
|
+
END_DESC
|
20
|
+
task :generate => :environment do
|
21
|
+
EasySitemap.create(ENV['filename'].presence || 'sitemap.xml')
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
rescue StandardError, LoadError
|
26
|
+
# Ignore when `ryspec` gem missing
|
27
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: easy_sitemap
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- petr@easy.cz
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-07-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: nokogiri
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: httparty
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Description of EasySitemap.
|
56
|
+
email:
|
57
|
+
- info@easysoftware.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- CHANGELOG.md
|
63
|
+
- README.md
|
64
|
+
- Rakefile
|
65
|
+
- bin/generate
|
66
|
+
- bin/rails
|
67
|
+
- bin/runner
|
68
|
+
- lib/easy_sitemap.rb
|
69
|
+
- lib/easy_sitemap/engine.rb
|
70
|
+
- lib/easy_sitemap/generator.rb
|
71
|
+
- lib/easy_sitemap/parser.rb
|
72
|
+
- lib/easy_sitemap/runner.rb
|
73
|
+
- lib/easy_sitemap/version.rb
|
74
|
+
- lib/tasks/easy_sitemap_tasks.rake
|
75
|
+
- spec/factories/factory.rb
|
76
|
+
- spec/features/feature_spec.rb
|
77
|
+
- spec/models/model_spec.rb
|
78
|
+
- spec/spec_helper.rb
|
79
|
+
- spec/support/support.rb
|
80
|
+
homepage: https://easysoftware.com
|
81
|
+
licenses:
|
82
|
+
- GPL-2.0-or-later
|
83
|
+
metadata:
|
84
|
+
allowed_push_host: https://rubygems.org
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
requirements: []
|
100
|
+
rubygems_version: 3.0.3
|
101
|
+
signing_key:
|
102
|
+
specification_version: 4
|
103
|
+
summary: Summary of EasySitemap.
|
104
|
+
test_files:
|
105
|
+
- spec/factories/factory.rb
|
106
|
+
- spec/support/support.rb
|
107
|
+
- spec/models/model_spec.rb
|
108
|
+
- spec/spec_helper.rb
|
109
|
+
- spec/features/feature_spec.rb
|