jellyfish 1.2.0 → 1.2.1

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: 8e0c9e8624941bd890772891cbccf23e550239f1f02789f52090d2835c46fb19
4
- data.tar.gz: 586e35d54a86bfe6b9b4215259366eccaca536e5cb953251ead0c96f50010c02
3
+ metadata.gz: 968788d7fa1a13e68a134a03948a619f2b09e3fb231208db5967039d0bcbaedf
4
+ data.tar.gz: 15e289eafd91bcc1a29ad3a45aae8eb791f5afa4c638bf5d7faec4452ecc8133
5
5
  SHA512:
6
- metadata.gz: 611380d2aedcac5ff8c85ab3ce00ea429d8151334628ef3bd216dd30606e7816178e6b8b3253e99dc8915f479ed9c3f93f0598e9bcc89101ddd15e681a3f1fbb
7
- data.tar.gz: d3f4b682cb5913ba369b6e9e1ceb1b6a2bd20c5dc397e5d230c7741ab9c45dbbe0921e866ce1ec9acc4606d7e5253d6ef77146bb77537e6ffa7e3d5ea818d519
6
+ metadata.gz: 3cf801046630e4fb7752a0c673689b6d4fc137dc33113d740583dd96d2d4c36ad49423b220f4930e1d14e316c8183cc5adac28e6a9240f04f2f443f69ed6a665
7
+ data.tar.gz: 499291e4a77a571352ad48ea54c667539d1800d12eaa8299fb8ba4f3dfdfe0cc014e10eb3975a573bb1eceafa5749910d73bdaab1bf37d3543b71c067c8e9cc8
data/CHANGES.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # CHANGES
2
2
 
3
+ ## Jellyfish 1.2.1 -- 2018-07-21
4
+
5
+ ### Bugs fixed
6
+
7
+ * Fixed mapping with host in some cases (longest match goes first)
8
+ * Fixed scheme matching with https. Now it won't try to map against https
9
+ because it's not that easy to implement and this is how `Rack::URLMap`
10
+ works anyway.
11
+
3
12
  ## Jellyfish 1.2.0 -- 2018-07-14
4
13
 
5
14
  ### Incompatible changes
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: jellyfish 1.2.0 ruby lib
2
+ # stub: jellyfish 1.2.1 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "jellyfish".freeze
6
- s.version = "1.2.0"
6
+ s.version = "1.2.1"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Lin Jen-Shin (godfat)".freeze]
11
- s.date = "2018-07-14"
11
+ s.date = "2018-07-21"
12
12
  s.description = "Pico web framework for building API-centric web applications.\nFor Rack applications or Rack middleware. Around 250 lines of code.\n\nCheck [jellyfish-contrib][] for extra extensions.\n\n[jellyfish-contrib]: https://github.com/godfat/jellyfish-contrib".freeze
13
13
  s.email = ["godfat (XD) godfat.org".freeze]
