redirectly 0.1.1 → 0.1.2

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: 07d69d903b03e28e92766735ab44db1c243bbae86491a43b9ff0b24de325ebbc
4
- data.tar.gz: f3f48ba2349caf72bd63613537d638558a0a0cac0374ba29931a6dd3b8b0cb20
3
+ metadata.gz: d11d303417a59a9ef3a9fd2c970233c31d2810ae52ca945600bd42ee129c8d5a
4
+ data.tar.gz: 82076365bdb96e6486a099573155fba968ddf2d6a03a6b1547d72afcb903bf7f
5
5
  SHA512:
6
- metadata.gz: eff123b2ad167f2088cb7bbf9f4b66b450e17ad9eea457d3f201f4dde8819a9d8fcc9ec1e9997df0ec1ee5838ab0eeb536501d9f54f80490ac05d1c7b650d146
7
- data.tar.gz: ce4b1c849af4cd096ae5caeca10ae92b873098f5c1890954b0eaa1930ef07fff1fc8c1e14666f3ddad940b75460d58fb3c78cb88a355ac9ea7bb2dfb06947437
6
+ metadata.gz: 8edef52f11f59f8f06cd76b36e9d7d8e293620f8e49c94183895c643c74d2d399b228a3a4b39b713e0cbc3b8d7a4e33aaeaac6c6b5e8ceac3f831b1642e6cb7a
7
+ data.tar.gz: 95cbace8f96efe12fa38f08347fd4565b7ab68c798829bcf39bd0919d2f99906a218474c73867fce9d726ebe8ca0fa0e7d0f5d24d5dcca17a4ceaa966ec56633
data/bin/redirectly CHANGED
@@ -8,18 +8,15 @@ router = Redirectly::CLI.router
8
8
 
9
9
  begin
10
10
  exit router.run ARGV
11
-
12
11
  rescue Interrupt
13
12
  say "\nGoodbye"
14
- exit 1
15
-
13
+ exit 1
16
14
  rescue => e
17
15
  if ENV['DEBUG']
18
- puts e.backtrace.reverse
19
- say ""
16
+ puts e.backtrace.reverse
17
+ say ''
20
18
  end
21
- say "!undred!ERROR: #{e.class}"
19
+ say "ru`ERROR: #{e.class}`"
22
20
  say e.message
23
21
  exit 1
24
-
25
- end
22
+ end
@@ -6,58 +6,85 @@ module Redirectly
6
6
  class App
7
7
  using Refinements
8
8
 
9
- attr_reader :config_path
9
+ attr_reader :config_path, :req
10
10
 
11
11
  def initialize(config_path)
12
12
  @config_path = config_path
13
13
  end
14
14
 
15
15
  def call(env)
16
- req = Rack::Request.new(env)
17
- found = match req
16
+ @req = Rack::Request.new env
17
+ found = match
18
18
 
19
19
  if found
20
- if found.start_with? '!'
21
- code, target = 301, found[1..-1]
22
- else
23
- code, target = 302, found
24
- end
25
-
26
- [code, {'Location' => target}, []]
27
-
20
+ redirect_to found
28
21
  else
29
- [404, {'Content-Type' => 'text/plain'}, ['Not Found']]
30
-
22
+ not_found
31
23
  end
32
24
  end
33
25
 
34
26
  private
35
27
 
28
+ def redirect_to(target)
29
+ code = 302
30
+
31
+ if target.start_with? '!'
32
+ code = 301
33
+ target = target[1..]
34
+ end
35
+
36
+ [code, { 'Location' => target }, []]
37
+ end
38
+
39
+ def not_found
40
+ [404, { 'Content-Type' => 'text/plain' }, ['Not Found']]
41
+ end
42
+
36
43
  def redirects
37
44
  @redirects ||= ini_read(config_path)
38
45
  end
39
46
 
40
47
  def ini_read(path)
