metanol 0.0.4 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,114 +1,88 @@
1
- require File.join(File.dirname(__FILE__), 'meta/base')
2
- require File.join(File.dirname(__FILE__), 'meta/main')
3
- require File.join(File.dirname(__FILE__), 'meta/open_graph')
4
- require File.join(File.dirname(__FILE__), 'meta/webmaster')
5
1
  require 'active_support/dependencies'
6
2
 
7
3
  module Metanol
8
-
9
4
  # Engine's controller which has all methods for storing and processing meta tag's data
10
5
  module EngineController
11
6
  extend ActiveSupport::Concern
12
7
 
13
- module ClassMethods
14
- def metanol_options
15
- @@metanol_options ||= {}
16
- end
17
-
18
- def meta(*args)
19
- add_meta_tag(:main, *args)
20
- end
21
-
22
- def og_meta(*args)
23
- add_meta_tag(:og, *args)
24
- end
25
-
26
- def wm_meta(*args)
27
- add_meta_tag(:wm, *args)
28
- end
8
+ included do
9
+ before_action :clear_metanols
10
+ end
29
11
 
30
- def get_meta(name)
31
- get_meta_by_type(:main, name)
12
+ module ClassMethods
13
+ def common_metanols
14
+ @@common_metanols ||= {}
32
15
  end
33
16
 
34
- def get_og_meta(name)
35
- get_meta_by_type(:og, name)
36
- end
17
+ SUPPORT_GROUPS.keys.each do |method|
18
+ method_name = "#{method == :main ? '' : "#{method}_"}meta"
19
+ define_method method_name do |*args|
20
+ add_meta_tag(common_metanols, method, *args)
21
+ end
37
22
 
38
- def get_wm_meta(name)
39
- get_meta_by_type(:wm, name)
23
+ get_method_name = "get_#{method_name}"
24
+ define_method get_method_name do |name|
25
+ get_meta_tag(common_metanols, method, name)
26
+ end
40
27
  end
41
28
 
42
29
  private
43
30
 
44
- def add_meta_tag(type, *args)
31
+ def add_meta_tag(repo, type, *args)
45
32
  if args[0].is_a? Hash
46
33
  filters = args[1..-1]
47
34
  args[0].each do |name, value|
48
- add_meta_by_type type, name, value, filters
35
+ add_meta_by_type repo, type, name, value, filters
49
36
  end
50
37
  else
51
38
  name = args[0].to_sym
52
39
  value = args[1]
53
40
  filters = args[2..-1]
54
- add_meta_by_type type, name, value, filters
41
+ add_meta_by_type repo, type, name, value, filters
55
42
  end
56
43
  end
57
44
 
58
- def add_meta_by_type(type, name, value, filters=[])
59
- data = meta_data(name)[type]
60
- key = data[:key]
61
- if metanol_options.key? key
62
- metanol_options[key].value = value
63
- metanol_options[key].filters = filters
64
- else
65
- metanol_options[key] = data[:type].new(name, value, filters)
45
+ def add_meta_by_type(repo, type, name, value, filters = [])
46
+ meta_class = SUPPORT_GROUPS[type]
47
+ key = get_meta_key(type, name)
48
+ unless repo.key? key
49
+ repo[key] = meta_class.new(name, value, filters)
50
+ return
66
51
  end
52
+ repo[key].value = value
53
+ repo[key].filters = filters
67
54
  end
68
55
 
69
- def get_meta_by_type(type, name)
70
- data = meta_data(name)[type]
71
- key = data[:key]
72
- metanol_options.key?(key) ? metanol_options[key].value : nil
56
+ def get_meta_tag(repo, type, name)
57
+ key = get_meta_key(type, name)
58
+ repo.key?(key) ? repo[key].value : nil
73
59
  end
74
60
 
75
- def meta_data(name)
76
- {
77
- main: { key: name, type: Meta::Main },
78
- og: { key: "og:#{name}", type: Meta::OpenGraph },
79
- wm: { key: "wm:#{name}", type: Meta::Webmaster }
80
- }
61
+ def get_meta_key(type, name)
62
+ "#{type}:#{name}"
81
63
  end
82
64
  end
83
65
 
