page_meta 1.2.0 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6325d31942f9536c2a062706f746f49693cce7328d1c362009e822e80fa89a98
4
- data.tar.gz: 942c213fc64a1324345f6ec08eb09c6ca40aabb1331d6960f6e4fa4261a10a80
3
+ metadata.gz: 30f096278376e70c56074428c6ec88f786a6a1ac893a8da66829884efc9e34dc
4
+ data.tar.gz: 4d635e8a75a48be6acedd134df338e73085f0f7f8326143b9bcfc8436ffc12e0
5
5
  SHA512:
6
- metadata.gz: a7fd41a5e0f3639a91f70afd26936ad740ecdcabdceb604b4fb5750f973f3879a76dbe3326d6124c0e786cb09936c8a29cb95245c1c9c161132d7b54a2914144
7
- data.tar.gz: d7612bd88688c8ec272e3b2931e6b9d998458f0ef659a3f8697afd8ab0c380d0a2fe8269c8cea1fafafcb2df67c7e8e57e15e79c82a5a3f8a030b820131707bf
6
+ metadata.gz: 24cf0db7b385568fcc471bc390b85b3d6c5e24972c5d54bd0cce251f9ee1058f917c096534f4bccd7f66f220e9efdcfa3d87c75c4dbf9c0a3d6ac0afe576a758
7
+ data.tar.gz: bcdefe6bbc2b57010848b2466023b3f1da305e9d745715f2373aeac33c9bf2ff9220edfb9c298772d11dd49f443c7985f91a0c431156e7917009ca7505b1d9d2
@@ -19,12 +19,11 @@ jobs:
19
19
  strategy:
20
20
  fail-fast: false
21
21
  matrix:
22
- ruby: ["3.1", "3.2", "3.3"]
22
+ ruby: ["3.2", "3.3", "3.4"]
23
23
  gemfile:
24
24
  - Gemfile
25
+ - gemfiles/7_2.gemfile
25
26
  - gemfiles/7_1.gemfile
26
- - gemfiles/7_0.gemfile
27
- - gemfiles/6_1.gemfile
28
27
 
29
28
  steps:
30
29
  - uses: actions/checkout@v4
data/.rubocop.yml CHANGED
@@ -3,7 +3,7 @@ inherit_gem:
3
3
  rubocop-fnando: .rubocop.yml
4
4
 
5
5
  AllCops:
6
- TargetRubyVersion: 3.1
6
+ TargetRubyVersion: 3.2
7
7
  NewCops: enable
8
8
  Exclude:
9
9
  - test/support/dummy.rb
@@ -11,9 +11,6 @@ AllCops:
11
11
  - bin/**/*
12
12
  - gemfiles/vendor/**/*
13
13
 
14
- Layout/LineLength:
15
- Enabled: false
16
-
17
14
  Metrics:
18
15
  Enabled: false
19
16
 
@@ -22,3 +19,6 @@ Minitest/MultipleAssertions:
22
19
 
23
20
  Gemspec/DevelopmentDependencies:
24
21
  Enabled: false
22
+
23
+ Minitest/EmptyLineBeforeAssertionMethods:
24
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -11,6 +11,18 @@ Prefix your message with one of the following:
11
11
  - [Security] in case of vulnerabilities.
12
12
  -->
13
13
 
14
+ ## Unreleased
15
+
16
+ - [Added] Add support for placeholders in base title.
17
+ - [Changed] Set minimum ruby version to 3.2.
18
+ - [Added] Add method to delete items by their name.
19
+
20
+ ## 1.3.0
21
+
22
+ - [Added] `page_meta.base` will now set the base url.
23
+ - [Changed] Some tags will be enforced to show up first. It loosely follows
24
+ https://rviscomi.github.io/capo.js/user/rules/.
25
+
14
26
  ## 1.2.0
15
27
 
16
28
  - [Added] The meta tag's content can also be any object that responds to the
