Skip to content

Commit 9ab1a91

Browse files
author
pgaref
committed
Using simple enum instead of multi-enum to address #32. Taking advantage of enum metaclass to support multiple value aliases per Enum.
TestCase provided shows that unknown Anonymity type values default to UNKNOWN
1 parent 523341b commit 9ab1a91

File tree

4 files changed

+76
-13
lines changed

4 files changed

+76
-13
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ python:
44
- "3.3"
55
- "3.4"
66
- "3.5"
7-
# - "3.6" Currently not suported by enum34_custom need to customize
7+
- "3.6"
88
sudo: false
99
before_install:
1010
- python --version

http_request_randomizer/requests/proxy/ProxyObject.py

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from enum_custom import MultiValueEnum
1+
from enum import EnumMeta, Enum
22

33

44
class ProxyObject(object):
@@ -37,16 +37,34 @@ def to_str(self):
3737
self.tunnel)
3838

3939

40-
class AnonymityLevel(MultiValueEnum):
40+
class AnonymityEnumMeta(EnumMeta):
41+
def __call__(cls, value, *args, **kw):
42+
if isinstance(value, str):
43+
# map string Alias to enum values, defaults to Unknown
44+
value = {
45+
'transparent': 1,
46+
'transparent proxy': 1,
47+
'LOW': 1,
48+
'anonymous': 2,
49+
'anonymous proxy': 2,
50+
'high-anonymous': 2,
51+
'elite': 3,
52+
'elite proxy': 3,
53+
'HIGH': 3
54+
}.get(value, 0)
55+
return super(AnonymityEnumMeta, cls).__call__(value, *args, **kw)
56+
57+
58+
class AnonymityLevel(Enum):
59+
__metaclass__ = AnonymityEnumMeta
4160
"""
61+
UNKNOWN: The proxy anonymity capabilities are not exposed
4262
TRANSPARENT: The proxy does not hide the requester's IP address.
43-
ANONYMOUS: The proxy hides the requester's IP address, but adds headers to the forwarded request that make it clear that the request was made using a proxy.
63+
ANONYMOUS: The proxy hides the requester's IP address, but adds headers to the forwarded request that make it clear
64+
that the request was made using a proxy.
4465
ELITE: The proxy hides the requester's IP address and does not add any proxy-related headers to the request.
45-
UNKNOWN: The proxy anonymity capabilities are not exposed
4666
"""
47-
TRANSPARENT = 'transparent', 'transparent proxy', 'LOW'
48-
ANONYMOUS = 'anonymous', 'anonymous proxy', 'high-anonymous'
49-
ELITE = 'elite', 'elite proxy', 'HIGH'
50-
UNKNOWN = 'unknown', 'none'
51-
# TODO @pgaref: use a default case instead!!!
52-
BAD = "bad", "bad1"
67+
UNKNOWN = 0 # default
68+
TRANSPARENT = 1
69+
ANONYMOUS = 2
70+
ELITE = 3

requirements.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,4 @@ pytest-cov == 2.5.1
77
python-dateutil == 2.6.1
88
requests == 2.18.1
99
schedule == 0.4.3
10-
pyOpenSSL == 17.1.0
11-
enum34-custom == 0.7.2
10+
pyOpenSSL == 17.1.0

tests/test_proxyObject.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from __future__ import absolute_import
2+
3+
import unittest
4+
import sys
5+
import os
6+
7+
sys.path.insert(0, os.path.abspath('.'))
8+
9+
from http_request_randomizer.requests.proxy.ProxyObject import AnonymityLevel
10+
11+
12+
class TestProxyObject(unittest.TestCase):
13+
14+
def test_AnonymityLevels(self):
15+
self.assertTrue(AnonymityLevel.UNKNOWN.value == 0)
16+
self.assertTrue(AnonymityLevel.TRANSPARENT.value == 1)
17+
self.assertTrue(AnonymityLevel.ANONYMOUS.value == 2)
18+
self.assertTrue(AnonymityLevel.ELITE.value == 3)
19+
self.assertTrue(len(AnonymityLevel) == 4) # Enum values
20+
21+
def test_UnknownEnumLevel(self):
22+
self.assertEqual(AnonymityLevel.UNKNOWN, AnonymityLevel('unknown'))
23+
self.assertEqual(AnonymityLevel.UNKNOWN, AnonymityLevel('none'))
24+
self.assertEqual(AnonymityLevel.UNKNOWN, AnonymityLevel('bad'))
25+
self.assertEqual(AnonymityLevel.UNKNOWN, AnonymityLevel(''))
26+
self.assertEqual(AnonymityLevel.UNKNOWN, AnonymityLevel('*'))
27+
self.assertEqual(AnonymityLevel.UNKNOWN, AnonymityLevel('??'))
28+
29+
def test_TransparentEnumLevel(self):
30+
self.assertEqual(AnonymityLevel.TRANSPARENT, AnonymityLevel('transparent'))
31+
self.assertEqual(AnonymityLevel.TRANSPARENT, AnonymityLevel('transparent proxy'))
32+
self.assertEqual(AnonymityLevel.TRANSPARENT, AnonymityLevel('LOW'))
33+
34+
def test_AnonymousEnumLevel(self):
35+
self.assertEqual(AnonymityLevel.ANONYMOUS, AnonymityLevel('anonymous'))
36+
self.assertEqual(AnonymityLevel.ANONYMOUS, AnonymityLevel('anonymous proxy'))
37+
self.assertEqual(AnonymityLevel.ANONYMOUS, AnonymityLevel('high-anonymous'))
38+
39+
def test_EliteEnumLevel(self):
40+
self.assertEqual(AnonymityLevel.ELITE, AnonymityLevel('elite'))
41+
self.assertEqual(AnonymityLevel.ELITE, AnonymityLevel('elite proxy'))
42+
self.assertEqual(AnonymityLevel.ELITE, AnonymityLevel('HIGH'))
43+
44+
45+
if __name__ == '__main__':
46+
unittest.main()

0 commit comments

Comments
 (0)