kms_seo 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +41 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/javascripts/kms_seo/application.js +15 -0
  6. data/app/assets/javascripts/kms_seo/application/controllers/redirects_controller.coffee.erb +31 -0
  7. data/app/assets/javascripts/kms_seo/application/routes.coffee.erb +17 -0
  8. data/app/assets/javascripts/templates/pages/seo.html.slim +14 -0
  9. data/app/assets/javascripts/templates/redirects/index.html.slim +30 -0
  10. data/app/assets/stylesheets/kms_seo/application.css +15 -0
  11. data/app/controllers/kms/pages_controller_decorator.rb +3 -0
  12. data/app/controllers/kms/public/pages_controller_decorator.rb +17 -0
  13. data/app/controllers/kms/public/sitemaps_controller.rb +21 -0
  14. data/app/controllers/kms/seo/redirects_controller.rb +39 -0
  15. data/app/helpers/kms_seo/application_helper.rb +4 -0
  16. data/app/models/kms/redirect.rb +4 -0
  17. data/app/serializers/kms/redirect_serializer.rb +5 -0
  18. data/app/views/kms/public/sitemaps/show.xml.builder +31 -0
  19. data/app/views/layouts/kms_seo/application.html.erb +14 -0
  20. data/config/initializers/externals.rb +10 -0
  21. data/config/initializers/form_customizations.rb +1 -0
  22. data/config/initializers/resources.rb +1 -0
  23. data/config/locales/en.yml +18 -0
  24. data/config/locales/ru.yml +18 -0
  25. data/config/routes.rb +8 -0
  26. data/db/migrate/20150727192219_add_seo_fields_to_pages.rb +7 -0
  27. data/db/migrate/20150903135219_create_redirects.rb +10 -0
  28. data/lib/generators/kms_seo/install/install_generator.rb +15 -0
  29. data/lib/kms/drops/seo_wrapper_drop.rb +5 -0
  30. data/lib/kms/seo/engine.rb +14 -0
  31. data/lib/kms/seo/version.rb +5 -0
  32. data/lib/kms/seo_wrapper.rb +25 -0
  33. data/lib/kms_seo.rb +6 -0
  34. data/lib/tasks/kms_seo_tasks.rake +4 -0
  35. data/test/integration/navigation_test.rb +10 -0
  36. data/test/kms_seo_test.rb +7 -0
  37. data/test/test_helper.rb +19 -0
  38. metadata +125 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cee0939b2b5f7825c1bc2469f783ded0e11bedbb
