active_permalink 0.3.3 → 0.4.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: ab256a590bf45b40bbdf5f36864978d5bacb5999d5d88c0531e5e1b5738e7507
4
- data.tar.gz: cc2b6765334f0a9b856f8bb017f8b394b3af3b648a79e77cec0d70498e6e3332
3
+ metadata.gz: ffd6fe6ef2f0721cae7068fd6e5134917f6c7490f1b203e516eff02f467f3f5e
4
+ data.tar.gz: 7880019fab93553b42cab37f01f0ed60d5a665082c6e511bf368e92d8a933183
5
5
  SHA512:
6
- metadata.gz: 730c40034369ba1759cf29de4e6e59df0cacc0e31e8aff420f2f2eb5c2aa1fdffb9acf5f78e72c886a558398e274c3944a63c2be4adb018cca917e11120bd8ae
7
- data.tar.gz: 83fc3101134ce259c4748177e36f9407125edf5ece5913783f47e9ccb78659e55fa4752cd136f07df6a89e65aac104b7b7086829160d8b961a258a382d2bda37
6
+ metadata.gz: 5186051a831200b0651a816e089ac42737241eaeb981ebb6bb39d99822562bc36dbead824e172a9604cf1040eab0e4aec8368f637dbf670246dfbfa63b595ae1
7
+ data.tar.gz: 2c6e6ea08a68a7a1adc934e0731ad241d5912fc24533e58bd11c75662215730374b308fabc90a6752c852a8fa5c23440442b6968ca981091165bdd7f040264dd
@@ -12,6 +12,17 @@ module ActivePermalink
12
12
  autoload :Localizer
13
13
  autoload :Querying
14
14
  autoload :Loader
15
+ autoload :Config
16
+
17
+ class << self
18
+ def config
19
+ @config ||= Config.new
20
+ end
21
+
22
+ def setup
23
+ yield config
24
+ end
25
+ end
15
26
  end
16
27
 
17
28
  ActiveSupport.on_load(:active_record) do
@@ -0,0 +1,25 @@
1
+ require 'active_support/configurable'
2
+
3
+ module ActivePermalink
4
+ class Config
5
+ include ActiveSupport::Configurable
6
+
7
+ config_accessor(:class_name) { 'ActivePermalink::Permalink' }
8
+ config_accessor(:querying) { true }
9
+ config_accessor(:localized) { false }
10
+ config_accessor(:locale_column) { :locale }
11
+ config_accessor(:locale_accessors) { true }
12
+ config_accessor(:fallbacks) { false }
13
+
14
+ def options_for(**options)
15
+ options.reverse_merge(
16
+ class_name: class_name,
17
+ querying: querying,
18
+ localized: localized,
19
+ locale_column: locale_column,
20
+ locale_accessors: locale_accessors,
21
+ fallbacks: fallbacks
22
+ )
23
+ end
24
+ end
25
+ end
@@ -1,6 +1,20 @@
1
1
  module ActivePermalink
2
2
  class Generator
3
+ class << self
4
+ def generate(record, value, locale = nil)
5
+ return if value.nil? && !record.slug_should_generate?
6
+
7
+ options = record.permalink_options.merge(locale: locale)
8
+ generator = Generator.new(record, options)
9
+ generator.generate(value)
10
+
11
+ record.permalinks = generator.permalinks
12
+ end
13
+ end
14
+
3
15
  def initialize(record, options = {})
16
+ options[:locale] = options.fetch(:locale, I18n.locale).to_s
17
+
4
18
  @record = record
5
19
  @options = options
6
20
  @field = options[:field]
@@ -22,7 +36,7 @@ module ActivePermalink
22
36
  private
23
37
 
24
38
  def locale
25
- I18n.locale.to_s
39
+ @options[:locale]
26
40
  end
27
41
 
28
42
  def changed?
@@ -3,18 +3,13 @@ module ActivePermalink
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  class_methods do
6
- def has_permalink(field, localized: false, locale_column: :locale, **options)
7
- include ActiveDelegate
6
+ def has_permalink(field, **options)
7
+ options = ActivePermalink.config.options_for(field: field, **options)
8
8
 
9
9
  class_attribute :permalink_options
10
+ self.permalink_options = options
10
11
 
11
- self.permalink_options = options.merge(
12
- field: field,
13
- localized: localized,
14
- locale_column: locale_column
15
- )
16
-
17
- with_options(as: :sluggable, class_name: 'ActivePermalink::Permalink') do
12
+ with_options(as: :sluggable, class_name: options[:class_name]) do
18
13
  has_many :permalinks,
19
14
  dependent: :destroy,
20
15
  autosave: true
@@ -22,24 +17,22 @@ module ActivePermalink
22
17
  has_many :old_permalinks,
