from distutils.version import LooseVersion import os import pytest import pandas.util.testing as tm from pandas.io.parsers import read_csv @pytest.fixture def tips_file(datapath): """Path to the tips dataset""" return datapath('io', 'parser', 'data', 'tips.csv') @pytest.fixture def jsonl_file(datapath): """Path a JSONL dataset""" return datapath('io', 'parser', 'data', 'items.jsonl') @pytest.fixture def salaries_table(datapath): """DataFrame with the salaries dataset""" return read_csv(datapath('io', 'parser', 'data', 'salaries.csv'), sep='\t') @pytest.fixture def s3_resource(tips_file, jsonl_file): """Fixture for mocking S3 interaction. The primary bucket name is "pandas-test". The following datasets are loaded. - tips.csv - tips.csv.gz - tips.csv.bz2 - items.jsonl A private bucket "cant_get_it" is also created. The boto3 s3 resource is yielded by the fixture. """ pytest.importorskip('s3fs') boto3 = pytest.importorskip('boto3') botocore = pytest.importorskip('botocore') if LooseVersion(botocore.__version__) < LooseVersion("1.11.0"): # botocore leaks an uncatchable ResourceWarning before 1.11.0; # see GH 23731 and https://github.com/boto/botocore/issues/1464 pytest.skip("botocore is leaking resources before 1.11.0") with tm.ensure_safe_environment_variables(): # temporary workaround as moto fails for botocore >= 1.11 otherwise, # see https://github.com/spulec/moto/issues/1924 & 1952 os.environ.setdefault("AWS_ACCESS_KEY_ID", "foobar_key") os.environ.setdefault("AWS_SECRET_ACCESS_KEY", "foobar_secret") moto = pytest.importorskip('moto') test_s3_files = [ ('tips.csv', tips_file), ('tips.csv.gz', tips_file + '.gz'), ('tips.csv.bz2', tips_file + '.bz2'), ('items.jsonl', jsonl_file), ] def add_tips_files(bucket_name): for s3_key, file_name in test_s3_files: with open(file_name, 'rb') as f: conn.Bucket(bucket_name).put_object( Key=s3_key, Body=f) try: s3 = moto.mock_s3() s3.start() # see gh-16135 bucket = 'pandas-test' conn = boto3.resource("s3", region_name="us-east-1") conn.create_bucket(Bucket=bucket) add_tips_files(bucket) conn.create_bucket(Bucket='cant_get_it', ACL='private') add_tips_files('cant_get_it') yield conn finally: s3.stop()