Blacken code

pull/231/head
Vinayak Mehta 2021-06-15 03:29:35 +05:30
parent f7c14bf1d4
commit 2c59e7b0f7
No known key found for this signature in database
GPG Key ID: 2DE013537A15A9A4
11 changed files with 676 additions and 254 deletions

View File

@ -55,7 +55,9 @@ class TextEdge(object):
x = round(self.x, 2) x = round(self.x, 2)
y0 = round(self.y0, 2) y0 = round(self.y0, 2)
y1 = round(self.y1, 2) y1 = round(self.y1, 2)
return f"<TextEdge x={x} y0={y0} y1={y1} align={self.align} valid={self.is_valid}>" return (
f"<TextEdge x={x} y0={y0} y1={y1} align={self.align} valid={self.is_valid}>"
)
def update_coords(self, x, y0, edge_tol=50): def update_coords(self, x, y0, edge_tol=50):
"""Updates the text edge's x and bottom y coordinates and sets """Updates the text edge's x and bottom y coordinates and sets
@ -102,8 +104,7 @@ class TextEdges(object):
return None return None
def add(self, textline, align): def add(self, textline, align):
"""Adds a new text edge to the current dict. """Adds a new text edge to the current dict."""
"""
x = self.get_x_coord(textline, align) x = self.get_x_coord(textline, align)
y0 = textline.y0 y0 = textline.y0
y1 = textline.y1 y1 = textline.y1
@ -111,8 +112,7 @@ class TextEdges(object):
self._textedges[align].append(te) self._textedges[align].append(te)
def update(self, textline): def update(self, textline):
"""Updates an existing text edge in the current dict. """Updates an existing text edge in the current dict."""
"""
for align in ["left", "right", "middle"]: for align in ["left", "right", "middle"]:
x_coord = self.get_x_coord(textline, align) x_coord = self.get_x_coord(textline, align)
idx = self.find(x_coord, align) idx = self.find(x_coord, align)
@ -304,8 +304,7 @@ class Cell(object):
@property @property
def bound(self): def bound(self):
"""The number of sides on which the cell is bounded. """The number of sides on which the cell is bounded."""
"""
return self.top + self.bottom + self.left + self.right return self.top + self.bottom + self.left + self.right
@ -361,8 +360,7 @@ class Table(object):
@property @property
def data(self): def data(self):
"""Returns two-dimensional list of strings in table. """Returns two-dimensional list of strings in table."""
"""
d = [] d = []
for row in self.cells: for row in self.cells:
d.append([cell.text.strip() for cell in row]) d.append([cell.text.strip() for cell in row])
@ -383,8 +381,7 @@ class Table(object):
return report return report
def set_all_edges(self): def set_all_edges(self):
"""Sets all table edges to True. """Sets all table edges to True."""
"""
for row in self.cells: for row in self.cells:
for cell in row: for cell in row:
cell.left = cell.right = cell.top = cell.bottom = True cell.left = cell.right = cell.top = cell.bottom = True
@ -526,8 +523,7 @@ class Table(object):
return self return self
def set_border(self): def set_border(self):
"""Sets table border edges to True. """Sets table border edges to True."""
"""
for r in range(len(self.rows)): for r in range(len(self.rows)):
self.cells[r][0].left = True self.cells[r][0].left = True
self.cells[r][len(self.cols) - 1].right = True self.cells[r][len(self.cols) - 1].right = True

View File

@ -81,8 +81,7 @@ class __Ghostscript(object):
def Ghostscript(*args, **kwargs): def Ghostscript(*args, **kwargs):
"""Factory function for setting up a Ghostscript instance """Factory function for setting up a Ghostscript instance"""
"""
global __instance__ global __instance__
# Ghostscript only supports a single instance # Ghostscript only supports a single instance
if __instance__ is None: if __instance__ is None:

View File