data/README.md CHANGED
@@ -112,6 +112,14 @@ en:
112
112
  keywords: "myapp, thing, other thing"
113
113
  ```
114
114
 
115
+ ### Defining base url
116
+
117
+ You can define the base url.
118
+
119
+ ```ruby
120
+ page_meta.base "https://example.com/"
121
+ ```
122
+
115
123
  ### Defining meta tags
116
124
 
117
125
  To define other meta tags, you have to use `PageMeta::Base#tag` like the
@@ -223,6 +231,15 @@ would do.
223
231
  [Please read Rails docs](http://guides.rubyonrails.org/i18n.html#using-safe-html-translations)
224
232
  for more info.
225
233
 
234
+ ### Removing meta tags
235
+
236
+ You can use `PageMeta::Base#delete` to remove meta tags. All matching tags will
237
+ be removed.
238
+
239
+ ```ruby
240
+ page_meta.delete(:description)
241
+ ```
242
+
226
243
  ## Maintainer
227
244
 
228
245
  - [Nando Vieira](https://github.com/fnando)
@@ -3,4 +3,4 @@
3
3
  source "https://rubygems.org"
4
4
  gemspec path: ".."
5
5
 
6
- gem "rails", "~> 6.1.0"
6
+ gem "rails", "~> 7.2.0"
@@ -6,11 +6,29 @@ module PageMeta
6
6
  language
7
7
  charset
8
8
  title
9
+ viewport
9
10
  keywords
10
11
  description
11
- viewport
12
12
  ].freeze
13
13
 
14
+ DEFAULT_ORDER = 99
15
+
16
+ META_TAG_ORDER = {
17
+ pragma: -1,
18
+ cache_control: -1,
19
+ expires: -1,
20
+ refresh: -1,
21
+ dns_prefetch_control: 4
22
+ }.freeze
23
+
24
+ LINK_ORDER = {
25
+ preconnect: 6,
26
+ preload: 7,
27
+ modulepreload: 8,
28
+ prefetch: 9,
29
+ dns_prefetch: 10
30
+ }.freeze
31
+
14
32
  attr_reader :controller, :store
15
33
 
16
34
  delegate :[], :[]=, to: :store
@@ -21,86 +39,135 @@ module PageMeta
21
39
  @store = {}
22
40
  end
23
41
 
24
- def meta_tags
25
- @meta_tags ||= {}
42
+ def items
43
+ @items ||= []
44
+ end
45
+
46
+ # Add a new `<base>` tag.
47
+ def base(href)
48
+ items << {
49
+ type: :tag,
50
+ name: :base,
51
+ value: {href:},
52
+ order: 2,
53
+ open: true
54
+ }
26
55
  end
27
56
 
28
- def links
29
- @links ||= []
57
+ # Delete all matching meta tags by name.
58
+ def delete(name)
59
+ items.delete_if { _1[:name] == name }
30
60
  end
31
61
 
32
- def tag(name, value)
33
- meta_tags[name] = value
62
+ # Add a new meta tag.
63
+ def tag(name, value = nil, order: nil, **kwargs)
64
+ order = order || META_TAG_ORDER[name] || DEFAULT_ORDER
65
+ items << {type: :meta, name:, value: value || kwargs, order:}
34
66
  end
35
67
 
36
- def link(rel, options)
37
- links << {rel:, options:}
68
+ # Add a new link tag.
69
+ def link(rel, order: nil, **options)
70
+ order = order || LINK_ORDER[rel] || DEFAULT_ORDER
71
+ items << {type: :link, rel:, options:, order:}
38
72
  end
39
73
 
74
+ # Add new html tag, like `<base>` or `<title>`.
75
+ def html(name, value, open: false, order: DEFAULT_ORDER)
76
+ items << {type: :tag, name:, order:, open:, value:}
77
+ end
78
+
79
+ # The title translation.
40
80
  def title
41
81
  @title ||= Translator.new(:titles, naming, store)
42
82
  end
43
83
 
84
+ # The description translation.
44
85
  def description(html: false)
45
- @description[html] ||= Translator.new(:descriptions, naming, store.merge(html:))
86
+ @description[html] ||= Translator.new(
87
+ :descriptions,
88
+ naming,
89
+ store.merge(html:)
90
+ )
46
91
  end
47
92
 
93
+ # The keywords translation.
48
94
  def keywords
49
95
  @keywords ||= Translator.new(:keywords, naming, store)
50
96
  end
51
97
 
52
98
  def render
53
- compute_default_meta_tags
54
- render_meta_tags + render_links
99
+ compute_default_items
100
+
101
+ items
102
+ .sort_by { _1[:order] }
103
+ .map { send(:"build_#{_1[:type]}", _1).render }
104
+ .join
105
+ .html_safe
55
106
  end
56
107
  alias to_s render
57
108
 
58
- def naming
59
- @naming ||= Naming.new(controller)
109
+ private def build_tag(item)
110
+ klass = item[:open] ? OpenTag : Tag
111
+
112
+ klass.build(item[:name], item[:value])
60
113
  end
61
114
 
62
- def render_meta_tags
63
- meta_tags
64
- .map {|name, value| MetaTag.build(name, value).render }
65
- .join
66
- .html_safe
115
+ private def build_meta(item)
116
+ MetaTag.build(item[:name], item[:value])
67
117
  end
68
118
 
69
- def render_links
70
- links
71
- .map {|info| Link.build(info[:rel], info[:options]).render }
72
- .join
73
- .html_safe
119
+ private def build_link(item)
120
+ Link.build(item[:rel], item[:options])
121
+ end
122
+
123
+ private def naming
124
+ @naming ||= Naming.new(controller)
74
125
  end
75
126
 
76
- def compute_default_meta_tags
127
+ private def compute_default_items
77
128
  DEFAULT_META_TAGS.each do |method_name|
78
- public_send(:"compute_default_#{method_name}")
129
+ send(:"compute_default_#{method_name}")
79
130
  end
80
131
  end
81
132
 
82
- def compute_default_language
133
+ private def compute_default_language
83
134
  tag(:language, I18n.locale)
84
135
  end
85
136
 
86
- def compute_default_title
87
- tag(:title, title) unless title.to_s.blank?
137
+ private def compute_default_title
138
+ return if has?(:title)
139
+ return if title.to_s.blank?
140
+
141
+ html(:title, title.to_s, order: 3)
142
+ tag(:title, title)
88
143
  end
89
144
 
90
- def compute_default_charset
91
- tag(:charset, Rails.configuration.encoding)
145
+ private def compute_default_charset
146
+ return if has?(:charset)
147
+
148
+ tag(:charset, Rails.configuration.encoding, order: 0)
92
149
  end
93
150
 
94
- def compute_default_keywords
151
+ private def compute_default_keywords
152
+ return if has?(:keywords)
153
+
95
154
  tag(:keywords, keywords.to_s) unless keywords.to_s.blank?
96
155
  end
97
156
 
98
- def compute_default_description
157
+ private def compute_default_description
158
+ return if has?(:description)
159
+
99
160
  tag(:description, description.to_s) unless description.to_s.blank?
100
161
  end
101
162
 
102
- def compute_default_viewport
103
- tag(:viewport, "width=device-width,initial-scale=1") unless meta_tags[:viewport]
163
+ private def compute_default_viewport
164
+ return if has?(:viewport)
165
+
166
+ tag(:viewport, "width=device-width,initial-scale=1", order: 1)
167
+ end
168
+
169
+ private def has?(name)
170
+ items.any? { _1[:name] == name }
104
171
  end
105
172
  end
106
173
  end
@@ -4,8 +4,15 @@ module PageMeta
4
4
  class MetaTag
5
5
  class DnsPrefetchControl < MetaTag
6
6
  def render
7
- helpers.tag(:meta, "http-equiv" => "x-dns-prefetch-control", content: "on") +
8
- helpers.tag(:link, rel: "dns-prefetch", href: content)
7
+ meta = helpers.tag(
8
+ :meta,
9
+ "http-equiv" => "x-dns-prefetch-control",
10
+ content: "on"
11
+ )
12
+
13
+ link = helpers.tag(:link, rel: "dns-prefetch", href: content)
14
+
15
+ meta + link
9
16
  end
10
17
  end
11
18
  end
@@ -4,8 +4,7 @@ module PageMeta
4
4
  class MetaTag
5
5
  class Title < MetaTag
6
6
  def render
7
- helpers.content_tag(:title, content.to_s) +
8
- helpers.tag(:meta, name: "DC.title", content: content.simple) +
7
+ helpers.tag(:meta, name: "DC.title", content: content.simple) +
9
8
  helpers.tag(:meta, itemprop: "name", content: content.simple)
10
9
  end
11
10
  end
@@ -20,8 +20,11 @@ module PageMeta
20
20
  end
21
21
 
22
22
  def content
23
- @content ||=
24
- @raw_content.respond_to?(:call) ? @raw_content.call : @raw_content
23
+ @content ||= if @raw_content.respond_to?(:call)
24
+ @raw_content.call
25
+ else
26
+ @raw_content
27
+ end
25
28
  end
26
29
 
27
30
  def render
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PageMeta
4
+ class OpenTag
5
+ def self.build(tag, attrs)
6
+ new(tag, attrs)
7
+ end
8
+
9
+ attr_reader :tag, :attrs
10
+
11
+ def initialize(tag, attrs)
12
+ @tag = tag
13
+ @attrs = attrs
14
+ end
15
+
16
+ def render
17
+ helpers.tag(tag, attrs)
18
+ end
19
+
20
+ def helpers
21
+ ActionController::Base.helpers
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PageMeta
4
+ class Tag
5
+ def self.build(tag, content)
6
+ new(tag, content)
7
+ end
8
+
9
+ attr_reader :tag, :content
10
+
11
+ def initialize(tag, content)
12
+ @tag = tag
13
+ @content = content
14
+ end
15
+
16
+ def render
17
+ helpers.content_tag(tag, content) unless content.blank?
18
+ end
19
+
20
+ def helpers
21
+ ActionController::Base.helpers
22
+ end
23
+ end
24
+ end
@@ -14,15 +14,22 @@ module PageMeta
14
14
  end
15
15
 
16
16
  def singular_scope
17
- @singular_scope ||= scope == :keywords ? "keywords" : scope.to_s.singularize
17
+ @singular_scope ||= if scope == :keywords
18
+ "keywords"
19
+ else
20
+ scope.to_s.singularize
21
+ end
18
22
  end
19
23
 
20
24
  def to_s
21
25
  return "" if simple.blank?
22
26
 
27
+ value = simple
28
+
23
29
  [
24
- t("page_meta.#{scope}.base", value: simple, default: ""),
25
- t("page_meta.#{singular_scope}_base", value: simple, default: simple)
30
+ t("page_meta.#{scope}.base", value:, **override_options),
31
+ t("page_meta.#{singular_scope}_base", value:, **override_options,
32
+ default: value)
26
33
  ].reject(&:blank?).first || ""
27
34
  end
28
35
 
@@ -33,9 +40,11 @@ module PageMeta
33
40
  ]
