Skip to content

Drop the dependency on six #385

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jan 15, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions firebase_admin/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@
import os
import threading

import six

from firebase_admin import credentials
from firebase_admin.__about__ import __version__

Expand Down Expand Up @@ -126,7 +124,7 @@ def get_app(name=_DEFAULT_APP_NAME):
ValueError: If the specified name is not a string, or if the specified
app does not exist.
"""
if not isinstance(name, six.string_types):
if not isinstance(name, str):
raise ValueError('Illegal app name argument type: "{}". App name '
'must be a string.'.format(type(name)))
with _apps_lock:
Expand Down Expand Up @@ -203,7 +201,7 @@ def __init__(self, name, credential, options):
Raises:
ValueError: If an argument is None or invalid.
"""
if not name or not isinstance(name, six.string_types):
if not name or not isinstance(name, str):
raise ValueError('Illegal Firebase app name "{0}" provided. App name must be a '
'non-empty string.'.format(name))
self._name = name
Expand All @@ -221,7 +219,7 @@ def __init__(self, name, credential, options):

@classmethod
def _validate_project_id(cls, project_id):
if project_id is not None and not isinstance(project_id, six.string_types):
if project_id is not None and not isinstance(project_id, str):
raise ValueError(
'Invalid project ID: "{0}". project ID must be a string.'.format(project_id))

Expand Down Expand Up @@ -286,7 +284,7 @@ def _get_service(self, name, initializer):
Raises:
ValueError: If the provided name is invalid, or if the App is already deleted.
"""
if not name or not isinstance(name, six.string_types):
if not name or not isinstance(name, str):
raise ValueError(
'Illegal name argument: "{0}". Name must be a non-empty string.'.format(name))
with self._lock:
Expand Down
22 changes: 10 additions & 12 deletions firebase_admin/_auth_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@

import json
import re

import six
from six.moves import urllib
from urllib import parse

from firebase_admin import exceptions
from firebase_admin import _utils
Expand All @@ -35,7 +33,7 @@
def validate_uid(uid, required=False):
if uid is None and not required:
return None
if not isinstance(uid, six.string_types) or not uid or len(uid) > 128:
if not isinstance(uid, str) or not uid or len(uid) > 128:
raise ValueError(
'Invalid uid: "{0}". The uid must be a non-empty string with no more than 128 '
'characters.'.format(uid))
Expand All @@ -44,7 +42,7 @@ def validate_uid(uid, required=False):
def validate_email(email, required=False):
if email is None and not required:
return None
if not isinstance(email, six.string_types) or not email:
if not isinstance(email, str) or not email:
raise ValueError(
'Invalid email: "{0}". Email must be a non-empty string.'.format(email))
parts = email.split('@')
Expand All @@ -61,7 +59,7 @@ def validate_phone(phone, required=False):
"""
if phone is None and not required:
return None
if not isinstance(phone, six.string_types) or not phone:
if not isinstance(phone, str) or not phone:
raise ValueError('Invalid phone number: "{0}". Phone number must be a non-empty '
'string.'.format(phone))
if not phone.startswith('+') or not re.search('[a-zA-Z0-9]', phone):
Expand All @@ -72,22 +70,22 @@ def validate_phone(phone, required=False):
def validate_password(password, required=False):
if password is None and not required:
return None
if not isinstance(password, six.string_types) or len(password) < 6:
if not isinstance(password, str) or len(password) < 6:
raise ValueError(
'Invalid password string. Password must be a string at least 6 characters long.')
return password

def validate_bytes(value, label, required=False):
if value is None and not required:
return None
if not isinstance(value, six.binary_type) or not value:
if not isinstance(value, bytes) or not value:
raise ValueError('{0} must be a non-empty byte sequence.'.format(label))
return value

def validate_display_name(display_name, required=False):
if display_name is None and not required:
return None
if not isinstance(display_name, six.string_types) or not display_name:
if not isinstance(display_name, str) or not display_name:
raise ValueError(
'Invalid display name: "{0}". Display name must be a non-empty '
'string.'.format(display_name))
Expand All @@ -96,7 +94,7 @@ def validate_display_name(display_name, required=False):
def validate_provider_id(provider_id, required=True):
if provider_id is None and not required:
return None
if not isinstance(provider_id, six.string_types) or not provider_id:
if not isinstance(provider_id, str) or not provider_id:
raise ValueError(
'Invalid provider ID: "{0}". Provider ID must be a non-empty '
'string.'.format(provider_id))
Expand All @@ -106,12 +104,12 @@ def validate_photo_url(photo_url, required=False):
"""Parses and validates the given URL string."""
if photo_url is None and not required:
return None
if not isinstance(photo_url, six.string_types) or not photo_url:
if not isinstance(photo_url, str) or not photo_url:
raise ValueError(
'Invalid photo URL: "{0}". Photo URL must be a non-empty '
'string.'.format(photo_url))
try:
parsed = urllib.parse.urlparse(photo_url)
parsed = parse.urlparse(photo_url)
if not parsed.netloc:
raise ValueError('Malformed photo URL: "{0}".'.format(photo_url))
return photo_url
Expand Down
14 changes: 6 additions & 8 deletions firebase_admin/_messaging_encoder.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@
import numbers
import re