41
- content = File.readlines(path, chomp:true).reject { |line| line.comment? }
42
- content.map { |line| line.split(/\s*=\s*/, 2) }.to_h
48
+ content = File.readlines(path, chomp: true).reject(&:comment?)
49
+ content.to_h { |line| line.split(/\s*=\s*/, 2) }
43
50
  end
44
51
 
45
- def match(req)
52
+ def match
46
53
  redirects.each do |pattern, target|
47
- pattern = "#{pattern}/" unless pattern.include? "/"
48
- requested = "#{req.host}#{req.path}"
49
- matcher = Mustermann.new(pattern)
50
- params = matcher.params(requested)
51
- if params
52
- params.transform_keys! &:to_sym
53
- params.delete :splat
54
- params.transform_values! { |v| CGI.escape v }
55
- return target % params
56
- end
54
+ found = find_target pattern, target
55
+ return found if found
57
56
  end
58
57
 
59
58
  nil
60
59
  end
61
60
 
61
+ def find_target(pattern, target)
62
+ params = get_params pattern
63
+ params ? composite_target(target, params) : nil
64
+ end
65
+
66
+ def get_params(pattern)
67
+ pattern = "#{pattern}/" unless pattern.include? '/'
68
+ requested = "#{req.host}#{req.path}"
69
+ matcher = Mustermann.new pattern
70
+ params = matcher.params requested
71
+
72
+ if params
73
+ params.transform_keys!(&:to_sym)
74
+ params.delete :splat
75
+ params.transform_values! { |v| CGI.escape v }
76
+ end
77
+
78
+ params
79
+ end
80
+
81
+ def composite_target(target, params)
82
+ result = target % params
83
+ unless req.query_string.empty?
84
+ glue = result.include?('?') ? '&' : '?'
85
+ result = "#{result}#{glue}#{req.query_string}"
86
+ end
87
+ result
88
+ end
62
89
  end
63
90
  end
@@ -5,7 +5,7 @@ module Redirectly
5
5
  class CLI
6
6
  def self.router
7
7
  router = MisterBin::Runner.new version: VERSION,
8
- header: "Redirectly Redirect Server"
8
+ header: 'Redirectly Redirect Server'
9
9
 
10
10
  router.route_all to: Command
11
11
  router
@@ -1,41 +1,39 @@
1
- require "colsole"
2
- require "mister_bin"
1
+ require 'colsole'
2
+ require 'mister_bin'
3
3
 
4
4
  module Redirectly
5
5
  class Command < MisterBin::Command
6
6
  include Colsole
7
- help "Start the redirect server"
7
+ help 'Start the redirect server'
8
8
  version Redirectly::VERSION
9
9
 
10
- usage "redirectly [CONFIG --port PORT]"
11
- usage "redirectly --init"
12
- usage "redirectly --help | --version"
10
+ usage 'redirectly [CONFIG --port PORT]'
11
+ usage 'redirectly --init'
12
+ usage 'redirectly --help | --version'
13
13
 
14
- option "-p --port PORT", "Listening port [default: 3000]"
15
- option "-i --init", "Create a sample config file and exit"
14
+ option '-p --port PORT', 'Listening port [default: 3000]'
15
+ option '-i --init', 'Create a sample config file and exit'
16
16
 
17
- param "CONFIG", "Path to config file [default: redirects.ini]"
17
+ param 'CONFIG', 'Path to config file [default: redirects.ini]'
18
18
 
19
- example "redirectly --init"
20
- example "redirectly config.ini"
19
+ example 'redirectly --init'
20
+ example 'redirectly config.ini'
21
21
 
22
22
  attr_reader :config_path, :port
23
23
 
24
24
  def run
25
25
  @port = args['--port'].to_i
26
- @config_path = args['CONFIG'] || "redirects.ini"
26
+ @config_path = args['CONFIG'] || 'redirects.ini'
27
27
  args['--init'] ? init_file : start_server
28
28
  end
29
29
 
30
30
  private
31
31
 
32
32
  def init_file
