morito 0.0.3 → 0.0.4

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
  SHA1:
3
- metadata.gz: 1c55decebb4c9e07810ea06f3f21d8f40088faa5
4
- data.tar.gz: 1268725db5c75afe009299dbd5f3c29e3780ba80
3
+ metadata.gz: a412f513664688f5e6e21294420c1ddfb5e45912
4
+ data.tar.gz: 8e086dc2f01c5d77afd1510e032e617494a03593
5
5
  SHA512:
6
- metadata.gz: f36208dbab6355df0c691c3f4cef8783abbf10ae211c7b8440df5bd951380d4db4c0f452391f95e3b7a8e9b54c93f1a5aedea890edcaf495784ef2a1e0c120ee
7
- data.tar.gz: 58dae02a4a09fa4529f6889a8da4597431a857285938c03e887813797347069ac34995dbde8ca756eec89537e4026c26f5929c4570bbc289fe27d55fa60af63c
6
+ metadata.gz: 7e5032b8ce8aabed98cdd427fbf8e72439073a16afda6cafce49107176fbdbb5c682378a1524cab46a77fa31c8198651c4c2b07e146195ac93aad8f9d7d15778
7
+ data.tar.gz: ec019f3ffd0c72b9895180811770c65cad776b281cba50e5a0ee91b8d7bdedc837d5ba4dd9ede71260aef72ff6e1f6ea95e68c8fb999a552cd904094a3e828c1
data/README.md CHANGED
@@ -27,7 +27,6 @@ client.allowed?('http://example.com/some/path', cache: false) # => true / false
27
27
  ## TODO
28
28
 
29
29
  - Handle `Allow:` description.
30
- - Pattern matching like `Disallow: /*?`
31
30
 
32
31
  ## Contributing
33
32
 
@@ -5,63 +5,101 @@ module Morito
5
5
  end
6
6
 
7
7
  def allowed?(user_agent, path)
8
- disallows = disallows_for(user_agent)
9
-
10
- if disallows.empty?
11
- true
12
- else
13
- regexp = Regexp.new("\\A(?:#{disallows.join('|')})")
14
- regexp !~ path
15
- end
8
+ UserAgentPermission.new(user_agent, whole_permission).allowed?(path)
16
9
  end
17
10
 
18
11
  private
19
12
 
20
- def disallows_for(user_agent)
21
- build
13
+ def whole_permission
14
+ return @whole_permission if @whole_permission
15
+
16
+ @whole_permission = Hash.new {|h, k| h[k] = Hash.new {|h2, k2| h2[k2] = [] } }
17
+ parser = LineParser.new
22
18
 
23
- if !@disallows[user_agent].empty?
24
- @disallows[user_agent]
25
- else
26
- @disallows['*']
19
+ @body.split(/\n+/).each do |line|
20
+ parser.parse(line)
21
+ if parser.disallow?
22
+ @whole_permission[parser.user_agent][:disallow] << parser.disallow
23
+ elsif parser.allow?
24
+ @whole_permission[parser.user_agent][:allow] << parser.allow
25
+ end
27
26
  end
27
+
28
+ @whole_permission
28
29
  end
29
30
 
30
- def build
31
- return if @disallows
32
- @disallows = Hash.new {|h, k| h[k] = [] }
31
+ class UserAgentPermission
32
+ def initialize(user_agent, whole_permission)
33
+ @user_agent = user_agent
33
34
 
34
- parser = LineParser.new
35
- @body.split(/\n+/).each do |line|
36
- parser.parse(line)
37
- @disallows[parser.user_agent] << parser.disallow if parser.disallow?
35
+ if whole_permission[user_agent].empty?
36
+ @permission = whole_permission['*']
37
+ else
38
+ @permission = whole_permission[user_agent]
39
+ end
40
+ end
41
+
42
+ def allowed?(path)
43
+ return true if disallow_unavailable?
44
+
45
+ if !allow_unavailable? && regexp(:allow) =~ path
46
+ true
47
+ else
48
+ regexp(:disallow) !~ path
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def allow_unavailable?
55
+ @permission[:allow].empty?
56
+ end
57
+
58
+ def disallow_unavailable?
59
+ @permission[:disallow].empty?
38
60
  end
39
61
 
40
- @disallows
62
+ def regexp(type)
63
+ raise ArgumentError unless @permission.keys.include?(type)
64
+
65
+ raw_regexps = @permission[type].map do |permission|
66
+ Regexp.escape(permission).gsub('\*', '.*').gsub('\$', '$')
67
+ end
68
+
69
+ Regexp.new("\\A(?:#{raw_regexps.join('|')})")
70
+ end
41
71
  end
42
72
 
43
73
  class LineParser
44
- attr_reader :user_agent
74
+ attr_reader :user_agent, :allow, :disallow
45
75
 
46
76
  def parse(line)
77
+ clear_permissions
78
+
47
79
  case line
48
80
  when /\AUser-agent:\s+(.+?)\s*(?:#.+)?\z/i
49
81
  @user_agent = $1
50
- @disallow = nil
51
82
  when /\ADisallow:\s+(.+?)\s*(?:#.+)?\z/i
52
83
  @disallow = $1
53
- else
54
- @disallow = nil
84
+ when /\AAllow:\s+(.+?)\s*(?:#.+)?\z/i
85
+ @allow = $1
55
86
  end
56
87
  end
57
88
 
58
- def disallow
59
- Regexp.escape(@disallow).gsub('\*', '.*').gsub('\$', '$')
89
+ def allow?
90
+ @user_agent && @allow
60
91
  end
61
92
 
62
93
  def disallow?
63
94
  @user_agent && @disallow
64
95
  end
96
+
97
+ private
98
+
99
+ def clear_permissions
100
+ @disallow = nil
101
+ @allow = nil
102
+ end
65
103
  end
66
104
  end
67
105
  end
@@ -1,3 +1,3 @@
1
1
  module Morito
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -14,6 +14,7 @@ describe Morito::Client do
14
14
  User-agent: *
15
15
  Disallow: /private
16
16
  Disallow: /*?$
17
+ Allow: /private/photo
17
18
 
18
19
  # Comment
19
20
  User-agent: restricted agent # Comment
@@ -67,6 +68,15 @@ EOS
67
68
  end
68
69
  end
69
70
 
71
+ context 'with private but allowed path' do
72
+ let(:requesting_url) { 'http://example.com/private/photo/1' }
73
+
74
+ context 'with some agent' do
75
+ let(:user_agent) { 'some agent' }
76
+ it { should == true }
77
+ end
78
+ end
79
+
70
80
  context 'with patternized path' do
71
81
  let(:user_agent) { 'some agent' }
72
82
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: morito
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - negipo