seory 0.0.4 → 0.1.0
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 +4 -4
- data/.travis.yml +2 -0
- data/Gemfile +1 -0
- data/README.md +20 -17
- data/lib/seory.rb +25 -4
- data/lib/seory/condition.rb +29 -0
- data/lib/seory/{page_condition/block_condition.rb → condition/block.rb} +2 -2
- data/lib/seory/condition/build_dsl.rb +19 -0
- data/lib/seory/{page_condition/params_condition.rb → condition/params.rb} +2 -2
- data/lib/seory/{page_condition/path_condition.rb → condition/path.rb} +2 -2
- data/lib/seory/{page_condition/slug_condition.rb → condition/slug.rb} +5 -3
- data/lib/seory/dsl.rb +12 -49
- data/lib/seory/dsl/descriptor.rb +29 -0
- data/lib/seory/dsl/page_builder.rb +35 -0
- data/lib/seory/page.rb +53 -0
- data/lib/seory/page_group.rb +15 -0
- data/lib/seory/rails_helper.rb +7 -0
- data/lib/seory/railtie.rb +11 -0
- data/lib/seory/repository.rb +40 -6
- data/lib/seory/runtime.rb +13 -6
- data/lib/seory/version.rb +1 -1
- data/seory.gemspec +1 -0
- data/spec/seory/{page_condition/path_condition_spec.rb → condition/path_spec.rb} +3 -3
- data/spec/seory/condition/slug_spec.rb +18 -0
- data/spec/seory/dsl_spec.rb +23 -5
- data/spec/seory/{page_contents_spec.rb → page_spec.rb} +12 -12
- data/spec/seory/rails_helper_spec.rb +62 -0
- data/spec/seory/repository_spec.rb +103 -0
- data/spec/seory/runtime_spec.rb +25 -6
- data/spec/spec_helper.rb +8 -0
- data/spec/support/controller_double.rb +37 -0
- data/spec/support/testing_dsl.rb +7 -0
- data/spec/support/view_context_double.rb +13 -0
- metadata +44 -14
- data/lib/seory/page_condition.rb +0 -32
- data/lib/seory/page_condition/build_dsl.rb +0 -19
- data/lib/seory/page_condition/default_condition.rb +0 -10
- data/lib/seory/page_contents.rb +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 679ed7e93f25e0539660873f3b4ad92d89327082
|
4
|
+
data.tar.gz: 514f420b0f775555ee3d736120aa7c4a898e1bd1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66e97190536b1dd87c7b3396a9d3c93e23da823530965565e399266d2a9f8680c358f1b00ec7ed19a8da1687902d2403ac4ef46c96e5119fb50f563368a2b19e
|
7
|
+
data.tar.gz: 50eb55d2c9df67fd68c8c2fb0e6b6271a96b32cda1dedac10a09fd6e0e6f3e61704594f3e46b125f1076640786d5f9225088e7af5190fac436caa9034dca4ac1
|
data/.travis.yml
CHANGED
@@ -3,6 +3,8 @@ rvm:
|
|
3
3
|
- 1.9.3
|
4
4
|
- 2.0.0
|
5
5
|
- 2.1
|
6
|
+
env:
|
7
|
+
- secure: "d3P4g1NRNxoCuhCHaqpNI6Khe6d/5jYpR0VJoxAvw5n2c46KuMn91IMTmTAF73vb7n8kQAXA347x53KBdgsBlmm6upaBKG8NrWiLgO16frTlmtUf1ng6VZzM3vqQjjo1YZLhM+kk3AoXgqZsSMwfgOo9BFQj6fYRwlveuJ+vrVM="
|
6
8
|
notifications:
|
7
9
|
webhooks:
|
8
10
|
- https://idobata.io/hook/061179f9-4f3c-4c8c-bdf9-4efa9821c5c5
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# seory
|
2
2
|
|
3
|
+
[](https://travis-ci.org/esminc/seory)
|
4
|
+
[](https://codeclimate.com/github/esminc/seory)
|
5
|
+
|
3
6
|
Manage SEO contents in Rails app. based on controller, action and more complex context.
|
4
7
|
|
5
8
|
## Installation
|
@@ -22,19 +25,19 @@ Specify SEO content as ruby code. For example, `config/initializers/seory.rb`
|
|
22
25
|
|
23
26
|
```ruby
|
24
27
|
# Specify SEO content based on `controller#action` rule
|
25
|
-
match *%w[products#popular products#new_release]
|
26
|
-
title
|
27
|
-
|
28
|
+
match *%w[products#popular products#new_release] do
|
29
|
+
title 'Great products | My Great Site[MGS]'
|
30
|
+
meta_description 'A lot of great products'
|
28
31
|
|
29
|
-
|
32
|
+
meta_keywords %w[Software Internet Service].join(',')
|
30
33
|
|
31
|
-
h1
|
32
|
-
|
34
|
+
h1 'Most popular products'
|
35
|
+
end
|
33
36
|
|
34
37
|
# Can contain dynamic content based on controller using assigned ivar
|
35
|
-
match slug('brands#show')
|
36
|
-
title {
|
37
|
-
|
38
|
+
match slug('brands#show') do
|
39
|
+
title { assigns(:brand).name }
|
40
|
+
end
|
38
41
|
|
39
42
|
# Match with request fullpath
|
40
43
|
match path('/products/special-product') do
|
@@ -43,26 +46,26 @@ end
|
|
43
46
|
|
44
47
|
# Custom lookup rule with controller
|
45
48
|
match(->(controller) { controller.params[:page].to_i == 1 }) do
|
46
|
-
|
47
|
-
search =
|
49
|
+
meta_keywords do
|
50
|
+
search = assigns(:search_object)
|
48
51
|
|
49
52
|
# do something
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
53
56
|
# Use custom word part
|
54
|
-
match slug(products#index) do
|
57
|
+
match slug('products#index') do
|
55
58
|
misc(:page_name) { "#{controller.params[:page].to_i} page | Good products") }
|
56
59
|
|
57
|
-
title
|
58
|
-
h1
|
60
|
+
title :page_name
|
61
|
+
h1 :page_name
|
59
62
|
|
60
|
-
|
63
|
+
meta_description { "Page for #{page_name}" }
|
61
64
|
}
|
62
65
|
|
63
66
|
default do
|
64
|
-
title
|
65
|
-
h1
|
67
|
+
title 'My Great Service'
|
68
|
+
h1 { I18n.t("#{controller_name}.h1", scope: 'label.misc_pages' }
|
66
69
|
end
|
67
70
|
```
|
68
71
|
|
data/lib/seory.rb
CHANGED
@@ -1,10 +1,31 @@
|
|
1
|
-
require
|
1
|
+
require 'seory/version'
|
2
|
+
require 'seory/railtie' if defined?(Rails)
|
3
|
+
require 'active_support/all'
|
2
4
|
|
3
5
|
module Seory
|
4
6
|
CONTENTS = %w[title h1 h2 meta_description meta_keywords canonical_url og_image_url].map(&:to_sym)
|
5
7
|
|
6
|
-
class Error < RuntimeError
|
7
|
-
|
8
|
+
class Error < RuntimeError; end
|
9
|
+
|
10
|
+
autoload :Dsl,'seory/dsl'
|
11
|
+
|
12
|
+
mattr_accessor(:config_dir) { 'config/seory' }
|
13
|
+
self.config_dir = 'config/seory'
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def describe(*args, &block)
|
17
|
+
@object ||= Object.new.tap {|obj| obj.extend Seory::Dsl }
|
8
18
|
|
9
|
-
|
19
|
+
@object.describe(*args, &block)
|
20
|
+
end
|
21
|
+
alias seo_content describe
|
22
|
+
|
23
|
+
def helper(&block)
|
24
|
+
@object.helper(&block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def default_repository
|
28
|
+
@object.send(:seory_repository)
|
29
|
+
end
|
30
|
+
end
|
10
31
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'seory'
|
2
|
+
require 'seory/condition/block'
|
3
|
+
require 'seory/condition/params'
|
4
|
+
require 'seory/condition/path'
|
5
|
+
require 'seory/condition/slug'
|
6
|
+
|
7
|
+
module Seory
|
8
|
+
module Condition
|
9
|
+
class SupposionFailed < Seory::Error; end
|
10
|
+
extend self
|
11
|
+
|
12
|
+
def [](condition)
|
13
|
+
if condition.respond_to?(:match?)
|
14
|
+
condition
|
15
|
+
else
|
16
|
+
suppose(condition)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def suppose(condition)
|
23
|
+
condition_class = [Params, Slug].detect {|klass| klass.supposable?(condition) }
|
24
|
+
raise SupposionFailed.new(condition.inspect) unless condition_class
|
25
|
+
|
26
|
+
condition_class.new(condition)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Seory
|
2
|
-
module
|
3
|
-
class
|
2
|
+
module Condition
|
3
|
+
class Slug
|
4
4
|
def self.supposable?(condition_object)
|
5
5
|
controller, action = condition_object.to_s.split('#')
|
6
6
|
controller && action
|
@@ -14,8 +14,10 @@ module Seory
|
|
14
14
|
action_slug(controller) == @slug
|
15
15
|
end
|
16
16
|
|
17
|
+
private
|
18
|
+
|
17
19
|
def action_slug(controller)
|
18
|
-
[controller.
|
20
|
+
[controller.controller_path, controller.action_name].join('#')
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
data/lib/seory/dsl.rb
CHANGED
@@ -1,65 +1,28 @@
|
|
1
1
|
require 'seory'
|
2
|
-
require 'seory/page_contents'
|
3
|
-
require 'seory/page_condition/build_dsl'
|
4
2
|
require 'seory/repository'
|
5
3
|
|
6
4
|
module Seory
|
7
5
|
module Dsl
|
6
|
+
def describe(group_name = Repository.extract_label_from_trace(caller), &block)
|
7
|
+
seory_repository << Descriptor.new(group_name, seory_repository).describe(&block)
|
8
|
+
end
|
9
|
+
alias seo_content describe
|
8
10
|
|
9
|
-
def
|
10
|
-
|
11
|
-
Descriptor.new(@repository).describe(&block)
|
11
|
+
def helper(&block)
|
12
|
+
seory_repository.helper = Module.new(&block)
|
12
13
|
end
|
13
14
|
|
14
15
|
def lookup(controller)
|
15
|
-
|
16
|
+
seory_repository.lookup(controller)
|
16
17
|
end
|
17
18
|
|
18
|
-
|
19
|
-
def initialize(*conditions)
|
20
|
-
@page_contents =
|
21
|
-
if conditions.size == 1 && (block = conditions.first).is_a?(Proc)
|
22
|
-
PageContents.new(&block)
|
23
|
-
else
|
24
|
-
PageContents.new(*conditions)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def build!(&block)
|
29
|
-
instance_exec(&block)
|
30
|
-
|
31
|
-
@page_contents
|
32
|
-
end
|
19
|
+
private
|
33
20
|
|
34
|
-
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
Seory::CONTENTS.each do |name|
|
39
|
-
define_method(name) {|val = nil, &block| misc(name, val, &block) }
|
40
|
-
end
|
21
|
+
def seory_repository
|
22
|
+
@__seory_repository ||= Repository.new
|
41
23
|
end
|
42
24
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
def initialize(repository)
|
47
|
-
@repository = repository
|
48
|
-
end
|
49
|
-
|
50
|
-
def describe(&block)
|
51
|
-
instance_exec(&block)
|
52
|
-
|
53
|
-
@repository
|
54
|
-
end
|
55
|
-
|
56
|
-
def match(*conditions, &def_builder)
|
57
|
-
@repository << PageContentsBuilder.new(*conditions).build!(&def_builder)
|
58
|
-
end
|
59
|
-
|
60
|
-
def default(&def_builder)
|
61
|
-
match(:default, &def_builder)
|
62
|
-
end
|
63
|
-
end
|
25
|
+
autoload :PageBuilder, 'seory/dsl/page_builder'
|
26
|
+
autoload :Descriptor, 'seory/dsl/descriptor'
|
64
27
|
end
|
65
28
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'seory/page_group'
|
2
|
+
require 'seory/condition/build_dsl'
|
3
|
+
|
4
|
+
module Seory
|
5
|
+
module Dsl
|
6
|
+
class Descriptor
|
7
|
+
include Seory::Condition::BuildDsl
|
8
|
+
|
9
|
+
def initialize(group_name, repository)
|
10
|
+
@page_group = PageGroup.new(group_name)
|
11
|
+
@repository = repository
|
12
|
+
end
|
13
|
+
|
14
|
+
def describe(&block)
|
15
|
+
instance_exec(&block)
|
16
|
+
|
17
|
+
@page_group
|
18
|
+
end
|
19
|
+
|
20
|
+
def match(*conditions, &def_builder)
|
21
|
+
@page_group.add PageBuilder.new(*conditions).build!(&def_builder)
|
22
|
+
end
|
23
|
+
|
24
|
+
def default(&def_builder)
|
25
|
+
@page_group.default = PageBuilder.new(:default).build!(&def_builder)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'seory'
|
2
|
+
require 'seory/page'
|
3
|
+
|
4
|
+
module Seory
|
5
|
+
module Dsl
|
6
|
+
class PageBuilder
|
7
|
+
def initialize(*conditions)
|
8
|
+
@page_contents =
|
9
|
+
if conditions.size == 1 && (block = conditions.first).is_a?(Proc)
|
10
|
+
Page.new(&block)
|
11
|
+
else
|
12
|
+
Page.new(*conditions)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def build!(&block)
|
17
|
+
instance_exec(&block)
|
18
|
+
|
19
|
+
@page_contents
|
20
|
+
end
|
21
|
+
|
22
|
+
def misc(name, val = nil, &block)
|
23
|
+
@page_contents.define(name, val, &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
def assign_reader(*names)
|
27
|
+
@page_contents.assign_reader(*names)
|
28
|
+
end
|
29
|
+
|
30
|
+
Seory::CONTENTS.each do |name|
|
31
|
+
define_method(name) {|val = nil, &block| misc(name, val, &block) }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/seory/page.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'seory'
|
2
|
+
require 'seory/condition'
|
3
|
+
|
4
|
+
module Seory
|
5
|
+
class EmptyCondition < ::Seory::Error; end
|
6
|
+
class AccessorNameTaken < ::Seory::Error; end
|
7
|
+
|
8
|
+
class Page
|
9
|
+
|
10
|
+
attr_reader :assign_name_accessors
|
11
|
+
|
12
|
+
def initialize(*conditions, &block)
|
13
|
+
@conditions =
|
14
|
+
if block_given?
|
15
|
+
[Condition::Block.new(block)]
|
16
|
+
elsif conditions.first == :default
|
17
|
+
:default
|
18
|
+
else
|
19
|
+
conditions.map {|condition| Seory::Condition[condition] }
|
20
|
+
end
|
21
|
+
|
22
|
+
raise EmptyCondition if @conditions.blank?
|
23
|
+
|
24
|
+
@contents, @assign_name_accessors = {}, []
|
25
|
+
end
|
26
|
+
|
27
|
+
def define(name, value = nil, &block)
|
28
|
+
@contents[name] = block_given? ? block : value
|
29
|
+
end
|
30
|
+
|
31
|
+
def assign_reader(*assign_names)
|
32
|
+
if (taken = Seory::CONTENTS & assign_names).size > 0
|
33
|
+
raise AccessorNameTaken, taken.join(', ')
|
34
|
+
end
|
35
|
+
|
36
|
+
assign_name_accessors.concat(assign_names)
|
37
|
+
end
|
38
|
+
|
39
|
+
def content_for(name)
|
40
|
+
@contents[name]
|
41
|
+
end
|
42
|
+
|
43
|
+
def match?(controller)
|
44
|
+
return true if default?
|
45
|
+
|
46
|
+
@conditions.any? {|condition| condition.match?(controller) }
|
47
|
+
end
|
48
|
+
|
49
|
+
def default?
|
50
|
+
@conditions == :default
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|