|
16 | 16 | # along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17 | 17 |
|
18 | 18 | importurllib.parse
|
19 |
| -fromtypingimportAny,Callable,Dict,Optional,overload,Union |
| 19 | +fromtypingimportAny,Callable,Dict,Optional,Union |
20 | 20 |
|
21 | 21 | importrequests
|
22 | 22 |
|
@@ -71,83 +71,18 @@ class EncodedId(str):
|
71 | 71 | https://docs.gitlab.com/ee/api/index.html#path-parameters
|
72 | 72 | """
|
73 | 73 |
|
74 |
| -# `original_str` will contain the original string value that was used to create the |
75 |
| -# first instance of EncodedId. We will use this original value to generate the |
76 |
| -# URL-encoded value each time. |
77 |
| -original_str:str |
78 |
| - |
79 |
| -def__new__(cls,value:Union[str,int,"EncodedId"])->"EncodedId": |
80 |
| -# __new__() gets called before __init__() |
81 |
| -ifisinstance(value,int): |
82 |
| -value=str(value) |
83 |
| -# Make sure isinstance() for `EncodedId` comes before check for `str` as |
84 |
| -# `EncodedId` is an instance of `str` and would pass that check. |
85 |
| -elifisinstance(value,EncodedId): |
86 |
| -# We use the original string value to URL-encode |
87 |
| -value=value.original_str |
88 |
| -elifisinstance(value,str): |
89 |
| -pass |
90 |
| -else: |
91 |
| -raiseValueError(f"Unsupported type received:{type(value)}") |
92 |
| -# Set the value our string will return |
| 74 | +# mypy complains if return type other than the class type. So we ignore issue. |
| 75 | +def__new__(# type: ignore |
| 76 | +cls,value:Union[str,int,"EncodedId"] |
| 77 | + )->Union[int,"EncodedId"]: |
| 78 | +ifisinstance(value, (int,EncodedId)): |
| 79 | +returnvalue |
| 80 | + |
| 81 | +ifnotisinstance(value,str): |
| 82 | +raiseTypeError(f"Unsupported type received:{type(value)}") |
93 | 83 | value=urllib.parse.quote(value,safe="")
|
94 | 84 | returnsuper().__new__(cls,value)
|
95 | 85 |
|
96 |
| -def__init__(self,value:Union[int,str])->None: |
97 |
| -# At this point `super().__str__()` returns the URL-encoded value. Which means |
98 |
| -# when using this as a `str` it will return the URL-encoded value. |
99 |
| -# |
100 |
| -# But `value` contains the original value passed in `EncodedId(value)`. We use |
101 |
| -# this to always keep the original string that was received so that no matter |
102 |
| -# how many times we recurse we only URL-encode our original string once. |
103 |
| -ifisinstance(value,int): |
104 |
| -value=str(value) |
105 |
| -# Make sure isinstance() for `EncodedId` comes before check for `str` as |
106 |
| -# `EncodedId` is an instance of `str` and would pass that check. |
107 |
| -elifisinstance(value,EncodedId): |
108 |
| -# This is the key part as we are always keeping the original string even |
109 |
| -# through multiple recursions. |
110 |
| -value=value.original_str |
111 |
| -elifisinstance(value,str): |
112 |
| -pass |
113 |
| -else: |
114 |
| -raiseValueError(f"Unsupported type received:{type(value)}") |
115 |
| -self.original_str=value |
116 |
| -super().__init__() |
117 |
| - |
118 |
| - |
119 |
| -@overload |
120 |
| -def_url_encode(id:int)->int: |
121 |
| - ... |
122 |
| - |
123 |
| - |
124 |
| -@overload |
125 |
| -def_url_encode(id:Union[str,EncodedId])->EncodedId: |
126 |
| - ... |
127 |
| - |
128 |
| - |
129 |
| -def_url_encode(id:Union[int,str,EncodedId])->Union[int,EncodedId]: |
130 |
| -"""Encode/quote the characters in the string so that they can be used in a path. |
131 |
| -
|
132 |
| - Reference to documentation on why this is necessary. |
133 |
| -
|
134 |
| - https://docs.gitlab.com/ee/api/index.html#namespaced-path-encoding |
135 |
| -
|
136 |
| - If using namespaced API requests, make sure that the NAMESPACE/PROJECT_PATH is |
137 |
| - URL-encoded. For example, / is represented by %2F |
138 |
| -
|
139 |
| - https://docs.gitlab.com/ee/api/index.html#path-parameters |
140 |
| -
|
141 |
| - Path parameters that are required to be URL-encoded must be followed. If not, it |
142 |
| - doesn’t match an API endpoint and responds with a 404. If there’s something in front |
143 |
| - of the API (for example, Apache), ensure that it doesn’t decode the URL-encoded path |
144 |
| - parameters. |
145 |
| -
|
146 |
| - """ |
147 |
| -ifisinstance(id, (int,EncodedId)): |
148 |
| -returnid |
149 |
| -returnEncodedId(id) |
150 |
| - |
151 | 86 |
|
152 | 87 | defremove_none_from_dict(data:Dict[str,Any])->Dict[str,Any]:
|
153 | 88 | return {k:vfork,vindata.items()ifvisnotNone}
|