84
- def meta(*args)
85
- self.class.meta(*args)
86
- end
87
-
88
- def og_meta(*args)
89
- self.class.og_meta(*args)
90
- end
91
-
92
- def wm_meta(*args)
93
- self.class.wm_meta(*args)
94
- end
66
+ SUPPORT_GROUPS.keys.each do |method|
67
+ method_name = "#{method == :main ? '' : "#{method}_"}meta"
68
+ define_method method_name do |*args|
69
+ self.class.send 'add_meta_tag', action_metanols, method, *args
70
+ end
95
71
 
96
- def metanol_options
97
- self.class.metanol_options
72
+ get_method_name = "get_#{method_name}"
73
+ define_method get_method_name do |name|
74
+ self.class.send 'get_meta_tag', action_metanols, method, name
75
+ end
98
76
  end
99
77
 
100
- def get_meta(name)
101
- self.class.get_meta name
78
+ def action_metanols
79
+ @action_metanols ||= {}
102
80
  end
103
81
 
104
- def get_og_meta(name)
105
- self.class.get_og_meta name
106
- end
82
+ private
107
83
 
108
- def get_wm_meta(name)
109
- self.class.get_wm_meta name
84
+ def clear_metanols
85
+ @action_metanols = {}
110
86
  end
111
-
112
87
  end
113
-
114
- end
88
+ end
@@ -1,29 +1,34 @@
1
1
  module Metanol
2
2
  module Helpers
3
-
4
3
  # Render all meta tags
5
4
  def metanol_tags
6
- result = metanol_main_tags
7
- result << metanol_og_tags
8
- result << metanol_wm_tags
9
- result
5
+ result = ''
6
+ SUPPORT_GROUPS.keys.each do |type|
7
+ result << send("metanol_#{type}_tags")
8
+ end
9
+ result.html_safe
10
10
  end
11
11
 
12
12
  # Render OpenGraph meta tags
13
13
  def metanol_og_tags
14
14
  result = metanol_render_tags ::Metanol::Meta::OpenGraph
15
- result << ::Metanol::Meta::OpenGraph.render_current_url(current_url).html_safe
16
- result
15
+ result << ::Metanol::Meta::OpenGraph.render_current_url(current_url)
16
+ result.html_safe
17
17
  end
18
18
 
19
- # Render Webmaster verification tags
20
- def metanol_wm_tags
21
- metanol_render_tags ::Metanol::Meta::Webmaster
22
- end
19
+ SUPPORT_GROUPS.keys.each do |method|
20
+ get_method_name = "get_#{method == :main ? '' : "#{method}_"}meta"
21
+ define_method get_method_name do |name|
22
+ controller.__send__(get_method_name, name)
23
+ end
23
24
 
24
- # Render main tags, such as keywords, description, etc.
25
- def metanol_main_tags
26
- metanol_render_tags ::Metanol::Meta::Main
25
+ next if method == :og
26
+
27
+ method_name = "metanol_#{method}_tags"
28
+ class_type = SUPPORT_GROUPS[method]
29
+ define_method method_name do
30
+ metanol_render_tags(class_type).html_safe
31
+ end
27
32
  end
28
33
 
29
34
  # Return a current URL
@@ -31,28 +36,17 @@ module Metanol
31
36
  request.original_url
32
37
  end
33
38
 
34
- def get_meta(name)
35
- self.controller.get_meta(name)
36
- end
37
-
38
- def get_og_meta(name)
39
- self.controller.get_og_meta(name)
40
- end
41
-
42
- def get_wm_meta(name)
43
- self.controller.get_wm_meta(name)
44
- end
45
-
46
39
  private
47
40
 
48
41
  def metanol_render_tags(type)
49
- result = ""
50
- self.controller.metanol_options.each_value do |value|
42
+ result = ''
43
+ metanols = controller.class.common_metanols.merge(controller.action_metanols)
44
+ metanols.each_value do |value|
51
45
  next unless value.is_a? type
46
+
52
47
  result << value.render
53
48
  end
54
- result.html_safe
49
+ result
55
50
  end
56
-
57
51
  end
58
- end
52
+ end
@@ -1,75 +1,100 @@
1
- module Metanol::Meta
1
+ # frozen_string_literal: true
2
2
 
