Commits

Matt Chaput committed ac6474d Merge

Merge up to date with mainline.

Comments (0)

Files changed (129)

 *.DS_Store
 
 .settings
+.coverage
+.tox
+nosetests.xml
 
 build
 dist
 benchmark/enron_cache.pickle
 benchmark/enron_mail_082109.tar.gz
 
-syntax: regexp
-^tmp$
+tmp/*
+tests/tmp/*
 9b9108fd23fd3a0a35be171c9b170560023c9491 2.2
 dee059118c86964dfcc8e72a8a3fbd29eae4cd01 2.2.1
 9a84c1a1d557b809e46808768f2c451e2560c5cd 2.2.2
+5d1064ce4c8550fe7dda58b17ab389347d6cbb77 2.3
+19c2df0a94efd8fdf7be8ea480f3cdd219a06c7a 2.3.1
+303cef16ed5e01e6ab681a8adb9497ad00be02c4 2.3.2
+whoosh

.idea/codeStyleSettings.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectCodeStyleSettingsManager">
+    <option name="PER_PROJECT_SETTINGS">
+      <value />
+    </option>
+  </component>
+</project>
+

.idea/dictionaries/new.xml

+<component name="ProjectDictionaryState">
+  <dictionary name="new" />
+</component>

.idea/encodings.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
+</project>
+

.idea/inspectionProfiles/profiles_settings.xml

+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="PROJECT_PROFILE" />
+    <option name="USE_PROJECT_PROFILE" value="false" />
+    <version value="1.0" />
+  </settings>
+</component>
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectResources">
+    <default-html-doctype>http://www.w3.org/1999/xhtml</default-html-doctype>
+  </component>
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7.1 (C:/Python27/python.exe)" project-jdk-type="Python SDK" />
+</project>
+

.idea/modules.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/whoosh.iml" filepath="$PROJECT_DIR$/.idea/whoosh.iml" />
+    </modules>
+  </component>
+</project>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="PyDocumentationSettings">
+    <option name="myDocStringFormat" value="reStructuredText" />
+  </component>
+</project>
+

.idea/scopes/scope_settings.xml

+<component name="DependencyValidationManager">
+  <state>
+    <option name="SKIP_IMPORT_STATEMENTS" value="false" />
+  </state>
+</component>

.idea/testrunner.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="TestRunnerService">
+    <option name="projectConfiguration" value="Nosetests" />
+    <option name="PROJECT_CONFIGURATION" value="Nosetests" />
+  </component>
+</project>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="hg4idea" />
+  </component>
+</project>
+
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+  <component name="PackageRequirementsSettings">
+    <option name="requirementsPath" value="" />
+  </component>
+</module>
+

.idea/workspace.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <list default="true" id="2eb60cdb-07fd-4a7d-8dbc-c6d5ad5efab7" name="Default" comment="">
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/codeStyleSettings.xml" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/dictionaries/new.xml" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/other.xml" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/testrunner.xml" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/whoosh/searching.py" afterPath="$PROJECT_DIR$/src/whoosh/searching.py" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/tests/test_nested.py" afterPath="$PROJECT_DIR$/tests/test_nested.py" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/tests/test_queries.py" afterPath="$PROJECT_DIR$/tests/test_queries.py" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/tests/test_sorting.py" afterPath="$PROJECT_DIR$/tests/test_sorting.py" />
+    </list>
+    <ignored path="whoosh.iws" />
+    <ignored path=".idea/workspace.xml" />
+    <option name="TRACKING_ENABLED" value="true" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="ChangesViewManager" flattened_view="true" show_ignored="false" />
+  <component name="CreatePatchCommitExecutor">
+    <option name="PATCH_PATH" value="" />
+  </component>
+  <component name="DaemonCodeAnalyzer">
+    <disable_hints />
+  </component>
+  <component name="DatabaseView">
+    <flatten value="false" />
+    <groupTables value="false" />
+  </component>
+  <component name="FavoritesManager">
+    <favorites_list name="whoosh" />
+  </component>
+  <component name="FileEditorManager">
+    <splitter split-orientation="horizontal" split-proportion="0.5">
+      <split-first>
+        <leaf>
+          <file leaf-file-name="searching.py" pinned="false" current="true" current-in-tab="true">
+            <entry file="file://$PROJECT_DIR$/src/whoosh/searching.py">
+              <provider selected="true" editor-type-id="text-editor">
+                <state line="633" column="58" selection-start="25343" selection-end="25343" vertical-scroll-proportion="0.12408088">
+                  <folding />
+                </state>
+              </provider>
+            </entry>
+          </file>
+        </leaf>
+      </split-first>
+      <split-second>
+        <leaf>
+          <file leaf-file-name="writing.py" pinned="false" current="false" current-in-tab="false">
+            <entry file="file://$PROJECT_DIR$/src/whoosh/writing.py">
+              <provider selected="true" editor-type-id="text-editor">
+                <state line="169" column="31" selection-start="6239" selection-end="6239" vertical-scroll-proportion="0.0">
+                  <folding />
+                </state>
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="filewriting.py" pinned="false" current="false" current-in-tab="false">
+            <entry file="file://$PROJECT_DIR$/src/whoosh/filedb/filewriting.py">
+              <provider selected="true" editor-type-id="text-editor">
+                <state line="218" column="4" selection-start="8040" selection-end="8040" vertical-scroll-proportion="0.0">
+                  <folding />
+                </state>
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="wrappers.py" pinned="false" current="false" current-in-tab="true">
+            <entry file="file://$PROJECT_DIR$/src/whoosh/query/wrappers.py">
+              <provider selected="true" editor-type-id="text-editor">
+                <state line="163" column="28" selection-start="5516" selection-end="5516" vertical-scroll-proportion="0.44852942">
+                  <folding />
+                </state>
+              </provider>
+            </entry>
+          </file>
+          <file leaf-file-name="test_nested.py" pinned="false" current="false" current-in-tab="false">
+            <entry file="file://$PROJECT_DIR$/tests/test_nested.py">
+              <provider selected="true" editor-type-id="text-editor">
+                <state line="149" column="28" selection-start="6487" selection-end="6487" vertical-scroll-proportion="0.0">
+                  <folding />
+                </state>
+              </provider>
+            </entry>
+          </file>
+        </leaf>
+      </split-second>
+    </splitter>
+  </component>
+  <component name="FindManager">
+    <FindUsagesManager>
+      <setting name="OPEN_NEW_TAB" value="false" />
+    </FindUsagesManager>
+  </component>
+  <component name="IdeDocumentHistory">
+    <option name="changedFiles">
+      <list>
+        <option value="$PROJECT_DIR$/src/whoosh/searching.py" />
+        <option value="$PROJECT_DIR$/src/whoosh/query/core.py" />
+        <option value="$PROJECT_DIR$/tests/test_nested.py" />
+        <option value="$PROJECT_DIR$/src/whoosh/query/wrappers.py" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectFrameBounds">
+    <option name="x" value="-8" />
+    <option name="y" value="-8" />
+    <option name="width" value="2576" />
+    <option name="height" value="1576" />
+  </component>
+  <component name="ProjectLevelVcsManager" settingsEditedManually="false">
+    <OptionsSetting value="true" id="Add" />
+    <OptionsSetting value="true" id="Remove" />
+    <OptionsSetting value="true" id="Checkout" />
+    <OptionsSetting value="true" id="Update" />
+    <OptionsSetting value="true" id="Status" />
+    <OptionsSetting value="true" id="Edit" />
+    <ConfirmationsSetting value="0" id="Add" />
+    <ConfirmationsSetting value="0" id="Remove" />
+  </component>
+  <component name="ProjectReloadState">
+    <option name="STATE" value="0" />
+  </component>
+  <component name="ProjectView">
+    <navigator currentView="ProjectPane" proportions="" version="1" splitterProportion="0.5">
+      <flattenPackages />
+      <showMembers />
+      <showModules />
+      <showLibraryContents />
+      <hideEmptyPackages />
+      <abbreviatePackageNames />
+      <autoscrollToSource />
+      <autoscrollFromSource />
+      <sortByType />
+    </navigator>
+    <panes>
+      <pane id="ProjectPane">
+        <subPane>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="whoosh" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="whoosh" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="whoosh" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="whoosh" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="whoosh" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="whoosh" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="whoosh" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="whoosh" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="src" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="whoosh" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="query" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+        </subPane>
+      </pane>
+      <pane id="Scope" />
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="options.splitter.main.proportions" value="0.3" />
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="recentsLimit" value="5" />
+    <property name="options.lastSelected" value="editor.preferences.smartKeys" />
+    <property name="GoToClass.includeJavaFiles" value="false" />
+    <property name="options.searchVisible" value="true" />
+    <property name="options.splitter.details.proportions" value="0.2" />
+  </component>
+  <component name="PyConsoleOptionsProvider">
+    <option name="myPythonConsoleState">
+      <PyConsoleSettings />
+    </option>
+    <option name="myDjangoConsoleState">
+      <PyConsoleSettings />
+    </option>
+  </component>
+  <component name="PyCoverageOptionsProvider">
+    <option name="myUseBundledCoveragePy" value="true" />
+  </component>
+  <component name="RunManager" selected="Python's test.Nosetests in test_nested">
+    <configuration default="false" name="Nosetests in test_nested" type="tests" factoryName="Nosetests" temporary="true">
+      <option name="INTERPRETER_OPTIONS" value="" />
+      <option name="PARENT_ENVS" value="true" />
+      <envs />
+      <option name="SDK_HOME" value="" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests" />
+      <option name="IS_MODULE_SDK" value="true" />
+      <module name="whoosh" />
+      <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
+      <option name="SCRIPT_NAME" value="$PROJECT_DIR$/tests/test_nested.py" />
+      <option name="CLASS_NAME" value="" />
+      <option name="METHOD_NAME" value="" />
+      <option name="FOLDER_NAME" value="" />
+      <option name="TEST_TYPE" value="TEST_SCRIPT" />
+      <option name="PATTERN" value="" />
+      <option name="USE_PATTERN" value="false" />
+      <option name="PARAMS" value="" />
+      <option name="USE_PARAM" value="false" />
+      <RunnerSettings RunnerId="PythonRunner" />
+      <ConfigurationWrapper RunnerId="PythonRunner" />
+      <method />
+    </configuration>
+    <configuration default="true" type="tests" factoryName="Nosetests">
+      <option name="INTERPRETER_OPTIONS" value="" />
+      <option name="PARENT_ENVS" value="true" />
+      <envs />
+      <option name="SDK_HOME" value="" />
+      <option name="WORKING_DIRECTORY" value="" />
+      <option name="IS_MODULE_SDK" value="false" />
+      <module name="whoosh" />
+      <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
+      <option name="SCRIPT_NAME" value="" />
+      <option name="CLASS_NAME" value="" />
+      <option name="METHOD_NAME" value="" />
+      <option name="FOLDER_NAME" value="" />
+      <option name="TEST_TYPE" value="TEST_SCRIPT" />
+      <option name="PATTERN" value="" />
+      <option name="USE_PATTERN" value="false" />
+      <option name="PARAMS" value="" />
+      <option name="USE_PARAM" value="false" />
+      <method />
+    </configuration>
+    <configuration default="true" type="PythonConfigurationType" factoryName="Python">
+      <option name="INTERPRETER_OPTIONS" value="" />
+      <option name="PARENT_ENVS" value="true" />
+      <envs>
+        <env name="PYTHONUNBUFFERED" value="1" />
+      </envs>
+      <option name="SDK_HOME" value="" />
+      <option name="WORKING_DIRECTORY" value="" />
+      <option name="IS_MODULE_SDK" value="false" />
+      <module name="whoosh" />
+      <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
+      <option name="SCRIPT_NAME" value="" />
+      <option name="PARAMETERS" value="" />
+      <option name="MULTIPROCESS" value="false" />
+      <method />
+    </configuration>
+    <configuration default="true" type="tests" factoryName="Doctests">
+      <option name="INTERPRETER_OPTIONS" value="" />
+      <option name="PARENT_ENVS" value="true" />
+      <envs />
+      <option name="SDK_HOME" value="" />
+      <option name="WORKING_DIRECTORY" value="" />
+      <option name="IS_MODULE_SDK" value="false" />
+      <module name="whoosh" />
+      <EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
+      <option name="SCRIPT_NAME" value="" />
+      <option name="CLASS_NAME" value="" />
+      <option name="METHOD_NAME" value="" />
+      <option name="FOLDER_NAME" value="" />
+      <option name="TEST_TYPE" value="TEST_SCRIPT" />
+      <option name="PATTERN" value="" />
+      <option name="USE_PATTERN" value="false" />
+      <method />
+    </configuration>
+    <list size="1">
+      <item index="0" class="java.lang.String" itemvalue="Python's test.Nosetests in test_nested" />
+    </list>
+  </component>
+  <component name="ShelveChangesManager" show_recycled="false" />
+  <component name="SvnConfiguration" maxAnnotateRevisions="500" myUseAcceleration="nothing" myAutoUpdateAfterCommit="false" cleanupOnStartRun="false">
+    <option name="USER" value="" />
+    <option name="PASSWORD" value="" />
+    <option name="mySSHConnectionTimeout" value="30000" />
+    <option name="mySSHReadTimeout" value="30000" />
+    <option name="LAST_MERGED_REVISION" />
+    <option name="MERGE_DRY_RUN" value="false" />
+    <option name="MERGE_DIFF_USE_ANCESTRY" value="true" />
+    <option name="UPDATE_LOCK_ON_DEMAND" value="false" />
+    <option name="IGNORE_SPACES_IN_MERGE" value="false" />
+    <option name="DETECT_NESTED_COPIES" value="true" />
+    <option name="CHECK_NESTED_FOR_QUICK_MERGE" value="false" />
+    <option name="IGNORE_SPACES_IN_ANNOTATE" value="true" />
+    <option name="SHOW_MERGE_SOURCES_IN_ANNOTATE" value="true" />
+    <option name="FORCE_UPDATE" value="false" />
+    <configuration useDefault="true">C:\Users\new\AppData\Roaming\Subversion</configuration>
+    <myIsUseDefaultProxy>false</myIsUseDefaultProxy>
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <created>1334681770636</created>
+      <updated>1334681770636</updated>
+    </task>
+    <servers />
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="-8" y="-8" width="2576" height="1576" extended-state="7" />
+    <editor active="true" />
+    <layout>
+      <window_info id="Data Sources" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.10429937" sideWeight="0.7849083" order="-1" side_tool="false" content_ui="tabs" />
+      <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="true" content_ui="tabs" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.11106688" sideWeight="0.7849083" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.21509168" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
+    </layout>
+  </component>
+  <component name="VcsContentAnnotationSettings">
+    <option name="myLimit" value="2678400000" />
+  </component>
+  <component name="VcsManagerConfiguration">
+    <option name="OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT" value="true" />
+    <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="true" />
+    <option name="CHECK_NEW_TODO" value="true" />
+    <option name="myTodoPanelSettings">
+      <value>
+        <are-packages-shown value="false" />
+        <are-modules-shown value="false" />
+        <flatten-packages value="false" />
+        <is-autoscroll-to-source value="false" />
+      </value>
+    </option>
+    <option name="PERFORM_UPDATE_IN_BACKGROUND" value="true" />
+    <option name="PERFORM_COMMIT_IN_BACKGROUND" value="true" />
+    <option name="PERFORM_EDIT_IN_BACKGROUND" value="true" />
+    <option name="PERFORM_CHECKOUT_IN_BACKGROUND" value="true" />
+    <option name="PERFORM_ADD_REMOVE_IN_BACKGROUND" value="true" />
+    <option name="PERFORM_ROLLBACK_IN_BACKGROUND" value="false" />
+    <option name="CHECK_LOCALLY_CHANGED_CONFLICTS_IN_BACKGROUND" value="false" />
+    <option name="ENABLE_BACKGROUND_PROCESSES" value="false" />
+    <option name="CHANGED_ON_SERVER_INTERVAL" value="60" />
+    <option name="SHOW_ONLY_CHANGED_IN_SELECTION_DIFF" value="true" />
+    <option name="CHECK_COMMIT_MESSAGE_SPELLING" value="true" />
+    <option name="DEFAULT_PATCH_EXTENSION" value="patch" />
+    <option name="SHORT_DIFF_HORISONTALLY" value="true" />
+    <option name="SHORT_DIFF_EXTRA_LINES" value="2" />
+    <option name="SOFT_WRAPS_IN_SHORT_DIFF" value="true" />
+    <option name="INCLUDE_TEXT_INTO_PATCH" value="false" />
+    <option name="INCLUDE_TEXT_INTO_SHELF" value="false" />
+    <option name="CREATE_PATCH_EXPAND_DETAILS_DEFAULT" value="true" />
+    <option name="SHOW_FILE_HISTORY_DETAILS" value="true" />
+    <option name="SHOW_VCS_ERROR_NOTIFICATIONS" value="true" />
+    <option name="FORCE_NON_EMPTY_COMMENT" value="false" />
+    <option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="false" />
+    <option name="LAST_COMMIT_MESSAGE" />
+    <option name="MAKE_NEW_CHANGELIST_ACTIVE" value="true" />
+    <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false" />
+    <option name="CHECK_FILES_UP_TO_DATE_BEFORE_COMMIT" value="false" />
+    <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="false" />
+    <option name="REFORMAT_BEFORE_FILE_COMMIT" value="false" />
+    <option name="FILE_HISTORY_DIALOG_COMMENTS_SPLITTER_PROPORTION" value="0.8" />
+    <option name="FILE_HISTORY_DIALOG_SPLITTER_PROPORTION" value="0.5" />
+    <option name="ACTIVE_VCS_NAME" />
+    <option name="UPDATE_GROUP_BY_PACKAGES" value="false" />
+    <option name="UPDATE_GROUP_BY_CHANGELIST" value="false" />
+    <option name="SHOW_FILE_HISTORY_AS_TREE" value="false" />
+    <option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6" />
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager />
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/src/whoosh/filedb/filewriting.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="218" column="4" selection-start="8040" selection-end="8040" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/whoosh/writing.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="169" column="31" selection-start="6239" selection-end="6239" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/tests/test_nested.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="149" column="28" selection-start="6487" selection-end="6487" vertical-scroll-proportion="0.0">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/whoosh/query/wrappers.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="163" column="28" selection-start="5516" selection-end="5516" vertical-scroll-proportion="0.44852942">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/whoosh/searching.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="633" column="58" selection-start="25343" selection-end="25343" vertical-scroll-proportion="0.12408088">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+  </component>
+</project>
+
   full-text search solution I know of.
 * Pluggable scoring algorithm (including BM25F), text analysis, storage,
   posting format, etc.
-* Powerful query language parsed by pyparsing.
+* Powerful query language.
 * Pure Python spell-checker (as far as I know, the only one). 
 
 Whoosh might be useful in the following circumstances:
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Whoosh.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Whoosh.qhc"
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/Whoosh"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Whoosh"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	make -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set BUILDDIR=build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source
+if NOT "%PAPER%" == "" (
+	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+	:help
+	echo.Please use `make ^<target^>` where ^<target^> is one of
+	echo.  html       to make standalone HTML files
+	echo.  dirhtml    to make HTML files named index.html in directories
+	echo.  singlehtml to make a single large HTML file
+	echo.  pickle     to make pickle files
+	echo.  json       to make JSON files
+	echo.  htmlhelp   to make HTML files and a HTML help project
+	echo.  qthelp     to make HTML files and a qthelp project
+	echo.  devhelp    to make HTML files and a Devhelp project
+	echo.  epub       to make an epub
+	echo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+	echo.  text       to make text files
+	echo.  man        to make manual pages
+	echo.  changes    to make an overview over all changed/added/deprecated items
+	echo.  linkcheck  to check all external links for integrity
+	echo.  doctest    to run all doctests embedded in the documentation if enabled
+	goto end
+)
+
+if "%1" == "clean" (
+	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+	del /q /s %BUILDDIR%\*
+	goto end
+)
+
+if "%1" == "html" (
+	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+	goto end
+)
+
+if "%1" == "dirhtml" (
+	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
+	goto end
+)
+
+if "%1" == "singlehtml" (
+	%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
+	goto end
+)
+
+if "%1" == "pickle" (
+	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can process the pickle files.
+	goto end
+)
+
+if "%1" == "json" (
+	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can process the JSON files.
+	goto end
+)
+
+if "%1" == "htmlhelp" (
+	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in %BUILDDIR%/htmlhelp.
+	goto end
+)
+
+if "%1" == "qthelp" (
+	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in %BUILDDIR%/qthelp, like this:
+	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Whoosh.qhcp
+	echo.To view the help file:
+	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Whoosh.ghc
+	goto end
+)
+
+if "%1" == "devhelp" (
+	%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished.
+	goto end
+)
+
+if "%1" == "epub" (
+	%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The epub file is in %BUILDDIR%/epub.
+	goto end
+)
+
+if "%1" == "latex" (
+	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
+	goto end
+)
+
+if "%1" == "text" (
+	%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The text files are in %BUILDDIR%/text.
+	goto end
+)
+
+if "%1" == "man" (
+	%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The manual pages are in %BUILDDIR%/man.
+	goto end
+)
+
+if "%1" == "changes" (
+	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.The overview file is in %BUILDDIR%/changes.
+	goto end
+)
+
+if "%1" == "linkcheck" (
+	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Link check complete; look for any errors in the above output ^
+or in %BUILDDIR%/linkcheck/output.txt.
+	goto end
+)
+
+if "%1" == "doctest" (
+	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+	goto end
+)
+
+:end

docs/source/api/qparser.rst

 .. autoclass:: SingleQuotePlugin
 .. autoclass:: PrefixPlugin
 .. autoclass:: WildcardPlugin
+.. autoclass:: RegexPlugin
 .. autoclass:: BoostPlugin
 .. autoclass:: GroupPlugin
 .. autoclass:: EveryPlugin

docs/source/api/query.rst

 
 .. automodule:: whoosh.query
 
-See also :mod:`whoosh.qparser` which contains code for parsing user queries into query objects.
+See also :mod:`whoosh.qparser` which contains code for parsing user queries
+into query objects.
 
 Base classes
 ============
 
-The following abstract base classes are subclassed to create the the "real" query operations.
+The following abstract base classes are subclassed to create the "real"
+query operations.
 
 .. autoclass:: Query
     :members:
 .. autoclass:: Not
 .. autoclass:: Prefix
 .. autoclass:: Wildcard
+.. autoclass:: Regex
 .. autoclass:: TermRange
 .. autoclass:: NumericRange
 .. autoclass:: DateRange
+.. autoclass:: Nested
 .. autoclass:: Every
 .. autoclass:: NullQuery
 
 Special queries
 ===============
 
+.. autoclass:: NestedParent
+.. autoclass:: NestedChildren
 .. autoclass:: ConstantScoreQuery
 
 

docs/source/api/sorting.rst

 .. autoclass:: Facets
     :members:
 
+
+FacetType objects
+=================
+
+.. autoclass:: FacetMap
+    :members:
+.. autoclass:: OrderedList
+.. autoclass:: UnorderedList
+.. autoclass:: Count
+.. autoclass:: Best
+
+

docs/source/batch.rst

 *maximum* memory (in megabytes) the writer will use for the indexing pool. The
 higher the number, the faster indexing will be.
 
-The default value of ``32`` is actually pretty low, considering many people
+The default value of ``128`` is actually somewhat low, considering many people
 have multiple gigabytes of RAM these days. Setting it higher can speed up
 indexing considerably::
 
 =======================
 
 The ``procs`` parameter to :meth:`whoosh.index.Index.writer` controls the
-number of processors the writer will use for the indexing pool (via the
-``multiprocessing`` module).
+number of processors the writer will use for indexing (via the
+``multiprocessing`` module)::
 
     from whoosh import index
     
 amount of memory used by *each process*, so the actual memory used will be
 ``limitmb * procs``::
 
-    # Each process will use a limit of 128 MB, for a total of 512 MB
+    # Each process will use a limit of 128, for a total of 512
     writer = ix.writer(procs=4, limitmb=128)
 
 
-MultiSegmentWriter
-==================
+The ``multisegment`` parameter
+==============================
 
-The ``procs`` parameter causes the default ``FileWriter`` to use multiple
-processors to build the pool, but then still uses a single process to merge
-the pool into a segment.
+The ``procs`` parameter causes the default writer to use multiple processors to
+do much of the indexing, but then still uses a single process to merge the pool
+of each sub-writer into a single segment.
 
-You can get much better indexing speed using the MultiSegmentWriter, which
-instead of a building the pool in parallel uses entirely separate parallel
-writers. The drawback is that instead of creating a single new segment,
-``MultiSegmentWriter`` creates a number of new segments equal to the number of
-processes you you use. For example, if you use ``procs=4``, the writer will
-create four new segments.
-
-So, while ``MultiSegmentWriter`` is much faster than a normal writer, you should
-only use it for large batch indexing jobs (and perhaps only for indexing from
-scratch). It should not be the only method you use for indexing, because
-otherwise the number of segments will increase forever!
-
-To use a ``MultiSegmentWriter``, construct it directly, with your Index as the
-first argument::
+You can get much better indexing speed by also using the ``multisegment=True``
+keyword argument, which instead of merging the results of each sub-writer,
+simply has them each just write out a new segment::
 
     from whoosh import index
-    from whoosh.filedb.multiproc import MultiSegmentWriter
-    
+
     ix = index.open_dir("indexdir")
-    writer = MultiSegmentWriter(ix, procs=4, limitmb=128)
+    writer = ix.writer(procs=4, multisegment=True)
 
+The drawback is that instead
+of creating a single new segment, this option creates a number of new segments
+**at least** equal to the number of processes you use.
 
-Benchmarks
-==========
+For example, if you use ``procs=4``, the writer will create four new segments.
+(If you merge old segments or call ``add_reader`` on the parent writer, the
+parent writer will also write a segment, meaning you'll get five new segments.)
 
-As a single data point purely to illustrate the possible relative differences
-between single processing, a multiprocessing pool, and ``MultiSegmentWriter``,
-here are the indexing times for the ``benchmarks/enron.py``, indexing over 1 GB
-of text in over 500 000 email messages, using the three different methods on a
-Windows machine with ``limitmb=128``::
+So, while ``multisegment=True`` is much faster than a normal writer, you should
+only use it for large batch indexing jobs (or perhaps only for indexing from
+scratch). It should not be the only method you use for indexing, because
+otherwise the number of segments will tend to increase forever!
 
-    Default Writer     procs=1 : 49m
-    Default Writer     procs=4 : 32m
-    MultiSegmentWriter procs=4 : 13m
 
 
 
 
+

docs/source/facets.rst

 
 A ``FacetType`` object
     Uses this object to group the documents. See below for the available facet
-    types. The facet name will automatically be set to ``"facet"``.
+    types.
 
 A field name string
     Converts the field name into a ``FieldFacet`` (see below) and uses it to
     sort the documents. The name of the field is used as the facet name.
 
+A list or tuple of field name strings
+    Sets up multiple field grouping criteria.
+
 A dictionary mapping facet names to FacetType objects
-    Sets up multiple grouping crieteria.
+    Sets up multiple grouping criteria.
 
 A ``Facets`` object
     This object is a lot like using a dictionary, but has some convenience
     methods to make setting up multiple groupings a little easier.
 
+
 Examples
 --------
 
 
     cats = sorting.FieldFacet("category")
     tags = sorting.FieldFacet("tags", allow_overlap=True)
-    results = searcher.search(myquery, groupedby={"cats": cats, "tags": tags})
+    results = searcher.search(myquery, groupedby={"category": cats, "tags": tags})
     
     # ...or, using a Facets object has a little less duplication
     facets = sorting.Facets()
 --------------------------
 
 The ``Results.groups("facetname")`` method  returns a dictionary mapping
-category names to lists of **document IDs**.
+category names to lists of **document IDs**::
 
-    {"small": [1, 2, 4, 5, 8], "medium": [0, 3, 6], "large": [7, 9]}
+    myfacets = sorting.Facets().add_field("size").add_field("tag")
+    results = mysearcher.search(myquery, groupedby=myfacets)
+    results.groups("size")
+    # {"small": [8, 5, 1, 2, 4], "medium": [3, 0, 6], "large": [7, 9]}
 
-The ``Searcher`` object's ``stored_fields()`` method takes a document number
-and returns the document's stored fields as a dictionary::
+If there is only one facet, you can just use ``Results.groups()`` with no
+argument to access its groups::
+
+    results = mysearcher.search(myquery, groupedby=myfunctionfacet)
+    results.groups()
+
+By default, the values in the dictionary returned by ``groups()`` are lists of
+document numbers in the same relative order as in the results. You can use the
+``Searcher`` object's ``stored_fields()`` method to take a document number and
+return the document's stored fields as a dictionary::
 
     for category_name in categories:
         print "Top 5 documents in the %s category" % category_name
         if len(doclist) > 5:
             print "  (%s more)" % (len(doclist) - 5)
 
-(You can use ``Searcher.stored_fields(docnum)`` to get the stored fields
-associated with a document number.)
+If you want different information about the groups, for example just the count
+of documents in each group, or you don't need the groups to be ordered, you can
+specify a :class:`whoosh.sorting.FacetMap` type or instance with the
+``maptype`` keyword argument when creating the ``FacetType``::
 
-If you just want to **count** the number of documents in each group, instead of
-generating a full list of the documents, use the ``groupids=False`` keyword
-argument::
+    # This is the same as the default
+    myfacet = FieldFacet("size", maptype=sorting.OrderedList)
+    results = mysearcher.search(myquery, groupedby=myfacet)
+    results.groups()
+    # {"small": [8, 5, 1, 2, 4], "medium": [3, 0, 6], "large": [7, 9]}
+    
+    # Don't sort the groups to match the order of documents in the results
+    # (faster)
+    myfacet = FieldFacet("size", maptype=sorting.UnorderedList)
+    results = mysearcher.search(myquery, groupedby=myfacet)
+    results.groups()
+    # {"small": [1, 2, 4, 5, 8], "medium": [0, 3, 6], "large": [7, 9]}
 
-    results = searcher.search(myquery, groupedby="size")
-    groups = results.groups("size")
+    # Only count the documents in each group
+    myfacet = FieldFacet("size", maptype=sorting.Count)
+    results = mysearcher.search(myquery, groupedby=myfacet)
+    results.groups()
     # {"small": 5, "medium": 3, "large": 2}
+    
+    # Only remember the "best" document in each group
+    myfacet = FieldFacet("size", maptype=sorting.Best)
+    results = mysearcher.search(myquery, groupedby=myfacet)
+    results.groups()
+    # {"small": 8, "medium": 3, "large": 7}
 
-To generate multiple groupings, you can name multiple fields in the list you
-pass to the `groups` keyword::
+Alternatively you can specify a ``maptype`` argument in the
+``Searcher.search()`` method call which applies to all facets::
 
-    # Generate separate groupings for the "tag" and "size" fields
-    results = searcher.search(myquery, groupedby=["tag", "size"])
-    
-    # Get the groupings by "tag"
-    tag_groups = results.groups("tag")
-    
-    # Get the groupings by "size"
-    size_groups = results.groups("size")
+    results = mysearcher.search(myquery, groupedby=["size", "tag"],
+                                maptype=sorting.Count)
+
+(You can override this overall ``maptype`` argument on individual facets by
+specifying the ``maptype`` argument for them as well.)
 
 
 Facet types
 ----------------
 
 This facet lets you use stored field values as the sorting/grouping key for
-documents. This is
+documents. This is usually slower than using an indexed field, but when using
+``allow_overlap`` it can actually be faster for large indexes just because it
+avoids the overhead of reading posting lists.
 
 :class:`~whoosh.sorting.StoredFieldFacet` supports ``allow_overlap`` by
 splitting the stored value into separate keys. By default it calls the value's

docs/source/highlight.rst

 
 :class:`whoosh.highlight.HtmlFormatter`
     Outputs a string containing HTML tags (with a class attribute)
-    around the the matched terms.
+    around the matched terms.
 
 :class:`whoosh.highlight.UppercaseFormatter`
     Converts the matched terms to UPPERCASE.

docs/source/index.rst

     fieldcaches
     batch
     threads
+    nested
     recipes
     api/api
     tech/index

docs/source/nested.rst

+===========================================
+Indexing and searching document hierarchies
+===========================================
+
+Overview
+========
+
+Whoosh's full-text index is essentially a flat database of documents. However,
+Whoosh supports two techniques for simulating the indexing and querying of
+hierarchical documents, that is, sets of documents that form a parent-child
+hierarchy, such as "Chapter - Section - Paragraph" or
+"Module - Class - Method".
+
+You can specify parent-child relationships *at indexing time*, by grouping
+documents in the same hierarchy, and then use the
+:class:`whoosh.query.NestedParent` and/or :class:`whoosh.query.NestedChildren`
+to find parents based on their children or vice-versa.
+
+Alternatively, you can use *query time joins*, essentially like external key
+joins in a database, where you perform one search to find a relevant document,
+then use a stored value on that document (for example, a ``parent`` field) to
+look up another document.
+
+Both methods have pros and cons.
+
+
+Using nested document indexing
+==============================
+
+Indexing
+--------
+
+This method works by indexing a "parent" document and all its "child" documents
+*as a "group"* so they are guaranteed to end up in the same segment. You can
+use the context manager returned by ``IndexWriter.group()`` to group
+documents::
+
+    with ix.writer() as w:
+        with w.group():
+            w.add_document(kind="class", name="Index")
+            w.add_document(kind="method", name="add document")
+            w.add_document(kind="method", name="add reader")
+            w.add_document(kind="method", name="close")
+        with w.group():
+            w.add_document(kind="class", name="Accumulator")
+            w.add_document(kind="method", name="add")
+            w.add_document(kind="method", name="get result")
+        with w.group():
+            w.add_document(kind="class", name="Calculator")
+            w.add_document(kind="method", name="add")
+            w.add_document(kind="method", name="add all")
+            w.add_document(kind="method", name="add some")
+            w.add_document(kind="method", name="multiply")
+            w.add_document(kind="method", name="close")
+        with w.group():
+            w.add_document(kind="class", name="Deleter")
+            w.add_document(kind="method", name="add")
+            w.add_document(kind="method", name="delete")
+
+Alternatively you can use the ``start_group()`` and ``end_group()`` methods::
+
+    with ix.writer() as w:
+        w.start_group()
+        w.add_document(kind="class", name="Index")
+        w.add_document(kind="method", name="add document")
+        w.add_document(kind="method", name="add reader")
+        w.add_document(kind="method", name="close")
+        w.end_group()
+
+Each level of the hierarchy should have a query that distinguishes it from
+other levels (for example, in the above index, you can use ``kind:class`` or
+``kind:method`` to match different levels of the hierarchy).
+
+Once you've indexed the hierarchy of documents, you can use two query types to
+find parents based on children or vice-versa.
+
+(There is currently no support in the default query parser for nested queries.)
+
+
+NestedParent query
+------------------
+
+The :class:`whoosh.query.NestedParent` query type lets you specify a query for
+child documents, but have the query return an "ancestor" document from higher
+in the hierarchy::
+
+    # First, we need a query that matches all the documents in the "parent"
+    # level we want of the hierarchy
+    all_parents = query.Term("kind", "class")
+    
+    # Then, we need a query that matches the children we want to find
+    wanted_kids = query.Term("name", "close")
+    
+    # Now we can make a query that will match documents where "name" is
+    # "close", but the query will return the "parent" documents of the matching
+    # children
+    q = query.NestedParent(all_parents, wanted_kids)
+    # results = Index, Calculator
+
+Note that in a hierarchy with more than two levels, you can specify a "parents"
+query that matches any level of the hierarchy, so you can return the top-level
+ancestors of the matching children, or the second level, third level, etc.
+
+The query works by first building a bit vector representing which documents are
+"parents"::
+
+     Index
+     |      Calculator
+     |      |
+     1000100100000100
+         |        |
+         |        Deleter
+         Accumulator
+
+Then for each match of the "child" query, it calculates the previous parent
+from the bit vector and returns it as a match (it only returns each parent once
+no matter how many children match). This parent lookup is very efficient::
+
+     1000100100000100
+        |
+     |<-+ close
+
+
+NestedChildren query
+--------------------
+
+The opposite of ``NestedParent`` is :class:`whoosh.query.NestedChildren`. This
+query lets you match parents but return their children. This is useful, for
+example, to search for an album title and return the songs in the album::
+
+    # Query that matches all documents in the "parent" level we want to match
+    # at
+    all_parents = query.Term("kind", "album")
+    
+    # Parent documents we want to match
+    wanted_parents = query.Term("album_title", "heaven")
+    
+    # Now we can make a query that will match parent documents where "album_title"
+    # contains "heaven", but the query will return the "child" documents of the
+    # matching parents
+    q1 = query.NestedChildren(all_parents, wanted_parents)
+
+You can then combine that query with an ``AND`` clause, for example to find
+songs with "hell" in the song title that occur on albums with "heaven" in the
+album title::
+
+    q2 = query.And([q1, query.Term("song_title", "hell")])
+
+
+Deleting and updating hierarchical documents
+--------------------------------------------
+
+The drawback of the index-time method is *updating and deleting*. Because the
+implementation of the queries depends on the parent and child documents being
+contiguous in the segment, you can't update/delete just one child document.
+You can only update/delete an entire top-level document at once (for example,
+if your hierarchy is "Chapter - Section - Paragraph", you can only update or
+delete entire chapters, not a section or paragraph). If the top-level of the
+hierarchy represents very large blocks of text, this can involve a lot of
+deleting and reindexing.
+
+Currently ``Writer.update_document()`` does not automatically work with nested
+documents. You must manually delete and re-add document groups to update them.
+
+To delete nested document groups, use the ``Writer.delete_by_query()``
+method with a ``NestedParent`` query::
+
+    # Delete the "Accumulator" class
+    all_parents = query.Term("kind", "class")
+    to_delete = query.Term("name", "Accumulator")
+    q = query.NestedParent(all_parents, to_delete)
+    with myindex.writer() as w:
+        w.delete_by_query(q)
+
+
+Using query-time joins
+======================
+
+A second technique for simulating hierarchical documents in Whoosh involves
+using a stored field on each document to point to its parent, and then using
+the value of that field at query time to find parents and children.
+
+For example, if we index a hierarchy of classes and methods using pointers
+to parents instead of nesting::
+
+    # Store a pointer to the parent on each "method" document
+    with ix.writer() as w:
+        w.add_document(kind="class", c_name="Index", docstring="...")
+        w.add_document(kind="method", m_name="add document", parent="Index")
+        w.add_document(kind="method", m_name="add reader", parent="Index")
+        w.add_document(kind="method", m_name="close", parent="Index")
+        
+        w.add_document(kind="class", c_name="Accumulator", docstring="...")
+        w.add_document(kind="method", m_name="add", parent="Accumulator")
+        w.add_document(kind="method", m_name="get result", parent="Accumulator")
+        
+        w.add_document(kind="class", c_name="Calculator", docstring="...")
+        w.add_document(kind="method", m_name="add", parent="Calculator")
+        w.add_document(kind="method", m_name="add all", parent="Calculator")
+        w.add_document(kind="method", m_name="add some", parent="Calculator")
+        w.add_document(kind="method", m_name="multiply", parent="Calculator")
+        w.add_document(kind="method", m_name="close", parent="Calculator")
+        
+        w.add_document(kind="class", c_name="Deleter", docstring="...")
+        w.add_document(kind="method", m_name="add", parent="Deleter")
+        w.add_document(kind="method", m_name="delete", parent="Deleter")
+
+    # Now do manual joins at query time
+    with ix.searcher() as s:
+        # Tip: Searcher.document() and Searcher.documents() let you look up
+        # documents by field values more easily than using Searcher.search()
+    
+        # Children to parents:
+        # Print the docstrings of classes on which "close" methods occur
+        for child_doc in s.documents(m_name="close"):
+            # Use the stored value of the "parent" field to look up the parent
+            # document
+            parent_doc = s.document(c_name=child_doc["parent"])
+            # Print the parent document's stored docstring field
+            print(parent_doc["docstring"])
+        
+        # Parents to children:
+        # Find classes with "big" in the docstring and print their methods
+        q = query.Term("kind", "class") & query.Term("docstring", "big")
+        for hit in s.search(q, limit=None):
+            print("Class name=", hit["c_name"], "methods:")
+            for child_doc in s.documents(parent=hit["c_name"]):
+                print("  Method name=", child_doc["m_name"])
+
+This technique is more flexible than index-time nesting in that you can
+delete/update individual documents in the hierarchy piece by piece, although it
+doesn't support finding different parent levels as easily. It is also slower
+than index-time nesting (potentially much slower), since you must perform
+additional searches for each found document.
+
+Future versions of Whoosh may include "join" queries to make this process more
+efficient (or at least more automatic).
+

docs/source/recipes.rst

 
 As an alternative, you might display the *estimated* total hits::
 
+    found = results.scored_length()
     if results.has_exact_length():
         print("Scored", found, "of exactly", len(results), "documents")
     else:

docs/source/releases/2_0.rst

 Whoosh 2.x release notes
 ========================
 
+Whoosh 2.4
+==========
+
+* By default, Whoosh now assembles the individual files of a segment into a
+  single file when committing. This has a small performance penalty but solves
+  a problem where Whoosh can keep too many files open. Whoosh is also now
+  smarter about using mmap.
+
+* Added functionality to index and search hierarchical documents. See
+  :doc:`/nested`.
+
+* Rewrote the Directed Acyclic Word Graph implementation (used in spell
+  checking) to be faster and more space-efficient. Word graph files created by
+  previous versions will be ignored, meaning that spell checking may become
+  slower unless/until you replace the old segments (for example, by
+  optimizing).
+
+* Rewrote multiprocessing indexing to be faster and simpler. You can now
+  do ``myindex.writer(procs=n)`` to get a multiprocessing writer, or
+  ``myindex.writer(procs=n, multisegment=True)`` to get a multiprocessing
+  writer that leaves behind multiple segments, like the old MultiSegmentWriter.
+  (``MultiSegmentWriter`` is still available as a function that returns the
+  new class.)
+
+* When creating ``Term`` query objects for special fields (e.g. NUMERIC or
+  BOOLEAN), you can now use the field's literal type instead of a string as the
+  second argument, for example ``Term("num", 20)`` or ``Term("bool", True)``.
+  (This change may cause problems interacting with functions that expect
+  query objects to be pure textual, such as spell checking.)
+
+* All writing to and reading from on-disk indexes is now done through "codec"
+  objects. This architecture should make it easier to add optional or
+  experimental features, and maintain backwards compatibility.
+
+* Fixes issues #137, #206, #213, #215, #219, #223, #226, #230, #233, #238,
+  #239, #240, #241, and other bugs.
+
+
+Whoosh 2.3.2
+============
+
+* Fixes bug in BM25F scoring function, leading to increased precision in search
+  results.
+
+* Fixes issues #203, #205, #206, #208, #209, #212.
+
+
+Whoosh 2.3.1
+============
+
+* Fixes issue #200.
+
+
+Whoosh 2.3
+==========
+
+* Added a :class:`whoosh.query.Regex` term query type, similar to
+  :class:`whoosh.query.Wildcard`. The parser does not allow regex term queries
+  by default. You need to add the :class:`whoosh.qparser.RegexPlugin` plugin.
+  After you add the plugin, you can use ``r"expression"`` query syntax for
+  regular expression term queries. For example, ``r"foo.*bar"``.
+
+* Added the :class:`whoosh.qparser.PseudoFieldPlugin` parser plugin. This
+  plugin lets you create "pseudo-fields" that run a transform function on
+  whatever query syntax the user applies the field to. This is fairly advanced
+  functionality right now; I'm trying to think of ways to make its power easier
+  to access.
+
+* The documents in the lists in the dictionary returned by ``Results.groups()``
+  by default are now in the same relative order as in the results. This makes
+  it much easier to display the "top N" results in each category, for example.
+
+* The ``groupids`` keyword argument to ``Searcher.search`` has been removed.
+  Instead you can now pass a :class:`whoosh.sorting.FacetMap` object to the
+  ``Searcher.search`` method's ``maptype`` argument to control how faceted
+  documents are grouped, and/or set the ``maptype`` argument on individual
+  :class:`whoosh.sorting.FacetType`` objects to set custom grouping per facet.
+  See :doc:`../facets` for more information.
+
+* Calling ``Searcher.documents()`` or ``Searcher.document_numbers()`` with no
+  arguments now yields all documents/numbers.
+
+* Calling ``Writer.update_document()`` with no unique fields is now equivalent
+  to calling ``Writer.add_document()`` with the same arguments.
+
+* Fixed a problem with keyword expansion where the code was building a cache
+  that was fast on small indexes, but unacceptably slow on large indexes.
+
+* Added the hyphen (``-``) to the list of characters that match a "wildcard"
+  token, to make parsing slightly more predictable. A true fix will have to
+  wait for another parser rewrite.
+
+* Fixed an unused ``__future__`` import and use of ``float("nan")`` which were
+  breaking under Python 2.5.
+
+* Fixed a bug where vectored fields with only one term stored an empty term
+  vector.
+
+* Various other bug fixes.
+
 Whoosh 2.2
 ==========
 

docs/source/searching.rst

     
     with myindex.searcher() as s:
         qp = QueryParser("content", schema=myindex.schema)
-        q = queryparser.parse(u"hello world")
+        q = qp.parse(u"hello world")
         
         results = s.search(q)
 
 documents. You can use it to access the stored fields of each hit document, to
 display to the user.
 
->>> # How many documents matched?
->>> len(results)
-27
->>> # How many scored and sorted documents in this Results object?
->>> # This will be less than len() if you used the limit keyword argument.
->>> results.scored_length()
-10
 >>> # Show the best hit's stored fields
 >>> results[0]
 {"title": u"Hello World in Python", "path": u"/a/b/c"}
 >>> results[0:2]
 [{"title": u"Hello World in Python", "path": u"/a/b/c"}, {"title": u"Foo", "path": u"/bar"}]
 
+By default, ``Searcher.search(myquery)`` limits the number of hits to 20, So
+the number of scored hits in the ``Results`` object may be less than the number
+of matching documents in the index.
+
+>>> # How many documents in the entire index would have matched?
+>>> len(results)
+27
+>>> # How many scored and sorted documents in this Results object?
+>>> # This will often be less than len() if the number of hits was limited
+>>> # (the default).
+>>> results.scored_length()
+10
+
+Calling ``len(Results)`` runs a fast (unscored) version of the query again to
+figure out the total number of matching documents. This is usually very fast
+but for large indexes it can cause a noticeable delay. If you want to avoid
+this dalay on very large indexes, you can use the
+:meth:`~whoosh.searching.Results.has_exact_length`,
+:meth:`~whoosh.searching.Results.estimated_length`,
+and :meth:`~whoosh.searching.Results.estimated_min_length` methods to estimate
+the number of matching documents without calling ``len()``::
+
+    found = results.scored_length()
+    if results.has_exact_length():
+        print("Scored", found, "of exactly", len(results), "documents")
+    else:
+        low = results.estimated_min_length()
+        high = results.estimated_length()
+    
+        print("Scored", found, "of between", low, "and", "high", "documents")
+
 
 Scoring and sorting
 ===================

docs/source/stemming.rst

 ``café``.
 
 The default analyzer for the :class:`whoosh.fields.TEXT` field does not do
-stemming or accent folding. In order to allow 
+stemming or accent folding.
 
 
 Stemming
 'render'
 
 The stemming filter applies the stemming function to the terms it indexes, and
-to words in user queries. So 
+to words in user queries. So in theory all variations of a root word ("render",
+"rendered", "renders", "rendering", etc.) are reduced to a single term in the
+index, saving space. And all possible variations users might use in a query
+are reduced to the root, so stemming enhances "recall".
 
 The :class:`whoosh.analysis.StemFilter` lets you add a stemming filter to an
 analyzer chain.
 
 * It increases the size of the index relative to stemming, because different
   word forms are indexed separately.
-  
+
 * It acts like an ``Or`` search for all the variations, which is slower than
   searching for a single term.
-  
+
 
 Lemmatization
 =============

scripts/pylint.ini

+# lint Python modules using external checkers.
+# 
+# This is the main checker controling the other ones and the reports
+# generation. It is itself both a raw checker and an astng checker in order
+# to:
+# * handle message activation / deactivation at the module level
+# * handle some basic but necessary stats'data (number of classes, methods...)
+# 
+[MASTER]
+
+# Specify a configuration file.
+#rcfile=
+
+# Profiled execution.
+profile=no
+
+# Add <file or directory> to the black list. It should be a base name, not a
+# path. You may set this option multiple times.
+ignore=.hg
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# Set the cache size for astng objects.
+cache-size=500
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+
+[MESSAGES CONTROL]
+
+# Enable only checker(s) with the given id(s). This option conflict with the
+# disable-checker option
+#enable-checker=
+
+# Enable all checker(s) except those with the given id(s). This option conflict
+# with the disable-checker option
+#disable-checker=
+
+# Enable all messages in the listed categories.
+#enable-msg-cat=
+
+# Disable all messages in the listed categories.
+#disable-msg-cat=
+
+# Enable the message(s) with the given id(s).
+#enable-msg=
+
+# Disable the message(s) with the given id(s).
+disable-msg=C0103,C0203,C0302,W0142,W0703
+
+
+[REPORTS]
+
+# set the output format. Available formats are text, parseable, colorized and
+# html
+output-format=parseable
+
+# Include message's id in output
+include-ids=yes
+
+# Put messages in a separate file for each module / package specified on the
+# command line instead of printing them on stdout. Reports (if any) will be
+# written in a file name "pylint_global.[txt|html]".
+files-output=no
+
+# Tells wether to display a full report or only the messages
+reports=yes
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note).You have access to the variables errors warning, statement which
+# respectivly contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (R0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Add a comment according to your evaluation note. This is used by the global
+# evaluation report (R0004).
+comment=no
+
+# Enable the report(s) with the given id(s).
+#enable-report=
+
+# Disable the report(s) with the given id(s).
+#disable-report=
+
+
+# checks for
+# * unused variables / imports
+# * undefined variables
+# * redefinition of variable from builtins or from an outer scope
+# * use of variable before assigment
+# 
+[VARIABLES]
+
+# Tells wether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching names used for dummy variables (i.e. not used).
+dummy-variables-rgx=_|dummy
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+
+# try to find bugs in the code using type inference
+# 
+[TYPECHECK]
+
+# Tells wether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# When zope mode is activated, consider the acquired-members option to ignore
+# access to some undefined attributes.
+zope=no
+
+# List of members which are usually get through zope's acquisition mecanism and
+# so shouldn't trigger E0201 when accessed (need zope=yes to be considered).
+acquired-members=REQUEST,acl_users,aq_parent
+
+
+# checks for :
+# * doc strings
+# * modules / classes / functions / methods / arguments / variables name
+# * number of arguments, local variables, branchs, returns and statements in
+# functions, methods
+# * required module attributes
+# * dangerous default values as arguments
+# * redefinition of function / method / class
+# * uses of the global statement
+# 
+[BASIC]
+
+# Required attributes for module, separated by a comma
+required-attributes=
+
+# Regular expression which should only match functions or classes name which do
+# not require a docstring
+no-docstring-rgx=__.*__
+
+# Regular expression which should only match correct module names
+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression which should only match correct module level names
+const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__))$
+
+# Regular expression which should only match correct class names
+class-rgx=[A-Z_][a-zA-Z0-9]+$
+
+# Regular expression which should only match correct function names
+function-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct method names
+method-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct instance attribute names
+attr-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct argument names
+argument-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct variable names
+variable-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct list comprehension /
+# generator expression variable names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=i,j,k,ex,Run,_
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# List of builtins function names that should not be used, separated by a comma
+bad-functions=apply,input
+
+
+# checks for sign of poor/misdesign:
+# * number of methods, attributes, local variables...
+# * size, complexity of functions, methods
+# 
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=12
+
+# Maximum number of locals for function / method body
+max-locals=30
+
+# Maximum number of return / yield for function / method body
+max-returns=12
+
+# Maximum number of branch for function / method body
+max-branchs=30
+
+# Maximum number of statements in function / method body
+max-statements=60
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=20
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=0
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+
+# checks for
+# * external modules dependencies
+# * relative / wildcard imports
+# * cyclic imports
+# * uses of deprecated modules
+# 
+[IMPORTS]
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report R0402 must not be disabled)
+import-graph=
+
+# Create a graph of external dependencies in the given file (report R0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of internal dependencies in the given file (report R0402 must
+# not be disabled)
+int-import-graph=
+
+
+# checks for :
+# * methods without self as first argument
+# * overridden methods signature
+# * access only to existant members via self
+# * attributes not defined in the __init__ method
+# * supported interfaces implementation
+# * unreachable code
+# 
+[CLASSES]
+
+# List of interface methods to ignore, separated by a comma. This is used for
+# instance to not check methods defines in Zope's Interface base class.
+ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+
+# checks for similarities and duplicated code. This computation may be
+# memory / CPU intensive, so you should disable it if you experiments some
+# problems.
+# 
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=10
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
+
+
+# checks for:
+#