home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1423 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  21.1 KB  |  1,004 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __license__ = 'GPL v3'
  5. __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
  6. __docformat__ = 'restructuredtext en'
  7. import sys
  8. import string
  9. import operator
  10. from calibre.utils.pyparsing import CaselessKeyword, Group, Forward, CharsNotIn, Suppress, OneOrMore, MatchFirst, CaselessLiteral, Optional, NoMatch, ParseException
  11. from calibre.constants import preferred_encoding
  12.  
  13. class SavedSearchQueries(object):
  14.     queries = { }
  15.     opt_name = ''
  16.     
  17.     def __init__(self, db, _opt_name):
  18.         self.opt_name = _opt_name
  19.         self.db = db
  20.         if db is not None:
  21.             self.queries = db.prefs.get(self.opt_name, { })
  22.         else:
  23.             self.queries = { }
  24.  
  25.     
  26.     def force_unicode(self, x):
  27.         if not isinstance(x, unicode):
  28.             x = x.decode(preferred_encoding, 'replace')
  29.         
  30.         return x
  31.  
  32.     
  33.     def add(self, name, value):
  34.         self.queries[self.force_unicode(name)] = self.force_unicode(value).strip()
  35.         self.db.prefs[self.opt_name] = self.queries
  36.  
  37.     
  38.     def lookup(self, name):
  39.         return self.queries.get(self.force_unicode(name), None)
  40.  
  41.     
  42.     def delete(self, name):
  43.         self.queries.pop(self.force_unicode(name), False)
  44.         self.db.prefs[self.opt_name] = self.queries
  45.  
  46.     
  47.     def rename(self, old_name, new_name):
  48.         self.queries[self.force_unicode(new_name)] = self.queries.get(self.force_unicode(old_name), None)
  49.         self.queries.pop(self.force_unicode(old_name), False)
  50.         self.db.prefs[self.opt_name] = self.queries
  51.  
  52.     
  53.     def names(self):
  54.         return sorted(self.queries.keys(), cmp = (lambda x, y: cmp(x.lower(), y.lower())))
  55.  
  56.  
  57. ss = SavedSearchQueries(None, None)
  58.  
  59. def set_saved_searches(db, opt_name):
  60.     global ss
  61.     ss = SavedSearchQueries(db, opt_name)
  62.  
  63.  
  64. def saved_searches():
  65.     return ss
  66.  
  67.  
  68. class SearchQueryParser(object):
  69.     
  70.     def run_tests(parser, result, tests):
  71.         failed = []
  72.         for test in tests:
  73.             print '\tTesting:', test[0],
  74.             res = parser.parseString(test[0])
  75.             if list(res.get(result, None)) == test[1]:
  76.                 print 'OK'
  77.                 continue
  78.             print 'FAILED:', 'Expected:', test[1], 'Got:', list(res.get(result, None))
  79.             failed.append(test[0])
  80.         
  81.         return failed
  82.  
  83.     run_tests = staticmethod(run_tests)
  84.     
  85.     def __init__(self, locations, test = False):
  86.         self._tests_failed = False
  87.         standard_locations = map((lambda x: CaselessLiteral(x) + Suppress(':')), locations)
  88.         location = NoMatch()
  89.         for l in standard_locations:
  90.             location |= l
  91.         
  92.         location = Optional(location, default = 'all')
  93.         word_query = CharsNotIn(string.whitespace + '()')
  94.         quoted_query = Suppress('"') + CharsNotIn('"') + Suppress('"')
  95.         query = quoted_query | word_query
  96.         Token = Group(location + query).setResultsName('token')
  97.         if test:
  98.             print 'Testing Token parser:'
  99.             failed = SearchQueryParser.run_tests(Token, 'token', (('tag:asd', [
  100.                 'tag',
  101.                 'asd']), ('dds\xc3\xa4', [
  102.                 'all',
  103.                 'dds\xc3\xa4']), ('"one two"', [
  104.                 'all',
  105.                 'one two']), ('title:"one two"', [
  106.                 'title',
  107.                 'one two'])))
  108.         
  109.         Or = Forward()
  110.         Parenthesis = Group(Suppress('(') + Or + Suppress(')')).setResultsName('parenthesis') | Token
  111.         Not = Forward()
  112.         Not << (Group(Suppress(CaselessKeyword('not')) + Not).setResultsName('not') | Parenthesis)
  113.         And = Forward()
  114.         And << (Group(Not + Suppress(CaselessKeyword('and')) + And).setResultsName('and') | Group(Not + OneOrMore(~MatchFirst(list(map(CaselessKeyword, ('and', 'or')))) + And)).setResultsName('and') | Not)
  115.         Or << (Group(And + Suppress(CaselessKeyword('or')) + Or).setResultsName('or') | And)
  116.         if test:
  117.             Or.validate()
  118.             self._tests_failed = bool(failed)
  119.         
  120.         self._parser = Or
  121.         self._parser.setDebug(False)
  122.  
  123.     
  124.     def parse(self, query):
  125.         self.recurse_level = 0
  126.         self.searches_seen = set([])
  127.         return self._parse(query)
  128.  
  129.     
  130.     def _parse(self, query):
  131.         self.recurse_level += 1
  132.         res = self._parser.parseString(query)[0]
  133.         t = self.evaluate(res)
  134.         self.recurse_level -= 1
  135.         return t
  136.  
  137.     
  138.     def method(self, group_name):
  139.         return getattr(self, 'evaluate_' + group_name)
  140.  
  141.     
  142.     def evaluate(self, parse_result):
  143.         return self.method(parse_result.getName())(parse_result)
  144.  
  145.     
  146.     def evaluate_and(self, argument):
  147.         return self.evaluate(argument[0]).intersection(self.evaluate(argument[1]))
  148.  
  149.     
  150.     def evaluate_or(self, argument):
  151.         return self.evaluate(argument[0]).union(self.evaluate(argument[1]))
  152.  
  153.     
  154.     def evaluate_not(self, argument):
  155.         return self.universal_set().difference(self.evaluate(argument[0]))
  156.  
  157.     
  158.     def evaluate_parenthesis(self, argument):
  159.         return self.evaluate(argument[0])
  160.  
  161.     
  162.     def evaluate_token(self, argument):
  163.         location = argument[0]
  164.         query = argument[1]
  165.         if location.lower() == 'search':
  166.             if query.startswith('='):
  167.                 query = query[1:]
  168.             
  169.             
  170.             try:
  171.                 if query in self.searches_seen:
  172.                     raise ParseException(query, len(query), 'undefined saved search', self)
  173.                 query in self.searches_seen
  174.                 if self.recurse_level > 5:
  175.                     self.searches_seen.add(query)
  176.                 
  177.                 return self._parse(saved_searches().lookup(query))
  178.             raise ParseException(query, len(query), 'undefined saved search', self)
  179.  
  180.         
  181.         return self.get_matches(location, query)
  182.  
  183.     
  184.     def get_matches(self, location, query):
  185.         return set([])
  186.  
  187.     
  188.     def universal_set(self):
  189.         return set([])
  190.  
  191.  
  192.  
  193. class Tester(SearchQueryParser):
  194.     texts = {
  195.         1: [
  196.             u'Eugenie Grandet',
  197.             u'Honor├⌐ de Balzac',
  198.             u'manybooks.net',
  199.             u'lrf'],
  200.         2: [
  201.             u'Fanny Hill',
  202.             u'John Cleland',
  203.             u'manybooks.net',
  204.             u'lrf'],
  205.         3: [
  206.             u'Persuasion',
  207.             u'Jane Austen',
  208.             u'manybooks.net',
  209.             u'lrf'],
  210.         4: [
  211.             u'Psmith, Journalist',
  212.             u'P. G. Wodehouse',
  213.             u'Some Publisher',
  214.             u'lrf'],
  215.         5: [
  216.             u'The Complete Works of William Shakespeare',
  217.             u'William Shakespeare',
  218.             u'manybooks.net',
  219.             u'lrf'],
  220.         6: [
  221.             u'The History of England, Volume I',
  222.             u'David Hume',
  223.             u'manybooks.net',
  224.             u'lrf'],
  225.         7: [
  226.             u'Someone Comes to Town, Someone Leaves Town',
  227.             u'Cory Doctorow',
  228.             u'Tor Books',
  229.             u'lrf'],
  230.         8: [
  231.             u'Stalky and Co.',
  232.             u'Rudyard Kipling',
  233.             u'manybooks.net',
  234.             u'lrf'],
  235.         9: [
  236.             u'A Game of Thrones',
  237.             u'George R. R. Martin',
  238.             None,
  239.             u'lrf,rar'],
  240.         10: [
  241.             u'A Clash of Kings',
  242.             u'George R. R. Martin',
  243.             None,
  244.             u'lrf,rar'],
  245.         11: [
  246.             u'A Storm of Swords',
  247.             u'George R. R. Martin',
  248.             None,
  249.             u'lrf,rar'],
  250.         12: [
  251.             u'Biggles - Pioneer Air Fighter',
  252.             u'W. E. Johns',
  253.             None,
  254.             u'lrf,rtf'],
  255.         13: [
  256.             u'Biggles of the Camel Squadron',
  257.             u'W. E. Johns',
  258.             u'London:Thames, (1977)',
  259.             u'lrf,rtf'],
  260.         14: [
  261.             u'A Feast for Crows',
  262.             u'George R. R. Martin',
  263.             None,
  264.             u'lrf,rar'],
  265.         15: [
  266.             u'Cryptonomicon',
  267.             u'Neal Stephenson',
  268.             None,
  269.             u'lrf,rar'],
  270.         16: [
  271.             u'Quicksilver',
  272.             u'Neal Stephenson',
  273.             None,
  274.             u'lrf,zip'],
  275.         17: [
  276.             u'The Comedies of William Shakespeare',
  277.             u'William Shakespeare',
  278.             None,
  279.             u'lrf'],
  280.         18: [
  281.             u'The Histories of William Shakespeare',
  282.             u'William Shakespeare',
  283.             None,
  284.             u'lrf'],
  285.         19: [
  286.             u'The Tragedies of William Shakespeare',
  287.             u'William Shakespeare',
  288.             None,
  289.             u'lrf'],
  290.         20: [
  291.             u'An Ideal Husband',
  292.             u'Oscar Wilde',
  293.             u'manybooks.net',
  294.             u'lrf'],
  295.         21: [
  296.             u'Flight of the Nighthawks',
  297.             u'Raymond E. Feist',
  298.             None,
  299.             u'lrf,rar'],
  300.         22: [
  301.             u'Into a Dark Realm',
  302.             u'Raymond E. Feist',
  303.             None,
  304.             u'lrf,rar'],
  305.         23: [
  306.             u'The Sundering',
  307.             u'Walter Jon Williams',
  308.             None,
  309.             u'lrf,rar'],
  310.         24: [
  311.             u'The Praxis',
  312.             u'Walter Jon Williams',
  313.             None,
  314.             u'lrf,rar'],
  315.         25: [
  316.             u'Conventions of War',
  317.             u'Walter Jon Williams',
  318.             None,
  319.             u'lrf,rar'],
  320.         26: [
  321.             u'Banewreaker',
  322.             u'Jacqueline Carey',
  323.             None,
  324.             u'lrf,rar'],
  325.         27: [
  326.             u'Godslayer',
  327.             u'Jacqueline Carey',
  328.             None,
  329.             u'lrf,rar'],
  330.         28: [
  331.             u"Kushiel's Scion",
  332.             u'Jacqueline Carey',
  333.             None,
  334.             u'lrf,rar'],
  335.         29: [
  336.             u'Underworld',
  337.             u'Don DeLillo',
  338.             None,
  339.             u'lrf,rar'],
  340.         30: [
  341.             u'Genghis Khan and The Making of the Modern World',
  342.             u'Jack Weatherford Orc',
  343.             u'Three Rivers Press',
  344.             u'lrf,zip'],
  345.         31: [
  346.             u'The Best and the Brightest',
  347.             u'David Halberstam',
  348.             u'Modern Library',
  349.             u'lrf,zip'],
  350.         32: [
  351.             u'The Killer Angels',
  352.             u'Michael Shaara',
  353.             None,
  354.             u'html,lrf'],
  355.         33: [
  356.             u'Band Of Brothers',
  357.             u'Stephen E Ambrose',
  358.             None,
  359.             u'lrf,txt'],
  360.         34: [
  361.             u'The Gates of Rome',
  362.             u'Conn Iggulden',
  363.             None,
  364.             u'lrf,rar'],
  365.         35: [
  366.             u'The Death of Kings',
  367.             u'Conn Iggulden',
  368.             u'Bantam Dell',
  369.             u'lit,lrf'],
  370.         36: [
  371.             u'The Field of Swords',
  372.             u'Conn Iggulden',
  373.             None,
  374.             u'lrf,rar'],
  375.         37: [
  376.             u'Masterman Ready',
  377.             u'Marryat, Captain Frederick',
  378.             None,
  379.             u'lrf'],
  380.         38: [
  381.             u'With the Lightnings',
  382.             u'David Drake',
  383.             u'Baen Publishing Enterprises',
  384.             u'lit,lrf'],
  385.         39: [
  386.             u'Lt. Leary, Commanding',
  387.             u'David Drake',
  388.             u'Baen Publishing Enterprises',
  389.             u'lit,lrf'],
  390.         40: [
  391.             u'The Far Side of The Stars',
  392.             u'David Drake',
  393.             u'Baen Publishing Enterprises',
  394.             u'lrf,rar'],
  395.         41: [
  396.             u'The Way to Glory',
  397.             u'David Drake',
  398.             u'Baen Publishing Enterprises',
  399.             u'lrf,rar'],
  400.         42: [
  401.             u'Some Golden Harbor',
  402.             u'David Drake',
  403.             u'Baen Books',
  404.             u'lrf,rar'],
  405.         43: [
  406.             u'Harry Potter And The Half-Blood Prince',
  407.             u'J. K. Rowling',
  408.             None,
  409.             u'lrf,rar'],
  410.         44: [
  411.             u'Harry Potter and the Order of the Phoenix',
  412.             u'J. K. Rowling',
  413.             None,
  414.             u'lrf,rtf'],
  415.         45: [
  416.             u'The Stars at War',
  417.             u'David Weber , Steve White',
  418.             None,
  419.             u'lrf,rtf'],
  420.         46: [
  421.             u'The Stars at War II',
  422.             u'Steve White',
  423.             u'Baen Publishing Enterprises',
  424.             u'lrf,rar'],
  425.         47: [
  426.             u'Exodus',
  427.             u'Steve White,Shirley Meier',
  428.             u'Baen Books',
  429.             u'lrf,rar'],
  430.         48: [
  431.             u'Harry Potter and the Goblet of Fire',
  432.             u'J. K. Rowling',
  433.             None,
  434.             u'lrf,rar'],
  435.         49: [
  436.             u'Harry Potter and the Prisoner of Azkaban',
  437.             u'J. K. Rowling',
  438.             None,
  439.             u'lrf,rtf'],
  440.         50: [
  441.             u'Harry Potter and the Chamber of Secrets',
  442.             u'J. K. Rowling',
  443.             None,
  444.             u'lit,lrf'],
  445.         51: [
  446.             u'Harry Potter and the Deathly Hallows',
  447.             u'J.K. Rowling',
  448.             None,
  449.             u'lit,lrf,pdf'],
  450.         52: [
  451.             u"His Majesty's Dragon",
  452.             u'Naomi Novik',
  453.             None,
  454.             u'lrf,rar'],
  455.         53: [
  456.             u'Throne of Jade',
  457.             u'Naomi Novik',
  458.             u'Del Rey',
  459.             u'lit,lrf'],
  460.         54: [
  461.             u'Black Powder War',
  462.             u'Naomi Novik',
  463.             u'Del Rey',
  464.             u'lrf,rar'],
  465.         55: [
  466.             u'War and Peace',
  467.             u'Leo Tolstoy',
  468.             u'gutenberg.org',
  469.             u'lrf,txt'],
  470.         56: [
  471.             u'Anna Karenina',
  472.             u'Leo Tolstoy',
  473.             u'gutenberg.org',
  474.             u'lrf,txt'],
  475.         57: [
  476.             u'A Shorter History of Rome',
  477.             u'Eugene Lawrence,Sir William Smith',
  478.             u'gutenberg.org',
  479.             u'lrf,zip'],
  480.         58: [
  481.             u'The Name of the Rose',
  482.             u'Umberto Eco',
  483.             None,
  484.             u'lrf,rar'],
  485.         71: [
  486.             u"Wind Rider's Oath",
  487.             u'David Weber',
  488.             u'Baen',
  489.             u'lrf'],
  490.         74: [
  491.             u'Rally Cry',
  492.             u'William R Forstchen',
  493.             None,
  494.             u'htm,lrf'],
  495.         86: [
  496.             u'Empire of Ivory',
  497.             u'Naomi Novik',
  498.             None,
  499.             u'lrf,rar'],
  500.         87: [
  501.             u"Renegade's Magic",
  502.             u'Robin Hobb',
  503.             None,
  504.             u'lrf,rar'],
  505.         89: [
  506.             u'Master and commander',
  507.             u"Patrick O'Brian",
  508.             u'Fontana,\n1971',
  509.             u'lit,lrf'],
  510.         91: [
  511.             u'A Companion to Wolves',
  512.             u'Sarah Monette,Elizabeth Be├ñr',
  513.             None,
  514.             u'lrf,rar'],
  515.         92: [
  516.             u'The Lions of al-Rassan',
  517.             u'Guy Gavriel Kay',
  518.             u'Eos',
  519.             u'lit,lrf'],
  520.         93: [
  521.             u'Gardens of the Moon',
  522.             u'Steven Erikson',
  523.             u'Tor Fantasy',
  524.             u'lit,lrf'],
  525.         95: [
  526.             u'The Master and Margarita',
  527.             u'Mikhail Bulgakov',
  528.             u'N.Y. : Knopf, 1992.',
  529.             u'lrf,rtf'],
  530.         120: [
  531.             u'Deadhouse Gates',
  532.             u'Steven Erikson',
  533.             u'London : Bantam Books, 2001.',
  534.             u'lit,lrf'],
  535.         121: [
  536.             u'Memories of Ice',
  537.             u'Steven Erikson',
  538.             u'Bantam Books',
  539.             u'lit,lrf'],
  540.         123: [
  541.             u'House of Chains',
  542.             u'Steven Erikson',
  543.             u'Bantam Books',
  544.             u'lit,lrf'],
  545.         125: [
  546.             u'Midnight Tides',
  547.             u'Steven Erikson',
  548.             u'Bantam Books',
  549.             u'lit,lrf'],
  550.         126: [
  551.             u'The Bonehunters',
  552.             u'Steven Erikson',
  553.             u'Bantam Press',
  554.             u'lit,lrf'],
  555.         129: [
  556.             u'Guns, germs, and steel: the fates of human societies',
  557.             u'Jared Diamond',
  558.             u'New York : W.W. Norton, c1997.',
  559.             u'lit,lrf'],
  560.         136: [
  561.             u'Wildcards',
  562.             u'George R. R. Martin',
  563.             None,
  564.             u'html,lrf'],
  565.         138: [
  566.             u'Off Armageddon Reef',
  567.             u'David Weber',
  568.             u'Tor Books',
  569.             u'lit,lrf'],
  570.         144: [
  571.             u'Atonement',
  572.             u'Ian McEwan',
  573.             u'New York : Nan A. Talese/Doubleday, 2002.',
  574.             u'lrf,rar'],
  575.         146: [
  576.             u'1632',
  577.             u'Eric Flint',
  578.             u'Baen Books',
  579.             u'lit,lrf'],
  580.         147: [
  581.             u'1633',
  582.             u'David Weber,Eric Flint,Dru Blair',
  583.             u'Baen',
  584.             u'lit,lrf'],
  585.         148: [
  586.             u'1634: The Baltic War',
  587.             u'David Weber,Eric Flint',
  588.             u'Baen',
  589.             u'lit,lrf'],
  590.         150: [
  591.             u'The Dragonbone Chair',
  592.             u'Tad Williams',
  593.             u'DAW Trade',
  594.             u'lrf,rtf'],
  595.         152: [
  596.             u'The Little Book That Beats the Market',
  597.             u'Joel Greenblatt',
  598.             u'Wiley',
  599.             u'epub,lrf'],
  600.         153: [
  601.             u'Pride of Carthage',
  602.             u'David Anthony Durham',
  603.             u'Anchor',
  604.             u'lit,lrf'],
  605.         154: [
  606.             u'Stone of farewell',
  607.             u'Tad Williams',
  608.             u'New York : DAW Books, 1990.',
  609.             u'lrf,txt'],
  610.         166: [
  611.             u'American Gods',
  612.             u'Neil Gaiman',
  613.             u'HarperTorch',
  614.             u'lit,lrf'],
  615.         176: [
  616.             u'Pillars of the Earth',
  617.             u'Ken Follett',
  618.             u'New American Library',
  619.             u'lit,lrf'],
  620.         182: [
  621.             u'The Eye of the world',
  622.             u'Robert Jordan',
  623.             u'New York : T. Doherty Associates, c1990.',
  624.             u'lit,lrf'],
  625.         188: [
  626.             u'The Great Hunt',
  627.             u'Robert Jordan',
  628.             u'ATOM',
  629.             u'lrf,zip'],
  630.         189: [
  631.             u'The Dragon Reborn',
  632.             u'Robert Jordan',
  633.             None,
  634.             u'lit,lrf'],
  635.         190: [
  636.             u'The Shadow Rising',
  637.             u'Robert Jordan',
  638.             None,
  639.             u'lit,lrf'],
  640.         191: [
  641.             u'The Fires of Heaven',
  642.             u'Robert Jordan',
  643.             u'Time Warner Books Uk',
  644.             u'lit,lrf'],
  645.         216: [
  646.             u'Lord of chaos',
  647.             u'Robert Jordan',
  648.             u'New York : TOR, c1994.',
  649.             u'lit,lrf'],
  650.         217: [
  651.             u'A Crown of Swords',
  652.             u'Robert Jordan',
  653.             None,
  654.             u'lit,lrf'],
  655.         236: [
  656.             u'The Path of Daggers',
  657.             u'Robert Jordan',
  658.             None,
  659.             u'lit,lrf'],
  660.         238: [
  661.             u'The Client',
  662.             u'John Grisham',
  663.             u'New York : Island, 1994, c1993.',
  664.             u'lit,lrf'],
  665.         240: [
  666.             u"Winter's Heart",
  667.             u'Robert Jordan',
  668.             None,
  669.             u'lit,lrf'],
  670.         242: [
  671.             u'In the Beginning was the Command Line',
  672.             u'Neal Stephenson',
  673.             None,
  674.             u'lrf,txt'],
  675.         249: [
  676.             u'Crossroads of Twilight',
  677.             u'Robert Jordan',
  678.             None,
  679.             u'lit,lrf'],
  680.         251: [
  681.             u'Caves of Steel',
  682.             u'Isaac Asimov',
  683.             u'Del Rey',
  684.             u'lrf,zip'],
  685.         253: [
  686.             u"Hunter's Run",
  687.             u'George R. R. Martin,Gardner Dozois,Daniel Abraham',
  688.             u'Eos',
  689.             u'lrf,rar'],
  690.         257: [
  691.             u'Knife of Dreams',
  692.             u'Robert Jordan',
  693.             None,
  694.             u'lit,lrf'],
  695.         258: [
  696.             u'Saturday',
  697.             u'Ian McEwan',
  698.             u'London : Jonathan Cape, 2005.',
  699.             u'lrf,txt'],
  700.         259: [
  701.             u'My name is Red',
  702.             u'Orhan Pamuk; translated from the Turkish by Erda─ƒ G├╢knar',
  703.             u'New York : Alfred A. Knopf, 2001.',
  704.             u'lit,lrf'],
  705.         265: [
  706.             u'Harbinger',
  707.             u'David Mack',
  708.             u'Star Trek',
  709.             u'lit,lrf'],
  710.         267: [
  711.             u'Summon the Thunder',
  712.             u'Dayton Ward,Kevin Dilmore',
  713.             u'Pocket Books',
  714.             u'lit,lrf'],
  715.         268: [
  716.             u'Shalimar the Clown',
  717.             u'Salman Rushdie',
  718.             u'New York : Random House, 2005.',
  719.             u'lit,lrf'],
  720.         269: [
  721.             u'Reap the Whirlwind',
  722.             u'David Mack',
  723.             u'Star Trek',
  724.             u'lit,lrf'],
  725.         272: [
  726.             u'Mistborn',
  727.             u'Brandon Sanderson',
  728.             u'Tor Fantasy',
  729.             u'lrf,rar'],
  730.         273: [
  731.             u'The Thousandfold Thought',
  732.             u'R. Scott Bakker',
  733.             u'Overlook TP',
  734.             u'lrf,rtf'],
  735.         276: [
  736.             u'Elantris',
  737.             u'Brandon Sanderson',
  738.             u'New York : Tor, 2005.',
  739.             u'lrf,rar'],
  740.         291: [
  741.             u'Sundiver',
  742.             u'David Brin',
  743.             u'New York : Bantam Books, 1995.',
  744.             u'lit,lrf'],
  745.         299: [
  746.             u'Imperium',
  747.             u'Robert Harris',
  748.             u'Arrow',
  749.             u'lrf,rar'],
  750.         300: [
  751.             u'Startide Rising',
  752.             u'David Brin',
  753.             u'Bantam',
  754.             u'htm,lrf'],
  755.         301: [
  756.             u'The Uplift War',
  757.             u'David Brin',
  758.             u'Spectra',
  759.             u'lit,lrf'],
  760.         304: [
  761.             u'Brightness Reef',
  762.             u'David Brin',
  763.             u'Orbit',
  764.             u'lrf,rar'],
  765.         305: [
  766.             u"Infinity's Shore",
  767.             u'David Brin',
  768.             u'Spectra',
  769.             u'txt'],
  770.         306: [
  771.             u"Heaven's Reach",
  772.             u'David Brin',
  773.             u'Spectra',
  774.             u'lrf,rar'],
  775.         325: [
  776.             u"Foundation's Triumph",
  777.             u'David Brin',
  778.             u'Easton Press',
  779.             u'lit,lrf'],
  780.         327: [
  781.             u'I am Charlotte Simmons',
  782.             u'Tom Wolfe',
  783.             u'Vintage',
  784.             u'htm,lrf'],
  785.         335: [
  786.             u'The Currents of Space',
  787.             u'Isaac Asimov',
  788.             None,
  789.             u'lit,lrf'],
  790.         340: [
  791.             u'The Other Boleyn Girl',
  792.             u'Philippa Gregory',
  793.             u'Touchstone',
  794.             u'lit,lrf'],
  795.         341: [
  796.             u"Old Man's War",
  797.             u'John Scalzi',
  798.             u'Tor',
  799.             u'htm,lrf'],
  800.         342: [
  801.             u'The Ghost Brigades',
  802.             u'John Scalzi',
  803.             u'Tor Science Fiction',
  804.             u'html,lrf'],
  805.         343: [
  806.             u'The Last Colony',
  807.             u'John Scalzi',
  808.             u'Tor Books',
  809.             u'html,lrf'],
  810.         344: [
  811.             u'Gossip Girl',
  812.             u'Cecily von Ziegesar',
  813.             u'Warner Books',
  814.             u'lrf,rtf'],
  815.         347: [
  816.             u'Little Brother',
  817.             u'Cory Doctorow',
  818.             u'Tor Teen',
  819.             u'lrf'],
  820.         348: [
  821.             u'The Reality Dysfunction',
  822.             u'Peter F. Hamilton',
  823.             u'Pan MacMillan',
  824.             u'lit,lrf'],
  825.         353: [
  826.             u'A Thousand Splendid Suns',
  827.             u'Khaled Hosseini',
  828.             u'Center Point Large Print',
  829.             u'lit,lrf'],
  830.         354: [
  831.             u'Amsterdam',
  832.             u'Ian McEwan',
  833.             u'Anchor',
  834.             u'lrf,txt'],
  835.         355: [
  836.             u'The Neutronium Alchemist',
  837.             u'Peter F. Hamilton',
  838.             u'Aspect',
  839.             u'lit,lrf'],
  840.         356: [
  841.             u'The Naked God',
  842.             u'Peter F. Hamilton',
  843.             u'Aspect',
  844.             u'lit,lrf'],
  845.         421: [
  846.             u'A Shadow in Summer',
  847.             u'Daniel Abraham',
  848.             u'Tor Fantasy',
  849.             u'lrf,rar'],
  850.         427: [
  851.             u'Lonesome Dove',
  852.             u'Larry McMurtry',
  853.             None,
  854.             u'lit,lrf'],
  855.         440: [
  856.             u'Ghost',
  857.             u'John Ringo',
  858.             u'Baen',
  859.             u'lit,lrf'],
  860.         441: [
  861.             u'Kildar',
  862.             u'John Ringo',
  863.             u'Baen',
  864.             u'lit,lrf'],
  865.         443: [
  866.             u'Hidden Empire ',
  867.             u'Kevin J. Anderson',
  868.             u'Aspect',
  869.             u'lrf,rar'],
  870.         444: [
  871.             u'The Gun Seller',
  872.             u'Hugh Laurie',
  873.             u'Washington Square Press',
  874.             u'lrf,rar'] }
  875.     tests = {
  876.         'Dysfunction': set([
  877.             348]),
  878.         'title:Dysfunction': set([
  879.             348]),
  880.         'title:Dysfunction OR author:Laurie': set([
  881.             348,
  882.             444]),
  883.         '(tag:txt or tag:pdf)': set([
  884.             33,
  885.             258,
  886.             354,
  887.             305,
  888.             242,
  889.             51,
  890.             55,
  891.             56,
  892.             154]),
  893.         '(tag:txt OR tag:pdf) and author:Tolstoy': set([
  894.             55,
  895.             56]),
  896.         'Tolstoy txt': set([
  897.             55,
  898.             56]),
  899.         'Hamilton Amsterdam': set([]),
  900.         u'Be├ñr': set([
  901.             91]),
  902.         'dysfunc or tolstoy': set([
  903.             348,
  904.             55,
  905.             56]),
  906.         'tag:txt AND NOT tolstoy': set([
  907.             33,
  908.             258,
  909.             354,
  910.             305,
  911.             242,
  912.             154]),
  913.         'not tag:lrf': set([
  914.             305]),
  915.         'london:thames': set([
  916.             13]),
  917.         'publisher:london:thames': set([
  918.             13]),
  919.         '"(1977)"': set([
  920.             13]),
  921.         'jack weatherford orc': set([
  922.             30]) }
  923.     fields = {
  924.         'title': 0,
  925.         'author': 1,
  926.         'publisher': 2,
  927.         'tag': 3 }
  928.     _universal_set = set(texts.keys())
  929.     
  930.     def universal_set(self):
  931.         return self._universal_set
  932.  
  933.     
  934.     def get_matches(self, location, query):
  935.         location = location.lower()
  936.         if location in self.fields.keys():
  937.             getter = operator.itemgetter(self.fields[location])
  938.         elif location == 'all':
  939.             
  940.             getter = lambda y: ''.join((lambda .0: for x in .0:
  941. None if x else '')(y))
  942.  
  943.         else:
  944.             
  945.             getter = lambda x: ''
  946.         if not query:
  947.             return set([])
  948.         query = query.lower()
  949.         return (query, set)((lambda .0: for key, val in .0:
  950. if query and query in getattr(getter(val), 'lower', (lambda : ''))():
  951.                     yield key
  952.                     continue
  953.             
  954. )(self.texts.items()))
  955.  
  956.     
  957.     def run_tests(self):
  958.         failed = []
  959.         for query in self.tests.keys():
  960.             print 'Testing query:', query,
  961.             res = self.parse(query)
  962.             if res != self.tests[query]:
  963.                 print 'FAILED', 'Expected:', self.tests[query], 'Got:', res
  964.                 failed.append(query)
  965.                 continue
  966.             print 'OK'
  967.         
  968.         return failed
  969.  
  970.  
  971.  
  972. def main(args = sys.argv):
  973.     tester = Tester([
  974.         'authors',
  975.         'author',
  976.         'series',
  977.         'formats',
  978.         'format',
  979.         'publisher',
  980.         'rating',
  981.         'tags',
  982.         'tag',
  983.         'comments',
  984.         'comment',
  985.         'cover',
  986.         'isbn',
  987.         'ondevice',
  988.         'pubdate',
  989.         'size',
  990.         'date',
  991.         'title',
  992.         u'#read',
  993.         'all',
  994.         'search'], test = True)
  995.     failed = tester.run_tests()
  996.     if tester._tests_failed or failed:
  997.         print '>>>>>>>>>>>>>> Tests Failed <<<<<<<<<<<<<<<'
  998.         return 1
  999.     return 0
  1000.  
  1001. if __name__ == '__main__':
  1002.     sys.exit(main())
  1003.  
  1004.