Skip to content

Commit

Permalink
Merge pull request #45 from gandaro/pygments-lexers
Browse files Browse the repository at this point in the history
Use the Pygments HTTP and JSON lexers
  • Loading branch information
jkbrzt committed Jun 13, 2012
2 parents 3d11042 + d89eeb0 commit 1261304
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 125 deletions.
3 changes: 3 additions & 0 deletions httpie/__main__.py
@@ -1,8 +1,11 @@
#!/usr/bin/env python
import sys
import json

import requests

from requests.compat import str

from . import httpmessage
from . import cliparse
from . import cli
Expand Down
8 changes: 6 additions & 2 deletions httpie/cliparse.py
Expand Up @@ -3,15 +3,19 @@
"""
import os
import json
import re
import json
import argparse

from collections import namedtuple

try:
from collections import OrderedDict
except ImportError:
OrderedDict = dict
import argparse

from requests.structures import CaseInsensitiveDict

from . import __version__


Expand Down
19 changes: 10 additions & 9 deletions httpie/httpmessage.py
Expand Up @@ -38,7 +38,7 @@ def from_response(response):
return HTTPMessage(
line='HTTP/{version} {status} {reason}'.format(
version='.'.join(str(original.version)),
status=original.status, reason=original.reason,),
status=original.status, reason=original.reason),
headers=str(original.msg),
body=response.content.decode(encoding) if response.content else '',
content_type=response_headers.get('Content-Type'))
Expand All @@ -47,20 +47,21 @@ def from_response(response):
def format(message, prettifier=None,
with_headers=True, with_body=True):
"""Return a `unicode` representation of `message`. """
pretty = prettifier is not None
bits = []

if with_headers:
if prettifier:
bits.append(prettifier.headers(message.line))
bits.append(prettifier.headers(message.headers))
else:
bits.append(message.line)
bits.append(message.headers)
bits.append(message.line)
bits.append(message.headers)
if pretty:
bits = [prettifier.headers('\n'.join(bits))]
if with_body and message.body:
bits.append('\n')

if with_body and message.body:
if prettifier and message.content_type:
if pretty and message.content_type:
bits.append(prettifier.body(message.body, message.content_type))
else:
bits.append(message.body)
bits.append('\n')

return '\n'.join(bit.strip() for bit in bits)
51 changes: 16 additions & 35 deletions httpie/pretty.py
@@ -1,14 +1,14 @@
import os
import json

import pygments
from pygments import token

from pygments.util import ClassNotFound
from pygments.lexers import get_lexer_for_mimetype
from pygments.styles import get_style_by_name, STYLE_MAP
from pygments.lexers import get_lexer_for_mimetype, HttpLexer
from pygments.formatters.terminal256 import Terminal256Formatter
from pygments.formatters.terminal import TerminalFormatter
from pygments.lexer import RegexLexer, bygroups
from pygments.styles import get_style_by_name, STYLE_MAP
from .pygson import JSONLexer

from . import solarized


Expand All @@ -19,24 +19,6 @@
else TerminalFormatter)


class HTTPLexer(RegexLexer):
name = 'HTTP'
aliases = ['http']
filenames = ['*.http']
tokens = {
'root': [
(r'\s+', token.Text),
# Request-Line
(r'([A-Z]+\s+)(/.*?)(\s+HTTP/[\d.]+)', bygroups(
token.Keyword, token.String, token.Keyword)),
# Status-Line
(r'(HTTP/[\d.]+\s+)(\d+)(\s+.+)', bygroups(
token.Keyword, token.Number, token.String)),
# Header
(r'(.*?:)(.+)', bygroups(token.Name, token.Keyword))
]}


class PrettyHttp(object):

def __init__(self, style_name):
Expand All @@ -47,22 +29,21 @@ def __init__(self, style_name):
self.formatter = FORMATTER(style=style)

def headers(self, content):
return pygments.highlight(content, HTTPLexer(), self.formatter)
return pygments.highlight(content, HttpLexer(), self.formatter)

def body(self, content, content_type):
lexer = None
content_type = content_type.split(';')[0]
if 'json' in content_type:
lexer = JSONLexer()
try:
lexer = get_lexer_for_mimetype(content_type)
except ClassNotFound:
return content

if content_type == 'application/json':
try:
# Indent the JSON data.
# Indent and sort the JSON data.
content = json.dumps(json.loads(content),
sort_keys=True, indent=4)
except Exception:
sort_keys=True, indent=4)
except:
pass
if not lexer:
try:
lexer = get_lexer_for_mimetype(content_type)
except ClassNotFound:
return content

return pygments.highlight(content, lexer, self.formatter)
77 changes: 0 additions & 77 deletions httpie/pygson.py

This file was deleted.

3 changes: 2 additions & 1 deletion httpie/solarized.py
Expand Up @@ -27,7 +27,8 @@
"""
from pygments.style import Style
from pygments.token import Token, Comment, Name, Keyword, Generic, Number, Operator, String
from pygments.token import (Token, Comment, Name, Keyword, Generic, Number,
Operator, String)


BASE03 = '#002B36'
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -9,7 +9,7 @@
sys.exit()


requirements = ['requests>=0.10.1', 'Pygments>=1.4']
requirements = ['requests>=0.10.1', 'Pygments>=1.5']
if sys.version_info[:2] in ((2, 6), (3, 1)):
# argparse has been added in Python 3.2 / 2.7
requirements.append('argparse>=1.2.1')
Expand Down

0 comments on commit 1261304

Please sign in to comment.