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 +4 -4
- data/Rakefile +5 -4
- data/app/models/tanshuku/url.rb +27 -20
- data/config/routes.rb +1 -1
- data/lib/tanshuku/configuration.rb +16 -0
- data/lib/tanshuku/engine.rb +4 -0
- data/lib/tanshuku/version.rb +1 -1
- data/lib/tanshuku.rb +10 -1
- metadata +9 -91
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58228d834716ae9f1a9415212f4976816aeaf61bd6ff2a1e92672a62bd202a93
|
4
|
+
data.tar.gz: e8ecd16d19d73cdff428f08cd5a3b801e59934fa86d69fa1b182e0da40da1feb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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/
|
3
|
+
require "bundler/setup"
|
4
4
|
|
5
|
-
|
5
|
+
APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
|
6
|
+
load "rails/tasks/engine.rake"
|
6
7
|
|
7
|
-
|
8
|
+
load "rails/tasks/statistics.rake"
|
8
9
|
|
9
|
-
|
10
|
+
require "bundler/gem_tasks"
|
data/app/models/tanshuku/url.rb
CHANGED
@@ -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,
|
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
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
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
|
-
|
78
|
+
Tanshuku.config.exception_reporter.call(exception:, original_url:)
|
72
79
|
end
|
73
80
|
|
74
81
|
def shortened_url
|
data/config/routes.rb
CHANGED
@@ -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
|
data/lib/tanshuku/engine.rb
CHANGED
data/lib/tanshuku/version.rb
CHANGED
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
|
-
|
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.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kg8m
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
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
|
-
|
42
|
-
|
43
|
-
|
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.
|
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: []
|