@ -167,9 +167,7 @@ class PDFHandler(object):
with TemporaryDirectory() as tempdir: with TemporaryDirectory() as tempdir:
for p in self.pages: for p in self.pages:
self._save_page(self.filepath, p, tempdir) self._save_page(self.filepath, p, tempdir)
pages = [ pages = [os.path.join(tempdir, f"page-{p}.pdf") for p in self.pages]
os.path.join(tempdir, f"page-{p}.pdf") for p in self.pages
]
parser = Lattice(**kwargs) if flavor == "lattice" else Stream(**kwargs) parser = Lattice(**kwargs) if flavor == "lattice" else Stream(**kwargs)
for p in pages: for p in pages:
t = parser.extract_tables( t = parser.extract_tables(

View File

@ -6,8 +6,7 @@ from ..utils import get_page_layout, get_text_objects
class BaseParser(object): class BaseParser(object):
"""Defines a base parser. """Defines a base parser."""
"""
def _generate_layout(self, filename, layout_kwargs): def _generate_layout(self, filename, layout_kwargs):
self.filename = filename self.filename = filename

View File

@ -65,7 +65,7 @@ class Stream(BaseParser):
edge_tol=50, edge_tol=50,
row_tol=2, row_tol=2,
column_tol=0, column_tol=0,
**kwargs **kwargs,
): ):
self.table_regions = table_regions self.table_regions = table_regions
self.table_areas = table_areas self.table_areas = table_areas
@ -362,10 +362,10 @@ class Stream(BaseParser):
if len(elements): if len(elements):
ncols = max(set(elements), key=elements.count) ncols = max(set(elements), key=elements.count)
else: else:
warnings.warn( warnings.warn(f"No tables found in table area {table_idx + 1}")
f"No tables found in table area {table_idx + 1}" cols = [
) (t.x0, t.x1) for r in rows_grouped if len(r) == ncols for t in r
cols = [(t.x0, t.x1) for r in rows_grouped if len(r) == ncols for t in r] ]
cols = self._merge_columns(sorted(cols), column_tol=self.column_tol) cols = self._merge_columns(sorted(cols), column_tol=self.column_tol)
inner_text = [] inner_text = []
for i in range(1, len(cols)): for i in range(1, len(cols)):

View File

@ -34,13 +34,9 @@ class PlotMethods(object):
raise ImportError("matplotlib is required for plotting.") raise ImportError("matplotlib is required for plotting.")
if table.flavor == "lattice" and kind in ["textedge"]: if table.flavor == "lattice" and kind in ["textedge"]:
raise NotImplementedError( raise NotImplementedError(f"Lattice flavor does not support kind='{kind}'")
f"Lattice flavor does not support kind='{kind}'"
)
elif table.flavor == "stream" and kind in ["joint", "line"]: elif table.flavor == "stream" and kind in ["joint", "line"]:
raise NotImplementedError( raise NotImplementedError(f"Stream flavor does not support kind='{kind}'")
f"Stream flavor does not support kind='{kind}'"
)
plot_method = getattr(self, kind) plot_method = getattr(self, kind)
fig = plot_method(table) fig = plot_method(table)

View File

