tanshuku 0.0.9 → 0.0.11

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: aa7ab0b4cb36fafbd7747af1bff6592c5b775b9602bc664d84dbc195daa0ed3b
4
- data.tar.gz: 1826f56d1be47b0925d2b5d05c5992f8218f499e02f6c049612e44f09e9a577b
3
+ metadata.gz: 58228d834716ae9f1a9415212f4976816aeaf61bd6ff2a1e92672a62bd202a93
4
+ data.tar.gz: e8ecd16d19d73cdff428f08cd5a3b801e59934fa86d69fa1b182e0da40da1feb
5
5
  SHA512:
6
- metadata.gz: 208cd3049977df30d0bd0757f5575414da55464b343f77f31e1d3195f8fd4377718b3d3c3067e0df6ff43fa198ef2c37666ffe9201e8242af465c90fc1108ead
7
- data.tar.gz: 65d877e047853c97baef247b3508fe5a181d9ecf8d0696be491d6caf389bc9252ba155b6b465abe843c184e28300bca36c4b4a22695dfd5a04bc31b6a3b80bcf
6
+ metadata.gz: f786879cc78304a288487079e4b2e218be8df2d7c6df4edc8f629ca672369fa583998e2b44bc4d62876b1f242dd24ae0f67201a1a85f391d20fb26dd07d80ca1
7
+ data.tar.gz: 2b7af5d5181be59774b1d6ae13e12df32347c862cec776139a4ba31da153a38fb63959380e8bebcc931fa707b658799b33eb5a248a7bf765ba77dc9de3397bf9
data/Rakefile CHANGED
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_tasks"
3
+ require "bundler/setup"
4
4
 
5
- require "rubocop/rake_task"
5
+ APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
6
+ load "rails/tasks/engine.rake"
6
7
 
7
- RuboCop::RakeTask.new
8
+ load "rails/tasks/statistics.rake"
8
9
 
9
- task default: :rubocop
10
+ require "bundler/gem_tasks"
@@ -8,46 +8,53 @@ require "securerandom"
8
8
 
9
9
  module Tanshuku
10
10
  class Url < ActiveRecord::Base
11
+ DEFAULT_NAMESPACE = ""
12
+
11
13
  MAX_URL_LENGTH = 10_000