23
18
  -> { inactive }
24
19
 
25
- if localized
20
+ if options[:localized]
26
21
  has_many :active_permalinks,
27
22
  -> { active }
28
23
 
29
24
  has_one :active_permalink,
30
- -> { active.where(locale_column => I18n.locale) }
25
+ -> { active.where(options[:locale_column] => I18n.locale) }
31
26
  else
32
27
  has_one :active_permalink,
33
28
  -> { active }
34
29
  end
35
30
  end
36
31
 
37
- delegate_attribute :slug, :string,
38
- to: :active_permalink
39
-
40
32
  include Persistence
41
- include Querying
42
- include Localizer if localized
33
+
34
+ include Querying if options[:querying]
35
+ include Localizer if options[:localized]
43
36
  end
44
37
  end
45
38
  end
@@ -3,51 +3,54 @@ module ActivePermalink
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- def permalink_reader
7
- PermalinkReader.new(permalinks, permalink_options)
6
+ def slug_backend
7
+ @slug_backend ||= PermalinkBackend.new(self)
8
8
  end
9
9
 
10
+ alias permalink_reader slug_backend
11
+
10
12
  def slug?
11
- permalink_reader.exists?
13
+ slug_backend.exists?(I18n.locale)
12
14
  end
13
15
 
14
16
  def slug
15
- permalink_reader.value
17
+ slug_backend.read(I18n.locale)
16
18
  end
17
19
 
18
- I18n.available_locales.each do |locale|
19
- define_method(:"slug_#{locale}?") do
20
- I18n.with_locale(locale) { slug? }
21
- end
20
+ if permalink_options[:locale_accessors]
21
+ include SlugLocaleAccessors
22
+ end
22
23
 
23
- define_method(:"slug_#{locale}") do
24
- I18n.with_locale(locale) { slug }
25
- end
24
+ private
26
25
 
27
- define_method(:"slug_#{locale}=") do |value|
28
- I18n.with_locale(locale) { send(:slug=, value) }
29
- end
26
+ def _generate_permalink_slug(value)
27
+ slug_backend.write(value, I18n.locale)
30
28
  end
31
29
  end
32
30
 
33
- class PermalinkReader
34
- attr_reader :permalinks, :options
31
+ class PermalinkBackend
32
+ attr_reader :record, :permalinks, :options
35
33
 
36
- def initialize(permalinks, options)
37
- @permalinks = permalinks
38
- @options = options
34
+ def initialize(record)
35
+ @record = record
36
+ @options = record.permalink_options
37
+ @permalinks = record.permalinks.to_a
39
38
  end
40
39
 
41
40
  def fallbacks?
42
41
  options[:fallbacks].present?
43
42
  end
44
43
 
45
- def exists?
46
- find_permalink(I18n.locale).present?
44
+ def exists?(locale)
45
+ find_permalink(locale).present?
46
+ end
47
+
48
+ def read(locale)
49
+ find_slug(locale)
47
50
  end
48
51
 
49
- def value
50
- find_slug(I18n.locale)
52
+ def write(value, locale)
53
+ update_slug(value, locale)
51
54
  end
52
55
 
53
56
  private
@@ -56,23 +59,16 @@ module ActivePermalink
56
59
  @options[:locale_column]
57
60
  end
58
61
 
59
- def find_permalink(locale)
60
- permalinks.find do |permalink|
61
- permalink.send(locale_column) == locale.to_s
62
+ def find_permalink(*locales)
63
+ permalinks.select(&:active?).find do |permalink|
64
+ locale = permalink.send(locale_column)
65
+ locales.include?(locale.to_sym)
62
66
  end
63
67
  end
64
68
 
65
69
  def find_fallback(locale)
66
- fallbacks = I18n.try(:fallbacks) || {}
67
- fallbacks = fallbacks.fetch(locale, [I18n.default_locale])
68
- permalink = nil
69
-
70
- fallbacks.find do |fallback|
71
- permalink = find_permalink(fallback)
72
- permalink.present?
73
- end
74
-
75
- permalink
70
+ locales = I18n.fallbacks[locale]
71
+ find_permalink(*locales) if locales.present?
76
72
  end
77
73
 
78
74
  def find_slug(locale)
@@ -81,6 +77,31 @@ module ActivePermalink
81
77
 
82
78
  permalink.try(:slug)
83
79
  end
