Python LMF library
 All Classes Namespaces Files Functions Variables
wrapper.py
Go to the documentation of this file.
1 #! /usr/bin/env python
2 
3 """! @pmodule wrapper Contains one main function, wrapper_rw(), which runs another function which should be a user function. If the library raises an exception, wrapper_rw() will restore the terminal to a sane state so you can read the resulting traceback.
4 """
5 
6 __version__ = '1.0'
7 
8 # Add pylmflib/pylmflib/ folder to path
9 import sys
10 sys.path.append('./pylmflib')
11 
12 ## Functions to read from a file: MDF, XML LMF, sort order, XML config
13 from input.mdf import mdf_read
14 from input.xml_lmf import xml_lmf_read as lmf_read
15 from config.xml import sort_order_read as order_read
16 from config.xml import config_read
17 
18 ## Functions to write into a file: MDF, XML LMF, LaTeX, doc
19 from output.mdf import mdf_write
20 from output.xml_lmf import xml_lmf_write as lmf_write
21 from output.tex import tex_write
22 
23 from utils.error_handling import Error
24 from utils.log import log
25 
26 ## Module variable
27 lexical_resource = None
28 
29 def wrapper_rw(func, *args, **kwds):
30  """! @brief Wrapper function that calls another function, restoring normal behavior on error.
31  @param func Callable object.
32  @param args Arguments passed to 'func' as its first argument.
33  @param kwds Other arguments passed to 'func'.
34  """
35  import wrapper
36  ## As this is a user function, it is executed under 'try' statement to catch and handle exceptions
37  try:
38  object = func(*args, **kwds)
39  if object.__class__.__name__ == "LexicalResource":
40  wrapper.lexical_resource = object
41  return object
42  elif object.__class__.__name__ == "Lexicon":
43  from core.lexical_resource import LexicalResource
44  if wrapper.lexical_resource is None:
45  # Create a Lexical Resource only once
46  wrapper.lexical_resource = LexicalResource()
47  # Attach lexicon to the lexical resource if not yet done
48  if wrapper.lexical_resource.get_lexicon(object.get_id()) is None:
49  wrapper.lexical_resource.add_lexicon(object)
50  return wrapper.lexical_resource
51  elif type(object) == type(dict()) or type(object) == type(tuple()):
52  return object
53  except Error as exception:
54  ## A library error has occured
55  exception.handle()
56  except SystemExit:
57  ## The library decided to stop execution
58  raise
59  except:
60  ## A system error has occured
61  import sys
62  sys.stderr.write("Unexpected error: " + str(sys.exc_info()[0]) + "\n")
63  raise
64  else:
65  ## Nominal case
66  pass
67  finally:
68  ## Set everything back to normal and release created objects if any
69  pass
70 
71 def read_mdf(*args, **kwds):
72  import wrapper
73  # To access options
74  from pylmflib import options
75  global options
76  # Find lexicon configuration if any
77  try:
78  id = kwds['id']
79  except KeyError:
80  id = None
81  if id is not None and wrapper.lexical_resource is not None:
82  lexicon = wrapper.lexical_resource.get_lexicon(id)
83  # Add lexicon argument
84  kwds.update({'lexicon': lexicon})
85  # An MDF file contains one lexicon only, but wrapper_rw() function encapsulates it into a lexical resource
86  lexical_resource = wrapper_rw(mdf_read, *args, **kwds)
87  for lexicon in lexical_resource.lexicon:
88  if options.cross_references:
89  # Verify lexicon coherence
90  lexicon.check_cross_references()
91  log("Successfully created %s LMF entries from MDF file '%s'." % (lexicon.count_lexical_entries(), lexicon.get_entrySource()))
92  return lexical_resource
93 
94 def read_xml_lmf(*args, **kwds):
95  # To access options
96  from pylmflib import options
97  global options
98  # An XML LMF file contains one lexical resource, itself containing lexicon(s)
99  lexical_resource = wrapper_rw(lmf_read, *args, **kwds)
100  # Count total number of entries to report to user
101  entries_nb = 0
102  for lexicon in lexical_resource.get_lexicons():
103  entries_nb += lexicon.count_lexical_entries()
104  if options.cross_references:
105  # Verify lexicon coherence
106  lexicon.check_cross_references()
107  log("Successfully created %s LMF entries from XML LMF file '%s'." % (entries_nb, args[0]))
108  return lexical_resource
109 
110 def read_sort_order(*args, **kwds):
111  sort_order = wrapper_rw(order_read, *args, **kwds)
112  log("Successfully read sort order: " + str(sort_order))
113  return sort_order
114 
115 def read_config(*args, **kwds):
116  lexical_resource = wrapper_rw(config_read, *args, **kwds)
117  log("Successfully read config")
118  return lexical_resource
119 
120 def write_mdf(*args, **kwds):
121  # As an MDF file can only contain one lexicon, create as many MDF files as lexicons in the lexical resource (TODO: rename files)
122  for lexicon in args[0].get_lexicons():
123  wrapper_rw(mdf_write, lexicon, *args[1:], **kwds)
124  log("Successfully wrote %s LMF entries into MDF file '%s'." % (lexicon.count_lexical_entries(), args[1]))
125 
126 def write_xml_lmf(*args, **kwds):
127  # An XML LMF file contains one lexical resource, itself containing lexicon(s)
128  wrapper_rw(lmf_write, *args, **kwds)
129  # Count total number of entries to report to user
130  entries_nb = 0
131  for lexicon in args[0].get_lexicons():
132  entries_nb += lexicon.count_lexical_entries()
133  log("Successfully wrote %s LMF entries into XML LMF file '%s'." % (entries_nb, args[1]))
134 
135 def write_tex(*args, **kwds):
136  # A LaTeX file contains one or several lexicons and informations about the lexical resource
137  wrapper_rw(tex_write, *args, **kwds)
138  # Count total number of entries to report to user
139  entries_nb = 0
140  for lexicon in args[0].get_lexicons():
141  entries_nb += lexicon.count_lexical_entries()
142  log("Successfully wrote %s LMF entries into LaTeX file '%s'." % (entries_nb, args[1]))
143 
144 def write_doc(*args, **kwds):
145  # Import only when needed because it requires installation of Python package 'docx'
146  from output.doc import doc_write
147  # A document file contains one or several lexicons and informations about the lexical resource
148  wrapper_rw(doc_write, *args, **kwds)
149  # Count total number of entries to report to user
150  entries_nb = 0
151  for lexicon in args[0].get_lexicons():
152  entries_nb += lexicon.count_lexical_entries()
153  log("Successfully wrote %s LMF entries into document file '%s'." % (entries_nb, args[1]))
154 
155 def write_odt(*args, **kwds):
156  # Import only when needed because it requires installation of Python package 'odf'
157  from output.odt import odt_write
158  # A document file contains one or several lexicons and informations about the lexical resource
159  wrapper_rw(odt_write, *args, **kwds)
160  # Count total number of entries to report to user
161  entries_nb = 0
162  for lexicon in args[0].get_lexicons():
163  entries_nb += lexicon.count_lexical_entries()
164  log("Successfully wrote %s LMF entries into document file '%s'." % (entries_nb, args[1]))
def wrapper_rw
Wrapper function that calls another function, restoring normal behavior on error. ...
Definition: wrapper.py:29
def log
Write message into log file if any, or to standard output if verbose mode is on.
Definition: log.py:9