34
41
  end
35
42
 
36
- def simple
37
- override_options = options.merge(default: "")
43
+ def override_options
44
+ options.merge(default: "")
45
+ end
38
46
 
47
+ def simple
39
48
  translation = ""
40
49
 
41
50
  translation_scope.each do |scope|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PageMeta
4
- VERSION = "1.2.0"
4
+ VERSION = "2.0.0"
5
5
  end
data/lib/page_meta.rb CHANGED
@@ -16,6 +16,8 @@ module PageMeta
16
16
  require "page_meta/meta_tag/twitter"
17
17
  require "page_meta/link"
18
18
  require "page_meta/helpers"
19
+ require "page_meta/tag"
20
+ require "page_meta/open_tag"
19
21
  require "page_meta/action"
20
22
  require "page_meta/naming"
21
23
  require "page_meta/translator"
data/page_meta.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.version = PageMeta::VERSION
8
8
  spec.authors = ["Nando Vieira"]
9
9
  spec.email = ["me@fnando.com"]
10
- spec.required_ruby_version = Gem::Requirement.new(">= 3.1.0")
10
+ spec.required_ruby_version = Gem::Requirement.new(">= 3.2.0")
11
11
  spec.metadata = {
12
12
  "rubygems_mfa_required" => "true"
13
13
  }
