Commit 0e5dbe900569c8a749146e46256c9f7fc17d58e2

Authored by Tássia Camões Araújo
1 parent 67a25822
Exists in master and in 1 other branch add_vagrant

Sharing class PkgMatchDecider.

demo_rec.py
@@ -1,128 +0,0 @@ @@ -1,128 +0,0 @@
1 -#!/usr/bin/python  
2 -  
3 -# AppRecommender - A GNU/Linux application recommender  
4 -#  
5 -# Copyright (C) 2010 Tassia Camoes <tassia@gmail.com>  
6 -#  
7 -# This program is free software: you can redistribute it and/or modify  
8 -# it under the terms of the GNU General Public License as published by  
9 -# the Free Software Foundation, either version 3 of the License, or  
10 -# (at your option) any later version.  
11 -#  
12 -# This program is distributed in the hope that it will be useful,  
13 -# but WITHOUT ANY WARRANTY; without even the implied warranty of  
14 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
15 -# GNU General Public License for more details.  
16 -#  
17 -# You should have received a copy of the GNU General Public License  
18 -# along with this program. If not, see <http://www.gnu.org/licenses/>.  
19 -  
20 -import os  
21 -import sys  
22 -import commands  
23 -import re  
24 -  
25 -import xapian  
26 -from debian import debtags  
27 -  
28 -DB_PATH = "/var/lib/debtags/package-tags"  
29 -INDEX_PATH = os.path.expanduser("~/.app-recommender/debtags_index")  
30 -  
31 -def load_debtags_db(path):  
32 - """ Load debtags database. """  
33 - debtags_db = debtags.DB()  
34 - tag_filter = re.compile(r"^special::.+$|^.+::TODO$")  
35 - try:  
36 - debtags_db.read(open(path, "r"), lambda x: not tag_filter.match(x))  
37 - except IOError:  
38 - print >> sys.stderr, ("IOError: could not open debtags file \'%s\'" %  
39 - path)  
40 - exit(1)  
41 - return debtags_db  
42 -  
43 -def get_system_pkgs():  
44 - """ Return set of system packages. """  
45 - dpkg_output = commands.getoutput('/usr/bin/dpkg --get-selections')  
46 - return dpkg_output.replace('install','\t').split()  
47 -  
48 -def get_most_relevant_tags(debtags_db,pkgs_list):  
49 - """ Return most relevant tags considering a list of packages. """  
50 - relevant_db = debtags_db.choose_packages(pkgs_list)  
51 - relevance_index = debtags.relevance_index_function(debtags_db,relevant_db)  
52 - sorted_relevant_tags = sorted(relevant_db.iter_tags(),  
53 - lambda a, b: cmp(relevance_index(a),  
54 - relevance_index(b)))  
55 - return normalize_tags(' '.join(sorted_relevant_tags[-50:]))  
56 -  
57 -def normalize_tags(string):  
58 - """ Normalize tag string so that it can be indexed and retrieved. """  
59 - return string.replace(':','_').replace('-','\'')  
60 -  
61 -def create_debtags_index(debtags_db,index_path):  
62 - """ Create a xapian index for debtags info based on file 'debtags_db' and  
63 - place it at 'index_path'.  
64 - """  
65 - if not os.path.exists(index_path):  
66 - os.makedirs(index_path)  
67 - print "Creating new debtags xapian index at \'%s\'" % index_path  
68 - debtags_index = xapian.WritableDatabase(index_path,  
69 - xapian.DB_CREATE_OR_OVERWRITE)  
70 - for pkg,tags in debtags_db.iter_packages_tags():  
71 - doc = xapian.Document()  
72 - doc.set_data(pkg)  
73 - for tag in tags:  
74 - doc.add_term(normalize_tags(tag))  
75 - print "indexing ",debtags_index.add_document(doc)  
76 - return debtags_index  
77 -  
78 -def load_debtags_index(debtags_db,reindex):  
79 - """ Load an existing or new debtags index, based on boolean reindex. """  
80 - if not reindex:  
81 - try:  
82 - print ("Opening existing debtags xapian index at \'%s\'" %  
83 - INDEX_PATH)  
84 - debtags_index = xapian.Database(INDEX_PATH)  
85 - except DatabaseError:  
86 - print "Could not open debtags xapian index"  
87 - reindex = 1  
88 - if reindex:  
89 - debtags_index = create_debtags_index(debtags_db,INDEX_PATH)  
90 - return debtags_index  
91 -  
92 -  
93 -class PkgMatchDecider(xapian.MatchDecider):  
94 - """ Extends xapian.MatchDecider to disconsider installed packages. """  
95 -  
96 - def __init__(self, installed_pkgs):  
97 - xapian.MatchDecider.__init__(self)  
98 - self.installed_pkgs = installed_pkgs  
99 -  
100 - def __call__(self, doc):  
101 - return doc.get_data() not in self.installed_pkgs  
102 -  
103 -  
104 -if __name__ == '__main__':  
105 -  
106 - reindex = 0  
107 - if len(sys.argv) == 2:  
108 - DB_PATH = sys.argv[1]  
109 - reindex = 1  
110 - print "reindex true"  
111 - elif len(sys.argv) > 2:  
112 - print >> sys.stderr, ("Usage: %s [PATH_TO_DEBTAGS_DATABASE]" %  
113 - sys.argv[0])  
114 - sys.exit(1)  
115 -  
116 - debtags_db = load_debtags_db(DB_PATH)  
117 - installed_pkgs = get_system_pkgs()  
118 - best_tags = get_most_relevant_tags(debtags_db,installed_pkgs)  
119 -  
120 - debtags_index = load_debtags_index(debtags_db,reindex)  
121 - qp = xapian.QueryParser()  
122 - query = qp.parse_query(best_tags)  
123 - enquire = xapian.Enquire(debtags_index)  
124 - enquire.set_query(query)  
125 -  
126 - mset = enquire.get_mset(0, 20, None, PkgMatchDecider(installed_pkgs))  
127 - for m in mset:  
128 - print "%2d: %s" % (m.rank, m.document.get_data())  
doc/doxy_config 0 → 100644
@@ -0,0 +1,270 @@ @@ -0,0 +1,270 @@
  1 +# Doxyfile 1.7.1
  2 +
  3 +#---------------------------------------------------------------------------
  4 +# Project related configuration options
  5 +#---------------------------------------------------------------------------
  6 +DOXYFILE_ENCODING = UTF-8
  7 +PROJECT_NAME = App Recommender
  8 +PROJECT_NUMBER = 0.1
  9 +OUTPUT_DIRECTORY = doc/
  10 +CREATE_SUBDIRS = NO
  11 +OUTPUT_LANGUAGE = English
  12 +BRIEF_MEMBER_DESC = YES
  13 +REPEAT_BRIEF = YES
  14 +ABBREVIATE_BRIEF =
  15 +ALWAYS_DETAILED_SEC = NO
  16 +INLINE_INHERITED_MEMB = NO
  17 +FULL_PATH_NAMES = YES
  18 +STRIP_FROM_PATH =
  19 +STRIP_FROM_INC_PATH =
  20 +SHORT_NAMES = NO
  21 +JAVADOC_AUTOBRIEF = NO
  22 +QT_AUTOBRIEF = NO
  23 +MULTILINE_CPP_IS_BRIEF = NO
  24 +INHERIT_DOCS = YES
  25 +SEPARATE_MEMBER_PAGES = NO
  26 +TAB_SIZE = 4
  27 +ALIASES =
  28 +OPTIMIZE_OUTPUT_FOR_C = NO
  29 +OPTIMIZE_OUTPUT_JAVA = NO
  30 +OPTIMIZE_FOR_FORTRAN = NO
  31 +OPTIMIZE_OUTPUT_VHDL = NO
  32 +EXTENSION_MAPPING =
  33 +BUILTIN_STL_SUPPORT = NO
  34 +CPP_CLI_SUPPORT = NO
  35 +SIP_SUPPORT = NO
  36 +IDL_PROPERTY_SUPPORT = YES
  37 +DISTRIBUTE_GROUP_DOC = NO
  38 +SUBGROUPING = YES
  39 +TYPEDEF_HIDES_STRUCT = NO
  40 +SYMBOL_CACHE_SIZE = 0
  41 +#---------------------------------------------------------------------------
  42 +# Build related configuration options
  43 +#---------------------------------------------------------------------------
  44 +EXTRACT_ALL = NO
  45 +EXTRACT_PRIVATE = NO
  46 +EXTRACT_STATIC = NO
  47 +EXTRACT_LOCAL_CLASSES = YES
  48 +EXTRACT_LOCAL_METHODS = YES
  49 +EXTRACT_ANON_NSPACES = NO
  50 +HIDE_UNDOC_MEMBERS = NO
  51 +HIDE_UNDOC_CLASSES = NO
  52 +HIDE_FRIEND_COMPOUNDS = NO
  53 +HIDE_IN_BODY_DOCS = NO
  54 +INTERNAL_DOCS = NO
  55 +CASE_SENSE_NAMES = YES
  56 +HIDE_SCOPE_NAMES = NO
  57 +SHOW_INCLUDE_FILES = YES
  58 +FORCE_LOCAL_INCLUDES = NO
  59 +INLINE_INFO = YES
  60 +SORT_MEMBER_DOCS = YES
  61 +SORT_BRIEF_DOCS = NO
  62 +SORT_MEMBERS_CTORS_1ST = NO
  63 +SORT_GROUP_NAMES = NO
  64 +SORT_BY_SCOPE_NAME = NO
  65 +GENERATE_TODOLIST = YES
  66 +GENERATE_TESTLIST = YES
  67 +GENERATE_BUGLIST = YES
  68 +GENERATE_DEPRECATEDLIST= YES
  69 +ENABLED_SECTIONS =
  70 +MAX_INITIALIZER_LINES = 30
  71 +SHOW_USED_FILES = YES
  72 +SHOW_DIRECTORIES = NO
  73 +SHOW_FILES = YES
  74 +SHOW_NAMESPACES = YES
  75 +FILE_VERSION_FILTER =
  76 +LAYOUT_FILE =
  77 +#---------------------------------------------------------------------------
  78 +# configuration options related to warning and progress messages
  79 +#---------------------------------------------------------------------------
  80 +QUIET = NO
  81 +WARNINGS = YES
  82 +WARN_IF_UNDOCUMENTED = YES
  83 +WARN_IF_DOC_ERROR = YES
  84 +WARN_NO_PARAMDOC = NO
  85 +WARN_FORMAT = "$file:$line: $text"
  86 +WARN_LOGFILE =
  87 +#---------------------------------------------------------------------------
  88 +# configuration options related to the input files
  89 +#---------------------------------------------------------------------------
  90 +INPUT =
  91 +INPUT_ENCODING = UTF-8
  92 +FILE_PATTERNS =
  93 +RECURSIVE = YES
  94 +EXCLUDE =
  95 +EXCLUDE_SYMLINKS = NO
  96 +EXCLUDE_PATTERNS =
  97 +EXCLUDE_SYMBOLS =
  98 +EXAMPLE_PATH =
  99 +EXAMPLE_PATTERNS =
  100 +EXAMPLE_RECURSIVE = NO
  101 +IMAGE_PATH =
  102 +INPUT_FILTER =
  103 +FILTER_PATTERNS =
  104 +FILTER_SOURCE_FILES = NO
  105 +#---------------------------------------------------------------------------
  106 +# configuration options related to source browsing
  107 +#---------------------------------------------------------------------------
  108 +SOURCE_BROWSER = YES
  109 +INLINE_SOURCES = NO
  110 +STRIP_CODE_COMMENTS = YES
  111 +REFERENCED_BY_RELATION = NO
  112 +REFERENCES_RELATION = NO
  113 +REFERENCES_LINK_SOURCE = YES
  114 +USE_HTAGS = NO
  115 +VERBATIM_HEADERS = YES
  116 +#---------------------------------------------------------------------------
  117 +# configuration options related to the alphabetical class index
  118 +#---------------------------------------------------------------------------
  119 +ALPHABETICAL_INDEX = YES
  120 +COLS_IN_ALPHA_INDEX = 5
  121 +IGNORE_PREFIX =
  122 +#---------------------------------------------------------------------------
  123 +# configuration options related to the HTML output
  124 +#---------------------------------------------------------------------------
  125 +GENERATE_HTML = YES
  126 +HTML_OUTPUT = html
  127 +HTML_FILE_EXTENSION = .html
  128 +HTML_HEADER =
  129 +HTML_FOOTER =
  130 +HTML_STYLESHEET =
  131 +HTML_COLORSTYLE_HUE = 220
  132 +HTML_COLORSTYLE_SAT = 100
  133 +HTML_COLORSTYLE_GAMMA = 80
  134 +HTML_TIMESTAMP = YES
  135 +HTML_ALIGN_MEMBERS = YES
  136 +HTML_DYNAMIC_SECTIONS = NO
  137 +GENERATE_DOCSET = NO
  138 +DOCSET_FEEDNAME = "Doxygen generated docs"
  139 +DOCSET_BUNDLE_ID = org.doxygen.Project
  140 +DOCSET_PUBLISHER_ID = org.doxygen.Publisher
  141 +DOCSET_PUBLISHER_NAME = Publisher
  142 +GENERATE_HTMLHELP = NO
  143 +CHM_FILE =
  144 +HHC_LOCATION =
  145 +GENERATE_CHI = NO
  146 +CHM_INDEX_ENCODING =
  147 +BINARY_TOC = NO
  148 +TOC_EXPAND = NO
  149 +GENERATE_QHP = NO
  150 +QCH_FILE =
  151 +QHP_NAMESPACE = org.doxygen.Project
  152 +QHP_VIRTUAL_FOLDER = doc
  153 +QHP_CUST_FILTER_NAME =
  154 +QHP_CUST_FILTER_ATTRS =
  155 +QHP_SECT_FILTER_ATTRS =
  156 +QHG_LOCATION =
  157 +GENERATE_ECLIPSEHELP = NO
  158 +ECLIPSE_DOC_ID = org.doxygen.Project
  159 +DISABLE_INDEX = NO
  160 +ENUM_VALUES_PER_LINE = 4
  161 +GENERATE_TREEVIEW = NO
  162 +USE_INLINE_TREES = NO
  163 +TREEVIEW_WIDTH = 250
  164 +EXT_LINKS_IN_WINDOW = NO
  165 +FORMULA_FONTSIZE = 10
  166 +FORMULA_TRANSPARENT = YES
  167 +SEARCHENGINE = YES
  168 +SERVER_BASED_SEARCH = NO
  169 +#---------------------------------------------------------------------------
  170 +# configuration options related to the LaTeX output
  171 +#---------------------------------------------------------------------------
  172 +GENERATE_LATEX = NO
  173 +LATEX_OUTPUT = latex
  174 +LATEX_CMD_NAME = latex
  175 +MAKEINDEX_CMD_NAME = makeindex
  176 +COMPACT_LATEX = NO
  177 +PAPER_TYPE = a4wide
  178 +EXTRA_PACKAGES =
  179 +LATEX_HEADER =
  180 +PDF_HYPERLINKS = YES
  181 +USE_PDFLATEX = YES
  182 +LATEX_BATCHMODE = NO
  183 +LATEX_HIDE_INDICES = NO
  184 +LATEX_SOURCE_CODE = NO
  185 +#---------------------------------------------------------------------------
  186 +# configuration options related to the RTF output
  187 +#---------------------------------------------------------------------------
  188 +GENERATE_RTF = NO
  189 +RTF_OUTPUT = rtf
  190 +COMPACT_RTF = NO
  191 +RTF_HYPERLINKS = NO
  192 +RTF_STYLESHEET_FILE =
  193 +RTF_EXTENSIONS_FILE =
  194 +#---------------------------------------------------------------------------
  195 +# configuration options related to the man page output
  196 +#---------------------------------------------------------------------------
  197 +GENERATE_MAN = NO
  198 +MAN_OUTPUT = man
  199 +MAN_EXTENSION = .3
  200 +MAN_LINKS = NO
  201 +#---------------------------------------------------------------------------
  202 +# configuration options related to the XML output
  203 +#---------------------------------------------------------------------------
  204 +GENERATE_XML = NO
  205 +XML_OUTPUT = xml
  206 +XML_SCHEMA =
  207 +XML_DTD =
  208 +XML_PROGRAMLISTING = YES
  209 +#---------------------------------------------------------------------------
  210 +# configuration options for the AutoGen Definitions output
  211 +#---------------------------------------------------------------------------
  212 +GENERATE_AUTOGEN_DEF = NO
  213 +#---------------------------------------------------------------------------
  214 +# configuration options related to the Perl module output
  215 +#---------------------------------------------------------------------------
  216 +GENERATE_PERLMOD = NO
  217 +PERLMOD_LATEX = NO
  218 +PERLMOD_PRETTY = YES
  219 +PERLMOD_MAKEVAR_PREFIX =
  220 +#---------------------------------------------------------------------------
  221 +# Configuration options related to the preprocessor
  222 +#---------------------------------------------------------------------------
  223 +ENABLE_PREPROCESSING = YES
  224 +MACRO_EXPANSION = NO
  225 +EXPAND_ONLY_PREDEF = NO
  226 +SEARCH_INCLUDES = YES
  227 +INCLUDE_PATH =
  228 +INCLUDE_FILE_PATTERNS =
  229 +PREDEFINED =
  230 +EXPAND_AS_DEFINED =
  231 +SKIP_FUNCTION_MACROS = YES
  232 +#---------------------------------------------------------------------------
  233 +# Configuration::additions related to external references
  234 +#---------------------------------------------------------------------------
  235 +TAGFILES =
  236 +GENERATE_TAGFILE =
  237 +ALLEXTERNALS = NO
  238 +EXTERNAL_GROUPS = YES
  239 +PERL_PATH = /usr/bin/perl
  240 +#---------------------------------------------------------------------------
  241 +# Configuration options related to the dot tool
  242 +#---------------------------------------------------------------------------
  243 +CLASS_DIAGRAMS = YES
  244 +MSCGEN_PATH =
  245 +HIDE_UNDOC_RELATIONS = YES
  246 +HAVE_DOT = NO
  247 +DOT_NUM_THREADS = 0
  248 +DOT_FONTNAME = FreeSans.ttf
  249 +DOT_FONTSIZE = 10
  250 +DOT_FONTPATH =
  251 +CLASS_GRAPH = YES
  252 +COLLABORATION_GRAPH = YES
  253 +GROUP_GRAPHS = YES
  254 +UML_LOOK = NO
  255 +TEMPLATE_RELATIONS = NO
  256 +INCLUDE_GRAPH = YES
  257 +INCLUDED_BY_GRAPH = YES
  258 +CALL_GRAPH = NO
  259 +CALLER_GRAPH = NO
  260 +GRAPHICAL_HIERARCHY = YES
  261 +DIRECTORY_GRAPH = YES
  262 +DOT_IMAGE_FORMAT = png
  263 +DOT_PATH =
  264 +DOTFILE_DIRS =
  265 +DOT_GRAPH_MAX_NODES = 50
  266 +MAX_DOT_GRAPH_DEPTH = 0
  267 +DOT_TRANSPARENT = NO
  268 +DOT_MULTI_TARGETS = YES
  269 +GENERATE_LEGEND = YES
  270 +DOT_CLEANUP = YES