3
- class Base
4
- attr_reader :name
5
- attr_accessor :value
3
+ module Metanol
4
+ module Meta
5
+ class Base
6
+ ERR_FILTERS_WRONG_TYPE = 'The <filters> parameter must be an Array.'
7
+ ERR_FILTERS_WRONG_VALUE_TYPE =
8
+ 'The <filters> parameter must include only string or symbol values.'
9
+ SUPPORTED_FILTERS = %i[html overspaces whitespaces clean].freeze
6
10
 
7
- SUPPORTED_FILTERS = [:html, :overspaces, :whitespaces, :clean]
11
+ attr_writer :value
12
+ attr_reader :name
8
13
 
9
- def initialize(name, value, filters=[])
10
- raise NameError.new "The meta tag '#{name}' isn't supported.", name unless valid?(name)
11
- @name = name
12
- @value = value
13
- self.filters = filters
14
- end
14
+ def initialize(name, value, filters = [])
15
+ @name = name.to_sym
16
+ raise(NameError.new("The meta tag '#{@name}' isn't supported.", @name)) unless valid?(@name)
15
17
 
16
- def filters=(value)
17
- @filters = validate_filters(value)
18
- end
18
+ @value = value
19
+ self.filters = filters
20
+ end
19
21
 
20
- def render
21
- raise StandardError.new "Please override this method in a child class"
22
- end
22
+ def filters=(value)
23
+ @filters = validate_filters(value)
24
+ end
23
25
 
24
- def self.filter_html(text)
25
- text = text.gsub(/\<br\/?\>/, ' ')
26
- text.gsub(/\<\/?\w+\/?\>/, '')
27
- end
26
+ def render
27
+ result = value
28
+ return '' if result.blank?
28
29
 
29
- def self.filter_overspaces(text)
30
- text.gsub(/[\ ]{2,}/, ' ')
31
- end
30
+ "<meta #{attr_name}=\"#{name}\" #{attr_value}=\"#{result}\" />"
31
+ end
32
32
 
33
- def self.filter_whitespaces(text)
34
- text.gsub(/\s/, ' ')
35
- end
33
+ def value
34
+ result = @value
35
+ return result if @filters.blank?
36
36
 
37
- protected
37
+ filter_overspaces(filter_whitespaces(filter_html_tags(result)))
38
+ end
38
39
 
39
- def valid?(name)
40
- true
41
- end
40
+ def self.filter_html(text)
41
+ text = text.gsub(%r{<br/?>}, ' ')
42
+ text.gsub(%r{</?\w+/?>}, '')
43
+ end
42
44
 
43
- def filtered_value
44
- result = @value
45
- return result unless filters?
46
- result = self.class.filter_html(result) if @filters.include?(:html) || @filters.include?(:clean)
47
- result = self.class.filter_whitespaces(result) if @filters.include?(:whitespaces) || @filters.include?(:clean)
48
- result = self.class.filter_overspaces(result) if @filters.include?(:overspaces) || @filters.include?(:clean)
49
- result
50
- end
45
+ def self.filter_overspaces(text)
46
+ text.gsub(/\ {2,}/, ' ')
47
+ end
51
48
 
52
- def filters?
53
- @filters && !@filters.empty?
54
- end
49
+ def self.filter_whitespaces(text)
50
+ text.gsub(/\s/, ' ')
51
+ end
52
+
53
+ private
55
54
 
56
- private
55
+ def valid?(_name)
56
+ true
57
+ end
58
+
59
+ def attr_name
60
+ 'name'
61
+ end
62
+
63
+ def attr_value
64
+ 'content'
65
+ end
57
66
 
58
- def validate_filters(filters=[])
59
- result = []
60
- raise StandardError.new("The filters parameter must be an Array.") unless filters.is_a?(Array)
61
- begin
62
- filters.each do |filter|
63
- filter_value = filter.to_sym
64
- StandardError.new("Only #{SUPPORTED_FILTERS.join(', ')} filters are supported.") unless SUPPORTED_FILTERS.include? filter_value
65
- result << filter_value
67
+ def validate_filters(filters = [])
68
+ result = []
69
+ raise StandardError, ERR_FILTERS_WRONG_TYPE unless filters.is_a?(Array)
70
+
71
+ begin
72
+ filters.map(&:to_sym).each do |filter_value|
73
+ result << validate_filter(filter_value)
74
+ end
75
+ rescue NoMethodError
76
+ raise StandardError, ERR_FILTERS_WRONG_VALUE_TYPE
66
77
  end
