tanshuku 0.0.19 → 1.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 +4 -4
- data/README.md +20 -20
- data/app/models/tanshuku/url.rb +38 -20
- data/db/migrate/20230220123456_create_tanshuku_urls.rb +1 -1
- data/lib/generators/tanshuku/install_generator.rb +1 -2
- data/lib/tanshuku/configuration.rb +67 -6
- data/lib/tanshuku/engine.rb +2 -2
- data/lib/tanshuku/version.rb +1 -1
- data/lib/tanshuku.rb +3 -3
- data/lib/tasks/check_all.rb +67 -0
- metadata +18 -19
- data/Steepfile +0 -7
- data/rbs_collection.lock.yaml +0 -194
- data/rbs_collection.yaml +0 -19
- data/sig/app/controllers/tanshuku/urls_controller.rbs +0 -5
- data/sig/app/models/tanshuku/url.rbs +0 -114
- data/sig/db/migrate/create_tanshuku_urls.rbs +0 -2
- data/sig/lib/generators/tanshuku/install_generator.rbs +0 -4
- data/sig/lib/tanshuku/configuration.rbs +0 -42
- data/sig/lib/tanshuku/engine.rbs +0 -4
- data/sig/lib/tanshuku/version.rbs +0 -3
- data/sig/lib/tanshuku.rbs +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92f985a414af971db170f5ce9a171469af6901f47feb4345a3b8ad96d256854e
|
4
|
+
data.tar.gz: 64a303579eb92b6748332d1f15259d4de493c11d32d572fd98a539269f3fffda
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5cd414ab9fcebdb55fa961744ac339d668466200972dfd8e0cc0b46a567f183fc00541cb3ffe784173d1eda3fa63f7c2c796eeee5488b7e396d9fb8dd98ff3e
|
7
|
+
data.tar.gz: f5f1e7a1d50cb26f2e61973903e708e255e2bb76248c6e7e7d14b74dd55a6fbb9a13a842dc2f8bf0f33cc7aae70bf33b500e5a337c8fc3af910a60ce108b8f88
|
data/README.md
CHANGED
@@ -4,19 +4,19 @@ Tanshuku is a simple and small Rails engine that makes it easier to shorten URLs
|
|
4
4
|
|
5
5
|
## Key Features
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
- Generates a unique key for a URL.
|
8
|
+
- The uniqueness is ensured at database level.
|
9
|
+
- Creates no additional shortened URL record if the given URL has already been shortened.
|
10
|
+
- You can create an additional record for the same URL with using a different namespace from existing records’.
|
11
|
+
- Checks its existence considering the performance.
|
12
|
+
- Provides a Rails controller and action for finding a shortened URL record and redirecting to its original, i.e., non-shortened, URL.
|
13
|
+
- The redirection is done with 301 HTTP status.
|
14
14
|
|
15
15
|
## Usage
|
16
16
|
|
17
17
|
### 1. Mount `Tanshuku::Engine`
|
18
18
|
|
19
|
-
For example, the following code generates a routing `` GET `/t/:key` to `Tanshuku::UrlsController#show` ``. When your Rails app receives a request to `/t/abcdefghij0123456789`, `Tanshuku::UrlsController#show` will be called and a `Tanshuku::Url` record with a key `abcdefghij0123456789` will be found. Then the request will be redirected to the `Tanshuku::Url` record
|
19
|
+
For example, the following code generates a routing `` GET `/t/:key` to `Tanshuku::UrlsController#show` ``. When your Rails app receives a request to `/t/abcdefghij0123456789`, `Tanshuku::UrlsController#show` will be called and a `Tanshuku::Url` record with a key `abcdefghij0123456789` will be found. Then the request will be redirected to the `Tanshuku::Url` record’s original URL.
|
20
20
|
|
21
21
|
```rb
|
22
22
|
# config/routes.rb
|
@@ -31,9 +31,9 @@ end
|
|
31
31
|
|
32
32
|
**Note**: This step is optional.
|
33
33
|
|
34
|
-
**Note**: An initializer file for configuration can be generated by `bin/rails generate tanshuku:install`. See the
|
34
|
+
**Note**: An initializer file for configuration can be generated by `bin/rails generate tanshuku:install`. See the “[Installation](#installation)” section below for more information.
|
35
35
|
|
36
|
-
**Note**: Mutating a `Tanshuku::Configuration` object is thread
|
36
|
+
**Note**: Mutating a `Tanshuku::Configuration` object is thread-**_unsafe_**. It is recommended to use `Tanshuku.configure` for configuration.
|
37
37
|
|
38
38
|
#### `config.default_url_options`
|
39
39
|
|
@@ -65,14 +65,14 @@ The following example means that an exception and a URL will be reported to [Sen
|
|
65
65
|
Tanshuku.configure do |config|
|
66
66
|
config.exception_reporter =
|
67
67
|
lambda { |exception:, original_url:|
|
68
|
-
Sentry.capture_exception(exception, tags: { original_url: })
|
68
|
+
Sentry.capture_exception(exception, tags: { original_url: original_url })
|
69
69
|
}
|
70
70
|
end
|
71
71
|
```
|
72
72
|
|
73
73
|
#### More information
|
74
74
|
|
75
|
-
cf. [`Tanshuku::Configuration
|
75
|
+
cf. [`Tanshuku::Configuration`’s API documentation](https://kg8m.github.io/tanshuku/Tanshuku/Configuration.html)
|
76
76
|
|
77
77
|
### 3. Generate shortened URLs
|
78
78
|
|
@@ -115,10 +115,10 @@ Tanshuku::Url.shorten("https://google.com/", url_options: { protocol: :http })
|
|
115
115
|
You can create additional records for the same URL with specifying a namespace.
|
116
116
|
|
117
117
|
```rb
|
118
|
-
# When no record exists for
|
118
|
+
# When no record exists for “https://google.com/”, a new record will be created.
|
119
119
|
Tanshuku::Url.shorten("https://google.com/") #=> "https://example.com/t/abc012def345ghi678j9"
|
120
120
|
|
121
|
-
# Even when a record already exists for
|
121
|
+
# Even when a record already exists for “https://google.com/”, an additional record will be created if namespace is
|
122
122
|
# specified.
|
123
123
|
Tanshuku::Url.shorten("https://google.com/", namespace: "a") #=> "https://example.com/t/ab01cd23ef45gh67ij89"
|
124
124
|
Tanshuku::Url.shorten("https://google.com/", namespace: "b") #=> "https://example.com/t/a0b1c2d3e4f5g6h7i8j9"
|
@@ -131,7 +131,7 @@ Tanshuku::Url.shorten("https://google.com/", namespace: "a") #=> "https://examp
|
|
131
131
|
|
132
132
|
#### More information
|
133
133
|
|
134
|
-
cf. [`Tanshuku::Url.shorten
|
134
|
+
cf. [`Tanshuku::Url.shorten`’s API documentation](https://kg8m.github.io/tanshuku/Tanshuku/Url.html#shorten-class_method)
|
135
135
|
|
136
136
|
### 4. Share the shortened URLs
|
137
137
|
|
@@ -143,7 +143,7 @@ When a user clicks a link with a shortened URL, your Rails app redirects the use
|
|
143
143
|
|
144
144
|
### 1. Enable Tanshuku
|
145
145
|
|
146
|
-
Add `gem "tanshuku"` to your application
|
146
|
+
Add `gem "tanshuku"` to your application’s `Gemfile`.
|
147
147
|
|
148
148
|
```rb
|
149
149
|
# Gemfile
|
@@ -168,13 +168,13 @@ bin/rails db:migrate
|
|
168
168
|
|
169
169
|
## Q&A
|
170
170
|
|
171
|
-
### What does
|
171
|
+
### Q. What does “tanshuku” mean?
|
172
172
|
|
173
|
-
|
173
|
+
A. “Tanshuku” is a Japanese word “短縮.” It means “shortening.” And “短縮URL” in Japanese means “shortened URL” in English.
|
174
174
|
|
175
|
-
### \*\* (anything you want) isn
|
175
|
+
### Q. \*\* (anything you want) isn’t implemented?
|
176
176
|
|
177
|
-
Does Tanshuku have some missing features? Please [create an issue](https://github.com/kg8m/tanshuku/issues/new).
|
177
|
+
A. Does Tanshuku have some missing features? Please [create an issue](https://github.com/kg8m/tanshuku/issues/new).
|
178
178
|
|
179
179
|
## How to develop
|
180
180
|
|
data/app/models/tanshuku/url.rb
CHANGED
@@ -13,7 +13,7 @@ module Tanshuku
|
|
13
13
|
# @return [String] Original, i.e., non-shortened, URL of the record.
|
14
14
|
#
|
15
15
|
# @!attribute [rw] hashed_url
|
16
|
-
# @return [String] A hashed string of the record
|
16
|
+
# @return [String] A hashed string of the record’s original URL.
|
17
17
|
# @note This attribute is used for uniqueness of the original URL.
|
18
18
|
# @api private
|
19
19
|
#
|
@@ -26,15 +26,16 @@ module Tanshuku
|
|
26
26
|
DEFAULT_NAMESPACE = ""
|
27
27
|
|
28
28
|
validates :url, :hashed_url, :key, presence: true
|
29
|
-
validates :url, length: { maximum: proc { Tanshuku.config.max_url_length } }
|
30
29
|
validates :url, format: { with: proc { Tanshuku.config.url_pattern } }, allow_blank: true
|
31
30
|
|
32
|
-
# Don
|
31
|
+
# Don’t validate uniqueness of unique attributes. Raise ActiveRecord::RecordNotUnique instead if the attributes get
|
32
|
+
validate :validates_length_of_url
|
33
|
+
|
33
34
|
# duplicated. Then rescue the exception and try to retry.
|
34
35
|
# validates :url, :hashed_url, :key, uniqueness: true
|
35
36
|
|
36
37
|
# Shortens a URL. Builds and saves a {Tanshuku::Url} record with generating a unique key for the given URL and
|
37
|
-
# namespace. Then returns the record
|
38
|
+
# namespace. Then returns the record’s shortened URL with the given URL options.
|
38
39
|
#
|
39
40
|
# @note
|
40
41
|
# If a {Tanshuku::Url} record already exists, no additional record will be created and the existing record will be
|
@@ -45,7 +46,7 @@ module Tanshuku
|
|
45
46
|
#
|
46
47
|
# @param original_url [String] The original, i.e., non-shortened, URL.
|
47
48
|
# @param namespace [String] A namespace for shorteting URL. Shortened URLs are unique in namespaces.
|
48
|
-
# @param url_options [Hash] An option for Rails
|
49
|
+
# @param url_options [Hash] An option for Rails’ +url_for+.
|
49
50
|
#
|
50
51
|
# @return [String] A shortened URL if succeeded to shorten the original URL.
|
51
52
|
# @return [String] The original URL if failed to shorten it.
|
@@ -61,10 +62,10 @@ module Tanshuku
|
|
61
62
|
# Tanshuku::Url.shorten("https://google.com/", url_options: { protocol: :http })
|
62
63
|
# #=> "http://example.com/t/abcde01234fghij56789"
|
63
64
|
# @example With a namespace.
|
64
|
-
# # When no record exists for
|
65
|
+
# # When no record exists for “https://google.com/”, a new record will be created.
|
65
66
|
# Tanshuku::Url.shorten("https://google.com/") #=> "https://example.com/t/abc012def345ghi678j9"
|
66
67
|
#
|
67
|
-
# # Even when a record already exists for
|
68
|
+
# # Even when a record already exists for “https://google.com/”, an additional record will be created if namespace
|
68
69
|
# # is specified.
|
69
70
|
# Tanshuku::Url.shorten("https://google.com/", namespace: "a") #=> "https://example.com/t/ab01cd23ef45gh67ij89"
|
70
71
|
# Tanshuku::Url.shorten("https://google.com/", namespace: "b") #=> "https://example.com/t/a0b1c2d3e4f5g6h7i8j9"
|
@@ -82,8 +83,8 @@ module Tanshuku
|
|
82
83
|
begin
|
83
84
|
transaction do
|
84
85
|
record =
|
85
|
-
create_or_find_by!(hashed_url: hash_url(url, namespace:)) do |r|
|
86
|
-
r.attributes = { url
|
86
|
+
create_or_find_by!(hashed_url: hash_url(url, namespace: namespace)) do |r|
|
87
|
+
r.attributes = { url: url, key: generate_key }
|
87
88
|
end
|
88
89
|
|
89
90
|
record.shortened_url(url_options)
|
@@ -94,15 +95,24 @@ module Tanshuku
|
|
94
95
|
retries += 1
|
95
96
|
retry
|
96
97
|
else
|
97
|
-
report_exception(exception: e, original_url:)
|
98
|
+
report_exception(exception: e, original_url: original_url)
|
98
99
|
original_url
|
99
100
|
end
|
100
101
|
end
|
101
102
|
rescue StandardError => e
|
102
|
-
report_exception(exception: e, original_url:)
|
103
|
+
report_exception(exception: e, original_url: original_url)
|
103
104
|
original_url
|
104
105
|
end
|
105
106
|
|
107
|
+
unless respond_to?(:create_or_find_by!)
|
108
|
+
# https://github.com/rails/rails/blob/v6.0.0/activerecord/lib/active_record/relation.rb#L218-L222
|
109
|
+
def self.create_or_find_by!(attributes, &block)
|
110
|
+
transaction(requires_new: true) { create!(attributes, &block) }
|
111
|
+
rescue ActiveRecord::RecordNotUnique
|
112
|
+
find_by!(attributes)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
106
116
|
# Finds a {Tanshuku::Url} record by a non-shortened URL.
|
107
117
|
#
|
108
118
|
# @param url [String] A non-shortened URL.
|
@@ -112,9 +122,9 @@ module Tanshuku
|
|
112
122
|
# @return [nil] +nil+ unless found.
|
113
123
|
def self.find_by_url(url, namespace: DEFAULT_NAMESPACE)
|
114
124
|
normalized_url = normalize_url(url)
|
115
|
-
hashed_url = hash_url(normalized_url, namespace:)
|
125
|
+
hashed_url = hash_url(normalized_url, namespace: namespace)
|
116
126
|
|
117
|
-
find_by(hashed_url:)
|
127
|
+
find_by(hashed_url: hashed_url)
|
118
128
|
end
|
119
129
|
|
120
130
|
# Normalizes a URL. Adds or removes a trailing slash, removes +?+ for an empty query, and so on. And sorts query
|
@@ -131,19 +141,19 @@ module Tanshuku
|
|
131
141
|
|
132
142
|
# Hashes a URL.
|
133
143
|
#
|
134
|
-
# @note This method calls {Tanshuku::Configuration#url_hasher}
|
144
|
+
# @note This method calls {Tanshuku::Configuration#url_hasher}’s +call+ and returns its return value.
|
135
145
|
#
|
136
146
|
# @param url [String] A non-hashed URL.
|
137
147
|
# @param namespace [String] A namespace for the URL.
|
138
148
|
#
|
139
149
|
# @return [String] Depends on your {Tanshuku::Configuration#url_hasher} configuration.
|
140
150
|
def self.hash_url(url, namespace: DEFAULT_NAMESPACE)
|
141
|
-
Tanshuku.config.url_hasher.call(url, namespace:)
|
151
|
+
Tanshuku.config.url_hasher.call(url, namespace: namespace)
|
142
152
|
end
|
143
153
|
|
144
154
|
# Generates a unique key for a shortened URL.
|
145
155
|
#
|
146
|
-
# @note This method calls {Tanshuku::Configuration#key_generator}
|
156
|
+
# @note This method calls {Tanshuku::Configuration#key_generator}’s +call+ and returns its return value.
|
147
157
|
#
|
148
158
|
# @return [String] Depends on your {Tanshuku::Configuration#key_generator} configuration.
|
149
159
|
def self.generate_key
|
@@ -152,19 +162,19 @@ module Tanshuku
|
|
152
162
|
|
153
163
|
# Reports an exception when failed to shorten a URL.
|
154
164
|
#
|
155
|
-
# @note This method calls {Tanshuku::Configuration#exception_reporter}
|
165
|
+
# @note This method calls {Tanshuku::Configuration#exception_reporter}’s +call+ and returns its return value.
|
156
166
|
#
|
157
167
|
# @param exception [Exception] An error instance at shortening a URL.
|
158
168
|
# @param original_url [String] The original URL failed to shorten.
|
159
169
|
#
|
160
170
|
# @return [void] Depends on your {Tanshuku::Configuration#exception_reporter} configuration.
|
161
171
|
def self.report_exception(exception:, original_url:)
|
162
|
-
Tanshuku.config.exception_reporter.call(exception
|
172
|
+
Tanshuku.config.exception_reporter.call(exception: exception, original_url: original_url)
|
163
173
|
end
|
164
174
|
|
165
|
-
# The record
|
175
|
+
# The record’s shortened URL.
|
166
176
|
#
|
167
|
-
# @param url_options [Hash] An option for Rails
|
177
|
+
# @param url_options [Hash] An option for Rails’ +url_for+.
|
168
178
|
#
|
169
179
|
# @return [String] A shortened URL.
|
170
180
|
def shortened_url(url_options = {})
|
@@ -175,6 +185,14 @@ module Tanshuku
|
|
175
185
|
|
176
186
|
Tanshuku::Engine.routes.url_for(url_options)
|
177
187
|
end
|
188
|
+
|
189
|
+
private
|
190
|
+
|
191
|
+
def validates_length_of_url
|
192
|
+
if url && url.length > Tanshuku.config.max_url_length
|
193
|
+
errors.add(:url, :too_long, count: Tanshuku.config.max_url_length)
|
194
|
+
end
|
195
|
+
end
|
178
196
|
end
|
179
197
|
# rubocop:enable Rails/ApplicationRecord
|
180
198
|
end
|
@@ -7,8 +7,7 @@ module Tanshuku
|
|
7
7
|
#
|
8
8
|
# @api private
|
9
9
|
class InstallGenerator < Rails::Generators::Base
|
10
|
-
|
11
|
-
source_root File.expand_path("../templates", _ = __dir__)
|
10
|
+
source_root File.expand_path("../templates", __dir__)
|
12
11
|
|
13
12
|
# Generates a configuration file +config/initializers/tanshuku.rb+.
|
14
13
|
#
|
@@ -11,7 +11,7 @@ module Tanshuku
|
|
11
11
|
# Calls +Digest::SHA512.hexdigest+ with the given URL string and the given namespace.
|
12
12
|
#
|
13
13
|
# @param url [String] A URL to hash.
|
14
|
-
# @param namespace [String] A namespace for the URL
|
14
|
+
# @param namespace [String] A namespace for the URL’s uniqueness.
|
15
15
|
#
|
16
16
|
# @return [String] A SHA512 digest string from the given url and namespace.
|
17
17
|
def self.call(url, namespace:)
|
@@ -42,10 +42,71 @@ module Tanshuku
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
|
45
|
+
if defined?(ActiveModel::Attributes)
|
46
|
+
include ActiveModel::Attributes
|
47
|
+
else
|
48
|
+
# https://github.com/rails/rails/blob/v5.2.8.1/activemodel/lib/active_model/attributes.rb
|
49
|
+
# https://github.com/rails/rails/blob/v5.2.8.1/activemodel/lib/active_model/type/integer.rb
|
50
|
+
concerning :PetitModelAttributes do
|
51
|
+
const_set :NO_DEFAULT_PROVIDED, Object.new
|
52
|
+
|
53
|
+
class_methods do
|
54
|
+
# rubocop:disable Metrics/MethodLength
|
55
|
+
|
56
|
+
# A petit and limited implementation of `ActiveModel::Attributes`'s `attribute` method for backward
|
57
|
+
# compatibility.
|
58
|
+
#
|
59
|
+
# @param name [Symbol] An attribute name.
|
60
|
+
# @param cast_type [Symbol,nil] A type to cast the attribute's value.
|
61
|
+
# @param default [Object] A default value of the attribute.
|
62
|
+
#
|
63
|
+
# @return [void]
|
64
|
+
def attribute(name, cast_type = nil, default: NO_DEFAULT_PROVIDED)
|
65
|
+
attr_reader name
|
66
|
+
|
67
|
+
case cast_type
|
68
|
+
when nil
|
69
|
+
attr_writer name
|
70
|
+
when :integer
|
71
|
+
class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
72
|
+
def #{name}=(value) # def max_url_length=(value)
|
73
|
+
@#{name} = # @max_url_length =
|
74
|
+
case value # case value
|
75
|
+
when true # when true
|
76
|
+
1 # 1
|
77
|
+
when false # when false
|
78
|
+
0 # 0
|
79
|
+
when nil # when nil
|
80
|
+
nil # nil
|
81
|
+
else # else
|
82
|
+
value.to_i rescue nil # value.to_i rescue nil
|
83
|
+
end # end
|
84
|
+
end # end
|
85
|
+
RUBY
|
86
|
+
else
|
87
|
+
raise ArgumentError, "Non-supported cast type: #{cast_type.inspect}"
|
88
|
+
end
|
89
|
+
|
90
|
+
return if default == NO_DEFAULT_PROVIDED
|
91
|
+
|
92
|
+
mod =
|
93
|
+
Module.new do
|
94
|
+
class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
95
|
+
def initialize(*args) # def initialize(*args)
|
96
|
+
super # super
|
97
|
+
self.#{name} = #{default.inspect} # self.max_url_length = 10_000
|
98
|
+
end # end
|
99
|
+
RUBY
|
100
|
+
end
|
101
|
+
prepend mod
|
102
|
+
end
|
103
|
+
# rubocop:enable Metrics/MethodLength
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
46
107
|
|
47
108
|
# @!attribute [rw] default_url_options
|
48
|
-
# Default URL options for Rails
|
109
|
+
# Default URL options for Rails’ +url_for+. Defaults to +{}+.
|
49
110
|
#
|
50
111
|
# @return [Hash]
|
51
112
|
# @return [void] If you set an invalid object.
|
@@ -102,7 +163,7 @@ module Tanshuku
|
|
102
163
|
# @return [Integer]
|
103
164
|
# @return [void] If you set an invalid object.
|
104
165
|
#
|
105
|
-
# @note Don
|
166
|
+
# @note Don’t forget to fix the limit of the +tanshuku_urls.key+ column if you change this value.
|
106
167
|
#
|
107
168
|
# @note
|
108
169
|
# The example below means that {Tanshuku::Url#key} has 10-char string.
|
@@ -166,12 +227,12 @@ module Tanshuku
|
|
166
227
|
# Tanshuku.configure do |config|
|
167
228
|
# config.exception_reporter =
|
168
229
|
# lambda { |exception:, original_url:|
|
169
|
-
# Sentry.capture_exception(exception, tags: { original_url: })
|
230
|
+
# Sentry.capture_exception(exception, tags: { original_url: original_url })
|
170
231
|
# }
|
171
232
|
# end
|
172
233
|
attribute :exception_reporter, default: DefaultExceptionReporter
|
173
234
|
|
174
|
-
def initialize(
|
235
|
+
def initialize(*args)
|
175
236
|
super
|
176
237
|
@mutex = Mutex.new
|
177
238
|
end
|
data/lib/tanshuku/engine.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Tanshuku
|
4
|
-
# Tanshuku
|
4
|
+
# Tanshuku’s Rails engine.
|
5
5
|
#
|
6
6
|
# @note
|
7
7
|
# The example below generates a routing +GET `/t/:key` to `Tanshuku::UrlsController#show`+. When your Rails app
|
8
8
|
# receives a request to +/t/abcdefghij0123456789+, +Tanshuku::UrlsController#show+ will be called and a
|
9
9
|
# +Tanshuku::Url+ record with a key +abcdefghij0123456789+ will be found. Then the request will be redirected to the
|
10
|
-
# +Tanshuku::Url+ record
|
10
|
+
# +Tanshuku::Url+ record’s original URL.
|
11
11
|
#
|
12
12
|
# @example To mount Tanshuku to your Rails app
|
13
13
|
# # config/routes.rb
|
data/lib/tanshuku/version.rb
CHANGED
data/lib/tanshuku.rb
CHANGED
@@ -4,7 +4,7 @@ require_relative "tanshuku/configuration"
|
|
4
4
|
require_relative "tanshuku/engine"
|
5
5
|
require_relative "tanshuku/version"
|
6
6
|
|
7
|
-
# Tanshuku
|
7
|
+
# Tanshuku’s namespace.
|
8
8
|
module Tanshuku
|
9
9
|
# Returns a configuration object for Tanshuku.
|
10
10
|
#
|
@@ -35,7 +35,7 @@ module Tanshuku
|
|
35
35
|
# Tanshuku.configure do |config|
|
36
36
|
# config.default_url_options = { host: "localhost", protocol: :https }
|
37
37
|
# end
|
38
|
-
def self.configure(&)
|
39
|
-
config.configure(&)
|
38
|
+
def self.configure(&block)
|
39
|
+
config.configure(&block)
|
40
40
|
end
|
41
41
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "English"
|
4
|
+
require "io/console"
|
5
|
+
require "paint"
|
6
|
+
require "pty"
|
7
|
+
|
8
|
+
class CheckAll
|
9
|
+
TASKNAMES = %i[rubocop spec yard:check].freeze
|
10
|
+
LINE = Paint["-" * (IO.console or raise).winsize[1], :bold]
|
11
|
+
TITLE_TEMPLATE = Paint["\n#{LINE}\nExecute: %<command>s\n#{LINE}\n\n", :bold]
|
12
|
+
|
13
|
+
attr_reader :failed_commands
|
14
|
+
|
15
|
+
def self.call
|
16
|
+
new.call
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@failed_commands = []
|
21
|
+
end
|
22
|
+
|
23
|
+
def call
|
24
|
+
TASKNAMES.map { |taskname| Thread.new(taskname, &executor) }.each(&:join)
|
25
|
+
output_result
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def executor
|
31
|
+
lambda do |taskname|
|
32
|
+
command = "bundle exec rake #{taskname}"
|
33
|
+
|
34
|
+
outputs = []
|
35
|
+
outputs << format(TITLE_TEMPLATE, command: command)
|
36
|
+
|
37
|
+
# Use `PTY.spawn` to get colorized outputs of each command.
|
38
|
+
PTY.spawn(command) do |reader, writer, pid|
|
39
|
+
writer.close
|
40
|
+
|
41
|
+
while (output = reader.gets)
|
42
|
+
outputs << output
|
43
|
+
end
|
44
|
+
|
45
|
+
Process.wait(pid)
|
46
|
+
end
|
47
|
+
failed_commands << command unless $CHILD_STATUS&.success?
|
48
|
+
|
49
|
+
puts outputs.join
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def output_result
|
54
|
+
puts ""
|
55
|
+
puts LINE
|
56
|
+
puts Paint["Result", :bold]
|
57
|
+
puts LINE
|
58
|
+
|
59
|
+
if failed_commands.empty?
|
60
|
+
puts Paint["\nAll checks are OK.", :green, :bold]
|
61
|
+
else
|
62
|
+
puts Paint["\nChecks failed!!\n", :red, :bold]
|
63
|
+
puts failed_commands.map { |command| " - #{command}" }.join("\n")
|
64
|
+
abort ""
|
65
|
+
end
|
66
|
+
end
|
67
|
+
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: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kg8m
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -16,28 +16,34 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.4
|
19
|
+
version: '2.4'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.4
|
26
|
+
version: '2.4'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rails
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '5.1'
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '6.0'
|
34
37
|
type: :runtime
|
35
38
|
prerelease: false
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
37
40
|
requirements:
|
38
41
|
- - ">="
|
39
42
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
43
|
+
version: '5.1'
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '6.0'
|
41
47
|
description: Tanshuku is a simple and performance aware Rails engine for shortening
|
42
48
|
URLs. Tanshuku generates a shortened URL per a normalized original URL. Tanshuku
|
43
49
|
redirects from a shortened URL to its corresponding original URL.
|
@@ -49,7 +55,6 @@ extra_rdoc_files: []
|
|
49
55
|
files:
|
50
56
|
- LICENSE
|
51
57
|
- README.md
|
52
|
-
- Steepfile
|
53
58
|
- app/controllers/tanshuku/urls_controller.rb
|
54
59
|
- app/models/tanshuku/url.rb
|
55
60
|
- config/locales/en.yml
|
@@ -62,16 +67,7 @@ files:
|
|
62
67
|
- lib/tanshuku/configuration.rb
|
63
68
|
- lib/tanshuku/engine.rb
|
64
69
|
- lib/tanshuku/version.rb
|
65
|
-
-
|
66
|
-
- rbs_collection.yaml
|
67
|
-
- sig/app/controllers/tanshuku/urls_controller.rbs
|
68
|
-
- sig/app/models/tanshuku/url.rbs
|
69
|
-
- sig/db/migrate/create_tanshuku_urls.rbs
|
70
|
-
- sig/lib/generators/tanshuku/install_generator.rbs
|
71
|
-
- sig/lib/tanshuku.rbs
|
72
|
-
- sig/lib/tanshuku/configuration.rbs
|
73
|
-
- sig/lib/tanshuku/engine.rbs
|
74
|
-
- sig/lib/tanshuku/version.rbs
|
70
|
+
- lib/tasks/check_all.rb
|
75
71
|
homepage: https://github.com/kg8m/tanshuku
|
76
72
|
licenses:
|
77
73
|
- MIT
|
@@ -89,14 +85,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
89
85
|
requirements:
|
90
86
|
- - ">="
|
91
87
|
- !ruby/object:Gem::Version
|
92
|
-
version: '
|
88
|
+
version: '2.5'
|
89
|
+
- - "<"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '3.0'
|
93
92
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
93
|
requirements:
|
95
94
|
- - ">="
|
96
95
|
- !ruby/object:Gem::Version
|
97
96
|
version: '0'
|
98
97
|
requirements: []
|
99
|
-
rubygems_version: 3.
|
98
|
+
rubygems_version: 3.1.6
|
100
99
|
signing_key:
|
101
100
|
specification_version: 4
|
102
101
|
summary: Tanshuku is a simple and performance aware Rails engine for shortening URLs.
|
data/Steepfile
DELETED
data/rbs_collection.lock.yaml
DELETED
@@ -1,194 +0,0 @@
|
|
1
|
-
---
|
2
|
-
sources:
|
3
|
-
- type: git
|
4
|
-
name: ruby/gem_rbs_collection
|
5
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
6
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
7
|
-
repo_dir: gems
|
8
|
-
path: ".gem_rbs_collection"
|
9
|
-
gems:
|
10
|
-
- name: actionmailer
|
11
|
-
version: '7.0'
|
12
|
-
source:
|
13
|
-
type: git
|
14
|
-
name: ruby/gem_rbs_collection
|
15
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
16
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
17
|
-
repo_dir: gems
|
18
|
-
- name: actionpack
|
19
|
-
version: '6.0'
|
20
|
-
source:
|
21
|
-
type: git
|
22
|
-
name: ruby/gem_rbs_collection
|
23
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
24
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
25
|
-
repo_dir: gems
|
26
|
-
- name: actionview
|
27
|
-
version: '6.0'
|
28
|
-
source:
|
29
|
-
type: git
|
30
|
-
name: ruby/gem_rbs_collection
|
31
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
32
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
33
|
-
repo_dir: gems
|
34
|
-
- name: activejob
|
35
|
-
version: '6.0'
|
36
|
-
source:
|
37
|
-
type: git
|
38
|
-
name: ruby/gem_rbs_collection
|
39
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
40
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
41
|
-
repo_dir: gems
|
42
|
-
- name: activemodel
|
43
|
-
version: '7.0'
|
44
|
-
source:
|
45
|
-
type: git
|
46
|
-
name: ruby/gem_rbs_collection
|
47
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
48
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
49
|
-
repo_dir: gems
|
50
|
-
- name: activerecord
|
51
|
-
version: '7.0'
|
52
|
-
source:
|
53
|
-
type: git
|
54
|
-
name: ruby/gem_rbs_collection
|
55
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
56
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
57
|
-
repo_dir: gems
|
58
|
-
- name: activestorage
|
59
|
-
version: '6.1'
|
60
|
-
source:
|
61
|
-
type: git
|
62
|
-
name: ruby/gem_rbs_collection
|
63
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
64
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
65
|
-
repo_dir: gems
|
66
|
-
- name: activesupport
|
67
|
-
version: '7.0'
|
68
|
-
source:
|
69
|
-
type: git
|
70
|
-
name: ruby/gem_rbs_collection
|
71
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
72
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
73
|
-
repo_dir: gems
|
74
|
-
- name: cgi
|
75
|
-
version: '0'
|
76
|
-
source:
|
77
|
-
type: stdlib
|
78
|
-
- name: concurrent-ruby
|
79
|
-
version: '1.1'
|
80
|
-
source:
|
81
|
-
type: git
|
82
|
-
name: ruby/gem_rbs_collection
|
83
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
84
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
85
|
-
repo_dir: gems
|
86
|
-
- name: date
|
87
|
-
version: '0'
|
88
|
-
source:
|
89
|
-
type: stdlib
|
90
|
-
- name: digest
|
91
|
-
version: '0'
|
92
|
-
source:
|
93
|
-
type: stdlib
|
94
|
-
- name: globalid
|
95
|
-
version: '1.1'
|
96
|
-
source:
|
97
|
-
type: git
|
98
|
-
name: ruby/gem_rbs_collection
|
99
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
100
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
101
|
-
repo_dir: gems
|
102
|
-
- name: i18n
|
103
|
-
version: '1.10'
|
104
|
-
source:
|
105
|
-
type: git
|
106
|
-
name: ruby/gem_rbs_collection
|
107
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
108
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
109
|
-
repo_dir: gems
|
110
|
-
- name: logger
|
111
|
-
version: '0'
|
112
|
-
source:
|
113
|
-
type: stdlib
|
114
|
-
- name: mail
|
115
|
-
version: '2.8'
|
116
|
-
source:
|
117
|
-
type: git
|
118
|
-
name: ruby/gem_rbs_collection
|
119
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
120
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
121
|
-
repo_dir: gems
|
122
|
-
- name: minitest
|
123
|
-
version: '0'
|
124
|
-
source:
|
125
|
-
type: stdlib
|
126
|
-
- name: monitor
|
127
|
-
version: '0'
|
128
|
-
source:
|
129
|
-
type: stdlib
|
130
|
-
- name: mutex_m
|
131
|
-
version: '0'
|
132
|
-
source:
|
133
|
-
type: stdlib
|
134
|
-
- name: nokogiri
|
135
|
-
version: '1.11'
|
136
|
-
source:
|
137
|
-
type: git
|
138
|
-
name: ruby/gem_rbs_collection
|
139
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
140
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
141
|
-
repo_dir: gems
|
142
|
-
- name: rack
|
143
|
-
version: '2.2'
|
144
|
-
source:
|
145
|
-
type: git
|
146
|
-
name: ruby/gem_rbs_collection
|
147
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
148
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
149
|
-
repo_dir: gems
|
150
|
-
- name: rails-dom-testing
|
151
|
-
version: '2.0'
|
152
|
-
source:
|
153
|
-
type: git
|
154
|
-
name: ruby/gem_rbs_collection
|
155
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
156
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
157
|
-
repo_dir: gems
|
158
|
-
- name: railties
|
159
|
-
version: '6.0'
|
160
|
-
source:
|
161
|
-
type: git
|
162
|
-
name: ruby/gem_rbs_collection
|
163
|
-
revision: 87fba082504c606c03edf724cdf2e119bcd46c8c
|
164
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
165
|
-
repo_dir: gems
|
166
|
-
- name: securerandom
|
167
|
-
version: '0'
|
168
|
-
source:
|
169
|
-
type: stdlib
|
170
|
-
- name: singleton
|
171
|
-
version: '0'
|
172
|
-
source:
|
173
|
-
type: stdlib
|
174
|
-
- name: tempfile
|
175
|
-
version: '0'
|
176
|
-
source:
|
177
|
-
type: stdlib
|
178
|
-
- name: time
|
179
|
-
version: '0'
|
180
|
-
source:
|
181
|
-
type: stdlib
|
182
|
-
- name: timeout
|
183
|
-
version: '0'
|
184
|
-
source:
|
185
|
-
type: stdlib
|
186
|
-
- name: tsort
|
187
|
-
version: '0'
|
188
|
-
source:
|
189
|
-
type: stdlib
|
190
|
-
- name: uri
|
191
|
-
version: '0'
|
192
|
-
source:
|
193
|
-
type: stdlib
|
194
|
-
gemfile_lock_path: Gemfile.lock
|
data/rbs_collection.yaml
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
sources:
|
2
|
-
- type: git
|
3
|
-
name: ruby/gem_rbs_collection
|
4
|
-
remote: https://github.com/ruby/gem_rbs_collection.git
|
5
|
-
revision: main
|
6
|
-
repo_dir: gems
|
7
|
-
|
8
|
-
path: .gem_rbs_collection
|
9
|
-
|
10
|
-
gems:
|
11
|
-
- name: rbs
|
12
|
-
ignore: true
|
13
|
-
- name: steep
|
14
|
-
ignore: true
|
15
|
-
- name: tanshuku
|
16
|
-
ignore: true
|
17
|
-
|
18
|
-
- name: digest
|
19
|
-
- name: securerandom
|
@@ -1,114 +0,0 @@
|
|
1
|
-
# cf. https://github.com/pocke/rbs_rails
|
2
|
-
module Tanshuku
|
3
|
-
class Url < ActiveRecord::Base
|
4
|
-
class ActiveRecord_Relation < ActiveRecord::Relation
|
5
|
-
include _ActiveRecord_Relation[Tanshuku::Url, Integer]
|
6
|
-
include Enumerable[Tanshuku::Url]
|
7
|
-
end
|
8
|
-
|
9
|
-
extend _ActiveRecord_Relation_ClassMethods[Tanshuku::Url, ActiveRecord_Relation, Integer]
|
10
|
-
|
11
|
-
DEFAULT_NAMESPACE: String
|
12
|
-
|
13
|
-
module GeneratedAttributeMethods
|
14
|
-
attr_accessor id (): Integer?
|
15
|
-
def id?: () -> bool
|
16
|
-
def id_changed?: () -> bool
|
17
|
-
def id_change: () -> [Integer?, Integer?]
|
18
|
-
def id_will_change!: () -> void
|
19
|
-
def id_was: () -> Integer?
|
20
|
-
def id_previously_changed?: () -> bool
|
21
|
-
def id_previous_change: () -> [Integer?, Integer?]?
|
22
|
-
def id_previously_was: () -> Integer?
|
23
|
-
def id_before_last_save: () -> Integer?
|
24
|
-
def id_change_to_be_saved: () -> [Integer?, Integer?]?
|
25
|
-
def id_in_database: () -> Integer?
|
26
|
-
def saved_change_to_id: () -> [Integer?, Integer?]?
|
27
|
-
def saved_change_to_id?: () -> bool
|
28
|
-
def will_save_change_to_id?: () -> bool
|
29
|
-
def restore_id!: () -> void
|
30
|
-
def clear_id_change: () -> void
|
31
|
-
|
32
|
-
attr_accessor url (): String?
|
33
|
-
def url?: () -> bool
|
34
|
-
def url_changed?: () -> bool
|
35
|
-
def url_change: () -> [String?, String?]
|
36
|
-
def url_will_change!: () -> void
|
37
|
-
def url_was: () -> String?
|
38
|
-
def url_previously_changed?: () -> bool
|
39
|
-
def url_previous_change: () -> [String?, String?]?
|
40
|
-
def url_previously_was: () -> String?
|
41
|
-
def url_before_last_save: () -> String?
|
42
|
-
def url_change_to_be_saved: () -> [String?, String?]?
|
43
|
-
def url_in_database: () -> String?
|
44
|
-
def saved_change_to_url: () -> [String?, String?]?
|
45
|
-
def saved_change_to_url?: () -> bool
|
46
|
-
def will_save_change_to_url?: () -> bool
|
47
|
-
def restore_url!: () -> void
|
48
|
-
def clear_url_change: () -> void
|
49
|
-
|
50
|
-
attr_accessor hashed_url (): String?
|
51
|
-
def hashed_url?: () -> bool
|
52
|
-
def hashed_url_changed?: () -> bool
|
53
|
-
def hashed_url_change: () -> [String?, String?]
|
54
|
-
def hashed_url_will_change!: () -> void
|
55
|
-
def hashed_url_was: () -> String?
|
56
|
-
def hashed_url_previously_changed?: () -> bool
|
57
|
-
def hashed_url_previous_change: () -> [String?, String?]?
|
58
|
-
def hashed_url_previously_was: () -> String?
|
59
|
-
def hashed_url_before_last_save: () -> String?
|
60
|
-
def hashed_url_change_to_be_saved: () -> [String?, String?]?
|
61
|
-
def hashed_url_in_database: () -> String?
|
62
|
-
def saved_change_to_hashed_url: () -> [String?, String?]?
|
63
|
-
def saved_change_to_hashed_url?: () -> bool
|
64
|
-
def will_save_change_to_hashed_url?: () -> bool
|
65
|
-
def restore_hashed_url!: () -> void
|
66
|
-
def clear_hashed_url_change: () -> void
|
67
|
-
|
68
|
-
attr_accessor key (): String?
|
69
|
-
def key?: () -> bool
|
70
|
-
def key_changed?: () -> bool
|
71
|
-
def key_change: () -> [String?, String?]
|
72
|
-
def key_will_change!: () -> void
|
73
|
-
def key_was: () -> String?
|
74
|
-
def key_previously_changed?: () -> bool
|
75
|
-
def key_previous_change: () -> [String?, String?]?
|
76
|
-
def key_previously_was: () -> String?
|
77
|
-
def key_before_last_save: () -> String?
|
78
|
-
def key_change_to_be_saved: () -> [String?, String?]?
|
79
|
-
def key_in_database: () -> String?
|
80
|
-
def saved_change_to_key: () -> [String?, String?]?
|
81
|
-
def saved_change_to_key?: () -> bool
|
82
|
-
def will_save_change_to_key?: () -> bool
|
83
|
-
def restore_key!: () -> void
|
84
|
-
def clear_key_change: () -> void
|
85
|
-
|
86
|
-
attr_accessor created_at (): ActiveSupport::TimeWithZone?
|
87
|
-
def created_at?: () -> bool
|
88
|
-
def created_at_changed?: () -> bool
|
89
|
-
def created_at_change: () -> [ActiveSupport::TimeWithZone?, ActiveSupport::TimeWithZone?]
|
90
|
-
def created_at_will_change!: () -> void
|
91
|
-
def created_at_was: () -> ActiveSupport::TimeWithZone?
|
92
|
-
def created_at_previously_changed?: () -> bool
|
93
|
-
def created_at_previous_change: () -> [ActiveSupport::TimeWithZone?, ActiveSupport::TimeWithZone?]?
|
94
|
-
def created_at_previously_was: () -> ActiveSupport::TimeWithZone?
|
95
|
-
def created_at_before_last_save: () -> ActiveSupport::TimeWithZone?
|
96
|
-
def created_at_change_to_be_saved: () -> [ActiveSupport::TimeWithZone?, ActiveSupport::TimeWithZone?]?
|
97
|
-
def created_at_in_database: () -> ActiveSupport::TimeWithZone?
|
98
|
-
def saved_change_to_created_at: () -> [ActiveSupport::TimeWithZone?, ActiveSupport::TimeWithZone?]?
|
99
|
-
def saved_change_to_created_at?: () -> bool
|
100
|
-
def will_save_change_to_created_at?: () -> bool
|
101
|
-
def restore_created_at!: () -> void
|
102
|
-
def clear_created_at_change: () -> void
|
103
|
-
end
|
104
|
-
include GeneratedAttributeMethods
|
105
|
-
|
106
|
-
def self.shorten: (String original_url, ?namespace: String, ?url_options: Hash[String | Symbol, untyped]) -> String
|
107
|
-
def self.find_by_url: (String url, ?namespace: String) -> Tanshuku::Url?
|
108
|
-
def self.normalize_url: (String url) -> String
|
109
|
-
def self.hash_url: (String url, ?namespace: String) -> String
|
110
|
-
def self.generate_key: -> String
|
111
|
-
def self.report_exception: (exception: Exception, original_url: String) -> void
|
112
|
-
def shortened_url: (?Hash[String | Symbol, untyped] url_options) -> String
|
113
|
-
end
|
114
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module Tanshuku
|
2
|
-
class Configuration
|
3
|
-
interface _UrlHasher
|
4
|
-
def call: (String url, namespace: String) -> String
|
5
|
-
end
|
6
|
-
|
7
|
-
interface _KeyGenerator
|
8
|
-
def call: -> String
|
9
|
-
end
|
10
|
-
|
11
|
-
interface _ExceptionReporter
|
12
|
-
def call: (exception: Exception, original_url: String) -> void
|
13
|
-
end
|
14
|
-
|
15
|
-
extend ActiveModel::Attributes::ClassMethods
|
16
|
-
|
17
|
-
@mutex: Thread::Mutex
|
18
|
-
|
19
|
-
attr_accessor default_url_options (): Hash[String | Symbol, untyped]
|
20
|
-
attr_accessor max_url_length (): Integer
|
21
|
-
attr_accessor url_pattern (): Regexp
|
22
|
-
attr_accessor key_length (): Integer
|
23
|
-
attr_accessor url_hasher (): _UrlHasher
|
24
|
-
attr_accessor key_generator (): _KeyGenerator
|
25
|
-
attr_accessor exception_reporter (): _ExceptionReporter
|
26
|
-
|
27
|
-
def initialize: (*bot noname) -> void
|
28
|
-
def configure: { (Configuration) -> void } -> void
|
29
|
-
|
30
|
-
module DefaultUrlHasher
|
31
|
-
extend _UrlHasher
|
32
|
-
end
|
33
|
-
|
34
|
-
module DefaultKeyGenerator
|
35
|
-
extend _KeyGenerator
|
36
|
-
end
|
37
|
-
|
38
|
-
module DefaultExceptionReporter
|
39
|
-
extend _ExceptionReporter
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
data/sig/lib/tanshuku/engine.rbs
DELETED