doxy_config
@@ -1,270 +0,0 @@ @@ -1,270 +0,0 @@
1 -# Doxyfile 1.7.1  
2 -  
3 -#---------------------------------------------------------------------------  
4 -# Project related configuration options  
5 -#---------------------------------------------------------------------------  
6 -DOXYFILE_ENCODING = UTF-8  
7 -PROJECT_NAME = App Recommender  
8 -PROJECT_NUMBER = 0.1  
9 -OUTPUT_DIRECTORY = doc/  
10 -CREATE_SUBDIRS = NO  
11 -OUTPUT_LANGUAGE = English  
12 -BRIEF_MEMBER_DESC = YES  
13 -REPEAT_BRIEF = YES  
14 -ABBREVIATE_BRIEF =  
15 -ALWAYS_DETAILED_SEC = NO  
16 -INLINE_INHERITED_MEMB = NO  
17 -FULL_PATH_NAMES = YES  
18 -STRIP_FROM_PATH =  
19 -STRIP_FROM_INC_PATH =  
20 -SHORT_NAMES = NO  
21 -JAVADOC_AUTOBRIEF = NO  
22 -QT_AUTOBRIEF = NO  
23 -MULTILINE_CPP_IS_BRIEF = NO  
24 -INHERIT_DOCS = YES  
25 -SEPARATE_MEMBER_PAGES = NO  
26 -TAB_SIZE = 4  
27 -ALIASES =  
28 -OPTIMIZE_OUTPUT_FOR_C = NO  
29 -OPTIMIZE_OUTPUT_JAVA = NO  
30 -OPTIMIZE_FOR_FORTRAN = NO  
31 -OPTIMIZE_OUTPUT_VHDL = NO  
32 -EXTENSION_MAPPING =  
33 -BUILTIN_STL_SUPPORT = NO  
34 -CPP_CLI_SUPPORT = NO  
35 -SIP_SUPPORT = NO  
36 -IDL_PROPERTY_SUPPORT = YES  
37 -DISTRIBUTE_GROUP_DOC = NO  
38 -SUBGROUPING = YES  
39 -TYPEDEF_HIDES_STRUCT = NO  
40 -SYMBOL_CACHE_SIZE = 0  
41 -#---------------------------------------------------------------------------  
42 -# Build related configuration options  
43 -#---------------------------------------------------------------------------  
44 -EXTRACT_ALL = NO  
45 -EXTRACT_PRIVATE = NO  
46 -EXTRACT_STATIC = NO  
47 -EXTRACT_LOCAL_CLASSES = YES  
48 -EXTRACT_LOCAL_METHODS = YES  
49 -EXTRACT_ANON_NSPACES = NO  
50 -HIDE_UNDOC_MEMBERS = NO  
51 -HIDE_UNDOC_CLASSES = NO  
52 -HIDE_FRIEND_COMPOUNDS = NO  
53 -HIDE_IN_BODY_DOCS = NO  
54 -INTERNAL_DOCS = NO  
55 -CASE_SENSE_NAMES = YES  
56 -HIDE_SCOPE_NAMES = NO  
57 -SHOW_INCLUDE_FILES = YES  
58 -FORCE_LOCAL_INCLUDES = NO  
59 -INLINE_INFO = YES  
60 -SORT_MEMBER_DOCS = YES  
61 -SORT_BRIEF_DOCS = NO  
62 -SORT_MEMBERS_CTORS_1ST = NO  
63 -SORT_GROUP_NAMES = NO  
64 -SORT_BY_SCOPE_NAME = NO  
65 -GENERATE_TODOLIST = YES  
66 -GENERATE_TESTLIST = YES  
67 -GENERATE_BUGLIST = YES  
68 -GENERATE_DEPRECATEDLIST= YES  
69 -ENABLED_SECTIONS =  
70 -MAX_INITIALIZER_LINES = 30  
71 -SHOW_USED_FILES = YES  
72 -SHOW_DIRECTORIES = NO  
73 -SHOW_FILES = YES  
74 -SHOW_NAMESPACES = YES  
75 -FILE_VERSION_FILTER =  
76 -LAYOUT_FILE =  
77 -#---------------------------------------------------------------------------  
78 -# configuration options related to warning and progress messages  
79 -#---------------------------------------------------------------------------  
80 -QUIET = NO  
81 -WARNINGS = YES  
82 -WARN_IF_UNDOCUMENTED = YES  
83 -WARN_IF_DOC_ERROR = YES  
84 -WARN_NO_PARAMDOC = NO  
85 -WARN_FORMAT = "$file:$line: $text"  
86 -WARN_LOGFILE =  
87 -#---------------------------------------------------------------------------  
88 -# configuration options related to the input files  
89 -#---------------------------------------------------------------------------  
90 -INPUT =  
91 -INPUT_ENCODING = UTF-8  
92 -FILE_PATTERNS =  
93 -RECURSIVE = YES  
94 -EXCLUDE =  
95 -EXCLUDE_SYMLINKS = NO  
96 -EXCLUDE_PATTERNS =  
97 -EXCLUDE_SYMBOLS =  
98 -EXAMPLE_PATH =  
99 -EXAMPLE_PATTERNS =  
100 -EXAMPLE_RECURSIVE = NO  
101 -IMAGE_PATH =  
102 -INPUT_FILTER =  
103 -FILTER_PATTERNS =  
104 -FILTER_SOURCE_FILES = NO  
105 -#---------------------------------------------------------------------------  
106 -# configuration options related to source browsing  
107 -#---------------------------------------------------------------------------  
108 -SOURCE_BROWSER = YES  
109 -INLINE_SOURCES = NO  
110 -STRIP_CODE_COMMENTS = YES  
111 -REFERENCED_BY_RELATION = NO  
112 -REFERENCES_RELATION = NO  
113 -REFERENCES_LINK_SOURCE = YES  
114 -USE_HTAGS = NO  
115 -VERBATIM_HEADERS = YES  
116 -#---------------------------------------------------------------------------  
117 -# configuration options related to the alphabetical class index  
118 -#---------------------------------------------------------------------------  
119 -ALPHABETICAL_INDEX = YES  
120 -COLS_IN_ALPHA_INDEX = 5  
121 -IGNORE_PREFIX =  
122 -#---------------------------------------------------------------------------  
123 -# configuration options related to the HTML output  
124 -#---------------------------------------------------------------------------  
125 -GENERATE_HTML = YES  
126 -HTML_OUTPUT = html  
127 -HTML_FILE_EXTENSION = .html  
128 -HTML_HEADER =  
129 -HTML_FOOTER =  
130 -HTML_STYLESHEET =  
131 -HTML_COLORSTYLE_HUE = 220  
132 -HTML_COLORSTYLE_SAT = 100  
133 -HTML_COLORSTYLE_GAMMA = 80  
134 -HTML_TIMESTAMP = YES  
135 -HTML_ALIGN_MEMBERS = YES  
136 -HTML_DYNAMIC_SECTIONS = NO  
137 -GENERATE_DOCSET = NO  
138 -DOCSET_FEEDNAME = "Doxygen generated docs"  
139 -DOCSET_BUNDLE_ID = org.doxygen.Project  
140 -DOCSET_PUBLISHER_ID = org.doxygen.Publisher  
141 -DOCSET_PUBLISHER_NAME = Publisher  
142 -GENERATE_HTMLHELP = NO  
143 -CHM_FILE =  
144 -HHC_LOCATION =  
145 -GENERATE_CHI = NO  
146 -CHM_INDEX_ENCODING =  
147 -BINARY_TOC = NO  
148 -TOC_EXPAND = NO  
149 -GENERATE_QHP = NO  
150 -QCH_FILE =  
151 -QHP_NAMESPACE = org.doxygen.Project  
152 -QHP_VIRTUAL_FOLDER = doc  
153 -QHP_CUST_FILTER_NAME =  
154 -QHP_CUST_FILTER_ATTRS =  
155 -QHP_SECT_FILTER_ATTRS =  
156 -QHG_LOCATION =  
157 -GENERATE_ECLIPSEHELP = NO  
158 -ECLIPSE_DOC_ID = org.doxygen.Project  
159 -DISABLE_INDEX = NO  
160 -ENUM_VALUES_PER_LINE = 4  
161 -GENERATE_TREEVIEW = NO  
162 -USE_INLINE_TREES = NO  
163 -TREEVIEW_WIDTH = 250  
164 -EXT_LINKS_IN_WINDOW = NO  
165 -FORMULA_FONTSIZE = 10  
166 -FORMULA_TRANSPARENT = YES  
167 -SEARCHENGINE = YES  
168 -SERVER_BASED_SEARCH = NO  
169 -#---------------------------------------------------------------------------  
170 -# configuration options related to the LaTeX output  
171 -#---------------------------------------------------------------------------  
172 -GENERATE_LATEX = NO  
173 -LATEX_OUTPUT = latex  
174 -LATEX_CMD_NAME = latex  
175 -MAKEINDEX_CMD_NAME = makeindex  
176 -COMPACT_LATEX = NO  
177 -PAPER_TYPE = a4wide  
178 -EXTRA_PACKAGES =  
179 -LATEX_HEADER =  
180 -PDF_HYPERLINKS = YES  
181 -USE_PDFLATEX = YES  
182 -LATEX_BATCHMODE = NO  
183 -LATEX_HIDE_INDICES = NO  
184 -LATEX_SOURCE_CODE = NO  
185 -#---------------------------------------------------------------------------  
186 -# configuration options related to the RTF output  
187 -#---------------------------------------------------------------------------  
188 -GENERATE_RTF = NO  
189 -RTF_OUTPUT = rtf  
190 -COMPACT_RTF = NO  
191 -RTF_HYPERLINKS = NO  
192 -RTF_STYLESHEET_FILE =  
193 -RTF_EXTENSIONS_FILE =  
194 -#---------------------------------------------------------------------------  
195 -# configuration options related to the man page output  
196 -#---------------------------------------------------------------------------  
197 -GENERATE_MAN = NO  
198 -MAN_OUTPUT = man  
199 -MAN_EXTENSION = .3  
200 -MAN_LINKS = NO  
201 -#---------------------------------------------------------------------------  
202 -# configuration options related to the XML output  
203 -#---------------------------------------------------------------------------  
204 -GENERATE_XML = NO  
205 -XML_OUTPUT = xml  
206 -XML_SCHEMA =  
207 -XML_DTD =  
208 -XML_PROGRAMLISTING = YES  
209 -#---------------------------------------------------------------------------  
210 -# configuration options for the AutoGen Definitions output  
211 -#---------------------------------------------------------------------------  
212 -GENERATE_AUTOGEN_DEF = NO  
213 -#---------------------------------------------------------------------------  
214 -# configuration options related to the Perl module output  
215 -#---------------------------------------------------------------------------  
216 -GENERATE_PERLMOD = NO  
217 -PERLMOD_LATEX = NO  
218 -PERLMOD_PRETTY = YES  
219 -PERLMOD_MAKEVAR_PREFIX =  
220 -#---------------------------------------------------------------------------  
221 -# Configuration options related to the preprocessor  
222 -#---------------------------------------------------------------------------  
223 -ENABLE_PREPROCESSING = YES  
224 -MACRO_EXPANSION = NO  
225 -EXPAND_ONLY_PREDEF = NO  
226 -SEARCH_INCLUDES = YES  
227 -INCLUDE_PATH =  
228 -INCLUDE_FILE_PATTERNS =  
229 -PREDEFINED =  
230 -EXPAND_AS_DEFINED =  
231 -SKIP_FUNCTION_MACROS = YES  
232 -#---------------------------------------------------------------------------  
233 -# Configuration::additions related to external references  
234 -#---------------------------------------------------------------------------  
235 -TAGFILES =  
236 -GENERATE_TAGFILE =  
237 -ALLEXTERNALS = NO  
238 -EXTERNAL_GROUPS = YES  
239 -PERL_PATH = /usr/bin/perl  
240 -#---------------------------------------------------------------------------  
241 -# Configuration options related to the dot tool  
242 -#---------------------------------------------------------------------------  
243 -CLASS_DIAGRAMS = YES  
244 -MSCGEN_PATH =  
245 -HIDE_UNDOC_RELATIONS = YES  
246 -HAVE_DOT = NO  
247 -DOT_NUM_THREADS = 0  
248 -DOT_FONTNAME = FreeSans.ttf  
249 -DOT_FONTSIZE = 10  
250 -DOT_FONTPATH =  
251 -CLASS_GRAPH = YES  
252 -COLLABORATION_GRAPH = YES  
253 -GROUP_GRAPHS = YES  
254 -UML_LOOK = NO  
255 -TEMPLATE_RELATIONS = NO  
256 -INCLUDE_GRAPH = YES  
257 -INCLUDED_BY_GRAPH = YES  
258 -CALL_GRAPH = NO  
259 -CALLER_GRAPH = NO  
260 -GRAPHICAL_HIERARCHY = YES  
261 -DIRECTORY_GRAPH = YES  
262 -DOT_IMAGE_FORMAT = png  
263 -DOT_PATH =  
264 -DOTFILE_DIRS =  
265 -DOT_GRAPH_MAX_NODES = 50  
266 -MAX_DOT_GRAPH_DEPTH = 0  
267 -DOT_TRANSPARENT = NO  
268 -DOT_MULTI_TARGETS = YES  
269 -GENERATE_LEGEND = YES  
270 -DOT_CLEANUP = YES  
@@ -68,16 +68,6 @@ class DebtagsDB(debtags.DB): @@ -68,16 +68,6 @@ class DebtagsDB(debtags.DB):
68 relevance_index(b))) 68 relevance_index(b)))
69 return normalize_tags(' '.join(sorted_relevant_tags[-qtd_of_tags:])) 69 return normalize_tags(' '.join(sorted_relevant_tags[-qtd_of_tags:]))
70 70
71 -class PkgMatchDecider(xapian.MatchDecider):  
72 - """ Extends xapian.MatchDecider to disconsider installed packages. """  
73 -  
74 - def __init__(self, installed_pkgs):  
75 - xapian.MatchDecider.__init__(self)  
76 - self.installed_pkgs = installed_pkgs  
77 -  
78 - def __call__(self, doc):  
79 - return doc.get_data() not in self.installed_pkgs  
80 -  
81 class DebtagsIndex: 71 class DebtagsIndex:
82 def __init__(self,path): 72 def __init__(self,path):
83 self.path = path 73 self.path = path
src/demo_rec.py 0 → 100755
@@ -0,0 +1,118 @@ @@ -0,0 +1,118 @@
  1 +#!/usr/bin/python
  2 +
  3 +# AppRecommender - A GNU/Linux application recommender
  4 +#
  5 +# Copyright (C) 2010 Tassia Camoes <tassia@gmail.com>
  6 +#
  7 +# This program is free software: you can redistribute it and/or modify
  8 +# it under the terms of the GNU General Public License as published by
  9 +# the Free Software Foundation, either version 3 of the License, or
  10 +# (at your option) any later version.
  11 +#
  12 +# This program is distributed in the hope that it will be useful,
  13 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15 +# GNU General Public License for more details.
  16 +#
  17 +# You should have received a copy of the GNU General Public License
  18 +# along with this program. If not, see <http://www.gnu.org/licenses/>.
  19 +
  20 +import os
  21 +import sys
  22 +import commands
  23 +import re
  24 +
  25 +import xapian
  26 +from debian import debtags
  27 +from strategy import PkgMatchDecider
  28 +
  29 +DB_PATH = "/var/lib/debtags/package-tags"
  30 +INDEX_PATH = os.path.expanduser("~/.app-recommender/debtags_index")
  31 +
  32 +def load_debtags_db(path):
  33 + """ Load debtags database. """
  34 + debtags_db = debtags.DB()
  35 + tag_filter = re.compile(r"^special::.+$|^.+::TODO$")
  36 + try:
  37 + debtags_db.read(open(path, "r"), lambda x: not tag_filter.match(x))
  38 + except IOError:
  39 + print >> sys.stderr, ("IOError: could not open debtags file \'%s\'" %
  40 + path)
  41 + exit(1)
  42 + return debtags_db
  43 +
  44 +def get_system_pkgs():
  45 + """ Return set of system packages. """
  46 + dpkg_output = commands.getoutput('/usr/bin/dpkg --get-selections')
  47 + return dpkg_output.replace('install','\t').split()
  48 +
  49 +def get_most_relevant_tags(debtags_db,pkgs_list):
  50 + """ Return most relevant tags considering a list of packages. """
  51 + relevant_db = debtags_db.choose_packages(pkgs_list)
  52 + relevance_index = debtags.relevance_index_function(debtags_db,relevant_db)
  53 + sorted_relevant_tags = sorted(relevant_db.iter_tags(),
  54 + lambda a, b: cmp(relevance_index(a),
  55 + relevance_index(b)))
  56 + return normalize_tags(' '.join(sorted_relevant_tags[-50:]))
  57 +
  58 +def normalize_tags(string):
  59 + """ Normalize tag string so that it can be indexed and retrieved. """
  60 + return string.replace(':','_').replace('-','\'')
  61 +
  62 +def create_debtags_index(debtags_db,index_path):
  63 + """ Create a xapian index for debtags info based on file 'debtags_db' and
  64 + place it at 'index_path'.
  65 + """
  66 + if not os.path.exists(index_path):
  67 + os.makedirs(index_path)
  68 + print "Creating new debtags xapian index at \'%s\'" % index_path
  69 + debtags_index = xapian.WritableDatabase(index_path,
  70 + xapian.DB_CREATE_OR_OVERWRITE)
  71 + for pkg,tags in debtags_db.iter_packages_tags():
  72 + doc = xapian.Document()
  73 + doc.set_data(pkg)
  74 + for tag in tags:
  75 + doc.add_term(normalize_tags(tag))
  76 + print "indexing ",debtags_index.add_document(doc)
  77 + return debtags_index
  78 +
  79 +def load_debtags_index(debtags_db,reindex):
  80 + """ Load an existing or new debtags index, based on boolean reindex. """
  81 + if not reindex:
  82 + try:
  83 + print ("Opening existing debtags xapian index at \'%s\'" %
  84 + INDEX_PATH)
  85 + debtags_index = xapian.Database(INDEX_PATH)
  86 + except DatabaseError:
  87 + print "Could not open debtags xapian index"
  88 + reindex = 1
  89 + if reindex:
  90 + debtags_index = create_debtags_index(debtags_db,INDEX_PATH)
  91 + return debtags_index
  92 +
  93 +
  94 +if __name__ == '__main__':
  95 +
  96 + reindex = 0
  97 + if len(sys.argv) == 2:
  98 + DB_PATH = sys.argv[1]
  99 + reindex = 1
  100 + print "reindex true"
  101 + elif len(sys.argv) > 2:
  102 + print >> sys.stderr, ("Usage: %s [PATH_TO_DEBTAGS_DATABASE]" %
  103 + sys.argv[0])
  104 + sys.exit(1)
  105 +
  106 + debtags_db = load_debtags_db(DB_PATH)
  107 + installed_pkgs = get_system_pkgs()
  108 + best_tags = get_most_relevant_tags(debtags_db,installed_pkgs)
  109 +
  110 + debtags_index = load_debtags_index(debtags_db,reindex)
  111 + qp = xapian.QueryParser()
  112 + query = qp.parse_query(best_tags)
  113 + enquire = xapian.Enquire(debtags_index)
  114 + enquire.set_query(query)
  115 +
  116 + mset = enquire.get_mset(0, 20, None, PkgMatchDecider(installed_pkgs))
  117 + for m in mset:
  118 + print "%2d: %s" % (m.rank, m.document.get_data())