1
0
mirror of https://github.com/httpie/cli.git synced 2026-04-24 19:53:55 +02:00
Files
httpie-cli/httpie/context.py
T

115 lines
3.5 KiB
Python
Raw Normal View History

import os
2014-04-27 00:07:13 +02:00
import sys
from pathlib import Path
2019-08-29 13:39:42 +02:00
from typing import Union, IO, Optional
2016-09-06 11:07:52 +01:00
try:
import curses
except ImportError:
curses = None # Compiled w/o curses
2014-04-27 00:07:13 +02:00
2015-02-24 07:39:26 +01:00
from httpie.compat import is_windows
from httpie.config import DEFAULT_CONFIG_DIR, Config, ConfigFileError
2014-04-27 00:07:13 +02:00
2019-08-31 18:00:03 +02:00
from httpie.utils import repr_dict
2016-03-05 01:42:13 +08:00
2014-04-27 00:07:13 +02:00
class Environment:
2014-04-27 00:07:13 +02:00
"""
Information about the execution context
(standard streams, config directory, etc).
By default, it represents the actual environment.
All of the attributes can be overwritten though, which
is used by the test suite to simulate various scenarios.
"""
is_windows: bool = is_windows
config_dir: Path = DEFAULT_CONFIG_DIR
2019-08-29 13:39:42 +02:00
stdin: Optional[IO] = sys.stdin # `None` when closed fd (#791)
stdin_isatty: bool = stdin.isatty() if stdin else False
stdin_encoding: str = None
stdout: IO = sys.stdout
stdout_isatty: bool = stdout.isatty()
stdout_encoding: str = None
stderr: IO = sys.stderr
stderr_isatty: bool = stderr.isatty()
colors = 256
program_name: str = 'http'
if not is_windows:
2016-09-06 11:07:52 +01:00
if curses:
2015-01-23 22:19:02 +01:00
try:
2016-09-06 11:07:52 +01:00
curses.setupterm()
2015-01-23 22:19:02 +01:00
colors = curses.tigetnum('colors')
2016-09-06 11:07:52 +01:00
except curses.error:
pass
else:
2014-04-27 00:07:13 +02:00
# noinspection PyUnresolvedReferences
import colorama.initialise
stdout = colorama.initialise.wrap_stream(
stdout, convert=None, strip=None,
autoreset=True, wrap=True
)
stderr = colorama.initialise.wrap_stream(
stderr, convert=None, strip=None,
autoreset=True, wrap=True
)
del colorama
2014-04-27 00:07:13 +02:00
def __init__(self, **kwargs):
"""
Use keyword arguments to overwrite
any of the class attributes for this instance.
"""
assert all(hasattr(type(self), attr) for attr in kwargs.keys())
self.__dict__.update(**kwargs)
# Keyword arguments > stream.encoding > default utf8
2019-07-17 22:58:37 -06:00
if self.stdin and self.stdin_encoding is None:
2014-04-27 00:07:13 +02:00
self.stdin_encoding = getattr(
self.stdin, 'encoding', None) or 'utf8'
if self.stdout_encoding is None:
actual_stdout = self.stdout
if is_windows:
# noinspection PyUnresolvedReferences
2014-04-27 00:07:13 +02:00
from colorama import AnsiToWin32
if isinstance(self.stdout, AnsiToWin32):
# noinspection PyUnresolvedReferences
2014-04-27 00:07:13 +02:00
actual_stdout = self.stdout.wrapped
self.stdout_encoding = getattr(
actual_stdout, 'encoding', None) or 'utf8'
2016-03-05 01:42:13 +08:00
def __str__(self):
defaults = dict(type(self).__dict__)
actual = dict(defaults)
actual.update(self.__dict__)
actual['config'] = self.config
2019-08-31 18:00:03 +02:00
return repr_dict({
key: value
2016-03-05 01:42:13 +08:00
for key, value in actual.items()
2019-08-31 18:00:03 +02:00
if not key.startswith('_')
})
2016-03-05 01:42:13 +08:00
def __repr__(self):
2019-08-31 15:17:10 +02:00
return f'<{type(self).__name__} {self}>'
_config: Config = None
@property
def config(self) -> Config:
config = self._config
if not config:
self._config = config = Config(directory=self.config_dir)
if not config.is_new():
try:
config.load()
except ConfigFileError as e:
self.log_error(e, level='warning')
return config
def log_error(self, msg, level='error'):
assert level in ['error', 'warning']
self.stderr.write(f'\n{self.program_name}: {level}: {msg}\n\n')