tanshuku 0.0.9 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
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: []