80
+
81
+ def update_slug(value, locale)
82
+ Generator.generate(record, value, locale)
83
+ @permalinks = record.permalinks.to_a
84
+ end
85
+ end
86
+
87
+ module SlugLocaleAccessors
88
+ extend ActiveSupport::Concern
89
+
90
+ included do
91
+ I18n.available_locales.each do |locale|
92
+ define_method(:"slug_#{locale}?") do
93
+ slug_backend.exists?(locale)
94
+ end
95
+
96
+ define_method(:"slug_#{locale}") do
97
+ slug_backend.read(locale)
98
+ end
99
+
100
+ define_method(:"slug_#{locale}=") do |value|
101
+ slug_backend.write(value, locale)
102
+ end
103
+ end
104
+ end
84
105
  end
85
106
  end
86
107
  end
@@ -2,8 +2,6 @@ module ActivePermalink
2
2
  class Permalink < ActiveRecord::Base
3
3
  self.table_name = 'permalinks'
4
4
 
5
- default_scope { order created_at: :desc }
6
-
7
5
  scope :global, -> { where scope: :global }
8
6
  scope :active, -> { where active: true }
9
7
  scope :inactive, -> { where active: false }
@@ -3,21 +3,38 @@ module ActivePermalink
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- before_validation on: :create do
7
- self.slug = slug
6
+ include ActiveDelegate
7
+
8
+ delegate_attribute :slug, :string,
9
+ to: :active_permalink
10
+
11
+ before_validation :slug_should_generate!,
12
+ on: [:create, :update],
13
+ unless: :slug?
14
+
15
+ def slug=(value)
16
+ _generate_permalink_slug(value)
8
17
  end
9
18
 
10
- after_update do
11
- permalinks.reload
19
+ def old_slugs
20
+ @old_slugs ||= old_permalinks.pluck(:slug)
12
21
  end
13
22
 
14
- def slug=(value)
15
- return if value.nil? && !new_record?
23
+ def slug_should_generate?
24
+ @slug_should_generate == true
25
+ end
16
26
 
17
- generator = Generator.new(self, permalink_options)
18
- generator.generate(value)
27
+ private
28
+
29
+ def slug_should_generate!
30
+ @slug_should_generate = true
31
+ _generate_permalink_slug(self[:slug])
32
+ ensure
33
+ @slug_should_generate = false
34
+ end
19
35
 
20
- self.permalinks = generator.permalinks
36
+ def _generate_permalink_slug(value)
37
+ Generator.generate(self, value)
21
38
  end
22
39
  end
23
40
  end
@@ -36,10 +36,6 @@ module ActivePermalink
36
36
  found_by_slug? && found_by_slug != slug
37
37
  end
38
38
 
39
- def old_slugs
40
- @old_slugs ||= old_permalinks.pluck(:slug)
41
- end
42
-
43
39
  class PermalinkLocator
44
40
  attr_reader :model, :options
45
41
 
@@ -1,3 +1,3 @@
1
1
  module ActivePermalink
2
- VERSION = '0.3.3'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -13,6 +13,10 @@ module ActivePermalink
13
13
  migration_template 'migration.rb', 'db/migrate/create_permalinks.rb'
14
14
  end
15
15
 
16
+ def create_config_file
17
+ template 'initializer.rb', 'config/initializers/active_permalink.rb'
18
+ end
19
+
16
20
  def self.next_migration_number(dirname)
17
21
  ::ActiveRecord::Generators::Base.next_migration_number(dirname)
18
22
  end
@@ -0,0 +1,8 @@
1
+ ActivePermalink.setup do |config|
2
+ # config.class_name = 'ActivePermalink::Permalink'
3
+ # config.querying = true
4
+ # config.localized = false
5
+ # config.locale_column = :locale
6
+ # config.locale_accessors = true
7
+ # config.fallbacks = false
8
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_permalink
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonian Guveli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-06 00:00:00.000000000 Z
11
+ date: 2020-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -112,6 +112,7 @@ files:
112
112
  - README.md
113
113
  - Rakefile
114
114
  - lib/active_permalink.rb
115
+ - lib/active_permalink/config.rb
115
116
  - lib/active_permalink/generator.rb
116
117
  - lib/active_permalink/loader.rb
117
118
  - lib/active_permalink/localizer.rb
@@ -120,6 +121,7 @@ files:
120
121
  - lib/active_permalink/querying.rb
121
122
  - lib/active_permalink/version.rb
122
123
  - lib/generators/active_permalink/install_generator.rb
124
+ - lib/generators/active_permalink/templates/initializer.rb
123
125
  - lib/generators/active_permalink/templates/migration.rb
124
126
  homepage: https://github.com/hardpixel/active-permalink
125
127
  licenses:
@@ -140,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
142
  - !ruby/object:Gem::Version
141
143
  version: '0'
142
144
  requirements: []
143
- rubygems_version: 3.0.6
145
+ rubygems_version: 3.1.2
144
146
  signing_key:
145
147
  specification_version: 4
146
148
  summary: Add permalinks to ActiveRecord models