feat(phase1): add image storage utilities
- Create backend/services/image_storage.py with 4 core functions:
- sanitize_filename(): remove unsafe chars, limit to 255 chars, convert to lowercase
- get_unique_filename(): handle collisions with UUID suffix (format: {name}_{uuid8}_{variant}.jpg)
- ensure_image_directories(): create /images/ root and category subdirs on startup
- save_image(): save bytes to /images/{category}/{filename}, returns relative path
- Create comprehensive test suite (22 tests) covering all functionality
- Integrate ensure_image_directories() into FastAPI startup event
- Directory structure: /images/{category}/{filename}
- Collision handling: auto-suffix with UUID if filename exists
- All tests passing, pathlib.Path for safe operations
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
"""
|
||||
pygments.lexers.trafficscript
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Lexer for RiverBed's TrafficScript (RTS) language.
|
||||
|
||||
:copyright: Copyright 2006-present by the Pygments team, see AUTHORS.
|
||||
:license: BSD, see LICENSE for details.
|
||||
"""
|
||||
|
||||
from pygments.lexer import RegexLexer
|
||||
from pygments.token import String, Number, Name, Keyword, Operator, Text, Comment
|
||||
|
||||
__all__ = ['RtsLexer']
|
||||
|
||||
|
||||
class RtsLexer(RegexLexer):
|
||||
"""
|
||||
For Riverbed Stingray Traffic Manager
|
||||
"""
|
||||
name = 'TrafficScript'
|
||||
aliases = ['trafficscript', 'rts']
|
||||
filenames = ['*.rts']
|
||||
url = 'https://riverbed.com'
|
||||
version_added = '2.1'
|
||||
|
||||
tokens = {
|
||||
'root' : [
|
||||
(r"'(\\\\|\\[^\\]|[^'\\])*'", String),
|
||||
(r'"', String, 'escapable-string'),
|
||||
(r'(0x[0-9a-fA-F]+|\d+)', Number),
|
||||
(r'\d+\.\d+', Number.Float),
|
||||
(r'\$[a-zA-Z](\w|_)*', Name.Variable),
|
||||
(r'(if|else|for(each)?|in|while|do|break|sub|return|import)', Keyword),
|
||||
(r'[a-zA-Z][\w.]*', Name.Function),
|
||||
(r'[-+*/%=,;(){}<>^.!~|&\[\]\?\:]', Operator),
|
||||
(r'(>=|<=|==|!=|'
|
||||
r'&&|\|\||'
|
||||
r'\+=|.=|-=|\*=|/=|%=|<<=|>>=|&=|\|=|\^=|'
|
||||
r'>>|<<|'
|
||||
r'\+\+|--|=>)', Operator),
|
||||
(r'[ \t\r]+', Text),
|
||||
(r'#[^\n]*', Comment),
|
||||
],
|
||||
'escapable-string' : [
|
||||
(r'\\[tsn]', String.Escape),
|
||||
(r'[^"]', String),
|
||||
(r'"', String, '#pop'),
|
||||
],
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user