tanshuku 0.0.13 → 0.0.15
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 +30 -3
- data/Rakefile +6 -1
- data/app/models/tanshuku/url.rb +53 -22
- data/lib/tanshuku/configuration.rb +165 -7
- data/lib/tanshuku/engine.rb +12 -0
- data/lib/tanshuku/version.rb +1 -1
- data/lib/tanshuku.rb +14 -5
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0324af7c609277e8e090c37de67cb5c6c86cfd6e72944f6b04d36f58e241e76f
|
4
|
+
data.tar.gz: '08ff837c3b7a985ab8cdc849b0bc2b8bda659b4863d5e2b6a6c1c10a8676c977'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9750293fcc5dc6baeb2cc5b3e6ab535a4207c6aaaba0a9c9dfa1647134ed04ac48421d87ef85261210618628ecbf36b654ccc63216ed9e769f062e701f1e5611
|
7
|
+
data.tar.gz: dcbf6e0c7cdda1284d5fadd1a7c9c96beb513e595c94e23902973634035d7c7ff5adbe145406f4cfdf22e5fe8a6c85fea6ba67bd8f95e03a569dae1692584823
|
data/README.md
CHANGED
@@ -31,7 +31,9 @@ end
|
|
31
31
|
|
32
32
|
**Note**: This step is optional.
|
33
33
|
|
34
|
-
**Note**:
|
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
|
+
|
36
|
+
**Note**: Mutating a `Tanshuku::Configuration` object is thread-***unsafe***. It is recommended to use `Tanshuku.configure` for configuration.
|
35
37
|
|
36
38
|
#### `config.default_url_options`
|
37
39
|
|
@@ -52,7 +54,7 @@ end
|
|
52
54
|
|
53
55
|
If an exception occurs when shortening a URL, Tanshuku reports it with configured `config.exception_reporter` object.
|
54
56
|
|
55
|
-
Default value is `Tanshuku::Configuration::DefaultExceptionReporter
|
57
|
+
Default value is [`Tanshuku::Configuration::DefaultExceptionReporter`](https://kg8m.github.io/tanshuku/Tanshuku/Configuration/DefaultExceptionReporter.html). It logs the exception and the original URL with `Rails.logger.warn`.
|
56
58
|
|
57
59
|
Value of `config.exception_reporter` should respond to `#call` with keyword arguments `exception:` and `original_url:`.
|
58
60
|
|
@@ -68,6 +70,10 @@ Tanshuku.configure do |config|
|
|
68
70
|
end
|
69
71
|
```
|
70
72
|
|
73
|
+
#### More information
|
74
|
+
|
75
|
+
cf. [`Tanshuku::Configuration`'s API documentation](https://kg8m.github.io/tanshuku/Tanshuku/Configuration.html)
|
76
|
+
|
71
77
|
### 3. Generate shortened URLs
|
72
78
|
|
73
79
|
#### Basic cases
|
@@ -78,7 +84,7 @@ You can generate a shortened URL with `Tanshuku::Url.shorten`. For example:
|
|
78
84
|
Tanshuku::Url.shorten("https://google.com/") #=> "https://example.com/t/abcdefghij0123456789"
|
79
85
|
```
|
80
86
|
|
81
|
-
[`config.default_url_options`](#
|
87
|
+
[`config.default_url_options`](https://kg8m.github.io/tanshuku/Tanshuku/Configuration.html#default_url_options-instance_method) is used for the shortened URL.
|
82
88
|
|
83
89
|
**Note**: If a `Tanshuku::Url` record for the given URL already exists, no additional record will be created and always the existing record is used.
|
84
90
|
|
@@ -123,6 +129,10 @@ Tanshuku::Url.shorten("https://google.com/", namespace: "a") #=> "https://examp
|
|
123
129
|
Tanshuku::Url.shorten("https://google.com/", namespace: "a") #=> "https://example.com/t/ab01cd23ef45gh67ij89"
|
124
130
|
```
|
125
131
|
|
132
|
+
#### More information
|
133
|
+
|
134
|
+
cf. [`Tanshuku::Url.shorten`'s API documentation](https://kg8m.github.io/tanshuku/Tanshuku/Url.html#shorten-class_method)
|
135
|
+
|
126
136
|
### 4. Share the shortened URLs
|
127
137
|
|
128
138
|
You can share the shortened URLs, e.g., `https://example.com/t/abcdefghij0123456789`.
|
@@ -165,3 +175,20 @@ bin/rails db:migrate
|
|
165
175
|
### \*\* (anything you want) isn't implemented?
|
166
176
|
|
167
177
|
Does Tanshuku have some missing features? Please [create an issue](https://github.com/kg8m/tanshuku/issues/new).
|
178
|
+
|
179
|
+
## How to develop
|
180
|
+
|
181
|
+
1. Fork this repository
|
182
|
+
1. `git clone` your fork
|
183
|
+
1. `bundle install`
|
184
|
+
1. Update sources
|
185
|
+
1. `rake`
|
186
|
+
1. Fix `rake` errors if `rake` fails
|
187
|
+
1. Create a pull request
|
188
|
+
|
189
|
+
## How to release
|
190
|
+
|
191
|
+
1. Make your repository fresh
|
192
|
+
1. `bump current` and confirm the current version
|
193
|
+
1. `bump patch`, `bump minor`, or `bump major`
|
194
|
+
1. `rake release`
|
data/Rakefile
CHANGED
@@ -20,6 +20,11 @@ namespace :yard do
|
|
20
20
|
puts "See http://localhost:8808/"
|
21
21
|
sh "yard server --reload"
|
22
22
|
end
|
23
|
+
|
24
|
+
desc "Check YARD docs"
|
25
|
+
task :check do
|
26
|
+
sh "yard --no-output --no-cache --fail-on-warning"
|
27
|
+
end
|
23
28
|
end
|
24
29
|
|
25
|
-
task default: %i[rubocop spec]
|
30
|
+
task default: %i[rubocop spec yard:check]
|
data/app/models/tanshuku/url.rb
CHANGED
@@ -2,22 +2,30 @@
|
|
2
2
|
|
3
3
|
require "active_record"
|
4
4
|
require "addressable"
|
5
|
-
require "digest/sha2"
|
6
5
|
require "rack"
|
7
|
-
require "securerandom"
|
8
6
|
|
9
7
|
module Tanshuku
|
10
8
|
# An +ActiveRecord::Base+ inherited class for a shortened URL. This class also have some logics for shortening URLs.
|
11
9
|
class Url < ActiveRecord::Base
|
12
|
-
|
10
|
+
# @!attribute [rw] url
|
11
|
+
# @return [String] Original, i.e., non-shortened, URL of the record.
|
12
|
+
#
|
13
|
+
# @!attribute [rw] hashed_url
|
14
|
+
# @return [String] A hashed string of the record's original URL.
|
15
|
+
# @note This attribute is used for uniqueness of the original URL.
|
16
|
+
# @api private
|
17
|
+
#
|
18
|
+
# @!attribute [rw] key
|
19
|
+
# @return [String] A unique key for the record.
|
20
|
+
#
|
21
|
+
# @!attribute [rw] created_at
|
22
|
+
# @return [ActiveSupport::TimeWithZone] A timestamp when the record is created.
|
13
23
|
|
14
|
-
|
15
|
-
URL_PATTERN = %r{\A(?:https?://\w+|/)}
|
16
|
-
KEY_LENGTH = 20
|
24
|
+
DEFAULT_NAMESPACE = ""
|
17
25
|
|
18
26
|
validates :url, :hashed_url, :key, presence: true
|
19
|
-
validates :url, length: { maximum:
|
20
|
-
validates :url, format: { with:
|
27
|
+
validates :url, length: { maximum: proc { Tanshuku.config.max_url_length } }
|
28
|
+
validates :url, format: { with: proc { Tanshuku.config.url_pattern } }, allow_blank: true
|
21
29
|
|
22
30
|
# Don't validate uniqueness of unique attributes. Raise ActiveRecord::RecordNotUnique instead if the attributes get
|
23
31
|
# duplicated. Then rescue the exception and try to retry.
|
@@ -34,8 +42,8 @@ module Tanshuku
|
|
34
42
|
# +shorten("https://google.com")+ have the same result.
|
35
43
|
#
|
36
44
|
# @param original_url [String] The original, i.e., non-shortened, URL.
|
37
|
-
# @param namespace
|
38
|
-
# @param url_options
|
45
|
+
# @param namespace [String] A namespace for shorteting URL. Shortened URLs are unique in namespaces.
|
46
|
+
# @param url_options [Hash] An option for Rails' +url_for+.
|
39
47
|
#
|
40
48
|
# @return [String] A shortened URL if succeeded to shorten the original URL.
|
41
49
|
# @return [String] The original URL if failed to shorten it.
|
@@ -44,6 +52,25 @@ module Tanshuku
|
|
44
52
|
# Tanshuku::Url.shorten("https://google.com/") #=> "http://localhost/t/abcdefghij0123456789"
|
45
53
|
# @example If failed to shorten a URL.
|
46
54
|
# Tanshuku::Url.shorten("https://google.com/") #=> "https://google.com/"
|
55
|
+
# @example With ad hoc URL options.
|
56
|
+
# Tanshuku::Url.shorten("https://google.com/", url_options: { host: "verycool.example.com" })
|
57
|
+
# #=> "https://verycool.example.com/t/0123456789abcdefghij"
|
58
|
+
#
|
59
|
+
# Tanshuku::Url.shorten("https://google.com/", url_options: { protocol: :http })
|
60
|
+
# #=> "http://example.com/t/abcde01234fghij56789"
|
61
|
+
# @example With a namespace.
|
62
|
+
# # When no record exists for "https://google.com/", a new record will be created.
|
63
|
+
# Tanshuku::Url.shorten("https://google.com/") #=> "https://example.com/t/abc012def345ghi678j9"
|
64
|
+
#
|
65
|
+
# # Even when a record already exists for "https://google.com/", an additional record will be created if namespace
|
66
|
+
# # is specified.
|
67
|
+
# Tanshuku::Url.shorten("https://google.com/", namespace: "a") #=> "https://example.com/t/ab01cd23ef45gh67ij89"
|
68
|
+
# Tanshuku::Url.shorten("https://google.com/", namespace: "b") #=> "https://example.com/t/a0b1c2d3e4f5g6h7i8j9"
|
69
|
+
# Tanshuku::Url.shorten("https://google.com/", namespace: "c") #=> "https://example.com/t/abcd0123efgh4567ij89"
|
70
|
+
#
|
71
|
+
# # When the same URL and the same namespace is specified, no additional record will be created.
|
72
|
+
# Tanshuku::Url.shorten("https://google.com/", namespace: "a") #=> "https://example.com/t/ab01cd23ef45gh67ij89"
|
73
|
+
# Tanshuku::Url.shorten("https://google.com/", namespace: "a") #=> "https://example.com/t/ab01cd23ef45gh67ij89"
|
47
74
|
def self.shorten(original_url, namespace: DEFAULT_NAMESPACE, url_options: {})
|
48
75
|
raise ArgumentError, "original_url should be present" unless original_url
|
49
76
|
|
@@ -77,10 +104,10 @@ module Tanshuku
|
|
77
104
|
# Finds a {Tanshuku::Url} record by a non-shortened URL.
|
78
105
|
#
|
79
106
|
# @param url [String] A non-shortened URL.
|
80
|
-
# @param namespace
|
107
|
+
# @param namespace [String] A namespace for the URL.
|
81
108
|
#
|
82
109
|
# @return [Tanshuku::Url] A {Tanshuku::Url} instance if found.
|
83
|
-
# @
|
110
|
+
# @return [nil] +nil+ unless found.
|
84
111
|
def self.find_by_url(url, namespace: DEFAULT_NAMESPACE)
|
85
112
|
normalized_url = normalize_url(url)
|
86
113
|
hashed_url = hash_url(normalized_url, namespace:)
|
@@ -100,31 +127,35 @@ module Tanshuku
|
|
100
127
|
parsed_url.normalize.to_s
|
101
128
|
end
|
102
129
|
|
103
|
-
# Hashes a URL
|
130
|
+
# Hashes a URL.
|
131
|
+
#
|
132
|
+
# @note This method calls {Tanshuku::Configuration#url_hasher}'s +call+ and returns its return value.
|
104
133
|
#
|
105
134
|
# @param url [String] A non-hashed URL.
|
106
|
-
# @param namespace
|
135
|
+
# @param namespace [String] A namespace for the URL.
|
107
136
|
#
|
108
|
-
# @return [String]
|
137
|
+
# @return [String] Depends on your {Tanshuku::Configuration#url_hasher} configuration.
|
109
138
|
def self.hash_url(url, namespace: DEFAULT_NAMESPACE)
|
110
|
-
|
139
|
+
Tanshuku.config.url_hasher.call(url, namespace:)
|
111
140
|
end
|
112
141
|
|
113
|
-
# Generates a key
|
142
|
+
# Generates a unique key for a shortened URL.
|
143
|
+
#
|
144
|
+
# @note This method calls {Tanshuku::Configuration#key_generator}'s +call+ and returns its return value.
|
114
145
|
#
|
115
|
-
# @return [String]
|
146
|
+
# @return [String] Depends on your {Tanshuku::Configuration#key_generator} configuration.
|
116
147
|
def self.generate_key
|
117
|
-
|
148
|
+
Tanshuku.config.key_generator.call
|
118
149
|
end
|
119
150
|
|
120
151
|
# Reports an exception when failed to shorten a URL.
|
121
152
|
#
|
122
153
|
# @note This method calls {Tanshuku::Configuration#exception_reporter}'s +call+ and returns its return value.
|
123
154
|
#
|
124
|
-
# @param exception
|
125
|
-
# @param original_url
|
155
|
+
# @param exception [Exception] An error instance at shortening a URL.
|
156
|
+
# @param original_url [String] The original URL failed to shorten.
|
126
157
|
#
|
127
|
-
# @return [void]
|
158
|
+
# @return [void] Depends on your {Tanshuku::Configuration#exception_reporter} configuration.
|
128
159
|
def self.report_exception(exception:, original_url:)
|
129
160
|
Tanshuku.config.exception_reporter.call(exception:, original_url:)
|
130
161
|
end
|
@@ -1,14 +1,40 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "digest/sha2"
|
4
|
+
require "securerandom"
|
5
|
+
|
3
6
|
module Tanshuku
|
4
7
|
# A class for managing Tanshuku configurations.
|
5
8
|
class Configuration
|
9
|
+
# The default object to hash a URL. Calls +Digest::SHA512.hexdigest+.
|
10
|
+
module DefaultUrlHasher
|
11
|
+
# Calls +Digest::SHA512.hexdigest+ with the given URL string and the given namespace.
|
12
|
+
#
|
13
|
+
# @param url [String] A URL to hash.
|
14
|
+
# @param namespace [String] A namespace for the URL's uniqueness.
|
15
|
+
#
|
16
|
+
# @return [String] A SHA512 digest string from the given url and namespace.
|
17
|
+
def self.call(url, namespace:)
|
18
|
+
Digest::SHA512.hexdigest("#{namespace}#{url}")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# The default unique key generator. Calls +SecureRandom.alphanumeric+ with {Tanshuku::Configuration#key_length}.
|
23
|
+
module DefaultKeyGenerator
|
24
|
+
# Calls +SecureRandom.alphanumeric+ and returns a string with length of {Tanshuku::Configuration#key_length}.
|
25
|
+
#
|
26
|
+
# @return [String] An alphanumeric string with length of {Tanshuku::Configuration#key_length}.
|
27
|
+
def self.call
|
28
|
+
SecureRandom.alphanumeric(Tanshuku.config.key_length)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
6
32
|
# The default error-reporter. Calls +Rails.logger.warn+.
|
7
33
|
module DefaultExceptionReporter
|
8
|
-
#
|
34
|
+
# Calls +Rails.logger.warn+ and logs the exception and the original URL.
|
9
35
|
#
|
10
|
-
# @param exception
|
11
|
-
# @param original_url
|
36
|
+
# @param exception [Exception] An error instance at shortening a URL.
|
37
|
+
# @param original_url [String] The original URL failed to shorten.
|
12
38
|
#
|
13
39
|
# @return [void]
|
14
40
|
def self.call(exception:, original_url:)
|
@@ -23,15 +49,147 @@ module Tanshuku
|
|
23
49
|
#
|
24
50
|
# @return [Hash]
|
25
51
|
# @return [void] If you set an invalid object.
|
52
|
+
#
|
53
|
+
# @note
|
54
|
+
# The example below means that the configured host and protocol are used. Shortened URLs will be like
|
55
|
+
# +https://example.com/t/abcdefghij0123456789+.
|
56
|
+
#
|
57
|
+
# @example
|
58
|
+
# # config/initializers/tanshuku.rb
|
59
|
+
# Tanshuku.configure do |config|
|
60
|
+
# config.default_url_options = { host: "example.com", protocol: :https }
|
61
|
+
# end
|
26
62
|
attribute :default_url_options, default: {}
|
27
63
|
|
64
|
+
# @!attribute [rw] max_url_length
|
65
|
+
# Maximum length of {Tanshuku::Url#url}. Defaults to +10,000+.
|
66
|
+
#
|
67
|
+
# @return [Integer]
|
68
|
+
# @return [void] If you set an invalid object.
|
69
|
+
#
|
70
|
+
# @note
|
71
|
+
# The example below means that {Tanshuku::Url#url} can have a URL string with less than or equal to 20,000
|
72
|
+
# characters.
|
73
|
+
#
|
74
|
+
# @example
|
75
|
+
# # config/initializers/tanshuku.rb
|
76
|
+
# Tanshuku.configure do |config|
|
77
|
+
# config.max_url_length = 20_000
|
78
|
+
# end
|
79
|
+
attribute :max_url_length, :integer, default: 10_000
|
80
|
+
|
81
|
+
# @!attribute [rw] url_pattern
|
82
|
+
# Allowed pattern of {Tanshuku::Url#url}. Defaults to <code>%r{\A(?:https?://\w+|/)}</code>. This default value
|
83
|
+
# forces a URL to start with "http://" or "https://", or to be an absolute path without scheme.
|
84
|
+
#
|
85
|
+
# @return [Regexp]
|
86
|
+
# @return [void] If you set an invalid object.
|
87
|
+
#
|
88
|
+
# @note
|
89
|
+
# The example below means that {Tanshuku::Url#url} should start with a slash +/+.
|
90
|
+
#
|
91
|
+
# @example
|
92
|
+
# # config/initializers/tanshuku.rb
|
93
|
+
# Tanshuku.configure do |config|
|
94
|
+
# config.url_pattern = /\A\//
|
95
|
+
# end
|
96
|
+
attribute :url_pattern, default: %r{\A(?:https?://\w+|/)}
|
97
|
+
|
98
|
+
# @!attribute [rw] key_length
|
99
|
+
# Length of {Tanshuku::Url#key} when {Tanshuku::Configuration#key_generator} is
|
100
|
+
# {Tanshuku::Configuration::DefaultKeyGenerator}. Defaults to +20+.
|
101
|
+
#
|
102
|
+
# @return [Integer]
|
103
|
+
# @return [void] If you set an invalid object.
|
104
|
+
#
|
105
|
+
# @note Don't forget to fix the limit of the +tanshuku_urls.key+ column if you change this value.
|
106
|
+
#
|
107
|
+
# @note
|
108
|
+
# The example below means that {Tanshuku::Url#key} has 10-char string.
|
109
|
+
#
|
110
|
+
# @example
|
111
|
+
# # config/initializers/tanshuku.rb
|
112
|
+
# Tanshuku.configure do |config|
|
113
|
+
# config.key_length = 10
|
114
|
+
# end
|
115
|
+
attribute :key_length, :integer, default: 20
|
116
|
+
|
117
|
+
# @!attribute [rw] url_hasher
|
118
|
+
# A class, module, or object to hash a URL. This should respond to +#call+ with a required positional argument
|
119
|
+
# +url+ and a required keyword argument +namespace:+. Defaults to {Tanshuku::Configuration::DefaultUrlHasher}.
|
120
|
+
#
|
121
|
+
# @return [#call]
|
122
|
+
# A class, module, or object that responds to +#call+ with a required positional argument +url+ and a required
|
123
|
+
# keyword argument +namespace:+.
|
124
|
+
# @return [void] If you set an invalid object.
|
125
|
+
#
|
126
|
+
# @note The example below means that URLs are hashed with +Digest::SHA256.hexdigest+.
|
127
|
+
#
|
128
|
+
# @example
|
129
|
+
# # config/initializers/tanshuku.rb
|
130
|
+
# Tanshuku.configure do |config|
|
131
|
+
# config.url_hasher = ->(url, namespace:) { Digest::SHA256.hexdigest("#{namespace}#{url}") }
|
132
|
+
# end
|
133
|
+
attribute :url_hasher, default: DefaultUrlHasher
|
134
|
+
|
135
|
+
# @!attribute [rw] key_generator
|
136
|
+
# A class, module, or object to generate a unique key for shortened URLs. This should respond to +#call+ without
|
137
|
+
# any arguments. Defaults to {Tanshuku::Configuration::DefaultKeyGenerator}.
|
138
|
+
#
|
139
|
+
# @return [#call]
|
140
|
+
# A class, module, or object that responds to +#call+ without any arguments.
|
141
|
+
# @return [void] If you set an invalid object.
|
142
|
+
#
|
143
|
+
# @note The example below means that unique keys for shortened URLs are generated by +SecureRandom.uuid+.
|
144
|
+
#
|
145
|
+
# @example
|
146
|
+
# # config/initializers/tanshuku.rb
|
147
|
+
# Tanshuku.configure do |config|
|
148
|
+
# config.key_generator = -> { SecureRandom.uuid }
|
149
|
+
# end
|
150
|
+
attribute :key_generator, default: DefaultKeyGenerator
|
151
|
+
|
28
152
|
# @!attribute [rw] exception_reporter
|
29
|
-
# A error-reporter class, module, or object used when shortening a URL fails. This should respond to +#call
|
30
|
-
# Defaults to
|
153
|
+
# A error-reporter class, module, or object used when shortening a URL fails. This should respond to +#call+ with
|
154
|
+
# required keyword arguments +exception:+ and +original_url:+. Defaults to
|
155
|
+
# {Tanshuku::Configuration::DefaultExceptionReporter}.
|
31
156
|
#
|
32
|
-
# @return [
|
33
|
-
# A
|
157
|
+
# @return [#call]
|
158
|
+
# A class, module, or object that responds to +#call+ with required keyword arguments +exception:+ and
|
159
|
+
# +original_url:+.
|
34
160
|
# @return [void] If you set an invalid object.
|
161
|
+
#
|
162
|
+
# @note The example below means that an exception and a URL will be reported to Sentry (https://sentry.io).
|
163
|
+
#
|
164
|
+
# @example
|
165
|
+
# # config/initializers/tanshuku.rb
|
166
|
+
# Tanshuku.configure do |config|
|
167
|
+
# config.exception_reporter =
|
168
|
+
# lambda { |exception:, original_url:|
|
169
|
+
# Sentry.capture_exception(exception, tags: { original_url: })
|
170
|
+
# }
|
171
|
+
# end
|
35
172
|
attribute :exception_reporter, default: DefaultExceptionReporter
|
173
|
+
|
174
|
+
def initialize(...)
|
175
|
+
super
|
176
|
+
@mutex = Mutex.new
|
177
|
+
end
|
178
|
+
|
179
|
+
# Configures Tanshuku thread-safely.
|
180
|
+
#
|
181
|
+
# @yieldparam config [Tanshuku::Configuration] A configuration object that is yielded.
|
182
|
+
# @yieldreturn [void]
|
183
|
+
#
|
184
|
+
# @return [void]
|
185
|
+
#
|
186
|
+
# @note Use {Tanshuku.configure} as a public API for configuration.
|
187
|
+
#
|
188
|
+
# @api private
|
189
|
+
def configure
|
190
|
+
@mutex.synchronize do
|
191
|
+
yield self
|
192
|
+
end
|
193
|
+
end
|
36
194
|
end
|
37
195
|
end
|
data/lib/tanshuku/engine.rb
CHANGED
@@ -2,6 +2,18 @@
|
|
2
2
|
|
3
3
|
module Tanshuku
|
4
4
|
# Tanshuku's Rails engine.
|
5
|
+
#
|
6
|
+
# @note
|
7
|
+
# The example below generates a routing +GET `/t/:key` to `Tanshuku::UrlsController#show`+. When your Rails app
|
8
|
+
# receives a request to +/t/abcdefghij0123456789+, +Tanshuku::UrlsController#show+ will be called and a
|
9
|
+
# +Tanshuku::Url+ record with a key +abcdefghij0123456789+ will be found. Then the request will be redirected to the
|
10
|
+
# +Tanshuku::Url+ record's original URL.
|
11
|
+
#
|
12
|
+
# @example To mount Tanshuku to your Rails app
|
13
|
+
# # config/routes.rb
|
14
|
+
# Rails.application.routes.draw do
|
15
|
+
# mount Tanshuku::Engine, at: "/t"
|
16
|
+
# end
|
5
17
|
class Engine < ::Rails::Engine
|
6
18
|
isolate_namespace Tanshuku
|
7
19
|
|
data/lib/tanshuku/version.rb
CHANGED
data/lib/tanshuku.rb
CHANGED
@@ -9,10 +9,15 @@ module Tanshuku
|
|
9
9
|
# Returns a configuration object for Tanshuku.
|
10
10
|
#
|
11
11
|
# @return [Tanshuku::Configuration]
|
12
|
+
#
|
13
|
+
# @note
|
14
|
+
# Mutating a {Tanshuku::Configuration} object is thread-<em><b>unsafe</b></em>. It is recommended to use
|
15
|
+
# {Tanshuku.configure} for configuration.
|
12
16
|
def self.config
|
13
|
-
|
14
|
-
|
15
|
-
|
17
|
+
# Disable this cop but use `Tanshuku::Configuration#configure` for thread-safety.
|
18
|
+
# rubocop:disable ThreadSafety/InstanceVariableInClassMethod
|
19
|
+
@config ||= Configuration.new
|
20
|
+
# rubocop:enable ThreadSafety/InstanceVariableInClassMethod
|
16
21
|
end
|
17
22
|
|
18
23
|
# Configures Tanshuku.
|
@@ -22,11 +27,15 @@ module Tanshuku
|
|
22
27
|
#
|
23
28
|
# @return [void]
|
24
29
|
#
|
30
|
+
# @note
|
31
|
+
# This method is thread-safe. When mutating a {Tanshuku::Configuration} object for configuration, it is recommended
|
32
|
+
# to use this method.
|
33
|
+
#
|
25
34
|
# @example
|
26
35
|
# Tanshuku.configure do |config|
|
27
36
|
# config.default_url_options = { host: "localhost", protocol: :https }
|
28
37
|
# end
|
29
|
-
def self.configure
|
30
|
-
|
38
|
+
def self.configure(&)
|
39
|
+
config.configure(&)
|
31
40
|
end
|
32
41
|
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.15
|
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-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -70,6 +70,7 @@ metadata:
|
|
70
70
|
homepage_uri: https://github.com/kg8m/tanshuku
|
71
71
|
source_code_uri: https://github.com/kg8m/tanshuku
|
72
72
|
changelog_uri: https://github.com/kg8m/tanshuku/releases
|
73
|
+
documentation_uri: https://kg8m.github.io/tanshuku/
|
73
74
|
rubygems_mfa_required: 'true'
|
74
75
|
post_install_message:
|
75
76
|
rdoc_options: []
|