67
- rescue NoMethodError
68
- raise StandardError.new("The filters parameter must includes only string or symbol values.")
78
+ result
69
79
  end
70
- result
71
- end
72
80
 
73
- end
81
+ def validate_filter(filter_value)
82
+ return filter_value if SUPPORTED_FILTERS.include? filter_value
74
83
 
75
- end
84
+ raise(StandardError, "Only #{SUPPORTED_FILTERS.join(', ')} filters are supported.")
85
+ end
86
+
87
+ def filter_html_tags(result)
88
+ (@filters & %i[html clean]).presence ? self.class.filter_html(result) : result
89
+ end
90
+
91
+ def filter_whitespaces(result)
92
+ (@filters & %i[whitespaces clean]).presence ? self.class.filter_whitespaces(result) : result
93
+ end
94
+
95
+ def filter_overspaces(result)
96
+ (@filters & %i[overspaces clean]).presence ? self.class.filter_overspaces(result) : result
97
+ end
98
+ end
99
+ end
100
+ end
@@ -1,10 +1,13 @@
1
- module Metanol::Meta
1
+ # frozen_string_literal: true
2
2
 
3
- class Main < Base
4
- def render
5
- return "<title>#{filtered_value}</title>" if @name == :title
6
- "<meta name=\"#{@name}\" content=\"#{filtered_value}\" />"
3
+ module Metanol
4
+ module Meta
5
+ class Main < Base
6
+ def render
7
+ return (value.present? ? "<title>#{value}</title>" : '') if @name == :title
8
+
9
+ super
10
+ end
7
11
  end
8
12
  end
9
-
10
- end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Metanol
4
+ module Meta
5
+ class MicroData < Base
6
+ protected
7
+
8
+ def attr_name
9
+ 'itemprop'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,13 +1,23 @@
1
- module Metanol::Meta
1
+ # frozen_string_literal: true
2
2
 
3
- class OpenGraph < Base
4
- def render
5
- "<meta property=\"og:#{@name}\" content=\"#{filtered_value}\" />"
6
- end
3
+ module Metanol
4
+ module Meta
5
+ class OpenGraph < Base
6
+ def self.render_current_url(url)
7
+ return '' if url.blank?
8
+
9
+ "<meta property=\"og:url\" content=\"#{url}\" />"
10
+ end
11
+
12
+ def name
13
+ "og:#{@name}"
14
+ end
7
15
 
8
- def self.render_current_url(url)
9
- "<meta property=\"og:url\" content=\"#{url}\" />"
16
+ protected
17
+
18
+ def attr_name
19
+ 'property'
20
+ end
10
21
  end
11
22
  end
12
-
13
- end
23
+ end
@@ -1,22 +1,24 @@
1
- module Metanol::Meta
2
- class Webmaster < Base
1
+ # frozen_string_literal: true
3
2
 
4
- SUPPORT_TAGS = {
5
- yandex: 'yandex-verification',
6
- google: 'google-site-verification',
3
+ module Metanol
4
+ module Meta
5
+ class Webmaster < Base
6
+ SUPPORT_TAGS = {
7
7
  bing: 'msvalidate.01',
8
- alexa: 'alexaVerifyID'
9
- }
8
+ alexa: 'alexaVerifyID',
9
+ yandex: 'yandex-verification',
10
+ google: 'google-site-verification'
11
+ }.freeze
10
12
 
11
- def render
12
- "<meta name=\"#{SUPPORT_TAGS[@name]}\" content=\"#{filtered_value}\" />"
13
- end
13
+ def name
14
+ SUPPORT_TAGS[@name]
15
+ end
14
16
 
15
- protected
17
+ protected
16
18
 
17
- def valid?(name)
18
- !SUPPORT_TAGS[name.to_sym].nil?
19
+ def valid?(name)
20
+ SUPPORT_TAGS[name].present?
21
+ end
19
22
  end
20
-
21
23
  end
22
- end
24
+ end
@@ -1,8 +1,8 @@
1
1
  module Metanol
2
- class Railtie < ::Rails::Railtie #:nodoc:
3
- initializer 'metanolize' do |app|
4
- ::ActionView::Base.send :include, Metanol::Helpers
5
- ::ActionController::Base.send :include, Metanol::EngineController
2
+ class Railtie < ::Rails::Railtie # :nodoc:
3
+ initializer 'metanolize' do |_app|
4
+ ::ActionView::Base.include Metanol::Helpers
5
+ ::ActionController::Base.include Metanol::EngineController
6
6
  end