33
- if File.exist? config_path
34
- raise ArgumentError, "#{config_path} already exists"
35
- else
36
- File.write config_path, template
37
- say "Initialized #{config_path}"
38
- end
33
+ raise ArgumentError, "#{config_path} already exists" if File.exist? config_path
34
+
35
+ File.write config_path, template
36
+ say "Initialized #{config_path}"
39
37
  end
40
38
 
41
39
  def template
@@ -50,6 +48,7 @@ module Redirectly
50
48
 
51
49
  def start_server
52
50
  raise ArgumentError, "Cannot find config file #{config_path}" unless File.exist? config_path
51
+
53
52
  Rack::Server.start(app: app, Port: port, environment: 'production')
54
53
  end
55
54
 
@@ -1,3 +1,3 @@
1
1
  module Redirectly
2
- VERSION = "0.1.1"
2
+ VERSION = '0.1.2'
3
3
  end
data/lib/redirectly.rb CHANGED
@@ -1,5 +1,5 @@
1
- require "byebug" if ENV["BYEBUG"]
1
+ require 'byebug' if ENV['BYEBUG']
2
2
 
3
- require "redirectly/refinements"
4
- require "redirectly/version"
5
- require "redirectly/app"
3
+ require 'redirectly/refinements'
4
+ require 'redirectly/version'
5
+ require 'redirectly/app'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redirectly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danny Ben Shitrit
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-05 00:00:00.000000000 Z
11
+ date: 2023-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mister_bin
@@ -25,47 +25,59 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.7'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rack
28
+ name: mustermann
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '2.2'
33
+ version: '1.1'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '4'
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: '2.2'
43
+ version: '1.1'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '4'
41
47
  - !ruby/object:Gem::Dependency
42
- name: mustermann
48
+ name: puma
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
- - - "~>"
51
+ - - ">="
46
52
  - !ruby/object:Gem::Version
47
- version: '1.1'
53
+ version: '5.3'
54
+ - - "<"
55
+ - !ruby/object:Gem::Version
56
+ version: '7'
48
57
  type: :runtime
49
58
  prerelease: false
50
59
  version_requirements: !ruby/object:Gem::Requirement
51
60
  requirements:
52
- - - "~>"
61
+ - - ">="
53
62
  - !ruby/object:Gem::Version
54
- version: '1.1'
63
+ version: '5.3'
64
+ - - "<"
65
+ - !ruby/object:Gem::Version
66
+ version: '7'
55
67
  - !ruby/object:Gem::Dependency
56
- name: puma
68
+ name: rack
57
69
  requirement: !ruby/object:Gem::Requirement
58
70
  requirements:
59
71
  - - "~>"
60
72
  - !ruby/object:Gem::Version
61
- version: '5.3'
73
+ version: '2.2'
62
74
  type: :runtime
63
75
  prerelease: false
64
76
  version_requirements: !ruby/object:Gem::Requirement
65
77
  requirements:
66
78
  - - "~>"
67
79
  - !ruby/object:Gem::Version
68
- version: '5.3'
80
+ version: '2.2'
69
81
  description: Redirect server with dynamic URL and hostname support
70
82
  email: db@dannyben.com
71
83
  executables:
@@ -87,6 +99,7 @@ licenses:
87
99
  metadata:
88
100
  bug_tracker_uri: https://github.com/DannyBen/redirectly/issues
89
101
  source_code_uri: https://github.com/dannyben/redirectly
102
+ rubygems_mfa_required: 'true'
90
103
  post_install_message:
91
104
  rdoc_options: []
92
105
  require_paths:
@@ -95,14 +108,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
95
108
  requirements:
96
109
  - - ">="
97
110
  - !ruby/object:Gem::Version
98
- version: 2.5.0
111
+ version: 2.6.0
99
112
  required_rubygems_version: !ruby/object:Gem::Requirement
100
113
  requirements:
101
114
  - - ">="
102
115
  - !ruby/object:Gem::Version
103
116
  version: '0'
104
117
  requirements: []
105
- rubygems_version: 3.2.16
118
+ rubygems_version: 3.4.8
106
119
  signing_key:
107
120
  specification_version: 4
108
121
  summary: Redirectly redirect server