@@ -29,7 +29,6 @@ Gem::Specification.new do |spec|
29
29
 
30
30
  spec.add_development_dependency "bundler"
31
31
  spec.add_development_dependency "minitest-utils"
32
- spec.add_development_dependency "pry-meta"
33
32
  spec.add_development_dependency "rake"
34
33
  spec.add_development_dependency "rubocop"
35
34
  spec.add_development_dependency "rubocop-fnando"
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: page_meta
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Vieira
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-05-16 00:00:00.000000000 Z
10
+ date: 2024-12-29 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: rails
@@ -52,20 +51,6 @@ dependencies:
52
51
  - - ">="
53
52
  - !ruby/object:Gem::Version
54
53
  version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: pry-meta
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
54
  - !ruby/object:Gem::Dependency
70
55
  name: rake
71
56
  requirement: !ruby/object:Gem::Requirement
@@ -148,9 +133,8 @@ files:
148
133
  - Rakefile
149
134
  - bin/console
150
135
  - bin/setup
151
- - gemfiles/6_1.gemfile
152
- - gemfiles/7_0.gemfile
153
136
  - gemfiles/7_1.gemfile
137
+ - gemfiles/7_2.gemfile
154
138
  - lib/page_meta.rb
155
139
  - lib/page_meta/action.rb
