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.
@@ -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
@@ -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
@@ -0,0 +1,47 @@
1
+ # EasySitemap
2
+
3
+ <!--
4
+ -- Replace for true repository location
5
+ --
6
+ [![coverage report](https://git.easy.cz/rysy/features/easy_sitemap/badges/master/coverage.svg)](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
@@ -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
@@ -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')
@@ -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'
@@ -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)
@@ -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,7 @@
1
+ module EasySitemap
2
+ class Engine < ::Rails::Engine
3
+ initializer 'easy_sitemap.setup' do
4
+ # Custom initializer
5
+ end
6
+ end
7
+ 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,10 @@
1
+ module EasySitemap
2
+ class Parser
3
+
4
+ def self.group_result(result)
5
+ Hash[*result.group_by { |k, v| v["status"] }.map { |key, items| [key, items.count] }.flatten]
6
+ end
7
+
8
+ end
9
+ end
10
+
@@ -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,3 @@
1
+ module EasySitemap
2
+ VERSION = '0.0.1'
3
+ 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
@@ -0,0 +1,7 @@
1
+ # FactoryBot.define do
2
+ #
3
+ # factory :test do
4
+ # sequence(:name) { |n| "Test ##{n}" }
5
+ # end
6
+ #
7
+ # end
@@ -0,0 +1,6 @@
1
+ # RSpec.feature 'Feature test', js: true do
2
+ #
3
+ # scenario 'Scenario' do
4
+ # end
5
+ #
6
+ # end
@@ -0,0 +1,7 @@
1
+ # RSpec.describe 'Model test', logged: :admin do
2
+ #
3
+ # it 'Test something' do
4
+ # expect(1).to eq(1)
5
+ # end
6
+ #
7
+ # end
@@ -0,0 +1,9 @@
1
+ require 'bundler'
2
+
3
+ spec = Bundler.load.specs.find { |s| s.name.to_s == 'ryspec' }
4
+
5
+ if !spec
6
+ abort('Gem ryspec was not found. Please add it and run bundle install again.')
7
+ end
8
+
9
+ require File.join(spec.full_gem_path, 'spec/spec_helper')
@@ -0,0 +1,6 @@
1
+ module EasySitemap
2
+ module Test
3
+ module Helper
4
+ end
5
+ end
6
+ end
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