easy_sitemap 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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