import six

import firebase_admin._messaging_utils as _messaging_utils


Expand Down Expand Up @@ -99,7 +97,7 @@ def check_string(cls, label, value, non_empty=False):
"""Checks if the given value is a string."""
if value is None:
return None
if not isinstance(value, six.string_types):
if not isinstance(value, str):
if non_empty:
raise ValueError('{0} must be a non-empty string.'.format(label))
raise ValueError('{0} must be a string.'.format(label))
Expand All @@ -122,10 +120,10 @@ def check_string_dict(cls, label, value):
return None
if not isinstance(value, dict):
raise ValueError('{0} must be a dictionary.'.format(label))
non_str = [k for k in value if not isinstance(k, six.string_types)]
non_str = [k for k in value if not isinstance(k, str)]
if non_str:
raise ValueError('{0} must not contain non-string keys.'.format(label))
non_str = [v for v in value.values() if not isinstance(v, six.string_types)]
non_str = [v for v in value.values() if not isinstance(v, str)]
if non_str:
raise ValueError('{0} must not contain non-string values.'.format(label))
return value
Expand All @@ -137,7 +135,7 @@ def check_string_list(cls, label, value):
return None
if not isinstance(value, list):
raise ValueError('{0} must be a list of strings.'.format(label))
non_str = [k for k in value if not isinstance(k, six.string_types)]
non_str = [k for k in value if not isinstance(k, str)]
if non_str:
raise ValueError('{0} must not contain non-string values.'.format(label))
return value
Expand Down Expand Up @@ -570,7 +568,7 @@ def encode_aps_sound(cls, sound):
"""Encodes an APNs sound configuration into JSON."""
if sound is None:
return None
if sound and isinstance(sound, six.string_types):
if sound and isinstance(sound, str):
return sound
if not isinstance(sound, _messaging_utils.CriticalSound):
raise ValueError(
Expand All @@ -593,7 +591,7 @@ def encode_aps_alert(cls, alert):
"""Encodes an ``ApsAlert`` instance into JSON."""
if alert is None:
return None
if isinstance(alert, six.string_types):
if isinstance(alert, str):
return alert
if not isinstance(alert, _messaging_utils.ApsAlert):
raise ValueError('Aps.alert must be a string or an instance of ApsAlert class.')
Expand Down
13 changes: 6 additions & 7 deletions firebase_admin/_token_gen.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

import cachecontrol
import requests
import six
from google.auth import credentials
from google.auth import iam
from google.auth import jwt
Expand Down Expand Up @@ -149,7 +148,7 @@ def create_custom_token(self, uid, developer_claims=None):
', '.join(disallowed_keys)))
raise ValueError(error_message)

if not uid or not isinstance(uid, six.string_types) or len(uid) > 128:
if not uid or not isinstance(uid, str) or len(uid) > 128:
raise ValueError('uid must be a string between 1 and 128 characters.')

signing_provider = self.signing_provider
Expand All @@ -174,8 +173,8 @@ def create_custom_token(self, uid, developer_claims=None):

def create_session_cookie(self, id_token, expires_in):
"""Creates a session cookie from the provided ID token."""
id_token = id_token.decode('utf-8') if isinstance(id_token, six.binary_type) else id_token
if not isinstance(id_token, six.text_type) or not id_token:
id_token = id_token.decode('utf-8') if isinstance(id_token, bytes) else id_token
if not isinstance(id_token, str) or not id_token:
raise ValueError(
'Illegal ID token provided: {0}. ID token must be a non-empty '
'string.'.format(id_token))
Expand Down Expand Up @@ -256,8 +255,8 @@ def __init__(self, **kwargs):

def verify(self, token, request):
"""Verifies the signature and data for the provided JWT."""
token = token.encode('utf-8') if isinstance(token, six.text_type) else token
if not isinstance(token, six.binary_type) or not token:
token = token.encode('utf-8') if isinstance(token, str) else token
if not isinstance(token, bytes) or not token:
raise ValueError(
'Illegal {0} provided: {1}. {0} must be a non-empty '
'string.'.format(self.short_name, token))
Expand Down Expand Up @@ -308,7 +307,7 @@ def verify(self, token, request):
'Firebase {0} has incorrect "iss" (issuer) claim. Expected "{1}" but '
'got "{2}". {3} {4}'.format(self.short_name, expected_issuer, issuer,
project_id_match_msg, verify_id_token_msg))
elif subject is None or not isinstance(subject, six.string_types):
elif subject is None or not isinstance(subject, str):
error_message = (
'Firebase {0} has no "sub" (subject) claim. '
'{1}'.format(self.short_name, verify_id_token_msg))
Expand Down
16 changes: 8 additions & 8 deletions firebase_admin/_user_mgt.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