4
+ data.tar.gz: bf2fc6ba9f87140f3373307d6b699f070045f120
5
+ SHA512:
6
+ metadata.gz: b996a6b7bf18f46a92aee0723dde9378bd8479b3c4b3e1aa4633a5f4e88f021393dc76cd0a5c63b49ea40628eea328355aac9eb1ed377de8a0a70710b1a7e548
7
+ data.tar.gz: 2bf53cdacad8c9e533a11b227410ebc404198cc59d56e906d913aeec71573648a352e6737000ecc9922eaeba35931d7a6ef5b85f66808f68d75ef6bae944bf67
@@ -0,0 +1,20 @@
1
+ Copyright 2015 Igor Petrov
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,41 @@
1
+ ## KMS SEO
2
+
3
+ Adds SEO support to KMS: meta tags fields for Pages, sitemap.xml generating, redirects, special {{ seo }} variable.
4
+
5
+ Use "seo" object for accessing SEO settings for page or object.
6
+
7
+ <title>{{ seo.title }}</title>
8
+ <meta name="keywords" content="{{ seo.keywords }}">
9
+ <meta name="description" content="{{ seo.description }}">
10
+
11
+ Also, this adds sitemap generation support (at /sitemap.xml)
12
+
13
+ ## Installation
14
+
15
+ 1. Add to Gemfile
16
+
17
+ gem "kms_seo"
18
+ # or for edge version:
19
+ gem "kms_seo", github: "webgradus/kms_seo"
20
+
21
+ 2. Run generator:
22
+
23
+ bundle exec rails g kms_seo:install
24
+
25
+ 3. Copy migrations:
26
+
27
+ bundle exec rails kms_seo:install:migrations
28
+
29
+ 4. Migrate:
30
+
31
+ bundle exec rails db:migrate
32
+
33
+ 5. Recompile assets (if on production):
34
+
35
+ bundle exec rails assets:precompile
36
+
37
+ 6. Restart KMS instance
38
+
39
+ ## Contributing
40
+
41
+ Please follow [CONTRIBUTING.md](CONTRIBUTING.md).
@@ -0,0 +1,37 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'KmsSeo'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+ load 'rails/tasks/statistics.rake'
22
+
23
+
24
+
25
+ Bundler::GemHelper.install_tasks
26
+
27
+ require 'rake/testtask'
28
+
29
+ Rake::TestTask.new(:test) do |t|
30
+ t.libs << 'lib'
31
+ t.libs << 'test'
32
+ t.pattern = 'test/**/*_test.rb'
33
+ t.verbose = false
34
+ end
35
+
36
+
37
+ task default: :test
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require "kms_seo/application/routes"
14
+ //= require_tree "../templates"
15
+ //= require_tree "./application/controllers"
@@ -0,0 +1,31 @@
1
+ RedirectsController = ($scope, $state, Restangular, $stateParams) ->
2
+ $scope.store = Restangular.all('redirects')
3
+
4
+ $scope.store.getList().then (redirects)->
5
+ $scope.redirects = redirects
6
+
7
+ $scope.addRedirect = ->
8
+ $scope.redirects.unshift
9
+ source: ''
10
+ destination: ''
11
+
12
+ $scope.save = (data, redirect)->
13
+ redirect.source = data.source
14
+ redirect.destination = data.destination
15
+ if redirect.id?
16
+ redirect.put()
17
+ else
18
+ restangularizedRedirect = Restangular.restangularizeElement(null, redirect, 'redirects')
19
+ restangularizedRedirect.save()
20
+
21
+ $scope.destroy = (redirect)->
22
+ if redirect.id?
23
+ restangularizedRedirect = Restangular.restangularizeElement(null, redirect, 'redirects')
24
+ return unless confirm('<%= I18n.t(:are_you_sure) %>')
25
+ restangularizedRedirect.remove().then ->
26
+ $scope.redirects = _.without($scope.redirects, redirect)
27
+ else
28
+ $scope.redirects = _.without($scope.redirects, redirect)
29
+
30
+ angular.module('KMS')
31
+ .controller('RedirectsController', ['$scope', '$state', 'Restangular', '$stateParams', RedirectsController])
@@ -0,0 +1,17 @@
1
+ 'use strict'
2
+
3
+ angular.module('KMS').config ['$stateProvider', '$urlRouterProvider', ($stateProvider, $urlRouterProvider) ->
4
+
5
+ # Application routes
6
+ $stateProvider
7
+ .state('redirects', {
8
+ url: '/kms/redirects',
9
+ views:
10
+ "header":
11
+ template: "<%= Kms::Redirect.model_name.human(count: 1.1) %>"
12
+ "@":
13
+ controller: 'RedirectsController',
14
+ controllerAs: 'redirects',
15
+ templateUrl: 'redirects/index.html',
16
+ })
17
+ ]
@@ -0,0 +1,14 @@
1
+ accordion close-others="true"
2
+ accordion-group is-open="status.open"
3
+ accordion-heading
4
+ i.pull-left.glyphicon ng-class="{'glyphicon-chevron-down': status.open, 'glyphicon-chevron-right': !status.open}"
5
+ | &nbsp;SEO
6
+ .form-group
7
+ label for="seo_title" = Kms::Page.human_attribute_name(:seo_title)
8
+ input#seo_title.form-control type="text" ng-model="page.seo_title"
9
+ .form-group
10
+ label for="seo_keywords" = Kms::Page.human_attribute_name(:seo_keywords)
11
+ input#seo_keywords.form-control type="text" ng-model="page.seo_keywords"
12
+ .form-group
13
+ label for="seo_description" = Kms::Page.human_attribute_name(:seo_description)
14
+ input#seo_description.form-control type="text" ng-model="page.seo_description"
@@ -0,0 +1,30 @@
1
+ .row
2
+ .col-lg-12
3
+ .widget
4
+ .widget-header
5
+ i.fa.fa-list
6
+ = Kms::Redirect.model_name.human(count: 1.1)
7
+ a.btn.btn-sm.btn-primary.pull-right ng-click="addRedirect()"
8
+ = I18n.t("add_redirect")
9
+ .widget-body.no-padding
10
+ .table-responsive
11
+ table.table
12
+ tbody
13
+ tr ng-repeat="redirect in redirects"
14
+ td style="width: 40%"
15
+ span editable-text="redirect.source" e-name="source" e-form="editRedirectForm" e-required=""
16
+ | {{ redirect.source || '#{Kms::Redirect.human_attribute_name(:source)}' }}
17
+ td style="width: 40%"
18
+ span editable-text="redirect.destination" e-name="destination" e-form="editRedirectForm" e-required=""
19
+ | {{ redirect.destination || '#{Kms::Redirect.human_attribute_name(:destination)}' }}
20
+ td
21
+ form.form-buttons.form-inline.pull-right editable-form="" name="editRedirectForm" ng-show="editRedirectForm.$visible" onbeforesave="save($data, redirect)"
22
+ button.btn.btn-primary ng-disabled="editRedirectForm.$waiting" type="submit"
23
+ span class="glyphicon glyphicon-ok"
24
+ button.btn.btn-default ng-click="editRedirectForm.$cancel()" ng-disabled="editRedirectForm.$waiting" type="button"
25
+ span class="glyphicon glyphicon-remove"
26
+ .btn-group.pull-right ng-show="!editRedirectForm.$visible"
27
+ a.btn.btn-sm.btn-info ng-click="editRedirectForm.$show()"
28
+ i.fa.fa-pencil
29
+ a.btn.btn-sm.btn-danger ng-click="destroy(redirect)"
30
+ i.fa.fa-times
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any styles
10
+ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
11
+ * file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,3 @@
1
+ Kms::PagesController.class_eval do
2
+ wrap_parameters :page, include: [:title, :slug, :content, :published, :template_id, :templatable,:templatable_type,:position,:hidden, :parent_id, :seo_title, :seo_keywords, :seo_description]
3
+ end
@@ -0,0 +1,17 @@
1
+ Kms::Public::PagesController.class_eval do
2
+ protected
3
+
4
+ def eval_externals
5
+ @externals = Hash[Kms::ExternalsRegistry.externals.map { |k, v| [k, v.call(request, self)] }]
6
+ @page = @externals[:page].source
7
+ @template = @page.template
8
+ rescue ActiveRecord::RecordNotFound
9
+ # try to find with first "/" character or without it
10
+ redirect = Kms::Redirect.where("source in (?)", [request.fullpath, request.fullpath.sub('/', '')]).first
11
+ if redirect
12
+ redirect_to URI.join(main_app.root_url, redirect.destination).to_s, status: :moved_permanently
13
+ else
14
+ render file: "#{Rails.root}/public/404.html", layout: false, status: :not_found unless redirect
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ module Kms
2
+ module Public
3
+ class SitemapsController < ActionController::Base
4
+ respond_to :xml
5
+ helper_method :site_url, :public_page_url
6
+
7
+ def show
8
+ @pages = Kms::Page.published
9
+ respond_with @pages
10
+ end
11
+
12
+ def site_url
13
+ 'http://' + request.host_with_port
14
+ end
15
+
16
+ def public_page_url(page)
17
+ File.join(site_url, page.respond_to?(:permalink) ? page.permalink : page.fullpath)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,39 @@
1
+ module Kms
2
+ module Seo
3
+ class RedirectsController < ApplicationController
4
+ def index
5
+ render json: Redirect.all, root: false
6
+ end
7
+
8
+ def create
9
+ @redirect = Redirect.new(redirect_params)
10
+ if @redirect.save
11
+ render json: @redirect, root: false
12
+ else
13
+ render json: @redirect.to_json(methods: :errors), status: :unprocessable_entity
14
+ end
15
+ end
16
+
17
+ def update
18
+ @redirect = Redirect.find(params[:id])
19
+ if @redirect.update(redirect_params)
20
+ render json: @redirect, root: false
21
+ else
22
+ render json: @redirect.to_json(methods: :errors), status: :unprocessable_entity
23
+ end
24
+ end
25
+
26
+ def destroy
27
+ @redirect = Redirect.find(params[:id])
28
+ @redirect.destroy
29
+ render json: @redirect, root: false
30
+ end
31
+
32
+ protected
33
+
34
+ def redirect_params
35
+ params.require(:redirect).permit!
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,4 @@
1
+ module KmsSeo
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Kms
2
+ class Redirect < ActiveRecord::Base
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module Kms
2
+ class RedirectSerializer < ActiveModel::Serializer
3
+ attributes :id, :source, :destination
4
+ end
5
+ end
@@ -0,0 +1,31 @@
1
+ xml.instruct!
2
+ xml.urlset "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9" do
3
+
4
+ xml.url do
5
+ xml.loc site_url
6
+ xml.priority 1.0
7
+ end
8
+
9
+ @pages.each do |page|
10
+ unless page.index?
11
+ if page.templatable?
12
+ page.fetch_items.each do |c|
13
+ if c.slug.present?
14
+ xml.url do
15
+ xml.loc public_page_url(c)
16
+ xml.lastmod c.updated_at.to_date.to_s('%Y-%m-%d')
17
+ xml.priority 0.9
18
+ end
19
+ end
20
+ end
21
+ else
22
+ xml.url do
23
+ xml.loc public_page_url(page)
24
+ xml.lastmod page.updated_at.to_date.to_s('%Y-%m-%d')
25
+ xml.priority 0.9
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>KmsSeo</title>
5
+ <%= stylesheet_link_tag "kms_seo/application", media: "all" %>
6
+ <%= javascript_include_tag "kms_seo/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,10 @@
1
+ Kms::ExternalsRegistry.register(:seo) do |request, controller|
2
+ page = Kms::ExternalsRegistry.externals[:page].call(request, controller)
3
+ return nil unless page
4
+ if page.source.templatable?
5
+ item = page.source.fetch_item!(File.basename(request.params[:path]))
6
+ Kms::SeoWrapper.new(item).to_drop
7
+ else
8
+ Kms::SeoWrapper.new(page.source).to_drop
9
+ end
10
+ end
@@ -0,0 +1 @@
1
+ Kms::FormCustomizationService.register_templates(Kms::Page, 'seo')
@@ -0,0 +1 @@
1
+ Kms::ResourceService.register(:seo, Kms::Redirect, 'fa-arrow-right')
@@ -0,0 +1,18 @@
1
+ en:
2
+ seo: "SEO"
3
+ add_redirect: "Add Redirect"
4
+ activerecord:
5
+ models:
6
+ kms/redirect:
7
+ one: "Redirect"
8
+ few: "Redirects"
9
+ many: "Redirects"
10
+ other: "Redirects"
11
+ attributes:
12
+ kms/page:
13
+ seo_title: "Meta Title"
14
+ seo_keywords: "Meta Keywords"
15
+ seo_description: "Meta Description"
16
+ kms/redirect:
17
+ source: "Source/From"
18
+ destination: "Destination/To"
@@ -0,0 +1,18 @@
1
+ ru:
2
+ seo: "SEO"
3
+ add_redirect: "Добавить редирект"
4
+ activerecord:
5
+ models:
6
+ kms/redirect:
7
+ one: "Редирект"
8
+ few: "Редиректа"
9
+ many: "Редиректов"
10
+ other: "Редиректы"
11
+ attributes:
12
+ kms/page:
13
+ seo_title: "Meta Title"
14
+ seo_keywords: "Meta Keywords"
15
+ seo_description: "Meta Description"
16
+ kms/redirect:
17
+ source: "Откуда"
18
+ destination: "Куда"
@@ -0,0 +1,8 @@
1
+ Kms::Seo::Engine.routes.draw do
2
+ constraints(format: "json") do
3
+ resources :redirects, format: true
4
+ end
5
+ end
6
+ Rails.application.routes.draw do
7
+ get '/sitemap.xml' => 'kms/public/sitemaps#show', format: 'xml'
8
+ end
@@ -0,0 +1,7 @@
1
+ class AddSeoFieldsToPages < ActiveRecord::Migration
2
+ def change
3
+ add_column :kms_pages, :seo_title, :string
4
+ add_column :kms_pages, :seo_keywords, :string
5
+ add_column :kms_pages, :seo_description, :string
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ class CreateRedirects < ActiveRecord::Migration
2
+ def change
3
+ create_table :kms_redirects do |t|
4
+ t.string :source
5
+ t.string :destination
6
+
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,15 @@
1
+ module KmsSeo
2
+ class InstallGenerator < Rails::Generators::Base
3
+ source_root File.expand_path('../../../../../', __FILE__)
4
+
5
+ def insert_engine_routes
6
+ route %(
7
+ mount Kms::Seo::Engine => '/kms'
8
+ )
9
+ end
10
+
11
+ def insert_javascript
12
+ append_file "app/assets/javascripts/application.js", "//= require kms_seo/application\n"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module Kms
2
+ class SeoWrapperDrop < Liquor::Drop
3
+ attributes :title, :keywords, :description
4
+ end
5
+ end
@@ -0,0 +1,14 @@
1
+ module Kms
2
+ module Seo
3
+ class Engine < ::Rails::Engine
4
+ engine_name 'kms_seo'
5
+ isolate_namespace Kms::Seo
6
+ config.eager_load_paths += Dir["#{config.root}/lib/**/"]
7
+ config.to_prepare do
8
+ Dir.glob(File.join(File.dirname(__FILE__), "../../../app/**/*_decorator*.rb")) do |c|
9
+ require_dependency(c)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ module Kms
2
+ module Seo
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,25 @@
1
+ # SEO Wrapper for page or entry
2
+ module Kms
3
+ class SeoWrapper
4
+ include Liquor::Dropable
5
+
6
+ def initialize(seo_context)
7
+ @seo_context = seo_context
8
+ end
9
+
10
+ def title
11
+ return nil unless @seo_context.respond_to?(:seo_title)
12
+ @seo_context.seo_title
13
+ end
14
+
15
+ def keywords
16
+ return nil unless @seo_context.respond_to?(:seo_keywords)
17
+ @seo_context.seo_keywords
18
+ end
19
+
20
+ def description
21
+ return nil unless @seo_context.respond_to?(:seo_description)
22
+ @seo_context.seo_description
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,6 @@
1
+ require "kms/seo/engine"
2
+
3
+ module Kms
4
+ module Seo
5
+ end
6
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :kms_seo do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,10 @@
1
+ require 'test_helper'
2
+
3
+ class NavigationTest < ActionDispatch::IntegrationTest
4
+ fixtures :all
5
+
6
+ # test "the truth" do
7
+ # assert true
8
+ # end
9
+ end
10
+
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class KmsSeoTest < ActiveSupport::TestCase
4
+ test "truth" do
5
+ assert_kind_of Module, KmsSeo
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../../test/dummy/config/environment.rb", __FILE__)
5
+ ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
6
+ ActiveRecord::Migrator.migrations_paths << File.expand_path('../../db/migrate', __FILE__)
7
+ require "rails/test_help"
8
+
9
+ # Filter out Minitest backtrace while allowing backtrace from other libraries
10
+ # to be shown.
11
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
12
+
13
+ # Load support files
14
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
15
+
16
+ # Load fixtures from the engine
17
+ if ActiveSupport::TestCase.respond_to?(:fixture_path=)
18
+ ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
19
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kms_seo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Igor Petrov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-12-29 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: 5.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 5.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: kms
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: sqlite3
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Adds SEO support to KMS
56
+ email:
57
+ - garik.piton@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - MIT-LICENSE
63
+ - README.md
64
+ - Rakefile
65
+ - app/assets/javascripts/kms_seo/application.js
66
+ - app/assets/javascripts/kms_seo/application/controllers/redirects_controller.coffee.erb
67
+ - app/assets/javascripts/kms_seo/application/routes.coffee.erb
68
+ - app/assets/javascripts/templates/pages/seo.html.slim
69
+ - app/assets/javascripts/templates/redirects/index.html.slim
70
+ - app/assets/stylesheets/kms_seo/application.css
71
+ - app/controllers/kms/pages_controller_decorator.rb
72
+ - app/controllers/kms/public/pages_controller_decorator.rb
73
+ - app/controllers/kms/public/sitemaps_controller.rb
74
+ - app/controllers/kms/seo/redirects_controller.rb
75
+ - app/helpers/kms_seo/application_helper.rb
76
+ - app/models/kms/redirect.rb
77
+ - app/serializers/kms/redirect_serializer.rb
78
+ - app/views/kms/public/sitemaps/show.xml.builder
79
+ - app/views/layouts/kms_seo/application.html.erb
80
+ - config/initializers/externals.rb
81
+ - config/initializers/form_customizations.rb
82
+ - config/initializers/resources.rb
83
+ - config/locales/en.yml
84
+ - config/locales/ru.yml
85
+ - config/routes.rb
86
+ - db/migrate/20150727192219_add_seo_fields_to_pages.rb
87
+ - db/migrate/20150903135219_create_redirects.rb
88
+ - lib/generators/kms_seo/install/install_generator.rb
89
+ - lib/kms/drops/seo_wrapper_drop.rb
90
+ - lib/kms/seo/engine.rb
91
+ - lib/kms/seo/version.rb
92
+ - lib/kms/seo_wrapper.rb
93
+ - lib/kms_seo.rb
94
+ - lib/tasks/kms_seo_tasks.rake
95
+ - test/integration/navigation_test.rb
96
+ - test/kms_seo_test.rb
97
+ - test/test_helper.rb
98
+ homepage: http://webgradus.ru
99
+ licenses:
100
+ - MIT
101
+ metadata: {}
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubyforge_project:
118
+ rubygems_version: 2.5.1
119
+ signing_key:
120
+ specification_version: 4
121
+ summary: Adds SEO support to KMS
122
+ test_files:
123
+ - test/integration/navigation_test.rb
124
+ - test/kms_seo_test.rb
125
+ - test/test_helper.rb