[Python-modules-commits] [inflection] 01/04: import inflection_0.3.1.orig.tar.gz
Ethan Ward
ethanward-guest at moszumanska.debian.org
Tue Jul 25 17:41:25 UTC 2017
This is an automated email from the git hooks/post-receive script.
ethanward-guest pushed a commit to branch master
in repository inflection.
commit 6cc8b7a9bf18a4a556d0bd97383d3eaac61ce0e4
Author: Ethan Ward <ethan.ward at mycroft.ai>
Date: Tue Jul 25 12:25:18 2017 -0500
import inflection_0.3.1.orig.tar.gz
---
CHANGES.rst | 42 +++
LICENSE | 19 ++
MANIFEST.in | 2 +
PKG-INFO | 90 +++++++
README.rst | 24 ++
inflection.egg-info/PKG-INFO | 90 +++++++
inflection.egg-info/SOURCES.txt | 13 +
inflection.egg-info/dependency_links.txt | 1 +
inflection.egg-info/not-zip-safe | 1 +
inflection.egg-info/top_level.txt | 1 +
inflection.py | 423 ++++++++++++++++++++++++++++++
setup.cfg | 11 +
setup.py | 36 +++
test_inflection.py | 428 +++++++++++++++++++++++++++++++
14 files changed, 1181 insertions(+)
diff --git a/CHANGES.rst b/CHANGES.rst
new file mode 100644
index 0000000..e57c310
--- /dev/null
+++ b/CHANGES.rst
@@ -0,0 +1,42 @@
+Changelog
+---------
+
+Here you can see the full list of changes between each Inflection release.
+
+0.3.1 (May 3, 2015)
+^^^^^^^^^^^^^^^^^^^
+
+- Fixed trove classifiers not showing up on PyPI.
+- Fixed "human" pluralized as "humen" and not "humans".
+- Fixed "potato" pluralized as "potatos" and not "potatoes".
+
+0.3.0 (March 1, 2015)
++++++++++++++++++++++
+
+- Added `tableize()` function.
+
+0.2.1 (September 3, 2014)
++++++++++++++++++++++++++
+
+- Added Python 2, Python 3 and Python 3.4 trove classifiers.
+
+0.2.0 (June 15, 2013)
++++++++++++++++++++++
+
+- Added initial support for Python 3.
+- Dropped Python 2.5 support.
+
+0.1.2 (March 13, 2012)
+++++++++++++++++++++++
+
+- Added Python 2.5 support.
+
+0.1.1 (February 24, 2012)
++++++++++++++++++++++++++
+
+- Fixed some files not included in the distribution package.
+
+0.1.0 (February 24, 2012)
++++++++++++++++++++++++++
+
+- Initial public release
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f4dd549
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Copyright (C) 2012-2015 Janne Vanhala
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..c03f3af
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,2 @@
+include README.rst LICENSE CHANGES.rst test_inflection.py
+
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..eac099c
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,90 @@
+Metadata-Version: 1.1
+Name: inflection
+Version: 0.3.1
+Summary: A port of Ruby on Rails inflector to Python
+Home-page: http://github.com/jpvanhal/inflection
+Author: Janne Vanhala
+Author-email: janne.vanhala at gmail.com
+License: MIT
+Description: Inflection
+ ==========
+
+ |build status|_
+
+ .. |build status| image:: https://secure.travis-ci.org/jpvanhal/inflection.png?branch=master
+ :alt: Build Status
+ .. _build status: http://travis-ci.org/jpvanhal/inflection
+
+ Inflection is a string transformation library. It singularizes and pluralizes
+ English words, and transforms strings from CamelCase to underscored string.
+ Inflection is a port of `Ruby on Rails`_' `inflector`_ to Python.
+
+ .. _Ruby on Rails: http://rubyonrails.org
+ .. _inflector: http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html
+
+ Resources
+ ---------
+
+ - `Documentation <http://inflection.readthedocs.org/>`_
+ - `Issue Tracker <http://github.com/jpvanhal/inflection/issues>`_
+ - `Code <http://github.com/jpvanhal/inflection>`_
+ - `Development Version
+ <http://github.com/jpvanhal/inflection/zipball/master#egg=Inflection-dev>`_
+
+
+ Changelog
+ ---------
+
+ Here you can see the full list of changes between each Inflection release.
+
+ 0.3.1 (May 3, 2015)
+ ^^^^^^^^^^^^^^^^^^^
+
+ - Fixed trove classifiers not showing up on PyPI.
+ - Fixed "human" pluralized as "humen" and not "humans".
+ - Fixed "potato" pluralized as "potatos" and not "potatoes".
+
+ 0.3.0 (March 1, 2015)
+ +++++++++++++++++++++
+
+ - Added `tableize()` function.
+
+ 0.2.1 (September 3, 2014)
+ +++++++++++++++++++++++++
+
+ - Added Python 2, Python 3 and Python 3.4 trove classifiers.
+
+ 0.2.0 (June 15, 2013)
+ +++++++++++++++++++++
+
+ - Added initial support for Python 3.
+ - Dropped Python 2.5 support.
+
+ 0.1.2 (March 13, 2012)
+ ++++++++++++++++++++++
+
+ - Added Python 2.5 support.
+
+ 0.1.1 (February 24, 2012)
+ +++++++++++++++++++++++++
+
+ - Fixed some files not included in the distribution package.
+
+ 0.1.0 (February 24, 2012)
+ +++++++++++++++++++++++++
+
+ - Initial public release
+
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: Natural Language :: English
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: Implementation :: PyPy
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..b4974b5
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,24 @@
+Inflection
+==========
+
+|build status|_
+
+.. |build status| image:: https://secure.travis-ci.org/jpvanhal/inflection.png?branch=master
+ :alt: Build Status
+.. _build status: http://travis-ci.org/jpvanhal/inflection
+
+Inflection is a string transformation library. It singularizes and pluralizes
+English words, and transforms strings from CamelCase to underscored string.
+Inflection is a port of `Ruby on Rails`_' `inflector`_ to Python.
+
+.. _Ruby on Rails: http://rubyonrails.org
+.. _inflector: http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html
+
+Resources
+---------
+
+- `Documentation <http://inflection.readthedocs.org/>`_
+- `Issue Tracker <http://github.com/jpvanhal/inflection/issues>`_
+- `Code <http://github.com/jpvanhal/inflection>`_
+- `Development Version
+ <http://github.com/jpvanhal/inflection/zipball/master#egg=Inflection-dev>`_
diff --git a/inflection.egg-info/PKG-INFO b/inflection.egg-info/PKG-INFO
new file mode 100644
index 0000000..eac099c
--- /dev/null
+++ b/inflection.egg-info/PKG-INFO
@@ -0,0 +1,90 @@
+Metadata-Version: 1.1
+Name: inflection
+Version: 0.3.1
+Summary: A port of Ruby on Rails inflector to Python
+Home-page: http://github.com/jpvanhal/inflection
+Author: Janne Vanhala
+Author-email: janne.vanhala at gmail.com
+License: MIT
+Description: Inflection
+ ==========
+
+ |build status|_
+
+ .. |build status| image:: https://secure.travis-ci.org/jpvanhal/inflection.png?branch=master
+ :alt: Build Status
+ .. _build status: http://travis-ci.org/jpvanhal/inflection
+
+ Inflection is a string transformation library. It singularizes and pluralizes
+ English words, and transforms strings from CamelCase to underscored string.
+ Inflection is a port of `Ruby on Rails`_' `inflector`_ to Python.
+
+ .. _Ruby on Rails: http://rubyonrails.org
+ .. _inflector: http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html
+
+ Resources
+ ---------
+
+ - `Documentation <http://inflection.readthedocs.org/>`_
+ - `Issue Tracker <http://github.com/jpvanhal/inflection/issues>`_
+ - `Code <http://github.com/jpvanhal/inflection>`_
+ - `Development Version
+ <http://github.com/jpvanhal/inflection/zipball/master#egg=Inflection-dev>`_
+
+
+ Changelog
+ ---------
+
+ Here you can see the full list of changes between each Inflection release.
+
+ 0.3.1 (May 3, 2015)
+ ^^^^^^^^^^^^^^^^^^^
+
+ - Fixed trove classifiers not showing up on PyPI.
+ - Fixed "human" pluralized as "humen" and not "humans".
+ - Fixed "potato" pluralized as "potatos" and not "potatoes".
+
+ 0.3.0 (March 1, 2015)
+ +++++++++++++++++++++
+
+ - Added `tableize()` function.
+
+ 0.2.1 (September 3, 2014)
+ +++++++++++++++++++++++++
+
+ - Added Python 2, Python 3 and Python 3.4 trove classifiers.
+
+ 0.2.0 (June 15, 2013)
+ +++++++++++++++++++++
+
+ - Added initial support for Python 3.
+ - Dropped Python 2.5 support.
+
+ 0.1.2 (March 13, 2012)
+ ++++++++++++++++++++++
+
+ - Added Python 2.5 support.
+
+ 0.1.1 (February 24, 2012)
+ +++++++++++++++++++++++++
+
+ - Fixed some files not included in the distribution package.
+
+ 0.1.0 (February 24, 2012)
+ +++++++++++++++++++++++++
+
+ - Initial public release
+
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: Natural Language :: English
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: Implementation :: PyPy
diff --git a/inflection.egg-info/SOURCES.txt b/inflection.egg-info/SOURCES.txt
new file mode 100644
index 0000000..1a4806f
--- /dev/null
+++ b/inflection.egg-info/SOURCES.txt
@@ -0,0 +1,13 @@
+CHANGES.rst
+LICENSE
+MANIFEST.in
+README.rst
+inflection.py
+setup.cfg
+setup.py
+test_inflection.py
+inflection.egg-info/PKG-INFO
+inflection.egg-info/SOURCES.txt
+inflection.egg-info/dependency_links.txt
+inflection.egg-info/not-zip-safe
+inflection.egg-info/top_level.txt
\ No newline at end of file
diff --git a/inflection.egg-info/dependency_links.txt b/inflection.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/inflection.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/inflection.egg-info/not-zip-safe b/inflection.egg-info/not-zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/inflection.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
diff --git a/inflection.egg-info/top_level.txt b/inflection.egg-info/top_level.txt
new file mode 100644
index 0000000..8d3ece7
--- /dev/null
+++ b/inflection.egg-info/top_level.txt
@@ -0,0 +1 @@
+inflection
diff --git a/inflection.py b/inflection.py
new file mode 100644
index 0000000..cd07ede
--- /dev/null
+++ b/inflection.py
@@ -0,0 +1,423 @@
+# -*- coding: utf-8 -*-
+"""
+ inflection
+ ~~~~~~~~~~~~
+
+ A port of Ruby on Rails' inflector to Python.
+
+ :copyright: (c) 2012-2015 by Janne Vanhala
+
+ :license: MIT, see LICENSE for more details.
+"""
+import re
+import unicodedata
+
+__version__ = '0.3.1'
+
+PLURALS = [
+ (r"(?i)(quiz)$", r'\1zes'),
+ (r"(?i)^(oxen)$", r'\1'),
+ (r"(?i)^(ox)$", r'\1en'),
+ (r"(?i)(m|l)ice$", r'\1ice'),
+ (r"(?i)(m|l)ouse$", r'\1ice'),
+ (r"(?i)(matr|vert|ind)(?:ix|ex)$", r'\1ices'),
+ (r"(?i)(x|ch|ss|sh)$", r'\1es'),
+ (r"(?i)([^aeiouy]|qu)y$", r'\1ies'),
+ (r"(?i)(hive)$", r'\1s'),
+ (r"(?i)([lr])f$", r'\1ves'),
+ (r"(?i)([^f])fe$", r'\1ves'),
+ (r"(?i)sis$", 'ses'),
+ (r"(?i)([ti])a$", r'\1a'),
+ (r"(?i)([ti])um$", r'\1a'),
+ (r"(?i)(buffal|potat|tomat)o$", r'\1oes'),
+ (r"(?i)(bu)s$", r'\1ses'),
+ (r"(?i)(alias|status)$", r'\1es'),
+ (r"(?i)(octop|vir)i$", r'\1i'),
+ (r"(?i)(octop|vir)us$", r'\1i'),
+ (r"(?i)^(ax|test)is$", r'\1es'),
+ (r"(?i)s$", 's'),
+ (r"$", 's'),
+]
+
+SINGULARS = [
+ (r"(?i)(database)s$", r'\1'),
+ (r"(?i)(quiz)zes$", r'\1'),
+ (r"(?i)(matr)ices$", r'\1ix'),
+ (r"(?i)(vert|ind)ices$", r'\1ex'),
+ (r"(?i)^(ox)en", r'\1'),
+ (r"(?i)(alias|status)(es)?$", r'\1'),
+ (r"(?i)(octop|vir)(us|i)$", r'\1us'),
+ (r"(?i)^(a)x[ie]s$", r'\1xis'),
+ (r"(?i)(cris|test)(is|es)$", r'\1is'),
+ (r"(?i)(shoe)s$", r'\1'),
+ (r"(?i)(o)es$", r'\1'),
+ (r"(?i)(bus)(es)?$", r'\1'),
+ (r"(?i)(m|l)ice$", r'\1ouse'),
+ (r"(?i)(x|ch|ss|sh)es$", r'\1'),
+ (r"(?i)(m)ovies$", r'\1ovie'),
+ (r"(?i)(s)eries$", r'\1eries'),
+ (r"(?i)([^aeiouy]|qu)ies$", r'\1y'),
+ (r"(?i)([lr])ves$", r'\1f'),
+ (r"(?i)(tive)s$", r'\1'),
+ (r"(?i)(hive)s$", r'\1'),
+ (r"(?i)([^f])ves$", r'\1fe'),
+ (r"(?i)(t)he(sis|ses)$", r"\1hesis"),
+ (r"(?i)(s)ynop(sis|ses)$", r"\1ynopsis"),
+ (r"(?i)(p)rogno(sis|ses)$", r"\1rognosis"),
+ (r"(?i)(p)arenthe(sis|ses)$", r"\1arenthesis"),
+ (r"(?i)(d)iagno(sis|ses)$", r"\1iagnosis"),
+ (r"(?i)(b)a(sis|ses)$", r"\1asis"),
+ (r"(?i)(a)naly(sis|ses)$", r"\1nalysis"),
+ (r"(?i)([ti])a$", r'\1um'),
+ (r"(?i)(n)ews$", r'\1ews'),
+ (r"(?i)(ss)$", r'\1'),
+ (r"(?i)s$", ''),
+]
+
+UNCOUNTABLES = set([
+ 'equipment',
+ 'fish',
+ 'information',
+ 'jeans',
+ 'money',
+ 'rice',
+ 'series',
+ 'sheep',
+ 'species',
+])
+
+
+def _irregular(singular, plural):
+ """
+ A convenience function to add appropriate rules to plurals and singular
+ for irregular words.
+
+ :param singular: irregular word in singular form
+ :param plural: irregular word in plural form
+ """
+ def caseinsensitive(string):
+ return ''.join('[' + char + char.upper() + ']' for char in string)
+
+ if singular[0].upper() == plural[0].upper():
+ PLURALS.insert(0, (
+ r"(?i)(%s)%s$" % (singular[0], singular[1:]),
+ r'\1' + plural[1:]
+ ))
+ PLURALS.insert(0, (
+ r"(?i)(%s)%s$" % (plural[0], plural[1:]),
+ r'\1' + plural[1:]
+ ))
+ SINGULARS.insert(0, (
+ r"(?i)(%s)%s$" % (plural[0], plural[1:]),
+ r'\1' + singular[1:]
+ ))
+ else:
+ PLURALS.insert(0, (
+ r"%s%s$" % (singular[0].upper(), caseinsensitive(singular[1:])),
+ plural[0].upper() + plural[1:]
+ ))
+ PLURALS.insert(0, (
+ r"%s%s$" % (singular[0].lower(), caseinsensitive(singular[1:])),
+ plural[0].lower() + plural[1:]
+ ))
+ PLURALS.insert(0, (
+ r"%s%s$" % (plural[0].upper(), caseinsensitive(plural[1:])),
+ plural[0].upper() + plural[1:]
+ ))
+ PLURALS.insert(0, (
+ r"%s%s$" % (plural[0].lower(), caseinsensitive(plural[1:])),
+ plural[0].lower() + plural[1:]
+ ))
+ SINGULARS.insert(0, (
+ r"%s%s$" % (plural[0].upper(), caseinsensitive(plural[1:])),
+ singular[0].upper() + singular[1:]
+ ))
+ SINGULARS.insert(0, (
+ r"%s%s$" % (plural[0].lower(), caseinsensitive(plural[1:])),
+ singular[0].lower() + singular[1:]
+ ))
+
+
+def camelize(string, uppercase_first_letter=True):
+ """
+ Convert strings to CamelCase.
+
+ Examples::
+
+ >>> camelize("device_type")
+ "DeviceType"
+ >>> camelize("device_type", False)
+ "deviceType"
+
+ :func:`camelize` can be though as a inverse of :func:`underscore`, although
+ there are some cases where that does not hold::
+
+ >>> camelize(underscore("IOError"))
+ "IoError"
+
+ :param uppercase_first_letter: if set to `True` :func:`camelize` converts
+ strings to UpperCamelCase. If set to `False` :func:`camelize` produces
+ lowerCamelCase. Defaults to `True`.
+ """
+ if uppercase_first_letter:
+ return re.sub(r"(?:^|_)(.)", lambda m: m.group(1).upper(), string)
+ else:
+ return string[0].lower() + camelize(string)[1:]
+
+
+def dasherize(word):
+ """Replace underscores with dashes in the string.
+
+ Example::
+
+ >>> dasherize("puni_puni")
+ "puni-puni"
+
+ """
+ return word.replace('_', '-')
+
+
+def humanize(word):
+ """
+ Capitalize the first word and turn underscores into spaces and strip a
+ trailing ``"_id"``, if any. Like :func:`titleize`, this is meant for
+ creating pretty output.
+
+ Examples::
+
+ >>> humanize("employee_salary")
+ "Employee salary"
+ >>> humanize("author_id")
+ "Author"
+
+ """
+ word = re.sub(r"_id$", "", word)
+ word = word.replace('_', ' ')
+ word = re.sub(r"(?i)([a-z\d]*)", lambda m: m.group(1).lower(), word)
+ word = re.sub(r"^\w", lambda m: m.group(0).upper(), word)
+ return word
+
+
+def ordinal(number):
+ """
+ Return the suffix that should be added to a number to denote the position
+ in an ordered sequence such as 1st, 2nd, 3rd, 4th.
+
+ Examples::
+
+ >>> ordinal(1)
+ "st"
+ >>> ordinal(2)
+ "nd"
+ >>> ordinal(1002)
+ "nd"
+ >>> ordinal(1003)
+ "rd"
+ >>> ordinal(-11)
+ "th"
+ >>> ordinal(-1021)
+ "st"
+
+ """
+ number = abs(int(number))
+ if number % 100 in (11, 12, 13):
+ return "th"
+ else:
+ return {
+ 1: "st",
+ 2: "nd",
+ 3: "rd",
+ }.get(number % 10, "th")
+
+
+def ordinalize(number):
+ """
+ Turn a number into an ordinal string used to denote the position in an
+ ordered sequence such as 1st, 2nd, 3rd, 4th.
+
+ Examples::
+
+ >>> ordinalize(1)
+ "1st"
+ >>> ordinalize(2)
+ "2nd"
+ >>> ordinalize(1002)
+ "1002nd"
+ >>> ordinalize(1003)
+ "1003rd"
+ >>> ordinalize(-11)
+ "-11th"
+ >>> ordinalize(-1021)
+ "-1021st"
+
+ """
+ return "%s%s" % (number, ordinal(number))
+
+
+def parameterize(string, separator='-'):
+ """
+ Replace special characters in a string so that it may be used as part of a
+ 'pretty' URL.
+
+ Example::
+
+ >>> parameterize(u"Donald E. Knuth")
+ 'donald-e-knuth'
+
+ """
+ string = transliterate(string)
+ # Turn unwanted chars into the separator
+ string = re.sub(r"(?i)[^a-z0-9\-_]+", separator, string)
+ if separator:
+ re_sep = re.escape(separator)
+ # No more than one of the separator in a row.
+ string = re.sub(r'%s{2,}' % re_sep, separator, string)
+ # Remove leading/trailing separator.
+ string = re.sub(r"(?i)^%(sep)s|%(sep)s$" % {'sep': re_sep}, '', string)
+
+ return string.lower()
+
+
+def pluralize(word):
+ """
+ Return the plural form of a word.
+
+ Examples::
+
+ >>> pluralize("post")
+ "posts"
+ >>> pluralize("octopus")
+ "octopi"
+ >>> pluralize("sheep")
+ "sheep"
+ >>> pluralize("CamelOctopus")
+ "CamelOctopi"
+
+ """
+ if not word or word.lower() in UNCOUNTABLES:
+ return word
+ else:
+ for rule, replacement in PLURALS:
+ if re.search(rule, word):
+ return re.sub(rule, replacement, word)
+ return word
+
+
+def singularize(word):
+ """
+ Return the singular form of a word, the reverse of :func:`pluralize`.
+
+ Examples::
+
+ >>> singularize("posts")
+ "post"
+ >>> singularize("octopi")
+ "octopus"
+ >>> singularize("sheep")
+ "sheep"
+ >>> singularize("word")
+ "word"
+ >>> singularize("CamelOctopi")
+ "CamelOctopus"
+
+ """
+ for inflection in UNCOUNTABLES:
+ if re.search(r'(?i)\b(%s)\Z' % inflection, word):
+ return word
+
+ for rule, replacement in SINGULARS:
+ if re.search(rule, word):
+ return re.sub(rule, replacement, word)
+ return word
+
+
+def tableize(word):
+ """
+ Create the name of a table like Rails does for models to table names. This
+ method uses the :func:`pluralize` method on the last word in the string.
+
+ Examples::
+
+ >>> tableize('RawScaledScorer')
+ "raw_scaled_scorers"
+ >>> tableize('egg_and_ham')
+ "egg_and_hams"
+ >>> tableize('fancyCategory')
+ "fancy_categories"
+ """
+ return pluralize(underscore(word))
+
+
+def titleize(word):
+ """
+ Capitalize all the words and replace some characters in the string to
+ create a nicer looking title. :func:`titleize` is meant for creating pretty
+ output.
+
+ Examples::
+
+ >>> titleize("man from the boondocks")
+ "Man From The Boondocks"
+ >>> titleize("x-men: the last stand")
+ "X Men: The Last Stand"
+ >>> titleize("TheManWithoutAPast")
+ "The Man Without A Past"
+ >>> titleize("raiders_of_the_lost_ark")
+ "Raiders Of The Lost Ark"
+
+ """
+ return re.sub(
+ r"\b('?[a-z])",
+ lambda match: match.group(1).capitalize(),
+ humanize(underscore(word))
+ )
+
+
+def transliterate(string):
+ """
+ Replace non-ASCII characters with an ASCII approximation. If no
+ approximation exists, the non-ASCII character is ignored. The string must
+ be ``unicode``.
+
+ Examples::
+
+ >>> transliterate(u'älämölö')
+ u'alamolo'
+ >>> transliterate(u'Ærøskøbing')
+ u'rskbing'
+
+ """
+ normalized = unicodedata.normalize('NFKD', string)
+ return normalized.encode('ascii', 'ignore').decode('ascii')
+
+
+def underscore(word):
+ """
+ Make an underscored, lowercase form from the expression in the string.
+
+ Example::
+
+ >>> underscore("DeviceType")
+ "device_type"
+
+ As a rule of thumb you can think of :func:`underscore` as the inverse of
+ :func:`camelize`, though there are cases where that does not hold::
+
+ >>> camelize(underscore("IOError"))
+ "IoError"
+
+ """
+ word = re.sub(r"([A-Z]+)([A-Z][a-z])", r'\1_\2', word)
+ word = re.sub(r"([a-z\d])([A-Z])", r'\1_\2', word)
+ word = word.replace("-", "_")
+ return word.lower()
+
+
+_irregular('person', 'people')
+_irregular('man', 'men')
+_irregular('human', 'humans')
+_irregular('child', 'children')
+_irregular('sex', 'sexes')
+_irregular('move', 'moves')
+_irregular('cow', 'kine')
+_irregular('zombie', 'zombies')
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..87e4706
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,11 @@
+[flake8]
+exclude = docs/*
+
+[isort]
+skip = .tox,docs
+
+[egg_info]
+tag_build =
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..dadf048
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from setuptools import setup
+
+import inflection
+
+setup(
+ name='inflection',
+ version=inflection.__version__,
+ description="A port of Ruby on Rails inflector to Python",
+ long_description=(
+ open('README.rst').read() + '\n\n' +
+ open('CHANGES.rst').read()
+ ),
+ author='Janne Vanhala',
+ author_email='janne.vanhala at gmail.com',
+ url='http://github.com/jpvanhal/inflection',
+ license='MIT',
+ py_modules=['inflection'],
+ zip_safe=False,
+ classifiers=[
+ 'Development Status :: 4 - Beta',
+ 'Intended Audience :: Developers',
+ 'Natural Language :: English',
+ 'License :: OSI Approved :: MIT License',
+ 'Programming Language :: Python',
+ 'Programming Language :: Python :: 2',
+ 'Programming Language :: Python :: 2.6',
+ 'Programming Language :: Python :: 2.7',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.3',
+ 'Programming Language :: Python :: 3.4',
+ 'Programming Language :: Python :: Implementation :: PyPy',
+ ],
+)
diff --git a/test_inflection.py b/test_inflection.py
new file mode 100644
index 0000000..0865def
--- /dev/null
+++ b/test_inflection.py
@@ -0,0 +1,428 @@
+# -*- coding: utf-8 -*-
+import pytest
+
+import inflection
+
+SINGULAR_TO_PLURAL = (
+ ("search", "searches"),
+ ("switch", "switches"),
+ ("fix", "fixes"),
+ ("box", "boxes"),
+ ("process", "processes"),
+ ("address", "addresses"),
+ ("case", "cases"),
+ ("stack", "stacks"),
+ ("wish", "wishes"),
+ ("fish", "fish"),
+ ("jeans", "jeans"),
+ ("funky jeans", "funky jeans"),
+
+ ("category", "categories"),
+ ("query", "queries"),
+ ("ability", "abilities"),
+ ("agency", "agencies"),
+ ("movie", "movies"),
+
+ ("archive", "archives"),
+
+ ("index", "indices"),
+
+ ("wife", "wives"),
+ ("safe", "saves"),
+ ("half", "halves"),
+
+ ("move", "moves"),
+
+ ("salesperson", "salespeople"),
+ ("person", "people"),
+
+ ("spokesman", "spokesmen"),
+ ("man", "men"),
+ ("woman", "women"),
+
+ ("basis", "bases"),
+ ("diagnosis", "diagnoses"),
+ ("diagnosis_a", "diagnosis_as"),
+
+ ("datum", "data"),
+ ("medium", "media"),
+ ("stadium", "stadia"),
+ ("analysis", "analyses"),
+
+ ("node_child", "node_children"),
+ ("child", "children"),
+
+ ("experience", "experiences"),
+ ("day", "days"),
+
+ ("comment", "comments"),
+ ("foobar", "foobars"),
+ ("newsletter", "newsletters"),
+
+ ("old_news", "old_news"),
+ ("news", "news"),
+
+ ("series", "series"),
+ ("species", "species"),
+
+ ("quiz", "quizzes"),
+
+ ("perspective", "perspectives"),
+
+ ("ox", "oxen"),
+ ("photo", "photos"),
+ ("buffalo", "buffaloes"),
+ ("tomato", "tomatoes"),
+ ("potato", "potatoes"),
+ ("dwarf", "dwarves"),
+ ("elf", "elves"),
+ ("information", "information"),
+ ("equipment", "equipment"),
+ ("bus", "buses"),
+ ("status", "statuses"),
+ ("status_code", "status_codes"),
+ ("mouse", "mice"),
+
+ ("louse", "lice"),
+ ("house", "houses"),
+ ("octopus", "octopi"),
+ ("virus", "viri"),
+ ("alias", "aliases"),
+ ("portfolio", "portfolios"),
+
+ ("vertex", "vertices"),
+ ("matrix", "matrices"),
+ ("matrix_fu", "matrix_fus"),
+
+ ("axis", "axes"),
+ ("testis", "testes"),
+ ("crisis", "crises"),
+
+ ("rice", "rice"),
+ ("shoe", "shoes"),
+
+ ("horse", "horses"),
+ ("prize", "prizes"),
+ ("edge", "edges"),
+
+ ("cow", "kine"),
+ ("database", "databases"),
+ ("human", "humans")
+)
+
+CAMEL_TO_UNDERSCORE = (
+ ("Product", "product"),
+ ("SpecialGuest", "special_guest"),
+ ("ApplicationController", "application_controller"),
+ ("Area51Controller", "area51_controller"),
+)
+
+CAMEL_TO_UNDERSCORE_WITHOUT_REVERSE = (
+ ("HTMLTidy", "html_tidy"),
+ ("HTMLTidyGenerator", "html_tidy_generator"),
+ ("FreeBSD", "free_bsd"),
+ ("HTML", "html"),
+)
+
+STRING_TO_PARAMETERIZED = (
+ (u"Donald E. Knuth", "donald-e-knuth"),
+ (
+ u"Random text with *(bad)* characters",
+ "random-text-with-bad-characters"
+ ),
+ (u"Allow_Under_Scores", "allow_under_scores"),
+ (u"Trailing bad characters!@#", "trailing-bad-characters"),
+ (u"!@#Leading bad characters", "leading-bad-characters"),
+ (u"Squeeze separators", "squeeze-separators"),
+ (u"Test with + sign", "test-with-sign"),
+ (u"Test with malformed utf8 \251", "test-with-malformed-utf8"),
+)
+
... 288 lines suppressed ...
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/inflection.git
More information about the Python-modules-commits
mailing list