import base64
import json
from urllib import parse

import requests
import six
from six.moves import urllib

from firebase_admin import _auth_utils
from firebase_admin import _user_import
Expand Down Expand Up @@ -397,7 +397,7 @@ def encode_action_code_settings(settings):
raise ValueError("Dynamic action links url is mandatory")

try:
parsed = urllib.parse.urlparse(settings.url)
parsed = parse.urlparse(settings.url)
if not parsed.netloc:
raise ValueError('Malformed dynamic action links url: "{0}".'.format(settings.url))
parameters['continueUrl'] = settings.url
Expand All @@ -413,14 +413,14 @@ def encode_action_code_settings(settings):

# dynamic_link_domain
if settings.dynamic_link_domain is not None:
if not isinstance(settings.dynamic_link_domain, six.string_types):
if not isinstance(settings.dynamic_link_domain, str):
raise ValueError('Invalid value provided for dynamic_link_domain: {0}'
.format(settings.dynamic_link_domain))
parameters['dynamicLinkDomain'] = settings.dynamic_link_domain

# ios_bundle_id
if settings.ios_bundle_id is not None:
if not isinstance(settings.ios_bundle_id, six.string_types):
if not isinstance(settings.ios_bundle_id, str):
raise ValueError('Invalid value provided for ios_bundle_id: {0}'
.format(settings.ios_bundle_id))
parameters['iosBundleId'] = settings.ios_bundle_id
Expand All @@ -431,13 +431,13 @@ def encode_action_code_settings(settings):
raise ValueError("Android package name is required when specifying other Android settings")

if settings.android_package_name is not None:
if not isinstance(settings.android_package_name, six.string_types):
if not isinstance(settings.android_package_name, str):
raise ValueError('Invalid value provided for android_package_name: {0}'
.format(settings.android_package_name))
parameters['androidPackageName'] = settings.android_package_name

if settings.android_minimum_version is not None:
if not isinstance(settings.android_minimum_version, six.string_types):
if not isinstance(settings.android_minimum_version, str):
raise ValueError('Invalid value provided for android_minimum_version: {0}'
.format(settings.android_minimum_version))
parameters['androidMinimumVersion'] = settings.android_minimum_version
Expand Down Expand Up @@ -486,7 +486,7 @@ def get_user(self, **kwargs):
def list_users(self, page_token=None, max_results=MAX_LIST_USERS_RESULTS):
"""Retrieves a batch of users."""
if page_token is not None:
if not isinstance(page_token, six.string_types) or not page_token:
if not isinstance(page_token, str) or not page_token:
raise ValueError('Page token must be a non-empty string.')
if not isinstance(max_results, int):
raise ValueError('Max results must be an integer.')
Expand Down
4 changes: 2 additions & 2 deletions firebase_admin/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@

"""Internal utilities common to all modules."""

import io
import json
import socket

import googleapiclient
import httplib2
import requests
import six

import firebase_admin
from firebase_admin import exceptions
Expand Down Expand Up @@ -255,7 +255,7 @@ def handle_googleapiclient_error(error, message=None, code=None, http_response=N
def _http_response_from_googleapiclient_error(error):
"""Creates a requests HTTP Response object from the given googleapiclient error."""
resp = requests.models.Response()
resp.raw = six.BytesIO(error.content)
resp.raw = io.BytesIO(error.content)
resp.status_code = error.resp.status
return resp

Expand Down
5 changes: 2 additions & 3 deletions firebase_admin/credentials.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
"""Firebase credentials module."""
import collections
import json
import six

import google.auth
from google.auth.transport import requests
Expand Down Expand Up @@ -79,7 +78,7 @@ def __init__(self, cert):
ValueError: If the specified certificate is invalid.
"""
super(Certificate, self).__init__()
if isinstance(cert, six.string_types):
if isinstance(cert, str):
with open(cert) as json_file:
json_data = json.load(json_file)
elif isinstance(cert, dict):
Expand Down Expand Up @@ -180,7 +179,7 @@ def __init__(self, refresh_token):
ValueError: If the refresh token configuration is invalid.
"""
super(RefreshToken, self).__init__()
if isinstance(refresh_token, six.string_types):
if isinstance(refresh_token, str):
with open(refresh_token) as json_file:
json_data = json.load(json_file)
elif isinstance(refresh_token, dict):
Expand Down
Loading