12
14
  URL_PATTERN = %r{\A(?:https?://\w+|/)}
13
15
  KEY_LENGTH = 20
14
16
 
15
17
  validates :url, :hashed_url, :key, presence: true
16
18
  validates :url, length: { maximum: MAX_URL_LENGTH }
17
- validates :url, format: { with: URL_PATTERN }
19
+ validates :url, format: { with: URL_PATTERN }, allow_blank: true
18
20
 
19
21
  # Don't validate uniqueness of unique attributes. Raise ActiveRecord::RecordNotUnique instead if the attributes get
20
22
  # duplicated. Then rescue the exception and try to retry.
21
23
  # validates :url, :hashed_url, :key, uniqueness: true
22
24
 
23
- def self.shorten(original_url, retries: 0)
25
+ def self.shorten(original_url, namespace: DEFAULT_NAMESPACE)
24
26
  raise ArgumentError, "original_url should be present" unless original_url
25
27
 
26
28
  url = normalize_url(original_url)
29
+ retries = 0
27
30
 
28
- transaction do
29
- record =
30
- create_or_find_by!(hashed_url: hash_url(url)) do |r|
31
- r.attributes = { url:, key: generate_key }
32
- end
31
+ begin
32
+ transaction do
33
+ record =
34
+ create_or_find_by!(hashed_url: hash_url(url, namespace:)) do |r|
35
+ r.attributes = { url:, key: generate_key }
36
+ end
33
37
 
34
- record.shortened_url
35
- end
36
- rescue ActiveRecord::RecordNotUnique => e
37
- if retries < 10
38
- shorten(url, retries: retries + 1)
39
- else
40
- report_exception(exception: e, original_url:)
41
- original_url
38
+ record.shortened_url
39
+ end
40
+ # ActiveRecord::RecordNotFound is raised when the key is duplicated.
41
+ rescue ActiveRecord::RecordNotFound => e
42
+ if retries < 10
43
+ retries += 1
44
+ retry
45
+ else
46
+ report_exception(exception: e, original_url:)
47
+ original_url
48
+ end
42
49
  end
43
50
  rescue StandardError => e
44
51
  report_exception(exception: e, original_url:)
45
52
  original_url
46
53
  end
47
54
 
48
- def self.find_by_url(url)
55
+ def self.find_by_url(url, namespace: DEFAULT_NAMESPACE)
49
56
  normalized_url = normalize_url(url)
50
- hashed_url = hash_url(normalized_url)
57
+ hashed_url = hash_url(normalized_url, namespace:)
51
58
 
52
59
  find_by(hashed_url:)
53
60
  end
@@ -59,8 +66,8 @@ module Tanshuku
59
66
  parsed_url.normalize.to_s
60
67
  end
61
68
 
62
- def self.hash_url(url)
63
- Digest::SHA512.hexdigest(url)
69
+ def self.hash_url(url, namespace: DEFAULT_NAMESPACE)
70
+ Digest::SHA512.hexdigest(namespace.to_s + url)
64
71
  end
65
72
 
66
73
  def self.generate_key
@@ -68,7 +75,7 @@ module Tanshuku
68
75
  end
69
76
 
70
77
  def self.report_exception(exception:, original_url:)
71
- logger.warn("Tanshuku - Failed to shorten a URL: #{exception.inspect} for #{original_url.inspect}")
78
+ Tanshuku.config.exception_reporter.call(exception:, original_url:)
72
79
  end
73
80
 
74
81
  def shortened_url
data/config/routes.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Tanshuku::Engine.routes.draw do
4
- default_url_options Tanshuku.default_url_options
4
+ default_url_options Tanshuku.config.default_url_options
5
5
 
6
6
  get "/:key", to: "urls#show"
7
7
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tanshuku
4
+ class Configuration
5
+ module DefaultExceptionReporter
6
+ def self.call(exception:, original_url:)
7
+ Rails.logger.warn("Tanshuku - Failed to shorten a URL: #{exception.inspect} for #{original_url.inspect}")
8
+ end
9
+ end
10
+
11
+ include ActiveModel::Attributes
12
+
13
+ attribute :default_url_options, default: {}
14
+ attribute :exception_reporter, default: DefaultExceptionReporter
15
+ end
16
+ end
@@ -3,5 +3,9 @@
3
3
  module Tanshuku
4
4
  class Engine < ::Rails::Engine
5
5
  isolate_namespace Tanshuku
6
+
7
+ config.generators do |g|
8
+ g.test_framework :rspec
9
+ end
6
10
  end
7
11
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tanshuku
4
- VERSION = "0.0.9"
4
+ VERSION = "0.0.11"
5
5
  end
data/lib/tanshuku.rb CHANGED
@@ -1,8 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "tanshuku/configuration"
3
4
  require_relative "tanshuku/engine"
4
5
  require_relative "tanshuku/version"
5
6
 
6
7
  module Tanshuku
7
- mattr_accessor :default_url_options, default: {}
8
+ def self.config
9
+ Mutex.new.synchronize do
10
+ @config ||= Configuration.new
11
+ end
12
+ end
13
+
14
+ def self.configure
15
+ yield config
16
+ end
8
17
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tanshuku
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - kg8m
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-24 00:00:00.000000000 Z
11
+ date: 2023-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -38,92 +38,9 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '7'
41
- - !ruby/object:Gem::Dependency
42
- name: rake
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
- - !ruby/object:Gem::Dependency
56
- name: rspec
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
- - !ruby/object:Gem::Dependency
70
- name: rubocop
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop-performance
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rubocop-rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop-rspec
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- description: Tanshuku is a Rails engine for shortening URLs. Tanshuku generates a
126
- shortened URL per a normalized original URL.
41
+ description: Tanshuku is a simple and performance aware Rails engine for shortening
42
+ URLs. Tanshuku generates a shortened URL per a normalized original URL.Tanshuku
43
+ redirects from a shortened URL to its correspond original URL.
127
44
  email:
128
45
  - takumi.kagiyama@gmail.com
129
46
  executables: []
@@ -139,6 +56,7 @@ files:
139
56
  - config/routes.rb
140
57
  - db/migrate/20230220123456_create_tanshuku_urls.rb
141
58
  - lib/tanshuku.rb
59
+ - lib/tanshuku/configuration.rb
142
60
  - lib/tanshuku/engine.rb
143
61
  - lib/tanshuku/version.rb
144
62
  homepage: https://github.com/kg8m/tanshuku
@@ -164,8 +82,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
82
  - !ruby/object:Gem::Version
165
83
  version: '0'
166
84
  requirements: []
167
- rubygems_version: 3.4.1
85
+ rubygems_version: 3.4.6
168
86
  signing_key:
169
87
  specification_version: 4
170
- summary: Tanshuku is a Rails engine for shortening URLs.
88
+ summary: Tanshuku is a simple and performance aware Rails engine for shortening URLs.
171
89
  test_files: []