156
140
  - lib/page_meta/base.rb
@@ -165,7 +149,9 @@ files:
165
149
  - lib/page_meta/meta_tag/title.rb
166
150
  - lib/page_meta/meta_tag/twitter.rb
167
151
  - lib/page_meta/naming.rb
152
+ - lib/page_meta/open_tag.rb
168
153
  - lib/page_meta/railtie.rb
154
+ - lib/page_meta/tag.rb
169
155
  - lib/page_meta/translator.rb
170
156
  - lib/page_meta/version.rb
171
157
  - page_meta.gemspec
@@ -174,7 +160,6 @@ licenses:
174
160
  - MIT
175
161
  metadata:
176
162
  rubygems_mfa_required: 'true'
177
- post_install_message:
178
163
  rdoc_options: []
179
164
  require_paths:
180
165
  - lib
@@ -182,15 +167,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
182
167
  requirements:
183
168
  - - ">="
184
169
  - !ruby/object:Gem::Version
185
- version: 3.1.0
170
+ version: 3.2.0
186
171
  required_rubygems_version: !ruby/object:Gem::Requirement
187
172
  requirements:
188
173
  - - ">="
189
174
  - !ruby/object:Gem::Version
190
175
  version: '0'
191
176
  requirements: []
192
- rubygems_version: 3.5.9
193
- signing_key:
177
+ rubygems_version: 3.6.2
194
178
  specification_version: 4
195
179
  summary: Easily define <meta> and <link> tags. I18n support for descriptions, keywords
196
180
  and titles.
data/gemfiles/7_0.gemfile DELETED
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
- gemspec path: ".."
5
-
6
- gem "rails", "~> 7.0.0"