14
14
  s.files = [
@@ -29,7 +29,7 @@ module Jellyfish
29
29
  end
30
30
 
31
31
  def map path, to: nil, host: nil, &block
32
- key = if host then "http://#{host}/#{path}" else path end
32
+ key = if host then "http://#{File.join(host, path)}" else path end
33
33
  (@map ||= {})[key] = [block, to]
34
34
  end
35
35
 
@@ -1,4 +1,6 @@
1
1
 
2
+ require 'uri'
3
+
2
4
  module Jellyfish
3
5
  class URLMap
4
6
  def initialize mapped_not_chomped
@@ -6,7 +8,7 @@ module Jellyfish
6
8
  keys = mapped.keys
7
9
  @no_host = !keys.any?{ |k| match?(k, %r{\Ahttps?://}) }
8
10
 
9
- string = keys.sort_by{ |k| -k.size }.
11
+ string = sort_keys(keys).
10
12
  map{ |k| build_regexp(k) }.
11
13
  join('|')
12
14
 
@@ -36,7 +38,7 @@ module Jellyfish
36
38
  else
37
39
  File.join(host, script_name)
38
40
  end
39
- "#{env['rack.url_scheme']}://#{host_with_path}"
41
+ "http://#{host_with_path}"
40
42
  else
41
43
  script_name
42
44
  end
@@ -87,5 +89,13 @@ module Jellyfish
87
89
  string =~ regexp
88
90
  end
89
91
  end
92
+
93
+ def sort_keys keys
94
+ keys.sort_by do |k|
95
+ uri = URI.parse(k)
96
+
97
+ [-uri.path.to_s.size, -uri.host.to_s.size]
98
+ end
99
+ end
90
100
  end
91
101
  end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Jellyfish
3
- VERSION = '1.2.0'
3
+ VERSION = '1.2.1'
4
4
  end
@@ -8,8 +8,11 @@ describe Jellyfish::URLMap do
8
8
  lam = lambda{ |env| [200, {}, ["lam #{env['HTTP_HOST']}"]] }
9
9
  ram = lambda{ |env| [200, {}, ["ram #{env['HTTP_HOST']}"]] }
10
10
 
11
- def call app, host, path='/'
12
- get('/', app, 'HTTP_HOST' => host, 'PATH_INFO' => path).dig(-1, 0)
11
+ def call app, host, path: '/', scheme: 'http'
12
+ get('/', app,
13
+ 'HTTP_HOST' => host,
14
+ 'PATH_INFO' => path,
15
+ 'rack.url_scheme' => scheme).dig(-1, 0)
13
16
  end
14
17
 
15
18
  would 'map host' do
@@ -25,6 +28,58 @@ describe Jellyfish::URLMap do
25
28
  expect(call(app, 'lust')).eq 'ram lust'
26
29
  end
27
30
 
31
+ would 'map host with path' do
32
+ app = Jellyfish::Builder.app do
33
+ map '/path', host: 'host' do
34
+ run lam
35
+ end
36
+
37
+ map '/path' do
38
+ run ram
39
+ end
40
+ end
41
+
42
+ expect(call(app, 'host', path: '/path')).eq 'lam host'
43
+ expect(call(app, 'lust', path: '/path')).eq 'ram lust'
44
+ end
45
+
46
+ would 'map longest path first' do
47
+ app = Jellyfish::Builder.app do
48
+ map '/long/path' do
49
+ run lam
50
+ end
51
+
52
+ map '/', host: 'super-long-host' do
53
+ run ram
54
+ end
55
+ end
56
+
57
+ expect(call(app, 'super-long-host', path: '/long/path')).
58
+ eq 'lam super-long-host'
59
+ end
60
+
61
+ would 'map host with http or https' do
62
+ app = Jellyfish::Builder.app do
63
+ map '/', host: 'host' do
64
+ run lam
65
+ end
66
+ end
67
+
68
+ expect(call(app, 'host')).eq 'lam host'
69
+ expect(call(app, 'host', scheme: 'https')).eq 'lam host'
70
+ end
71
+
72
+ would 'map http with http or https' do
73
+ app = Jellyfish::Builder.app do
74
+ map 'http://host/' do
75
+ run lam
76
+ end
77
+ end
78
+
79
+ expect(call(app, 'host')).eq 'lam host'
80
+ expect(call(app, 'host', scheme: 'https')).eq 'lam host'
81
+ end
82
+
28
83
  would 'listen' do
29
84
  app = Jellyfish::Builder.app do
30
85
  listen 'host' do
@@ -56,9 +111,9 @@ describe Jellyfish::URLMap do
56
111
  end
57
112
  end
58
113
 
59
- expect(call(app, 'host', '/host')).eq 'lam host'
60
- expect(call(app, 'lust', '/lust')).eq 'ram lust'
61
- expect(call(app, 'boom', '/host')).eq nil
62
- expect(call(app, 'boom', '/lust')).eq nil
114
+ expect(call(app, 'host', path: '/host')).eq 'lam host'
115
+ expect(call(app, 'lust', path: '/lust')).eq 'ram lust'
116
+ expect(call(app, 'boom', path: '/host')).eq nil
117
+ expect(call(app, 'boom', path: '/lust')).eq nil
63
118
  end
64
119
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jellyfish
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lin Jen-Shin (godfat)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-14 00:00:00.000000000 Z
11
+ date: 2018-07-21 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |-
14
14
  Pico web framework for building API-centric web applications.