7
7
  end
8
- end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Metanol
2
+ SUPPORT_GROUPS = {
3
+ main: Meta::Main,
4
+ og: Meta::OpenGraph,
5
+ wm: Meta::Webmaster,
6
+ md: Meta::MicroData
7
+ }.freeze
8
+ end
@@ -1,3 +1,3 @@
1
1
  module Metanol
2
- VERSION = "0.0.4"
2
+ VERSION = '0.0.9'.freeze
3
3
  end
data/lib/metanol.rb CHANGED
@@ -2,6 +2,13 @@ require 'metanol/version'
2
2
 
3
3
  require 'rails'
4
4
 
5
+ require 'metanol/meta/base'
6
+ require 'metanol/meta/main'
7
+ require 'metanol/meta/open_graph'
8
+ require 'metanol/meta/webmaster'
9
+ require 'metanol/meta/micro_data'
10
+
11
+ require 'metanol/support'
5
12
  require 'metanol/helpers'
6
13
  require 'metanol/engine_controller'
7
14
  require 'metanol/railtie'
data/metanol.gemspec CHANGED
@@ -1,26 +1,44 @@
1
- # -*- encoding: utf-8 -*-
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'metanol/version'
5
6
 
6
- Gem::Specification.new do |gem|
7
- gem.name = "metanol"
8
- gem.version = Metanol::VERSION
9
- gem.platform = Gem::Platform::RUBY
10
- gem.authors = ["Eugene Kondratyuk"]
11
- gem.email = ["ekondr@gmail.com"]
12
- gem.description = %q{This is a meta tags plugin which helps to manage meta tags in your Rails application. It supports some OpenGraph meta tags, Webmaster's meta tags (such as Google, Bing, Yandex, Alexa verification meta tags) and other standard HTML meta tags (such as a description). It can be used by Rails 3.2+ applications}
13
- gem.summary = %q{A meta tags engine plugin for Rails 3.2+ applications}
14
- gem.homepage = "https://github.com/ekondr/metanol"
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'metanol'
9
+ spec.version = Metanol::VERSION
10
+ spec.authors = ['Yevhen Kondratiuk']
11
+ spec.email = ['ekondr@gmail.com']
15
12
 
16
- gem.rubyforge_project = 'metanol'
13
+ spec.summary = '<META> tags engine plugin for Ruby on Rails applications'
14
+ spec.description = 'This is a meta tags plugin which helps to manage meta tags in '\
15
+ 'your Rails application. It supports some OpenGraph meta tags, '\
16
+ "Webmaster's meta tags (such as Google, Bing, Yandex, Alexa "\
17
+ 'verification tags), MicroData meta tags and other standard '\
18
+ 'HTML meta tags (such as a <description>, <title> etc). It can be used by '\
19
+ 'Rails 3.2+ applications.'
20
+ spec.homepage = 'https://github.com/ekondr/metanol'
21
+ spec.license = 'MIT'
17
22
 
18
- gem.files = `git ls-files`.split($/)
19
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
20
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
21
- gem.require_paths = ["lib"]
23
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
24
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
25
+ spec.respond_to?(:metadata) ||
26
+ raise('RubyGems 2.0 or newer is required to protect against public gem pushes.')
22
27
 
23
- gem.licenses = ['MIT']
28
+ # Specify which files should be added to the gem when it is released.
29
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
30
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
31
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
32
+ end
33
+ spec.bindir = 'bin'
34
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
35
+ spec.require_paths = ['lib']
36
+ spec.required_ruby_version = '>= 2.3'
24
37
 
25
- gem.add_dependency "rails", "~> 3.2"
38
+ spec.add_dependency 'rails', '>= 6.0'
39
+ spec.add_development_dependency 'capybara', '>= 0'
40
+ spec.add_development_dependency 'pry-byebug'
41
+ spec.add_development_dependency 'rspec', '>= 3.0'
42
+ spec.add_development_dependency 'rspec-rails', '>= 5.0'
43
+ spec.add_development_dependency 'sqlite3', '>= 0'
26
44
  end