@ -870,7 +870,9 @@ def get_page_layout(
parser = PDFParser(f) parser = PDFParser(f)
document = PDFDocument(parser) document = PDFDocument(parser)
if not document.is_extractable: if not document.is_extractable:
raise PDFTextExtractionNotAllowed(f"Text extraction is not allowed: {filename}") raise PDFTextExtractionNotAllowed(
f"Text extraction is not allowed: {filename}"
)
laparams = LAParams( laparams = LAParams(
char_margin=char_margin, char_margin=char_margin,
line_margin=line_margin, line_margin=line_margin,

View File

@ -1,7 +1,19 @@
# flasky pygments style based on tango style # flasky pygments style based on tango style
from pygments.style import Style from pygments.style import Style
from pygments.token import Keyword, Name, Comment, String, Error, \ from pygments.token import (
Number, Operator, Generic, Whitespace, Punctuation, Other, Literal Keyword,
Name,
Comment,
String,
Error,
Number,
Operator,
Generic,
Whitespace,
Punctuation,
Other,
Literal,
)
class FlaskyStyle(Style): class FlaskyStyle(Style):
@ -14,10 +26,8 @@ class FlaskyStyle(Style):
Whitespace: "underline #f8f8f8", # class: 'w' Whitespace: "underline #f8f8f8", # class: 'w'
Error: "#a40000 border:#ef2929", # class: 'err' Error: "#a40000 border:#ef2929", # class: 'err'
Other: "#000000", # class 'x' Other: "#000000", # class 'x'
Comment: "italic #8f5902", # class: 'c' Comment: "italic #8f5902", # class: 'c'
Comment.Preproc: "noitalic", # class: 'cp' Comment.Preproc: "noitalic", # class: 'cp'
Keyword: "bold #004461", # class: 'k' Keyword: "bold #004461", # class: 'k'
Keyword.Constant: "bold #004461", # class: 'kc' Keyword.Constant: "bold #004461", # class: 'kc'
Keyword.Declaration: "bold #004461", # class: 'kd' Keyword.Declaration: "bold #004461", # class: 'kd'
@ -25,12 +35,9 @@ class FlaskyStyle(Style):
Keyword.Pseudo: "bold #004461", # class: 'kp' Keyword.Pseudo: "bold #004461", # class: 'kp'
Keyword.Reserved: "bold #004461", # class: 'kr' Keyword.Reserved: "bold #004461", # class: 'kr'
Keyword.Type: "bold #004461", # class: 'kt' Keyword.Type: "bold #004461", # class: 'kt'
Operator: "#582800", # class: 'o' Operator: "#582800", # class: 'o'
Operator.Word: "bold #004461", # class: 'ow' - like keywords Operator.Word: "bold #004461", # class: 'ow' - like keywords
Punctuation: "bold #000000", # class: 'p' Punctuation: "bold #000000", # class: 'p'
# because special names such as Name.Class, Name.Function, etc. # because special names such as Name.Class, Name.Function, etc.
# are not recognized as such later in the parsing, we choose them # are not recognized as such later in the parsing, we choose them
# to look the same as ordinary variables. # to look the same as ordinary variables.
@ -53,12 +60,9 @@ class FlaskyStyle(Style):
Name.Variable.Class: "#000000", # class: 'vc' - to be revised Name.Variable.Class: "#000000", # class: 'vc' - to be revised
Name.Variable.Global: "#000000", # class: 'vg' - to be revised Name.Variable.Global: "#000000", # class: 'vg' - to be revised
Name.Variable.Instance: "#000000", # class: 'vi' - to be revised Name.Variable.Instance: "#000000", # class: 'vi' - to be revised
Number: "#990000", # class: 'm' Number: "#990000", # class: 'm'
Literal: "#000000", # class: 'l' Literal: "#000000", # class: 'l'
Literal.Date: "#000000", # class: 'ld' Literal.Date: "#000000", # class: 'ld'
String: "#4e9a06", # class: 's' String: "#4e9a06", # class: 's'
String.Backtick: "#4e9a06", # class: 'sb' String.Backtick: "#4e9a06", # class: 'sb'
String.Char: "#4e9a06", # class: 'sc' String.Char: "#4e9a06", # class: 'sc'
@ -71,7 +75,6 @@ class FlaskyStyle(Style):
String.Regex: "#4e9a06", # class: 'sr' String.Regex: "#4e9a06", # class: 'sr'
String.Single: "#4e9a06", # class: 's1' String.Single: "#4e9a06", # class: 's1'
String.Symbol: "#4e9a06", # class: 'ss' String.Symbol: "#4e9a06", # class: 'ss'
Generic: "#000000", # class: 'g' Generic: "#000000", # class: 'g'
Generic.Deleted: "#a40000", # class: 'gd' Generic.Deleted: "#a40000", # class: 'gd'
Generic.Emph: "italic #000000", # class: 'ge' Generic.Emph: "italic #000000", # class: 'ge'

View File

@ -22,8 +22,8 @@ import sys
# sys.path.insert(0, os.path.abspath('..')) # sys.path.insert(0, os.path.abspath('..'))
# Insert Camelot's path into the system. # Insert Camelot's path into the system.
sys.path.insert(0, os.path.abspath('..')) sys.path.insert(0, os.path.abspath(".."))
sys.path.insert(0, os.path.abspath('_themes')) sys.path.insert(0, os.path.abspath("_themes"))
import camelot import camelot
@ -38,33 +38,33 @@ import camelot
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones. # ones.
extensions = [ extensions = [
'sphinx.ext.autodoc', "sphinx.ext.autodoc",
'sphinx.ext.napoleon', "sphinx.ext.napoleon",
'sphinx.ext.intersphinx', "sphinx.ext.intersphinx",
'sphinx.ext.todo', "sphinx.ext.todo",
'sphinx.ext.viewcode', "sphinx.ext.viewcode",
] ]
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates'] templates_path = ["_templates"]
# The suffix(es) of source filenames. # The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string: # You can specify multiple suffix as a list of string:
# #
# source_suffix = ['.rst', '.md'] # source_suffix = ['.rst', '.md']
source_suffix = '.rst' source_suffix = ".rst"
# The encoding of source files. # The encoding of source files.
# #
# source_encoding = 'utf-8-sig' # source_encoding = 'utf-8-sig'
# The master toctree document. # The master toctree document.
master_doc = 'index' master_doc = "index"
# General information about the project. # General information about the project.
project = u'Camelot' project = u"Camelot"
copyright = u'2020, Camelot Developers' copyright = u"2020, Camelot Developers"
author = u'Vinayak Mehta' author = u"Vinayak Mehta"
# The version info for the project you're documenting, acts as replacement for # The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the # |version| and |release|, also used in various other places throughout the
@ -94,7 +94,7 @@ language = None
# List of patterns, relative to source directory, that match files and # List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files. # directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path # This patterns also effect to html_static_path and html_extra_path
exclude_patterns = ['_build'] exclude_patterns = ["_build"]
# The reST default role (used for this markup: `text`) to use for all # The reST default role (used for this markup: `text`) to use for all
# documents. # documents.
@ -114,7 +114,7 @@ add_module_names = True
# show_authors = False # show_authors = False
# The name of the Pygments (syntax highlighting) style to use. # The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'flask_theme_support.FlaskyStyle' pygments_style = "flask_theme_support.FlaskyStyle"
# A list of ignored prefixes for module index sorting. # A list of ignored prefixes for module index sorting.
# modindex_common_prefix = [] # modindex_common_prefix = []
@ -130,18 +130,18 @@ todo_include_todos = True
# The theme to use for HTML and HTML Help pages. See the documentation for # The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes. # a list of builtin themes.
html_theme = 'alabaster' html_theme = "alabaster"
# Theme options are theme-specific and customize the look and feel of a theme # Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the # further. For a list of options available for each theme, see the
# documentation. # documentation.
html_theme_options = { html_theme_options = {
'show_powered_by': False, "show_powered_by": False,
'github_user': 'camelot-dev', "github_user": "camelot-dev",
'github_repo': 'camelot', "github_repo": "camelot",
'github_banner': True, "github_banner": True,
'show_related': False, "show_related": False,
'note_bg': '#FFF59C' "note_bg": "#FFF59C",
} }
# Add any paths that contain custom themes here, relative to this directory. # Add any paths that contain custom themes here, relative to this directory.
@ -164,12 +164,12 @@ html_theme_options = {
# The name of an image file (relative to this directory) to use as a favicon of # The name of an image file (relative to this directory) to use as a favicon of
# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large. # pixels large.
html_favicon = '_static/favicon.ico' html_favicon = "_static/favicon.ico"
# Add any paths that contain custom static files (such as style sheets) here, # Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files, # relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css". # so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static'] html_static_path = ["_static"]
# Add any extra paths that contain custom files (such as robots.txt or # Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied # .htaccess) here, relative to this directory. These files are copied
@ -189,10 +189,21 @@ html_use_smartypants = True
# Custom sidebar templates, maps document names to template names. # Custom sidebar templates, maps document names to template names.
html_sidebars = { html_sidebars = {
'index': ['sidebarintro.html', 'relations.html', 'sourcelink.html', "index": [
'searchbox.html', 'hacks.html'], "sidebarintro.html",
'**': ['sidebarlogo.html', 'localtoc.html', 'relations.html', "relations.html",
'sourcelink.html', 'searchbox.html', 'hacks.html'] "sourcelink.html",
"searchbox.html",
"hacks.html",
],
"**": [
"sidebarlogo.html",
"localtoc.html",
"relations.html",
"sourcelink.html",
"searchbox.html",
"hacks.html",
],
} }
# Additional templates that should be rendered to pages, maps page names to # Additional templates that should be rendered to pages, maps page names to
@ -249,7 +260,7 @@ html_show_copyright = True
# html_search_scorer = 'scorer.js' # html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder. # Output file base name for HTML help builder.
htmlhelp_basename = 'Camelotdoc' htmlhelp_basename = "Camelotdoc"
# -- Options for LaTeX output --------------------------------------------- # -- Options for LaTeX output ---------------------------------------------
@ -257,15 +268,12 @@ latex_elements = {
# The paper size ('letterpaper' or 'a4paper'). # The paper size ('letterpaper' or 'a4paper').
# #
# 'papersize': 'letterpaper', # 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt'). # The font size ('10pt', '11pt' or '12pt').
# #
# 'pointsize': '10pt', # 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble. # Additional stuff for the LaTeX preamble.
# #
# 'preamble': '', # 'preamble': '',
# Latex figure (float) alignment # Latex figure (float) alignment
# #
# 'figure_align': 'htbp', # 'figure_align': 'htbp',
@ -275,8 +283,7 @@ latex_elements = {
# (source start file, target name, title, # (source start file, target name, title,
# author, documentclass [howto, manual, or own class]). # author, documentclass [howto, manual, or own class]).
latex_documents = [ latex_documents = [
(master_doc, 'Camelot.tex', u'Camelot Documentation', (master_doc, "Camelot.tex", u"Camelot Documentation", u"Vinayak Mehta", "manual"),
u'Vinayak Mehta', 'manual'),
] ]
# The name of an image file (relative to this directory) to place at the top of # The name of an image file (relative to this directory) to place at the top of
@ -316,10 +323,7 @@ latex_documents = [
# One entry per manual page. List of tuples # One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section). # (source start file, name, description, authors, manual section).
man_pages = [ man_pages = [(master_doc, "Camelot", u"Camelot Documentation", [author], 1)]
(master_doc, 'Camelot', u'Camelot Documentation',
[author], 1)
]
# If true, show URL addresses after external links. # If true, show URL addresses after external links.
# #
@ -332,9 +336,15 @@ man_pages = [
# (source start file, target name, title, author, # (source start file, target name, title, author,
# dir menu entry, description, category) # dir menu entry, description, category)
texinfo_documents = [ texinfo_documents = [
(master_doc, 'Camelot', u'Camelot Documentation', (
author, 'Camelot', 'One line description of project.', master_doc,
'Miscellaneous'), "Camelot",
u"Camelot Documentation",
author,
"Camelot",
"One line description of project.",
"Miscellaneous",
),
] ]
# Documents to append as an appendix to all manuals. # Documents to append as an appendix to all manuals.
@ -356,6 +366,6 @@ texinfo_documents = [
# Example configuration for intersphinx: refer to the Python standard library. # Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = { intersphinx_mapping = {
'https://docs.python.org/2': None, "https://docs.python.org/2": None,
'http://pandas.pydata.org/pandas-docs/stable': None "http://pandas.pydata.org/pandas-docs/stable": None,
} }

View File

@ -6,38 +6,36 @@ from setuptools import find_packages
here = os.path.abspath(os.path.dirname(__file__)) here = os.path.abspath(os.path.dirname(__file__))
about = {} about = {}
with open(os.path.join(here, 'camelot', '__version__.py'), 'r') as f: with open(os.path.join(here, "camelot", "__version__.py"), "r") as f:
exec(f.read(), about) exec(f.read(), about)
with open('README.md', 'r') as f: with open("README.md", "r") as f:
readme = f.read() readme = f.read()
requires = [ requires = [
'chardet>=3.0.4', "chardet>=3.0.4",
'click>=6.7', "click>=6.7",
'numpy>=1.13.3', "numpy>=1.13.3",
'openpyxl>=2.5.8', "openpyxl>=2.5.8",
'pandas>=0.23.4', "pandas>=0.23.4",
'pdfminer.six>=20200726', "pdfminer.six>=20200726",
'PyPDF2>=1.26.0' "PyPDF2>=1.26.0",
] ]
cv_requires = [ cv_requires = ["opencv-python>=3.4.2.17"]
'opencv-python>=3.4.2.17'
]
plot_requires = [ plot_requires = [
'matplotlib>=2.2.3', "matplotlib>=2.2.3",
] ]
dev_requires = [ dev_requires = [
'codecov>=2.0.15', "codecov>=2.0.15",
'pytest>=5.4.3', "pytest>=5.4.3",
'pytest-cov>=2.10.0', "pytest-cov>=2.10.0",
'pytest-mpl>=0.11', "pytest-mpl>=0.11",
'pytest-runner>=5.2', "pytest-runner>=5.2",
'Sphinx>=3.1.2' "Sphinx>=3.1.2",
] ]
all_requires = cv_requires + plot_requires all_requires = cv_requires + plot_requires
@ -45,36 +43,39 @@ dev_requires = dev_requires + all_requires
def setup_package(): def setup_package():
metadata = dict(name=about['__title__'], metadata = dict(
version=about['__version__'], name=about["__title__"],
description=about['__description__'], version=about["__version__"],
description=about["__description__"],
long_description=readme, long_description=readme,
long_description_content_type="text/markdown", long_description_content_type="text/markdown",
url=about['__url__'], url=about["__url__"],
author=about['__author__'], author=about["__author__"],
author_email=about['__author_email__'], author_email=about["__author_email__"],
license=about['__license__'], license=about["__license__"],
packages=find_packages(exclude=('tests',)), packages=find_packages(exclude=("tests",)),
install_requires=requires, install_requires=requires,
extras_require={ extras_require={
'all': all_requires, "all": all_requires,
'cv': cv_requires, "cv": cv_requires,
'dev': dev_requires, "dev": dev_requires,
'plot': plot_requires "plot": plot_requires,
}, },
entry_points={ entry_points={
'console_scripts': [ "console_scripts": [
'camelot = camelot.cli:cli', "camelot = camelot.cli:cli",
], ],
}, },
classifiers=[ classifiers=[
# Trove classifiers # Trove classifiers
# Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers # Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers
'License :: OSI Approved :: MIT License', "License :: OSI Approved :: MIT License",
'Programming Language :: Python :: 3.6', "Programming Language :: Python :: 3.6",
'Programming Language :: Python :: 3.7', "Programming Language :: Python :: 3.7",
'Programming Language :: Python :: 3.8' "Programming Language :: Python :: 3.8",
]) "Programming Language :: Python :: 3.9",
],
)
try: try:
from setuptools import setup from setuptools import setup
@ -84,5 +85,5 @@ def setup_package():
setup(**metadata) setup(**metadata)
if __name__ == '__main__': if __name__ == "__main__":
setup_package() setup_package()

View File

@ -2800,49 +2800,467 @@ data_stream_layout_kwargs = [
] ]
data_stream_duplicated_text = [ data_stream_duplicated_text = [
['', '2012 BETTER VARIETIES Harvest Report for Minnesota Central [ MNCE ]', '', '', '', '', '', '', '', '', [
'ALL SEASON TEST'], "",
['', 'Doug Toreen, Renville County, MN 55310 [ BIRD ISLAND ]', '', '', '', '', '', '', '', '', "2012 BETTER VARIETIES Harvest Report for Minnesota Central [ MNCE ]",
'1.3 - 2.0 MAT. GROUP'], "",
['PREV. CROP/HERB:', 'Corn / Surpass, Roundup', '', '', '', '', '', '', '', '', 'S2MNCE01'], "",
['SOIL DESCRIPTION:', '', 'Canisteo clay loam, mod. well drained, non-irrigated', '', '', '', '', '', '', '', ''], "",
['SOIL CONDITIONS:', '', 'High P, high K, 6.7 pH, 3.9% OM, Low SCN', '', '', '', '', '', '', '', '30" ROW SPACING'], "",
['TILLAGE/CULTIVATION:', 'conventional w/ fall till', '', '', '', '', '', '', '', '', ''], "",
['PEST MANAGEMENT:', 'Roundup twice', '', '', '', '', '', '', '', '', ''], "",
['SEEDED - RATE:', 'May 15', '140 000 /A', '', '', '', '', '', '', 'TOP 30 for YIELD of 63 TESTED', ''], "",
['HARVESTED - STAND:', 'Oct 3', '122 921 /A', '', '', '', '', '', '', 'AVERAGE of (3) REPLICATIONS', ''], "",
['', '', '', '', 'SCN', 'Seed', 'Yield', 'Moisture', 'Lodging', 'Stand', 'Gross'], "ALL SEASON TEST",
['Company/Brand', 'Product/Brand†', 'Technol.†', 'Mat.', 'Resist.', 'Trmt.†', 'Bu/A', '%', '%', '(x 1000)', ],
'Income'], ['Kruger', 'K2 1901', 'RR2Y', '1.9', 'R', 'Ac,PV', '56.4', '7.6', '0', '126.3', '$846'], [
['Stine', '19RA02 §', 'RR2Y', '1.9', 'R', 'CMB', '55.3', '7.6', '0', '120.0', '$830'], "",
['Wensman', 'W 3190NR2', 'RR2Y', '1.9', 'R', 'Ac', '54.5', '7.6', '0', '119.5', '$818'], "Doug Toreen, Renville County, MN 55310 [ BIRD ISLAND ]",
['Hefty', 'H17Y12', 'RR2Y', '1.7', 'MR', 'I', '53.7', '7.7', '0', '124.4', '$806'], "",
['Dyna-Gro', 'S15RY53', 'RR2Y', '1.5', 'R', 'Ac', '53.6', '7.7', '0', '126.8', '$804'], "",
['LG Seeds', 'C2050R2', 'RR2Y', '2.1', 'R', 'Ac', '53.6', '7.7', '0', '123.9', '$804'], "",
['Titan Pro', '19M42', 'RR2Y', '1.9', 'R', 'CMB', '53.6', '7.7', '0', '121.0', '$804'], "",
['Stine', '19RA02 (2) §', 'RR2Y', '1.9', 'R', 'CMB', '53.4', '7.7', '0', '123.9', '$801'], "",
['Asgrow', 'AG1832 §', 'RR2Y', '1.8', 'MR', 'Ac,PV', '52.9', '7.7', '0', '122.0', '$794'], "",
['Prairie Brand', 'PB-1566R2', 'RR2Y', '1.5', 'R', 'CMB', '52.8', '7.7', '0', '122.9', '$792'], "",
['Channel', '1901R2', 'RR2Y', '1.9', 'R', 'Ac,PV', '52.8', '7.6', '0', '123.4', '$791'], "",
['Titan Pro', '20M1', 'RR2Y', '2.0', 'R', 'Am', '52.5', '7.5', '0', '124.4', '$788'], "1.3 - 2.0 MAT. GROUP",
['Kruger', 'K2-2002', 'RR2Y', '2.0', 'R', 'Ac,PV', '52.4', '7.9', '0', '125.4', '$786'], ],
['Channel', '1700R2', 'RR2Y', '1.7', 'R', 'Ac,PV', '52.3', '7.9', '0', '123.9', '$784'], [
['Hefty', 'H16Y11', 'RR2Y', '1.6', 'MR', 'I', '51.4', '7.6', '0', '123.9', '$771'], "PREV. CROP/HERB:",
['Anderson', '162R2Y', 'RR2Y', '1.6', 'R', 'None', '51.3', '7.5', '0', '119.5', '$770'], "Corn / Surpass, Roundup",
['Titan Pro', '15M22', 'RR2Y', '1.5', 'R', 'CMB', '51.3', '7.8', '0', '125.4', '$769'], "",
['Dairyland', 'DSR-1710R2Y', 'RR2Y', '1.7', 'R', 'CMB', '51.3', '7.7', '0', '122.0', '$769'], "",
['Hefty', 'H20R3', 'RR2Y', '2.0', 'MR', 'I', '50.5', '8.2', '0', '121.0', '$757'], "",
['Prairie Brand', 'PB 1743R2', 'RR2Y', '1.7', 'R', 'CMB', '50.2', '7.7', '0', '125.8', '$752'], "",
['Gold Country', '1741', 'RR2Y', '1.7', 'R', 'Ac', '50.1', '7.8', '0', '123.9', '$751'], "",
['Trelay', '20RR43', 'RR2Y', '2.0', 'R', 'Ac,Ex', '49.9', '7.6', '0', '127.8', '$749'], "",
['Hefty', 'H14R3', 'RR2Y', '1.4', 'MR', 'I', '49.7', '7.7', '0', '122.9', '$746'], "",
['Prairie Brand', 'PB-2099NRR2', 'RR2Y', '2.0', 'R', 'CMB', '49.6', '7.8', '0', '126.3', '$743'], "",
['Wensman', 'W 3174NR2', 'RR2Y', '1.7', 'R', 'Ac', '49.3', '7.6', '0', '122.5', '$740'], "S2MNCE01",
['Kruger', 'K2 1602', 'RR2Y', '1.6', 'R', 'Ac,PV', '48.7', '7.6', '0', '125.4', '$731'], ],
['NK Brand', 'S18-C2 §', 'RR2Y', '1.8', 'R', 'CMB', '48.7', '7.7', '0', '126.8', '$731'], [
['Kruger', 'K2 1902', 'RR2Y', '1.9', 'R', 'Ac,PV', '48.7', '7.5', '0', '124.4', '$730'], "SOIL DESCRIPTION:",
['Prairie Brand', 'PB-1823R2', 'RR2Y', '1.8', 'R', 'None', '48.5', '7.6', '0', '121.0', '$727'], "",
['Gold Country', '1541', 'RR2Y', '1.5', 'R', 'Ac', '48.4', '7.6', '0', '110.4', '$726'], "Canisteo clay loam, mod. well drained, non-irrigated",
['', '', '', '', '', 'Test Average =', '47.6', '7.7', '0', '122.9', '$713'], "",
['', '', '', '', '', 'LSD (0.10) =', '5.7', '0.3', 'ns', '37.8', '566.4'] "",
"",
"",
"",
"",
"",
"",
],
[
"SOIL CONDITIONS:",
"",
"High P, high K, 6.7 pH, 3.9% OM, Low SCN",
"",
"",
"",
"",
"",
"",
"",
'30" ROW SPACING',
],
[
"TILLAGE/CULTIVATION:",
"conventional w/ fall till",
"",
"",
"",
"",
"",
"",
"",
"",
"",
],
["PEST MANAGEMENT:", "Roundup twice", "", "", "", "", "", "", "", "", ""],
[
"SEEDED - RATE:",
"May 15",
"140 000 /A",
"",
"",
"",
"",
"",
"",
"TOP 30 for YIELD of 63 TESTED",
"",
],
[
"HARVESTED - STAND:",
"Oct 3",
"122 921 /A",
"",
"",
"",
"",
"",
"",
"AVERAGE of (3) REPLICATIONS",
"",
],
["", "", "", "", "SCN", "Seed", "Yield", "Moisture", "Lodging", "Stand", "Gross"],
[
"Company/Brand",
"Product/Brand†",
"Technol.†",
"Mat.",
"Resist.",
"Trmt.†",
"Bu/A",
"%",
"%",
"(x 1000)",
"Income",
],
[
"Kruger",
"K2 1901",
"RR2Y",
"1.9",
"R",
"Ac,PV",
"56.4",
"7.6",
"0",
"126.3",
"$846",
],
[
"Stine",
"19RA02 §",
"RR2Y",
"1.9",
"R",
"CMB",
"55.3",
"7.6",
"0",
"120.0",
"$830",
],
[
"Wensman",
"W 3190NR2",
"RR2Y",
"1.9",
"R",
"Ac",
"54.5",
"7.6",
"0",
"119.5",
"$818",
],
["Hefty", "H17Y12", "RR2Y", "1.7", "MR", "I", "53.7", "7.7", "0", "124.4", "$806"],
[
"Dyna-Gro",
"S15RY53",
"RR2Y",
"1.5",
"R",
"Ac",
"53.6",
"7.7",
"0",
"126.8",
"$804",
],
[
"LG Seeds",
"C2050R2",
"RR2Y",
"2.1",
"R",
"Ac",
"53.6",
"7.7",
"0",
"123.9",
"$804",
],
[
"Titan Pro",
"19M42",
"RR2Y",
"1.9",
"R",
"CMB",
"53.6",
"7.7",
"0",
"121.0",
"$804",
],
[
"Stine",
"19RA02 (2) §",
"RR2Y",
"1.9",
"R",
"CMB",
"53.4",
"7.7",
"0",
"123.9",
"$801",
],
[
"Asgrow",
"AG1832 §",
"RR2Y",
"1.8",
"MR",
"Ac,PV",
"52.9",
"7.7",
"0",
"122.0",
"$794",
],
[
"Prairie Brand",
"PB-1566R2",
"RR2Y",
"1.5",
"R",
"CMB",
"52.8",
"7.7",
"0",
"122.9",
"$792",
],
[
"Channel",
"1901R2",
"RR2Y",
"1.9",
"R",
"Ac,PV",
"52.8",
"7.6",
"0",
"123.4",
"$791",
],
[
"Titan Pro",
"20M1",
"RR2Y",
"2.0",
"R",
"Am",
"52.5",
"7.5",
"0",
"124.4",
"$788",
],
[
"Kruger",
"K2-2002",
"RR2Y",
"2.0",
"R",
"Ac,PV",
"52.4",
"7.9",
"0",
"125.4",
"$786",
],
[
"Channel",
"1700R2",
"RR2Y",
"1.7",
"R",
"Ac,PV",
"52.3",
"7.9",
"0",
"123.9",
"$784",
],
["Hefty", "H16Y11", "RR2Y", "1.6", "MR", "I", "51.4", "7.6", "0", "123.9", "$771"],
[
"Anderson",
"162R2Y",
"RR2Y",
"1.6",
"R",
"None",
"51.3",
"7.5",
"0",
"119.5",
"$770",
],
[
"Titan Pro",
"15M22",
"RR2Y",
"1.5",
"R",
"CMB",
"51.3",
"7.8",
"0",
"125.4",
"$769",
],
[
"Dairyland",
"DSR-1710R2Y",
"RR2Y",
"1.7",
"R",
"CMB",
"51.3",
"7.7",
"0",
"122.0",
"$769",
],
["Hefty", "H20R3", "RR2Y", "2.0", "MR", "I", "50.5", "8.2", "0", "121.0", "$757"],
[
"Prairie Brand",
"PB 1743R2",
"RR2Y",
"1.7",
"R",
"CMB",
"50.2",
"7.7",
"0",
"125.8",
"$752",
],
[
"Gold Country",
"1741",
"RR2Y",
"1.7",
"R",
"Ac",
"50.1",
"7.8",
"0",
"123.9",
"$751",
],
[
"Trelay",
"20RR43",
"RR2Y",
"2.0",
"R",
"Ac,Ex",
"49.9",
"7.6",
"0",
"127.8",
"$749",
],
["Hefty", "H14R3", "RR2Y", "1.4", "MR", "I", "49.7", "7.7", "0", "122.9", "$746"],
[
"Prairie Brand",
"PB-2099NRR2",
"RR2Y",
"2.0",
"R",
"CMB",
"49.6",
"7.8",
"0",
"126.3",
"$743",
],
[
"Wensman",
"W 3174NR2",
"RR2Y",
"1.7",
"R",
"Ac",
"49.3",
"7.6",
"0",
"122.5",
"$740",
],
[
"Kruger",
"K2 1602",
"RR2Y",
"1.6",
"R",
"Ac,PV",
"48.7",
"7.6",
"0",
"125.4",
"$731",
],
[
"NK Brand",
"S18-C2 §",
"RR2Y",
"1.8",
"R",
"CMB",
"48.7",
"7.7",
"0",
"126.8",
"$731",
],
[
"Kruger",
"K2 1902",
"RR2Y",
"1.9",
"R",
"Ac,PV",
"48.7",
"7.5",
"0",
"124.4",
"$730",
],
[
"Prairie Brand",
"PB-1823R2",
"RR2Y",
"1.8",
"R",
"None",
"48.5",
"7.6",
"0",
"121.0",
"$727",
],
[
"Gold Country",
"1541",
"RR2Y",
"1.5",
"R",
"Ac",
"48.4",
"7.6",
"0",
"110.4",
"$726",
],
["", "", "", "", "", "Test Average =", "47.6", "7.7", "0", "122.9", "$713"],
["", "", "", "", "", "LSD (0.10) =", "5.7", "0.3", "ns", "37.8", "566.4"],
] ]