From c405e23b9d0584e988a35f1d8054b4053d3ac4cf Mon Sep 17 00:00:00 2001 From: Emran Shafaq Date: Thu, 23 Mar 2017 21:04:45 -0500 Subject: [PATCH 1/2] Added newer frontend files --- .../static/sweBootstrap/about.html | 81 +++--- .../static/sweBootstrap/albumsTable.html | 65 ++--- .../static/sweBootstrap/artistTable.html | 64 ++--- .../static/sweBootstrap/b52AlbumPage.html | 66 ++--- .../static/sweBootstrap/b52ArtistPage.html | 67 ++--- .../static/sweBootstrap/b52Concert2Page.html | 66 ++--- .../static/sweBootstrap/b52ConcertPage.html | 66 ++--- .../static/sweBootstrap/b52TrackPage.html | 66 ++--- .../sweBootstrap/coldplayAlbumPage.html | 66 ++--- .../sweBootstrap/coldplayArtistPage.html | 66 ++--- .../sweBootstrap/coldplayConcertPage.html | 66 ++--- .../sweBootstrap/coldplayTrackPage.html | 73 +++--- .../static/sweBootstrap/concertsTable.html | 63 ++--- src/application/static/sweBootstrap/home.html | 16 +- .../static/sweBootstrap/queenAlbumPage.html | 66 ++--- .../static/sweBootstrap/queenArtistPage.html | 66 ++--- .../static/sweBootstrap/queenTrackPage.html | 66 ++--- .../sweBootstrap/resources/css/artistPO.css | 2 - .../resources/css/landing-page.css | 12 +- .../sweBootstrap/resources/css/navBar.css | 247 ++++++++++++++++++ .../sweBootstrap/resources/css/pagePO.css | 1 - .../sweBootstrap/resources/css/sweStyle.css | 18 +- .../static/sweBootstrap/tracksTable.html | 64 ++--- 23 files changed, 751 insertions(+), 682 deletions(-) create mode 100644 src/application/static/sweBootstrap/resources/css/navBar.css diff --git a/src/application/static/sweBootstrap/about.html b/src/application/static/sweBootstrap/about.html index 57c1c53..7241f5f 100644 --- a/src/application/static/sweBootstrap/about.html +++ b/src/application/static/sweBootstrap/about.html @@ -11,54 +11,43 @@ + + - + +
-
+

Meet BoSWEmian Rhapsody.

@@ -188,6 +177,18 @@

Tools

+
+
+
+
+
+
+

Technical Report

+ +
+
+
+
diff --git a/src/application/static/sweBootstrap/albumsTable.html b/src/application/static/sweBootstrap/albumsTable.html index 68ffd5f..a1a7c4b 100644 --- a/src/application/static/sweBootstrap/albumsTable.html +++ b/src/application/static/sweBootstrap/albumsTable.html @@ -16,7 +16,7 @@ - + @@ -33,45 +33,32 @@ - +
diff --git a/src/application/static/sweBootstrap/artistTable.html b/src/application/static/sweBootstrap/artistTable.html index ff48963..3b7dace 100644 --- a/src/application/static/sweBootstrap/artistTable.html +++ b/src/application/static/sweBootstrap/artistTable.html @@ -16,6 +16,7 @@ + @@ -33,45 +34,32 @@ -
+ + +
diff --git a/src/application/static/sweBootstrap/b52AlbumPage.html b/src/application/static/sweBootstrap/b52AlbumPage.html index 80dbef6..654f156 100644 --- a/src/application/static/sweBootstrap/b52AlbumPage.html +++ b/src/application/static/sweBootstrap/b52AlbumPage.html @@ -14,50 +14,38 @@ + - + +
diff --git a/src/application/static/sweBootstrap/b52ArtistPage.html b/src/application/static/sweBootstrap/b52ArtistPage.html index cda25ca..5bcbfea 100644 --- a/src/application/static/sweBootstrap/b52ArtistPage.html +++ b/src/application/static/sweBootstrap/b52ArtistPage.html @@ -13,50 +13,39 @@ + + - + +
diff --git a/src/application/static/sweBootstrap/b52Concert2Page.html b/src/application/static/sweBootstrap/b52Concert2Page.html index 41aa3cc..02390e7 100644 --- a/src/application/static/sweBootstrap/b52Concert2Page.html +++ b/src/application/static/sweBootstrap/b52Concert2Page.html @@ -14,50 +14,38 @@ + - + +
diff --git a/src/application/static/sweBootstrap/b52ConcertPage.html b/src/application/static/sweBootstrap/b52ConcertPage.html index c74f44d..3be7e87 100644 --- a/src/application/static/sweBootstrap/b52ConcertPage.html +++ b/src/application/static/sweBootstrap/b52ConcertPage.html @@ -14,50 +14,38 @@ + - + +
diff --git a/src/application/static/sweBootstrap/b52TrackPage.html b/src/application/static/sweBootstrap/b52TrackPage.html index 1322956..9ce1622 100644 --- a/src/application/static/sweBootstrap/b52TrackPage.html +++ b/src/application/static/sweBootstrap/b52TrackPage.html @@ -14,50 +14,38 @@ + - + +
diff --git a/src/application/static/sweBootstrap/coldplayAlbumPage.html b/src/application/static/sweBootstrap/coldplayAlbumPage.html index 6c8f234..20507ec 100644 --- a/src/application/static/sweBootstrap/coldplayAlbumPage.html +++ b/src/application/static/sweBootstrap/coldplayAlbumPage.html @@ -14,50 +14,38 @@ + - + +
diff --git a/src/application/static/sweBootstrap/coldplayArtistPage.html b/src/application/static/sweBootstrap/coldplayArtistPage.html index f465b18..8a827e6 100644 --- a/src/application/static/sweBootstrap/coldplayArtistPage.html +++ b/src/application/static/sweBootstrap/coldplayArtistPage.html @@ -14,50 +14,38 @@ + - + +
diff --git a/src/application/static/sweBootstrap/coldplayConcertPage.html b/src/application/static/sweBootstrap/coldplayConcertPage.html index b38a59a..885f1b7 100644 --- a/src/application/static/sweBootstrap/coldplayConcertPage.html +++ b/src/application/static/sweBootstrap/coldplayConcertPage.html @@ -14,50 +14,38 @@ + - + +
diff --git a/src/application/static/sweBootstrap/coldplayTrackPage.html b/src/application/static/sweBootstrap/coldplayTrackPage.html index 3766269..fb2969c 100644 --- a/src/application/static/sweBootstrap/coldplayTrackPage.html +++ b/src/application/static/sweBootstrap/coldplayTrackPage.html @@ -10,54 +10,41 @@ BoSWEmian Rhapsody - - + + - + +
@@ -113,11 +100,11 @@

Artists

-
+

Coldplay


- +
diff --git a/src/application/static/sweBootstrap/concertsTable.html b/src/application/static/sweBootstrap/concertsTable.html index 3a5a41f..7e58cb5 100644 --- a/src/application/static/sweBootstrap/concertsTable.html +++ b/src/application/static/sweBootstrap/concertsTable.html @@ -17,6 +17,7 @@ + @@ -34,44 +35,32 @@ -
+ + +
diff --git a/src/application/static/sweBootstrap/home.html b/src/application/static/sweBootstrap/home.html index 8010652..e6ba044 100644 --- a/src/application/static/sweBootstrap/home.html +++ b/src/application/static/sweBootstrap/home.html @@ -56,17 +56,19 @@
  • Hello! This is
    BoSWE
    -
    We do music stuff, and it's pretty cool tbh.
    -
    Come watch us crash Spotify's servers!
    - +
    Designed with simplicity in mind.
    +
    To sate your every musical desire.
    +
  • -
    We are BoSWE
    -
    We're honestly pretty cool, we promise.
    +
    Craving a certain song?
    +
    We'll deliver it straight to your ears.
    +
  • -
    We are BoSWE
    -
    We're honestly pretty cool, we promise.
    +
    Hungry for a particular Artist?
    +
    We have the finest selections prepared.
    +
  • diff --git a/src/application/static/sweBootstrap/queenAlbumPage.html b/src/application/static/sweBootstrap/queenAlbumPage.html index 62c34a2..a3c4e44 100644 --- a/src/application/static/sweBootstrap/queenAlbumPage.html +++ b/src/application/static/sweBootstrap/queenAlbumPage.html @@ -14,50 +14,38 @@ + - + +
    diff --git a/src/application/static/sweBootstrap/queenArtistPage.html b/src/application/static/sweBootstrap/queenArtistPage.html index 2c518b6..eac6542 100644 --- a/src/application/static/sweBootstrap/queenArtistPage.html +++ b/src/application/static/sweBootstrap/queenArtistPage.html @@ -14,50 +14,38 @@ + - + +
    diff --git a/src/application/static/sweBootstrap/queenTrackPage.html b/src/application/static/sweBootstrap/queenTrackPage.html index 316a362..c19b0fe 100644 --- a/src/application/static/sweBootstrap/queenTrackPage.html +++ b/src/application/static/sweBootstrap/queenTrackPage.html @@ -14,50 +14,38 @@ + - + +
    diff --git a/src/application/static/sweBootstrap/resources/css/artistPO.css b/src/application/static/sweBootstrap/resources/css/artistPO.css index 58a4422..4c87d47 100644 --- a/src/application/static/sweBootstrap/resources/css/artistPO.css +++ b/src/application/static/sweBootstrap/resources/css/artistPO.css @@ -51,9 +51,7 @@ .artistInfoCoverImg { min-height: 300px; min-width: 100%; - max-height: 300px; - background-size: cover; background: url(http://az616578.vo.msecnd.net/files/2016/08/01/636056495668781938-884755758_coldplay.jpg) no-repeat center center; background-size: cover; diff --git a/src/application/static/sweBootstrap/resources/css/landing-page.css b/src/application/static/sweBootstrap/resources/css/landing-page.css index 901de8f..e6d4132 100644 --- a/src/application/static/sweBootstrap/resources/css/landing-page.css +++ b/src/application/static/sweBootstrap/resources/css/landing-page.css @@ -4,13 +4,17 @@ * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE) */ -body, +body { + background: #333; +}, html { width: 100%; height: 100%; } -body, +body { + background: #333; +}, h1 { text-shadow: 1px 1px 1px #ccc; }, @@ -181,7 +185,7 @@ h6 { footer { padding: 50px 0; background-color: #f8f8f8; - background-image: url('../images/vertical-wood-bg.jpg'); + background-image: url('../images/subtle-grid-bg.jpg'); } p.copyright { @@ -431,7 +435,7 @@ html { overflow-y:scroll; } } .aboutTitle { font-family: cagliostro; - font-size: 3em; + font-size: 4em; text-align: center; color: #FFF; text-shadow: 3px 3px 0px #000; diff --git a/src/application/static/sweBootstrap/resources/css/navBar.css b/src/application/static/sweBootstrap/resources/css/navBar.css new file mode 100644 index 0000000..613e5f9 --- /dev/null +++ b/src/application/static/sweBootstrap/resources/css/navBar.css @@ -0,0 +1,247 @@ +.navbar { + z-index: 9998; + border: 0; + border-radius: 0; + min-height: inherit; + width: 100%; + position: fixed; + top: 0; + left: 0; + padding: 0; + margin: 0; + background: rgba(31,33,36,0.45); + box-shadow: none; +} +.navbar.light { + background: rgba(255,255,255,0.85); +} +.no-intro-img .navbar { + background: #1f2124; +} +.navbar.solid, +.navbar.no-opacity { + background: #1f2124; +} +.no-intro-img .navbar.light, +.navbar.solid.light, +.navbar.no-opacity.light { + background: rgba(255,255,255,1); +} +.navbar.centered { + background: #fcfcfc; +} +.navbar.centered .navbar-collapse { + background: #1f2124; +} +.navbar.light { + box-shadow: 0 1px 0 rgba(0,0,0,0.1) !important; +} +.container>.navbar-header { + margin-left: 0 !important; + margin-right: 0 !important; +} +.landing-page .navbar-header { + width: 100%; +} +.navbar .navbar-brand { + padding: 0; + height: auto; + transition: all 200ms ease-in; + position: relative; + box-shadow: none; + float: left; + margin: 36px 0 !important; +} +.navbar .navbar-brand a { + transition: none +} +.navbar .navbar-collapse { + padding-right: 0; + padding-left: 0; + float: right; + box-shadow: none !important; + border: 0 !important; +} +.navbar .navbar-nav > li { + margin: 0 0 0 38px +} +.navbar .navbar-nav > li > a { + padding: 40px 0px; + font-size: 12px; + font-weight: 800; + letter-spacing: 1px; + text-transform: uppercase; + color: #f0f0f0 !important; +} +.navbar .dropdown-menu { + padding: 0; + margin: 0; + min-width: 150px; + border: none; + background: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border-top: 1px solid #2e3033; +} +.navbar .dropdown-menu:not(.yamm-dropdown-menu) li { + background: rgba(31,33,36,1); + border: none; + border-top: 1px solid rgba(255,255,255,0.07); +} +.navbar.solid .dropdown-menu:not(.yamm-dropdown-menu) li, +.navbar.no-opacity .dropdown-menu:not(.yamm-dropdown-menu) li { + background: #1f2124; +} +.navbar .dropdown-menu li:first-child { + border: none +} +.navbar .dropdown-menu:not(.yamm-dropdown-menu) li a { + background: none; + border: none; + color: #FFF !important; + padding: 15px 20px 16px; + letter-spacing: 1px; + line-height: 1; + font-size: 11px; + font-weight: 800; + text-transform: uppercase; +} +.navbar .navbar-nav > li > a:focus, +.navbar .nav > li > a:hover, +.navbar .nav > li.current > a { + background: none; + color: #4aa2d1 !important; +} +.navbar .dropdown-menu li a:hover, +.navbar .dropdown-menu li a.active { + padding: 15px 20px 16px; + filter: none; + line-height: 1; + color: #4aa2d1 !important; +} +.navbar .nav .open > a, +.navbar .nav .open > a:hover, +.navbar .nav .open > a:focus { + background: none; + color: #4aa2d1; +} +.navbar .nav > li > .dropdown-menu:after { + display: none +} +.navbar .dropdown-menu > li > a:hover, +.navbar .dropdown-menu > li > a:focus, +.navbar .dropdown-submenu:hover > a, +.navbar .dropdown-submenu:focus > a, +.navbar .dropdown-menu > .active > a, +.navbar .dropdown-menu > .active > a:hover, +.navbar .dropdown-menu > .active > a:focus { + background: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + color: #4aa2d1 +} +.caret { + border-top: 4px solid +} +.navbar.fixed .dropdown-menu:not(.yamm-dropdown-menu) li { + background: rgba(31,33,36,0.95) +} +.btn.responsive-menu { + padding: 7px 0 0 0; + width: 36px; + height: 36px; + margin: 0; + display: none; + text-align: center; + font-size: 15px; +} +.btn.responsive-menu i { + margin: 0 +} +.btn.responsive-menu i:before { + content: '\f0c9'; + font-family: 'fontello'; + display: inline-block; + font-style: normal; + font-weight: normal; + margin-right: 0; + text-align: center; +} +.btn.responsive-menu.opn i:before { + content: '\e819' +} +.navbar .top-bar { + border-bottom: 1px solid rgba(255,255,255,0.07); + color: #ececec; + display: none; +} +.navbar.light .top-bar { + color: #606060; +} +.navbar .top-bar ul { + margin: 0; + padding: 0; + list-style: none; + border-left: 1px solid rgba(255,255,255,0.07); +} +.navbar .top-bar ul li { + display: inline-block; + border-right: 1px solid rgba(255,255,255,0.07); + padding: 10px 15px; + margin: 0; +} +.navbar.light .top-bar, +.navbar.light .top-bar ul, +.navbar.light .top-bar ul li { + border-color: #e1e1e1; +} +.navbar .top-bar ul.social li { + padding: 0; +} +.navbar .top-bar ul.social li a { + padding: 9px 15px; +} +.navbar .top-bar a { + color: inherit; +} +.navbar .top-bar a:hover { + color: #4aa2d1; +} +.navbar .social { + margin: 35px 0 0 0; +} +.navbar ul li a .label { + margin-left: 5px; +} +.navbar li.menu-icon a i.btn-border { + padding: 8px 10px; + font-size: 14px; +} +.navbar li.menu-icon span { + display: none; +} + +.tp-bullets.simplebullets.navbar { border:1px solid #666; border-bottom:1px solid #444; background:url(../assets/boxed_bgtile.png); height:40px; padding:0px 10px; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px } + +.tp-leftarrow.navbar { z-index:100;cursor:pointer; position:relative; background:url(../assets/small_left_boxed.png) no-Repeat top left; width:20px; height:15px; float:left; margin-right:6px; margin-top:12px} + +.tp-rightarrow.navbar { z-index:100;cursor:pointer; position:relative; background:url(../assets/small_right_boxed.png) no-Repeat top left; width:20px; height:15px; float:left; margin-left:6px; margin-top:12px} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background: #358dbc; +} + +.btn, +.vanilla-form label.custom-select span { + background: #4aa2d1; +} \ No newline at end of file diff --git a/src/application/static/sweBootstrap/resources/css/pagePO.css b/src/application/static/sweBootstrap/resources/css/pagePO.css index 2cca76b..64af82c 100644 --- a/src/application/static/sweBootstrap/resources/css/pagePO.css +++ b/src/application/static/sweBootstrap/resources/css/pagePO.css @@ -83,7 +83,6 @@ .artistInfoCoverImg { min-height: 300px; min-width: 100%; - max-height: 300px; } diff --git a/src/application/static/sweBootstrap/resources/css/sweStyle.css b/src/application/static/sweBootstrap/resources/css/sweStyle.css index b73988a..d80e218 100644 --- a/src/application/static/sweBootstrap/resources/css/sweStyle.css +++ b/src/application/static/sweBootstrap/resources/css/sweStyle.css @@ -1,5 +1,13 @@ /* SWE Styles for boSWEmian Rhapsody by Alex Pustilnik and Tracy Nguyen */ +/* Misc */ + +/* Formatting for technical report iframe */ +.technicalReport { + height: 600px; + width: 100%; +} + /* Grids */ /* Outer container for the grid module */ @@ -149,12 +157,13 @@ item-content is visible, and transitions size */ .MartistCellImgContainer > img { width: 100%; height: 100%; + object-fit: cover; } .MartistCellInfoContainer { display: none; - background-color: black; - color: blueviolet; + background-image: url('../images/bg-1.jpg'); + color: grey; position: absolute; height: 100px; width: 50%; @@ -165,8 +174,9 @@ item-content is visible, and transitions size */ /* Inner Artist info formatting */ .artistInfo-title { text-align: center; - font-family: vt323; - font-size: 2em; + font-family: arial; + font-size: 1.5em; + color: #fff; } .artistInfo-description { diff --git a/src/application/static/sweBootstrap/tracksTable.html b/src/application/static/sweBootstrap/tracksTable.html index 159685d..150f1e5 100644 --- a/src/application/static/sweBootstrap/tracksTable.html +++ b/src/application/static/sweBootstrap/tracksTable.html @@ -17,6 +17,7 @@ + @@ -33,45 +34,32 @@ - -
    + + +
    From 98ae7d5eca68a9ab065ff63cb224c3060d27b477 Mon Sep 17 00:00:00 2001 From: Emran Shafaq Date: Fri, 7 Apr 2017 02:21:10 -0500 Subject: [PATCH 2/2] Deployed to GCP, all components connected. --- app.yaml | 3 - app/app.yaml | 21 + app/appengine_config.py | 4 + app/cloud_sql_proxy | Bin 0 -> 11543680 bytes .../Flask-0.12.1.dist-info/DESCRIPTION.rst | 46 + app/lib/Flask-0.12.1.dist-info/LICENSE.txt | 33 + app/lib/Flask-0.12.1.dist-info/METADATA | 75 + app/lib/Flask-0.12.1.dist-info/RECORD | 51 + app/lib/Flask-0.12.1.dist-info/WHEEL | 6 + .../Flask-0.12.1.dist-info/entry_points.txt | 4 + app/lib/Flask-0.12.1.dist-info/metadata.json | 1 + app/lib/Flask-0.12.1.dist-info/top_level.txt | 1 + .../PKG-INFO | 43 + .../SOURCES.txt | 14 + .../dependency_links.txt | 0 .../installed-files.txt | 17 + .../not-zip-safe | 0 .../requires.txt | 4 + .../top_level.txt | 1 + .../DESCRIPTION.rst | 15 + .../LICENSE.txt | 31 + .../Flask_SQLAlchemy-2.2.dist-info/METADATA | 42 + app/lib/Flask_SQLAlchemy-2.2.dist-info/RECORD | 11 + app/lib/Flask_SQLAlchemy-2.2.dist-info/WHEEL | 6 + .../metadata.json | 1 + .../top_level.txt | 1 + .../Jinja2-2.9.6.dist-info/DESCRIPTION.rst | 36 + app/lib/Jinja2-2.9.6.dist-info/LICENSE.txt | 31 + app/lib/Jinja2-2.9.6.dist-info/METADATA | 65 + app/lib/Jinja2-2.9.6.dist-info/RECORD | 58 + app/lib/Jinja2-2.9.6.dist-info/WHEEL | 6 + .../Jinja2-2.9.6.dist-info/entry_points.txt | 4 + app/lib/Jinja2-2.9.6.dist-info/metadata.json | 1 + app/lib/Jinja2-2.9.6.dist-info/top_level.txt | 1 + .../MarkupSafe-1.0-py3.4.egg-info/PKG-INFO | 133 + .../MarkupSafe-1.0-py3.4.egg-info/SOURCES.txt | 18 + .../dependency_links.txt | 1 + .../installed-files.txt | 16 + .../not-zip-safe | 1 + .../top_level.txt | 1 + .../SQLAlchemy-1.1.9-py3.4.egg-info/PKG-INFO | 155 + .../SOURCES.txt | 806 +++ .../dependency_links.txt | 1 + .../installed-files.txt | 387 ++ .../requires.txt | 24 + .../top_level.txt | 1 + .../Werkzeug-0.12.1.dist-info/DESCRIPTION.rst | 54 + app/lib/Werkzeug-0.12.1.dist-info/LICENSE.txt | 29 + app/lib/Werkzeug-0.12.1.dist-info/METADATA | 83 + app/lib/Werkzeug-0.12.1.dist-info/RECORD | 94 + app/lib/Werkzeug-0.12.1.dist-info/WHEEL | 6 + .../Werkzeug-0.12.1.dist-info/metadata.json | 1 + .../Werkzeug-0.12.1.dist-info/top_level.txt | 1 + app/lib/click-6.7.dist-info/DESCRIPTION.rst | 3 + app/lib/click-6.7.dist-info/METADATA | 16 + app/lib/click-6.7.dist-info/RECORD | 40 + app/lib/click-6.7.dist-info/WHEEL | 6 + app/lib/click-6.7.dist-info/metadata.json | 1 + app/lib/click-6.7.dist-info/top_level.txt | 1 + app/lib/click/__init__.py | 98 + app/lib/click/_bashcomplete.py | 83 + app/lib/click/_compat.py | 648 +++ app/lib/click/_termui_impl.py | 547 ++ app/lib/click/_textwrap.py | 38 + app/lib/click/_unicodefun.py | 118 + app/lib/click/_winconsole.py | 273 + app/lib/click/core.py | 1744 +++++++ app/lib/click/decorators.py | 304 ++ app/lib/click/exceptions.py | 201 + app/lib/click/formatting.py | 256 + app/lib/click/globals.py | 48 + app/lib/click/parser.py | 426 ++ app/lib/click/termui.py | 539 ++ app/lib/click/testing.py | 322 ++ app/lib/click/types.py | 550 ++ app/lib/click/utils.py | 415 ++ app/lib/dateutil/__init__.py | 2 + app/lib/dateutil/_common.py | 33 + app/lib/dateutil/easter.py | 89 + app/lib/dateutil/parser.py | 1360 +++++ app/lib/dateutil/relativedelta.py | 531 ++ app/lib/dateutil/rrule.py | 1607 ++++++ app/lib/dateutil/tz/__init__.py | 4 + app/lib/dateutil/tz/_common.py | 380 ++ app/lib/dateutil/tz/tz.py | 1464 ++++++ app/lib/dateutil/tz/win.py | 332 ++ app/lib/dateutil/tzwin.py | 2 + app/lib/dateutil/zoneinfo/__init__.py | 187 + .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 0 -> 139671 bytes app/lib/dateutil/zoneinfo/rebuild.py | 51 + {src => app}/lib/flask/__init__.py | 13 +- app/lib/flask/__main__.py | 15 + {src => app}/lib/flask/_compat.py | 53 +- {src => app}/lib/flask/app.py | 555 ++- {src => app}/lib/flask/blueprints.py | 26 +- app/lib/flask/cli.py | 517 ++ {src => app}/lib/flask/config.py | 117 +- {src => app}/lib/flask/ctx.py | 130 +- {src => app}/lib/flask/debughelpers.py | 74 +- {src => app}/lib/flask/ext/__init__.py | 2 +- {src => app}/lib/flask/exthook.py | 29 +- {src => app}/lib/flask/globals.py | 25 +- {src => app}/lib/flask/helpers.py | 367 +- {src => app}/lib/flask/json.py | 91 +- app/lib/flask/logging.py | 94 + {src => app}/lib/flask/sessions.py | 139 +- {src => app}/lib/flask/signals.py | 9 +- {src => app}/lib/flask/templating.py | 72 +- {src => app}/lib/flask/testing.py | 29 +- {src => app}/lib/flask/views.py | 18 +- {src => app}/lib/flask/wrappers.py | 75 +- app/lib/flask_restless/__init__.py | 26 + app/lib/flask_restless/helpers.py | 687 +++ app/lib/flask_restless/manager.py | 704 +++ app/lib/flask_restless/search.py | 591 +++ app/lib/flask_restless/views.py | 1600 ++++++ app/lib/flask_sqlalchemy/__init__.py | 1036 ++++ app/lib/flask_sqlalchemy/_compat.py | 37 + .../itsdangerous-0.24-py3.4.egg-info/PKG-INFO | 13 + .../SOURCES.txt | 27 + .../dependency_links.txt | 1 + .../installed-files.txt | 8 + .../not-zip-safe | 1 + .../top_level.txt | 1 + {src => app}/lib/itsdangerous.py | 52 +- app/lib/jinja2/__init__.py | 82 + app/lib/jinja2/_compat.py | 99 + app/lib/jinja2/_stringdefs.py | 71 + app/lib/jinja2/asyncfilters.py | 146 + app/lib/jinja2/asyncsupport.py | 254 + app/lib/jinja2/bccache.py | 362 ++ app/lib/jinja2/compiler.py | 1653 +++++++ app/lib/jinja2/constants.py | 32 + app/lib/jinja2/debug.py | 372 ++ app/lib/jinja2/defaults.py | 54 + app/lib/jinja2/environment.py | 1276 +++++ app/lib/jinja2/exceptions.py | 146 + app/lib/jinja2/ext.py | 609 +++ app/lib/jinja2/filters.py | 1073 ++++ app/lib/jinja2/idtracking.py | 273 + app/lib/jinja2/lexer.py | 737 +++ app/lib/jinja2/loaders.py | 481 ++ app/lib/jinja2/meta.py | 106 + app/lib/jinja2/nodes.py | 939 ++++ app/lib/jinja2/optimizer.py | 49 + app/lib/jinja2/parser.py | 898 ++++ app/lib/jinja2/runtime.py | 787 +++ app/lib/jinja2/sandbox.py | 475 ++ app/lib/jinja2/tests.py | 185 + app/lib/jinja2/utils.py | 624 +++ app/lib/jinja2/visitor.py | 87 + app/lib/markupsafe/__init__.py | 305 ++ app/lib/markupsafe/_compat.py | 26 + app/lib/markupsafe/_constants.py | 267 + app/lib/markupsafe/_native.py | 46 + app/lib/markupsafe/_speedups.c | 239 + app/lib/markupsafe/_speedups.so | Bin 0 -> 31080 bytes app/lib/mimeparse.py | 191 + .../mimerender-0.6.0-py3.4.egg-info/PKG-INFO | 25 + .../SOURCES.txt | 8 + .../dependency_links.txt | 1 + .../installed-files.txt | 8 + .../requires.txt | 1 + .../top_level.txt | 1 + app/lib/mimerender.py | 464 ++ .../psycopg2-2.7.1.dist-info/DESCRIPTION.rst | 64 + app/lib/psycopg2-2.7.1.dist-info/INSTALLER | 1 + app/lib/psycopg2-2.7.1.dist-info/METADATA | 96 + app/lib/psycopg2-2.7.1.dist-info/RECORD | 93 + app/lib/psycopg2-2.7.1.dist-info/WHEEL | 9 + .../psycopg2-2.7.1.dist-info/metadata.json | 1 + .../psycopg2-2.7.1.dist-info/top_level.txt | 1 + .../psycopg2/.dylibs/libcrypto.1.0.0.dylib | Bin 0 -> 1995808 bytes app/lib/psycopg2/.dylibs/libpq.5.8.dylib | Bin 0 -> 159072 bytes app/lib/psycopg2/.dylibs/libssl.1.0.0.dylib | Bin 0 -> 373600 bytes app/lib/psycopg2/__init__.py | 134 + app/lib/psycopg2/_ipaddress.py | 89 + app/lib/psycopg2/_json.py | 222 + app/lib/psycopg2/_psycopg.so | Bin 0 -> 466088 bytes app/lib/psycopg2/_range.py | 523 ++ app/lib/psycopg2/errorcodes.py | 420 ++ app/lib/psycopg2/extensions.py | 223 + app/lib/psycopg2/extras.py | 1282 +++++ app/lib/psycopg2/pool.py | 241 + app/lib/psycopg2/psycopg1.py | 96 + app/lib/psycopg2/sql.py | 424 ++ app/lib/psycopg2/tests/__init__.py | 106 + app/lib/psycopg2/tests/dbapi20.py | 872 ++++ app/lib/psycopg2/tests/dbapi20_tpc.py | 144 + app/lib/psycopg2/tests/test_async.py | 458 ++ app/lib/psycopg2/tests/test_async_keyword.py | 221 + app/lib/psycopg2/tests/test_bugX000.py | 46 + app/lib/psycopg2/tests/test_bug_gc.py | 51 + app/lib/psycopg2/tests/test_cancel.py | 117 + app/lib/psycopg2/tests/test_connection.py | 1494 ++++++ app/lib/psycopg2/tests/test_copy.py | 388 ++ app/lib/psycopg2/tests/test_cursor.py | 549 ++ app/lib/psycopg2/tests/test_dates.py | 662 +++ app/lib/psycopg2/tests/test_errcodes.py | 71 + .../psycopg2/tests/test_extras_dictcursor.py | 482 ++ .../psycopg2/tests/test_fast_executemany.py | 242 + app/lib/psycopg2/tests/test_green.py | 119 + app/lib/psycopg2/tests/test_ipaddress.py | 136 + app/lib/psycopg2/tests/test_lobject.py | 518 ++ app/lib/psycopg2/tests/test_module.py | 345 ++ app/lib/psycopg2/tests/test_notify.py | 230 + .../psycopg2/tests/test_psycopg2_dbapi20.py | 87 + app/lib/psycopg2/tests/test_quote.py | 255 + app/lib/psycopg2/tests/test_replication.py | 232 + app/lib/psycopg2/tests/test_sql.py | 376 ++ app/lib/psycopg2/tests/test_transaction.py | 252 + app/lib/psycopg2/tests/test_types_basic.py | 546 ++ app/lib/psycopg2/tests/test_types_extras.py | 1770 +++++++ app/lib/psycopg2/tests/test_with.py | 225 + app/lib/psycopg2/tests/testconfig.py | 42 + app/lib/psycopg2/tests/testutils.py | 488 ++ app/lib/psycopg2/tz.py | 137 + .../DESCRIPTION.rst | 5 + .../python_dateutil-2.6.0.dist-info/METADATA | 31 + .../python_dateutil-2.6.0.dist-info/RECORD | 34 + app/lib/python_dateutil-2.6.0.dist-info/WHEEL | 6 + .../metadata.json | 1 + .../top_level.txt | 1 + .../python_dateutil-2.6.0.dist-info/zip-safe | 1 + .../DESCRIPTION.rst | 65 + .../python_mimeparse-1.6.0.dist-info/METADATA | 85 + .../python_mimeparse-1.6.0.dist-info/RECORD | 8 + .../python_mimeparse-1.6.0.dist-info/WHEEL | 6 + .../metadata.json | 1 + .../top_level.txt | 1 + .../simplejson-3.10.0-py3.4.egg-info/PKG-INFO | 60 + .../SOURCES.txt | 53 + .../dependency_links.txt | 1 + .../installed-files.txt | 82 + .../top_level.txt | 1 + app/lib/simplejson/__init__.py | 575 +++ app/lib/simplejson/_speedups.so | Bin 0 -> 97440 bytes app/lib/simplejson/compat.py | 40 + app/lib/simplejson/decoder.py | 404 ++ app/lib/simplejson/encoder.py | 703 +++ app/lib/simplejson/ordered_dict.py | 119 + app/lib/simplejson/scanner.py | 133 + app/lib/simplejson/tests/__init__.py | 92 + .../simplejson/tests/test_bigint_as_string.py | 67 + .../tests/test_bitsize_int_as_string.py | 73 + .../simplejson/tests/test_check_circular.py | 30 + app/lib/simplejson/tests/test_decimal.py | 71 + app/lib/simplejson/tests/test_decode.py | 99 + app/lib/simplejson/tests/test_default.py | 9 + app/lib/simplejson/tests/test_dump.py | 130 + .../tests/test_encode_basestring_ascii.py | 47 + .../simplejson/tests/test_encode_for_html.py | 30 + app/lib/simplejson/tests/test_errors.py | 51 + app/lib/simplejson/tests/test_fail.py | 176 + app/lib/simplejson/tests/test_float.py | 35 + app/lib/simplejson/tests/test_for_json.py | 97 + app/lib/simplejson/tests/test_indent.py | 86 + .../simplejson/tests/test_item_sort_key.py | 20 + app/lib/simplejson/tests/test_iterable.py | 31 + app/lib/simplejson/tests/test_namedtuple.py | 122 + app/lib/simplejson/tests/test_pass1.py | 71 + app/lib/simplejson/tests/test_pass2.py | 14 + app/lib/simplejson/tests/test_pass3.py | 20 + app/lib/simplejson/tests/test_raw_json.py | 47 + app/lib/simplejson/tests/test_recursion.py | 67 + app/lib/simplejson/tests/test_scanstring.py | 194 + app/lib/simplejson/tests/test_separators.py | 42 + app/lib/simplejson/tests/test_speedups.py | 39 + app/lib/simplejson/tests/test_str_subclass.py | 16 + app/lib/simplejson/tests/test_subclass.py | 37 + app/lib/simplejson/tests/test_tool.py | 97 + app/lib/simplejson/tests/test_tuple.py | 47 + app/lib/simplejson/tests/test_unicode.py | 153 + app/lib/simplejson/tool.py | 42 + app/lib/six-1.10.0.dist-info/DESCRIPTION.rst | 18 + app/lib/six-1.10.0.dist-info/METADATA | 34 + app/lib/six-1.10.0.dist-info/RECORD | 8 + app/lib/six-1.10.0.dist-info/WHEEL | 6 + app/lib/six-1.10.0.dist-info/metadata.json | 1 + app/lib/six-1.10.0.dist-info/top_level.txt | 1 + app/lib/six.py | 868 ++++ app/lib/sqlalchemy/__init__.py | 146 + app/lib/sqlalchemy/connectors/__init__.py | 10 + app/lib/sqlalchemy/connectors/mxodbc.py | 150 + app/lib/sqlalchemy/connectors/pyodbc.py | 196 + app/lib/sqlalchemy/connectors/zxJDBC.py | 60 + app/lib/sqlalchemy/cprocessors.so | Bin 0 -> 41468 bytes app/lib/sqlalchemy/cresultproxy.so | Bin 0 -> 43412 bytes app/lib/sqlalchemy/cutils.so | Bin 0 -> 26140 bytes app/lib/sqlalchemy/databases/__init__.py | 30 + app/lib/sqlalchemy/dialects/__init__.py | 56 + .../sqlalchemy/dialects/firebird/__init__.py | 21 + app/lib/sqlalchemy/dialects/firebird/base.py | 741 +++ app/lib/sqlalchemy/dialects/firebird/fdb.py | 118 + .../dialects/firebird/kinterbasdb.py | 184 + app/lib/sqlalchemy/dialects/mssql/__init__.py | 27 + app/lib/sqlalchemy/dialects/mssql/adodbapi.py | 87 + app/lib/sqlalchemy/dialects/mssql/base.py | 2064 ++++++++ .../dialects/mssql/information_schema.py | 136 + app/lib/sqlalchemy/dialects/mssql/mxodbc.py | 139 + app/lib/sqlalchemy/dialects/mssql/pymssql.py | 97 + app/lib/sqlalchemy/dialects/mssql/pyodbc.py | 292 ++ app/lib/sqlalchemy/dialects/mssql/zxjdbc.py | 69 + app/lib/sqlalchemy/dialects/mysql/__init__.py | 31 + app/lib/sqlalchemy/dialects/mysql/base.py | 2056 ++++++++ app/lib/sqlalchemy/dialects/mysql/cymysql.py | 87 + .../sqlalchemy/dialects/mysql/enumerated.py | 311 ++ app/lib/sqlalchemy/dialects/mysql/gaerdbms.py | 102 + app/lib/sqlalchemy/dialects/mysql/json.py | 79 + .../dialects/mysql/mysqlconnector.py | 203 + app/lib/sqlalchemy/dialects/mysql/mysqldb.py | 228 + app/lib/sqlalchemy/dialects/mysql/oursql.py | 254 + app/lib/sqlalchemy/dialects/mysql/pymysql.py | 70 + app/lib/sqlalchemy/dialects/mysql/pyodbc.py | 79 + .../sqlalchemy/dialects/mysql/reflection.py | 450 ++ app/lib/sqlalchemy/dialects/mysql/types.py | 766 +++ app/lib/sqlalchemy/dialects/mysql/zxjdbc.py | 117 + .../sqlalchemy/dialects/oracle/__init__.py | 24 + app/lib/sqlalchemy/dialects/oracle/base.py | 1602 ++++++ .../sqlalchemy/dialects/oracle/cx_oracle.py | 1020 ++++ app/lib/sqlalchemy/dialects/oracle/zxjdbc.py | 235 + .../dialects/postgresql/__init__.py | 36 + .../sqlalchemy/dialects/postgresql/array.py | 314 ++ .../sqlalchemy/dialects/postgresql/base.py | 2989 +++++++++++ app/lib/sqlalchemy/dialects/postgresql/dml.py | 213 + app/lib/sqlalchemy/dialects/postgresql/ext.py | 218 + .../sqlalchemy/dialects/postgresql/hstore.py | 420 ++ .../sqlalchemy/dialects/postgresql/json.py | 301 ++ .../sqlalchemy/dialects/postgresql/pg8000.py | 265 + .../dialects/postgresql/psycopg2.py | 702 +++ .../dialects/postgresql/psycopg2cffi.py | 61 + .../dialects/postgresql/pygresql.py | 243 + .../dialects/postgresql/pypostgresql.py | 97 + .../sqlalchemy/dialects/postgresql/ranges.py | 168 + .../sqlalchemy/dialects/postgresql/zxjdbc.py | 46 + .../sqlalchemy/dialects/sqlite/__init__.py | 20 + app/lib/sqlalchemy/dialects/sqlite/base.py | 1577 ++++++ .../sqlalchemy/dialects/sqlite/pysqlcipher.py | 130 + .../sqlalchemy/dialects/sqlite/pysqlite.py | 377 ++ .../sqlalchemy/dialects/sybase/__init__.py | 28 + app/lib/sqlalchemy/dialects/sybase/base.py | 821 +++ app/lib/sqlalchemy/dialects/sybase/mxodbc.py | 33 + app/lib/sqlalchemy/dialects/sybase/pyodbc.py | 86 + .../sqlalchemy/dialects/sybase/pysybase.py | 102 + app/lib/sqlalchemy/engine/__init__.py | 434 ++ app/lib/sqlalchemy/engine/base.py | 2207 +++++++++ app/lib/sqlalchemy/engine/default.py | 1119 +++++ app/lib/sqlalchemy/engine/interfaces.py | 1286 +++++ app/lib/sqlalchemy/engine/reflection.py | 843 ++++ app/lib/sqlalchemy/engine/result.py | 1435 ++++++ app/lib/sqlalchemy/engine/strategies.py | 283 ++ app/lib/sqlalchemy/engine/threadlocal.py | 138 + app/lib/sqlalchemy/engine/url.py | 261 + app/lib/sqlalchemy/engine/util.py | 74 + app/lib/sqlalchemy/event/__init__.py | 11 + app/lib/sqlalchemy/event/api.py | 188 + app/lib/sqlalchemy/event/attr.py | 373 ++ app/lib/sqlalchemy/event/base.py | 289 ++ app/lib/sqlalchemy/event/legacy.py | 169 + app/lib/sqlalchemy/event/registry.py | 262 + app/lib/sqlalchemy/events.py | 1173 +++++ app/lib/sqlalchemy/exc.py | 388 ++ app/lib/sqlalchemy/ext/__init__.py | 11 + app/lib/sqlalchemy/ext/associationproxy.py | 1068 ++++ app/lib/sqlalchemy/ext/automap.py | 1048 ++++ app/lib/sqlalchemy/ext/baked.py | 559 +++ app/lib/sqlalchemy/ext/compiler.py | 474 ++ .../sqlalchemy/ext/declarative/__init__.py | 18 + app/lib/sqlalchemy/ext/declarative/api.py | 696 +++ app/lib/sqlalchemy/ext/declarative/base.py | 662 +++ .../sqlalchemy/ext/declarative/clsregistry.py | 328 ++ app/lib/sqlalchemy/ext/horizontal_shard.py | 131 + app/lib/sqlalchemy/ext/hybrid.py | 841 ++++ app/lib/sqlalchemy/ext/indexable.py | 349 ++ app/lib/sqlalchemy/ext/instrumentation.py | 414 ++ app/lib/sqlalchemy/ext/mutable.py | 904 ++++ app/lib/sqlalchemy/ext/orderinglist.py | 380 ++ app/lib/sqlalchemy/ext/serializer.py | 159 + app/lib/sqlalchemy/inspection.py | 93 + app/lib/sqlalchemy/interfaces.py | 312 ++ app/lib/sqlalchemy/log.py | 217 + app/lib/sqlalchemy/orm/__init__.py | 276 ++ app/lib/sqlalchemy/orm/attributes.py | 1617 ++++++ app/lib/sqlalchemy/orm/base.py | 540 ++ app/lib/sqlalchemy/orm/collections.py | 1552 ++++++ app/lib/sqlalchemy/orm/dependency.py | 1175 +++++ .../sqlalchemy/orm/deprecated_interfaces.py | 487 ++ app/lib/sqlalchemy/orm/descriptor_props.py | 699 +++ app/lib/sqlalchemy/orm/dynamic.py | 367 ++ app/lib/sqlalchemy/orm/evaluator.py | 137 + app/lib/sqlalchemy/orm/events.py | 2187 ++++++++ app/lib/sqlalchemy/orm/exc.py | 165 + app/lib/sqlalchemy/orm/identity.py | 321 ++ app/lib/sqlalchemy/orm/instrumentation.py | 528 ++ app/lib/sqlalchemy/orm/interfaces.py | 655 +++ app/lib/sqlalchemy/orm/loading.py | 703 +++ app/lib/sqlalchemy/orm/mapper.py | 3007 +++++++++++ app/lib/sqlalchemy/orm/path_registry.py | 271 + app/lib/sqlalchemy/orm/persistence.py | 1460 ++++++ app/lib/sqlalchemy/orm/properties.py | 277 ++ app/lib/sqlalchemy/orm/query.py | 4187 ++++++++++++++++ app/lib/sqlalchemy/orm/relationships.py | 2875 +++++++++++ app/lib/sqlalchemy/orm/scoping.py | 184 + app/lib/sqlalchemy/orm/session.py | 2970 +++++++++++ app/lib/sqlalchemy/orm/state.py | 847 ++++ app/lib/sqlalchemy/orm/strategies.py | 1707 +++++++ app/lib/sqlalchemy/orm/strategy_options.py | 1106 +++++ app/lib/sqlalchemy/orm/sync.py | 140 + app/lib/sqlalchemy/orm/unitofwork.py | 672 +++ app/lib/sqlalchemy/orm/util.py | 1058 ++++ app/lib/sqlalchemy/pool.py | 1445 ++++++ app/lib/sqlalchemy/processors.py | 155 + app/lib/sqlalchemy/schema.py | 66 + app/lib/sqlalchemy/sql/__init__.py | 98 + app/lib/sqlalchemy/sql/annotation.py | 203 + app/lib/sqlalchemy/sql/base.py | 633 +++ app/lib/sqlalchemy/sql/compiler.py | 3034 ++++++++++++ app/lib/sqlalchemy/sql/crud.py | 692 +++ app/lib/sqlalchemy/sql/ddl.py | 1100 ++++ app/lib/sqlalchemy/sql/default_comparator.py | 308 ++ app/lib/sqlalchemy/sql/dml.py | 851 ++++ app/lib/sqlalchemy/sql/elements.py | 4403 +++++++++++++++++ app/lib/sqlalchemy/sql/expression.py | 144 + app/lib/sqlalchemy/sql/functions.py | 813 +++ app/lib/sqlalchemy/sql/naming.py | 146 + app/lib/sqlalchemy/sql/operators.py | 1014 ++++ app/lib/sqlalchemy/sql/schema.py | 4027 +++++++++++++++ app/lib/sqlalchemy/sql/selectable.py | 3716 ++++++++++++++ app/lib/sqlalchemy/sql/sqltypes.py | 2619 ++++++++++ app/lib/sqlalchemy/sql/type_api.py | 1307 +++++ app/lib/sqlalchemy/sql/util.py | 762 +++ app/lib/sqlalchemy/sql/visitors.py | 328 ++ app/lib/sqlalchemy/testing/__init__.py | 36 + app/lib/sqlalchemy/testing/assertions.py | 520 ++ app/lib/sqlalchemy/testing/assertsql.py | 377 ++ app/lib/sqlalchemy/testing/config.py | 97 + app/lib/sqlalchemy/testing/engines.py | 349 ++ app/lib/sqlalchemy/testing/entities.py | 101 + app/lib/sqlalchemy/testing/exclusions.py | 443 ++ app/lib/sqlalchemy/testing/fixtures.py | 386 ++ app/lib/sqlalchemy/testing/mock.py | 21 + app/lib/sqlalchemy/testing/pickleable.py | 143 + .../sqlalchemy/testing/plugin}/__init__.py | 0 .../sqlalchemy/testing/plugin/bootstrap.py | 44 + .../sqlalchemy/testing/plugin/noseplugin.py | 107 + .../sqlalchemy/testing/plugin/plugin_base.py | 565 +++ .../sqlalchemy/testing/plugin/pytestplugin.py | 194 + app/lib/sqlalchemy/testing/profiling.py | 265 + app/lib/sqlalchemy/testing/provision.py | 318 ++ app/lib/sqlalchemy/testing/replay_fixture.py | 172 + app/lib/sqlalchemy/testing/requirements.py | 800 +++ app/lib/sqlalchemy/testing/runner.py | 50 + app/lib/sqlalchemy/testing/schema.py | 101 + app/lib/sqlalchemy/testing/suite/__init__.py | 10 + app/lib/sqlalchemy/testing/suite/test_ddl.py | 65 + .../sqlalchemy/testing/suite/test_dialect.py | 41 + .../sqlalchemy/testing/suite/test_insert.py | 319 ++ .../testing/suite/test_reflection.py | 746 +++ .../sqlalchemy/testing/suite/test_results.py | 367 ++ .../sqlalchemy/testing/suite/test_select.py | 312 ++ .../sqlalchemy/testing/suite/test_sequence.py | 126 + .../sqlalchemy/testing/suite/test_types.py | 898 ++++ .../testing/suite/test_update_delete.py | 63 + app/lib/sqlalchemy/testing/util.py | 280 ++ app/lib/sqlalchemy/testing/warnings.py | 41 + app/lib/sqlalchemy/types.py | 81 + app/lib/sqlalchemy/util/__init__.py | 49 + app/lib/sqlalchemy/util/_collections.py | 1045 ++++ app/lib/sqlalchemy/util/compat.py | 269 + app/lib/sqlalchemy/util/deprecations.py | 146 + app/lib/sqlalchemy/util/langhelpers.py | 1419 ++++++ app/lib/sqlalchemy/util/queue.py | 199 + app/lib/sqlalchemy/util/topological.py | 100 + .../DESCRIPTION.rst | 66 + app/lib/virtualenv-15.1.0.dist-info/METADATA | 87 + app/lib/virtualenv-15.1.0.dist-info/RECORD | 16 + app/lib/virtualenv-15.1.0.dist-info/WHEEL | 6 + .../entry_points.txt | 3 + .../virtualenv-15.1.0.dist-info/metadata.json | 1 + .../virtualenv-15.1.0.dist-info/top_level.txt | 2 + app/lib/virtualenv.py | 2332 +++++++++ .../lib/virtualenv_support}/__init__.py | 0 .../argparse-1.4.0-py2.py3-none-any.whl | Bin 0 -> 23000 bytes .../pip-9.0.1-py2.py3-none-any.whl | Bin 0 -> 1254803 bytes .../setuptools-28.8.0-py2.py3-none-any.whl | Bin 0 -> 472830 bytes .../wheel-0.29.0-py2.py3-none-any.whl | Bin 0 -> 66878 bytes app/lib/werkzeug/__init__.py | 151 + app/lib/werkzeug/_compat.py | 206 + {src => app}/lib/werkzeug/_internal.py | 361 +- app/lib/werkzeug/_reloader.py | 267 + {src => app}/lib/werkzeug/contrib/__init__.py | 2 +- {src => app}/lib/werkzeug/contrib/atom.py | 66 +- {src => app}/lib/werkzeug/contrib/cache.py | 540 +- {src => app}/lib/werkzeug/contrib/fixers.py | 60 +- {src => app}/lib/werkzeug/contrib/iterio.py | 129 +- .../lib/werkzeug/contrib/jsrouting.py | 17 +- {src => app}/lib/werkzeug/contrib/limiter.py | 7 +- {src => app}/lib/werkzeug/contrib/lint.py | 30 +- {src => app}/lib/werkzeug/contrib/profiler.py | 51 +- .../lib/werkzeug/contrib/securecookie.py | 79 +- {src => app}/lib/werkzeug/contrib/sessions.py | 46 +- .../lib/werkzeug/contrib/testtools.py | 6 +- {src => app}/lib/werkzeug/contrib/wrappers.py | 31 +- {src => app}/lib/werkzeug/datastructures.py | 635 ++- app/lib/werkzeug/debug/__init__.py | 466 ++ {src => app}/lib/werkzeug/debug/console.py | 17 +- {src => app}/lib/werkzeug/debug/repr.py | 55 +- .../lib/werkzeug/debug/shared/FONT_LICENSE | 0 .../lib/werkzeug/debug/shared/console.png | Bin .../lib/werkzeug/debug/shared/debugger.js | 117 +- app/lib/werkzeug/debug/shared/jquery.js | 5 + .../lib/werkzeug/debug/shared/less.png | Bin .../lib/werkzeug/debug/shared/more.png | Bin .../lib/werkzeug/debug/shared/source.png | Bin .../lib/werkzeug/debug/shared/style.css | 62 +- .../lib/werkzeug/debug/shared/ubuntu.ttf | Bin {src => app}/lib/werkzeug/debug/tbtools.py | 159 +- {src => app}/lib/werkzeug/exceptions.py | 403 +- app/lib/werkzeug/filesystem.py | 66 + {src => app}/lib/werkzeug/formparser.py | 239 +- {src => app}/lib/werkzeug/http.py | 429 +- {src => app}/lib/werkzeug/local.py | 76 +- {src => app}/lib/werkzeug/posixemulation.py | 17 +- {src => app}/lib/werkzeug/routing.py | 408 +- {src => app}/lib/werkzeug/script.py | 67 +- app/lib/werkzeug/security.py | 264 + app/lib/werkzeug/serving.py | 784 +++ {src => app}/lib/werkzeug/test.py | 316 +- {src => app}/lib/werkzeug/testapp.py | 24 +- app/lib/werkzeug/urls.py | 1004 ++++ {src => app}/lib/werkzeug/useragents.py | 35 +- {src => app}/lib/werkzeug/utils.py | 197 +- {src => app}/lib/werkzeug/wrappers.py | 727 ++- {src => app}/lib/werkzeug/wsgi.py | 625 ++- app/main.py | 47 + app/models.py | 434 +- app/requirements.txt | 16 + {src/application => app}/static/css/main.css | 0 .../static/img/favicon.ico | Bin .../static/img/favicon.png | Bin {src/application => app}/static/js/main.js | 0 .../static}/resources/css/Carousel.css | 0 .../static}/resources/css/artistPO.css | 0 .../static}/resources/css/landing-page.css | 0 .../static}/resources/css/navBar.css | 0 .../static}/resources/css/pagePO.css | 0 .../static}/resources/css/sweStyle.css | 0 .../static}/resources/images/bg-1.jpg | Bin .../static}/resources/images/bg-2.png | Bin .../static}/resources/images/bg-3.jpg | Bin .../static}/resources/images/concert.jpg | Bin .../static}/resources/images/grey-wood-bg.jpg | Bin .../static}/resources/images/instruments.jpg | Bin .../static}/resources/images/microphone.jpg | Bin .../static}/resources/images/microphone2.jpg | Bin .../resources/images/subtle-grid-bg.jpg | Bin .../resources/images/vertical-wood-bg.jpg | Bin .../static}/resources/js/carousel.js | 0 .../static}/resources/js/masonry.js | 0 .../static}/resources/js/scripts.js | 0 .../static}/resources/templates/css/blue.css | 0 .../resources/templates/css/bootstrap.min.css | 0 .../resources/templates/css/plugins.css | 0 .../static}/resources/templates/css/style.css | 0 .../resources/templates/js/bootstrap.min.js | 0 .../resources/templates/js/jquery.min.js | 0 .../js/jquery.themepunch.tools.min.js | 0 .../static}/resources/templates/js/plugins.js | 0 .../static}/resources/templates/js/scripts.js | 0 {src/application => app}/static/robots.txt | 0 {src/application => app}/templates/404.html | 0 {src/application => app}/templates/500.html | 0 {src/application => app}/templates/base.html | 0 .../templates/edit_example.html | 0 app/templates/home.html | 90 + .../templates/includes/flash_message.html | 0 .../templates/includes/nav.html | 0 .../templates/list_examples.html | 0 .../templates/list_examples_cached.html | 0 .../templates/new_example.html | 0 .../templates}/sweBootstrap/about.html | 8 +- .../sweBootstrap/albumPageModule.html | 0 .../templates}/sweBootstrap/albumsTable.html | 0 .../sweBootstrap/angularTracksModule.html | 0 .../sweBootstrap/artistPageModule.html | 0 .../templates}/sweBootstrap/artistTable.html | 0 .../templates}/sweBootstrap/b52AlbumPage.html | 0 .../sweBootstrap/b52ArtistPage.html | 0 .../sweBootstrap/b52Concert2Page.html | 0 .../sweBootstrap/b52ConcertPage.html | 0 .../templates}/sweBootstrap/b52TrackPage.html | 0 .../sweBootstrap/coldplayAlbumPage.html | 0 .../sweBootstrap/coldplayArtistPage.html | 0 .../sweBootstrap/coldplayConcertPage.html | 0 .../sweBootstrap/coldplayTrackPage.html | 0 .../sweBootstrap/concertPageModule.html | 0 .../sweBootstrap/concertsTable.html | 0 .../templates}/sweBootstrap/home.html | 0 .../sweBootstrap/queenAlbumPage.html | 0 .../sweBootstrap/queenArtistPage.html | 0 .../sweBootstrap/queenTrackPage.html | 0 .../templates}/sweBootstrap/staticInfo.txt | 0 .../sweBootstrap/trackPageModule.html | 0 .../templates}/sweBootstrap/tracksTable.html | 0 src/app.yaml | 43 - src/appengine_config.py | 17 - src/application/__init__.py | 38 - src/application/decorators.py | 32 - src/application/forms.py | 26 - src/application/generate_keys.py | 82 - src/application/models.py | 197 - src/application/secret_keys.py | 4 - src/application/settings.py | 37 - src/application/urls.py | 56 - .../views/admin/admin_delete_example.py | 26 - .../views/admin/admin_edit_example.py | 26 - .../views/admin/admin_list_examples.py | 36 - .../views/admin/admin_list_examples_cached.py | 25 - src/application/views/admin/admin_secret.py | 13 - src/application/views/public/__init__.py | 0 src/application/views/public/public_index.py | 11 - .../views/public/public_say_hello.py | 9 - src/application/views/public/public_warmup.py | 9 - src/apptest.py | 42 - src/index.yaml | 11 - src/lib/__init__.py | 0 src/lib/blinker/__init__.py | 20 - src/lib/blinker/_saferef.py | 234 - src/lib/blinker/_utilities.py | 138 - src/lib/blinker/base.py | 345 -- src/lib/flask/exceptions.py | 49 - src/lib/flask/logging.py | 45 - src/lib/flask/module.py | 42 - src/lib/flask/session.py | 19 - src/lib/flask/testsuite/__init__.py | 246 - src/lib/flask/testsuite/appctx.py | 101 - src/lib/flask/testsuite/basic.py | 1222 ----- src/lib/flask/testsuite/blueprints.py | 790 --- src/lib/flask/testsuite/config.py | 299 -- src/lib/flask/testsuite/deprecations.py | 24 - src/lib/flask/testsuite/examples.py | 38 - src/lib/flask/testsuite/ext.py | 134 - src/lib/flask/testsuite/helpers.py | 587 --- src/lib/flask/testsuite/regression.py | 116 - src/lib/flask/testsuite/reqctx.py | 185 - src/lib/flask/testsuite/signals.py | 153 - src/lib/flask/testsuite/static/index.html | 1 - src/lib/flask/testsuite/subclassing.py | 46 - src/lib/flask/testsuite/templates/_macro.html | 1 - .../testsuite/templates/context_template.html | 1 - .../templates/escaping_template.html | 6 - src/lib/flask/testsuite/templates/mail.txt | 1 - .../testsuite/templates/nested/nested.txt | 1 - .../testsuite/templates/simple_template.html | 1 - .../testsuite/templates/template_filter.html | 1 - .../testsuite/templates/template_test.html | 3 - src/lib/flask/testsuite/templating.py | 302 -- .../test_apps/blueprintapp/__init__.py | 7 - .../test_apps/blueprintapp/apps/__init__.py | 0 .../blueprintapp/apps/admin/__init__.py | 15 - .../apps/admin/static/css/test.css | 1 - .../blueprintapp/apps/admin/static/test.txt | 1 - .../apps/admin/templates/admin/index.html | 1 - .../blueprintapp/apps/frontend/__init__.py | 8 - .../frontend/templates/frontend/index.html | 1 - .../testsuite/test_apps/config_module_app.py | 4 - .../test_apps/config_package_app/__init__.py | 4 - .../test_apps/flask_broken/__init__.py | 2 - .../testsuite/test_apps/flask_broken/b.py | 0 .../flask_newext_package/__init__.py | 1 - .../flask_newext_package/submodule.py | 2 - .../test_apps/flask_newext_simple.py | 1 - .../testsuite/test_apps/flaskext/__init__.py | 0 .../flaskext/oldext_package/__init__.py | 1 - .../flaskext/oldext_package/submodule.py | 2 - .../test_apps/flaskext/oldext_simple.py | 1 - .../flask/testsuite/test_apps/importerror.py | 2 - .../lib/python2.5/site-packages/SiteEgg.egg | Bin 1218 -> 0 bytes .../lib/python2.5/site-packages/site_app.py | 3 - .../site-packages/site_package/__init__.py | 3 - src/lib/flask/testsuite/test_apps/main_app.py | 4 - .../testsuite/test_apps/moduleapp/__init__.py | 7 - .../test_apps/moduleapp/apps/__init__.py | 0 .../moduleapp/apps/admin/__init__.py | 14 - .../moduleapp/apps/admin/static/css/test.css | 1 - .../moduleapp/apps/admin/static/test.txt | 1 - .../moduleapp/apps/admin/templates/index.html | 1 - .../moduleapp/apps/frontend/__init__.py | 9 - .../apps/frontend/templates/index.html | 1 - .../path/installed_package/__init__.py | 3 - .../test_apps/subdomaintestmodule/__init__.py | 4 - .../subdomaintestmodule/static/hello.txt | 1 - src/lib/flask/testsuite/testing.py | 242 - src/lib/flask/testsuite/views.py | 169 - src/lib/flask_cache/__init__.py | 500 -- src/lib/flask_cache/backends.py | 69 - src/lib/flask_cache/jinja2ext.py | 82 - src/lib/flask_debugtoolbar/__init__.py | 186 - src/lib/flask_debugtoolbar/panels/__init__.py | 61 - src/lib/flask_debugtoolbar/panels/headers.py | 56 - src/lib/flask_debugtoolbar/panels/logger.py | 106 - src/lib/flask_debugtoolbar/panels/profiler.py | 121 - .../flask_debugtoolbar/panels/request_vars.py | 47 - .../flask_debugtoolbar/panels/sqlalchemy.py | 152 - src/lib/flask_debugtoolbar/panels/template.py | 124 - src/lib/flask_debugtoolbar/panels/timer.py | 94 - src/lib/flask_debugtoolbar/panels/versions.py | 28 - .../static/codemirror/codemirror.css | 112 - .../static/codemirror/codemirror.js | 2972 ----------- .../static/codemirror/mode/clike/clike.js | 234 - .../static/codemirror/mode/clike/index.html | 101 - .../static/codemirror/mode/clojure/clojure.js | 207 - .../static/codemirror/mode/clojure/index.html | 66 - .../codemirror/mode/coffeescript/LICENSE | 22 - .../mode/coffeescript/coffeescript.js | 341 -- .../codemirror/mode/coffeescript/index.html | 721 --- .../static/codemirror/mode/css/css.js | 124 - .../static/codemirror/mode/css/index.html | 55 - .../static/codemirror/mode/diff/diff.css | 3 - .../static/codemirror/mode/diff/diff.js | 13 - .../static/codemirror/mode/diff/index.html | 99 - .../static/codemirror/mode/ecl/ecl.js | 203 - .../static/codemirror/mode/ecl/index.html | 42 - .../static/codemirror/mode/gfm/gfm.js | 108 - .../static/codemirror/mode/gfm/index.html | 47 - .../static/codemirror/mode/go/go.js | 170 - .../static/codemirror/mode/go/index.html | 72 - .../static/codemirror/mode/groovy/groovy.js | 210 - .../static/codemirror/mode/groovy/index.html | 71 - .../static/codemirror/mode/haskell/haskell.js | 242 - .../static/codemirror/mode/haskell/index.html | 60 - .../mode/htmlembedded/htmlembedded.js | 68 - .../codemirror/mode/htmlembedded/index.html | 49 - .../codemirror/mode/htmlmixed/htmlmixed.js | 83 - .../codemirror/mode/htmlmixed/index.html | 51 - .../codemirror/mode/javascript/index.html | 77 - .../codemirror/mode/javascript/javascript.js | 360 -- .../static/codemirror/mode/jinja2/index.html | 37 - .../static/codemirror/mode/jinja2/jinja2.js | 51 - .../static/codemirror/mode/less/index.html | 603 --- .../static/codemirror/mode/less/less.js | 218 - .../static/codemirror/mode/lua/index.html | 72 - .../static/codemirror/mode/lua/lua.js | 140 - .../codemirror/mode/markdown/index.html | 338 -- .../codemirror/mode/markdown/markdown.js | 245 - .../static/codemirror/mode/mysql/index.html | 41 - .../static/codemirror/mode/mysql/mysql.js | 188 - .../codemirror/mode/ntriples/index.html | 32 - .../codemirror/mode/ntriples/ntriples.js | 172 - .../static/codemirror/mode/pascal/LICENSE | 7 - .../static/codemirror/mode/pascal/index.html | 48 - .../static/codemirror/mode/pascal/pascal.js | 94 - .../static/codemirror/mode/perl/LICENSE | 19 - .../static/codemirror/mode/perl/index.html | 62 - .../static/codemirror/mode/perl/perl.js | 816 --- .../static/codemirror/mode/php/index.html | 48 - .../static/codemirror/mode/php/php.js | 150 - .../static/codemirror/mode/plsql/index.html | 62 - .../static/codemirror/mode/plsql/plsql.js | 217 - .../codemirror/mode/properties/index.html | 40 - .../codemirror/mode/properties/properties.js | 63 - .../static/codemirror/mode/python/LICENSE.txt | 21 - .../static/codemirror/mode/python/index.html | 122 - .../static/codemirror/mode/python/python.js | 340 -- .../static/codemirror/mode/r/LICENSE | 24 - .../static/codemirror/mode/r/index.html | 73 - .../static/codemirror/mode/r/r.js | 141 - .../codemirror/mode/rpm/changes/changes.js | 19 - .../codemirror/mode/rpm/changes/index.html | 53 - .../codemirror/mode/rpm/spec/index.html | 99 - .../static/codemirror/mode/rpm/spec/spec.css | 5 - .../static/codemirror/mode/rpm/spec/spec.js | 66 - .../static/codemirror/mode/rst/index.html | 525 -- .../static/codemirror/mode/rst/rst.js | 326 -- .../static/codemirror/mode/ruby/LICENSE | 24 - .../static/codemirror/mode/ruby/index.html | 171 - .../static/codemirror/mode/ruby/ruby.js | 200 - .../static/codemirror/mode/rust/index.html | 48 - .../static/codemirror/mode/rust/rust.js | 432 -- .../static/codemirror/mode/scheme/index.html | 64 - .../static/codemirror/mode/scheme/scheme.js | 202 - .../codemirror/mode/smalltalk/index.html | 55 - .../codemirror/mode/smalltalk/smalltalk.js | 139 - .../static/codemirror/mode/smarty/index.html | 82 - .../static/codemirror/mode/smarty/smarty.js | 148 - .../static/codemirror/mode/sparql/index.html | 40 - .../static/codemirror/mode/sparql/sparql.js | 143 - .../static/codemirror/mode/stex/index.html | 95 - .../static/codemirror/mode/stex/stex.js | 180 - .../static/codemirror/mode/stex/test.html | 251 - .../codemirror/mode/tiddlywiki/index.html | 140 - .../codemirror/mode/tiddlywiki/tiddlywiki.css | 21 - .../codemirror/mode/tiddlywiki/tiddlywiki.js | 384 -- .../codemirror/mode/vbscript/index.html | 42 - .../codemirror/mode/vbscript/vbscript.js | 26 - .../codemirror/mode/velocity/index.html | 103 - .../codemirror/mode/velocity/velocity.js | 146 - .../static/codemirror/mode/verilog/index.html | 210 - .../static/codemirror/mode/verilog/verilog.js | 194 - .../static/codemirror/mode/xml/index.html | 44 - .../static/codemirror/mode/xml/xml.js | 268 - .../static/codemirror/mode/xmlpure/index.html | 58 - .../static/codemirror/mode/xmlpure/xmlpure.js | 490 -- .../static/codemirror/mode/xquery/LICENSE | 20 - .../static/codemirror/mode/xquery/index.html | 222 - .../codemirror/mode/xquery/test/index.html | 27 - .../codemirror/mode/xquery/test/testBase.js | 42 - .../xquery/test/testEmptySequenceKeyword.js | 16 - .../mode/xquery/test/testMultiAttr.js | 16 - .../mode/xquery/test/testNamespaces.js | 91 - .../xquery/test/testProcessingInstructions.js | 16 - .../codemirror/mode/xquery/test/testQuotes.js | 19 - .../static/codemirror/mode/xquery/xquery.js | 448 -- .../static/codemirror/mode/yaml/index.html | 67 - .../static/codemirror/mode/yaml/yaml.js | 95 - .../static/codemirror/theme/cobalt.css | 18 - .../static/codemirror/theme/eclipse.css | 25 - .../static/codemirror/theme/elegant.css | 10 - .../static/codemirror/theme/lesser-dark.css | 45 - .../static/codemirror/theme/monokai.css | 28 - .../static/codemirror/theme/neat.css | 9 - .../static/codemirror/theme/night.css | 21 - .../static/codemirror/theme/rubyblue.css | 21 - .../static/codemirror/theme/xq-dark.css | 46 - .../static/codemirror/util/closetag.js | 174 - .../static/codemirror/util/dialog.css | 23 - .../static/codemirror/util/dialog.js | 63 - .../static/codemirror/util/foldcode.js | 186 - .../static/codemirror/util/formatting.js | 294 -- .../static/codemirror/util/javascript-hint.js | 134 - .../codemirror/util/match-highlighter.js | 44 - .../static/codemirror/util/overlay.js | 51 - .../static/codemirror/util/runmode.js | 49 - .../static/codemirror/util/search.js | 114 - .../static/codemirror/util/searchcursor.js | 117 - .../static/codemirror/util/simple-hint.css | 16 - .../static/codemirror/util/simple-hint.js | 72 - .../flask_debugtoolbar/static/css/toolbar.css | 437 -- src/lib/flask_debugtoolbar/static/img/asc.gif | Bin 54 -> 0 bytes .../flask_debugtoolbar/static/img/back.png | Bin 575 -> 0 bytes .../static/img/back_hover.png | Bin 614 -> 0 bytes src/lib/flask_debugtoolbar/static/img/bg.gif | Bin 64 -> 0 bytes .../flask_debugtoolbar/static/img/close.png | Bin 604 -> 0 bytes .../static/img/close_hover.png | Bin 711 -> 0 bytes .../flask_debugtoolbar/static/img/desc.gif | Bin 54 -> 0 bytes .../static/img/djdt_vertical.png | Bin 404 -> 0 bytes .../static/img/indicator.png | Bin 444 -> 0 bytes .../static/img/panel_bg.png | Bin 70 -> 0 bytes .../static/img/tick-red.png | Bin 538 -> 0 bytes .../flask_debugtoolbar/static/img/tick.png | Bin 569 -> 0 bytes .../flask_debugtoolbar/static/js/jquery.js | 16 - .../static/js/jquery.tablesorter.js | 1031 ---- .../flask_debugtoolbar/static/js/toolbar.js | 193 - .../flask_debugtoolbar/templates/base.html | 56 - .../templates/panels/headers.html | 16 - .../templates/panels/logger.html | 26 - .../templates/panels/profiler.html | 25 - .../templates/panels/request_vars.html | 104 - .../templates/panels/sqlalchemy.html | 68 - .../templates/panels/sqlalchemy_explain.html | 33 - .../templates/panels/sqlalchemy_select.html | 37 - .../templates/panels/template.html | 26 - .../templates/panels/template_editor.html | 154 - .../templates/panels/timer.html | 21 - .../templates/redirect.html | 15 - src/lib/flask_debugtoolbar/toolbar.py | 76 - src/lib/flask_debugtoolbar/utils.py | 56 - src/lib/flaskext/__init__.py | 1 - src/lib/flaskext/wtf/__init__.py | 67 - src/lib/flaskext/wtf/file.py | 72 - src/lib/flaskext/wtf/form.py | 120 - src/lib/flaskext/wtf/html5.py | 125 - src/lib/flaskext/wtf/recaptcha/__init__.py | 5 - src/lib/flaskext/wtf/recaptcha/fields.py | 16 - src/lib/flaskext/wtf/recaptcha/validators.py | 73 - src/lib/flaskext/wtf/recaptcha/widgets.py | 81 - src/lib/gae_mini_profiler/.gitignore | 1 - src/lib/gae_mini_profiler/README.md | 132 - src/lib/gae_mini_profiler/__init__.py | 0 .../gae_mini_profiler/appstats_profiler.py | 150 - src/lib/gae_mini_profiler/cleanup.py | 272 - src/lib/gae_mini_profiler/config.py | 40 - src/lib/gae_mini_profiler/cookies.py | 50 - .../instrumented_profiler.py | 70 - src/lib/gae_mini_profiler/main.py | 16 - src/lib/gae_mini_profiler/profiler.py | 576 --- .../gae_mini_profiler/sampling_profiler.py | 176 - .../gae_mini_profiler/static/css/profiler.css | 324 -- .../gae_mini_profiler/static/js/profiler.js | 475 -- .../gae_mini_profiler/static/js/template.tmpl | 313 -- .../gae_mini_profiler/templates/includes.html | 3 - .../gae_mini_profiler/templates/shared.html | 13 - src/lib/gae_mini_profiler/templatetags.py | 25 - .../gae_mini_profiler/unformatter/__init__.py | 112 - .../unformatter/examples.txt | 16 - src/lib/gae_mini_profiler/util.py | 17 - src/lib/werkzeug/__init__.py | 149 - src/lib/werkzeug/contrib/kickstart.py | 288 -- src/lib/werkzeug/debug/__init__.py | 185 - src/lib/werkzeug/debug/shared/jquery.js | 167 - src/lib/werkzeug/security.py | 140 - src/lib/werkzeug/serving.py | 617 --- src/lib/werkzeug/templates.py | 399 -- src/lib/werkzeug/testsuite/__init__.py | 146 - src/lib/werkzeug/testsuite/compat.py | 58 - .../werkzeug/testsuite/contrib/__init__.py | 19 - src/lib/werkzeug/testsuite/contrib/cache.py | 166 - src/lib/werkzeug/testsuite/contrib/fixers.py | 187 - src/lib/werkzeug/testsuite/contrib/iterio.py | 72 - .../testsuite/contrib/securecookie.py | 65 - .../werkzeug/testsuite/contrib/sessions.py | 81 - .../werkzeug/testsuite/contrib/wrappers.py | 97 - src/lib/werkzeug/testsuite/datastructures.py | 618 --- src/lib/werkzeug/testsuite/debug.py | 163 - src/lib/werkzeug/testsuite/exceptions.py | 85 - src/lib/werkzeug/testsuite/formparser.py | 358 -- src/lib/werkzeug/testsuite/http.py | 392 -- src/lib/werkzeug/testsuite/internal.py | 81 - src/lib/werkzeug/testsuite/local.py | 133 - .../werkzeug/testsuite/multipart/collect.py | 56 - .../multipart/firefox3-2png1txt/file1.png | Bin 523 -> 0 bytes .../multipart/firefox3-2png1txt/file2.png | Bin 703 -> 0 bytes .../multipart/firefox3-2png1txt/request.txt | Bin 1739 -> 0 bytes .../multipart/firefox3-2png1txt/text.txt | 1 - .../multipart/firefox3-2pnglongtext/file1.png | Bin 781 -> 0 bytes .../multipart/firefox3-2pnglongtext/file2.png | Bin 733 -> 0 bytes .../firefox3-2pnglongtext/request.txt | Bin 2042 -> 0 bytes .../multipart/firefox3-2pnglongtext/text.txt | 3 - .../multipart/ie6-2png1txt/file1.png | Bin 523 -> 0 bytes .../multipart/ie6-2png1txt/file2.png | Bin 703 -> 0 bytes .../multipart/ie6-2png1txt/request.txt | Bin 1798 -> 0 bytes .../testsuite/multipart/ie6-2png1txt/text.txt | 1 - .../multipart/ie7_full_path_request.txt | Bin 30044 -> 0 bytes .../multipart/opera8-2png1txt/file1.png | Bin 582 -> 0 bytes .../multipart/opera8-2png1txt/file2.png | Bin 733 -> 0 bytes .../multipart/opera8-2png1txt/request.txt | Bin 1740 -> 0 bytes .../multipart/opera8-2png1txt/text.txt | 1 - .../multipart/webkit3-2png1txt/file1.png | Bin 1002 -> 0 bytes .../multipart/webkit3-2png1txt/file2.png | Bin 952 -> 0 bytes .../multipart/webkit3-2png1txt/request.txt | Bin 2408 -> 0 bytes .../multipart/webkit3-2png1txt/text.txt | 1 - src/lib/werkzeug/testsuite/res/test.txt | 1 - src/lib/werkzeug/testsuite/routing.py | 633 --- src/lib/werkzeug/testsuite/security.py | 57 - src/lib/werkzeug/testsuite/serving.py | 84 - src/lib/werkzeug/testsuite/test.py | 376 -- src/lib/werkzeug/testsuite/urls.py | 168 - src/lib/werkzeug/testsuite/utils.py | 264 - src/lib/werkzeug/testsuite/wrappers.py | 662 --- src/lib/werkzeug/testsuite/wsgi.py | 230 - src/lib/werkzeug/urls.py | 539 -- src/lib/wtforms/__init__.py | 16 - src/lib/wtforms/compat.py | 19 - src/lib/wtforms/ext/__init__.py | 0 src/lib/wtforms/ext/appengine/db.py | 464 -- src/lib/wtforms/ext/appengine/fields.py | 219 - src/lib/wtforms/ext/appengine/ndb.py | 418 -- src/lib/wtforms/ext/csrf/__init__.py | 1 - src/lib/wtforms/ext/csrf/fields.py | 18 - src/lib/wtforms/ext/csrf/form.py | 53 - src/lib/wtforms/ext/csrf/session.py | 70 - src/lib/wtforms/ext/dateutil/__init__.py | 0 src/lib/wtforms/ext/dateutil/fields.py | 76 - src/lib/wtforms/ext/django/__init__.py | 0 src/lib/wtforms/ext/django/fields.py | 98 - src/lib/wtforms/ext/django/i18n.py | 23 - src/lib/wtforms/ext/django/orm.py | 167 - .../ext/django/templatetags/__init__.py | 0 .../ext/django/templatetags/wtforms.py | 78 - src/lib/wtforms/ext/i18n/form.py | 37 - src/lib/wtforms/ext/i18n/messages/README.txt | 29 - .../i18n/messages/de/LC_MESSAGES/wtforms.mo | Bin 3600 -> 0 bytes .../i18n/messages/de/LC_MESSAGES/wtforms.po | 183 - .../messages/de_CH/LC_MESSAGES/wtforms.mo | Bin 3603 -> 0 bytes .../messages/de_CH/LC_MESSAGES/wtforms.po | 183 - .../i18n/messages/en/LC_MESSAGES/wtforms.mo | Bin 3060 -> 0 bytes .../i18n/messages/en/LC_MESSAGES/wtforms.po | 180 - .../i18n/messages/es/LC_MESSAGES/wtforms.mo | Bin 3169 -> 0 bytes .../i18n/messages/es/LC_MESSAGES/wtforms.po | 175 - .../i18n/messages/fa/LC_MESSAGES/wtforms.mo | Bin 4330 -> 0 bytes .../i18n/messages/fa/LC_MESSAGES/wtforms.po | 171 - .../i18n/messages/fr/LC_MESSAGES/wtforms.mo | Bin 3208 -> 0 bytes .../i18n/messages/fr/LC_MESSAGES/wtforms.po | 173 - .../i18n/messages/it/LC_MESSAGES/wtforms.mo | Bin 3187 -> 0 bytes .../i18n/messages/it/LC_MESSAGES/wtforms.po | 173 - .../i18n/messages/ko/LC_MESSAGES/wtforms.mo | Bin 3776 -> 0 bytes .../i18n/messages/ko/LC_MESSAGES/wtforms.po | 170 - .../i18n/messages/pl/LC_MESSAGES/wtforms.mo | Bin 3388 -> 0 bytes .../i18n/messages/pl/LC_MESSAGES/wtforms.po | 176 - .../i18n/messages/ru/LC_MESSAGES/wtforms.mo | Bin 4194 -> 0 bytes .../i18n/messages/ru/LC_MESSAGES/wtforms.po | 178 - src/lib/wtforms/ext/i18n/messages/wtforms.pot | 178 - .../i18n/messages/zh/LC_MESSAGES/wtforms.mo | Bin 3126 -> 0 bytes .../i18n/messages/zh/LC_MESSAGES/wtforms.po | 173 - .../messages/zh_TW/LC_MESSAGES/wtforms.mo | Bin 3108 -> 0 bytes .../messages/zh_TW/LC_MESSAGES/wtforms.po | 169 - src/lib/wtforms/ext/i18n/utils.py | 49 - src/lib/wtforms/ext/sqlalchemy/__init__.py | 0 src/lib/wtforms/ext/sqlalchemy/fields.py | 188 - src/lib/wtforms/ext/sqlalchemy/orm.py | 303 -- src/lib/wtforms/ext/sqlalchemy/validators.py | 37 - src/lib/wtforms/fields/__init__.py | 6 - src/lib/wtforms/fields/core.py | 901 ---- src/lib/wtforms/fields/html5.py | 89 - src/lib/wtforms/fields/simple.py | 58 - src/lib/wtforms/form.py | 303 -- src/lib/wtforms/validators.py | 490 -- src/lib/wtforms/widgets/__init__.py | 4 - src/lib/wtforms/widgets/core.py | 265 - src/lib/wtforms/widgets/html5.py | 118 - src/pkg_resources.py | 2677 ---------- src/run.py | 6 - src/tests/tests.py | 123 - 1013 files changed, 179372 insertions(+), 53588 deletions(-) delete mode 100644 app.yaml create mode 100644 app/app.yaml create mode 100644 app/appengine_config.py create mode 100755 app/cloud_sql_proxy create mode 100644 app/lib/Flask-0.12.1.dist-info/DESCRIPTION.rst create mode 100644 app/lib/Flask-0.12.1.dist-info/LICENSE.txt create mode 100644 app/lib/Flask-0.12.1.dist-info/METADATA create mode 100644 app/lib/Flask-0.12.1.dist-info/RECORD create mode 100644 app/lib/Flask-0.12.1.dist-info/WHEEL create mode 100644 app/lib/Flask-0.12.1.dist-info/entry_points.txt create mode 100644 app/lib/Flask-0.12.1.dist-info/metadata.json create mode 100644 app/lib/Flask-0.12.1.dist-info/top_level.txt create mode 100644 app/lib/Flask_Restless-0.17.0-py3.4.egg-info/PKG-INFO create mode 100644 app/lib/Flask_Restless-0.17.0-py3.4.egg-info/SOURCES.txt rename src/lib/wtforms/ext/appengine/__init__.py => app/lib/Flask_Restless-0.17.0-py3.4.egg-info/dependency_links.txt (100%) create mode 100644 app/lib/Flask_Restless-0.17.0-py3.4.egg-info/installed-files.txt rename src/lib/wtforms/ext/i18n/__init__.py => app/lib/Flask_Restless-0.17.0-py3.4.egg-info/not-zip-safe (100%) create mode 100644 app/lib/Flask_Restless-0.17.0-py3.4.egg-info/requires.txt create mode 100644 app/lib/Flask_Restless-0.17.0-py3.4.egg-info/top_level.txt create mode 100644 app/lib/Flask_SQLAlchemy-2.2.dist-info/DESCRIPTION.rst create mode 100644 app/lib/Flask_SQLAlchemy-2.2.dist-info/LICENSE.txt create mode 100644 app/lib/Flask_SQLAlchemy-2.2.dist-info/METADATA create mode 100644 app/lib/Flask_SQLAlchemy-2.2.dist-info/RECORD create mode 100644 app/lib/Flask_SQLAlchemy-2.2.dist-info/WHEEL create mode 100644 app/lib/Flask_SQLAlchemy-2.2.dist-info/metadata.json create mode 100644 app/lib/Flask_SQLAlchemy-2.2.dist-info/top_level.txt create mode 100644 app/lib/Jinja2-2.9.6.dist-info/DESCRIPTION.rst create mode 100644 app/lib/Jinja2-2.9.6.dist-info/LICENSE.txt create mode 100644 app/lib/Jinja2-2.9.6.dist-info/METADATA create mode 100644 app/lib/Jinja2-2.9.6.dist-info/RECORD create mode 100644 app/lib/Jinja2-2.9.6.dist-info/WHEEL create mode 100644 app/lib/Jinja2-2.9.6.dist-info/entry_points.txt create mode 100644 app/lib/Jinja2-2.9.6.dist-info/metadata.json create mode 100644 app/lib/Jinja2-2.9.6.dist-info/top_level.txt create mode 100644 app/lib/MarkupSafe-1.0-py3.4.egg-info/PKG-INFO create mode 100644 app/lib/MarkupSafe-1.0-py3.4.egg-info/SOURCES.txt create mode 100644 app/lib/MarkupSafe-1.0-py3.4.egg-info/dependency_links.txt create mode 100644 app/lib/MarkupSafe-1.0-py3.4.egg-info/installed-files.txt create mode 100644 app/lib/MarkupSafe-1.0-py3.4.egg-info/not-zip-safe create mode 100644 app/lib/MarkupSafe-1.0-py3.4.egg-info/top_level.txt create mode 100644 app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/PKG-INFO create mode 100644 app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/SOURCES.txt create mode 100644 app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/dependency_links.txt create mode 100644 app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/installed-files.txt create mode 100644 app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/requires.txt create mode 100644 app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/top_level.txt create mode 100644 app/lib/Werkzeug-0.12.1.dist-info/DESCRIPTION.rst create mode 100644 app/lib/Werkzeug-0.12.1.dist-info/LICENSE.txt create mode 100644 app/lib/Werkzeug-0.12.1.dist-info/METADATA create mode 100644 app/lib/Werkzeug-0.12.1.dist-info/RECORD create mode 100644 app/lib/Werkzeug-0.12.1.dist-info/WHEEL create mode 100644 app/lib/Werkzeug-0.12.1.dist-info/metadata.json create mode 100644 app/lib/Werkzeug-0.12.1.dist-info/top_level.txt create mode 100644 app/lib/click-6.7.dist-info/DESCRIPTION.rst create mode 100644 app/lib/click-6.7.dist-info/METADATA create mode 100644 app/lib/click-6.7.dist-info/RECORD create mode 100644 app/lib/click-6.7.dist-info/WHEEL create mode 100644 app/lib/click-6.7.dist-info/metadata.json create mode 100644 app/lib/click-6.7.dist-info/top_level.txt create mode 100644 app/lib/click/__init__.py create mode 100644 app/lib/click/_bashcomplete.py create mode 100644 app/lib/click/_compat.py create mode 100644 app/lib/click/_termui_impl.py create mode 100644 app/lib/click/_textwrap.py create mode 100644 app/lib/click/_unicodefun.py create mode 100644 app/lib/click/_winconsole.py create mode 100644 app/lib/click/core.py create mode 100644 app/lib/click/decorators.py create mode 100644 app/lib/click/exceptions.py create mode 100644 app/lib/click/formatting.py create mode 100644 app/lib/click/globals.py create mode 100644 app/lib/click/parser.py create mode 100644 app/lib/click/termui.py create mode 100644 app/lib/click/testing.py create mode 100644 app/lib/click/types.py create mode 100644 app/lib/click/utils.py create mode 100644 app/lib/dateutil/__init__.py create mode 100644 app/lib/dateutil/_common.py create mode 100644 app/lib/dateutil/easter.py create mode 100644 app/lib/dateutil/parser.py create mode 100644 app/lib/dateutil/relativedelta.py create mode 100644 app/lib/dateutil/rrule.py create mode 100644 app/lib/dateutil/tz/__init__.py create mode 100644 app/lib/dateutil/tz/_common.py create mode 100644 app/lib/dateutil/tz/tz.py create mode 100644 app/lib/dateutil/tz/win.py create mode 100644 app/lib/dateutil/tzwin.py create mode 100644 app/lib/dateutil/zoneinfo/__init__.py create mode 100644 app/lib/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz create mode 100644 app/lib/dateutil/zoneinfo/rebuild.py rename {src => app}/lib/flask/__init__.py (82%) create mode 100644 app/lib/flask/__main__.py rename {src => app}/lib/flask/_compat.py (52%) rename {src => app}/lib/flask/app.py (80%) rename {src => app}/lib/flask/blueprints.py (95%) create mode 100644 app/lib/flask/cli.py rename {src => app}/lib/flask/config.py (57%) rename {src => app}/lib/flask/ctx.py (81%) rename {src => app}/lib/flask/debughelpers.py (56%) rename {src => app}/lib/flask/ext/__init__.py (94%) rename {src => app}/lib/flask/exthook.py (85%) rename {src => app}/lib/flask/globals.py (54%) rename {src => app}/lib/flask/helpers.py (71%) rename {src => app}/lib/flask/json.py (68%) create mode 100644 app/lib/flask/logging.py rename {src => app}/lib/flask/sessions.py (73%) rename {src => app}/lib/flask/signals.py (87%) rename {src => app}/lib/flask/templating.py (68%) rename {src => app}/lib/flask/testing.py (82%) rename {src => app}/lib/flask/views.py (91%) rename {src => app}/lib/flask/wrappers.py (70%) create mode 100644 app/lib/flask_restless/__init__.py create mode 100644 app/lib/flask_restless/helpers.py create mode 100644 app/lib/flask_restless/manager.py create mode 100644 app/lib/flask_restless/search.py create mode 100644 app/lib/flask_restless/views.py create mode 100644 app/lib/flask_sqlalchemy/__init__.py create mode 100644 app/lib/flask_sqlalchemy/_compat.py create mode 100644 app/lib/itsdangerous-0.24-py3.4.egg-info/PKG-INFO create mode 100644 app/lib/itsdangerous-0.24-py3.4.egg-info/SOURCES.txt create mode 100644 app/lib/itsdangerous-0.24-py3.4.egg-info/dependency_links.txt create mode 100644 app/lib/itsdangerous-0.24-py3.4.egg-info/installed-files.txt create mode 100644 app/lib/itsdangerous-0.24-py3.4.egg-info/not-zip-safe create mode 100644 app/lib/itsdangerous-0.24-py3.4.egg-info/top_level.txt rename {src => app}/lib/itsdangerous.py (94%) create mode 100644 app/lib/jinja2/__init__.py create mode 100644 app/lib/jinja2/_compat.py create mode 100644 app/lib/jinja2/_stringdefs.py create mode 100644 app/lib/jinja2/asyncfilters.py create mode 100644 app/lib/jinja2/asyncsupport.py create mode 100644 app/lib/jinja2/bccache.py create mode 100644 app/lib/jinja2/compiler.py create mode 100644 app/lib/jinja2/constants.py create mode 100644 app/lib/jinja2/debug.py create mode 100644 app/lib/jinja2/defaults.py create mode 100644 app/lib/jinja2/environment.py create mode 100644 app/lib/jinja2/exceptions.py create mode 100644 app/lib/jinja2/ext.py create mode 100644 app/lib/jinja2/filters.py create mode 100644 app/lib/jinja2/idtracking.py create mode 100644 app/lib/jinja2/lexer.py create mode 100644 app/lib/jinja2/loaders.py create mode 100644 app/lib/jinja2/meta.py create mode 100644 app/lib/jinja2/nodes.py create mode 100644 app/lib/jinja2/optimizer.py create mode 100644 app/lib/jinja2/parser.py create mode 100644 app/lib/jinja2/runtime.py create mode 100644 app/lib/jinja2/sandbox.py create mode 100644 app/lib/jinja2/tests.py create mode 100644 app/lib/jinja2/utils.py create mode 100644 app/lib/jinja2/visitor.py create mode 100644 app/lib/markupsafe/__init__.py create mode 100644 app/lib/markupsafe/_compat.py create mode 100644 app/lib/markupsafe/_constants.py create mode 100644 app/lib/markupsafe/_native.py create mode 100644 app/lib/markupsafe/_speedups.c create mode 100755 app/lib/markupsafe/_speedups.so create mode 100644 app/lib/mimeparse.py create mode 100644 app/lib/mimerender-0.6.0-py3.4.egg-info/PKG-INFO create mode 100644 app/lib/mimerender-0.6.0-py3.4.egg-info/SOURCES.txt create mode 100644 app/lib/mimerender-0.6.0-py3.4.egg-info/dependency_links.txt create mode 100644 app/lib/mimerender-0.6.0-py3.4.egg-info/installed-files.txt create mode 100644 app/lib/mimerender-0.6.0-py3.4.egg-info/requires.txt create mode 100644 app/lib/mimerender-0.6.0-py3.4.egg-info/top_level.txt create mode 100644 app/lib/mimerender.py create mode 100644 app/lib/psycopg2-2.7.1.dist-info/DESCRIPTION.rst create mode 100644 app/lib/psycopg2-2.7.1.dist-info/INSTALLER create mode 100644 app/lib/psycopg2-2.7.1.dist-info/METADATA create mode 100644 app/lib/psycopg2-2.7.1.dist-info/RECORD create mode 100644 app/lib/psycopg2-2.7.1.dist-info/WHEEL create mode 100644 app/lib/psycopg2-2.7.1.dist-info/metadata.json create mode 100644 app/lib/psycopg2-2.7.1.dist-info/top_level.txt create mode 100644 app/lib/psycopg2/.dylibs/libcrypto.1.0.0.dylib create mode 100644 app/lib/psycopg2/.dylibs/libpq.5.8.dylib create mode 100644 app/lib/psycopg2/.dylibs/libssl.1.0.0.dylib create mode 100644 app/lib/psycopg2/__init__.py create mode 100644 app/lib/psycopg2/_ipaddress.py create mode 100644 app/lib/psycopg2/_json.py create mode 100755 app/lib/psycopg2/_psycopg.so create mode 100644 app/lib/psycopg2/_range.py create mode 100644 app/lib/psycopg2/errorcodes.py create mode 100644 app/lib/psycopg2/extensions.py create mode 100644 app/lib/psycopg2/extras.py create mode 100644 app/lib/psycopg2/pool.py create mode 100644 app/lib/psycopg2/psycopg1.py create mode 100644 app/lib/psycopg2/sql.py create mode 100644 app/lib/psycopg2/tests/__init__.py create mode 100644 app/lib/psycopg2/tests/dbapi20.py create mode 100644 app/lib/psycopg2/tests/dbapi20_tpc.py create mode 100644 app/lib/psycopg2/tests/test_async.py create mode 100644 app/lib/psycopg2/tests/test_async_keyword.py create mode 100644 app/lib/psycopg2/tests/test_bugX000.py create mode 100644 app/lib/psycopg2/tests/test_bug_gc.py create mode 100644 app/lib/psycopg2/tests/test_cancel.py create mode 100644 app/lib/psycopg2/tests/test_connection.py create mode 100644 app/lib/psycopg2/tests/test_copy.py create mode 100644 app/lib/psycopg2/tests/test_cursor.py create mode 100644 app/lib/psycopg2/tests/test_dates.py create mode 100644 app/lib/psycopg2/tests/test_errcodes.py create mode 100644 app/lib/psycopg2/tests/test_extras_dictcursor.py create mode 100644 app/lib/psycopg2/tests/test_fast_executemany.py create mode 100644 app/lib/psycopg2/tests/test_green.py create mode 100644 app/lib/psycopg2/tests/test_ipaddress.py create mode 100644 app/lib/psycopg2/tests/test_lobject.py create mode 100644 app/lib/psycopg2/tests/test_module.py create mode 100644 app/lib/psycopg2/tests/test_notify.py create mode 100644 app/lib/psycopg2/tests/test_psycopg2_dbapi20.py create mode 100644 app/lib/psycopg2/tests/test_quote.py create mode 100644 app/lib/psycopg2/tests/test_replication.py create mode 100644 app/lib/psycopg2/tests/test_sql.py create mode 100644 app/lib/psycopg2/tests/test_transaction.py create mode 100644 app/lib/psycopg2/tests/test_types_basic.py create mode 100644 app/lib/psycopg2/tests/test_types_extras.py create mode 100644 app/lib/psycopg2/tests/test_with.py create mode 100644 app/lib/psycopg2/tests/testconfig.py create mode 100644 app/lib/psycopg2/tests/testutils.py create mode 100644 app/lib/psycopg2/tz.py create mode 100644 app/lib/python_dateutil-2.6.0.dist-info/DESCRIPTION.rst create mode 100644 app/lib/python_dateutil-2.6.0.dist-info/METADATA create mode 100644 app/lib/python_dateutil-2.6.0.dist-info/RECORD create mode 100644 app/lib/python_dateutil-2.6.0.dist-info/WHEEL create mode 100644 app/lib/python_dateutil-2.6.0.dist-info/metadata.json create mode 100644 app/lib/python_dateutil-2.6.0.dist-info/top_level.txt create mode 100644 app/lib/python_dateutil-2.6.0.dist-info/zip-safe create mode 100644 app/lib/python_mimeparse-1.6.0.dist-info/DESCRIPTION.rst create mode 100644 app/lib/python_mimeparse-1.6.0.dist-info/METADATA create mode 100644 app/lib/python_mimeparse-1.6.0.dist-info/RECORD create mode 100644 app/lib/python_mimeparse-1.6.0.dist-info/WHEEL create mode 100644 app/lib/python_mimeparse-1.6.0.dist-info/metadata.json create mode 100644 app/lib/python_mimeparse-1.6.0.dist-info/top_level.txt create mode 100644 app/lib/simplejson-3.10.0-py3.4.egg-info/PKG-INFO create mode 100644 app/lib/simplejson-3.10.0-py3.4.egg-info/SOURCES.txt create mode 100644 app/lib/simplejson-3.10.0-py3.4.egg-info/dependency_links.txt create mode 100644 app/lib/simplejson-3.10.0-py3.4.egg-info/installed-files.txt create mode 100644 app/lib/simplejson-3.10.0-py3.4.egg-info/top_level.txt create mode 100644 app/lib/simplejson/__init__.py create mode 100755 app/lib/simplejson/_speedups.so create mode 100644 app/lib/simplejson/compat.py create mode 100644 app/lib/simplejson/decoder.py create mode 100644 app/lib/simplejson/encoder.py create mode 100644 app/lib/simplejson/ordered_dict.py create mode 100644 app/lib/simplejson/scanner.py create mode 100644 app/lib/simplejson/tests/__init__.py create mode 100644 app/lib/simplejson/tests/test_bigint_as_string.py create mode 100644 app/lib/simplejson/tests/test_bitsize_int_as_string.py create mode 100644 app/lib/simplejson/tests/test_check_circular.py create mode 100644 app/lib/simplejson/tests/test_decimal.py create mode 100644 app/lib/simplejson/tests/test_decode.py create mode 100644 app/lib/simplejson/tests/test_default.py create mode 100644 app/lib/simplejson/tests/test_dump.py create mode 100644 app/lib/simplejson/tests/test_encode_basestring_ascii.py create mode 100644 app/lib/simplejson/tests/test_encode_for_html.py create mode 100644 app/lib/simplejson/tests/test_errors.py create mode 100644 app/lib/simplejson/tests/test_fail.py create mode 100644 app/lib/simplejson/tests/test_float.py create mode 100644 app/lib/simplejson/tests/test_for_json.py create mode 100644 app/lib/simplejson/tests/test_indent.py create mode 100644 app/lib/simplejson/tests/test_item_sort_key.py create mode 100644 app/lib/simplejson/tests/test_iterable.py create mode 100644 app/lib/simplejson/tests/test_namedtuple.py create mode 100644 app/lib/simplejson/tests/test_pass1.py create mode 100644 app/lib/simplejson/tests/test_pass2.py create mode 100644 app/lib/simplejson/tests/test_pass3.py create mode 100644 app/lib/simplejson/tests/test_raw_json.py create mode 100644 app/lib/simplejson/tests/test_recursion.py create mode 100644 app/lib/simplejson/tests/test_scanstring.py create mode 100644 app/lib/simplejson/tests/test_separators.py create mode 100644 app/lib/simplejson/tests/test_speedups.py create mode 100644 app/lib/simplejson/tests/test_str_subclass.py create mode 100644 app/lib/simplejson/tests/test_subclass.py create mode 100644 app/lib/simplejson/tests/test_tool.py create mode 100644 app/lib/simplejson/tests/test_tuple.py create mode 100644 app/lib/simplejson/tests/test_unicode.py create mode 100644 app/lib/simplejson/tool.py create mode 100644 app/lib/six-1.10.0.dist-info/DESCRIPTION.rst create mode 100644 app/lib/six-1.10.0.dist-info/METADATA create mode 100644 app/lib/six-1.10.0.dist-info/RECORD create mode 100644 app/lib/six-1.10.0.dist-info/WHEEL create mode 100644 app/lib/six-1.10.0.dist-info/metadata.json create mode 100644 app/lib/six-1.10.0.dist-info/top_level.txt create mode 100644 app/lib/six.py create mode 100644 app/lib/sqlalchemy/__init__.py create mode 100644 app/lib/sqlalchemy/connectors/__init__.py create mode 100644 app/lib/sqlalchemy/connectors/mxodbc.py create mode 100644 app/lib/sqlalchemy/connectors/pyodbc.py create mode 100644 app/lib/sqlalchemy/connectors/zxJDBC.py create mode 100755 app/lib/sqlalchemy/cprocessors.so create mode 100755 app/lib/sqlalchemy/cresultproxy.so create mode 100755 app/lib/sqlalchemy/cutils.so create mode 100644 app/lib/sqlalchemy/databases/__init__.py create mode 100644 app/lib/sqlalchemy/dialects/__init__.py create mode 100644 app/lib/sqlalchemy/dialects/firebird/__init__.py create mode 100644 app/lib/sqlalchemy/dialects/firebird/base.py create mode 100644 app/lib/sqlalchemy/dialects/firebird/fdb.py create mode 100644 app/lib/sqlalchemy/dialects/firebird/kinterbasdb.py create mode 100644 app/lib/sqlalchemy/dialects/mssql/__init__.py create mode 100644 app/lib/sqlalchemy/dialects/mssql/adodbapi.py create mode 100644 app/lib/sqlalchemy/dialects/mssql/base.py create mode 100644 app/lib/sqlalchemy/dialects/mssql/information_schema.py create mode 100644 app/lib/sqlalchemy/dialects/mssql/mxodbc.py create mode 100644 app/lib/sqlalchemy/dialects/mssql/pymssql.py create mode 100644 app/lib/sqlalchemy/dialects/mssql/pyodbc.py create mode 100644 app/lib/sqlalchemy/dialects/mssql/zxjdbc.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/__init__.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/base.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/cymysql.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/enumerated.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/gaerdbms.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/json.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/mysqlconnector.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/mysqldb.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/oursql.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/pymysql.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/pyodbc.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/reflection.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/types.py create mode 100644 app/lib/sqlalchemy/dialects/mysql/zxjdbc.py create mode 100644 app/lib/sqlalchemy/dialects/oracle/__init__.py create mode 100644 app/lib/sqlalchemy/dialects/oracle/base.py create mode 100644 app/lib/sqlalchemy/dialects/oracle/cx_oracle.py create mode 100644 app/lib/sqlalchemy/dialects/oracle/zxjdbc.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/__init__.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/array.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/base.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/dml.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/ext.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/hstore.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/json.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/pg8000.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/psycopg2.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/psycopg2cffi.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/pygresql.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/pypostgresql.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/ranges.py create mode 100644 app/lib/sqlalchemy/dialects/postgresql/zxjdbc.py create mode 100644 app/lib/sqlalchemy/dialects/sqlite/__init__.py create mode 100644 app/lib/sqlalchemy/dialects/sqlite/base.py create mode 100644 app/lib/sqlalchemy/dialects/sqlite/pysqlcipher.py create mode 100644 app/lib/sqlalchemy/dialects/sqlite/pysqlite.py create mode 100644 app/lib/sqlalchemy/dialects/sybase/__init__.py create mode 100644 app/lib/sqlalchemy/dialects/sybase/base.py create mode 100644 app/lib/sqlalchemy/dialects/sybase/mxodbc.py create mode 100644 app/lib/sqlalchemy/dialects/sybase/pyodbc.py create mode 100644 app/lib/sqlalchemy/dialects/sybase/pysybase.py create mode 100644 app/lib/sqlalchemy/engine/__init__.py create mode 100644 app/lib/sqlalchemy/engine/base.py create mode 100644 app/lib/sqlalchemy/engine/default.py create mode 100644 app/lib/sqlalchemy/engine/interfaces.py create mode 100644 app/lib/sqlalchemy/engine/reflection.py create mode 100644 app/lib/sqlalchemy/engine/result.py create mode 100644 app/lib/sqlalchemy/engine/strategies.py create mode 100644 app/lib/sqlalchemy/engine/threadlocal.py create mode 100644 app/lib/sqlalchemy/engine/url.py create mode 100644 app/lib/sqlalchemy/engine/util.py create mode 100644 app/lib/sqlalchemy/event/__init__.py create mode 100644 app/lib/sqlalchemy/event/api.py create mode 100644 app/lib/sqlalchemy/event/attr.py create mode 100644 app/lib/sqlalchemy/event/base.py create mode 100644 app/lib/sqlalchemy/event/legacy.py create mode 100644 app/lib/sqlalchemy/event/registry.py create mode 100644 app/lib/sqlalchemy/events.py create mode 100644 app/lib/sqlalchemy/exc.py create mode 100644 app/lib/sqlalchemy/ext/__init__.py create mode 100644 app/lib/sqlalchemy/ext/associationproxy.py create mode 100644 app/lib/sqlalchemy/ext/automap.py create mode 100644 app/lib/sqlalchemy/ext/baked.py create mode 100644 app/lib/sqlalchemy/ext/compiler.py create mode 100644 app/lib/sqlalchemy/ext/declarative/__init__.py create mode 100644 app/lib/sqlalchemy/ext/declarative/api.py create mode 100644 app/lib/sqlalchemy/ext/declarative/base.py create mode 100644 app/lib/sqlalchemy/ext/declarative/clsregistry.py create mode 100644 app/lib/sqlalchemy/ext/horizontal_shard.py create mode 100644 app/lib/sqlalchemy/ext/hybrid.py create mode 100644 app/lib/sqlalchemy/ext/indexable.py create mode 100644 app/lib/sqlalchemy/ext/instrumentation.py create mode 100644 app/lib/sqlalchemy/ext/mutable.py create mode 100644 app/lib/sqlalchemy/ext/orderinglist.py create mode 100644 app/lib/sqlalchemy/ext/serializer.py create mode 100644 app/lib/sqlalchemy/inspection.py create mode 100644 app/lib/sqlalchemy/interfaces.py create mode 100644 app/lib/sqlalchemy/log.py create mode 100644 app/lib/sqlalchemy/orm/__init__.py create mode 100644 app/lib/sqlalchemy/orm/attributes.py create mode 100644 app/lib/sqlalchemy/orm/base.py create mode 100644 app/lib/sqlalchemy/orm/collections.py create mode 100644 app/lib/sqlalchemy/orm/dependency.py create mode 100644 app/lib/sqlalchemy/orm/deprecated_interfaces.py create mode 100644 app/lib/sqlalchemy/orm/descriptor_props.py create mode 100644 app/lib/sqlalchemy/orm/dynamic.py create mode 100644 app/lib/sqlalchemy/orm/evaluator.py create mode 100644 app/lib/sqlalchemy/orm/events.py create mode 100644 app/lib/sqlalchemy/orm/exc.py create mode 100644 app/lib/sqlalchemy/orm/identity.py create mode 100644 app/lib/sqlalchemy/orm/instrumentation.py create mode 100644 app/lib/sqlalchemy/orm/interfaces.py create mode 100644 app/lib/sqlalchemy/orm/loading.py create mode 100644 app/lib/sqlalchemy/orm/mapper.py create mode 100644 app/lib/sqlalchemy/orm/path_registry.py create mode 100644 app/lib/sqlalchemy/orm/persistence.py create mode 100644 app/lib/sqlalchemy/orm/properties.py create mode 100644 app/lib/sqlalchemy/orm/query.py create mode 100644 app/lib/sqlalchemy/orm/relationships.py create mode 100644 app/lib/sqlalchemy/orm/scoping.py create mode 100644 app/lib/sqlalchemy/orm/session.py create mode 100644 app/lib/sqlalchemy/orm/state.py create mode 100644 app/lib/sqlalchemy/orm/strategies.py create mode 100644 app/lib/sqlalchemy/orm/strategy_options.py create mode 100644 app/lib/sqlalchemy/orm/sync.py create mode 100644 app/lib/sqlalchemy/orm/unitofwork.py create mode 100644 app/lib/sqlalchemy/orm/util.py create mode 100644 app/lib/sqlalchemy/pool.py create mode 100644 app/lib/sqlalchemy/processors.py create mode 100644 app/lib/sqlalchemy/schema.py create mode 100644 app/lib/sqlalchemy/sql/__init__.py create mode 100644 app/lib/sqlalchemy/sql/annotation.py create mode 100644 app/lib/sqlalchemy/sql/base.py create mode 100644 app/lib/sqlalchemy/sql/compiler.py create mode 100644 app/lib/sqlalchemy/sql/crud.py create mode 100644 app/lib/sqlalchemy/sql/ddl.py create mode 100644 app/lib/sqlalchemy/sql/default_comparator.py create mode 100644 app/lib/sqlalchemy/sql/dml.py create mode 100644 app/lib/sqlalchemy/sql/elements.py create mode 100644 app/lib/sqlalchemy/sql/expression.py create mode 100644 app/lib/sqlalchemy/sql/functions.py create mode 100644 app/lib/sqlalchemy/sql/naming.py create mode 100644 app/lib/sqlalchemy/sql/operators.py create mode 100644 app/lib/sqlalchemy/sql/schema.py create mode 100644 app/lib/sqlalchemy/sql/selectable.py create mode 100644 app/lib/sqlalchemy/sql/sqltypes.py create mode 100644 app/lib/sqlalchemy/sql/type_api.py create mode 100644 app/lib/sqlalchemy/sql/util.py create mode 100644 app/lib/sqlalchemy/sql/visitors.py create mode 100644 app/lib/sqlalchemy/testing/__init__.py create mode 100644 app/lib/sqlalchemy/testing/assertions.py create mode 100644 app/lib/sqlalchemy/testing/assertsql.py create mode 100644 app/lib/sqlalchemy/testing/config.py create mode 100644 app/lib/sqlalchemy/testing/engines.py create mode 100644 app/lib/sqlalchemy/testing/entities.py create mode 100644 app/lib/sqlalchemy/testing/exclusions.py create mode 100644 app/lib/sqlalchemy/testing/fixtures.py create mode 100644 app/lib/sqlalchemy/testing/mock.py create mode 100644 app/lib/sqlalchemy/testing/pickleable.py rename {src/application/views => app/lib/sqlalchemy/testing/plugin}/__init__.py (100%) create mode 100644 app/lib/sqlalchemy/testing/plugin/bootstrap.py create mode 100644 app/lib/sqlalchemy/testing/plugin/noseplugin.py create mode 100644 app/lib/sqlalchemy/testing/plugin/plugin_base.py create mode 100644 app/lib/sqlalchemy/testing/plugin/pytestplugin.py create mode 100644 app/lib/sqlalchemy/testing/profiling.py create mode 100644 app/lib/sqlalchemy/testing/provision.py create mode 100644 app/lib/sqlalchemy/testing/replay_fixture.py create mode 100644 app/lib/sqlalchemy/testing/requirements.py create mode 100644 app/lib/sqlalchemy/testing/runner.py create mode 100644 app/lib/sqlalchemy/testing/schema.py create mode 100644 app/lib/sqlalchemy/testing/suite/__init__.py create mode 100644 app/lib/sqlalchemy/testing/suite/test_ddl.py create mode 100644 app/lib/sqlalchemy/testing/suite/test_dialect.py create mode 100644 app/lib/sqlalchemy/testing/suite/test_insert.py create mode 100644 app/lib/sqlalchemy/testing/suite/test_reflection.py create mode 100644 app/lib/sqlalchemy/testing/suite/test_results.py create mode 100644 app/lib/sqlalchemy/testing/suite/test_select.py create mode 100644 app/lib/sqlalchemy/testing/suite/test_sequence.py create mode 100644 app/lib/sqlalchemy/testing/suite/test_types.py create mode 100644 app/lib/sqlalchemy/testing/suite/test_update_delete.py create mode 100644 app/lib/sqlalchemy/testing/util.py create mode 100644 app/lib/sqlalchemy/testing/warnings.py create mode 100644 app/lib/sqlalchemy/types.py create mode 100644 app/lib/sqlalchemy/util/__init__.py create mode 100644 app/lib/sqlalchemy/util/_collections.py create mode 100644 app/lib/sqlalchemy/util/compat.py create mode 100644 app/lib/sqlalchemy/util/deprecations.py create mode 100644 app/lib/sqlalchemy/util/langhelpers.py create mode 100644 app/lib/sqlalchemy/util/queue.py create mode 100644 app/lib/sqlalchemy/util/topological.py create mode 100644 app/lib/virtualenv-15.1.0.dist-info/DESCRIPTION.rst create mode 100644 app/lib/virtualenv-15.1.0.dist-info/METADATA create mode 100644 app/lib/virtualenv-15.1.0.dist-info/RECORD create mode 100644 app/lib/virtualenv-15.1.0.dist-info/WHEEL create mode 100644 app/lib/virtualenv-15.1.0.dist-info/entry_points.txt create mode 100644 app/lib/virtualenv-15.1.0.dist-info/metadata.json create mode 100644 app/lib/virtualenv-15.1.0.dist-info/top_level.txt create mode 100644 app/lib/virtualenv.py rename {src/application/views/admin => app/lib/virtualenv_support}/__init__.py (100%) create mode 100644 app/lib/virtualenv_support/argparse-1.4.0-py2.py3-none-any.whl create mode 100644 app/lib/virtualenv_support/pip-9.0.1-py2.py3-none-any.whl create mode 100644 app/lib/virtualenv_support/setuptools-28.8.0-py2.py3-none-any.whl create mode 100644 app/lib/virtualenv_support/wheel-0.29.0-py2.py3-none-any.whl create mode 100644 app/lib/werkzeug/__init__.py create mode 100644 app/lib/werkzeug/_compat.py rename {src => app}/lib/werkzeug/_internal.py (60%) create mode 100644 app/lib/werkzeug/_reloader.py rename {src => app}/lib/werkzeug/contrib/__init__.py (89%) rename {src => app}/lib/werkzeug/contrib/atom.py (87%) rename {src => app}/lib/werkzeug/contrib/cache.py (54%) rename {src => app}/lib/werkzeug/contrib/fixers.py (82%) rename {src => app}/lib/werkzeug/contrib/iterio.py (67%) rename {src => app}/lib/werkzeug/contrib/jsrouting.py (94%) rename {src => app}/lib/werkzeug/contrib/limiter.py (85%) rename {src => app}/lib/werkzeug/contrib/lint.py (94%) rename {src => app}/lib/werkzeug/contrib/profiler.py (67%) rename {src => app}/lib/werkzeug/contrib/securecookie.py (86%) rename {src => app}/lib/werkzeug/contrib/sessions.py (91%) rename {src => app}/lib/werkzeug/contrib/testtools.py (95%) rename {src => app}/lib/werkzeug/contrib/wrappers.py (93%) rename {src => app}/lib/werkzeug/datastructures.py (84%) create mode 100644 app/lib/werkzeug/debug/__init__.py rename {src => app}/lib/werkzeug/debug/console.py (93%) rename {src => app}/lib/werkzeug/debug/repr.py (84%) rename {src => app}/lib/werkzeug/debug/shared/FONT_LICENSE (100%) rename {src => app}/lib/werkzeug/debug/shared/console.png (100%) mode change 100755 => 100644 rename {src => app}/lib/werkzeug/debug/shared/debugger.js (73%) create mode 100644 app/lib/werkzeug/debug/shared/jquery.js rename {src => app}/lib/werkzeug/debug/shared/less.png (100%) mode change 100755 => 100644 rename {src => app}/lib/werkzeug/debug/shared/more.png (100%) mode change 100755 => 100644 rename {src => app}/lib/werkzeug/debug/shared/source.png (100%) mode change 100755 => 100644 rename {src => app}/lib/werkzeug/debug/shared/style.css (79%) rename {src => app}/lib/werkzeug/debug/shared/ubuntu.ttf (100%) rename {src => app}/lib/werkzeug/debug/tbtools.py (76%) rename {src => app}/lib/werkzeug/exceptions.py (54%) create mode 100644 app/lib/werkzeug/filesystem.py rename {src => app}/lib/werkzeug/formparser.py (75%) rename {src => app}/lib/werkzeug/http.py (66%) rename {src => app}/lib/werkzeug/local.py (83%) rename {src => app}/lib/werkzeug/posixemulation.py (88%) rename {src => app}/lib/werkzeug/routing.py (84%) rename {src => app}/lib/werkzeug/script.py (87%) create mode 100644 app/lib/werkzeug/security.py create mode 100644 app/lib/werkzeug/serving.py rename {src => app}/lib/werkzeug/test.py (77%) rename {src => app}/lib/werkzeug/testapp.py (94%) create mode 100644 app/lib/werkzeug/urls.py rename {src => app}/lib/werkzeug/useragents.py (85%) rename {src => app}/lib/werkzeug/utils.py (81%) rename {src => app}/lib/werkzeug/wrappers.py (72%) rename {src => app}/lib/werkzeug/wsgi.py (58%) create mode 100644 app/main.py create mode 100644 app/requirements.txt rename {src/application => app}/static/css/main.css (100%) rename {src/application => app}/static/img/favicon.ico (100%) rename {src/application => app}/static/img/favicon.png (100%) rename {src/application => app}/static/js/main.js (100%) rename {src/application/static/sweBootstrap => app/static}/resources/css/Carousel.css (100%) rename {src/application/static/sweBootstrap => app/static}/resources/css/artistPO.css (100%) rename {src/application/static/sweBootstrap => app/static}/resources/css/landing-page.css (100%) rename {src/application/static/sweBootstrap => app/static}/resources/css/navBar.css (100%) rename {src/application/static/sweBootstrap => app/static}/resources/css/pagePO.css (100%) rename {src/application/static/sweBootstrap => app/static}/resources/css/sweStyle.css (100%) rename {src/application/static/sweBootstrap => app/static}/resources/images/bg-1.jpg (100%) rename {src/application/static/sweBootstrap => app/static}/resources/images/bg-2.png (100%) rename {src/application/static/sweBootstrap => app/static}/resources/images/bg-3.jpg (100%) rename {src/application/static/sweBootstrap => app/static}/resources/images/concert.jpg (100%) rename {src/application/static/sweBootstrap => app/static}/resources/images/grey-wood-bg.jpg (100%) rename {src/application/static/sweBootstrap => app/static}/resources/images/instruments.jpg (100%) rename {src/application/static/sweBootstrap => app/static}/resources/images/microphone.jpg (100%) rename {src/application/static/sweBootstrap => app/static}/resources/images/microphone2.jpg (100%) rename {src/application/static/sweBootstrap => app/static}/resources/images/subtle-grid-bg.jpg (100%) rename {src/application/static/sweBootstrap => app/static}/resources/images/vertical-wood-bg.jpg (100%) rename {src/application/static/sweBootstrap => app/static}/resources/js/carousel.js (100%) rename {src/application/static/sweBootstrap => app/static}/resources/js/masonry.js (100%) rename {src/application/static/sweBootstrap => app/static}/resources/js/scripts.js (100%) rename {src/application/static/sweBootstrap => app/static}/resources/templates/css/blue.css (100%) rename {src/application/static/sweBootstrap => app/static}/resources/templates/css/bootstrap.min.css (100%) rename {src/application/static/sweBootstrap => app/static}/resources/templates/css/plugins.css (100%) rename {src/application/static/sweBootstrap => app/static}/resources/templates/css/style.css (100%) rename {src/application/static/sweBootstrap => app/static}/resources/templates/js/bootstrap.min.js (100%) rename {src/application/static/sweBootstrap => app/static}/resources/templates/js/jquery.min.js (100%) rename {src/application/static/sweBootstrap => app/static}/resources/templates/js/jquery.themepunch.tools.min.js (100%) rename {src/application/static/sweBootstrap => app/static}/resources/templates/js/plugins.js (100%) rename {src/application/static/sweBootstrap => app/static}/resources/templates/js/scripts.js (100%) rename {src/application => app}/static/robots.txt (100%) rename {src/application => app}/templates/404.html (100%) rename {src/application => app}/templates/500.html (100%) rename {src/application => app}/templates/base.html (100%) rename {src/application => app}/templates/edit_example.html (100%) create mode 100644 app/templates/home.html rename {src/application => app}/templates/includes/flash_message.html (100%) rename {src/application => app}/templates/includes/nav.html (100%) rename {src/application => app}/templates/list_examples.html (100%) rename {src/application => app}/templates/list_examples_cached.html (100%) rename {src/application => app}/templates/new_example.html (100%) rename {src/application/static => app/templates}/sweBootstrap/about.html (96%) rename {src/application/static => app/templates}/sweBootstrap/albumPageModule.html (100%) rename {src/application/static => app/templates}/sweBootstrap/albumsTable.html (100%) rename {src/application/static => app/templates}/sweBootstrap/angularTracksModule.html (100%) rename {src/application/static => app/templates}/sweBootstrap/artistPageModule.html (100%) rename {src/application/static => app/templates}/sweBootstrap/artistTable.html (100%) rename {src/application/static => app/templates}/sweBootstrap/b52AlbumPage.html (100%) rename {src/application/static => app/templates}/sweBootstrap/b52ArtistPage.html (100%) rename {src/application/static => app/templates}/sweBootstrap/b52Concert2Page.html (100%) rename {src/application/static => app/templates}/sweBootstrap/b52ConcertPage.html (100%) rename {src/application/static => app/templates}/sweBootstrap/b52TrackPage.html (100%) rename {src/application/static => app/templates}/sweBootstrap/coldplayAlbumPage.html (100%) rename {src/application/static => app/templates}/sweBootstrap/coldplayArtistPage.html (100%) rename {src/application/static => app/templates}/sweBootstrap/coldplayConcertPage.html (100%) rename {src/application/static => app/templates}/sweBootstrap/coldplayTrackPage.html (100%) rename {src/application/static => app/templates}/sweBootstrap/concertPageModule.html (100%) rename {src/application/static => app/templates}/sweBootstrap/concertsTable.html (100%) rename {src/application/static => app/templates}/sweBootstrap/home.html (100%) rename {src/application/static => app/templates}/sweBootstrap/queenAlbumPage.html (100%) rename {src/application/static => app/templates}/sweBootstrap/queenArtistPage.html (100%) rename {src/application/static => app/templates}/sweBootstrap/queenTrackPage.html (100%) rename {src/application/static => app/templates}/sweBootstrap/staticInfo.txt (100%) rename {src/application/static => app/templates}/sweBootstrap/trackPageModule.html (100%) rename {src/application/static => app/templates}/sweBootstrap/tracksTable.html (100%) delete mode 100644 src/app.yaml delete mode 100644 src/appengine_config.py delete mode 100644 src/application/__init__.py delete mode 100644 src/application/decorators.py delete mode 100644 src/application/forms.py delete mode 100755 src/application/generate_keys.py delete mode 100644 src/application/models.py delete mode 100644 src/application/secret_keys.py delete mode 100644 src/application/settings.py delete mode 100644 src/application/urls.py delete mode 100644 src/application/views/admin/admin_delete_example.py delete mode 100644 src/application/views/admin/admin_edit_example.py delete mode 100644 src/application/views/admin/admin_list_examples.py delete mode 100644 src/application/views/admin/admin_list_examples_cached.py delete mode 100644 src/application/views/admin/admin_secret.py delete mode 100644 src/application/views/public/__init__.py delete mode 100644 src/application/views/public/public_index.py delete mode 100644 src/application/views/public/public_say_hello.py delete mode 100644 src/application/views/public/public_warmup.py delete mode 100644 src/apptest.py delete mode 100644 src/index.yaml delete mode 100644 src/lib/__init__.py delete mode 100644 src/lib/blinker/__init__.py delete mode 100644 src/lib/blinker/_saferef.py delete mode 100644 src/lib/blinker/_utilities.py delete mode 100644 src/lib/blinker/base.py delete mode 100644 src/lib/flask/exceptions.py delete mode 100644 src/lib/flask/logging.py delete mode 100644 src/lib/flask/module.py delete mode 100644 src/lib/flask/session.py delete mode 100644 src/lib/flask/testsuite/__init__.py delete mode 100644 src/lib/flask/testsuite/appctx.py delete mode 100644 src/lib/flask/testsuite/basic.py delete mode 100644 src/lib/flask/testsuite/blueprints.py delete mode 100644 src/lib/flask/testsuite/config.py delete mode 100644 src/lib/flask/testsuite/deprecations.py delete mode 100644 src/lib/flask/testsuite/examples.py delete mode 100644 src/lib/flask/testsuite/ext.py delete mode 100644 src/lib/flask/testsuite/helpers.py delete mode 100644 src/lib/flask/testsuite/regression.py delete mode 100644 src/lib/flask/testsuite/reqctx.py delete mode 100644 src/lib/flask/testsuite/signals.py delete mode 100644 src/lib/flask/testsuite/static/index.html delete mode 100644 src/lib/flask/testsuite/subclassing.py delete mode 100644 src/lib/flask/testsuite/templates/_macro.html delete mode 100644 src/lib/flask/testsuite/templates/context_template.html delete mode 100644 src/lib/flask/testsuite/templates/escaping_template.html delete mode 100644 src/lib/flask/testsuite/templates/mail.txt delete mode 100644 src/lib/flask/testsuite/templates/nested/nested.txt delete mode 100644 src/lib/flask/testsuite/templates/simple_template.html delete mode 100644 src/lib/flask/testsuite/templates/template_filter.html delete mode 100644 src/lib/flask/testsuite/templates/template_test.html delete mode 100644 src/lib/flask/testsuite/templating.py delete mode 100644 src/lib/flask/testsuite/test_apps/blueprintapp/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/blueprintapp/apps/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/blueprintapp/apps/admin/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/blueprintapp/apps/admin/static/css/test.css delete mode 100644 src/lib/flask/testsuite/test_apps/blueprintapp/apps/admin/static/test.txt delete mode 100644 src/lib/flask/testsuite/test_apps/blueprintapp/apps/admin/templates/admin/index.html delete mode 100644 src/lib/flask/testsuite/test_apps/blueprintapp/apps/frontend/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/blueprintapp/apps/frontend/templates/frontend/index.html delete mode 100644 src/lib/flask/testsuite/test_apps/config_module_app.py delete mode 100644 src/lib/flask/testsuite/test_apps/config_package_app/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/flask_broken/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/flask_broken/b.py delete mode 100644 src/lib/flask/testsuite/test_apps/flask_newext_package/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/flask_newext_package/submodule.py delete mode 100644 src/lib/flask/testsuite/test_apps/flask_newext_simple.py delete mode 100644 src/lib/flask/testsuite/test_apps/flaskext/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/flaskext/oldext_package/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/flaskext/oldext_package/submodule.py delete mode 100644 src/lib/flask/testsuite/test_apps/flaskext/oldext_simple.py delete mode 100644 src/lib/flask/testsuite/test_apps/importerror.py delete mode 100644 src/lib/flask/testsuite/test_apps/lib/python2.5/site-packages/SiteEgg.egg delete mode 100644 src/lib/flask/testsuite/test_apps/lib/python2.5/site-packages/site_app.py delete mode 100644 src/lib/flask/testsuite/test_apps/lib/python2.5/site-packages/site_package/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/main_app.py delete mode 100644 src/lib/flask/testsuite/test_apps/moduleapp/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/moduleapp/apps/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/moduleapp/apps/admin/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/moduleapp/apps/admin/static/css/test.css delete mode 100644 src/lib/flask/testsuite/test_apps/moduleapp/apps/admin/static/test.txt delete mode 100644 src/lib/flask/testsuite/test_apps/moduleapp/apps/admin/templates/index.html delete mode 100644 src/lib/flask/testsuite/test_apps/moduleapp/apps/frontend/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/moduleapp/apps/frontend/templates/index.html delete mode 100644 src/lib/flask/testsuite/test_apps/path/installed_package/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/subdomaintestmodule/__init__.py delete mode 100644 src/lib/flask/testsuite/test_apps/subdomaintestmodule/static/hello.txt delete mode 100644 src/lib/flask/testsuite/testing.py delete mode 100644 src/lib/flask/testsuite/views.py delete mode 100644 src/lib/flask_cache/__init__.py delete mode 100644 src/lib/flask_cache/backends.py delete mode 100644 src/lib/flask_cache/jinja2ext.py delete mode 100644 src/lib/flask_debugtoolbar/__init__.py delete mode 100644 src/lib/flask_debugtoolbar/panels/__init__.py delete mode 100644 src/lib/flask_debugtoolbar/panels/headers.py delete mode 100644 src/lib/flask_debugtoolbar/panels/logger.py delete mode 100644 src/lib/flask_debugtoolbar/panels/profiler.py delete mode 100644 src/lib/flask_debugtoolbar/panels/request_vars.py delete mode 100644 src/lib/flask_debugtoolbar/panels/sqlalchemy.py delete mode 100644 src/lib/flask_debugtoolbar/panels/template.py delete mode 100644 src/lib/flask_debugtoolbar/panels/timer.py delete mode 100644 src/lib/flask_debugtoolbar/panels/versions.py delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/codemirror.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/codemirror.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/clike/clike.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/clike/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/clojure/clojure.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/clojure/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/coffeescript/LICENSE delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/coffeescript/coffeescript.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/coffeescript/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/css/css.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/css/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/diff/diff.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/diff/diff.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/diff/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/ecl/ecl.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/ecl/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/gfm/gfm.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/gfm/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/go/go.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/go/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/groovy/groovy.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/groovy/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/haskell/haskell.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/haskell/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/htmlembedded/htmlembedded.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/htmlembedded/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/htmlmixed/htmlmixed.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/htmlmixed/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/javascript/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/javascript/javascript.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/jinja2/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/jinja2/jinja2.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/less/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/less/less.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/lua/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/lua/lua.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/markdown/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/markdown/markdown.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/mysql/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/mysql/mysql.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/ntriples/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/ntriples/ntriples.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/pascal/LICENSE delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/pascal/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/pascal/pascal.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/perl/LICENSE delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/perl/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/perl/perl.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/php/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/php/php.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/plsql/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/plsql/plsql.js delete mode 100755 src/lib/flask_debugtoolbar/static/codemirror/mode/properties/index.html delete mode 100755 src/lib/flask_debugtoolbar/static/codemirror/mode/properties/properties.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/python/LICENSE.txt delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/python/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/python/python.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/r/LICENSE delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/r/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/r/r.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/rpm/changes/changes.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/rpm/changes/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/rpm/spec/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/rpm/spec/spec.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/rpm/spec/spec.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/rst/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/rst/rst.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/ruby/LICENSE delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/ruby/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/ruby/ruby.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/rust/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/rust/rust.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/scheme/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/scheme/scheme.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/smalltalk/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/smalltalk/smalltalk.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/smarty/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/smarty/smarty.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/sparql/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/sparql/sparql.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/stex/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/stex/stex.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/stex/test.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/tiddlywiki/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/tiddlywiki/tiddlywiki.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/tiddlywiki/tiddlywiki.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/vbscript/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/vbscript/vbscript.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/velocity/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/velocity/velocity.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/verilog/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/verilog/verilog.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xml/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xml/xml.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xmlpure/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xmlpure/xmlpure.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xquery/LICENSE delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xquery/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xquery/test/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xquery/test/testBase.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xquery/test/testEmptySequenceKeyword.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xquery/test/testMultiAttr.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xquery/test/testNamespaces.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xquery/test/testProcessingInstructions.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xquery/test/testQuotes.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/xquery/xquery.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/yaml/index.html delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/mode/yaml/yaml.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/theme/cobalt.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/theme/eclipse.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/theme/elegant.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/theme/lesser-dark.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/theme/monokai.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/theme/neat.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/theme/night.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/theme/rubyblue.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/theme/xq-dark.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/closetag.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/dialog.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/dialog.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/foldcode.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/formatting.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/javascript-hint.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/match-highlighter.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/overlay.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/runmode.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/search.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/searchcursor.js delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/simple-hint.css delete mode 100644 src/lib/flask_debugtoolbar/static/codemirror/util/simple-hint.js delete mode 100644 src/lib/flask_debugtoolbar/static/css/toolbar.css delete mode 100644 src/lib/flask_debugtoolbar/static/img/asc.gif delete mode 100644 src/lib/flask_debugtoolbar/static/img/back.png delete mode 100644 src/lib/flask_debugtoolbar/static/img/back_hover.png delete mode 100644 src/lib/flask_debugtoolbar/static/img/bg.gif delete mode 100644 src/lib/flask_debugtoolbar/static/img/close.png delete mode 100644 src/lib/flask_debugtoolbar/static/img/close_hover.png delete mode 100644 src/lib/flask_debugtoolbar/static/img/desc.gif delete mode 100644 src/lib/flask_debugtoolbar/static/img/djdt_vertical.png delete mode 100644 src/lib/flask_debugtoolbar/static/img/indicator.png delete mode 100644 src/lib/flask_debugtoolbar/static/img/panel_bg.png delete mode 100755 src/lib/flask_debugtoolbar/static/img/tick-red.png delete mode 100755 src/lib/flask_debugtoolbar/static/img/tick.png delete mode 100644 src/lib/flask_debugtoolbar/static/js/jquery.js delete mode 100644 src/lib/flask_debugtoolbar/static/js/jquery.tablesorter.js delete mode 100644 src/lib/flask_debugtoolbar/static/js/toolbar.js delete mode 100644 src/lib/flask_debugtoolbar/templates/base.html delete mode 100644 src/lib/flask_debugtoolbar/templates/panels/headers.html delete mode 100644 src/lib/flask_debugtoolbar/templates/panels/logger.html delete mode 100644 src/lib/flask_debugtoolbar/templates/panels/profiler.html delete mode 100644 src/lib/flask_debugtoolbar/templates/panels/request_vars.html delete mode 100644 src/lib/flask_debugtoolbar/templates/panels/sqlalchemy.html delete mode 100644 src/lib/flask_debugtoolbar/templates/panels/sqlalchemy_explain.html delete mode 100644 src/lib/flask_debugtoolbar/templates/panels/sqlalchemy_select.html delete mode 100644 src/lib/flask_debugtoolbar/templates/panels/template.html delete mode 100644 src/lib/flask_debugtoolbar/templates/panels/template_editor.html delete mode 100644 src/lib/flask_debugtoolbar/templates/panels/timer.html delete mode 100644 src/lib/flask_debugtoolbar/templates/redirect.html delete mode 100644 src/lib/flask_debugtoolbar/toolbar.py delete mode 100644 src/lib/flask_debugtoolbar/utils.py delete mode 100644 src/lib/flaskext/__init__.py delete mode 100644 src/lib/flaskext/wtf/__init__.py delete mode 100644 src/lib/flaskext/wtf/file.py delete mode 100644 src/lib/flaskext/wtf/form.py delete mode 100644 src/lib/flaskext/wtf/html5.py delete mode 100644 src/lib/flaskext/wtf/recaptcha/__init__.py delete mode 100644 src/lib/flaskext/wtf/recaptcha/fields.py delete mode 100644 src/lib/flaskext/wtf/recaptcha/validators.py delete mode 100644 src/lib/flaskext/wtf/recaptcha/widgets.py delete mode 100755 src/lib/gae_mini_profiler/.gitignore delete mode 100755 src/lib/gae_mini_profiler/README.md delete mode 100755 src/lib/gae_mini_profiler/__init__.py delete mode 100755 src/lib/gae_mini_profiler/appstats_profiler.py delete mode 100755 src/lib/gae_mini_profiler/cleanup.py delete mode 100755 src/lib/gae_mini_profiler/config.py delete mode 100755 src/lib/gae_mini_profiler/cookies.py delete mode 100755 src/lib/gae_mini_profiler/instrumented_profiler.py delete mode 100755 src/lib/gae_mini_profiler/main.py delete mode 100755 src/lib/gae_mini_profiler/profiler.py delete mode 100755 src/lib/gae_mini_profiler/sampling_profiler.py delete mode 100755 src/lib/gae_mini_profiler/static/css/profiler.css delete mode 100755 src/lib/gae_mini_profiler/static/js/profiler.js delete mode 100755 src/lib/gae_mini_profiler/static/js/template.tmpl delete mode 100755 src/lib/gae_mini_profiler/templates/includes.html delete mode 100755 src/lib/gae_mini_profiler/templates/shared.html delete mode 100755 src/lib/gae_mini_profiler/templatetags.py delete mode 100755 src/lib/gae_mini_profiler/unformatter/__init__.py delete mode 100755 src/lib/gae_mini_profiler/unformatter/examples.txt delete mode 100755 src/lib/gae_mini_profiler/util.py delete mode 100644 src/lib/werkzeug/__init__.py delete mode 100644 src/lib/werkzeug/contrib/kickstart.py delete mode 100644 src/lib/werkzeug/debug/__init__.py delete mode 100644 src/lib/werkzeug/debug/shared/jquery.js delete mode 100644 src/lib/werkzeug/security.py delete mode 100644 src/lib/werkzeug/serving.py delete mode 100644 src/lib/werkzeug/templates.py delete mode 100644 src/lib/werkzeug/testsuite/__init__.py delete mode 100644 src/lib/werkzeug/testsuite/compat.py delete mode 100644 src/lib/werkzeug/testsuite/contrib/__init__.py delete mode 100644 src/lib/werkzeug/testsuite/contrib/cache.py delete mode 100644 src/lib/werkzeug/testsuite/contrib/fixers.py delete mode 100644 src/lib/werkzeug/testsuite/contrib/iterio.py delete mode 100644 src/lib/werkzeug/testsuite/contrib/securecookie.py delete mode 100644 src/lib/werkzeug/testsuite/contrib/sessions.py delete mode 100644 src/lib/werkzeug/testsuite/contrib/wrappers.py delete mode 100644 src/lib/werkzeug/testsuite/datastructures.py delete mode 100644 src/lib/werkzeug/testsuite/debug.py delete mode 100644 src/lib/werkzeug/testsuite/exceptions.py delete mode 100644 src/lib/werkzeug/testsuite/formparser.py delete mode 100644 src/lib/werkzeug/testsuite/http.py delete mode 100644 src/lib/werkzeug/testsuite/internal.py delete mode 100644 src/lib/werkzeug/testsuite/local.py delete mode 100644 src/lib/werkzeug/testsuite/multipart/collect.py delete mode 100644 src/lib/werkzeug/testsuite/multipart/firefox3-2png1txt/file1.png delete mode 100644 src/lib/werkzeug/testsuite/multipart/firefox3-2png1txt/file2.png delete mode 100644 src/lib/werkzeug/testsuite/multipart/firefox3-2png1txt/request.txt delete mode 100644 src/lib/werkzeug/testsuite/multipart/firefox3-2png1txt/text.txt delete mode 100644 src/lib/werkzeug/testsuite/multipart/firefox3-2pnglongtext/file1.png delete mode 100644 src/lib/werkzeug/testsuite/multipart/firefox3-2pnglongtext/file2.png delete mode 100644 src/lib/werkzeug/testsuite/multipart/firefox3-2pnglongtext/request.txt delete mode 100644 src/lib/werkzeug/testsuite/multipart/firefox3-2pnglongtext/text.txt delete mode 100644 src/lib/werkzeug/testsuite/multipart/ie6-2png1txt/file1.png delete mode 100644 src/lib/werkzeug/testsuite/multipart/ie6-2png1txt/file2.png delete mode 100644 src/lib/werkzeug/testsuite/multipart/ie6-2png1txt/request.txt delete mode 100644 src/lib/werkzeug/testsuite/multipart/ie6-2png1txt/text.txt delete mode 100644 src/lib/werkzeug/testsuite/multipart/ie7_full_path_request.txt delete mode 100644 src/lib/werkzeug/testsuite/multipart/opera8-2png1txt/file1.png delete mode 100644 src/lib/werkzeug/testsuite/multipart/opera8-2png1txt/file2.png delete mode 100644 src/lib/werkzeug/testsuite/multipart/opera8-2png1txt/request.txt delete mode 100644 src/lib/werkzeug/testsuite/multipart/opera8-2png1txt/text.txt delete mode 100644 src/lib/werkzeug/testsuite/multipart/webkit3-2png1txt/file1.png delete mode 100644 src/lib/werkzeug/testsuite/multipart/webkit3-2png1txt/file2.png delete mode 100644 src/lib/werkzeug/testsuite/multipart/webkit3-2png1txt/request.txt delete mode 100644 src/lib/werkzeug/testsuite/multipart/webkit3-2png1txt/text.txt delete mode 100644 src/lib/werkzeug/testsuite/res/test.txt delete mode 100644 src/lib/werkzeug/testsuite/routing.py delete mode 100644 src/lib/werkzeug/testsuite/security.py delete mode 100644 src/lib/werkzeug/testsuite/serving.py delete mode 100644 src/lib/werkzeug/testsuite/test.py delete mode 100644 src/lib/werkzeug/testsuite/urls.py delete mode 100644 src/lib/werkzeug/testsuite/utils.py delete mode 100644 src/lib/werkzeug/testsuite/wrappers.py delete mode 100644 src/lib/werkzeug/testsuite/wsgi.py delete mode 100644 src/lib/werkzeug/urls.py delete mode 100644 src/lib/wtforms/__init__.py delete mode 100644 src/lib/wtforms/compat.py delete mode 100644 src/lib/wtforms/ext/__init__.py delete mode 100644 src/lib/wtforms/ext/appengine/db.py delete mode 100755 src/lib/wtforms/ext/appengine/fields.py delete mode 100755 src/lib/wtforms/ext/appengine/ndb.py delete mode 100644 src/lib/wtforms/ext/csrf/__init__.py delete mode 100644 src/lib/wtforms/ext/csrf/fields.py delete mode 100644 src/lib/wtforms/ext/csrf/form.py delete mode 100644 src/lib/wtforms/ext/csrf/session.py delete mode 100644 src/lib/wtforms/ext/dateutil/__init__.py delete mode 100644 src/lib/wtforms/ext/dateutil/fields.py delete mode 100644 src/lib/wtforms/ext/django/__init__.py delete mode 100644 src/lib/wtforms/ext/django/fields.py delete mode 100644 src/lib/wtforms/ext/django/i18n.py delete mode 100644 src/lib/wtforms/ext/django/orm.py delete mode 100644 src/lib/wtforms/ext/django/templatetags/__init__.py delete mode 100644 src/lib/wtforms/ext/django/templatetags/wtforms.py delete mode 100644 src/lib/wtforms/ext/i18n/form.py delete mode 100644 src/lib/wtforms/ext/i18n/messages/README.txt delete mode 100755 src/lib/wtforms/ext/i18n/messages/de/LC_MESSAGES/wtforms.mo delete mode 100755 src/lib/wtforms/ext/i18n/messages/de/LC_MESSAGES/wtforms.po delete mode 100755 src/lib/wtforms/ext/i18n/messages/de_CH/LC_MESSAGES/wtforms.mo delete mode 100755 src/lib/wtforms/ext/i18n/messages/de_CH/LC_MESSAGES/wtforms.po delete mode 100644 src/lib/wtforms/ext/i18n/messages/en/LC_MESSAGES/wtforms.mo delete mode 100644 src/lib/wtforms/ext/i18n/messages/en/LC_MESSAGES/wtforms.po delete mode 100644 src/lib/wtforms/ext/i18n/messages/es/LC_MESSAGES/wtforms.mo delete mode 100644 src/lib/wtforms/ext/i18n/messages/es/LC_MESSAGES/wtforms.po delete mode 100644 src/lib/wtforms/ext/i18n/messages/fa/LC_MESSAGES/wtforms.mo delete mode 100644 src/lib/wtforms/ext/i18n/messages/fa/LC_MESSAGES/wtforms.po delete mode 100644 src/lib/wtforms/ext/i18n/messages/fr/LC_MESSAGES/wtforms.mo delete mode 100644 src/lib/wtforms/ext/i18n/messages/fr/LC_MESSAGES/wtforms.po delete mode 100644 src/lib/wtforms/ext/i18n/messages/it/LC_MESSAGES/wtforms.mo delete mode 100644 src/lib/wtforms/ext/i18n/messages/it/LC_MESSAGES/wtforms.po delete mode 100644 src/lib/wtforms/ext/i18n/messages/ko/LC_MESSAGES/wtforms.mo delete mode 100644 src/lib/wtforms/ext/i18n/messages/ko/LC_MESSAGES/wtforms.po delete mode 100644 src/lib/wtforms/ext/i18n/messages/pl/LC_MESSAGES/wtforms.mo delete mode 100644 src/lib/wtforms/ext/i18n/messages/pl/LC_MESSAGES/wtforms.po delete mode 100644 src/lib/wtforms/ext/i18n/messages/ru/LC_MESSAGES/wtforms.mo delete mode 100644 src/lib/wtforms/ext/i18n/messages/ru/LC_MESSAGES/wtforms.po delete mode 100644 src/lib/wtforms/ext/i18n/messages/wtforms.pot delete mode 100644 src/lib/wtforms/ext/i18n/messages/zh/LC_MESSAGES/wtforms.mo delete mode 100644 src/lib/wtforms/ext/i18n/messages/zh/LC_MESSAGES/wtforms.po delete mode 100644 src/lib/wtforms/ext/i18n/messages/zh_TW/LC_MESSAGES/wtforms.mo delete mode 100644 src/lib/wtforms/ext/i18n/messages/zh_TW/LC_MESSAGES/wtforms.po delete mode 100644 src/lib/wtforms/ext/i18n/utils.py delete mode 100644 src/lib/wtforms/ext/sqlalchemy/__init__.py delete mode 100644 src/lib/wtforms/ext/sqlalchemy/fields.py delete mode 100644 src/lib/wtforms/ext/sqlalchemy/orm.py delete mode 100644 src/lib/wtforms/ext/sqlalchemy/validators.py delete mode 100644 src/lib/wtforms/fields/__init__.py delete mode 100644 src/lib/wtforms/fields/core.py delete mode 100644 src/lib/wtforms/fields/html5.py delete mode 100644 src/lib/wtforms/fields/simple.py delete mode 100644 src/lib/wtforms/form.py delete mode 100644 src/lib/wtforms/validators.py delete mode 100644 src/lib/wtforms/widgets/__init__.py delete mode 100644 src/lib/wtforms/widgets/core.py delete mode 100644 src/lib/wtforms/widgets/html5.py delete mode 100644 src/pkg_resources.py delete mode 100644 src/run.py delete mode 100644 src/tests/tests.py diff --git a/app.yaml b/app.yaml deleted file mode 100644 index 65c69dc..0000000 --- a/app.yaml +++ /dev/null @@ -1,3 +0,0 @@ -entrypoint: n -env: flex -runtime: python diff --git a/app/app.yaml b/app/app.yaml new file mode 100644 index 0000000..c3254ed --- /dev/null +++ b/app/app.yaml @@ -0,0 +1,21 @@ +runtime: python +env: flex + +runtime_config: + python_version: 3 +api_version: 1 +threadsafe: true + +entrypoint: gunicorn -b :$PORT main:app + +env_variables: + # Replace user, password, database, and instance connection name with the values obtained + # when configuring your Cloud SQL instance. + SQLALCHEMY_DATABASE_URI: >- + postgresql+psycopg2://postgres:SoftwareEngineering!420@/35.184.149.32/boswe?host=/cloudsql/boswemian-rhapsody:us-central1:boswe +beta_settings: + cloud_sql_instances: boswemian-rhapsody:us-central1:boswe + +handlers: +- url: /.* + script: main.app diff --git a/app/appengine_config.py b/app/appengine_config.py new file mode 100644 index 0000000..71abeed --- /dev/null +++ b/app/appengine_config.py @@ -0,0 +1,4 @@ +from google.appengine.ext import vendor + +# Add any libraries installed in the "lib" folder. +vendor.add('lib') \ No newline at end of file diff --git a/app/cloud_sql_proxy b/app/cloud_sql_proxy new file mode 100755 index 0000000000000000000000000000000000000000..c8f2c8d85a6a21474cdae74bd1fd22d24a2a6e46 GIT binary patch literal 11543680 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 q!1Lq9e^OP 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 J^RaK9mXL3lE}Q|M2(jl1&ld2vc(fSGoW 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

    hAq3GDn6$z$;~-!Fmi7cABTUvqzU7^+_f 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 z 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%0A>GSchSflKyD3lcf*xwpYQVCG2J%Er? z2{sRG!kH0z_P^&%^s)Q-mt}9b`NqM|Kos=uz3%sI+3nBxXcW5YBD>F?l80n(oNqPj zvcUSx5tSv~oAf3O#@@wwuDPLVKU|{hf0sSOPhiQ%BImVc7UZ>i(*SA(OnM2p6b586 zaQ)`*3W+UsJ55vW^Wbni%Y4ZPtLyHI+Q8=cAg^>|3HDE6yb(Sl^nN>@%pNI`L}WHP z(Algc3g~nJIy?Ot8xd=tl|It&Wsa)!r@&9B*F&(u2Y>+TnDYt+4D_-=9Irrx=t2fz z4}gy*4X+>Bt_eNX8+C7)=SrCk1mcHB1>^z_wbXGWj@@r= zL0?6ysAs%wrFgDo3h^7+Od*bDcy8RU6(GyA8zQ%=VyjJkb?;$6OgntRnV4;k*5Auf z|4Ru4W9mK70VI{e{e8pP#_jQKY-*(qef2NCDE*>e)3wW@^}DdzqA??`iRG&^N7IV7 zY@)}HG!ajq)Ry!Stc*eMp|-^cMfSViU)V^xm7Ru&j^;9cop9le>u7ejLHRnIp0W>qbW&jl#p4##1!D6L?8~#*muHy+k`Mxwaeo&?pQuxzE@@~NCPWkrUA=TYj5W-v~8*f?? zB?DN9i=V+wZj=mo;7BdAssZfFq}Np7t38}({k-M^DOn4tb38-xU+ z1#3Gj7Y?|Bzk_FJ>y@&T;5)eh>1K$MNzt z2ei#1Z8J$*Q9@KMzB~Z{%o1>dbu?#jb4L73;d`#eEaaHm$$70U8I- z)3^~T9v6B-vj^QjE2F-FD+_;XFK`LdgyfqCI~?a>j6~#0u)Ug{tf!e7d>`I&%y&I-^{jQOEF-P zn%$_m6Ki%6mKlTvBZQZ8@B4B;wob)9JnvgavuVKzdjWV_V)ps<8iph!Dvs6ekuE3!I$+7W+L4OF#)?s|s#tE~ zDvpx1*>B9u*AY3>&aIZB3k^9goF3Zk+tNm?UZ6GGl-Ed$gdajiyWLY zbr>ziGueI$n}uqK4ghaxGrmjbt4zLfIsjO1_4T!A#qex>hoNa}za>;6A`ksR1;7iH zq_g!*=f}&|b{-^c2H?lT z*R!pRD1$HX)@{y2DliR#rTMT5#N2JZ|B{G7`!Ue)%fK*No!Fl;Apj4-KvV@wl@ys$ zlu-AzRV1EYt;D}!RM67u=v)TKmTyf+xXpVYS*is*PPKYST6@6~;E4^g2GG}y1`nI( z^TgNewrZB4yg-Pn^y{0!`tbjq;0_J4mI#e{uRH#Ywu4j*mN8_)sBpiUXgq0P-< zg_x$tu==-r2M<4-yzLs9wa_ZQ0QJS8xCsbc2!{S}tC~zUZ#ak4PwEeM4RfA-I z$7=+pLB(#@AU2g%IRdK8AZupjSR6dhXX%wA+N)=&m17gtvy{pa7+tZPw{omRYHRA< zl_O559P3791)-XndKBpx+8_lw@i$&~t{mG%!#;@@hH7q-2cF8YU4v+bM2GwoBa$qt zIal4Nz8lZ*Q1x|k55-bUu>glgB6NmI+>|M=`5DGhe3edEV}sDv18_BV_>Ie1UuIKS z&RUMNECXhr!aVo991t24WT#mvt7rwj8t0hLMv1Uz&&e{!JQ@UVC)yz6!f663k+N^* z%8lWv&Ek}^l|Nia#)< z?5M`~Zw#=2otdG&iUG@Lbl5W_25k4GY~n|NJ>_VC-S~hF>_5(r0UJ&pb`>NOJb*Et z$gyqjOQGc{xU)69nY`c3el)Om8s)u^@?IGA-zf6`fj>#dVXmx=bZHgi`5;iQX%+8C zlxL~(hm6VbYZ{C}opoa_oQI|pv_(%!$u1}B+C~mB;cMXKSm)s>ZgjU@{YK6~AJ?HT zx)mRUyL8nyhQ{H|*!?mr2q2G59kG-M0I*&EaFl|dqq(pcU8~vY?zlnMUaJ<_g0z6O z_3KKp67e4=F?nJfrf!k^SbM2g$%fj!)4qS0H~6ESEkp;xC_Wr`h?1L+%_|4iHz5x= z+_}XZEqWzS%_Pzs`5`OO(NGIgNis~*)|8Hf33!694Nu@LTvT@w_VgoAP$9U?lfB56 zz=0McypbD4vJh+n{BCnsW_?p+0v{PkH!Zfd{_vdT5Hg(_K>)*^|Ma9rXcZpXs9HW_ zo9C5V*67`SvU$|D(S9`R*&vtXzsaTd-{nFF7+!FJ9-4xi%eB4Q{bl)CKqiAwFQMRY+DtsMre-_b#wNyg-52 z^CHCE{;ko{T>G;ZCFlw(yizyV~Fg&M8aT?k77AX03%s#KMo9y4B zNqRV8&o|wpO-`O*H~H21N73XtQk+fRd#*x9HF=`l&7uW?O^+rOAlbGYI5Ek#lGkW|Zhk)$K+S>BSwO|ZQvi5SS&Q+f$g!9y z-T_2$Gp$%giur$B&W9HO%W{(o3Cy&ZA8Q8DZr%OO@YfcNRsI+H2u8=zAK@EG^#Bc2 z|IHqnQ{sXL1m0^#K2oiv=)=5cp-;H`|A?ZIH1I4-jJNl7Fu0InOt(MmS>8=#>Tc5aGDFi9v3&M@8 zdkkQ`pJ}=3wpLO-y=S5d^Q+EkdIQ#obOTRQsnZ2AAk2P4Te1hG)+c&T=c~DTs7IQW z8z7#TlPKg!3T+E2U{yv^at1ME&;re6ox$c(uTg}{VRJeQ7O-L%yh%8I>Fou>*C)D9 zCw?Rew_{Sq)H*>JBq9F%BdJIO{yFGi4F2*w;!4XT>cyY|KvjU5*L87B=0I*ILT=eI zfGMa8Vn2bE@n1871{kfc&uHUo#2`>pLF7L$erBH`knTqu?oYhFX^XPiv$Z(y8q>T? zD&UbHga&80cPnqa&E6rY)ZQVfhHmPOqTOlb>`P$yc`tO5?11#-^qRKTT&$Ag~>2q%K~|y z0-<9TEzW*uiyl?wV!x=e3AhUBHhcXw$l=*E>RGB-^ ziYha$gn;iv1@}?KHat)DSIWE`Rv^mkIkz=s7VSFS z?NDa0+%nL>U81pb+40AsoDz@~owZ|)(An$GY@xG7lj3w1wdNCO;u-6Ft;61cCz0YG z*&5Z>D01fE3&B92lY!0n_g{V+uOGIM!!83C>NW1>@(!+_Q{3+x-KMy&e%m4LC!-Cs zWTC<<)fRUcgf_+f1d4mo&dwC~%jwxe+^_T=N!;Ph(?*&G)_bvHQ6Y%C`Tbx};DlKJ zN7ckSA=zJPCZ;%}vrQPwT9ZuH1O*DhAsEyxZXyNozj^2BMnJ+3hCdsPB|n}A=g|?h zLROG7@(yL(jue}^|FCHxrnhcmRH0)0KxD^Mo7;@yZY&G;Dr@|VQf);#$;^v|AA)wl@AYopf|mtuYUR|`8%5dQ-n0RDjgYLRshltk7s9s@Bc|9ztGb>wIKIV9^XGa<1u(78dkv9qYIe2LGjRBpq@meov~Jam?yLdPQ>2qM zZHmztAw*Qgjph+oJ;k4~#&3*paZ$|%V3e0pV@(F>#?q67zG^N=t9prp(io>$@#j3j zz6M8739}l<8bdo-Un9ec5l@8R5OBDiUxpg78w>aQj72Um^MpO@f%8eoyJ}!9Nq){r z-6h~u0~{ansgQKyGbWxm6l58yRiy|Nu?cuWp}QJ=s9ph*q-Q8V_+7?U0pM*6Vp|8` z?IQrNIu3yD764_eD;9haG6(?JlualR4*+7-puj~@0Q9DR$GD2bF#X_Hz`LD%o6)Fn z|GjkczKrk5Uf{kZ1-PeZRiDvqbBKiE08Rpyb|C~r{B%nukmQE!j$gWbue^3!H_u4m zGS)~ug9fC~_e%1!V|L!vfi(VjLK)clQ+GI^9kdO9>eo+@_o(Tc6p&azM4?lx21 z00tBkf5URH7}fb2B&QKX&+!o#4Z*XlVpa!yKCE)$4YCX2CC+;{ea=q%JpC>Sl8{1BDxlL{;&ws76U_=(uF zy*)bmU@_m9oxo-UBRD^5u2@=b#!sQ-0)3-1$R0WV#K3R<}Q+9+VY{ z0$@2hk^&KxTv{C|LZ=8uf_<3HxR$=;{r7RO?1${&B;%nnv~To>l}1FqMZSnX^luz_ z5%~iXiE-)*5T>3+uC-rnjdYB?s^+V;Sn(@gZH`Rit!3&Wr{jknIs~&Ec@5)5ZZc(A z21c#j+Dvh&* zv?Wbgs^Z!4qUB=YGd8nc*Jep`D?1ChKwVu)Dlfs0`4OUtx*^B(Mc~$`*-LEIfW;R6 zu1!g-r0#95eZz_D3<{!PA#QkW^;2{2xuD3wm`4=re}x{E(6YAZF`Dmwj2>4@A=1O> zg3=t^WpB}p3eu8EeXUU_n%kl%)G~JiGl*7R1gee8-B5E#t!JQIn)n}}dg%!nJt>6;-vhZ*4!)1n zj*bi0h*=J66%a?uTU@d~T z@q-xA;7M8DkT@ThC*}k+>qe$E{UI8DwMP=Bb0VpBRtz$?`Kx9Z{@;QBO}tU_STOO~ zn`gDh0oJ~$o7o*=W4pjAQTkjL&Ux}9J*Fmd2@fj7V(TrteWCXpk4nGbmX6zJ52t^X zvEQG)W;UwYpl59N)m8&^IEx>YCh6H z7(txA&n|*E!D<#kj1Y^$_=a5%CP#-O2({_krc2y44D$W!&cpKv954V?>wG_qBK8T3#C7{E<1-{UJE_J|u zoAZbIa5y>EHv2LT__iDx$3_3y>$SkI@s+&!EKv^+x`4-q-_8XRp^swUE?9@7rDl!y zVG-a6Oc}LzQ=LXY%aUM$xfpN|qE2NlFW$LQ#)iAJXKV#B%!m|L@aG_tMkht{{rCql zGMm-r{1BxvFSI=`^tM0rR^1}ANS^5A3Ae?zcp?$n@hN(El9x^2U^NXu!hhU4R$yOPHRmWqnX$)=YXEj<-m;k+<`9sk(BomoUujypttAC{{}^ z-M9il(lywX8nj3!En;%P5ib~NiwOzr_-X2k#revWODmt7H=hYQ?E>-b{8zy-C!L^d zn%6^HRp7=Zq9me<;lcP|*>O<2o+U2z#H&FK3w^?Tvoa)Jx9HkW2?F8ype@glW{ z=wON^vBOGXU8H6jHxOaC2_TGxvO`)ig9p@#h0rRQZ5b<1jX)y4ARuT|sd;5)3CfU^uM>4EZ(;ktZw*t-zpdLzjhpR)8aO z(^SOKo;tynQBCmt33e(Cg3g`T(<}XHW9XIwe){kjG?9~O#n`&!BG{2Z7r}ifIT8$g z2t%lsH5!0;fR2c3npYqbf!d2hVoKZ9y~<``c@%m0d`zX{Q0p{G4vNZLb~+Rz!)ZX8 z$@f{xegL5&pa9_}AE=SFNt&a8Im$4iSLxLa)@Y1%%;~Iq3rq zqNAe_4Yxi|B>?GshR-n)jD2pNlM1XZ1OXIQF?kSBhMr&I9(sXRu?LTI z;}r>qV7Y`IsNF|-+DHA|XLdrWu^yg*jjBk^dr750eTR7?b)!nrCWO?QWJFGACAxs` z(*I9lorrBq`B2q6bU|=<0y>sh9c8Z&$<0FdDhpW)NmxZex@Jc^4yKIN9(;a`_(J~i zg-*V*3Eby9?hEXD0K_tkdGS4GY4{FIEM$=%1(D$WtBY!YGQ&SMM&{Y~#D#xxl7WWz z;TaVqpQPH(A3$7j{dr3OUr~f$h=0p2J^NkF=yt4)Z5_zNCje5q1EfsHeU^O>8n6s! zYWSWLlY9rTb6A8>?y#UFsyv~dsIglXs2QM4>x>6z?5Js>z(do^Sv8vWvPv|)LYh*W z^mE5BHo?A>HS<_yX}V@ldtY{gX58HA*qSBG)o6efs|uAkvtl;n!?F`&6IS#c6E3pU z49>}1Ke+3*;8k!dczJd_b%BvdHk+6IU(Gn>7@HY2aO0?fTj~E4`$4w^)Pu7NkVAr- zQ9+zTumpV;TcSvD&5ReJ^6Tf0zNNCw+Z4QvAFC2gil`VOaHyx9Gydc_>3BO_P;Vl*;ZEm?*C`M%a`zYXn}*A4+A!|oHzodC*;1?kGDBksHqu`;cZT38OQC=K|Q+> zoi-k6ftmQ1nogA*rLF4W9TnV~t39}8WaY&69sK~j*q@DwPsv#g43xslM6Xadt^26p zCn&sbWaSO*JNb?4;UkJ;^ByrS^oMqnhBmfUC(^m&T+=R&<%|NR>S#-r;s=r>_js5- zIqYLx0D028xcbAMT3nziiQu?vWaUT~GAPSj9djy6TnM(ydax?%LA~#8a?L#3P+S~yJ>K5!25F6h0iglL!|r(sTm=0Y!U@NrAh@u zyXpupE$M?Fek_f_7)7f%jDoc0DR}4$-I=4m2Ey?VL8Uu&U-ssCnikk9g+_Mu=7n-O z0P5<_3+Hsq+turb@K$|A@AozN%K6N^g?gmLxJ{_fb(D`Zagxj!9GPY-I7*PO7#2s9z^?v``c7vaGA~ksBrwP{ zH6U^hD+sNPT#2iBqJYR=CxPw11CP)=Tq;9nOYtHPaDFYEl*J=mvF|)Dp!G_d){tTH zfE*+J^=7m;S4wTDpeb1@*vCs;1(?#43KRpISD=R|wwnvs;@v!jCok^hgMj-xwqJS)^2;woQ;Q7gD=kFnb*J zm`|3Fl_37zJ%sqPcsUm0hm&;mW%e>oMCy{yXR!(W&GD4viznDOrfYjL!NOR zvOvB^5Bg10Uf=)bx!z%+X#hPBvkmWJUlQ}PSt5to+vW^KD0|LDSQSTd6r+qUqme$; zT;4Wq@?nXgFR&jyabuoq6JMx$HbnZdp5IyZ)Xo`#aM_%}$TA@msvfCQ)w6*~GQPk* z)Kfps7z%|_ZhT}B52!7WTF^Vq8G+E;oM96CS*B`1T1>_^7H35iBwJwmZnNZt0Ldc$ z^^sccpx?==?fp5IV)kdwaLMSgMi0y%KwN2=a-EG!xl54+*Jhtf09MtZP-EmhEY~&v zF;n=AjY~0^w0RDe>966?h$wP1DU0R^dSI<#BV>6$HZol!OC&9aoU2>5NBXd?+oN@j zW?i|?xPTt+VyrEbNCb2x7kUz3HG<&aHt1KrG z&N2EbxB2pu>{KMXQJmt5oO6))KIe!q6WNafLhqM5h z7@mT;?luujsG2;J{lv<&*7gUf2(O4YO+xV zF;MDW(|czFL?_;1wW+A;Ar;SVWaEGk-_-p{{5{aaO?VB@jUU?6;b+{g_N%XFAP=pd zj^g~|eY)eGE`>ZtmBNz{oGhbC%8Roll*JYd_!25$-=uy{x3`T~fuR1_XpfZ4_^)OlWX98fTGI^OKY8z%_`k^D$&2lK>QhZ|lFYC_m$?7L;cR zA^X6OV`P^axDqsu?57=WjqH!iX`Ae-9+LgJdMDYnRf?k8s;V?O#vRiTddCg?nMUAi zc6zO!XR4nm_^A)eAD7et$8l|=Z(m!Dh!=RKNR2TqhB`}SP=leh3qOJqNMM!cp$^7} z$SZBt^JxR+`bydWTrms{rVYjo9U`}SP?g3b$LZN5s0T~ac(4rJArAB<)-*^SER%sa zqD#O3;bOc`O9SLU1ev9~fxvru&1V1{J-C=vKg{Yg+Z}NyaVo&4RLb&ZVX&ClSS(aY z6lbd_2dKuY#wHkMNywq*GZ@8J1WdgnPL+H`g;Z}4g)lRGUn|jenyZZr#D2=<2se0+RQAaGWqZ4 zs#N?b(AY=2d$D{nVVB>yYNrpqwl8p?$rsp-#MwrCGC@As3V>3zyN65B$vgbU)Q@eS z+ZXsG)ra%KHKU^xBd3t#q!+TwZg{jFPkH9r8NZ}IJ?1AMM;FE=K38j$CD--me3;t4E+RBZ?* z8RS>a?snc9SHam;xa9SH-|s@2yW$!nY%9T&JOmJe)Ciq>1I9R6b)jfi)C^rY$Z3WU zdlxgbf*(RC#SF1JF+=F=$7iYHs*Aw1MV!^ja$2n%vuh7!wGgRMvlFyh=szqU$4K_< zvkcesR-!1BK$&jJZ6#|L+g190%y#7qG|g?-)P~k<*N5<@+v+k@J+xg14>)a?Khz&V zWIX3spL9?WX2uLm4>BVd+2brSw!*fk3Q(0^wXR1tM~*c(F&2bcAScopiX` z$%yw#tO%UwU_}8*s952LuVf@wd};Baf25TTWSU~azU?t4 zNDVDIkdF?w#)JY43ff|Vs)tONx!=hI^wk6Fd4LdnO$hV~(!!XGbvDbaxE5D0F@kFj zd0ScBbV`mXG_x%34*4OW9yI`FNMr*a#_|Ki;)h!gZzK05x$74e*vfsHaMs}&81=(-@t~Ijngoo1>*;PFx z`yuhwqV5s|NXRAz_z47x5d&S=kUy?H)+5$ad;|4v?e4qrA{uxz#vjBW4a;4k!$UVR zDq$`!;pbaPbP;%ji7Q@ERh**TeJZOk#(#=Wu}NX{(^J%^JK%e&PlfaR^e#~z&J%LJXQOewsJNci)W1cYoKR*Q-SFJ}tu4ta z70KZ*lx=oMFAY1@GS%rXq|o{oi{u9@5BT+osh^Zo^NCyW5~k`B`R@|T&NhT=%DUM4(yJiyWm^yk0h~Z z_hw~Ex+ArxM|XIfQs$2gKYw+tiniEIjz#9rvg~|K8BAy$_$~bv)>+`P7@&@dvC|O3CZEH_{(7 zbmm<9yI%a_hJG%*McLhv-Hahlw%_*XgSS`r!Q0(<`+nq6z8z}6_4i~$J$m{;pS+G+ zB0j$DW4|5Ql@Lwr+8+P*>WY7`@IsY*4_UN;2ocC#fM|2%BSsuQn?gb$x3;VUYfbDx z-iE%bs(MB?d$x5Sh}YG`5Y@7&j#QXH7xiZF_>|3AE4349Y} z+HZj@1&Jw2wJK=Ts>QP?Xc3SA6$Y(X5w#pby{n*Gpan#bVpAZ7L00it#kJm|sJI}Y zqPBog@It)6-Br9N78Oql?Aq`Df8KW{GfB$fx?g`vX6C(~`+44bwz~hE5sl?*W-stkPY(nqohxL9>MMvcqZpJZDZKBz$Zo;}GZ-I=~sokY+8t;x`p0(VAfr4r;_j zv+Qkgss3@W-z@{-bu>bB@EoA9HVV1K6|)Rhxu0vS^<}oXJ`J8CE$SP$0fecoz^Xdm zu+?nPw=IKXq+>8XQN;@uP2VT{KtN328IlF?Scf9AY}kamj(mBlhEt6wdXK)pGqX7s zGs?Z5m2%FCput$D&J{tPx~~YSIZ4z#NwV7=Hmfse+VC!yKV1~4=2kB(d6K12LG|3C zXTLzW3!Y;E{Nsogi3P*}gKtAOC1aT~gn$8wG;4@HPBBOda&d8>`aAd{Ub%Sf+ae+3 z4J@^f_#0XijWVKP@iD%zDVnR%SnFGl6rWJ>L>5+5+$7jubzTG;02c+jUdsHnhKW0HrqgwoSBZUap91{7+ z!kkL}n))~D`+GOFGr_TZN^GIBpG5cEfYr zYJyED3%dNHA%_3IWEerfl;Yq1rmz(ktJyvhbj1)5Ghmp8Zk>O8W@m$cjP5G=i)#t- zgMBW*-ziRg@1*0(qK3uX?@-P8W=8@|UrmYIxZ!dbROuRZ<%W#nIQGJ^n$I9&J!IjaU+E)tyR(ofIc( zeZNvol>s%-q=q%&&skW7oPJ#YYsnif6L;dlOXaPVvQ3ypt}juJ-glrivfDfLEJp;4?^6V8LqSA)61@(IXW3 zgVduCS4xoARXZ}KUWizu6%MR_?r5y~NSD(FuzktD@(ET-Yfr13Q>uz%e1YZ6tW{hi z677g-rEKgoBcVc0l~bOM`p2(Vbm~Pn5%E3pmC$MV4wvg8q*jkhe-kp>i26VKm1OR! zi+@2RBEHw~5oCVgH5Z+D=)JYDB7sh$S={%_Iz{HF6!(wBN9(d7M1dMd6KDt1#EyUi zW#7MUWc6e@=ojSBu+_1J9U-6;B541rGJt6@w7V$la4{Llszji}fi@3mnez)U$ zoPGtk--Gtp_b#s~Bd^dV)<58L>~dNq)BmZY*aSb2DQ#5BHD9``+VL4ucsDd^d(>0g zCrsH2RYA&4o|M;^a)+e&`*_-UiYaFz#X9mQDB66)oA%rrf8+i@^zDAqGhu!A&>&~E zaKtxuJ{jG6RA4vM(MleaVHR|)qwfb;kP_H>-G_%omX)SsK-Vf9A`GBkmMB0AvJ8-z zzHfh~$UvUO*@|?VzBk@eAA|gui$!v2*5&8p9_Rh6;XeWk?iN&7B*0(2ukatBFKmW) zbHSOF0?xBj!P(eBNtA*Uqqk|+i-QEt#XkVfkq(?T%@g2#Yp>zuIxBcKT>RF?y|7gSRQOX020i_`n?YCwnP%0UCy2ke4Txvi zh$rAH{%)`2OXE9A@O94M#~~bbJ3G4Y-QDr~+ctY}jvv48#W~jJgPV0?PYzIc>_e5NRKso zJFW`Gck$OS+;y3blcNk|V#+1WngCU2Ciq9<4bvHfiN^(ZFK^w|)DU%~A<4hos_2PE z$DkJl7;;$+YRF)x6vV@|j_5l@Cu6(j_VUxatP8Iz$IX`K0GeWKmEBx%SYYWnSiKR- z&aYEfZ;CGGqV+u9)9@Ys|3(cbv)dtlA3c+7>kF(cz^H}78SSC5hKH^F0d8!li(Fp$ zozSmYddY@adOOlY?Ed921u1E=paC>_T+_tMkG{$EgAL+DZO%CLuiQ_KgJxs*v76-Q zu=*!#l6&jNvWq?NTj1v;ll2hvLBTJPP!i)Mnw#omN?`ozZve$D&i+(kCzy69d3IzJ zql?2b@PvioA$$cpF@-5Nr)JB|so>gA3Ih-Pff-LLc>z(VE|8Zz^z3#QkDLiniei%- z+lk<=4KB3+s90aqR@svv;}ghjVUi+3u{y0t*1$KHDP>a{sQtra1RYc4Xu*>3b_6VC0Px3XFI6}wRc?P1T zR8VJ7ru$3DIL4Nyz_D^&5{@6AEjWH?0mq{R#{~SE6nx!d1TR3-UcpaoarKn*ts$D-&=hhS`VMN@y=QxUQhYg8F$_ov zBh zcWyqAL*KlSy2KT*c3)qyAJ8m{ zxp+k11fHxAW8w|G#w<>O!xmwlhbNcy6`l?6T!;=@eg^TXMst*Z>QX*{kuQx?aqVPK8-7?Oj|t zlC3anPt5+`>{T4UBzb#WblZ!|B@0t<>DZ^-ToQX#*h9E<_Q$E^?T@p!4?Fxxg8ysL zZ7=+HYfwG*DqA}Ewo{i;h}mZf{MG;ZU&DV#^Y9;+0{#!RY4X6o^A$J!1^zd>3;eJB zGd28?ef4(-Vf{{qafQV9UavM?ERdJVT~a~W?N>LHSkanh9jl-`f=~|gcc!-m1u5jc#52w#R%t}O(EFl)q^5V{UejBRuLi=?St5Q|q4YCwY?FP=qdLYJ zM?gmpG0dKa^2k7YeEEau1sPn-H84{jHhDCTsLf8tQHuJa&?5A{iy3dZ;$VG`W_FW0 zaj^k=&l(#xB4~L?6y8ge!B3^xifyC|Uh3(6za)0Si{|LZQ=s|XLrG|soGxe%-3&By zv=k@E?`DM``nqEf6r%qP9dgD0*fJfTzmZ$#uI5olGGGFgYo*6aWQ~Z%M#dLPb>Ca} z$8#;;Y>gqDRX#hXpeXkCU?FiOA;1bb)vqT2oS+4R>qJ+*n2&ud1?D~K-I$BiU)@bG zAGHaXqhs%iuoLi?8D`IX@gDH+rTagS(mY^*OU2Of1`26pC+}LwCt~W@R3w$DBo|uW zh~j$Dy7$o(Xmxwgjh4vmZCwSeSswze(-c|>_^cr$`-0DfZh0k6a%Q2782WO*AC1vt zf14{YA|1cTFeHOTU?DJts-l2!yNqJ%Ft1e#ESEfz0?Pxn-*$x?3r-U(ANl}TcJeR} zI+}p*zUwE(7L9188t?0n0}Rx7UtB+}8|NrlbzLO@mKKX$5^RB}Gdgydm>e%VU)L7L z;|p8g?`Eg0vZ_5*5PjkO=JivK7~7ZepCbh`3?X%!A%D4)KZEK9^Oe{?uM$h)Me#Ik zB0YQ==dqg-Bj$Dyz8v`;P~1bjd%My%r~*eo_F}yG2+sGs;M{JRUQhVlY%+cIVhy~Y zPtwM~1NtNH_oxoF>tiNl0bAkaDm z0?TSrDF5vrCW+U=Qv`uWHv)ka;|Z@TdV}j@;6gxeSRjw_j z>XQY}m)`-N*)BCo;MX6A@4I(stLD<5eZ=<^F%e#TKlxhC)BF_t zJx;H7P)=L${rLpJ_uIF2kMIA&Uq>F;2Y)?U?2s47!&2e+)kZf@#r0(>9NQ4bX5#7p z1%5B=3w}|tKVJNL+?Rrf#hz}FtklRmUU=B~&F1mb^HD+C-)!1ncw$bhp(`L^AzgBY zb;*aWH368mzaZ0yaKjEJs;wT0X{gIiJ0dX+9U?oer8ljr4n2r=y3Vh0hzj9AGqSRk zU{&ErRcquMKxKFHQ4ex8V%1i(<6d8ok4_GvMD|iJ4{b!T;yfP{(}6IrXy6)yK$ts{ zF)mJrLdo>#nkVLSGdiz;fT~K2BAHcRA(><0tFBqS;u0Xf^2ha zco#D=IPIq^C?#32o?2yTDOvOa2Q&_38=_s-HOx$v`2(yOa8^U8%(0&ET3yz~y5T2P zk%v`&^2mkY0BHoEE=y5lF7jG;uLm3ZN=Mz}A17SqU9Z5c(7Fc( z0cgyada5j{5jU5E+YSag zq__&pBlJGiax9)K1h36LSiMeNL(Nkj!&$&s%?>ctT1md9#b2$f)`4O?#@7Sy9_W=W z^z!j^l03srudn|>3!8#o>B;nJsNWsEbbs3wFURSXK6N4+0j=62r~`e<$%vb=G2l-| z_fIOWjqeUnf=-d?h1C-_olvlVrFm+cQe9}|=87(A1yFHz{^p8f6e+PjnM?T$|y;t;Xl}yjI`#{h8)_Ukk96=iJ0^2LAcBW6oeuHcy+J(CoPUpeyfu&q3_vg_Mz|lA}{Tl)2~b3X-2== zCCkf8YdrXQ+TXo?wfish%ZD`=w%jD^SGzsxmk&_yvwpR1j$X%YXog;`lj#+G?f25F z^?yOH_pyked3v?pBfZ{V{X6L8Z;oEu-)e?l{$zR$N6Wv@e*6CmdOeEO3(eEZzejpK zimSbnE6NxE1w%y^3p5{hRoM!OUVbE)OO4L#aHV8WhHGZoIJd#Y!O18xF|v zoa!M#zxM?n3~&&={{o+b6+Rii1D_6i#K$bic|z@vdmMwc*dMov)WZI_4g59rFBY9` z;X4P0LFX0k_v7dR4Y`CsfaZy+f_sR3K|;C{hX*{Zih z9ROhO>$1hBn86HIne7UgCt*Mne!4I^2<|%T!%d^HTTic+(;I7e7{@(mQjT}#Ws60H zkt=!d^GW?@4!~E&>;NlB+!+n!@(7PStK-`WwtS)(5)sFD5YAqU*TOzI3((CXN+Rtb z-duT+v$uv&GJOO_Rg~bsIfP~$k?j7?w41n1TU1daFLH$-ZCTFYv7&OOVotDL^upUkci;3wD?hMv>k1`7BAxblV`XTSKyX$P}LAF zV>3I=emMkmaX^s+g>(a`Mo|203P8|0SOh@Mq?3h_9NQNhfK04_O=44`!eO>Lz(^Vc zksAeP+0&;EW8$L846!`+y34RSFFmRiVESt6#VSaB#dQQq+d)(CJ5)s9N&Go_hI`GovZm$RwM;d`me)Nj1o6I`}D z;kdxtc-AwN{7M#Ey9(4rXGn{P*{$ay9yQ@nQS|DptU2~E6QF#M!Uge&%a!6y0pt_J zQZhqn;B8u$3aOUlR0@oWr7(Iw*RL^8aoLE2crozr^ z3(ZlkQ;JsMSffIy4zALb^L6CVZ|S;GmV%Tes2C*3T8e|Z9c?NixG+q-j#>@Mx_D|of80n9i$n+-Ht8TO|%U`KjB&R4{W8n_U7XVb*W(!{*Lz%{__JkDL=+!x_`LWAUUh*dHKG>fRLyu1iN}uD4fx1E?tZ0C@Xvsnh+Iuy zU4z$E@V+lDr5tCyBtP>tclD7hDXWIev1*C}t4*$wT75Ca&h+_T3?U<^_H&I|%@0GP z?daN22G>GF{V&W_J2wR`(_i=zd=w5f0CnLXFd6K>2N`gHcQ#ad7(Y+KXNaf04O)`{ z2_@8rT7ikH%<&?$F#TWEmZDA@ZhfFfA}Jtwx_0*ATRusE6|4=n69@RuMVkp5lfPIH zPuBO@yc?SbJx8v_pZXvdZUt$2KxNVz92Tpc5$&}0HX<}O8B4bA5m7Cq5v z8eqZ_ds&iT1t7B-R<=8-42-j8ya20p0Wx{#cP1318p|SSAe|u<7XIT%@BZ2Xs3s@| zCA9~XtX$OI@K}m?ZNizTKNuhTv*sM_R0ceNG!PS|6MgfJ#cf=US{KFbtLz_LL19QZ zzf}TB1LPZs|8X%J_}=smF%X%99~O6xjX&e?0i$lw!LYMaNM*L_?Bf+b#{m^H>%*HV z7POgmgn^I6)6_>bg^&0JS!`lhcdk|TwwMxELY=6T4Ejtn(5e)}LuIS1e=h?kjss70 zoST5(Z7h{AA1^@$2Pp(Uz;5G*PZHXQ4+nm@gN~v>$T8huANZE_fCn1|xMO*@zUGaW z7>4yc4>6`AedMtV(`hK-sNmfIpFl38Rp(=gv^;PfNkx z=Mv;`FY3Dw2&Ag-;on)`e(bp?Yr{stmNvg>j?ligp>yb7+8Ce#n-oZ~y`%;*V z_^I2Nre0Y5@K&H&R#t#NnSn4>bo$QsM$c~uRNrkEsgfd_QDpOPEb?*1Xc~ab@(ZT# zZ1?%H{~(@&cjyhlyHToKUvWIyomq}ROz+B(ryy*8AD9hv48S)?2V&w?#@aempN54` zk-7%lO4KjUh@P9T3L+OXtdb0W;VoV`@xFrQ9oH6Dp|V_&w4};pL`$Nfy4Zn|{q@+f zaY0Tk&oZW+V!T|-NJz=Z-8wD?8o*G3qWei6_IS)rH(tO)Ha-eehvgeCCfnJ*!r9kh z#0?P&mXDG`-9M@r%vBpzJNpLat;8jatz}yaMz*6_$3GAM*!`XIRv77i)rioZimC9m zXF}9}0DtgF(bGC?-LI-=-f%lEgk6IF7onYoy8zghqTXo@rqy`~^rKZO{Rqs^`#tg! z=L-_>=f-;Ij)OnREMv% zQBC4s5P*Sy*Z#dZ{!N$+`{w4I>6`s?U(}8O=%>4#07w?+$vgrajPyD&8-(*1_R}Zl zhhwl+Qou&z&3Fp*=nk}Hg{ zf+_rymgf>y1R_Y!f+~ckGF>^{G*W{MeJWWEUUIFiFz3t#14RnLSBIR45&_;^$*9l$ zj=Q9#i$I&pNE;7)iSY(27Jp>@!u$8|CJX`v*dSPe1|5fVIqFP^H=3{SODs;_LwyIN zsE_d$02%`-fc_wbzyWFUVN#rL;?lthiHw}3b%0bPBdDgBmOl$fQ^s3^666&%!s;u3 z47zIG7<|gK>aehcZ2}B&9I|gof(<9K8^o68yXA=mKt%4c#WEjk9K3d&+-!brtp!J_ zm-o1YFrMEuG8r%R2-{3|p3y)QK@O?)l`5H2QuutOx@O(z!w2MSN$A zc0UUpG|9s;i`PVLam^CYD}gxhs$hhj#g6XcR$ZWq7zRTMvnBIkM)WYor$x@djUFuH zd0q8rtk4{keje^!xa~g(84Jz+INnS5gd-id3y&}lmC(qP`)E!q0i9y5hnoNua8{># zt8f@EYEVchhhn=}m~ zQ(Mss<1H(vQ(V%$jP^bLEE%n6NoZ3u8t|CD=~4k~w$#+Dc>M!Sy*izt~X3V#V z#NkYQr|ugh?nI)HtGiu*7etakb;Ft=P{pSN&L$9-x4H<_utX6EilZm0#L1LuQmKwL z3~@>1WTbR_gzLPu#~rF`pWm`(T!ZV@k8tm_AtRBa?h&Q3M%$B z&N;MDroh5eDW5nNlzpcHR#B3>MF^}wmj^;G9-|1YMuk9vG^>pex`0BCkcw~-GqncCkm0To8-X4x(O2HVF#6|Yp_uU+kI{`#^fN9Vg zy4WqUF@x3*wUG=oAZLz;0i)PiH6v+2@aefptWF;+2|Le`V45~+y(72Q50Ajmbc8Lm zb)Ua+eK(!+Lz@^sGzggz@j}d*j}kq1TM)OlG8ITzpTJ|{$wTVA{Rwue30}B(eprl z>3(3GswJi(6ta-d^nLtK1`vSu(TJLm?w8P|ScdzxSfDs1IctFmU26CW zti=B|13k(^@~l%e^rbit6eL6?Ev0Fu9b~7)%Ar&q>wpKp~W%(pQ zSv>k8}%%m4=!(hf8+yX7XHBcWwjrL@4?P zh5miID*EFM)&#~$T&L-ajpbMg={L%!?r^#tx@!m)1a=2buI30X?`f|-Unj{D7ae2y z@2*CSgPuk8F*+3*nii;jgj9i?LQC5a0@cWMg-Vq*lQ1TAY55^~IPSZiYB&ztTR0ro zvK&Vv#t|>s--9^r^{kN*sk8^xh?EE}2$b*5m&BmC)Nm?Bu>UpG27A^WUa&K~)he)`k?aJ!a~y2z{=Y#@ESH+Z{R!jO zOH=g!jkRfXyr4v0Bm4eZ4kUOZ4fv4F2P^b0kic8M{W&BL5OqBua0FU!Fx~Df9?!}O zaUL4BoAH26YCK>ks)fH38yH!bQ^QwN|H4k|j(MJ*5Xv{;lROh%I7k(tNw){roeOlF z;eaBnZCAqq_F5G+C5EmVJQO!EMTbG=#{tB0t_kBk&Cy|q76%9Ez{>b#lH=832 z0BB}gFLq`%?7l(LK@mb+c2yM2UtJM=&{lwP@E+d+Hre)1hW`p zcqOoWosN2szQ1FRwP3nSH;Up;b?jK`Mxgpm)@1t6zTR=HrNq%*4u-k&sQ+x_#my?2 zfMAFb;h>I05WFt?cu6YCMbZ)c3}0k`tHjOpU-}?a4KYel%%Bc1x=~rESQ~UGRMfD6 zfJ(??z2tnnPv~j-7fJ}s0uR_}YPmqvck*3g08il$yd7!6za%Mw3Te7{a@iv@TGryZ zO#c@fNj-!lqbpNW@3b;Sz4>g<^tTouh3TLk7K{%AjW}UioE`1d8hLT1ekSJcFILpc z`uDwrywkV*i4+H;oj(7w>|{Zrp4}(u(+$H(w#by;Qit;DGIT1N@Xl9aF(d9@Obv6Yb81|@t{l0*q{;+_hPb0L=hx?kyEh;$W$ zniOG@hgGXfosqjDB_^lo5Usdjd0aUUcRp5Wxe5rtl&cnYTI?)|iG6>$U6k{7`H^`S z8w5Sx1yE>_8OtdUq?>sjOM60Bd+azdJMioEwpP>CQ&Q7+_8532Gsf){~XaI5Ki-V|F+Yp)@EBkBeqsxtoL2k0pr#{Sv52>SEAe`JrLXWvW8lT0ucee#_!aoG&l3C@d#sMWF0r)? zVqQrmiMHWI`5o=mlxEVamFFnM3ldWpuSAC?tK5{s(~8}FRUmveTZwjhd@iZn?Fs%s zjZ1WJFoov8*_MUj5^D~kIwAl|P+QT3PbF**#^85w9qNqyFL7DS?Ty228S!a|8yaE5R$Cg1lNG&#@IUq!hA)B#A<15k%@K6|(SN z2#JWe*B7p?Qs5Ldd=yu=XPu9aYIPed;7~s9u+w5CP?#>iVxXrMBQkr^9ET7s-_V4( z^~ThM7<{cqb2g226Cy!#jz!)C%{gqIXihu+h~~6Vc@i~;4(^Po$Zzs<8XPc$yUzrA^sQh;Xs+q#PXfk)$lYwNwAv`2e=o%U#hC%WWDJepFV zL$C38w3y&ml{9m#n-TA}mN_GsVVK!7Pod3Kt3 zG&-k-YOj9ThQ?m}Z#yz5`or~FzmA`fnod7n<Q zu`}5EWe6x)1Mw64o}OvqZP2fWQt8(*O21&?llxb{CitUWPz1*x)!SMj^ij@8!bNx@ zYi7`;6+xm43UFYQJ*RvrDcuzgl=0IpvF%xDYsn%^ug)xYvB=d!I{!+=qJ_#ATvFnQ zGTdl_FE|=`wJ#W*;0rP&NksYdxGzA6Q;B-{2R?O`p%mM_+Jnwcx5eu$?w+dPEoyin z?ksL`K8Cfkczl#C$yeKHG8y2+*zV2{p6Si`$ACNTxH zUyV!6pl2@k=+M%UZU!aj&@ITDphFW)@lmDx5g#>D{Cj=zTkbtwZeul&t^Eh7RpVA9dPn=+G+((Vct#LgG7<#P^O@ zU^p1`2O|(2A@1Xl37#hL3HMRn?;0u*mgE}3W9febGRdX}DxTxTg(wPzVn|2!v147y zCK0+TuIVncBQe%ZQNYdB{A!pg!M{F4WvtqYXlM+AIK-nNG*A+$JEjQ<+w0QOD$~k+ z{tGrltKpxV{~{x-JponodqBo)*w`QW2Lqk7nZq160>t5HM#CT ztVD_AU)g}^?{SqQlBkYDDLY3|4vRRHGEz6ER${2NL|+pTm85Ms(@P6}4#Qc?YXyV5ogXWMD9!Swb^BVb}5Xt-;> zOyq3}>F*u?2W1(K2g2ti*zdt$sbjyp;Kfjb1E8*T)ku5p7RZQzLGn0>P4gTR(q&y% zr%7$y;3Bom7N|&L(MUyVo?iiMevO;wP?C8LBd<2kLv8b%tq6XtB#C(zf(JFhADp8I z4q@dcRuDW7GJ<=cG+B|4WNkZ1L6=K{+oM>&=-?<93waf-iv>Cs*lefCiCC0ILxd0y zMe^WkX$U(G6v_BE({I#jv-tM)sR?uUr5>~RFYyB~1BKvJ;@H$^B{Yj2XF@Ws!IK^Z_t+P?A0|ZGg0V;b1K9-qAnSO57TCkbq%ud3`D?w1)eB75 z7DJgiQGWI=5k{1f_-YTbb^i>E!0+aMn5h)=|JuGeHb_>y!PNlrOzW~snze6%umx1W zj+0)|I*=b^)c4xq?U112w)iho5=aG-VjHSwcCCLcw*USX_HQQ~!M&kt{UldtC{ZsK( zE5%p+Y5F>GR(ON6;v2mc-r%kH)`GH?X+#g8(GYVn+*!3^TRxZ}>JmZFmhYMsnv36E z>*8Ww+{r8*>al$3BOERoNtW+c=EJ<<8m#Zz`;}OM6cq|!VvBlrEe8@+x zWR6$R<+&~2E*+}nIhOB=;kK9g#7=W8UolmX{49|NN71NvXuS{`82@Ja2fd^%-~0Ny z#|%Q~BFz289?NG9a}y>ZARLRl36}5bDzSW*@J9l|^HiS1fDqGPS+~rB<=f&32%E-g zg3#0&Zp-(jH^sJmhQLQ!uC_DSmT%WBV)?e>CpMXu@2FcK*eAs;UrPC&OM&y)A7%O| zT$hP3W>7$6Da+Mv`Bo!wk{EGEKg0x9kiD$G6f64!;UUeDU`uY?XFvUdmfWt_xFpwQ zfBt>3M{)~?It+r3W0wlbG7wxX%8q7jKwgpDjTP|Oo*?OYNs3FZ9VC4_W3Q~x#X5Ks zD@3177W8pG+CKZ4VnWBXW9&3Xa+{4H#bcmQ86{Uom8O5*axJ-sU7eaRpI_vW+|#6K z@I#z`g5)kk-UP{ASSgZwKYv7W?@)OXB^Qn{tG*hN`zOa|vnzAt$L>=UnMxhM18I*rBNZ;vpU>J@ZyaN|WvD@yOeZ zeGN!bTuN>GIv~7P_H~gC?>zSPKIfw?rSl^;E2i0Lj+E}Bef{ovEu|G#q$W(S3q4YL zq%mC{j+E|e|7Wq5(zi=e6XxzBkCZkPx(SmYrK6EIK}w5n5-ACPPYH{U5sb48)G* z?YOAjUf0fuDia;~rd0{{wkyqM>i+v|AJa^K+XF*D8-4V#qg>PtA|+D<5-FFsQy`Fx z-4MlvXgv9wseh$|B~^_#dpnfJSY3SG5(x zpP9wgef1pHkwFh|qA^%;5Z@5>2=}TQ(<}D3E;)^(bf}?fb;c@WYEkh+!#CEE0HNVF zr{$FKA9ou7hEn>|683>hxE8gNY+1n0NFclj|LSR6HL4b<9)eF@HqIK7(>wCI?%k~N z^ltFx>fPYY-Mf)vnXvi<`(-An-86nQCuc)ug1FgM#2q)nGU@qYI1IgZ84EKIL2`ts z94DLh0gF3*c_2x(sRGx#wEzKHRbYjr!b8K(1=qb}h2)m$JL6dz1T58jWrRy)Wll<2 z${B^qAUs1tnEssu9D@LmIVg7(GU#3};x<{rrQ%JBCT!%{DxJMv8N$b40tV&WW9FuR z>=fEdy_N_Ar8R5}5>x^uJp{LHSfG%>A6jZ=t-zHoM*$-0ovnl%+-)0C1 z4aCs~N~G5jhIoIjnoip@=h5>fdX$ zp;cRp2?J)f`43tvAq?o;$dc%aKC~}Ey^4DZr!ynuv9??pR`)z58UUYjCukh%tcQGy z0An#mAYp_z_E#YUun+`vURfGZ!c$CfsHg@Wo@fYwSla?jfxdM5`ehnaJyt2cf{f>b zSZr(A6AFS{)=)|egi6p1A|w!)Su3B?;mN?EE~PW#gB0xtDy5S<2~7Xwa~-8CQHu+Q z0y!>^vkb=t_Gl8Whhv5Z0%5n*YZ>G$0Tx7(4}5Dk^Ue#}(tF(bS% zE`>QI4e!U-#a-b|u@@J9aSoxPV)eB%$gTuy@i+(>j*YSh8nxZ^$Xj5BjPh4)4UymR zF~?$~7w8$fd7NUtyo?*E4$TM=T7Y+e9u(qhkthV>(uvThF-)CrHUKwvc4Y+9L@oiH1LV~;@nSc5dIM572r``1?0e-TeP~A zst@CCaNz*ScH;n%2Ls|bu%0qv6SQ)NC~Tl*)HfgurQ8T?WKS=wh`q!}uWE&qg&<`H z&dYw+#tBkLhR(1KBTlC~I3@7oE~S5<5bdt=e|nourQo7w8*!WRZiAT$tlw(e?@4%7?dCZtm8tc=rJzV*~scczSss1 z7(?fF&U*q4tLwgPst^Vzde=`p&ghJ_hy;Pr{OR)ta6OvsGFu%<&P0s)cjj{50D(bt9#?b|3$btm^VVgK_62 zDpUgho@Oga<5z#MJX(W)uROlBAxR#iH#9Gg6Gj3T2pD@#kVQy??2LhP0VyFmc!lOs ze((e%Kqq~|#V+{~)z7A2K~|}k5LjpetKv+QwLcnfm>t*d1b-Nqv0mu|B-d@9&?sBS zNDnK_umD4^{Dn7feT%pLxx{)>;*cuANEzAL(ieEb&rKfxV97-+>;c5O@(Vg6|UW-(iyG^ zp1BgPnf|xN?bX1`89I!VffpiONbE_ePELw5N#TqUrrT+1k^;jaRXaNbs?(thu42E;oUaJeNw83eZN`0moI!^c3_4sq*{M}H<@)rRN%57ReX1_i)vw3I>WTEqUX z;Ia9(u3~?L(07~xKe)Dz;W8yHPnkwQ6@;YW*!f3BL(*<{%a<9>;mSj`rQ|1`FEV|r zIvHT092#Jl_OI`!E~uO$M<5_0Y1WsWh%@6bgrW>VNgPl}R_@sQM|c1zdIr@aS-I(- z)Rna$^kgkqN0esW_MAcm8Y1zL_|Mt)ffhHn3oLD4x$~4j_*fhqXpL*D6bqT{GjDbN zP13%2FN%4TfzkY&O8MID;af(lR?!6X^eiLtW7CInpcl4-g&QT4J|Gb54Ek`Dn6sE1 zYg^RTdC{JEIeAnicssQuDV!4$)zV~|zM9nI8r6(zL(-)6{rQf5gw=@>&N71~y{RG< zBanS?Khg!T%~mHdKoz3?c}Rzb@C-!6k+XBQ5K!n2^0z5N>{LwFi9*|H6z{Vnlv8ar zyeBL({Xh0){Y*Z>oqQXl=BzS?$mk-x_ANL6=y&0T|9DB$+%U5alvgaaI{tfRWgeJ} z+h(^WZ+#n2NtBRP*b&HV!mi~)X3ee|d0`NNZUx45{}HI(pS7?P`5%b51edTs17Kyk zzZvx&zg>F_kGZ@K6v9DKLv)*VdvN4P3Iu0~ek-!n)4xvhHk#Ibz;b>`@5u z6S2Wb65Ei4M^2RSbYeM&r57g<1LjDqa1i!T>a2r5wN(~n>)A?NTMz+MH=>L%i<)sI z(ye12b!kR1vqRmbyFE{x{sGd#D9%?WbCQI^QHKi1N-3gg6wU4{17=5&QCxojqhG>< z{p}4I_U>+wbrwP5K^nM7g6AkhuM188Zzu5_W%>qyMcGE4a<+;MVb*&UY9SIRDKQw- zT2Ni+uw7ur?#Na$A!KF^KAZepAER4RY?~lB5-R>kH|(L! zY;GcBf0ZnW-6V$HJ{8fI2J8hTVo%lrW_!05X#(_0s8vCJ7S`hhBCW>(@~pp?+Y|y} z$~2jDR!FLd0TkGpjGiPxL`70B`_Pc4T4@oE+BtKFrnEg|)P|T6W3ABJm7idC`f%<7 zFu0k}%-YgVQ+$PdQ>QqC;`RYMf$)8ja1$uMGf+K^FN*Ti*Fg0(@&PH_ZWFy3TGS`M z07v~+50GLLLW=fp1?J)O2b@e}OO)wnVsEF@+e2n@BoGHfk z$~de1h0JYc^^!v1!Vp}LLc%IehPB-%>enD zx*Kz82ed$F;*!3sa&P1T)cq?CxxvrvJnIH-YVArCPm5iI*MX77Sa*JotU-oDerta{7{v-e@_fX*lc)mZRHay=gf<4piSS z-&UwS#nl^W%&{r5`v(=1cp~Ya`E*_MlKkkleK!iZiHQZ`||vI)M}mhHd=BJf}9 z6&CM5ga4mIyS9ojB(1wFF zyFGhWO0;Wate0BFYp3Y_>fNLu+L(5?mAwHj?DI3BcL zS7V{ol-}?>}8(Nox_3n!e9Y;LMG$ z-$caM=x1c2pOKB|*LNyEh%)+Kl`M>a9v!s3sbQ0KIGRg!ULb~7PtcPrPwnDa4E5!0 zms87dVkIgC2f;=zdpRj^XKlkblGN}y`^_GB12ck*3Q~;U5+2k7_s=-^IDOiqHV*JS zL5!~0?oftI#k;SBN4+_SX;bcnJ_bS zb2p=@o>Aw_PRQhlDs;1qA(xd$0gh`brS)H;e=>65#sCnPA)3MYSsU#lr~yLA2m&bP zOE5iM3UlNbaR&V>(B~j)#sR5Rqx?v=ozIwO5}!h}dX-XzGin?S1zA_q26muuo<>EB z1~@DfKsK?6%+EhcgdS<$Lo%S9l-!b)^D0Mbtfya*pU30}rUlL8kfwKZ^N5E?NVJd# zBS%m0?L25OvRLJPovv2_`h-rutLLd|XyOIQ?;pW#Gy7g58=Ofx3>oy$1g_c;F~HD- z>AzzdeGH7M$uUq7qoQn&j{$)VBXSOAn?CHqI)-uh;wU517X#kD4wtjIxF@|qI!+-O z$)}b~JC_xrnua$O%XEyHVO=FDz$7+StQ>>^Cv%)m;3?4ko#a!QynB*c_Y8;9uYyze z=ns5ny&4Rd&d$s9tzsA>3zh9R^)F0$ElCF&GmcSFEJ5h^t&&8@pFMR(t%ZZVhxtJY znQvogz(4x8P3jTCqAQ=inr+JTh=ktOZx5@ZTX>yH3!KK>Z0p?us1iae)*fn2jh0b2 z)lXvAhYJ2rR38Yx#rC6pVe$R{dYGr{;pCU6_zen;&P{1K%Fc6w7($r@Vf5Uf5gnf^ z0)aRd`>|Y*?meP_xD>%U>I!kFgy+a$@tm3U*snB#?{FL#=B%+p`O`$Mgm@LlMu`M$ z(noa12FmM(*vb4A1#K5s&_FmW{iNo&HdWgXFiLk)z(4yq1tFr|yiH@YzJ=ZpVCMjp zYJ_eO2FRT1x?Xpe5(Lc($frTLK`WW>&^HLpLb)!#+I@Nk_^Kx980dY!=wMTJ3T=VH zvFTIh>X}sPe&k9_lIv@E|^pME3 zsMFUH@W!P{?@LDf(~BZlBQU7l>;tRnaB&ExfCif5u-rkAwNF0yaA2gCs81@4)W?n# zHsOHMdYo$%^>w`veFXH+!)??n+^jQvHz`~*6vbQrl;KO?E# zybWuOq&0aiW;4Pu2!`0WR-^eXS43$A^FcZ~RarFxBw(MRv@nEBKy~IIv zyD*>i6Xvrv8|m*fyk$*UCJx%CetuiZHvv@tlMtUZP};rw-C#I!K{w^b<-zpLH~|h6 zGH0E~zPw3*D1o#wutAbFlMmKOY4&Ujpbk+SV8876=WS*+v${)V=;N12Wxi`K45`YC z&UD2HMT`+JhKAvS?Biv)pd9|8_82EV$mbkI)W55yx8DT&sHiy1*W(s;?J{k&ofexY242&`I{GcOr~|PG=#<4b z(>Dl^%X=9@y@J)nuWTt;)CbiU(HIA&$~}9FULG4mp`_d@@D{l*fq8T{DC!_MQ7+hVPcJ} zB5;7H`>Iihlil#C_5K9_XfY`2p=V&m(a;Li33V9*O-7wT)(O!COn3;13|P3ZMb)Iq zECb7ZGorr3k0W&h)vKwdk+w$kRytq=wcy1$WjGY6lymIs@9hz|MP}-kFP`_ovDSVk zgB>3j+ha!LZKG~SZ=-JKp+@KRhS~1Wfw-}oJNcocVh%q@jxayeOgx%Dm4Wa$=&^jk z2rC|$Ed%9Z!}NC?1p7BJ29KY4^Y z1-hEb8$ziz==wn7Wat{}oZ6y6Rw5xL#8I1QuIqAk@}EAF-8Pu$m%F-5 zvdkzelU$vnx@~$V{|iCKEEgqhI~j_+@Ku>uFM*x>o_Xc7BuSP^%Q8Ud36}w4egFg) z<6R;TxSwl?GTx=i%z^tMa333twdF=hlJ(7A3f??>CqF+fcRq$i@i1j4@G@<_ou+p3 z3vm(S%O%qoViFULnxSu6ZLLEYjGDgFHmMF|u})!kAld80;f(sm4x)YZkK<1=if9SA zakj!KV@*2`Qt^$;S|{0;mz8`JQ9caH2mbNh(@Ecn&~&Pcdk`N3Vj#H4c1#E^q@+Yi zZ->)ejyumS6&R9JGdNknYAqFyyX%$BNJ=XHe3X)k=g2%9*>Sid6=;Q>`9a8_JM-h& zMzJjqU>}!-o~+Vy(K{7q4ri+5A<3B!8JxnI8xV;iMcNdHDw9U%6V85g7I2_Nt(pdhcM5MS=Ao8xU{Zpgvo0f*z^>(AGF3))9E2Hxd zI6S_?_?u=GcI;~43_#?@%xkXw#^sPgJ3#y{QwZ` zU8T|Q8x}P+$h98qo%L zD6T;M@!eWUU=eYG85s;^tPeg_ofWi8_YXG^q#(iW%Q6Pu6$H=p)t?=b^47B_ zdh884XdLE^`X_dzU8oofn}6ggwk4tp`^yg6FeK`gGved(@mZEIB>DK-LZ$Piq-+@x z_8N4Qq+O2bI449O53F#a=}I=rv^VXv*km#3dQoaKu37UdyFd8FlX#Nln+sTz=oy&l zq9-F|YXViegAURiNg z1jkW3zxf=6YmtiF$m%)I`H$P62Ay{4d*aZ*F2wM>0u^h6WVh6T}7rnSF+ zSCbel^m`yrTK4mS_DC$_jAe@s*2g}F2wCHFC5^F#c$H9$m9>+~0J2rrE}=5054me* zZNpiFu`^i7^?f0cyg|d3NVJ);0990CA~MBwdT-e2x23q7jCC+w^Z9hk2l}S>;SSsFJU?0wO6V3amAVGKVX!7 z8(CGY$do`4_a_*It5owthfs;8ZOB$tm_;GxiA9yvn)asGyjmquZDt zqorI)O3VdoL>W)>J6S{#<>ZoNM5LCs*&0v^f9XoqU^v5yrW*0XqLU=1r{R zIqJns=l5PQwVV9bnZ2Phuh}ZI2GX1!7w5!y?of2(;O`)BW2kxfC$QA_Mdl4@J>g(z zEMVBMP`;wI)$d{2i8a18NKCgXuwK<#l=oYcb<^p1>W{mxtv)!S9L%13yUSZ<0wv3O zRSkxMq@rN{OL}uvSeFi}cQJ)CWD(yv_=w^s-|s4pbpmPD0$p4OFA-lpi~D{&5XCVr zb+i=spP-75c-mE*@uqcMV)1onvG`(LoRex8-CTi>Xgx2f_z8){pOoU|y7*XC{C-vZ z^@WM8Z+%7K?f~CIig(k+vsLkvRq>IHuHrbVHx2Xe3B?Pg_^$^j-04jKd~bZT9(o7l zk3z{nWSBF~NWjj(=tzJ`{~z(6&eHznEDdLNsg(8|!p0+6M@h}|bH6tYIR5{%7|Jibb&G|k1%<53#p*sS*;Ps$diybsMr%88zoHB6bJ zQhw}V!@}AYGUaHMlHn z5gi)DI!WAyY4XJR?ma468j+(Z9wB&$^4w?|=wyAV&qjoxYM(2?Op%*GzRDIZb%3H! zL7RFi@lz2`hWhxoj_PBOGMP(LZ*{#J)0F#JClLW&onRvn_os3mUvyvL&yJ?KLIJ}A z?}qebc+XD>ukKAMcsbT$h3^u0r*;Rt#eY1!Ivn!C8%zQ313gmE_m%-}`Z64}-n&!a zeKUXe@Jh_-@h^LjkF02#9iDlC9iNs=+#k>LBc2WZ6L*3$Xr_6zj_PYiI4B4=T9@q@ zn|K8$ITfHxh|&~eF!-YP77{LXcPd^ueTyoq)9 zCA(zjybuSCp{0h!SRDGS^)jM?=H++7#jq7Y!m8#Q2`fmgd=_w^!DHt^ zg`R;hPZlLjamO$VQp|XpakLDyoea9Z?jm`vbdT&CjrNx09S0_mysL7;+)e{Zpig1N zhNK`lq;+O0{;WvO9P0^USf8H;vU~@(Oeu^1CD3P%qR$>=y!Bbl^Q@s)LK^C_P0HKe zG!B$H{9NVeO#(lUC*T(~!_RXW=2dM)Jqh+Bm3{=m>=7z{ev+D>DOe7^7UTai7>mh4 zFU#}6@;qo6eg|VvYA>~{^MF0F{8!BP^JovZfr=`YC(FmW_7u1*>qal@&8W>0}uRx z88sB!J>g(obEZoN>DB?d)kH_t6)9|pqnkX`BP3>J)@3xIGw2v)XMM9
    k<8n`>?$%W9(cPcK9o|}u2Dm)p;orm1e%Xidfl4KWXo~!WE16C?965O(|zCnbm z;SH$WO8ox{cv6f1SK$BUMuciOg`QEue~gD&eWi%jSzv^5@mOD4-fK?=IeykU<)Me1 zSDad(Jn|^9+R8Z|epS_>aoZVA$hR4uz>05Af*3Y?Uh#wpkflUksKprh(L*7hgQG^P z=&)9JLQug)JjM7Q1C6qYXLG8cf?_5S1BFL|t>XtNQU+B}0rI_WT@0{fCAu?yNF|R= zdu~^Pd-A4#|M#TyI6cj9PCm_Dk3N}!8GX2WXZlt{MgbP8y(<`E4DlT!T_ya*;LDwL zfp8ny=rb>8l6>2U75A9`xU)9Djw7%*CrOIvqSIHiMy$V`om0f`WB?Y97R$3NSOMBr z_VMXxg*&D&+9#u%(4uS(VblL`n{lZW0Ig8C%qfiBiUI_qE$iLRb|q36g`_Yy!1m_; z3o0}|O7)1~Y)OO#vFhPUDZD}MP(MI6YiN`gaIi5D{z3My%vP=86fl0Qet}EiF|Ap( zsyE+Xt#=A_M0zxcvYSE7W=J&JvA!IopSUvrfVU6j4Wv#D$Ak8E>9S z{6KS6im~!MU5ZenI$;Jx1@gjh=U&(dZSLbo13*b;>y68LRrwYn<$O&_1&kskfx&`Z zMM^|b+?0$Z)TGQ=y6#+p7o<&wiI|@wbwyame7)C@yu`~rY{UVL1PJOuDNIWcFML4_ zn492>c>$(gFh^zad_FQDglz|h(-KU=1Tdz!xm4QPOw3tx=`Pve`qEZvFhTZi`{q`MWm;VO=3*+f$*7cGkmog^&rKI0i4a zZnk-#KlC%jIWQ}(4-mt+KESlhQ!)&ZRk$fxR{Ef2S?L2$X{-O#uF=*4sO#Qofj#j< z{(<)%EeIZ-;=0@e3&n9&1ol5nnq6;+lG*cYp*)iN=F z*{lX?q70xi`o;VP!vd*Wq77iVZ2&uKhQl$(87``7iOl~l1BeqQXaL{TtPj!vf`R*B z0BO{r8jw60|Mjpw(EwhJ>Rm_C4-eOy=UOzIckOr1d*yA=Y%{J+<={(c!W4yRADeU4RspD{ z>nX&HJRSW}BIj-k-dt(r=%4#qRq=<)d8v}~i=4V`IS>93CN5FVZ^kr$E$91FrLZQX zPr9tlX--u46TD*e*POldG}NrF zwAaBG%*a0J%4PuSh^(V47w>(;8FACRPr9<9$i(oqI`#l8H z?6t!vV6DUDF$40FH5@Ern{YU|L5Q|DCdAr+ zv%_?`I))Nb6e~(`vf2z;xd^f^XLX?XBB|CLJh%nP9VA;XAfRTo!ow%rJgkwIc}}H4 zu|e}y<*=){A_ueeIeZu|;=9>x)2loVxhsgbLig&Yz@nOAS<^(5kZCyrys6BseV0*&yiYUjV&@@AL|z#mQkHOg^luIFCoQsBwcdNz!Ge zuVz)U=J#AO{2MVTS76Tv@-s zqE@vc(|7+0styDg(=r*Vhz_v?1jvZe5SV|f&&^7bgCr%$#{LCa!T5zwAe%6kB*qiW zsNSw51wb42SWzvu^f02~5}{RQEU@%~gJ%uF2$NtIk7*P;tQJ^N z>J-Nc?PI7EJo5hhs?Uxv+JL|!p}KcpDUC58!dj$OMszsLLbp>+>yKCw$7(%A={GxJ zOFkeRky93KX+%4X)o)6$Y=&4b-bS!xp#sI&^e-6N7p1VXa_%n05CIU1AcW5dV};$t z4cDW7UeFP!R^2*b1t(SQGh5bUr*2zAZ;u4)jNGXI2q}gMauc(q5amfMFI$FCObG&4 zCd^hsg&lNi>c*Z?p9J=nb5vqUjNgi{ zox%1@-^+jMfh2%n#?>mry5?=|6UZ}A1ezqEy*)#g#5W!YIp>-=$hl{JgbT@(h*!2o z_0zZJQ;s0wc_L5x7eoumcZInj&%`_!bQx2yNsOsF#)P&9fY|4`;L;MtBYOC%s`21J z^&ME&CPWf-Cnv46Pw@%-;+FM5_(Eo=YD^D=kLMGhs1cegD3n0ZJEB?03GlWSWjb~; zgl>%(SDszNIwc<k`Q)N#>EE;7T5^yM!EwwsUeD z)W!aaPUWL;8aULzI&8a(fY}7v^k36YXha(1*(N0)4_J`<##c7Y6w2C)psn4btnv}$ z>(Ug;YzrvI;RS4TI-GY_&Kv;hvvAB#1tT@Qqknb53xOlNU-xm~HEei`6ucc1;H?!I zCT(^PugXVwUu(ImO z^y4s%(O-XYVI+a7>93A+pj2TrJExL$2onZ;>1Dzem9j^qR6Zj0@r&56uxtBouQL|H@p_=riKeJtgL)WAc-D^?LUki~{$s>BtKith?6&G@yhMMYa#tb_Jp$xS0YjJwc` z7Wj8<9h?+G$98yJ3DLx3hZc38Wwd!Gunao@hNQO)x8P5!a0|qj>8%hUr?;%zlF?>E zU|B5&YKQZCDeM&1fHJ@gD?|dH4!qAcnLb)ED^KAX#Jam=Wc5vGJ*6 zs+_E;iU)kc#s@i5P7p6>fq&PoRM>O?x~mj69rvsIJfqD=fn^&Fv#_m?hAo$H!@1b? zSO@M0;+=(dZA{c}0zSQHC=%9h!`*Wwe}+)Gl>*nW5i61hG@~{SHADBS0nwo@;$IEf z1kFH+o(T5>%MjCm-hpMv)ux_AHw{GS?3rP0$($OrVVDJ(K2VgqWMC-h{L|~Xk8Vg# zM{&DASFK0FNPe32OAob=Cd5WS_Kr-prj@DVj)X};smWmyFzh7F0@Pq&sR2<4r5k|C zXoKCMBq*v0vSlHyp`D?FIF6jV6x6kzY6Chy2CNe4YZl~KDww>BL-EtM-a||x3)LVc z`b%^9ZoAuFO&ClM-1Zg2D`?JgrcK9r#r${?Kbl3@XTkAR^cm)yCSOKm_yS9pNLXL> z7WTgALFnqH@|IO^wF=ED&*_bOXNLWDCdO@PAJ~hQz;fbdMHjGyGmZ*J@%2v69ekLv z2Eq|oIwGg{EG)y`nI4$&45bC*0Z#}f9~*VMGG-NH=j+ZEff-Sxg=UpOYKQ(C3F;KH zs?S^ULLYPTe~j+i19L{Py!0jJ=hR3Y0uuZ5U9pja#1O<0?#?+{+9KZ}7X}xp&1}O@ zIQJ;ZdxAQ@ZkXd;_y7FBvwGkWd+tvent@TrG#(FF*O)P@)&2^6x~76z1^dHJ^!pD| z0OPhMMB*)s^hV6T{#J-tx;b+ME)`TSl4nSg8swUb%^QTVo}Zz}ohTy3^fa6J1;M4T zboy#?8d&=lmeKCAR|&Bz?Zr%{ukB9m1Eu9-g2?HzmCCTfK}(;3%%VL!VlvI-K#1CP z6t%Q#rTem@RDLd(Hy1py(X=v=-(r7-G+OVfTyLnK*W?G=)op=^y~*gvIeWtQ%_jo{ zRHaiv!N(r1V-JK{V!hoV@eB&MV=j6!eO-6Nv67D&)~9u;u^M=z7=Nd2|A-jd2Ers$ z=8@92KBpdEMM!b}MMB$l{H6PSrtj~KHUv7P6Vi^*K*(qbA}HGft)3)A{MHBUHL!ZY zwvq|ha@`H0nM>AF3UgSda-tlK~r1uQ7=5t8hSv z)%zO39K8;!Lu+-y0Q_VjorrS?$YbyK2Qg?0Nemh{l2|if(1D5pFiz4H;D`tsf(kor z97c?qx&Ldz$qBwoOdMp<`epQvCcI>zDb(#ak+)i5dE^S4HvIL_X9Dor8l*4GrY{7I zWf(;)aGsF=>FaC@jMseDtao&jv*y45arNc=!S%h@Qo%=*;0cWmzt*AW{a3I9F9%nB zihl2o4inG8zX#yLu&N#H%Mayqd0U)KkVlSXqK{u2a-QHn)VCc6B5u(OY9$Xis8bG_ z$U3ql9cD$>k#9fkIJo=(q#uHldhbOIPC2!k9CcA(0AN}?dP$&fU`8#H!81TO28;&J z#LeYLja<<`io&6=9>iLlW;XImWD}GJx6{OF6-iDr$bzD3c*07*z|z4TeqGt39CETF zecTC%Xnu1JZ>jn$ohQ-(%@7s^z;G3~x8GP*S1Mg$GGH?(J8IXGmEQs)e)Rv5_AT&H z71#fXvKlOL7aWh2LN)*I_nevCyU7Oa|Cf()@7_Ci=Dg?3nKLu$ z+6aHdFDJQr;5&d_M(Tc;fUrseDo+8W1T)*d1Bm<2IFMDfwWF&wJC;;Hb1M-j0AZdn zgvsizvi?k(d8@L+NHKhFRQ9+2?lw~x3Y>iz|FIT}x`9u!+$Ud5Z!>dhgc^?To`=;= zhsf>n!EDR%E&D22kqBCrdxfb;m=Q?Yy}wNtyZ3blNVw4=1lK2r?Sp_qPy9Zx+wVaV zuu>X(?Sax?zfH9d=-xJ}|MN7HEgH6IZ@Ngm2ghE02ldtUtZv)g=w2P)HFHhKJeEC3 zUa@1aE)gUF@&5%%BuF57rRH${1RJEN2*p75`T6yviy2*3A~3u(i)|EP|2wq7fcOMX zQoUzVB*f<+hy9Yq20n;<+>Y0b+GN5X)Uixsrhi$m4=Gc}10ORp{If4%9ntkXFcEQP z78D;~^vYW=!dXCY$+Yq@`3!Hmf91Af5WoPY$ri$%3>FBM7?)6w)IloPC78)#8wjA% zmFQme%tw|(tYw~UwK#&lpPb4F8{7s6MHXHGd45l}xVOKiCK#FyYEdn70WIRjo~jK5 zpl&6D49(Ig^#rpu$Wq?zclJSxC9%`{m7va0N$jkw5)__X5<9O?2_(O~Bz8y%2oUD> z(8M?#&Cln9EcX>Sv0jw9x|YAemJrb74AbaMv&!gJO0#Y4ec;H2qeXk;QXZ|@n?EPx znuRNZ#C!K6RfWjT4D_`#LG`XRA?$;R&32-@<44g6at_WPM~Y~gr=laSCI~`Jg^-9p zBc$OLNdO3gC+?pkPyxI+w~t>&4BHC!PL(1 zm~gG*yWO$!?K@FErMx*dnoEw=RU7#x$Iuj`8Q6I#r+qU9*_&(2DHnN!zLfTD z9Na|egwpU(*9uGR9Dq^2hE>!_v2OGuwN8NJp0|w<2+rD6$FI@S#ufv4LdtB9L%GXE zRT=Kg%N6!K?EgS;*VXpJiv6-Z%{^k?Lesvxb|h z@QRIvoF(0hOtD44G=ZyO6~R@q{K;AkN+HZYrg&KkMs_W~=}-F1Mbu7)U@YOrt4V;nnaJ!EFA{}a~!HNr_+bW z0J4>@ZP#dRJd7=R$NQF6;Z+fa#WORrN@Bjc4bw8l!-6&4%x__Bm6Ui%0U-P(@DK)$ z+tG?H>HR2s`2%8?W6kGCU5SJk+hLiqyj^A7q4Fh0TAhM>+blUi? z9nZ^{@pl~PSr*F;1M0Q>#<@JRbo3kkIrHU1MJXJ8IKN(gn~K^#Mh9IqIP6Rv3|vMn zdX>2Bs2v!NP8pn48fncc?OG9zek|ra936q4hP~94pV4gDy^{>JteJI2-S{U^$Pj|L za0H$Ch4;zTpoFfk9=|*84?D+P`E?0!9HHZQ3A#wP!&4LT+zMeE151!d?RLUWrDU&= zxa@RT5jgYRk{{Bpk|!RA&Gazl_wX&cGbVVvaA#aYd)F-RBXjL|L`3m_YZ*cxv#-P# zVJGMD{}6V}j9D{ZHhirHKu%fXaV12~@(8R-^z?zj9jhS_1L)JNSxtcmWxn6IkAK-M zZ1uFlhR@h&N#+_h=wH@VI=a(8`+YbtVVt*&3G1pdr#SUvDK@$;g(qGb z`J$_A=-P1R>hU96DK?}z6F$xhRJ*0n0Y}kxfrs1Qh{j-HChX-#>E4CD&izP6^MX93DsIZ__G&T&4bv%KaF<+6`oc^Yr15EHw(3cXr zJoh-EcQ-*PhoG3l9n-g9Lnj+)2&&^hq9216+{?0Pc<5~a(sm&QdSTqx%e~lHlSxSH z!Z%7*u_-1K1q_$D7XXDd1cmO1bHN3OagZixIV-~ZVj7&qQY&aetB9A2d3AEm{3pjM zh=3fwRS5^Ity|J!EKNU}&Pp+zBans{^L@IGy%K<;Rf3SZInD!s-RI9$|7CSCAGsJ~xR1&sXs0~7n2+vGdGrk3g6J6Oan<^=$9?G|*4@oI zC9TEA#Yt-spU4`VQSWXiz(rQR*aHF;_`ldN%6)AW^*Kepq~8Ei^@J6#yWCxq75p}V z^*naW7;(NoL719lXc@ruFnoenNBzSNMjJKF59G>n-vGI^14esj-jZv~l`E3)&D6j*`%B2C`0uo@c0-$m!?J}^;)F>8`Ye4^G-%d%4l@K9={ zX$YXMvc+B8CgFrwj+k!y94Kd}j*fc7110*< zGiGh@uen~ZTl-I=khG1k`sH01c<@-C71K*~liy=;@L<<^JjJm-T`TZn#_-Vajj)}V zkTO$WL$~4pA0k*tq-A7hLf?;{EmC&8T!>PkMVA&9(v%32pZzbObW#dRDg3-~CU^;s za8eTEPq>nxUDC82Ap2+Fy&I$#c${>ygHc>l;Pc=1E7rXy7zfl2hP6B%Cx@6FUqi${0qNDBcp=SKNY}pK1Jc^Z z(nI>5#17nj2SYv(QNDqz61QTRc5~FUwafniiMQ#A0v!$`Qsckg(12iRe2I< z?rPfcDT2udq?SLSxAN<- zkW6UU)=8A3i_|1K=8CS5z6Jki4s&s@y?eW-BUqS|?A+x_X{>SsL-%0YhPL=PWhtu@54lWheA z-SO3Kwe&Zy)&Bh}V|H}thv{d|3 z=>HHu-6Q?onxQBHlB3TxULr`Imxkoaj4t_?s({j)RMNL72Mvg6NI%nj3a4Z)@rAD? z0+!^!{$KRuz>$Kt@2f58IPkj%({sRgfpFm1Pr-qxmjfR9m*kuMv`-~4z3itAF`&fq zkHnzB_9T7?UaJj^QkYVRe-}SB#HVJc_Wp-X9_S4NZO10Y<5OZLM0|o#EP8wrLr`PV zqTx~l5{cdIJHPo3#I9$nAa*AqNo<(yyQyzT#J!%6fhVok(Y(j`e{Us;Ew4q~3(dS5 zv^8ancHj9z?6yxp?D<||r`Q{>f7!cFGN5)EsK=Oi%|)q!Pjs!AQwwCw7{j;)GJaM} z$C=fAHramc%Lla|D<^>~yd7>R+Sc(8_oMLw<(a4Rf~t#wYR4ad?A!;u9V-*c@UZbs zOM!&9Gx7nIweINu<~*r*#m7MZ`}|98$hAj*BBz!IaVNZpgAGzWy$C@HfPVh_G|;d9 zdk^TR|31B@yd!Z1w-2E|JJnZX&ymy@@b7#4$^PO`21)-^FKyox*X0nU@L@e+eC>DX zDSV>BSoslP+><}~J@5_g4ZiVPy)-mlsmP&)v=u8ap# z>G$I$Uic1G`hE0z5BTQHPfx#{=ZJ*neII<-yyg4kb3pARtDnJC{R|yX;2S<<5I3_; zLb&U&I&sDUq2V$e;X%n=eX3Up{|YhwI^DHAZ|iswgy=L*4dGeRgcE(s0CaYL}e$Qj)EPN?e@ z8R{`tM9yp7g8Wq4O{OY};aY1A*XZBv*>DXXC)~SBF2-=he?iyH@$K^mFWJnXVC|+J zWUIYDJ=xyVh{ir2fNYy+y1UWqGnEJEG!w`$hQvUX+8yCKqbKAg)>ky@Fs^g&+Cu@; zk|z;dg$*d@=&?dF)G%a2ijO^ms<{2X641)h5lS+*?U@by(k9Aa`cCSBOAAU|`05&L^b9>lBK=og1Ew_Kn6Lc^5D3VF>mUy3s3xK}WL|CTf?#O$mYI8Xyk|3v za$`k%$+9;L;@pR}*r)@@%FYX&whe`NV=73h;>;wb0op!7va-Y&f@})^Fo6MWRgrMj z8cwXi8Y#McD3BK`$?U_Po=+-5Q3P^sO*D!oj>WLH<$emQodz(j3yN3Lk6CQ!t>}&9 z021dPp_)hKYyx^aXeNuT*Rgy(%Og?t0&OscxlINf@KkUslpBQYk%&DJQB6!+Vx1Xq zD+O*JTHFd*X9018P)NnP-Z!346(J_^gK*~__Ac0aOgHvwJ`;M}ASD+0O-cF3_;aBS zjy@&Ru{fJxMX|t|R}7ALHQcYJZ`i57yDj!D+}8?#Sv$#)@l5f^LTD6Aj<}!6WDt;3 znzEmMtOBg6#*Wlm{Sn!qx9y|7V*?LFA&?H#yzfnqBvhkSp;n#TcqIWG?lwnF@_-`v zN7iuLJrOt7oXn)@%1{?%(k}4?WRfytKx?@YL_|n81kf|+O$r&Xd>TJ7C*Kb<2qHO+ ziHWxW(aLqNK~@5tSL~*U%tgdgx8sYBIf;gV5n+M=F{ISO6e|opBx#_YO(logXINb_ z#HQEVt;mt4hyhgMxn4lscYjJ_+8ZA3w{Js8dOt52*?!x=v{YMY5P(fcs*Z@dK`Pgk zAq;TLQ&B}Z)xe}}avRZb$6ek0E&pvroO+0C3$e{0?F}SD!b!9o+%M)7umb`#di||A z2t5Yscjx(=c2c?+c3eNR!$12Y{u;hX&LZ~)A2-VPT_CZ3pJ%?maZvs4lWGpA-+fq3 zcKz;IjATkx?aZ!de2pxT^UGfGJ1h7DVjG!(HvCJA0>S$4PQvPHdHjk$QYnvX0-1Pz z7?!Z|`EVT3cfBVs|0^y4z&rf3PZFn@#xZTXjuIU!izb(p`AgDTuj!C4Yr ztNGvP4Kv@l^>p6BK4Od74gT5hN$qlMRz=9U2~Bh%fgfuZhwcnze!vOja!ztom14RB zmZFpBH?_eY(B`CS5yYb&wL#2D@Cc5b4MSln!;o@LbVCbe;6~|g=}byD(n`dj+m!TF)OGJ0{!$+=TFuMUrzaLG%il$j{kJ`_Q$N zwh&RlKVgV__v%rza8{fL^b&dTEmWGA;f?4YrYsk;9Z
    9GksB?u+ur*|p@6&I4<} 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 z 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

    (QYS+O{g?TsS>w%ed^G!{g2SNwj6`fZTkx) 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�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%0D&bUSG%`7J~W&Xd?2 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
    TQxUqJnP8Py=~HRqSi3V3b@gCF{2=v7B#d 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

    pm0S0KKz}4-LU>Q=${O& z{xAA>5%w-X`Ot8P{;eHzmXc2nc+UMM*zw*=?Rd}6EPT7N3wFHcLryt~9q$2M#D@2# zf4SeCss;4BXIcvA*hOjTygSL}L?OTKC3XI+5q0hy6wv?g^zo+xUEQ;uZdu*aUQJWo z_ghwX*U3`d?dyI`A6F>*i?TIFc+LNU_j6&Xs)maVjT_G7C4%A3;fx`(K$ zX0oc?f|5-gPm=adt$f{vxRWDVs4s>D_Ur#o)c0q&hc9KLB_l}aEEAc@ij?@S1lDFh z)v_Y*9UrU+h6reuZ~v`DMb17+WOl}TsK_~qiX`dhSWG%^L&HBBeOq7;6AyTbW(d(0 z>coB$Wq@8zhI=o}oCLZ25zZaw8CeXUSp^b_UEG);!uL_u1>?Zj#^x@37h`f$^nFR8 z*Q7ncK_NI5i5*kpi{l=-Fr&^m3jgE2 z)d8*rxVG`--`F|A3B!&tZ#E-zqr(z3`atAG0Y(PDU~L`a4k2MMU@t+dzZu#Xu37vq z_aTl5qSEaDF~c>LXCtTA-W-k+CaV(A0XNQ3CA^65al@-)Jc$>b^GS)E3y^bsJS2fg zqf!Vo``ja0<_qr3cOa@m5~4~MZ^#UEivKji%nU+-bv1-)pQA?D#!qkH%fg1r%K_(< zN6`yX6@7e`*IRk{dtZau=$!1x60bL@@KZzwePA49+KpAngt zV8sLXdaQVAn6P5U>%(zyUj+OUnZp1yE24apI>AO$SRn?hclE7X3mCU22{1)}pJ3ie z@K$8+JJ+j>7Vi6S>EnB)mCN9t2XRO174PxU}hhu)nIUVt-#c#i(Zg zIdA&xS8C<%tO>YN6z%zfOJ(%Ktz8ZF^Qr~y2farU|Hlpm?;+07fDQeoubVskc+?0Z zSM6R<`J-ykT|muC6p^Rpf>P=4!INC@B)r@Wq0pv>yrSfZdSziqJbqGtQdH*mH_!5;iN;fvjkL>s*OivW}O z5t{Y@tCq?W_X5q6?au{yB7)b9aXZp416+<@*&>WLbgc81db7^Qg%KOT~-0s zMe($@gRu`S*XnpT)}Z2KH`M-9t`1k+ny@sLzb~$YPzNX3R0@7MZzRb-5LBt`(VW5g zci@fgUaz8Iu&zX@c+H-y&|P%=wQcP)3fAGimHr2wZMUDomjlkRYp2ll;=>T*9DBx{ z85nZFhYK>#v1i|#(HtQx%QGbGIBC923QT4@XWzEH1(1NrpOBR zlGIv}i_sp7Red`q7r{ z0q=){{dut(vXi#UHoktva|HNKoIEsBw}xo>bZZ!PhayjW%7ZGx^qEf$rc&JxR={x5 z-4C}&=_9JZxC1tt1OIr-U($?+?98KUS!rB=AKSS9$=TlQX5hvkuT9A02p&pCn{d#B z(k2WEYe5{wMp zM0X5~6#p*F!GD*9@!!b&k)iFYp-EA*CXRo5qv{6Xk)fN7(CepV;2Foi zAMx*}k;S2#SBwmuUc4G#pI+Q3|8JK6w`T0bkH_%8kvaVTrZE2>i`-8yc02I@9rFL4 z4#?&7;(C18{x1G~fPY&?7KOHN<$rJUzxVmyr~L05obCur0c_4_aFEz)7JJw{I4ni7 zT&pm*`2OuyzQ>_#dvk6*nRt&#O9CWo!5sv;EAek{&K>WM3{`y0IyJNz85;9p77AXC zlBBH>Yn#;rt>^P^k zLq2c{d-x>u4i}M6v@*6QvQl9Tp?DB2vlQq5z;R$+t&BiU7oa6&BD|L|B1BGSC1y4; z3=bc-L=EKoRe$Vzuj@Ppm3U(^k~4?JzY(;;wm&zldNNojcj)E3Hlr{rRrI za7>tW#ss;V(t!{GVTo+%ZfOrau?|;F5qUGcdc!;>f_8}fHAnDykN&K*7lI=*P)Z)2 zFkhJ_&-dN|yqw1K<-O8Mo=O|o$_#wNaphyeG}~?Spfo69IN7_-Q@o%PfsDNz=!`xV zzM&A@zp5w8>XG-Jf8hO-jp`RX2Gi z6gH`GZRuZ+qQq;qRnZSXRQRu;9uX{kADZU=*uacDLe6aA;Ot1XJTECV?Mq?!w?Zv? zN1AZ}oKo3Zgc0H>^lU0{aEMhMDj2GH3R%_7$d^2v#qz-X=qTCpdNF>h-a9FD|1#X7 z73qJ_M|Hy^{c+drWfB-$n{h~C3Z@yODLLC{dI7PAoxP0@$dtCvKfZGwjDK`6bL6Qn zB!v$zN8nYp9CPK)xzfd8HK)G=M%$%T)N#A(zNZ<~$eJB4poR;SwHsk_#C-xA?4T)N z!i-2YvbKt<$oc;4wuUJ#$Jp?s?z5rk$N~vavPD5Pa@>)23$;hL2;71{mouE$??j2F zo155Sy3q&S9~GzJwmObX$c+B?zJL5BwiVmGbCog9~=$e6{2HXQwA+sEQ^ zc|LR4J%0wvlm$G}Yr_a#3`btF0|j}qKu%U*ej-xL#bt2oCdQ(?@r>jg-9GOnRRCU5 zoNizimJH_~1u;+F$N`V>iF{EU>P#z1aEFa|xGx+ngV(L<#ayiyXhR7# z0nargq5H?zVO?urXRsXg7iiy$BaNzY9|ZBDabLhJ(74a%6OFq(QFJ{%^N-GKHJ&Y< z*$6E2^&0oZLRnYM2iQ6fPi`70fs9I_6Czl4Y@AL7$FP;go+PtUIoz;ni=_z?j_RW( zsB*&8gPAF~t91B>;3Z-C+y+1Oa!do$nh65CF01jV-rKDLSH2qdvtnlx_y8`M9fr6? z+0h6}Whbv750)e4WJzgPuEhHkdC#hR1Mf9>hhrItRcVNbGVIwo)p%fhW#TF3n;E~Yu8eXub3~Dj z-zMgoOLJx2w7CwPpBb8Z3tZs*tk6`0&z#WI2Vmdxab)17ZLmMAs0!3zNfCmrVQ^Jg z?JiSYb@JuO~%652AJJHeAJAJ>VO(vezq_bal$A&`&nBehjNTM9)!Ev%Hy}tPYa`% zbTl@f#4i)qou=f=ypk)^mrU-?Lp^+sKv)5lK4v%vVr5B}jMj0a4-AIj)>MqcK=EA* zpuL6bDspu&a0paUK~A}4LFepIn)b_ z&=bIu&C)2taF@#)E29|F^qnJ|`p2=mr z#$L~_)q^@`UtE^t(8@Y%hc>Q!i?3f{(}G$#*t?8GZU$4yoQZcP?z z!`r!YN)lG+^<}gnmeUX^2jh9l;eRy5&Cel`-E|Egz8tP!nIs3JEwi?>cY=y?@DY?Z zwUk4rdCW`8LDh;;6Y7Fm=`a>C8;A5?{;Gu}n7c}(*Wbfnkj^`sOTsA05QjXFh2=6lHv`0zS1rO!rcG)N?g?rMZ)s`YCgEAbv9Gk<|w@}sGNPv1yl>v z4yLtG`*8NbaS2bo{4xP@g?_31Lt&~Jl2MjmP#!aoX5X5{LhMcprqcDlA_e2>BXWiX z@8sAAR)Y&3?VPwx?tOf3Ur>eop%613rXU#Ipfypj=yFgZ5HNf_?Mt8iEEP?-T{M9} z%G)$rd@~k2L&-m&3VKN@UbvF?*iV*s+fvA8i(jOe8l{rnp@pft{d>c%gf+(Hl5y7( zK9u4Cmixo$%@sk7s;HrCq+@LAVp0DoG@>MactNobNcBh%_(ZJ}&lgEP2x>F>V zy{kq#yO^7vqPV9Y^0V-mu70&Z@YdXWTAso-@PUFi>E|H5Ecf<@SSM9r6Sk@(>eMNV zcsS>p(BH5+IK`7CCxw>i&S6t+?PUI7 zXD_0;+nt^gs~6L-JMEi-x^LjTyfzvAs8&kD!$T8w{}q)%Emhs2(sU~B#JQ}yQiY}` zY;ywF+g1?rs;ESk2#MKC=g}s2vO!%Xr2;HQAg&-V1m&_kdsQ_B!#}o6F3&q)^9*a2 zq01C`9kMeTh7hK*;ybm+gtw)l#J6#G19(i! z;vbnp-ZLs8-&1++KK~3F2N%sq%l;_WEA&s9y9CR@ZSnbG^hTh`nTgGykObO%X_)Cb z(D&7|xPwqe(^D<_yRu$M?k7lE^Mm=Qd&c|oQDKa$$o<||9jfM|#^A>`ZsiQD#m#vi z16F5z{XN#_evP-urC60a;+1ck-TQCBZ8whb%c-3DMzBY*@PJ77mlIVaf#^a8GqV3R z7pqOO2Tl@qbvzOEUr%$pJ`H(nhQ6egM`#-RyUBBgG=nH)(U)eDhkWn6 zlO0Lq>(Df$%pSq8`B#}m|-i-8SFa54%%IRZ)k9?ZZ^?FX4QzN*0uOIT?AV0$IV&iJj38ymQ@ z*}dqGzcjlqpR~8xbv}zXyK`Rp7OSN9-X@IH3Eg%mvFV=F`J7tC57cusTmZ%!p_US` zvrZDP(`^oX^)tWz`KB{0$E34ib3)xv>&ec}QcMyCVB)3$LIxKTL^N!-Yk~;hgY7Jk z3hG|{6c}qbp9NHowIfCs`6#$)mizFNsKuaQEt2Hh%6f*X?VO1~E7EO-Vj)xjTwN8-Lr%@Bq9$y(t*vKpiX-#&<_HFmm^`B_EX=p?>F6h#nXUZ1Dq4aEdZK1N8`A|y!W!6So?X%f z7vN1f5#Q(<+9pIH18NXJc?rw~s>6{S=>;Jqb9Z6*h>QlegVC;(WL;2#8{06m)c}LQ zZEcLOroM#1BW!UtB_CjNiAhuud$ypx6EK(KEL1ZSP^BGI{T=R3tVid#pDWkPqde#t znhDCeFKRLMGc@@OELCngz{Dux0_NT_yT^5Qp+z&KMIj^3L>2{W>SB?bnc?S*G1&B< z$QO@yc1a0BQZvTkD&YgdaJl@E4W}xbT_MyYoTk*@=~7Wf)a@k$i1bom9CDSjK`@6U z>=**ZT>!?_!BcpQlLhExoZY_^wt*xU;C)OK-BRe#q_7?!@P@M4F>T&N(c~-Tlu!bl zN)XOaBY|GW9^r~;3TEa|I*td_FzidQ>ieULb!gg`veRK3^>{QbO}H3$^}SS4MIOHj zCP6+(73@pErL%G9)?ncjnFLOWXU2`jQb~^RwZf@PEXP-KR`5k&m+4-n*@bG$8sy=T zGOu9hm}b|-RUW%IqSoJxH!?o)9HM(v5bdiHx_DD!@R_KFhbxN%{OQziG*;e=8g}Eh zUhq~l@aFgi8J_Y&OFjDo^{Zn=p?;!F}e%UbTwt{#}Z(&*Lu* z@oOb}JvXMtgTRMdU_%U?65S*4IM?k#7vM=9nd$DQ2t^FCKPD~n$7x3KzEo?78GlMf zyV!Ej^ZYO~Al4a)pCCf_gWyknIexW&|L}pHyACR$r(YsB!g+Ko;S7PjaSjz~&8^T3 zge^8xurc@YK(UxZ#f7y?@VmQu9^B$igobF7e1GoLM$BDEE$az}&@)Wl)|Y+?E>Ui_ zhf7p9+#7#*ml2GLW;yGi{6(KUe!Z%JQ=K?80NcnMV1ZAh+^7EneN5k2sU+a`!X#N*e?=y1f0s30b) z!&{EzFjl(AHxDD_I05g_+L7=c z*G9^b21_rh@W5n^7R2Ngl#d)ts?x~eihdUH5#n2FBTo80;zy#{ zSc0|iVy~05z2@r{qvANMlI!Q;shc5qTEd}((c?9!nYgj5vFTm+PY*-oX2K?XePet$ z5b+_}#?c(5;D4xb*fvk5`4z4m+ruu&D_lPY_d(^Mtp)otBVuTEShdRbKL?>!?s8m; zwaNX@Lx=_+OVVfN|HtI~k$oPS8@7s0wuf~oTsH1tKcAIFETVmcKG*GmB5(!j!_4+M z9lFUQ34dssG%q#VV0)t>H`D=wkYPEpTCd83Ut}K|&~sKo-LQR{GY0q=b{}T5?xBLQ zbN4p%rj*A+pAcHqJGbV&>S$eWu!y}oB&lK#u3D6mW!0=Om%Fe3vXu*>f1C>z{}~bw z!VTEB^sn^#O?dv%5EAf0pVb&6XO<6yMJ~=k?%3skF@2(ThRF=>C?0Tn_gpEsB2rqH zd8qQD98i-HD^#M2DFmh94ZC3(5!5`_wX?t&3X!@Gd3!@G-uy23qd4=GcE}Mv`G2RXl--F$fcCx zLBBwEj#55ISS~$2kL99F5}Ly3+=?`s2){FrU=jJum#5EfrFtxqOk$A-E{)=?$u4Ma zn(iL|Ggb0+$S@bEWz>c$Dnc1f3#mq~x8gc`+-QRo* z$!qyz9q!U@h#x4e4_1ezBpve)ope$U5?V_lOhX5*8cw}vEnq;|KRJ3a75Ws~w%I{s zRl@E~*VA^mUmQG#?Nq>a&_GEIslQDRV8G$^{pE1-ujCN#3IX68`3lM8Oc)3lqs}>i zz+uONh4Up}T-OqdQwqN77PL%Y#h;Rhm63p6i~^>AI0@U_=*Bu8U}7Rc@x*gMbJZAY zfG2&vozc>%(3X@_p@sfQz@#`8E`E`TLP!Oj>0$Rnzn()IxF7vmMqNnKFJ=L!%JxKC zEY1(_4Jv#O2g>hw;@69mt8ymFtH76NuY$G)UPU!MBE>vlVDcp2n(UXQOgdwbK^ZCg zFHTj322+X8LR-}U-ARE%`v3(-Ad1H>Dhdj_*Ii4+6Fkyh3m!Sb7BJ$s(cO)_52Ef4 z%}Z^6XHrZpI?s&Grj$_@qib1e8 z(KPY~l>@(x=K~3(uS+dX))uUZf5A}c(t9D1zt9xqkMansdOF2z zxK}fI%T$UybbJt|Fmfpj{Ac8Tq{kPRj#G@w5{+4n8OGb8LQEJf?+HOHi5=b`r$rBXQ@>M4@l^g@R5M zXBCCH_BT2IUdSID9Sv@vzF8m^S?5|sT}%tBe*P|8=g&1Oa+bSiG4r?l%v19VO_QTB zlhzNLwim$SURrgMdJN&wAT)w^HxfH9m$A$&JA3jqWOA3k#+=NLIEGpyHS-LwJ?;sd z@DXt87zm(u5cCfBEp4y3e=#xCgmwk~3hP(X&^w-eqctgG7!RW1hlks&=RL+?t-D&Y zv>dgrT8;?m598EQeKj!Qc#vTHZWqYftDQv}=&_P`g762}%da_z=f^d{G_tmU68z;4Y7m|K~ZegTn)Q zt}eEsxHS`*nK{f2*I%{?O$i~pLCtGp7P5DSHRG8xsHWkU#H9r_pXUv2v%1*MKIf_n zGX_v+ULhbWBM5T(rD$F-t`F_20#eM0ZK}k(uJ7a(WCK=AQ}q!-!-RReq|>K=C1p+_ z`Xi4JqI;5fm;{&5R#DXo*N?+-v6ut`L_7PnD`h?sgB2X~wz8ULQm;&y7e3KLjGcg0 zk5$0scG)f=41N~na!247>XQ-zTNdOG=7aO`$@I@n-%IDGLOq_J0fFZR1P+4+h?8Xk zj|EB_m4}eC@?7Q=W==T;y9#iK<;pv{V-b1gX*~1f#2D7S<5R~|2NX0GAG9iFy$6B` zThLR~t*>b#(;7?xx_kdc1PJ&zA*8=d_=F_?5}LMzs#eqTz6H*g!6y1*yrLN^-JvgF zJg;Ph7R`89w2Hcr#d|Ai%8^OTX@Bo|cE{CJt>_S^Vl_MgTJL~vEqcS#Ei{Q#uxR2^ z3XUOGOQy*aea*UQOL+%RdQvV)2Mw|AIX3OBZ3R?KpCSE3f1s_28g4SeH$o-r)zKoO8N`+ zDqcuT`cZB-A8chug$gnSK7fkfDrzo`BjNIhT@?oDQqj5bOC<%9#!r$|-ba-ar~TZ+ zw~3y`?u3G!;44^)d?&Q%Uo(=el1gG7Lp5LU$2ASKGyd_N_2VDk87A=$fx;;v6>hnI zxtUe~OQE?$%~gtERWwToS4DH=39*28!=O3v#AJIeb|>&B%zi&Uf`>71Q2j($3dPw# zRm2e}TTZ|a@baey%YY(gUvVM`tSq+oyDpRVK8r5pTBf5qNh{UqWBw#kbH?OxIh#zK zS^a?mo*9_S#KieFif?c=Ugyl6L~h|Dcu(I?R1&b`t5VYfrawwqtTza9*vlyTb$&w3 zqA%#bk(V>w&AYaOd!u0;H8`1o1x8Jtx&==z*F&-o>J3YJLkq14Wu|K!qhVy64ke}a{BpPLT-ku*S@7W58W|KW$j%#I8x@FP%oRSErdN!EyFSs$0)m1tIB~l2GlW(x#cV#lVfME z8zFxF8Ys`uZ`sL{{$QRcCm5A4FHZL2@g?|8d zOH%>;9t{Jp@eW;gvcHm3+{m7Su_{Tp$)b{!c*T~=OCp_XO#_R*(k7h3pO2LNLi^Yy zLpW7Jbt$K6)^Z^l(UieSg8<%wmsDO1mfZrDeP;6J7BMQT$fQL;sV*+DyS{NLZReKg z)Q>|`$BRDmhFZZZ zz{)%YO0X!0C+jRKm`3uOv;cECrnQ4Ut=!jbFHrNEQ&x}NP8P1MwA0S%ob&Da6(1aT z5kKPgcrdZ(kZUdiOHb@5S zM-by?$bJ+VOYp{I;@2k3&Lbme)Jo)uL3sBljg?g{N6kjb#v{8NLpC3d8^uFXtWr~M zC&99T=Cx+SzO&4lA8~`>dYqJEcY5|>szYfM6HLd$gF?1!_8|bbXsO49gka;FIn+f* z3Vvm|=jpvKWld|`onK3!6s-5J^31)f2C9FM?;TS5KcQ)DmHwO5|0wkz_!yf?B~*4BJpk8$Hr?G^mAzUGS^yBc8amtnCQ%Y#G zj1f=zu0+1fav%6(sw;u@%D5)0SA!`i>L4<^PzoZWzqv&v$%8AQejafMN&_RH2ihjn zWq}YdE0eBAEx>wIPXUFQD3=o4eLk4B zg||qux1zQWnP$w2me|>g|0K~9)`o?qZk5EPQ97)}c;_GA>*Y^(@pKC{-G$61xsLteT|uxiRJi#SQnI1DPuu zYp8NxI#v$OvOMk)XXlaIoG^Gsg;2vk;$a__Ei#H9>aq$bbP1(c3Vb5YGI?=uo}6#E zCDi*YckAh`7_MVf2B^iVvfP(bsAp)5wdpZ}cS=hyK_|Fv%o)-zR=9fXfdw1l@6zXD zg~zxN@Y8tvso$6(rZb}Yr7h4>L+U+;9vovauGh%brAZriVS3U^GGvUZ0pLxH3 zUaOMzUd&qc1{jkOzZF@#YqrqFu(x>mAnT)8&$nZR8^?Udfu7%(@u$zV%(yc#qgSQG zGCOUR-I;g5s!zgfM51>Z^#8E$(u94R2F1Beqzn6&Y+>K>gywLG4B7-3Y)KT&UrA`u zLODGHQKfW(eukuc1)h&7|}rxvigpL1i9ct z*po?3!_P1>J@S-$F28nQ(3&m-xgvg z29`ugjezhb9FWsCG`peB^Fhk@D6m1_qhKehyc;XWWf9L>u$jPsLR94lL!?soa)I`s>rR0CVm;d1JU^-s4H1PO9T7uOPJY=A_>AEcml6W`ysaB)F z;-j=E*xPN{SUJYe5BY8mVJO|)-agD-2N${g4lNSgb{fEr(t`fW`u0YVNXxLB8VG?znOzS54ua&?L$W_a%UyWhg!>r_G}zlxOvQX=Q$m#kw3wr=BLO z{g<3S7fl|Myu=WENYa1svy=)0bxsZ}(0w|Z`bjOu<*$RR4|$@-wWjrBe3cZpe};1C zjH*2p7BPEy{1L22q~BFCn2}Z)+}tYo-C3#Y6=glsQ?!`mGc=W|tKJm$=8b^QEPQ+7 zu~>&|-p;OBb|D{Zf0U}Acaw)GHeZjO6}~;`eYMIP3+h|OO#$i{gZmOVf%XV~C(u$V zP?j(9N-UnI$mL+trdQly<4}z=q5Xm8BN!hh#?!x|MNHmSC*DAhE2HtK=4Y^PraZk~ zp#+CUYH;`}vj8W;lp!GM{#ibK8bm5LQRtDvsA*3CZuY*1NGdfUVowa4g?ljK%F-O; z@hfzPW5@_)ZCT_VY&4p694PGU!(-CnxCQ-yGq1@9gJtZZ9KWFv@P_c5?4Pfv{mMEq zt}JkjrU!h3)+U;FYO+Clrw@2hnP!C^YBw$Ee5|^fg`#)iUU!X3K1$7>SiK`+_~&C! z5Ltridpoo^&LACxq7vIUe+V7%uqYNS7VzsbOz1_~e$8PW@W=Og@4gb%`WQP2`?c360nXC*W&@-(L{@UPR}ebS5ANm!nQebM?LhL(|U{-%gRD zV_CaP#0P~BEjsPYtTA0fi&mSfR^dx5O!}55(GBffAM3u#Y+h$}|3!YRS3hp$k7j4| zv2n}RKn~@HrpU>u!X2mTm%v$xZOk@Xc!@URujYa^Fyo0O80SB7sB?JVY@XPf60N zM84wTknbq^x)N0a-VhhdawzqTkJdf1)kn5@i{+dtHib~iX)qYn^_AoAl zJJucoE;x_N^TfBKJId-XHrdK2X9dQ|5QV3L!!TC3q2eH%G!dFEr;gELr?q4B4s5%Y z!L(k0Yv5Y-`N*MmL*=DrPuRr}TobDmu6u*oW-p7VXA!(eccI>Zts)LGBOOy`x@$gD zBj$<49+)0^^?4qq(=p=yyqAq0)PoIAj#6W%)3n2Jy%v^0PW_oK3U=wvepZIW?~rul zpkrJ?A~KNa#m2*!f5|00C;Q|g&cD#TKl8qte|eZ$i5)>Q^GJmm;TW^EN`F&}_ zz#>kAE?Uop!6pEXWg*Y7`wdvfydVP^*pfh*rpUPcHRdgl@Tpc#@Rg+jkUDO0=R`0D zE+-~Voa*@=PL~Z_$GgsKvrnPm&}L%p?X*d1-af2bXs_SlEv69`VCd|IXVj=B^vF{j zPiK_6$klajWW5^BY|!>P@$6GFnx0Nn+>J0Bh%~LPYibA-5X(XDN?!&3Sm=+pq5s70AJF|z#8}}8Sz^eebtxU9aO~qMe;pWiv z7X(jc1P>50!h&=lHuj4DeaHUUr|l6+SjwqOG?@NC^4f$N;2A2Z`Bf(ewHa>o zK=-Q~(E8jR*vPI!td#cW_cZ*J^_a%uKM%*AM%vD(f{(4wu(knCBA;p-l_eeASX3Uv zsqhYaGKhW-#_c;um%`I^Qw#&E{n| z$~%4qd(+VJGL98YRD%unL@a$dH)~MOy|KbI6-A*%Rh^@CVm>%^=j{c`pY+8dvE0z2 zipUA@{kE}U1jU0Is>g$@By`~CNgMFogf^IAfrZRhB4HE zwJEl-aQYt*O|-RBqn&=f zjAHDIR{wI~xEnB6n7jetW3xM2+x`fsm+>^HJh0@I8-yhb`Dm3Tw2W$?;ve71U;fb^ zJsumksGP2poLa_l3A&3F-QZuLgUr-rgSK&`N|CkS6z-t46q`F`6fErd zP!)kn!w_v{S;xp#(Ohy+Oqkp1Wdz>DvZ}Iv(q+Xqz8J$~$)${}_GWbfQT@cYTQJaMkHa;EiIRTY&`W*JwF#MJnulo|~ zWI0;EZIe=KY3gP~a+y?Jwl~o3fZFdndKk2}ce`j^MI@^ZTjGXCGTi~9B(;j#F*6yj z;0pA5-C_o_neaOMp@Ilwe#m{f``SoU=TsS)@arS}&(GVU^py3N#+=gOK%lI@PCEg{ zP1Sp|#$H>~ut$G~7PS_ztc@GL!_+13UYGTnRatO(ySM-e`=oyf)r?~icE=y33#$eL z5m~|J5!2QbDr5gKrI>LKIK%er{>XaUT8{x-ma_31zpIPV26V>t;48h&IGgC0`=Zzn zlnU{*SN8Or-i5gIJmg5j@AL_;qF%vAUOU9ot5wJv@G#1upE-Ogl_CqO@u|-2%s`vA zT33SLl{xr@@`V0-KpJ6#W0sV#2kV2?8ZQu?bF7v&l!Z9}xU?+eA^Ze-@8 zObc?BC9{`+1_vQ?d2QjAF(&46ekrz%1`rRxXv{J26~CBPqo;C+5-4%g`X#;|-Aj4` z#g_652u^ZDR!#4?kNiWTF}fPm3kA}S2MZO@H%)dY3W59DRnY&o(p62-|8uE-N&c&# z{&nhtE{7u$Xj-JVV%G8CQADTsN^i8n0GjhEs9_nH>&J^)s=Q;8xia%8Lhv?vINy# z(wpLyIU|{Vtl+7=zw(;E}QT<5FKbXxa}zO+~q0qI$z1F zgpL(@g#S2Rb_=cuffdYqZ5VD$nF2NyL#JOpf_^l!9l20WE|ig_V1;Zr!^gf2<4Sw3 z#ya}`xM;*`-1yy@a4TzyyRXG$XY(MO`c?BOBntV(x-}Ocw6<<|w`NW+{hiw3T!0OG zKTaC8GP7HT(idxEG1qiTzGLV2Y}oh(xmeGQf`}8q;XcTzm^m$DPB>JcGVf)S_fqb?RH+x; zl@lj~Z&b6dU(iOYZ^H5dnDB=*T&^~x*Hde9oaVdV&1_fS9IRIbA0eBcdqDlQX zR@I0N9y{auoCd4z!V$0FMP=kFM?!?RYyFa}3 z{U5z$(k~B_DZgd^2R86<{|5_u#2+e_w-o*73io7xW!h(hCv+iPf-h?}b1{C)4HJ`Y zkPDFLqMgipO{e{GyHgCvu(S#)!ajx79%1Z+<@lYJ;dAyu$LFjLmN0&E4p+ESAh2fB zk?{gZ%N=wc;Qtd5PgDqcgJ1;ZbY+{Jn zu>Z~2^%}#W7Qct4nwHlJTrWYPBu7eYVkrDGl=uA>>lGag5$r-jiPu5};M?SFTMxp+ zdM>h=PsD3{;@GO^PmyD*z&`!cBWKUo$gorJ1%dg(YJ6uJ(5z!1$~rwT$sx2I5Ff<@kh?h2kc>(MX-OZMgXg*^*ug znWVCegA}rZH8RP=Pkw@rY@Q6zYmsPV7vu$zWl~PVg2>7=vQcS}y<>SiJ69w7_sI&G zq_T|rxkA+GH%A@|Ba(-Y%+blgpI>?fc&0}pzYPbG!9QiVuVGv!!Lz;^Su_o@QxnJ* z!oDcYlQl9)Wf?sbvg0)}$-_ssvo0actJ5IM8y`f5<#agDEr={fBg;*LY>v*_HjdKB zu0BceOj23KE7OE$3+1seB6;}8F7}aqXa;zurP-rr5Sd7`W>0`;E?Q_R{|-J=^z0X` zV5bV(M)mI$&*pL?0xUpMSw@jUcD6<)dHBed>g15-S!s~8?@n?nXGL1~~@R8X%Ie2zh8f4qM1$idOUS-SUd5v<7tSSw% z`~PgXoD&Qm;-RF=_HD?HmKkA)G*!$>?l8X9HRyYdEF_&nEvTz_YMMmX`+E&$XU3C!VBu zw(xj`Oj23KfeKlcMkaaq$llV)A62GAiFYw?5h(MvTZ#S zGD&3__tl6r{~`}8V`CmZvg3SY&lI=h*{rTDcs4YMtWhJ|%x8+%SdEqK$^r&!WD$)_ zQd!1v3Ry%WlRSK6mQD_y<)lH@+@%GwS0psh&H8+eY(W}ize^xn&{OejL`3mSQd!1J zQ-o(P%LAvzF%KWv_9+PqxMEg-XAGoTc0k-NL0HuqR$Urc_v?IZqqBx}KcXYLSxIFX zXDe9!H7v=)hgIssYAaXP>*hQ}SdI~z5oB04o!OKh14>q^k(H%E_FpVMSE8Jhrx>>G zScObdSw`bzVc2?kER0AVKC-{-}|0o@h1 zB$Z|SSS{SzDUXE_$-{>=Qzr+v8hZy|VO>KySa0nJaBC|UKfqJCe5TlA-vq2Tj#u2O z4l7ua$}(yctXd6A^6+8pos`h}yygI`qtnAWJ_u{EhE<;i)}uOK+c-|cdb68?C8;c< zqk`2*!;(CFSXcV6PBO?`z^$1Y)|@o34o<+D(L-@-*D(r~q_T`BCW#QA zlm|wpn1>JR?THC)y?=ZF7Q>q~u=ac(fHg|PDo+DzjLz3K{u5EK3N$Q9Wf{L$u>PQ7 zNgh6|-af2jrw3rQqViV+VMR48GYzayu#R0>;$<4v=&p)elFBkxO%!gemdC<~^77TstX-I}{Cz^&C9R%04iMwIk-nXX`!9;LV?sVw6V1*^S=C3*O;ihNiF(gX&EJ<@RNrltV5 zsx++XG_c~gdqTXSyMi^Vvw|h5EMx8j5#mGgz@7l+;lp}HCx;Ll9{P15ZjvSOI<_g% zuu9XwIzIvH{jh@d9$HoEmZY+bUJBOlG%U%(hjq9Q>$;i%tX3REGzcqC!^%$s>&@Fd zZuQf!4$`nBm1X>Wyl`u&JQhYI41FWyU4Zy0?ux6%#b$J5T=Uo-7 z|KL6aa!XQKMq34|orWcO_^`r0tapAF;8rU_92$gGreTdr18enIk6VK^tb7eiQd!2V z+eC=7<$*CU=HbJ#baLv}9|N!uaHbRDBHX%_=>GTBu%c;T6(nH2(nWFW2DE47mZY+b zh=SEa!;(CFSU+NcxmNj+M+9J@q;#;l1!3iASh;CnJ*e}wjV>D2lX6sWZA4O8#;aAr ztwr*{=ojvJ5eKyIm9rj2tH ztbrPq3B$Z`s z8YkS^EDwx(F%KVBFCW&tzXf3N%!o7&;*ub&IU3fyG_d|T##8x=G^~rz`jcCd$}&bN zSl4M-l7|oLFFH9?zV40ytX3MIq%IW$};wHLBG>) zpFA+)#XNji%~*D>RsPc82!1OGVWBcYz<5D z@L`SeVZHitfLpCZr}upk;8s|}%1Z+)Cjsl;T*a*{4NFp4#?cB^7Y$4D@L{dLCBdze zCIn!$BE(-l55U^Pg*#CBj5M%r)A`!QPe&?P{gEZPC8;dqIqp+%`aLfX40JIMAJ*wU zta}d&z-q;BT^oees9|m9GsP0WDECzUY7J{5f)c`#RF=_C!TO_yC3*O;9@EL8^3w+e zV6~!KSOo1mi1`}Uf;6y(Bw)RJgyPogvbi6-c}Z;zP{u zuv&??3WKoZ&MpX1F6~O;*20@TZv9@v`Zwn2$Sp}_8J8`;d84}CkMCgeJTJ; zjx22%2L5eJfLo=STV-ju)inX@kxq(Rr)XG`$})D05pMk;4~%ambL+F45-NYdO95D| zSmGf;Sos=O-!!nM>3nS?OT)Te=8dr7R{$836|5;5mgM1cYoHHn#?b*-h=bF4`HIg1 z+{)6ha?-%sexoPETRJLkJ;6a`2vJg5#$gK9;To3Y;lo;>lS7D;&j`S3C9wJQ(*Ufk zT#NwSa`{ZrthsVt+ng4IXEl01BFP0`80E%TZHEY2;aX{ulRB*3ki8rGaN zuue?CdhRgAtqWxU1*?HbZ5jW#MYy$69vI(}Zxh^V!eV&cCKkxdqV83<5;W%qVU5zT z%G1D_rSr9oP8!xd(rv4aNGi*?P{F!L!;(CFZVmTgJ$-3_TdgbvnEY{oTTupdY(?4Y>yj>NEP=P|hTZMksEl?TSRn1>JREu9=f{9#J~76uH`3Gus+0tq5_+hXHP_*037W!1_Z1*6Sg~tvkfK z)#_bp#)I7X;`IBgJQk|En0#1!MkQ1}uYCYkD-lGGAgp;B*8DWE=IMNG<5&%Av54B+ z|7V<}V4bXCNgh6|D|}czG6S%{@pQU%*X9JbWVf_lR+=Kg_6baP9jaKhSCBIa?j_`o z8>ioLd3dK?BwRz|wFy2QIWqvLm2trTZVCXx0&1?6OhGeI=V%)lf~FEnOl7^EQKpbw zArGF4;qzsXPUJq<*o?dW&Nx`^`b%DI1r7V9n_gn(7>6?#EX9$PX0jSE$K8^Lm1avo z_kmBhT(+!eI`D%l(q02y{9vvcbBt$w(sG~F6DO%HQV+rUF;L&(Qy&$i7EPACFD3Of zu1j`|^L*+RvK2;Pc!tHidy%?<+Xft?yH9;nkXm^MQa59tT>NLQhjNUa$0S&h8>AM; zC`i_m`VWfwA3pUm+1;U$C_l}-A0zdxTr%Vs_xseNgVd_AA$29GpXXv3$GFa?J|ajh zh9O7>lG^107RNZlr>?&~AwsX&XWpGjeVn4s_NlKAQmfd7)J?~O`Z6x`aEvWo6Flh{ zq*ehKsox^?16<Ao)cDk+g48M$CiNAh4k_wC`P7F6 zspm^5Nb1u_J($z;j&Xudy<}7XNn?WAAoWzvO*_WkE{R%>3{vk&P;cr1>Uz!>JI32S zbxx34bq|T;X;S~h`BKMt$fthe+5i&O$0hZ6QvY62-|SOg9i&zrby5!{^(~xT#K4$O zeQ1zcjW&?F8>ye;q#x|tr(QfVfTUh}ilqJ_0_tx$>E#$-AD!UIl|gDZLA{*R$13XA zeCqZ=YBhMpyze9RpE*V37?w}H=$Zf$H3CQKYe_waQzVXYsZU)Nq*lX-q%I`&M$TL~ zMlYZG;2^ac3nld-q&`$pHy@R#<-)52NER@T5KH^?I8YDbIKN}8_o*)nQg2RBzewuZ zxKKalQ)dOK)zCVTOeXbG4nO1kFrWJ6s{%;W`~ayhAoad)g?gY*Jt9c0COJsmgVcQ# zb!VUYfFQM+sUh|5V?ka1jpW_bIl+?!R|b&GVdeKDzP*ll)b>mEAvixWQOjR03*@a;gowsl5UhZ=q6|5qH-8C>-BnUyp2oDCS~$Id5z< zwtuK&e2mwOK$iqg7abYnKU4V~Sjz#GT$*pq}WG;M|AFF+->Tmd6C#c*3C&m*w)-pRf= zgrwp|xgY#0(;keSQI}x5N;#fYIG^ObiXQUQ(V<1raA?usaNqPdgqzlxP&e5{CHu#) z5!tHWH8S$o;W$Ea`00b?#*yYo=76O)9PQon`&tNe=gC%@A!^5q9c#kk|AIE$A? z1>^>q&1}=MYS-ygtdyJ3Rh#@Db;OWz6C4Y2->j9YEj$5LJ0+=VE%(=ry)xNfV6VP% z6x_*$^C9mz&BVEl+_46A?6{E|dX*EI#$Gr`VUi?O`|>5pgm+01bPFc}NmHHj1}*I4 zNDek7-7g9Z;76XiQu!mY-)UdXJi##TamOK*7@=7UcY(1Q>+auGHw&q@XFh(w2Q+ z)g+C!_!yH6$kXbpkLM^et&O;q0Sy91_ju@5;d^(CFzwT+45M(hJ+w=l)0z5uqPLK( z2dMUb(J-6^Z8{fGqmYL)PHk0ZQ7{tho=(bp!sAM9r4gbV!Nu7j9HvHHNuzy)u)ZWokDX>*3Dd!U^}zW1*Lo z|J7#3x=Q`Af1kVeJA@W>=}`Ss^_W9>KoR!qZ-<%YwxO}+W+dH5=M+cgtIfABWdZ2q zZJPzkb7~~t@t(%@N9vOYfz}lg2^!U5(YR@i_p)Ovv3u)}pNnonBRTL5k%TFdaxxvU zmp+~Vhet>z*uH;P0n4@Eqj84FR>|3meB8Td#eaj;KWU49 z%qeRFK8yed;BkRA0Z`*A#xG_JJgEk%rn{S$4YEFIx+`(d6*-yXuKDhZW)k91DI9^F zlwT5GQZtvUe6gMRt_H*qI5Pp2`XO}pRrs(nvs*7~^_whoK*5HhH%+{dqhM$WxI3DB zDdVTBli5pg@}N^5ayOvhtD?8y9VZndAR0cjaK#<{Vvr-bJrE~G9A8x33~u)(B~I8H z)VyLq;eSJSb;0MN!Y!d0hw}&Pzh2@A%LiE7ih6$PT#Q@GUTo^`jOdhsQ`Ki20z(Hx zK#2(+Hjc?MCthM7isKEP_b}WT!zOW!qM}nqQS~o?QHt*YW7nYOWie=CH9!t1{3hgl zj+f@;Q$L>2wrOq*`_5^NF)VVUY172#;mN-wABFMx4&Gs$o&nQM6n*4%G$5lK9?vz8 zNs--rK5?+;(}6IF`_N4%Fwa4M$*Beu<~hz6Gn4L)1)vNP2u-bASs?EyDF@%PB$=xK z0~$#)c?C^+`9veW1TL${`mAVa1YZ#Xp6ZcR z7mM_#`J+L(1nmedwQ%R8KXLH`&9$z54mgDq+HQ;BIU0n;z78uX6+`8(F1D|Z4EMxZ zjBH}2wF(Dc!}X28@1rCn27l`h^F0;wr}<>*a}Fx#gJ3@HN!vX)g)-4L$VnU*<0K9b ztDM1N?%s@>6!M_o?i-VM!hnV2uI53D*jQ%qOcFXc)N2^(#jAA+KMLJ_H_L<#sItAM z9DNCry39iXIA+ORpQCXZwrFlFl8J_P1P-d1U5{+D+$I#lTIYbc7{?~Ek}bIsU0gQ+XOB2#g0Sq!F-%G8qm zF_n%SjE4=uOM4DFUXCIX2d1(ylTHVnJ?@7(F>nw_m~M^bVzD;@Kjn!N{)=}=RD1Pl+sbfEjtIiH7aFp7kr^RN}2n)K)) zo+j~!|HIvzfJarG|Kki0jY@tKm1t@~gB{z%rG^SMQIMdhcW|Q7YK=>6tV&b0HcDcm zvLsAGGTvMaf)y=ltQ%HZaYJ0H2|*G-F@RMT7u2eE3~l4arZxZ1=RN1#xiblB`}=>N z=llHfDEG|0XL--NpZ9FSMrXd}3qV1X;O|4K)7_;ubw;%9(&U=mwb_9A0{@r-z(GYF zjrhXRA?l#)`c=XD`_LfZ%zS3<)O&uhBi_C{9Ws>JzU#2O)kq9S3}t$(JGLRZtFQ96 zckI~Z3>z}Kt!@`j8lMr0Er(_AY5hMR$6nvj6Ik88J59I9cAd<(b>=i=O! zU%&HlpF8;8zhfoB<9Lf(>NGU2b1(+yfACQ}slDKA86+p&52#`U7U>1gR8&5P<%QkT zVTZnlyYGO09$iDF2tg^MmB^$-l`C=h611Sw#~7S)&v{rbx9Lj&W0a((?; z^gSFhD{zZsx}Ed*X}} z10E))))4KrU+#lzAbMVLKd+XbyYX{*&#VN3Q}BBQRX~zFu@gnY`A7(w)7^v7UDY{Y z9g-!sh6BjhFkl+`7f8xH+U*_B@Dgz##K8$0!TOgdYbbz798QxKg$-1rB!&qr=|0EN zR|0XSM!v!j5cRTjDSMplzM7z2<$+udF$nTl=96?3%4IZ2H&}g&mDdiN?mMfvo0KlH z0^L?j3%9=|o_vKiv)#V|D&dlzyWH;yDw!<>F9Vi5%D|WmntR`H@XZWVo1g_#DfH0y zVHQ|1YA?hy^Vx`?9QXNk1sjM0j0|C#b2&V`kUU<5<0}uu$*HwdXCk@Xa&8RNeO-%; z)5|6~r@c6_cIWr1heTK6{)yF7PnRPNaR%J*%t_8Zd!eO2j<*tr9(uRlGF!owwfWqw7G!kmKu!2pa*9p9{`Pt@(xnfvG** zhxu3Z3jCT+{6Jp$kI;q3``${_tg;H*5jI2%IFNV5z8pE97hJjpNBdfrZNc4HGpC<8 z^(QzxtNxJ^sDTlOLbisZ$h21g1xCIQdxZXQc?o|?chyh#{z`Ti1rt4^WkF zwk7{@S$K*joD~IB5RLo-S26{!NANyT>Es zywiu3et}e74RHp&N?2i;6@%~rQ_#sYub8?LX_GLTEVvpV(|di}MNtU0fM-U?fN?ND zC8Pw`t<*DApsHupa{eK>8A6M5%cMnVY+t?gwqHHG79b{7un^))M^hJ65X5i1GNJ?w z!#hjSB{o0^L~mwN2(sPXd+!jq0c`}({wGz!S*ZX(aLf>ak%S)XG8`qN67Z{O9%r%Q z^!3l;=~`I>$%G!z0LzTvz`LtuCHP~S<@raRS9Q33LGb1YNjfS?KlQW!AHF+){TE4D znYIew0`9nZJNw+*V{ifAP0Otsj4dcEZBH9tBUQwox2g|w7zir&I#dYZ(n%SMuw{vplorV z%TgLS=wwS~9F!(?4^yK8x+a-!NfGU*9s!MKJvi7R$wOwpTt5KK{Xkp7O+i)rJ?zA_T>?0Xki4H%;Z8ENIC7-h>56f1SwDU4CgOAz-7@kF5pxzhrJ%7tY z1dj# zaRmsUsIFYU?~>n|J?mD~;%A4u{2H++DWLS+Np4IOrY*Iz<^eQac&{z9@!f)pMW}^Sv0Ge3VXD*;N%U4c;=FZ#vtEYpb(E9^fj{ ziJ~FD0YeRsP|e}X!gayMGgt-@yT+55h`oVpAHuOV-V^}`7Xo2HAgobcR-jj80#!!} zR|n?|liaig8u#E>HFkAR(avN!$tsP~fqZRmRG*+)u(3m4EL4!h;P?a71p=x>MZiw( zu5n7N1X$?c8de}RqB{kWSKXLMl5QNt1~gYAVp%^C4OCu)yOTc6AS-jQgD~ik5WBeu*h}dbX`9Qy54lv+%uR6>}w0|IKYEX@C8lDvPOQ2rCG);w@2{3Ue z5kYhyT{<9#i_Q;~$`5nfgSobmC6Tj)B_YaP=pyB-mA^^6GC)xr+YruMUF`e{`s*v` zug{^sUS^DL0df@ww&7CH;GAQTk?~d)cj4*Emy=u!6U{$S`Tmd?eX%0RwF8kuy5K$bA)MAbID0AbDX&u>KNGC#v5TfA3_q4O^-%C&LpktFW{3 ze6JVid7Cu6P%uE`C}K4$;^DiXkteloz|Dv3$|4rvvf^t=8c4#GV|I5LtQKChXODi|ngfdG1GUq`-*5h%7+pS!ca28CmI1=vrq#1Ostf`j;6Wh6H2@wL5P6KKpYFL zu^WGuS{py4Ty$qn@RnwxtFx_$4=3Z2uXv6-^ey!c|G|3fH&i@1huw9V4VcZQ3A6+v z4!j@&ijr+JPC&Sp6#xh&e4=&`a&TuAD7B;NFvV3#eV=Cs?zEGu2xj7X`mOP+sGxCr z^tzo^pez0hQP=bJ-L?z$6}rB@#vdn<4OYQ+rTY-88DTyk3zn4B?g!f8iH1|OGR`~%Rng}lv$QNo-Yt>fx84PmarWq&7RmTV^Kp+%%i<%%AzJ#~H zPO6%lbv^T?^7ui5aom!;rl-vv{cB-UA3@GYBFK0lh@SpO$CX+bh%oyg(CxlAh1KCo z<@hQ@XWb3*liEg9r0Dd*F5f*@sIh>36cJHE!I;NI!@pTDwI>7I8QCn8S`xBZu73|G zo8uH%FbX;;2?{SjGw?5u59hU! z#bJRcxXU*fKC&+c|ERbFy&O6>@rkIFpjNQ;&h}bD+PR#M_!sg?`Hu08+;1WRZQM6% z20QDkH1WXx!AHUayZc}d8&w%p(k-|kcL zusT-?L~nkEFMm|8P`-&U+wlG29jBvCK#mTZM7Bxfm_)8glB?~{HZ5E-CXugkS&a2E=;%>B|Jo- zJk*FN7Ac^IH+T(i0XWcYh?QBSe-ydbFeSDRZCPxqgpNR|iYLS1R8UVXk^JV)d*gk< z7|MIIl~P?~%+a>D3dWr?2uO$Vgv}@X%MI4Fb&=ei!Tm)O2!4URQEOtLSF#WT8NuWpdz% z(v5?i1$8w0nw!do`g}GC=B1 zY$zgNY`(gdHk7nR9oG>Y z{;EW=_N8p*AefiSiwJ&pDQjPuHWVKNZdMKMAgFx==yKA2*6W)}{sBO7_m+btsbRp5 z;P#A_eLuqq{w3?rlj{er5#~yJ1}{|XsNW@Sv+lj7RS26 zEGeFGvnp;K<-0%N7#5GE7B7(E>({B`a^Z9=<0w`9Cx`orAI0L6Q;X+G@p)3b>Pqw` zM-~0(4Ikh+EE-HL`t{cYyi^rMPcpv1i8Vu3-3k0Q%AUa_q^TLvk|YC zCcW`Fov}LSJDa6hC75sLnngie*1{ z=5D}tC3=?N;UxHiv+Gzz(tIct4=&|NuV00WoxnfPeb5h_dOjlh?vN(lg%2m?A?K{!IQS4w!|JJg`r1j#&KNel5vwv5zf3QS|Ly!Q+pnsr2U>(1m zNK)weMUZDwD1-^<0|{oC>248pkJTZs(2R7<_saBDzrsGl`Kqt^EK#8Q`trw#zUC`p z-tdI#tIbL`noUsnq`iM~RNuZC*E+zs>-=FNjkn-&0K&}*D!x8wjU zD@I3c-@bM17J3Q(vpVaV*e(1`>8ztiD08*Bq-rL*nJx1r?%Q(s9xCm5(w(*Ay}q8> zr1r622PFYR4Pn6QEc~O^=NHk`)}m6&p38=KbFGzq=+eoZorS#NVYscGG-&(8vYlJT`_cZD=%USq6 z)=8(P+_E22XZut_=A3ar_B5{jtjh*QB6f^B>LZ1n!N&Qhm2OQLhbg6aRXrmTSZl?w zf(zAXr}jMT1R-`UuV1k`sa>&*RBEU7t>L=nxvU!ZxE;a*Wmc?CHt)kXE#d-(_*>L} zZ~^sKYQKj*AO|Rf;Q}A4l!T8sS-*r}M37Z`Y6u2N$bdb;`q$2P`?vxvmovr%tgY14 zK}Q%A5G1hoaD=URHdx4=em<*SsXP^#POSj7YdYNfzW|pV2GA0!O;RcJ9xEi=Rz!MZ z#Tx!0z1x*YQ?apWAn8s;^o>DhD~U!|D$1#G%N`+@f`QlRrejrd<70g7JTAPj7vluD zHkzTLaBQcQ_o~&0y&HWXFed3ny~_TUL;|nk>M;0K`1j(__f8FLz*5uo_m{Fi|!YT4lw+^zZT_xAffw>#je< zihi9l6~v#`yAwU>wQxOa!>XBxcCOWxadthXt8F59&e=noT9{~}L&M?+P%S`}4C}RQ zKoiAMB)8-|>0?+uPL>BM?RnV8BPskr&4VtLl0Wo(GOSj)6{7|+!x^&t{84Jj6&Y4ITS*Y8HZ_kLd>YezyP}f^4VrpBuE~4mg>!)JVf*&AMccYfYn*+BEdg9qxL15 zp9TEFnbazl?X2Zb{&~hB*0d9^5;2(tgOG8Ooi-80BTiE;;T~^r3dS;M5UwKIH&w`RxfB!x{~vxx5!O^PSYTKtA`&U zYR;R??qUC(v*9spwwwzgy9s2loWZ z_#0-<13qs$p>tQ80`VL1%{}oS;P-OdanSTt1qC-cP@$Q)cB@8zoruif{rCExo#qzl;!ybik7*= zE`fvUrQSVG!srAzx*~^^=vnE`Jd(B&Pc4j zxs`Q&=nmNiysZU2e8v~aBz>@ocV?-Q{bLQmI0d-p?BDNdVLSZ0`-I>sr}&WcUZ9h_&1e)O_9*C!KLfW zl7_~6g^U+MK2xmgr(7u*UZfuLp*Db8DRX8I!YWxbUG~DfQ25pz|CE#2(XZ!BK_&A2IKLzyp81>*h59pR`_qF@cg-B=&cL|K3Pn5R?4IFLQW=L?>%S1JL z2|ZTvmFIs(KODl*l4S*OW%w9a;A{V_l$BE<34)k^)%L8sPwSRn%Esth{hEzU3LT9Z zrYWX{y{f4I#K&)!gA4eEI_88=1i7EX4*rn6R39&M4gm3UX}?s zJ+`_jOzg{-y^_CNDqq|qKLTB1LXvmqRQIhU%#k_LQn{F68wBn(G^@Z$b@3&sMz>M2~ zYiKsgD&Q$n?g@amNMbqz({He-AfkOxDL}h!2tLO39H+EKjPuR=xV$fPaFs5JjG-OlTIs=*jdvp zG8lVf$3FwR+jkG07~9$2cUa!;tJaU0nAZ)jwsImx2#Oe8J(fTLvsj9bumto8LKEDZ z0Hk0Qg)CE%zzS#({}lY`7M&&?L`Gu$UHb+9gc88)g8Q*Jb*5&4N80Rp zK+^G>zzHgKt(W>WQVNjRaMVj$)7JfFRRlz>Yai6Qsqd<`5owoy@9Vxm7x00F}}{phQr+P->OURK{1Y*0+Az=5%tMx8z_luvlZ7H#juK;t4-xM%M5f2$GkU9 zIqumugOiwxkdX!nsw4otpr=~ojaI$ppx02FRFWZUG5VJjo{bM98yCJ)x&NeswMD^s zSbz5p7QAmkZ%1$M`P3aG9V9Yi?}#faQba~)1DRx=Y1OAVtxs1FgIE83s+F8Gok2n+yn8k*PV8dJm(D9O^B%4beud~NnY^JY@ z+itStOGWm|qI7UCX2(U>ZSuO*e2i!+6G>Ap$JlosXN#3!$+y<39u|Qm@8w%3Yc(HG zY5AyrDbhXnp$~&AoAC1?{#>9c$@(Mn312VpRdO-kI#~^TNF{Vf;-?S_U=*#KD8)FM zzSLLj2$NqOErJGv^=rUEcE&|d8iXOr0J(XLty-B#eu8AYQ$$m0-Xxz`^WMIiJNTB6 z^t>$c21=&8AHHI`%`fqD$*Ttxi8wnM7ko(WfoMwB=a4nN1{~{-ejB_S@$oKQY%nVX z;cB{A_=o!O5X3_eo#pH`c$RO{7Nu7PvF;)VfG}rtMJD${UCRAm! zzQG8p$WDWtLQq0xhj3hx3CA6exYU5*)0I}> zQ&K&f@j7vLpbsE;Xfetd^tcIPyIwj;kO?{EJQ@rSd#@9@k}xH_o~s1=hcjj%-)iRy z@SD<~@fS{>dL*+Q0I%TqsfapcbRNsiT|)yHEh7G4K$$2o0MXgNyM9S}CF)D6WY&O{ zd^MgONdTEz{y-0ilLsvSd`kHweRus8s4k!ElS}rIN!D_~j^p_(Uclm0ESx7rGcA~w z>?zcTz<;{?EcF`L4QvP`GnK{P*q8LU?GP_D}fs_IGR^xc%Vl zPskI=F%Ymyh2ju8elUHPLtX#vWy&PFjP8|+U@}!EjKWkoQ`zoG7~c{`pdk{m*cGd2LL?w#plWc>e6)4#cWdk9KM&m2k^Z(YeCHS*z*UeQMGz8%V?Nph zO+pv7pZ$AF;iHH=Q9zz3py-qteDKJ1T&d#%_0REWC6Z#0t*a4 zdRRz6Rz}EFP(fqiZnSXKH?=VP(Scj|vA+dq1-$^m*Mi%#5q;ka_CU!Lh@Z>O=CHFl z>}(M`OCsh&bp`9s1v;mUA5?qYFU9=xBfC}56bbDEdEXcR?>D90<(VTH)C&97w_TsZ zL`HP$5WE~lC?N7;z}Z9;>yh-kgnHiG^KwE*2BRCNV>+Vn+MRi4NSk$$W)ZGgfCz1Gafgf&W4%+Q za97ZogVGTj|5@pg!c|jm!qocE^hqG;=@I8loNBdh=CDakLyrUC5zGcZjfDzJSF42z zGHRtK2+jf}WVNW9_Yi$*A(_MTM!C21{;q7Oxx!DYK?ik!6Nh`S6P!=L>(gbi>M-TovHDE+$h}k$ z7MawcIb<5>RK0H$KcH6imKP6v_gvLaXZ%&GxIkzeEK{OAs2fBU*eK))LlXD(2Z+*2 zXju$kAqsxzAp(FL9gUw2t>~`V0R6bs^D*AG9`g&T zp3BBoR~KVX#*W9xB(kB8Uo86OYP`AGID!3khH zt+egZ9Ek^Yi7?V8Vxd=~O#6d5xScS0t%NfM!Q7R*P-0n)e-Q1_kNunxgE7G|Wcsnv zmxHYsh$0?zc9V1?Qz9t?K|dxF22DZ#5&}<|03I+4@K5232mB%d{*U-!#OXp zGmd_M!{wGG_=*=;gp@J(K8~21_y%EWiMqv_SQ?e^m#Ty{M^{up<;qz4l|Ql&hZoP` z?gMGFryT{lO{*xYllI7E_j4gaZ5Li(hi}70s&4*Nb&m|b@iSPbv_bMv%jUvZN)|m5 zSbk*-wKgb?=EviAhk=trm&AVh}bi0?`?sYq{9$noLw}AU->W2UtVHvbxj~uH& z;1`yyW7*DH{uB^mOy^OrQIaj6rV{dx6%Uvv zT_nvXXblN)G9GI+w0`w@P3w3m#48fRcnfl#?mq3kA8Fp}T@5sEIB&#!H_RAc0k)R% z5T|sKz@6GJ&lKc=ll`ZsRJ4tT8hQo3i2L+kH5^`jdm*n|@ned6ac{-m&>lE=KCShY=+#vF_ zL>@kQ`XO>A@vOL9_$bwKdo>$_#%hGS} zGO`qXW?)&m%6sq0k|!f)nQtE7bIF-7e3HEVs9(M-l`LKIct2UX>e*CT+Ly8vI;y`c zbuUZJ+Co_>Tm@NrQtt#xkteyXx!?FkymBr{yFm1f-e)C>2ydI;Azygw&F`Rsg{wO4 zdOPi!yGif4qF39hu&y9&(n2D%j&HEyL$b!|#CpLe7iI2WJBjon#cas!4K>81rS1L$ zYl1p*-KW`4y?py&)UK>yT{jvLM(wOi7`H8VQ5x!uaqB|{EXFs+%^vw2zuR@nBE$r8 zm=X?pA_nZaO5NX~)cwU!*v?}{-Iw^({ol767QI9DP{v@)PgljLdw+??y%LA?ZSd56 zk?EYL@g?5%UGc>QWL&qN?!LHGF$C;~!j{}XkgS0J&@YcGyqI>Q|F+G81#KpZ0*234 zh{o`n3HO7=agc=JB3LSHz)-MC9?-cJ32qD}ZGCiQ$S%i#X4!%?vj8yc49$+mz`h7+ z4Nl5M9!kn}8FS&{sENM)M#I?>z*JG6{_u|dFW_~1UxFY#m%OEpolduGap%aLI_z!S zK{+oB-<8g?#bM)A)m=OcmwA)q@%l61E9R1;a#T1?8~|IqL5tSh9^BW>7PE|B5)35c3S6!1L8qxsMH zZfDfp={K!a@I=mEAc|cHdy=bax6sNEPogX~RZl>ysrm#Qi<3N}U5gWOI9eAM4jU5? zhY)3i_=6}5Pbs+bekfxHXjE>*(^>V(_qnmhH0-(O)BhK+B|k zaBlj}+Nqb)VH73RA|Tpg77;$G#+am|`a~Yx6P%Cx>P-4r>$K8lG%4CWhY7*@n}?g zha#CMZfV3Y8hDJ65HK1dA;u1v8z0P`Vxy=y4Y5p4GzhPHsCeFwfi+S<)S(}W8>|9Mm-aZ z`j^}G#HeX3f|VBNY%OaCWl3S7tfsQO2X&JMTo+4?bPy*$rmb+#{qBq(h?TZwBm?dv zq!G?JmniN#H(gHcpIXAW-z1zuiG_&*wBg487#w#$Y4W>|QI5rW`2WnW`uD#~2|u$X zjZy5h%YXkLa$1r~Q`X8m)epoFE#M(N!D(+kN^E0v)bl4d^KfCaa2wd{e$8eH{=$^p zPIZ33R5DrJHj&)e;*ikO(NBamRa2hmVH)S`Asi<`oEFgdAjTbR=5`5tUYhbNI9Mb9e2iN`q2eKQT)|3-r++Cx z(x5Q`MW5|H{yNMaGUll5devBGD+O@G9>D<4TKNRiF2b{xX z&d57&CDa@)HvNS-HHe^jL4dF*o)1L|XI?=Ihen2u<21CGrN$t7+ zPXU(s9H~EG&H6w*St{r-j+DQ|Z@dzIo`f|tx=Ih7#m}=xuAC=Mp`u&WnVy5%UjYhR ziULgc4pD&CZzVc`Vxl$`t%^D6e@*zaQiJ5Eo_pOTe+6S+m8}21!AX$`^d$b>s`z)Q z;$H;=P9!4?;9q4R4NOhl!eSEkUC`$cjM4IklnO;rC>6?QQ(;If+M9hid09=`0 zk%=43{HVxq(BU!BgtY=sNz|x>Qj;c4wlZmUTGFuLwMZCa8PU@0ZD+x8G``I&a@~nH z%AJda@4^WHWPq(KB@_S%2?C)o<)M?!R+b{ZlHD!ixs~N6NUdyTk(;Q{*GTB>2zc5$ z!x@e>r3Ph!D?yS>P3x{Vr-AS7jCpgZ&?ItXBz_e+M~iuXA58=p>;s7+=PVHv=t&81 zP#b?kAcbmmD_Zdr!8=Hzh+x_yN(9MYJ@>Mg;AO(cb$bu6C}veKrWF2*-7K`mcZkFq zS=eziscesZy9Ge|Ctpx#8VpxpSHzh`rfAq+b)pr!S@;994Y|BFBNvYyDJuFcgW&3YS5*x0#W;^fWpn#CCdt+8n*&6 z{xR*Uq@;U&>7Bl`I0E=hCT1Q|mfy+T{N^#WI$}og^^@wDnM7RhIV_F;2CfGB^x6p7 znK{{TH5@f?I~n~va`i`ug(xtL4G+uC~Si`lhB3(UNgmrkYG9qfi+)xelLNE$FLY( zX?jlZA!j~Wr;M@00=Ijm+Ddh)Vtv`JWoR!%2emC*P1{8jfLu^d^PIym?7-pfj8zVe zc8jn-0=zMHFA<)zGagpo#W+yJaUZIka2I3PwC%P`Rf+3lIQ-{wyI)p+7A?p+Dsb5KH;n1SJ+M5;e+mu3)S{ASiHd&%6Q)T(GER zJoP3{ku+z->M#xzUlV|WF|B=A)UBFg$EJor@Rn<_DFvw>*l zl9xCdA5THV25ZqE2m5T_*VtlM6#(4CRriycBB7J?FbR1G0FQFriISdI`n*0~)Z?_l zSj$g!g#xN?@Je{*7fbnk7<169S8nxtrrZIEow!P1=%NZaVxEf%=!6w4XHsZ91=)S@ z86~lqT;LU~e-Ue^85axIe*&<{bF2X!`xAajby{ruh5WSlZC(Mlm#kguB zj0--((NFs#qcEY{oX)y5_PDX2ek(CoxIWlOHNZR08at5)=dBOtbtmom?Vjum$F_xa z!8usn0Q^u~pp^Ch8LiZGqO|qcN+JQd>=KU=AQTMw7nYXjB3U)@%CUt0}17% zEyKP&Z%CtqHhZEjqx`#w8M}^zV-!{%kI6t4_iUfdWjCi$Y&}U1BxQ zIxB$H>dkU!4;MFmBX-_7fY`B|I>k}Sh2q}DJBT04juAg>?{8M&+tuA{&$+}GbKAhi z^i>`w(IgZl%p87Yx`&FKc}A_;!BKLx(mUn_!pH>i2-T!ITC(RE99tt@E&Md-+{UcV zGlUKtEqoMg+@xL-G`w_buv7A#h;zDku6<-wo8{C86k`h#aoP=$h#k+t`aiNX>Tcw1 z9J~y-QT&a(*Zc7|#v)j*wqwSxRiA`W*{8|xD&7_)ktVPKRm#q5S**s*4E34>nn7V| zDgZ+*n@?rZ(*1=Dv9EjPyAera0z`4BM}ZFkYxTRJK=Kj(-GDMcD8Zq0Fgz&l=f;rp zh*(tnzPK??+Of09h%{p_%>Y1#?Pz^`q6|pb{A!F;Z#_K_eaRv}Fwi8-&QTS9ha9%bDnJZL%|T zh-Q=NkeLW)qu|w%D*T20bJ!MPLETw8j@0ZOa&Ha^Mwz%A{j1K2h0M^smtfT|7ACMs z?6m=V@%K2=i~b)14pmRVfk7vK6&G%r`XO!j;6VI%Y^Jg^#?K;pg_>M!p$?VE2-YV2 z?c^md|Fg)RATR?SrJsDrCiIxSU|%${H)&+!kRZK8ju%`6+LCaM&_oihXW#-L;<`lR z+9CUkVKS%NBZQ~*Q@d~?aE%(AjIU-8B^)q(eCGft=MfWdcou|7m!a{M=}{uf~Pwx2XI}<642OF0oQC#>%u<;or!g;TR^VWv@)`oHRPZ$S|g-5MD!x?r` zapAV$oEBv8xG;k8WTtyKZX6JP`35hLNwTGEYw_`sxEN`oOYyuWcFchRHNmvmah`y0g^;{831 zBF6i()CdqGzhv7GY`mGd_IPFoN#iZ7!kHKsitB+o6gt3h91vu>9oPfnwWVC^;L;Z3 za84-Ld>xb;&Ntwg9A`7#j$=^#zyB=1Hy{eSd0#39JMH8d5Ph^mOnYkvf(-}B&$Q2P zBERc(14=7n??iBpblI6JP=j`4NoYfDs^>{hOZ%T?u+nnsN2{JTD?TV(GvhKV1``Ha z8^UXaxCy&Ee2i2*hER%-dVWs5@^ik)$bPnuGP0YnsQM$7_L|bR8ow71V%TnRoAA3; z|E?ewQtY-is+(^lW@uEm{$6Qg{6ERYh+jC!@xFMfoz({C9d=AFb zq`%-#Sm?i`_1@{Eb#d&2cscgiyF2$*rcdTJpy&iUh4JbSq1)*7zf$Z}K|`i$HTqQA zt}2aI@&tT5C&rf{F`KF+WNkO=_< z_QB3bQ{Q|sy3eW;J_F?1?f6hB&HrK)r%mp?QX@@n^}IxXRE$neh;)DHdmooG1$e^Q zml&j3b|p@<-zb8py;BGqJz3HTR(LB>0pHa9a-Ev)!$kb`9y0=GZOq_|2xx0N6Iw`F zB@-rwy(dz}#JGeQ(04fz`;e3jeQ1^q@Ll=dJ!xF|M6* z9#b2EaT(hbXdQK#QSqpEivyc@VnrN=**$Ftd+5G8SRU#3LhszyBOylL{LG|KmztcB z9jkTQM5<$pRp1}N#U&(@Bjbum2*Z1Xo4W`itEim_E4v#WR2)R727#<><^h)~TI-e7 zIx?jV3P$)PmV?WR*iK>!;TkN%S5pXD8d^+y1Zx#qj2e<5fd zEaYdnI*fA4njh1Q(3LUFbkV)3liOu9XRxY-Ist9l+GJ?aV6LU+X&9!O2E<`WI9w>t zYR>UW_@}muJp8J-VQ^_3eKB+BTxon7b&rX(V06bdEoec;eMXcML9m906*ZC;6Ik?; zy9C?%x&b&m8}YlA@8F#X#p_m(5jxz#0Wy!Bab=~bZLOLi4jDz)B~-JD#$o_3S|Zji zE7i5a&6a#rxO>e};?Rbgd)C-#2eD4WP$u4m)1sZUm#_6?J)R-q2a(dJ|7UxTOj4-khiEju4m$jZmAhm4!1`nx*;-3?3I zDn`KU&xo5r_Z@Ujw`^{i1lhrz3{+vTWhEBvX-w=TRS*+jH4}X71L%3et+)$-b09w8 z`Y8vqnWVYg2e~~R{ixeU_l)uX1$;t84o=2pK!1%es#h@twAk5QTxFfC7fpJfWpZu(^yK5Wi$?IO1YlZrrf?0y=@z2RRN5% zv@&3L|1@E!&U+O@=>gtFnAuQTF_6YiD0=zA`==wkA0#({aG0HoUn+hEe;SVB#Q+r7N5j$uD@hs=b)bj6RrMXhY2~}mLjQ50w z@*uW~Uy~-T?09;zqlU203R{p6__~uqmvAe2!yRBR9AmqlX8@U@lb*D|*h7>N6cooG z{Ns#dt}mVMOBeXkMJA0pn1^l)zq1W~Lu|BF9?ep<@PVB`0h{o#(AF-E0_fOWf>CT^ zj$*l=Et)iNJNX%Z1auH;G3j()I@6cVHfb<~bQSv+pGjv4-qi0re|A&0LSqw`X=jGFOTt($S zi*Kkn-ACV2a+KopFA-oc43Q`7I-f9K3;4v+8$2*CPxelGKx(Ajh&EF3!d=E!`urT3 z@%>f4_u})r`|N%PhA;T^M!4$YqFoem(q6mloIzO6IU*aUT)#gd&>^Q>Z{d#KpXzMY z$6&uE&i|!%)^Dz?I~-_>@Wf;cvO3}!Fjnp#cd;4wD0%n<1fz;NHCYc^^VULQz*F$1 z=iS63IS_F>TS-K+t)@q)6pR`-{6VB*ErWDd}eHF_>h6Z96clb_H!*j6IqKJM|S>pT^zK*FZG>Vm3 zI9}C%8uHuRzpbvBWo(|F0B|K?UjE8-&+H^p6S4Uw(sr2;k(pJ{SY4i|E^lLOUL2ss zpD=_M*99a_J^9x5y zs|*Td4U&9p{GUbD&WikC*hICQUIi0k# zO1*nSf}6Zj{k9FYkvU=m_!u~&zRDpEk0^h5S7YpV0PM%%9XrJXNuY|27Bg!Iu~pg5x?>9A^`=0#A`67_A_2z;uNiWu(~i35|6XZ-)&^hF zFp}jhtdUb7J$7FFqQ^>NckI*=yeLMt>>(@i8AomG7qQBK8EHB%`b)gz!KzBg#;zI_W&AA|PsMr1yHQy(e; zQPgtAR*!((+gBm(yhMqB43(zn19T_RZ=SL z`qI6=^iGooBNPcd^=f@8xYUy0&1$v-&QFQ_)~ll6Rew zX*HwCw0jO0WSJE0r_vUAMMmEHd)Xa*t2~-R1%N?L8(0G+dxkv%Hd?lu$fmXKEs1`vlEC?gVl&Og@xLSfjT$A4T5=9XM)j5wb!DC7}`}Dk~ zf$W{6daT<*#unPCgwJ-|^CpLO!BM9;)1(u#g0w=fM3F(hB8FQSt|tx7);@(oiXlLJl(TOR%;Cs#DJ1D`2R`Ot3=BypV7by-Z)`J zy14ca*dFyb8ikNcbOixaHinU0nLIJU#wUFKTt4eoP!O>$BjeBa6U~Okjz%d+ndyEy zEg|wfHw(em#7~E;yV?H~z3-DBX$`*>Mlii6tw90s3Azo`x_jwASdDw94IT0lv{b6U z;@2PF|KF`YL@#&}Vs5I|7axNP-=Z%bF{Jf^{CYY0p7lkIS0wA&TX7taJ@Qw0P$MXP z(H)F#1zX~DZ76fOOapE)G}sc+0Nj&d#xW@jewe9v0DbXjE}4k#c#^(2T|^~g)XY8V zi=SSo^aXSSSN4Nbb3A>KP57WgWHI}biiM~zJ~sN|brFkq=-9J=)Y(eo$-Mkg&xyYH z`@LFU?DxC=`r@H=1L}(f^4ilES1dK!U{CsD$TE}TJL`+?rxQh#bYNw{f21$|bdg_Q z47-H-Li>W?xNp`Ow_>rh8kADkdOG8LT&Cpd42(!I)UrBA#Bd%o7EdhITxmu=DisO1yNLFpB9eY3~O7a6jnh-5{PMY@P6 z09Y3(ny@apUXhWb=7|4sfION*G!@GKK*IPR<@69Gu!d@V{s;E0VAIi)TFrO>t$tGT z;Q&hILhzlZR7yQ3q`E6FTbF0t3pSZ*b zA4Xrw18Ab`CAvM@00!g>hJbwWnBX533_#-Ry(WWLdYf-N&Z~qTYHT$ zL>QGlSEB0SWcyu}VDVMjVEgQlxs%^Ro+J8Sule|FZtFJPu6 zIe5YEjr{Ip%{-qfL*2y*;f5RKLg7i(hUed5(%_pZA1gwmBn?hp+Z!mpoEg4`hatp8E_96!+IIq^PB-rd zRf8)isZX#vOiO*;3MzvR{T`Jhzn2jZ)L^=M<8_Mh068m^s^QlPAaGxaHiMh^E^4w} ze^jlLDO+3wBOD6-z9yzZP%y z!8*fkOxf2W!_+d|vM^t6U^=y6UDYWQ``RMT8DE?07{bwa1ChWgt8cZ{w+5A5_ng(Y z(g#R$HAxL;7<4B1QGHT5$ZLMOAHT|!M=upc5b z|Cjc|Q)8%yDuRDhZyeN^bfzzzZPJj2GAc>f57t4Vm&W+LRrC+B z&ZYbcpDM3WS|Nrp2xlAEnz$h1p2D0UYST{z-((v1%n6FBzT>c0r5T3cDs?d{Vo@l& zP%(o!yuFP`a?&2ZU3-k1F86^`O4R2V6r=ySNcXoa?>=n0Ul}S>mSqW5W!5R$WqFVlpsxhbN>~=c=xci6Bf4oP>$ivG;tQsR zKEKS@$#NLhA6&sQ>72q}_A?rhl63l&GWLg_2C{e-s6lH zo1EW7Jv0IEOh<%3UznFCj^SrLp#o?FVrJGbBi=$!%bYofz~VF|=DasbU7i^}cCn$; z{$#v-thn=x4!W;AF4`(v^I}T*e;H(Zxbj%A_WKGL7$-p}l#<4$U`zF_nKv~-M^}I= z#X5;j!G0?Irgh?bbV=(P{hr!Y@Zr8GZV{{Z*B$Q=tAb3PRe3`DPvr`jq}(@1ZrCf2 zqFj?zH(-hQ{*oC6NOdZLoaZOyjK4&+>13TfKgCihuBD~={nd&aK_;cN;tUn;2@CG= zZ;7RbL#4%DThKd)u<_6rg!o=o$)9-VUym z$7bEnU=GbT3~Lmo)nI@13IS{|XncT~9UPGbtBs*R3lUMcBiJ~b?;%lIv@jd)zA5aS zf+X!oHJ&B;70P0W&GiXZbY{L-TL;R+28ex0MlsL|)>H1RT}ib*?jS;6W);2~YaFaf0rbtegFWTG@8 zhjL3xn&4;=Vr4iD>=93=#1{4j8;>Pp*><^0my#AA)>h;WLJA!e>= z_(DiNOEDqr$S_=y;PuB$ljzNOG1~BRxe5m~azC9;UI6G26ztjM86;|&O|IXDm2G8L z@JEYFyU#zSm#Czqm-*6dzI2x_-R(!sdL&_FoSe`;m|XB1npf$ufa9sUYDXEHwoaP7GBGiWIo7*NZkBP_ua0 z2lKhVnBfyRzPR}2#0x#e6~Be_H&V$=KhmXYr7J2lBrT`A3vcS{i(i5Q?oT!fV;-d* zpI1Tm-jb|)sezO9Z?Dq7F_OA&TZ`1bSUa8i2{0D$z24RaK5gYsT;W!K0*fVP%gTJS zWe7KT27AW+2I2aIJxW+YRa4^1sBSTWk>x#=jFfw&i%esy} zA?_gWV-XZJNFwe?9*2d{V_Bu2q$hZvLn7w7kKL^V0P@c>At4z>G_X>6OgtqkHcu(3 zpH8Ndnx~Z%bc!v;06>+JKZSGP0yGg-bt{Nih$tFmH{DHe?Rw;Zf`Rh6CscxRyiYeZ zzCJ0`rsy?8(W{NM#}?}uD*Xg=mgBwXo(hwwQHlCcEfe^o*b+GYF--{h$29xPKc-tH zrP2hJe|*10B|!!)f9P~8zu|W;pB@s_@-4>5ScdKc+ae<1)M^h+Vb~*i@gEJtnAN=0 zQ~o7A__0yf0#8aXTDydrqNrsq79`w+}o}Lk;*_MpF9CA2xux2J*nnDy7>T!y7+`kBTwKchaL~Y zEcFq7urn^Xkwdbqv*dwkOTOi?dq0%V!(dS*5;H&K@&zMD^JyAHf#X0Qz7(@&RM#NZ zpXm3Ot-9Zy>Y~PiN^=L0&!1Z#(?=d+{f15)k%z`>g<%vOeG7^{iiU|F{ z(>2m1Frd_qfusJdFa@61zXcD-zl^_~jK)*c6hRw)+8Oav6H|)PuNYLJ3PDQu5_Fu3 z1=arP0Vo@~It8+H7*rtpLk7elo*&8;_z@76C!&FTLMwF zFxsPRf^NB*7xLxVk8WQZq=ADC-Aa(v&ZwBA=4Rx`e4q}FhKG3q=#!vbfAC`-9td$L z2%`qnKOh&H~c@#2Nfch209ZsedIf$9)yplM64QL8z^Jluta&XW zTlLRK7PCUKsfl?SR?RH4V({_Mp>($x>jKF-qH+~NwWPWy6BYQBlPvXHStnGDD^G2X zA@xF?x)mfEd=XRszXgN;T_unw1CiS>m2i4JQJ$C{tIPC<5*GAHPzX;6l)kRSv|vlkiy*8q|k*p?CwAUExOnoc2`*=cfQC6 z$y>&}m*c89+>fMti&ehI(5f073Wijytnm;<+H8Hvba}j;AsSz1cT5hmsH%FFd8xHr z(K@In$``CS{+JXrgpsKL%U&XKXD?Hu#7dw6!%7f_rzSgQ3X)+4@r^N$?A|s{(E?=9 zzA?Pyg&OvGsve0T+G&SOfL3j*I?Oo5h*!9KVQ(if05{@X9M18w-eFXu7?Do#ic)Gb zRb$T@MW3u+jx&=n56I^f-GTvoP5dkRTxcVqIVd+(d(8hZ^1H8>L(7e#mP`0=vY+br zz!|1gKV`ZA#E=&Q}kFO6{XlqV80aag&t)l@jpQ!V7`s*0P}_tUHZ47M7R7lrz)5r5pe-k zSvG*Gybnv)m7kq4|F<%NxlJBgG2nK_%Po5t&f9`02u?v}s9ZhFFZ20V7nquWk9>du zIK2@{TpK!wg^2?tn=`j_rG!2PT>&E8WJb;d$cLuKGykvBm1edD8cN1)~d!}|DaPBL2^T96?o+|8~J{hs}pJHU&JVoGe`0$Lk z@lMP_nPhUJ)K68ZlCb%*YY*)O2OkX@-Xy7gh1015rS`(u`gQoL{AF7&~t`B24%QMdOm--!0}f; zj5tC$Ze>Au!LC%$kDgOhsbAxfpy&P_LeI&Uf}Ugh(^Ks6?PRd%HpFzUrUt@4u(c?pOfj%iz#iNO&i4GIFGC{ zOVy4O19^z(ni$sGZ0@;-cDusj-Kq3A#Mv;uV=W5;wqC;4>)wj>^=g0)r^&MYyIsUv zynrJFG0(8p*g-|-m->}@(YA#u9;^_7Rv=F!Gs%B2kt%$Sh`(G}$wKD76|ORW1o12XTkfu@KsoVtDa(5hSG zzm+B>V7|w4n0Kf=mU9l3IOH5z;|G3+LIWVO>2h{YF-81Ua29ueEP2`;!ZL{xlPEQbGLtAbi3*dbQHeb`&mOmN9t%H~AU8#)mQQa$r}y_j zuA%8T*oA(vQlr;nZG(NSu(ZlA67}J^RY04kj|Q6}@TT(Jd}))z8352GKQtEVRuDNI z?h6+IqtEy;n&4;A$4?QJ$@hagx-&5-Ghj0v6%BI#h6yp!5Gqrv8B9((m$I}yvf?sX zuzIOH5YLj;swd%_S*=PXKLKdssM`Kn=64yjXWwizFXC(wd$51VE~E0Zsd_uuX$O^C zgcj(QQC7OUz0811)jJ!xsCv&<$~n;G>%?@Zri(Eb{L6%D;-n7oZcGG_>93Nl}x-!-jjsqo7 zqJ?7_`2KFQ;HI34i*&lj9ZsT3HzShN5Lb-^ddZ@;{+wz(ItSe+jG^ zEu*79V527au6B2lC8dA#Ca6N7aJbJ=`AVJ&d2x0Ev5Qz-YaOT=|6mS+;@zREXgfka&~@sIY^m zSJ*uNsHODIQ~lQHF8$Wdi2i~O!pM3&jQ$S8ACDdbe|)k%OjcNxS@zkm5N6XQf_UOr zBN&NbP`@pgW9v2kAVawd3crJGwEVzOgJr%IYGri>Fb~IHNFS00L7612%W2YDrC!y8 z2Tmj^AE?b!zN3ZRka0!;CL3lJ zXf$zHG&-_9eLO{U451db6EG}lm3LMlf48Ud5G8x7-1p&4Rx2uU{=9;iL^(8uw zX0ZlEjbUXG9J>oGp6zZ=>)(vDaJv+xZD6Y$&z)@rc-L02L1wg2D|m-^733mi27MEP z4HHqAMNY;zb^dbv(=ZZmAZ5pcxg(+Dl_~KSpq*W6m>ZZ8^HPf0uwe5-_CwaB$$<*C zHe39#J7R#I2?7TIp!<9S0LP%YTC^~#<}rFAVufp}fPe4~2kn5( z!AMgCQk*npO}$}oba!8sXidI1a$-i%dQ~U%sCwg0eO#P3&nTM@qu0lmLy0G>wfR71 z0G3QR*SvO*R26BDAf;WfMJ=F-AHymK%;G+K7Pxw>k+T$j?qDpoZX4^M!LMQ1L&i12 zZ0dYnZ%r5?Qi-Dwv4E8GZKB%~uEM1=5;jrL2h65u#YEub7zqR$FUCxl2Ip)i!<)5@ zXcX)NdN8DN=y?f>2CB;F8mU$c*0hwsr*W76Tq*f<7`u`FoUQCE2vq}5uomeKBCZt) zgWJRhIhG_W^5=oc8EK!d1Oxz%PwI1DP`$F~sQGegh ze5eoB%YHJ7)pV~|V(B0>-~d=T)dOVDSh?#0)e5mvm0>UvkBh`8DkYQ7zzhZKZk17= zVuiR1j;D>HHwq3I-1C7UGwOnj`{>UonPgjE)#gzM%2{hN6NH;kl}GJ2S!+L3dFvjl z9KF8hEy^<4Dyc0GTLk!6KfuRxz%n4}o6g3X&>Q(#Gb$=guGRh984&UuOv5JR+nE&7 z57B+5;q!X#=` zLJfyZnw)FWEhcTY>Uu+^)JZe3-PF4S4VC8KV3e6z0?LpvbAxzF{b6tgd+EvAuS^N0 z_VjJp`82jgELr3s20se;gV^E7l>7&M)QShc;RzS zlKc~=K9o%{k@GkAqM5AQR!-Fgl9!1_)lY~_g{U;W^|VE;9#Crupqrr7#oWs30lfvI zIi!~MK(F3OMg;gd>=kTx%K)+U*27SRX>FS`#5 zMtfO@a+4Om#!4**hlE-&DomM3sDx>`?=00VE|QU^mkS!#LbO9EdB@ZjZcIY-(h+q=s4U{*3fjb z9NP!vQg&Ehf|2{M9#+j%-K;ty+hEKl86FQ2Aq!zoOx~uXeaf4#KUrUq6m(?21CINw zB>{9hR*ZdTr~wGbbhp*8AtlP@8U=N!n8#8I0Cs_Re1-Ij$)a%8f9yromzQ9O$)0F* zTujNt>OsPZzFS;o+suPv6;p851_N2)2QDkGA;*z>`NuSyHEH_dCY|d`=ljwHzI2f< zZTZqAzI3Tc14!nfHsE(|!{IlMvRP*Y?+F(Xm@UsIL#*FNtsX4~bijF5CbK7>uqg!- z$0G2tYSi(Xn_=jc_~M;~0Y~)&4ung?PD!7fu1Uo5g&n!(D!1=9ya$_^(xjS*F7lVBPj7B zMF%C|=eXhMs`v%aKZ7igJLyl(iv_exhgG^UE&f z$P+7P@f^K{yScCfOl*jRo;kFDtU*UGBgex4|MJ{ZSB+ioTcRJIrwA$dU8Z5v&IX2?SQd{NOFA8+5uLzYqF8G;bAMrr; zdAPCh5&GJvHvB!iycyA>NAa%cWa!2w^C zlSp}8B$VPovKr11EVT%b-4*A@Co%UOmHP^cl7JNs=;L7O4x^n z?K9!I(G=QhDK{pS6YLI#4##?NuUaJ5DM!IF7fBVd8`3j0KAlrWpWi4>7FpYd7FAXortN9A$_MHl!k1MP_s~V+B;-)%Yx)Y9l z63JT`!G5~FSFQFw+;p}B*EQ`7JL9s$g`dp0hTSX^gYO~Ry-pYpx|R5|n}l*OsAUL- zRR0vGcc{h;z6Eg_*J?@$xfl0=McvVZf1tAbQ6Pvm$ zU#}!5Qe_-tQFmfFHI$9g^g2RCIh9J+!TWIA?j`hLsM{;3NO_mYPAr&+kEcH|bpq7r z3r3B4PG~}(N_^}#(k;5Jh{maa!Gr>e0h(`8=xkAxTp-xS(r8@j($D$F(5wLK5{f#o zu$7Et+1Kab?lUqHB?PkKxu>zAp}yC(3(Da&291Mz7E>j|_S1Ru>T;hr3GknZo_L^3 zA_e{@$PCHn?>lMb_i__I$7>;lSbzXFCUy&O_6lLNGd??zilBv1Lg6hxRRze#q|QeD$v?f75!*{H zik=0C=otu>fnX?;6}cF+fLlS#bY^#7I$B{WyXV>D4~xx*_|-JNPDalWN1{GNc@mPj z^B7$?KAfEQ%-!NPuzpd4XguA$+^gr06uiHU19kI}O3>4p6k4E+`zmGJT>!?x&{jSj z{e*GvxNqTP^}0;GE|tfU59*ITy-b#2PQdvS?&(ZZ@qbVf`OX$f#_Sls{DvRgHRXma7ck(UDpX9Dvl=aKX z84Gn$xUTY7mK{}mU@K0WC!FTfh15n)v_-0co;v*_|l0W_r3fON_W z^kGnZ=l{ptm%v9+W$P!9h6uFPD$$6b4Mq*)mMCa4f;Jkpf(-^ijmSvcBu- z(gE6{1Qit(HO`ER$|y4`;>c(s42z72=qR`#j$5^16mesDn*aBmd#k&;(;&V#^ZqZt zA9O8uIr};H+@(136b*#-B7yVx09q;k6Z`>15g>6&;k4l&$gm)YWZFTAcC9G_QA}Ek zKP6*W^`S;}D!6s00{j^T_=^hg)PRTMaL7-Pz&K-8E70LLbiTBZxu`982kNQLgcz1@ z%HAZR#U^3*ahQQ33;0{b%9XP4MIi>S;T%^;tD>4}!y0A|LxHfXt)JFpYl{ zYKbZkYpW1XTc|0^9K5D86yjNng`)V{@k%tLHUFfITwqtCM=H_LQtbZeRN3O&J{80zZw~jNks&i;LB*)MFS`i zeEu=K*~H%j3Nsog;#Nc?-K`CT72vb9*^x6T*=Yg$sO1y1IiyFXig5TWuj<&8(7+*#IuHyAd+Ow~#E5;usMdY5!h8lqK~ zxq*Xx0S+f7c>;%lC#uS{Wli7L-{=h*@WDF*6q~&kKUSV!N-iXJP3!892aJMfOt#Y` zgM<@?s34(%1C|IuL7Y&5IH3}80^QvhDBi<5nnH94iZf7vN|Hq=pXD^Byd^)t9*{*2 zuEhBt&-D2f>@S#_j2l`GQ|wUsL&5!kzkOMqq$no`| zy7~CARP0LzKn^FumZk)hY4RAPmu%b|Br9N|`5){PlDjR&G__X`s2hv+iR_3NQnRA5HM9XO8if!Np z?2@P%jm`3OL?_Te(Ay;eI`4`Asn~QRz>SC}(+Gek9xSk*FP#9XM0M&q6xdS=d1<%n zI;n3U83^r*dW`_sIYW}dmRidB@D8!)`NhzrrErVTr2iHDdH#+x{Rx4XRHIb*Ix^x* zP&L7bkW@*fGl}Ik1`c^x^mF=isDkO2=#Se`DhM5+rW;9vI#uGF^KN&=$89r}61zid z_xcmQ{XeKbF0iTCbR+;5aHbI;O@GdvolbyMqB;XQ6xdS=d1<%nI;n4z{%qMlsXt2C zQcF1x%@X}tfAlW&XZ&&SJqTmQA&7_X!GFH@_d5*U9Akt__w&Ruh_U&)aasOS=T@}V zw%B!QY5LemnNIO%aA!r0+m5Qm+QM+b0Gzf)>$p-3e|H%EUa$j&9z5X0=>+MXoK3e8 zd=$8{ghP!U1&u9l(N%HwVF1>b_Hg#b(Lf2td8>YU6i~+Oxo5mD@!x;O-*#0_;Qy4r zt-Uj$SpWO}_Hf%(m&}oe*JnUtQq17)?Zv#L8T`NOZx5T9PJlFfk<+0-s_yQZLf$vK zu9Nyk*^5mVCG7=1&eb6vbgr|+Ud->m3wvQq`_JglirN47{O$1yrvE?w_OqBPKCTN( z<)_zY{4)I+Gb>>h{{8yn0{cJrx1Y{PCqSD1EbCBUPbuW3-LC7TzES$qd|^_5GWy$N z1t_Qb@LlLn27mka9@^i2(|s5IwijCa#r}4527jA%fcCfRMI_W3H`J|FUd#YgLD_>pg4%U@gnCi3kw)xir~ zbFV%uk=MVFdB;Az@WTWvGfUyp7GwHxY%aFE7~^r-uFLf>$TCIHEdO{tLtV->Gr|1h z^SSC$uA4pA^F7xKJ=e_Z@sD*|1ReGSJ0eoUG^PXEWpx^ zKNLjJL^yUC(~uJw(78)q5=+oNJV$4GVE>Cy7#$+vP&NapEa$pcRB{z78j%J>M&L@W z1tOujRBQT+yl|7PIKJ(+-|+#eS98m;BW)phgV|rwKqp?1OmL3C))WS9S0XozvQiC6aM~u97=(J~#nFUD15@L;opE_IR2a4k=lNnoS zEW#QhK*BE=zZ+k`O!WPIq1h*>!FR{;x1^Xeo}V*A5OR-i&WD`3=Mc4i)QOW-GanLa z%A6A>wy3-qieTh%?~zIhgOml>r`vO-vR=~lCus`bsU3qwM(#o{l2u+crJ9TQnFN^-7qWB{jie&oD0l|;h2!4Tjc zhcsCu&*Zr+2x4ppEfZGGW8biAlQSo>Ug#1e(qQ7&5^|WhmHdT?Q@_4=8Tr|g7=Ob7MqsA>9HEwZc4%f|Q zoORyuE!&XO-dXqWocr|5I@4l`0auA+=w`0m>V)zVsV!M#&Z}O^+SFem?Cg%o<>FQR z{x%n`aH$A%4#`=)_X4wlVrZerj-b2UnBD{Jm17k{|JTi!Ivxvex8N<8GRZ>`x8$l3 zv+wIP;+s$;oc&Ij)#o4p7`B@!qo*@Je~m!DnD^G;pT6PCxk23EobM*JabfU`ua5=! z7V{~kfKcXQ=`@yFpl;a=Ou#zzYm^Q^BWNv=4xV`~i-TGb^3+lbX<>|sN;#I}s70p@ zc(WdwH{9-#Ro;I?IZmvz|4TG6?~5Q^NZxz+A$ins-E>4GO4z!0A&P~Wcn{n6E@l-Q z4rEB|+b}-`nBaADSn--GLnsciFbXgh$>PAW8JEG06fQ|~BV(Cz0cZ+Zd~4X4UL`=e z3uInei(7>ST__naEcR-7|2N9pS0%nJ(ih*jnJ1JVmc1ctJxb<>p_|p^rGGP~8*H$2 zn=!o$ANO~{{lD@o_6hg>DxCefNvE}u^aI3I@}+b&J3uEjRis$Y^I^gOCvYgq#4+4xK<2{#h1^XGEGMmi z1^FU0u<-IbPkjXtF+&mW;pbM8_c+26KX6jMV-Jx?D2N~WId^l5YOn1n9{JIWQyRu3 z8nN=&8^)q%^|uaPb}RPBzZHP}2VZaw`pGl+^TT>L%i1%|)=fDuz@2hUE2onpg$pR? z0E*5{#W=VMn0;|nmuZBmyHcWW6t{%2rg&yl4b_#>GVu#TiLAm6j=rZ&w*Gf z7hq>O|Jo~wRy@epw!eSp4l7trkYHb7FW>fYzP&~Iwf!$1mva24Ytj*GI9c9WC79uK zemW5T=%(!+e}v>4B9o)A{Q&(@qCZbcnt31a)T^1 zlC@b-_STO(8PE5|Y*gLCPVKG6q7$;$@Jm6xuPFVx_S7M#Rh)O!&szCOxL&ycz6c%0G2Z2W)~Wb6 z6iAmpfnh6GkOWpe_d?MR%cty&pn+NwPv#wz1r0yF`RI|`?SvSjh@iw8xj;Cul(ztY;PTeleiM;QfBLaJO`q?$l&Y4pe$H6r+wY4} zS%b32bD9Y9a^H9HQCZo}T_48Von{yX=j!D!;I{9rw+fW=q3AAP ztGEaNF}cX+g%g?d0d$lMp@HYwOI!goWjl*c9Dy&09D5hG^4Puc@lp6J%sWn&M!9H! zk<^r1RdsNJ_3XTs-yfG{^}aQh&pi`px5(Szgr_b4>zh?Hb1BVT%vZ4&&77})FaG#{ z#h;k3t=~v2t9^tevD)SkDe2#chbVb~Dw!)K{co_O{}$cmd$h$d-!hh5;X4pN3t4xC zZ-0Gh`6_gyvsl#jjaXj68ejC4whtXe6Y1|MKY2d>#Qb0KUCj3tek|WUy7~#yQ{Jn5 zw?f`sE%fzm#uHvzzR%he_!2(bzAHCMPc5ur`BsgTo?exoyw&`P`IqrsEbnjlvHXv* zI%28Y$*!2MneX)XA)SL9<$QB3e?*GapN}Hnb@ddf*2{)b#-)JU>!p0N zud4d8TUF-i%lT#v9iQ$0R~Ii{$MVgsc;h_M6NWVchmef#W&U6pDW0N#rgcFOt6l2+ zjF+$q@1*+9X6#UEQ#F-{a*nMfEp;X=tzeD^6@oWkRq_hvieU$?@|{7YfD5-l-WKr+ zS|S7HBsY9NeR8yFi^_`#meM+H6Q8j$Jj~Y*Z$9Q2c^Krw!fq((tggX2t?tgU{ea*h zpn0k}O}96HVdHyffaNilda!zd_dL2dONSYRe9yD3i5{Y)LA2GDytJR2er|rvVm8SxoAOzg>e() zjT%hB&Lu`fcvIv&ai0>>5{4lm4l}@amHK5Oty!AT3x*-LdKH@OyH`w2DvA2Omw`n4 ze%V28uee%BG)Xd&!_CYadQRfV^SaCCOrCB>7@_$;k4A<;Gs=bf;K`W zaU(({&_-{l6~aUWMG(e$=@CT>XnmNeHLhO-EfnS4a|qOCcZ!P%9j>4b+hU7SX_5DC z23ov&qE}pcpkrtBZ-o{k{h-B9DYPI}(&+JTwNGAse$=(ckcp}kRrr%AZz^u38#3S) zKgf&QUc_zERf5}%J%C$A`}7t`-?$kPHx8r*e<6S#{$lHwju*tJg1;Ag_$#(Z?5%KG z_$!>w=a8iaN*#21Jf;wX&|{?_Ia)%gfQq>1&8iVUQ4WEfCfWItXnHEjXRObF@&%d> z%H1%iaI9)UIocg48|m8LfuDOEF9Cn?uQ=NX8V%5dAizZM7fJ+(brrD2`867Ah&P88 zKj&W8h}x#&d)_-4@ZEHnm&Fn<-G8OvJEt4)J>+NceN6EiJlI43I>3W3q$Jh9KJ=tw zZa!aBrbz8h(Y{oa8sE-<(jygKl(42b%UOAapwzk-P#Tnm(*Ke^p1xq0`q(!EW{>|P z17?p6_G0EIW?x<|n0=nRD}DU;^5^NNcFCU$MRQX5^YL35uvjw9i$xx>C{$SVB^E!! zA040Xxx8U_e?q^~j7J_Kl)c3AaReU(~oS+`W@eZ|*O|)l>0x$RRKJR##SgCnsLc+@mxD zPYQyDk##9dw8OoVh!<`Xtxgr8{nus?AuDBgDnqynt3-rGb%qGNjMPdp6qc(rfAg-A zCjc@I4iE7Xyq+gs!nc)@@sdo7MI~3LS{{#BpCXS-wLCWb>|UNP-{E{>u>f7aoS#iSUV>5mQ0u*fL`6S*SbBz$eYH_?J~eQ=S~sqA>#A)9oL%$A6m=5vIUr zOylAZz*tQftEiuFo*wFvkszs zeOwwn2PahL;|;udi8FVDa(*Fl&!iwg#<+F{Lt6GOy}fQyhJiO;DCDd83FKRyI>b$*-%|wR7x>G%leDkI^7*oYU%MY4 zgNz6f$_fU~&#em-w}1{ZJ_yMWkJI;AZEe8ntu-C7x;$SYpfbfArCzKg&-3tT z!Ro#rfz?1)DAMqG;+NucqKglMO)na!)XS*$I637j6&;*1`z1ik&4A0j2V}tIz?48n z1_uAQKyX>}U%&;q=cE@(!>6Z`?-1p?gz}9@#3SFy{63)Pc-4qLKnm!1hD#$)xB{Dv zgT*cSQzckON7n*b)Pbg&pfjFdiHWqvp_oX7o69?6C01lE>d~#erSYRvvRjSkTa4#d z@o1$1y3~zFa^adicj9vp^&j3d?OH4|ORjLT2Xx|*EHNDT@^#y-&H)$E_BqYJ5$A6E z)`%HMH4S6;&p^3gkyi?Ya`#sX<>u@J<@jxl-TUuZN*?x@es#SQw1a#XlS# zVl5_x{I?D}8@$cQZhO};#%P8N7Q>RtkTpFsVDB2;>wu<5w% zKGR{@!3O<)?`&oR(kA*Kl zI64lY0&ETZ9S21WG2qBx91(^vgb2u#)}Nt>EC3hDptZ3zV8(jr3E3+;sdsq9c^fED z5RRa5sq?`PAGNnx9-U2*|M3&hKRO)8>3RN#=3(%1=|a&;FSB$*Jw9M*;=$-#-ju1u z6_o+Cz#^27b-~*G!0)n!Ml6$L{7gV{i2*>u5?QBbzFGntYnKM+nrw<~i<4)!hdYHuMlQe(mzmhe*O#qU9( zSb{<+{TtKnRQ3V9aPxV90gVAsbU#{kFT@(dl~ORn7G{CNR#{iv<#aVmmxE^Rj&@cI z$O%_YUU$d{%mh!%IFz7*0YkDAEl+q9%Rwq+&4`Ncc$-BEt6RqhsN)qN9S8(6AC*|| zgSlvI9p8%!4$vxGs@gjKCdO5=b^K3qfvw}VV1}*Z*J5)+a_jh#OA=dgYEP1F+N;!V zy%wwqsqF{Vxvw(0d!UHoS%N0f8(?U}avtYb=TnEc%BKjA`JT~8;=T6;o+n?(2G}?G zL^hB!a1+Sf4dne4WU?V=V)`!Y+RIWmknaNajpwJsPLrB|&AIlxbl6jI8{Xmlp5lgG zZ9EJexM3Ihj&$74xY)BRXDQyMZ;&?{Y5DLCFz+t%iRq<;3Z7l$yP(4Q^U|px%LNh~ ztUfoL3aL~wJG@V&QelVpdqyR%Xza2^$_uqGC$|GWDTSQ5qlk}E@f7{eupejM2DL8A zxpciUsn9MNe2jxNX_Wo1TVXJEwf|K<1(UL#K-r5TYNH(VXFp9wHg*MwG_%-h(YsS* zXQZ~kgqbQ`Iq{9!{oF^(^`n<=_?Pq6NaBF)FQ5NFg6c>+v+oKs z`yDkzM!2Y~FIK@hZ|`hxXK)%+rlx6C-Njcto)xG+gRLM9hc8J8d<2O2Cc&MFv!yXI zeg*5QVff^%I?04^iV5aOMYCA6G~ruWv~-R9V6{WrI-0jCn78f{3v*D`_7V!#s)Cm# z3O?>^JBPSA#b3jw@krx@F~&s-zl>=&V95haUJdPWHGNh!!2+r>n82YvT(v1fMr>HI z_eE)=(Z@P^VX3ibK<7~8r-;$`rZ7M+K*lkh{nwPo*2*EeZyWYgd};SA3fpEj7dBU5 z4dBGS!+6g1OuXV^!0tnECP%Gb*8Qmh6FxLcv84PmX;{s=mB-fc6h<6Do7fZbY8WJM z2xq?==9U!73%BhwLnwxoeq>BP91n)YUMuh4IxO~CdH-eQ?SC(C{jXEX8^6VYh0Dsb z-w&6rF>c$2;)Dy#>WLHnF2ka2GTV6xn>Fb3KnA|dUP*F9P*{#y=75kRXaq z8|p5`7zEp0X5%%MKJFcgv`22(+l;Nih7dEhJ^m2WA6DM)wvxkre$Ssh7+6gQ%7Sfanqo9P2kXYYIwT*z;w~A- z6|aC%=mx%@nq)+K;oew;^Gx_jX`?X*w@4@YH=UhjgtE>5AIx%4YOD83JdvufY2Wo8%gL^=XxT^hQCb>$(xL}bp_^py~3n*7LcUwv3}52=LRR#ePT{4@%7<#5p%%Xf-u zHT2(Z_0iKq;AlR^(bgxOO?)rExf511&(?;6f|oCmK(BEahZfI)QF2 zQh$y<1$mx6p5IL)I@f*yI_-KsbNtPq7i>0{VgR=gaYG*=fEK2h3SwbcKwJg*41P|6 zc)$lhg{+lHK&2Y!B8sSll?tfnqBeMt`XNx?T(jlRKQN*1mvfJ}i08E}ZmJp6}UAfpKa z4kZba?{wOrfEO+m(nTspxL@6KXGENG!aFK6yiz6QOct!~AMlst`hFFJVtxOmVe0a7 z-~M=+?L7B1*7vtysaawj_p$w`vW8x_@n; zW$&TW2}iv1L3`VJr}=XLdSR->q|sNt(DX~@EDllW1SL3>4d)5OrW8{(vIQ$f{mqkm z@sano@1pMBHO<7$-R8`86aomnrg3%X$AB;De+@Uez(Cpe}R*x zk>C9z`(jEYl$#)sm+>M6iql%2l_`>7J1N`{Y0vZpZ|1XM2pTf`YMKJMwUDzJMwV=Y zbaKD|-9~JN50Fxx#8~gf2o- zJq3TEgy3IIngpFO8g0lAyq320LLKp0I=W9-d1ytRq>N#fk$TD1>T^hL2893eycc0n zpQl2C@M9kX;e7?+G=2Z?tT#&69SXP0Zv<)38s`j+rE5FIq0l9I?ZTkej+{KBYX-zl z5d%U61PRpq>pxBr#Mb;1i0#5Zd*^wO>`cyM=0>xUr&^@ZLjuo~@qUUu=`deZcOGRM zSc5;fP;Qe~N(CtH)e!f5=MP^gJD@27aW5jN;IGp7u1DauuTM)y@;uecOCHYWKtQ5T zd-*PczUX8j&(j})JiSs3ej2`hWj_IJ(w}Z-Dq12DNn{CWfvcfedxd4p{!_&vBW_nfQ z#4vFdq6_Sio6VotX{hnjvr+@egtJg%9JtfSBVN%9OaR0|0)Q9RAlmpS<7@5#yAQ7g zkTxq>MlA*5l8#&CwNOWB;!*-Rc&r}j4q0*L5mFbyODHA(_aFI30=zs!7B>Y zLGP1>C*h4v`$}9iFqZL#AZ;iKc zY|aW@aY56{Pdyr}38E;luvy+UM3xCCLILU*jL00ZG#!iy7+3=tZh#DHIwP05gdf10 zwvAK(49F@Vz45W!9jEe8{Dult6lx@@%#7@})0GfG$FyG$QmG+%I!7Y<^U|M4uiAX* zSH039!k)c0(L26Hf(g1>B(dH$WBkE~OD6z?{_jBl6DhB7-&d#(m0^6!6$d!)g&Lst z_jNtZ7$)nsnK8_Y;rxQF^7-iHr}fKj`^17Z9+>ed2POz_5s zLH5EkW6`O>LH>F_e)|sUR_}AyPhGtHFz_0up5(TwftAps%3Kl3?FDLC{A_Firw*MY!lenBI zCE#@19yDWmuF^TqQ;mGAj$etK38_-U+{vBqLPIZtR6e~AqFO8)_Kijym%Gu8d$f0z5ZfmFU~JQL-s zaW5L=0*9VNaKTR?C~J{0zJf4?(ejODOP0TiKT0$KlXKIT?tQ<5OMtXRq$*C-e(%3cFd3FeGKTv$ku8e=7XI;? z)a75&H-WIeg>h4wF zRqD3Af}3vc&2zZ%hm1MP+n#iWNl}jqq{;t_q(p`_1>_X?7E6{vX`D9QvO`p_G_b@njGM}_1*FN%2Kob-Yt#D!-e{pob? z7DdsrC#yRkRp&sc+yiM4SMf&BlA|3ELa3Z7rbx^f(z@#uzZ8unw@R^M;|ECN+Bss1 ztLbfm18*6T-+eGX%2nvF7dy}Y0MTI#MRY(v>`$su5kw(DMyoCL*Shwci&Cs}5E;Bz zmt$HNqJe?GJs*qQOE=aJsXK!5vPZrftL5N_n(tM%7|4R0ZLQ{tSI~V{+oC;g$N$0W zRP?-!{K3GZ8P%DMm@mJ{Or?$)e!c_@3ftgcvK_sOH5q$&OW~Tm@sH+cp}GW6ZlvOD zcoQ-`0JelOog&ZUFNCg!D9i3zM=D8rvdi}Mo2N!UibseTvz&tKQg|eS0HK7QxgoA| zG5T$r|a;lV}+-g&H4CVGV{En{=ELXlt=2 zJp}lDH|E-t9+y2`_N15H2dm;o()ZcEkPFx6&!@xHTi|;7u>@Rgw|0Q*;pMx9>jkMn zxXdJ6&XPAE99JSp%FG|Vz87v|9LzJuAIQl0uK#^99}Sz0b!Ny%zd4XjWVvr7US>O= zKJ!((GduioyK~UJ$V`7f8Pa0=dJHAdpc1H=D?6qp%4w960$?~4^DTMf9Gs7`{81S< z;(`AeJXr4g@pn37t@=Y-_v5*=C8Vxzk&N}1Yk|$~*7rt1N64E8A0=-D3NlwBj3anz z&E3hx9`lTK5+k%F2KY{=jqi(Lh3%x3YHSUfF&%TLqe1lg@98=NXL2{ zO=kM9RPYv&{)MDJY$Bao${IbRNi9N7tkW}^X0Ve8-KlsTI3JXXbJ8AU%$E>bm}e7cW3gfX zmGt0&WH!!g&vsWIGioG8Em5lgSMcOCzn;|&1IoJ9L9BbdL0Iv1Y;zW za&3S!ZVimyeMzI2+TXS44>C3m_0S*8oTopG8<2|R?TTE?ES*i$ z$*1@&lwVPam|0}`cS3VftOUg{0uU85A-^ucBoqL4pbC}hk4q#M#Bhf;f^9kX;u#4L zXlr)-M5x4rPzpZd8$e%>jxGrFMK>P$rsZN|ioQZsp>L(ommO8{D&Kinb2~|Ca65G@ z05o(0r|$0nj3eSC>*XpHz6;WAj|aXYFaOa~P61OEB~ZXz=kB{wMvZ_1SkeOl0Bumd zSq;IvJfmv{0L?9CGK61z;9ir;nnSBg{rz4vS=Um6;N@w|&We>=1n zWHFXkih+wFskn5mR7@!!zv#Bq)-tr0+6)^mk@mis-Lbs{n7jx|u`q;sx9|#DiSoRV z9^;+oWNu%YO%&sW!ml%A2py%!gE4ImQ zdv$#kJW+OJdtLqcxah=-;kf7=*L)-@T zcN;)rN*XYt9|;&R>~G`Cgo+c8{~AhtK#g-8XM{krvs7?T}%f{POJe@Ce21&A6`3OIP zc#3JE8J)C>4FKJkmT;mo)_0?XrN9POz-q16M9$Px|>j>@837aB=_ z2|dXRH;W5U@^MW%;S#WW)(tsw1TcCpB9v9^735`l9oZ#h>ToRaW29|jj5~sYFxhrW<)%GY!8$nIvaY3x{ zh3*PEB=1r9!k}L8mJk?F7|(j+TgYvHr3lP-d&N+d1IFYszT_O4hQ`Vp`soOCM-#9uA-s3C zFYAQMmr8#x-a^?9|`U_@(sX5%LA+s*`;{k*$g!`uVnEOLI(TJWe#bgmU zEgHs>%*!y(L~29J;T55;K`O8*PwTL9qg>ERRUbD;g6e|4q@M(GoqJM^LS!Y=gr;?J zMHvpg#19exB=qzTlTVH86eLx6;K9{+fP2AXl^Wj+Vp|m~2x?a1mw&vj@?2ND*Oq45 zlx5^4vIqW~Hy;6XF*!SA{s-;&{_kAGw}1);T4ixLX(h)#QCH0vtdt9SMF`wA&De-s zEANwg7#3e2p!H}Z0I>@KR^A$UdO<$SM>$D5U*5o;*m^9G2>2Q;)0G?INAF8RmnESK!K&ehjO zRDuTPDeb%m_@!MOiO_VmG~}+W+lNxH5{(#vA-TprQN1qHU8kwO_h1CnbG~OsqzOA` zU0OlD=X1WNjjlh-wAF_3XeVQlx{B;D>#>r1PC+XQM0Si~m@%h-X+z%h;>}XIso?zA zoPuR?b8OupVn?ClUy>PfL;xv}6h2B21<&jtbiTu$JPfbl8UC(USVG*i-^I}DSTt(+ zZ@){jL)_kY<_}D?pbYj5`(n=y&x%hF?qSSh`+p@bDJrKttwbe)`fck7B5BA!UawV` za=qTY2DfM9T5Sr5wZ^N-Zrk_dp~nh*3}|vsk_O;?Scy;a-HRYEoEevI773k;8wf%C zd(LyfWNhL+NX}m+H=@Vrk~Tt{qxdaYFQ~7JzmH!gs|QEITEimQc{y^1B;7l@4fxTJ z^Xp>eOM~bNGa|aRxL+!ASWU@-EekR7fcRG;Ujlnm$Iu2j2iP=|{*^!_fP05B928cC z&^7pybE=L|qToc=IkX9q->$*H*Jz?RnXyWQ4Kj_PhMpm|4GSu3W9X}K1?#|}=iy@f z#Xp4UJ=qCYor=NJC;h?!ERx(g`ysY4@90GG0SIB7t*cc;Sw!npNDKv;AiHTWV-yA7 zKfYFhsE1tlA4^0O$>Yv;nh!S$3;gi|m0e@}kwOog1?)Q&AKaB@DFOgRIG-v4&M^gQ zC|?~#9{|$o^Zp&QgP_uT^#{V3fkG}}H3&l!AW&lM1;`Izr2{D5>2UyR`?}B9n(^n~ zskXt)q-K-?4$FTdIzj#+4B@}^UT0 z(g@<&9YI|3n1J}VM>UA!9?n3;qXop`B#1wLo(aUY(^5d(XU{?WqqIj57d+vmqSNO^ z1YL8#Po`Bo@m5*EHWh4r+!?|)Wi!1PKeiI#FM=)kg*eUUJ)O@VQ4W&55cg2ZIj=9>SA84LxWd@bXigB9cEI)zf7ypOSYT-R-<-u3m`*dA?qzl8M+Gzj2EyIY zU}6Q$0#z)Z#mkT|F@^=DCi__xoW(5HHlOEZAqMz4$0z06Km2xQLh4o z^hi-JTHu%oE9izjJqvJ2X2GU`3hpvK1e(sGtJMes77dmlf2g{H<}>iO{XaaS@N^!0 z(1S#cMgoOkQkgvi@6ewNB556Q1v@LlKLG|K3E0{~h4AVqg_|OJ?@J%js8#{BvHL(N=xjNWfWvdCg>XMbk1W6lPXM8($%3Y zkc)3_)^Doinc9$~OTf&tM5S9I9;LUImpXEi_a*v$Wqdt7v3}o7yybm<;{APz_adBZ zeCMMIu*&#IdCBE8eEzXKcRx*n;_(GvO5Gm5&mi#Xk{&4 z7axJTPT+YMgPri(ZgL_ezhsx;04y1NInu;tCHM;@x}`lJSxuCx7B2-gp34W21_+l9 zQE|ikOv%Lb{0vLX*To?`dPWw-i<}+Hl%Iv`B2Vm56fAH^8U`r>&dL=m;k)YhoGTVV zL^^^f9}W(-3W^1z9SA(YM%#K#M$V#eCe{QhC$lW3$?xaJmt^dJSGGJjS%yG^J@df3nwtVYP36lj`5NqmwcH4HA&iU$VY1Y(@622D z_u|&vlkjJ#4TvrO{nHsZ8clbx1sKc*JVi)ha)ubw)y#i>W~f&+@(RBF%*_h>d|DS; z6EG(Lp$k*TAdSqZ+I_y>97Ibv3bE4LYk-X;!T}N+w;^+k<-+o3Q;Cz2GCVjGykD=6YJA=~bLx zMp{Tm2%)UJdU;zZ>6V-1?HrYqi&X@yKIhBZntbNjg7S8r`uJn45?>H1ZaK5EW@PSSz&8v?l4e()=82T!_wquRXV}?br_46@j5WfuE^#AjJy)DA(GT7YjSW~~T4Nj z$3ON5>Ce5u$}10L`D18Z*>1R)BIW{Dl9X5l86u2}al?KabbKhxiR}ZKHJaL`pb{<4 z#PHZ3YhOZ!5imKACE~!$7>2^rR-^DR3+E#MC{sKhN1{L>;9Q{x*M+oVm0S^kWd@@P zieW;|qT>q^s@bTI^#%|+S0q4y0R>L~`>DHbj>dhb`Gt|E01P6rJ_%GQUvN4reu1cJ zRKJH@U>GQZ2N}mN|2XWM?Owx^ihfO5R*gqXo$CX#;u*R?i(oWW;3;mxxR!+xVKWAE zqgXUYXOKE^gER4`2C;SaC_OP7h-*T@9vRwrdowMZy83QAzRZ?WfK&ZIV;x`sF>u z`l3$2a~cC=6rM2|OzUCWh*R4Kj$toVk+}nuVkX6oy2xWHZS;Z6rn_H+$Sv zAiS;~NzKltg<~1h1e81Yld`!DbQ?luk_4VORaWFOhu} zwtqS{XAv}&k;x?&ZaP@`GO^Zk$xAd4B$!o{)94J8B88P%#rnt#Asj>%9kNuwd2GI# zlav-Bi57q(6jUWPMdG*048cr=H0M&WR1-FF+MDuxUzTlVZM)C8-PJLay%PEYw4{gNe^497zP2SZ6XwVTQYD zXDHu73!C}GdTBj=aAYrkSRS)XXk{^PP3u9?B}4eo~esK8g;ZSx4dLu@W@ ztv+8)24-mGH{vqpX$RGr3q8)l-V|gf&x7qj0$~)Kf@yUYiv!lKmF~pYL^XGq7{I*1 z_3b7OglX&}<-@DDr3gYfEI5Th>@uA4b(>tj4`L%WfW@CLULesZD)5_tuxHO|c{-WZ z(T1B>BoAt+aWSecw8@Eot6GKT=usV7hhXWsMJsRaqZs($OQg{yqN#H<4j5&gCXcbACyW=3vbZ>!8*ken5azx*gwd8`T+p0JU1k711)3 zQdTJ85Ae8wpaM#c`l+WX<{p7*j6Ubp0rrGBv^a*(Gv=+ENO@+6Qhy4$I9FP) z07qPci2~BWkhZ&ZE>!Tpb8szDqsR+MsK`&NC&Bd?&o&aoGBOC!!fiB~c* zo$^x_C}_<3D=c>WH)7TGmP3H%hfa}gOllHKyU+diGWsVfG(kw5<4!~b!s5J!FRR9T!)-Ws<|^;5l}H&&hyyEH zD$;^jEfJ>Da>GHmqx|bb*1!Q1sMY1%KGlG^Iuj94{h_8+#K5STeOi+%&Df;Mgo%nR zjh{r{Ls_Ak5co715%Ks1F#}zMVCqb}i`o#?D(V8Q;Ei8Q-k~=Y{pw7FGg7L!_EVc4 zZRTW7ML`O3IEA|PZGx9uMOno7i3sfyNI5^wQGjGD`W|<6Gl2?VHnA=7^si>95^wSp zjUjqntWKaC>JUtQ589XV<9}_A0s}~bIp*^eO~Ea+y2k*)_GTZrk?tTgLiHpt4vzHwi7d@S$4xF z$zD1Q-m}?+GU1+0Lvh<4WyA(FA^5q6v#hN^6Kxhp4C^i)S#8byFsAl`Kx)N8C$#y0 zESebM$KRuNgCIpN;-psvTN7wtmsB9g6GUuMuC0tYt(oR@Ea1~uhj2} zP<$lz@jE9xj10*~Un1q^$&Zv3Y*NV)AETuyo0|zzY=Lr&NRG_qJ>-h61t}W%10X-4 zrwW#VEVUT@&X?D+Cd-IEBXN?uF=sUDh!1Ivczp=M&Mc?%eySm6kc{XptY`Zs4Wp~n z8i!IMZ2|WppBK*1u8Q12LQqWz1V93Jh|I0Rx9}BQ1&Ebc|E31@*u!Gj*`$<(>CiFE z0Ag1!h8xTQaO{bYZ{W5tp`Zv(V4e`p#i_@sEv6;m5vNcP!$G!8u6wmdXY-@av+5b> z!FEIdBU?7-TH8wfFyJwp0(eKrTA6+Y|?1Gk)eP>WrmJi{{Ezx;6@-bmi) zLbj#n-IkFyuE@wxWUzWG(^N5eDT0dxD2ILDGJ) zw4fz-%CctM>UkcopL*O@&^ENKmM{&7qHQYHti+pp+&3T*-_*Nr;+N9P~Iyj;;j0YL?#)-^0}Q71)kkPH2EFF%0lCQEU-GF*%yhcjhK5{Hot7 z0UnSF{c@dcI%f&!rH-uPb7QbwLE!9rKWN6u05#F2|4-w;_{g;Ly+lWUpM6)Ys;Vge~jWTTaXq15#Xb=kE7EBH?nGZo0Qc%5I z%f~)&GlQkj7gKGE8z@=C9V86)awRadXbvdqKh7f1f1d{N0&XWRO2#Pe!}BYM9$CGq3OykXO8-do;M{ z#2!gE;HDWH3WdqKMrHG;TqrgY+u zQ=N*i&YgEds-A*UrkI~p`#t`$j&rY&dmWK+jWf_wE1HENV7AT>fnSnv#ymi;cC1Th zW(%|l@d~xXY`e3rPA))co2KAMlkXD7sg0YfDBqQoZ-}P&3V07()F^^~zQ0mT=>q_2 zAdrmP*43~JMMt)EF`BsXL8f<4Gn%@{HK%y5Gn&4ESgT1}+-y=enCiV6CrzoFoXC!= zR0xP-zQ~TtjV5(2wxq>)vJzMR11N}9u5-i>aj|ufO~I6w5id~6H4US2eGY0+WMsVc zy{aJ?Ky5V!pcl^}z}er?r@%gA=EGzn4!P;SR!-%y$HPB}Jx8;{B^eY5VQ;ufS~ zF%5--ncp_;^N?J9r4}1v%Zl3v9mCzQ+Q&jHDxq&xOPxXAZ$!!r^S_@cbO0O)4GoYm zA6Zl9KrEDCh8H~6mK?}nVSL*h=US<4#+IXjX=V(vk7{T@!gDw6>a53%zcc{Yx-ABQ zv*NYlYb0n=2us^?+!dKvx9@TVDI#na)MWFvuYZ&loe;tl=QC&K)OtF3MP{qnP}_6z z|I_mS{Tot*!Pw-dTaXYXVuM)U&U5dVU1E`d0f zxvyX)Mu>#W&q^DfNuUpr(r!_twxVsix9-SBZ(YI4589I-9K}tRqn}j8_(3V{#7_V$ z&cZvO;!h%J=TY&be%VnR(GOr{zWxi&R8QGl0%mYXDrpE?{Tk=D7+68hNQA#Z7Qy+l zTh&;Ep#ZZ-BKWYv$NkX@b2sAq_yA>(Aul*{l%vlR*_-VTt~eC+AS56S60>XsEOc(V zMA={Hf}UrAoCO)nMOX$J0mae#*pM#$nt))`3xB2np~%{O9$!E}D03vd01`|B0-5Cb zrz+mSm=%>bN#lB_7P6ob-lLyp`JJg!ADHHqw2ylX5fZEszUMHv6f^B%&L2k$*5g?i zJNG#ARm1F}Oo2J4{FkfczzD{{)eqZu&-sMb6=2Xa%Q@#$RX9j6Ti6LI0rN0bb$fRG zC>a(byN(%XSB+f~sSG<${AOOJys;&~S@vc$!sFIsI8PkMioMQy%qE0muZFSo-JmqU z$xpiqVk(Vu0XZlO@y&G_cc#D&OV)y_II{|Kr=MRA$A}?o9xKM+!0_3ap&+lehY*(+ z&g+O@XSKBt_%XAA4NZM^g@}BMoRTJ8T9|SGUz8g}RzXjy!bncHdFG#8gTa=bPA`4i znBKsLf(M=RS%=~dh^y*)oQjS3b_G5=vEvl8acjHT7eh6@*CHD;+7P1Xd)OY+0H-u(xK=E86AM7JBJ!&WS%dciKw&#)O;bCTHN=LxvdQ)Ex(l?v39Yr^DE@&(uh8BNfT?o3tb?fnMPUjg2HNaQv2kY>=6fekhIrCGE+q)R{;SvgN&oP?1 z^9mMwEeaZoj>mCcHAd6FI`O798+RAukS2B433qiy)643PUrMR2KaE5XQpSc9TD~JM zrg~fu#QfJj*vb}U!!2ky{-}6z*Zh5QGnuO@V#5X@YLYKwNdK3q#p}9%#E>T?`@hC$ z;#Z~dj{O5Rzq-r89b(Gw!79A-;qKZL*h+BzXqCWLq+x?JXxO@?z-D%UtsbA@={%^m zeu%N?wCq8b*O%hA)1XW1i}BlePYK;M;nX$8t){*y?ybVR2J#&UrT}ZnU5=f=hO`t;f2UVH5hw zx){%io=h^Ubup0(QwDYbMmmPvA&An@$L=KbR$foQpjO8y1QZ^mMiv-GNl<;eerSob zrM51@1`ta##^|0(@>qicS9PbsT|gm;Ei*olO$>I=fZ z7JbIAzyl+CkkXZ|M)W{HTQ>%ka_fBYW7!Z;U`bdqK*wZ`?fYVu*E{Fptux^9WRM#D zfxT!0v^;cuQbMM3?oxNHT&y%W(3t8qMiRMxJU`K3y$o@y0{t9W-0j*?0lm-z`a$fS7D@K5SJ2)Qg7{n^tt2ZF)}_kIdu@zpa3$Bk zoF{_g8qg6K&h|O~bY>r5V;BMV5i&?J84;_q^^H$JTWkP9hhiKV^K-I(j>O`SUJ1o9 zx-Ue-`~xZF5vU@0L%>GGK=L9K!)IZ9ApvG+1)9k-SDaeGItj8oFAG87PuyVK`MRD` ztJ-LL2V%0kjL<@C63}Y;D<9@^FW)&a6X-^i31Wb8!4z&$KMVgeA0j`l@{J6|5Y77U zxsX&FS%EnR>D+ngGTKl#2Gz)0{}a1eR+3w8 z=ag6j$Bbt5M7!Bj?B*uyH4~mm5Pz^llCJI2hKP1E@5bHOP4m1xx0~-@uq(ScSESAD z+oi;A?dEm0ne3*M`*DAA;G#<_a;(&MO|;hk1^kc*WeLK&p7q7x z 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

    aE9WTQf{WC(R?8hu$GI4)vk>x#C$qGj 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

    bGUB$u7nZLjL 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

    **;6*ub-ij!5?Uu>UOiOjTfs}m?JK#<{#keIA+ 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ⅇ1F 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�XL)CaY%h>B%OYXyU|nXzXB%k0MY>!^<5FI5l5KV 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�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ⅇY0HG})$!44(zMgIq%1@)F6STO=APwskdu+ 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

    =i_G;tV30a-X4;v=A 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

    euxW!8 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⁢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%0D-F|jk7Ldwo%x#I1Mp+!!HeKO0^S4+zxEK# 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

    1|({-Iy-Ujca+a08(DcSELhI{C*EmzIsTC;{ng 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

    sCImKTW$MT(}%^t-tsK5i%}IiIg=;P7q_Aym(%z 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 z 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�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

    YPI|qWz9d%VEbZMicN$ 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%0AF3FIP&AX$b4Ow;m>ASi z0*fm~S?*A4gr4LRk~IN62hZU3s_|v!L>2!DR|ry_s`d(;LopPk)6pN~v40UOVx82e()^?>&%G!w*Kha$@DBhV z1Kjfb6L67kIp$pMj{a%3vw*sMo$cHrn#2xznTdd?9~$2<eiDA&c)w_mbAg`&I3M8BKMGu=51e>5lb!u6-O!(~xnbER8E|h8-KsqxViP|l z!(iSlZ%>l_a3^kJQ1U-s<#}+IrH5%eG`f)qyKp$o@?;@eVwdYDYrWVvi)uCvY)IRjjtAsFXiX8huy5%^Q`6e6}CxC z!0b6!oAC)(W($AD99=`5=OtQi%l1VRrzVub`HM$17%{alqGbAV(GUxT6PRWo^s|n7 zI}jd!H^M4A7;38mSAk*qx-T=m2JZ`X1S$NCX~VI-p+fz}S+-W1UXb}*h{Rao=r zh!B~4QS#9SI&M4pJMie!;0xgL(F|Oq@9vfI9^u@bdTMV_7mi;z@lr;$P;b=jSddT3 z$dEDn!<6l4AZ^A69_1-I3!MaP+vZqp3T)Vx58=;3h*=ish2dKk=2!@X7B^uqHse@_ zRIy~C)lhb!S>!c6F`j7R*}csYFFI<26^STi`2V6TGuwxK+7XRsHVutuOcAvT!B8-r zrYW?9zG2!1HVocS1I4DzxL!kf!UtTYSEL*cBcJZL>!`q=i6}9ED~EZ&MQZ$B&i8jV zchUd$MxsqkGiCJ?%A!Txix^XgIQ2h>I3+Uwd#<#o6$rP5Fj;CmE#$|U1+cGUr@0R` z#xzvKGNHLN5TclhK!OE+`+2}%5w8_UXSS;jf}Z8ljl^={^#dP749nVHll<=ne=h$| z0e=l}0O0a}%09{ee#bw5^R6!ZJN0SYx+Z(2u37(sc9gSb{dx7MAY#03Do?2c5VIKr zGHgRMwapMFrxh#{?L#;gWFxu?*Qz)&6d0`edihUD4CKB9+K3;E$cW-#VcWzk8WA?J z1Bg^?Q@5{SY@hO5S{CB9VM9J50I5MlHHH5fX23xsT)^;OfLQ<)^ooR&x0mDH zj(x_?`$NA;jeC0w98d*tpsk(H&J<3n<#?o+w|HTdhK|hTaUD7(FOpS z0GHmSz(v~a#M?ggH(lz{8l2UYY6J!C+MmrM8f(|SXGb8*HseMt+G+!|9P4-RqQz*r zKVUd!%=0lo8Eu(Z!7a!!b4}EL5uh;%)e!m~r?QB(*pV<6_%LZHLfGO2eBbIYJWL`? z2&P;%z;VVKgj<$jjKz~VH&dRNwJgW~A(;M1tZ~vcM2++(#-(k2F6o5CPTptp3F!`!MFm^<$;87I3jx3s?ro#B#tP<1Rw43RgsIBtQp(zBSD@2qVr3x=8z+2GP}5YtzJj z8otPcm%L4{2mBP^^0OPb zNZc`s^!yaZLk=oRe}7;$ba2ulI|+J*Da5&z%K<{;m{K8tNZ<9oyuXxrZsamEyY=B zXahkI48jvWDD;nf|9-qHiT8+neGdE!z?Yrg-^2JIRS)IMUEiyGP{>zWw0ykMPAv|d z>ffg5%muy-unOSHZwqjddXQg9pVezoqondJEq82W>9ymb97h52X9{7y#FYIQ<;D?w zfWz24+Aw@sVx)hLHqPw_nm(8L-UoWFTt5f?1>j4E2O-z)_d`LhUHDj5zjmBBWxiv6 zrGpDyY14E&Gq^N6^r~M@)#HjKZ*B?a()|l8{jj5OaDvYA{~29c=z;IuU+1-85Js8 zw+6HgY==8!T+5WNK>Q3b&s(M0Rwul##i3vQN-F;gfG-2A0=V=q2QE?%^Sfi^-mwua zz3wvR?8rN0e9Dx+!z~hI4EYR_LLomrF;&8 zeiHPBeEtTUUWM)hxcp@S7wP!*Q=D(VAyqx=rh>JJfczz*dcKWmD1z!|qI&8GQ#Hx0 zp4(Wb`uTU<%w&Z*PvVh~dn5330Otc-`rCku zbo_eh(08jP!a-cf#BM(W9-xPedztbSm*0Q9jd=Icy33<3Gg zJm^hW9T4Or8pTEix!+(UJi6WHqU`vKY?mje0$L^^T(bouF_f?lF`=+731 zUK8H!meV!BuLtbxM6dgOv&ZJYa|M;E`f7*N9*53ByfcYB2zmbx@NWU%b)vJsr}3<< zpWS@96;aeaOZkazDf^uFSGT6}u>klffW-ijgxr2uK5$Bkvk_P3;?@pFC*#$Vw6iKZutiwL5e|Z>H#!10Mny0dVW*c;F&E)onb_ zPU950Wzw#vqGM@cXUGB4WlVV#w)Ul>2Cjtua2iPSm$Dx2!26SUzsTn=fjW|sZe9NZaF}dqPe_uEBLtjbyp#!P;RtfO_fWZKl{wUxgP44!**kkiAbB?G8 zqPw^pPX3_0Oyqo(oAVZj?l!!)8t)bPz8CnDfPDa$?t8#R+T!fzTi#_qWhc6bLEKos ztYJ)JV@Kw(^86mz{;1PRk_KifZZ{ot<=h~;Fm!Yxd|Uz#CjL|y`E#V)+v~p zb}5&V-=+AQ4g6FWc;0jS)fe-;O8dPgj z!Q9DWE_OfD<_eZ-|0?;}3wo6xDCG4K@Gk&g0bG8*2QJcbhmUrrypF?gtOq*_YzftUE%}-JRw_j1IwHmuXvc?BiNaV-c`txq30d3RF(l zlRm*HNBlG@Fv_iy#j=W0^KU87osd^8K8x~w1o#VpmjSLk{{&p5Q=N5^PrJn5?6y7F z@}y?AIV?! zJ1PE71-=4s2EgU-Y~Y>w+vdc-I!^sdg}*}OJM2`xt4P`EDWVzL3{<{Rq9wd6c8&>A z*(vnBPc*B8M52KW}>@}vJ=^7D<;9!8wFJvc1^%Yxt9%YuiDU8L;vRL~l2 zFqj!5nE8NdBWz}Bj!HgiLC4i&D}ZkToC9$AxE{Dj+YZkbkCd+dubs-Rsop;Dtc7i{ zr`Kzw4!x3;zvEmFR703Q!Z;2&PZc{Z3u{3H73r+HisqeK!UlD>JPeMZyd2Ur@KKCOZuG~KYegyChz|E)m zuFU5aC!by8ZgtA%M2vMrOWA|PR(sWT%mY|0IAq+cD(yH)BtfgOL|P03%Q2&_hbs>g>(pqz zq+IT;pz9FpLm!F|@v;seAfdwz&iBoZOs}65@V64W_WQszXW-FilFS$s_qO-%s(=2lz0+Xn@Pl4B#Sd zJ<+&F@FR!K$K&Td5@D<*H>v3s4zq&4n5n@90PCy5 zH!4?!hZd~$cIE#wqiOUDf}`*%QOZcIe#!qr@YjsbLhqaj{9N%F;PQVNaFKRb%JD#t z^=-oDrh3^TTR=%T4jwXohd^#{KDf!AXD-&@bvN2=f0aQ={~+Gq!Bg9+vb|HNJ)Z0b{G+;&xK@fs4cTWbz=>>=U5sLQeki{%sEZGl5?KxCG$R zzw$##{}#tTWYt0`hyN-+SUR2j@1q0pXT+hl3$PbXNFiO>5Bec1;Su1$ZeWkT0c-9F ztuLh`f`!LpM#f{~qS!5_V{7|>{9KP!j!>5f5ZxVb3&jz*B9dmme>lF%G=>`^s?xD@(FkQ?=oQH@f+O+Y6dK8s zd0`(;v&&5fqXh;Vhfh2<7BMg)Q|oCYGo~0*r_4jWyPMHpIU?I*gP?|mV==a>V~;WI z9^$~&8ScaR>;U5>@ZG$e1;%3JRoW3AL#fG@1qBT`ZrAWMc1~25cpN}`@QXJOdO zGP;@3kL||0qg3*_AAGpug~PzV2dJN>`0Nc_BzL@-=ES%Bul~m2v!lbqT}yO!@<8XOD$fRsIvC9bqj}mWhtd98FITE7a7F@-UGGpdHGQ4(2R|;qKLh?Nz+QkW z*Y|*T=J!N$?K%X6bbrx}bT3qu&;LuhC;hi{;f*b&i}6gEjEOM}fya$9Ny$@;d^!NG`u8l#wV#pdEUy#~+65dTdL%+LrPtN6M(ju9T0h$L;+k-!*?s@x2E4 zMSyJpm+yOkcjo(qa_-Vqb0soJL2oMbKG`P(GSB;)cb@m1_r$y0rFsdcxulKON2ILb*jM?cP@X5_ zpnYzSUmO8H8Vm+14wK*_Es0()hRu&1x`@8h;l!d#Zf`c4UpY+7tb9V(-eeAPDo3pK zH~O=OXeQe)Wg6zrJ2&XwY*sYz5No+(rJh=@7vOvG+-`wC3w8pfrx`9%wJz_+n?~4u zIaJRGp{Gf|S=!-k@}rxmZJK=FxV7CJEkE6R7BkP-y~)VbS9*R$$Eb_ZWn{8pbSCrC z%)^piHT)~}<@yNA$?L~i<$tdozj^TGU?os`PyCP6yUW_&t>FD|z4m;F^um8zXij^%{c_*VW?&?B2x+zOEj_n8=h}k9&r{c$#mzxb85W1Hm@w;#Zwh zK?F_=Mu0fX@SN;RKPEGyV|MBUcTbn-vL5Em@bsMG8+wK@`y%m=E>FA2s7_-hlg~An zQZQwOYbA$N@Pjjwa+5MVAB&~99&;BBQyqJZ+@<$_MCTa4J9YCLOT;&(1W&jGZo=KV zhfPV$?MTM!gKrn#P5F;FoYVNi{1-=g%q>7T;p#2(`<{KS7dzbazf){bbF;p{w`lrD z<`251eWV*7>YW#O7N-4P{FU+gkn45N4f>Q1boO{Nj$s)MyXTlHi+l^y+`YNQg}gwf za`qC(&P9o0S574z>My>?cZqcez3$h{YYh?Em=GGtOFb9+I{MOz#7IJ?Aw{0~Q#cih zy|h>`Osu|U+jx(DoQG#A#l?Ep(QGY9VdHxdSDyKA#9<-4*Iuosu1HyDWNg%vGW;Vu z^!1K*&+BlK@u}F!jh$}#x{oD-4+Q__PkQLztn!?nc45bx^z6s=taCbFqj#z?GX5xj z(I9?Ne@}I4Ur&GctfX_@XHnLCG;veU=y(p-JD|(IW?s)T!+UA!IsAEv?<^jOWP??c z-b()F-Fnw2^)Bahzeex&i*;G?duMw3dz)F7j}MifBYj}%SN1xC~FEh$7GW(XbX(uePZ>zFeq@BZz4;*#On^new**L=C9Xk&Xsz0alNVhk?>Lf z*LW1@36!4xaFKGXeFL|-!hFe|4`%BL8?Ot>!duttW)uE&*@UNyew%Nk@tP@arFV=m z$TcX~{MBmDllrQ;zS4I${4ww(Q2L&QiYAFNpeokQ-E6!j*3Ff@X1=1;vpIr)7H5vXrn^pHWSDKKM0etT-Fv!joww33U+Svo zx+-q(!uNu&fzq`fE|R*h;pY{E^z+-gtos_2*QJpi9Jqar`s~-tpsg{qH4M7EXWr3D z^N!}IJKDHF>YDnEt*Z=vIam#pu4~{Tsr$J(>^#V*y29^dBS+<#qUK3azhMkJ=_uoE z^G@EVyH5|llZC}nR}YqL^?LbMu@dYSw&D=l?l-i}Xq$sHF++E?DeWd9?Ob`bM_`H6mGPae zYYcn}m=2V#bKxSjHeL}XM%k*DWvh-4q3m0p$n+7$Iu*5AQ`+l7+Ja!zn0Htr_0@BI z6}R``Uw~$y^y&NB7PpZ1=9tlIju}1Plh2p>3b?+~R}KFyxE3gVJK!SiIYRoz=3WlI z7V(}O6vum9v+R%f8gCO3TZ{GOcB{w8g*uGR9TzM`eujjH9jLAuV^g z%ttjkRX*;A{{=Jvm5)Yvo8lankCvl-YsXm8rXRFI>J0oSbqN0)0?z~Efzp|8{al@I zp*}7Dv^L+!%ILwWtSRYY{^(`ey3EToZ8%3sGIzAmy3SgDPX-wl*SQ_O1v~`QbsmF@ zq}JIS(tZlA1QUC9$vv~iGhbgVW zB00_z4!f>A!?^q$E-bdn+U0s(6kZOhtZNut$Z=n;u&W%)6^_;1$FjW9 z`n~lbzxSW;cfp4tzt?fym$ec!iPJ&SntAmzCCY@ROa73Ghi^DiBHJ zqYc+Pm9?1sBY7pSb)|rHowXs?*#h4R9*O@t^1O)dWU9O7?~cxV>pIOL*Gc=Cb`j_V zL~4D0WbMhn=*JcMY03Sxa_jfc<#(z3z8qc+E&-~XT@Dv1vV0#}&We|@a~GG0UecPa z>oxHE)b;)ee;0gcU86PSOkHIFC2fG_=InTx0vF2rpL4+e{ZrsG!EB)Na|T?bmh%%b zv6x(SDY%@aF7LC0xaJ0|7dn|Ih2KN6j)KR ztg5`KVqCy_x+{tU11);0Id3=QC*`F9{$$@Rd~s`)%EAJod9)c# zRvx>7cA-1lYG3DHBIB8%+d9vIF9an(>0AmIDZY4CMn2N)foTO;h1e{Ik*;_gyTzI7 zz_n&e=Qebxc(O&4mIktb(%A(rlA|xic&=NmvhcK^i*6>OKumb<@zBL(r5sf_w5($Bu%hykVe(G}!$^xOmKBu_TTxL` zRm>jrY$;kfw0uF;v9K5UEQ(vwnY ztkD^3z7d{ayrmnRtm2?GT_*JhTy~r((A(Rtw^7tZS zkiJNqrH8Jj8kvs`=v3wVQ+PA@9;kd69+{8G=dk_qVNSm;|20LZi&=yo)wN6d7#H1P zq}@*60$R(NMIt1dscx0jU4Sm7dlUSAP!E*u9dMEUKXjkAtk}E*Qu&pl^h@d6b!`p% z1+CII7-=_4@zs|2!Yib1_Gbys51tG^ACv*5`y;qW>sQGBn$lgXDQS^SpxvPa7dBe~j|Mxbo)R|m2+1`BvPxSD8ckg{- zY$nrOvmxSAv(~!*zO3N9&zs?!!2>|Waim|yvHlM-etE+ajw3TvsYWVG%FMU^X8kwr zuf=YVe`EwoMDMvI?FY6{J8C=&A^Fd5boL)(Oqjty_^*s}T`9edYIfr3}*5^`q?S`oJx^x<2#$;?v$WhIyy4s}Xa<*rU$R(ZfTGU}~U=EG1a zvp-nQG0hk#N1z&iFY~hjy~;;FgZ}`21}Z=KGUdyN4Y%x-u7+!aPBWQK3D%0KzZvC99u@K3>Bpz>>^%KZ8x z=Ap!U|DxqrYgV-{{nbz7X&z=) z+URbu@=<`!d@CP!!Rx_eK;`3kxJVh+xK5(&k7)UrZN4^(oD`bJ8+&N;f5s6c+Gk`X z+dGanV6w|RBk2P7F!o&~FIvsb@;+pA$O?`x&V-){&IL;UQn*OF2Fvo6nEv2{)1|ze z+WJfm_uS+AQr9~7Ve?FnF^)C%BZW_na?dxWn>x!kNS)g(9l|g7!QE+DS|^}%4uy-P z`lHoneC5UJ#_p2ei<0rY&X=hak3GJ5jFhqrO&kC?9P8{qkA0Sh8N+-X{hinWmp^uO zV#8!IkY}tj+e})+EmD6q`qcCNH~6dIA3*80cGC*w}fP&XoRFqYSrdy-?ufEsZdZYU*!~A$mH$S$yUSlV?y}nn{wJrK& zCNFh2j-pyz&hmzi-roKpJ$y$D>E!D?!syi72%Ko-_Vxu#a1z%PeW3UEdU~H^)(LvX z@R#~gvreJ;m7119qr|gG&rV|>&psT1#6~FYDa_kGV9qRFW}M*Nr>Fi`H~zpOT`6aa z!?I2?=IX!GJx}VMaa2CarnKfeWSsUB2NkEIJ7#IegNZ=J=}NdrJ15KdY&f=caWc2h zIkmX5ylk1-!ezjBn;f_Qll&O@8Y{f_`nGwr&uEf&_nu=U9g*Qm;vg;;XHEA=@v#>q zEwK(pGW&CN>rS7ZCp+EnbP}ibrn+YvefX)bQ*Y4#n9F$f1aB#4Vs!BwXPj?bVV)sx z%GT=dmicTVA9?(d@QH4jv=P8)pz?VhT%>*0xc}M_t;^>OTJTGXSYv+?Z|Nt`o;6dh z2@vh6de>URTw!)KYb*46SJ76)?)7bQGZAu_=pAr-y<;CY{Eu;}c2Y`mrs19Bn#G2n zc|P%#d6J@HJeGEW`vyZ-8yz*?EAvw?@?hoXWB3=K8L0fYvt)kqHJOhC)_kKD9>byB zva-^Z#ith2kx;VItOo1#JB_X8&3c|q$k>OeFMFwVWgD_n_^-Qoc^&2EtYCwqrINM4 zpQOG5uCK=Ns^M3GbwKI62QJbaYrS@B_1QH=gI;LP=$S8O^z0RT1Z_v#R2uKe9va)s zFim4NAV*${A=e4+N_U3dIavI)jQgzej}E^T$9~ya+DMQGl+HPDk=~3rm%gPqPAn~} zEIzSpp%}5?G>QJE)CT4ti9-KdLwf_QoaLC7&nClzc=6!CRXruOi#xd=YR{rTPvR_9 zXyAUSvko1qUGy6K9q=JgI)8wRw9s1DtLCq?sIzS8e2zsqsie4cVWrU8$jh;OG+8eC zHoM0h$NfHvxo}A7#w8<5{>x>YUn1>JZP_GWbQ{GN5!`Y5iQ) z!|JmoonZsWze-QhzGS|jwt?4OF@#(o`XS8JZ0Ts^I_h~(?VP1`1HFLK(HAb#!iaUX zE$PS^82ZEy2!G_e)aVzB1#XisPu9NjeN0y%V0WZTg0Cr@OC;k|&h?e=-UELCJOq@! zN8uvHU+>ErY8v%Cw^g3jwKwv#F2?sClzOx-ww_V&6Tl>(^h|||6xqKQ93N>ZaAtjJ zsj*M-+UtvYiWlwTty0$puB&|H3Ha0C8K88%1Q#iCU$>AB)9PW%imQfMTk8y+Gi%Z; z5s<=J=lQi}-}%}W+{~PUkgv|{7Qe5?x_;NL_H%a}d@?v0sO!&$i}Yr*oS&u6Gj+WF z86{OqCKfGQP%M^ebt(UYPFwd|-&4AFVjrW*=p{-@zWXF&i1ldY*ULE6ah-gwBc7|j z!Cwb&1Eu35xJYNGNWagu&dZ3YV-nl)l=AcoC3Q?=6MHLs>*FN5bNjG^>?u;qD0(K% zEey@ypZk#1liSU%e@=%l0v7e*X%jvobF^qVej-h z{@I)q)`z{dPqZGXz{65c1J}#vdLll%;a`F8fYNgSF48O3dE)l_O0Z)+yqt*pbb3+g z3Ntvh`eUdO!TG1IT}yjqizy_Zt#f8rH|i0oV`_JK9id|}{6cUEP&zhRKUcn|J{{wt zUO94mv6SK^oiFo;iGcja(AMh(l>?1|tSIR}zhhCS`9?`6)?;>J_a5FhDkw;K#{Keb z10Q)*>f6Khl`nSafhU4~Kc&kKVe(2KOuUYhApV7UQ$(6K6FxYO6?SFK|wxlLlf&ND=z-{(7^YxBgx#vIh`o-4GR zuKCu_)qPc;PWLycE3AUcV}{f|Ul}LB5!K-w zCaZSW)AFB?I_kO3610i7eov`$!|$XY?0+X_d$xF4 z3-AxXzktf;(q1y31y{)YHGI{|d{!=4QoOWi4yRs}i+ncuw04PR=k&S;dk&$T#@7S)PKlS)MtQ&+?r;W432b=h>b~qZrB> zJ;OJ%YO?2~w8@^lQK`HKOz@pJofDCJj`gGso}RaWLiszL#^SN;V*8kjJ(u)*ba%6^ zzpU$%QU@Bx>bWVCGA5_zvW#bz-~8S)RzJo&$+LpHRsWof=N{sv-W$60&e8^ep+LoR z0$il2-^==}-s)#_sNU^zv#6|sRpk>Z?M|mU{c-t-E!u>I{~$JLX}~(u{kQ49L4J>C zIDLiWX$DI&Cc1LfxbE{(XDvF^ecu7!4L%1-XTN}@)7qyvV`(ezyE)_{O81a+6b%Sy97Em~>yt{A6=Qb)`}0|FhwGN_TD2jj`@ah4TeolKHGAAGOwV zd@uY7upOv;z6%#=i?#o??Q>Dbh3)%MvTQ-=iiNUaFPypjUNH`~6ilGS@q_QbhIX6L zCv`yDQT{xGEu*_0mn3dVX8NEsPfDhEs~anh;4=oh7K_Gp-OEyMPM<6-fF9vHXTUE8 zmjk7DD_o?=efe4}KP8ps{JUV4TQHUFe@BB6V6Md{@HrOro+a+e|6JM|20KW2z3$}9 z^z<>VksQUtP9DB|*O+v%7wZ_8o82RFJ9)FcS@b1{n!4Kkvw1{G-QQ(?_M=z5SLO8O z{SV{;m7mFQks|l`YcW5kojRR9^rEGeL#-O8a3PZfy0b6me$mO+zYou`hx4I&h-ctr z_YBMT3SPC!Ki5^d8sLrKEueIL3KuD_yDay+tj{*+;wTeQFlzM&WtBZpw6ym7e$usL z`-p}0a`l2ai(!ttyHVusq^F9aYo>zNq|Us4wx2A8SA$D|()l~MNNc~6esXqe{ltzR zI%hCBq{J-6RTN+`m0`cw{q^KNMvJz zCtRe+_pCO=F*wsAD}VF}ev}nxr}vZx)bjn4|@%-Ef-vsUgO3ya9 zNc*kzM4PS87WELNS>;s>epZS&HR*q5g{vrQG{9)h4;D@5E=C%QJG;w8MW=BrO?P7% zH?^}Uf%UJ;c=?aAeRm9e3YZR*zTdz_+GFisUu}K1LZ8?VYWWIzCIEwtFSyLzDIQ{8 zeTw#z?+%Z4607|Eqp9IW8M*8(;&t^(J)O<_v-A$^Jkr6N&Nk1i1|j=0=s=cN@Tg;bg zpPMt=uhi+8_{sNIU8?}vXu2YWd6IJ9k~)@f9raxQ0e%m-A1EDL;Ucx!Z*m3(pO^v4 za>_5`Y55gT%K_gvoE8n(aP)H1X>#9|diHZYrDxF5S=u;|50susaFKS7mp-#IUw*b2 zmoPn+)zs_%V4Vjmf6BHJmIJ=shL#DmmDtNdO5(}fPwU3j{Zs1O!1Yyor4il)J_SnO z=Wvm_TK$`kc8F77&|+%!8>Ao36MlHW$F`r@fGPAR(G2ui4p_fS>dVWq{bd>aB5)Z{ z`mTVB)MkGPi(k-Ux|Gl6mWss;2YgR5J_fX@?vV3=%HNT?8o93WJ}g%Q^@s{p5Mc719t+Y=U%u-Z5=;~ zrlw2bY->K=FTQ)|gagd`k+YiX-j(rb=6V6HC;Z@ufzNY=)c#R@ex@i-SQQm*x0@QM|e=ss{rJaPt3 zSWr4y%-|mo`G#5NxzX6+A>*)j8NYKc>|>#o6F1$|sgBTU4@mMFoQ(Wy=nc+~D5Ap)*4AJBHSbdkH*L@AOOJ)mu5eq_Rql6doeJ zfwReXn5BbIzlnHrdlle%lrrF1_Be--=#DBb^phw5H!y$`m!Tr(iGte9dg_Lq+> zc~30KxqGDE++nufa`?sIa-j5H3lG)1Z&MrNJgKOvXns*;@gZ6{_R;u=L+i}qyvyfM zoNGUqI(MN%#kFT{mUc8443y4s@KBwT+FBlz&XY=u79Uy`>fD%{=@gjTU4A7t!rTzh zv{&j~iyo!75&kat2q?W@!9(?KZ;UgpV&R(@hB!37X~Z|pitlsDN^*o<|d`Ky2a@}ZrWR{X0hV~PaS3?^ezYUfW`n|r9 z`U9hE{VU*?gVjLk|2;fZf9|40^v_;i8dHDYFkji;K|Q30`bzV+QhyWrRQ!(~ouv&2 zV}Q~>86K+tKwIk<^;|lXnDFQFmkv(PWx+nFw-!B0?n?hw5K4p^fEP)#sIFL(l4Ii!9*18(cJ}Rqc2!`w?a^ilyFM?Annz2tP~RUB}wG z7s1QH3ZQhahPRJyX?U#?{(`gcx&u;oBf3<)1IMxk01N|4_wn%d(XEWHRmy8JokISL z)V&s6O849FCh#dxy7$4`N4G5Ctx~W=@paRwh z(!T@#B6t-j{U5+X_2*doueSQVcUlX5IbkiSH?o~tQjKn@H|Ka;Zwb5-R0E~=DtM^g zyd`b*@p5J)l(XGIWZCH3#Jl82>Rqy~lao^O@>;+v_3lECif`u=va|p=3Mjp!;Gufk z{Qf(=Xnt{N3opJOI*Tp$Nu4$5P&!|NzX{#}O6MMUsLnRWb$S_vm(DzK@Lh35anv{8 z&;UQ$Ic9(x{8D#bzO8!|{Ay4Olh;+x%Px^;+v{BIciknO;M8r|@dE=~C}b^r-lzPh#FT=mnJC zA@ESWZGKM(*L$e(g}oWn^iWZbd>d=dkb0}pqx8N2Zv<}vrFSUa4a44<77$Qd(frgJ?bRZ zJAsKn={^-6s=LkOM`6u8ht81j*T-+s?J%l=l1@^09lDh6Ciq_PHBh>Lfrsk8>&Z6y z21E2!v^t^`=oD-t#j=g&UP^0(J(qWuI;T#tbzTL(9^3?!&b#5EI*+)wtvV}9Cl-sf z$q`0T=Vz3QIh*FN!0z6vC`5EyYmHr`&SrF|c#fV*{|A@^l+M}kP@Ro!?a!MnbxvY9 zxTG{vZFq0kT>+=wFveTES@$13O79Os+q5jr1C-uuc&Oes_n%sND<@VI)5xD(&g@t! z5^8XB%FZDf2&dq6MeuU40w~?9;i0;l+uBd2;;wYd6_b(i?i<$0_d_4`6h>AnT1HQ)yAfR~ z-bb90rS%7cfYN;|JXCj^`z4j`n6Kkus<-!bRL%UDUQ+j3bSd4>!CwXc08012;Gw!V zU))Cjm{TIQ6pAp9u-fn1elc`5_Le$xr`tL&f?o;N0;Th2c&N@c$5-f#U1f&__sv+M z5t7?S>fVDc72gpvvb6DF0#LdO;Gw$P+-?r(CUC0#!fNgHM=Gm6bnpTpHGQS-I&>-B z@54U>UjU{1CwQptyxKOFi_@@;L&`;y_jcnWb3EWxL#sJTDg8uEotPgS4`}QsbxxgW z>%1QR2T%u;&aLoJoo#N<37xUaMOa~OM6`3`f^u<`)UD03=Y39sp9;)rW2ooP4q{bfFOqEpRhOfO*FKR6Poe2j*h`50s6 z!^%$_`H=D_av<=4p`q(%*T@C#1La(=H+ZLIviE1YA=a}S2uA*??itqP+f*_6mXwhr z^{+)=fbYe;v_|-Q;3J^){|7Eo*NF316Vz`#s?1r-$~}%XX5EMRxDgfF#{NB-%$Lp( z0lUL#+Ij4|Bj+>MT6*(-Wv|b?9R53S9Z-62hl`Z=v7G-MdtPmnd1H3D361wuRxTEc z?H9Tf4rH!h(RrfWJfLg$5$ZH=mW#8LS^jNK)?8wYBjou5WPJCaNBPKzQ)&BysX*y{ z0xr^Y>ztnPpSRIRqU&8)X0=F=+_%p2OUfpXUg!A@6W@gJ`ZR4@{}C)R8p_cmrx_Wn zq$<$+dgr;H)!7ENgx$UZ{?VR1Baa`SXyozZj-0_V+~~oE5*=A;G~AQw?`$k}b>_69 z&MZ&@p3a8f>q%$TgWk`Txo4j5-}8F9Ik(o8#rZ!Jxw*zUEH^z~zknT;dK$miy#tJs z*(ZX-Ll+z0>&7(CnB*CH4}FZMho^@=)-zByPokin&XsY@oo)L?CH#-z4xr-rJzS(E z7s>eDWql@CPUR{?IlG-R1D|%8Coddhe!WT_!;o%%Gf2#SukqjH*S_jM*%)ga!}HcL zIYVcUG~LCT!&E{U5R)yFlD$kS_a=FdGWuk6*E3w{Of2tgq96h;`I->NbTvb*20rR%=OlsHkvECGRDY!7NM~X|Q!Jq}pFTj&d8+KW))W z=H8j7#vfv^&*eln*k()b2J{5bBlLa%-vhn`O7Bl_k=mg?28MlX+Y_H2`*AQ z)CWPm5tYGpsb*#Hj8z%@lBPB1M5zpnZvMZtOLgGM^>#?gte@-KI=82oYJF&xFt6n* z;W*C%vr4GTmvPKL)AqL-_#6G@5Gk{bqZ6jczu$>s;Edfo7d>Bn|E^ zR(nr2x|3;mhcvpM(vwA_yQkIc)(TIu?*CbKy>J!$X0Q>c{5${`DJSuIL1v>BRl`^0 zsimr+VT#nRoo)Nx znhz+w-QXg%gU^QQb+X!ZgB+~3+0t8x9_6$5!T$bv_{n(UAuVuMs@H6HyV%i_ zHg}fMLF^u@_wx+)Wv)5h_nXrr+T8Pu<+Qn%c-bv5q}e^ieHyLqH*|fBcZNRF)x+0A zFZNk2?m&UO-*v=C`Nb#j4(G9!6{z?X!$oQbe+`Xa92UE4(BZV${5djSjl@Hhx6DGG zZEzG&@j4MM(w?ERoV7=PhUf~F?)pJUZw50-53n(S)tez-r7df<`!enb?aL6l>Q9sT z*nm#8Zti3FH{b`L^5H9z`PhG=%tzOl`_{#LzZUYPtIjB@W*Cb#*Og?4gT~%84vK@% z2a0pXYW#P)v}=bPX*_5cJ?$Qi5;r^Bb~mcTB5~2BQFw;bKNo!g@*{kz4qgu)14{oZ zaFMF5a~)%^V{fJYf}+L6bILA|$3NBTPs#P1=KA&;Kbx=JHl&Y{)L{5_7`3{QZD-<4 z)}dYyw#;2CpDXhbm~Yo_#qbs2VxaPIHC&{2sNd}S5VKe5K{C-&?Z&<}XG;A|=nJ4v z+=qb+*!vKS1xo)ExJd2r-ec>J_2To)kf=3W!91zA7Ciy<2)%E^KL(!yrT06yNbOJ` z+j^a9<2Ryf71wXH^yV+L>*L?RYr%~`>Ae>&QajYgwqB>&xQU|S@ZwW*mW*#RdXzur z6=!MFz)Ya@J_HwOztxYv`xEIeakM{eyfw6BIlsfR;f zeA-e64-v0956|{JG&|xoN7ce1uQ}^=cW4bvpVzV03yv8D`pM_ZxaBOe>){gk@4*J3 z;`Rkxq;{x>?YKqM!jHAo>vfG^+dQ=GwQvSIdAF_CtHhz#i}~Y=WW44sw#(T@_|xE7 zpyKr<+>DpCPPeqJz2(uK8#a~` zQ5LY5Tax!kZ@_z}p5}mv_iC zcT>=`K#9!n)Ft-5Wmm&*1)G4%?=x_b*3OX6Q=8xG)Oy3{!zil_F^pop)@^ZVSL6m? z>jIqGF54YqEG6Q#?!}1LI?geb`RQ6>*L&x}mw`&4^0OK)Qrz`kFh8N)`!OrN4dkiC ziZ8cR>feRF0Qy8d())bY0f3=E=^qalDeihCs(z=6WOHuRN{{Q;TYA@`N4?j*3V#QD z2$bGtxJYr=BT@A_RV0rS>gW|o;ZhmjybJ8-dlmc!a5GSPjZ&#M?s_Du-iV6i-4wGT zxx%VQew(H}mm8%bv4>NlR3k=SjKP%Pi=8X;{Q}>61rD!uA@6i%h4P+ZzS7NfMGT^F z|H`Xm{HlqMdarvDz8icFRQ$#-mGO(aK8YH?hzg}O!ze%Hw!K1WzhM-uwpzw(Gx5kL ze&TuF1OE{m04iR+m&tgwqrcMMDBtQL&GnuUahfao^DnmUKYG=8^Dx09z>=34h_sXMpK_SI_mmEbC%bl(UUDem`)V7U$Ij`cRtIKshL1D8m> zP3Q@rN0gf*%UKHsMgpaG0$ilT>w%zNr%IqHn$|i?=UQ|q|9=_&Hh2#xo&SN0l(_!~ zbvl{C3A_tnt&#bK@g8hyB|)y#jv1{p8yBD=gzfX@PRfQr|0xJYr2 zmjugO&|gJ=P1NC%D~@UNa0%yW$$acYr}EX*i?g&NKp&v;F#;}9;=XEkH^p?-o5)Oy zuBvH)KS=#+(HB6UXs5moe;+gfrT;6qNQt+rZT+zt*7qF~-C64_y?MX3^Vd(RWNF8M@j&UF2^T5xdcfA}R155+XgD>n z8!f#X(4*>skKoPVd!Y2ry;SN=ynSu!4XXvBb<@9nOceibp@Hoz z)b>DmNH=}Wo!0YDJe2SIFXPN-a12oK`W;-P#C_k6SA^@grhC3NukEhip560W?Y%Ny z`-#U?;vxLz*vlCQ0yBY%*M)GAGH#wN{z&UOM}D??9OzKrFDR;7utXaF9fs(xzDLeN z+UwFD9BVbJ#XO|$bXa$`C;lJWX}woZm2;7TvyoUY@+XQF|6m|c`5Ffo zDe-#1%uXw2BfUW0TCND1?vwg!(HB6UxG!(RKL(!yrT;s)NQwJuh<+zyeS2*5N`UJZ z-Y@m$ud;phH}G0;BT#zpg^QH9uZHM#GS=OM+QC>ewn)9r=uy6!cLnVoFb62Te}jvZ zc>6j;Z$Ojr3}|_U+gx_S%Z(bu0TYn49$A6yF0=+R)gxdoe=iCW-ho zJ!0MeD{bFh1-~EE0~Jr#Y8lVOeK#bY5ysn^ZtRDTZM*TdV>dP%_Q-gZ6A$IPkHDV+ ze*-FB&2W+0(RWWPU&zYd=*GKyT!O~i{AZc3slTy(_geUE;7*|O^(b7V#C=z0rxnI~ zfV{P6yaj)e`u%Hc-<<`Y2hIgbe<@s~#Cv$*Qt=TT)y97PTcOQc91b+ugZ~j`TH*wz$)!Rzr-8}yP+j#d+ z^8GleJ&d>DIT_Dw#7nhze}W(RTh4R>DxR0XMM~UvL*p5T@$MOaSdF)Qr;OJg;-Q|G zqkhL25Xb{6UQ^*B`47tVirM})ws+0_I-~S)+-Ob-9cIqA|4i4`AK!-~RL$9-dMB|Y zRIF&7C*~fCJ>+Ruy(sl=Ku>`0MLY0g_&4AOp!E8#mU`o!KN;L#R640@uAj~-V|L3D zwMCQ(ly{-NF6Pw9@|UFkx#&~v@D1?I-~piYKMfZt?)o4?f6Ts^N0Hq^P0;wV)Sa=; zj{9lwLa-1h-4$?=;_iou&>gD}X6NxvwE*LAuSmTO=n0@lloS0L&ieovK$P@$ zbr!r7EC)*O<8YBSTqS+t?6&U59-%j^rmA;;?c3_s>)oH~Tg@qwtCF>S$49B7?7o*1 zjBZA;nCE3JL@;|-ww&m@|HPJiS88?d$$F=dP8IT1`-Y4|;5xgWIUBwPTn$tlK7@-D zcRdpkhlm=cHGL}goY3|frrr8f>fV-dnp$he>38s3z->Uq>925+;$GLqaD%yTzdirY z-0)X6>myfnZOM;wm{QB%WtIQyZT~(8z7$jdm7go&BE{|B!TiVrDq7x6;TiJOf{CN2 z?j5Or7y1HxFMP4r4YZBG5TNvrgNqcmFGkbvWR7p-I~sZ5U8#31dXzu@9li^E0F>UZ z;UdNDkJ0oxnPd~8b}-3COK;xqZGWtR-wZYarB`1s^~T+vkES=wB%OyTzsiqdm96MU zaqOz5=j7ph-$VIrXu#W@)e$`>|C0B+n)s;p`=8;TfIUFPZ`_SCesTM1wD?7sYis&V zwoGWdxwdD&N#HXXug%0my+3{d|1bCjsCf0bNyaPgamrx4f^GQFZE7MGcD;0BTSqEu z|1I-Tj!xAsejNS+cp0dCybl*CabIoqyy_3hOpC_ayhrNKz1jBF3*lFQH9+ZK4;LwM zUk%moWUOD&x{10?jaL4-)Z2s}<*WTSF#iLL0ZQ*wxJZfnYN%c(V?98qqZ?~ruhd(M z9#ziYf$s%h1EqKREmCjX<9@+%9;!FYSZh45%LO|B*5v}7PgAwuO^jx#))Lth+p}#;u(31cn0@uhnpo68F*2c*S9)Pft9o zMq0m5#;cilsCbS1LzZ?Tm;zM1&WDTCj_p)=z(e$g>bsNTY^WCeVBLT8DnIpZ7eHRubVPqb7227d#*4V3=faFG)C(@_0Rep)lx z$xn0lOTD>&wEc7?d=*#&l-><+krMaQP`yrmdhKK44i-<^C|{WaGu<5f^+$LmJ;UEohZ#p@NgNbTsa>L8lv4!i%PxE!|8W8MGT zZGT+?uLhR_m7ivxDjThE*lVY>=&-pyslN$*0rUxf9dJjMHVWhcrT-+jNQwJv zxPB*xy=_W#hpo5t)}lwXS9ifb0egVb`x9KG#Qil~uam=WA=J@ZtfmaD&@baW^-kMo ze-FP8Yz0bp_FYo9^4Y-N+2Ti9tLGC1+pXccTj{hW(#3_6(Cqqjv;!k$U%_Cx9MN4-DSS+)ywM zD819*A|+lA1ob*q0dGXpT4U*~MTheLf51Nkp8%!vd$>r6`+rcUll3=I6dbKTx2ue6 z{-5mUa1H!sun{P|2jLa8)o^@rYV0lEsELOLuGC1u8=GL9zMqR5R=TqHcf2X zZX!*+WW37nvweOm{2lNiQ1Kdmzl>MnJ|B!%92UR%Hsz6ak6z6L5z znOm&qHQsf9L4OJM_sWA2qqm};J0-4GG~-c6%KR)ruk!f^;ZK8Sfy&RDaFG)CdFw#a zmIu_{B~P)e-qfS@m-=%au>G?PelfTVDE;f;A|>vhq57RHbnhunc3)%Z-Gv_IqrDzv z{0|HTN^d?~q{MwRRIihj?kCjItu*&&8Q-<&QSF)6;d{V;fYN*FR;gFDpWD1oVz9i2 z>J76}=YEPc)1w$_f&*%|j`rO$I?>iM^QDH$`0XS<$}f`ZdCvo5fr{TcxJZfnYH0l8 zu-50MA2w?h`L7uv4-Ht&-dEN`~InkV!~e|>=00Nk>Pq-3um&i- z8{i_fgRh3@b@J64W;*$5`4}1BCiEy@9q=gqzhE*@dN;yFY6o8p(Hr5bA19mp&Tb4_ z@Uf-?2gJ0+SM^j5dEl@I-NQVukPT;RM*0qpXoHhZGdCyd8ouAGcASh?#$&dRo(jJN ztO6=tZ^A`t2OkZIR~$b2{>;Pbqk#!BUipvP&+jVubznVE@wyK#(*8{8qjRm#w)cAl zeN-$!lrH+1>7vukxy5%H+E=s0+~R<}jkj%|7kj%i-B=u$W2J%?wcv`QZ05@m|G;V1UdnwyFXl{ zxcA46qPxZIan}{Jv^}ntFtsXgN^wnvP$J?_Q=w#R+a z@clW)_PBwQr2f1=+x6}x@O9vNp!DAX7b)?2H?-UomoBUnMZZx$fevP0QyAyCp?*@O$P-)=|2}PQsVtrw*FWhSPcaZHSbiZcQbkd=n;DV1K$r00Hrti zFH&#f?F3t|Q!Am-Nh|tlEWLBlqu#$Z!tVuJfYSRkT%^R?3ASFRR>FrAjp%P*?C&~F z#@D~yZYRuw7lLA-^gam}De-{7eJq=H~RmTxp81LQ2HmrMM}Kh2+{9U zaood>+|gezwR%f$EqYYF@fN%Zdv7A@Pf-P+Bt&zGhC_E0p$}2VY+-<5f>QRDZ_L@TBKi_YG9M z2Ej#Y$8qn1in66;RmG4cR7lwxN3G~DG&FelEqPd_t7)j z>bvzTWPbLeSNZNqFK20|gR_9jPbpla#C%m+sSu7BlOXI zH@{lOJNNJQbFd121GpI|-TUAoCGNY?bhqfc`_5=T-`z66cmIGyeYgHH8Mh^`+P?cR z{C)5-P;ndenv7fGz8fuWaro}$xrfzv8?TUYt0OL|p5G1s7W@cQ+_D>G+}hW7tBNY3 z&-H9LvyFzEzuLP0=v02Y6}|&J2UI@Zf{WBHekW9ffs53R{jyX< zRb>^$@}Rcp{j;y06>tBn_IsJH26QW5?eKP%))VvvDqkbvBDIgN2D8%&cim0iT5?zB zudSE)Sc}d8Iz>D7ZTQFFQ=szk9bBaL@z;oaIJxY;vm9KO{XZ?;`Tw+i_8RyG@JFC@ zZ-tB0K0X_v+sSROINQN(+1Kbs8Snk*QhqyiSC)1jSO}Ev7vUl$-ftWB7)0qlaPGgY zJv*BBCbm4Z_9)+VM>%+K8ul`I-8j?ZfNg zcY!|vm7gc!A|>v_q1kAK4cDC88XMN?@09t-c;EKnbKpxrDNy;i7%o!cK743CoNT!E zTt^$$a_^G5ccM$Rce6jBFBBXJl$9%$`KVUjgy8i?hsXcr)LU)TcyRESOY<5q;_wPXBHmf!LS;j4}+xFST z@aw@%K*jBIxJd2cvk`HN!)CuMJZv`mw2W85r*^zH!0!cHfQr{^aFN=vpJ7hLie(Ep z;b3~1HAogY3vA8&xO*A2x*alKIiJ}+TM54stOY7xx4=b8+-F0w(+Z#6NZw-hGW^wg z{?QjepYYjH|IX4*026`I|0}piiTms!`kj1s%ls%lTVv_nfF9MJ{RI9M_zoz&o;^}; z;y!zbUMHV@l2AMPZ0<8w`A3)X+1uccfhU2|-TQN?JMn&nLv)AvtaGoz&iT>YHnCoX zUA=t&?B(FPZRu4I``^nrZXiyoeftqSX)p7ffQn-gT%^Q(_mDWo;k#=V94_Cj`MZqQ zPU4~BmGTAS;Gj29@j4MMQak#tJQyN+$L@U#%Lv2ULFCU&{O> z?zf@mTg04r+d!UTTCIq0O{3I57kvS~7k;}5ejj)cDE-^vA|>v(q57SywsBz;t2M8$ zy)O0o|6}{@O!%4LT%h!p!$nHmZ$tGuS?z~}I=a=?TY9&lNBOM&6>GsjPoVT(0T(H8 zpAFU9N{jt+Vf$O`qeu82IU;e3ZQ3R8_kQA|{NmWJ>H7vHK*eu6T%^SPH8g&4SnGYo zhs#>c{A(Y`c;z(P<*fvMA-Dvnc-;aQDeiuQS>?qQMO7TVVsG%z4lYq=eZ9Js+!jLk}> z06l@yTLTvhg<=cDOw zX#xGMB`lzS+VDLUV*$OXO49=0$b8hGQ`N`M!`}k$0+o+1;3Bm{eQe){m=*GUWTNE? zx#nA`KmWh>efS;xMsN#I`tOB{)DHErtv^`z6VOL?`NsE9qMCSuTzEmK1Cz?Ynhh2 zPsXUYm)BDpy~^ z(|*a)vVe-$c(_P$ucLSJ`%3W&)~bc{PhZdu3+Z$9VIoV~2J)lI$0zV_!H+=YxBEev z-?;np#KNNDiYohUb7Dm?gD8{BmlQAMO|&$6zupz4arWyq8Zuwy=vMXJ)9_cpKY+^D zZn#Ks*LNyk5!q?QP|61K)?&q%>z4V*)3UVyIz>Hl75oNp6HxiM3ocUJ^+?QoI8`W{ zOQTnQnpSV=Zbp}?Pmb5KwP|1`P`V4@BE?;w#MJFnu{=)bqgO129vSb==u*%Bf8iNM zw$=$K-50|}io3rrrtYu`#(8MvxzZ@rOo9vU-_Q2Fmz{XOUu~+4V>5A5zH+Q9TU!W9 zfQsXGxJYr=J2B%JQ317P;r$g$+g<^+mi^cea*KT*UK!KKvqZ8BlS%9WK(^ z8S?#a=gIQ3)$f5SZo#)edES(?;nl|FdX2tDH+Op5;?nL~7PR4jktvRSeL{|0{>ya!ageu0bBe*PL9U5PZ;m&)TcSM)XZvF?Ae?XS1O?*m(b%1;Aaq=fyo zb)zgz`4fd<8C2!u}uB>16&l zEO#`2uHR(o?b^Zi|8wBWKqXLmcf&-_@_WzsU4d8j8;@34@#xG(255_MJ^M8N& zVKe{2Tp6bt;-KC~o`Js(-Ucd8|AmXxe*GM5m`J}z^zMzdl|k!|*oi)Tbmgf-+SS?! znV*6T+xKsT-wo~qDnEaLicpPmjc0>wb-uY`+~ zu%CwNce2z6E2CMedHp6!Zv%RiuX-}!pc7DfkA{nsu&;*db+Xp&gxaB9T{}v~w;VmH zA7dN*HSi`-ddFr-y$SbYgz62mR_E@Emnx$eY=YevZ+Gy$)xn`%-Ikf54dZ0|>WPo? zi*MjPvMH}X#jg@BQo_C(8ovl@ZB4)V+N!o&YkT&aH=ZEl)kHj0c?)#P)`o(SK*g&7 zE>hg{mQ;H#*l!_*8>G8NY!bM6g=wyV&>iZ-ZS{_bLq5=zKSAbWGdfj&#TW3Oh3?LF zK03lhO4wKJ(UO?G72C;7ELW{NQR*&4R{&k2eYzR`2zUah_&*O9DdG0CtvgnOx^abr zqXs5Qy%}9>y>sB_fdxS6T@Dv1VgI-FI=O#SG_7@(&TZ&WzW+1a+cjHD0ZM02xJU{6 zzOB>A^}nJhIJiFRH7CiqEXTG@n-I!#H_PLc82Ks=Ps{}Zlv=NnZ1%m3ghJ$NpFic^2MNO7M(GN+`t!X6|P(URsKarQ{#g{?b#B)>rFu11&g z^KI~*;O{``{tzxw+V744=N@6ldj-4(tOiQ=4RDd-_VWnc zvCRC33mwdy>jzGidYjM_;CoR%`t;1!27_Fn^d1ivDQ-WH(CcL8YpSDbt+RBlMThe9 zo$!BvT|nvF3l}MFKabGqWajIuW0*PDFPJUkn%B$r^IyZ)f$M?N`x#uMxcxjrZ-kj2 zI>qIV>eiaM^Awj~{J#JBTWQ}8Q(Owql<}F{+xGAE@TbAEK*gtXK*lF-|Bi@H9OnIQ z_2Dva%0>A(GEOzbp@8qj^SJ}w2;KrJPU(HD=X0AJPaJQ3wt8IgG=>KM8*cyarUho8ThF?f+)JLkCA< z)&K{{dCVFhFkkA7>9k6wpvkjUZ1u!iwi&p@+pxuHbHsh&8f zcJWv6u195SJ%Nf-Ib5W;ef5wyML26~=4`xwaoe4>o#t#bEtPTFMI2O|y7bT1`h!70 z#c3v7q`3Q)%{T=+J!EfD^iJg)E{VHSnR&ovGC!NqtNd~={3mb_sQhFcE%TF@Uxs#i z#q`U~b+Y7wn_Py+OaL=}MA`_4Ni)8%v6CdRdV+Lkxg`gOy_-%uWl$ei( z#xD*Zz2VZs=A(s|$~XlE+2!mU_ywRGs5o5%7b))k<8U9f`xhcQj~~9QZJo!Bmr4Ci z=u^HK7))NkXrT0;1Q#hW-)v<+!wY00rfYH@VU5(i0bK!f3E%txz6X2>lYYwoWIP-%n9+c6sJuSbFQwqkR4o_&)Gop!A+SOzKUnU2N+O zbNOhU#%nH*;_nG{8sBR8ZZTTf>k!s94xM*VyH?)cM&hA-JvBF58w17x6|ZaIA|>YQ zcDy27y){FF4VSmw)!S`oux_1<(|+PGmpBN2Ic9jaHWkbO!8pN18oWdHJ7hoI#`(4N~V^bSR&_6@E9k52*M)1s5qXpAFUNpyH;Fk#S4RZ$sl2;kd2okN9wv-ge7vrw)nR zWSo{*aS+e#jqo~fH&Ai9-}?E^S56gwq^ZwV_Vbo3E2+X=vod<5>ltUIr_h6SqptmO zh0a%PxG|3&UYY7FJ^Q&{SN=%o8F>tKB*+I!&m_1=>wE zO0)V%g!dQxL7ye0J*8`IpdDwNV{{W`kbMa@$vD+=U8Uvzpmco*7ir3MqL8vQ)c?YG|0+(5fcclXw3h<@=psVgVXt}m9uSAjJ^>AC|h($r&QJ-KJN zRbQ4=Em<*t=z_AP!={v#EiNsdSX#DXVL@q8)uOVBrNb78?<$v<4k@oFtG;NM{JKD_ z%N#nh_(HKjb9UK^iUq|YdUg5@#wJ~_(-&_-*cJXixU_;k##qB+^l5`pZP@#E+|{HXhOlXQ;VxAE+R*L8@z9Lc6jv$@6qPhI+yveRetm~zv;5WEAqOv zgSJs0;WpgHK-Z9TW)O84=o^rvy9|%p>mBIr;Z99WHah6tjE+V=tp!g%|B*vF`8wx< z$8{rZfM;m(ko2Jek3S{Q#g%y}n`h)&cvSD`%JldKdp+r%uAWR^H;;Z?2Y=dneupo8 zpl3KSn{8aL`#;x>-{?l6>q^7>u5O&upU=wrH~I8B-x|aGIMw|6o_mvdr|-zrw%`Q4 zj8uKR@rbVOZjwJa?CvH9#633ts{6CO3yqQKzKq%KZblvt(W|9(wf9)try-2x#k@=a6UX`Cm;m?5= zfy&Q2aFPCh^CQbg%nUtl#LQ6ccA1}?6Qo|@YfIpjpc<(BTx$JXwOiEZ;<)QSt4Y(v zY|<3dq`AU>r>=dA>uTC)W1)yWsmao}lk2N?L+^aXd%!@T^bLWF6stWGx70`jrtD-D z96!sCvX+V_g%-GTn`xV;Ao)oHOl(A`n~Ei;`fWfI#hT@ zR^b9#lU-;`uJLcswLnj!fNi-t8HUK$6l022Y_;4SGG8_PepL=0gYN*(0d@Vq!$nf% zcCOVPkGOu$z!_yLmQ|IPl`N~8R90L$v#e@zHFNbQS5%Z$3>a#Dh_Kh`x9OXx>DKxi zbghn>?nYfGI@w(+^pTn^U0o;gKEU_lc^?X&3(f&b*WGZDp0nDANB%+jafB{Y6&LQ^ zXfztH8G57fl>FGNo8OHxzfLs27QAL8BkVrEw%r)!?XKtQl~hMP^h~;Z4EJDvKXBZ0Qhy`UpX?c&I=V-iJJ~nbm*r0HcBJ2$rxljXt<{7BYo*sZZ$3NoV*YIN%nmh4j%{dfy(bRxJc7~lI2YMK5F^S891wS z;pxn{VI$AT*f;3AsZB)e*BIJ5S0Cd&Gxle@M;WE6`p|NpmwGmEy#Ut}@qZZpKKK|Y zJyR!3J$ch*+;}vWmmj^in)l$3K5e6Gm@$gR zK&m(38RkuO4fS_8);Bh(gDcHrc$3ppJgKSK-rk;o-=CJ+$JNE1>~_06?qnmUhbPO^ z%j4_N+X#3%78o798F~tLko^gaKuTJQk?Kitxi{&q^kY5KxJBcP%Z$~AaiMWEH}!qp zm?>UeSVz0_|9E>7@FaFVP>gwuh`?yCrst`j}}Q3r#NyecuE}e+>8}U>YFxPX>=c|D?)!<&niVhlnG? zs+a8YBY#=`7VwvV*8!=&4?G6_No5uD79YaF{h<#0FWcpx=;$8@J_RTSr2eVkl;m-- z&mXoO=JyxVbN!t7=QQ!#)!R75|5a6aM=Rj#RqBftYiI@kkOxG{t9BfqBm4g+!Jh`6 zx3#JN51mI0>4zNsN%N}FACYRj(x$~*=JCa6>!eJ|P)vMJ$K5dSQGg$iCP4>r2=0>Av1MCZzq!ms)q8h6QvO74+AV1E*W1)b`N`9UpYa$7A5n z11|y6#|Pk)w*4sDeY-tB6VXSti*bZOf*F70(t)|l@?eY9{K1rMc8(tUjH>WuB-~GV{1IGZ;j~|>;{l_uHe;O{a7nUua zUB0}QqJdd0I^G(XvdYt)cj7Zhx(_dmT{ccsv091n>+X_1nNH4Ykj|QQNyX z>gLHR$*yA$G1^3@EB4T-H`|%A-jkbQBo{IxMOO!763vTykY3%0OHR;JVa$(<*B&fE z4ir-UEqoSEb&i8+;AaBo0Mh4$;FR|NCgRlkv-k`-F3T1#uADoqyr!mXfmLbE>=m4g zFb{Fe16Hlw!If4|F2@So9Q$I^uy*-@vGIHm{|8UNWp)A%QU4pl*Iww#{_!*L?}48H z=__uU@HNWrFB0s}5MK+*YhA92PeDgQDJe8HyK31}IVgRcl{A$o3r)m;C-qL}m3G6u8f% zRc&LH3|{VI%3a1ljFoy|j1!0d4E&dntZQ0YcS`_Yir*4Gs-P*`c?0-H;5IQw;4l*+cs$$y6@C!5Yp?5<~lxw}t+Gy;vJS>8***8n#Fvb=YLQ#z0>#tn^KBa9z#8?vI` zAk3ayC(`WVeGF|g*#dPg8@bYC9*y=em}m1o{1}#^rqHoFQR~NZSRT*9j|$QE6~80m z&<>~D`~ex%=?-d%Hsf~DqE)%dCK|CmEcbT&jGUh zc_rfaH~pU|ck9`+=|@V3_9ygamY2=5$Fh(tYMb>N|9BQ_oAsV*ef%Iko-?fPuDF$1 zpLOEnV(Xj2k7v>G^T&fsdC8o_duTbBkW1yqsF=X@sNO{INot&#YIfGVN!>U%0Z&qr z={?FD$B)xIe|aY3S1!2H(6l^rH{*TS3{34B-+GF^^CWe~Z>xDcBM!%6yz2Adi12>n z(LeF*WV}0@#*?{GVAdP@e>{2I8*g+!qtUp7^RcKO@7JC=wQ-@wcS{MB9$?hIgV z-pI;Qr}0E?&QQk~FM0Gw=`RQJJl)vLN9v>UbaR+qlzb!O8<^g!2Tz41vxaA~L_U$9 z<;jfma@Cy3GvmEp75~yFa|Y!_|0Q_i3wa?9R1Xf=BK+s&#wFzKI!_YDWl20IE{T3m zGchWn?V`X`)9a1XsGXu4U#L#^a2%+L#1|CK&mdxmM<)!ynfZ4jS|*;-?tuD_=z z-N#JaYk;9dMApP&h)i5u8O#_H$9q4-^_|>&kQqB!XFPT>oex43A7i-K?XJ&2*^+pv zmiH#t-@=WP8Je+L*VpRjvZOaTe+ye+CH;??zcMP%4Y*v^k>?Z4c%11sF=HLmS;|A4 z@8o*_I2<}%kb7rCL$9L2x{eOE8`tZ|_%GVy3}L^V#m(TQrlI9sq3SDDOYQ?r|5$_E z6)In;>hVctB8ASp%z%GP{_cmU$#LmU%}TYKQylNEQiJNmjpsD|1&!*$Zcq>Mw7saS zF1VQ=Z)je!Gg$L_dNgbLJs894_iC`SMf;4wk*B+U4>OJ5IK}=ZE$atv9zb18S0No| zJjnUIT)z>`E{SPoXWT;?%m*NHyQuFm*lC_n?CD z^vfDezf#-Dw4P|8@QbQeN$zhL_I}0rM_f;%b3&h=RQ+eQ(*afgLEXvB?#2xKb~38c z(0W|0>Ghh1HfVB>W;|s5{fBD&)f%tYcsyj|y8Wc`pH=-Q&VS^3ALMqkrf<~D-bSCe zH&p#a z_$4FxpBmqe!66h2j6Rt+YkZ@o->mXRRew~C`&^BqV{((K-#~hX);*3&jH4OOJ>0lb zvkn|8_j@XTO{IgA8(&*`x2btwspdB-_fagob*lagN6b?6Oi!Y&a_SS1!>yW%$o;^P z!*448M%AkSi7HP+r5nJt8egI5w`=Mfng?34_Jdk=Gv$0Ir&g^EKxEHAkAb>vWh2k9vipYVpD?RtMSRd!9by?ZJ3;mhroSkEFJ08d%hvBbOTTx! z&Ks!}>wh9ZdR1IEoulc_{I{O=k#5OsXZr2S5V!)-ZVF=R|3}H&b(_w?G?#7_*=6@djM~`*MOG|L8$y zv({s-_gF1VGuTxu+4zrcyszsI>qfJ#v!s7}_!}O501CBOpX;11?(#_~e7YmHG` z_?`z{2u_r}<2X7?`~{zosd_Wx46nY^G@drC$;a7z0KbgS(@w@h zjsiBc`+ZukyP4L`StINH2kYO)Ir9CDv+LQwZ}|}LtDtf8FRZAI(W0_8=JBxsEN%1# zb^I2lRj{-Z8u-NzF#a6Z*K_^}FIb^!$IMu``AK{xZ)fzLgyT6f6h^eO^k?AT0Y3tAT=fSyrMJEj*I(a$9`-uyoTUq9Ev&4rol;(1QNH+;>P5A#A$6BJ zMCfm8hVW~ye3a6Q|BKTV&na5HHJwlSw-pLMlTLH4pKHJ`0agIg&$Zx`%&%-e_Vq@{ zI1heYR;-IxXNZmak)PT#$Sb+hj{7C=SwsBOv?eC6Q`-j%Kl`BPgC1S){0#m#pq}pd zNd~7>Y{w_UJXSf~KX6T__;CT&)tXXSrW{Pc1+!G>9!8e*xpE?nT zrdR8R>FY&YPwA7Kn8FQo_C^lIc*8vjalO2_NsyYrvczoHh1vi6XocXameyGvvJvN?39lgYhw?xkF87p zd%3bbHJ6W1@RDiuSWkl9%ae|K>M%4z^YevpXwWQ$I;>YkFm?9fN6B(1Vf7l09%5b~>&vN`s2QLN60qN%oa7v??sP_`} zkoE6)p*sWQr-j`pUiNb(4snXd`y)^2s~_|J5-po;ib^z%cMm>Wgt)nocEHjN$Y&@_Y{ei+Pr5 zC$T=fkKV`A-xC?~-X_P3>Hu#nE2(N+f13m;~dAoDQ!|);Q z3bDI6>Ov_MZD_g{hk2K)&~KRwEXpZbI-?J_7X z_T;H(mp_X&FqevExgIN|(sTKV{Ajvj7XO)aojizpJ11eQfJJoVj6qxW97|2po)>KO z3%^zHBkQpdd@FD_ApJf7PATgB?pd{1LRr(XCNU3o6$ThICxkh|mtgf0ir+tQm4*+c z?l|G&0CZ&Ba?i<7h5*9>>7xvsQq;JG_;4bZ)5gE!A9L2muVWuucUAAul(*6gaAiLZ zv$`obqUBtn!L?*PC7qApDVY?))*Z4xHDy&sK~mSaEsUqb7beSb@)>RMo;)4n@Sbr-LJ1wK z3$@iMztpa5#I10G@LLK$(r-QZI^ZTi`fUQIBROoiy7E3_1(f=um?q7 zGo?8rmp^F@ifY8Xr*ES0u^&2eK00+CJOSMR>0TMzIvQ6DUQESyQoS0!>Rxo~$z~dl>z0V06T|^PUo*z(<25YpU`FydKAsm)9&uTE zYFwJ02$rD7;j5|Z_^RnSaXwvXnj*^40?)D>UxWVy8~|h-*?dtZd0zPZ+X&|c?4wJC z3DdyZ*q<1hQHQb_r-sa2{*%?fDzI*&I?&)-rV2mB(3AbjMc~&04S@910#2!@f-m@9+(VB|1-fU$>TM`dW-!2 z0skF3nBYZ7jaeNRAtC=(+fNhpWc|Jb{ub~aApLv_PD$2p#PdGM)fJ{%<;0W zv}P6XbX=#5#AvT5AtjlrbE%ntDTe}#4huA0H{y*1KQ57#v$4b%XO0RH{xDeyX77gC3pt zHi6#-{1cFVUIeGKzrQ$cmfQCQL*_~H`-ky!TvZh=^Kd%C5xq_m6E}}&%AV|AxVF0j zSN3WbyfYPdt`pfXtSZd)B+_xQjd^feW(DqK>C^3tKIk`}F8ulyJMo(aehP2~ApMqu zQ{rnD2De5>ToFAuU zI)j<-@y^3YgBj@f&J?~TEpg&h4ZZ@n8j!v=f>RoAihAvKS%iLZR>Xcfr$PN&U8}MN zHDxU-s@{B5Qy%YBfVzE5Wd`F&)&q?%GS5E7FBSKHOV1Ym_CsIBExjT`=>qfsq`yJn zl%mG1gTHV=+uJEp(AsQ2%b_Qa%O>!9fd>HTXE!*dsO@TMW#xHGtHKOhf|}H)okE&a zYpIBfQt9+_{lG^6V*%;oGH^;!$15Q|oTy;9(jGiqc}Q2jg`a{y9PJX?Wzf`!7TuiA;%MDQ8F$$<2EHaI02ugL4d zt$1~4O_=v{tqO00!{Aln4U2@2ZP1bR_B!}`z(;`e@fA3wsO?C^OZte=iuQMCMOEht zAB8oJj}q{6fCYf`Q3Xy(#v|f-VDWy=jx7lDihtV^iub5WeU}1``&>9pUq%yPfn~vp zZ?W*x0zKJ|z6L)C{0&GyQ)-2u{4{aC*&k^<5#qvC(Wp{(nI zC6(`(#@iat1r8lzt6Sx zOgk3Sq{&)e`-;p8qtaSw*FVZ3>;K>2{{h+nS&YQO=%vE>r zMcJ2d6Fec?P;J*gbY%VS2mc-T3y?m>Tp)ZzJ%0uJa8-Y}(^osHzuFa0u zi?F9JrFf|*PXqkQdfpBG4DbRV%hL)@N!D}3^MzfW4%Lhfr^P;9e9Dv!U32*(*6CtE z(CI?)Um*PWmN|YVfENRE0O{u}a7wbCBhELvR<60GyD{0g!=7yXKvN#;TEK6|0Dz`z z-{aPFV$*WrV;gj2J--hAG4MGceH;L%G}|kV^VNSwX#YVzT-Dsp-oS=5ILc2F2l+EN zUm!TgN6`hJjOx zdL0nz$7xE=wbRCKkuC$2CfiRP^kjVQ0e=YC4M;yN;FO}aoAG$Osk-vQj`0b;A+oDm z@C}jTOGRAFe>ia&0)8wo8jwDwfm4bamrx(!;?fd1F0HnoM(D}7w1B?^ybee|`@kv5 zxJ10}o`7dh%fsC9LqF)cZ}0)a5_HMka+!#W?_wt|lfjFD*?{zM7C5D-aS8F^3X89& z^-Rzh<;!l}wG?s3AV2U-P@VA61RWWVXTbLWFWcHQUmxYUnDL9M%PVSU)8;LKAs?PX zv>ru#rh6Kehh}xl()G?*=bDripQUAW)zkD;EIQ5N>G&>ASMf|=S1_xv_>ywD@a4Y* zF~RrL-<%0v0n`98KKFrBDjFyHY|~wrZL32s+myC?;d38+$m2z+!}A_MG9Z0+0;eSVkBH}E z+h@lUa?qpH?Qj@0=h<|P@KFjK>EjykjlgYy^iguT@S&^|?P=4O5!w~zox({4=p7<-r3o1bSYcjOGg9cC})QkL^}AD?oxF?6Eo{QC_|?LNhr+I^03 z@^~x)?tve7pKcV7*AnA$2O5KXlZ_LJ_v&lp_Z(-8pQt5HG{%ghpVBSh;YQI!O&@6t zvi=1(A$sEX@Hazs~PrQ zNx6@w)Abi)umux3Hz#j*m2Bhzo zz$ry-uL0jtTI{_r9Mod1?3JdQgr81VIDW>0PXLVYwDuM@Ylt}0U1$3#TyxPYd*9e7**62Yv>mAMMH* z;}ha1T!8*OM1Xv^2tUQplkNCI@GF3NK>E2JJf`@}x^T(jMHS~o3($t#@B#8~5`NmC zC;J2MRk-&B_yFmr6r57@{vgDU6QHmY+)eORu$LJxU|>SMLW~pK&(U9moguhQl&2Yf zWqjWU{~Y)lkmdOioKn>Jfk1pa_7g!f1ba}BFf#=0wjcl1j-PYEYk>;^>F08AN>TeQ zy55XX;Xy09K7b$Bims+65tqHtk#YG6T&>4(0Z1R+z$xvs*MCHK{*^Y_3h@zC(NAH; z1r}aR73(hUFG2MoDWVZ>Twa|BPdoK@A|BQpMtZD zGY{*KIL$aS>;YlfQ=0Fz>mPn)T-(790)GRtJm#w4xJI0hoLOFh2kAR@JHaQc-FY2O zSi(=r-NH`^^klz$Ie0y=8jyZAfm4cl-U{*KMA$iTwd6%UaW&X}_Crs`C;3{uD+1^N zNI!kSDam#haUN#cc@>rN5mfg?UeL6CTVD8C7)9~lBjU3hdb0gBfj@WzLr1o^cJSYTKLF_?{<;|3Td)r&o=$UX!lP3W$4O1LpAzUv zKP$nn1=a%6&&}YJqPG9Z6}5N>WoeZ&h2!!Rm^yj9XUNn^o9&|wIO8N9yP!Fp&~Gm9z(S6f~7&<==Y0sHZCENk5yxw*mJ7($6k%O0vB~JPuD- zK6hbR#e(wjWwm7;n@#XtwDz6_cv_6kOo6*-ba}^%T~R ztEvL4V-Fsx`Cxxd;j0n4GER?!KMTA7NMEmmQ;IV0g;jra)jVNw*@7Bp<}1DG6fD(U zWmYRYSa-}5VTtY}u`P^JXX~dlIQ`QQ@L|BQ0Hqk7r?IcXPNoM=22B%>c%(uxRr!{s zQXWmV&T^N|&ET7WrX$puvxpWy37PMOjM8H3w7GQH^%;r=m;j~2Ezd-kPP?tsX6sBs zp0Zy*7kmkD{t@cTT67UT8Y2qyqb;;Uw2x+&&YR%x0Pi26&T+MitgUl|(9f2T&(`U* z&MD7G@G-#gz>&mlT9D4KmX6=nsdMSv0e&~|&m+_kn|%c$cYuUSZJqrtounJE?ioWf?p0?d4zga{M>qfI(kjE-d>m958yunzaF6; zc7r`{`m&00TH!9*#$N%!7F(}qy;Ht3z|RKe0!I?han(T$qz?yFYwBd z>MUFkB(#Er9umiud81RFLEwXdVZf1;=Xfkk3ldsMLL&KWz2z>wTfjF1TaQrB>g5A< zb(JONw{`X-PkBB`*noX+fNVgXPjbL1MLC}Y_3MEFfO9@sg@;Fj&L=Il{zBw0^{)ZH z8Q2U+{YStl$$ft!?4L@jcS25P7=4^#ZBk6Dz`QueJi?W4d9F4Pds>-zps|i&O1BXE zYgmgTH(*z5Yh!y$4PPF%#{oAv_1+si9~b~oisAg=_?nDobjs#UuUJewyo;k|rJAbv zY@LNJoi*Us12-O-jx{rH3#FmlY04Tk%`%KHep_#!OYbjm)|jE_0Hq@+m!*ln6nc%0 zUa75DjJ#z%UkF|YtOR5|uLh?SrJcD~X@%6c)7U;&LmC_MZIk7Oj`Z<6Y2J);J|KN0 zfXCp2o(hbp|08x?32N-fuymJbPbJ8|5Z}{%!5Z+Dz%_u>-w94>VJ~sNqrOMj`yTT# za0?t}xGQ)IZU^G7;P-4TZl$dtFt()W=YmF5;V_v z6}!6V*+yW=J|5orjfqQICI!;&H&jm)<_c6ae4f8P{QC=H3i)JaSu^ZW# zOlz7Fc7QyaxRj&sv=|=rh-1kIpsbFNQJ%%K)`28P)?# z;yJpW@E42MQ^xQ)xS4mEmZcw!mvfovSv21{QyYR!Pb%nvi``sXjI+>iy_=bpi60@A zJ}K&ZIehu>J@pUk!M6f;1Jd_ia7w=K#5%6$!tbNFxDw}@StS$Z%sK%v!X}SzTAMr; zW0S`Q^Lefe$i?HTy|HYdJCzujPN z)08o}9*!r3NAs>3X(>kXn9kU_2TxFPp05qSuGKtF0x#Og^=gC7!JScvVSE+Cv&Oi> zZ+lw!-v@s__@ns#0Um!F+BqQo=Ymr@VDDF9_6gfAFvWmdY+x~0%1U#q~IfrkO6-umO1k(|Y*VF`j?+jm%@} zNgl6``{jn3X__7r3u8_;O``z2ab~I~V~4l`HA&0Vu~{4Ine!N@=Zh}Z=JC^6o@XFm zie0X|^99-}?!AfOA@Ca*CL=H80c8A&wutymnjqpg&wg)TNV{A@yTzk9<~4iX#g0R)+4F?>7;1fU zl=ZchSsxcXfLHJ|nBSPnN7&3B&#fn5-!AP`Y}=RF%k0^8$cWx!c?uQ}#d)v|pN{RI zj@5=G4oEFXN%VNr^SN#g^yh1N{5! z@@)s-1^f$;<=X>JX|KJXPlWZ0;VzE?H7W2VD~y>}@#2)|nqO>J#Q*AFB*% zqzkkPvBIUz)=$~$^xGrA#{-iAslOPU(!Ntge2Z=fd)#2ZP>L`%ADO>sLBBy*fi@kN zLf8cwZgSexzqF54a?8)CHQZ&7{3(FVsr- zN@kwTMyMxZ2b%)KvEdyNuifw?=ULwbe+PKq_DJWmDEqM-hka<5O|M;O_4|o%l!zC_ z7zrMw$9^#Ydz~} z+D2T*QNIp_^-ghBh#bnIA=VE;t9c%Ex}S-ujo#vd}ZMCfQ5jJ-(i%` zJy#o0J4X~xX|VOSx%A!we;4@Ak?GMj)=8BWv&zfQD?4W~jj==lFCfVlTd&hyPWeWF zj|Pqdj-Y&VmXy`dyHAA5DrS|e-PWmd>D&!|FL3{n={S4!1jIH7F_`wfC)(u!mskHsrwHkhX=-tO3b7gOqm*m4CQBGuWtRmj(e zeF^S zfGrr)_?bMPUx493{{g+RL0gKN2LFq6Y^jS8<9sw4`Zv7fH&abG&rFWX@1+kk^KcPi z|1-UaZv=LoJrmn)*3qVuseHPY$Hr@KG1h}sd72n6(tDT&4Tq7MJ`v?^L%HPngWZey zZXgSg$93RafM)^eOZ%r?ANG44BFqQU`(1F9!GSVY^js;59^8T$IUmV^)e+>2p16=VQ0=VM*PwH&+SIoR`8A z*Lp7HBM-8Xzq71^Ec17keUM=nM*Ioua<85_PcP4Tm}hR|`b~5I6>4@;46Tu0a?Cl!L7K5yvH--c*^gOJrFA@tv481JH=&Jjl{lfCscZs zjpkOSXn=A(_I$OQyV7p!??e8w-VcDQ+c8c8q<#Xpr62Ns(@6S(NvQ0qSpfr&F~tL5 zySRl?zxgY>{K#MGF9TlzTn$M5Yrzjk-`Wb2YC2fn43Sr=_6z-e$Y1LJ0q(gE*MNZ3 zPX<3s{fbKYiiuzkUblzBukG?9e>pF433xql9U%3u2d5Nu{kmQM!LO7MyZ4D!u#YJT z04m|Cz%H10KH(eTqYXMT4%+=#0}f;W(nlw7O7i%Ra6KXRjkBhFT#H_^t7Zh+!fvJ{ z0m=l?7FuonQsgi7F9%-@Tn|Y78^L4J7jF;>5)W#K`R-c4`_2Aqmmm2{eeD61AIJct zekbsl^zAhUlgCH4Q0THy{H@S0MgCI%3h*_+4S>|Y2|Ol!aZ~e9@*`aGO3HV3`H{cW zH<~k)G$0$0`dz_e(sz$egF+D01ZKLLfR%5n?PDQyWPf-acq4EtAbo5Bw|qqF58Zd5 z`pKmQ*;U5{8X|VRI|EQKsSxNDaX$59J}pM<4LPz%hXI zF#`Mue8{B^AwK4J@X>DjsE3Y>#{=Mx0Z#$a$Ftx^;3KdUBE-nTP$Nx0ig={#bbK5O zJ|371NFUR{kHCj(sYHmAbAz1}|0H}gLPy5qY4BHoe*@CT+u%pw!?lDW#K+=bAIi_d zhwov>$BE!`fYSi!<1Fwa@Znxs5n`kw$Vjv8V;gj2JYENXANUxMK0X6K0v~~!MIk2e zYMqchkHCk#xfWvLf?yNKxav0%kG;^5=lLJN z4+4J!(uca+_7QEoAAEjw4f})6^UFie^Mwb5k7DRZAGP3@0V@IN;~H=)9?^URR#ZeD zY&^*v7wxuwEAp4^;sCh%D6V?|shx9xb%aTbcEDM3k$B2rr$*zN}wZsTn@e( zxE_!`Hh>?#5BHLf?5g7fW1f5P^eUbRRFp%Abs=zKYSm7 zsZr~SEXc=m!9J8fgpY;Lk?mqV_-())fb?+>xaA|3b|IG4)|5xN9(m2xK3Z%a?a+}v zGX90}AJ7YsKKg;jr4(@vd;70FXY0g2&{;z2YOXlW#jX`AhhygO2oZC-{TFE; zZw1~4r2c#0mVUJJm=pgnx6s4{&TK0hFEFJOpzLx*1JCW*e)3x!KPQ8i0rLUr=Uni^ z_Y*jeIO81}W&{j%>0qcy7xCE*JsF?R!G8dL2Be<@;D_(WJ;`A;mLNCXTyCm7!iWE9 z$44djMZjf%^l=6F;rr-#Yc8awd@d_i{(eLFX@#DQ%P*w;4Ay%B(oY=t;ro%d?m}Gj z3Uz^bM^pGHfsXXC0{l8)9Uy&d06%;mLAUlo%=8H|(`NfBUk6Sp*8W_o zmrh1EKFjLG@w!tDz@A|_;?Zf!uh=W}+mOH1*Pg>1IFJlT{WNe&q5XK|@-M0gya6`7 zcnt1&ZZc0*v{M!3Sgo^jzq8raFGc=Re+Bq8z;%GsZvdwhYx#rJM_cM8idI7Eok%?; zUX*(u@|C&=N$+_a2Y}Qy!70UFZda-2TDq4i+NIFN@;XovRd-UR;$_zaM7 z{R*5?XuXCE3-kNSHz)^<%Yv@)$2eElIIfaJTnqO)m}D2f!>kkL0YnwR z3A2$oXUx(R5!VLfFUxyB_+!9RfYg5$oKmdy8&JQIquX3Coi2MetEg9%9IWMd*|S(M zktXz0UUu{gz{djP0jWO;oKk4{I~-pm>^iov|5+XTfn&wN2|r+A$VT%Arc45q^R$b| zLA$Nrfc$0o9|M0Hcpi}Yd%?r$M~=U20AimLI>3Uu?qlr(%*qwzN*8hH^orxd4?YDb z2BeSK;FMymhcGV2p+fpv6;h8T0pLtVow%rv4B?{*Ix-$Fg0}*10n*32;FLn^BXT@~ zHX`g04tXZ4v-N$iI{FjAX96b!QvXzNO0k~DJE;4MaVFEOGg+mgRZ@>fr}K7OzY+P% z^Vk#MEx>cOW=#D|kYI2>b0YegluQw4(#z?v+vVeJx=fleJC~}3QV}P$#TE$lsg~%Xka)XeT)F76l?u< zaFOmm4Hax!6?}=JT|yN+!5OcWW{LRMK}Xi}UEucs_u1Mp)pM|La7EAVqSVc7E(Zh+L!0jCsee-;RXOMR%NK3&nKle%>|qWH5#{VpU;|t93;KVC6MyUu&hbtME|;9ogPDfZq(T-h+jM+xtam z@3zi9R}ReWW85_pARgxwPULHVBz3uU*%MLtF5;i zdCPKt1^x~2y-P1@y@%?Bt@Z|4?Ml0?TeQ#7oeO?0Pyxt#KOdaZ5!Ab@hw0eA`Ex{^ zcO!pU?oYtK1^x#}{a?T-9d>=Y)F)x!)_W{nG0LX5M9Z)*Pg-ps{`VXo3&1OY8bJD3 z22LsVIJh^MP{#N-?#2mvC^SUvD*fzpb+kdCKy> z1^zDZAD2$l_8z1Ywy|%d#$Iac`TpbRO#+_|%m!q9OTa0`Ucc@Q`wmgTR<8JxC*r#e zIVmMo<8!uob-(6Ek7EO0ka5-LLh5i|o>B)bm*DfPNG844|IH zKG;^i&AmkYQ$BL)c_{dBU?e~(#(H*&A6(COP(8QWI?Iu#EbpD*+kovZofzubtrNDM z??pYg+j{LTz0MzF{WH)Dkn!ycPU*1g*>&FNc-B%Be{T`jD&#NAdlUFp;BG+b{}Y^2 z?8mWHe3$y6&RU4O?c)G+q>tP-?DYT)1f-9_;FMyIL(m4=Q5$?!9}$l_=tv)TgYN(y z0i=(Afm4dLy@$HUE~xQcUeV zNI1B`-;V}gYU?aSp0d0fz;6a_b?HQH?;$#28~o0|a80SRb@#h;Q$NKTK%fU82T`XwNWs2Eye4^1piKi8L$Qlf%!InzTN(zBg=mi`0cFAYPAS&*AGAF%xhTDc z7C4nz6}}qln*cbeV;HC(g;QB^KjEVtI&z$z`58O`-2h54*0-zp!S%fh^<8D_lu+Kt zljeP{0>1{h&ZQGWeFy1;t?$R3`fjjw_qlZc2KRi9d;frpb22!k*z23tq_`)W!cVUH z`-}LNAb(lzOTg=a)qvDr3r;E4<2qP9-G6FeQdQpnJ;9n(ZL#%Rk-x0ppTK_w4%(VA z)vrr1xOVr@=}T#|b&9@l$~g~w0dO8biFBgYZ;(#d+I_{U-J?WYn_YVQz&{2)17uvk z1gCVk_3E5J!msHlwe|DAbjo`Y_zYkUK#9tGc=Z`j?T3r3eu~ylX|Qz~T{=&JzW}@f z$a1!VQ;NNuG{NC+zjuh_21tS2AYzUm46vaPK_-KNTY|qbv?*U%2wPR|}F5%$z{D#$@OKlx_h%i|8H>5H<X^^1|etkog)yS>ETt_X4lDbfVUCuuj-orftOiww~GUl&b)I2yhG#bGdM%aCsTlK7~Cc{}pJ+ zrMBL3cDOhW6USeZvYtD&6i_L|Iwly)j>y={~qw2z@vcl@dP-fSjU%PTpV)B&o@-~P=0jk zy)SrwU=TnlruG~n9NeU@!rEDp{I*^d@|NXp0>2%&+ocz^-aF`pt@qW~g4;@^wr;yi zx7$w{N>89KAmiO1oKo!dK6Oz|XvIh9!zkZ2+sAU~$ntLmzYlm2kUn;TQ;N0T!@2OE z61YgdNYO5$^VT@I@~Cu}sP_ZVk>fPq&xi-m7oZeVy@v`1SNs}T@pZP|LgX#WeKYtb zpvk2dwcb1Gg{}DYcEvZ@y8B(aS-)f`-GN*{#=93drP%9TOvHs8^5GXRBj1!`M7*n@ zBg?-D{BB@7Abm80Q;PNc71l+xMa;;*+4ge)db0lWe#LqqpdUafruy$_Ah-o=5G|n9 z)?0|YW%+Lb-wbSZ=|!#oaC%`|z$U8&wA;G-UAig1VGkUj8zAHE1E&;w{kvc6X?6DD zC&a8=aUD9`u7Bvr@^1j&0^9{iANPV&iuJe;agpv{fMY&kEZwxe9%mf@NBt?{9vXZsP!GJ6Sk)BKuy=# zdaW+K-%00p?E4SM_!{7pVz1}p=FTmzabI@_EuRhyP>&UHEk^#byvx8>09OH0{~B;g zvDR+~b^kO}uvjlFpO6@aPQA+3-;4ZZy?zJY4*YCu##FCCg25Gg7b>>F)+s#bl=Cd` zGN2rwL^@IHHAE+D#cr2pZ}eBTZnI1GJ@7W*3qZ#AYj8@j*YCLM^0Hd_!b6ykwBo|b zRw*7K>bd9-r~GGwp9@q1(nk$ArC9s%P#4i|$ooeMAG@I=>-$6SHsEtxJEr;$5)Q8K z`%&MewvO*lr@SYD&j98Clwzvy5S_5~z0;}hI$O8NrTY^2zk#;_8RvcAln%eXotX~* zY-{1JTz;Q}F?!&6x^~+~{{K1UF9tsyC`z$wKZkI)zUS%*OQhx?GPf3)5H|8jhs1HJ?} zACNw3!70TWk8my`JQ`u;+id&T4ISD3+rU2qzOuDrYX70a!H2*uF?vCNX6xnu?Uege z@H2o?fKp7yK}Wr?hr;9bq0nyYZgc6r0sbEFAt2-322LsVdLNI+?W!v;j549@A0z5J zU&#!#yJGNDfYSk~e-=2USo^y$>R~688*Ke1vw&UaPI!;L?2x`~~0@K*qThoKo!d9OlK8D8ixd z)?*)%v7+96+=;_9@Kb@a0O{u(a7wY(djvP78|kinxpmim3+~zjm@T=U?%EevJz$Gp z_}KD#Lz}JFNp;FU6?{4{3!oHJI|!>6wlTb7HHPCv zIU8NN&w{@Oya~v-?*pe4+73EAhq$C{@%+l_CFS#`VH8`opxpILVs_P}z&(Wd!0CYWaW;53ACaHGJ7?*FSqm$xYp0Y~SClWdZmS`bp`$K5 z)NW0c6(4WcJ9OlE?``ll;0r+d_!^v2tnDzoi|o=GG{f0eGyEDSVSobC6FY3%3ts)> zgr6ea@iQNMDR2=W{agl4DQf+MG2*VG26m3Mx%&xg;b5crB2!v9z9^^I`{ksJ7k>6a zPsZmr@V@}=as24u;rtx3o?KNVA4!ii!BJ=XD29&oaS3=ma2+7yay>Yu!>Fe)F0xB! zpq{2$^@QDnG}=MvVpNm$0wybe{|O>4ZP1f`l8j8HGtdK&etLpailv@HjkxQnsv>YG zz0H(2IKC)zoo%rd-vr^O3VPDd4d5Gr&4Bc?1w5Re$n|tyjdf$#I))-|OwnZPwh}hx6l?vs)yD;Hom_8EJscajb>g3Bmmm2{{ng+%05<_re+VCoQujyj{{!%joq(VmzzB{NMvVAw(x`m03?it{7fdzonJr|r(?DczYO=X39ago*1!_>5ut&%d$EQ;Izf^YN-v`vnWZ_s@ck z^mbW(`f;T9JexKb5_>!?z{_at8KJ6^MEr}A9sRq& z?*n!KQhygXr9+e-m)}e0*82Y8o8ViD6IxYm^+;bx-&av-z2vW|5xetG} zsA55f-z=}L9=Fgp7w_L0HPDA|Dyw~TW(-|J6WFE9H(iti8$bl&xEOpHa4{guQ3p;b z;&Jrw3LmY|kv zUo;}$X4^*zbmVn<9r(3C10a3e2yXd^wtr<9ANGrIMg>OPw=?AfjxWl(z}}UmvqU`F zpd;g9q-QEgKpG%@WP(#VRJ#})+AiFkMe&)|&{J&1c0yq2*=FmPB7doWCHVEg20-d> z1g8}7_&WVi>e*G7v%na12aXItSt!S#lyB2)5r_TIkv>u~GL>wgDaPLc2;2rp{oBDQ9U=~gQqQhh=L7V>XAwA((~p(A}{XX08A z$OEL0-r$rD6^G%69|ooBWD$oduYh(n95za05X{aeBB0qzH+{tj?Tk>hYE_2_YEC=qc`vK=4! z;03_Zfb?+;IHg0yVaTBl(e&^gM9Qf`zYh7!INSxk19$|G`u_r_6gduuRF4{nHrt2U z$?;JDehe@IkUmC(Q#xcEj-Wl1o+jc@kNjmE?gM`mcoLBM&wx`pL>vyG9yJU~;pxJM z*%{|c=+N_8dEmW)egGw!@68B#4?FGrT`<4mf%vw;$T z62&X@{ik8{>~{xwA?H;-64NJ2tDS$NEB{^Kj{;8|UjFWP#tM=Bwg~*S**a!dCvHCQ zLSPsm+n*ntQoa4YbNQaMaOGLLght*?YzyAG%$nGg+aR~uT*H-Bcs*hwf5&=F+lNf+ zi(M4j&#>FSoj=vvP2gLBy8x+wul;jbZ}KysZ@&pKJ*8_hOX-ztLh*EE9Y0-B2ID45 z;C^=TnL_V?oge9Cb;BGW&>N6?`QVhKj{FQBCl<_KT2sEXcG2QN9psxJKfqCMwsotJ zuWX;I!8ZY00IB;TIHl)8_G1p!tr=8NIj>yq?pXCO$1tcXP+I9#wwiCM%Aaa3-nr@J zgRTDt@=-iP>t-aOExSPP7vILU6Ioz|RKwXKKApN}D*5n1@fitzDsUDceZBxrX=S5$ zPiU|IgnM6T!TcI@4719sFDR$YAn6lLBd0}eR-aN?i@HOzJ{DSEx9U&frPy1|o0F6^ zo{4;nHe`Y^Zn#;5H@R+Q=84|!y1|EQCSS}adWLd6sf&4RcA}Qx>7y5T64D0crg;+e zYZ;?=uXo`lyOZhZ_-&KvUFUmrJt@tM*L9zo#mx*e-5jq^wkFG$YqR-ro;8f;@Kdl8 z@V4(~lp&@$+? z@-wv2v^7RBt>_&o%OT^1jJQ2|7=SPh6nyw~k_&1iQp6*G}2PAjRO3Bodv#4BWX#?0a?IfPBujUDT^c>!oE#MRIveEG@ zi&|~Nd7|7cD3@%f`@w$){sLsVkMW6e*N+zEHAlr(Zs)~e?d&T417q!M7e46V`bbj_ z7`Z6oblwMrOyD^QI$B+Jd{TlDZxzmr!?n4}yHK<9c=faJIUvzT#VXQXVxHbCfzM@w zv@`Uf@-@Ut`w~%}2KbfZfTzJ<23i4Gp7+2hO+6^iW1oL3K0EdgbO}2T>$>L8r8m)! zudb{*ekoo>Kg*gwp$@u@-ONA6n`^h4|Kj+P%NwiacF17QM zz!wAO1Jc(Ha7y*F>^K)kkMlfuqULUO34D|K6lX2`U1ojU%&m`ZPg$+(Z9}=&9FAjj zIPb5;Wo4pO#ov)d#acH;6DPt0n(?^Q~2C&pSRcB^9>!_%aTPkHJDiw27{W(8oQY^ zb7e(bF2B-hCg*C8(|NpQsqirgI_WsYL;Wht zw0?+J(=wsI9Qn(5-2r|-@DL#N9|xzj{?lmsiz^q1uO;<34Wv<9=p+e1i{)*()i^&v8SvJpMPmrf3vXH4nD0Pz|ln#^-n^xR!}m zR>zrnsYY5Mu!9*1afUZe%fmkx0y~&lm}z9~V4l8Rjc)yc)r`*D-!g3j#|yHx`?$K2 zdG6=DiSstbx3feMkmfoOk4}9ul}UCy#)20Ea{w8SE#Q=DFSgsW{n@d7U;=N^{6%xi zY8O>jI5EkoQ{UG9=B!TrLj4;XVsAA+HUC&6lJ_O)pG+nxXwlw z4c8()@Ht-7vlH-=@i?srrJk6C(+h$y-lJz5X*!smiNcJ)faVR(=c-lStGIeG&!bU; z;=9sr|M2g__f+3$eK7|F^aW)3CW2EM-!9tUb3aGw-_VDbEulUfFGT-N9HJ9xvBp;O z9j<)f&BeX~xqL9Lpb~io^WqKU`FNQ)T~Tp5$&A*1WW0OebfeT=CHyr)UmhQCf`15n z3P^wd1*as>gUT1yGxDBtl{0lpl#1d#r&0*}=n?r$Q3CzUV5&DNN#T@~NKT1&m~)e2oX z4*Uz;?1y{(fb^9KPHCup9*EqpEi9{;x468zxU6E)-1F>d@Ii7J46g33w0oAjnX(Cf zE*5=UAG>3zx<>dZg`OOrtpUFo*bGQN+rcTlWzQ?f>&lMDQ6xXsYi~3p(53dD-ybmph62*pC~!)9L*_do`kGx{ zy<|}ZR?>?b27yRn2!HxzCTv}x?2YfvXVRtUROgDc&h}FWJ=xxy!5;!1u|3c{LSe|f z#o_p{B18wIS9wQ{bQ)}3_K@iBzg1_`kCcw};9T!o*K_C?^IAN2c%SmH7SI2f_3@f!eSDAa zsKH*IuB=QL!WZz)TIL(f_ad9`>CJQ0GS5JLq?zUEj!|wR20EG+=QCHcPFJ&|(^9?H zvLe0EyTDwi7wCn(wFT#yi~I4EKK*ZC=6c5YP*dkw@p|uqKAE`_@_NL@J;01+*4@jG z%39hTXO;dKDP?K;(W%-nEgKhO3Cv8MsP#%3o;orki=WQ3`tc;a7slKzOnsE`$C&;U zGvl&~&B>X14_vJ2`Z%w-hv{#NvGp9hB4iq$rw!##W6df~Vw+e>p7tW+moq+J8>)@d zNAh!dDj%0ToM$B;&v!6B1;00#_vceHk7gxmmu^`(bbe}EFWNyP;w{G`&w~G2kg5C$ z$ojZpn5d7HxuPCs&yHRnqJ=sOzVq6WU*#Vsv$o{by7jSHvp();*2l}@XIF|3`yc09 zKU!*i-6?+WWb2!m*4N$QpMDkjoooGDj`j5g@sm>Po4Zu&V~6-R@e4s2%(H%exA?X5 zt#8%~A0kij%i`-^@q^1nW(UOIxTVFf{h#~q-IBkEAG|I8e!H+P{$_xsEchPrYwpt8 zWqMQmrTZthx?KqW2gToa%otapR0pES;>S0NKX?Dr%R*$6_z=JLd`ICcL>0P=|E2h? zdxVTA`4UU=sg6bZO8k@i?}Zlrj=IpDbxdhY8p3DqGmLkQ;nvqe>uXobyCwemZ5Km&a&I7gQHU6`%=psq;X8PjO^32XDtV<7LR1f;=t=xE*kKmaZxzj}sym)brk(XuV ze0=I?T%&vZhJn zTEeTk@tW?>PIy>1cIp17bX)r)e$+wD_(dC$l$vO!jS?O+XL4Qjr0Ma#uejStAYjeB z`si-(yz4z8s&~^r zSZyU0fAWdP_|)V7uU%7ptg;6rHyJrtqnc!wZu4IT*4OB*sA*f zsgla=%+*2~nQ;vhC37{!7d*yZkKbt~PkD?Md~aN*^VPckh+ViOxcM(khP2}^RO3t4 z|AXBy!nV~>-Pak$T4O}QWLdZA)4aOjn?ixUE?i;WRE@V}VV+fu=T!fzvgQ4S`AYNy zp1fC>@d68Kf~g6=>Ba%wf4S{AY*T#8`g`L?W_-u`xEpYM!n?Y$PxpVKldabgUylck z3YMqwd^%z;XT}QVzt(Q&6pnv)49DN9QK$K@v1?E`2sDUim@y&ipUitd)1K3fr}Yth zW&dz*zt5}cO3#E4ChkAKazB|j z3ES^eua2(c)hlbEs8VskhfM2fb0D8-n|kaPZr#EQw^MyI_gR^>mi0$#D4!Z|+O=mQ zHKGBst~9H9s3kv&N*>YYyvMA+vckVpi#NYT#qodRvAz}=J)tcuww4sGl#jM)_VFyY z$J+C-MtHIDC5s)(Gcq@_c6*qylwHe=;nu>~jLezAdzemtxryO!ReQF%+Ad5U7*~qX z$W#n?4l`KG&j;vLeE4`ifv?bqdNwgkq%%g{$;Ni!-N*fz^%}&NarE#j(Vu1v_=0us zZ}@vG%Gt&H58}g&jKyWeXUBEtr}6o?-#BBz6@0=tzQ`!x8Pm(A{J?_ac)fVux$m)M zS28XiUiKcpurJRyvbg^;R`9#NY`B$c_|KoY?jY|xh_B*vdB&aW0e&r;fF;ioVtNy+ zXPX%aZDCil4NS1Vntg(C)gV5D_&&zU9%dC@=l{KrJ;7_(>FByZ_FlGVH(PiQyO$qg zOAY_aY|&x1@XxHY4vz_8P}c25c9=aOpZPSa#eUs5WabJ%`$JawSN41M9-Hhg}fX11E9ur&p@U$VXho! z2VXt;yk4!V(msW}UyD{Ds@U6%+{Dfl8z*mb?O1XapX2e{r}NI%aE~36PE(GvjG0Cm z>)W*OQ1y=F7Z~i$hekr42uuSMzj=@;srA$^o%!L3^MJC|>lT-nEyIkE=JaDr)-J|2 zp}YEC$3Ak_8ZP77?I~F>Gu7dR#+_n&wEA7irw00h&`0ysCm_EF{25Su-iAy`&CgCg ze}+>ed=+7#q{2d+w9UYo-yQb(+K!Y=?(_84JCKKGe`C1g=ovU7^#_Nz>!ed4mjbH* zrThuwIQL%M5-WW*@5}sYL*4a>0?31b;eg8DSjd#NIqSeDx38N&_m*BNd1sF{Y#rbS zm|U&{VEXIqOb0)Ze5#>Ot(Vk6J_Ni1C_ZmN{@?hFUA%TN)dF{2Vq@xwd}+evix5zJ%*`Sqj?C;5~SX2XC^gTWBCvA3N>;G}qn}AkPHm0V;pzLZ&a($Qn5rlF@^`? zX=$Jr{;+`mfypkr@e|3f4*J!4(LW%62mA+6{Hzg@Uws?ur+BaAEkAGd(mqrt3(rA! z8ILP?#5R0A#w7XZhXQ(l`s*>+1MY@?s`~GePZ9Jf|E3EdUkls_C_c|arc}OC)`JdD zp1MAWb)+UfovMtN^y50KGH&I^MGv{rqkR)Q(MZFVvcH#=J+=c5t!A4!XBh3#1t#-A zcGvD!m;SsR-tB`uX#vxl?K69T`%ELmZ)2VyPZ9qvGv=R+cNMz?@SFYIDgTjf`A>v= zHn0p(`MDV~rP8ZqJ~n;Omi+XEeLL40i}o3;*7%!8e5CF(sM|koX?x@P^1P1m{(v{# zn9j=#(`#oA!&J)8tGE&Gsi4tQz-#L^vxxNwjsaB{J`$sxURYUrl<_C&`x1Qb%&qqL z7f3Z<$b21hcvC+TC`2BC-hj&22*{L_-;eq{vE4eJKdFTsQB7(Xex#1{X}fGhF)rW< zESbk@hp~7005A9>Pk4YQ{}I2?27?||AFbw}lFvrsfbYcT8OR5L!+_%R8e~dcPyHSm zKTEVNr@d9c@kTX0@%!G($vrCx$GK<#P^xY9lxo^!18+`xe&9>VCvBA5t_mTa4om?Q zpCZVVn)}h8^c)+xxQL2O??e!gCo`~*3uomP?vJl?c+^0TYTpMTzX7}pC?4-argT!j z$P)`Jf<^I4oUFKv;b_GU@=!AX?M}v5h{C~h>;EO~ku%!mQ2}`!a3P?0TmqR=EB0vV zq{z%>Ctk=(&C5?5WRXXLcG&X1ara12(N~h+A?R0jiW>tN$OII>EXb5jdLHP1V^=&z z92p`jZa{$o+BsOi@@WkYzf$4^{Zzky5BV-&C!qM<3z<@L`<+;PIk^#@3gP>Ap+(pP z8V3)!-8TH+edGf_!#RUo`?a)FBlIX9DPv(HpfjL&bcfs$k5=oo;{rg&EEK~mQJLQa13pVb9DLt_d_eK&2boed<>3$rFNrEvL36Nimr_~0!?ajHTNZX6Jn)U=Q3XAU z$3DnU0M7u5$McY*<#B>1L^z|+tfsp01k?P0HX)2py~8Ik-sLk0@LYs6P2D@^R2YYR_IZ7c^dLz;B`RpcoQ7h!#mxA9*9>LRH9^)a;0Tu#^$61gmMORNGf$(CfV->;)Y8?4M ziK>zqSyg_JJoZ43vd5c{-v=51#p6@RE%9izT*6&5#4AbM;DSYdlnsEgIa8HQox`JG zg3Dt8w20`h-= zUjfC3Pi)yPCw3#^$Xk=AN_ZL7unOVGJ&qi?MH#h=EF)I9Ka4?fy)a2Bl$EypW>4+3Gp6)EI{$;2ANVD%IhR- z+?X6Y>=t5j{3Q8=pil9+8}eS@K|t|&1Tv-O_GziSS|SpDP*H{C*loYfv=ksLB1eP6 zN1N=H#|d={`2P<&QE7JQ<&PfL6p z3k`3w&`zdx0Gdv87W^Xl)Iy)K&&QCz1pW;uKHozYd`@|OASYLrSEQ%JNv+c{+&a+k ztK?HS)wR#LkS_)<0~DVtAqzfH+ouISEmb?RX!;X(#n4^R4}VWaPCph#G?+$*PYC)HpPi5&0R99h zK950eJD;!>%##yZ6i%p)N&9FsTz|oA$YX(tfa0?TGNoQIa$V=CpXIvhii&cq+2&PL zuE<}XU$OYSwWWRYMO32Ii_7zh7FVt*nOt%Kjj3wczu7*1GW5rkZ(lZ>%o-w@2`Gyu?_fui>N(3`N+v#Td}fa^`u$Tr}fAySsyB^6j>_T%@FBn zFmM5ojLS0ax2tvSDwf6DdE$8r_QxxXuHGBPM$TB{IgWQ+jVXDCz(e_GJ^=Xz;Lm{K z`7vZlTYr#tj{PPId*|c|a>B)UcG)VNADXjz70RG=aXE3PVyI@1O5fbh!iheKR$TA5 zZ{!H?mW6d-avJG@jpTNQ#XH2cqdmJ`dNAfS2<<{TjkS_=)-%RIXe@yldD_Y_{SQpm>VVz;QkEV1qJ zV<348UC*p**>L%*4sj`lZNrP!N-^T}3>v5Ct8bqIz7*at-b|~fH7SmJI^lB) zK2Z?*v^e;3cSeKGo@`C)Z0bJGEUd-mdSmoT{@*6EoUgH_nPS3~2Y;Ih5#CJZq!b>9GktLrtttKC zni9w3IuVapDRXnOHK{*KBd$|o8MIHdCX5u!JD7dV(J?!?7w13qzScOyjOnX)iA(Ur z!DAr<&h-VrSutkE0FDj%69buWgGme|z}JMq0R|`6((o%!$FxAI=@r|^6~+iY(SHRq z=JB5J7wL;-=UJ$?o}Tc5*~W}>v2cAW_m%KYiC3`Xo-70ZE%5bE8kKSnv)^SgpYz1$ z80*3Y>9~#fTEB%9Ak+$ldr<(i2f-f$DQ0aX2+4w=$Z|0nyESZ6)C)%rW80`cb7uN_lfCL?j7RX&S- ze&jAFes&N)uam#>QsdlfKdNgJ;LqU8#s&!-(!7cA`frz*V`iC|akJ8`_Lk3tA+t=& zpzaZ?g|9Mp9{!(B3T4Xt)PQdgzoYi}I^++5PXLvluOU-X=M-xHBl8taer8uLUX2xr zN;<3#w}ESf+dw+p2KK_U6(`(yHcltbHZsUtxW6%pk3e5o*irH-nD6%ED6}uJo(VR(Ytc3~`3~oOm(>LJi%3gKC;KfR|C}1Ukw54_@HD2UbE}1FQ#>{)-_~ zYCf(C8)vslrRl{>Wg~Ca-P6*#OufVB5cH{W)qfy+7UKLXp!mc?rgYNrZuD%5uc!5y z&9pwV$9^8`Gk{jdq(^%&OWJ2X^eH}9L%tE%3@AQZAyfLT_EE2rR5(XsYjTh6UhW)H zYgY99Mu*Q)=u>=>&%hWM$OaUjo{%Y>bRDEs`!umBet~TBthCL&SXTtJuNh8WUMkym zO&4jO_0XsKsfQpx4Lk=ZJ_jLFdf3^=SL+U~(#Xk;Y)Obk5!RGaLsOmU^#e^cX{QR9 zRNPha3M_K%lnpr#=nE)b10YjsEe=S(f-^CD!dXhxT^TcL4;*bGLvuDb`l|3eRW4f~ z*8ukbO5c5uDV?<5o)NCi4dJ(^SxC<6ZZdz3c%HI*>Y1nmKrcY)>jRlmPL3Sk97&g- zE!Z8~d22D!U%ZNhxr@usa}I$$AP1VcbO@~0{)uUSW%!}ZHq!ZGBbmj@^Q+w@pDO56 ztf)@20)o_lZp>D0cn`xh5sCyAr z!wZ^@o#6g+$-_P?Su2Dd>QDPY9t%ta6pzm#Q~G(Aw8!4RoZK!sxp-kNFT-JLqB92j zouC9Zo$B=$eXr}RUVqJa9WT9F`{{V?SC)^FK^MC}pTP{A^GMJQILHp*894knj9Iv8 zF@swSZdryOr~d|X8k!&uiGhD%S+?J_G3Lv_DL_A*#s}!!?txQwDV{=}V)x@$u~aL~ zYvPjgY>|vx=`W#$$v1LOxH=z{n8)A<{xmJ&9*pD|os&k*8Y=IGovq!SbbjOV7p` zO8kQCTLbw);88%?*HP{+9VJxo3H1Ow;sa+UibE1tVezel|3Lo2s{cX zd;A2M(xEld4x3g-V-FQ%xCdpx4*dx@)qEB zK;?5MWJ-g3%lsV~8BIRjk!Tfr9>=Sz*j|RM##;L(L;Dp|!q0VT=DpAW3@jjIvvd^4 zEY_ap;X@>^W6-Pmoi0lt0|NlXYaV1u>)T5{XF|ONJ{+JPnOS3JsIIYr!js z-%vaH5b}SC=TevVWXP0CXG^|yH@C)nElo%fA_8Z&ODRH2Q{$=T*E13B;|)W6Y?a?i zZxl7@I$L{A&xdQ#l?*i>UV5lV$@tk+k@O@_rrFVllO8xukb|jZf|=#X&=bvGR+4TS zN$9^!k^eO6WTqRdd0#yrbHyUmsWZG=nZE}+4}D5ERH}ICkW@9&$v^TJME)rMA3^>W zI0mS4OIarKf5<5>6=$HO_eD-_WeMWOg^s=>c(!`a{|MP%g7q*!*=Y=9O0}2C`th^V@3y2D zCzG2RTzVCU_ZeeV{6{W6dK?$8*BdPDEu$+>NbH*s)6R#Z_c!u5E6^X+B8gknbHzr=I4F$=4wt>@#qTP}l-B-hCjCllWjzm(k{o`{Kt?Ww(J-c# zJ%n{rqV^U70bv*euT8O#mCG06yhD7`a;R2ty5w~PdV|nM?L=FVti=Kefa28?GNqrJ z`E9mpw|Ql2OUJEWTe+Ax6>XqZ&|&D?9{7{ZeWI+N6Ea)t#~iyUZm6W!%i4LdsH0af@o}E` zxk&tsKaMxVL-rOAW^P>(g2>{DIH};p0W(@GjOCNC#N~;d3Es>1yN3-i&3?2TOe0VUDd(+)??=9s1@!{T63^TA9nQE988jAE5XRgWP6*m<*H=yQG3%`K%x{-vY6-w5u@A9ZDYE zWAOqI&W3n!t;1s@^bE##s;_^5{1oskpm@9mnbMI2Sr1BcPhKA?n=QAdHsYkk*A&93 zk$){((Hn;L5QYgCW3|-ua^Lq{?@kqU12fLz&!cx@H#o;uw7_&}r<`-#`Z^o(`M|}1 z;`caYN}Dcs`2FtW{Ls$T%2Tr$Y6JV1{t?3gns;$J1RsON&n4n#hmTNx58K-WIbRgk^ia9&5X~^h&~7t;J4b2#CXc-mbjBOp57lT}mZC0u2=Y z{(65*5}sprGIhNe9`*BGz)N{7x?YiLXUcpBSGx712y!t{0;qgn1)0(WC$3LvYLxjN zvv~E=l5%I$lxlJvD}IKtI`$k2i!%BG*DlVoQ+$@U!0(GmrO_!`X%f7DaY8Z9?=urX zbqXKBSKwD!JY9|xwAqsP5%5y)4Wm3+O9s*b#d`u|N_(8~=F$F9^2S_uYQ-|}CeGFD zMLF4hOw2M-I=Z$C&5xoIC3<|GBuvbD!4DDA z5!2B>Vjha==p&4#qYvAgJlb8`EVR<0ndZQ=kO%P88@b5mN1-k_FzJT_yTiu zKi0{yG_R){iDderm=9KR1fX7`kMdZ&uh~l*tTDU7MiMQ80FBrBXEYa&wfV_ z@puFBC&0IW;*lDXJe7X+*%A-6>>cWek$xjZ(ky`w@x%6d{Vr}K=*h6gG@MD;#Mi&g zayPKqyvSEHK4Dz)cs@PZXT~IR^GcSyftfQ=qXzT0#N4ysOv$qtJXAk)4diNIGoX0h z3Yn6sSE?LaUng%`dZR)VUU0Q`q!(O`qrU;qSNg4U5&IoT1(f~_$duZ$?i;S%^?Ivq z$?HukK1dmLBWb$Lw{6ld%=A zqXT%<{swFFfOa*e(_-myl3~f-71OP=B`>YgwNDSo1wem5@frk~QX9)>-0EfG(u$Lo zPf@YdUxnwZ^0^oCL%?Hz(*Go6N^L5iFzu%*pTJ_t!(QX^$b&o(7zQXFBOz02qaDP+ z97b@qDQZvHrf6{VZ^ZMJ9ri+g95?_d{m((B)FwMLX%E|$sI^<#me8t~N;?GBx;#cg z9uG_g6p!hUDYelKYak@!V%14Q9n}TJM$5!Z3_IMF;J@7W5c)SOh zQk(2?0t@%RK&|~Im;lWV3UQk6P$acKHbM7r@tm;_)qHN+;bfY3T*f0*ln*#h6o(ds(f$AC>_ycj8SK>=iAS zb}3xv&a*?1F9NCn#b*O#N>TV7VSabQ3Qzcgl-j*|ly^nbMiw6{+49Jw4$CX@BQL&=DBrnW5D=I@v^Os`tVoe@xVT2uBuVs~DoV81=N$j^D z=NgV}#(Gxjw+fdhoVgytod}afrIJ^vqnF;-*FnAoxE)Zu?sERF-qY%{RbD3q-F^Z= zx1WoM`CaSiKZ@royCkninE~AZrN0McO3mwUtNLl9hoUvlQoDVrp&1xG& zamplA=GXyx_CpWZ;ZDdkz%EBOtpf%fzpqo}-`()Yn>_^w{+3sW%_e7MtAlpH?tpOX z9kgmk?@>nw=}ou*`3HIdD*uBZQ&M`>=gIOPre6)8iaKIF=yyOW)`aTpGB(UP{>sGc1ufUtFkYBuOUuZ8 zIL9=IHL!t+_yXge!TjVo`&+bb0K0?O6cKX*p>L(+7rfBrw+QkwpbSv_RzVKu*W&o? zlvIl@WkdFh#MJ_KJGNo4D z4{c^ud@HRr?W4{81NKo2t^iCJaWF*$^Aq~2S4n>JphsrmYDOZ*Y3wq!kR!>vZ#|01C&oS*MEM}zGdDuXSfv0W^ z1$i)So=DW@@j{*@I1yh0@l{9%(5LuZ2l)=522gw+hfK+E;@USJn@NAtTD4Qj zsxo1xI`#$^YlppQ>F}U^x32BSk|3f#$Mbc#0|IOKEX_l~`N8isW>m1=MsKnk%H=$1 zFT2Ve$MuFh1Q-D*e$yaR+T-|RH@*@Dzr{t_@#CVJCzp zs;H#iG_{_6hABK%_^Y}06Q~@-n44Q_JobW88!GE2!tVQRP-<_=v2-V1e#p>vLBF5-Q+x@2-SSugAL4)2 z!O0uG?)NeZZ-H2=>HJmZ8zq+XGg%Ip1}~C!Itu;DPQEL!9uA}fir+xUl-_d2pK717 zRXbrNk%$&vf}j^8MiR{rnf3~3=JD>#>%o?UnZ!(l{7%Q_lh}Tmi%4jhtU%gMD7;wm z+X(%tf4B$oqrj7Z;`blOl%nZJVZYf<4;p%fmh*6cm4$+MBOSE&8QNDM7zaNc^rJ>U z?2g%dl97y^pcq7zOtBJ;*cb~jXSmr5q+?U!JYMVpCz*+c)k8FdHMjtU_h#+j+JQTv zR8A;r8}TdJ;I`NEAYTkr0V*FGAyaC;U)_?OE6Y}tu7w})swpL_SFA0Csgpu8G3q&J zuhMp-+$Yk4=s2E5A2p8tdOTnC7vDktFK`@C`mHOY*I!<;{AB81X{KHaT&sXJG z3Hb_OBcSvjfJ`aMa-0GRV@t}*#Env+XQ><~09P?lm=EdNI|!QB4k5uj+(IyXj*z6H z81XVsMseCaC7~C3e-tDN+Vn!kVInk@&lx|T7oZST0oGSZ{(-Ap{soYy0y6={|4PVh z;6J8f)hfqlzM6f6I7h6S%@RM4$}bjqNglLc^k}~#Ckb%(qv|$^dl<;mT|aTCihMj? zVkxE-H&x%ukcH*uOkEIP$1mgj2gVY354M)m4Ku+FG9O34QVDP6WeT~h=5 zofz&-7eCJtKR=Yi!A|1K_43Oz@?)a--B|JSPWdbOB~AP){O3;jXZfogoHl0<+Ryv7 zSIjJX229~aH18rK0VB0J%o}e85WPFeY-bx@+*0BGm%=^VMySg62w~J79t9@eyKx-5 z4j512cLsW&Sg)NDW5r%#CD>jwmA8*erOqj_ef(VvyP|<~^R)K5{4aHyIWN_dI@6pp z$867H^qBa&8H~T2cDfETBgiK6=QvxA0FkqJC$k6Y{}Ou^&-0>Sl30-6!$mzBMuQ}+ zev>Sp;5BafjDS25mA?S6`ry$A_QX-45EHc(hME`JVPz&fqqAzIqX#)^86sx*5HAy1!F=z9-$s6VemS zBy5%O(^JgMdzp@#peWMdFn$NajY^m3b&Pf7Lp*a4h0?Fy8nAP<%-2TnR{7cu`H#SZ zfXdh7klSGA@nt3D!ULnQKlacL+SA4LVLjOJ@j~^jZ8td!}tNr1V^aCRQ(<{U1z=x_{ZV%rsKSqc(%=WZbe9-<(*A7@&JOi=s zQOL#^JJFMd9`_FBwUT3as-2>z!Z{nfbNNn&?s*oLW9CyS*8X1Fal$6oj%y%a3)~1O z{!c@u6iqvE$LVWTtN?lSw78f(7lXplfFH;fW5cW9^8@lJ=yOc?kjFFe=`qpw#4{Tg zk@47U9&g|@B)TOrn$AT}JXci0y3LZmeZ9-S8|1#gAVBe-2RT~)=!eIYE~XZRQ&qns z@7zT=RCUn)1-@%`mIqhY#OSejPx}$NI1U3tql0dyp=NXv_MOH1uw0(uG?BV3lHVTa zSMB2^$e#lL02IIY8zjH=Lu7j|?bB+zpLX7=C8Ev4Rcw=V6?;v7^gm9{jYE%%YVozH zy@I&k9dRd*(GfA0XThHXv4j)t4sjNbGfl(vr5l{a-Ua+}hKX+{j1&=97=m6Q91Lo= zO8%wbr}*Clc?WPWp!mNDnUb3SMm7Fkvvl$5rktdPUZ%0GA9zF#j~+C%FYPR&i>HA3 z?asWw)63Vz=z=)}>OxW%-o<0ab%rZV0f(1RJn}G-7sIRjOk)(*@x@C3d>U_;{Bv$} z`HzP@3z!cm{_7!Ail%;}e#|(pVy$q&Y+gZjc-vM%8t;(&4ne=N?>`_P1AYM%zxLH_ z;x}{g`Arn7*$OdYTSx~<4%(kG?J#cA@?&~~bD%M%jcX~}q4vi4`BZXA>W3G^I;Zwx zpLv^8{?M=ZZGwC&a0j6H?SxFJ`F*i1^>1ZsMwN$37o+4$D$ArFM;_j$o#DrE&|ax+ z@MZGT<Y*qLv}&*Xb)}*uLQ%-kvp-DF-ynYsd={ps`F+AI*)u11O4*vV zq^(EZ+R75Dm+{C`y!I4}7n#D3Do0$g{I`ilw&U(?Q^txL} zjqEVI6ydCx`ZXHiA^Qp)YwYlEL$#WV`v6U>WNl>h3hl*jq7ikWSQH6tm*raz{mSk? zL5}%7z5|M1Kgg7hIsK&FNb|v26oK!F<-v-l}+EJ{I!>tV?5F9VCv<64Nz1h`Y0C^}d5>Wal zKn~Zh{J&b(KO4&rvOc-xT7w&D=~lo)(Ux0T2#VhR= z$*XjV^S(d5HC{z!A?IS-$d z>_8(qfhRWo&Pt07S_AcX+m|#j){e(#9R5G@+C6b3rqrB|BXhX5aJo4}z6uKNmH8?K zZ&kiGK)wms;^Zaz@^$kQQNCZf`3KH zET}(d(0BVj(piJPkAH+4oDbPmaoTru`LCUbv9yN;;9K90kA>Ihdsv5wnZ{B*wn^7C zn>-oc@sIc{eCA+Wh@cfa7*E4uO$Xi;`>{pn?R2xN=uG0#nJmWdChI9Sd{0@I7}2X> zdUc`k7`Lb4zTmEA21~c|V&?h(#5|igE^6ozljiBda_K@uk?Q^^%i$REt?F0Dt?&f^ zdH~8UeIQecuD@~1-@7KL9G<4@0K3F-_LPjm|l)miyUoy{gB-i9oS9H3*AShwN=!JB*zFTlBSq5M<~w zI$Ng>r$SM!ED!s3msdZ?V}Xf);&mBhN}GR~Nx#z8I`NQN=0(eXxIVF2f#AjYo_ujW zgBK^Ud(P0l)ANl~++D24=W?&#XT_lWMZ2 zlq8`XvAcCP58;~fnR>sb;igvfkjzg#_^NXK59FVT{~c{D*NA*X6zpb07HqMjZvvjJ z%Jp2xmjhP=%6@wwQ(EubzkS5K8kP0ZHNg8bOR_+y^m&nJ}1{*K5~j0eyJ4{x2PQo zx1IKe;pZOlNKJc0>J34M(z_k<{lEi&veQ$LDJ}X`)-&Y?(6XIc&_7!aV3Xk1%?i>n zB{+mBK?9cSJ7O__&f;O{Gv9R!2sym8J6&FRkoy1w080OZJ(Ocq8fc_xUmBEkk*XcN z>!Cx{(_N771^y7GH@fjob2~&-)$gdP);Rha@oZ)P4tK#f1n3PY`wxUn=~$z*f4y_> zZFKfmeNgdsc`A$A`1jbk$I|{`(F2V!F5x|C>|67wtPfSh0s6@Q;XcTZ0|x-b=OxIL z4t0_Jp*r`}G9M~@avwN9eBrB(y@?|=I9b#G88HI8k87K;UjM5gG{wl{m!e0MQ5mov z`IzLDw%xVUSje-11%Tpp0c1*Qo>TvCX|I-fDLTzML~Qr&lOEf%$z%JFeGk{RnOR0V zox_nQhy%7+Gz7ES#iokkRy=ucU*uWCdb=Io}DL|8_V={~n9v8BvQK zHbsXQaP$qXaqY7N@)}@0pzL!QWJ=MEn~JD`L^IFN$sJqaOk*79IU<2R6cxD9(KGmN*A8bx zUIHu!D3PA#_tv&tKbrJ34bM}cDMdSKridrOzx7F(uRVCS%Gaxq>w&kz^hMWSH0g^d z;zks4(9x5&!_C)ekS73B0adD@Wz&l&$88>zqoYUL>E<^ZaxRbuP>Q}BoAfj* z$6cPLa(qgbV+hYy`Pu?`E3hq0Uv%Zzq%Wcz_j*u{j-CcQQ}y@eF6ac30acD2AybO3 z9GmpDT#gSR2wwAYba<3PkLu@dfP5FQ6Hq+%LZ(#e>{lIi)@NF7FHQZt+ULRP$!}#R zKTLM=^;~-mY_O+?F0)*9^6vSUf&;P~w0m6p^nlzC7z`+0MUW|}d60@1*D^0b=fqAP z=L^Nc$Gc2>$0NFTpN{Z-1F@XtW9>Ytw3>x+Il0sXo{_w&p;y(9#~?oe9B{Z$eT=St zgz<@}AxBX|WC}X^?A@*%@*x)j;{aucX^<&J*Pn;!RW+rh&ipHs&`CP;#yV+-8t7H^ z_aNkVfe!%1>%WjGr8(!JkEOIWf5)~=*=kunqn3$7lZ}WhAXXb6!=fW~N7otJE!a%z z=E=sja1&8J*ve;Hn4S!e$ljK?NBvFa>CTq05%_Z_Dmsy#mwb!vb@^TZ`3hhop!n{B zOewnh6vnryN5P=s2`=l?2k<-q*DRihNt4MZ8@X>=b?q>W@@CT@;d$msMl_jro;+{UFhL6)l=e6V{fb}kKFt4tY=9EkBf5Fe=!y#G z1=CbaLr|B7XkS`!*zrZ@U+d^A#j}ai|5nH!0-pei&w)QkKI!+PBr>l`gWbw=qtp}p5o`VTztI4 z#K-lf__$pDyEo;>ukaGWbQC1{{321<+?faxdNL z;A@xFE+4T7hH`IW0)Cs&*GA~nfQRe7Ze&(9yP5T|@#~acX3q>`Fv7q3Iu&}z^)A-7 zm)gs6xWNn~2AgQ!6~0na&tB?V76VrS1KvYs!hi}ZbO+1!;;Vpdw#TPoW_0Ez0$e1= zc@0!^ehyX|i{Q@UP4Fe=16V+bUjrp(qMq;^!yo3Ey|Pofo1FqUc^{-V;!yrahV@x~ zH|JCJo4DsFGw;-G+&z1PZY=Ta)4d~|0d?IQvfP4u-Fh?$@>F03Kq>lmB8#cn3sTOF zfA&%})fyaq)p)jQC;K5k2|N>~FS>RTt}mjcZ16c9RimTN{-c|}0?5OFLO|8a*^ntk z*KddGRV}3`1UKWX=~TP^#I$RDZnzk%*{VP>=VIa~-YB(iO1p1`Ue$h|gZv`!XNODl zc9*?Ui*|p=C+uGD=(8Vi?Op)6A20}@MEat$d$_&`yFa1q-r(q~!n0NW_CVebJPjzj zAB0TlShnm3_B-nUEswv#^(wp9uurk?gjl^Zwu=}1yIiY-@%M_6;R<6X^Q0p_nhGIQ z__nlrV4urt5agl22!ImVA-Z{8$q8$qa$fg|Pt6C49eq`JwyN*=+V#50w>lWVaT0(1kEz4IVbitc^Tq)!<;a$eU6J2#sT6ujfS2cSpg_ZG;v z0e3pO$-dFe&r8bJIQv==6T6$$DR)gPbo4dg*(%@mgV+}a;sHu+D9t5eCShrE{A*@a2KHXya}07nlstchVe0p81#=J>b05 z4=0=wfQlp!_s5!ExJ~;kyc8$Wjsl{T?_vmFxq!9LlqRf@`Pl1xw%pH8TrTT^s+~3LL3vBUYT3s> zt7~_~X7O9Z9AJ>q0ha^!;g2z!diqR8%cw;kOJ3R|F0X9JgMi_H;x!I(^t{A9&Znfd zzjbOtU-0jeUk&uDdT$nemjjC5 zX2_J(eHe$1&!j(TEtl(T=Rjk#mJTn9kMJK>f^WqK?XcgbYd?TyA}(&X5aLwdDh}SS zG?wz|ypkLbt3Q|gjzGWahxud4nhAITO3}C5NL~>w_o_J27uPuYitubzUKc{X7Pt{m z_Sg!UQt1F$&vQn!)@~#9y0!hsh!M>fT-y|v#h(!)nnA`Gxai6;4Ga-DD(!F-dX*h~ z`!NRuIsl5->5wTM=_dKicj6A7q@2V)i{exCGM%8SqI(?=+h1{U??EhF^UYX~&rIe6 z4BC35Fri7h=huA8U)9#J0#t))U{OoL-O4UJ|Xa-dE%cSKMx!N6yFaZ zQ<^_l@-2erCVg*-FGA&r090^!X^@WX1?2H^*nUFSO7js|Z49DOUCwxKM2AkN$}X?@h1@b6i5RU&jQHe-?xD$9e<7F`B)^+4IZrlJkb~x&jcQbkxbu>WLo%d$+HSP z6wlir?*i@v6wk*YQ>tDm)D>>iUR*<-!+j|}?;w2ld3;{mHxhl@)m*gC9hKGRsG_1 zkhcK01IoU;AX8HJ)VJ>MBioJOMI~O%E)($w58JpD?-i_vu9neZ;i@i97vs5sW0FTB z^i05aY8UOE#`%As2cUS2flTQGU6%9kR?qJ`Jl2OwmWpG}jqGK)nmmsdlMho2$9Ld* zaT;D!abBz+*_ntKZyJ4Zl{?H;#$R&6*y4Q8ewc0v2On_P@rogz15^Nt=Y^0d_5X1u z{YqQk_tgF1c{uk^mK2d)5x;#8-wyZM!}c3=6gr<@!?}nUxsTCV=w#V72Y;4)4nbc4 zdZ=9g1^E|%KjZT037OKNWXWS|k5luhELmEyPMnfJ4I3(a;GfcO6a~B0&^ExWik9IL z5`rFItfh~_iw!R~ZyXLuV>vGom|=<6NiHhDFvO2fG#_9*mCZxwOKP$r75*yuZv?*( zenb5K0Qo84SwPv-s+0W3)=A#=H=UZldhemx?(`g|V;vN_nk-uF!!hOA@IbT?KeY$n zq~itX#pz4fwI55xrbjv5E``QJ7be)Acz7Fjgdai%^3)ILf%kWuoNC{6{@3=rEpcqecjMdv+jb2W=h@#&$|8C49IJN3joFY6Uda7c_rWP;!n%VQuEfL4a3z1gW_;hc?*w8qfY7}kGaSFYogpZABDOvkdi@xVz~9)LWW?cIGfveR^bOWn!ms1T4UC7(rQe#ko;uF>3U` z8rx~R=RENk-%f&l|ING#Rnv1;6e`(lwlYq zjidNVxW=-cMiFkzF(#X-PL(gplKIGa(QWrLA(sKG0hN!dAyZO*yGN5woe#?6^vb5g z+MVk7D>R9#;}0tYqrEo{ZJrGW+5-KrASkhR>7Io*!VwHC%sKH*~#E@-UtL^Wk6_cHR7D48D0h zhR0*l@9B);2>u55^yk%-+j#39#vkUWa8HYgP-737?|S4bh6h@&}=60O#_3gu3koEDt zsrOCAqzP6o=lAKpS^RrFwuTv(7&mcaK3{MCo;D0wPXs<1qhG=^^)c+Y9@i`VYt}yA z<8)}4H0xVA?~XZi;V@Yq#fRMTxDN6*;BG*b$E%Pj9SO?vION1nZ>{|=EiGBPl8ziW zg@Sqghd9H61MC05^qvZ(5m8P&`9`wc7bhtavG(V|xnKmj_Xo^s#Pu=Ka2piPr<>cD zCyu66_cNR+LuWi<7Z;1ICCkYSRHzjJDtknnrFc>erc*7Ux3wRPy-_f6~<}2C_O!Bwm zNt+n1uR^E*jCSyvdW8FPQKPDu$87($P6Zl>%NNl)Z)Zk7I6vp{M(!&%a9zVVeG%_$ zrh4yVo-Ldu8F^k@fa*&UWym}DQ!-%?t$w_d|HE!SaysOBz#>59zXUQRwVt&dJ2rOShBIe?KpmZG&=)u6lyxwI6y_|Mm&wZ-5^G z#Y=m+?Yywbup+EnTB7!OE7XJ?iY7^Z^PykyyA1M8z%78{w;gg@?RGv^Z(FzA52vE1 z1*S-T$Dm*F3%-Ii17HB4_>F)}N$q#<|4h!~S}RxV2D@50Ii|c)A{e^Z1!wA*r|B^l) zS4eM=OgUEAZ)i8$`MA6`5uqkA3`)l^a6E7tc~A}Ge`oNiLd-O0kE?3B8D;(HV_r4IK=p1qv=l3TOilJbhBD_z2!Yt3yj`%G4AK4|X4aOAN4Qver<^!1EK z$RnGN<^8bKOGDfXzBNXFXY6LiX!HP$GK3s*Tck~D1 zGW>R&`K^)hoq@ku>G+F%nQ4A!q~lv>daGc>n~X7WGEIg?&|cVSd<_4DVG|AEKQR0b zVUfpvl6h$Vr)y@X^lX;Rx?qAd46lbSxbtlWo61ge=D72vy-Htm?X?B+Zr~4qve#kA zlqM{c_L{Ioezs;W33)cQp3W^KWiAeroLQ~MmH+Yv+f3}LoW#w^sl9o%Yf zbiuuVqKuKlZhVb_6GgN=G)fOY9<@;N&w1Tlmzf871yBws{?|gLH2*Bgy8vqFdu#l~ ze5YxNfAK0Y3#?`3`{=s(t8p}dGO&efRXA>MB2dl{Zu-+>(qdy1FgA#to`CQ|bgpl- zXAWPkJ26%2&yakNfR9=a`317S9&5mW;#&rpQhiABtp4)Ue3!~oUG&PTvmWw1W3f7` z)_MkS`@{B)er=a`D*rt*ys)L0&oDk?xRVisH#4pS&D8ETNkIGwx&7?c5xX`xtwf zsm{w9`Dj=o^Iea8sea^p$ezDouOCqPz7jH}r<{DZ^Pl>CT@fn5tAX4_J2%AtJNBb^ z))4>4_>bc0RsBi_?Ne`G%CZM9=*Pqa^(pv@1$;QJc@s@3ufiqJaee&leLh?_6W?)&Sud6T3huBkI&mqh$jKp!qaJ02jBPcZE#klnN ztj<*|^FF5k!eRPE41ujXIUisRO~k+}$VTfp=3W}NEd2oU1kpL>=x3&`?V8S&`R)$^F>(1@9Va!f=ea8oVVQmWGdvjz(PRrTLzg@ zH1SW=`#Dq*!oeRpE@%XL$FqP1RztL!m{DpdcYB=tK&B90- zZ;Q^%vbrOlUOS^ZW)Y|j)6g&B{>D+}Om2zxReYJWTd~83_+AM4df;|I@qNhoyE^CC zTDhtq!&R&!1r_>K9P>@Rl)B$#I$r;DRZFZ^7qjd>-+*?(B&*#Jp0L@M@OxkKW}gT? zjCdJKm$3JB|ROPmo;#E-Ok5Bko{IW#mE=(k zJ*qxD3i)y1X-9YTej9FF8^=GeH}v+_e7&_QN6)b^J)Pf!FC@?dp!8exgvABQgRVR+ zHcvdO*3lQjvsL+Sg}fcu2`KyShD_;%a|dqyI-}p2trT)n(V2*Yeh`7-jr9~AwHI}y zc;8u4RtHZNZ z{{9L1E8v?jeQnNPSVfk3>?rcs=;$l>z|G$R$cuntfKv437ZG0}qWFTc__W|PvcA;d z*(!erA^#b8HB4VL`3ut)S$v&ywIWB4{h^z$0gwj+!-4-HUtyM%#nu&FLY1R$J?X&1 zsb21Yd=GG6n7+2=D@>Uzw(hcO);ju*;@PTR`u~R5XFxL0w*0yAULp!Dr?=MN=qbW8 z=R5gY19=^AVVIu6qo;0fN=sy6<%$diu9fv-Kc1=b^9kh7fPaMPiLRX~O)a#sUb6o# zboAwX>wGHxiU}u<~w&yF%n6jDm7bSO{ ztS1e4b^$U$?accz_Jn`{@Eh|Lrc5@oflkR4IQr(}*=dfx%OGzAHUa8Adn05@Cyb-q z_k2sQAawu_oorIk2=Ss{pcxA^ZHS0!i}#PC{|KJ1^dE=p`2_DgK;9QmpD43e?KUNP2+euejD6d3vP1S zKc1=1mA?=9Z@?#EdOmG9bw8uDMAp`!qC|@vJ;A@b`I!WHDlh|}^jq>1R)J(~9WMKs zDo0;6o~`or8005_17Z5wl&>&lvbK(B>St;lecGpP{<0zG0(n5&@;AmkUmelS6sm4U zYjE_1@NDIWw;A%Sz#U=wKK=aE<<_JvvfxHj<^tEt`f&u$RP|8*4DA5$0lzt4VYZY7 zH&zr}p`&jCo~`l~g1iPeKTKcS@)f2`7TkDMa3M$Eemq;{?_N|TlhkO%-y71t=`d7jc2NSJpuV?;Mp)e z(dElMA9g~Ur~i5Z)wicKqU^o8(jmA@^Jw*uS3 z^hKFJb-pm7wH2YY6+3#4;F&>Wg5G;SLH-3`N8NlyQ(n#~zsOcLQ)a2!(Nl1#{A!j#E+I5$^obo8YC!_C)7$fJSr z0Hx^r{jhi#5hXRhsb37W0uEU|@DVnvRgMm$rM zSH>5~T1TKWKjAyHSZG?OsaATOhw&g2KnJlrhR0FGZ^ws0p zDu2fy{}(tOrZ2ks7=B(aqTq^E!8JJg3jgWqD~DVGtO43)&v1QVd6WiSLIw>~%X(6a zXBXl-)swd&9|1lH(>FVsaZl5!%E*ec48|;U^rU_1>KO%jEHD9}MD?VNdcra#3vRhn za3M$EMm$@U+g`}~fIo%li>}<%`M`)WE2T24ar89enT7aH_DlE|?p*=W07}v3OKOR< z-8oKv>K#4v@l2JUD#%v=SBL3oTYkdKC+kGH(=B3&P1cJ;cy=N3K>7L?@=_zIOHWfZPix04Py@qSMn9A1lmuvY^&F z1y$?l3*p&8JeSJp7Ra{&cZTVU=KbYpJ8`(NE>~-C^fcg^Y91KV2p<3-4N&vI4v;Ce zaUSXhxPW<5iyou1e+LmiL^A+vYh2)LYiM;h%X(Q#dY$~<1o=*22cUTDhD@nV^U+8a z#cxy4$$n?k_Qw6VofQC+=b5+{s`2-d$5H4}^(pXg*aJufD7B%S#q}BTlxjpDvtGRy zf}5qj`FM6Qo=xR^3FInZLzuqr9KWj8)}7sKM)oxqqCFNldg|~@m9H-$e+_&arYFk! z8d;&S^#+weFrF!9ov|%FlDl@`JK~`);juX@NAX8mmnVoUJKI~ zUH-z(XGauU6;tKb;OGl{>-MAlArAtE0V;pd^rKDMB8%;EhP(x~$ojD!&s6!^33)eg zf0&*&=PS&Tvgg^rsN4!2eMj-^LVTzC82AqLA4ml#QMt7(Ut!8*v0X)ZqZD%V&BwD< zyT1(b24G{DzUbZ)O_mJXOq8#RjjW5%SL5hAgl8*zehv8>;D<1MZMJ8`E8|*5?+i+H zj=sY0-TbYDTnU^HsDAAt$duaHzq)~JP%KGB>qPgu8Qm+O!7o^KuUhdfvK}3R9%bi$ zL;eNeKe#+RkSVpPe~n;~T6`JxuV;$>wF>9>sXr)fU-cZ$PE4bM)l= z=;muScX(`t9#x;8hx{7wCZKq{3z^bM z_o-W2J#WsUcr7aQFj1l54P^kR(ANqF<=We%J<|T;miK7L!06=em(r?XQ zSS6D+daHN^iDwo%dPC4rh~H2??|^(4up>-woAVi_RMzad{)<9kdTo|S=n)Qy^&TTT0Wq6m!SG}WWKc1=b z^$Fz9fPaMPiLRejnp)WZtZ~Zj4q0Dves=RU9r8?IE}-n#rhJ`HW;>edXMv+{E1s?L zcL4IUz>8t}qRXEf_a>s;cDdzN?C7(9aqDGI$az3tK;vqU@0(Xb$X=}d1Oex#k9$9X6j=lywyAYY6_GbNxJrKYT{HA<`DU)sO{-$zkbo3SB z*{c6u5BVbC(lC9|jr)`(PZ;*?b%uRfaGR``b$GV2=jV|B0sJdWUt8@NG3CzRVmP32bO=nH5m zP31Nc@_1kppx(PvAyaDO`# z{k_OsM%M2APK_&e^sNumcMs$}z~28&Usxt(@AL$8Ry+C{@oe>8MsN#lJb(+en(CDZ z){M-)^{w20uKkbvEM2>*JP!d%aOG&IWZdetWozkLJsc5yK%QRQ$;2VXE9JK@&il|k?p~a2@E7Pq?1GpD z`l2-6m05P2k%}|yF&56@n;z4f=CgZ;AL8LkoM2qIB4>vxQzWGy@cdVtOB2sd zh&R&$KCkJs5pc@6S{{;B+T{O@%1c^I3;2J#W~JM>TY%X|!WZswqTjDfrW zSP7_n#5xgPgRjc^6Y|LXhVyC-YCnvKJUnM`5MoHxKBO zuhR!SoYmz|S=Pf@LwT}ifZcJvZ=Q*$CEa+(g}wz~?L$;B+%Da*&^OY=ZRvhQ8NxUE z8-h0YO%oT3cbwom-Hf*ae#^9-ZwXeSA9+vZy>VK=kGKN({ZQW!6UFY2GyV8RdQz=4 zKW^Z{ziMx#`xDGWNEucKKkjqKzc|ZxrkQDV^y7>ne&5Lo`cvsP^8DS*?vV1W0zYD(K0iq+!-@e?PN7o{wYo=4sXl{{V9!em~MG^baxzLmFj`_75?KLKrhYEAQxGsi=kZWZ}YHzz=vfzw?R z%}J1ES+o6<%_)%PSabbT&1sP4S@ZqV%_2w(tcCs==1fRuSd09#%-N96w9fL+G3P=$ z+bZ_YGyflJZvtOcarTd&nRDixbN8F&-t5Uu2oRExge8!$hJA;y2L()ouo)q;t5~AA z;0iz7s4FTeDk@cLc@+hhDs8PGMZ~2_ty;CHc`3ELtu6oWbLI>;fk5cz^Pf+ibDneW z&6#Irp4pyxmKv9yI_u)#3~>QIpJUApUMOa|pVwRSg0sYId_Lb=5WGm#x}Pt!76t3X z#rXUZt06c?%ymD%)LI;@7xVBr9E}I(iv_?gvz7)IibcSdS<8c$hz4LQtd+q_#bRKq ztkuCKqS5{T%dIPdN-NJ(Fn7Ecc>E!JwZiVY|7QBv$>*+rn&+9?3(0Y3Mf6Us%f;Td86FuF|;OZp^ zHoS$N?qt?oEO;vux6#wx%-YO?8yLI<;OXZuHDo~;@ol1~dzp0~3*OGe9rScRvmRi< zJDIqPo*rb@78bmliOux%5VIa;!Jjj64?R7?tgS3~FN3oIJUz;+$5`-wCLW-t$Cf6{)bsF zvEVP5c#fW4X4Wnie4dFH@Ra^WY#8r0C1G-83ZL5P%^03VQ%=Mb&t_v-tl(E7?Cmt; zjlue}%*+w_ae3g8-^=lG0mehMp1T_OdcZ9JHC}E2PU(z&L0lj5!tULARLokYLaHTI z*J1^^-@Z~auGF;QGN`Rq`>xFIFy5!~`vLgB=>2fgtnxElhs|e|ADxz4O5-}_L>KoV z%NMXz1ZWHRU{%uCKAG=GyjSf*>VYo+G`M-SyG|@AC|tI@ZaK`BF0EU73Ffzub^u|R zFNTNFGWY#ETD<=q;O_%I1gLU-4xG|C?eOCHzyuH37~#&2`P~7#hqlO%X~eOF8ELJ6k&#g#~wJ?aO}rkB!jytVkvhlpKITf^}io<#6Snl z%ijV2iD(SO=?np+3!lsjd;R9s4v=w%! zz07QVDgr{F3ygwO#ssW$st!mxYLHKvOUEkUKLcC?Q1x{aa7ss9d(JlPs7i*duAk$0 zkt}hpXsV>Dz5{JgFby6-vv_wh?xB#qQu!9|+v4Vb81Gm4|AX=kMl}}kmAC?4^7Q+iINlB&&4*;YZ3JDa-#!ogCBUlyMfY34DQ$J@txZ3X zaXwqM6eeh=>aKC_5(|X?Ol#s<<^=+kR%7JIx@-JE<{u74Px+-Q1l|WQ5TNp34xCa! zM_FGx3)`wURM(`q^S~pl&u8Sk_&)tJhkH)wa3lr`W-d~_5grbQu7!&etg&gG=1V}l zA^#+J=Ly1hu7KIM1#b+=Mmo7uDC9lt4w#$F@p^9#OH+K-_@ShGFX&Qwr+)+P4M(*Q zK+)X^IHk=qB)tXxw&;dsuIp2wi^F>>me;EfzoB!;7X~#q!*Kvgd1AFI!OVDpVECXTJu12=FmL)k`p0){C7b z>!YH$-Fg`{Z^BX%tP-bg;UB=sD%--3Ilfj8*vEyo9xfF}@;ST%yk^1qCqxh@=!?1ZuLOQQ;AViL z|6|~ks?RwOE?hQcsa!17PQ#I1AHXm4i-;4yG_;oxT{dWEn5N&Gm>eodPRhxP@c>o@ zJ}X5#v>P`_XWo z{>q(Op>r+z%$ajv2x-UQ6RaDr;v3+Ti1$rR80_(S%qSeIz~>4|lbgl!tKh7sgPqS= zz>E&CSwP>;Ox(J7LuLp~7|u0k^x!>v!CP1lyC-L5X0!xfcaA~yDXhudGy~X*uNr3~ z^p#Dn`jYXjFB-)4k|={GA-oaQG#^gKyqAgo{0YWqu#m9~I~(2$p6|?Qyt`g0?q>eQ zz7n&@?wmkk44In$F6(nO>Z<@B5ntaA{29RW09BvOz$q=5CF`+yQ@i!4Ml6S~^$(<5 z$PW?Sixw*%+1gP!QS1hRm&Z)A7hnWP;sN7Xn7^ZpsgU?~qs1khUY3P!W_~!(^W6y7 zGy&m>!WR;#zXfiO%o`az%^~<-28LsCFJmhaPePWg`k%5~)hY4*x&rw1fSUoTTwepH zw0e>(&yictS+4q(bqy^&-R;+3H}~mmzy3Mj=gchoJlex1#Q^WZLnuff90~dP0(d!z zz+t$D*@1xB(;Ep1djjNjfdCJt@naC+!9iTqEYR~XcvGn(fN8*W+{a)Af_Usqh@MpL z@0hU`0=*r&U8AqTLL}@PPeqQMl;y2TjnAX?z*hjS0I2fb0-VxTSB_fX`hz~pzF_f^ z<%3%LEV*0y@=e=-To2d>nD!QeMurfX&8t&v7X%Z)q8EO?c^Y+Hq@I+ub{P5A;7&AAFI*>`D&(nH#772m@HqcV~!s4q+4miuCn~V zP2fr4aix02l{|wM+-ae7QK?sm6cZkl(%oNoaPLXRBHad#payBeKd8u8A$rqq^>pt1 zPa^)uPF|Gc+~Myl%B>2cPM#@Jo@A-+uXV^9 z=-0mF0mNc#&8GSu?xMM%#tGvc1-$J=A#c4DbVh4*;sY zQZi(FZTYv9r^c`(qINzDA1$0)U)KP?U|0^Q4cxDpvxECm-ZsnIGUu~AxvTq0Xb)Jq zc9G#X${{257=FKPmgpIfv(6+J{PsnGVnbk|F4$}qfM-cTz-Az>g@7wAK?3k~9J|s2 zeGVkXZ!?yBYTOG4WH}pA4s5v{zPt$8uv~x>=&Jp>~?NUgP(5MTXqB`U3O-it`gt_0Yd?bu1kPZ zDj4SWmvi@HqU)4-9?{jLHzRluYtq*vmJsniT=ah85Ed|V?Pa_kqG(9U)|kRqsas*& z3RqccqPdE{%MCcy8UR7Oq#FC?1WETE(53408=^5QstJIiI}bReoqZ+U>OAKxd_#0k zt6RFT4%>fH?hI{zYW`8?+$uMKZx7h-3++d%)aZtdShhV9GWUZ_T*Rw{MfEI~ z5fok#bK)?p+*N(=NtSf423^}g7mZI30)H0p0zlFI4sc4V=SsSp-;sQO4!Rvaa4KCg z!tV@+5iH3FKS?)-SbZY89cJGZ>Y;nTP;Dug(B2C+>L;^ZgxnNynwg|-#mA-nNZI5srRTi_L# z8CgE8mT4-YLH)_)9lUUY%*`xs3@^kf$qM6gAA(u(h*LD%Y8N8uBV;?SK#!m46wo!Nni1F_;xl$qzAv;6_$~}Y(-F*-bkk~ z4;ABB%1*Nog#$JF7(;mJ8+q_)!}vQ3&hl?(rI&OV~ zvP(ra%ZYSM#x-GZa612(d1mmFOrMO!_)p9lqbE}zg8zjI*z zuRg#jouOaRO8zpZZt>uHn4zGTq&PdXs*6}{(Ak(F81Nx)F7!IU)I7n%y;VlYa-wYZ z;mcjri(sA?>IaYw2LBDatBJFDMIiO-n8Ft};7!@fBhV zmFy|@3gHdS_9k0Z2(BA0^~D;($z6+61CdF5baGZgRiJk-yEFjzl<@l3mC%HMF;36H zV%29i^s&p~4wDAl=NWC2Ugx}<=w@8aj3*)A_I2#Y%OF`l+faVB zp4|()Pd?^ofU2Jk9cBIWyHD237w-Km^+V&^pr!Mji9&x~4#juK+wB;UF)-gOZ|}?7 zz4G=u8Sm*S`SgOkZIT~8D{nW*+dB6{`Oe4XQ;i(!cf_=vh%E@w@f2&a2eOlF_nzV2 z%}%|z*YD+P%6*e|VPxvECNG$Q$8Nq!LSNI_YX${*MK9tvvcC9eBA~;XbU0~*{=%1R zi2D(JY^^E%B|Kl2ho*=uJtXwwEH^SmOiswYj%N{4+A?RfM0fnCqdrCSKaQv+<%#%( zrT&IWlK=Sz(LFmDCF$oF$y zpJhDF^^1(5_M6OVV58uk6PLfxAHMb?;0*is_z^Uj$H2=u9}}yqg)dG$EDp5sGXWl1RF1L6@R?9q>B0VV+y-A%y%OS(rbUS2<6 zh7)RLk4VD*=~nq}Lwmgy;i;(dTt&D~M^&Fz>06mmCrO_WuXNaF)kyjegT5*dNaLwd z5Y-}pbbz9NB=G-|{;7+XEu6o&er`MEIQ;)hIrdy2%drJ?s&c#z{11S`096jN%YR*t z;SEdb+-O~owr+*j5H{cp>N~X43UgYuLU@*>y9RVAy4L`|6|f1Q=zb3Pe_8*KKQuPf zua;f*CQ120mw%cNj|w3mBj~UN;G7bN<_10roFg30!KCvuV=-nO^im2O623^%sTIcO z-6G(Z02%>`&i+M`&YBf+JlUMk?zrLvH6kWiI;ren{_y_}<{zi?Zm)e)+!8u(X!1 z%T~EVz7nASh*m~?g^@1t*9+&(I^Hb&Pca|;vyWzmPIgCU#JqzWk20fzzsAISHh-6~ zrAqMMG+(yMX4HEH7=-%o4&ZwLzXqsw`4BjzBh7MO*tT44;o`Xq5yi|s!hT80JW3vf z|K9`l&0O0LmMP_#tOrgp;O5xQr?ts!qX^MHoW&yEzj1-2r=U1~J~Ik<4PX{P(Q_$q zN@HEWZf(mg6g@4uBc*W}6e~sn@|F-?*KqAy&=oa1@e*USrvt4NC&1lzwX8Z$;{JJ3boP683bm8LV(_D=Ngf6&-Z=iT0J8+{J@e@P4 zCP)l89DCDRIGYZ`IW+gZ2f3psYSM%culYpZ4UDfc`|z$%&EXv(URBkoX$_L@M$o0` zz76WA`~ys8d@A)c}Yx|EKTZ?%;2eaf{1L0q&inGLzWNaY1aJRskZ zMp@3((s(=d06q{f6rkuB1)S1?zsUaAHoq@j2~MXXFQa4Bl-kG1g3^Mz`2l-B(>@B~ z0{`}i;^6Q$y>G{5GXKqZzv7b@fbRkP8ldw3EpSTh>+WtGRY8hzm#<2W{bwr-nVPak-=;)-6s) z1@KXT@c>1~O5l_#Tz%y!i`wGHWlNSWA5(uhF#!gbb<7!DUNAN|-QaVfoxtFdXr`M% z+iRBTbB%~^u0N6xv?(^gTssn)8;+z@Pz`;{AnHNPxy$(?NBpAIu99@_1s!3~LG#7e zz<&T72PisE0;i<(!rJsRUNUECJvPnGphBlGL~l}K{Sqkp*iB4ZnT1%%Nj#YpXNEwr zf-E+UxcQIl9?!oX_)5T)0G0paz$u-$R@TqnPui*{L~v}CdES2UCw-q_`^BHdJ~Ylj z`+q&!wNN^`39>K~?#;~#^YTbudRQ-s@Wfjoln?G^q8jj@QUI~Ynw z!>yj)3>^P0=Eo@-*Ft^;#S}ZTM%JI*BTjz|cp0D^py(e1oYD)BLDSuydKUUsz2)rZ zSIb3AgcdOe5d%=$hM)|WLC9nAp)3<~ND|{TLo^yQp~=x{FHoV2k_m1 zHvx*CPk>W8w|r*)k|lGAAZPHY#n`jTmCqcsZ{*sG2#wsy$U}I~UYPw!02Y#=PkKRH zW1;MjWosop1wG^RQ~|#bPzzA>Yy?i}4E@bk@*<*Vyc_6bBb&E@!V!#hu05UW018cT z(EbhA-i3Ny*u;dS2NFX*VI+7Gyb%xgheU$#dJX8#aKwPiMWiz?s757T&-nka_2_HIlw2G|` z@=e^B5Gvv?Goz~^D2nvOe2(#R67-5yd=$dEYpZ{t8l4SHPLuIV^Q6w2jN^zRhug2@?Gt(Xx9)s+lYAO@>Vazcl|=0YEL!{E z7(b;tG9i=qHfER!z5L}+elYxAi~vTE7x;&n{fZ*h{t2SsYbL&9zJjo@Zf3=QWcs8O zGY4^cv)AGcV^Td6#DF=8JY!tZ&1_`VWT=Is&{K_Nd@SF=>{UhsKgc}G%q!Rc{f`Vf z7y9tvWa|-TyvnS{>Fi|BZL)qw_KvSxW&^(x&;(HR^B{0a2i^60+viXX^^4~_iaA)d zJSSHz&&t~c&JqS!s)Lsd?H(vGbw&xgU_pwd9Is?y&W#6{??UTBDnd`=9?maB6d~D- z;U7xU*$g^rK!+n2sKB}gFchHZd<8hAnzv;8?fkZ_cAVpi=9{cto|7hPvYz11?Fe&j zyX4ac@^*u~?UUc3QB5kt(G=}W*Z3l#9J-MACvIACbKyYvJc$9v+C@>RsjGp>}9#uGoD+BCic4C^*T|}y2 z$x;T`%_8f$*w4TNR68|B73BEXg)PEq(^_^Lx0muuMK&)sn-OJ?CmiOHLkv7oBo7KWE7*6+CR(Ti`wB;j?lW; z2AUXKeIbN{$<#fB`Fn&M&AkEqM;calJm8kUPn?dyz{dk70~8%gfVWS_5+~Y9?U6Vc zFJm{_CK+XljK4Xfd-H>mj-ALShKz`he+T>k;1EF3@hNah=WYk6o6r)cdJrrL4%#!d zqiBT+QWx!GWXLwC-XilW=o>G0AK(pu%K$3B?)_wbQ{4EqdwaFjZ|W~|R)G3VQa!ZP zIZxgykCl(v&eLA`)Y*Bs9S<~UHzjIsiBfcyJl!w^x=a!}es7+UVChDx2Z6Q1Ml#PW z;x)#wNKlkS`eu(W6J=c&6^qWjtnQt8jVN7ICUOx@ltQmU!+24m5R;PbVd+-Zf^3oE zwN1mz7kNeC%2D`npkq)(mPf7r-~cBJgvoX9!33=TPCcnlP5G^-mnhH^Kw=b7`wS10$W2)a+=WN}p_#2GR!ra_j?}h7B zEOy5s5}}R{SUKLXeWQ1$yVa7yQH*9HZV{R7uFTDit7&JnmtV19gvQT7WEq>Go!hHiXL(qRvb(~%Cm5KszGbo2+_l8(0b z`}18%+ck31E|SwVcKKUD#w3{D<{8CA!9~V=m(Qx6m-(;9`&B*M1N=$AvjCO%# zE!*QKeIG^Ba^h%V>1k+3tXwpP9n*7Q$A_H|E&)3nNer>6kgj<;B*v_i2()%haIF~; zsR-g0z=#%!M1_gK(ab7B?R`NJZL@H6hIMq+i<17mpf3jcoc%BG9|8XYDEgBIN%~{o zol9O2r$2tk)Wjac5}}FpL`0i|_P@Dyhn;KmG1DQETy+n_S`f#MRyGYEqi`aRjcE-2mgdU%h?WoEh0wK5OtFu zrf{VksZ(fUT<2{8bpORr726cT0L|ke`yvECaq0aD__)$xC$OG8MlGA%SU+cB z9i7xxpwcU}H$5H-alwi*SUs8`*Q%??FH@npBSu+7Ia3aZj!tg0YAdNiu94 zlvmYgykCKFz$}m zCH?C`pORBN1N>FM8vsTB2f!)qb^TJbE$?h;$5TyF#)mI#sCP@V&?(G!D3ez^WWxq+ z5zHp|Bz7~#W0;s(Y#8nLCz^fra`bc-;r)of9dAnd3Wmq&8w~s+z+8Z$??d2}{43=+ za^Lp0#uErB;xu7B^oCpl9k-p8P^oiWxDQg%L-tQWZFMP6vh7SeBLK*9w!3A#G@M{Y zpdw{?p?1)ji>_I4@gT~IvF{gfQXur{_$mq*3K#)c2wBk(K-43QT!BW>lRbltuzoi; z67?WfRP)FfJ*Bv;ta6dN2)vX}x1VBWBU`Cg@c*T{s9}8&+OdKTT_b!l+sgcXDfBMJ z&v#_~j2sb{6JHAaNOn{=V6gZ`kf0zBE@q2l1J-<8cr)b*4 zuH(BI+r!2=*N(ffq&{Tdt82$VTQ_V{Jdns4<2{|IR(tYGIIMVQ5>9E)K1o*-@>Tuz zVc^dJeg#l;eE^)&MwhP4HtA|vZxb4olx`zi-h$^3+v^N%8r51JPlB>YWa z{}2xJSu^Y`o!cL9^J<6fznI!Q$n0Pz=rt_JzH;sUmJ#gAld-(7hOJK55HOzs)%2EN zB4jB(*9XFbixtSSLn4$giaK=-7Un-PqXe#AtntQOFxhuk<nPN~e*FaGIY zZSiHR{OVW99<$3i=sBdL%Y0Dp6IRAv*7+C+XzwD7eU0J5AqOCf||t5m{Sdy z-I|tgIAH+HR?P^T*1AK*4$Jzf7!#*^2JlsYH2_8T(6N&4OjjOyI68&CIz!)B87*}w z8Pc%C*`DU@v9I^&cirWzbTs2Sic7%)z zyRQ#Q{aweEYE{0mH{l!OwG_UQ{a4MD$j${l`;6FuU-P>>Lhdk zEW!f9AH)*-BD^XJ7z!8xc$C4jOB4|Et)1azCdtN3r}u&>MASLg zu=ohvr@>WF6d|lRLk9Q;+Rd0{CaReK!tTmkt2)lQcJr*y)#C$-Dk>$ijE&UL0%im^sb`-Bm0oo83z;12**^?12Mm|jY2&Mu9rGlK^(bE$01b`U=Uy^08T>$J`iRnI{+^| z;6_`V;>B9L14a^q^_8OB_!C2%-zoZ{7PB<`#eOTxyC3C=p*+-|{tnz6AJu#SRo-&o zl+^k+wQGCjRU9f0FZFL=(hSSyhas8rp_nfk+8x;JN9?Y!1kUDz%w&-QR~$jyy)ZBf z8VG|96#`2dlQm!#fP}SP%>wAx-$}aHgDy2cJqi3pz{>zd_b0$9ZT3leGvR%Wo?FjP zEysbO^$iOzb=E$Oi=bTckiLYPVLVYWMuF%m1J!26~7ecy&|@01^R;-fZBM&MhZxS+8T4EV*Pw zBRD^)_5z%JCF1PsBl~9NnA!);Av(rVO`BwtI?G$F`k16+0rFApdn54208arF9UlUx zw7$2jucP<0S8q-y1Q~ReWH?7eMb5Q{bA1;_NYvi9dbH~yfr_9G-)0bvASr zNGpkRU%6N4xrR63OzgG1!Wf5m2P@4SsUDzhJR#}*8uY084^N6}xqwapMej`Dly>%z zbZ#zfo8A`o^^W~=$vhk{ca!7bZaEHq#ApOOV83i=|1k;;Lr*jUe5Q%LhS3$iWgx^6 zMYJhmaJ^xbm;y!-!ieBv`EjL{$S=6RlOEAi%@P*DBv8V0NiE4q`~NA+v(u%Q`1&2- ze+HZcsPZhIBFm%XDQ(Mxl_R!|EPDfO_3lq{Zr=#nBzEI0kr8RM77KHqn^eGn>{6bkML89}d zM|>81A~^pczgPc*C;AT;UNR!D7-EkBTVxh7#G6LsZ9}|exc~QW8rLfLHwM2U$d>SX z40eli9<;?OrzY3-qP@eo6F+t%Uld=QK7T-Stc$CnmeSY{V=)D< z|HOWTVK&D_+vG;CueN2rRa4{h!G*vZ0G9z&zAJ%KQvNq~wyCdHQ0U}4*;QFy{t+q#_?G|6hS01N;b3bo?K1O6TjhwFDlT z94kl~=pA3JpW4z_YZ>q8`f8>3?QruSIW3<5Lg32*mjhJ(R{^JVR)1Tq8=^(-(nl*r zt^f2?)Osi>IPOtU9-mu&y#G}Bf&UF~0-*B$2{@(mF27p#(9l-BiQ?OQddlxtPaJcQ zQY2EDU*K$UYka7qVH z%6(}&{GizGaz3sJLQBK@2d{E<-Z`F|6t(b0FwYJ|7pM}ohM(n%sr)cBKUf& zWNUcT+l_aw0arUcI~mjRK;=ILIHfb>AuaqCcAIt9!7ZtJ7E}*D zg{LZGwWbY&SQyF&lo}J<^5gxg{BHt30Qdl)^8Xk(rL&H!7oH<`u-`k*GBXGs{M7z8 z8Udg!gJT#qvNR@2I$|^9<4S+vRe+%YO6N1KNKI%pwU&V6OSB*1e0q!f{`Gj5D(7Rs zUj)1iQ03eMoKpMqC}~{7U%We&?qGkyaumDs)wC%6#Qqo8PB2`wYvMC0X@AF(WjVvM z;`^l%;FW*@07b_T;FQkoKal2gNrzJXZp~}|ba-vCF-vVLG%X_YUyt|4@P3-d9|ry? z;0ZTRs^|9f>s@_wQn4>YaSOGdq{Hnp_x;Uymy);oW=FLQKn$SD*AY0SZLWX21*vWA z16;lKcqM<{s*-==+J6`>@P=_}x#FtW?}*BBHXKx4~G>+ad2vb<2(XV)%^O zcLVTy01pBbJzIfOYM;MOm0#Kxv}Ukt`TKZd3kIu7llgy*_s8&l%3rUAdL8v_^Sc<8o<>6Rle(iQ)-XDWIplAK7+y5^EMf*IbD`>Kk`xh z^#kx@fFIqw&yT;P5@2HWAje+S;B`0Mw;{|NXTpz8ZCz$vxIUv56}%07d^HnquMWjV5( zWpm>ERSkSHU^;-(`SF))nbMlU?obR?>*lis?^NU0Yrx+F90I8Fehi#a`}}n(zj&F? zV6eN+%3w!gZn@{i+jk=HnSeTgqGuj(O6~L4DSFywu+6O*Y)`Jte;eK(!~2Q9ehqvt z;2k&5^WiTyS9gmqr^tK2V9oCP!}W3gDgizKFa)5=Hxf9d_V`QX6R+$u80@~b7_6~_ zEaztAquPB3@DBl>0u&tu^CTU2xORfabvaK{e1X#Ct`paiy5-B4x-KwqPO)Cf=YHm_ zhv4-atD=$4^=UbKPo*W&5&K#=_k@VNn5WuV;bC?thsW&HQXF7}^qx@OBC|klgmOZx zTdGJABA8%7A~49#GN8RILZ)R|et$|gILC6dK6@IM8-HMMlbolg(z#P2ZFyk}v9)PFQ+s8?uExqC4t(a6?9dLymrTjn@bUpS98{MZzH z;A{%ywSe>v%INYlx;T%^PGMn)ra!lvEbReM3|*wW3_b`}MO8Wkps>y1xm6H&<^iH4 z6wMR4BAgbofb-O}6uNu;csBBZrORKWrCHAR$@rf3|LSv*mSY(n1K%1Rs(@+6WvH7@ z?6Bc%RW^2&^|2r2jiJ0$AKwE%0r)pS)rVLp>!ZfCQ+~%iS8iP&bEH_HM79s|>fC~YNjs?Km zr(?y^1{_;0KQ|@cw?)bRa!JPyCONOBFvqu!FfYUHozTMYbXfOP;x-$vl= z*He8%{iX1{--^OBIOl8Fi=5G7;R;E|VdSIe_#1HjQuuWTC^{m*+oyx(&vO&8O|(G- zUL3BJbkrgrH6C08{4T(~07b_^;FPwydVR{zU+aEUzj*F4a@jm&@?@A1uUfKnt{kY} za|Y^48jd%U9PumrEnUl_<86=4adhm*VUnF((}Cw#hC({R8~FnOuM1(^lK^Qrkqc4p zyNK5rgV@W|s7Lxp`eTdZ^j88O4VVB>^uGz5($^Vs9NX;rp>9q8TsXs@TMz1KDBZ$$ z_#Pym(+|Ua57GQ@zqY&-ro~==IqwQD=pHC{nWzXsYZJnN7yYRwFKpJ8JWrd(8j9*4F`|+n4MzoMe^s^A?XIw}4&CgFN?%mtM z5!%R#z_=>n;0wr|-CqQ3f!9F0q{x7^T#>%onNMm5x#eFHpHC`*j{=MbsPbP4oRZR~ z*wrFlSbQC}pnmmGrwXXqn%RsWNXP4>bGY-B{ZFoa#B!mL2)`pbH*Bs$E8euATZ-^W z32@l#MIbIXPz&+ogDeGPf5ePc-06Z42Mv~V?gbrcU-UWfV}O4F6rIx>C7r2#WIOG2 z{dl%+r#Z`(#Z_-X=zi0owBHXH3BIy_fG=>?oqYWxvO_xOQ5|QGA}MH8n0>r(HCP~$ z^dviZ7%ABCsn9DDnMoO5`~s26!rUAHeSXez(&)+WLBOzVkJ*b~buSCT`ygU^@hs$#AKsi)7-vxdQ@DG40=i19;Io0|+wM~9RIi;QX z!UnjhahOuyEFRR^7Ja63y_P$-r@b=_YSe#D6!nNkJuZFc&2n7lZI=&s z;pWr6wf|;m|Kz1cni;^6e^;CxmjKonv#la5N`nkL9{Yyq9s_=whXF9LrH@H>Di$3ftfG8^4>l&fdax*YXXih0!ecCf4E zE~uI|JD`{&l0h!t>lotKf%zV0MjGpKO5Z@6DCsCz7C(0y4tzFX4nWay2skDGm6DFJ zzjf(pwI8c@Y-7}^7wE~`Xgp+YFxW=p9q!ydH8#M}`%(M<0$Oo*ewWTKGSYZAJ8BFg z(@dPi$DmFT5>Q_?0y>8cgfIipD@e?;^E{5$Kso&OryHbs#i8D456ater!T_i z8+FrF&h>ryFkSUhs=0^2h-?J!7qfCo0R@1h)Y0~%EGHBbq4}Z2n1KCvwNCe9d`Xa$ zS(o9DiIn-!oDeyk)W7+webBe?jZUIZZJHOhaN{|~7qCB?ZhzY`OV-2474dm;3GiD1 zn*gdFZdfVn;lxN;{*AYsS3L}x<0>=fY|*dNonn5T;M}gWoLd78O-JqPvY>`Hf~O(q zVK1IO+~&gzp{B`6M>yv5@By}MMeGD?lraDd5HS+;QC%X1$z6uR$j{~jpg|wWOwJf; zr0@Z7WF3hnM}`_Tb=JkO84cmTJBf~wPRSjIa!kgT=_dSn;=hImq5r}Ce85cm!pO{o z3-Rt6F+Ea~Jbe^Qwvq!wgSLVHon%jpOiGwI6#C$Z_)}oUj6B5fE9>g%jxPYN2{ad4|BbvFEK1aw$Z3NcjCz} zxG@6?fU;*+Etd2i20by*L*wRufJaut{~tind-!rmZ_k$`AFltgEq<(DyllnNdKG|x z4$JEnE+*ph_M5kfeI^zNKhJS)m+ga9|55wxj@n*W^(P=445E{!h7$y2L;lg$D31<* zsZd(dp@>8-cKy5}hv(VwT41vn|Bxl{L^#yq0TIJ0&$h!N%;3L3Pfdo=m|??By&b~H z#jV6~yaTkCQhV?U+e}SO%?dl$Oz5Ci_2mOn%~UJQQ_VzNVf)Gx2Jyi*Pee9}$R;bX zTf%i5<~vt2XieHW;v?|RQ7eV>G5GK*KqBq597lFz?1M<5nzOo2P-|;fDb7%;W~vO|H0NE?y-DfV*1B8 z0{QUuoL7o9_Co#&BUN))Zd}Im`MSf#*+Wm$BYScQD^Z z)`@=h_ftRXT2w+mYwWyG^{4RFl0R2p5uZ0U0p9|66rlL?m%u4ixOUviUs3D+zw^iB6dPY?VV8BGCDxdt&Alb$z~EM7A`P`yM*j_>Cmo>_v=*P`G76} zMMr<&l*WG9TEC+;9hkI+FJ3l`tou`HpC@&lflzBWYTv=N>#^V&hAo$6_A#-L_m86~ zbS$Eu$uXw+8d)Ffk&jyE+z0#}z;H_18s97Sg#%-bVZ8;0Bv* zw6AB*?HTUeCOX$qEv`8m;Dzm|eLP9~N{oiXov`^Xv*C&wJ_#|}&@K9f5pL!*aEI!H z!k0A&97|k#p0JZ8*gV!19;-XI0hpp4;~(m)3hhSY-$~%nt8ms0Q1v+sIHej_KYN>d&fU6Q&sdiXURt+!&H_|1 z%wfOejyddW@|HzLu}AIig|^2W!O@qqD|u4Hiq1|Mhz*S=IgEg45xC~eqONDdjv^N& zxC{>V%&GihF_o<}=F$*;WP_xCGw4%tgI9q69&iAl=>GyZrBv5$xb6ON2K^Lro|tq8 zdqs+Rq9o)wYX8WzqwuE{G&@2CrIVTBNudgc%l$cSe>t*I(pC1ec)eZ>d>LRhK+%=H zR?@ZkA<3Ujc~j^st(|%$x-h-WT}aCv%#tLC&T9_bp729}H3y#KKcLrOW=zu7Tci24 zhEamO#DzQ?x~e^3#!}7`z$b|8WF!RiAPt98c`meM>AQp^JvjxMu|s$+q8B@#r0MA? z(2gCzbDI*3l# zCU12Q9Z*k4?s3~6^{CqaHQ?_74gpj>e+`_{PS+0NC)a+voqBGu^}zQ2&r-{@{0ESI z)P9L;zr`f949fB`BOSw*3Whb!=+5%o^+oJHNnb@1^!<=O^{-jL*8r{tDEiW_mh|=8 zEBT_(S@eOT^e5;&)MFvcxSwHqKmN<`J!#KQ~<9ZLvKzv~QFXV=gx$Teo zQ|-S8_y>Sb0IGif4V==pTv@+6m$x+^wCMkH;5``O2`8*r4$&_SU`Md){){5Uz&ShJ zCQ_V`qh!$Yj6DMWkxXdj8~!Yx$Ir#5OwTj368gg2(4Pc4FEtSV;5x<|^b(gZs<%nH ztFMXA>sJB46|f1Q=zbD7r3Q5#<=)%l3-?5G@RGSSG{A}C|40w5oi{jC-=srbe*_<$ zSHnvn>FdwJh<}DqXB|Q8UWWDYROWR?vLjDOI!}NORliy5qFM={2SCwTc&()Kr}?s8 zjd$9qU%79cB9%$=_J|kE-Gc2AhkUzHLr3jjC2HF|qxrB}9r3xvEDvvl>^h9t6)9j# zJ7}lrv&9fG6o9xaHr;z=bruE5$ysLD8@|kD_H6e*8`HUGlo%c6!;Cr#wTLiSsiXL4 z;cGGy;Jes_!MQQQ6m|B+Vvd-tgKhnRRGNHytgR50Vzd|qQ@oL4gcyuWj5>%FJl$b8 ztv*G7U93f6b`W58k|(dg5b0tNmgE=f&f73rS%{_)hPlQJUaJLPtC+%`<*TNyvB`|Ef|&xedZ!+8#`vGQTa_Y&uKFb2DvQK#fBvFBa>NBviU zPiTDE3H*&^$=_PBo43fU(nH>FBU}U7jiQ{kd=^~fSn>wL{ODph@ItBky&Q?%@xVQhm#R|S_0evSXR-P zpx645R!e1&saq*l%4qKK-@}CC_2nssfF5w-1nu>E7#pG=X7&cIkJKBDm2NMBUG)FB zd~+R{2}>|9Z@=Qkvk#HG;dG?Q9>pXCart#G^OE z!pN7)%gt2GtHUrRMmZOcI!8Q1A@QAr$S)<_H7u%rS<+c`eSDvJ3Gg+5s{xA6&A=%Y z6iNEdi%vC5#VNh7HKowAdli&+b11DmjnclD6;4sQf0v~5YtW(UGjs!J26O}{I{N{q z^k3B{u~eMKGi&qR^Q}$j2fixl+z2{s&_R6v3*fH<-UcW-6V|)+Su5-Fi?7;gcZ~a& zE~GVIUX$k@>!i(^JYTYtFkw1sZ}(_NeBEKo5W@DmE7m&6*x#mLWz~aM!8|TGq=#q1 zJ2*avDRB)?r_~Tlh$jO}HN!aK=K$dwWnE4~>s1B@+P9eTG^10Mt5{FHzvwOfYN0&g zH)Q!5LBDE;O~4-pJPuIhdjUA5)BTgQo*(FG{E}sjb#v;6IU-eO|F;ngy@AZQrfk5X z_IvvguEod`fq)cfDp|`6Fg{iXmQ`;`dbAtk^ke`p0+az1J^g{VPY<0Fo|};FXCb8V z*OHF)$Vb)7qriU&cnP5BcpG^8bS#~Npf`1`D7m9mmB8uyP)W&DRV8mYRnqj9q$7M& zoQ@*keE?ajHn;H0Q^nB z?*WRAjyFp>Ru@bDKjHe@JCjc))i*YPPn=VpCjBp#b8az=&MUsRZzCJ)zEF269udUEn1JwFww-{Z)XXUV73aZ-ovdT6;g8U9 zRwcilT^_uGPO}QSg5mmL!-vRO9a({Km{Gu&F~(GV1xgmT2(a{e6n4!}zQ zRnE#=WI1al%5tv1xvlgJPZ4wB+mO-D9-fpdKW(sM7$`lX4o-VQY=6gG=r zV$w>$Ly}x0GhhZi<`r0wB$#mT$CI!i8IdQ_!li-HystOl{IXhybBQpoHm-+8eeiSi zeG9@Up_g^Qk!l8_BBt9BuLsMFT(Wo+BC%vKM7{wmMg|VkY0)uUgn|Q|I_b%;)0*wynp&S+%)=gUSud~Uuhds}H^=jkANH(bdf$*8GR^+*KT;{i zh6ZBajzD$+Gi1Py)nj^jG!u5Ruu;wR54ThNm10WBG2 zEGvl?Pm_)B9CgF}@5^>LjPl1&ei}bc0uOD#87M&2Pec_AxxboOY%=?RU!yBMo=g(%3c>H|sNYUHo@;W*UzDeb56ati-TCk;=bA(ZjLr6Q ziP}cq-ALp-Jr{BR3eEmL7#Dj7a!=5psWs7 zF-{+Zr?V)*&LB%9*22en5MGo7ls_$Qb+(Gd)zGlyYec}xOy;AyT4ko$6T(+ZhgT3N zh^CeY3oyE3FXTZ6lo5f~y^9NZo1ck5QRD^&L*-2@ixdoDIiA*=C*Q@aJ6X1KjXKxN zg6zfks8>N^WK2|ah(Y*japAqhhc!9$QqeGt(Dfi6DQuekXJ;2)z%o2HBF>3 z@cx~7?q=beSVAdWx*6*bM$lZxuw%l%%G7j3wqw=*i?`!U;EMoD0ID6Y0#51N{czDT zh_K`B2ubz^N0L1OlI&)RQt*;9A_)w?)p8;8KkkIN@lTSDy~s!L(_eu99q> z3s?_O^n3)I(g`)7*_&4ZD@U8T)9r(r=$L!fX;&(C)4^gBqx!Wa}_> z7a2jLpIKq}49hDr>`Xll^zeASmbbG|s{?!%?{8?fWsIMgvps$s(Y|G%k1FE_d?)h zV0Z7qf;|Se1Re-HWBA`XHyZ?{hIY$5ZU51q@e`n@%=iT@YB2#)tnf(7e zD>uvie-F;WXT*O8fvJ-hxdm{3>&=JgQ+Oa?bv}oPwGyJ$(heTO(mR1hqLU(6mpQZs zAvL4l1!=6occMcO2W*A%JIB=lz9VM_&Uf^EYNC}eP(V+Z+^vm*>MHNcM)Pv0uH!Np zfTct^1bF4pC*ytC%?uap)Dsj#9yu!8?Q6744E#p?7`QX4Wdk|@RJ)A@PN|}wb<>~yj&`9uU$LxO?TFqpvu6(@Mn8-&sZgI+7w>Twnw>Wx~xN8w& zvDQOMV&uT*OgA3IQB~~^lI|^_OZDs5f&T{Zdw`<*1K^bUo#sEZHNUl_`;^nMq}p+C zBYMnUpxptXXc;tuVS75#wYlE!<{!H&&hMju*8%1MRQ_v#Q(EBa=f{38*EeU+f6jvX zIhPEnTde%IV6c;FjJc%77@|uq#+qaH+gy8?^}v}#2*f48w{@Ns7J1aLV~iC%jnAcl zJodk`p7w$crSJ4D@W9>ha|2Lx_6AOA^$^*v>)n0B+3Bo5<;QjpdqV17S34TmmpRv` zd@ykZjaYO%_5B&_Q(@t?am@C$>3m=RXE`4PX{P(Q^rKN~x8yUfb4RZOMNw zJ*xXix@HhvH4a?|nPdJy+rxBYhMeu@z{Ms=L<;|1(zO%$D*5eSfroz%9S4A-YYcEo zn_YjD{kFH)pBo&%MuQg5m6Kl!`k=A;I)9KfRv&=IDsC_8&TYSZijWrTG5ZORb`RuE zDOfs%p^D=%Q(+2GYIZX7ajF{CFUAoB`ElvW2I|Ea{x&m&53{0F;g=a#@H%+SUSQ0? z(a~7M>|M?;;H!8P+6S`KkPH5wEcXtSOY!+9!2b;R3qY0o2jG;>J^!?9kD>L5Zc;y2 zm6wLIq^e5z1vq9;f&VFt3}lmDXmoHK49ET{>8Q9TUjH+IuLN8PP;~4DPAT6W=Lx$rC^a+o1>!z+$%O3`{qwu0I5$Zb+6;_rwKo8>F zIEjbEKd?nLN}+3#gt;h5w~Z5qCmQJP=}vWikujL}^wEX!0e+)jx)EJ+LQV)_)CUc}`N0m-RBN%NNXf`lGx>PCE1D(_!rkeX`SglFeL1^sZninsJF) zKxe!>3tk(uotE~X?_}_Z*_{_-K@>}|ViTzfcxp=b>?~{zCPK;~po9~IW+Vof5GD*w^IDeZLav<|!HEN3ro+}~gma}4CRk>}B4_A7`#tM(`%-EjrJV-_uR3Obz_gb{A-Ja)?u{Mhsl@68ZW7%Ys4ODsDccgKXDILq zfXM(w&qcr~?Q-?D+FqZGTj8joB$ah8Wn~$q76_Q7y^H4Zn#sBod1V5|Y;uLN(am=o z-mBI{?*cyr_z0l#{Tw)@k$*m4esSg-r z`;(xy3E@EU?Y13arI z-a7$mDaKL*?rx`ID9gbhkuF-ex{l7r{MVS}mjB^+znKbrCZHCe%D(_OrPJfUp1t2V z?cn;9PHLQtcu2?W#o8@a78E7W3VmcN9C7pCf%mI^`y1e20=@;P{MjQeAGmr2%8zyH z{GIxb`>}rPG(XlDRUL2E$L!B_?Jk6@$TeH~v$i_X;95wMKKxzd$ba|e$oi>9{#7VH z_1AjfHvnz{DEf8*r?kV38@kcu*VgnccMq%6oA~p_NyeIZzH{y6T#KBm_ax+w$L(*0 zRy)943|YW!%-apBuMob&=VBrEW@W`Zh!M~~siVLNhR?FPFpHJaf_ekv&78xJEaI2t zNxJQ=ak?`J2Mhx!x;F!-bc^f1{IKgM@^rfE=3~sq5yVNUnSV&C?r)NtW2vWKLObN+ z_B|eLI~!pPz@Y=w|DdM{FQza{D23@-FgOdcW049g2YU=o6L?mV33CR&@Zf5T1YEy1!5b!6ZDNcMf){+wwyLHW2G5;AC@7@1ao8q#O- zHE1ubx8FHzk0@=iFa|D|)>^hIz?=kH-sGEog zJ-Jjr%P|cS4P`|#|ANQk`40y^127w)@?Q*`QakPC2J^sC-LS>34d>$y6&KP~a!5#7J;oqR)Z>gm*psCDJeiQGhDRcH z7XWVzOZ z?kdzHwe$VJw*a=fW#Ra|o%W@E3C8OTvO8;E>xn#q|8Y{Oe1CI`_Zv^(TnLa1Q1#Xc zIHh*-L7)=i@5Z(8AU7HwLXX>jg}OOfZ4id3Y|jvk!ko5P^|IGPSJ}A~E zfZq$)0#Nz?6*#2=*RMxGoBKx`+R-q(pFbi4ifxxM#6DsaJL9Ss{gFb->U4A~VI5Pc4ccr;pqF%Fyu-ENR zl@;o7aT!iquD3&o2`o@nieuG{vGXWn&&vB!^*ICiQm_%&`h0+_%I;_!UAFpQ<00y! zhtDe-YSmp)veSJ92T-xoJx#whOZ_%nzm9mF7QXyW!{Vsvptg!_CXLsncj^1^Wt^V;aqr3b9b6mJ8OJ}dU zkbR4CIn~S`HjgvBcA>Wty{f(KMb5mxz{v%c*HOr-bi!*kOGK@-wi;Rk?^4^JE7kVr zN8uaN+2xN@{kqKU=LI8Zbp5<|ddV-T`+*Ga!>j+W!rzS*4aEPF^rx2e{zMt87}=I zXYG~CL!29j9L~IQIH=!bD$MBc9C@b{Pe?h}baT$uNv7T#sF$tx^~eu^M}V#OC&;So zJ=@$b+oSw~?ZzS0+Z=u=*+HJ{r(Lnb9i?BtA@tjgys69cyU=+oI1c{}&JPtQddof= zU_F3V6wh1QduX2^!`v6KP!1yp!D3m_mkUTt=b*rkpPEhN2hWRTX6iEwZ;NmpE+j_> zXCBu*RtsQwq^!wZSEjthR z1@a#75wP|vdC2Ip`QgV-Iat3#w(~Y4Ir`H}^jc$I{d$$@RLfLC#*f0!Np!&Av?s&V z9N|johQUj88vmOKa$Ghr_9`p)VFE6u}dAiEbpt4zXk3E zmiOel2y2P0lpD%bHUAP}7m;gGIpdUWu&Aq4&Ar zee!ZT`31^zkA~nSE3-thCkQa{xz3e1o9EH;;%=DCOv`j7VbYlcF7|jar7_~O9es9R z>}SZk!QX)8lX%$hIkbNe@mNx>L0iQ$rej;AJGSTfkml?T8$IPkI01K{lXD=K%AH%3Eq2yBqv7wL}rZtj`ivE@`_m~E+J=bu|F`D zIY7TANV62 z1lB(9Agl6L6qjmO6vul1{=Th0_kN)S)VYXMDux~6ebW;R(&PASHI9EjWc)zXU9w+H zPQQw^-vZA090)%rPPhrjS?c{(J9Si_X!w^sX80-o6Ok8y-vG-$^KtY2j#tgN=9Ggz zucCYlbhLwY7yHu^{r1P0>SK3@#1>-mey_+Goh$R|-O*Vx`Mhv1&){&^d+H2qIYKYq z$^4f3a8uVl+{ihccwr)+-maKFdkZNicxV@^*Nl9kY!qV>KSp*naXaaON53aZ|0II< zxYP5yk>ue=vC-d+$);E@93S}8-(sUD%937qQt-iBaDx~vyW?JQoMi2i+z%mZy(+^( zclIta*?2M;7Fetx2SkV~hsv2A|5&B`SAC*kfR<_AO``Bdk$;mQ zTp}O+tG(QqpVkIhxe5O}F0}pI-QsL6ZlH5U6b8j)oyZT0c+F)T9b{5DXikgkME(uJ=hgFHjdAV$0r@|Q`A?JCi3GLygmSygmXDG6Rs2hM z=aM%56#sq^el8yN z_mkb{eH{5&@B*;++bhVbbhghMVcUr-0*t)qeuADxK-qk=F>v-GTnt6Z~LX{dG&D`t$p?{!bu32VMeJ|7*xy(H})z z>zIMELK_AZ%cA-}k{A54EkD(?RNk4`(ID6D#1CG*%7{)TAxz&VECHc>JUez5A?sQ&+x(mw`y zDwqkZ{@KW?beQ*`1MSsY)Qae}Dw)Tw@EMYM0Ou((nF_Psxb?iK{`|hJ|C7kifaihL z|01#~?eD)1>mMD3qYKEbT1?J?UEw8;cZuVS<9q{QHuaD3Qo1s#e{)LzSmdeTIAHZ3 zkE}|Ec?b5de_QRR66wU77r?+|Js2m)s==%&TO<9q^82>_Par=BUIJGCYsjj!umApP z%LYe^_iKL(T6@4Jg_8t$y_u{JoWoib)&HrK{t3uazzksZ&q6+!{toSL9V7GwI89%G zgXPoN73sf~-*2ry@^j!NVD-O-tV$Q#UmNX(tjCM$dAb2Uz&!v66klQ{e$M9AQT>0E z(tj25W^fa*`fov2rM>;z)PHS5{kp{sr5BaXC|$Q=bwgc4{e;r}FHb}1;D-J3bXc10 z|KZ|x|6_DjOTT=8HOECsOpU;1rrc; zTda3HQkYf~5ioEzNA=hSPg{>2$S;6bfUU<*kyUB$pV8)eoIYaYm@}!483^Q7ouM0{ zQ8vwH9!b_k*MCP!UpewPFbPtV+lAY^$x~YPLlB z>i9idzpo-+2etsK@9W5_9IAffx=_Em`l$W$dsg2+)o(vr;P}AmizBPjasAqA>$rZU zYmL4te$VP#hP)co1FLTxvMPtH-_f04zpatJ9sHiv_bcRG;7`En`#)q=4pF~0+B&XZ zRfDNt#g9|^W+Kl63xL(P2w9aw)o;Xzk)2j>XQXc{zh~?BL*!?`Pk`0;GO{Wi*Ka>< z9am8QisLk{GxaQbE_DuhEb=Tc7g)XLA*)gm8 z>uX7PttKEl#NW)~#GSk)oW0=#uJcD6k@Iky?a4xF8vk9)k#54|utTd3m{i~y6&v85 zC9_+XQ=N+ShUX4=%!G$pmv{&Hub>53o_(G-Ja3Ki`r3V$4tdU6txroA);%Z~CS1(k z-rn$4k_HjWyzhdk5ag>Q$NWbw=~-$m@IK*PV8gUJjT;Q# zI{1`Ed~ZPB3cdp@-zSh&xj#DB*c8Q+?U1iFG%L!oaH}|1FI-lu9htr1`^47faLiPh z6=Pk)t-?8!MKE`O7pSrG3BmW%y8dyG`A**8J z?sj@zwVkSJmMn?p!HwcudgFbu+IUyztoDZglFmNJk*<`Smz-^lO;PmRSww(Iu=>IF zBFjCAzUIksuxmrT!(xGxEfgAJzq4umqh1PZ9M)%+fi-5DaY)> zUE+oC9U*p!VWJ1d^kYcNh=b69y2 zKFeI`IYA;@e%b3;%HGy-VR{A&rhL<{Z*N|w$e!$7;XK{PYZSxOANWUUY-sf#Hb(zQ z51-JZem34W62G#FqS$(wH?R8{IT=AXY=J-9pCj3f#XeU^Z=~EzsscGl5ba`&cu9yE zqy)|;ZXI7!svC{H8nK66ul^SDBj9mh?bZJ!W3TOzz3e&P4()~i$*LON(X@!iOnjri zdn&-u-tdK(bF<&u%VWzstxyFy3jLzx!{_x0)4lw@1h`?7q#wRAB_2V5BxzjB*v>gB zQI>O}JZlnNQ~#5EKcgs?PwcKU0{3iOIKvbDh5o7GX`vW8#7)O_aUf}~OR$*F5lOX2 z+$6l=;$M;&E0?;%_{D_Nbh)Yb2I^Ic9aQ`N2J*MScYv+;!^o->?K11B)}N)rde_v| z)oPa#Tp6ozW!xKHiOGQqKN46~JUTE?H{ z3d3g;`YfOOksk-m!18$uS(Utl=65{E^9Ey>trNwjbYY1ooxnof-tb}JyaAc?OkZYu zMLchah8`!LE^$tCWKOzNyZsjvYuPkYXII3p?3L7WcpCCTa4N9;)*-91J=)jrpg&q( zvwF$O+Nzq>D;6tWTg5WnW#6m!n)ZfG(z#l>8`9n6;B2lRg5D+ZK!)iF3vpx2HMb|L>6{1sSU|3FsdfO(ppcOArTGghu!tFB;f%qmq>c10Nm2J^E&o`rZdmXl;rICKZll_moN5x6sY3|~z zJ?vua4S(c24+hf-R}y;TIbxF)eov6mr7Zq^;l{m;tfWY)OIORfN^G`Ed?K0V=fq0Y zGe(!vtE2W0ud)0^-G4=|(e}Y8V0nLltV)liW?Xa4icZEidYpsZN_NPv$Dfvhw?M!3 zcp9Iaz2S#RLY6I)<74SGxnZ)1*ti+OohiMH6T?L(a=tBN0a1ibSMgB&Gx9h94Upxc zV3zteTfRm-{9Gcy3crZ+9C_V*B@QS{3vvnvxk6S98x6>RyWd%-NNWKuBLU*@lj%i>jT!y=BYWv|ay${T{UZbO(niQyPYTfS!2 z1=wVHOAs9(u^|4Mmneykh%J^!`IpFUu~qTqYL$C>;vCXnAEg?pE?c)4J6HcSptV+e9#}yoUFat?**IX6dFW(o=r)+UI>bQGD<*8EV$x**ob)(V0EBbwP zo&Txi*9#mESp6ZgDz<;M@9o-Wv~iW2?9N{Gpe%J`R6Cc&t5rgkGPQcu6zQwt_w4;x zhrAwK1gySGkX1S0eoU=fwo|>hb|uMKS+$$Qe0^_ts^gu?s$J`OhMP=1U*vbK-uICI z2L2AL-j9$~>2RH+Bdy11t*1ENDN1XRT`8=K^j7XHa7y`IW#0|Rmx9ZI)%#UsRbFh@ zZ!cT3lH4}sYwDK`-!Oc2ZNqR@h-&Kz{W!c~#VV!>^($)EmM^JYTC;9t!&K!IRlbnF z>wf7d`lWs0TxXkLc-d1w)i@s)@!5$!`y2^=hHoF}1}vZH$f~q|u62n|+2Dq?vun?< zU8znt)z;{sL)G6?54xMwg6_WX9qByBR3@D%3=ZSCOD1@dWRk5SAt$m|o#Xm~Py{#* zWJ><#I4=ph^FonjpEizDdb7Enx5Bd&p31JjKz;}O5!ia{LssRnJ!X7h&s`pFJ=AnZ zS4rJibzfC;o?*;+_JwZ<=Pjy|$wAvW=0W72<)P>*UoQRv-6#f?NB1IQ;YLr7g?}p5V0d5H5_7gNO)JIzgXKaV z?iFD%;TzL^ZHnC^>2ur5i&PLQ_xb+<+J|3#|ZU530Fd>z>O{}@@7BW-tW>fhS*NYo|O z>}AQNs`kHkohPaN7&(pqj*M{EZ0^HeDt7`>STg7QMLP0N7t*`2vrXI;( zruvbY$n(HLVC!)fvMM_xKLtB3Jc8?Z>=NbcnOnD zcx^+k^_$v_{4ek+u)I$DmEm>qK65|Vb5KXdOXb>$`Wp^SZ_`%3LLKMY7ryR0Z_D0Z zA5S?AgmOSEn~Ymw`h4M&x@CY&4-@VXPiDtC)6k2TOakZe*F3*a1sV@-53`|Ms5 z)|eox-7@V7NY@6gz#1whH+k*p-L)s%D;qV%2xsmAjI|~UaG&|hWGWa zdO(p+;>RIGTHYuK%9ELHekSlkW-hrw7LG=}N)tnpahAq{geXb`@ib+ld$ezDIei!Tp)}DiZW9(_yQQrU9-1kRd&)LjdO;qfy;x{Iy z(^R#DwlDmV>s;pbW`p$TFiwmWR{!uZW9dUAWFK6ev2CWyN+9s^lL-Q|@J-0%KPRtS zkX9H=1llKXjNFSSs2t_?ZC(9fy!bs+&qnHD@8@Tce+%9Lww?=rYwEduwrMxJqxf$} zT+b=%7N1w!pjtX!_P6=krT*8(zy1c^R9F09!ug>$Tn-3(CB{O0sPYlT0D~pr^vl$V z!fei4A0vl`WR=PC@<>AH*)w(nvPT2WcY7@-%S3b`in=9p9L=f%YP@bDpjAF zcKshbXXi7}*1g3Jag%sjaIhzMS~u^fg!4`KZ_%@-_1;7^+}RcJD|)NIDMi2Hw*YxD zSPm?|i;z`mpXc`o>^r}9F){Dd_;aiHvGKsoH}~H@;oJ+s{!B}81qNHRPvRKPT*|R# z?RD3~#-1<2$IgG`?+ctb$N-jaA+jp%_hpWN@4__=HF`!?I<`d3L>4%YaB?|Q_EvMF z0djzv4my>O7+%%rW#**q_$}n0fLDO!mGQRW_327;fB!OiKLTD;O@wcIxl3BytGzw0 zXmOi_e%oi>ekJv%k$W)UzHoQK`H9cHp2$v2@cI(xHJ!tgu3SXwxsZD{BR8J6!5i-e zS#@%}o9rfw2V`)1bX3~ik`Aqud~lxX$S+doNhiyCate5NNs`pIuD3KjZtSp}dfI;O zyU34&W?=2`3uIN=`@J859ZY+&nGSY{4@{$)oO0UYHEi$fKMLGh&<( z%$QxUUT*N$%X9ON_6BhPrgwQoIMo}IV15+_;n6<&!?FHAawZ(-&kTFU$Oq)|2#uEn zgZ$%(t|>AYNT`Lb42E1MdC576<7doD9Df3d(6VDmc}(6xel4vBdCbD}%nX;f3ZBRr z5cc;=!;<(cw@&sYH4o#NUdOT8mXTlx6l4ko1VOTk}`D;1f=q$%o6ZlAfy z#f$JycGK`DEtuL**#-+`@UID|AC~y(jFB07$$<=}7#4Rc4zUF}3|yw5MAO4!??~C0 zU@G*5kjMB-Vz)?nxeSWKsljd$o~Cw0nSVWR+UE}1pB*Rpf8d!2@_=oh{g72@ZkJ#5 z2->IK!JT&wYcuE9L|MslD=G=#P(%QSec@W?Ru+mAgz@YZ6oee-RpBp(aI{x-hfdW` z4BtA%kD;*TUvoIZ|Fao2y#aGS9uQ z=>^SwAnv_M4vp>8iumqubmScUoiG-f`@(1{T+EP_!L;4-XA0TwTlndC7xx2 z+naAtx%rDSWA&`Fl^K^fA7REyWybNT4S|-3UlsZ-zw4222Dbsr?`~vO+OK~eF+X*w z_ha|zLD;e1_@c32OQc_2=k9+ha0YiIZ+xIT<+i#V)oK@m|VXbo~V3l~7 z9u_z|BOV*jQ;HtN<5A=vfgc0Q;{{|@j&OX{cI9-CT{Ibt!>nyl07o@Ka^&;C8lZ}@NBH06 zk(#9rh0ai?a;VnCeH`&=LbrX6e2Dx{@JSm!WB*%xQnNpEZKjx(+8FT|`+uo<+y>-} zz@Zae?^4)Qi|e;Ypkwfkqk*^gl}8#Z+j zj}~;6Qh#Na{P)Ru1Wp0=xijW(#zq^WxQz>=IDZGU7d2O@EuYWwX>I-V^O?Y_C8a*Q z{4Htk_+pozuV0%J`t1Sl9cD3~hfilPs~E)ypM@R*5hJiN=8G5b8WMBC2=37Fr&Nd(M?`RPER(#$#Ka+G8P>RaO znf)a{ztk%T3QA672QEK6IiIyn0wadA{7Gr)G9#0GYc~p+RW!~WUwDrQzAdJ(BsGn{ zep|%#=e?tOe~X=Mp!9(FG~Nh4X3(T-0e)zxp^w~qMiMW5}bO7?JXg3-Y8ISE;n>L{YbXOkk3l-{4G%>+%q-Lxx|%_G>>D&fOM898Xh4gcq&ecMj@0eg3?EuUdBGUis!(f8JJ z=P{R9tYjk2Wq*S?;A8^j^H%x4hR00wl)_6rUsfZ339O5BcWE4A+Gk4t>{^x4R@o}e zd6w;os8mJzcJSM_ef=4^1$+c-z4s!k(&@V5fqK`fCz_X>kH=3T>Q}R=29;$d7R8Q8 zf8{??{qHj5daxc?{TCyvV)v;!+=pndf5G~iI`kJ-t-^VF!aVi(ByZABTwaI<7E6-L zQf)D8{zG*A(Nl#UW%rMi{*MZr7_dBYkX0F#ZrW{!`w51}$~6QiYpB1V{N&}et5b(} z8^w9*DWC#%f3CvIDPQimJk>i@^;M^Nty!EnNARxURgGSIeQrel9(WK~UOSL=`Oxfh zbnX7v{r>WrwPvu>dbD%1c+K=$S=XyPHhHG+A_?=8-T+p7yU`<@Cz8JM!)4+-h-^%A zZGW}(kA`pZpDDiMk&g%SfaP0_tjep=xrZK3SNZ|Xm!r@PHR_V?6q`&hu*7r%*SpTo z*=8(=sUXcboS&um-6+^_t03sGehfGj?-_ng=(qO#9rC;2&%pBgJF+TE+WGAsxrfX{E@O+4Pv**u$SoPkC1c3Dc*e}6~*1bhZ8AO91>r_*)E1MQ%?Kyz1|rSFOh*fGOVNv-G2Yh3`{8S$t>kLA&b zd^NZcSRVHvtI`npE7mY+I?q&WSMiif`2$vtQ30lFO?7M}D zQL@ZSWRaaW%P)9M=KIN^u?##~lHD=sVnW4@B&oA^xfDZTT>1~gcjmtfoKpCxerPT7 zrC=kle77L0GBIg*9>#M+Pb{=+Qq^thBvlsS3z&lm=epQL#^A$<{jW!eRqVD6vH`nW zB3`@DYx@QNQ*xq!LST6fL{`P#r=5%omoggEe0XB0M_KjT67SbLl=tiB;T@i{ovqbd zB%{VR9>@W$(-7nwd;? zX)JdXDNjIg0gr_q>NLuHCffbP3MO0Wt!8v~{ma;KJN%OHQ|<0o$ZvwTBF?JcxABWR zT<0>pSFTw$lIuAdR->Ip9!!$BhMous2*@H!EasH%HTo((PwAVFd@48-SbMEOR;7!2 znKzrIUe&=?OyRO!7C#fWnV$MqWH%9?J0cw^zY3j(#A%FpG@-}V`*+B1gFi&NRlPf1 z|2@d{YKR;=#zA5n!Ku}VQP)0$wH;k6_9r6!W4}o0uSKo{4ZzxABeE(-!lUN=+WH#p zvXfgeiv86g+AJ42J1`47(d76}dPC#dD06L#uKdJYpPlHncKIAR?i4zi!1C&ce5Ab2 zuc==Vc^>9gOorH~;c1v^3pwFn)?K(>NT=Di)a-PCJjb@!T@k-J^jm)4MSc)G z0xZ8LkySa8`;AyftC!T&FPT<*{)*HN^$2af+0J`#)JHW25XH8&AE?-8>=uf`*5_g+ z@~Pk~V0pcata){|uX>PnRaaZDJe*eGMaFss4E0(-^|#c)fu%qvfU8ExIa}HDHP88w z)wQBn+)ISLV_7)eXy;%uGx~kQvE8y<9;4oLNwiXx^4^srCkGSLiAd>=3&v-vh`z&Q zxzE}h>u~~ij&XA0F(iNqh@OUzQl8s8=#z$1Ls(Mg=Bj7zVEHQ{pEKbeoyJd%J&I)N zI!!}90n7u|9w#Gfdvvx>e-L}DA{Tj$9#ZK%Lzl%DI>c;zMJ zH^A?J<%q`Ha4+Dbujyp&Wr3B1 z%w)hR%q&KOLpf=Y(3ClyX`Y0xHtglJRKb(5x3z0h9IdE1FT%_AD<3P4exc(7%eyDC zDo4_<%;5~uiaNcl>m@Jev`(@gr0-Y0;RHqJHX9(qbmi(F&j@1OJsuUCgx622qt7<{ zmZRUc;~S9g0Cxk+uL)U|o1%GpC*!cP!ELU4lo6=%azO~0Zj+ToeDi%C(jxEn z_DInpukrT~`tq{)n{j6=$;$FWT;^jO{A7VONOuX>OJXXH?*5{n<7vrHmV`u#FQ z+>Phabq#cT6rd#R?&i4oZo=b1yt>Kin-|=#+wf z!1Am>R;7#ck0p%y_nUoO7GLDt$udDOmf6Py-OTjtqbbtAA^LqaZodWjPH;D{`X7nD zx8rvE-oZM7@;oXZp&EGQnXJ<{#y1dC1?|aR8j1ceI0i5E)VL?z*uhCqcj~Ellpr4i zrU1+1iZo+~id)Tf8v5BGub0^mhDV>q@R7t9foKf#_3M>Fzx|}g7p!MC#-A;7ZkAO; z$H&rScCVzYF`K<^KnD2%;Ue}!vhV>tgHr)Ptgq;!Hi2V{2)&ZXOvphad#(yL#McKG z_LnQnK5v{|*+h7eUso{V_zHh`W<|!JVT1kt9Cl^~!GGxKK`5Cvjej9MAC{ ziHzJ4a!`(&mhb1slIe+V!{wkNH!UMAKb=n{eCow_+4(tqn(WB}LZ)_SwU3AASbqY0 zi&_1%^zLq!+Uot9U@w>zz3vRwx*a3aV`upCLb)~`J2{Q_RepNdhZ`_ROUSg`)pFHE zX)+eXUiG-a-xF?{I#(3)SIf2IVgW%nWNaEoD&oi=3WU$tZ;nmp(@Zc~ozc!`J9z}{ z`*gV|alhV7{hI8JQ#d9hK!If(&&og6NfgE~3Of1WhJ zY$vaCM+Q#{@3&I^IdFgH3%UW-=qZh*rhSyA7q+g$OhG;koDFRIxD;8H!`WX>?JVCX z)O1+yEDu-GAT|~n;~z=q12r6oo!xGOnT|15mOogLoXHmRU!yH%O`wnAyAwX8{6V$n ze=2Snj01q>TZpVmr+#&2yl9ewrlzP>b69{WW&x%#&Vj}2Se5QW7n3Vs=IO!oXdH=^ z4L3)8s?k@$XT|4o zgj_-S3G5yZh@PlbeT`jqqo*w5k)B!TpAPyPHH>RRq*2^0^rd@F zIFG^O6r4Hw$RcHl8HDA*hGkZiN~rK`818hKOw-p4WLR-RN06Zwv+6$W|C2jc_m?FK4qwPj$_SUnJ*vuL#c7 zT`xHSTp?$O`69~>uu98}{r6HI`}`|qe{%#F18jX8kyY{5nEEci_mKTQC*zerP#b3q za)5p2-Q|j{?*EbsOx1l8u?<;eT_m&8lX8l#b9Zm39Gor5Jw8O_kR2$QUd)`tWf`-O zrR+>ETPE|nyMF!zriaIbti|}bA-m3M);e51E4=RRH$?1MZ;JWnS=l*5;seP&a;C`2 z33B;I_{j{3+CTNN99avt!MAjwp>*%C^h^~X?Wv90d zOth9T&uWZwo@y5hv`MdiW9wQvY*d+o7e_i)QbJ%iK_dM>mB8;2nz}m&dyQhI<{aJ zYqz32#=KwRF~zX1GF zE?GKT*I<1oyh6IS{fK1|!i+oB?dfqwND-XFB}liuCeMj6hF?W~>bbQLxfYxYEWfLf zRq3MNSj|e#fTS3RPUI`X-p9qYxwSh zkL~AWL7|fiih$+&2(l_Odz<^CEdP-A2~*fswj`(g-}o0QIpquP7y9Y;T88sT*e@36 zUamLoPQ_acT!0mIY4Q~k~&H^8$gh%NF1PKO8KBKEy=Nqn$~K>WEX2SHkpnafjd z5kdMdjpY+9A@GN(P!{-b7OD3PKV844`3e1w+ogUF{Fr|CeNVr;KC@$W=jbORYe&WW z*H2c7evAY<#)U*`%jf?rIwZ2RW5&)&#?CVfQ~l#w>760`-G$Me0f+f2+H>CD3N{iN>h(yQL2BKh&&sd2y8uWL{??{Leow*oO#Ih5 zJ=6*y9c#&E`Mh_%Bw1Jf^{fgt#;@?5d*TalrWnQcYPvdn2yN0{$h@@l%(T$uoH>7^ zVNFtA69jCF=Wt9>h3xZZkcOqayN(@sF1_(+ce99H;Efl3yb?JytMxgyYl^8~3;gZ# zwr4l$3Wfn&zX`~y*mL8Dcb%rMs%y}T`&Ac48?}vUo$%%O0KHK=zzhV&a{)>`<$cIJ zVXEQPh~C!mF!J}n0}&Us_q3#I`=F~1Ti8+|3k zJOe;Euyz=StcqQaJSE!q=-@eE^|mhg;hwOE)4=ND-XNXb@kN(;;a9vz`T5(0x3aa{ zcXm#T>W@BqUA7^AA3PLsIE?+g+WPu6_4`>M69$=13(#d(q_3rozHZ$MogSbRsG{_B zaa}Q`ueIjnJ&NO-3v`)o>bIQVw%7N1z~;ePjjwLwEAZ@M*6Dx?FxQY z>H8}3W^fa*^}ZEZl`i^cw$;0ze`aHxoY4t3l_LMlmPr3De&3FFf}Vv=4k!dxe-C6; zy6B&o(tm(|W@8-J%nTMTcD#yu@O!JS@4wED0 zh^qv7l}ZK&gR*42=qzt&j5NVTqr)+4)$?8-m?x>5*PAI2>#Zz~vRy%-q9ChKmc`0g z7Rkg#QvHj1XQ#%>k8Q+7KQxf(11)^4kjRk7#9JGqZr+v#kUuZ&Ms zZq;l(3tr|tmflm2GtRdsYUf*ixAG*zV>^0m`}!kt3-~9nJY*lkRXhL!qIqlHO5-@8)7|0u?dA&vB>b6iC%jj*CVe37erjt z^Tpo3o$P0{+Jzapb?;Ur63%n!YS`pdM*4Q}+jiXWH{`wGQ(*0o=xglIqpN-!(S3$q zJOwXUywc=9tT>t-^?c$SG{%=XFLGT76wSsQepm|rv0arv^ zlpQ)f2dQ}wKR?B1p_*dPTD^1)_f`=^ikzRb>#QnD*%|455gpbZA0vMPK5L`5%l=3y zy>n_d=v!LN?t7!RxARtdH~g}U=9A5Juk4q)?zPCv!AhXYkz9A{eB2n%b#|vm&d2;# zX{2v^8-4E}{{`#;_PUGyMz{5A?CO1JosSFaDp|#tq8AJ95zYs+{34lNpq5}K!~&J| zah5l|jYHnfh*uSQ?R7sN`4Vs$u)MBDR>eM7yUJ^SC*;QX1`CK zmWMxpF&-!emd9{pRl4kl9JPl7oRGiZ0Z*#sfy&jlG5(@-Zp~1`j(B*~jBq+`$n@E2 zC-(aywo$Z3&1600RKv3o9;NV5&!KI|kAWwE<@o}#DqZ%QwLI;S)WWJeMC)Aabw))Q z#%cDbl+)}`>okj=y3-7=qJgRQJPvspm<24alaN*U=DX24R209sgYgLKCi?c}X2`8R zi9WTjp2XimpPJE=b(<`&pIR3?&KoAW>2XBzbi-pSdTf9CEb?pM=fLv#1F|Z%op<6l zqWpJLL~0=t*F>(xhmZD@7R&U;#S$4h^63Z`>H652+SZ6qMOms{RUub{T44EHgRF`d z?Ppa)=XyG@OYKVS(~ep25qaC>dM!{%UK`_gdd}{Q;qnF<=JNng5Q&Iv)!HL9O?qya zb3zu8_6oxOn2o4YPYAipovux%_3t>-*l!nnto_6wWRMOl-y&pHy136@hhOG?`}~dU z^WT~zi<2FjmWowyMWdI6tXH4yLSF**~&HNl&2ECHi;X}?blu3gcqBe z@HOfDMD&hTa2w|07*ZB26uC9wWC2uUu5vt4q5-+we^eHhk3mI1c%E zPy;OA`=al6M|obKyXTPO3O!HJe%Y<0S^U`^(~CdX_}6o#KM$W*n^is8t9sMt45V5Y ze$aJx#)fl9`qiNKD?!g!gW^|$e+Z%u2XY#Vb1KKGPsGTzc!K5g5Z3uVaf~Ibsz3hK zAV>c%Jzfd!aaDsDPei3+uim?XKuuzj_dSt)i^v&Ctf!u$hZrY{{n3(HeNUX7yycIW#ePQoU!k+uW;!naS#Yk^NF!BV3Az0w3+>wb9qxXe5`s*H_ zg!kwS#6wdxKRRn=@=!HySrJ|Tp{e_OH1e@v2C(%#4Ox}t(Rtkt<4)^-SjTEEACanU z-EY+9z+}BS@IRa>rmFpAES$|`AQ2zKW)IhElw_rLh@7X_$12VEe1)G~R2o57lZrFF9MEL{)1%KMj^UPK{*nxg+B7B6@5;(}Mgj@NZywe1Uuz zJX+WJTh-@QjKg!TQTghI3)PNXf3=tHl&&&%m|0%vl=4~i8|#oS1sj3Ye>1Wwqay#t z_oKL$9XuCW$Gv(y)=HwJN&Z?qq?e4pBAt)Zhs!#dCfF}`^Elg0+xeOB2IwnPvD)x@ z6TPj<69M{K`um>5qhjFIcyotdkDt18l075%od!+PXR;96kq z@Kp4D7yHls^{U5YyWX=g{z01a&CKEQf88#1kKfbr8V|oqtZXp$tf(-yQ}vsJd?r`} zZ2j(zzPI+Y?;TucbswtxueujQk?*>^T&yRXw+pdB-YDtYe0su!^I`IK@l@vY-R@C& z)5Bvwj}32j3;xH=Z+7JqiTuxF@`@lo^tt?nL^y=}a9q#kW?$=&|?fw~+4#4+G2N2gs^)*&m?|kH{gRZelBqZwn^`Djuy4G442}8w?L;WT8`v z9(6qjBaa5-f#op?S(PsOOQp__VvpIidWp8Mt{x(1XnU}TkO0nY!keuPlDxq1*n}Q? zpFV>8WAGxdJYGds#m-kcjQ4DwJNxmlOSM}WE!`!E%hAZ2x;j6QPC9Tno2$;#&*q6! zb)n%?bX2OHOhKLl<^#)T5wa>>ZYP?TTCwk_ofPlaPLdZH9$V34+sRAFzXZPlmdEdr zRq1j&X~W~7?WD*4?PN#9qij^Foyxl! zj&{-pwQk`R*3D|YkDG*30i3&9@8hkP7#=U8$J*sX&8}L zolTs)F;3Ftk^3c1uD;aps6vnBaUt?oz!kvSV-xbhc(ln=+kt7$(Sgf(Smaiz^vR!x zCVjF^_^W@F_3enqo9MAToTCe!G>`)zf%2f!Rn#Ti~3F zPdpDERq7gzJ*v@Td0c~h6Zi(OJnlf&|GwS&Waswa$fgd_p&p-Ax2v4yoV11rUl_GrtZdb3(BK9&dg=ixtK0-UD>fuXQT z#bt&^9eON}yO19Qj{?i%ab#7x+)gclLG5H?8E%L6P0EK%2|ZlkeBa(s%%IOIw&9atW-kX31aeLA;?9-!#k_k7(} zIhp1Gvb!D|wN>@I$tw(xThU|f@ig+w;B{bm`~q2(!@Ykki^A&VwAHh8Tip#4phK>R z-pU%3D-Dm*2`L`4kxvKJ!17pvtV(-(ba1;wSU!cw2jkO$F=)5ev!?CHMD3B7iOzS0GYU92 zM5HN&G0J(kDq$lnF`1Iwcc zS(T3Oo6cDj)?KGovocv_BjzT}1UT!=owGCIu@^mM=uz{&(n{vQU^uWm#vrTm&31Vi zm#tZ|Y-MfR(b2N{y2ZomYDxCZp@%kSLN<%bwG-==@$U$yp*I0L=~%~**s8A@BQ;)Q z?9mwMQ9SNOegHfSERP>V-`jNr`+g`M(V~J$)~Ld8Um34;t`u#cjW9xouPa)|z;Qx=8QC(?V&ruVoqZkxr$USHjNlwN0egi})U&9TT6z+|9`S}!|r z|M;M43B}N`mfh%RGYo1Mox} zy$9~kbVcuqwezc{681+2rxj@CG`vtIbt)shd(mO%*F&dr4}hb9Do0S?S*xpRE?Bvy z1}~@s>P!|R_Gcr#b?C75y%+g=;DI)J53{~)^d6+n51KlwI#oydThL|e-FI4{GXM+* zsvJ?hXV%sb3HTt@ep6rSx=8PGbl7^|fxH#m(?;)M*W2nnNVVUh+KrLkUFfj&&7aP_ z26})atna*a4IN+TZ^{g3bENkablCb{kGuuk+(z$V*0-(RgVcDdbq8^_M*81Gm#ugD zj6x?19_y?fYe_?KDMttI%QVeI@c$;Mz8N55L}4??I~l)7EM`J0kr%(PiuH z9|sqZ4vxIu3+ro$;Bv4Q{zodlGtxU#=|YKmo?VK38Mv~I-ovkVtKNfDe0OWbcSZVN zM3=4i$HH}&>Vx%Um$^~zO{9}ZZ{^HXz3Y(Ig7v`K`!MUR^&X_cSGv0Q z=2x#b&#Ud|u=RZ(c@OwU8@-2FU&b%1J9=i_t7@H$^j6GD)pr^4xnMOo!uqz+yJD^S zu>V8rzSe4&M*5r3W$XP1V5EQ-E6LPMWnav_*A{mM6L!)z<*Hh=vp6G z>mAg(GSa&((xL9FSCHQTzXf)D^mg>U9Ut2F4#tUQd~(1*aT5c@XWg~~#U@+t6H?=| zlabE?i-Fa@3|W=KA14|ry3z6IEv&kf3GdbMZ!v5KEYFzLk?PH+y>CO09Vh+@`AzUv zq+30=JDfKh(hyer*=Ro7@y=#nInq};JEdi8|L z;{oSg&P|E08dq)6)Xj!h9eORVdyu~m9s-uvBgm@!2X=}cn6#+es>MvluZ~~h zc$bj9zID-t-*1fg>_wmDGk6|n!N3Th%8}ns*eAte2n>ce-VptpO_AOW=&*XfgM2@D z7+5>}09lnIwF8~1Hh@}dy;?;9(`&8ch=Xr#sH$7c^>C_EJcb~T0TY1bF&SBvBWovy zMPc=M+)2arjnoVipw@|csC9tkt%k=Y^jLd5h5Q_N5m+9tAggku_E1lkg*D3}_h~a9 zzxp8a@y3Wx(TOQOCm=5ZrvuC9Y-ClA%r5)0NzKczK44y6`3+;AZRoT1`5E%>!5@I- zvk$o~pAP*%mp3%jjU2wbj##~F!DjmE#cP`Ro-yKs}!?M!pto0hZstkyWXV;sb1-*nyv1 zTYhDOBYLct*RN=(ow1^JrE1nCP3{xkL#}9Y@ADs`6CPq$kUy$0ESitsAQ5%4dyzu2h{VnW z)rg<%o~hHbXY}Qpw1p_yf|}jwjn3 zs$U%U6aA!=1BnP(oK>uR>rV0J$}ejtJ4NJMhIevdYFt@`d^$KASl(-qRq52BxH~WEZ+gh|9!r*SFF;0OSu&TAf2m8FLXYKbh-?}gb!)XlEHO`JsYwk z;#&uwu@F-C$v2U|51N4G`y*skp6e{GW?TE#)Ya9lUNVbROdD#|{Xz1X3$Irh5CRo- z=9)Mz9p99_i3*gDZ>>&DJx67;SN(6@-R8Q7ix|tJSMeH!JPphOme*orRo)zD?%NLi zJ`dzYFEh7hm2Re6#jlJ9&T_TUbxr&o8mJ^b#9)6=U;KH`a!(+&y5y4%OnDK9!B2Ci z>6>fkw++uGcr1^2?m}(>{{)t2_Q{54bDH7Vq5sx_JR|#AuA9Z5Ofrc<#)wTMJ(5FW z961lC5S-@p+_aoH$=~Ay8}PHR0;BH{~HX*BW1lPOm z-NO~XsO=T!$Vv-W{MghLpKGtUq1P1gb52S1Q$vuafa8GW*MO|b8J*?RJJ6nsYU*d% z>^yIn%YLKO+nh7a)&HgEY$DE=iu6??T^*<(F3I?%qN&m&$76Nwbbp5GjomAR>Zq=j z@+oQh+T=E4-yQI)gr91+EsFQ4g-#4u{(X>DdA~D%ThoXjW<8hCmwK*9pmM>vs4zWQF5I;L6*BGa`u0K+t=`J`JUmu0bZr>QoQd& zehfSTEbnKKRjG>d2X=V=wk_{z#I|3uV)Zh8Vy@htn7d$iYZCYB6T;WUUlh)y z-qJ*kpWk{wxbFLg*H-japjX-J7szjb-$q>2IQ_BC{CL~)F*7MWnqZl}YHjVhCF)RJ zsdHVt)LBx>&pDeTy``t8?%xxUYrs-q?QuS`D!+{K3EmX-+Xw7lcBH?xfe}unS$?6y zsSs2p0hPZ<=iGjT2g~%n&Pfj9b8@jR7hW{XyU zuy%R`S(Q%Dr*_O|I%AO;>sBv@NN&Z5=$z_x@ftlI>6JRCy1 z9dY^(ugkH-oLXPI>7bwtDK;&1u{iytn(<`O6>Byt1+m;64Y?YLAuU-8ks zOUT!R9O>R*XUnW(K4R{>4T@*P`+npn!PCI<{xz~H*1vprbZ+L5&lRF@>}OB%AS~9$ zD;gOAsQ9YErRu@*m~j5c;Ls<|QZ6wGIVu*aK!AE;aFg)#DY(W*4bReZQsb-H$TeUo zusknAR%Prz%=x#C9i8{=p#Q2-{Jgr`l*7tZ>Lnj!t|5|2{HK!8^%Fc|6{=Wx>4Us% zj=PWQ>Gv9xmX(&J4a|Y8{#w1W^RcMkhtEv@q}qeGxX>vD{ek6s0p%M?UVrR}Mul0@+ zWzoXH=Iw^x%q6LD(t6~tgWG`R_dc>J+Y5}n#|}6=yX*BInhGIhTFgqvqvq`>z2I>L z@jMjY#+dV#3LTsrD9duaK5<6p>BS`F?e7=)nTh`K0mFI^@8buFv|hw)9PW?mojXc@ zH_k8WBTtl>L!(c{nFL)VYFbvgs`B;1yG_Wm<@xT9MQpVCi?jKEOuZ{>Q`hAZTT$FHQvQ%tSnq zp80_A2gXP1{|2T7s>8a}Tg-(`Vqc~OO;4Hnl`c)y?{wsPupZd@eH~eq-960pEQ;dA zcD3E<`stB)YWbpMr~8)sx+`|N&j|fi@;Yg{u8Z&Xotp_DnVA#%ajGf!tyD80g-9Qb}fjGmXQ<~*a8^A7Ql7!=Y;dIj)9zzeMBM*V?9U+A=Qlehr;usDe10==T>;we(z7n zpDKu}Rcd*`*u4(ERq$1I{|538z>~n* z{X=9`Hb!~kk{!j}Yx_K{$M-6=+ERDFnl~*4qrpO;4iL>^UH`iHFMMYQ5rDH}M6PG4 zyeD~p09=nB^=+Zwmg(1(`gMwa zt@}bh6yA=>OmRib*%EAHJ0q6G{zW`i9E)d#1+kuqp|arg+!E3w5wwH=r9P+XhszaV z9rJFU6raU1IbOC#m-tIb1Q-FaKZb7sY@{4RCwaf|uTTYnhX=5>UY1GTQTIsS_n5v@p@ z7YJF!xqO*8#Xp&}rmWDp^h;jcO%Rp<3x;u*$+#QFgS3JYQfwz>P?D8Uqe_`sMsV6P zH|UeD#y_#_*g*4rp)WEAyYX0}w^tVHlTntd5-sxYCSb!x>3xlqr$T;*=WaB*z@O}w z#$Ma7haE4!f&3o$E3o$Z2w9beC@%2MkIXpekoH<#yPg%w+WOTsE9bHcrYzPZqH#sB zIybaAzDGEJVGHFsy<|3tu+6JXRN$?@irW7wqgUO}wa9Bg1F*ab*rvzmS4y~mM7CpkXbxoW`mL$YCivRt-IK^qfoGyRsCj?;^9hHnM^po|iQ2ka zRY_~AbpAj#C~jr~GlwzOWJ-T$^e5|5_MCyd2%HYAJ-?2uN>jAn*(H0L{i!JzG}JC! z6LFdv-EUjPZlOD$TGRRLA*=)KsDMyJeljo1%gmR>j1e+OOyrUnz|T@K8VmZB^$mI* z-8<;x=Mwlh&Cek{f{MvSA2L9UwYk9*&&_X{dhLd{y)OoQi8U@T5!ia&j;zY=Q%pbG zV@DVITe4kguV+1e)!Q+H%JrOk-pVDlYt`7N&rbi<*z3O7>F@Afr&HS!e}XJnVva0f zNLNW?IZEX5NV-#`k>N=cTd9l+t87k?Zbv2!;KN!0> z^{MMU4!H`P1gu@oMOI~b6t81;G`~D#yE~X&%!akC<$lRyN366c-i~pBjm(d)_8&C-3M8fH=}v* zv}ix@uz9aovT%)_nkecmVy^D>vi0j#y6@W(|C;N(5A$y9SEtKvUQXIo`Z6$@9WB?( z5*;VJ?oWny9lY#w><;8d!4tsp{@Mn^`;T&=`jhj^OU(NrdGj1wz#)fdLmi@HH}4SN z`I)?a2b;h<#K$KgsJ8d^cU@;QiAQ?MJB9ock6E2>UOjVn6Uh+29A5MXg0nZ1SR|%D z5TU(U@S;BuroCD4qCXH*yjk#~KQJX}R`U}5f!N*6f*1WEJIHAkyyy>PMR-E+a=lWT z9~3kTUi3GGK~b~dMStiP6gLZA^arvaGz(t%@F&?b=+!KE(chE=rOkpD{SEy=v*1O4 z;BILayyy@8g8|Kg7yV&iP}VGX(H{l{gP#z*K<7_#NHDZn@S?wAMA$5N(I18f70rSd z{ecl;v*1O4I4T&`EO^l$Mh9b>1uy!;(ZSd!1TXrhNzK_Tc+uZX2qrcQUi61!f=SJS zm(7a75i!HfQXjt!uVLL;Tq?``mpD5Ak8S zy<#83Lwu;WSMFnYh!3mm)%zG8;=>yI8~Yd@;=@{d-4hHC@zv+q>-RA{#BUnx#wQpa zLT~5WO;0d9#Gf_W8}>0g#Gh@nH|=A1h!30XE&CWA;=={@H}^3-w!_;jt}gPiZ!^3C z|L^txn+h%w`tSb4zO`Ikmrq>2$}*|HI~`VypXmH)#xFJc{cL0W%M<+D?mw6Eai92x z&&4+!_qSlx_4DKY97fL{SB{^uc6_`3VUa^6P!6e?EPJt_4Py(qq3Iv4V}z$!rTS_hfJm?LtYeZqS(y6dIeKKfC-gcH8qtWiv_ zZpX?#Eml1Q>o6S;?H&d<-3vv|)jcKo?e*fPdEf6Le*l;l$N5cyOhKIkQSXzEqm(zY zx*Rwj_%p}j7B+_lP78I6o#*puFCm6=Z(DKDAk@AQ-}nE6X1Ojj#- zt8wkGAin~<0Vuuy0WyW7?VwMZuHw>TEO1KV=0ROqVeYCp$l2`G!;=Im* zyaHGQC|>75J|3?g=cG@vblh!=1LN079oemK@3LEu`v~du`0Pb|N>6`-{3-A`p!j?R znZilV!}OU=+R}5eczq5QueZB@g#9|8UC(f@9`dl`fYi_QOXBtTTadp4+yE#(w?L+# z_Q(6UpW96>bhNh1R4J{EH638AjmY>5UZGf%-b^Gz;1m{>=7F@fLbpG#g_5U*+c+H1Q z;pqC;*K*#tY)uncn4Yn0-9}n)lqV6kA9E6+)8n%P@u~cK6>#TEy5NC zc^bLNeHtzV0qr#59H-?O$>)$4AN2?CL;ei-3Q&9oT`u{ken7o@@S%HED>gJOTi?90 zq3Jx~yq0GDqC5Blbq5!rH@L;U-O#os)V<*w@6dmvozYMF65)pONgw~YFU8>@xS~{e zSvsP8y{nzy@vP+A2tKO(e;@LFz)p`Nt@E99ydijQT)&2nZd9DRX2qKFx~7K4`lbzQ z>YK|aty?DC=@n_Wx<%R;y45aXSRym=u9F73k}MGJwMWF8&$K6LC?&+Im|4 z3V}mNn+0Qy4lmx-h(o3OKFB`+e)NAR-Z`*>N7*?#`gw?6>s0ART&g~0emhMo0?GhY zPDVqfa8kdp$LfDpL&MsQjdM4y7n=x;Tgj5eMsdB>g)f?m@?f!8%wg7SOr`~`S^O;O zIz-sZn4?BfeL5BH|jRi>4O2X33K)u*44tM<~&CW4k#*Gz9 z`a4Vf)d;($P%p+c^!UrHuD={%kCT5H^#1awe}#ntd^i0o`7g_g>x=agvIo13884x9 zxBf=zu^oC+kSX-Deqn`eBI?<^rZu9`t{e;-zT4gD+7Ya!;dUSz z)~5@9$Q>S!1ztSV9$gH%75F}&cCV@S zjA6)-o0y(rgtUw1pIuZvtcp+0#LC-9o|u}Ll9I~LPN_CaQTA&11B{>B=}&FMv!zjbjx5W82Xl?Nf1SyoD<1YNFB_&pjdY$!7=RQ~CKik0#>zF3(D0<EAC8tLIzAV*p@L5mwE+>dOFpZ;_=ry{ zQ8(>?Nt6ZHPye^F5HC z0uBI*$1fp&T^?(XCGz^zqlh$mJi^;$Jd{tvAkP3A0L5dU_j^_EdvCXdK8|X)4jI&X zeaO&o-G{5{*f311H*n0UX0b%LG3Pu@%&|w~nStHnDO%(FVMUQ@UUU2EVOOr^9h-7q z3)-&-NAZ+*HWlGUv6|ttoJ6<)=XTn#l;P%xESOrPB$yv;!tc#U%I&MoJ67XoNhuNY z6w&(K$oXs*AC+Nz@QTcb@OR?rFM~V=m<6cxuk?Pe%BOnwD5rFOV9kp4%eqF8l{qlW zzk}g1tiq@5beEv*l?lzkNZ>GAavdw@L$76t-(e}RAh`~gKERShFnv*$*zoTpznzF* zjbGk^{0{K0$Ei>I!|Up|h_elNmtzvLW<|HDoSKxJsXgSLslAWu*A1AK!CVr+l`DSB zv{<4jhOjq~d}^uWjW^*|G#^tH+Rz0#9)#;%8~6fH@h4s<`5o%h`L%M~7fl{pCt~ZrzG>3xjqBG^(^9*g;coYW z@jmTg7cc3MAVt{H;8NVpI9_>be7^gJ z3WCpLptudN#uv(_V%$q$aHof9jblxU5~yHNCYTQz3JO| zprg_!9jJ$pqL9|XXqur_dhsp5ch}%EmCGw2e+Re$PVeG^dFUpU_Dql!*=|%EYha%YG5H=VAA^ zv_lO8MU>)zQ-;$CFol3oPzafR1+(*YF%DbJG3tkHkQ$VM*NzUEj&|@=_3q!0?Hl3u z3sC8ZLZ;BS^NX}dN|q|+@g=U^?2N8O>I7}Kdm|@nxsg2CxI+Q{IQwb0YRE)4mC4b>b{#>z^c#PQ;_; znHe{wX@h`DK=GIgnL>*r+oM}gdOm{mQoroHo*Z)9_)qu&&f55U>;TMVce~FRI6+u} zy1b1W17KrN3S1?$1Eeec*8fx^-}|RA}|e5`l*9VVSv{je&F>h$Mk1n-=lmv z@~LOcSdIJ>J0NoC3a%YOGx&z+;TIY^sMQMpkK}PH;)x+1YCjG^ei?WTP&_&yQ&9IU zY&p^WbCO4+IO8h2`eXP!=J9!zX|I6KgM!Z@qk$ULPLEIVEpa}}Ag=`)0mbJ6$o=56 zVq@dFHOpaSEmyRAC)RNkvG%`6J+&d;7$PP;eFXWx0RL{BR|4dI@LCF$RRfuVn%|$?{v7T6O4O~A@(s(@%9XFlm^`0~3H_t)V{qP<$8%u2=5ovM zCCp&rHXc~5(y{Zp_a&be#HZTDA3}Zt*bgW^zlKbqkL~r;Cgj?@3mSX2*vmwVeTQfm z_t2T9#ys33mu%cATAi7EalFND{F~$zzAdh&YRJQYkpP8$v_DhVEnC%GK7AS8otmoc zL7Q{6Y;#(@c(&j>WB5)gC-*{r0C=!lJbfIuige3bR4!kLum}+rX>a3=%?>ZV&TjE# z-kzqF0Of$v_jt$@9y;vp>z=$_=^k&qk8EN8BNnF8FuxP}{u8?N47C6GIB8%2{G3LPIvy|*HMRUQsNZUfos%+?c2jF&Ge`G?U3pC$T)Qr{~fc=plyyill51a*1p!(43z0R^9DlYB8 zXN`0WArITQ-~s3^eP^u~?+(N<9iK%%2>ET`T|nuBeNS@OIarp5ll!G9r{g5u7=Syh zx*z1CeV8Ji!nS*ldz-GksgLBdxEn09qc|9Y(!djpF?uke1}8y~otup37(bQP^C@(E zDD_kaKC1j)2zfhjJ)rm=fJ~upcHC%R1zUKXg@d22VgC+xP+HL5ENo}@xSw&Y&CIh3 zc);&NDJ9EJizhf!;8P`8`nn3>(1lyYabLQbPY2_6Gg$l}8B0Hwyq&w^`8x#iOrQ=> zyf1}JVQ-Z;E}SUeCm8p{dEUf1G9rSB(}_5n_WrG$s#UTv3e zfcagnH3s&lcZ$o#(}&|AN)T7mItlRl0B2-A(t16=j~N-T#u#AD;H$7|G}3-fu9Xna z9sic;>Hu$5pAzqe&u1VHQ0W>1nS!cMYF(?>bionC-1?2p^&)?$d5=_{f%TpAiUcI+ zTBbdWiCCgljidxQR- z$)lSrFjTVZc5y6+K13!gd))u(+ACIG@aN1Ji|e#;PJ^7f1tNZbC4rfXa6FgA@y1zMdK z{|>~Z>eUO7Ujkn37Jt9%lNdowuHOKs&PYKN@kX_KY>GmJMwRaG$Ma_vITNqt;(3iOUX#Rgig=C?&#C14ZjXCK zNNcw%cr{Af>Ec}5U_RdZDMLN-W!agf{3~YEm^MtQ16gKbxs_(+@I-89Tx?8tal$5` zPcmyle!a$?YSv&Q&&hH!O*@G@`A(imWfg7=zQ-^>V;gaWZX;H0jSJyx4oBMO^7B{} zE^7kv5E36L^Xs0tzAl6OW8hIh=_~tQsjo#BN9k8Z4DSYj-UETv?jqZC{-fj2EzU)vZ@&nr0R{qVLuO*Jp30r%a6%Yoa-p=F znDr)u@fQyDpUO&&8T?MpH<@*8w(kPI$*qG;cD2_I)VWe`EzpY^mp=k|53twMRln*N zEnf;X!B>r(oWm^~t-{IS=Qa#MDKvWVYWKy*pQVtifMI~juknyY=#zgX^jF>DClL`x zVw2#=V~@KSrW5e$$1(e-{n84tklXI@*oJuO5E1qByC6RgybLHFiT6t$J1>#tW!uz~ zmK$*#yNe1)VA}nT?0fE(uPV_4eS#0vVE@X*mQfz}ha;#)iAL@}T>g>EKX&=wT^xFJ z++aS+H@O_L^>Q34m=mhjhjP>A;p~(Q9p^id=Plgw<7E2pm^s&(KzGrKu){C&cQyFe zcS-EdnQh)A=Ru}z_2uzPXr!{)DDg@g+S7pK za|H1zeV0Cfv+%%NK=FANGKIG7QqMbrQ{=SP(9Zn5OZ-ltw+I)v$z3**9yoQSB zZ1J?;5hH-_C1^W9H`hwUVfSS2B64|NdRZS89M&>T8JgyJ?;Th`xGilPx2>MI1Bgy|7hL8!IfEV1mhtG zr(4$jrgikuyy(#ZG%<9s#?R}g(H{5hn^bQ}gx)y|~tOw%%e9DqW<+L<2Y$u@Dq za@s4At<1gzwXoLi#k(4DsQ&xAkbeL?1StJI2bn_O?8Q+2kBVPyU8Tjgvs@M%1O#)b z<;TTt2NQ6t3`@#B94j=fJl71SVIA4RKsguZ>7cAKzJ-sHRirId>M8oec)M5!c@eM- zP<*d~OyQwE`ENaz@6-lNMV7DjQbC#D_%0a@l{8RZ@8VjAM>=YxqKLy2DvtVb9%nj3`dfu@hRR!q%%$Oe;xcP!H?Qg=RxQm$OaVu(;-u6*JOE(etEL< z(nq&9O8LaQgYA;Fd!?+(Kee=N{ye^Tufu=h4CUi+Wx5|ua(&oM9$ALrO!G>19r;gPe4S{WuH@Q1NYa_`o=bgzAbXKf#^!g?)M~RN&*|Wy z>Q^)5O~5xjZvCoXb!Zv9e!OSh+V7{jwbYBR4d1QW@xMU+H}D0Z^pgCL)JuQbrLL$& zvD|`EDeT$K6h-qtTssI|gfKwIN{2PW7=$@nO<)04pZUgAHr`msMt5~LT1U3j%WCjY z^PHO?-w!+pD4x$krjQ)`I^~fV6WMmQo4-gKjladF64n0u4ed>To^K7GiW9O^y`Ez> zaxuha&@}j6W{u%vOuscyUnfdkI41cGa%Oi^8m$nF=P??Ixduwc%(IYe0CBCL`dcTCCKjqe+3kuf`@zN^U2R+l#BkS8zoX+3;aV+pL4P7 zc&Huvj-lNUz_7>)`LaYSWb;8fxngs1j^BkE$?uuXE3iWczYo+U)AE-!%RHM(z=eD- z!)n?ybpF37upJ%CEbA0bmX6qDtkI8VNNosWxpEK?*)!tZra68?=B zm4uINZ8ws#7_PWZj}IcwU`x<0m9iyhlS+{u`0~|FS;4Q>Ej2D^)w^1xmVq)IHM`>F zV>RRkpczo8e&b|$J#)?a6%CuEbDpj-(+>D!xSO1tG>d1wc&?x$ z<$K)g4eba>hTuZUA4GeFlg4w54d|4rb8USw@x7868(?(Q)@3lzUgFjNN8Yxj6HBHpma>wd^PfrmUU{pu%= z$EO+hPIQ~|z86f@I=y%gcZ)acu{13gC;%w@FXBDkRQm%&tAz*4d{~M&RC;fM{9WLV z|9!mJS*mMV(}10g3&39vzCWgTE4_F-5QnOVzCF0#5*P`n{J#$}g_gClU6`J6()L!g z3*A*NOYfg$vAwbT)Ox`ITIsz&Jm2!B+5fe*&rqNT88p$()%l%<`G}!sxQ^e5Za0h{ z8W@)syKs%+qB}AS{4Q0`LQezJv)rx;_!cal!_1Es z!a+~y3P%3K%J`ey@UwBoWnAxI)&x|T$|{*3N04r{uTb<8+;I(@0w}$-L#E)|DD@FN zso&6}$H$(Apd8p}ZL@@p*46U$U+GUwSZwWa4~Dd>!xg;138U-rWFgFiCz(n9f$pb_*4J(o zZTv{7x8ld+<#;~i1;8SJ0@a_B+R4WI7gcEMmSI4I$>YNMrUraLF&gb+ZEIqToJbM0 zN-y4>h(nd*-$MQy&pFa*e&hjD z+n!i~ek93?h0Dy4YvGm$-JqdQO`@&;fLvwFH(Ny~av`=g`4A4L0{DL#HPIq;jF$Rq z1Wz>%-U0b%z(GKz<8#OqR(SSRy^Q0IT6a+?lC|faPA4rPJW5YcRW*MmAFC6Fnnoda1xGf`1E3|$agK8Jj1Q&*p8^=Pcn9k zw^mX&UZ$^ZZ#)D_pT)o?9#Vbt3*4;-~&F?+J`Wfw6$%w+J$YeV!k&{^`Gq zDP_QJhIM>$7qwIFFM2zR&*Su15~==N7&aDR!A{IZPBlrv`LZr{GHW7Rz%uw~w!)iY z#wJPryTMP@gLfcz0-peizy74;uf|m^-n|DW7?%kB!k7%}P#fVura_KBiG3@(N6vx2 zhZj|XKXL5=@b+6jU|8{_!BY(t@i}|~jX7E;d-;#}W6&Sz_j<^;0(Sz6-vf|E=<9gn z7;?Q2I`+W&@u+2Ht<&Ro81buqIR7cwz5pcvg?{z_C**b1;G-=`EQN)qNc}V-E;awT z5Ast$8=&;_cgPgJ-u$OKDaynS_80yRt-L-cU$$JLdCJsYKvw25pAWtbjr#8MA(|S` zx2baoGt=;vNpI&}bD<6F0xFX2(`0&T_r>$O1@e`^HGoRb&5%XtYkt>lY+jACLg%gV zwpM%3?jy&^Zmn{<b&@uA}&>5uY!CJ z@B={U=WmcHsQTJVdn5a;xQZx~8*k=l2%CXHz-nLz6H7IJG_|WEG}=mtCh{ySAclQW z*G|_5U_@ml7><*Vp@rPkaNrziMnaiB*fo59yNnI-g>bixnX(`Sd0ob@=9tIdtfQjW z&Xjts*&p{CwifbLz_ox%*9VX(6fgWb8`qC6*s28QV`@22HQ1AM+?aAH8 zP;&HCV4aF>%j1rpL>E_W!o{3kp3So`PV$=x)p{^&CWvto%*}g@jgIKYj*aHAdvpem zG|&%)-KR;t)E$V|?-t0{1GfN5FS{U9_)IkYLv$@-x$+1Wy1ZSE4PA>FL}Z@i?X<wjEBq_YTJ-b9vs^swuY@hu1BSLQrGj6|&={F~gf+s>2p8KW zcF2L#V;_!y=*2p$DyS2>PB+fv!_~A`t31Q2_uv}?U+RaFevY&Og8`MEDUc~B`^%je z(9q`-^pnR+&)oV|8`mvs63+j~00bAf{0A=gaDmHw@eF+>Ch?c++UqF;Fo8EQc%Q+- zzAEz^9p?B%{(X+y3`7ZPJ5%y*1+N(K0PkNxeg}9DP`tl@OyPgQTjs-YXjgTo{SMdu zaTM*5iuSWzw6)k-lK1q3@%8yjA>R$$2Poc6PfOlAr%OFQx3}N=78U@KJgGas!)Q0( zF<6K32otYg7~(bf9fO7|_xiP#)M}%cW9Oup7x)JF3Zet_0tc9Z73+E2%<&b%rEN4n zUC(g*dcq7|$ZWh*agJH{I|XJ&Ub-(D@>^Ir28_k&1}<~*MSXrN+jN#C;Aj*UL3;uh z4dS3Pwvyyu@iH4yqLt$-z&m2btlZ)1ce=~u&-|IV>I%CG+1_U>*T=ekmutp+R;;`MV~yl#}QCE~+5;(391rika~{2df@n0h5^ z?Ww23&Ga?Q8e&wS-NmMsQ3hAq2JR|*g-uK~stg;O3WJUbc zEGr5l(gfaUJc0c$1Ff}h5dA>ct#25sV4OKshYwlDbg_`@8=adBZ-A39z42u(PDs^* zSx$yiWezk8%_)(ICVd)a;<7n&Lgr#2PssM(F?w(AdY)q@rY4!QowH5a=-+6}hL_Pa zV+bz&ieb&|a_*G#*}N&ez&JDdG{eaTp38I1Oy{S}z`AHIFEU3Kj4#U_RFGPenmcG% zQZ-x0>e&K24ORlJYh?ay`$fFo?}FS0`~pz=8O>BgC_yOF}2u!t^`gA%Adr%udTv6 zdWtzHiWzeN*Sld?ATwrWe*+t^r{tK0b^*S^9t<;^^I)Y^0FYzTYDa#FGqnJJR{)2P zrx@N(sIjkuCC}B|YGcW(;9<#lk(md1aEoz)9zg*=pde0pOkCDnPs4Ax5TV|=lWo`k zNe+^K%KnLN;BoiQhE_(~53r=Nc@ZzNifr2$jHFdy@gN(v3MrNk1`9}94LlxKVc&Ez z-@%Nje3G7ya#FWZ^4|@9s-C|I`A@)K0LA~GkSV<4&0l-5Ls%{upSfnk>PgGiFRvH3 znl#=)h4cMq-1`5WOe zSMcakVr1#^B@TFeOT%g9g=8)?#>nUCQS88U?x-u*ef ztTz;wHq|#bHmq;17yC(Q|7a+R42`t1^RA;UVTZPa_qsPStvcKAVFk!A=D@a=lf}S-zBcMw07x2quE1l$TJJ>3hL!b9)K{r3}|kCpb*I9EQcp{Zdb=Iiyd zu;@yglkP&0g6Cvh)hlhR1_>K0`u<*T}rk>=%8`WtgF3&{e=y8KD(-6dMkk1u`+O-6Hk04e=^o zPe48dJP#;dZ$bXw@tWPRVb1#Flbd@2a)_|g<5&EfIKMfNR|0DR#cu~>3emG=dy%#K zr0oV=Ds<)JjLBe?+hX8q1D&-P?-}Bi^%b=9r2C$utsc#DbL{Le4ku*rLB>M#ceF%4 z4z?^g`bspLw~<5MVWzEr1wl_`SyW-CVs&X0Y%hiz=c5_KxS@&{xr_bOIl%-Be;~us zi>3aZ=i>9Z3dqxdS%6Ak+Ve7ftLtRCcAj?9^oe=u{59)0kkfA(t)W5u94#Rl#4EUX zZ8fP~eA3vJ8`H`AQ0qm@jYhEeid^yEe`HQ;yshGBExXuTAU zUuKsk1gF^x_w$0_Fngg{6>Nq>6LT8;%!JWLW6>WMITtzA(~P-R zO2kMG8@ceuV-L_RYo2qKnH}7s-_PjpFYyI=lha^l;Tq_L&RUzUgDy1SY7_`=V=J8H z_5}L7<&hQk^(=S;^ZwnL`e>8391e14G47s$IeHfRh}#P>Fesx&J$#webEBt6Y7ef1 zd^d0(p!EE-_xtweWP7mTFDKP=motw1_Q3D>iviXi81W(oDf`?fb!|ZP(t*4X#but@ zyB}{3^o8{Z?)ixD&?<1kQLM@M-5Q>vClf~s?UzfQ(HG+F`xwa6fLVazxd1W+H4o{f zU8Ni6n&fm)RKau6HVi{21D*`lvUKxRvN4=&v1aiJyxYB`tyf4sJH7ZwZ@+}x4!jB| zKJR5BXAHE1-Bh1ern~^`UsEvr1`=V^LzrGtXRLF-p#U_a&}fhU*s+ zcp#dUQfuJAOBiRyVS!SGemRVtEeAu{Dmr=9#9vhlHL-1y?-B4(ddqtWcF(|YK=GXf znS#>W$?xB#YeC7BbH?Oun%m9J-9^j)cVZWS_Hvq-!bI26>XeYUeJbawFrpY@4Cno*sg6pMg;MFqdVdfH|_zBa#0L8GC z&ND46wS+?^{$oL$CE#ozP7jII3LFWDu`*d7>aOgOuRn}Le}#rqcT_x-7# zL#U}}W$VPa>uPL6_(1ViuHA(j-jZQIp6c_NMd&BS!?9WfW;;;nY5YQ7!+esP(9<=N z-(keB^cwmt>|TLfK=B&{nL;1SCymC)F#z_ZJkztK3!uqCLW>ygJPeAXkKlyjfYI3kNMDz6}+6uD-|QLJPgkFyJNKX!3d|#p7AXUz5i%+4C`I6i6B}lkmlz9uMbt@%@r9kjDd)01ExuFF9AZ z(5aV)7Li30HsPcdT?UNrDSUE!s;JB7GoVvvn9t9d+==fG7CJYHeG_?eX1^ ze+)bdbm<8)g$o1^r7>*jY%L9c) zbbJt_5<`0q*H5PNsg@7hz9AS0VN(zl6Ha$bcu9k6zZ5=#J~1Dyaa=`D+ zR(rGLJ^jtN{x(6r47d_dyzhlfVW(&3*~>m>ocHM{PqLR4)5xVa;RM0b2||zmW?BbM zJ>%{|P%Ob52iGscuF0fLBU)qFfHkWWmLpVLdyC}R2_9kaApIu)9%BGt0HAnQL8hSm zU#RiQ3CmsMnnoCO%hH}!dm;Lt(D($c&HXXcCgQLm_8zKOm?#Y66M31+ZmrYf(}MU^ zdv`zN{lL?J;`1?N3P%cMKC5|QFMQ~9sjLM@L@gLXHr+dfI0LhtHunibn>z*c%HV}7 zV8yIpFp!?a3;eD#$b=gMSd=9hc3^oR8&+jO932-)s56$bI%^tRkMZAVGh~IS1jtZ% zo78XJTk-U4f_yD-BcRgr7-R~oz5BRh&-ZffMC!Mz)ox+$id39K2@26ersromJZpFf z!qvV(US%w{!#WmLQFMKfz_bo7ny_pVV>4mnCT?CvzjwRj?ffC$9*uxJ4wwii-cun{ zX!rbL^s!usF#xSy94JaNj zK>iv$CSn_B?eTf+?ZKnn;}Ly3UY}<}o)4S_C?4lPrV#x==3gK6A;(8b9~0KE@a}<& zEImc2rCw`e7$MA2YSC)%lzQ2T_*A?28svWh9|MX{={u6oHm_ej(p$eO%T-T4RAU-H zVwho02SR|lIknBb)X<*6>^EqMI)fsX=wxAU2Uou95sWLT*)bW%U5DKYoxC@76yL|J z0yrv2G-jgGjN-Xyoa*k9>1qLQHSXID`6-|cQ0aOZGKD^lKZ{GdrHkeRv`8#Wp(AzE z;S3;q4psgu7%nWsP}E=K_)yPr_byeB$yh7u8jp2&{9+yP@;Djt>A(U&@%sj33akGv z%Rw*xHxxfq2U2$JC1@}6y4uX&GHn}dC#lg);u%K1thVEDetM!>pK7~X>TNILRqgm6 zARh+)4k%uMKT2NHz5b?;yu2w?TJ1)Vx>z*iH)Fy{$HviA27~Dd!#G@DTejhpZ;dr3AYlo8d^1lJ6fnK4> z-OYFDyI|jZ(0xPKw&ObMkC?F@BdH7?rh(p#%y^XXEj&qd^0kjiewFXV>s>wMbwDGa z_Xv__OX4Ird1m;v4#=eBlDvT@u=~_2arDk{tYM|pF{rIJk(q>Qae&` zn5TVe;|i-%cyLqeD2*PE+W(33*Z_Gma3Mf}^xtRyEZy}WHw@(UwbWl^Ll4>7XLdH$ zO;q|3M-1Oj?dt~=-(PSK6rj?d3t5D|+MjlhznRwK5pUYkn`zdO36udDSmitD-ofD{ z6HbeaaY?Y54QB4UWW^a64*iI2umXgDqxM&7M4rcnnV!qT5gJr(~o zUcTo-UIwfL6t69iDI9$d&k5S)HO-=qWBBX&2Nk7k6$+PJkf#Fn1MIhenlG4+E+;e~ zG(;@E*BJFgF1**P|A@C1@shs&3Hb}+^nRRI6f%XfzS&{)Y=@RNtY6Wkv+vQk_(ie| zIp|)e!z_aa!()tE=nXlUKt}?I*f|)jZPr(-1@9eCc;z2F)cE}_$Ugy|1eE^%0hz*d z&)?vY_j{Qab}whkm#uHWZ8*!;#djEYvk$PYC(ee7S1Rqn9CUwSXfJ?x3LFbtRwDL_ zD)COS%6K8H{)X^0EFt*Q?WCy|E-BZ8mYtAhr^)L4T@G_p)}+$a`IJmo?cd_#_wylt z2e<)H>3SP7h1W;OetPn+`qf{1-m$1J%x|%NYmpH^;KiA zHo+)27I9af&P)A?*!R|bBY2@hM&4#3)&K)0Ms7Sg41dsY4Q&)+8XR^V@s5}{4Mu-K z>79yEz*N4UVM?%o|ADdbYKJ&{K&HFqgLr3_!=PoNl3 z{AwUmFg&}U1t-1N8sqLB<&9SM;mO(?sLWYU)mT($PzWXN>-UrL2dF9?L8k2uM*KJV_riycnrp(8nw%f9>3y$#Q80NyaHGQD1Mhi zrtr)^WW6o+?8Hyd{`J)7`i2elb<0qLsTG7>0Bd|iwli08?L%Ll5qA8+a6%Cr4-~`V zDg$?=kD)?3)=JmM!UQuxuj-n4wH);FAAFQPjep_{1~4B`d~fNLd^OL%(G>%FnRoTj zCymuam5kis|0;>KMBX;U>u08T?PB8fihO;Si%&n7uN3j&s3(={J9D*GTxAi(JZmU0 z7%NyI{{SN$j@(DsA-JyzVGfo6e+$X@UAhx<28J^*Nsa~sjMtjOvW>KGzzD42+n71X zEHjHH8_A|_rQ!I;^rQhsfo^L-@_W_3c&fgG%bx1~%z%?j{9k}u@)R7~X39Mj@ysfkW( z49|4%R|ColoYF!gaT4g2IF)4;&hTOwcch2#yD?Qf81a=vs&B`PF+h)zLCYC#&Zx%R zzZ56Pj6Z<8e+;ke3@eag24Uo5`rPN4&kUt9??0+kQ}{2M!-lir=!8f2}ldZVZMQw z&vFxX)}h1*OU*%VJIwv&J0|Ne-(ccZE1tRH+5C>^ z=x%eh9f4||JKdh<^4zI5jFNxJe16!_7IW8^Vk8=g?gBod+&9gxHL#7BJl38FyD>f4 zD6Md;61d_mOiD_&BbCW!pgb?)lm}vgd|zOcJ=U z{t#aQ`PJ%t!^{7V;_KWSAYTDo1t|U83z@=>f64Z6_0s<8NA!PFaS|@BAZ*?|ib*^C zM8X3km4KUc?aKf<82Es2&GDEQn^vJ!o)9*QsePP?wgA>&cai^<*56Cso#3U$VR;|p zz9V1+pm-mEOks6I@;x-@Yw@Oryp>&xn`~e*yHzLCjf3vvruIM(gRk;*opZEKb#49759X6i8$`aU{fzup;|GSQ)UV09 z{fv1X99AB5I}@~9Lev|i(V7&D(R_Rq3aOi#KEN(WPA2oT>F5!L@q3vsY=-!01`qio zIarenB!sG*p%EY!XU~N) z(2REK{;L_A&D)r}8Rxuls%);6iwaQto>%@qjhFv5kiQ9B0w_Jb2AM+JDyg66?&yb} zHaB5FAoPTCl-tf9;4gC4&L1;h#Obhu?&Xg5S%`*JX^v~u;;e{+eQ#(e!zyu3DZs5o z;ezr(d|(2vF2XfXIFK;7xCX9JM+0tf_;|Bg&*CZLMwp|{8);StU7s%@3mxI;8Ipr=NEEh^nsy$8m5U%0a6~~q2!P+g^%=wQLOzHp;6FAT0RaP*?e}o z&#;{^!}2QXjSIhPHqQ%@J%FeMj|ivy$fx(c@_!_ru33;z2hIdkx|Ttv@HNMwDF4%N zJ81pNjqB8a6j>aptrqJ`r)q~1v$3fnEM!KAJ)rR4B(I%_SFNAC3b_M#4^X_0K&J4u z)=yRm-&}&oY^hYWYpZIuSGvv#F zD*?stUdV!9pYB;cYQ7=)%@Ee>mCG?~ o+|30Q2hS!4>*z5UF3aE{MpvZMOF@Nsa^{V&s61D^)F+lOF`a<%HoiE!x<3K;!zs9D9y=3L45cH{*H3s?jXE3P@9=STb52Zga^zf32^>V*5pg)(S)JVK$@Pj z!id^c=}yKD=9qa-hM7{pqh?KbBdlqgFmQ}UveToHNV#utBEF;&?_uTUVAHN}OnSq) zOf)A03w(v>R)cobew-PhD$%lj$c#4T8;0#rJ}hva)x@{hXX6q;zCfP@7w*k8JJu>c z@$w(~Q{$B1K+gOx$^)SEdp=|etG)5bp`x#;Un&4?>`Un?MLGqZa)7~e(Zg78z-zpC zKH2@l-{ptl;x~2TdA0nJN#0csy4(EPwGk9|D;Y-y%I?7+EU!8tIb0puQf5Y~(}G5I z$o5}cW)@W2!B}GswX&)3gYn^fd@Fg*tB?rq})Y?)BO$kIKtp!?|H!;4J3qS)p1w6hN&)6Rb~+dL~XQw0tSkRrggqT~|TA z4Y&(X>3SS8h1WA>d3AF7UvB62Y`%7|^Y11HczfXoj}q}5*Pa!LDB*6{bh2>xWvyW* zc(j-BF<4G6;sv6*Y3*N0-VSz=V&FyjF$(fbpbk*HuZK+GaHZt?`lx>J7FHJV_O_i} zEK8li{9R~jx-ju!^7S)CWqXCt^ zGa*yh;`sq+Gy0J}ue^DO0EC@d3%gp_DP@w0(mZ-p!tUyz`vTVMIi5j>++1e{eMU)TJ4Ol~jaQ+egwv#!J<5h;h}nsWflc_@<21w!Xb@dsu}U|V3L_WGUXa(IH`7u>1MDpKcu`2bVpK(bxCHv zT?q5hq5QARI)fMKyBK?bvA=o;Iy!BspF>E04CyER1ofyk04M>Jer74oN*_q<$-z8=$*eAIq6}@h95)P0}VTssh%EaggWA4;q zb5_8gjZB`%SMYbd))DQaE7Nl;_{PAO((`M`t`XIOfJ)CbkSV-=v&`?eUhjW-^&HT` zk;3C#xK6l3zKX<$M)CYq`d0X_{EhtCkL8EU@hd9QyF=OwsWes1vnqVku(;&-X2HjH zD0yly$V&^H;($|*L*2D{amxA3j^qpt_zIkeQD)&xT}Fy80sakw1`p(5Dig>XhEt6` zD~x>zDms;B`6PRCZJ>0RJ-n7V<<5v7GG0E&E~`z#Mn!1u{9>y4Q}{!Sk4(OSxuwCS z=xO+GSY(Ai<`&>6$VzxOI-jo%ZQ(Qdy6`kQ4J1NkqSUiy#`QcD@?>BJp!B>PGKFV! zsoyQV`N=*`zZv&RyBoV0D8IYes$HTUy~wpAY1A5o`MH>g`*~IZ-7+=95RL|_coPpA zn1+kdyr7}ABuU`;+~=IE%jmcBKcGP zHX3ZI_}3ZQJ<&W&xWh)4vx=7*VeZ4NobVcFV~fM(**=rTDnl`MHfAwgbfxs&nk;!Y zf|ugG3vwIq3qbLH4>E(W2$< z&_7{!>uiU<4KGT{4|MHdw1T|#C4+nxi~7T6F_uBb;Qo&YZVmwR&BkhM2`)klEqtvK zui8|Zjv8DQ6T@e!pXWh-1b7@!=~(H=bliEVEH_^~+W-0~cQdIw0sH-u{dkcET>nH# zX%x>(P4T)-7q49Ld`14jO!1-UZn0SS$B_045*$S%l$I0>4#pV0*r>%|%`(EtsoZaz zA1sAAR;`nXsZWNHp!?902eXV!*P3Qc#S#mQ;H<=QdvF1Fj1}m#?3jr=w}(fmhVxS(LxSyve%T zWIN0&xp-YDp3UMp^KO$`%5NuV4`o!NvWIyZChVC`8r+%0V0GWj$Ma18{kVW8H4*Ae z4VmHd^9X|mtZ{lK49l9Vi^z+yUV(vWTY;B; zq)(+k=z|Ot0xJCzAXE6@Be_1^ulcj5gYMoY$qpNXoYUyBPK z+&*-(tAh80?rq!O4AHiI=(TNM+1gE+)EN7nk^XNpV>H$(asCqE8R$FaXA?2HmUWqhTqgzea+o;{dtO2$31RnJ88mt6)=j zEwe7w;nDdq#s;!+PA<8Xk)g9#>fu(Tv&PfI%aFeWbbnkA--b-Vxkc(>%O|~+-=2C9 z3(!q4z>YVO`7QQ+?pGFTu|L+utDTA0E%NoTd^LS#QR{hg1XCDv`c^Hc|0?a<8OD4T zACjMn^&Fj-0G6+Y7gX@dP5c{dq?PCln&Z@s;cm7wfG5`svNI<03Gn5WE)H8wj3isRnGPW zrGDEwJpKCmu|JG*cC>zHH%x3;K|Y%EcU#|1+GVlb)+@GnJ)!Rs8g0wg-pV44p2b5O zob#}R>%g6qbGm;FT-0$MSnQk=hU0R6k#lxnk#lyKk2P|fL@SC$bi#D!?36|N*}mkY z>3ofyQ(`0q%FckhqGU9#cG($xzKQ+RsxwUS#zpEmG`K2oGJM!Hv%*QH6-Zc|6;27K z22!exkvQ~Ih%UYi9*$16DvewW(Ovlen}rKJQ~4QK0?OezMg^~hv5e15wQ%{42^(8@ ziKVPV>1P8_ALvt(o(~sIIC?1f%OT!(*rD+0QF$>G*f+!i_PxbOuPdjIP@vQQfw^`$IQH7J{?v%mzn0kGt4=rJ9we9oNs{{ z%gLS>i(+#Nkau#luuI9o!a?_5rahUH=g-E$ zN*`^dj=?#_F=~L==J9GpylUO=X~=&AIswINRHEdyB~jK(dt%?YTbJEoJfn+Q z&RFqWE}nAslPlyo?}*K~2QBU898^ssg<;LXqTS}9xQ;RjH-#l8%tAYE!hfdeFXZKc zu&>-sPO+m#*bXK0(qM6VERa!b7ny$SvYAC$a~k=91REkJC}Nwac)pl#6>a4!ZX+?NBZaGO&8$^Wl6Nry^0s zm%`eL%0cUN$?sOgulT(P`8D7zK=JE@{I&Tt(`B;VF4GVkuVv%KY@TUv6Tx7Tu&fH; zl#{r@w)KRyF8iNwxQQyik3|O?Kpobg`OUNRa75S;l3Sb;2R}BBmXdGRF z53!jtJ>isidd5PY4x9?8^qd2kLZ9u~J@olF4I+o2-;W;wP z%#$a|8*t#9N(21Ldc1Zb-Wq(S^7;zoe*vEYir0Wt$!n>%ei?Imsc$`aQALxgT_Tnz z9+L{L5Fakb2P(RUaV2sr59i(z`A`E#Ev=vx<5jlb;(ESa0qYwq%~}9P$GB3KTD9Al zvB2&#FFD$dQ>C7_fUio=J&+#+9tKo;9)(O{x@SMy%YMc3)f?BZm18b>qZd*W zX<_GFLPsaIXm93i!Bzsf+Y?`kM{Ks_p{2$1dmQ9Bz&t?lXo5`PaIw_q;aIPF?e0HL znB(h;iAA7)(#q;R`aeY>{>0D@=jCDLH`8|t3hi0&Bbo|qW%dqO zppiC5@y~D&3HdwUTF7ZEOJPTyOvfScRQlvm$iP@YrQ_UmnU0n#B>zQ^e4TWN4rCJP z8fnOF)jxqHI2z+;(HP^kUOd-|r);H%2ziirzHiDFyFFRkonN!r{I{6 z>jVnM!V<`s?MqLDH?u)QAi-|UPOccs$Kh}~D|1GSFl&r(7<*#@I1P39jktCpoXy<` zYyxqHxzNE9a!60IjG4alq?#G_L@YvLb%A5_TneM+Y;2qbaT6qMKc|GsY`XKnOwnhU zi%gv6bHahZPz-}>?4f2^AY#I^D2Aw}l}eHm6VFWi>wxVmc8bt?=bM3bsb*d(hUqY| zoNeX~!-&+yrv!j!n>ieNr&bCs)y38Dc3vz6b~u(}@bpr+lQPqc0cL{9{l28h_9VD8 z%;*LK7p!4Z)z0WV@tP=jHirFyx9KHl@lv$FhURviu zSsq?Teyer1yo{(;4U7O(dDse>!cC2`9QgNro$`Q%fb-B-&&PE;qJXbZD{xdi+Vn&E z0otp62^-SXfIMw!M=&3}2IU#1C;|C4KD&f9QS&ZB?P95q z!$_~vM>I344F;+KrH@k}Q&9HHhSy)6a9!bOKauLJRN4+!E4JfY@oczTw4J|a+U)~q z-4s(T9!d2j`hxJno+%at#v9FW7wZv@Es=b01)r{QAmq1!cLBvWAxrW-TqE<%8QZV? z^SYwh4I9?1q**CguM~XSv581|^*U~p2jKwbhe_C*GLvbIBRR1Eo_lR4-|~fmn1DUjM!Wi$IZjHBI-Dkba;XEaw zmC23W2eGkBNw}PAheZ-h%e5lufW&?`nV#wWj z_PczD&M8i|aR|1~$vfsj_b#S=>6Hx{od|woFbfy_D$kYtb|QYI$9EzB1NaC~{6aaB zU!U!tdX`_WpAzkRoMdGT7CdKH5J|Wzxwa7HA?SnSYZrq6ZWiM1h#+plF=%CS5thiX zVyv}$d>4R^;(HO~?ZEYb;`o+S*UaawcSe$I0mQhZ}<4ziufw=nZ|oBKzhDcUeCtoS`R2d_?0Lg19 zgL+x7Jep^tbSstL9{hv-Vvw~5 zUzD#}@nNudc9&O*pZuDM*LFj^_Hyy+lt285{FEzxb{T#~bG6TMwMPe5bKE`#1GHpc z0Ip^dom_5@vkQH&cgAWYPa4F_9AxH*q|zbw(6JnQ%F~@-1z!Mn`=b)`GX?|)@aP14 zA{^kMvC+72`G6SCQv#*dge z5vLjJ`TC6OdC4iN-tN9Ymh;0XA2nY2i4KTr6~ItHm7l92Q>Ym&%TN0^<@<#FaQAgd zVb|_C%Em1iFX&&pd5F=|}n~g;al13ZvQ}pb}8&p9`6S!)3a^uuq!)mGb&-*;P(i zSMObXiN^gpdF*twm^!<%P5n35c9i6yhjgt#7qASg*c@UX6xLTbXH{?9z>Ib5 z4E<8^6QNG6@=}?O)!?bpaV_NAfV%*dj)x#qQ0r~I`0vFI%h1Zo_+ogZb`cg-=xSOV ziecJ^CE0v3?8hT;-UnqCW7k4nPph?ie2ySK#iyVsstp510gBID$P|?SxnBI}3zhcR z6Q(Y#h1Jo1=tO#qzJ$1S!VtQYN`i$$Dp>nt)f{)JnBv0hp$1G>(!Gg5+htz*bPPZE>7mGvsdpmjjC5&5*waznS&*jT6?b*;L;=c}+8UjilwN zNF%w84hn|X!BcH%c3AO?86j#x$90|Dk6j`8bs&ByRm;@j z@oPc+#DLnRosgdb+5pAxkB}*-deMtNeldE&?YGVGeeOoOz&#Pj1bJR(tJq@SXsgs`WodkWYX#)BKm(xoZiY;u zk9Ni@$(v>Tm`hW+NPs%}6R91Ib0N>VXTY}`e7Ta>mkQ7SNu$SSFXB`6<0HtQ0-t#t z$nQuW?;|~i2fDNin#p0>n)MTfCsUL^3sfxa24>-VTfF#d2F3S58X-3Wn*j2|B99^R7+mGY@TCYly!hJ?R}DT>`S};*Bfx(Fl^&D%0J*W4CI}Tq2`>;WR^^qleAFR6wSRXRo}~k87Td8}0n6tJv}WuLjE=Ig2#dKr_cK@-FO@?ce24GTl)utOCb?zz4)UQaed5$JQp|vQ2JO5 znZlyJou}|-fx^iFE{W|~kRx?x&7o#)gVq9bqdM8ljgxy7Z62Q;h)?O`O~`)${^)V& zM|nM($MIB>2r7wi#FzO0(e@?qQC8R6@4fFn$xJ58BtzCoAdo-^VKpp5*ux$L1Qj(1 z5s)R3MRAWiF4fpt#nvTNwA8vpMWrq^S{Le?s{cwYYHGF8R%>dl#ijZ^=ic{bCPP9d z(C_B=%zI{%%z5s)=k6QDuievMQV}g@mOwrkI2BO#I2|&DR?km+@ef%&i9<1avc)w~ zTjanwyqTNYtEGRmK%XjS{sQ^0z^5Juvd4Le-KP`Fqi0*(AZN-%0K=C`D@@i zk3%2)qYICo4YH%tAQ4Z0^@wP@;5^8e09OFY9@jypkYKw&@KE*P!8WOyCE5imwR>Tc zDru8)kztxVK5fva+674?v34Fv11OL^5^NV7#G_}M>=HI<@$@f+t}5uE`sE_XHvzW* z${sI4rZCMbPkZTKY-(7yX0z<3O<5=JeZm0QPPuEXpBNg;q%pA<+^=!cH80Ev;ik59 ztly>k)&gjUCSl{j0G^VBA*R&)%pyBm$LTJHLmLpDXV#Ay6K5Wxe!5orQ+QO=zsEqH z3Csl)|C1q82zuwdluS5ezq4+`iaE!@@&)aDKYO3EcK#1Mh;O5zU8U3A>eyr+H2=yl z+XGJjVixXJy(qeVyrN0++6ld+ne6%z#%nfU?WIkSXl+_D5~)ZJ(6zuvi}A165n12LD>_zZ!|wtqRhFN+MPsq+^G1#nBMWfb+&HH8 z;t|h^A4$79W3bi%@5!#yATI_^093rrfJ|Y#m(ER}$#%)1+am|XtE&rRtmspDW9oHy zP@~`uUHgk(j&-CH`Di1s*j5L#f6Zs18xA6{T_l$LHR}Hm_z0l&p*5HiFb@A46%Tq z<};D+?=!U>Mjd=uFJjXF@jy5z{DP6QPH4Uj3Q^w042Wga^H59Z(10dPV2ckF$-p!`Za$N}!rwLMsRW`TYZA7?GX z_7_V0S;h{=C$m{%tq$?1xmogV1uxYO(8i+72SR}2JrXj7{dv;fPWB<~E^K`83OSJ- zyVlDE&HO`tJ7>+@zFib#Ki0LsVO1;=0E;*Zj6A&nJ&BlbcE-o3 zd5Dgm$apk@r}E<$A-@E?=5g202Tri`pPGE zsadzhtZZ@KNF*ve{oA2SrR%GZ-vagmDqY(lQ%JD=E$q^TN0;0bZGry;K&vGt`H;J;!G6o(bXh~jSjadq2e%-MEYHjtN`pBC z1p(Wi>xMMWa7F#cV%B*sXP}TAlS_3`SEU;(s0+taNL6wCJ!P})DgeOGfJqPl9 z;8=hH`N7=8+SwulEumxmydh`mq~iDmarfbDZI3$}x6#qIP&*Y13k)|E#}cGD`2Jdt zM{^91HzEHXc;|n?gSyP#CeDfAF%g3sIQP*^#$}a06NgQC`b&-uYYpH-_2UVUF90q9 zRQi7mnL^D~GTloKy)Wfpdtgm2F6|Yk%{H?~I+ zrI0Bc@Yefn_wL>3v7S4KF&(qrunD|pU`}0f8`;d*FHMFmB08*~iA1B;j2p^b+r4$pXSK%H@ zgToIpV;^qR(Ze_sCylN)kgW<$tGY+>t_813&)(NUz6-bqP`qD-Okq!0^4{+~6XLz1 zGtU%saO_m)tb>2W#AD%SIDvDI`+}+c1ig!}g==eE!-xIn^NdP;8t&b(^;D-gX_32# zqOlp5cw-S-4yGd0vC}LLA(~txQZ>rDNTv zH?ukgXW8b;skO)h(q0|lLyV{#7&;YY7%&Q;(1-R-PxhL;^7Jj6qDKr#i=6;tRCxNg zLYKmHz|)ZX>r^MXHEQeT|6E)u0#HQ$$i?@ zPNv-x4nGgu_U6LNu4L9IY&*NqdwaIIhNogyz6?hN(QN8mR3WB66(=Yb;1eGz1vum< z%%IFO&_wq_2o{cKsM0gAt2)g*RXA$L!_w{zh*yPY_Z^TQ2c8C0yx)LKq1Brg*mLOl z>>lG?kIEWLQ27t})10;Pqr~f?r%@=pjYs*|1_b`EN6ZIOx!p z`)PC36aW{zV$URsq=rYO{$_l?%2&@pehqjNQ2O77d|3L$R*EkAr^V`zJm$rJMpXYa z$n$}PfYQGN@?q&8c~Jak#OiPJ^f%-CJL3=eHQ-G^>3@;AWufa0gmlKc{^52O5W`LZ}On{M)4q_vp12cv`+)6laBt)BiGe81Aa z1@h&<)qv7}H)IOC3|XFk=skOA??m+vuOI`pva98yNR(@^!?W(wy0#5zmd&%!%6FNL zBjD+T8JitoI!?_g(Vmoq*DRFXY41PX!wtZch3aX*c@2CREk0 zz4+t%BTzu~e`HQrD+fjbO8<1o6z)xIUC8{pvqVQ=W3+5iT;E1-BSm@9eZdh7EJJl9LRK+>X4 z$?}!+>NYPI?>kvyCG}hS_d07do@e3_7O%IO--FgJ_iLZ_N#<(otsi31=KdfbmX_?p zxwAgQn4jVVamXwSPI9VzXg4%69LtWQ1#ud95Ss_HarX2epWj}I<1?}MJZreVlGfk* zunZE%b_bm@92J;}ZFr@o9wG~%)%!V59;nw~uR2C3*P1i=Rm>iQO^0PH8M(aWIccAr zh`+MWdyxMGeB{}L+HDEW`;`pt*)HTj43THrLs?{Y5n4U{74xF)#*-kg2Q~sKeJ+Dc zVRy1jm#x7=rVqOO>z8j_bB;XfwKG{TFn&A#o)%G-e2;9t%l(9FKMW7213syMXRa!8(C_hphVdFPXN zQbrGKo9uyojt3P@JFsRjd6-d!a(Y~H&|P4qp;aEi{LZf!%BqNibHFfughl%o^5fVP z?7hcPJmSPn;?=%K#-kZLi7DmNw;}HbJ_S@fA`4_Zs+URrJAc@hcy#WkkB!EyG8*sd z)P;Q3z01Ppg<;tDl8zy?qi_PhkK=d?qug%>4D2}`k88r3aNx9Qo5i%jG)Tt}BVyCg zzn_C)cpM{+U0kOi=?d(@PDqWg1z(ZzYXpClPESJq4e%nM;`b(G3b|gtsh4?mw1?|r z_aAoI=hGR<^qNz!;NV&J9PRf5=qhL&vq#g(o3Vx!9D^%1vfUKi8kdbN%Q<|SH798Rj&**F@sX^*`8gXq)*ega62};G*lLV> z4&#knKgGI?*|U7OS>Pz_0anSPHUCbgOZb>*yr)5)11tbkypM-WL9NT{Wq)dy^{Sn* zO|LxxbNkP_TeL4qi?M4(oO?VJhvd?Y?J`8(kbHJ}`Y0bf4|yMO;;~UauP%~&T3?a< zkL@QNG9A{)3)4}~6pCWzmu2Gd2R{`zFS&bJ&Lqqg8CRk~VSGm~|L%PGgrw-pJw99^ za21{C$^&n3MB*Phj=9^&ueGiIW(Zq^-ry{RLFq>sJ#-S+ix0AKR*s3kFwHwHJ%q|( zA$^?f({5ll@nc5k=3!O+QXaa4P2!W@WQzul#`5qSYzW0?$BpBo>-gyy0XLSKHVAn zkYnbS^|K@87%$w$a%9RsaVTmYcQ{z~<+2Tn8SoO{d(olZirkk{t*nnaSmTI~YKDQJ!L_1#q@gd8(Ze zz#f89o_(V^X%~zpex7j0`{(kBJNW27Gv2{+u*@Bi&A{(QO}~jxvb{h1JTU2=OvqpA zqaP{d?WOtPSII-KmrQz#Pr8B3WdJS4q)})^#O?r(@dJX3yOd5RR5Ayq8n;-f? zKL0Q;G}s&hd%v!SUenE=nxWU2`EhdSCrRe*Nl23ijLp;Ka~z=8}T3p@A4+4ZX?CH^|BEWN<6I7K{lUV;+l= zVIqHm^R1Z6!*ruQ&YFPH66U=;L{jvnjoIbCcTD#+BYA7mHCAA$|4+%u1C#bK-<8}A zTj_iNPQ?kwfZh+Z(~W`pa_YKJ=Y>MUXI}ZgI9kr!3;8kNNkEk|t&qjvCwkt8XxA({ zn=Ym996HZxI2LPvr`P+mS8zqA<^bAEV>PwADmo+&=eQ`3p^z(qqXETZGUUGTShsxD zrqc52xER|9Xtyw2%i&oA^}WZV33^Bqm2;0neja!UP&{6P+$SDbV@7uj zcd^DXon&xsP8y)ikk+94I=u3KNtDMl$P0i)fa0+fa-Vp3i%wGVCzHo9q6%o$ zl1c67l1DT2D0}=4@;=~Cfa38N$bI60d8Q4x1awXP2C@3Cv|K#UVRIwYtRYU0}mVpC|(mFA1*I!g4xmw zvDSEEwO>kJ+n`tRdKB_Azzcxl^)lo>@!BNjmlx6vo?UX>32>>oq9okIw07*Y)3lAo z+|Gii;y;p4_{8YG(CLtCfW?5~a{^=v3EzVu&cI%>95djUP7%`>BG1tY>at+In`s|# zyr2XSb5i2#wRVrsPUv&+5tWN?L4F_j5Kw&n3Yo&;@gZJ<&Z15_PhfdAszJKYk?1rZ zkanq97Ui)RaxG8?C?2On?h}tyB7xNQ*oMWO1fIl*39bsDTdQL1QTvtTu^W1nJ>G@9 zANUkdJU)kf7(BW+#QqpVh;P-j$k&ob)k#smJs0xjz}0}_(FB=7!uJ4+`9ZbvwfjYA zaV7O9oJ#7S%j&e< zHVq?B$1w6MZadTd!SRCaPNJw5dRo7c_G<9-k{{m$`8MDVK=HcU`@PyPqn{u=lWP&|39FgdZBHBzb$+s99ElWAcXhn>PAn*vFc>fAAg#`C2 z#*b%s<#|t$=z7kQqFpsgxWoeOm7)b$1}W|piu_mlgSI@nPJ1cjQ-M{0;=2wqg?kfi ze~XL}yY96ouHp}4mP2}MF(-Jbm=k=#MP<;gQ;o36C{-0yo5y=McvXQH`A6!hVJ!!U z0E%}pWD0%b-DSPz5fOjZ=t{itJ1_r(7cnE=+acc$+zBY&cSEKSUtVrTkEXnQ^>U0A z_2A;Ct*bwa3V@mw$X2hp7ih)>wC1&#_Y;FD-%I`b@%>7FU`1F<1wsG?8b99KF2_$) zev*3Y&geyJDKwU9MyXce=~;^JRC=y}d@b-pK*jUNkSX*%o}$o|eshTEws<_+p-1uX zuY?Tb0g6W{j8H4f_7oq#I94_ZuPK4g3;N zJRX2dA>JN6B(^txFU^2nrf3|)9LPOQ$UWE-I2|(zsEq!@v}8d0i`Uz%!g<-G=K%C6 zJ_GA;{wXj9P<+Ngrf_(CVtU?Px-fy59*p>UEyyLGM(9&~?uYy+@Px;K{4(MFZgQ)n zNS+wG_^Y0O=J{?!<*(ZujqT`rYk zM}8(ip+=W_w?c=C@7<8^10DpF{dYm8kg)w@7{s*q(`%NXGOUu`6ICJ^BH7n7yMk=Nv{;67#T;W~o>Ft0HW&hmOnEwSz0SbNc zH(Eb?C~qq#Z$mI;d>f!c>AeN=oxsllW$$|+Q%E@7WAu0Cx@f9bbWL^4e|tPSphwv~ zvL>wc2L=HY`egSQ{oPo7jI=t&l{~$xp`#KyD8F3~`DWm@7`;Yf>!~}ncAwiSz1*g0 zRhG2-{usTfry~u3TtL~q05XMriM4a0`eTf)ynI}zm!q8V^sgqJUc7IH+zjjhl>VPX zrVyX*z1REd7J{1P8^v{g=`|BY1K@bgIG$R2viiqFo$$jB=utch)?!W+7z`*LLm^X$ zpV#TF9dIy^h z4`0q|n2#>?JTc<&6w@XG+P%@C*9u44#aS1%%Sg!MfQf+OGa0hr6Xzejr;pcX1eKne zX7s%+9*=F%Lz*amJP3Igu-ns3`LeI=l&JR3CK{>J+C6>R`l!CakVgaK02S|vkSWCb zWsmI=Phm_Ql+{3EPI8dv87%Vyv<0eb+~P|6Z-buBctd^$cmYs6UV?mhJjBs7&ih?Y@YtmPKSkvgiNx(fA$(c_J_cQ1+h=nL@&T z5X&IO8KPCw>@HPPhsUD{da9s@;{PP%-vBQHipNWkMM$hY63e2y2Fcu*qFQ`yt=~)k zhG_jb74i&VHb8;WKjC&sEQ4+vCW}NB+34xr1|1Q6KgE9!+wsH555vsCL{?=%mo%@d%$0O^3yhmjShaN{1DYDO4mjeiqNh^T~KJ z(U#&;B+P`E1FItenJzn_SJfMTg8U({-{V5*QkhtLy<~7aBb7Hd;q)MJ+ENw_lck*? zudCFmJpCmbqwBX%hP)i811OOGQHix*;_uB^_Vhs$5397HfmsJ-yqZL&dud@|(ch zF?x?6-k6$IjRvY7L~@_1;;p4fe+zGp#(N&*8ekD{r19>mT*iAP;$7wGZGsNcLgm13 zAioT>#pq4AKOFCA%FhvHf7R8pe|j_1P6H^kd-{W0qV4o5$ko6+fCBmXrHPe8@!DhS zqG*qNwbw_&_cjKl-M2%RivP=y-vE9OsPg9zkSQcwAH_52QYW1t`lnm8)3<2a9N9@u zl{_M6M(t1oc?obLpm>}NnL>i+;>NRxt&>zweO+wD*y!ldmHjQzOoXDos85^XEZ+q9{8Lx=K% z*CGENcn47Se-|=^ct1#>T`r5gjT`G>Z?w(H2VTQcGy^^`mbOcYp^}<3=?5iSqdXQv zt_A7<#bXU*3VrQ2dF7vCQ9Jt-Ry*hv8b`zle+HnPVPs(NyWQi_0zJwe??T=Wd*Fv1$*<}A6)9zt-!5Pib=`5`^UD~DU?5JOCgnS`zDWLdV37JB| z^K4!C#Lu!_5S?ZFh@l&Y7fcQit(FYQrw#g)ecW@xS_aS$P<-+sQ#d^Pba#S4R>Raz zTiwI7`x##7<`22Jr#2*ct%hF3>&K990h$5D>rTks@#@`=u?bWzWjTZwqg?lRbU=^d zk#jEk|G;2C@fZr3LSOy33yaz+cya$zYC{Oe){9qkrp!xpHXdGZ$guF@iY&?F0Q4vxCFh~82Sx)Fs9a09o>f!BhZ+lf z7F#03H=}&>^fyA6(%%C4G2jV6+2Lu(6cV;W91mnCoT?>UL)9`CM@lsogb}V zMnOIb7!OeBQ~eUBzf1WpM`B-M=jK0i`LjiMsx)J z6-GVYU_US2WAqkZfb$Q53P9O?6l4ksjt6$tA7gYiCiogdhei&4i|=jpcr-!}X`=Yw z2YDB;8&Eu+fJ`Ai{d+GL=rlFqj0cqq6`hlU_~LA759h)tkCBik0#gCSVVG34j{(L36#C?Uu?*t+R1~7#(n9I~2;?V$RzSu7H;^gBr$g`Mf9z>b zz1IUR9-rW4Q9e^4&j*eL6raVADfD$7qFXjq^KfXrF^SrV>oj8>)dr*Gay2ayk?FD> z`jmZMf&3Qm2aiLa^5;PWdZ-sZmzlKH(;vA!s(%sW6M<6zWsen*Da5BwkL7bWJYtGS zRZf4=C9~lBs|uw(c0!*jC)*+a8Ti=a&?i6bhDSH$<=3jbto8JlToE0gJ|6ON;52{& z>EDys`0GL1yDzl9?W`}gA{qad82x{OydU@kQ0dVDnZjZ7h)E1pXnYq_Up068^r?nE#b+zzM&L4!L!a_%7Xm%x)r)y&e=0aY z>TiqDuU&=x5I_>3?2!VwyL9O>zsB*1aSxSOFXb`)sV0v{4fLpddMV^9fU7;-eafeC z`n$=aS7C*V*5c{i108C-`~c){fbV1UCOlpqr?+!HeHO;(W@*>(S;CB11uN}db#=7; zxE}Hr;2eMg#W&G*z0~GpDE_ShcbP>Z$7=5O81D~nYdir+byXo60 z-~SErKY@P(D&7YmQ|Np7gX7r|Z_EgF7C>EwM!R$#(T?``RR18#XDj4OfGYsS=PJk) z`dSVh%;pe{27G_bAg>&NK4l+vZCG=G06?KnQ}^jHqX^N8_HRS<2DDTo?Mq#gD`k1B`!*P(0xG5`vFDu?3rcT*7EhJvWc z(^~@_5$GWQya4j$z|}E&6Re-RYVE#2Xr=<8qSQ(EGKIs_A7gY? zAl%WlKxp=O)Ig6)|4SiX16=Rv?vwvvzargLznpd~iX7R43*IeVuxhZE?lJn4uMcbK zKo+3vkOP@Q!v5C{j~Htx7u*@+g5vvIJwCP2r~Gg`;v*ihutbF!uqJ11cRxK&FszzKCbi?byfT z@!3La@%S`CpRz{_G((@V z%l|>%2ebo<&z~Vv=(}A+u3ZvyB=teIiEZk&d3-8vit}NsP<+mUOrfvsyzba! z)h>pOhKt$oov;yr!`^UyGmO+&A??!&eX76nCGprE)+|8rNrFrv;dR6Z5fK?$9o3!H zFdI{fYs6~e|HCDL9532)YO)u4YKKc+OQBcsx)$=yz-@rybtmK_b4p6)%L8h?#zX|R4@b)3ax)FAFcOFZO z>pMPV;+BT#bW6i4?#o=;%kiRZHGV7B+%}GsytY9vX(nDzLVgi=1yHPxvQMKC>Yo11tsLIs#v+u$jbd}s| zxJu4|5hURL`sK)oSdirYd-6eQW z@xBxC{lLS3iuZ2F6cSz^br#jwJ>1X|e?eqJU1u@(3e!3`UT~+qSpU*AR@y_mJ!+5H zkQW0d0E*u!kSWCbX%8vkos-ZbzXTRgea>SSP*shSJa>YJO1F<8e-8WyP&~hd+;^U_ z(-1wKHPK~t*B4#LL1Bl-uev#!&W(_-2ATlH@5hiS^evsc@)Jof>NWVPys}vCs(F)X zUvj)?%Vpw1PuqAe|3k0xzs#TE986#!pm+^|+$UafHz*$38P9 zkl{}0%&RZpZfA}cZBb`(YLSVOR}1tiyZr<5SHO3G;-%l&N4p89>cT4l!+m#<;o3ZY zHPEm8?Fz_01a1Npzgr;p$!_sC6Cc`cje4BjnkPxS?T21vw}Csbz6TfsC|=_sQ%Km~ z4(8Rp-6}hi^>(IRj0!HY z-neDO=E%8`8Idh(Hf(O#ym5S_hia^D+pDfbqsrv#IpYHQwm#Vy3k8Ni(Oq0BV zJEQyFsvsW&90w>~^^hr47A>TYw5|E_xvIW?)w;UaQ&LuKY*;aDJ$B)(L^r)$UU)XA z?rd>L9JziQyPv(zSQ~o`51-cNUZHF23UT4UBxjsiYo*vFj?YeZbXzPWA7wnktkd;= z9H+aIUTuct+X_B4cuVce4#>&Bz?m+9;#&=wLUpa=dEi^wukVfTv^u(=EtYRP+h)8^ zR~4QnUXKy4HSY`R4_mmttdQ4Oi%jlhI@a|EOq}_u`!fT$#}voG(pzhG(y^=r z_a`Oe9u*t^i-XUtC1@qERT#1`bGdg7t5!8j#;+OtBj8W*dlB+p;9Wq)FLIBJ-!|`_ zn5t_NOOKl6Yc|qoU_rCK+q_+8&H6j+b`&~o?vu8*hYjNctl;Lmw6^9H2g=uKU*dZ6nbZNB;~heP?`=}? zCf#^X>3SRFoxpv7;;|Pph04h?JsWOKEL~^Uuc6rET>ocqhJO-x{N2FRoojb zN0&i94Oj~(-kTs(IJg`=wEb{_0?p~vZ58JbHnB^vNuAi=h4K?8sf*jL#$c^9-Hk(` z;utUgd-}+Ze}Vi@;NO7a^Og5|b)J)Y_Ll#>1G3YDIVmhSGKCWKbX+%gI$dTl0%_Xp z>94vk>c49tp9!1`DE${grl9;OdVb8I?ST!tI4Rb1WwFC%76v!paPP zIiT!umG^s<4(i!MdaSLhYrsi1XV&3J8*xOXOppOckhk0u(ULro5=5MwC!(j-dOY@e zdWgqYkc|g0zXK>9NsuWh{p#5RkIl;)4rcIsFldM)(5mb}`tbdv{|d-g0oQsusa(7F zpncNa`om^igNF0`H*PLR4Zj9Avz@iL0re@4G{qQmPk8zpsK074MCZw*Y4!nO@PunzbNK@vo)gpr?0t zjNXqS{|)%Zk?CzfBF8C3`$Tw-rbRrxl@CSBo3)TH04@Pk{<;e?g@f<=>($TC*iyfF zxx5^4`O1}4l{ezd66z+U&`T!n)7k63$hAh)3;ptZb1!(u-Pt2 zOeKysO4&|k9MySEl-96Vrq==Ri+~^H&mj-v4p3kQp!lB%nZnLFvfkY}`;hf-Y(8DH zfqI>#<@FnAf{OUJvww2YTpT1`Q|PMez3$68=BdU~6mYL*3jZ@RN?gHu9`4~-kNd4w z^AaBMT1-_-B<~jRB4)(<&yfEEdp%noncrz%R|Zn zV*NFp?pg}gLwPbNYM?B|HpX)Q(#U-Zxph`5+gM>oUaS zRYN@Plpo$G|Ku(CD0m;--*NvI#GPN)P@`Zfa5^x{!(2RP0844B0e|qOiL|G^Nat4 z>>sb2X-;|w-(v=R7X2^%Z3yJj@>27M^h0aIet_jV_^ad1D${!wf=4QN1YU9Mmz~0F z=XhRaidVPu6SJxue--<^R_+u_++c6d^joi;nwPMc)= zpJetEY_NNi=rXM=JD=AMSv>fBK5ED%%*f-rm~{tpPU8=9-!xW_pBuST?4NHuXeHmn zLO*86YQ_3bS@slOn=^zBVbw+F^K5oLA6`1B$rF&{-8p*5d3w!Bn3HWSa6b?fUl*G*ozQcOZOoLWyL&&SD_ z81q`FPKpe!mG+DLDq3G03wbecJV1fkQwN_*)Ju7b@h(zbKEH1BS@j#&;#)>S{YdTC z+?SDQq|;YYsPXhS$LRkZ#>w(RHN|$RO zQ>gOpJKNuwU^&=xx~!yQ>k1liQSJA*R!%?adtAfyj{8rJtwpMgI^{1QGHqR1jf99@qpsL6fy;;Qu5w8;)wZ+!QF+p zcwmdT`lOM)CmJs+E~Ik$&s_Tg?UqZ}m?ECW^T(!-Ngf>@V~)-POd1a=;}--pv7Q-F@fib|f|D!bQJHqc@ewm5Q|s5SuixMusD<>w zX>xz$;yAel)KP!OeO1>U$A#6YmVvu~Pv(_@N?vK;!fJh}!E@5MndGCmOgF~!Q~9rO zo4lSO(yF3C#%mjRSAjRB(@T)w2KE6eUSC0`P(4=0XHUfu$E$M?zV>$v3mPtCSkdr~ zdw^^E5szC~a#>P(a&l5Q*-Xmw;3d#cm~S|vLLu0ce#T>pZ}WkTnvQ zyiLaV<4k*gZpm;APNwpJmGuK=H?dqEoE0cHx0uycxQ5f`{)}1r2y-N^rnGFNH*WDu z%FHzV4(=l}?Q{pvB$H)w({XH5&%`}>nTAg^2JDJ9-qet zQEfc{H=AGi|O+HVP3^>-{%P|VivP4@Suo3+8s`r9_9SG(*8}buj)ts z9`Yx^KLKU`lvZi~X`jma`8;o2`v~m6amxm2d@6RE_1|I~7{kG1#cPnpgx_(W;#!+I z%*yt;Nt5^lT(Ay189~!bF6KeMXh&bcj51!JkHlSQB0f#$$@tWQuZqtdkbeQ(2dMZw z0-3@s-u>DCgL-}1#^quRG`(SAy$$l~wNK1EK8proXBq|GIV{@wlArcWw0;`_xdvDa zD1H|}rm&|}`unA4Bv|gOU*2$R-HJ2kZCWMfAEj;I!u{*8?U&NT*U85*(#F5Hw2Q4_ zyu|Y3n#{4mHs&7{2-&0cx#N#XXc1+d0=U!ic`{76MA-({2l8tm^p_7g275oR>sl;_RuI;Nue#Mo6 zhMzmu5bpQ;f(~SQpJwD4Q;bo3lrz{`X57b&0zQyeI#q)nU{19$*UIJt_+pGzC(oMW z%$?^1gL&wkWPcB4 zxWArnnB#qhIcQybQj_yU>~na%68)m+3$18JYguvl2}IlEJGtZ*K6CAA=kXbsI4r8EqI8wb=*E*KO8j zZ}*AE^YYzJSG*f0Uhm}MvCV#6xX6{I+ID>eUuINWLDR7OCg<~v#V9~e$1GV6bBr-8 zl;IdoR*uz=`*tz=VU}uz^=%Ay68d*B^XDwZu#FM8pZIKFo#p4*#u8_$k(aDopnwmC zfd}(YILyONp)br+jdq4>`bOgRNYkhDM;V`mR@u?0DC&${zLaNVrt&Z@2~0lL4#GpS z@y|s(pF75Q!|w(x6nW$#@FG8Yf({Fz`fzkVDhJ0glltqKVJ8G9!f(W927agKQx#(3 zf0>Ed6v!CDYQ_*)s+v#5Rfl0#m6gYDW0=S>cd@{{e#O}zGV5bzgxN2co&&ed z@efHp&b){jllvWGEKPobrA#);gV>kDCh9r-MD}yWWd*yq`l`rDnLO}WXt$U=OJ9kJwZ~k+F<#(K)AJj-`GCtwg8LY`@3W`U)c>RU^ z>;op=-6$V-%MZiX8B`wrH%I%zzz_mI7x$2&;0x*zXJPVG9&ub>I`>bo$GagtZ21D# z#B?(=z}Y3#mVE4~ONjny?@>z2-z265hIc!BjdVb&}`{ea9#`Z9J_Djllki$*fY>LVLgQ9m^l0`H+jzp2Q zcjb-N^S&4P|Cg!S8x|@%H0MY@u&=hylCj?QGjJL;(8f}kB3Gkd$)K$muVBrMENi&ks zph>p_xP&;6V(}2ZU7us{esF}l81kyjC8KoocuP%O!JciLi=9SR8I+`CI>+$08OzkK zXFT1iPwI!RyS|FsuJR(S_Se$x)vrYDekJ4^fbD>?`%cIrd?x)TdXIT8<79E=u(W&U zwrIFgdhJp;k&87K?_u=rH9HR%vU6O->odir<`WFe5_y-JgFw5-_W<}PKdF2b=lcTl z0L6DLWD1LX(m(cj<68;zv%2`bUv&*WR-WdC1DaIvEqA z$7s}8K4TsCG29kUZMqALb*MBmMb#H`HNR?yoq+ARKfcNFh zs1+?~!KdvRY44KPqvv3s2KfTu58wM) zii^h|*=Hd4p8Kk;-Qf%y=r809txmtgvv@|nk?vTl^dg?lE1Z-hC%FjA=~7%LhgyqH zMTwn?ru5hFs=#e5-3*(03K|v85XAXgZmh?pUFez|WunE_kLRisY<}L0e_OP^tAl(s z&;+RXKk_>n|G8($cx(T6c=7K#n1!LBOPCl6dcYEoAIo=d`oz0dydz^=71BO*MxceB z4u34ylN}rLlet!|m4f#tSs`A4Hg*A@flP)-X5k)pm*uDBqg9!PVl5-NjF-6i#vH?+ z5*f?O^H8edmTNde36p5=4gfY0aW zh=@(ubAd4+?ID)_6mx#g_!G>kGb;6E{8NVVoxN%63;s3GTqzH_R_um2-3ZC(7dSCy4ro(Vy)IQOgvuqiN}RcTU7SEl!>jBBQWM4 zc9N{Hm6~J+(P@krHl?*ckgHGNL-Z6U6{#LU{bk^WldQ4kI9FGR-rvbc&P0Q#B&n2= zJvEhA%;FQeCcIgUe@UImtA|sEiJO!86!BcZtINDk@RcN)c{9!EXWn1MePUM2|5;#G zk5d0V#kM=;aiUvhPC`6#05fY2pW!ppBO%Af)6A4XDQ3jXv6E8asUjWcvX8it&#&S9 z*UUNvQK{4~X4b!$jg-9JHfQMPrwvWVUpD?xrsIC3Qx(#c#)Asp!n$7II6$Ri>i>D^ z*d)_$-G@hzjwo`A+N|$Ju5-9^VM``YBb> zGjS~IWFyzNlDiIIrKRd&*RN+_+S7GhC(l}+KRY8A4U_F`qf>0RFfGu=PKnQkVfVH&_R^kO^LbR%vgsl***nCLj{WYnr&V2on$ zwa+-;$=NTNAx3%@m`j}%=r1qfwKh0Sy4?T@}w)fm;bnV-u zVOTI~F&E=)qxdO&2n$n*=v5ZH}@1x_rS3`aP*afI~ z%zsZ_(L@SA<8fRF1~musiRMIWm^mJ0SRS8@;az=n zAdgif4KV^vkzJ5n$l>?{Ft3o8G|t!G%?#l?L}>j~ro&#?S&h4A?8SUPFa}WRZ~!ue z>N90JB=0}G{JsK|69`f0o(r|jv%nKO7Lfs8bF}?3_Ck}Sx zH{km)voi>bo$33;JNmov&a@I9oStqvHFzGAPR&B(>>(JVt;Iyo)r=2M`j(}gm>SNQ zp8h=xjP@@Lu1)zh^DQ)odkv`Izh!!?{zJ5%eLLhwfhPc!9-l&{VARQU_~Nm{OAmFk zd_f1lME{Jl4%F`Ak^32^M0m{9?hOn>gNTfsj1d708S-+h3U`soGn~OD4V0T%X&C3G zxv&5~o7w}jjFYK(coD+{SB4$&ZRE)`%!1JN9~r;uccSh4%OKwY{2Wm6`xr8XJ^f_7 zwig^;{8p^1-&EH*U4;>m+vF_t05KwRzZ@P}MHigC=YC^o?*(W`VJI)efI`5biMTu; zCIfj8i`MX(UW{?lYRl|bn1;<6deFwqmOcT)wE@FM^by5M<1)rdtO;yBKaLk+HB%N7 zy@Q&sWxOl@7){sBkk10n1t`$Ekof)FeeKV5S)_t1Ph51XQ}Fc-p8i(oQu+KpkiP@? zzNp=kAye4*f$Vqpvi>}FT~C*O>@+p0Ry7}|alYrS(QZr0LviJ!`Lq)1^T~;|c8}Lm z=vDo_OCete+yE$lxCb(YCl5L=wU_Y#42aEMvw5>9Z?bThI;&YI`lEN_nvRr0l;G)3 z67#t_#!|C+3N?Dq<%Qnl81yxLBh&2w^jF|LwTC9Wi#cxKMnLg<_dUrk*ew0D@!f>| z6_=1>>kzeNu}s^$`d#+uW~`}OM++-4UUat{6WU{l5u%Sx@!0N&$K$$qJRyI#17k@( zZJ+y1GS==50u}@1KqW8@7z4}#+WlH9AHfHW7{SZSgF^%5{1_hwkgPEyMw+AYM`9L@ zXQzd%)!gO77T7h$V&}Ng^wb?{s|49G3(OkFD#S3+MGP-fFf)(|Z1B$xpv=_+0bgMm znxd85@`X?m+h)+Mz&8&BQt|D9TWtHMb}l4WNHg)dlp>u{rT9%b{fCg~H&U7<-cKK0 z!RKH(zr$OJQHXQQ%W-{TGP<$c9~=tmH!-x@Dx$w+j+HdSTyEuCh842P%pn!Le37{@ zu*jTL7D@{zV|g(BQ?Wg;%Rl+c^4uann=!?l9GGG*r*)BeBhrSu`Thd9%p1(w$Mh4^ z2J@F#%D}WRTWesA(M%r3t-*7$US-B;+{+$ZmNGhc6-zlfco$2-yvZ$?lQm2EIQ?jL z6-%DN7q})ot3ed==enoK-Uq`F{wIgEC;B`xw(c#BiSvy#x)1$HBDsai9B|j+==K(K-#mThpyunCk}3l=R@%X@RNS4VYr$ zt&FcT{(zZEOg?tTqcJGsu?IXO;7R4#w~&)QK=})(c$7e<&}X|#KkC))w}HK~dm1(h z!s>3U)vHn^&j#>_fCurs5AsvMvw-6HcgPf;?2!JE@VMncJiFMt6%C=M8Ea+7KP~M2 zcU{}<**gObgyUiLEZ5C6L+QDfF@KuhXW79($j5DR?=s9{qL;~MvlNs&DV!Px73nfQ zRez4w|LY*14_pkW_&g4o!gJoZ*jvvhn18X(LL7BL?dpOy{agKYowez|FkeU7?{i;w zwSSnyj5$8rE#Y$<+n&O(f&eAd(U{c^a2qqhwwZ2V1OdayHvboMO!pZKiBo;Jh@a!s zI$MpG87s4g^9@FXl_!<)zcN11%gjVLEaMmcFdDzbke33>01AiMz7a_*K*)H1b8txPTA>2HRvD(E7Ac@OeGfiD4NU*{vq<&&?Zzw}{VLGchn zuC)139WzQLOC$TSShbn2ww&y9KV@1IW~geI?QlNQC~&hV8=hng=F7asK6nQENxLlt zFU9*>$Ug(_1{CkzkSQD~Z?(~(d%in*<*Q{&zRq8we5)WY1eOAd@9B{L7kuS4_0qyO z#9R0iTv7$b3%Xi(S*(RSJifcZrv`+`Fa8PH{uq0|0mZinGKD?f{OjTRMRX`0lL(i~ zNrb}N8EaSU^K8if3!bqvd091^L{-je(nWRtJkxH$6w~moWG6<+fu*i0UzS~2;}F0-vWy7A0bodbA27>2Z}FFsh~_(wF0*oXkF-5J93D>w)Dt+#S{2O2opzQD$$P~6l zWP9mAVS??ZlEI{Zia2Bv-EYzN!3NA1nb>;yFZmEVFx%Zvb?qT0Hj(nQz_DoCWun7* zzB}FLvxBx+Z9*GJ&v0h4d1kc{HX_mS?$#oio>iYl?Y9N;CBQa7#bXC#3Kd@eZF}Ib z;<2t??#OIpTc|gYE>h1TmWk*irTc){iN_aAJT8}y z`{g4dJ{$g-NilrVuU(4`BmHQVi&MG)=1L=#Ki0xtGAVo}(DQa*SG<}!S#w8od^=_B-9e>&ES9)pvgl9I5vWdv1y&CJ+j zoWX|R1eWWVHHhEAu#4qRW^YU`!CvA>V2C@>$j5&K=K8B)%(lVOj+LK9{rC*Xn}MwW zg~Mzg%h64;+KMx=?WO_yT4`GZ&OLU++Dp3p?ha3XYmEMHA=@43`vEE)`$47Bmg}{#IwQE+ZLl&|0m8r0DJ(2Bh=g3gq4~< z5tgfOD;00qBtgCr{q!%zAelq;QzD zPsP8Y`d30;1*`=q9HIW`IXE)Qw~*e5r*~(J-akTq5BT7JqZc=$udb)zX{q*c5#1_J zZ{&-pKP-WK0&p^*;(G-7Sg!h*iZOHO4#ES1+H(e#85C+f{msxt+9hWrljUX1?3 zm}gP>N$Q_gw`m3R=R<$K_L`9|w4;6K=`Z)KvpB(leFY^Vy+0cnX0)|g zA8Yi(TCPE~I-z2?^xF>bjDRQEanP4xZ4xjIQ1Lh!GKC|HM@-gkWIy7>zJOi|>BYuI z*mn0ju6>DkWLp%IdKm*fNO7Ranw5ybVov;RK9=~mjF9|Wz)#KFd;s|$z`p>+pZ!Pj zKj7_;OL+V+THlHBAh<$S%|%oy4a9xD?e1@}V$fWJT_o83hq(eUD&r@kahNQ-&06C~ z$*%_bD?R&O1o?X4MnLhq8#0CM9={fE+^P@tvDccyLeeYcLegqlNZRgx!L*-XO!IgQ z-4_{QOihF23C2l$By~O;M|tTF{i^>l=m6UKz!*UBn+Tagg6DTd>t&2rdIi^#HJew< zyhTP-M|ri=QC^RNU)Q6&Dn?6Q+n~1^ddV-Jg8V%2TR`#p9b^j6rFi-471@vP)oz{V zZNwJn>5Xi~g$`_Xf%XOV2A)9uqH)I2Xt%U@e8OKv`OJj809XVlJ|{z_P<7Bf0lkdV zY!dri#h$>^U>`79E86l`GHp8+HC6EUbT zrlTaUs;{H|z7_Jtz!iYv)dZQs{{1q&mL_^`1Dq+ASGn3niD9@qFbqcy{~XiyU={Dp zV((+MJTtYnQu1npUR6#ce}jGUKsrEy>gTe)&O68RSyZZHcB=JdXt%*Q^rTU169JVqkKmw9c=Xw$CZF zQmkyfj$8`snoGUH3W_VnN;_%aM$3aykS79D0mXAJWC{bk{kflbcI(xzWC;v|+NV`k9c9mPm{~*%t1fy9v74%e%lf1S=uPUdWhrAE?6QFnDyGI}APkIsE6$c!;^<`F)K0$&8JRUufLU zcsZ}e7IZ$-Gik-ql6TF2qvgg~kbef;4Jh7!fGon5GN0DInP5BNtmWeTyP{@mw|=|D znysJtTT?st|6>pI~iFIOCzwb@IlL* zCc1tieOsz!`r?K-@t)GR7IHnX8Bpnax%YcDud?^w3D(EGq;F@+qIq+n*d{aK0kpQ> zao=Uy-}DJsv^54ty!rHTSmcZNOh+8XVKb@cotUSeCHe35_!0kste4;~9Z#D+#;j{uQ?hdAMEX*jvb_MK60Ju5pTFd@{g%h#lE(IJrtfZv4-@p&(zsw^+jI;wJtKj(o!Uq@Ri=&1$Eig9o^{l`dz!##cR&3wK zd?CA^lZUmdwF_msXl68BWWz)u@y&{sH;F0Jow%1CS});I$)rIk!66Z;RU>uv%sY@2J;K zo+yn^5vB3jR2siWr$Fwv2czen%g(047xzD%AX-8#i=F92oNmmyO) z&+9)$ymGkL_FEj^&V2w;s#VJ{zj^K?qWKlNoLDQLV`bsTr~7ffVH&m*`{`goJO>)0 z@EOc=VEVBbO(|h&X;sT&8IOqFuXFr*IplRf1EAuu88U^#*tZy+r;42?>5NBu#W)PI z2gM+JopvL~=onQMo?}Fgll)pe{p1%PL;eoPcB1^2L8hSU>GS@PU_I@fw_MQ92fxoz z6yIfw$9?R5(L#Qeu{#-ii5uT=omPWpi_NRqVvYH$>|JNl-GP-q3pBC(5FcH@BgZF) zp2cA&*6P!;>O!aSwWXH%qK%JmHb{t@7Y9N=L(404cffp+iq5(Ga-FYX6O1dFeyc7j z_qG#cd|MD7GKIsK*G12qPUI_%Ig&4{VG(Bc=iub+58P*%mI-Jr z>Z%Z-r};$5tJ;n7IuG&{z%_v4)dcxSd7+B(_Te^611-Ay=mYncObY|rPb96HWs=Wc zPapZkJYPTTWA3Ld1r(oUkSVBhuhlbw{MS>xQ_}1IipBe4hr(2pGYdAXs4E?M8l7UD z9vM(Tr!P*@cJN7>RvIk;o4ok!1Yecze}cRp_ykb#`3y3J_;ioC|D;!XFu%AEEp(e(F7JoT7d%PYw=yZp2m9i+bASr~#pfc(6yoRIB%iu7a8pJv14VIcYOAn_ zr~fH7j^MpOGcG_)fZI}St;yrF2m1aWd+z~WWs${=zcX)tZ*EC$ZjzfqZYm)_5<>5R zP=d731d)1}5MU9Gzl~@95= zu<{h>8IZ*FTkyxi)vDakE{_qn<~Z7` zSsBScu58Dy$t)_)aejS8JAPc0UweLxyNYDzAHS3_yHBtJVMVK|+x>IwI3ohhp~Gku z!>4U+#=P4tC(9Qtr)mDMQUR(4$#Pl*o~2)`&;NfZoq|$IteD4Jxr0`IA0j<~a5b^=k7VZC1o3h)*bp`U3xLySR2I$WqiR&Hk zEOlION25xtm<_c};c9yeY6HPcOY6)7x$@jF+nFcymKPVrHy?Z*Xcb7}TMM40wt72m zapvW>0oH1asVBAUz;GlE3_r2oCQ330M}sVY=cf4rR}=D;_9Z`q_XWdB5F~LWg6Ftg zf7b0j7dZy5)?5CGO{9WfC>Y5u6ntX8N|aQP@{~I}tf&(BDv-Y{*Dc^520aFn_?`mK z(n{CA(vH%0udk2NTgy=Z*3uiq^`7hSVDNTPr4vXwK(vYc{z7B5z^BAV@$~{f5L5z^ z_(p(dscpHQNIxPBCeaKM%P-=+$DOEbAareR?}0dS3k04`$WQ9)1@Nzf-U3NHZ-Zy) z7vt0(x57oyRLn*7@6D_KQ$Pe#u7m$0-e*J>3OtcebU$h~_@$ubAc^NL@GKo=r;9_- zRr3nw*Dfs-A=?UZ6L4iM!c7YXe#xbcqPV$odL_o{l~WKo0*cZCmlDJs$^v!s<5H9T zK2hL|5VurJ4L)lu13nQT901M; zaI*D4MnYH_02&ICa=ZhcrIV0j1i$wv7O;%28;W8ZXW`*@vwUvsFfYVp_v z^_xfi>!DjT2OCFS+2-UIn)W6;iz;92mVaVYZ!^KyfR=)!-tGW@O7u2r(VFV2KD~J1 zm!jM+VHKbsw1tzh1~mrWP?^KhRMoaL4USErJ^9ZIKQ`u({}kATYW*0liY0FO17`&9 zS@~xsg_S~3FOZbubnq;lbop~Rda@lyEx_bB50nZq_7UZcqr?coR5KKXkK=u!rE(l4 zO9k!*;ELcAhWmZ+`$1oVB<}x$XX&JI&s?45rVn$zf$8XevnJyc9f3yAs4WG{e2Gzp(xNndk>5SDrI`?aFFqxr*WF zH)1$i%Qtwx6K~!Yk5YC4^;7#F`~oWcj@XXP!uin2BoK<}MA39Lk^nzNrqd7pbCc*K z)t|PD*dy3R5!_`^EX;A3+1&eYTKuFXWKt#|bH6B@2`Xl5+L|&(cwL_9rSQ zmU&oXNl{_9Rl%k#V`0GqA#;V5J zXb(u@OiUFx%QlGeNSffz5897&#o|SE!8~8tKK9Khn2z{r_Yr zKWOmEi93WgJQl}0RLz7DRt|j|p1rj^HHd*H1si?6nKN7XK=;E(LJ}@&>-Y=@NwIk* zw~k+OOqVtK4E)#;;;* z!&MB1_Gzl@0oqY$B+1(StPR5yYbrutmD4WljYvi33A~NKBir?U@IQiRdK7Ouc$N;h z_eHh^Pq@8ITeh@v`HGs#C883&EUt_!J_7U)s?uy^^Q90LDfVlbi$8 zqi7Xk0z}AE4T7j$SQ+qCbb*j#4RDs=6V~n@1OGMXKOm|1Eg3?NL5%|cmQJppr1tB5 zm6T)Z+B(+qGaJ2E>f61f(R(xDk0JcEJAZvAnLp0wucP?uUE*8TcG!M=YCpwXB)puW z+-?@56OPHF8LAFPc~-vlD#a8-0ZsM%eKB;F`{SiWEP|UI#x(5Nti77jy|=maAH+ z)T?3Qo2|Y|V8^cBM&Phe&38hcN7;Kguz|~B{HA^b@vJphmhU&s&&)n6%$0}{H{2YZ zvH~7LDs)5D{be!3LjL;*;xHARVa^-|s-A5275{lXv0@u(mH8JEV86+JZ#k~j^o>cf zlc&|mZ%ycZ1u-ut-L)DTLojt+gYR<;?E4GSVhf2rDKJ^LE+M9qGO~e~caYgdfv`7N zbvwaVJ@TgqbjCUe*RSK@i6e**t>cCU-X{8uBy%Vo(tEHqBxf`GuYH1A{2AtuaaM8w zN1|4ZwNzIhq&=Nf0|pTnX?fb+WHYf|WUChhrn-|lk5j8U=_Z<13C9mMuCpx1ofds7 z@!d`6yx6x%GQ5$&WyR36Uh%`UH%O>!Cs>4BM(F%3Gmsmo%&1Hl8hn=I?jxaU95B$n zg}e$kZ4~vlUuLu&E(L!+=wgtpzYl|FX~Vz7d6PVUI)Q$?s(Sw1d9}5?8P=0axE1jW z?Bdg>_5oG73)W)=%q<*T!uLV%k;+VlKuNd?%Tma(gephu7 zU*0K=zjFJ(tf(A=z>fxv14%h%foG}T--R44_XOMD4w)Q$@z=9Oobs`lU=HLHxBH3m zJVfb&?k`@8&{Q_T?5{158-5kn37p%2L-uQLz)u8C1xcJsz_WDn z`sGWEW9s+t3FtR)v%uX1TvES3g12(RiWektr-5hb)YM<-SHS1`?ZfrE6_)Xi)NhK^ zZ>3ugnp~VUz#(zo0scwQGa!j`FL;(>Oi^#wxc*j7u)h!|9&F&=1RsnWnXmLL{+h{L zf_-XVPnFvNb{1xOIieEl@#rQnfo0Z740AV(ZrB9PCSg8i@7pZ&oYy&ue*yTjL90O$ z|5e~wdhX=uwQvuK*s2_eJn~K<|Pi-h<#-+N_KE@q=4WPPBdqyzZ#78}}#PWL|h4#e=E%5?rnU zWHzp3vUuqjQFT6l?vLm*@cGx1+p2LOTLkWsE>Ya;z~2tK8zgc66+BBzG#9t~>=5p{ zO6EUEjv~qR^m_GYLh9)t{yKoarvA(&d0kTuA`Df$7K@lQ*hjPCL4g>*?S*@E+sHC> zIO(yAd*k7t|AOLDj3uR*xvC(I}={-DOUH?LJIkS{KvqI|S|nz$NQf*RELS zfX0I)?$zK~3b^+aTI{DzY@8SE!7Zm2`1{C{VkO!r))JjRB4i&4i}lYRG-U@wiO1}g zmlXUHqFi_>mD-8EOclXFlkGfDGAo!NbOqh0qMwS~CFE)XZYkFf;Jw|#N*qYal>?ro zQ&k?K``=9-II=u0R+R&yJghQa9gz_YZ&UH9)u?9e<-)U)U?v5&kUs@5y+s`^1y zc?6bk-B6cu;1r5q5F}VE@!l+7dzu)zYIUoI(s-Z1A1H|8p9Fp$Xdy`AuLpnX@E=c6@Ov_%TI`| z3h%>xAxbQcJu2yNW1NN6*Kli445AJoc3yv)G$Q1;0->B_I59W1URGz?8}Ia_i1iBb zn0jx7EQ`SFq8Ygr7Z!YZFozvQ^UTpkn&-5b05gs)h40`2#Ua1m9SrWKbRPhI%2$XL z63YWzm(q)XU^+R?xRTJx^d3SF5Q-D8D+tY3`y$TTIDDp#wHA^}FBXDT@OMN%CiX(&;5#`dR_(oGSJl^sposZvt+sV8(Z#So?w5qlV^toK0U zKoa*B@GKpeBI-rboDS6wv`pA6&0X5!st|s*uNHo`H_)BT-S#fR{B3_~Uu`Pu;E)%U z+{&bOCSqSZcw+z2(k8Lyix4+KL~Mb>X}nt4WWmi7Z`WiqvDQ0;vMp9$g5Pjb;65J5 zTQrLobP4@8vDOiqr%pD`prxJ*X)jrR+JWEI213kg= z<1PFsZ3OEkAlmY$@FM$yFO805*3LtPx11&y-)7`5@x2fJ6VQH;#CH(NKJ=utg{;B;pTX`Ebsto?e^AWgUfbKYkGYsb{iEsfSYE}hy`dQ6NU^NS& zA}kewf~aom-r`gJkrkPb@01Edt8j{{>V{&l#hpV#iDbg*fN#L5lzM|*gD9VYvuV2f$`u+A7xFJn5;FA}34w(0G zj7~FI+49u%g3!}0;E;Oy4*Y*WKf2gDtfwd@hQm>wfK82?cDwnO^^NLh9r#~?ZURaD z+y$PeldVtD^L6NFLTmkePT>DJ!|B5G!`2Fz0kqQ3i$XsKfJ5phpuyC^Q}Q15#+(z+uh(F06hYd`gsaGODA!TFWTD?=lJ6$S}3rE%0Bo;EoE0H z21}o8B`*nmDE*`QCp`j+X`( z&nDy-!F#5sKZ1V?^fpN1`4Buyr$|q(9l=|()nht&r zXdX!7Itx5YC!r^SrKm60(`02G%q|L;f{I(~sm{f-1NjvpKc=UDfma7&?-L~PB!g$^ zgMW+uy94u2QJ-4bF~H{U1#!?ie<$yeUZu(=H3J)l7h!P%_g7>B>%4p6y4oDtUBzW0 z#CLf`=&uHNBEZA&-VFYB&|M&j_aX2+ooN5S`tep6gGD{L{w63}pg)8wV5OPMJUoh@ z54G98RFCI^zY4SwB=Ou2o~0SC-}Z_V z-`5uPu+@2gBdOZX0tjA@?Mn~(lv}8B5IXFG#iec~>T&Qu$_|rsPY#>5_0s0yc(K1b zMce&*xBP)imVdV)VdXT?M3BUN9(b0@P80Li8RJfP{yM(p6deXY58_fM?si@*9_jqe zB`^SD`2VZJcB!zy>@oo13ogQ>l{KZ_ILFJd1~HieEJ8^nILW663s_96sfc{DMq30! z$Xx6OZz0YAd$^e0!N25dLcYDgFXi(N4J(~MSs*E2DR`FhT>F4BH@^D`?8{a!i=Iz5 zlba~tySR_%u&#G|V-k(}z4vX%iGH2Yq;e#;4lgCO1n=q5KVjP?0>eUi| z;~N71X5f?f_kjNl^aV)bH%m?l{x;{5`^aTtqjC%1M%r(`tSZ;RXHOPF0wCZJ4j&+c z2^lQX3HC6M;bCHohYT^0VK$SYez(A14t%nmo)7*a&?PQrHqU5lzk6K0vwlwQd=EgS z8K7*_vFc|F7*>u=Zoa!(<@;aoKY{2lp{tJPd!(95k$oxr$EP9AXaK$zC?Ev>ze?ldQk1qy`h4$&E+$oFCz62S7yyHrw``q5|(Ys^@He zN8sNLe6s!dMuwGiP&P>7F9m-J@Vkm`Eyk~otibQ7$}?OHw*qG!vjR_UTY-1KE9BS= zoU)$00{%~+w?R^l1K?TeSp99m9pnzdMFqxvuHA;L!0ECApCRf;-FpI8(Woe{YVdWS zRUnD$O7I=Wb(C657PVC1+hI)GssaO`sKE0%z`*-%`6GW>{>JFAk_bu#NqhsrvviX6 z7u8oBB^|5({Yg|`!@_pik>ma^cE3vV2Lk^l;FI`Y2mc}HZy<@EmYov((T+ljas834 z@UNXKKk}F5|0?*spud77z8}D|B<*qcc0S>GIh(g)M_#xRfDyrM^k-&7a35io1K4JR z4TPD^X0AA@LdnCqGoQE)z~nVm@5%v!bD^%H@={In?kYr)?E+6t2RUj}~) z@Vkm`Eyk@!iUAYBgAjumI~*Z|aC(%eazS1^N|5Hi2|1F+M(fEa@RLBNgQOg1foG{> z^|u9guzUe50pnmuwcoy(DC?{=c9aDx^cXe(iYdeyTCbMrjk4)efo})$m-YA`;17d- z1WA1UaVLYXt$Gv7m$bmd#l6k&x)|Zr7$8kP&zbLnEcr~}n}PggJ-!+IQ=n%-5?{`E zfiKC88~xlv9j(W0&e=Ape-lR|e-{TO58zY;2PLoLL#E_|9;L}D#FkAi4n+J34d|eA ztlVDk{13BHc*pCE|@300g}%Gu?G@Ex>dj?SN|l&e655xlv&meYMo(^it&4LEtuucpf3YC3H9wrHNiaYQ?ikn$4%$2aT|Ht|0i}5 zP_`*dH?(WK8BD`LWGu9mh%PG~_s`PPcxl&Zi*du0bp?%I3H)UfqUC)l_${D2K@$H* z;91&MD9Sm>jmvY~`F8Z4q}y*XLF7ptHWq&0dPm_lykVvMsIJ^%7vf|ErHo_MQY?l{ zlNDqqn9k+v?7p0V8-xZaZ#K-Yjh-mgbP7BEm_)dk;w5(t!4cVo#`)?r7)fI{z3yuv zXVJuHIaPtL1FZr{Ij;fF(uSYKzFE8Na9fv?6fd!E2Z5K3xLPI?!cRS8vvy}&=`a^g z$I+fj{T_Ff(FH4{L8x*S%>w6M;E?SvSdKX`s0&EqoDQBPIS<O2XC4e z3pbiCkUMxe9MqIOD2J|^$4H?45vX^blj#Xz_aG&Z=M6euySHO`;%KUaqeq?V{R?7D zqd2f82T%SkU`Js{@5|#W(cf)Lt29w)DTBO+qY(au1 zb;3@b9rWeJ2GM=>_E`wm$(;73s$8dU5Tg_p@?#M)BiF1GV@ch&LM~-;RImNPj{uDU zNx5c&XQ_kZ+%d#SEFX@sq#qyhZX?Pgu(!;B#)Dc6O`sO_v!lJUT3pozz7sgN0f(&5 ze*=FA^dFGKnLI_{JlT1XsL#Tl6^h>>6u;e7{B;^a)EB}bBcD`s#wj@4(i;F(TX@E+ z1*}Wl%l0J(@=kwg%fMZ9SjbTaoKlX*z`qFE1(I@n4xXixltT{S#}(&;V~c|pKob9l zI7<2VLY|VT(fYF-`~{$OASusg@GPB7{gLLy70Ym6KNYsn`|XE`(u|6egSnE}Y+<`_ zyeq8MhH$0-SK!-+{AIrpo`!x9)CDB*4FunDe8*CAA~)HN<1pcvYdvfUbNE~ddqQHa zw6xWPuF=JL1#rlE@e=sIfZhX1oUx}1oYIbX!w+J7=}>e?)Qjsj(VmM(&J#3 z$E_HcUWlpyV?%0A1yu~zio_hA`vnNi9;NA``B?u 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

    Tv9R)$1( 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 z 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Ð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

    LG^WKcx%MHNk2S5CPx61>O`&?Tcq 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≫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%0D;0PX5`L{W*biPpEyF?=-(O-yhV(7V~X} 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

    _lz2m9`Uybk%JkbfTK`P>(Zy}Q6a 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⁡9cxrw9ghbo~QX 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

    &m;X<_j|I{h zu);xVfi^Fz$><#KS3m#fUzWw@eh=?$j`(H6zx>aK!++^d)A{2Z*=MLm;py6yiZU{z zbXMhNbo)Y)zhG?rKM({CsQ&do{}O-v=U+rQu1wVN@{%7g{|i0zHljC41=bqv{EJCu zNdPVsP2j(E1cR8Ba*M=?=$@!PuNivuJh)n5! z*#N>dS5sE(6hp5>Uf%og2j6Sbr%mRcSHqv)1sN4snk*C%FS@-G41N}DvDW`6U;g#C zPGEu*M}S!arIX&D&tvy!``^N3$B_Nsz~=uO!!m`hbk$f9_u zwi{Yc>@NeSl1(H|wr^+kqT8#-vMK**BJNFC>>FX>Yu(4HaKN-mQ0m)5U8H(-N{ZNP zimRn{yPYqlc;g3l=nR(i=x_Ab9Q(V`-)@UPaJ>?Ffc7|_#1ZlUHaNWd_ZC@(esBuq z=O{8=68}MOOXFZQ9TyL*LuNl3h<*AzL4tz2@}$@l14(>dY@7R`xSVfkC^Bu*2jU`> zqCg(2;n>eRpo_%peFqbT^$q0rjN-%S;r4;}NF4ky7`55#A}f(HePHG157^ER#$8p@ zp}5s{wONx#?F6o`3na;WMqZ>-N(T7@Is#AG#?;N_f^yf=Ie8ZJx?Bxpk$he|pi=6h z!RYY)HAB@Mr3rl84SAR0cwMgGc^lYr98vF}HGsVf=afPdDg1^lWMh&4Y9Ka88fN2e zXWFOx10^R#x|?PXdA~QM^z<5&$Ar~bZaG(9(>g5vGRkqX(u_oM0xG9TAuJbZ3pnLT zeE2%|?l+tDi2k#`p5yr$&OPo{Cn||o=a!QfUl}J8N-K)@SI9fgxkvA+J!lyY{vF-a z#j05&75WdFm1`)X=}kRf!!u-1v88(Zf`q95{(+LHk9egJ#|^qp7h1l9mWzN3h>`-d zpA@q2)0-Tj5zm_uQoT;f#qs7DJukk%grbrhP=RbWR1hiY<-IJb&wBU@Ax>o`iN6oT7($B}|*+@u!>(_B~dW4uu zhcC(Wx<@sz*?|`2-cS?j*LYdgW(?cmkqPo!KinSvZT6ee2jznM+&Sx)!h%DyiYJ!%SJg@_7SshiqDZVe3=@^pl}B`&I@OuGR1@N(#;}91FSwcGV#Q`i8&~2u z33p!x%!{UkTB1i|7S&0$8Z@;G62m#zaVS1lNFbKe%lZ_yXjboV@_%<%PO%(ey}}lb z{-q;aF5_ROM%Tp@T>RlsK6Tt0psw+w;rVIBGx3tJ4#^Gf18o!?>ze^Pe!-KB&l!N4 z0rCxJ!8hAAS)bx{?S2@1k0b*{$eL7Y8M5cKSm+HrY*E!ihe24{hePGiKQIo^o$l70 z-x{Kq6PUXn_$U9_Y9Ib)y_yvV;|DwB>rinhSo1kB9W03`jt(GlyLQ$^KnXhZ;==j| zdRBou#gGg>!Q$dqVc6=&>oD|^1LuZT3Qj!7Aka}3AR!tOH%N?=*PhQXi1!BCw*r0` zLJ9$&&o85vNZbA))Y#!H((F6V!M#~C`aJ$Ksb5%@_^#Yzo9AjdgJk$RAFZR#on3cE zcGAE^wr=i5_o#vecJn{)sqOMUKUh0oZTaoV&oIHuA0mKUX!Hl?JseK%o*fU(Wlh^% z#Xu){a@xNFmp@lWPX&AcJ2zMOweh^l{}oEZWQM1(ir3@w3d_bTG#3djD?E1g8hvnu z!x%&Y;eD_26&Sl7-(X5%E27I-z9=qRZ;cO$u}i%B`U$AMUNhn2!728)v&+I!@TMSmly$>{QyI-YJm zCq{^%%>VVNiozSJJVK%>wwwF?d^ft)pAs48c9)-RbJa71Oj|*s)g|6o;>Y~Ni(oeU zim~dUT#52@3;1EWYw=KkJM(+e+LLDu@ZOxR?y#d8$Rrm)A5r=xIPJ28fc(Zxk@RRUzw?aEUbJre2TW+udGHgG@b@76SJ*WMU(7-;j z5Xw-j&=@kVkPUeW7<1T!fcF~gtZ^V#qNgMDB*^vEG40lHO;qjW!qrP~($^VO39K*K z)73Q1YG0zA1bepqY$eoYn#%K$5c zI6oc985KAYj?~nm&L|q{>@vnu3kV~{IF9P1d&ir!S0~G7)l#K)@*vkd- zym#xaqoNUW78il_C?8IHO#+V zcDau7%vlwqr8mbZhRxD2$ADm#TEI0MT=Hc5( zs+neKxS4?HYNi4Sx5F$Aw&UAs{+t*(R&j(!P+%q_9H3YUCn2fZm+Q~RAAa0FjQS&F zS4bmG{=zB)r?)M1v=gh^7daj9D+2UitdWPzq+|j1B@>_8a%%KHBI5>pEof8a(&>YPE2=*KtuR> zH`PSG?EXV(2Nq*+2q<3l&$rK1mH6UqnRQ8POz2PH5JFviTTIahFz?c=QdV}gB)ATd zmKK2EJ{iyNkjr!!w6i9N_EM_y_#&pO7Xf@XkbIr;Z?^FF+tq_mtHf+T!HVi9SWYsk zFQ1Fa25oQqsaefuGkme;o1lps{CHjwDu+&soW@1vd-unDZ8H)Dy=O~koc4}tN$@U0 zGGm;b+2!mG4KyVSS@07*AhT;~&&BNTNe;|YupVea9mzwD*TL)6R_{Ek2M_J(RUahl ztf~*9dotAn*ExskfoY#Q^+4>e3V9$~M^inj^ADnWAZIFJX0ZE+%C30A0fc1STp<*u zRZe2sT7|L6&B1l@bjv0lI@Gcu`sgf*yC=5NOA#|3JR-AeW__;D&th%MI1sbR!ZFb6 z9L&ZRTYu^erzf6*r(O>@d%7q`U&3yJ(}U{?l{jdYEdVIkaE8$c03fGr18*7!lUaWh|}6s;bSHnWLn{lWXuUf zpxb&8rh{BSl$Mjk>snPt5fSewHapzF6fJE#KovQD8{)wNxQ% z47BJt<_B5V*=kmqwD-#AauSnxQdG-S6is@;|6w6vEmvUYB<;pOJG6Y2$fv0vm0W4Pj|onH8*4wT4p&^o_(6TFOYy;{P2gi@7VQo1$^XuH4=iBob0jRR+p^ED0sp$9y9wi4i^ zIroqhftUPRZgBNHHH0AmrIURRZsw*O9ZkruL}8^rgo^EW(-6cbn47zx!^E51??B-A zzL@XA|8cckA`oi_4o<4g4%nP3d{2_{%v|2# zb)=)YCVbWA5tOPL5mS^*@Ha|M^Sr072j3S+;j;gBT`gYT9lU)%!Y}JX@-kb9Fqye{ zWfu4CdHvy&ku;or+?IwVnjc=BCUzZkYn|xI+nqn8+3@awroqoBCXs6Rv#G;AnKT`| z!)$MDfLy-m^mn?FrNlqBYr`xR#oxWy}8>gte5&;FE@Uq#w%ylhun0h*E*&!ut(tb1pCBQgoK^T;<)0hNN2PY z3^A$_SIG1utOV$py@2$vAEQ3R_4#5-HxF@Nx-6#=F8InnU(}b%c|>PkWqr9eA}XbR zr<@SD^g2e`k>aAXf9t>-eR0Ss$aAVio$yRNmw7S}k-4qnEL`Z>Lw7TQe9Bd%V^)|6cr^Zy4{1|MLA{DEKMvrP?by zt=6>D*qwYMGJW-+FE%B_;-> zx|+Mf0ZK%XMUceu8d3-u2oVr=t~p0y5l}uRacsiY3l~GeSz!;3r`t8WyfDG8nsPg> z;>%{FI*xzm=14{(a6OtWLf=2*_01mb5Q<-zp@<$pY%y(}ymU=V>;l*hz-$)yR`+S&a@80 zBRCjF@}$c4RfaJ$-<7Z9j`H?X7o>^U-v!u^I^=*S3ov0ZRL z?stkZYE6z7W>u}B7!aLA$Ad&u{L%wSKbR#BhgF0{=vdkbXuxS=JS4+`#ZHoDS6lxN z4uBOMK@yRhy^C`5RMih5HA+yoFXxE*`C6{-Huo`&AmFYLa?k}Ka(#R+=Xdu}{X*1u zS*$Nt3yz$2L=ONfn43Ha@h~6_jYvV6uP)M788MAWY__SVsy~fh*TmpSoIKFTW?F*5 z!11t#FKJbX4mb@qLyE?PLEpl0zP}?f`e_^y;S{%bi|V#m2>sj0IH?SY(FL+}w3lW` zghVE1x(zF0-&e@YK7aN*Gd(zn7G1W*TlUP+bab?le374sh!av zWW5jC37d93g9uoAoE{XQi#Hcn7jkiF>z0bv9}~;o1`U@@8T5GQ z))-N?-J=WklOzk{Mw8%vhPp*jXl2|?@MvGTK3dEl%k;%RO_5HIG6e#kKZ%ud8Pj#8 z$VIW1v@%0!iTsS@V0?i z88u*Z%uiyJ35XNmn;{2rS~r&`m+?}Hl@qn4VN`u-D7i4Df!KzPgWSSFdWZ4OzQTxn z$nc0$pi=d0c!a>Fn$oR?aOvJ;^Gx>T=p+LMkBW5@O7g3#OYqI+E}k`aTuN_7tbTn4 z40t*VXz%B~8HrCb)O#l-(zAOA@M1N)h zc8SfP39b>4)6rTR9$F`hi=5VBNRZR{4P~@S(*3+B?ivh;f+7o@sh|cBZ+t}CyN8Yi z+*vzi3|5rcs|3Zs&okz*k|PLahpqu-h=Q15!%J>v-cW87!(jL!H^d5?kJG@6r>?g6~>sE#R(I#sbb+G~~pSykl+b zo-hsyI)gV3k%16`&NQt;s9jc-jU(2Y4%5U#Nop4xI!DBA`Vuxly2Tto>kxGeBU9Wl z^e&P6cp|Qf!-x_pJ%$(AFewwwN4qZXwu_?fUtiYn@ayZEggyqVO(B(D0?8R(I>Sx3 z!D@h>HOVEyfb43m0h-0GnOi4=WgGmg`R}q0Y*W?XP}554vrgV^>V5dlq=kQJ$UQh;i8M|L37L3L6fVSLIgVf^%<5KoHndDDo=d!| z18m|s5;ZpnnR7OP(#2N*C5JgX)7P8P(IfWn@(GQILF%G#PM^4VUGR=QiVblLQ6zWp^J0gI z$4TR@7BK04zZ1`)sp|%v;&5VsdbQNU&1vX88%g#>gl;ZdBwkpgX74yNp!|GqMxU@0 zJdpa&g67GZ4V~^UQ9r7Ucc}nLPCEgTo^S%DW2y-t)*-~Vh>+}JO{kn)>Dkant10>K z6IHnPLplcnPC>oL!LT+=f8RFpy@GgcVO;KTVK4MWy+m56VVGCdx^HD<#V2sum(4mC z93$!D8;*8Pku~$@Ny@mSj_14wA$9raR0cmD$yho&R&W=*%K&!ayJTuNzGHg1#2LIV zM~u{EQMolqJ)BlXF4DSVJlSo3B3n4O%PH#~6z^XnXK~YV0-sKa-~@X9=FQ({^pZ@( zq_eq}glz&nkrDN^tTyF09N{t>6j?!hB)m64CRieDt@LDo5xd4k!|#OAhBYonv}A(p zB62I0mZM3JHC}ozY=U>pK?{`5>JqD+2`eNZ?=r_lXrds+d4;?j#iEb&cu9geDHL^c zNw=$3EP~8R$$Ib7@)no49EKB*Stj`{@@A-IBryif8ib9PM_<66CCqx0az5Xy@~Mwd z0M4qdhD{(3rt|m@AYO1pZ6-RVI>q0n%_ma?h{V+x6m3ees!$L4)p72aJa9RK(??1s za}uG$DG|e<=8zzATO(@|Cr`avBqnI)aF*4Ox4Bm($|Kwh>AHQ{su!NrvO{oaPmfCs z!Vi*;5(xC1@|5+e+4Q;OA!3t+;A*Jv%uXYCx-N$MviTKAgf1)4ltNwpE}n|W)L>Yv z)yrj>d~H{~rZ~d0C48S|G&m=smyB7&tO@hDYv`2Scx7xD)9jya?%My2U-)F2<-4?_+0<9Ih|DBd}yeH4%8PVL+B~rnolM zS~Y;8Q8QPd$NVLn4N?E!B~=(= za+{|przj+vD*1x0?6gTGsI)mGx81$XXma~0q#0)?GOu_v_VTZ$3AOX0gB6;k-A9m2 zPJlua<{p?CSlRptd$PYI6kc{kWKkj(qJK>qF~6$z#5_Jfn3@=CeB__rvNJR-Fjp|! z=M5Yxefz~i9@Z3><&L3-2l=*ObkY@Z%w#2Sb3dOY4zgNMdco(-2+1xxn1G2dC-kd! zg-Nz=Pnfvb9pNDvL#IOoYSYkv%(R%T6NoMU85}T~s1%FbOv{ZvaNxl3!AWi-dM-2~Z?u-QuaE z$C7YjaC|8xbti@S7jwEp!X{)|#wH{WY>ruuvPc_#x>wR6Y^M61jsT=J*LA1FN1#EH z@_qOiXeeTM;Xv_3l2pMpxpdrF|QlRRP~tg@pm$~ejq z5*n&P9@A!n37Boinn>LSlNpNG(L@V0-B~PtYsVg2*M2SQTb$Z`MfSxQh-m}n3|SvO z%`8%tNmgSVApDS*)SC7+F(AHPzzzR$b91#XmtVP-#E}p~CuocNgHb?Eoz&sR#{ud} zUT=-l(czBiXh%Mb6>*WHR2&=fJua&iuJczb(bj0q4EVKrD(fylndmJ&IVP|XyQC{p z8>I3Lh!!yr0bH5A!U#|V^c;s$g)b6L9W$N>J2Ut@yi^x$$B zM7b$xvn~7RQl{`%4Ww%b?jJ9A4J3U>lH>vS1*OGXK7NNz^p=ziJ!B9r9)J_fv zW1L;d3D-54T~LY{<(x4IF^JLHsXQ_UHAE>=+`?jLL}ue)AleKGCQ`G=jrq=Z)q0pu zowrVqMu{6+G@bNH^QMu z@#J{E4@q_7bUjeS5?@B0a+);qS;fOl?%$0$SW>4fY_KfT@*OoS6oxupCz~b4Gl~%Y z)oMQSH&*dLB>}DIN%wmfHE;!#D z6kQacy5s#OEzwbpiy#gL;?*+&)w%6K_~hZ+w_nmRj22K@_X1S!X=uX7S}C%g#!A=4 zlrDQm8-}du4c*qYk2m7f08Psai!2Fccy^O;V!jI>O%hN$^wLn~W%M*;>lsVJ*_T`3@r=i2 zx&H0lySGu3#DLm=A2m4)sDlqt4Q)Vu_z>092Gqxo8BqHl-{wI@t)aHY{g3aW#$*e1 z@OD2#UI*{?Gip3|_v43D7m6MNREF#i-u;vzdq8E#3s6xT)R4rxpR)M+7`2K`S|78d z`Y}hU`){Kg2cyRQw>f<6=gf|S{kK_sz02b3T^3*Oa^$uDE{m`IEWQr&pmOHW{$b9z z-#^S5g;~>aKQU5k&UsDt2;LBF;`0&9&2mhNwc`i~*%+629R81V%%}~OHp}3L+I*?1 z2jp-Sn<27OV~i@`%T@BKiUW4OP0{PKrFx|7nBV8M+*RovOpHEnh5R^Ww)XNjSV=0~ zyDf$wvm>?oG7yfm8{v9NHb}-8_H2N{%4AsCem!f^Xg#Yz1lYiu2s5)X)2!@Sn}yn0 zoy?T}*T3;2cU_r0d}x988IMmz20{uYIo~@GV+*~Hc)FZ#PFE>+iI0QfLHRkJ$|>@n zp1iDzB_4bu5(&3(kjlWy35{Ni$`&ga-jP$F3l~Vzq3<{Hd*a@-4_(AI2RAB3{b;bh=64&T9yXs{uAMQFkiW!R)BWlcI~vBnF4uK7GHn2pt}B~U zY`@sKlTJgSapdJ?$}To!e0896EMiwnH4PqUETC+ZrY!2oJx|;&97Fz;7*8Bp^+L)~ z4OT6A-6l^E+h;^GyKZV|tv4eiKkjObjZi*f=hY9T;W3gUhWpmB%bkN%yHwrfVhSs- zt5P3%KE0_}KK)U}2ub4|t#N&Q`ei$tEsIr7r}46=W?ItIBPSZBq&g@TwWJvWc)qGO zhFs>jHZi(;(}GTAv6pR?aum}#XRYxjK#oKa)hKP6v?u{56-*iq^GDK?&$x$N`?7@v zj~8+?;)*aclm(h_h*^w4F1etYc9CG?*8(HGV~QheEU^WV zY?g?6FJYeHq&VGk07Rwm`(8elHKj&NgSW?_u}!>W;J)qI_+3UHHnzF8A;nlrb4n*V z-4M~!Bw1nCxsU|IsR;UwpQrAg001T@fi#)ZJd*vAGbrk++Q`Y&&46%mMb`cKbXAP# zKR9#6v5L>018_N;VP)$C5Y!?|Qc?+$OqjxxmEpx~=Qx$Fyk3bGpBgfVu9<)@e71a7KLXp0tZ!xULS zwu=o8$myDu9kjla&qVJv?JUFr6VAl%H(7klp3}r6&})EOh`olkkJ)EX zo7g>vvx(YkAe)HA^pV04bElAriZfm$AjzJ-CTiGf2~Rr{59vYf$}8-{u&)w6ozPkv zT+ci*k%-!ECTdE(b9qaL-uz5kw(Od(Nw0mSA0~TY`Osu%K<@U2DK~>39i>Q^*bl+XCV| z`!ugTpbF*vG709uWrDCZTEaJEeVnakftS1-;Pf&hDPpcOpPh2*Sd1jO){4AADhYxQFU0hnC5nG1~MXEs)^Vo#AJ3Ga~_LY zkXC>%FHhr)Xpl576CrJ6^Ng{A?bqf8)peDp2cDwB8LYZUT?QQkqUojB)Wk^W9bhzc zRgzIV#ZhvBg+FJt$ynJL4$EMZG`m}<#N0E1;wq{n$Ud2epH9D6p3DE z0G?B9W@Ue$rKY(Wm!uUFAR!zCNKbR;O4K!Lj#F3{oogIJffl-~dJF$To+ z$RiUzIuh0Ke+eMDh_q0NMZ^S(FCs0Jzlc-?EW3SdiC|LA=I|zxrAGly->$#ft@I#8 zvYQT|)8`4Uio321kJc431U+FS9M|O(Iv>wZ2%m8Wb@nTd5e48*HC+KiVB<_@ToGat z1XeJ$UHHh;ppUVgsjuu=I&TMi&0pEl=XD7Krn#q^8gU+uCiG|)jW~oZEs%&d$f*If ziUX~YM*gu_;JN0=e4(usr?3iEg2c3;O`DW~oIlVTEU_Sk3FT%>4N>2+k<=pwhb*m2 z#Hzw5jf+ur9}(2?kYqtIa`)6jJtz!peQ<-x*ftj zJBg`1)dL*0OVFQjJez8b24tCbk+p_Ue8wm)?zT{9-&XVIFUWIuGItKx?Doa;TG4yQSp324IA1l1q6D6oZ5imd5(|r?IQ-hosh`j#u0SO)O zz8QU6;Vy1-Uo4`7%s}RuNr1SML3V`W{gLg_2vWVrmw-JNRJSPI47>FsZBV4KD1~Sa zFIaDy(sOOOjl1qzBihE@)}+x|Yw)C6`ZuXv`YsZl!FZg*4H=&0T96a5q>6UZOzVJ; z&InC0Jts66*#g90+syA({m@Z+J2$+%3$8p&(BSg7_xn>r8;?aXU&4665M52M@d%Cy z0V-_sPQXySz2uJQh$|w|YD96|)Md5>5Sj4f`Q6I(H5-*hyNftU_Y^_2LUhB$jXGMO z!=M=fjyJ{*FEOQTz^(;VK;ysN#sh)MxG=nSw%WvYP|T_XjPJx4Dk0fTr(`!H&30nJ zBCcEEesoeU(DB7yLr*J|d$;rHyvBQZbel#e)hWLaB{Xj_d~Sa@){C>!wEEw*s_HJ2u3;3lcx z4g%!OeP;`3wXUm$xDJ@rW{GiAWkE;Aq$PEN$r_gMLVrTb;N)=@RbK+FmV5uBlNBco z?A)tM13M=IX<#RzP8!(p?WTc4dfbw*Aq_VNRg$usiYg847)5DdXJJnRJKL5N@Q3$( zfIoDO4f4Yz)WC|?l#W5JVY&u617eV0%qAUUyoG$o1D#F$_%}<8g5qovx^|cV3|&7= zfOje-$;Lw_yARp?D#%=h6?`7YHI99j>vQ+-pYYxoWoSHS8rA56WeV;9I>n>4StUT0N`5cB?-I$I*79 zom=jSj&_U@snhy{JApTsYjtU(16Ip4Tcj;UmONYVEMZ#UnUW*}yx1I3b}n%pp`*?B zFz?8M=>VIrCX4N~RLNI5q4{EZ29#3QU7!tz_pzerW|mKs$%A!MQ1EF7ZF;tRS=>}Y zvvdI)DMQI52!iuh%velQc4A?Q%1Z%V;Bp>}H!tKPrzVIKug;o|DJQvl!=M{_f!8(U zqZ(JoG?>}SK8@rXSdTahTEMr-_gvETkgElG+i6w) zUXy#8+{S4XX=Zc-B?qn=0NOjax1}6eh?Jx2;}{m}VqSALBOK$M;tCTV4JRw@L8`L@ zvS@w7^OeNd>rhiU!iKd`i4IO%a`|PAvS=ei#AK$E*W)g&emlnphRcl{E)<85Gpi!) z)$g&Ay)vYIJJo*AM@B=c&6$XiCYyWRAyxD8F;H5J3z6ZBUcR+5n1h?Lrn^dm@F&Q3 zDE;C?@WDMjH!*bT(~W?g2t3loQ>0v^U15m-=HH8Air~Dx$9K2orZ|K~J(?^yKJd+` z+m;NVe}X4%i}xKUo@rb2(b-Ov;0fCmzd0%C5vpT^gwusl75Sbi578j7VUanZD=Rxu zNLm6>!Mc2CH~mh$Osn)ZAju94_MJtmX$+IAMjtLzO=7r2HHov?1tM+E<&EdwJ)`OD z)GfID51;tXJ!6s?);T7H;r(M$8Qw)Em7SzZ5u`iIwk0x5vMv5_xwbThOSPr3$` zKv(UAFDB$pB&e5q5SXuUr{%apxbu8Po5+FUL;|Z7zdD3-=z%0?JAI3%UUo$PjOPZ2 zwnDLhZs1HYJF=q4d@kk-otFl|K45NT9F64HD_Aaf3t# z=oL*zTN=Zqs!0qIsm2~GPfcO4Fg1liiM5O*EgCY3>B z+axe}aGOL1k8YF5fZ+|dGS2?xLNL%cwP+kSkK(sHA%6{;<9{z+gQhaYcWW)}F$Ok@ zw8u zY`OcqwP;}8ir>4>+icR>N|PAWPa1o07ikKEdq-0kWcv7m z*rk7^`LN>zGN}ye7L&l>o-v6G?i`cI?t*=#X@fo=e)g>gj7eo!FBxnM?A z?9xj+?BldpTN;Ce+M*8@sYzmiH=pvII)O$E?vs{_-Sk>ZXUL&>phW}D%p+8K9GM3w z>^e|)+^K4g3}5Q-W!NAxXxJP0gU7u=WALaoXzbEIxLCTZ@C2DSAl`M$9HKT%$^o{9 zi#tGUxZDH8cIg02j&d_@78ucp)ZDcLLevIzK#0)b4hRt&+yNnCJ9fYZQTVSQ`IgL3 zk+&3fk#$RD7a_M)c9kyPGnLWEJDTh0`i(IF(ni~jPPKjoGB-6cbRlL_Bqh&0_tR#))&S!4cu0E;aqPNoo1zu8 z1}!N*nZYZHPipXj;*;8CJsEHG=-FNB4yl1ccc|N21Ef+(h{l8XNJ@M@76<)R~>k<#Z4CLY*2|1A$j&h!VN3!1PX(*i+L^&xR&?{US zy`-is=S|rNx5jQ4P?7I!rwgnaU*@hDbf4BHGPLJ4l|~(%7+YT0%pPMnb(a;A|vDrpMt( zh{Vpr4O`Y-?i02=>5Ww{mqY-cx+{NM_KNF6BsH-O<>S+?FnIr zu7I;|c;Js>#3VALLrnakePYrW+ASuHon`tu>PN7&qvfIcskQC~YqFNakdAJ#hjw#I zVQ43}6n2_?Etwrg3K4mwzSTCRV}|6Lhia5)NkS+5ypfayj^YW|o86cUn2TzflQ!A?1IH4c zBp*5q3Drv4(R(0z6#5KB54rDP^a%7Fjvj#lgNbRFhQKf(niP5q(L^33M3cZEA({k+ z3ULR8$eqyQ_ZDD_I!Jsi`XJ%8=z|oZ)A(J)zoSBAPP9VoYYy1hVnpRH$2K;JbSSPk z#_EY}o_!6|049ar1K30!G=xn8g9folp!X2O!>qaTPGsBlGS;Qi>)zGt36inWXr%=d zrl%aZXRBH0=DG_{@1M`M3ksbGu`!#JaBNNn$}3 zj^^vD<8ICaNV(k-L#5Y*I^-%*zpaY;r4O45p(l$LT7UMqwuA0g)pD}rKrWF4FK@6k z{1k^ckm;t}kXoR*vTr^C+R+`1B*snX=*bz6CUkB`_&EF)UJt&wri{Mhn!Ys{|6h1g zhOTfq4MM6%I+#KHaKn9)Ap<-{H!1TJ?iSCQtM_H;O;0?Uhs1}78jpA8Y+g5;uXq#U z%?P~$))Ju0jR2vwpbMBYrvnbp{5+mF399SjWllKf^w%dC9K zI5Y+=Gzf|2;K{sMQ?Bfu_8@C+-O?FM%qJJuJIJgW2v6M42~EZ zDmf;h2Z|}W1_Sc^giM`vOdaewpkK>q2WUv~hWbCsm)JXPJXSUMFI9BSXlp+|$>S1m zIV{2_f*D0`M#f~W*}K9UT`_CBgQaTJ0Lekq;LSVI z$Dgo;#H%)E$QL)qMj<9Z2YlW@+v8?U@JR$75DI}*UC%lUlsN@Yud*vTU10~2+Z3YA z2t6w4Re>a)E2*=Uu%Yu?&|>8G$Jt8Sn0>0zDEakVZsnFBza9gnS3R1$+@4288mCuH za?jGMNg5}&rqtXPv#L{-Y>IVqaZ%+-4Y5%^1ZWAGE9HdlYruM`u%YLFV#*?kd0Ee) zaR#B%>v>fT4_*#--p+r|6GTIM*@`#r~ z`IWmqcw+yHVZMUPFnC#*7le?Y5un^(538Sg6YEwRR>RoV6UMrhUEty7m51|uF#9(v=78-(J3HV65RHGlrV zzTa%t`$A!2qekxkoLVfblvmE`2MbH=OGQ^?b-jgsT~dOqqvp7&RrcyMlp=*&XfRIBElOl^y zexK))iyg5U9rV|~<&!(enLaUc{YyecW(`4HfXFxSV(sBI6Hb$5CH>4<+W@R(@(OwG>eOs%+9x^Twbb!SE1&Ko7G?g8mId-jviZp)s+)tAKCb>g-`tDA zn1#iT$&6W!3OFEF%&BhD^<6v;pcP327cc_1mh0c%9lrnAP1S_|@U|!XVNdw?ec*rm z@k1Z*j|aWD`FPNanU5bb%+pquA3tQ6p9C&WETHZ4rbQ!`;QUovAz=JwEhT`*Q~xDSF6k#?t0o8gqhku8Y_`j@)6-K%kl*Py^a8>Y z4PfcuHNF(}KIO9uVPgyj+hj=6;CyP)HiObW>VZdEPjUd8ul&hgjtZ(q$C^v6+A z-!;DhdGY|I;)0CFr-$!?AG`7PLwNgfyg5X1L?WR$CPPg0-Q!<>Ow&7~=sSlNeUsL; zQ$l-W7uxR}R^}!q=y^k0e?wYS zK>s;q@LGHjq^ZauTjL22*k?L(_2BI{qz&2lnwNgtadATJZ<^f!}%p@ z*pv`DYcdrGK_tvVGT#Xfk)hM+RZ-K8j1t`v1%pM7n1guvNjbyqjH#mABtaMRWeVW* z84=SsGLF|KAyjP%$j``vovQ0=RXuE>%AyUwptIIQF|IqtOT|;E2>=#-SNUh0xTo5{ zM1EdWw+TW@R4F=aoF5kmz`}S)&=ON40kB}99<8QgR;ao?jAFCFKHQjN<`Bgeg|>~+ z@@a`-6fG?mJj>$cV!pl^P2h1Lz3&VF(ME8Ga(I_Zgk&9Wp5tKUbiO&_0Hh0w!-$e2 zI3&_D=rYB+tIY3p8UPR;E0YjQs(WQ0+;@_USPt-#<}4VvJu+? zv1GKuZA-+`5h@W&NT4KIaNr0=*MhaylBzCvA1n9}EBG;10E0JN$495&9N{?5Ck(%{ zDHdE;^O5oi>mDjO75c%Yg%Vm2LbS&8-~s*v|6Kr!FJIV=plawdl3Y6ow`3=gD->)a zNY^PPjg>42vM#ZhOOGIH+OROB8ip5Pbw`^Ns~=?H(G0GT8wziCikl`Z$4S#rMpDld zY6m1BIG!JCAGuj!K(#i>GlnO4|VCZnrzTHpU5BURD)cfM{*$e zB{#)gz+?c*_j`D#$7^!W*{zXFRhVyCh;1@*h;IU;NCHru{y;Jcy+%M5LmZ0~0*(-x$>&vb`fpb@JeDv2 z5&Wzc1Gn&*LqxIiggS55UJnlNHiNn7i}AjEKH(@srzUDbcz{z0bxCmea$!|3JEnjD z!zHXqnW&^K3L zIsZ<{D`FH-l+o`@qO%$(+gLT#N{T)pl4bSBC+dLJU1+YYuq6C4_U-01Z7@Q+8ZHRz zWannhNjYZ{q_hpx?N6}o1lRp=UsR^fpw zAfqXVuAyjResFCrc6&0Lb^e&D^J7Zz9}|M#f9o2>MxFa_6AbOY zOLW=(yMz$--=*q&m#T9=Rp)-H&iz!K`|&#W-^Zzb_$f~G<3W7ref$vbu8%+ZO(c)s zeCBR18+ZcOPzJ6J*s$>%F!|Uz{2VJ+Vq zHXO#dnv8d5Do+*jF(A7eXc=&DvBeIr9ViG|X!uSmD{evm;n^E2p7<40%Mfb%&%d&U2Nv=XTE?A z9Qs#8oe~B5bwPieUVi3(5Q;+a@>ALZ$qyG5y6_IMnT`A~zQ>KSmIkI8e-TFwM60fG zl<jeiTe3@OWje8m<(n#9YNsd#Nt=CR|K)5ysYcX*^Ew6 z#EVs!_2b&1eg-s@5z+ z_)+;^i?C5hGBC=JdSX&wL)x-&p$Hk@Sa2*TRUv&Lv(f;fJ>tn66Hd2?zBoX)@I*X( zsTL&#EgPUxFf3q4E~>~CiuK)-$Q_*YBk7B5Ig-7jT47Er^^Gj)F#@DvV77Q#fSz#M z5=XM|@S0+!pUbU5vZldk$y9#vn5F<_ED0?)ttEqi0m{Y!jllUV-iW*$p>MO$MP0T*89{T3dq>moWak=>%U>~1@Ex`96 z7qAYNg}RGM405UyZmLXrLLU)p#-BLDN&A=Jlt&pswd0F_ZK{Gno6Yn;mT>WmL>74@ zZQanDb#VOP&HF|aeW!#lsziP(+6->xR3>R)I((cY8sGk=^qJL4P@5uH4Z84Vxt6~% zPZ@GX8RFE}yUC*3PN8>yCl3Lao70FtaNG1>2%j|mmLu2uVnPX>C_zNK$Mr-}5g%l8 z7s&qUNWl7JRu?ExwfaT-qB<%lSE`24H>-xKTHiu>VWCGjtAM6vw11h<+(2@1y;E#d ztDlcg1u*ZuRlTCuqXkkHxNS?FB7fmEL8NdLIIS{x_x8a3bbt*2v(iEx9K7{E`H0vK zdx#(1PlswxD5Z`-1h(M6UY4QGwJ{7+=)dND=xQPGc zg@}Jr=mh>R${t~PPSK%KvdF2{=vgCw$hC!WtxpIikkjbNnyonLUjN5$%c6N8s+;=} zo@Up7IFT`2jw?y9RNFs;Fg1)D2}6H|V7?;nm4x9xgD};dpz;+8%8oK(2Jo5Y2e_uc zLJ;TGbS5C^uMosl^&|jhEz^hwp|BR7NF?}gpK^IH>%N_@kpCt$ z=b-v%xE^5G9)^dEgt$SZ*qLXNoqi=H>4R_0^L(Mk2<<|(Q zi!$%F73MOP3qrPw2w;FFCbDJe4kG@hO+skm{hm(mR%VC7?+UI>cgQ7 zTWm|_kKfI%o$~LP{7^b?$cL)&;U&B<*G_Hk@Hn7ft(_x3Z7$8p@<49cW_w$-H1#Kh zmswX z&blVbAI#-Rez4X^`sR*c{$?*A^l1XVjir=7nWhkb5LuMJBPPS>A}T@0wUU${zQSBK zw3hs8G@8D^0>3cSyZ&^Ju#US5xr|FB!a*ewKY<{ZgKU&hPTSk=ak>%y1*i4Ly?~hZc(d= z_CiE;HEc>aP@WkfA>H+uKi@mDXzrb{(paVevh$$ zBQk4R1BHE}X3KA$49jk{_@iww_B6(it*uf>UbeZ@+%JCp)*|rF*u;b+Y*_q^!nUW* z`#+JZK`zOyyJ7#`Pvj8rzkfIo8#PuS2K)z{FNWa{jqlrAbGd{zj4zi|Xv`4)8Ea3x zN1rIQ+Buyk-~x$YgoY}1k7QFL`2Ts0U3{T8E>CWPKhUiv_2d}XoWu0`CYv2SEW)MR{dm12I|J?Q|L2I;h_A?xh?5aL}xi2 zSKAt?HAWDl(|)_$tI#g)q)*1C)eakFZ?olmb}~TxWF$#-1s&#=fKRwC694ID~KtU*2rNQI93jSdoU?Jm=qlmLkho5 zaP7ewC{HH#6R@#S9tk(aIW7Ve98kp{uP7qQ`F6WS?CX3*K+V_c2?x;(%5HTHN?F=* zSDwySWpRbLO~ir{eNe@7N&-uKmeworF%e%x%mKrQu-g6ogLiO&2s9ii!u>$rNU}!c zw`Vx0$sdUUM1+JG)nDWrQ-7c1k8dlSS?Mp*ie!KWHWc%NlWf_xd2=J92P8^kFpNUl zVztneDTt~NPE?`^6Oe3X*vI6Z;xG8mSIoWk7t7Q6X^6LK&S32lSpkDoR1-wrekq^T zoiOnoi~Xq*MB9(;l5t3yfjBTfVX<&Oy%(Q0=w)h$km(-G9q4ofltY!%XOZ3D&FB)o zJ4Ub}pzG-Lmi+H@dPkL502l~xCW<52NFmk2Q7o}?)R8I|sxw?M8p7`gQ3$g;U;})v z<#k8V=zv71F52&3z>7vr^Bb%n=wF&}afo^IsiOG7`bEXL)D+i}Lih|H$3kJn0qf4X z6@)sYaivECz-)5y!vda`oA;X-C~ ze0ZV=PfH&x)LUUFzpH$>P(KBr0-e;r5%%@__)6`cY$VFbU_hS13PFS*CG&yxQY?6n=fPm1ddMjb(Wm2JiX5;i4OjCGc?1y)Kbyn2 z6|E=c&66zitJPw8YSEV8RERh>e;yjY?BfOnMZ>qv)@6Tn=nK%9cyY>xoa46BV#;A< zc0mK{u%OJr_UBE-lGR@^`0xygFrgHr_{Qd^{fSYD83&zpxD865IJPYO`Rpn{0+}QO z-*pOPn-UJ6PV7;Bb|n}`3Dqvc7d2g{^MMSzl2^@5O0+2DL}7n(Um9 z0gicz-+tCJlSY*)zg!2DvHs}l;J3xIr)o5+z{bw@S8! z5XTY5fOm_IFOJSnWvkq>FO^n(ZqeCQf~F|6)Vhm*{?ACATDQ9xSM)-JkiJ_qzWy~* za`Vp{uLSlEBD~8DHGt!PT%s;Oq#;7?K{1G;uxLeDP_&{*PoB1!q97nMQ4o-sC|k$9SIsqf18#8F$7Qwl1WnVr zT#<%6noP>I(i>pVEy1UjoKe_X2o{oQWmpCFXlV%ryR!?2*&n>R$Q`}9z!|>y9vHv& zS94(6B~};dB6HO1kKVA?B|-A^(H!^|G>?3IQ5|X((%=Y}xuajB1%|&_M!eYL-z{~A zuvyMBilcLJ6hACr{u*m17g|G3bg=v$luaFzHWe7dUAODW8Si$1ReP(#two9WaElz? zjN*1(vhmD?$u4mQVM{CA*;e_t6HdnAfiDgyW<>nH%dRSFYs|&GF z3v7nIg#g?QRv5_IY~8-l<`Jh;cboe+{C2EZW8Lq#U>GVGKOt9;Dxix(HVyT~z!skz zym^K3^zyx=OQ$Xcx6Gnt7g|)WKOcYiaUTc0bo8cJG(H-1^jCwx1lNp^Yz@wHoD|)u z4Zrw$j}78i-hN)z@El9(!7{760pYl8#1~_%iVv=`6kkaXwRM3K9k9t)rbGh;oIk?# zcTbgBC5{@>Wvn_Z6=oL&@fb<6OYTcP9kCp&&evnhn`#u=&QJP z#;Cu=aiweH8B%r&9BJFdzSO;PBJIe^gJH2Hfh@tU=)GUuhkG+xA-fN0G1cU@q~T2Q z@+PhrC@_803GVk|p*%tO3T01jUO{GY)p z=(7iVF%H7gXAk!3<~j(>-#zH@Wmq))-G{#ZHAowNlmI92p#-7%yFq(~&~Kcaycr?F z1B-_2PyKbiihn)AL#Dy|s!ZfZmW@FBKGVbZ zh9Kl8L;J}urn-@zEbB*ogNeqOF7O*ie9l*E8I)z*4Ss$6IZ!DrIdtLHqAx!N$qRTc z+PAT+Q75^XLhaO*@&~DpSZf?qP6E~5*<-3$`KDJA!qV;*`$v_QdD5lsc}MEkM`~JaOuaUr)=0(-~$wD zjd6J5!WfNpi)y5CL{!_jTo#gh7h+St98HjlvF-qpN#8|lDMA1z`+?n#UE*$YoKkCl z!^5J!TrFO(TxoG1pPgLmqi}gNel3rexJ4&w;?p1S=I}=_#w2bk$dPoBJbvcmc$I#K znqr>Co8Ql_ymNSbY7gP@BXk1KpHs*041hH%boOqSVZ*5p?L~=s>ds&E!5+7nKe^}a z_~;(C^Cx-Ij=v3?5Wn;pJO6#C2qSiOa!-D*&+Ym6*%kFmd%UTBw`ZGYSC5LqVya zLZ$Zn2|^fisQ6l~?r!kmNbZ7*+vcRAYyKR4NtGD(fcR4z0tI@PL@=7oYq>SipP)7I zegVY^GYvrERUicQ61@1dSbY90{#rE@Zp?6eTbx3o_}61KpQ^wZ(`TV~{mw_Z>$kq@ zUH>hv4wo|nRsPgS{M!Y`#Wle%p_>i~i;z=bkhDrH;#Ns>k90c=E*t*u|cBWXLVTu%VSx<~Pt4OcH&R5GhV3oO^0k_aIrCb1Bbu44cf@s$@`iwWM z@Lv`w|HJ{PJUMHBIzm#)iU8DN$A2regVxh_}qoJQc&CGJ~N%_W7c9gUCA&b}76atxHnjz;N$7IIOh z-`L)u^#VoT8_)}B?EBdYi85k^TIYfO`5Y$Y>W+p9C17LDYGlA2ZzuO!#RE=!@#+Q05pL2|=Qv)eu6#-d3PjD?A_bsXRS@B4YRE_~O)>QbFu_zJ|ty*VD0Yyy_T;nw} z44Mh`rrum&OZ<6WE^y(KDB~BkNN-5+n@*Uj^#*L~xoxIFVyrg1*jquS{qWBHuHX-G|K$AsD1IYO;C6d=fvu3#M0e&FV`Bj zX@_+u)nNihDSMl8iH@0n58LS%Lg~E?#?7 ztf;SaKZVS@2$n+#6^$`|k(Gn1ToYDv%1>3w56Gu~DI8Pt^(jU78=^qo)r!yyU`Yax zhZXi1>c@xnhifa%o1gI_!;_3WnKxvY3N+lQ!lFYxAb-<^S=mgwBuk8885gAsb|~nX zCw?l8Dt>9BQ~WIJPw>bh^N%3J1Jn4E6MY)Lx&O7cTQE2c8cIgboQN-VwW%h^QRsiN z0mpm=mc(p;ijOoGQ*N-`15CB)Z;ITalF_r zZ$Wf5)z%HJSU^q~mBQ{^VKy5f*Q=%xxA^Fq6y3s^9+O7JlFBSrSYb#_BGnAHTQI4< zV(Eq7KynV-Nz_1&aK~V#PuF5X(w`VwTj_3Se;N}6mU2_-fuep1ea64O5{ueC;!hVw zj3|TRl@fqO#bNJg!pYTh)eCvAbM0fVd)+_efnU1GK3}_6~#u60z_)kb>dPsY}jFq-SM4o6rfM(KZ2A|F#s4;u^Lm*3t{yP7o#H z_iyCb5Z(*-v-EsepUD+OriNI9CC%UHD_@SoKpdGLVUbF;V}7M}mAKl7+*U4vYd)H2 z-&XuIi-+@_UV|h;O}UuSSXZ9Y#;%8c>Je+W`}i3{fe#lTXGK)gkQ5)*ebGsb!o}K- ziIlsab?BaCGZ@PU@^EXY06zROqxSHVrlN5!i7#vmo1f%UhU$!4)FyTJO(j>{Mt@K$ zwEd!tR^y8@i|tR^vul5*87(`U3amf1{-%A~rx$q+EqOG)JkhhaHQtTmE~)5l=1p~> zNRg}HNG6A30OdQNlL&!QPk4nBKcI^BA2P51hj+png3?o|{*jP?iJ4yxoli&~FV_4P zZ~rYa)!T^s2S|YEe0q-*h4!a|x9?r3gZ)GA(~s|6z7BrGM$;n+-%^Tw1hzCXmbBC65OHyib0OKl!wf_t8bfjW+L-C$FF0dd>dnt;fVq zZW9k(+VAm{s$JXrLzi(qWUxrw3Gc&a%8?`R_~VzN5ov?lg6(>Z(cc+}QJN9r zhp|wbAB>gy@$hW*>j&YxVWytgydej<;U9liTk=2DSti5MFX&9^uo1sdrQBoh(aYjE z(h(_lIcGeY;(u+qam#)d8qNJo2kKP6`yCl0Sg@h*e8)O~!^sM+k&A$z_Xz+@QQ1Ns z_qv3acoA2e?j!1AJr~2L6DZ!^hVovTJYb<7L*KS<^I3(}!#r5>1%@idGA$-Jj-~~k z9y2!ytB?dN0-?`{gb#gox9hL;EP zm@gn5V=~WqDf3E^USU2tLds{8w#J1@P&YI^%mh(U#LKORMk7lFYy}HN0t=((G&gJ` zk@-z_i#>WY%oW-C?&!5kHJLaVW(F0;Sz+m`EdL>1ugh6kM|i{tNQ)gYbM+CtN>+#K zM(`_diH`9`Qj1B-3amf#PTP|{yQ%pl&QObxCk$3F#Y-WH$u>NimMYCfqKBUFv{R!E zevb(*{sL9_?yY6x`he7!;HYJt?5hpz95^V8uJzG;aK@)9BsYROR%t6$rSXne5T5v1 zrJQdOt|K&!$+KIgELv5uTV98e8O+sMEiPP~q~XH2e2nN7L8Z_sx8Q>|=oqw|o`ZJo za!b>w<8O=GEKKYXp=V?G-soUx5Eh##xFh&Oh-n+*=Ib~F6vaj(^`L7`SCrtu()fyx zu@QygHlAnE2`&5(JH=##Nif(Mx`nov)=*THFofDRl6NaYXz;92^7~HlaHBWsVNxZBoOh8{*iq9}OAj zs0srdZ@^rNXPP?dt~ohYFCbro8WqboBQYN3uGd;E4M1p{ZXj$-ueO^IcX;b;IiGyO zyF{iAm^WB?+||$oWdO4q%tEkqQ`;8VZ84QoE4DuXgxGsV0r1Sa5#y>x+AV)3`_5!X ze5L>5QU$*&Y^WMhIGs;Vi+b_Gipj_2y}q}`2~;XW7vNOR>J?QewAbb8%X~vmayd2Q z6QwCFAn;(-MtP`JMlqDv6j=xz`eIm#$F{68oz&Vd6RMI9qU%p#F?$d$Z@d#HrNjNl zMkfp;&-k3&Z&wd_rEG7QEwFHBi!HMC8*R5rpU4;&JJuW+Ull^OxU=B1(0=Ad!1PnT zc{Lyf=8ST-D!coXOhk0g$6%p>lc%iNL7}*Ebq`hiJYP8cpnJO!8VXIuh%K}R% z1xI;@+S+2&xO0&sQic(m{iiB4Kq!(zJyss;1%)Q|H}s1qLyUn1)Jv=^Ahj6iR$n17 zo1m>4?j}o5k+_ZGhtk@9JEd#dp1Tei2WGQq)TwWf1-y%FUaT-+$eR->Emx11FyO3Z z3Fm3<*wJ7=+x{s1ox%}J(Uo5EKVt}&&&6Z|_522@J`v4o;jzErSh^cjS0AgBLe(hY zmTOlOdoWo>-CsvT-)-rOHGFRKY1x>L2jwx^hx0;id5 zg9{%3D&oC|yJx@qW4?|y)hu)yc#oRPdW`u>+CYXCDlXkZ5p5MNRS}fB6tA|1JBa+% z`@&ld@k4u?dm6HRWT2Hhf;>D}TsP=}i}ER;Z9V8K$6xLN1otU%C|?tMu&kEOX4EEg z*m!Vwp0k=N7k37vv}vr}zejY&Z@$7-!~K@ClO)v{F2|JP30`iP+_#6gZBIJ=D-8DdF>78_E|e*|H(Ac+Z9|tJd3k+Ee!UvFcT2}T zovr}Rw5e@k#o*D*;3)A~pNmA+IPdW~pKglD2C55*R`ZN<-)Lpd3OVGD+L7dZZyTdSyGg(j$~FVQ5XN13$a zjUq~H)=Rxlo_Wr89&V%!N`h5s{H)I9ifvfYg@K73h7I*&0FrzLFE}oUj)2 zj65kf*uI9F1sGb*xq>JJ`~&C3vxbW|9MqU0X%Trx85VC0NrH^lt0Ars7Z#Yo%(bdB zqGT-?F>)fqSP=@Y@fI0%RV2;$751#~YA)v@y38LYs>18>jTj?ode_BMx|>*B=qvIa zceGJK9od@_zkkHDJ?&M$U@LgSGH*KGIS7Z%9P=1$CswyK0Ij(2-wOR2C1XKFOf1!* zKJ30nR}8J>>Lx&#C?)Jg)Om1ZTVN4=X~9JFr3I7FgL1%2zM#RQL)U?1i{2AN2q?WM zhcF`Ru?;F_M0nxzAVWIS21>|?#*+=4l2ZUWEUOq`T3#`%h|GNOtESvetM>YbH4$Ur zUaSEt0v{TOHQPl|XH!pgqE9_C)_p+MH=?1wp7X&IeNVbxO^$Fk8W3kqNL?BLkp>tL zDOTkD!wz+67Bg%pMz94E!&-JiI#PnjW=yb$Qsdmc?htEfV2Y84a@O zI6*CuDn)*cvD2gl<@h7ZmcbGQkDQ^lxN%C(DFEBX{9j=$+hjcwSPqe1&YM{HGt zUB3p#@oiQEC+IUW%He6t>qY=V4v?t4G;G-x2EnkGN+v5v>jN9;s(7JyxjZ4-P!WA# z10`mtVe?u3Jyasn3nDf-UMV5iGF2yDbYsJwc_Wcw` z=F@W^y~E2Oz3|@5I*W~f=&8tRXoTaN#E6?X(8yQvKsVmJR=9vtjAye8yh#}F7ewIw z!&z><3oRV+GH5QQ9bF{M*JItB&ISM)TBF9hX2qhDt80jayw7xUT^1{m+{&7gEi)}F z_TXY2N-z_E=0z?GMV*I=kkkPv5hWOE49+WYWwQxxwG;4S_ngI=tU>M%`=F53-v^$Z z>pi+ga;6NLK2<54{*s20r$88g*OidAsS2~W3@JcCUx>#%>_eK97sXW2ys;5Es6aY= z^-3LKN>x@+nl3yqN)f3@Gv_-}ohk@iRw2TCKn^u*x^vp^p(L7r&%Psei&5HzWNQpq-lC>~F*5wq%;r$8|eVpZwLF5Gt?nHZ(S{!_c7L} z=@vEuUHo4jW9FhLG)x&i>r;1$XQ;FERbMd z*YY+POH3_|esrRwCM@XyY-H7SsfRarE|lozKzr@#BSNu(!lT%&k)blHWmxoc$f$Pd zO3fXdv@YyA+{bovp4{7hfsSEsk7=1AQ8A86N@<)1ZBv^WNx{bJ=nsj5y#S@K`-V6d zu2coA`*wP;N^ajV1#9P3$MBJk;{anyR%^xN*_)N1Fib>N14P5)$Ak)xYYT#cJbe9Z zf=KPg!EGp5Q^uXda+=zEkcexhF~T7J$E~NJFQwFk=WPsG&{i;QeC_ zNRi=Ru-ZAdLA;(M9JV%-EXZjQ^k0}9NVu@=9Rnm*scjt-K+=x*L;}Rc@J|mYNi^sK z36NChl{vz?rW{NegGjO zWd%X@@MQG{T*Pv)EB_r%&Q2wa1tqIH;MB>PH!WBOi;c83+g)n1{gkpJTlOySfq%qe zN{j#QsGWt$D|Q+X_q*xpZ-=gJ$Wffza)SMtvbN2(i_raXPk%A>psi=Mn&=W#PG?ba zlyt*4)mkyf*VB^F;X@{qJ2q3^y?u)@%vmFH6c^)=KF(G2jL@x^TQI(_k!)ED+lz_3 z=3!lma4WBG;D$~>-9+wo(4Lm^pNV@P&eaaHkS>QnX~TSv6Zda_5Ow4NFhe+jUTHtlB`^h~gPqaDnBpL+-~eYJ($<4!VA2S=3>!%G+G+%5_Q6R2NqlY8esHcobU~Dx6l^BoK509Q;F#BGt2iI!y(rQ5jvZVH}l1Ug3w$YW}&)`u?j5?%y|=l zvcp7d0M}pRmpUxR>mpLV+ukC0SLvi3FcR#&oCP>nlEKmwZK&UQ8DsO_Kl{#=8vS!7b z?6fB&Yr~y%P6QdLlr>Mtq(=-JC;60CyNr5v^=vKWXeuAud+w@`7K6vSf8x>tc+Tav zNG!@`n~X9}_Yp3;M&Hw%374`k5=E(68Q0$}v~1nN&k1*Q^<*oB7Jxm^%GpZ$2~L+2 zX2+Is7=}}#$i0rW<7=xF=?elQqy?$P@VTj~uSG2$N>K{01tL$)Dd%etH-;%f$i5cKver5CRH8NkyEG!Mkek>6DI!(5vQHP~esVqgm4l=UFom#op?Ex`d=v{{1x#Li;Oi-r4AsZ@UcieYbw z*!529vrs0|_19kfsaEjFIfe}5v@v%U!O>lHOHc5aIU3t<{1SoSto_KZ1Gpaz1GW=F?P1jBM*>`PBI$%d$(;zKtk%&6(K>1w~R6 z%e)m|(w2H-|NA~b-hfPGzN|hQTM=dP1(3))5{X12ty)?oIs^yVY%Ok6nR_4c6E!}$-+3+~F`qI5~kyDx(S+#UeY2?YRS{_@qJhp0S z<>Ovd$?`d|`qDkxl2clJd1BS_#LV65OZTEno{?2c_k>GEX|Z$&KliI+UNRV1q`tvZU1ywH9?I4?_LiFOq%!HYYz{^F+duuTa(m{lc&X)h2rK}(XD ztvi?}HH>21BouV5a|)a2*Bpf)T@oAKVi$-sgd$ZVS%FkaUOP*T4+(ufg;O!1cq1$~ zVgTYnC|DZttf5q=0r#(Qz9GBEa3k6?;q?9k@K38;d1D~#FIm_b25+P4qpF4m8Mr5F zvXVO8HMfX?)!^G~eLmkp1&EL5xp4;E*QE;xI0^oDDlcd&AMga=bz%KMN?!Z9`7^r% zaPBo|mkBP;C7!PJb<}>}BLuXJ({B3#&s?!V_AvF3h==Lycy9!*vIq{ADNa5$L-WT& zJP!5-d40u0`6zje8O2I+m#Rv=%5VC5Jx)!!Pe$y%1k3kC8AdD`8AeE(3?oEN?q`Mp z^^QhyDmp9PWV-r0nakaa*{(BLjU={>ee51nusAwsM;pI-tuCPVqhb zRz)3WsOX7_alA>)_;wUYV4gINYwj+bKM*KnuT_hRczRGrnr|U&2aHk9L1$0}H%R)Y7 zMw_{KT4C%S0=#&b;PuMl2_=s$SE2E0hwH-^*B?Y=>xp}vc@hEzh-peF)Gj}s05}jA zO9gPz8rHp?b=k8QK>Ni(cN*ZIR-a*Bn7dcTT+=didx5AFFxdQZNM%Va2P6$aGFo3g zqFLn{qG*IB_aXE>X3j! z?M^_UkS3teNE1+~qzNc=QUc~tey#QY0TIBUAEu56;6|S%K5&O)2wPS@hlHn&7_Sb7 zC6bEW_sGB5?4B1ec_TRZ?6}MmuOg-zP+xp*h4To~X);%tdnTX*Y-@Fq=dY{2=2U2j|PPr+Xr_m9pE0 zd9Xg=1$`MRlpCp}qyEw^&Lg{l%pti?EwA!gIMPP)|5gsY@wHx=czLc%aVNK@{uTxdnO zDXz$iu+hm0ZFW!SiWUbMF|G&$$0gTXni+94xeAx$rPwM?PGx4NgRI$uH={B6c;7Z# zLqx1u843Uz|EXWX#kgl*gJn0=J=Y)N*FJjgLwB2>P zOlR`LwiH`~9wI)@*@woQ;dz$f1`O?1xF|X2-MuSerh1WUe%vm5$(ircpZGgp;wE=a4=aTpyf82 z>vHX51fmt9a^c>mT|mZvfLG0?g7*q2#*ce@FK^?Zp+*9;*GJgL)@L?hE8XIZLVW&d zjZNrdQCXDn$+?B-(FR(eufsha&I5FF&BfLl*K6N z*hW<)^inpTg(%X;*`o~2Lz=olg(&g4S4t?dOU<3{V;GmEa5VKoU}H1BT&%akEEL#h z_Meh>=t9Voca z?{@Qi6-3pbn?|2wIH+3Tl9qPj{Q z1s88VNEA5K_$&;mu8@IIZto!}^6=7`Tw0c0<`M|QwNF|Svhn}|^Jtnl#rdIQhI0m4WC)j|5&o(crL>-)41HCn9g%tvPDPv} za^7-Q)T^r4To1<-3O?rn1(z?@Xxn4fBuo@dixyJYhb*+4oo;(-;iKijL`tKANszYr z7FzG!Eef@Lwg_kx^0h1zx%{@ob$n}G;D#%Y7+_8Iiu^?PqXL)S= zE84VG8Sbb zDJf$=?u^uXEc9C%Q}1S*JtDe-q($ys|(@YlT)h5># zVW%H7ep1y;0|lzi8`wXkF{?hw?g$u;(!URdbAJ0g=A5&a}{&RdOL7TN)JNDzPQq-8UXA!)L zbgSdA1%B%aJR2{E+1V>yaZc&zOL~&?w>S&u?;}m0E=XHP(3D~fliz_z)a7M>u1bpU zC))884=Y2{We=IRD|+o+%jAF~C>t+jF4)Iphuw${H^uR=m-~qpx2)9%E-&Rr%pken zD(}n1ZoZvCC4eeHrIsho&`F_E2Op@!I>3LWo##f|1c1ANH^rJf4Gn(08OQx3msGH1 z{Wcdl?y`60JmG=NL0$k~uF8?JlwmWM<^Awnsaft8AJ7Qc^om2GxE$-6E?=_gve8HBRRq<{?7RTadjRli z$8FFiZuAOGoq)w|OaSvmolqFGCZ8}YQia21+BcJj;rE&JCPmD!$!4-a%YD86AQMbs zpn?r%`O9pp+=Moh#p?TnjbPf1#3B9*(^|6mgInhEaWvnBmx&d62fc*W$Lk4AWYr)Y ze6-ADop*_ImDiJBHvvbl-&QQn+G#hOf z>)V$vUJB?iv>c!k1B9^??RBDz7n2Y0{-fiS^UE@ zd5=iYpS>0iW(j_DVpr?vcnhMc|RwW^5mu6D<>!NT8f}Qm6uQi{MDJb+alq1>z}@m z_sJ6d>EW^2E2l?xzJS;0%~k-t*_wcxy?c7}N?ghk*~7 z)Yq08r$?_V^?hCG-`AD;zP9TNBe7UkqBJ=@eqq=5_=R2H;}>@S9>1{b3-MOT*RJpJ z3%kC@FYNjr+tT**_+_QOFDv!6r7ieW>ie=%-*|ayu+&KE9JD;_tWFk%J{Lh4bWHkzpC`t zs|x?hI(S@J2ahZ3*KuY2I;qILlZxCssmP_1id;IW$P*}7=KMXW$cK~4ygoU!+wH{G zl21=6^XsHCzfLOi;zVA47vt*0-YlG+$ouMv{w!CLcbzs>5UGQ8y1jOtG_pG~GC4@9 z+K~eeBd`IJrVm(X0TF3&BNm%5cqn-r@{t-3IX1rnX+;Jq!W%V+RBR)gPF?#mNwQt5 zNu#e6n4gOxTLLZ^l3@$7x1!=0*owGUtlO8i-LNJED~%cP5d=%KXird&4ip% zKB3bIQf3~@MM2_b(m^fcv8*%%J2-~y~Zm1|<5o@TRz~tVi z`-~_<1uOH=yQCs3f1|lrD6{E35$%?+;w{u)NLuD0ass ziHATTd>+mh#UdkcWJc8ou>$$`;e0nSu(;`h%gtF{+GPBLk32pv=TEr-9`~Ku9Y+j5 zzG;j098Kuz6$u>YB7CF#5Cj#SGR5pOxITS)4&RT-W;vW6{Oeyi_=1aqL9ZdXMbdgl zd5=UmG9c@EYJ@$~=->}~B%oQULQ3wH28Q3%HvQG-X86+y)Tr2_Se(oCPMjd@n<&#? zWHNr6n(lMEuzqT(Y|!1ooo1;Y#A;A;CQel9pjAc8E+Ca9c8>6_Ez#hUjb*=dt)Rn>8NKqNNjTF^kt7TW5pXI@M>NY;^{AKb; zj%>zE-C+Fla8~<^l-wQPF~#L0?tQB`C5a4*(y@jQA!%y(5T2%n#{$odA@Qs|AY@0gkU?I&U9ooU7b3|fP|#m; z*NqKZCvx$Z$A6BJ2BKS+Ym8CGy@)8^HmBZ_5kY@msfUZkm#v1~MT&xLRgOJmQM)Ra z%|31Kh(z17Cti~$RkKaiAqZ6Rd$$U|^T)<+sDE<75z6KthXID?qfwizSbX!0UK~tK z8Up;JJQL2CPXbv^CV?zxl0cTzNKGPhqTfJN2mzOhI||X$QU+z6aO4i}AJ=wSn?&K5 zSQ5yeYinRq^aR|+ySSk^GZ||ZqLs;JSb}e z50wqzL9+H)hSSNGu11TY9pwgPu2m_5tjU@Y%gbNq;ZC>)$9PIHnQkp|AERAuOofd# zjbSz9oNGIwko9R;AvDiZKc(X$tpNY6`I_I4_pMg$L0j>Le+}&QjknimUIZ zT*mt& zG|Qh5A>*y=umB7fSz}2Y;>!dkxeO+&1?}dWS}&NEMyCPYtVTEp`03zpc$3F5#nSIU z*OU1K7c?>``*7u?e3#K>6H?#JaWm^H)Ur7tc`?=mw038_zmJB75NP#lynMARh~pU>J{VBH{MN2l}Mr&cbiMrg<_rc1t8pfmz3!SYm^&B)WH~ zBTbPsp9DlqrU(r)DFRX-V>Ozey!1I9q#FP#5y8&@z)QoP1L-=;i`*e zzv^U7t~ygU>BodDAbS8l8g| zUEM4tBz2bii_-vJH3nN8UU?AWjL|RBX}yTLgGeALN8rgCdATdb^tIW%!@Ap1Y%uzK zL^v>>_`EOza*ydvrKBv$rs+ormhvCC;toEPEJeS2NuLivgT-%N;r(B12g0wz`0FVA zx^SI93Gfr6DIna2fl{VEnW;XRWqmT+u7;F)9{L1c`=a@<7Hy%`-{SQe9_Hcuj!*Bx z$b@8~rXoIIquQU?I+xZ%9I`tC4>*B076DxRVt4!Z^YRkyO5j~68G_LwO6C(xHmE4P zzX{h(yl8L@A-~@aH$S+4pHmM(X}DO7p);%&ci0t=aV;O-?ckxXHWU`IoDf~RDN-}g zdpBo{6N-9K<%wa45#>j7j+reh2n<*Y;}_L*<3btG zvPD5UTiUe-%1tcAn^l9&+gPAHmmFX4=I#$>xm0i(gnOXEdKk(ilDQSpKty?I;o_=j zA$f7I5n*Mtv1x5I@M3igSnlP|*jeHcvCt+A;}+d}y@+d#2SZovJDY+$aPYFojudR)P|b*GLDimpN7^?3{9)*1`rbbJFNw0#5n zt5?-)s9F^{T`_va7~r2`1`1Rh6*+oCLD|FmoM~iXgMsL@1DqD(-y!0Z{&e7MtW6SK zGrBE@02nbx%x5SPE)aQO6DRBe{o+N~HA_OsiJYKWI|xKJg#|{;Uj@~ZSE2Hmn~=q{ zg;&ZquQj+T#O9Bi+Y;{d%Mvc9TH+%nQv#})l)!2lX|Nbz8X+f8fzh)kq1Dt8U^#CD zSWcP*E@n(Z@u13!%){1SCk$f=ahdVtUQpoTu=5(2Yh(IgHB5eHixSZUohy*xF#aCr z{Fi_1c(Z1KGcIh6r{$DxCGk>5C4y43f%-y&=cj}Bh-tIFLg12sxY%uAP-I<%2@wj- z`hJfHS|N!i`6@tDW=nyzC~UNwQ_L>3MEr0q5kF(48AAVD2`;zm!;@3E&0KlUgugIg z@CSB1&Q-w!c6S;u!UNjd7Y@n4U%KD47iJb@*bG1Z_Tn#VZ2Ax20yA;HF0i3rx}Rvp zH$$>1QGO0IVCxho;o8Mtt}gWX94b6Q>Pe;vl(;8YnN7m+7GOR^s9??dJwjb)pnqRM zztU76hucw}lAi9MZHlH$^-6g&jG}a9wAhQlW|srY0wJn4#d^&MW3#1<(ge_j`n{~t zf@r$!SL7|Z;tTq$zQMv%@Kx%6n?}; zLNnpfRahY57n(4C!?ZWRpxceMH^V9B8BSaiy+Dx2-mL|WZMbY4-;~fd^hiYF<7wTp zSb#5J;wXs;>JIUY1WTMe8`SuL^j8{8=* zeM!ziAS&QDPgmIT8F_G`H&48Z6(ti$eo>|*n6HLL`6_v#9n0c18aJXSoP?3G`!q8; z`KrUvfN7;DEREC>is*nP5Ldk`bpVE+Fetct@3soO*2155aL}C0jdB4~V@Xe3+~eI| zXn0sK-ukHky;EsGFl*)(w_efJq>Pk z6cBb_@mpd=3)_YKx}<%MB}Q2R3ucDI?H-#S$^asN4nw@ChrqyQ3mZL7<`Ip;O8RDo zuy+>1uUR$@;{#!S>Ac@e>Ll;1o@*w8Q+f00oMGw}^};rnJ6ZZdkeK*)XjrpiQKPh* z?8@!~5~-UR0(aO<$ydW_#Z2I)lIr=C;Dx};QH|PXD_BZth**WJ)Y+21Djf`*X02=R zFW;tLpaz?1_%Ot3!a`7_A~=5-lO1~B#fU6fzMDNx#xD=g>Qhcow5MJotW3c~P@jr| zrZpuc87oEAshKD%Q#29OrfNn}o3a^MsbYn`DhMlM)uel8Pvu10oYI2Kn%V;0n&OGf zp6UXxb*!=l?5Up^R7F5eQWXV>u(z2TqCs%kEld%iDE25eGP6ZPV$_GPi;%>lB1!~7 zt{aq{w1@QQ6)~rM5{3x&5ip=@$`|1K#0!!1OBbfvN4S8nDO-SVi=kVw@dLj+xGm}g`y8A7D}GK8tBGK8_cGK8oaGKA3$8AAAm3?X!T zMkb233?aI{#_f|K%%dekJVAen+cJdMG-L>&dt?Zav}6e5n=*tb+A@SF`eev)j|d_B z9ufp(Edc^_kNhBtUh%<1dq@w^wS))IP1zCfP0a>=zqERFxWp z>=hayYRC-2Hbe%{4T%A4d-_F!w!8pYPm}gZ3*yic77pKA*tVzulZK=KwntEaq9rE? z-4qibXiEtY^a+Vm&@?9l6YL=-h^{3k2;Uu{*A`}O;xfkCAG5`(F#B7?ELGJ~iZLW9u_sX_RL*dTO!Dkh5l#%oCq;?pNOJWXB7 zdV>BEx1|TMX^0O(_s9<-X$cUux3!i z+4IMvv)SXJ`P`A=SzTDv&G}|TnRuuQ#@496AvuL zrh*r9#AEG>8}lR3XR{-LYxx&5!za=6!UM}$;St%K2+({+cz7`%Jbdyj^CpdQuCFp4b9W zOs)b~OmIO_Zy;l$%XHaf*Qi#Rib*e$>WME9<>VL0OaMqsE(8Rw5Cj5e%|v(W!dxFa ziL1;-L6T2Kfih;J#G2Dl5me@*pvfnsKov7G#}!jDCotw@Ns^B_o5J5ZOMaHJmARyD zT<5b_aI>ecBvA8LBFqUa2(lS0G1(LrsB8`kOgUi+WI2lkNux=vc`Q@r6ItV$1uLhr zNSw`OfiWhtz~-}AqKfG(kmY<9$YMhKiIy9t=t^T;;onXsYj-a)3_==fpOXr3g~0L~ z+~SHU$l{o@{5bqJq4x~~5BeU^vK}D_AtHa{Mrfe@qErhQ(cHx^b?+-dvrAutAH(%p zTqyD1*}Rg_!j))fNOS?;zMx2F>Eet7sT(gI zr0%*nn7YlDK)QnhT;F4h&?~yPqb{*U6mFfwk_TWK3Lc{Fu6Yqg!<-QJrUEQ)g<6wExVo3-xu{EN0fxWgMw){v!@mPb z(d!_^4WkH#Y)|^Xhq?gkVO~mLCYK$m5V{eZ2~-CUH^VN>ZVy;}yGo}-!)3!Fq*51( zT%!E`l!L14OAe$iE(K7Y5yrSN*$8UPH-P2EvdGh}IjF5l16)+4bF^S2Vc1euFFtMsj^O#oFv-1?_$#GjK$AANVjJ{v*+=OY{- zT>F;V10Z^|2Y?*x0jByMz^lWnRC|01c|h1@$r`Y-l-yG#*g^D!23rT#y$kS-E=yii z`YtL;z%1V}^e-MlS_#wOOr3EG+59Ov1jJSu?-q-s+}+QIcw>Br7m?Gf5-=mZz~TW9 zHWo$R_sj1u(+9M~55uRGxW#rKL0Nej!I$-2%(bw>5FE`BdEzbU$<-K9FDO1WO$8hC zHAWv(G&2tIA$nyN!e6BM%i$72_9;+8fP8~$OA10tFy|`jVlSZF>QO?FeCQKQ4*-H- zJjP1Vx0}B_02EvgH=@kO4S^P7rsMa}#e@u%AqdMu!FWBM%n@c#LJ+qH3jx9zigX0~ zCT?Yd6@ixYUW_1jiVRcg*n&Y=q9-#*oGdlB z(S?-cjy%E-C?MV~g4>P0$%a{?KM&T~&>&d|C7e2Uj;P4JNgKEs=r2K5=9 z47R|hChs#maA;7!K1|ygQNY&~YP^P6GC6#KNBs=&;ZfQ^CEkaJM^=`H$Hx}$BZOQp zSs&rm-x7LqV&!*g7VZr15|5<&I6Q4N( z?{9cn zfH*G*d5Rz8LdGVB42l(nB8qL8NKiX?EOwR(5k8GH1U+Z9&L9UOEA%7)#BJ- zLvh&R3q3u(HcLZ&s&K@F8k0lirm9Swpy9f2T}|W5FTP>_GqA2ON1{b zts!fxAdD=qYr{&KTD!p-fr>!-lp48=OmUHLwGojhymcrmvc~sw@h#RWrYG5( zSFKG_(L6^-*w440;h*Ew*K&>M2YWI^!{&q@v;1b@MhL=4+bKVu zV;aBh%fXrY5Xlkpk#>{@qe@A)o2NHrvA~92#JNITNqC^sJiJ`2w@<&$#vI+om!_nm zEpf`*#^WjE3W;mfgxr7|+c1NVyw6v`Wn~3|j(q|r+V)dueBZjHXJ??{@<|rmew1uzYZL@LKb+LKZ|eP780Jj2uQ1~4{`q&%`H1JCE(({ej} z#7-&;kVYlWkn{$bxT2sbT5~b+5mchTs`xY)a}qTdHS#kyj}9=iH2F@^m7vCtn};oE(iq+{l_kC11vnvq(=Uj z6JZ5QsrgAQS221iEzV$r0!{+UF-L4JG6`JpfaiR;M&RPS2ND520#!xBGKe=Fs_41f zC{^)`;nN+A$jvNZk<`0~vZlrW4&~>+7YKh`_ESl6@z7{+CP&obA)Dy+fK;roqE#!* zgfwQydz1;U*36k~pInLf9gaSF>WSUaq|u*TzU$fa0WbR@j(58rUzf8HBae=_d5yV3?#Ef(c_pO9&R#}n4g0*dap>k^_G{%Wl*`cJ1j@Yws-*~d zDJ{)`?lA9G^RYbtM(IIFP3+hW1tK24^Ojg8DbLA~7de62Kh9Vv_2wPf zz!jWy-1A~pV%680Ni@TP>J-|WVJ~vVL}*e5B}*j_N|pj1TRh3OuWCRUk>^(dq=Snb zXk~8YZDnocY-McaTeLe$P3Ii4d^k8p%<5>V3r#^_Qjaofyckr1>hJ6A(Dd$bTvaEeVzXx)e?q^-voqSi@&x{&T%&E(if z8GA@d2PkonA#NW8bEr=3E! zTIgk~gFp5NJv`VcsK zQSZmIMrWKgTJ)^ZEbc7co^|d(zJ{webuu&r$&fnm?5N)JXMDb1$?v${N3UPk+w=A7 z`gnQ$x?YFZuk(J`9pzKu2R+FZ76kV?B5Wdbnt=EtOIRWQg54#(nHZt;CL|uM#oCe~ z+=3H+A+djPW<*2Zle8SmDPkQxO&N+7&9N z!Ko*XlU5jM{70~!j%bInfmLCG9Qe$Jwg691Z~Lg`P$7O@!3As6rldEsP%eJn;Qhrv zo1$oSqvQ}Au&fnjAN+v(;+x$)Mio82tV)}3%iZD)p}PuxO-75@=hIP2=?=LBit32W zhI9D2>SlD9@vMWsWMTL)uHfW!)&k7uaRn5TgdZbH2y&u<6Br#8$;v&z0qrL|9y{7B zSMX%J$73s^f)0yQIs>;D;3$zaNJ>s}N2DuoWG1)qZr?9)BYN!?q6doWyUj#4&>}+> z!yypR5kGm{#OfymHgcUiUl&L?a>6r!+6Gxuy;RbGy+>)PNIZrnTW&E5sUY7ht`G1& zEN9|EfXmtmhSY!>(eVh}rD^wg)090+O+IpTd1xO&frGo!K|!B2-3&4~Y920j}Ixb_OyrEEZ!@E#Iv+UvL-06VSDc@bmM>^Z)#E{rO@bK-Zr?-=xn~hoYwD`8Zj4ee0SJ zF+3w2v%+N$`|*E>tR*m$4+Sb!NjEirWr=SuAIZaeI49d_Ea|PN*Dc=n#)GN}H=3?) zv5L{7^`Y*!1cTG4h7L!6>~ITYup5&h$=A*U(^Luo>@On87LMQ_SL5BBTy+9;JjUS4 zngy!oY&*P@L>(TAXE)lEj&$;*QXvfkGBG+F|Bgd^nnHpbfyR@2c509O2zb9?6P1Gb z%SE!tMA~h?-I38>(RS1*f^yQqWdx2rfyjN+mPbQqJFFpht8p6lLzfO43P}c^em(Mr z_vFHh`ID&TQ}#xX0JS_|CZPER8VSfFB@|{ppYpu``7KpLq?h%b&(nwkYBkC~d7YQ+ z#faHVljtJv|3rolcl|gNV>3;obl5F0PH_g4l$iv|uMq?W9qfd3OCo-gc6LeEO>&6n zE8aTtttCYSh#=aoW{C+tWM^+zi`l5dxuRHe?uKJEI`IunOjITSQXT{WkB$WN^hL}~ zgFkj@b}9^Asw01NUk3x1CG|e$d7(-^Sl=O1xLA_?Zi#{LZPjfbHuRi$%-HQ#Q#apD zFm~zxG=A?;$#W?|q*;okdBxy4igmn{(^y!(a4SBwOLsPc?Xk28wXV@*Ix6{<`QM829dN?yJ= zO!6!MDl^fckIznC!P=yFFszyC)zPctmuE#@0o+P^2pg5m?eMHcef09ht2F(%$P8+x zIX-;(>Q$c4k%zWYo*tcL%}0=CidV>q?7Ol`rw-UiclhF1Hv<8h^sisNJkbqt_<~`r zR42M%c)7YoeR}xvSXcj$LCrL0$44i}c|NBe+DIvcGxh4xVUzaNscx>LLqJ+7j!sT+ zUr9IEkq0)?9ls#ctLRGtwCG>HK0bP(8|~P^8mUgm?kzIGcZ>S)`0z|u|AaxUG)Jdr zuU@>)^9j&KN}&%?znr#4|LMuek!~)Aw79=|`Qq#>&%*;7>CRrh)=fr$7X1-&d7&E( z)_8(7Qe8|}gQvyaO79e?8Kl1IzjL8JTw*^hwt#RF?{Kr!sqCV=yZg;*ar>TL1}FJV z&R%gSbki!R$S%+_LN<;<97*nJ0fU)s3w7Bj!#%cSWLHn=rmG8bc2_10sC^Nbm&~KE z8FM%DLhU@9orRsdX@;Rgf-xI7i_8Ld^!Y#Fg9zZ?~&kbmnRVkpW+?5;>lIUks;Gn1o~< zj2MC*_Yrs=E`}R%D!}&?)~nTAvW7LELQ;stfZQkTdqm+aVAXk?h~{0a)oysSSZ7CT zBX+cOK+#hIDkPAAiX~G(lc7lR6}7;8gOyMLzRPVPl6}89yiAqk@3gn1i@y-DvYXet z+4y#H_lRTFFoqmx^q51&IYgdE-~bPd0I7|S^^SHzk|+EZWv^|d!D2*T99SlliuXh? z8Kmhr9&U$`-}r6{Yhr2|8j7_0O9YdXoNJt;7W%eVtkBrv6;X!B$&a5 zqr@p&bx^}JdKj{q!2c+XI>b%T#v^Zrye3a5K{gw&whwaE9nU83uy79a78(;}HqMTR z$1A-M`|nI5c&Io~7;jeVv_%~6?(b=|q#6SN17bRQC6}&zy(Sp;sHqn)LFZ3GKt^^G zxkH_(o}5r@gvlR?bUISR(~%}8gB@L9PYK8}yC6G#0^uAx>s$ywfgYof;&X-5IF;#= zAUa=;O#wrgT$ix>N3S{H?Q}%8X2Dh9K(i2gZJCaZ17<45WF1+gWPFlE1^yONaJ-`6 zynbfE@G3fNJ(@$vBn#-|4{ZU%xArc;n9%K#j>5B(aB&WPaP2bJ#~73DX`%9Vj=7=-vsl$>dQsK0eawM=0M*sTmS1Z{mbWHZQ^A9@?bEhTwHpguPwQ z#^M-1<9Q2_=k#YWQd3!&K_V$~f<=9N%_lsfa2SHH!8tn<4Fst6NiD{qF4VSPF=(ae zVQ7*J_eY1?HUogN&D`h48vrx`E{l;AjK!jwz$N7H1`}CB>4Ykg!77FmIq#D1M@6*Z zr``o9Nnw19Ki~b%v7=Iwu~Hd{h5&Nx5p2On1~j@;8xefD6RIcyFqPPOA{7HA?a=b)US-y~G%>Yf^;vy~VvbfV&qP;MvOJrW6T0jlu;t3;A1bUw<j z+<`LdH03tZVx5@G{8)^}O zvsox6^Q2Nq|EScQqqiIA`1$uI34oTBiL~j6{n_4-Sdn__bVSbh&`@}==ezvr=mRul ziIUApEiH1T&$rkh8K9z71Fb_G$Q~rr^=h@{eOtzh;5alOe}X#3%U|*>hykDJ$}FxY zWImFdM4A$*lR|n^*^yf4LvV;wXGH$HXcgY?h|CaTvo%bBcEv#}$>PcqedPtIj{Sk< z(hp9V>{qOH;Od%8A~2w(hJp7987sg7lHJc)FVIYHB;`wHJwY*Qe z7=XUOzT#qp`y~`GrxL!EduKp#?45KRd^;-Oc*g6%MdmDO&{S$a_vLMiErh&zLNm$x}X4;UP*AJ(U>%z4M*&{eVc2Z=?Np znnh~QLm#+&mAp_1z_BrXRmmli)QSVPUPh}X>8B~nKtsZ34-z{u7KfNtxF3W9yjyKD zb^z!OK(pYG+NBX}j8T4|cu6TbThh*UN{;@52HSVNMTdql*{JadNH*7I-Ef1@Kw>J-I%yP} zVK&@thT;}XVR$0|&Y6VSWwu=n-_E|rvi-imW&){`mjp;VI#h{hG zUz{po$r?0PrjCrj#AR+$A;|`@iKRZ3!SiOKa&BQ8L1E{~C`yTxWtRYKz!Wtcf1e4x zZ6UX9^ikyGK}m2Bl^FT-c}w%>mS(-k=$k&fib0$G0HkldRxO6}Bys7ZC<_fEA#y>( z0FzElY4oUz5S?aF0^O1+Pxzf=7~%PlVIYh|eSHqHp#rFy!y#j=92~~X;cqHaALcr? zY7BFoAY>ZNn}c9&>?fw!ex80g4WBblOjV zxDqi*koTC}@?0(8w51DLC%uIt#KQ3Liemh69BfgFM;3wV+;x%rPinVO{*t5GT_M!1 z#$mpHK^(vs<2y8j82~&XCx56_8g7kxsS5xhTs;Y#3{$-VEcx$*gmUzHDmkb;sAP4E z<45VS41Q|G_1~&oM35DWL8?>)(S;(2E)zjikqA&Jkq1}KX;Dn&w}S80=1HqjfMHY! z-%Gx>bDLT>)919yGk-zV!Fupf+N1@Xhj3yCS&=@XO&)s|4s;d9MurgL$$9<{lqa{d zXKQUG`ZkN)ytlI)&sfiRQru!&BHjCA@}xl|P(F{bU(+)Jo4|W{Phuf=y9=zJlq<4M zWdlrYy>R3?(#}^EvvR$sD-MR6cncq^t%@802v;09F%uv`)~pdst4kbjK-`#eKge4*+TJ_HKzVAt-S^3N%e;U; z*l0qFkYMnG&Dj$0hTX;`2}VbkyClh>;$je9&;`s`cECPOeq3tzK>+jfOEvrv*hcO-SKZTWA`Z&J z^=Q3@@fjWO!?P_FBb;MRES7_krBImJ=+jvWZ_}CtV24vq_&+I!sWqP#ey0~1Ql6PJ$a<9F$M9Q9 z)Ue6Z^%VGzs7)#i-V&b8#SEL~2+ zTGPo9j{#9l1}VW0~+(cu-tJO^LaU`BN5t8=WvHM(h#?OAKzt! z?Ea-Gvq?s^co2p@E)8Hhk+RA#$ucWI(RAS9C8uVU%{t1zOLB~PXT~&!QB()bD6`tr zk~8VL)y7}FQpY!hgvuu!UJ0aS8z9MMK_Af6vdITv))cGhP4LB53ix^lKRSda#UW~b zQe2`c+Xp_f;n^|9YAI9?d{werx;P*gb{GD_WkRUKaus4Q zwOH(e&F}}`(N_Ba03p3I^9g`ihepU>#GvD{;pM4tGR$1fWI`cN{1Mq^=woT5IDk zicfPRRbo1#*^FT`_@eGuIBKegwLYjBf*&*fq){_ zh}?ukf(ZK{?V*C!odV}6l$Fg>6Ra}81clnCVmk%91Xec7UDulg_04e)OcU8fJ28eE zAI0ZxIhdOe=FY2`_D7;#Konaskgw+7*%m7!EqO4VpJZU#xg{wLKVs?l<=l#2q&&3` zCJykH=P#wpGK3E>WA8Btkqi=m_bJ$S4R;g+)z53Ud+|_p z8tX7(JOqGAMZml!oZ)m8QE8+}R-Ec6E70;z2_#3qyi=E09MGU6P@WgTjDi~s36xW+ zl@a-p!klf}0nL_e<6awsAiIUTO#&6oheJNKzamnG)F_iuOr+U93ZVSR10Wp5sWBq_ zXsIExRR9tT5&)Y^Ijpwt-IA)emmvLwU2M7YC2JWxfJOLQ#$tAlc%A1s&E(K*3irxXZ~l~16>-F!*S4gA+S7eb zM;Wfyikw*8mB|<&WH-{SXJUg(-_V~hHq&O+!IIADzd0(OW~FB!x@)qfTVJvO*%+No zA?bvA1>Ou$_5a6&u8$!+RM$z%IqAs}ku2c^hFSIE_9MDSXrrvr>wO-BNI%@>UMP%# zTs1H>1an=P8{U{6M5`l%F{M`58N~WC>d4RS1bI%$837GQ#!pKr3Ms%z=oVgTbOMn> zv4-e1hiJ$hU(;YWtz73gU)uRn}-Ru+roaMprjfPAOmHl z8(bbBKagZW;Uw8-HvB0o1_^TsCnE_ZxyPqc>D|)Q86JEr?wBLFhvM?RL3?tXF4+lM zagvjur-$@dXp!CN$)UyL^!1TgXk#$|w#or;az_zaz81IH6}Xb+YpZ~-kF91peNFLR zV|Ad&anvyhT8j_F;X;QBWd;tA#<)m8V_2-#<*1Nul-S_ulS2TMb=B=s1A5Lq#TiIR~+aALv1_uSPn#MzVnR=k(E zR8fi;#McKjgZCH8-Ji+cUktF}slf;8v@s+wfi$R1HiWSFtZ=hIs@IPD>Qd;n9`pq| zd{&dy7YuB8$L8Pxe0tL0_36#r2T$D_wOI(nPu+#oY7+PoUc-5QUvcBTEL`CM%uIfP zpQN6#3?|)Mc!e?S3$!#fbtBZM3lR?>Pj%U@VVDw1FEhBtJ`XzrYXpJs=-bs>%|kEy z%z{DLu7(j5SV5;IND_sS2qtEVe~em}YK#Rra_{~pcLR)y%(li+@}WgxF% z%78Nl1kfjK1QjxfzAjZ@FDB3~-Tpipx_zt)dEYN#Sy7r-w&!-Ap9eQO zl$!%%a0q`(_%Nt0_1^V}jYFRJS;Q(hl)8f<5`9xnE=SGUN1^`=LEz0^NP5AQZ7q2~@EsQ%nQ+ zyu}3ceJAZ81i%g7K=7PTP7em~c@Lr@Lt&!}TZ+HrbGzB$yzuES6ybD=hyWw}dVoct zqrX_1Z(qE4a~^)by}%0;I1bw4fq^Sr3M0kSy@X`|5#g_Z4zOc{YE;6>Gq;4&`=cH@ z;8|Mcn88z~3Ze7WD3P^Bh}<`@&%$)C>MCF<*9hdNXSnR4q4)ut91>DSB3aS|jAcxq zSUP}wOUtzGcaEcPKS;SGj>=VAG4UWp%g0hKSu79MSu*1}XzHR=SJ9*ZhU!YFDz#uS z5Sh?+hWq{?wW})ic=cuW9p0&25dU$@ZYvC-I~|E%_!0yxkeQTzk$3Zf_a88FS4%AjA#k<+#1P*_7f{!>&nc-T4nflWT z@f0Xdo{8lfM%ZMw*jv?4<%b6OxW+3_p>F5=?jJWo21BQ0kpJLEh;>SaU6ZAv0>4?E z4=%2*EVPaKI+Gbw?BT%qVhHzv5$@{HTgU;3(d@6dkv0D!w9l^Wyu^;BepAqXi0SZIeDa~y<>R*gZV>$ zYLdIz^qp*19NCesf!MDhm4}F|Ak196vOqGXR`@R{R51~o;I5`iI5uC9))gpudK?|j z=t6S_Td#hInZbmo$0gzEaYneU6U9|bE3qaBAGdCX;87CAp z^U3{I3vGhH973lgAxrp*&K6S0p+%vmVbO*2aUcQ=OI!M+ z$=5~C%nd!0tBb|13_+kqW?qL5W#}M`=Ukb=({I zPw_OUMVqFYq&+fe%`)KWH;ZqYX_D`&NQ;$r5kJWHOw0i2cOBFUXXWu~Hm}SQN?2l$ z5fk{FWrcyDy=)~-5M4zozqn`c!DRBy;56{#FQfjtq|sB!-61Ra|4KXN8)#@7@X1h4xU|hnR4|%!DKC$WSTpjm!xzsa1s$$LipdU*dybBd=`gN!f$4N`0DD=e zvj4t@!7zYkEO*~g?CWU zz#8nV#TrI|5d-8SU5&#+O0KS+p9g()!S_7yGeQgebnq6-jmz{4JRW{Jcu&0|0bdZ= zMgd^S9FQGT0dcjV07$CqUyWi#;I%BQhSIci#Yu2oj|kUbY7%}^8e4M`kB*6e@)=(V zmQ6{=5^Pc@2@MT2wdfK@KkFym%H%SFijW0F)<=MK2{&`{4FP9K9f6XTRY(dN&BYC0 zA9wECd5|*7sq|FUFmvN?Ke&XRPbezf1M3tA8|TCSpH z*9D7C;2St9tT@gNInSsRH*oqu3@-FUKwROPAl?kdD$lE7gySKthcSd65Tu#%>%p{k zgmi9s1K!=4F%Z1?$`lZzLqx2g5H@rY{L?|_AqLSEd?k;2DNdUdUvVmI5>PA9zW%3! zPdGFdxhDjr%@DY_XeMBIMo+?NfPMb1`{{t1Z?@dQO(Zpv#&0HX$$!U2lNX3%)gY)c zFSH;OKD z#UR*(u7AU6RwTo%T=_|&A}1jj42)PzB_$q_ke~2{4_yC7PS4?klowL}eJMVux_|s8 zoAEP6N(h8(>8HC7BG)hE^BxJvtdzcfuzN*7UJri^T#k_%0iINadrL|%W_{5!M)AdxIdBXTv1dqLtG5_Mc(F!^Fi$NC z!`)SXM(xHG2ojGTs|Yk-mkW-75WY#mA4hDG_r^k`kl89EaK;jpVZ|aKFxlc!U@ED~ zWk;sW)*OK<7aZQs$ELU?N1XUYA;`o+fm4{96%8p;Q6kZuTs}sbV5e=T6n2Q84oW$crrlwnud;*IxguJF^`4TFQ`bg z`@^Y}XUzAS!iN&^^dZ+E|NY@IrX`5%Y`Sr%BsKx0#NKqn^Et%i=ljINZ}`vYp=2Ck zr}-Z?3NHSniBcnmu2sp*=v#>VE{gY_!942iSEy zUuCbOcXaV<^6L!G6W58j$zJr}pcu^w@^1FrN93XOswN*Fv;x%w<*ihMenMVJtFir(#V^JiQ=RPyUu1 zpAoCaCk?f*IK74YIigk8d2x+svyLg;B10R%bl*=A3e}*b)0kF~KDYzUdYPeGv`T{E z*~tAfoHMW&t#juN?8Co9=!#Yyn8|y@)o(BgP1WLq>$)0#ADT2CG}8+MDm} zNdkinDG7NV5(|IMI+~q3OEeUOD(8SR`8s5UtJ^JA84I+@JK`(sY2Q(09+4(%kF7AS zG6lj+LgEWT1*+|8b6>Q6z`_!Dz6o+Y$pC?V19N{XIp4&}drzc?Z{BQ4hxtt=I8UWl z$69<~k)I;~RfFV`-XKKpPd4=C_caj3 zim$Ndm|%PuRinTRn31Y=gPT-!noX0(k0C+}R!Ts)tNYIz_QGq>I8WU^0`Do%APWma zwLD~9vs96&vIS)>jG%-Fs%D9)rwIyRk*10`%8DNIKdvE8YKWlJ6`2Qxu0WjCSiQ~= zQL!`ix?gTSeoz~TkWoUIb1|Xwx&H41lV1Rv+yXM^6~+kcTZOI|aSi3}>-C5K*i8_j z8s-F?O=K;Dy@I8s0nC%g#1*ptZa2eKfTcz3QMpP%$97psa612H@@ZCpVO`ixs)d2= z5>hQ(Ceu?5&!J?1&F0N;?9O^;U7;Id`Bi8`%7Ek(d@ks`*=7K{7rzx$WV~{(A!l$1 zG%V?P>pS`Gkn-C=I1!fGob5L zUJoLEU+@I*g9Rkd{ERRAhLtcFB5?qvivUsv*Hj9z1r5_X-+@MWce6o^SIz(T?!2tv z?;Ty_=-_@9HvWOf?_E*x-@B`BfMeMiF5Kk2;n{~H))Ji8^7qbYCES10{9ufmMpHy6 z5kjA7s$ye`CV49+yRoEfFJ(Z4gCaCEtufZ{@|FG!kpE_Av|@WeoGMTQRmW z0#zvP5ohS&o9`GnoypK640en$nYlS?^Gi5`Wk8x-dDmfquU<58FZ0D;q&v)Y41q(4p=y37hYeh= zQwW}|I-EAjdD`Ils$Pe)!+LX`!Hit1-x++X>bQEloE4coLr#3k`9BGiEB9RT^o4Uj; zsGZZBJ>zrYMw8{Ft#-TbZ!b^M*G`_S+2vQBs8x7R(kL`JF7y^#6S1#@-LQ$Ur-q5J zS;s`ysAVE*)Dy;p-fBjgp2A1EX4xZEqv(;QRdP&1V)4^Ki_vazx5s=%q>M<`S4lzI zuBRZ}vxJS>k}Dv{HLc-*A(@nw=o3O{`{J? z6dW7X6jY6Rx{P`&A<24bAxWFnkc5qTNU}ynf_b&KDw?pTGMczq9ZlM(kS1(a>9Jq- z-@rw{)w#DSfv~3m%G?tqX7p7a2 z1UKX09oTABTrRfH8Z&;g`+aJMbG8L370oQ+nZ)XJACX&f`>4W^Y!4mH3fx;P4#~4> z;=#8~aVnqDu+62J9aHSnUQEdDNi9>1n;%RYB~;r9=}qmlI9eSW-0Mw!V|3^ZwrIB%+?GB*JDj5?P}PiKtP0lJvdB zPeeV%PlV0lC$dKI6H%-9!8p}0{a}&WOCyPN?Xm}Mt)d5-M#*W_fJ;})?f^F^x)A8E zW7v~Z(OmB`_q-@z0@?NkaszL^;Z}BKDtpQ?o_OnFHlYW2o29~$cj1(l7m35hG`Zk% zMCNsq^MId!yCCpiSTAV+p!y?+1%{n^UB!^TE>MjOsm{5?z&7Gzzy_C9*oF zWRmUSB?znByot2UDOw@-C97tqjdN{w8Eu^>+st}+Ihs0;?vgwjZ)%H7uvoQoiB#2m z3ZG{`kGxr_&7MRkaju({lC`LZQ?vlpd3~vFu7bIwokygqHU?I*HjC?EPT7~Nnw1ms z)PQYPg09Ld>cYL;6lH^-+d8*PcH?*T^$wHzQk$2etd=V%FKu3ts>&y55p6zx>EDm2 znpf#3~62D-l24am=MwRL{QH6BR>S1I7cJf1Z6ILM5GnDGUd8k2@zfaDzW zwU!hY)Z2Ipx!KITzBxzUH0x?vHye*befIQw@Ug;rFvmxBV|%;QC50IQc@PWVp&(0)5QJg4n^|1&+0Z z&MDIs2^S;7{Lw$GuMK|abjJg{}TS*p1fQEjAvhy&UBOuFglhx6q{(bQI zlbObe2$_W&_!%(`2MtQoK*L>pdsS#RDKwcL_ctg2hR+Tc*S2%j~ze0$S!`8t=fI2SrG)Flz$PXgkOZFF87izVwBiRP$Bcg zSZ3K0l@aQ1>?@oIafReh)ZKp}&>}acSLrDM{|xy!EFxCYRW8B~`2Ak~No|;fQ20u% z;2=r-xbH&tFjxv61_-Ic-x=H3;fxf*hQFnxVL&EN7?y+ye=14hAYP2P4 zJLg4e76uujL&DQ!kkB*_9F&(z*Y*yO#07t+fg^~7pkN{?B^*Eu9|s8XfxonHU{I6{ z?u+7#ZDUPIN+g-U6l(S|Bu(A;sk<>vS|;Gz-7yQyLq7x=IfwkF+uwwbMN7i!E4-e( zc=rWSlLAT8fO267;PdUc!Tbh?ed0^Mcu97jcL-qwVcm1aP&ag zPFG1Zxy=tj>6aL~V)H{-gzBV>DYG<|Juqg9Cnd(jLQnugotK)2Xb3`A3S4ml zF?Jbb9!}Q$3|~8g2DJeHeE;#r(ehWCVV);LZ$O;}EUrTg$DSMgO!f9*PEsFH+!9Lc za^SGOx~2@utJ-}F?FPjkZv}&am*Ht6aCid0bE-rF9Z^Vy90X7D40Hh-Ilj<3tozkXGe>-8D- zJ-YO-X*-pJynfJa$1l8S?4YvWfXsK)4pZ+VV)t;$-F6hm{*Q++5dT4w2zv=fLtp&7 z$CgZcfBg&pIhg!$@ZT?Aoc`8%=|eaVG+-|eE#PnbcnDn^NU2{Mgojo(hi6uDE1x5S z_iTilIe22GMXrF+RuakeD`&5`DMtfOKP>8&KO6BzfEXAi?#Lnuv@-7;4cyk zf(t6+f+jrspQ_1zo2{^U;a6%UIR@tQhwXNKK>r-V{h9)XDTbl9rlY|RJT8pqY!$i~ z6Gtz~MnEqHHi$`ZGrYsf7|RS~$;291N3RXS-}nSlviq&l1V=Oro0T;r&Czda5_)SD z8EZwB$AWdYoZa6e_Mb!>!{Ye2>1vMS2bN%u&qK)$Ddce01qSJs-p)L5G1XH;9@lDa zOvn?XEl>6sf+w{+PRhPH^jOz0EnwTAO2;}!I6a2!p}Ow1jxbiZS1$}P{c4ZiepQZAH}u@o zv7$3y)rw<`{WFH~xFD-9bb2`~&T5=^;i{)9WXM@{aNtoaMD&8?Q;N>l#&~#bl>Rj@ z=6IEMHhO|2n@=t=Jf1{Tlrt;SRVYex*Inc7HfRGWVNOMn_Tp^GkQa!?Sx0hEgg*Z6 zL3r4+)`;mM)Q2pmw zt|@Ofdz1Av7}!1T!_P^jYA0Sn&+jYJ6|MDnA-R_jfdjwwF(c=Ky$bH)vh}j#=xx2j zi-S$~@$y7H4gc}may9N_WouvAXr-9fy^NTqr%0r5^)VtEcy#yn&-DZ*6nZGVEjF$v z3wWXKN3~aXUr&~>pY$<=+Op4}k7PX!HvqT$UJ)6n`j|Z}_G#cjAnRdwx10VAA=@W& z4u0uPdqJ(pMiOZG@hXv^I^!uq37HQotjhgBme*|ABT{}xP#Z3DUuS+J)6c!wH|m_8 z-**Qt#OH=%e14mZo2@|f{I<<3nEUK165Xafyd6oqgNUY^Y`*(wW+5-wR(E6AGgo*v z>i{<-pff(lA9@M-IpQ4;VHzGDjE1yd^g%~rN>FXEVn0V0KySb!Y;dOM%Y&)2pqJ2# zc9YHXIppZU<$U6NClU{ZCt<4-LlZhcyr13VVhh7hOtyJiZ&A+K`eCvmfKZg_wAEe6O1lh9@^y(d>c{dNF)&sL z-uBcWy&HD35!5_rUl><-RW@&KW{43p8-r28Y74P45h-e5YzEhF^`$#?|I9t!IL4r&hYzn}pC z>D<%Su|J8d>xSQjB9FJCA9i;v>fW=|!)fSl`~@-$?iq{cEDyUs=KqG5!yccWyMOVF zE8-lH4zZnF;P(K&5_D)AhQvR^lR4A-3u4Fe&+}mkoo%@UH)jZ-+H6;MyL$sBpDZW61u)!X z7LJO63CD7aNv?t|(NlMb)k2zJo9C9Yy`I2~*+GSE(n2F=I^i6+0vwC3<&o z-l*zxJ|kET=Lh}Gl4!Xu&f%uT`}ZH6w>h`V{rivY0sb%Bnp;5(pW%A;9M36xE#!dI zq#LOt_;$-vaBCv13u}9&&MbP8#5zCUQIKJG0@)peUpIU;HMN0NV5kY__a3BOn6w*1g8U^OUlpdzb}Gsd!cI@3@ozSKhzlKp2WhzUimn zzR7hVE51hFc=3`tO5>rr&>3t(2ig6+gR+T}MLZVuu*IfDD|m#l(RMG-ap4>G@SKet*BnYA4A}(70Um5&xjbLM8RPi^3)&1a z0=qPFEO0yjJbUsIp;M`>xd{CB)4+lvTCf~ZMEUVQQ%lkJ=e3a#3wM`qdWm>&{db+3 zoFVl=8Ici`Ojz1lLKt+G@DCu!7-h`#gaCG3Mo$ifwq(q*``Ar?k%x00T)NMA#P#*< zdBKE$_|Jl0d^-PlX(94Co%rX?3U3}{@M&Oi`Eqk@fd`+>!W3=pSl|5Tjb?(fyc32i zD%!H^E@*wmR!YcF!qm?v2@7RxHOI1%4{_j}g9N-(Awn>{%CX}J(9gx}iKz*R3Fa1Z zRf&{1;?)*8vY=6e;c)`3Wrw504kr_Oc1IS|f6UfZB)hxtPRr>jgiZ{)inYi7233nZP3jkdpF&CS<3 zH{gBsQ9s;f)nYIZxC5hl3osqj8aP$GU(u8AORZyu(!_1i!H8VJOVxr1Nm*h0quY0B z0k+%BYhXOZQPSdaA;hrU3gJ>aHYDG&j-adV&`%7gfBH9yQKEFP0Tghtu>k^)Il_`S zFS*>a2Y#56pdSU8+3MKZhU9cKDe0ZE#ZiI9bqG5N4Wy zp^~0==wD+K6KHP76Ko(vmhQ3FgInq|1H5+cO2!g;^1IpgJLCjKy~$Cd^$tT`kKvGe z?(!YrcxA=C{9SOv>B(p^9buCoXHQ5sr9(T4q29s$ zyJS>2496tlwUj(-Mc{|g_(`5s=4a|cFoKZzhn2^ z^>*{~v+HN2C(XM79!(!l-qT*1f_C-uNCpRIYB)XaPZKnl1FuK*rO@Ss`_9J|^JTZErSrc0TVZ5S!yhD98pqPvAbUU;Qb6YbYBwgnQ4_ZMeHe)dge?%7Scx<|%+1HlZSdVs77p4w^b^qsQnsAhVJ1c)* zZdk_-@PAx==$p<;aABPljvk2|mqA2}98KoDP7yEGE&kWf&mw-aO}{w~!p&xepc7cb z6A1~=_~nb{=6yOfd6wl(dzP)qad-;h) zSP%DH@M4N?Ib7ogdg!O1g!Yv&7z=(-wVWO5=Vt-9#zGIv1D);n@d+Dha>v}W=zjCN zfnfJPuX(GCTV8I<*8lrIgEOf2A!%&x{V~ zv6P0NZX=r*(S^GaUg30i2-Q{MF!i4atu3&55FBa$Ef@+6LUb$>20NlH$)Tgeeanrg z@mNDco}%G+7t41A{}jK?pUWOnC}zIUb*a~XxrUcw*@dZ{xx}ee;F}0~>fL=?rBN(y zlE2bzZZ)QslgXGK68v-7%>Ln;E0uLD8pK(q`pWF)Wq0tWwg%R{RbDs|-+|Wa=S%qL z9^7G0p`t%O+mAfVakIn&dF^!HE4Fcd4BQ&&>WVA5k) zU@Pv=&otR$$212YaVO)^tVCSxex?-y4$aWPOv11N+y$WmHv!ng4j!q$;{|y;sTX3n z_k`P>&?e=``fIqr;_hb$2-=r3-@k;*;Ad4DWuh6T<;Ca$)q;`-n@NEnT`t zW`Z476NHUMDwM{T;ZqdeM|KEN+bdi=Rf=0nA)ni{F8FLe-GB|T{dA$8{gmXmDauAM zVJyENjwD18hB8_mRfeeu#2ej2YOPFR8*o^4<)$+OBLGnV>sS&Vng<~Y;4BnO1Y@$m z{_RWZp?N5x0M3IE1-My|EKq=_?F&g1$*gi^K^r`6B`}f4=J6ZU75oZKc8N4lp~H;u zL;)M5l{~r$I5mfGfic8;<~bUPLO3Gb8NZoh$|WiT6$N-+ZL>;wup*y0k1FHAS$q@^ z{XZ76DDcaJ7A1I;>#3>#FNH1gWys=Ocxc|##^w16rQIpb@I`@>)X&s-IV?gLg(N}V zSV4>eO=#I7j8Pykrez+=$dOiq8AY_k${u=oNF&ce1vLt=YQu==Lu^RW7nDMBt5AKx zja=GBcq30>4j&_K5f=|;f9X-?S=1uU$V)YWwAvEpM9xDUIWB#{jsjIRuPoq^qi=*f zk_7H3^Uv?dB9H$+tL~|}ep!)<{^>o4FDDNRSJyE8c=w)%V*68Su;*<>2?{7kIHyaS3=55oPjI9$(Kry?W?@ZQbSmbAMTjGlGEkC9DC2xs z1odD^7PS#B$s{uZCYf}!Mf8Uma{0{~-wc{$@r#7L4QK~WvUn<&ZHu4`o@7(O5>$py zvPj9}vcFMib8E!ZF&X;sNHUmDi>|lzj6g~jKP!}yO}AWSp^GfCnnsw7mNKA{$*c^i zWRa0SQ-5C&6=E#x(Q9U4B|GCXv{IdJ&w*ftSF)HwX(|IOH3@r%4BXm^AWJ4kPuI^d zL{RD*)pn>QEAM)+r3!T=+>%AD0xnqu)-EO+*;&vfi%TW!l0~WmFBuf<@#H+=t!lS|tdhRIW@KubChlSLsck`WDk zDi6lwa4OW&fL%05&_u^cgDM4NlE_L(CW9mk%A_djVVNWu-&xE9Gbw^RG?PS@!I?5_ z5uQonTLGGKIx|F5PBhoo4s)~-rb&`i12q*ytx!z`aV1z&L5FiN8Lo-(@d%7VI@GhlTB3wZPH|R*d~*POR9%@EW8oAN%LR=GkB9hHz>k48AR0pP9|+Vgp)z;PY;VA zPMXvXzhV4yZyoMG!V3GMH0@%WzH%6!C-J{~rnH^iOle^`^%szMd|(2>(p^ z9H%0vQ(iK+|K2C8(|#%Kz)t(6#o~Z7E)m*kzhq``r~Q(a;hkJM8I&d1Ko1YfTdlp+ z#s$|_n*1Vblh(M?x(~g)-rAx!Z@RV;u(vlE2Sl)^Hhp2OEUZD^uF3j?NTH0@dPL zSgb2dvp`TSmRt%I3aX^GgF#j4_{NKp-cp*h1431q;%Y>D-g>@#&F4A`3RUA8;yYEt zLiHsSv24hBw5QVPj_*EAl&HB*A~;mFR7H5G24xu_$`j|2T$&-GT4}05qV`D?Yu_6t zs==)%P*f$Q9V)6t?6zwx{`pdb9tU}YGJiWCC$S}wP@W97#TpSpPCka9YU%Q9gdlG-c9 zjS3~zN`h`{29w$^t(!WAB4N!MahZg5g>b2KzpN@Dr8u#^K~fY)ql2H6oaUMW$`QG* zNCG~)Ls-B@XellUoKLObQUPa$mttH!z?4TDA*M2n5oF3y{O|UzwJUBM+s@CK%vzTL zJ%D@+kOv(gOp0{hJ6~!!U??|5RZTsTaDV;XlFOE4Z`)Flo|(JW^oKNM=}0<9((#ro z?Gr~cW%HWzK24&jI-x-|<(~UwQ}xrD7pZ;{5>C~RTSw386i0wmKWflU1<%cfoku)X zr=dG5>Z$r!lYA;j_-wCM)bvv>twBKLCp0Li{3MTrs`=Q_P&HC~BC1AG`y$_CIV|DI9jSY0qv@ZsocXhHC3I~K~7bt<7!Hqo~lYMuTN1P zpfHPB`?NP_t97zrDr=EcwF|(R@sh^M(Nu+*nnYD$D(=0bgi}UU6=rPF0ENkRf!VRJ zuQhU+y4Ley);47osg$nu!*UptGb?Gk6VO^Agr#*a=)-)S>-c82*7CiPfv?)bOudWs zFl(E{ir6Az_}bp=Uhs#Nn!((9ABI^PWLBh6%?*H1zHi+h=8PH3M!SIqckCL3b-`6M zXq|{+oZ70LvAaQ(-YP7hL2wl&+C5&M;;Na{r#0=Bk;c{4m#NkzT5+ptyQ* zN6D`0tOi117k51m*n#TgCgD|(;3%)c$5@+qq*pc#w;YYzV|7=xHIk}?CJolMuoe-PeO_H+3WyYglolCQkXn&m`7Nx< ztkN2USX4fw#OlsclVWvescw{X=ctLXy0cW&SV4}8Y{$^bFok`3tgT>+Aj^N=rpWSB z9Z8n=l+k3B$=l0g4Wg_d&9s|RWd*qcvaB%0qss~te8Q|CrAe6;B(_Mig4BRED@bV& zXN75P>Z~BWi#)55sX?C=r1}I}VM0iu6{dM4T46#!qZK4Ih_u2qpGvEdVhGu4Zl^G< zNv9R2+U<^DWN$}R>t05E*mfIJnFCk3^e547^_0>>ywxLB1J)+>R;Ntk zjM+~i--@ivoZMReOX;_|8`?v_)hX2a_GXt=go3N51h&cf9}+INvs`{sxv6%VyBVPD zO8dp!M_|ye8IQUM(1t0Gwx#@gl5nLC#(#Gju0(yjF9`o3;sW~<;0mBcO;*uq&G7Ta zPov`MtPgLtC^D|T0=8^ee>5FeL=*lnLayPu^A;oIuuPkjYglH8maDUbYWpIZn5(m- zYX5;zbM**qxv;>LRI+jHM$R={L7SdySSFUBYpA4(z6azi73Ek}bc>>^yR7Y^5Ie{J z0+O!5X6-=JHCSdhQ5B|iwH9uWTM?qJ!FrOZx&}*Zl64IV^zdSJTj3|rb-kovNrYX) z6(v!2brx5?QoBgII>p$%YfFLgQ)#=x>UX>*4h^^0%p<6~!WzR<{VyW#3JdO~?+UY4 z?}pbuB(sct21|t=&Lj5s7dwJnX}Tld5@B5<fm*i1? zxrZLHv+;)l6rT^%=fz~@vM#f)#jW@ADW4&)d+-g+4Bqb(T*8~>tGv!|l09u)WhWqt z&BniG6EA(8J-T1{>;WaX-;=C(Tx}k`C%EG`HfMei1;%BYFXm5k1ahi0JXvOwCr`*6 z>BQmmI(dV*s6i_?lj5#UK6QU(vkYfDX5%+s5lso+o`~g3?qGlW-*;Vd)9gT@C*$)M(JDFa^+`UPm1}%EBx&boN6>TiK|w> zn@{gf(P(tfbMSD4W-VOP-{+wA@O$Y!E+1mL_$^0Nvx!&Nd+gP&C$7uhFZ0}u@b{bF z5!ZX|Eb)G`eA+xt+yi{cs9S`;A2x2t;pb*Hcb)tpGaJP&cm8#mfA@Yi-N1)piEfy= zwtc{4N8s|xD(7dT@d*a`@_7ta2^%pbNV~yS8Be^+=MT$l;oIT-2}R&o>-Y`gm}j1W z&bc)q#-GnO|3&OxS$ z6Uk1$)o6hzJ@xNjG7MVZNBlA`W-ZV25uq8pzWbQX;4qwhKO*kYqi^t!*>g4-UpS3E zPO{~EH3IGO+M`M-~o&0Y2#PN{C_h5IXWL*oKt%-Q)OUm$9X%NUvhr>(zk zTq0a!wnWU=YE#k)SZ z@QQuD^?UZ>*|_0a=F)f_~w_fO<-@^%fjoyOHbXo*WZ`( znejk=>zB^jmmstc%mF8g(-gINuH0YQSBy^I3Ri9#Ugh7%H(4>h*tn+SnHxe^kFL%u zHw3P{r}G)CjJS`Ob(l9W(lus~>+DYt6AzPonvPE=g*VVYP4C7ZHh=@cTh=^1Ujrhz z4l<9f5T#;b9L-nXE+*wVUxE_5R(ku$yn%yf2=>%bz|Cg)=ohdoo}Cpwtw7f93R*p7 zGe30=?>2rjT}-mCx&OxaWD~Y`?#Aba^V!g0Q!Cl5c&EToKjoM{=0)aew5jK3)-RcW zz3mhn|5$oPw*nXQ@A(oqq?!E^Q7#)Ld@+GJf~?nd4tVG6`(*q9Q4=4$htsF$CGHS- zPmJT8jZ5Nz*5ltyl)Z82e6O?3_!RE;L*_ifwd=)eXMt<49*3H)C)vXaZx2`5WDejO zxRh%*Td&=yMF1`^C4q0;nAE@;z+-qTO!}pJiQ6|v1MHb=>n0SV2llSr>*#uwP0c)L zzR>=*nd5_NtAfvP@bH;+^FQbCan8n{jqj`zNA54YXz@Dr#`Y-NEP>Vl6I>=w(!Oe4 zD@Qm#h5e~~d}C&f4|YdpCVMY7{Ql<8p;2*n=TGMmh|JAFc|(y`Ir>rYw3y}wd3ld! z6ZmTP+u3;JUM3^gJ)`;kdVDs=fbt5#>=}xEb59?A!mHqrzK8j*4ghdA{)yk^C-ma=E->rt(vD7 zK|vR;MK&?4#sfGe)xjA1%e|6{nb$t^;|}EDdv!&{>fq4(fuq5dHH#Gh)^u}+c^4u; zoFZ?!Cv()JxLrRj#s~ZRbqW5{1Nzj}=I50(ucA*ied<*5%RQobkLlCb?CAm3?SSfb zKy^Eyx*bs64ybNkcX_%UP~8rwZUL#gflIkX@Zj$OIscw?$rl@X;>ZWMFDXN>Ix+$ugqPi)no1(fY zs+*>|X{wv1x@oGLrn+gWo2I&Hs+*>|X{y^H)$Ne#c1U$Qq`Ki=2ALO!RJTK_+acBM zkm`0wbvvTE9Z}tmsBTA8wUKnRJEFQBQQeNIZpT!&W2)OR)$N$-c1(3U zrn((d-Hxel$5gl1RJYeux7Sp+*HpLHRJYeux7Sp+*HpLHRJYemH$icU*k`(leWsh( zXS#`frkmJjx`}RShD2huI#U+a35=C)|qPRp+T%ss0Q52Ubic1v5C5qw_MRAFuxI|H0q9`s= z6qhK9OBBT=isBMQafzb1L{VI#C@xVHmne!$6vZWq;u1x1iK4hfQCy-ZE>RShD2huI z#U+a35=C)|qPRp+T%ss0Q52Ubic1v5C5qw_MRAFuxI|H0q9`s=6qhK9OBBT=isBMQ zafzb1L{VI#C@xVHmne!$6vZWq;u1x1iK4hfQCy-ZE>RShD2huI#U+a35=C)|qPRp+ zT%ss0Q52Ubic1v5C5qw_MRAFuxI|H0q9`uW6qjg0W5rnp2?T%sv1(G-_xic2)b zC7R+AO>v2)xI|N2qA4!X6qjg0W5rnp2?T%sv1(G-_xic2)bC7R+AO>v2)xI|N2 zqA4!X6qjg0W5rnp2?T%sv1(G-_xic2)bC7R+AO>v2)xI|N2qA4!X6qjgOIiz6akb;#%3RVs&SUIF%<&c7vLkd<7DOfqAV1;@T>PV;`p>BkF5$Z&! z51}rEdJyVBsQ;kugL)6@JgD!Wu7mmr>LRFzpbmoi2kIWEcc9LJ`UdJ6sAr&#f%*mN z7N}RCPJ#La>Jq3&pbmlh1J50->)Q{1-K_7A_s()daCnie*0^R-VQg}gV>d~jLpr43sB46RHdyEF(FcrUZnW0Dftw;$qscDtio zu}&7e&1PR#`J2&YQZuW0f!l_-xiDL=c9Oo{PPF8iP*v|2u$L`yc@nL;1@pw>MeRwR z3(fYJ0$$J_a6cxS1UDP=(P;EmCTU(vy`Z)B)>q0zH3A5+l`2wRCQFerj{FpN>KDng z0yHhyoJy$+630mb2#mT}jBuGP?M<>;;YFP6AL_s@f31e<-hY4ki~v@6h32@=o}eiy z>UO?NQi2qbI*2-o7#<^=<+mKiTn}FFjc`>tTY}psH|ztwCTI#J2#gPKT>bEHY>vJ6 zS=m)F7T5dnSr5z!?6`u#Hj|fR266dsSKkL5scW>&o8Uy8r#rOongcgZ~yn1~~QsG6<3NUi_vQ?Y(KGn6HKxztnjC||#sPQgC{ zME~RL8BEp1tqniZxf1Lz>}5?c((howR0BYZpVNGlQm(x(KwbgzmBb-rV^O9G8BR*0 zc&eNYsom_dFN?b_;MLP{wy1YSZa5Y0@*nBL$Q5v5!b^3mxQAL$hJm&1_zW7mRD+nn zgWH{xgnk1xgNJYlhFy-dLS2*{gVu(rlGqLa?N%9lD$WXC zhrQYZgWD=cT&&1y1K9*`6Ute3(a0LlXP|d3$|1f(m*08b@zox1RAjZGT>cFlA3I5w z-Ls>p@sH6)egl%J+1-cD{XGb@5@wWrgI4n?VLG8Rwtcg$GfGKFCHrb`@T84bUohH^ zfl&NN-5Q~s(Frf2*7#270+7jV(NmP|k$vlMqOxPMY)iM~zA?@vvt#fCajkOjXf`JNJt$tKf+|9DRo4KXy?(7zu38Z_A?)g+^F&t<8rR4V8VoaWrHMeWL z+xmKkNS&j9QV8=MON-z(o*_zt=Wf^T>e@=~Dg|tKyRvoJh~8b(yNz#FtO9&S%pTN&0Oi5_S7(Da}uchqp6BG5u=qdb9q5cYnuME5FOTL~&Yp$f7OL zU8^*5yVi%}TygEh9?N=~?`j|_9o^}6J(HGPjVXW`P67;r9L^6K0_ve1g+WjjF zbD9p|zwY@CxEYsDiL z^Z69zKXh+%lVHz z82w`NF6UqK&ls54HpiK%j?en8@5Z8SN=)l^dqRQ(S2nfI?F;V=5kI1hUW%Lp z67C?9Xp6EgGXoRrx}NvEmm4FZtYl;&C&t>^O|Dmam0Njp4_m&dgp(W{9^VmuBTi3G zcdFWat$SL`SBQv%FnPPEe}O5xYwewf4cJii)y3>6rYW_WnRGt8pTFAsN3vrpW{VAW z*~*X3BZPyC@1m_Jj_>0W@BRGhU3@RKL_a3WPRfX$vAw#jarIa%x<9+Hp78|Drz6CM zv+p?uGp zl}^VcM5-<*+?qj4(a*3F@_$+yX^9yEWR?b0tLp63(H%nNpur=_K65ueg zhn8={R3&HU!&%+5OICEOF!eO+4mW*`248 z>HPK)UwRWA_{v^p8=-@B3z9*67=&fAJ zOVkSNvbt{zCazX(0o4LMa^MCs>4vFlDorB2M?1s#1sZsv$gzq4!l_8XJ`UZDd zX)M%A^c_|9^BFi{V%3?O?m4v^QqdUt&I(ntC|V33k76~q%bZjXeGg5#&!V<5N&knb zU>KXM9be;lx!nhD+xe&I+8RptoHn8`9A&PI7GpHJ`V?1QJqs@fV- zae6g`>RN{zX{(L`. + +Links +````` + +* `website `_ +* `documentation `_ +* `development version + `_ + + + diff --git a/app/lib/Flask-0.12.1.dist-info/LICENSE.txt b/app/lib/Flask-0.12.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..a7da10e --- /dev/null +++ b/app/lib/Flask-0.12.1.dist-info/LICENSE.txt @@ -0,0 +1,33 @@ +Copyright (c) 2015 by Armin Ronacher and contributors. See AUTHORS +for more details. + +Some rights reserved. + +Redistribution and use in source and binary forms of the software as well +as documentation, with or without modification, are permitted provided +that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +* The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/app/lib/Flask-0.12.1.dist-info/METADATA b/app/lib/Flask-0.12.1.dist-info/METADATA new file mode 100644 index 0000000..56a5a10 --- /dev/null +++ b/app/lib/Flask-0.12.1.dist-info/METADATA @@ -0,0 +1,75 @@ +Metadata-Version: 2.0 +Name: Flask +Version: 0.12.1 +Summary: A microframework based on Werkzeug, Jinja2 and good intentions +Home-page: http://github.com/pallets/flask/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +Platform: any +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +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 :: 3.5 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Dist: Jinja2 (>=2.4) +Requires-Dist: Werkzeug (>=0.7) +Requires-Dist: click (>=2.0) +Requires-Dist: itsdangerous (>=0.21) + +Flask +----- + +Flask is a microframework for Python based on Werkzeug, Jinja 2 and good +intentions. And before you ask: It's BSD licensed! + +Flask is Fun +```````````` + +Save in a hello.py: + +.. code:: python + + from flask import Flask + app = Flask(__name__) + + @app.route("/") + def hello(): + return "Hello World!" + + if __name__ == "__main__": + app.run() + +And Easy to Setup +````````````````` + +And run it: + +.. code:: bash + + $ pip install Flask + $ python hello.py + * Running on http://localhost:5000/ + + Ready for production? `Read this first `. + +Links +````` + +* `website `_ +* `documentation `_ +* `development version + `_ + + + diff --git a/app/lib/Flask-0.12.1.dist-info/RECORD b/app/lib/Flask-0.12.1.dist-info/RECORD new file mode 100644 index 0000000..a7e9077 --- /dev/null +++ b/app/lib/Flask-0.12.1.dist-info/RECORD @@ -0,0 +1,51 @@ +Flask-0.12.1.dist-info/DESCRIPTION.rst,sha256=DmJm8IBlBjl3wkm0Ly23jYvWbvK_mCuE5oUseYCijbI,810 +Flask-0.12.1.dist-info/LICENSE.txt,sha256=hLgKluMRHSnxG-L0EmrqjmKgG5cHlff6pIh3rCNINeI,1582 +Flask-0.12.1.dist-info/METADATA,sha256=SG7efIuuoa51GNPZ0gD4PnB-X-US_yk7xlKBkoMAnAI,1948 +Flask-0.12.1.dist-info/RECORD,, +Flask-0.12.1.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +Flask-0.12.1.dist-info/entry_points.txt,sha256=jzk2Wy2h30uEcqqzd4CVnlzsMXB-vaD5GXjuPMXmTmI,60 +Flask-0.12.1.dist-info/metadata.json,sha256=6nWCwJZ8_KE2QOFkfrcgOc7vfLsJVJie2GP6eFRdQG0,1389 +Flask-0.12.1.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 +flask/__init__.py,sha256=PyjiUdcIkBrx6NAW441uD4d2lsjHgGPyh96TBRvzZ0w,1673 +flask/__main__.py,sha256=cldbNi5zpjE68XzIWI8uYHNWwBHHVJmwtlXWk6P4CO4,291 +flask/_compat.py,sha256=VlfjUuLjufsTHJIjr_ZsnnOesSbAXIslBBgRe5tfOok,2802 +flask/app.py,sha256=6DPjtb5jUJWgL5fXksG5boA49EB3l-k9pWyftitbNNk,83169 +flask/blueprints.py,sha256=6HVasMcPcaq7tk36kCrgX4bnhTkky4G5WIWCyyJL8HY,16872 +flask/cli.py,sha256=2NXEdCOu5-4ymklxX4Lf6bjb-89I4VHYeP6xScR3i8E,18328 +flask/config.py,sha256=Ym5Jenyu6zAZ1fdVLeKekY9-EsKmq8183qnRgauwCMY,9905 +flask/ctx.py,sha256=UPA0YwoIlHP0txOGanC9lQLSGv6eCqV5Fmw2cVJRmgQ,14739 +flask/debughelpers.py,sha256=z-uQavKIymOZl0WQDLXsnacA00ERIlCx3S3Tnb_OYsE,6024 +flask/exthook.py,sha256=SvXs5jwpcOjogwJ7SNquiWTxowoN1-MHFoqAejWnk2o,5762 +flask/globals.py,sha256=I3m_4RssLhWW1R11zuEI8oFryHUHX3NQwjMkGXOZzg8,1645 +flask/helpers.py,sha256=LK4CQkN0LViGYH4FP5GLsS74SwedsHz4zO5awHOtzaQ,38449 +flask/json.py,sha256=1zPM-NPLiWoOfGd0P14FxnEkeKtjtUZxMC9pyYyDBYI,9183 +flask/logging.py,sha256=UG-77jPkRClk9w1B-_ArjjXPuj9AmZz9mG0IRGvptW0,2751 +flask/sessions.py,sha256=QBKXVYKJ-HKbx9m6Yb5yan_EPq84a5yevVLgAzNKFQY,14394 +flask/signals.py,sha256=MfZk5qTRj_R_O3aGYlTEnx2g3SvlZncz8Ii73eKK59g,2209 +flask/templating.py,sha256=u7FbN6j56H_q6CrdJJyJ6gZtqaMa0vh1_GP12gEHRQQ,4912 +flask/testing.py,sha256=II8EO_NjOT1LvL8Hh_SdIFL_BdlwVPcB9yot5pbltxE,5630 +flask/views.py,sha256=6OPv7gwu3h14JhqpeeMRWwrxoGHsUr4_nOGSyTRAxAI,5630 +flask/wrappers.py,sha256=1S_5mmuA1Tlx7D9lXV6xMblrg-PdAauNWahe-henMEE,7612 +flask/ext/__init__.py,sha256=UEezCApsG4ZJWqwUnX9YmWcNN4OVENgph_9L05n0eOM,842 +/var/folders/z7/wt4t05zs4q743qnrmn9c0wt80000gn/T/tmpecgcxziq/bin/flask,sha256=rgY52XXrY6_puZAlhZpvDMtH1XYpBdo649SRncGNcTs,256 +flask/__pycache__/signals.cpython-34.pyc,, +flask/__pycache__/wrappers.cpython-34.pyc,, +flask/__pycache__/_compat.cpython-34.pyc,, +flask/__pycache__/__init__.cpython-34.pyc,, +flask/__pycache__/ctx.cpython-34.pyc,, +flask/__pycache__/views.cpython-34.pyc,, +flask/__pycache__/cli.cpython-34.pyc,, +flask/__pycache__/logging.cpython-34.pyc,, +flask/__pycache__/__main__.cpython-34.pyc,, +flask/__pycache__/exthook.cpython-34.pyc,, +flask/__pycache__/json.cpython-34.pyc,, +flask/__pycache__/blueprints.cpython-34.pyc,, +flask/ext/__pycache__/__init__.cpython-34.pyc,, +flask/__pycache__/sessions.cpython-34.pyc,, +flask/__pycache__/debughelpers.cpython-34.pyc,, +flask/__pycache__/config.cpython-34.pyc,, +flask/__pycache__/testing.cpython-34.pyc,, +flask/__pycache__/app.cpython-34.pyc,, +flask/__pycache__/helpers.cpython-34.pyc,, +flask/__pycache__/globals.cpython-34.pyc,, +flask/__pycache__/templating.cpython-34.pyc,, diff --git a/app/lib/Flask-0.12.1.dist-info/WHEEL b/app/lib/Flask-0.12.1.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/app/lib/Flask-0.12.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/app/lib/Flask-0.12.1.dist-info/entry_points.txt b/app/lib/Flask-0.12.1.dist-info/entry_points.txt new file mode 100644 index 0000000..14adf18 --- /dev/null +++ b/app/lib/Flask-0.12.1.dist-info/entry_points.txt @@ -0,0 +1,4 @@ + + [console_scripts] + flask=flask.cli:main + \ No newline at end of file diff --git a/app/lib/Flask-0.12.1.dist-info/metadata.json b/app/lib/Flask-0.12.1.dist-info/metadata.json new file mode 100644 index 0000000..e854c06 --- /dev/null +++ b/app/lib/Flask-0.12.1.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 4 - Beta", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "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 :: 3.5", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "extensions": {"python.commands": {"wrap_console": {"flask": "flask.cli:main"}}, "python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://github.com/pallets/flask/"}}, "python.exports": {"console_scripts": {"flask": "flask.cli:main"}}}, "extras": [], "generator": "bdist_wheel (0.29.0)", "license": "BSD", "metadata_version": "2.0", "name": "Flask", "platform": "any", "run_requires": [{"requires": ["Jinja2 (>=2.4)", "Werkzeug (>=0.7)", "click (>=2.0)", "itsdangerous (>=0.21)"]}], "summary": "A microframework based on Werkzeug, Jinja2 and good intentions", "version": "0.12.1"} \ No newline at end of file diff --git a/app/lib/Flask-0.12.1.dist-info/top_level.txt b/app/lib/Flask-0.12.1.dist-info/top_level.txt new file mode 100644 index 0000000..7e10602 --- /dev/null +++ b/app/lib/Flask-0.12.1.dist-info/top_level.txt @@ -0,0 +1 @@ +flask diff --git a/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/PKG-INFO b/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/PKG-INFO new file mode 100644 index 0000000..34ff3bc --- /dev/null +++ b/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/PKG-INFO @@ -0,0 +1,43 @@ +Metadata-Version: 1.1 +Name: Flask-Restless +Version: 0.17.0 +Summary: A Flask extension for easy ReSTful API generation +Home-page: http://github.com/jfinkels/flask-restless +Author: Jeffrey Finkelstein +Author-email: jeffrey.finkelstein@gmail.com +License: GNU AGPLv3+ or BSD +Download-URL: http://pypi.python.org/pypi/Flask-Restless +Description: + Flask-Restless + ~~~~~~~~~~~~~~ + + Flask-Restless is a `Flask `_ extension which + facilitates the creation of ReSTful JSON APIs. It is compatible with models + which have been defined using `SQLAlchemy `_ or + `FLask-SQLAlchemy `_. + + For more information, check the World Wide Web! + + * `Documentation `_ + * `PyPI listing `_ + * `Source code repository `_ + + +Keywords: ReST,API,Flask +Platform: any +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+) +Classifier: Operating System :: OS Independent +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: Topic :: Database :: Front-Ends +Classifier: Topic :: Internet :: WWW/HTTP +Classifier: Topic :: Software Development :: Libraries :: Python Modules diff --git a/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/SOURCES.txt b/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/SOURCES.txt new file mode 100644 index 0000000..9bc472e --- /dev/null +++ b/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/SOURCES.txt @@ -0,0 +1,14 @@ +README +setup.cfg +setup.py +Flask_Restless.egg-info/PKG-INFO +Flask_Restless.egg-info/SOURCES.txt +Flask_Restless.egg-info/dependency_links.txt +Flask_Restless.egg-info/not-zip-safe +Flask_Restless.egg-info/requires.txt +Flask_Restless.egg-info/top_level.txt +flask_restless/__init__.py +flask_restless/helpers.py +flask_restless/manager.py +flask_restless/search.py +flask_restless/views.py \ No newline at end of file diff --git a/src/lib/wtforms/ext/appengine/__init__.py b/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/dependency_links.txt similarity index 100% rename from src/lib/wtforms/ext/appengine/__init__.py rename to app/lib/Flask_Restless-0.17.0-py3.4.egg-info/dependency_links.txt diff --git a/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/installed-files.txt b/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/installed-files.txt new file mode 100644 index 0000000..7ba8994 --- /dev/null +++ b/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/installed-files.txt @@ -0,0 +1,17 @@ +../flask_restless/__init__.py +../flask_restless/helpers.py +../flask_restless/manager.py +../flask_restless/search.py +../flask_restless/views.py +../flask_restless/__pycache__/__init__.cpython-34.pyc +../flask_restless/__pycache__/helpers.cpython-34.pyc +../flask_restless/__pycache__/manager.cpython-34.pyc +../flask_restless/__pycache__/search.cpython-34.pyc +../flask_restless/__pycache__/views.cpython-34.pyc +./ +dependency_links.txt +not-zip-safe +PKG-INFO +requires.txt +SOURCES.txt +top_level.txt diff --git a/src/lib/wtforms/ext/i18n/__init__.py b/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/not-zip-safe similarity index 100% rename from src/lib/wtforms/ext/i18n/__init__.py rename to app/lib/Flask_Restless-0.17.0-py3.4.egg-info/not-zip-safe diff --git a/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/requires.txt b/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/requires.txt new file mode 100644 index 0000000..632b7fa --- /dev/null +++ b/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/requires.txt @@ -0,0 +1,4 @@ +flask>=0.10 +sqlalchemy>=0.8 +python-dateutil>2.0 +mimerender>=0.5.2 diff --git a/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/top_level.txt b/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/top_level.txt new file mode 100644 index 0000000..ba5d48c --- /dev/null +++ b/app/lib/Flask_Restless-0.17.0-py3.4.egg-info/top_level.txt @@ -0,0 +1 @@ +flask_restless diff --git a/app/lib/Flask_SQLAlchemy-2.2.dist-info/DESCRIPTION.rst b/app/lib/Flask_SQLAlchemy-2.2.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..c9db5b5 --- /dev/null +++ b/app/lib/Flask_SQLAlchemy-2.2.dist-info/DESCRIPTION.rst @@ -0,0 +1,15 @@ + +Flask-SQLAlchemy +---------------- + +Adds SQLAlchemy support to your Flask application. + +Links +````` + +* `documentation `_ +* `development version + `_ + + + diff --git a/app/lib/Flask_SQLAlchemy-2.2.dist-info/LICENSE.txt b/app/lib/Flask_SQLAlchemy-2.2.dist-info/LICENSE.txt new file mode 100644 index 0000000..49fcac3 --- /dev/null +++ b/app/lib/Flask_SQLAlchemy-2.2.dist-info/LICENSE.txt @@ -0,0 +1,31 @@ +Copyright (c) 2014 by Armin Ronacher. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +* The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/app/lib/Flask_SQLAlchemy-2.2.dist-info/METADATA b/app/lib/Flask_SQLAlchemy-2.2.dist-info/METADATA new file mode 100644 index 0000000..bdbad4a --- /dev/null +++ b/app/lib/Flask_SQLAlchemy-2.2.dist-info/METADATA @@ -0,0 +1,42 @@ +Metadata-Version: 2.0 +Name: Flask-SQLAlchemy +Version: 2.2 +Summary: Adds SQLAlchemy support to your Flask application +Home-page: http://github.com/mitsuhiko/flask-sqlalchemy +Author: Phil Howell +Author-email: phil@quae.co.uk +License: BSD +Platform: any +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +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 :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Requires-Dist: Flask (>=0.10) +Requires-Dist: SQLAlchemy (>=0.8.0) + + +Flask-SQLAlchemy +---------------- + +Adds SQLAlchemy support to your Flask application. + +Links +````` + +* `documentation `_ +* `development version + `_ + + + diff --git a/app/lib/Flask_SQLAlchemy-2.2.dist-info/RECORD b/app/lib/Flask_SQLAlchemy-2.2.dist-info/RECORD new file mode 100644 index 0000000..761bba7 --- /dev/null +++ b/app/lib/Flask_SQLAlchemy-2.2.dist-info/RECORD @@ -0,0 +1,11 @@ +Flask_SQLAlchemy-2.2.dist-info/DESCRIPTION.rst,sha256=Mp4bpckSjf082xflOARFwzWLTnUszq7JxcY0dR9vD2w,273 +Flask_SQLAlchemy-2.2.dist-info/LICENSE.txt,sha256=2smrI3hNiP6c5TcX0fa6fqODgsdJVLC166X0kVxei9A,1457 +Flask_SQLAlchemy-2.2.dist-info/METADATA,sha256=hIgP0kudClmQDnErllZMdlp_WjajcBmlILbSKzVMovI,1348 +Flask_SQLAlchemy-2.2.dist-info/RECORD,, +Flask_SQLAlchemy-2.2.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +Flask_SQLAlchemy-2.2.dist-info/metadata.json,sha256=mU6wJVocytpfiF75Utnlrh36Z2ZzFeF9h7oTVtiTy50,1219 +Flask_SQLAlchemy-2.2.dist-info/top_level.txt,sha256=w2K4fNNoTh4HItoFfz2FRQShSeLcvHYrzU_sZov21QU,17 +flask_sqlalchemy/__init__.py,sha256=U0HkvloC9KPZpgT8zzLQEyRpLAhVkG5AUt_HzrzTVeY,36641 +flask_sqlalchemy/_compat.py,sha256=wVdOzefs6BI6Fi5mu21YctjQjrkIDdkPfgsWkye1v-4,623 +flask_sqlalchemy/__pycache__/_compat.cpython-34.pyc,, +flask_sqlalchemy/__pycache__/__init__.cpython-34.pyc,, diff --git a/app/lib/Flask_SQLAlchemy-2.2.dist-info/WHEEL b/app/lib/Flask_SQLAlchemy-2.2.dist-info/WHEEL new file mode 100644 index 0000000..7bf9daa --- /dev/null +++ b/app/lib/Flask_SQLAlchemy-2.2.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0.a0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/app/lib/Flask_SQLAlchemy-2.2.dist-info/metadata.json b/app/lib/Flask_SQLAlchemy-2.2.dist-info/metadata.json new file mode 100644 index 0000000..49f19aa --- /dev/null +++ b/app/lib/Flask_SQLAlchemy-2.2.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "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 :: 3.5", "Programming Language :: Python :: 3.6"], "extensions": {"python.details": {"contacts": [{"email": "phil@quae.co.uk", "name": "Phil Howell", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "http://github.com/mitsuhiko/flask-sqlalchemy"}}}, "extras": [], "generator": "bdist_wheel (0.30.0.a0)", "license": "BSD", "metadata_version": "2.0", "name": "Flask-SQLAlchemy", "platform": "any", "run_requires": [{"requires": ["Flask (>=0.10)", "SQLAlchemy (>=0.8.0)"]}], "summary": "Adds SQLAlchemy support to your Flask application", "version": "2.2"} \ No newline at end of file diff --git a/app/lib/Flask_SQLAlchemy-2.2.dist-info/top_level.txt b/app/lib/Flask_SQLAlchemy-2.2.dist-info/top_level.txt new file mode 100644 index 0000000..8a5538e --- /dev/null +++ b/app/lib/Flask_SQLAlchemy-2.2.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_sqlalchemy diff --git a/app/lib/Jinja2-2.9.6.dist-info/DESCRIPTION.rst b/app/lib/Jinja2-2.9.6.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..4421f04 --- /dev/null +++ b/app/lib/Jinja2-2.9.6.dist-info/DESCRIPTION.rst @@ -0,0 +1,36 @@ +Jinja2 +~~~~~~ + +Jinja2 is a template engine written in pure Python. It provides a +`Django`_ inspired non-XML syntax but supports inline expressions and +an optional `sandboxed`_ environment. + +Nutshell +-------- + +Here a small example of a Jinja template:: + + {% extends 'base.html' %} + {% block title %}Memberlist{% endblock %} + {% block content %} +

    + {% endblock %} + +Philosophy +---------- + +Application logic is for the controller but don't try to make the life +for the template designer too hard by giving him too few functionality. + +For more informations visit the new `Jinja2 webpage`_ and `documentation`_. + +.. _sandboxed: http://en.wikipedia.org/wiki/Sandbox_(computer_security) +.. _Django: http://www.djangoproject.com/ +.. _Jinja2 webpage: http://jinja.pocoo.org/ +.. _documentation: http://jinja.pocoo.org/2/documentation/ + + diff --git a/app/lib/Jinja2-2.9.6.dist-info/LICENSE.txt b/app/lib/Jinja2-2.9.6.dist-info/LICENSE.txt new file mode 100644 index 0000000..10145a2 --- /dev/null +++ b/app/lib/Jinja2-2.9.6.dist-info/LICENSE.txt @@ -0,0 +1,31 @@ +Copyright (c) 2009 by the Jinja Team, see AUTHORS for more details. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/app/lib/Jinja2-2.9.6.dist-info/METADATA b/app/lib/Jinja2-2.9.6.dist-info/METADATA new file mode 100644 index 0000000..ea69de1 --- /dev/null +++ b/app/lib/Jinja2-2.9.6.dist-info/METADATA @@ -0,0 +1,65 @@ +Metadata-Version: 2.0 +Name: Jinja2 +Version: 2.9.6 +Summary: A small but fast and easy to use stand-alone template engine written in pure python. +Home-page: http://jinja.pocoo.org/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +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 :: 3.5 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Dist: MarkupSafe (>=0.23) +Provides-Extra: i18n +Requires-Dist: Babel (>=0.8); extra == 'i18n' + +Jinja2 +~~~~~~ + +Jinja2 is a template engine written in pure Python. It provides a +`Django`_ inspired non-XML syntax but supports inline expressions and +an optional `sandboxed`_ environment. + +Nutshell +-------- + +Here a small example of a Jinja template:: + + {% extends 'base.html' %} + {% block title %}Memberlist{% endblock %} + {% block content %} + + {% endblock %} + +Philosophy +---------- + +Application logic is for the controller but don't try to make the life +for the template designer too hard by giving him too few functionality. + +For more informations visit the new `Jinja2 webpage`_ and `documentation`_. + +.. _sandboxed: http://en.wikipedia.org/wiki/Sandbox_(computer_security) +.. _Django: http://www.djangoproject.com/ +.. _Jinja2 webpage: http://jinja.pocoo.org/ +.. _documentation: http://jinja.pocoo.org/2/documentation/ + + diff --git a/app/lib/Jinja2-2.9.6.dist-info/RECORD b/app/lib/Jinja2-2.9.6.dist-info/RECORD new file mode 100644 index 0000000..4c81f8d --- /dev/null +++ b/app/lib/Jinja2-2.9.6.dist-info/RECORD @@ -0,0 +1,58 @@ +jinja2/__init__.py,sha256=Cx_UnJO4i_GqvKQsOu__mvGE_eMJSsBqITa26irtg5A,2565 +jinja2/_compat.py,sha256=xP60CE5Qr8FTYcDE1f54tbZLKGvMwYml4-8T7Q4KG9k,2596 +jinja2/_stringdefs.py,sha256=PYtqTmmWIhjXlFBoH-eE6fJkQvlu7nxUyQ2YlFB97VA,589381 +jinja2/asyncfilters.py,sha256=cTDPvrS8Hp_IkwsZ1m9af_lr5nHysw7uTa5gV0NmZVE,4144 +jinja2/asyncsupport.py,sha256=ZJO1Fdd9R93sDLrk6TZNuMQGgtuDmpTlENNRkLwZF7c,7765 +jinja2/bccache.py,sha256=0xoVw0R9nj3vtzPl9g-zB5BKTLFJ7FFMq2ABbn1IkCI,12793 +jinja2/compiler.py,sha256=lE5owyPwT1cGGZxWyzQtZLW7Uj1g3Vw1oVtBU8Uc_uM,62929 +jinja2/constants.py,sha256=uwwV8ZUhHhacAuz5PTwckfsbqBaqM7aKfyJL7kGX5YQ,1626 +jinja2/debug.py,sha256=UqEbKb4zofBABwvyA77Kr0-5IAQawKqC9t8ZeTIzpGU,12038 +jinja2/defaults.py,sha256=GvVEQqIRvRMCbQF2NZSr0mlEN8lxvGixU5wIIAeRe1A,1323 +jinja2/environment.py,sha256=z91L_efdYs-KNs6DBxQWDyYncOwOqn_0J4M5CfFj0Q8,50848 +jinja2/exceptions.py,sha256=_Rj-NVi98Q6AiEjYQOsP8dEIdu5AlmRHzcSNOPdWix4,4428 +jinja2/ext.py,sha256=9xq8fd_QPBIe4Z7hE1XawB7f1EDHrVZjpb2JiRTiG94,23867 +jinja2/filters.py,sha256=1OYGhyN84yVmFUIOwJNRV_StqTCfPhnRLfJTmWbEe_8,33424 +jinja2/idtracking.py,sha256=HHcCOMsQhCrrjwYAmikKqq_XetXLovCjXAThh9WbRAc,8760 +jinja2/lexer.py,sha256=W4A830e-fj12zRT6rL7H91F4D6xwED5LjR8iMxjWuVQ,28238 +jinja2/loaders.py,sha256=xiTuURKAEObyym0nU8PCIXu_Qp8fn0AJ5oIADUUm-5Q,17382 +jinja2/meta.py,sha256=fmKHxkmZYAOm9QyWWy8EMd6eefAIh234rkBMW2X4ZR8,4340 +jinja2/nodes.py,sha256=4_Ucxbkohtj4BAlpV0w_MpVmIxJNaVXDTBb4EHBA2JI,29392 +jinja2/optimizer.py,sha256=MsdlFACJ0FRdPtjmCAdt7JQ9SGrXFaDNUaslsWQaG3M,1722 +jinja2/parser.py,sha256=3tc82qO1Ovs9och_PjirbAmnWNT77n4wWjIQ8pEVKvU,35465 +jinja2/runtime.py,sha256=axkTQXg2-oc_Cm35NEMDDas3Jbq3ATxNrDOEa5v3wIw,26835 +jinja2/sandbox.py,sha256=Jx4MTxly8KvdkSWyui_kHY1_ZZ0RAQL4ojAy1KDRyK0,16707 +jinja2/tests.py,sha256=iFuUTbUYv7TFffq2aTswCRdIhQ6wyrby1YevChVPqkE,4428 +jinja2/utils.py,sha256=BIFqeXXsCUSjWx6MEwYhY6V4tXzVNs9WRXfB60MA9HY,19941 +jinja2/visitor.py,sha256=JD1H1cANA29JcntFfN5fPyqQxB4bI4wC00BzZa-XHks,3316 +Jinja2-2.9.6.dist-info/DESCRIPTION.rst,sha256=CXIS1UnPSk5_lZBS6Lb8ko-3lqGfjsiUwNBLXCTj2lc,975 +Jinja2-2.9.6.dist-info/entry_points.txt,sha256=NdzVcOrqyNyKDxD09aERj__3bFx2paZhizFDsKmVhiA,72 +Jinja2-2.9.6.dist-info/LICENSE.txt,sha256=JvzUNv3Io51EiWrAPm8d_SXjhJnEjyDYvB3Tvwqqils,1554 +Jinja2-2.9.6.dist-info/METADATA,sha256=53LSXlqC86JTyLSPsDyAOmyV4pXIzzmmZoUXz7ogytA,2172 +Jinja2-2.9.6.dist-info/metadata.json,sha256=vzvX25T4hwMOe1EIOBo9rpfiZerOB_KVLcplGG_qYtE,1394 +Jinja2-2.9.6.dist-info/RECORD,, +Jinja2-2.9.6.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +Jinja2-2.9.6.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110 +jinja2/__pycache__/exceptions.cpython-34.pyc,, +jinja2/__pycache__/filters.cpython-34.pyc,, +jinja2/__pycache__/runtime.cpython-34.pyc,, +jinja2/__pycache__/meta.cpython-34.pyc,, +jinja2/__pycache__/loaders.cpython-34.pyc,, +jinja2/__pycache__/_compat.cpython-34.pyc,, +jinja2/__pycache__/ext.cpython-34.pyc,, +jinja2/__pycache__/__init__.cpython-34.pyc,, +jinja2/__pycache__/nodes.cpython-34.pyc,, +jinja2/__pycache__/environment.cpython-34.pyc,, +jinja2/__pycache__/parser.cpython-34.pyc,, +jinja2/__pycache__/defaults.cpython-34.pyc,, +jinja2/__pycache__/visitor.cpython-34.pyc,, +jinja2/__pycache__/utils.cpython-34.pyc,, +jinja2/__pycache__/idtracking.cpython-34.pyc,, +jinja2/__pycache__/sandbox.cpython-34.pyc,, +jinja2/__pycache__/debug.cpython-34.pyc,, +jinja2/__pycache__/_stringdefs.cpython-34.pyc,, +jinja2/__pycache__/tests.cpython-34.pyc,, +jinja2/__pycache__/bccache.cpython-34.pyc,, +jinja2/__pycache__/compiler.cpython-34.pyc,, +jinja2/__pycache__/optimizer.cpython-34.pyc,, +jinja2/__pycache__/lexer.cpython-34.pyc,, +jinja2/__pycache__/constants.cpython-34.pyc,, diff --git a/app/lib/Jinja2-2.9.6.dist-info/WHEEL b/app/lib/Jinja2-2.9.6.dist-info/WHEEL new file mode 100644 index 0000000..9dff69d --- /dev/null +++ b/app/lib/Jinja2-2.9.6.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.24.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/app/lib/Jinja2-2.9.6.dist-info/entry_points.txt b/app/lib/Jinja2-2.9.6.dist-info/entry_points.txt new file mode 100644 index 0000000..32e6b75 --- /dev/null +++ b/app/lib/Jinja2-2.9.6.dist-info/entry_points.txt @@ -0,0 +1,4 @@ + + [babel.extractors] + jinja2 = jinja2.ext:babel_extract[i18n] + \ No newline at end of file diff --git a/app/lib/Jinja2-2.9.6.dist-info/metadata.json b/app/lib/Jinja2-2.9.6.dist-info/metadata.json new file mode 100644 index 0000000..9bbf942 --- /dev/null +++ b/app/lib/Jinja2-2.9.6.dist-info/metadata.json @@ -0,0 +1 @@ +{"license": "BSD", "name": "Jinja2", "metadata_version": "2.0", "generator": "bdist_wheel (0.24.0)", "summary": "A small but fast and easy to use stand-alone template engine written in pure python.", "run_requires": [{"requires": ["Babel (>=0.8)"], "extra": "i18n"}, {"requires": ["MarkupSafe (>=0.23)"]}], "version": "2.9.6", "extensions": {"python.details": {"project_urls": {"Home": "http://jinja.pocoo.org/"}, "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "contacts": [{"role": "author", "email": "armin.ronacher@active-4.com", "name": "Armin Ronacher"}]}, "python.exports": {"babel.extractors": {"jinja2": "jinja2.ext:babel_extract [i18n]"}}}, "classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "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 :: 3.5", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup :: HTML"], "extras": ["i18n"]} \ No newline at end of file diff --git a/app/lib/Jinja2-2.9.6.dist-info/top_level.txt b/app/lib/Jinja2-2.9.6.dist-info/top_level.txt new file mode 100644 index 0000000..7f7afbf --- /dev/null +++ b/app/lib/Jinja2-2.9.6.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/app/lib/MarkupSafe-1.0-py3.4.egg-info/PKG-INFO b/app/lib/MarkupSafe-1.0-py3.4.egg-info/PKG-INFO new file mode 100644 index 0000000..6f2568f --- /dev/null +++ b/app/lib/MarkupSafe-1.0-py3.4.egg-info/PKG-INFO @@ -0,0 +1,133 @@ +Metadata-Version: 1.1 +Name: MarkupSafe +Version: 1.0 +Summary: Implements a XML/HTML/XHTML Markup safe string for Python +Home-page: http://github.com/pallets/markupsafe +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +Description: MarkupSafe + ========== + + Implements a unicode subclass that supports HTML strings: + + .. code-block:: python + + >>> from markupsafe import Markup, escape + >>> escape("") + Markup(u'<script>alert(document.cookie);</script>') + >>> tmpl = Markup("%s") + >>> tmpl % "Peter > Lustig" + Markup(u'Peter > Lustig') + + If you want to make an object unicode that is not yet unicode + but don't want to lose the taint information, you can use the + ``soft_unicode`` function. (On Python 3 you can also use ``soft_str`` which + is a different name for the same function). + + .. code-block:: python + + >>> from markupsafe import soft_unicode + >>> soft_unicode(42) + u'42' + >>> soft_unicode(Markup('foo')) + Markup(u'foo') + + HTML Representations + -------------------- + + Objects can customize their HTML markup equivalent by overriding + the ``__html__`` function: + + .. code-block:: python + + >>> class Foo(object): + ... def __html__(self): + ... return 'Nice' + ... + >>> escape(Foo()) + Markup(u'Nice') + >>> Markup(Foo()) + Markup(u'Nice') + + Silent Escapes + -------------- + + Since MarkupSafe 0.10 there is now also a separate escape function + called ``escape_silent`` that returns an empty string for ``None`` for + consistency with other systems that return empty strings for ``None`` + when escaping (for instance Pylons' webhelpers). + + If you also want to use this for the escape method of the Markup + object, you can create your own subclass that does that: + + .. code-block:: python + + from markupsafe import Markup, escape_silent as escape + + class SilentMarkup(Markup): + __slots__ = () + + @classmethod + def escape(cls, s): + return cls(escape(s)) + + New-Style String Formatting + --------------------------- + + Starting with MarkupSafe 0.21 new style string formats from Python 2.6 and + 3.x are now fully supported. Previously the escape behavior of those + functions was spotty at best. The new implementations operates under the + following algorithm: + + 1. if an object has an ``__html_format__`` method it is called as + replacement for ``__format__`` with the format specifier. It either + has to return a string or markup object. + 2. if an object has an ``__html__`` method it is called. + 3. otherwise the default format system of Python kicks in and the result + is HTML escaped. + + Here is how you can implement your own formatting: + + .. code-block:: python + + class User(object): + + def __init__(self, id, username): + self.id = id + self.username = username + + def __html_format__(self, format_spec): + if format_spec == 'link': + return Markup('{1}').format( + self.id, + self.__html__(), + ) + elif format_spec: + raise ValueError('Invalid format spec') + return self.__html__() + + def __html__(self): + return Markup('{0}').format(self.username) + + And to format that user: + + .. code-block:: python + + >>> user = User(1, 'foo') + >>> Markup('

    User: {0:link}').format(user) + Markup(u'

    User: foo') + + Markupsafe supports Python 2.6, 2.7 and Python 3.3 and higher. + +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML diff --git a/app/lib/MarkupSafe-1.0-py3.4.egg-info/SOURCES.txt b/app/lib/MarkupSafe-1.0-py3.4.egg-info/SOURCES.txt new file mode 100644 index 0000000..210b339 --- /dev/null +++ b/app/lib/MarkupSafe-1.0-py3.4.egg-info/SOURCES.txt @@ -0,0 +1,18 @@ +AUTHORS +CHANGES +LICENSE +MANIFEST.in +README.rst +setup.cfg +setup.py +tests.py +MarkupSafe.egg-info/PKG-INFO +MarkupSafe.egg-info/SOURCES.txt +MarkupSafe.egg-info/dependency_links.txt +MarkupSafe.egg-info/not-zip-safe +MarkupSafe.egg-info/top_level.txt +markupsafe/__init__.py +markupsafe/_compat.py +markupsafe/_constants.py +markupsafe/_native.py +markupsafe/_speedups.c \ No newline at end of file diff --git a/app/lib/MarkupSafe-1.0-py3.4.egg-info/dependency_links.txt b/app/lib/MarkupSafe-1.0-py3.4.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/app/lib/MarkupSafe-1.0-py3.4.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/app/lib/MarkupSafe-1.0-py3.4.egg-info/installed-files.txt b/app/lib/MarkupSafe-1.0-py3.4.egg-info/installed-files.txt new file mode 100644 index 0000000..f430f15 --- /dev/null +++ b/app/lib/MarkupSafe-1.0-py3.4.egg-info/installed-files.txt @@ -0,0 +1,16 @@ +../markupsafe/__init__.py +../markupsafe/_compat.py +../markupsafe/_constants.py +../markupsafe/_native.py +../markupsafe/_speedups.c +../markupsafe/__pycache__/__init__.cpython-34.pyc +../markupsafe/__pycache__/_compat.cpython-34.pyc +../markupsafe/__pycache__/_constants.cpython-34.pyc +../markupsafe/__pycache__/_native.cpython-34.pyc +../markupsafe/_speedups.so +./ +dependency_links.txt +not-zip-safe +PKG-INFO +SOURCES.txt +top_level.txt diff --git a/app/lib/MarkupSafe-1.0-py3.4.egg-info/not-zip-safe b/app/lib/MarkupSafe-1.0-py3.4.egg-info/not-zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/app/lib/MarkupSafe-1.0-py3.4.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/app/lib/MarkupSafe-1.0-py3.4.egg-info/top_level.txt b/app/lib/MarkupSafe-1.0-py3.4.egg-info/top_level.txt new file mode 100644 index 0000000..75bf729 --- /dev/null +++ b/app/lib/MarkupSafe-1.0-py3.4.egg-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/PKG-INFO b/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/PKG-INFO new file mode 100644 index 0000000..5475a48 --- /dev/null +++ b/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/PKG-INFO @@ -0,0 +1,155 @@ +Metadata-Version: 1.1 +Name: SQLAlchemy +Version: 1.1.9 +Summary: Database Abstraction Library +Home-page: http://www.sqlalchemy.org +Author: Mike Bayer +Author-email: mike_mp@zzzcomputing.com +License: MIT License +Description: SQLAlchemy + ========== + + The Python SQL Toolkit and Object Relational Mapper + + Introduction + ------------- + + SQLAlchemy is the Python SQL toolkit and Object Relational Mapper + that gives application developers the full power and + flexibility of SQL. SQLAlchemy provides a full suite + of well known enterprise-level persistence patterns, + designed for efficient and high-performing database + access, adapted into a simple and Pythonic domain + language. + + Major SQLAlchemy features include: + + * An industrial strength ORM, built + from the core on the identity map, unit of work, + and data mapper patterns. These patterns + allow transparent persistence of objects + using a declarative configuration system. + Domain models + can be constructed and manipulated naturally, + and changes are synchronized with the + current transaction automatically. + * A relationally-oriented query system, exposing + the full range of SQL's capabilities + explicitly, including joins, subqueries, + correlation, and most everything else, + in terms of the object model. + Writing queries with the ORM uses the same + techniques of relational composition you use + when writing SQL. While you can drop into + literal SQL at any time, it's virtually never + needed. + * A comprehensive and flexible system + of eager loading for related collections and objects. + Collections are cached within a session, + and can be loaded on individual access, all + at once using joins, or by query per collection + across the full result set. + * A Core SQL construction system and DBAPI + interaction layer. The SQLAlchemy Core is + separate from the ORM and is a full database + abstraction layer in its own right, and includes + an extensible Python-based SQL expression + language, schema metadata, connection pooling, + type coercion, and custom types. + * All primary and foreign key constraints are + assumed to be composite and natural. Surrogate + integer primary keys are of course still the + norm, but SQLAlchemy never assumes or hardcodes + to this model. + * Database introspection and generation. Database + schemas can be "reflected" in one step into + Python structures representing database metadata; + those same structures can then generate + CREATE statements right back out - all within + the Core, independent of the ORM. + + SQLAlchemy's philosophy: + + * SQL databases behave less and less like object + collections the more size and performance start to + matter; object collections behave less and less like + tables and rows the more abstraction starts to matter. + SQLAlchemy aims to accommodate both of these + principles. + * An ORM doesn't need to hide the "R". A relational + database provides rich, set-based functionality + that should be fully exposed. SQLAlchemy's + ORM provides an open-ended set of patterns + that allow a developer to construct a custom + mediation layer between a domain model and + a relational schema, turning the so-called + "object relational impedance" issue into + a distant memory. + * The developer, in all cases, makes all decisions + regarding the design, structure, and naming conventions + of both the object model as well as the relational + schema. SQLAlchemy only provides the means + to automate the execution of these decisions. + * With SQLAlchemy, there's no such thing as + "the ORM generated a bad query" - you + retain full control over the structure of + queries, including how joins are organized, + how subqueries and correlation is used, what + columns are requested. Everything SQLAlchemy + does is ultimately the result of a developer- + initiated decision. + * Don't use an ORM if the problem doesn't need one. + SQLAlchemy consists of a Core and separate ORM + component. The Core offers a full SQL expression + language that allows Pythonic construction + of SQL constructs that render directly to SQL + strings for a target database, returning + result sets that are essentially enhanced DBAPI + cursors. + * Transactions should be the norm. With SQLAlchemy's + ORM, nothing goes to permanent storage until + commit() is called. SQLAlchemy encourages applications + to create a consistent means of delineating + the start and end of a series of operations. + * Never render a literal value in a SQL statement. + Bound parameters are used to the greatest degree + possible, allowing query optimizers to cache + query plans effectively and making SQL injection + attacks a non-issue. + + Documentation + ------------- + + Latest documentation is at: + + http://www.sqlalchemy.org/docs/ + + Installation / Requirements + --------------------------- + + Full documentation for installation is at + `Installation `_. + + Getting Help / Development / Bug reporting + ------------------------------------------ + + Please refer to the `SQLAlchemy Community Guide `_. + + License + ------- + + SQLAlchemy is distributed under the `MIT license + `_. + + +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: Jython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Database :: Front-Ends +Classifier: Operating System :: OS Independent diff --git a/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/SOURCES.txt b/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/SOURCES.txt new file mode 100644 index 0000000..2de1f71 --- /dev/null +++ b/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/SOURCES.txt @@ -0,0 +1,806 @@ +AUTHORS +CHANGES +LICENSE +MANIFEST.in +README.dialects.rst +README.rst +README.unittests.rst +setup.cfg +setup.py +sqla_nose.py +tox.ini +doc/contents.html +doc/copyright.html +doc/genindex.html +doc/glossary.html +doc/index.html +doc/intro.html +doc/search.html +doc/searchindex.js +doc/_images/sqla_arch_small.png +doc/_images/sqla_engine_arch.png +doc/_modules/index.html +doc/_modules/examples/adjacency_list/adjacency_list.html +doc/_modules/examples/association/basic_association.html +doc/_modules/examples/association/dict_of_sets_with_default.html +doc/_modules/examples/association/proxied_association.html +doc/_modules/examples/custom_attributes/active_column_defaults.html +doc/_modules/examples/custom_attributes/custom_management.html +doc/_modules/examples/custom_attributes/listen_for_events.html +doc/_modules/examples/dogpile_caching/advanced.html +doc/_modules/examples/dogpile_caching/caching_query.html +doc/_modules/examples/dogpile_caching/environment.html +doc/_modules/examples/dogpile_caching/fixture_data.html +doc/_modules/examples/dogpile_caching/helloworld.html +doc/_modules/examples/dogpile_caching/local_session_caching.html +doc/_modules/examples/dogpile_caching/model.html +doc/_modules/examples/dogpile_caching/relationship_caching.html +doc/_modules/examples/dynamic_dict/dynamic_dict.html +doc/_modules/examples/elementtree/adjacency_list.html +doc/_modules/examples/elementtree/optimized_al.html +doc/_modules/examples/elementtree/pickle.html +doc/_modules/examples/generic_associations/discriminator_on_association.html +doc/_modules/examples/generic_associations/generic_fk.html +doc/_modules/examples/generic_associations/table_per_association.html +doc/_modules/examples/generic_associations/table_per_related.html +doc/_modules/examples/graphs/directed_graph.html +doc/_modules/examples/inheritance/concrete.html +doc/_modules/examples/inheritance/joined.html +doc/_modules/examples/inheritance/single.html +doc/_modules/examples/join_conditions/cast.html +doc/_modules/examples/join_conditions/threeway.html +doc/_modules/examples/large_collection/large_collection.html +doc/_modules/examples/materialized_paths/materialized_paths.html +doc/_modules/examples/nested_sets/nested_sets.html +doc/_modules/examples/performance/__main__.html +doc/_modules/examples/performance/bulk_inserts.html +doc/_modules/examples/performance/bulk_updates.html +doc/_modules/examples/performance/large_resultsets.html +doc/_modules/examples/performance/short_selects.html +doc/_modules/examples/performance/single_inserts.html +doc/_modules/examples/postgis/postgis.html +doc/_modules/examples/sharding/attribute_shard.html +doc/_modules/examples/versioned_history/history_meta.html +doc/_modules/examples/versioned_history/test_versioning.html +doc/_modules/examples/versioned_rows/versioned_map.html +doc/_modules/examples/versioned_rows/versioned_rows.html +doc/_modules/examples/vertical/dictlike-polymorphic.html +doc/_modules/examples/vertical/dictlike.html +doc/_static/basic.css +doc/_static/changelog.css +doc/_static/comment-bright.png +doc/_static/comment-close.png +doc/_static/comment.png +doc/_static/detectmobile.js +doc/_static/docs.css +doc/_static/doctools.js +doc/_static/down-pressed.png +doc/_static/down.png +doc/_static/file.png +doc/_static/init.js +doc/_static/jquery-3.1.0.js +doc/_static/jquery.js +doc/_static/minus.png +doc/_static/plus.png +doc/_static/pygments.css +doc/_static/searchtools.js +doc/_static/sphinx_paramlinks.css +doc/_static/underscore-1.3.1.js +doc/_static/underscore.js +doc/_static/up-pressed.png +doc/_static/up.png +doc/_static/websupport.js +doc/build/Makefile +doc/build/conf.py +doc/build/contents.rst +doc/build/copyright.rst +doc/build/corrections.py +doc/build/glossary.rst +doc/build/index.rst +doc/build/intro.rst +doc/build/requirements.txt +doc/build/sqla_arch_small.png +doc/build/changelog/changelog_01.rst +doc/build/changelog/changelog_02.rst +doc/build/changelog/changelog_03.rst +doc/build/changelog/changelog_04.rst +doc/build/changelog/changelog_05.rst +doc/build/changelog/changelog_06.rst +doc/build/changelog/changelog_07.rst +doc/build/changelog/changelog_08.rst +doc/build/changelog/changelog_09.rst +doc/build/changelog/changelog_10.rst +doc/build/changelog/changelog_11.rst +doc/build/changelog/index.rst +doc/build/changelog/migration_04.rst +doc/build/changelog/migration_05.rst +doc/build/changelog/migration_06.rst +doc/build/changelog/migration_07.rst +doc/build/changelog/migration_08.rst +doc/build/changelog/migration_09.rst +doc/build/changelog/migration_10.rst +doc/build/changelog/migration_11.rst +doc/build/core/api_basics.rst +doc/build/core/compiler.rst +doc/build/core/connections.rst +doc/build/core/constraints.rst +doc/build/core/custom_types.rst +doc/build/core/ddl.rst +doc/build/core/defaults.rst +doc/build/core/dml.rst +doc/build/core/engines.rst +doc/build/core/engines_connections.rst +doc/build/core/event.rst +doc/build/core/events.rst +doc/build/core/exceptions.rst +doc/build/core/expression_api.rst +doc/build/core/functions.rst +doc/build/core/index.rst +doc/build/core/inspection.rst +doc/build/core/interfaces.rst +doc/build/core/internals.rst +doc/build/core/metadata.rst +doc/build/core/pooling.rst +doc/build/core/reflection.rst +doc/build/core/schema.rst +doc/build/core/selectable.rst +doc/build/core/serializer.rst +doc/build/core/sqla_engine_arch.png +doc/build/core/sqlelement.rst +doc/build/core/tutorial.rst +doc/build/core/type_api.rst +doc/build/core/type_basics.rst +doc/build/core/types.rst +doc/build/dialects/firebird.rst +doc/build/dialects/index.rst +doc/build/dialects/mssql.rst +doc/build/dialects/mysql.rst +doc/build/dialects/oracle.rst +doc/build/dialects/postgresql.rst +doc/build/dialects/sqlite.rst +doc/build/dialects/sybase.rst +doc/build/faq/connections.rst +doc/build/faq/index.rst +doc/build/faq/metadata_schema.rst +doc/build/faq/ormconfiguration.rst +doc/build/faq/performance.rst +doc/build/faq/sessions.rst +doc/build/faq/sqlexpressions.rst +doc/build/orm/backref.rst +doc/build/orm/basic_relationships.rst +doc/build/orm/cascades.rst +doc/build/orm/classical.rst +doc/build/orm/collections.rst +doc/build/orm/composites.rst +doc/build/orm/constructors.rst +doc/build/orm/contextual.rst +doc/build/orm/deprecated.rst +doc/build/orm/events.rst +doc/build/orm/examples.rst +doc/build/orm/exceptions.rst +doc/build/orm/extending.rst +doc/build/orm/index.rst +doc/build/orm/inheritance.rst +doc/build/orm/internals.rst +doc/build/orm/join_conditions.rst +doc/build/orm/loading.rst +doc/build/orm/loading_columns.rst +doc/build/orm/loading_objects.rst +doc/build/orm/loading_relationships.rst +doc/build/orm/mapped_attributes.rst +doc/build/orm/mapped_sql_expr.rst +doc/build/orm/mapper_config.rst +doc/build/orm/mapping_api.rst +doc/build/orm/mapping_columns.rst +doc/build/orm/mapping_styles.rst +doc/build/orm/nonstandard_mappings.rst +doc/build/orm/persistence_techniques.rst +doc/build/orm/query.rst +doc/build/orm/relationship_api.rst +doc/build/orm/relationship_persistence.rst +doc/build/orm/relationships.rst +doc/build/orm/scalar_mapping.rst +doc/build/orm/self_referential.rst +doc/build/orm/session.rst +doc/build/orm/session_api.rst +doc/build/orm/session_basics.rst +doc/build/orm/session_events.rst +doc/build/orm/session_state_management.rst +doc/build/orm/session_transaction.rst +doc/build/orm/tutorial.rst +doc/build/orm/versioning.rst +doc/build/orm/extensions/associationproxy.rst +doc/build/orm/extensions/automap.rst +doc/build/orm/extensions/baked.rst +doc/build/orm/extensions/horizontal_shard.rst +doc/build/orm/extensions/hybrid.rst +doc/build/orm/extensions/index.rst +doc/build/orm/extensions/indexable.rst +doc/build/orm/extensions/instrumentation.rst +doc/build/orm/extensions/mutable.rst +doc/build/orm/extensions/orderinglist.rst +doc/build/orm/extensions/declarative/api.rst +doc/build/orm/extensions/declarative/basic_use.rst +doc/build/orm/extensions/declarative/index.rst +doc/build/orm/extensions/declarative/inheritance.rst +doc/build/orm/extensions/declarative/mixins.rst +doc/build/orm/extensions/declarative/relationships.rst +doc/build/orm/extensions/declarative/table_config.rst +doc/build/texinputs/Makefile +doc/build/texinputs/sphinx.sty +doc/changelog/changelog_01.html +doc/changelog/changelog_02.html +doc/changelog/changelog_03.html +doc/changelog/changelog_04.html +doc/changelog/changelog_05.html +doc/changelog/changelog_06.html +doc/changelog/changelog_07.html +doc/changelog/changelog_08.html +doc/changelog/changelog_09.html +doc/changelog/changelog_10.html +doc/changelog/changelog_11.html +doc/changelog/index.html +doc/changelog/migration_04.html +doc/changelog/migration_05.html +doc/changelog/migration_06.html +doc/changelog/migration_07.html +doc/changelog/migration_08.html +doc/changelog/migration_09.html +doc/changelog/migration_10.html +doc/changelog/migration_11.html +doc/core/api_basics.html +doc/core/compiler.html +doc/core/connections.html +doc/core/constraints.html +doc/core/custom_types.html +doc/core/ddl.html +doc/core/defaults.html +doc/core/dml.html +doc/core/engines.html +doc/core/engines_connections.html +doc/core/event.html +doc/core/events.html +doc/core/exceptions.html +doc/core/expression_api.html +doc/core/functions.html +doc/core/index.html +doc/core/inspection.html +doc/core/interfaces.html +doc/core/internals.html +doc/core/metadata.html +doc/core/pooling.html +doc/core/reflection.html +doc/core/schema.html +doc/core/selectable.html +doc/core/serializer.html +doc/core/sqlelement.html +doc/core/tutorial.html +doc/core/type_api.html +doc/core/type_basics.html +doc/core/types.html +doc/dialects/firebird.html +doc/dialects/index.html +doc/dialects/mssql.html +doc/dialects/mysql.html +doc/dialects/oracle.html +doc/dialects/postgresql.html +doc/dialects/sqlite.html +doc/dialects/sybase.html +doc/faq/connections.html +doc/faq/index.html +doc/faq/metadata_schema.html +doc/faq/ormconfiguration.html +doc/faq/performance.html +doc/faq/sessions.html +doc/faq/sqlexpressions.html +doc/orm/backref.html +doc/orm/basic_relationships.html +doc/orm/cascades.html +doc/orm/classical.html +doc/orm/collections.html +doc/orm/composites.html +doc/orm/constructors.html +doc/orm/contextual.html +doc/orm/deprecated.html +doc/orm/events.html +doc/orm/examples.html +doc/orm/exceptions.html +doc/orm/extending.html +doc/orm/index.html +doc/orm/inheritance.html +doc/orm/internals.html +doc/orm/join_conditions.html +doc/orm/loading.html +doc/orm/loading_columns.html +doc/orm/loading_objects.html +doc/orm/loading_relationships.html +doc/orm/mapped_attributes.html +doc/orm/mapped_sql_expr.html +doc/orm/mapper_config.html +doc/orm/mapping_api.html +doc/orm/mapping_columns.html +doc/orm/mapping_styles.html +doc/orm/nonstandard_mappings.html +doc/orm/persistence_techniques.html +doc/orm/query.html +doc/orm/relationship_api.html +doc/orm/relationship_persistence.html +doc/orm/relationships.html +doc/orm/scalar_mapping.html +doc/orm/self_referential.html +doc/orm/session.html +doc/orm/session_api.html +doc/orm/session_basics.html +doc/orm/session_events.html +doc/orm/session_state_management.html +doc/orm/session_transaction.html +doc/orm/tutorial.html +doc/orm/versioning.html +doc/orm/extensions/associationproxy.html +doc/orm/extensions/automap.html +doc/orm/extensions/baked.html +doc/orm/extensions/horizontal_shard.html +doc/orm/extensions/hybrid.html +doc/orm/extensions/index.html +doc/orm/extensions/indexable.html +doc/orm/extensions/instrumentation.html +doc/orm/extensions/mutable.html +doc/orm/extensions/orderinglist.html +doc/orm/extensions/declarative/api.html +doc/orm/extensions/declarative/basic_use.html +doc/orm/extensions/declarative/index.html +doc/orm/extensions/declarative/inheritance.html +doc/orm/extensions/declarative/mixins.html +doc/orm/extensions/declarative/relationships.html +doc/orm/extensions/declarative/table_config.html +examples/__init__.py +examples/adjacency_list/__init__.py +examples/adjacency_list/adjacency_list.py +examples/association/__init__.py +examples/association/basic_association.py +examples/association/dict_of_sets_with_default.py +examples/association/proxied_association.py +examples/custom_attributes/__init__.py +examples/custom_attributes/active_column_defaults.py +examples/custom_attributes/custom_management.py +examples/custom_attributes/listen_for_events.py +examples/dogpile_caching/__init__.py +examples/dogpile_caching/advanced.py +examples/dogpile_caching/caching_query.py +examples/dogpile_caching/environment.py +examples/dogpile_caching/fixture_data.py +examples/dogpile_caching/helloworld.py +examples/dogpile_caching/local_session_caching.py +examples/dogpile_caching/model.py +examples/dogpile_caching/relationship_caching.py +examples/dynamic_dict/__init__.py +examples/dynamic_dict/dynamic_dict.py +examples/elementtree/__init__.py +examples/elementtree/adjacency_list.py +examples/elementtree/optimized_al.py +examples/elementtree/pickle.py +examples/elementtree/test.xml +examples/elementtree/test2.xml +examples/elementtree/test3.xml +examples/generic_associations/__init__.py +examples/generic_associations/discriminator_on_association.py +examples/generic_associations/generic_fk.py +examples/generic_associations/table_per_association.py +examples/generic_associations/table_per_related.py +examples/graphs/__init__.py +examples/graphs/directed_graph.py +examples/inheritance/__init__.py +examples/inheritance/concrete.py +examples/inheritance/joined.py +examples/inheritance/single.py +examples/join_conditions/__init__.py +examples/join_conditions/cast.py +examples/join_conditions/threeway.py +examples/large_collection/__init__.py +examples/large_collection/large_collection.py +examples/materialized_paths/__init__.py +examples/materialized_paths/materialized_paths.py +examples/nested_sets/__init__.py +examples/nested_sets/nested_sets.py +examples/performance/__init__.py +examples/performance/__main__.py +examples/performance/bulk_inserts.py +examples/performance/bulk_updates.py +examples/performance/large_resultsets.py +examples/performance/short_selects.py +examples/performance/single_inserts.py +examples/postgis/__init__.py +examples/postgis/postgis.py +examples/sharding/__init__.py +examples/sharding/attribute_shard.py +examples/versioned_history/__init__.py +examples/versioned_history/history_meta.py +examples/versioned_history/test_versioning.py +examples/versioned_rows/__init__.py +examples/versioned_rows/versioned_map.py +examples/versioned_rows/versioned_rows.py +examples/vertical/__init__.py +examples/vertical/dictlike-polymorphic.py +examples/vertical/dictlike.py +lib/SQLAlchemy.egg-info/PKG-INFO +lib/SQLAlchemy.egg-info/SOURCES.txt +lib/SQLAlchemy.egg-info/dependency_links.txt +lib/SQLAlchemy.egg-info/requires.txt +lib/SQLAlchemy.egg-info/top_level.txt +lib/sqlalchemy/__init__.py +lib/sqlalchemy/events.py +lib/sqlalchemy/exc.py +lib/sqlalchemy/inspection.py +lib/sqlalchemy/interfaces.py +lib/sqlalchemy/log.py +lib/sqlalchemy/pool.py +lib/sqlalchemy/processors.py +lib/sqlalchemy/schema.py +lib/sqlalchemy/types.py +lib/sqlalchemy/cextension/processors.c +lib/sqlalchemy/cextension/resultproxy.c +lib/sqlalchemy/cextension/utils.c +lib/sqlalchemy/connectors/__init__.py +lib/sqlalchemy/connectors/mxodbc.py +lib/sqlalchemy/connectors/pyodbc.py +lib/sqlalchemy/connectors/zxJDBC.py +lib/sqlalchemy/databases/__init__.py +lib/sqlalchemy/dialects/__init__.py +lib/sqlalchemy/dialects/type_migration_guidelines.txt +lib/sqlalchemy/dialects/firebird/__init__.py +lib/sqlalchemy/dialects/firebird/base.py +lib/sqlalchemy/dialects/firebird/fdb.py +lib/sqlalchemy/dialects/firebird/kinterbasdb.py +lib/sqlalchemy/dialects/mssql/__init__.py +lib/sqlalchemy/dialects/mssql/adodbapi.py +lib/sqlalchemy/dialects/mssql/base.py +lib/sqlalchemy/dialects/mssql/information_schema.py +lib/sqlalchemy/dialects/mssql/mxodbc.py +lib/sqlalchemy/dialects/mssql/pymssql.py +lib/sqlalchemy/dialects/mssql/pyodbc.py +lib/sqlalchemy/dialects/mssql/zxjdbc.py +lib/sqlalchemy/dialects/mysql/__init__.py +lib/sqlalchemy/dialects/mysql/base.py +lib/sqlalchemy/dialects/mysql/cymysql.py +lib/sqlalchemy/dialects/mysql/enumerated.py +lib/sqlalchemy/dialects/mysql/gaerdbms.py +lib/sqlalchemy/dialects/mysql/json.py +lib/sqlalchemy/dialects/mysql/mysqlconnector.py +lib/sqlalchemy/dialects/mysql/mysqldb.py +lib/sqlalchemy/dialects/mysql/oursql.py +lib/sqlalchemy/dialects/mysql/pymysql.py +lib/sqlalchemy/dialects/mysql/pyodbc.py +lib/sqlalchemy/dialects/mysql/reflection.py +lib/sqlalchemy/dialects/mysql/types.py +lib/sqlalchemy/dialects/mysql/zxjdbc.py +lib/sqlalchemy/dialects/oracle/__init__.py +lib/sqlalchemy/dialects/oracle/base.py +lib/sqlalchemy/dialects/oracle/cx_oracle.py +lib/sqlalchemy/dialects/oracle/zxjdbc.py +lib/sqlalchemy/dialects/postgresql/__init__.py +lib/sqlalchemy/dialects/postgresql/array.py +lib/sqlalchemy/dialects/postgresql/base.py +lib/sqlalchemy/dialects/postgresql/dml.py +lib/sqlalchemy/dialects/postgresql/ext.py +lib/sqlalchemy/dialects/postgresql/hstore.py +lib/sqlalchemy/dialects/postgresql/json.py +lib/sqlalchemy/dialects/postgresql/pg8000.py +lib/sqlalchemy/dialects/postgresql/psycopg2.py +lib/sqlalchemy/dialects/postgresql/psycopg2cffi.py +lib/sqlalchemy/dialects/postgresql/pygresql.py +lib/sqlalchemy/dialects/postgresql/pypostgresql.py +lib/sqlalchemy/dialects/postgresql/ranges.py +lib/sqlalchemy/dialects/postgresql/zxjdbc.py +lib/sqlalchemy/dialects/sqlite/__init__.py +lib/sqlalchemy/dialects/sqlite/base.py +lib/sqlalchemy/dialects/sqlite/pysqlcipher.py +lib/sqlalchemy/dialects/sqlite/pysqlite.py +lib/sqlalchemy/dialects/sybase/__init__.py +lib/sqlalchemy/dialects/sybase/base.py +lib/sqlalchemy/dialects/sybase/mxodbc.py +lib/sqlalchemy/dialects/sybase/pyodbc.py +lib/sqlalchemy/dialects/sybase/pysybase.py +lib/sqlalchemy/engine/__init__.py +lib/sqlalchemy/engine/base.py +lib/sqlalchemy/engine/default.py +lib/sqlalchemy/engine/interfaces.py +lib/sqlalchemy/engine/reflection.py +lib/sqlalchemy/engine/result.py +lib/sqlalchemy/engine/strategies.py +lib/sqlalchemy/engine/threadlocal.py +lib/sqlalchemy/engine/url.py +lib/sqlalchemy/engine/util.py +lib/sqlalchemy/event/__init__.py +lib/sqlalchemy/event/api.py +lib/sqlalchemy/event/attr.py +lib/sqlalchemy/event/base.py +lib/sqlalchemy/event/legacy.py +lib/sqlalchemy/event/registry.py +lib/sqlalchemy/ext/__init__.py +lib/sqlalchemy/ext/associationproxy.py +lib/sqlalchemy/ext/automap.py +lib/sqlalchemy/ext/baked.py +lib/sqlalchemy/ext/compiler.py +lib/sqlalchemy/ext/horizontal_shard.py +lib/sqlalchemy/ext/hybrid.py +lib/sqlalchemy/ext/indexable.py +lib/sqlalchemy/ext/instrumentation.py +lib/sqlalchemy/ext/mutable.py +lib/sqlalchemy/ext/orderinglist.py +lib/sqlalchemy/ext/serializer.py +lib/sqlalchemy/ext/declarative/__init__.py +lib/sqlalchemy/ext/declarative/api.py +lib/sqlalchemy/ext/declarative/base.py +lib/sqlalchemy/ext/declarative/clsregistry.py +lib/sqlalchemy/orm/__init__.py +lib/sqlalchemy/orm/attributes.py +lib/sqlalchemy/orm/base.py +lib/sqlalchemy/orm/collections.py +lib/sqlalchemy/orm/dependency.py +lib/sqlalchemy/orm/deprecated_interfaces.py +lib/sqlalchemy/orm/descriptor_props.py +lib/sqlalchemy/orm/dynamic.py +lib/sqlalchemy/orm/evaluator.py +lib/sqlalchemy/orm/events.py +lib/sqlalchemy/orm/exc.py +lib/sqlalchemy/orm/identity.py +lib/sqlalchemy/orm/instrumentation.py +lib/sqlalchemy/orm/interfaces.py +lib/sqlalchemy/orm/loading.py +lib/sqlalchemy/orm/mapper.py +lib/sqlalchemy/orm/path_registry.py +lib/sqlalchemy/orm/persistence.py +lib/sqlalchemy/orm/properties.py +lib/sqlalchemy/orm/query.py +lib/sqlalchemy/orm/relationships.py +lib/sqlalchemy/orm/scoping.py +lib/sqlalchemy/orm/session.py +lib/sqlalchemy/orm/state.py +lib/sqlalchemy/orm/strategies.py +lib/sqlalchemy/orm/strategy_options.py +lib/sqlalchemy/orm/sync.py +lib/sqlalchemy/orm/unitofwork.py +lib/sqlalchemy/orm/util.py +lib/sqlalchemy/sql/__init__.py +lib/sqlalchemy/sql/annotation.py +lib/sqlalchemy/sql/base.py +lib/sqlalchemy/sql/compiler.py +lib/sqlalchemy/sql/crud.py +lib/sqlalchemy/sql/ddl.py +lib/sqlalchemy/sql/default_comparator.py +lib/sqlalchemy/sql/dml.py +lib/sqlalchemy/sql/elements.py +lib/sqlalchemy/sql/expression.py +lib/sqlalchemy/sql/functions.py +lib/sqlalchemy/sql/naming.py +lib/sqlalchemy/sql/operators.py +lib/sqlalchemy/sql/schema.py +lib/sqlalchemy/sql/selectable.py +lib/sqlalchemy/sql/sqltypes.py +lib/sqlalchemy/sql/type_api.py +lib/sqlalchemy/sql/util.py +lib/sqlalchemy/sql/visitors.py +lib/sqlalchemy/testing/__init__.py +lib/sqlalchemy/testing/assertions.py +lib/sqlalchemy/testing/assertsql.py +lib/sqlalchemy/testing/config.py +lib/sqlalchemy/testing/engines.py +lib/sqlalchemy/testing/entities.py +lib/sqlalchemy/testing/exclusions.py +lib/sqlalchemy/testing/fixtures.py +lib/sqlalchemy/testing/mock.py +lib/sqlalchemy/testing/pickleable.py +lib/sqlalchemy/testing/profiling.py +lib/sqlalchemy/testing/provision.py +lib/sqlalchemy/testing/replay_fixture.py +lib/sqlalchemy/testing/requirements.py +lib/sqlalchemy/testing/runner.py +lib/sqlalchemy/testing/schema.py +lib/sqlalchemy/testing/util.py +lib/sqlalchemy/testing/warnings.py +lib/sqlalchemy/testing/plugin/__init__.py +lib/sqlalchemy/testing/plugin/bootstrap.py +lib/sqlalchemy/testing/plugin/noseplugin.py +lib/sqlalchemy/testing/plugin/plugin_base.py +lib/sqlalchemy/testing/plugin/pytestplugin.py +lib/sqlalchemy/testing/suite/__init__.py +lib/sqlalchemy/testing/suite/test_ddl.py +lib/sqlalchemy/testing/suite/test_dialect.py +lib/sqlalchemy/testing/suite/test_insert.py +lib/sqlalchemy/testing/suite/test_reflection.py +lib/sqlalchemy/testing/suite/test_results.py +lib/sqlalchemy/testing/suite/test_select.py +lib/sqlalchemy/testing/suite/test_sequence.py +lib/sqlalchemy/testing/suite/test_types.py +lib/sqlalchemy/testing/suite/test_update_delete.py +lib/sqlalchemy/util/__init__.py +lib/sqlalchemy/util/_collections.py +lib/sqlalchemy/util/compat.py +lib/sqlalchemy/util/deprecations.py +lib/sqlalchemy/util/langhelpers.py +lib/sqlalchemy/util/queue.py +lib/sqlalchemy/util/topological.py +test/__init__.py +test/binary_data_one.dat +test/binary_data_two.dat +test/conftest.py +test/requirements.py +test/aaa_profiling/__init__.py +test/aaa_profiling/test_compiler.py +test/aaa_profiling/test_memusage.py +test/aaa_profiling/test_orm.py +test/aaa_profiling/test_pool.py +test/aaa_profiling/test_resultset.py +test/aaa_profiling/test_zoomark.py +test/aaa_profiling/test_zoomark_orm.py +test/base/__init__.py +test/base/test_dependency.py +test/base/test_events.py +test/base/test_except.py +test/base/test_inspect.py +test/base/test_tutorials.py +test/base/test_utils.py +test/dialect/__init__.py +test/dialect/test_firebird.py +test/dialect/test_mxodbc.py +test/dialect/test_oracle.py +test/dialect/test_pyodbc.py +test/dialect/test_sqlite.py +test/dialect/test_suite.py +test/dialect/test_sybase.py +test/dialect/mssql/__init__.py +test/dialect/mssql/test_compiler.py +test/dialect/mssql/test_engine.py +test/dialect/mssql/test_query.py +test/dialect/mssql/test_reflection.py +test/dialect/mssql/test_types.py +test/dialect/mysql/__init__.py +test/dialect/mysql/test_compiler.py +test/dialect/mysql/test_dialect.py +test/dialect/mysql/test_query.py +test/dialect/mysql/test_reflection.py +test/dialect/mysql/test_types.py +test/dialect/postgresql/__init__.py +test/dialect/postgresql/test_compiler.py +test/dialect/postgresql/test_dialect.py +test/dialect/postgresql/test_on_conflict.py +test/dialect/postgresql/test_query.py +test/dialect/postgresql/test_reflection.py +test/dialect/postgresql/test_types.py +test/engine/__init__.py +test/engine/test_bind.py +test/engine/test_ddlevents.py +test/engine/test_execute.py +test/engine/test_logging.py +test/engine/test_parseconnect.py +test/engine/test_pool.py +test/engine/test_processors.py +test/engine/test_reconnect.py +test/engine/test_reflection.py +test/engine/test_transaction.py +test/ext/__init__.py +test/ext/test_associationproxy.py +test/ext/test_automap.py +test/ext/test_baked.py +test/ext/test_compiler.py +test/ext/test_extendedattr.py +test/ext/test_horizontal_shard.py +test/ext/test_hybrid.py +test/ext/test_indexable.py +test/ext/test_mutable.py +test/ext/test_orderinglist.py +test/ext/test_serializer.py +test/ext/declarative/__init__.py +test/ext/declarative/test_basic.py +test/ext/declarative/test_clsregistry.py +test/ext/declarative/test_inheritance.py +test/ext/declarative/test_mixin.py +test/ext/declarative/test_reflection.py +test/orm/__init__.py +test/orm/_fixtures.py +test/orm/test_association.py +test/orm/test_assorted_eager.py +test/orm/test_attributes.py +test/orm/test_backref_mutations.py +test/orm/test_bind.py +test/orm/test_bulk.py +test/orm/test_bundle.py +test/orm/test_cascade.py +test/orm/test_collection.py +test/orm/test_compile.py +test/orm/test_composites.py +test/orm/test_cycles.py +test/orm/test_default_strategies.py +test/orm/test_defaults.py +test/orm/test_deferred.py +test/orm/test_deprecations.py +test/orm/test_descriptor.py +test/orm/test_dynamic.py +test/orm/test_eager_relations.py +test/orm/test_evaluator.py +test/orm/test_events.py +test/orm/test_expire.py +test/orm/test_froms.py +test/orm/test_generative.py +test/orm/test_hasparent.py +test/orm/test_immediate_load.py +test/orm/test_inspect.py +test/orm/test_instrumentation.py +test/orm/test_joins.py +test/orm/test_lazy_relations.py +test/orm/test_load_on_fks.py +test/orm/test_loading.py +test/orm/test_lockmode.py +test/orm/test_manytomany.py +test/orm/test_mapper.py +test/orm/test_merge.py +test/orm/test_naturalpks.py +test/orm/test_of_type.py +test/orm/test_onetoone.py +test/orm/test_options.py +test/orm/test_pickled.py +test/orm/test_query.py +test/orm/test_rel_fn.py +test/orm/test_relationships.py +test/orm/test_scoping.py +test/orm/test_selectable.py +test/orm/test_session.py +test/orm/test_subquery_relations.py +test/orm/test_sync.py +test/orm/test_transaction.py +test/orm/test_unitofwork.py +test/orm/test_unitofworkv2.py +test/orm/test_update_delete.py +test/orm/test_utils.py +test/orm/test_validators.py +test/orm/test_versioning.py +test/orm/inheritance/__init__.py +test/orm/inheritance/_poly_fixtures.py +test/orm/inheritance/test_abc_inheritance.py +test/orm/inheritance/test_abc_polymorphic.py +test/orm/inheritance/test_assorted_poly.py +test/orm/inheritance/test_basic.py +test/orm/inheritance/test_concrete.py +test/orm/inheritance/test_magazine.py +test/orm/inheritance/test_manytomany.py +test/orm/inheritance/test_poly_linked_list.py +test/orm/inheritance/test_poly_persistence.py +test/orm/inheritance/test_polymorphic_rel.py +test/orm/inheritance/test_productspec.py +test/orm/inheritance/test_relationship.py +test/orm/inheritance/test_selects.py +test/orm/inheritance/test_single.py +test/orm/inheritance/test_with_poly.py +test/perf/invalidate_stresstest.py +test/perf/orm2010.py +test/sql/__init__.py +test/sql/test_case_statement.py +test/sql/test_compiler.py +test/sql/test_constraints.py +test/sql/test_cte.py +test/sql/test_ddlemit.py +test/sql/test_defaults.py +test/sql/test_delete.py +test/sql/test_functions.py +test/sql/test_generative.py +test/sql/test_insert.py +test/sql/test_insert_exec.py +test/sql/test_inspect.py +test/sql/test_join_rewriting.py +test/sql/test_labels.py +test/sql/test_lateral.py +test/sql/test_metadata.py +test/sql/test_operators.py +test/sql/test_query.py +test/sql/test_quote.py +test/sql/test_resultset.py +test/sql/test_returning.py +test/sql/test_rowcount.py +test/sql/test_selectable.py +test/sql/test_tablesample.py +test/sql/test_text.py +test/sql/test_type_expressions.py +test/sql/test_types.py +test/sql/test_unicode.py +test/sql/test_update.py +test/sql/test_utils.py \ No newline at end of file diff --git a/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/dependency_links.txt b/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/installed-files.txt b/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/installed-files.txt new file mode 100644 index 0000000..d2681e6 --- /dev/null +++ b/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/installed-files.txt @@ -0,0 +1,387 @@ +../sqlalchemy/__init__.py +../sqlalchemy/events.py +../sqlalchemy/exc.py +../sqlalchemy/inspection.py +../sqlalchemy/interfaces.py +../sqlalchemy/log.py +../sqlalchemy/pool.py +../sqlalchemy/processors.py +../sqlalchemy/schema.py +../sqlalchemy/types.py +../sqlalchemy/connectors/__init__.py +../sqlalchemy/connectors/mxodbc.py +../sqlalchemy/connectors/pyodbc.py +../sqlalchemy/connectors/zxJDBC.py +../sqlalchemy/databases/__init__.py +../sqlalchemy/dialects/__init__.py +../sqlalchemy/engine/__init__.py +../sqlalchemy/engine/base.py +../sqlalchemy/engine/default.py +../sqlalchemy/engine/interfaces.py +../sqlalchemy/engine/reflection.py +../sqlalchemy/engine/result.py +../sqlalchemy/engine/strategies.py +../sqlalchemy/engine/threadlocal.py +../sqlalchemy/engine/url.py +../sqlalchemy/engine/util.py +../sqlalchemy/event/__init__.py +../sqlalchemy/event/api.py +../sqlalchemy/event/attr.py +../sqlalchemy/event/base.py +../sqlalchemy/event/legacy.py +../sqlalchemy/event/registry.py +../sqlalchemy/ext/__init__.py +../sqlalchemy/ext/associationproxy.py +../sqlalchemy/ext/automap.py +../sqlalchemy/ext/baked.py +../sqlalchemy/ext/compiler.py +../sqlalchemy/ext/horizontal_shard.py +../sqlalchemy/ext/hybrid.py +../sqlalchemy/ext/indexable.py +../sqlalchemy/ext/instrumentation.py +../sqlalchemy/ext/mutable.py +../sqlalchemy/ext/orderinglist.py +../sqlalchemy/ext/serializer.py +../sqlalchemy/orm/__init__.py +../sqlalchemy/orm/attributes.py +../sqlalchemy/orm/base.py +../sqlalchemy/orm/collections.py +../sqlalchemy/orm/dependency.py +../sqlalchemy/orm/deprecated_interfaces.py +../sqlalchemy/orm/descriptor_props.py +../sqlalchemy/orm/dynamic.py +../sqlalchemy/orm/evaluator.py +../sqlalchemy/orm/events.py +../sqlalchemy/orm/exc.py +../sqlalchemy/orm/identity.py +../sqlalchemy/orm/instrumentation.py +../sqlalchemy/orm/interfaces.py +../sqlalchemy/orm/loading.py +../sqlalchemy/orm/mapper.py +../sqlalchemy/orm/path_registry.py +../sqlalchemy/orm/persistence.py +../sqlalchemy/orm/properties.py +../sqlalchemy/orm/query.py +../sqlalchemy/orm/relationships.py +../sqlalchemy/orm/scoping.py +../sqlalchemy/orm/session.py +../sqlalchemy/orm/state.py +../sqlalchemy/orm/strategies.py +../sqlalchemy/orm/strategy_options.py +../sqlalchemy/orm/sync.py +../sqlalchemy/orm/unitofwork.py +../sqlalchemy/orm/util.py +../sqlalchemy/sql/__init__.py +../sqlalchemy/sql/annotation.py +../sqlalchemy/sql/base.py +../sqlalchemy/sql/compiler.py +../sqlalchemy/sql/crud.py +../sqlalchemy/sql/ddl.py +../sqlalchemy/sql/default_comparator.py +../sqlalchemy/sql/dml.py +../sqlalchemy/sql/elements.py +../sqlalchemy/sql/expression.py +../sqlalchemy/sql/functions.py +../sqlalchemy/sql/naming.py +../sqlalchemy/sql/operators.py +../sqlalchemy/sql/schema.py +../sqlalchemy/sql/selectable.py +../sqlalchemy/sql/sqltypes.py +../sqlalchemy/sql/type_api.py +../sqlalchemy/sql/util.py +../sqlalchemy/sql/visitors.py +../sqlalchemy/testing/__init__.py +../sqlalchemy/testing/assertions.py +../sqlalchemy/testing/assertsql.py +../sqlalchemy/testing/config.py +../sqlalchemy/testing/engines.py +../sqlalchemy/testing/entities.py +../sqlalchemy/testing/exclusions.py +../sqlalchemy/testing/fixtures.py +../sqlalchemy/testing/mock.py +../sqlalchemy/testing/pickleable.py +../sqlalchemy/testing/profiling.py +../sqlalchemy/testing/provision.py +../sqlalchemy/testing/replay_fixture.py +../sqlalchemy/testing/requirements.py +../sqlalchemy/testing/runner.py +../sqlalchemy/testing/schema.py +../sqlalchemy/testing/util.py +../sqlalchemy/testing/warnings.py +../sqlalchemy/util/__init__.py +../sqlalchemy/util/_collections.py +../sqlalchemy/util/compat.py +../sqlalchemy/util/deprecations.py +../sqlalchemy/util/langhelpers.py +../sqlalchemy/util/queue.py +../sqlalchemy/util/topological.py +../sqlalchemy/dialects/firebird/__init__.py +../sqlalchemy/dialects/firebird/base.py +../sqlalchemy/dialects/firebird/fdb.py +../sqlalchemy/dialects/firebird/kinterbasdb.py +../sqlalchemy/dialects/mssql/__init__.py +../sqlalchemy/dialects/mssql/adodbapi.py +../sqlalchemy/dialects/mssql/base.py +../sqlalchemy/dialects/mssql/information_schema.py +../sqlalchemy/dialects/mssql/mxodbc.py +../sqlalchemy/dialects/mssql/pymssql.py +../sqlalchemy/dialects/mssql/pyodbc.py +../sqlalchemy/dialects/mssql/zxjdbc.py +../sqlalchemy/dialects/mysql/__init__.py +../sqlalchemy/dialects/mysql/base.py +../sqlalchemy/dialects/mysql/cymysql.py +../sqlalchemy/dialects/mysql/enumerated.py +../sqlalchemy/dialects/mysql/gaerdbms.py +../sqlalchemy/dialects/mysql/json.py +../sqlalchemy/dialects/mysql/mysqlconnector.py +../sqlalchemy/dialects/mysql/mysqldb.py +../sqlalchemy/dialects/mysql/oursql.py +../sqlalchemy/dialects/mysql/pymysql.py +../sqlalchemy/dialects/mysql/pyodbc.py +../sqlalchemy/dialects/mysql/reflection.py +../sqlalchemy/dialects/mysql/types.py +../sqlalchemy/dialects/mysql/zxjdbc.py +../sqlalchemy/dialects/oracle/__init__.py +../sqlalchemy/dialects/oracle/base.py +../sqlalchemy/dialects/oracle/cx_oracle.py +../sqlalchemy/dialects/oracle/zxjdbc.py +../sqlalchemy/dialects/postgresql/__init__.py +../sqlalchemy/dialects/postgresql/array.py +../sqlalchemy/dialects/postgresql/base.py +../sqlalchemy/dialects/postgresql/dml.py +../sqlalchemy/dialects/postgresql/ext.py +../sqlalchemy/dialects/postgresql/hstore.py +../sqlalchemy/dialects/postgresql/json.py +../sqlalchemy/dialects/postgresql/pg8000.py +../sqlalchemy/dialects/postgresql/psycopg2.py +../sqlalchemy/dialects/postgresql/psycopg2cffi.py +../sqlalchemy/dialects/postgresql/pygresql.py +../sqlalchemy/dialects/postgresql/pypostgresql.py +../sqlalchemy/dialects/postgresql/ranges.py +../sqlalchemy/dialects/postgresql/zxjdbc.py +../sqlalchemy/dialects/sqlite/__init__.py +../sqlalchemy/dialects/sqlite/base.py +../sqlalchemy/dialects/sqlite/pysqlcipher.py +../sqlalchemy/dialects/sqlite/pysqlite.py +../sqlalchemy/dialects/sybase/__init__.py +../sqlalchemy/dialects/sybase/base.py +../sqlalchemy/dialects/sybase/mxodbc.py +../sqlalchemy/dialects/sybase/pyodbc.py +../sqlalchemy/dialects/sybase/pysybase.py +../sqlalchemy/ext/declarative/__init__.py +../sqlalchemy/ext/declarative/api.py +../sqlalchemy/ext/declarative/base.py +../sqlalchemy/ext/declarative/clsregistry.py +../sqlalchemy/testing/plugin/__init__.py +../sqlalchemy/testing/plugin/bootstrap.py +../sqlalchemy/testing/plugin/noseplugin.py +../sqlalchemy/testing/plugin/plugin_base.py +../sqlalchemy/testing/plugin/pytestplugin.py +../sqlalchemy/testing/suite/__init__.py +../sqlalchemy/testing/suite/test_ddl.py +../sqlalchemy/testing/suite/test_dialect.py +../sqlalchemy/testing/suite/test_insert.py +../sqlalchemy/testing/suite/test_reflection.py +../sqlalchemy/testing/suite/test_results.py +../sqlalchemy/testing/suite/test_select.py +../sqlalchemy/testing/suite/test_sequence.py +../sqlalchemy/testing/suite/test_types.py +../sqlalchemy/testing/suite/test_update_delete.py +../sqlalchemy/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/__pycache__/events.cpython-34.pyc +../sqlalchemy/__pycache__/exc.cpython-34.pyc +../sqlalchemy/__pycache__/inspection.cpython-34.pyc +../sqlalchemy/__pycache__/interfaces.cpython-34.pyc +../sqlalchemy/__pycache__/log.cpython-34.pyc +../sqlalchemy/__pycache__/pool.cpython-34.pyc +../sqlalchemy/__pycache__/processors.cpython-34.pyc +../sqlalchemy/__pycache__/schema.cpython-34.pyc +../sqlalchemy/__pycache__/types.cpython-34.pyc +../sqlalchemy/connectors/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/connectors/__pycache__/mxodbc.cpython-34.pyc +../sqlalchemy/connectors/__pycache__/pyodbc.cpython-34.pyc +../sqlalchemy/connectors/__pycache__/zxJDBC.cpython-34.pyc +../sqlalchemy/databases/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/engine/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/engine/__pycache__/base.cpython-34.pyc +../sqlalchemy/engine/__pycache__/default.cpython-34.pyc +../sqlalchemy/engine/__pycache__/interfaces.cpython-34.pyc +../sqlalchemy/engine/__pycache__/reflection.cpython-34.pyc +../sqlalchemy/engine/__pycache__/result.cpython-34.pyc +../sqlalchemy/engine/__pycache__/strategies.cpython-34.pyc +../sqlalchemy/engine/__pycache__/threadlocal.cpython-34.pyc +../sqlalchemy/engine/__pycache__/url.cpython-34.pyc +../sqlalchemy/engine/__pycache__/util.cpython-34.pyc +../sqlalchemy/event/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/event/__pycache__/api.cpython-34.pyc +../sqlalchemy/event/__pycache__/attr.cpython-34.pyc +../sqlalchemy/event/__pycache__/base.cpython-34.pyc +../sqlalchemy/event/__pycache__/legacy.cpython-34.pyc +../sqlalchemy/event/__pycache__/registry.cpython-34.pyc +../sqlalchemy/ext/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/ext/__pycache__/associationproxy.cpython-34.pyc +../sqlalchemy/ext/__pycache__/automap.cpython-34.pyc +../sqlalchemy/ext/__pycache__/baked.cpython-34.pyc +../sqlalchemy/ext/__pycache__/compiler.cpython-34.pyc +../sqlalchemy/ext/__pycache__/horizontal_shard.cpython-34.pyc +../sqlalchemy/ext/__pycache__/hybrid.cpython-34.pyc +../sqlalchemy/ext/__pycache__/indexable.cpython-34.pyc +../sqlalchemy/ext/__pycache__/instrumentation.cpython-34.pyc +../sqlalchemy/ext/__pycache__/mutable.cpython-34.pyc +../sqlalchemy/ext/__pycache__/orderinglist.cpython-34.pyc +../sqlalchemy/ext/__pycache__/serializer.cpython-34.pyc +../sqlalchemy/orm/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/orm/__pycache__/attributes.cpython-34.pyc +../sqlalchemy/orm/__pycache__/base.cpython-34.pyc +../sqlalchemy/orm/__pycache__/collections.cpython-34.pyc +../sqlalchemy/orm/__pycache__/dependency.cpython-34.pyc +../sqlalchemy/orm/__pycache__/deprecated_interfaces.cpython-34.pyc +../sqlalchemy/orm/__pycache__/descriptor_props.cpython-34.pyc +../sqlalchemy/orm/__pycache__/dynamic.cpython-34.pyc +../sqlalchemy/orm/__pycache__/evaluator.cpython-34.pyc +../sqlalchemy/orm/__pycache__/events.cpython-34.pyc +../sqlalchemy/orm/__pycache__/exc.cpython-34.pyc +../sqlalchemy/orm/__pycache__/identity.cpython-34.pyc +../sqlalchemy/orm/__pycache__/instrumentation.cpython-34.pyc +../sqlalchemy/orm/__pycache__/interfaces.cpython-34.pyc +../sqlalchemy/orm/__pycache__/loading.cpython-34.pyc +../sqlalchemy/orm/__pycache__/mapper.cpython-34.pyc +../sqlalchemy/orm/__pycache__/path_registry.cpython-34.pyc +../sqlalchemy/orm/__pycache__/persistence.cpython-34.pyc +../sqlalchemy/orm/__pycache__/properties.cpython-34.pyc +../sqlalchemy/orm/__pycache__/query.cpython-34.pyc +../sqlalchemy/orm/__pycache__/relationships.cpython-34.pyc +../sqlalchemy/orm/__pycache__/scoping.cpython-34.pyc +../sqlalchemy/orm/__pycache__/session.cpython-34.pyc +../sqlalchemy/orm/__pycache__/state.cpython-34.pyc +../sqlalchemy/orm/__pycache__/strategies.cpython-34.pyc +../sqlalchemy/orm/__pycache__/strategy_options.cpython-34.pyc +../sqlalchemy/orm/__pycache__/sync.cpython-34.pyc +../sqlalchemy/orm/__pycache__/unitofwork.cpython-34.pyc +../sqlalchemy/orm/__pycache__/util.cpython-34.pyc +../sqlalchemy/sql/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/sql/__pycache__/annotation.cpython-34.pyc +../sqlalchemy/sql/__pycache__/base.cpython-34.pyc +../sqlalchemy/sql/__pycache__/compiler.cpython-34.pyc +../sqlalchemy/sql/__pycache__/crud.cpython-34.pyc +../sqlalchemy/sql/__pycache__/ddl.cpython-34.pyc +../sqlalchemy/sql/__pycache__/default_comparator.cpython-34.pyc +../sqlalchemy/sql/__pycache__/dml.cpython-34.pyc +../sqlalchemy/sql/__pycache__/elements.cpython-34.pyc +../sqlalchemy/sql/__pycache__/expression.cpython-34.pyc +../sqlalchemy/sql/__pycache__/functions.cpython-34.pyc +../sqlalchemy/sql/__pycache__/naming.cpython-34.pyc +../sqlalchemy/sql/__pycache__/operators.cpython-34.pyc +../sqlalchemy/sql/__pycache__/schema.cpython-34.pyc +../sqlalchemy/sql/__pycache__/selectable.cpython-34.pyc +../sqlalchemy/sql/__pycache__/sqltypes.cpython-34.pyc +../sqlalchemy/sql/__pycache__/type_api.cpython-34.pyc +../sqlalchemy/sql/__pycache__/util.cpython-34.pyc +../sqlalchemy/sql/__pycache__/visitors.cpython-34.pyc +../sqlalchemy/testing/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/testing/__pycache__/assertions.cpython-34.pyc +../sqlalchemy/testing/__pycache__/assertsql.cpython-34.pyc +../sqlalchemy/testing/__pycache__/config.cpython-34.pyc +../sqlalchemy/testing/__pycache__/engines.cpython-34.pyc +../sqlalchemy/testing/__pycache__/entities.cpython-34.pyc +../sqlalchemy/testing/__pycache__/exclusions.cpython-34.pyc +../sqlalchemy/testing/__pycache__/fixtures.cpython-34.pyc +../sqlalchemy/testing/__pycache__/mock.cpython-34.pyc +../sqlalchemy/testing/__pycache__/pickleable.cpython-34.pyc +../sqlalchemy/testing/__pycache__/profiling.cpython-34.pyc +../sqlalchemy/testing/__pycache__/provision.cpython-34.pyc +../sqlalchemy/testing/__pycache__/replay_fixture.cpython-34.pyc +../sqlalchemy/testing/__pycache__/requirements.cpython-34.pyc +../sqlalchemy/testing/__pycache__/runner.cpython-34.pyc +../sqlalchemy/testing/__pycache__/schema.cpython-34.pyc +../sqlalchemy/testing/__pycache__/util.cpython-34.pyc +../sqlalchemy/testing/__pycache__/warnings.cpython-34.pyc +../sqlalchemy/util/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/util/__pycache__/_collections.cpython-34.pyc +../sqlalchemy/util/__pycache__/compat.cpython-34.pyc +../sqlalchemy/util/__pycache__/deprecations.cpython-34.pyc +../sqlalchemy/util/__pycache__/langhelpers.cpython-34.pyc +../sqlalchemy/util/__pycache__/queue.cpython-34.pyc +../sqlalchemy/util/__pycache__/topological.cpython-34.pyc +../sqlalchemy/dialects/firebird/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/firebird/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/firebird/__pycache__/fdb.cpython-34.pyc +../sqlalchemy/dialects/firebird/__pycache__/kinterbasdb.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/adodbapi.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/information_schema.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/mxodbc.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/pymssql.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/pyodbc.cpython-34.pyc +../sqlalchemy/dialects/mssql/__pycache__/zxjdbc.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/cymysql.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/enumerated.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/gaerdbms.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/json.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/mysqlconnector.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/mysqldb.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/oursql.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/pymysql.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/pyodbc.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/reflection.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/types.cpython-34.pyc +../sqlalchemy/dialects/mysql/__pycache__/zxjdbc.cpython-34.pyc +../sqlalchemy/dialects/oracle/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/oracle/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/oracle/__pycache__/cx_oracle.cpython-34.pyc +../sqlalchemy/dialects/oracle/__pycache__/zxjdbc.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/array.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/dml.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/ext.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/hstore.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/json.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/pg8000.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/psycopg2.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/psycopg2cffi.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/pygresql.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/pypostgresql.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/ranges.cpython-34.pyc +../sqlalchemy/dialects/postgresql/__pycache__/zxjdbc.cpython-34.pyc +../sqlalchemy/dialects/sqlite/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/sqlite/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/sqlite/__pycache__/pysqlcipher.cpython-34.pyc +../sqlalchemy/dialects/sqlite/__pycache__/pysqlite.cpython-34.pyc +../sqlalchemy/dialects/sybase/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/dialects/sybase/__pycache__/base.cpython-34.pyc +../sqlalchemy/dialects/sybase/__pycache__/mxodbc.cpython-34.pyc +../sqlalchemy/dialects/sybase/__pycache__/pyodbc.cpython-34.pyc +../sqlalchemy/dialects/sybase/__pycache__/pysybase.cpython-34.pyc +../sqlalchemy/ext/declarative/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/ext/declarative/__pycache__/api.cpython-34.pyc +../sqlalchemy/ext/declarative/__pycache__/base.cpython-34.pyc +../sqlalchemy/ext/declarative/__pycache__/clsregistry.cpython-34.pyc +../sqlalchemy/testing/plugin/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/testing/plugin/__pycache__/bootstrap.cpython-34.pyc +../sqlalchemy/testing/plugin/__pycache__/noseplugin.cpython-34.pyc +../sqlalchemy/testing/plugin/__pycache__/plugin_base.cpython-34.pyc +../sqlalchemy/testing/plugin/__pycache__/pytestplugin.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/__init__.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_ddl.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_dialect.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_insert.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_reflection.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_results.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_select.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_sequence.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_types.cpython-34.pyc +../sqlalchemy/testing/suite/__pycache__/test_update_delete.cpython-34.pyc +../sqlalchemy/cprocessors.so +../sqlalchemy/cresultproxy.so +../sqlalchemy/cutils.so +./ +dependency_links.txt +PKG-INFO +requires.txt +SOURCES.txt +top_level.txt diff --git a/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/requires.txt b/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/requires.txt new file mode 100644 index 0000000..f2a83ed --- /dev/null +++ b/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/requires.txt @@ -0,0 +1,24 @@ + +[mssql_pymssql] +pymssql + +[mssql_pyodbc] +pyodbc + +[mysql] +mysqlclient + +[oracle] +cx_oracle + +[postgresql] +psycopg2 + +[postgresql_pg8000] +pg8000 + +[postgresql_psycopg2cffi] +psycopg2cffi + +[pymysql] +pymysql diff --git a/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/top_level.txt b/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/top_level.txt new file mode 100644 index 0000000..39fb2be --- /dev/null +++ b/app/lib/SQLAlchemy-1.1.9-py3.4.egg-info/top_level.txt @@ -0,0 +1 @@ +sqlalchemy diff --git a/app/lib/Werkzeug-0.12.1.dist-info/DESCRIPTION.rst b/app/lib/Werkzeug-0.12.1.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..3e3abb7 --- /dev/null +++ b/app/lib/Werkzeug-0.12.1.dist-info/DESCRIPTION.rst @@ -0,0 +1,54 @@ +Werkzeug +======== + +Werkzeug started as simple collection of various utilities for WSGI +applications and has become one of the most advanced WSGI utility +modules. It includes a powerful debugger, full featured request and +response objects, HTTP utilities to handle entity tags, cache control +headers, HTTP dates, cookie handling, file uploads, a powerful URL +routing system and a bunch of community contributed addon modules. + +Werkzeug is unicode aware and doesn't enforce a specific template +engine, database adapter or anything else. It doesn't even enforce +a specific way of handling requests and leaves all that up to the +developer. It's most useful for end user applications which should work +on as many server environments as possible (such as blogs, wikis, +bulletin boards, etc.). + +Details and example applications are available on the +`Werkzeug website `_. + + +Features +-------- + +- unicode awareness + +- request and response objects + +- various utility functions for dealing with HTTP headers such as + `Accept` and `Cache-Control` headers. + +- thread local objects with proper cleanup at request end + +- an interactive debugger + +- A simple WSGI server with support for threading and forking + with an automatic reloader. + +- a flexible URL routing system with REST support. + +- fully WSGI compatible + + +Development Version +------------------- + +The Werkzeug development version can be installed by cloning the git +repository from `github`_:: + + git clone git@github.com:pallets/werkzeug.git + +.. _github: http://github.com/pallets/werkzeug + + diff --git a/app/lib/Werkzeug-0.12.1.dist-info/LICENSE.txt b/app/lib/Werkzeug-0.12.1.dist-info/LICENSE.txt new file mode 100644 index 0000000..1c2e0b7 --- /dev/null +++ b/app/lib/Werkzeug-0.12.1.dist-info/LICENSE.txt @@ -0,0 +1,29 @@ +Copyright (c) 2014 by the Werkzeug Team, see AUTHORS for more details. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/app/lib/Werkzeug-0.12.1.dist-info/METADATA b/app/lib/Werkzeug-0.12.1.dist-info/METADATA new file mode 100644 index 0000000..86c5bdd --- /dev/null +++ b/app/lib/Werkzeug-0.12.1.dist-info/METADATA @@ -0,0 +1,83 @@ +Metadata-Version: 2.0 +Name: Werkzeug +Version: 0.12.1 +Summary: The Swiss Army knife of Python web development +Home-page: http://werkzeug.pocoo.org/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: BSD +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +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 :: 3.5 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Provides-Extra: termcolor +Requires-Dist: termcolor; extra == 'termcolor' +Provides-Extra: watchdog +Requires-Dist: watchdog; extra == 'watchdog' + +Werkzeug +======== + +Werkzeug started as simple collection of various utilities for WSGI +applications and has become one of the most advanced WSGI utility +modules. It includes a powerful debugger, full featured request and +response objects, HTTP utilities to handle entity tags, cache control +headers, HTTP dates, cookie handling, file uploads, a powerful URL +routing system and a bunch of community contributed addon modules. + +Werkzeug is unicode aware and doesn't enforce a specific template +engine, database adapter or anything else. It doesn't even enforce +a specific way of handling requests and leaves all that up to the +developer. It's most useful for end user applications which should work +on as many server environments as possible (such as blogs, wikis, +bulletin boards, etc.). + +Details and example applications are available on the +`Werkzeug website `_. + + +Features +-------- + +- unicode awareness + +- request and response objects + +- various utility functions for dealing with HTTP headers such as + `Accept` and `Cache-Control` headers. + +- thread local objects with proper cleanup at request end + +- an interactive debugger + +- A simple WSGI server with support for threading and forking + with an automatic reloader. + +- a flexible URL routing system with REST support. + +- fully WSGI compatible + + +Development Version +------------------- + +The Werkzeug development version can be installed by cloning the git +repository from `github`_:: + + git clone git@github.com:pallets/werkzeug.git + +.. _github: http://github.com/pallets/werkzeug + + diff --git a/app/lib/Werkzeug-0.12.1.dist-info/RECORD b/app/lib/Werkzeug-0.12.1.dist-info/RECORD new file mode 100644 index 0000000..d6c4b77 --- /dev/null +++ b/app/lib/Werkzeug-0.12.1.dist-info/RECORD @@ -0,0 +1,94 @@ +werkzeug/posixemulation.py,sha256=xEF2Bxc-vUCPkiu4IbfWVd3LW7DROYAT-ExW6THqyzw,3519 +werkzeug/security.py,sha256=rbd9Q-Xga1NldPzuiVW5czvBGUXkhWARm_lxrT1Tx54,8990 +werkzeug/__init__.py,sha256=xQyZHWJtl_P88xARoyNi4QXv22yiApBfTRHsob__IFs,6864 +werkzeug/testapp.py,sha256=3HQRW1sHZKXuAjCvFMet4KXtQG3loYTFnvn6LWt-4zI,9396 +werkzeug/http.py,sha256=nrk-ASJzcKOuoBEz274TWA8jKt0CQSOBZuP_A0UASTA,36658 +werkzeug/routing.py,sha256=g25wg0GNfff8WcfRlc1ZxTGvz1KbVj09w2S7wxopseQ,66746 +werkzeug/utils.py,sha256=lkybtv_mq35zV1qhelvEcILTzrMUwZ9yon6E8XwapJE,22972 +werkzeug/exceptions.py,sha256=3wp95Hqj9FqV8MdikV99JRcHse_fSMn27V8tgP5Hw2c,20505 +werkzeug/_reloader.py,sha256=NkIXQCTa6b22wWLpXob_jIVUxux8LtAsfWehLkKt0iM,8816 +werkzeug/formparser.py,sha256=DxN53eOCb6i7PxqtldrF2Kv9Mx00BqW297N4t-RxkWE,21241 +werkzeug/_compat.py,sha256=8c4U9o6A_TR9nKCcTbpZNxpqCXcXDVIbFawwKM2s92c,6311 +werkzeug/datastructures.py,sha256=uajnldfkuVXEcE92qW-uo9YUAprO3Yh5dPDQfnUL9eE,89075 +werkzeug/wrappers.py,sha256=wceh1RhvhIZVzKuok3XMQ5jqjYYCEYv5JqKY3Nc_oRY,82986 +werkzeug/test.py,sha256=xnabNSpty66ftZiXHcoZaYFP1E4WUNxydw5Oe8Mjhoo,34795 +werkzeug/urls.py,sha256=fSbI4Gb29_p02Zk21VAZQRN1QdOVY9CNTgpb2rbajNQ,36710 +werkzeug/script.py,sha256=Jh9OAktqjLNc_IBBUatVM7uP5LDcbxaYA8n2ObnS4bo,11666 +werkzeug/useragents.py,sha256=Ck3G977Y0Rzdk9wFcLpL0PyOrONtdK1_d2Zexb78cX4,5640 +werkzeug/local.py,sha256=QdQhWV5L8p1Y1CJ1CDStwxaUs24SuN5aebHwjVD08C8,14553 +werkzeug/serving.py,sha256=bN5nO4zTqzs-QX4rBxbW1LVF5af0c_vCokhZHO4muUE,28961 +werkzeug/filesystem.py,sha256=hHWeWo_gqLMzTRfYt8-7n2wWcWUNTnDyudQDLOBEICE,2175 +werkzeug/wsgi.py,sha256=TjPo5ups3NI1RVVGdMvd3XaceqFtqlMX5X169gWWFrQ,42838 +werkzeug/_internal.py,sha256=sE2JbLnMzN9mRI1iipTYWrFAGEWaZVECqtHAiNEhqUE,13841 +werkzeug/contrib/fixers.py,sha256=gR06T-w71ur-tHQ_31kP_4jpOncPJ4Wc1dOqTvYusr8,10179 +werkzeug/contrib/limiter.py,sha256=iS8-ahPZ-JLRnmfIBzxpm7O_s3lPsiDMVWv7llAIDCI,1334 +werkzeug/contrib/__init__.py,sha256=f7PfttZhbrImqpr5Ezre8CXgwvcGUJK7zWNpO34WWrw,623 +werkzeug/contrib/testtools.py,sha256=G9xN-qeihJlhExrIZMCahvQOIDxdL9NiX874jiiHFMs,2453 +werkzeug/contrib/iterio.py,sha256=RlqDvGhz0RneTpzE8dVc-yWCUv4nkPl1jEc_EDp2fH0,10814 +werkzeug/contrib/cache.py,sha256=nyUUxsS0MTHiFmu-481y9PHd8NvWH5pzCoEX1yA0mHY,30341 +werkzeug/contrib/securecookie.py,sha256=bDsAJmslkwmXjycnPjEjWtfLBvhz0ud4z3k7tdezUVs,12174 +werkzeug/contrib/lint.py,sha256=qZlmqiWJ5tQJOEzLnPmHWA8eUEpcBIWkAb_V2RKJg4o,12558 +werkzeug/contrib/profiler.py,sha256=ISwCWvwVyGpDLRBRpLjo_qUWma6GXYBrTAco4PEQSHY,5151 +werkzeug/contrib/wrappers.py,sha256=v7OYlz7wQtDlS9fey75UiRZ1IkUWqCpzbhsLy4k14Hw,10398 +werkzeug/contrib/atom.py,sha256=qqfJcfIn2RYY-3hO3Oz0aLq9YuNubcPQ_KZcNsDwVJo,15575 +werkzeug/contrib/jsrouting.py,sha256=QTmgeDoKXvNK02KzXgx9lr3cAH6fAzpwF5bBdPNvJPs,8564 +werkzeug/contrib/sessions.py,sha256=39LVNvLbm5JWpbxM79WC2l87MJFbqeISARjwYbkJatw,12577 +werkzeug/debug/console.py,sha256=n3-dsKk1TsjnN-u4ZgmuWCU_HO0qw5IA7ttjhyyMM6I,5607 +werkzeug/debug/repr.py,sha256=bKqstDYGfECpeLerd48s_hxuqK4b6UWnjMu3d_DHO8I,9340 +werkzeug/debug/__init__.py,sha256=GTsOsjE3PqUAlsUVm2Mgc_KWA2kjjSsUz0JsM7Qu41w,17266 +werkzeug/debug/tbtools.py,sha256=rBudXCmkVdAKIcdhxANxgf09g6kQjJWW9_5bjSpr4OY,18451 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818 +werkzeug/debug/shared/debugger.js,sha256=PKPVYuyO4SX1hkqLOwCLvmIEO5154WatFYaXE-zIfKI,6264 +werkzeug/debug/shared/style.css,sha256=IEO0PC2pWmh2aEyGCaN--txuWsRCliuhlbEhPDFwh0A,6270 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 +werkzeug/debug/shared/jquery.js,sha256=7LkWEzqTdpEfELxcZZlS6wAx5Ff13zZ83lYO2_ujj7g,95957 +werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +Werkzeug-0.12.1.dist-info/DESCRIPTION.rst,sha256=z9r9xqJ0fYSAn1Tz7KRBdFGDerL2y4pHWSW_72pUgTc,1591 +Werkzeug-0.12.1.dist-info/metadata.json,sha256=gzIVhjk_QMpO2SldxIcRtgkXI3U-x92yMDpyuMy8-WM,1276 +Werkzeug-0.12.1.dist-info/RECORD,, +Werkzeug-0.12.1.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 +Werkzeug-0.12.1.dist-info/WHEEL,sha256=AvR0WeTpDaxT645bl5FQxUK6NPsTls2ttpcGJg3j1Xg,110 +Werkzeug-0.12.1.dist-info/LICENSE.txt,sha256=F84h8-PZAuC-Hq-_252D3yhH6mqIc-WUbXUPbfOtjXM,1532 +Werkzeug-0.12.1.dist-info/METADATA,sha256=QqCGwUjZaX70SDkofJYsMxbG6UfcXLb6pkvSMGKN5DA,2738 +werkzeug/__pycache__/testapp.cpython-34.pyc,, +werkzeug/debug/__pycache__/console.cpython-34.pyc,, +werkzeug/__pycache__/formparser.cpython-34.pyc,, +werkzeug/__pycache__/test.cpython-34.pyc,, +werkzeug/__pycache__/wsgi.cpython-34.pyc,, +werkzeug/contrib/__pycache__/iterio.cpython-34.pyc,, +werkzeug/__pycache__/urls.cpython-34.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-34.pyc,, +werkzeug/__pycache__/wrappers.cpython-34.pyc,, +werkzeug/debug/__pycache__/__init__.cpython-34.pyc,, +werkzeug/__pycache__/_reloader.cpython-34.pyc,, +werkzeug/contrib/__pycache__/securecookie.cpython-34.pyc,, +werkzeug/contrib/__pycache__/lint.cpython-34.pyc,, +werkzeug/__pycache__/security.cpython-34.pyc,, +werkzeug/contrib/__pycache__/profiler.cpython-34.pyc,, +werkzeug/contrib/__pycache__/atom.cpython-34.pyc,, +werkzeug/__pycache__/filesystem.cpython-34.pyc,, +werkzeug/contrib/__pycache__/fixers.cpython-34.pyc,, +werkzeug/__pycache__/exceptions.cpython-34.pyc,, +werkzeug/contrib/__pycache__/sessions.cpython-34.pyc,, +werkzeug/__pycache__/utils.cpython-34.pyc,, +werkzeug/__pycache__/routing.cpython-34.pyc,, +werkzeug/contrib/__pycache__/wrappers.cpython-34.pyc,, +werkzeug/__pycache__/posixemulation.cpython-34.pyc,, +werkzeug/__pycache__/useragents.cpython-34.pyc,, +werkzeug/contrib/__pycache__/limiter.cpython-34.pyc,, +werkzeug/__pycache__/_compat.cpython-34.pyc,, +werkzeug/__pycache__/http.cpython-34.pyc,, +werkzeug/__pycache__/local.cpython-34.pyc,, +werkzeug/__pycache__/script.cpython-34.pyc,, +werkzeug/__pycache__/datastructures.cpython-34.pyc,, +werkzeug/contrib/__pycache__/__init__.cpython-34.pyc,, +werkzeug/contrib/__pycache__/cache.cpython-34.pyc,, +werkzeug/debug/__pycache__/repr.cpython-34.pyc,, +werkzeug/contrib/__pycache__/testtools.cpython-34.pyc,, +werkzeug/__pycache__/serving.cpython-34.pyc,, +werkzeug/__pycache__/__init__.cpython-34.pyc,, +werkzeug/contrib/__pycache__/jsrouting.cpython-34.pyc,, +werkzeug/__pycache__/_internal.cpython-34.pyc,, diff --git a/app/lib/Werkzeug-0.12.1.dist-info/WHEEL b/app/lib/Werkzeug-0.12.1.dist-info/WHEEL new file mode 100644 index 0000000..9dff69d --- /dev/null +++ b/app/lib/Werkzeug-0.12.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.24.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/app/lib/Werkzeug-0.12.1.dist-info/metadata.json b/app/lib/Werkzeug-0.12.1.dist-info/metadata.json new file mode 100644 index 0000000..4fc2cf2 --- /dev/null +++ b/app/lib/Werkzeug-0.12.1.dist-info/metadata.json @@ -0,0 +1 @@ +{"license": "BSD", "name": "Werkzeug", "metadata_version": "2.0", "generator": "bdist_wheel (0.24.0)", "summary": "The Swiss Army knife of Python web development", "platform": "any", "run_requires": [{"requires": ["watchdog"], "extra": "watchdog"}, {"requires": ["termcolor"], "extra": "termcolor"}], "version": "0.12.1", "extensions": {"python.details": {"project_urls": {"Home": "http://werkzeug.pocoo.org/"}, "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "contacts": [{"role": "author", "email": "armin.ronacher@active-4.com", "name": "Armin Ronacher"}]}}, "classifiers": ["Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "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 :: 3.5", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules"], "extras": ["termcolor", "watchdog"]} \ No newline at end of file diff --git a/app/lib/Werkzeug-0.12.1.dist-info/top_level.txt b/app/lib/Werkzeug-0.12.1.dist-info/top_level.txt new file mode 100644 index 0000000..6fe8da8 --- /dev/null +++ b/app/lib/Werkzeug-0.12.1.dist-info/top_level.txt @@ -0,0 +1 @@ +werkzeug diff --git a/app/lib/click-6.7.dist-info/DESCRIPTION.rst b/app/lib/click-6.7.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..e118723 --- /dev/null +++ b/app/lib/click-6.7.dist-info/DESCRIPTION.rst @@ -0,0 +1,3 @@ +UNKNOWN + + diff --git a/app/lib/click-6.7.dist-info/METADATA b/app/lib/click-6.7.dist-info/METADATA new file mode 100644 index 0000000..1f10885 --- /dev/null +++ b/app/lib/click-6.7.dist-info/METADATA @@ -0,0 +1,16 @@ +Metadata-Version: 2.0 +Name: click +Version: 6.7 +Summary: A simple wrapper around optparse for powerful command line utilities. +Home-page: http://github.com/mitsuhiko/click +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +License: UNKNOWN +Platform: UNKNOWN +Classifier: License :: OSI Approved :: BSD License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 + +UNKNOWN + + diff --git a/app/lib/click-6.7.dist-info/RECORD b/app/lib/click-6.7.dist-info/RECORD new file mode 100644 index 0000000..841d846 --- /dev/null +++ b/app/lib/click-6.7.dist-info/RECORD @@ -0,0 +1,40 @@ +click/__init__.py,sha256=k8R00cFKWI8dhDVKQeLBlAdNh1CxerMEDRiGnr32gdw,2858 +click/_bashcomplete.py,sha256=82rMiibtEurdwBq60NHXVCBuGXJHDpblFO9o2YxJDF0,2423 +click/_compat.py,sha256=j59MpzxYGE-fTGj0A5sg8UI8GhHod1XMojiCA0jvbL0,21011 +click/_termui_impl.py,sha256=Ol1JJhvBRw3l8j1WIU0tOWjQtxxmwGE44lFDbzDqzoA,16395 +click/_textwrap.py,sha256=gwS4m7bdQiJnzaDG8osFcRb-5vn4t4l2qSCy-5csCEc,1198 +click/_unicodefun.py,sha256=A3UOzJw6lEZyol2SBg3fNXgweTutaOzkJ61OB7vik3Y,4204 +click/_winconsole.py,sha256=MzG46DEYPoRyx4SO7EIhFuFZHESgooAfJLIukbB6p5c,7790 +click/core.py,sha256=M0nJ6Kkye7XZXYG7HCbkJWSfy14WHV6bQmGLACrOhKw,70254 +click/decorators.py,sha256=y7CX2needh8iRWafj-QS_hGQFsN24eyXAhx5Y2ATwas,10941 +click/exceptions.py,sha256=rOa0pP3PbSy0_AAPOW9irBEM8AJ3BySN-4z2VUwFVo4,6788 +click/formatting.py,sha256=eh-cypTUAhpI3HD-K4ZpR3vCiURIO62xXvKkR3tNUTM,8889 +click/globals.py,sha256=PAgnKvGxq4YuEIldw3lgYOGBLYwsyxnm1IByBX3BFXo,1515 +click/parser.py,sha256=i01xgYuIA6AwQWEXjshwHSwnTR3gUep4FxJIfyW4ta4,15510 +click/termui.py,sha256=Bp99MSWQtyoWe1_7HggDmA77n--3KLxu7NsZMFMaCUo,21008 +click/testing.py,sha256=kJ9mjtJgwNAlkgKcFf9-ISxufmaPDbbuOHVC9WIvKdY,11002 +click/types.py,sha256=ZGb2lmFs5Vwd9loTRIMbGcqhPVOql8mGoBhWBRT6V4E,18864 +click/utils.py,sha256=1jalPlkUU28JReTEQeeSFtbJd-SirYWBNfjtELBKzT4,14916 +click-6.7.dist-info/DESCRIPTION.rst,sha256=OCTuuN6LcWulhHS3d5rfjdsQtW22n7HENFRh6jC6ego,10 +click-6.7.dist-info/METADATA,sha256=l6lAyogIUXiHKUK_rWguef-EMcvO5C6bXzFCNCcblbQ,424 +click-6.7.dist-info/RECORD,, +click-6.7.dist-info/WHEEL,sha256=5wvfB7GvgZAbKBSE9uX9Zbi6LCL-_KgezgHblXhCRnM,113 +click-6.7.dist-info/metadata.json,sha256=qg0uO6amNHkIkOxnmWX7Xa_DNQMQ62Q6drivuP9Gh1c,571 +click-6.7.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__pycache__/_bashcomplete.cpython-34.pyc,, +click/__pycache__/types.cpython-34.pyc,, +click/__pycache__/parser.cpython-34.pyc,, +click/__pycache__/testing.cpython-34.pyc,, +click/__pycache__/_textwrap.cpython-34.pyc,, +click/__pycache__/core.cpython-34.pyc,, +click/__pycache__/_winconsole.cpython-34.pyc,, +click/__pycache__/decorators.cpython-34.pyc,, +click/__pycache__/_compat.cpython-34.pyc,, +click/__pycache__/termui.cpython-34.pyc,, +click/__pycache__/_unicodefun.cpython-34.pyc,, +click/__pycache__/__init__.cpython-34.pyc,, +click/__pycache__/_termui_impl.cpython-34.pyc,, +click/__pycache__/globals.cpython-34.pyc,, +click/__pycache__/exceptions.cpython-34.pyc,, +click/__pycache__/utils.cpython-34.pyc,, +click/__pycache__/formatting.cpython-34.pyc,, diff --git a/app/lib/click-6.7.dist-info/WHEEL b/app/lib/click-6.7.dist-info/WHEEL new file mode 100644 index 0000000..7bf9daa --- /dev/null +++ b/app/lib/click-6.7.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0.a0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/app/lib/click-6.7.dist-info/metadata.json b/app/lib/click-6.7.dist-info/metadata.json new file mode 100644 index 0000000..0a4cfb1 --- /dev/null +++ b/app/lib/click-6.7.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 3"], "extensions": {"python.details": {"contacts": [{"email": "armin.ronacher@active-4.com", "name": "Armin Ronacher", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "http://github.com/mitsuhiko/click"}}}, "generator": "bdist_wheel (0.30.0.a0)", "metadata_version": "2.0", "name": "click", "summary": "A simple wrapper around optparse for powerful command line utilities.", "version": "6.7"} \ No newline at end of file diff --git a/app/lib/click-6.7.dist-info/top_level.txt b/app/lib/click-6.7.dist-info/top_level.txt new file mode 100644 index 0000000..dca9a90 --- /dev/null +++ b/app/lib/click-6.7.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/app/lib/click/__init__.py b/app/lib/click/__init__.py new file mode 100644 index 0000000..971e55d --- /dev/null +++ b/app/lib/click/__init__.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +""" + click + ~~~~~ + + Click is a simple Python module that wraps the stdlib's optparse to make + writing command line scripts fun. Unlike other modules, it's based around + a simple API that does not come with too much magic and is composable. + + In case optparse ever gets removed from the stdlib, it will be shipped by + this module. + + :copyright: (c) 2014 by Armin Ronacher. + :license: BSD, see LICENSE for more details. +""" + +# Core classes +from .core import Context, BaseCommand, Command, MultiCommand, Group, \ + CommandCollection, Parameter, Option, Argument + +# Globals +from .globals import get_current_context + +# Decorators +from .decorators import pass_context, pass_obj, make_pass_decorator, \ + command, group, argument, option, confirmation_option, \ + password_option, version_option, help_option + +# Types +from .types import ParamType, File, Path, Choice, IntRange, Tuple, \ + STRING, INT, FLOAT, BOOL, UUID, UNPROCESSED + +# Utilities +from .utils import echo, get_binary_stream, get_text_stream, open_file, \ + format_filename, get_app_dir, get_os_args + +# Terminal functions +from .termui import prompt, confirm, get_terminal_size, echo_via_pager, \ + progressbar, clear, style, unstyle, secho, edit, launch, getchar, \ + pause + +# Exceptions +from .exceptions import ClickException, UsageError, BadParameter, \ + FileError, Abort, NoSuchOption, BadOptionUsage, BadArgumentUsage, \ + MissingParameter + +# Formatting +from .formatting import HelpFormatter, wrap_text + +# Parsing +from .parser import OptionParser + + +__all__ = [ + # Core classes + 'Context', 'BaseCommand', 'Command', 'MultiCommand', 'Group', + 'CommandCollection', 'Parameter', 'Option', 'Argument', + + # Globals + 'get_current_context', + + # Decorators + 'pass_context', 'pass_obj', 'make_pass_decorator', 'command', 'group', + 'argument', 'option', 'confirmation_option', 'password_option', + 'version_option', 'help_option', + + # Types + 'ParamType', 'File', 'Path', 'Choice', 'IntRange', 'Tuple', 'STRING', + 'INT', 'FLOAT', 'BOOL', 'UUID', 'UNPROCESSED', + + # Utilities + 'echo', 'get_binary_stream', 'get_text_stream', 'open_file', + 'format_filename', 'get_app_dir', 'get_os_args', + + # Terminal functions + 'prompt', 'confirm', 'get_terminal_size', 'echo_via_pager', + 'progressbar', 'clear', 'style', 'unstyle', 'secho', 'edit', 'launch', + 'getchar', 'pause', + + # Exceptions + 'ClickException', 'UsageError', 'BadParameter', 'FileError', + 'Abort', 'NoSuchOption', 'BadOptionUsage', 'BadArgumentUsage', + 'MissingParameter', + + # Formatting + 'HelpFormatter', 'wrap_text', + + # Parsing + 'OptionParser', +] + + +# Controls if click should emit the warning about the use of unicode +# literals. +disable_unicode_literals_warning = False + + +__version__ = '6.7' diff --git a/app/lib/click/_bashcomplete.py b/app/lib/click/_bashcomplete.py new file mode 100644 index 0000000..d9d26d2 --- /dev/null +++ b/app/lib/click/_bashcomplete.py @@ -0,0 +1,83 @@ +import os +import re +from .utils import echo +from .parser import split_arg_string +from .core import MultiCommand, Option + + +COMPLETION_SCRIPT = ''' +%(complete_func)s() { + COMPREPLY=( $( env COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + %(autocomplete_var)s=complete $1 ) ) + return 0 +} + +complete -F %(complete_func)s -o default %(script_names)s +''' + +_invalid_ident_char_re = re.compile(r'[^a-zA-Z0-9_]') + + +def get_completion_script(prog_name, complete_var): + cf_name = _invalid_ident_char_re.sub('', prog_name.replace('-', '_')) + return (COMPLETION_SCRIPT % { + 'complete_func': '_%s_completion' % cf_name, + 'script_names': prog_name, + 'autocomplete_var': complete_var, + }).strip() + ';' + + +def resolve_ctx(cli, prog_name, args): + ctx = cli.make_context(prog_name, args, resilient_parsing=True) + while ctx.protected_args + ctx.args and isinstance(ctx.command, MultiCommand): + a = ctx.protected_args + ctx.args + cmd = ctx.command.get_command(ctx, a[0]) + if cmd is None: + return None + ctx = cmd.make_context(a[0], a[1:], parent=ctx, resilient_parsing=True) + return ctx + + +def get_choices(cli, prog_name, args, incomplete): + ctx = resolve_ctx(cli, prog_name, args) + if ctx is None: + return + + choices = [] + if incomplete and not incomplete[:1].isalnum(): + for param in ctx.command.params: + if not isinstance(param, Option): + continue + choices.extend(param.opts) + choices.extend(param.secondary_opts) + elif isinstance(ctx.command, MultiCommand): + choices.extend(ctx.command.list_commands(ctx)) + + for item in choices: + if item.startswith(incomplete): + yield item + + +def do_complete(cli, prog_name): + cwords = split_arg_string(os.environ['COMP_WORDS']) + cword = int(os.environ['COMP_CWORD']) + args = cwords[1:cword] + try: + incomplete = cwords[cword] + except IndexError: + incomplete = '' + + for item in get_choices(cli, prog_name, args, incomplete): + echo(item) + + return True + + +def bashcomplete(cli, prog_name, complete_var, complete_instr): + if complete_instr == 'source': + echo(get_completion_script(prog_name, complete_var)) + return True + elif complete_instr == 'complete': + return do_complete(cli, prog_name) + return False diff --git a/app/lib/click/_compat.py b/app/lib/click/_compat.py new file mode 100644 index 0000000..2b43412 --- /dev/null +++ b/app/lib/click/_compat.py @@ -0,0 +1,648 @@ +import re +import io +import os +import sys +import codecs +from weakref import WeakKeyDictionary + + +PY2 = sys.version_info[0] == 2 +WIN = sys.platform.startswith('win') +DEFAULT_COLUMNS = 80 + + +_ansi_re = re.compile('\033\[((?:\d|;)*)([a-zA-Z])') + + +def get_filesystem_encoding(): + return sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def _make_text_stream(stream, encoding, errors): + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = 'replace' + return _NonClosingTextIOWrapper(stream, encoding, errors, + line_buffering=True) + + +def is_ascii_encoding(encoding): + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == 'ascii' + except LookupError: + return False + + +def get_best_encoding(stream): + """Returns the default stream encoding if not found.""" + rv = getattr(stream, 'encoding', None) or sys.getdefaultencoding() + if is_ascii_encoding(rv): + return 'utf-8' + return rv + + +class _NonClosingTextIOWrapper(io.TextIOWrapper): + + def __init__(self, stream, encoding, errors, **extra): + self._stream = stream = _FixupStream(stream) + io.TextIOWrapper.__init__(self, stream, encoding, errors, **extra) + + # The io module is a place where the Python 3 text behavior + # was forced upon Python 2, so we need to unbreak + # it to look like Python 2. + if PY2: + def write(self, x): + if isinstance(x, str) or is_bytes(x): + try: + self.flush() + except Exception: + pass + return self.buffer.write(str(x)) + return io.TextIOWrapper.write(self, x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __del__(self): + try: + self.detach() + except Exception: + pass + + def isatty(self): + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream(object): + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + """ + + def __init__(self, stream): + self._stream = stream + + def __getattr__(self, name): + return getattr(self._stream, name) + + def read1(self, size): + f = getattr(self._stream, 'read1', None) + if f is not None: + return f(size) + # We only dispatch to readline instead of read in Python 2 as we + # do not want cause problems with the different implementation + # of line buffering. + if PY2: + return self._stream.readline(size) + return self._stream.read(size) + + def readable(self): + x = getattr(self._stream, 'readable', None) + if x is not None: + return x() + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self): + x = getattr(self._stream, 'writable', None) + if x is not None: + return x() + try: + self._stream.write('') + except Exception: + try: + self._stream.write(b'') + except Exception: + return False + return True + + def seekable(self): + x = getattr(self._stream, 'seekable', None) + if x is not None: + return x() + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +if PY2: + text_type = unicode + bytes = str + raw_input = raw_input + string_types = (str, unicode) + iteritems = lambda x: x.iteritems() + range_type = xrange + + def is_bytes(x): + return isinstance(x, (buffer, bytearray)) + + _identifier_re = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*$') + + # For Windows, we need to force stdout/stdin/stderr to binary if it's + # fetched for that. This obviously is not the most correct way to do + # it as it changes global state. Unfortunately, there does not seem to + # be a clear better way to do it as just reopening the file in binary + # mode does not change anything. + # + # An option would be to do what Python 3 does and to open the file as + # binary only, patch it back to the system, and then use a wrapper + # stream that converts newlines. It's not quite clear what's the + # correct option here. + # + # This code also lives in _winconsole for the fallback to the console + # emulation stream. + # + # There are also Windows environments where the `msvcrt` module is not + # available (which is why we use try-catch instead of the WIN variable + # here), such as the Google App Engine development server on Windows. In + # those cases there is just nothing we can do. + try: + import msvcrt + except ImportError: + set_binary_mode = lambda x: x + else: + def set_binary_mode(f): + try: + fileno = f.fileno() + except Exception: + pass + else: + msvcrt.setmode(fileno, os.O_BINARY) + return f + + def isidentifier(x): + return _identifier_re.search(x) is not None + + def get_binary_stdin(): + return set_binary_mode(sys.stdin) + + def get_binary_stdout(): + return set_binary_mode(sys.stdout) + + def get_binary_stderr(): + return set_binary_mode(sys.stderr) + + def get_text_stdin(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdin, encoding, errors) + + def get_text_stdout(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stdout, encoding, errors) + + def get_text_stderr(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _make_text_stream(sys.stderr, encoding, errors) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), 'replace') + return value +else: + import io + text_type = str + raw_input = input + string_types = (str,) + range_type = range + isidentifier = lambda x: x.isidentifier() + iteritems = lambda x: iter(x.items()) + + def is_bytes(x): + return isinstance(x, (bytes, memoryview, bytearray)) + + def _is_binary_reader(stream, default=False): + try: + return isinstance(stream.read(0), bytes) + except Exception: + return default + # This happens in some cases where the stream was already + # closed. In this case, we assume the default. + + def _is_binary_writer(stream, default=False): + try: + stream.write(b'') + except Exception: + try: + stream.write('') + return False + except Exception: + pass + return default + return True + + def _find_binary_reader(stream): + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_reader(stream, False): + return stream + + buf = getattr(stream, 'buffer', None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_reader(buf, True): + return buf + + def _find_binary_writer(stream): + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detatching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_writer(stream, False): + return stream + + buf = getattr(stream, 'buffer', None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_writer(buf, True): + return buf + + def _stream_is_misconfigured(stream): + """A stream is misconfigured if its encoding is ASCII.""" + # If the stream does not have an encoding set, we assume it's set + # to ASCII. This appears to happen in certain unittest + # environments. It's not quite clear what the correct behavior is + # but this at least will force Click to recover somehow. + return is_ascii_encoding(getattr(stream, 'encoding', None) or 'ascii') + + def _is_compatible_text_stream(stream, encoding, errors): + stream_encoding = getattr(stream, 'encoding', None) + stream_errors = getattr(stream, 'errors', None) + + # Perfect match. + if stream_encoding == encoding and stream_errors == errors: + return True + + # Otherwise, it's only a compatible stream if we did not ask for + # an encoding. + if encoding is None: + return stream_encoding is not None + + return False + + def _force_correct_text_reader(text_reader, encoding, errors): + if _is_binary_reader(text_reader, False): + binary_reader = text_reader + else: + # If there is no target encoding set, we need to verify that the + # reader is not actually misconfigured. + if encoding is None and not _stream_is_misconfigured(text_reader): + return text_reader + + if _is_compatible_text_stream(text_reader, encoding, errors): + return text_reader + + # If the reader has no encoding, we try to find the underlying + # binary reader for it. If that fails because the environment is + # misconfigured, we silently go with the same reader because this + # is too common to happen. In that case, mojibake is better than + # exceptions. + binary_reader = _find_binary_reader(text_reader) + if binary_reader is None: + return text_reader + + # At this point, we default the errors to replace instead of strict + # because nobody handles those errors anyways and at this point + # we're so fundamentally fucked that nothing can repair it. + if errors is None: + errors = 'replace' + return _make_text_stream(binary_reader, encoding, errors) + + def _force_correct_text_writer(text_writer, encoding, errors): + if _is_binary_writer(text_writer, False): + binary_writer = text_writer + else: + # If there is no target encoding set, we need to verify that the + # writer is not actually misconfigured. + if encoding is None and not _stream_is_misconfigured(text_writer): + return text_writer + + if _is_compatible_text_stream(text_writer, encoding, errors): + return text_writer + + # If the writer has no encoding, we try to find the underlying + # binary writer for it. If that fails because the environment is + # misconfigured, we silently go with the same writer because this + # is too common to happen. In that case, mojibake is better than + # exceptions. + binary_writer = _find_binary_writer(text_writer) + if binary_writer is None: + return text_writer + + # At this point, we default the errors to replace instead of strict + # because nobody handles those errors anyways and at this point + # we're so fundamentally fucked that nothing can repair it. + if errors is None: + errors = 'replace' + return _make_text_stream(binary_writer, encoding, errors) + + def get_binary_stdin(): + reader = _find_binary_reader(sys.stdin) + if reader is None: + raise RuntimeError('Was not able to determine binary ' + 'stream for sys.stdin.') + return reader + + def get_binary_stdout(): + writer = _find_binary_writer(sys.stdout) + if writer is None: + raise RuntimeError('Was not able to determine binary ' + 'stream for sys.stdout.') + return writer + + def get_binary_stderr(): + writer = _find_binary_writer(sys.stderr) + if writer is None: + raise RuntimeError('Was not able to determine binary ' + 'stream for sys.stderr.') + return writer + + def get_text_stdin(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader(sys.stdin, encoding, errors) + + def get_text_stdout(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stdout, encoding, errors) + + def get_text_stderr(encoding=None, errors=None): + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stderr, encoding, errors) + + def filename_to_ui(value): + if isinstance(value, bytes): + value = value.decode(get_filesystem_encoding(), 'replace') + else: + value = value.encode('utf-8', 'surrogateescape') \ + .decode('utf-8', 'replace') + return value + + +def get_streerror(e, default=None): + if hasattr(e, 'strerror'): + msg = e.strerror + else: + if default is not None: + msg = default + else: + msg = str(e) + if isinstance(msg, bytes): + msg = msg.decode('utf-8', 'replace') + return msg + + +def open_stream(filename, mode='r', encoding=None, errors='strict', + atomic=False): + # Standard streams first. These are simple because they don't need + # special handling for the atomic flag. It's entirely ignored. + if filename == '-': + if 'w' in mode: + if 'b' in mode: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if 'b' in mode: + return get_binary_stdin(), False + return get_text_stdin(encoding=encoding, errors=errors), False + + # Non-atomic writes directly go out through the regular open functions. + if not atomic: + if encoding is None: + return open(filename, mode), True + return io.open(filename, mode, encoding=encoding, errors=errors), True + + # Some usability stuff for atomic writes + if 'a' in mode: + raise ValueError( + 'Appending to an existing file is not supported, because that ' + 'would involve an expensive `copy`-operation to a temporary ' + 'file. Open the file in normal `w`-mode and copy explicitly ' + 'if that\'s what you\'re after.' + ) + if 'x' in mode: + raise ValueError('Use the `overwrite`-parameter instead.') + if 'w' not in mode: + raise ValueError('Atomic writes only make sense with `w`-mode.') + + # Atomic writes are more complicated. They work by opening a file + # as a proxy in the same folder and then using the fdopen + # functionality to wrap it in a Python file. Then we wrap it in an + # atomic file that moves the file over on close. + import tempfile + fd, tmp_filename = tempfile.mkstemp(dir=os.path.dirname(filename), + prefix='.__atomic-write') + + if encoding is not None: + f = io.open(fd, mode, encoding=encoding, errors=errors) + else: + f = os.fdopen(fd, mode) + + return _AtomicFile(f, tmp_filename, filename), True + + +# Used in a destructor call, needs extra protection from interpreter cleanup. +if hasattr(os, 'replace'): + _replace = os.replace + _can_replace = True +else: + _replace = os.rename + _can_replace = not WIN + + +class _AtomicFile(object): + + def __init__(self, f, tmp_filename, real_filename): + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self): + return self._real_filename + + def close(self, delete=False): + if self.closed: + return + self._f.close() + if not _can_replace: + try: + os.remove(self._real_filename) + except OSError: + pass + _replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name): + return getattr(self._f, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close(delete=exc_type is not None) + + def __repr__(self): + return repr(self._f) + + +auto_wrap_for_ansi = None +colorama = None +get_winterm_size = None + + +def strip_ansi(value): + return _ansi_re.sub('', value) + + +def should_strip_ansi(stream=None, color=None): + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) + return not color + + +# If we're on Windows, we provide transparent integration through +# colorama. This will make ANSI colors through the echo function +# work automatically. +if WIN: + # Windows has a smaller terminal + DEFAULT_COLUMNS = 79 + + from ._winconsole import _get_windows_console_stream + + def _get_argv_encoding(): + import locale + return locale.getpreferredencoding() + + if PY2: + def raw_input(prompt=''): + sys.stderr.flush() + if prompt: + stdout = _default_text_stdout() + stdout.write(prompt) + stdin = _default_text_stdin() + return stdin.readline().rstrip('\r\n') + + try: + import colorama + except ImportError: + pass + else: + _ansi_stream_wrappers = WeakKeyDictionary() + + def auto_wrap_for_ansi(stream, color=None): + """This function wraps a stream so that calls through colorama + are issued to the win32 console API to recolor on demand. It + also ensures to reset the colors if a write call is interrupted + to not destroy the console afterwards. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + if cached is not None: + return cached + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = ansi_wrapper.stream + _write = rv.write + + def _safe_write(s): + try: + return _write(s) + except: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + return rv + + def get_winterm_size(): + win = colorama.win32.GetConsoleScreenBufferInfo( + colorama.win32.STDOUT).srWindow + return win.Right - win.Left, win.Bottom - win.Top +else: + def _get_argv_encoding(): + return getattr(sys.stdin, 'encoding', None) or get_filesystem_encoding() + + _get_windows_console_stream = lambda *x: None + + +def term_len(x): + return len(strip_ansi(x)) + + +def isatty(stream): + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func(src_func, wrapper_func): + cache = WeakKeyDictionary() + def func(): + stream = src_func() + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + cache[stream] = rv + except Exception: + pass + return rv + return func + + +_default_text_stdin = _make_cached_stream_func( + lambda: sys.stdin, get_text_stdin) +_default_text_stdout = _make_cached_stream_func( + lambda: sys.stdout, get_text_stdout) +_default_text_stderr = _make_cached_stream_func( + lambda: sys.stderr, get_text_stderr) + + +binary_streams = { + 'stdin': get_binary_stdin, + 'stdout': get_binary_stdout, + 'stderr': get_binary_stderr, +} + +text_streams = { + 'stdin': get_text_stdin, + 'stdout': get_text_stdout, + 'stderr': get_text_stderr, +} diff --git a/app/lib/click/_termui_impl.py b/app/lib/click/_termui_impl.py new file mode 100644 index 0000000..7cfd3d5 --- /dev/null +++ b/app/lib/click/_termui_impl.py @@ -0,0 +1,547 @@ +""" + click._termui_impl + ~~~~~~~~~~~~~~~~~~ + + This module contains implementations for the termui module. To keep the + import time of Click down, some infrequently used functionality is placed + in this module and only imported as needed. + + :copyright: (c) 2014 by Armin Ronacher. + :license: BSD, see LICENSE for more details. +""" +import os +import sys +import time +import math +from ._compat import _default_text_stdout, range_type, PY2, isatty, \ + open_stream, strip_ansi, term_len, get_best_encoding, WIN +from .utils import echo +from .exceptions import ClickException + + +if os.name == 'nt': + BEFORE_BAR = '\r' + AFTER_BAR = '\n' +else: + BEFORE_BAR = '\r\033[?25l' + AFTER_BAR = '\033[?25h\n' + + +def _length_hint(obj): + """Returns the length hint of an object.""" + try: + return len(obj) + except (AttributeError, TypeError): + try: + get_hint = type(obj).__length_hint__ + except AttributeError: + return None + try: + hint = get_hint(obj) + except TypeError: + return None + if hint is NotImplemented or \ + not isinstance(hint, (int, long)) or \ + hint < 0: + return None + return hint + + +class ProgressBar(object): + + def __init__(self, iterable, length=None, fill_char='#', empty_char=' ', + bar_template='%(bar)s', info_sep=' ', show_eta=True, + show_percent=None, show_pos=False, item_show_func=None, + label=None, file=None, color=None, width=30): + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label = label or '' + if file is None: + file = _default_text_stdout() + self.file = file + self.color = color + self.width = width + self.autowidth = width == 0 + + if length is None: + length = _length_hint(iterable) + if iterable is None: + if length is None: + raise TypeError('iterable or length is required') + iterable = range_type(length) + self.iter = iter(iterable) + self.length = length + self.length_known = length is not None + self.pos = 0 + self.avg = [] + self.start = self.last_eta = time.time() + self.eta_known = False + self.finished = False + self.max_width = None + self.entered = False + self.current_item = None + self.is_hidden = not isatty(self.file) + self._last_line = None + + def __enter__(self): + self.entered = True + self.render_progress() + return self + + def __exit__(self, exc_type, exc_value, tb): + self.render_finish() + + def __iter__(self): + if not self.entered: + raise RuntimeError('You need to use progress bars in a with block.') + self.render_progress() + return self + + def render_finish(self): + if self.is_hidden: + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self): + if self.finished: + return 1.0 + return min(self.pos / (float(self.length) or 1), 1.0) + + @property + def time_per_iteration(self): + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self): + if self.length_known and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self): + if self.eta_known: + t = self.eta + 1 + seconds = t % 60 + t /= 60 + minutes = t % 60 + t /= 60 + hours = t % 24 + t /= 24 + if t > 0: + days = t + return '%dd %02d:%02d:%02d' % (days, hours, minutes, seconds) + else: + return '%02d:%02d:%02d' % (hours, minutes, seconds) + return '' + + def format_pos(self): + pos = str(self.pos) + if self.length_known: + pos += '/%s' % self.length + return pos + + def format_pct(self): + return ('% 4d%%' % int(self.pct * 100))[1:] + + def format_progress_line(self): + show_percent = self.show_percent + + info_bits = [] + if self.length_known: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + if show_percent is None: + show_percent = not self.show_pos + else: + if self.finished: + bar = self.fill_char * self.width + else: + bar = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + bar[int((math.cos(self.pos * self.time_per_iteration) + / 2.0 + 0.5) * self.width)] = self.fill_char + bar = ''.join(bar) + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return (self.bar_template % { + 'label': self.label, + 'bar': bar, + 'info': self.info_sep.join(info_bits) + }).rstrip() + + def render_progress(self): + from .termui import get_terminal_size + nl = False + + if self.is_hidden: + buf = [self.label] + nl = True + else: + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, get_terminal_size()[0] - clutter_length) + if new_width < old_width: + buf.append(BEFORE_BAR) + buf.append(' ' * self.max_width) + self.max_width = new_width + self.width = new_width + + clear_width = self.width + if self.max_width is not None: + clear_width = self.max_width + + buf.append(BEFORE_BAR) + line = self.format_progress_line() + line_len = term_len(line) + if self.max_width is None or self.max_width < line_len: + self.max_width = line_len + buf.append(line) + + buf.append(' ' * (clear_width - line_len)) + line = ''.join(buf) + + # Render the line only if it changed. + if line != self._last_line: + self._last_line = line + echo(line, file=self.file, color=self.color, nl=nl) + self.file.flush() + + def make_step(self, n_steps): + self.pos += n_steps + if self.length_known and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + self.avg = self.avg[-6:] + [-(self.start - time.time()) / (self.pos)] + + self.eta_known = self.length_known + + def update(self, n_steps): + self.make_step(n_steps) + self.render_progress() + + def finish(self): + self.eta_known = 0 + self.current_item = None + self.finished = True + + def next(self): + if self.is_hidden: + return next(self.iter) + try: + rv = next(self.iter) + self.current_item = rv + except StopIteration: + self.finish() + self.render_progress() + raise StopIteration() + else: + self.update(1) + return rv + + if not PY2: + __next__ = next + del next + + +def pager(text, color=None): + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, text, color) + pager_cmd = (os.environ.get('PAGER', None) or '').strip() + if pager_cmd: + if WIN: + return _tempfilepager(text, pager_cmd, color) + return _pipepager(text, pager_cmd, color) + if os.environ.get('TERM') in ('dumb', 'emacs'): + return _nullpager(stdout, text, color) + if WIN or sys.platform.startswith('os2'): + return _tempfilepager(text, 'more <', color) + if hasattr(os, 'system') and os.system('(less) 2>/dev/null') == 0: + return _pipepager(text, 'less', color) + + import tempfile + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if hasattr(os, 'system') and os.system('more "%s"' % filename) == 0: + return _pipepager(text, 'more', color) + return _nullpager(stdout, text, color) + finally: + os.unlink(filename) + + +def _pipepager(text, cmd, color): + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + """ + import subprocess + env = dict(os.environ) + + # If we're piping to less we might support colors under the + # condition that + cmd_detail = cmd.rsplit('/', 1)[-1].split() + if color is None and cmd_detail[0] == 'less': + less_flags = os.environ.get('LESS', '') + ' '.join(cmd_detail[1:]) + if not less_flags: + env['LESS'] = '-R' + color = True + elif 'r' in less_flags or 'R' in less_flags: + color = True + + if not color: + text = strip_ansi(text) + + c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, + env=env) + encoding = get_best_encoding(c.stdin) + try: + c.stdin.write(text.encode(encoding, 'replace')) + c.stdin.close() + except (IOError, KeyboardInterrupt): + pass + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + +def _tempfilepager(text, cmd, color): + """Page through text by invoking a program on a temporary file.""" + import tempfile + filename = tempfile.mktemp() + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, 'wb')[0] as f: + f.write(text.encode(encoding)) + try: + os.system(cmd + ' "' + filename + '"') + finally: + os.unlink(filename) + + +def _nullpager(stream, text, color): + """Simply print unformatted text. This is the ultimate fallback.""" + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor(object): + + def __init__(self, editor=None, env=None, require_save=True, + extension='.txt'): + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self): + if self.editor is not None: + return self.editor + for key in 'VISUAL', 'EDITOR': + rv = os.environ.get(key) + if rv: + return rv + if WIN: + return 'notepad' + for editor in 'vim', 'nano': + if os.system('which %s >/dev/null 2>&1' % editor) == 0: + return editor + return 'vi' + + def edit_file(self, filename): + import subprocess + editor = self.get_editor() + if self.env: + environ = os.environ.copy() + environ.update(self.env) + else: + environ = None + try: + c = subprocess.Popen('%s "%s"' % (editor, filename), + env=environ, shell=True) + exit_code = c.wait() + if exit_code != 0: + raise ClickException('%s: Editing failed!' % editor) + except OSError as e: + raise ClickException('%s: Editing failed: %s' % (editor, e)) + + def edit(self, text): + import tempfile + + text = text or '' + if text and not text.endswith('\n'): + text += '\n' + + fd, name = tempfile.mkstemp(prefix='editor-', suffix=self.extension) + try: + if WIN: + encoding = 'utf-8-sig' + text = text.replace('\n', '\r\n') + else: + encoding = 'utf-8' + text = text.encode(encoding) + + f = os.fdopen(fd, 'wb') + f.write(text) + f.close() + timestamp = os.path.getmtime(name) + + self.edit_file(name) + + if self.require_save \ + and os.path.getmtime(name) == timestamp: + return None + + f = open(name, 'rb') + try: + rv = f.read() + finally: + f.close() + return rv.decode('utf-8-sig').replace('\r\n', '\n') + finally: + os.unlink(name) + + +def open_url(url, wait=False, locate=False): + import subprocess + + def _unquote_file(url): + try: + import urllib + except ImportError: + import urllib + if url.startswith('file://'): + url = urllib.unquote(url[7:]) + return url + + if sys.platform == 'darwin': + args = ['open'] + if wait: + args.append('-W') + if locate: + args.append('-R') + args.append(_unquote_file(url)) + null = open('/dev/null', 'w') + try: + return subprocess.Popen(args, stderr=null).wait() + finally: + null.close() + elif WIN: + if locate: + url = _unquote_file(url) + args = 'explorer /select,"%s"' % _unquote_file( + url.replace('"', '')) + else: + args = 'start %s "" "%s"' % ( + wait and '/WAIT' or '', url.replace('"', '')) + return os.system(args) + + try: + if locate: + url = os.path.dirname(_unquote_file(url)) or '.' + else: + url = _unquote_file(url) + c = subprocess.Popen(['xdg-open', url]) + if wait: + return c.wait() + return 0 + except OSError: + if url.startswith(('http://', 'https://')) and not locate and not wait: + import webbrowser + webbrowser.open(url) + return 0 + return 1 + + +def _translate_ch_to_exc(ch): + if ch == '\x03': + raise KeyboardInterrupt() + if ch == '\x04': + raise EOFError() + + +if WIN: + import msvcrt + + def getchar(echo): + rv = msvcrt.getch() + if echo: + msvcrt.putchar(rv) + _translate_ch_to_exc(rv) + if PY2: + enc = getattr(sys.stdin, 'encoding', None) + if enc is not None: + rv = rv.decode(enc, 'replace') + else: + rv = rv.decode('cp1252', 'replace') + return rv +else: + import tty + import termios + + def getchar(echo): + if not isatty(sys.stdin): + f = open('/dev/tty') + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + try: + old_settings = termios.tcgetattr(fd) + try: + tty.setraw(fd) + ch = os.read(fd, 32) + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + if f is not None: + f.close() + except termios.error: + pass + _translate_ch_to_exc(ch) + return ch.decode(get_best_encoding(sys.stdin), 'replace') diff --git a/app/lib/click/_textwrap.py b/app/lib/click/_textwrap.py new file mode 100644 index 0000000..7e77603 --- /dev/null +++ b/app/lib/click/_textwrap.py @@ -0,0 +1,38 @@ +import textwrap +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + + def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width): + space_left = max(width - cur_len, 1) + + if self.break_long_words: + last = reversed_chunks[-1] + cut = last[:space_left] + res = last[space_left:] + cur_line.append(cut) + reversed_chunks[-1] = res + elif not cur_line: + cur_line.append(reversed_chunks.pop()) + + @contextmanager + def extra_indent(self, indent): + old_initial_indent = self.initial_indent + old_subsequent_indent = self.subsequent_indent + self.initial_indent += indent + self.subsequent_indent += indent + try: + yield + finally: + self.initial_indent = old_initial_indent + self.subsequent_indent = old_subsequent_indent + + def indent_only(self, text): + rv = [] + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + if idx > 0: + indent = self.subsequent_indent + rv.append(indent + line) + return '\n'.join(rv) diff --git a/app/lib/click/_unicodefun.py b/app/lib/click/_unicodefun.py new file mode 100644 index 0000000..9e17a38 --- /dev/null +++ b/app/lib/click/_unicodefun.py @@ -0,0 +1,118 @@ +import os +import sys +import codecs + +from ._compat import PY2 + + +# If someone wants to vendor click, we want to ensure the +# correct package is discovered. Ideally we could use a +# relative import here but unfortunately Python does not +# support that. +click = sys.modules[__name__.rsplit('.', 1)[0]] + + +def _find_unicode_literals_frame(): + import __future__ + frm = sys._getframe(1) + idx = 1 + while frm is not None: + if frm.f_globals.get('__name__', '').startswith('click.'): + frm = frm.f_back + idx += 1 + elif frm.f_code.co_flags & __future__.unicode_literals.compiler_flag: + return idx + else: + break + return 0 + + +def _check_for_unicode_literals(): + if not __debug__: + return + if not PY2 or click.disable_unicode_literals_warning: + return + bad_frame = _find_unicode_literals_frame() + if bad_frame <= 0: + return + from warnings import warn + warn(Warning('Click detected the use of the unicode_literals ' + '__future__ import. This is heavily discouraged ' + 'because it can introduce subtle bugs in your ' + 'code. You should instead use explicit u"" literals ' + 'for your unicode strings. For more information see ' + 'http://click.pocoo.org/python3/'), + stacklevel=bad_frame) + + +def _verify_python3_env(): + """Ensures that the environment is good for unicode on Python 3.""" + if PY2: + return + try: + import locale + fs_enc = codecs.lookup(locale.getpreferredencoding()).name + except Exception: + fs_enc = 'ascii' + if fs_enc != 'ascii': + return + + extra = '' + if os.name == 'posix': + import subprocess + rv = subprocess.Popen(['locale', '-a'], stdout=subprocess.PIPE, + stderr=subprocess.PIPE).communicate()[0] + good_locales = set() + has_c_utf8 = False + + # Make sure we're operating on text here. + if isinstance(rv, bytes): + rv = rv.decode('ascii', 'replace') + + for line in rv.splitlines(): + locale = line.strip() + if locale.lower().endswith(('.utf-8', '.utf8')): + good_locales.add(locale) + if locale.lower() in ('c.utf8', 'c.utf-8'): + has_c_utf8 = True + + extra += '\n\n' + if not good_locales: + extra += ( + 'Additional information: on this system no suitable UTF-8\n' + 'locales were discovered. This most likely requires resolving\n' + 'by reconfiguring the locale system.' + ) + elif has_c_utf8: + extra += ( + 'This system supports the C.UTF-8 locale which is recommended.\n' + 'You might be able to resolve your issue by exporting the\n' + 'following environment variables:\n\n' + ' export LC_ALL=C.UTF-8\n' + ' export LANG=C.UTF-8' + ) + else: + extra += ( + 'This system lists a couple of UTF-8 supporting locales that\n' + 'you can pick from. The following suitable locales where\n' + 'discovered: %s' + ) % ', '.join(sorted(good_locales)) + + bad_locale = None + for locale in os.environ.get('LC_ALL'), os.environ.get('LANG'): + if locale and locale.lower().endswith(('.utf-8', '.utf8')): + bad_locale = locale + if locale is not None: + break + if bad_locale is not None: + extra += ( + '\n\nClick discovered that you exported a UTF-8 locale\n' + 'but the locale system could not pick up from it because\n' + 'it does not exist. The exported locale is "%s" but it\n' + 'is not supported' + ) % bad_locale + + raise RuntimeError('Click will abort further execution because Python 3 ' + 'was configured to use ASCII as encoding for the ' + 'environment. Consult http://click.pocoo.org/python3/' + 'for mitigation steps.' + extra) diff --git a/app/lib/click/_winconsole.py b/app/lib/click/_winconsole.py new file mode 100644 index 0000000..9aed942 --- /dev/null +++ b/app/lib/click/_winconsole.py @@ -0,0 +1,273 @@ +# -*- coding: utf-8 -*- +# This module is based on the excellent work by Adam Bartoš who +# provided a lot of what went into the implementation here in +# the discussion to issue1602 in the Python bug tracker. +# +# There are some general differences in regards to how this works +# compared to the original patches as we do not need to patch +# the entire interpreter but just work in our little world of +# echo and prmopt. + +import io +import os +import sys +import zlib +import time +import ctypes +import msvcrt +from click._compat import _NonClosingTextIOWrapper, text_type, PY2 +from ctypes import byref, POINTER, c_int, c_char, c_char_p, \ + c_void_p, py_object, c_ssize_t, c_ulong, windll, WINFUNCTYPE +try: + from ctypes import pythonapi + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release +except ImportError: + pythonapi = None +from ctypes.wintypes import LPWSTR, LPCWSTR + + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)( + ('GetCommandLineW', windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE( + POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ('CommandLineToArgvW', windll.shell32)) + + +STDIN_HANDLE = GetStdHandle(-10) +STDOUT_HANDLE = GetStdHandle(-11) +STDERR_HANDLE = GetStdHandle(-12) + + +PyBUF_SIMPLE = 0 +PyBUF_WRITABLE = 1 + +ERROR_SUCCESS = 0 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_OPERATION_ABORTED = 995 + +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 + +EOF = b'\x1a' +MAX_BYTES_WRITTEN = 32767 + + +class Py_buffer(ctypes.Structure): + _fields_ = [ + ('buf', c_void_p), + ('obj', py_object), + ('len', c_ssize_t), + ('itemsize', c_ssize_t), + ('readonly', c_int), + ('ndim', c_int), + ('format', c_char_p), + ('shape', c_ssize_p), + ('strides', c_ssize_p), + ('suboffsets', c_ssize_p), + ('internal', c_void_p) + ] + + if PY2: + _fields_.insert(-1, ('smalltable', c_ssize_t * 2)) + + +# On PyPy we cannot get buffers so our ability to operate here is +# serverly limited. +if pythonapi is None: + get_buffer = None +else: + def get_buffer(obj, writable=False): + buf = Py_buffer() + flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + try: + buffer_type = c_char * buf.len + return buffer_type.from_address(buf.buf) + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + + def __init__(self, handle): + self.handle = handle + + def isatty(self): + io.RawIOBase.isatty(self) + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + + def readable(self): + return True + + def readinto(self, b): + bytes_to_be_read = len(b) + if not bytes_to_be_read: + return 0 + elif bytes_to_be_read % 2: + raise ValueError('cannot read odd number of bytes from ' + 'UTF-16-LE encoded console') + + buffer = get_buffer(b, writable=True) + code_units_to_be_read = bytes_to_be_read // 2 + code_units_read = c_ulong() + + rv = ReadConsoleW(self.handle, buffer, code_units_to_be_read, + byref(code_units_read), None) + if GetLastError() == ERROR_OPERATION_ABORTED: + # wait for KeyboardInterrupt + time.sleep(0.1) + if not rv: + raise OSError('Windows error: %s' % GetLastError()) + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + + def writable(self): + return True + + @staticmethod + def _get_error_message(errno): + if errno == ERROR_SUCCESS: + return 'ERROR_SUCCESS' + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return 'ERROR_NOT_ENOUGH_MEMORY' + return 'Windows error %s' % errno + + def write(self, b): + bytes_to_be_written = len(b) + buf = get_buffer(b) + code_units_to_be_written = min(bytes_to_be_written, + MAX_BYTES_WRITTEN) // 2 + code_units_written = c_ulong() + + WriteConsoleW(self.handle, buf, code_units_to_be_written, + byref(code_units_written), None) + bytes_written = 2 * code_units_written.value + + if bytes_written == 0 and bytes_to_be_written > 0: + raise OSError(self._get_error_message(GetLastError())) + return bytes_written + + +class ConsoleStream(object): + + def __init__(self, text_stream, byte_stream): + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self): + return self.buffer.name + + def write(self, x): + if isinstance(x, text_type): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines): + for line in lines: + self.write(line) + + def __getattr__(self, name): + return getattr(self._text_stream, name) + + def isatty(self): + return self.buffer.isatty() + + def __repr__(self): + return '' % ( + self.name, + self.encoding, + ) + + +def _get_text_stdin(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stdout(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + _WindowsConsoleWriter(STDOUT_HANDLE), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +def _get_text_stderr(buffer_stream): + text_stream = _NonClosingTextIOWrapper( + _WindowsConsoleWriter(STDERR_HANDLE), + 'utf-16-le', 'strict', line_buffering=True) + return ConsoleStream(text_stream, buffer_stream) + + +if PY2: + def _hash_py_argv(): + return zlib.crc32('\x00'.join(sys.argv[1:])) + + _initial_argv_hash = _hash_py_argv() + + def _get_windows_argv(): + argc = c_int(0) + argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc)) + argv = [argv_unicode[i] for i in range(0, argc.value)] + + if not hasattr(sys, 'frozen'): + argv = argv[1:] + while len(argv) > 0: + arg = argv[0] + if not arg.startswith('-') or arg == '-': + break + argv = argv[1:] + if arg.startswith(('-c', '-m')): + break + + return argv[1:] + + +_stream_factories = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _get_windows_console_stream(f, encoding, errors): + if get_buffer is not None and \ + encoding in ('utf-16-le', None) \ + and errors in ('strict', None) and \ + hasattr(f, 'isatty') and f.isatty(): + func = _stream_factories.get(f.fileno()) + if func is not None: + if not PY2: + f = getattr(f, 'buffer') + if f is None: + return None + else: + # If we are on Python 2 we need to set the stream that we + # deal with to binary mode as otherwise the exercise if a + # bit moot. The same problems apply as for + # get_binary_stdin and friends from _compat. + msvcrt.setmode(f.fileno(), os.O_BINARY) + return func(f) diff --git a/app/lib/click/core.py b/app/lib/click/core.py new file mode 100644 index 0000000..7456451 --- /dev/null +++ b/app/lib/click/core.py @@ -0,0 +1,1744 @@ +import errno +import os +import sys +from contextlib import contextmanager +from itertools import repeat +from functools import update_wrapper + +from .types import convert_type, IntRange, BOOL +from .utils import make_str, make_default_short_help, echo, get_os_args +from .exceptions import ClickException, UsageError, BadParameter, Abort, \ + MissingParameter +from .termui import prompt, confirm +from .formatting import HelpFormatter, join_options +from .parser import OptionParser, split_opt +from .globals import push_context, pop_context + +from ._compat import PY2, isidentifier, iteritems +from ._unicodefun import _check_for_unicode_literals, _verify_python3_env + + +_missing = object() + + +SUBCOMMAND_METAVAR = 'COMMAND [ARGS]...' +SUBCOMMANDS_METAVAR = 'COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...' + + +def _bashcomplete(cmd, prog_name, complete_var=None): + """Internal handler for the bash completion support.""" + if complete_var is None: + complete_var = '_%s_COMPLETE' % (prog_name.replace('-', '_')).upper() + complete_instr = os.environ.get(complete_var) + if not complete_instr: + return + + from ._bashcomplete import bashcomplete + if bashcomplete(cmd, prog_name, complete_var, complete_instr): + sys.exit(1) + + +def _check_multicommand(base_command, cmd_name, cmd, register=False): + if not base_command.chain or not isinstance(cmd, MultiCommand): + return + if register: + hint = 'It is not possible to add multi commands as children to ' \ + 'another multi command that is in chain mode' + else: + hint = 'Found a multi command as subcommand to a multi command ' \ + 'that is in chain mode. This is not supported' + raise RuntimeError('%s. Command "%s" is set to chain and "%s" was ' + 'added as subcommand but it in itself is a ' + 'multi command. ("%s" is a %s within a chained ' + '%s named "%s"). This restriction was supposed to ' + 'be lifted in 6.0 but the fix was flawed. This ' + 'will be fixed in Click 7.0' % ( + hint, base_command.name, cmd_name, + cmd_name, cmd.__class__.__name__, + base_command.__class__.__name__, + base_command.name)) + + +def batch(iterable, batch_size): + return list(zip(*repeat(iter(iterable), batch_size))) + + +def invoke_param_callback(callback, ctx, param, value): + code = getattr(callback, '__code__', None) + args = getattr(code, 'co_argcount', 3) + + if args < 3: + # This will become a warning in Click 3.0: + from warnings import warn + warn(Warning('Invoked legacy parameter callback "%s". The new ' + 'signature for such callbacks starting with ' + 'click 2.0 is (ctx, param, value).' + % callback), stacklevel=3) + return callback(ctx, value) + return callback(ctx, param, value) + + +@contextmanager +def augment_usage_errors(ctx, param=None): + """Context manager that attaches extra information to exceptions that + fly. + """ + try: + yield + except BadParameter as e: + if e.ctx is None: + e.ctx = ctx + if param is not None and e.param is None: + e.param = param + raise + except UsageError as e: + if e.ctx is None: + e.ctx = ctx + raise + + +def iter_params_for_processing(invocation_order, declaration_order): + """Given a sequence of parameters in the order as should be considered + for processing and an iterable of parameters that exist, this returns + a list in the correct order as they should be processed. + """ + def sort_key(item): + try: + idx = invocation_order.index(item) + except ValueError: + idx = float('inf') + return (not item.is_eager, idx) + + return sorted(declaration_order, key=sort_key) + + +class Context(object): + """The context is a special internal object that holds state relevant + for the script execution at every single level. It's normally invisible + to commands unless they opt-in to getting access to it. + + The context is useful as it can pass internal objects around and can + control special execution features such as reading data from + environment variables. + + A context can be used as context manager in which case it will call + :meth:`close` on teardown. + + .. versionadded:: 2.0 + Added the `resilient_parsing`, `help_option_names`, + `token_normalize_func` parameters. + + .. versionadded:: 3.0 + Added the `allow_extra_args` and `allow_interspersed_args` + parameters. + + .. versionadded:: 4.0 + Added the `color`, `ignore_unknown_options`, and + `max_content_width` parameters. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + """ + + def __init__(self, command, parent=None, info_name=None, obj=None, + auto_envvar_prefix=None, default_map=None, + terminal_width=None, max_content_width=None, + resilient_parsing=False, allow_extra_args=None, + allow_interspersed_args=None, + ignore_unknown_options=None, help_option_names=None, + token_normalize_func=None, color=None): + #: the parent context or `None` if none exists. + self.parent = parent + #: the :class:`Command` for this context. + self.command = command + #: the descriptive information name + self.info_name = info_name + #: the parsed parameters except if the value is hidden in which + #: case it's not remembered. + self.params = {} + #: the leftover arguments. + self.args = [] + #: protected arguments. These are arguments that are prepended + #: to `args` when certain parsing scenarios are encountered but + #: must be never propagated to another arguments. This is used + #: to implement nested parsing. + self.protected_args = [] + if obj is None and parent is not None: + obj = parent.obj + #: the user object stored. + self.obj = obj + self._meta = getattr(parent, 'meta', {}) + + #: A dictionary (-like object) with defaults for parameters. + if default_map is None \ + and parent is not None \ + and parent.default_map is not None: + default_map = parent.default_map.get(info_name) + self.default_map = default_map + + #: This flag indicates if a subcommand is going to be executed. A + #: group callback can use this information to figure out if it's + #: being executed directly or because the execution flow passes + #: onwards to a subcommand. By default it's None, but it can be + #: the name of the subcommand to execute. + #: + #: If chaining is enabled this will be set to ``'*'`` in case + #: any commands are executed. It is however not possible to + #: figure out which ones. If you require this knowledge you + #: should use a :func:`resultcallback`. + self.invoked_subcommand = None + + if terminal_width is None and parent is not None: + terminal_width = parent.terminal_width + #: The width of the terminal (None is autodetection). + self.terminal_width = terminal_width + + if max_content_width is None and parent is not None: + max_content_width = parent.max_content_width + #: The maximum width of formatted content (None implies a sensible + #: default which is 80 for most things). + self.max_content_width = max_content_width + + if allow_extra_args is None: + allow_extra_args = command.allow_extra_args + #: Indicates if the context allows extra args or if it should + #: fail on parsing. + #: + #: .. versionadded:: 3.0 + self.allow_extra_args = allow_extra_args + + if allow_interspersed_args is None: + allow_interspersed_args = command.allow_interspersed_args + #: Indicates if the context allows mixing of arguments and + #: options or not. + #: + #: .. versionadded:: 3.0 + self.allow_interspersed_args = allow_interspersed_args + + if ignore_unknown_options is None: + ignore_unknown_options = command.ignore_unknown_options + #: Instructs click to ignore options that a command does not + #: understand and will store it on the context for later + #: processing. This is primarily useful for situations where you + #: want to call into external programs. Generally this pattern is + #: strongly discouraged because it's not possibly to losslessly + #: forward all arguments. + #: + #: .. versionadded:: 4.0 + self.ignore_unknown_options = ignore_unknown_options + + if help_option_names is None: + if parent is not None: + help_option_names = parent.help_option_names + else: + help_option_names = ['--help'] + + #: The names for the help options. + self.help_option_names = help_option_names + + if token_normalize_func is None and parent is not None: + token_normalize_func = parent.token_normalize_func + + #: An optional normalization function for tokens. This is + #: options, choices, commands etc. + self.token_normalize_func = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures. + self.resilient_parsing = resilient_parsing + + # If there is no envvar prefix yet, but the parent has one and + # the command on this level has a name, we can expand the envvar + # prefix automatically. + if auto_envvar_prefix is None: + if parent is not None \ + and parent.auto_envvar_prefix is not None and \ + self.info_name is not None: + auto_envvar_prefix = '%s_%s' % (parent.auto_envvar_prefix, + self.info_name.upper()) + else: + self.auto_envvar_prefix = auto_envvar_prefix.upper() + self.auto_envvar_prefix = auto_envvar_prefix + + if color is None and parent is not None: + color = parent.color + + #: Controls if styling output is wanted or not. + self.color = color + + self._close_callbacks = [] + self._depth = 0 + + def __enter__(self): + self._depth += 1 + push_context(self) + return self + + def __exit__(self, exc_type, exc_value, tb): + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup=True): + """This helper method can be used with the context object to promote + it to the current thread local (see :func:`get_current_context`). + The default behavior of this is to invoke the cleanup functions which + can be disabled by setting `cleanup` to `False`. The cleanup + functions are typically used for things such as closing file handles. + + If the cleanup is intended the context object can also be directly + used as a context manager. + + Example usage:: + + with ctx.scope(): + assert get_current_context() is ctx + + This is equivalent:: + + with ctx: + assert get_current_context() is ctx + + .. versionadded:: 5.0 + + :param cleanup: controls if the cleanup functions should be run or + not. The default is to run these functions. In + some situations the context only wants to be + temporarily pushed in which case this can be disabled. + Nested pushes automatically defer the cleanup. + """ + if not cleanup: + self._depth += 1 + try: + with self as rv: + yield rv + finally: + if not cleanup: + self._depth -= 1 + + @property + def meta(self): + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utiltiies can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = __name__ + '.lang' + + def set_language(value): + ctx = get_current_context() + ctx.meta[LANG_KEY] = value + + def get_language(): + return get_current_context().meta.get(LANG_KEY, 'en_US') + + .. versionadded:: 5.0 + """ + return self._meta + + def make_formatter(self): + """Creates the formatter for the help and usage output.""" + return HelpFormatter(width=self.terminal_width, + max_width=self.max_content_width) + + def call_on_close(self, f): + """This decorator remembers a function as callback that should be + executed when the context tears down. This is most useful to bind + resource handling to the script execution. For instance, file objects + opened by the :class:`File` type will register their close callbacks + here. + + :param f: the function to execute on teardown. + """ + self._close_callbacks.append(f) + return f + + def close(self): + """Invokes all close callbacks.""" + for cb in self._close_callbacks: + cb() + self._close_callbacks = [] + + @property + def command_path(self): + """The computed command path. This is used for the ``usage`` + information on the help page. It's automatically created by + combining the info names of the chain of contexts to the root. + """ + rv = '' + if self.info_name is not None: + rv = self.info_name + if self.parent is not None: + rv = self.parent.command_path + ' ' + rv + return rv.lstrip() + + def find_root(self): + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type): + """Finds the closest object of a given type.""" + node = self + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + node = node.parent + + def ensure_object(self, object_type): + """Like :meth:`find_object` but sets the innermost object to a + new instance of `object_type` if it does not exist. + """ + rv = self.find_object(object_type) + if rv is None: + self.obj = rv = object_type() + return rv + + def lookup_default(self, name): + """Looks up the default for a parameter name. This by default + looks into the :attr:`default_map` if available. + """ + if self.default_map is not None: + rv = self.default_map.get(name) + if callable(rv): + rv = rv() + return rv + + def fail(self, message): + """Aborts the execution of the program with a specific error + message. + + :param message: the error message to fail with. + """ + raise UsageError(message, self) + + def abort(self): + """Aborts the script.""" + raise Abort() + + def exit(self, code=0): + """Exits the application with a given exit code.""" + sys.exit(code) + + def get_usage(self): + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self): + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def invoke(*args, **kwargs): + """Invokes a command callback in exactly the way it expects. There + are two ways to invoke this method: + + 1. the first argument can be a callback and all other arguments and + keyword arguments are forwarded directly to the function. + 2. the first argument is a click command object. In that case all + arguments are forwarded as well but proper click parameters + (options and click arguments) must be keyword arguments and Click + will fill in defaults. + + Note that before Click 3.2 keyword arguments were not properly filled + in against the intention of this code and no context was created. For + more information about this change and why it was done in a bugfix + release see :ref:`upgrade-to-3.2`. + """ + self, callback = args[:2] + ctx = self + + # It's also possible to invoke another command which might or + # might not have a callback. In that case we also fill + # in defaults and make a new context for this command. + if isinstance(callback, Command): + other_cmd = callback + callback = other_cmd.callback + ctx = Context(other_cmd, info_name=other_cmd.name, parent=self) + if callback is None: + raise TypeError('The given command does not have a ' + 'callback that can be invoked.') + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.get_default(ctx) + + args = args[2:] + with augment_usage_errors(self): + with ctx: + return callback(*args, **kwargs) + + def forward(*args, **kwargs): + """Similar to :meth:`invoke` but fills in default keyword + arguments from the current context if the other command expects + it. This cannot invoke callbacks directly, only other commands. + """ + self, cmd = args[:2] + + # It's also possible to invoke another command which might or + # might not have a callback. + if not isinstance(cmd, Command): + raise TypeError('Callback is not a command.') + + for param in self.params: + if param not in kwargs: + kwargs[param] = self.params[param] + + return self.invoke(cmd, **kwargs) + + +class BaseCommand(object): + """The base command implements the minimal API contract of commands. + Most code will never use this as it does not implement a lot of useful + functionality but it can act as the direct subclass of alternative + parsing methods that do not depend on the Click parser. + + For instance, this can be used to bridge Click and other systems like + argparse or docopt. + + Because base commands do not implement a lot of the API that other + parts of Click take for granted, they are not supported for all + operations. For instance, they cannot be used with the decorators + usually and they have no built-in callback system. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + """ + #: the default for the :attr:`Context.allow_extra_args` flag. + allow_extra_args = False + #: the default for the :attr:`Context.allow_interspersed_args` flag. + allow_interspersed_args = True + #: the default for the :attr:`Context.ignore_unknown_options` flag. + ignore_unknown_options = False + + def __init__(self, name, context_settings=None): + #: the name the command thinks it has. Upon registering a command + #: on a :class:`Group` the group will default the command name + #: with this information. You should instead use the + #: :class:`Context`\'s :attr:`~Context.info_name` attribute. + self.name = name + if context_settings is None: + context_settings = {} + #: an optional dictionary with defaults passed to the context. + self.context_settings = context_settings + + def get_usage(self, ctx): + raise NotImplementedError('Base commands cannot get usage') + + def get_help(self, ctx): + raise NotImplementedError('Base commands cannot get help') + + def make_context(self, info_name, args, parent=None, **extra): + """This function when given an info name and arguments will kick + off the parsing and create a new :class:`Context`. It does not + invoke the actual command callback though. + + :param info_name: the info name for this invokation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it's usually + the name of the script, for commands below it it's + the name of the script. + :param args: the arguments to parse as list of strings. + :param parent: the parent context if available. + :param extra: extra keyword arguments forwarded to the context + constructor. + """ + for key, value in iteritems(self.context_settings): + if key not in extra: + extra[key] = value + ctx = Context(self, info_name=info_name, parent=parent, **extra) + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx, args): + """Given a context and a list of arguments this creates the parser + and parses the arguments, then modifies the context as necessary. + This is automatically invoked by :meth:`make_context`. + """ + raise NotImplementedError('Base commands do not know how to parse ' + 'arguments.') + + def invoke(self, ctx): + """Given a context, this invokes the command. The default + implementation is raising a not implemented error. + """ + raise NotImplementedError('Base commands are not invokable by default') + + def main(self, args=None, prog_name=None, complete_var=None, + standalone_mode=True, **extra): + """This is the way to invoke a script with all the bells and + whistles as a command line application. This will always terminate + the application after a call. If this is not wanted, ``SystemExit`` + needs to be caught. + + This method is also available by directly calling the instance of + a :class:`Command`. + + .. versionadded:: 3.0 + Added the `standalone_mode` flag to control the standalone mode. + + :param args: the arguments that should be used for parsing. If not + provided, ``sys.argv[1:]`` is used. + :param prog_name: the program name that should be used. By default + the program name is constructed by taking the file + name from ``sys.argv[0]``. + :param complete_var: the environment variable that controls the + bash completion support. The default is + ``"__COMPLETE"`` with prog name in + uppercase. + :param standalone_mode: the default behavior is to invoke the script + in standalone mode. Click will then + handle exceptions and convert them into + error messages and the function will never + return but shut down the interpreter. If + this is set to `False` they will be + propagated to the caller and the return + value of this function is the return value + of :meth:`invoke`. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + """ + # If we are in Python 3, we will verify that the environment is + # sane at this point of reject further execution to avoid a + # broken script. + if not PY2: + _verify_python3_env() + else: + _check_for_unicode_literals() + + if args is None: + args = get_os_args() + else: + args = list(args) + + if prog_name is None: + prog_name = make_str(os.path.basename( + sys.argv and sys.argv[0] or __file__)) + + # Hook for the Bash completion. This only activates if the Bash + # completion is actually enabled, otherwise this is quite a fast + # noop. + _bashcomplete(self, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + ctx.exit() + except (EOFError, KeyboardInterrupt): + echo(file=sys.stderr) + raise Abort() + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except IOError as e: + if e.errno == errno.EPIPE: + sys.exit(1) + else: + raise + except Abort: + if not standalone_mode: + raise + echo('Aborted!', file=sys.stderr) + sys.exit(1) + + def __call__(self, *args, **kwargs): + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class Command(BaseCommand): + """Commands are the basic building block of command line interfaces in + Click. A basic command handles command line parsing and might dispatch + more parsing to commands nested below it. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + """ + + def __init__(self, name, context_settings=None, callback=None, + params=None, help=None, epilog=None, short_help=None, + options_metavar='[OPTIONS]', add_help_option=True): + BaseCommand.__init__(self, name, context_settings) + #: the callback to execute when the command fires. This might be + #: `None` in which case nothing happens. + self.callback = callback + #: the list of parameters for this command in the order they + #: should show up in the help page and execute. Eager parameters + #: will automatically be handled before non eager ones. + self.params = params or [] + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + if short_help is None and help: + short_help = make_default_short_help(help) + self.short_help = short_help + self.add_help_option = add_help_option + + def get_usage(self, ctx): + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip('\n') + + def get_params(self, ctx): + rv = self.params + help_option = self.get_help_option(ctx) + if help_option is not None: + rv = rv + [help_option] + return rv + + def format_usage(self, ctx, formatter): + """Writes the usage line into the formatter.""" + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, ' '.join(pieces)) + + def collect_usage_pieces(self, ctx): + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + return rv + + def get_help_option_names(self, ctx): + """Returns the names for the help option.""" + all_names = set(ctx.help_option_names) + for param in self.params: + all_names.difference_update(param.opts) + all_names.difference_update(param.secondary_opts) + return all_names + + def get_help_option(self, ctx): + """Returns the help option object.""" + help_options = self.get_help_option_names(ctx) + if not help_options or not self.add_help_option: + return + + def show_help(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + return Option(help_options, is_flag=True, + is_eager=True, expose_value=False, + callback=show_help, + help='Show this message and exit.') + + def make_parser(self, ctx): + """Creates the underlying option parser for this command.""" + parser = OptionParser(ctx) + parser.allow_interspersed_args = ctx.allow_interspersed_args + parser.ignore_unknown_options = ctx.ignore_unknown_options + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx): + """Formats the help into a string and returns it. This creates a + formatter and will call into the following formatting methods: + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip('\n') + + def format_help(self, ctx, formatter): + """Writes the help into the formatter if it exists. + + This calls into the following methods: + + - :meth:`format_usage` + - :meth:`format_help_text` + - :meth:`format_options` + - :meth:`format_epilog` + """ + self.format_usage(ctx, formatter) + self.format_help_text(ctx, formatter) + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + def format_help_text(self, ctx, formatter): + """Writes the help text to the formatter if it exists.""" + if self.help: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(self.help) + + def format_options(self, ctx, formatter): + """Writes all the options into the formatter if they exist.""" + opts = [] + for param in self.get_params(ctx): + rv = param.get_help_record(ctx) + if rv is not None: + opts.append(rv) + + if opts: + with formatter.section('Options'): + formatter.write_dl(opts) + + def format_epilog(self, ctx, formatter): + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(self.epilog) + + def parse_args(self, ctx, args): + parser = self.make_parser(ctx) + opts, args, param_order = parser.parse_args(args=args) + + for param in iter_params_for_processing( + param_order, self.get_params(ctx)): + value, args = param.handle_parse_result(ctx, opts, args) + + if args and not ctx.allow_extra_args and not ctx.resilient_parsing: + ctx.fail('Got unexpected extra argument%s (%s)' + % (len(args) != 1 and 's' or '', + ' '.join(map(make_str, args)))) + + ctx.args = args + return args + + def invoke(self, ctx): + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + +class MultiCommand(Command): + """A multi command is the basic implementation of a command that + dispatches to subcommands. The most common version is the + :class:`Group`. + + :param invoke_without_command: this controls how the multi command itself + is invoked. By default it's only invoked + if a subcommand is provided. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is enabled by default if + `invoke_without_command` is disabled or disabled + if it's enabled. If enabled this will add + ``--help`` as argument if no arguments are + passed. + :param subcommand_metavar: the string that is used in the documentation + to indicate the subcommand place. + :param chain: if this is set to `True` chaining of multiple subcommands + is enabled. This restricts the form of commands in that + they cannot have optional arguments but it allows + multiple commands to be chained together. + :param result_callback: the result callback to attach to this multi + command. + """ + allow_extra_args = True + allow_interspersed_args = False + + def __init__(self, name=None, invoke_without_command=False, + no_args_is_help=None, subcommand_metavar=None, + chain=False, result_callback=None, **attrs): + Command.__init__(self, name, **attrs) + if no_args_is_help is None: + no_args_is_help = not invoke_without_command + self.no_args_is_help = no_args_is_help + self.invoke_without_command = invoke_without_command + if subcommand_metavar is None: + if chain: + subcommand_metavar = SUBCOMMANDS_METAVAR + else: + subcommand_metavar = SUBCOMMAND_METAVAR + self.subcommand_metavar = subcommand_metavar + self.chain = chain + #: The result callback that is stored. This can be set or + #: overridden with the :func:`resultcallback` decorator. + self.result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError('Multi commands in chain mode cannot ' + 'have optional arguments.') + + def collect_usage_pieces(self, ctx): + rv = Command.collect_usage_pieces(self, ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx, formatter): + Command.format_options(self, ctx, formatter) + self.format_commands(ctx, formatter) + + def resultcallback(self, replace=False): + """Adds a result callback to the chain command. By default if a + result callback is already registered this will chain them but + this can be disabled with the `replace` parameter. The result + callback is invoked with the return value of the subcommand + (or the list of return values from all subcommands if chaining + is enabled) as well as the parameters as they would be passed + to the main callback. + + Example:: + + @click.group() + @click.option('-i', '--input', default=23) + def cli(input): + return 42 + + @cli.resultcallback() + def process_result(result, input): + return result + input + + .. versionadded:: 3.0 + + :param replace: if set to `True` an already existing result + callback will be removed. + """ + def decorator(f): + old_callback = self.result_callback + if old_callback is None or replace: + self.result_callback = f + return f + def function(__value, *args, **kwargs): + return f(old_callback(__value, *args, **kwargs), + *args, **kwargs) + self.result_callback = rv = update_wrapper(function, f) + return rv + return decorator + + def format_commands(self, ctx, formatter): + """Extra format methods for multi methods that adds all the commands + after the options. + """ + rows = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + + help = cmd.short_help or '' + rows.append((subcommand, help)) + + if rows: + with formatter.section('Commands'): + formatter.write_dl(rows) + + def parse_args(self, ctx, args): + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + rest = Command.parse_args(self, ctx, args) + if self.chain: + ctx.protected_args = rest + ctx.args = [] + elif rest: + ctx.protected_args, ctx.args = rest[:1], rest[1:] + + return ctx.args + + def invoke(self, ctx): + def _process_result(value): + if self.result_callback is not None: + value = ctx.invoke(self.result_callback, value, + **ctx.params) + return value + + if not ctx.protected_args: + # If we are invoked without command the chain flag controls + # how this happens. If we are not in chain mode, the return + # value here is the return value of the command. + # If however we are in chain mode, the return value is the + # return value of the result processor invoked with an empty + # list (which means that no subcommand actually was executed). + if self.invoke_without_command: + if not self.chain: + return Command.invoke(self, ctx) + with ctx: + Command.invoke(self, ctx) + return _process_result([]) + ctx.fail('Missing command.') + + # Fetch args back out + args = ctx.protected_args + ctx.args + ctx.args = [] + ctx.protected_args = [] + + # If we're not in chain mode, we only allow the invocation of a + # single command but we also inform the current context about the + # name of the command to invoke. + if not self.chain: + # Make sure the context is entered so we do not clean up + # resources until the result processor has worked. + with ctx: + cmd_name, cmd, args = self.resolve_command(ctx, args) + ctx.invoked_subcommand = cmd_name + Command.invoke(self, ctx) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) + with sub_ctx: + return _process_result(sub_ctx.command.invoke(sub_ctx)) + + # In chain mode we create the contexts step by step, but after the + # base command has been invoked. Because at that point we do not + # know the subcommands yet, the invoked subcommand attribute is + # set to ``*`` to inform the command that subcommands are executed + # but nothing else. + with ctx: + ctx.invoked_subcommand = args and '*' or None + Command.invoke(self, ctx) + + # Otherwise we make every single context and invoke them in a + # chain. In that case the return value to the result processor + # is the list of all invoked subcommand's results. + contexts = [] + while args: + cmd_name, cmd, args = self.resolve_command(ctx, args) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False) + contexts.append(sub_ctx) + args, sub_ctx.args = sub_ctx.args, [] + + rv = [] + for sub_ctx in contexts: + with sub_ctx: + rv.append(sub_ctx.command.invoke(sub_ctx)) + return _process_result(rv) + + def resolve_command(self, ctx, args): + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None: + if split_opt(cmd_name)[0]: + self.parse_args(ctx, ctx.args) + ctx.fail('No such command "%s".' % original_cmd_name) + + return cmd_name, cmd, args[1:] + + def get_command(self, ctx, cmd_name): + """Given a context and a command name, this returns a + :class:`Command` object if it exists or returns `None`. + """ + raise NotImplementedError() + + def list_commands(self, ctx): + """Returns a list of subcommand names in the order they should + appear. + """ + return [] + + +class Group(MultiCommand): + """A group allows a command to have subcommands attached. This is the + most common way to implement nesting in Click. + + :param commands: a dictionary of commands. + """ + + def __init__(self, name=None, commands=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: the registered subcommands by their exported names. + self.commands = commands or {} + + def add_command(self, cmd, name=None): + """Registers another :class:`Command` with this group. If the name + is not provided, the name of the command is used. + """ + name = name or cmd.name + if name is None: + raise TypeError('Command has no name.') + _check_multicommand(self, name, cmd, register=True) + self.commands[name] = cmd + + def command(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + def decorator(f): + cmd = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + return decorator + + def group(self, *args, **kwargs): + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` but + immediately registers the created command with this instance by + calling into :meth:`add_command`. + """ + def decorator(f): + cmd = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + return decorator + + def get_command(self, ctx, cmd_name): + return self.commands.get(cmd_name) + + def list_commands(self, ctx): + return sorted(self.commands) + + +class CommandCollection(MultiCommand): + """A command collection is a multi command that merges multiple multi + commands together into one. This is a straightforward implementation + that accepts a list of different multi commands as sources and + provides all the commands for each of them. + """ + + def __init__(self, name=None, sources=None, **attrs): + MultiCommand.__init__(self, name, **attrs) + #: The list of registered multi commands. + self.sources = sources or [] + + def add_source(self, multi_cmd): + """Adds a new multi command to the chain dispatcher.""" + self.sources.append(multi_cmd) + + def get_command(self, ctx, cmd_name): + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + if rv is not None: + if self.chain: + _check_multicommand(self, cmd_name, rv) + return rv + + def list_commands(self, ctx): + rv = set() + for source in self.sources: + rv.update(source.list_commands(ctx)) + return sorted(rv) + + +class Parameter(object): + """A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. In Click 2.0, the old callback format will still work, + but it will raise a warning to give you change to migrate the + code easier. + + :param param_decls: the parameter declarations for this option or + argument. This is a list of flags or argument + names. + :param type: the type that should be used. Either a :class:`ParamType` + or a Python type. The later is converted into the former + automatically if supported. + :param required: controls if this is optional or not. + :param default: the default value if omitted. This can also be a callable, + in which case it's invoked when the default is needed + without any arguments. + :param callback: a callback that should be executed after the parameter + was matched. This is called as ``fn(ctx, param, + value)`` and needs to return the value. Before Click + 2.0, the signature was ``(ctx, value)``. + :param nargs: the number of arguments to match. If not ``1`` the return + value is a tuple instead of single value. The default for + nargs is ``1`` (except if the type is a tuple, then it's + the arity of the tuple). + :param metavar: how the value is represented in the help page. + :param expose_value: if this is `True` then the value is passed onwards + to the command callback and stored on the context, + otherwise it's skipped. + :param is_eager: eager values are processed before non eager ones. This + should not be set for arguments or it will inverse the + order of processing. + :param envvar: a string or list of strings that are environment variables + that should be checked. + """ + param_type_name = 'parameter' + + def __init__(self, param_decls=None, type=None, required=False, + default=None, callback=None, nargs=None, metavar=None, + expose_value=True, is_eager=False, envvar=None): + self.name, self.opts, self.secondary_opts = \ + self._parse_decls(param_decls or (), expose_value) + + self.type = convert_type(type, default) + + # Default nargs to what the type tells us if we have that + # information available. + if nargs is None: + if self.type.is_composite: + nargs = self.type.arity + else: + nargs = 1 + + self.required = required + self.callback = callback + self.nargs = nargs + self.multiple = False + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + + @property + def human_readable_name(self): + """Returns the human readable name of this parameter. This is the + same as the name for options, but the metavar for arguments. + """ + return self.name + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + metavar = self.type.get_metavar(self) + if metavar is None: + metavar = self.type.name.upper() + if self.nargs != 1: + metavar += '...' + return metavar + + def get_default(self, ctx): + """Given a context variable this calculates the default value.""" + # Otherwise go with the regular default. + if callable(self.default): + rv = self.default() + else: + rv = self.default + return self.type_cast_value(ctx, rv) + + def add_to_parser(self, parser, ctx): + pass + + def consume_value(self, ctx, opts): + value = opts.get(self.name) + if value is None: + value = ctx.lookup_default(self.name) + if value is None: + value = self.value_from_envvar(ctx) + return value + + def type_cast_value(self, ctx, value): + """Given a value this runs it properly through the type system. + This automatically handles things like `nargs` and `multiple` as + well as composite types. + """ + if self.type.is_composite: + if self.nargs <= 1: + raise TypeError('Attempted to invoke composite type ' + 'but nargs has been set to %s. This is ' + 'not supported; nargs needs to be set to ' + 'a fixed value > 1.' % self.nargs) + if self.multiple: + return tuple(self.type(x or (), self, ctx) for x in value or ()) + return self.type(value or (), self, ctx) + + def _convert(value, level): + if level == 0: + return self.type(value, self, ctx) + return tuple(_convert(x, level - 1) for x in value or ()) + return _convert(value, (self.nargs != 1) + bool(self.multiple)) + + def process_value(self, ctx, value): + """Given a value and context this runs the logic to convert the + value as necessary. + """ + # If the value we were given is None we do nothing. This way + # code that calls this can easily figure out if something was + # not provided. Otherwise it would be converted into an empty + # tuple for multiple invocations which is inconvenient. + if value is not None: + return self.type_cast_value(ctx, value) + + def value_is_missing(self, value): + if value is None: + return True + if (self.nargs != 1 or self.multiple) and value == (): + return True + return False + + def full_process_value(self, ctx, value): + value = self.process_value(ctx, value) + + if value is None: + value = self.get_default(ctx) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + return value + + def resolve_envvar_value(self, ctx): + if self.envvar is None: + return + if isinstance(self.envvar, (tuple, list)): + for envvar in self.envvar: + rv = os.environ.get(envvar) + if rv is not None: + return rv + else: + return os.environ.get(self.envvar) + + def value_from_envvar(self, ctx): + rv = self.resolve_envvar_value(ctx) + if rv is not None and self.nargs != 1: + rv = self.type.split_envvar_value(rv) + return rv + + def handle_parse_result(self, ctx, opts, args): + with augment_usage_errors(ctx, param=self): + value = self.consume_value(ctx, opts) + try: + value = self.full_process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + value = None + if self.callback is not None: + try: + value = invoke_param_callback( + self.callback, ctx, self, value) + except Exception: + if not ctx.resilient_parsing: + raise + + if self.expose_value: + ctx.params[self.name] = value + return value, args + + def get_help_record(self, ctx): + pass + + def get_usage_pieces(self, ctx): + return [] + + +class Option(Parameter): + """Options are usually optional values on the command line and + have some extra features that arguments don't have. + + All other parameters are passed onwards to the parameter constructor. + + :param show_default: controls if the default value should be shown on the + help page. Normally, defaults are not shown. + :param prompt: if set to `True` or a non empty string then the user will + be prompted for input if not set. If set to `True` the + prompt will be the option name capitalized. + :param confirmation_prompt: if set then the value will need to be confirmed + if it was prompted for. + :param hide_input: if this is `True` then the input on the prompt will be + hidden from the user. This is useful for password + input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + """ + param_type_name = 'option' + + def __init__(self, param_decls=None, show_default=False, + prompt=False, confirmation_prompt=False, + hide_input=False, is_flag=None, flag_value=None, + multiple=False, count=False, allow_from_autoenv=True, + type=None, help=None, **attrs): + default_is_missing = attrs.get('default', _missing) is _missing + Parameter.__init__(self, param_decls, type=type, **attrs) + + if prompt is True: + prompt_text = self.name.replace('_', ' ').capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = prompt + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.hide_input = hide_input + + # Flags + if is_flag is None: + if flag_value is not None: + is_flag = True + else: + is_flag = bool(self.secondary_opts) + if is_flag and default_is_missing: + self.default = False + if flag_value is None: + flag_value = not self.default + self.is_flag = is_flag + self.flag_value = flag_value + if self.is_flag and isinstance(self.flag_value, bool) \ + and type is None: + self.type = BOOL + self.is_bool_flag = True + else: + self.is_bool_flag = False + + # Counting + self.count = count + if count: + if type is None: + self.type = IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.multiple = multiple + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + + # Sanity check for stuff we don't support + if __debug__: + if self.nargs < 0: + raise TypeError('Options cannot have nargs < 0') + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError('Cannot prompt for flags that are not bools.') + if not self.is_bool_flag and self.secondary_opts: + raise TypeError('Got secondary option for non boolean flag.') + if self.is_bool_flag and self.hide_input \ + and self.prompt is not None: + raise TypeError('Hidden input does not work with boolean ' + 'flag prompts.') + if self.count: + if self.multiple: + raise TypeError('Options cannot be multiple and count ' + 'at the same time.') + elif self.is_flag: + raise TypeError('Options cannot be count and flags at ' + 'the same time.') + + def _parse_decls(self, decls, expose_value): + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if isidentifier(decl): + if name is not None: + raise TypeError('Name defined twice') + name = decl + else: + split_char = decl[:1] == '/' and ';' or '/' + if split_char in decl: + first, second = decl.split(split_char, 1) + first = first.rstrip() + if first: + possible_names.append(split_opt(first)) + opts.append(first) + second = second.lstrip() + if second: + secondary_opts.append(second.lstrip()) + else: + possible_names.append(split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: len(x[0])) + name = possible_names[-1][1].replace('-', '_').lower() + if not isidentifier(name): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError('Could not determine name for option') + + if not opts and not secondary_opts: + raise TypeError('No options defined but a name was passed (%s). ' + 'Did you mean to declare an argument instead ' + 'of an option?' % name) + + return name, opts, secondary_opts + + def add_to_parser(self, parser, ctx): + kwargs = { + 'dest': self.name, + 'nargs': self.nargs, + 'obj': self, + } + + if self.multiple: + action = 'append' + elif self.count: + action = 'count' + else: + action = 'store' + + if self.is_flag: + kwargs.pop('nargs', None) + if self.is_bool_flag and self.secondary_opts: + parser.add_option(self.opts, action=action + '_const', + const=True, **kwargs) + parser.add_option(self.secondary_opts, action=action + + '_const', const=False, **kwargs) + else: + parser.add_option(self.opts, action=action + '_const', + const=self.flag_value, + **kwargs) + else: + kwargs['action'] = action + parser.add_option(self.opts, **kwargs) + + def get_help_record(self, ctx): + any_prefix_is_slash = [] + + def _write_opts(opts): + rv, any_slashes = join_options(opts) + if any_slashes: + any_prefix_is_slash[:] = [True] + if not self.is_flag and not self.count: + rv += ' ' + self.make_metavar() + return rv + + rv = [_write_opts(self.opts)] + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or '' + extra = [] + if self.default is not None and self.show_default: + extra.append('default: %s' % ( + ', '.join('%s' % d for d in self.default) + if isinstance(self.default, (list, tuple)) + else self.default, )) + if self.required: + extra.append('required') + if extra: + help = '%s[%s]' % (help and help + ' ' or '', '; '.join(extra)) + + return ((any_prefix_is_slash and '; ' or ' / ').join(rv), help) + + def get_default(self, ctx): + # If we're a non boolean flag out default is more complex because + # we need to look at all flags in the same group to figure out + # if we're the the default one in which case we return the flag + # value as default. + if self.is_flag and not self.is_bool_flag: + for param in ctx.command.params: + if param.name == self.name and param.default: + return param.flag_value + return None + return Parameter.get_default(self, ctx) + + def prompt_for_value(self, ctx): + """This is an alternative flow that can be activated in the full + value processing if a value does not exist. It will prompt the + user until a valid value exists and then returns the processed + value as result. + """ + # Calculate the default before prompting anything to be stable. + default = self.get_default(ctx) + + # If this is a prompt for a flag we need to handle this + # differently. + if self.is_bool_flag: + return confirm(self.prompt, default) + + return prompt(self.prompt, default=default, + hide_input=self.hide_input, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x)) + + def resolve_envvar_value(self, ctx): + rv = Parameter.resolve_envvar_value(self, ctx) + if rv is not None: + return rv + if self.allow_from_autoenv and \ + ctx.auto_envvar_prefix is not None: + envvar = '%s_%s' % (ctx.auto_envvar_prefix, self.name.upper()) + return os.environ.get(envvar) + + def value_from_envvar(self, ctx): + rv = self.resolve_envvar_value(ctx) + if rv is None: + return None + value_depth = (self.nargs != 1) + bool(self.multiple) + if value_depth > 0 and rv is not None: + rv = self.type.split_envvar_value(rv) + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + return rv + + def full_process_value(self, ctx, value): + if value is None and self.prompt is not None \ + and not ctx.resilient_parsing: + return self.prompt_for_value(ctx) + return Parameter.full_process_value(self, ctx, value) + + +class Argument(Parameter): + """Arguments are positional parameters to a command. They generally + provide fewer features than options but can have infinite ``nargs`` + and are required by default. + + All parameters are passed onwards to the parameter constructor. + """ + param_type_name = 'argument' + + def __init__(self, param_decls, required=None, **attrs): + if required is None: + if attrs.get('default') is not None: + required = False + else: + required = attrs.get('nargs', 1) > 0 + Parameter.__init__(self, param_decls, required=required, **attrs) + if self.default is not None and self.nargs < 0: + raise TypeError('nargs=-1 in combination with a default value ' + 'is not supported.') + + @property + def human_readable_name(self): + if self.metavar is not None: + return self.metavar + return self.name.upper() + + def make_metavar(self): + if self.metavar is not None: + return self.metavar + var = self.name.upper() + if not self.required: + var = '[%s]' % var + if self.nargs != 1: + var += '...' + return var + + def _parse_decls(self, decls, expose_value): + if not decls: + if not expose_value: + return None, [], [] + raise TypeError('Could not determine name for argument') + if len(decls) == 1: + name = arg = decls[0] + name = name.replace('-', '_').lower() + elif len(decls) == 2: + name, arg = decls + else: + raise TypeError('Arguments take exactly one or two ' + 'parameter declarations, got %d' % len(decls)) + return name, [arg], [] + + def get_usage_pieces(self, ctx): + return [self.make_metavar()] + + def add_to_parser(self, parser, ctx): + parser.add_argument(dest=self.name, nargs=self.nargs, + obj=self) + + +# Circular dependency between decorators and core +from .decorators import command, group diff --git a/app/lib/click/decorators.py b/app/lib/click/decorators.py new file mode 100644 index 0000000..9893452 --- /dev/null +++ b/app/lib/click/decorators.py @@ -0,0 +1,304 @@ +import sys +import inspect + +from functools import update_wrapper + +from ._compat import iteritems +from ._unicodefun import _check_for_unicode_literals +from .utils import echo +from .globals import get_current_context + + +def pass_context(f): + """Marks a callback as wanting to receive the current context + object as first argument. + """ + def new_func(*args, **kwargs): + return f(get_current_context(), *args, **kwargs) + return update_wrapper(new_func, f) + + +def pass_obj(f): + """Similar to :func:`pass_context`, but only pass the object on the + context onwards (:attr:`Context.obj`). This is useful if that object + represents the state of a nested system. + """ + def new_func(*args, **kwargs): + return f(get_current_context().obj, *args, **kwargs) + return update_wrapper(new_func, f) + + +def make_pass_decorator(object_type, ensure=False): + """Given an object type this creates a decorator that will work + similar to :func:`pass_obj` but instead of passing the object of the + current context, it will find the innermost context of type + :func:`object_type`. + + This generates a decorator that works roughly like this:: + + from functools import update_wrapper + + def decorator(f): + @pass_context + def new_func(ctx, *args, **kwargs): + obj = ctx.find_object(object_type) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + :param object_type: the type of the object to pass. + :param ensure: if set to `True`, a new object will be created and + remembered on the context if it's not there yet. + """ + def decorator(f): + def new_func(*args, **kwargs): + ctx = get_current_context() + if ensure: + obj = ctx.ensure_object(object_type) + else: + obj = ctx.find_object(object_type) + if obj is None: + raise RuntimeError('Managed to invoke callback without a ' + 'context object of type %r existing' + % object_type.__name__) + return ctx.invoke(f, obj, *args[1:], **kwargs) + return update_wrapper(new_func, f) + return decorator + + +def _make_command(f, name, attrs, cls): + if isinstance(f, Command): + raise TypeError('Attempted to convert a callback into a ' + 'command twice.') + try: + params = f.__click_params__ + params.reverse() + del f.__click_params__ + except AttributeError: + params = [] + help = attrs.get('help') + if help is None: + help = inspect.getdoc(f) + if isinstance(help, bytes): + help = help.decode('utf-8') + else: + help = inspect.cleandoc(help) + attrs['help'] = help + _check_for_unicode_literals() + return cls(name=name or f.__name__.lower(), + callback=f, params=params, **attrs) + + +def command(name=None, cls=None, **attrs): + """Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function. If you + want to change that, you can pass the intended name as the first + argument. + + All keyword arguments are forwarded to the underlying command class. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: the name of the command. This defaults to the function + name. + :param cls: the command class to instantiate. This defaults to + :class:`Command`. + """ + if cls is None: + cls = Command + def decorator(f): + cmd = _make_command(f, name, attrs, cls) + cmd.__doc__ = f.__doc__ + return cmd + return decorator + + +def group(name=None, **attrs): + """Creates a new :class:`Group` with a function as callback. This + works otherwise the same as :func:`command` just that the `cls` + parameter is set to :class:`Group`. + """ + attrs.setdefault('cls', Group) + return command(name, **attrs) + + +def _param_memo(f, param): + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, '__click_params__'): + f.__click_params__ = [] + f.__click_params__.append(param) + + +def argument(*param_decls, **attrs): + """Attaches an argument to the command. All positional arguments are + passed as parameter declarations to :class:`Argument`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Argument` instance manually + and attaching it to the :attr:`Command.params` list. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + """ + def decorator(f): + ArgumentClass = attrs.pop('cls', Argument) + _param_memo(f, ArgumentClass(param_decls, **attrs)) + return f + return decorator + + +def option(*param_decls, **attrs): + """Attaches an option to the command. All positional arguments are + passed as parameter declarations to :class:`Option`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Option` instance manually + and attaching it to the :attr:`Command.params` list. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + """ + def decorator(f): + if 'help' in attrs: + attrs['help'] = inspect.cleandoc(attrs['help']) + OptionClass = attrs.pop('cls', Option) + _param_memo(f, OptionClass(param_decls, **attrs)) + return f + return decorator + + +def confirmation_option(*param_decls, **attrs): + """Shortcut for confirmation prompts that can be ignored by passing + ``--yes`` as parameter. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + def callback(ctx, param, value): + if not value: + ctx.abort() + + @click.command() + @click.option('--yes', is_flag=True, callback=callback, + expose_value=False, prompt='Do you want to continue?') + def dropdb(): + pass + """ + def decorator(f): + def callback(ctx, param, value): + if not value: + ctx.abort() + attrs.setdefault('is_flag', True) + attrs.setdefault('callback', callback) + attrs.setdefault('expose_value', False) + attrs.setdefault('prompt', 'Do you want to continue?') + attrs.setdefault('help', 'Confirm the action without prompting.') + return option(*(param_decls or ('--yes',)), **attrs)(f) + return decorator + + +def password_option(*param_decls, **attrs): + """Shortcut for password prompts. + + This is equivalent to decorating a function with :func:`option` with + the following parameters:: + + @click.command() + @click.option('--password', prompt=True, confirmation_prompt=True, + hide_input=True) + def changeadmin(password): + pass + """ + def decorator(f): + attrs.setdefault('prompt', True) + attrs.setdefault('confirmation_prompt', True) + attrs.setdefault('hide_input', True) + return option(*(param_decls or ('--password',)), **attrs)(f) + return decorator + + +def version_option(version=None, *param_decls, **attrs): + """Adds a ``--version`` option which immediately ends the program + printing out the version number. This is implemented as an eager + option that prints the version and exits the program in the callback. + + :param version: the version number to show. If not provided Click + attempts an auto discovery via setuptools. + :param prog_name: the name of the program (defaults to autodetection) + :param message: custom message to show instead of the default + (``'%(prog)s, version %(version)s'``) + :param others: everything else is forwarded to :func:`option`. + """ + if version is None: + module = sys._getframe(1).f_globals.get('__name__') + def decorator(f): + prog_name = attrs.pop('prog_name', None) + message = attrs.pop('message', '%(prog)s, version %(version)s') + + def callback(ctx, param, value): + if not value or ctx.resilient_parsing: + return + prog = prog_name + if prog is None: + prog = ctx.find_root().info_name + ver = version + if ver is None: + try: + import pkg_resources + except ImportError: + pass + else: + for dist in pkg_resources.working_set: + scripts = dist.get_entry_map().get('console_scripts') or {} + for script_name, entry_point in iteritems(scripts): + if entry_point.module_name == module: + ver = dist.version + break + if ver is None: + raise RuntimeError('Could not determine version') + echo(message % { + 'prog': prog, + 'version': ver, + }, color=ctx.color) + ctx.exit() + + attrs.setdefault('is_flag', True) + attrs.setdefault('expose_value', False) + attrs.setdefault('is_eager', True) + attrs.setdefault('help', 'Show the version and exit.') + attrs['callback'] = callback + return option(*(param_decls or ('--version',)), **attrs)(f) + return decorator + + +def help_option(*param_decls, **attrs): + """Adds a ``--help`` option which immediately ends the program + printing out the help page. This is usually unnecessary to add as + this is added by default to all commands unless suppressed. + + Like :func:`version_option`, this is implemented as eager option that + prints in the callback and exits. + + All arguments are forwarded to :func:`option`. + """ + def decorator(f): + def callback(ctx, param, value): + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + attrs.setdefault('is_flag', True) + attrs.setdefault('expose_value', False) + attrs.setdefault('help', 'Show this message and exit.') + attrs.setdefault('is_eager', True) + attrs['callback'] = callback + return option(*(param_decls or ('--help',)), **attrs)(f) + return decorator + + +# Circular dependencies between core and decorators +from .core import Command, Group, Argument, Option diff --git a/app/lib/click/exceptions.py b/app/lib/click/exceptions.py new file mode 100644 index 0000000..74a4542 --- /dev/null +++ b/app/lib/click/exceptions.py @@ -0,0 +1,201 @@ +from ._compat import PY2, filename_to_ui, get_text_stderr +from .utils import echo + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception + exit_code = 1 + + def __init__(self, message): + if PY2: + if message is not None: + message = message.encode('utf-8') + Exception.__init__(self, message) + self.message = message + + def format_message(self): + return self.message + + def show(self, file=None): + if file is None: + file = get_text_stderr() + echo('Error: %s' % self.format_message(), file=file) + + +class UsageError(ClickException): + """An internal exception that signals a usage error. This typically + aborts any further handling. + + :param message: the error message to display. + :param ctx: optionally the context that caused this error. Click will + fill in the context automatically in some situations. + """ + exit_code = 2 + + def __init__(self, message, ctx=None): + ClickException.__init__(self, message) + self.ctx = ctx + + def show(self, file=None): + if file is None: + file = get_text_stderr() + color = None + if self.ctx is not None: + color = self.ctx.color + echo(self.ctx.get_usage() + '\n', file=file, color=color) + echo('Error: %s' % self.format_message(), file=file, color=color) + + +class BadParameter(UsageError): + """An exception that formats out a standardized error message for a + bad parameter. This is useful when thrown from a callback or type as + Click will attach contextual information to it (for instance, which + parameter it is). + + .. versionadded:: 2.0 + + :param param: the parameter object that caused this error. This can + be left out, and Click will attach this info itself + if possible. + :param param_hint: a string that shows up as parameter name. This + can be used as alternative to `param` in cases + where custom validation should happen. If it is + a string it's used as such, if it's a list then + each item is quoted and separated. + """ + + def __init__(self, message, ctx=None, param=None, + param_hint=None): + UsageError.__init__(self, message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self): + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.opts or [self.param.human_readable_name] + else: + return 'Invalid value: %s' % self.message + if isinstance(param_hint, (tuple, list)): + param_hint = ' / '.join('"%s"' % x for x in param_hint) + return 'Invalid value for %s: %s' % (param_hint, self.message) + + +class MissingParameter(BadParameter): + """Raised if click required an option or argument but it was not + provided when invoking the script. + + .. versionadded:: 4.0 + + :param param_type: a string that indicates the type of the parameter. + The default is to inherit the parameter type from + the given `param`. Valid values are ``'parameter'``, + ``'option'`` or ``'argument'``. + """ + + def __init__(self, message=None, ctx=None, param=None, + param_hint=None, param_type=None): + BadParameter.__init__(self, message, ctx, param, param_hint) + self.param_type = param_type + + def format_message(self): + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.opts or [self.param.human_readable_name] + else: + param_hint = None + if isinstance(param_hint, (tuple, list)): + param_hint = ' / '.join('"%s"' % x for x in param_hint) + + param_type = self.param_type + if param_type is None and self.param is not None: + param_type = self.param.param_type_name + + msg = self.message + if self.param is not None: + msg_extra = self.param.type.get_missing_message(self.param) + if msg_extra: + if msg: + msg += '. ' + msg_extra + else: + msg = msg_extra + + return 'Missing %s%s%s%s' % ( + param_type, + param_hint and ' %s' % param_hint or '', + msg and '. ' or '.', + msg or '', + ) + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__(self, option_name, message=None, possibilities=None, + ctx=None): + if message is None: + message = 'no such option: %s' % option_name + UsageError.__init__(self, message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self): + bits = [self.message] + if self.possibilities: + if len(self.possibilities) == 1: + bits.append('Did you mean %s?' % self.possibilities[0]) + else: + possibilities = sorted(self.possibilities) + bits.append('(Possible options: %s)' % ', '.join(possibilities)) + return ' '.join(bits) + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + """ + + def __init__(self, message, ctx=None): + UsageError.__init__(self, message, ctx) + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + def __init__(self, message, ctx=None): + UsageError.__init__(self, message, ctx) + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename, hint=None): + ui_filename = filename_to_ui(filename) + if hint is None: + hint = 'unknown error' + ClickException.__init__(self, hint) + self.ui_filename = ui_filename + self.filename = filename + + def format_message(self): + return 'Could not open file %s: %s' % (self.ui_filename, self.message) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" diff --git a/app/lib/click/formatting.py b/app/lib/click/formatting.py new file mode 100644 index 0000000..a3d6a4d --- /dev/null +++ b/app/lib/click/formatting.py @@ -0,0 +1,256 @@ +from contextlib import contextmanager +from .termui import get_terminal_size +from .parser import split_opt +from ._compat import term_len + + +# Can force a width. This is used by the test system +FORCED_WIDTH = None + + +def measure_table(rows): + widths = {} + for row in rows: + for idx, col in enumerate(row): + widths[idx] = max(widths.get(idx, 0), term_len(col)) + return tuple(y for x, y in sorted(widths.items())) + + +def iter_rows(rows, col_count): + for row in rows: + row = tuple(row) + yield row + ('',) * (col_count - len(row)) + + +def wrap_text(text, width=78, initial_indent='', subsequent_indent='', + preserve_paragraphs=False): + """A helper function that intelligently wraps text. By default, it + assumes that it operates on a single paragraph of text but if the + `preserve_paragraphs` parameter is provided it will intelligently + handle paragraphs (defined by two empty lines). + + If paragraphs are handled, a paragraph can be prefixed with an empty + line containing the ``\\b`` character (``\\x08``) to indicate that + no rewrapping should happen in that block. + + :param text: the text that should be rewrapped. + :param width: the maximum width for the text. + :param initial_indent: the initial indent that should be placed on the + first line as a string. + :param subsequent_indent: the indent string that should be placed on + each consecutive line. + :param preserve_paragraphs: if this flag is set then the wrapping will + intelligently handle paragraphs. + """ + from ._textwrap import TextWrapper + text = text.expandtabs() + wrapper = TextWrapper(width, initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + replace_whitespace=False) + if not preserve_paragraphs: + return wrapper.fill(text) + + p = [] + buf = [] + indent = None + + def _flush_par(): + if not buf: + return + if buf[0].strip() == '\b': + p.append((indent or 0, True, '\n'.join(buf[1:]))) + else: + p.append((indent or 0, False, ' '.join(buf))) + del buf[:] + + for line in text.splitlines(): + if not line: + _flush_par() + indent = None + else: + if indent is None: + orig_len = term_len(line) + line = line.lstrip() + indent = orig_len - term_len(line) + buf.append(line) + _flush_par() + + rv = [] + for indent, raw, text in p: + with wrapper.extra_indent(' ' * indent): + if raw: + rv.append(wrapper.indent_only(text)) + else: + rv.append(wrapper.fill(text)) + + return '\n\n'.join(rv) + + +class HelpFormatter(object): + """This class helps with formatting text-based help pages. It's + usually just needed for very special internal cases, but it's also + exposed so that developers can write their own fancy outputs. + + At present, it always writes into memory. + + :param indent_increment: the additional increment for each level. + :param width: the width for the text. This defaults to the terminal + width clamped to a maximum of 78. + """ + + def __init__(self, indent_increment=2, width=None, max_width=None): + self.indent_increment = indent_increment + if max_width is None: + max_width = 80 + if width is None: + width = FORCED_WIDTH + if width is None: + width = max(min(get_terminal_size()[0], max_width) - 2, 50) + self.width = width + self.current_indent = 0 + self.buffer = [] + + def write(self, string): + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self): + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self): + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage(self, prog, args='', prefix='Usage: '): + """Writes a usage line into the buffer. + + :param prog: the program name. + :param args: whitespace separated list of arguments. + :param prefix: the prefix for the first line. + """ + usage_prefix = '%*s%s ' % (self.current_indent, prefix, prog) + text_width = self.width - self.current_indent + + if text_width >= (term_len(usage_prefix) + 20): + # The arguments will fit to the right of the prefix. + indent = ' ' * term_len(usage_prefix) + self.write(wrap_text(args, text_width, + initial_indent=usage_prefix, + subsequent_indent=indent)) + else: + # The prefix is too long, put the arguments on the next line. + self.write(usage_prefix) + self.write('\n') + indent = ' ' * (max(self.current_indent, term_len(prefix)) + 4) + self.write(wrap_text(args, text_width, + initial_indent=indent, + subsequent_indent=indent)) + + self.write('\n') + + def write_heading(self, heading): + """Writes a heading into the buffer.""" + self.write('%*s%s:\n' % (self.current_indent, '', heading)) + + def write_paragraph(self): + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write('\n') + + def write_text(self, text): + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + text_width = max(self.width - self.current_indent, 11) + indent = ' ' * self.current_indent + self.write(wrap_text(text, text_width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True)) + self.write('\n') + + def write_dl(self, rows, col_max=30, col_spacing=2): + """Writes a definition list into the buffer. This is how options + and commands are usually formatted. + + :param rows: a list of two item tuples for the terms and values. + :param col_max: the maximum width of the first column. + :param col_spacing: the number of spaces between the first and + second column. + """ + rows = list(rows) + widths = measure_table(rows) + if len(widths) != 2: + raise TypeError('Expected two columns for definition list') + + first_col = min(widths[0], col_max) + col_spacing + + for first, second in iter_rows(rows, len(widths)): + self.write('%*s%s' % (self.current_indent, '', first)) + if not second: + self.write('\n') + continue + if term_len(first) <= first_col - col_spacing: + self.write(' ' * (first_col - term_len(first))) + else: + self.write('\n') + self.write(' ' * (first_col + self.current_indent)) + + text_width = max(self.width - first_col - 2, 10) + lines = iter(wrap_text(second, text_width).splitlines()) + if lines: + self.write(next(lines) + '\n') + for line in lines: + self.write('%*s%s\n' % ( + first_col + self.current_indent, '', line)) + else: + self.write('\n') + + @contextmanager + def section(self, name): + """Helpful context manager that writes a paragraph, a heading, + and the indents. + + :param name: the section name that is written as heading. + """ + self.write_paragraph() + self.write_heading(name) + self.indent() + try: + yield + finally: + self.dedent() + + @contextmanager + def indentation(self): + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self): + """Returns the buffer contents.""" + return ''.join(self.buffer) + + +def join_options(options): + """Given a list of option strings this joins them in the most appropriate + way and returns them in the form ``(formatted_string, + any_prefix_is_slash)`` where the second item in the tuple is a flag that + indicates if any of the option prefixes was a slash. + """ + rv = [] + any_prefix_is_slash = False + for opt in options: + prefix = split_opt(opt)[0] + if prefix == '/': + any_prefix_is_slash = True + rv.append((len(prefix), opt)) + + rv.sort(key=lambda x: x[0]) + + rv = ', '.join(x[1] for x in rv) + return rv, any_prefix_is_slash diff --git a/app/lib/click/globals.py b/app/lib/click/globals.py new file mode 100644 index 0000000..14338e6 --- /dev/null +++ b/app/lib/click/globals.py @@ -0,0 +1,48 @@ +from threading import local + + +_local = local() + + +def get_current_context(silent=False): + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing it's behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: is set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return getattr(_local, 'stack')[-1] + except (AttributeError, IndexError): + if not silent: + raise RuntimeError('There is no active click context.') + + +def push_context(ctx): + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault('stack', []).append(ctx) + + +def pop_context(): + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color=None): + """"Internal helper to get the default value of the color flag. If a + value is passed it's returned unchanged, otherwise it's looked up from + the current context. + """ + if color is not None: + return color + ctx = get_current_context(silent=True) + if ctx is not None: + return ctx.color diff --git a/app/lib/click/parser.py b/app/lib/click/parser.py new file mode 100644 index 0000000..9775c9f --- /dev/null +++ b/app/lib/click/parser.py @@ -0,0 +1,426 @@ +# -*- coding: utf-8 -*- +""" + click.parser + ~~~~~~~~~~~~ + + This module started out as largely a copy paste from the stdlib's + optparse module with the features removed that we do not need from + optparse because we implement them in Click on a higher level (for + instance type handling, help formatting and a lot more). + + The plan is to remove more and more from here over time. + + The reason this is a different module and not optparse from the stdlib + is that there are differences in 2.x and 3.x about the error messages + generated and optparse in the stdlib uses gettext for no good reason + and might cause us issues. +""" +import re +from collections import deque +from .exceptions import UsageError, NoSuchOption, BadOptionUsage, \ + BadArgumentUsage + + +def _unpack_args(args, nargs_spec): + """Given an iterable of arguments and an iterable of nargs specifications, + it returns a tuple with all the unpacked arguments at the first index + and all remaining arguments as the second. + + The nargs specification is the number of arguments that should be consumed + or `-1` to indicate that this position should eat up all the remainders. + + Missing items are filled with `None`. + """ + args = deque(args) + nargs_spec = deque(nargs_spec) + rv = [] + spos = None + + def _fetch(c): + try: + if spos is None: + return c.popleft() + else: + return c.pop() + except IndexError: + return None + + while nargs_spec: + nargs = _fetch(nargs_spec) + if nargs == 1: + rv.append(_fetch(args)) + elif nargs > 1: + x = [_fetch(args) for _ in range(nargs)] + # If we're reversed, we're pulling in the arguments in reverse, + # so we need to turn them around. + if spos is not None: + x.reverse() + rv.append(tuple(x)) + elif nargs < 0: + if spos is not None: + raise TypeError('Cannot have two nargs < 0') + spos = len(rv) + rv.append(None) + + # spos is the position of the wildcard (star). If it's not `None`, + # we fill it with the remainder. + if spos is not None: + rv[spos] = tuple(args) + args = [] + rv[spos + 1:] = reversed(rv[spos + 1:]) + + return tuple(rv), list(args) + + +def _error_opt_args(nargs, opt): + if nargs == 1: + raise BadOptionUsage('%s option requires an argument' % opt) + raise BadOptionUsage('%s option requires %d arguments' % (opt, nargs)) + + +def split_opt(opt): + first = opt[:1] + if first.isalnum(): + return '', opt + if opt[1:2] == first: + return opt[:2], opt[2:] + return first, opt[1:] + + +def normalize_opt(opt, ctx): + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = split_opt(opt) + return prefix + ctx.token_normalize_func(opt) + + +def split_arg_string(string): + """Given an argument string this attempts to split it into small parts.""" + rv = [] + for match in re.finditer(r"('([^'\\]*(?:\\.[^'\\]*)*)'" + r'|"([^"\\]*(?:\\.[^"\\]*)*)"' + r'|\S+)\s*', string, re.S): + arg = match.group().strip() + if arg[:1] == arg[-1:] and arg[:1] in '"\'': + arg = arg[1:-1].encode('ascii', 'backslashreplace') \ + .decode('unicode-escape') + try: + arg = type(string)(arg) + except UnicodeError: + pass + rv.append(arg) + return rv + + +class Option(object): + + def __init__(self, opts, dest, action=None, nargs=1, const=None, obj=None): + self._short_opts = [] + self._long_opts = [] + self.prefixes = set() + + for opt in opts: + prefix, value = split_opt(opt) + if not prefix: + raise ValueError('Invalid start character for option (%s)' + % opt) + self.prefixes.add(prefix[0]) + if len(prefix) == 1 and len(value) == 1: + self._short_opts.append(opt) + else: + self._long_opts.append(opt) + self.prefixes.add(prefix) + + if action is None: + action = 'store' + + self.dest = dest + self.action = action + self.nargs = nargs + self.const = const + self.obj = obj + + @property + def takes_value(self): + return self.action in ('store', 'append') + + def process(self, value, state): + if self.action == 'store': + state.opts[self.dest] = value + elif self.action == 'store_const': + state.opts[self.dest] = self.const + elif self.action == 'append': + state.opts.setdefault(self.dest, []).append(value) + elif self.action == 'append_const': + state.opts.setdefault(self.dest, []).append(self.const) + elif self.action == 'count': + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 + else: + raise ValueError('unknown action %r' % self.action) + state.order.append(self.obj) + + +class Argument(object): + + def __init__(self, dest, nargs=1, obj=None): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process(self, value, state): + if self.nargs > 1: + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage('argument %s takes %d values' + % (self.dest, self.nargs)) + state.opts[self.dest] = value + state.order.append(self.obj) + + +class ParsingState(object): + + def __init__(self, rargs): + self.opts = {} + self.largs = [] + self.rargs = rargs + self.order = [] + + +class OptionParser(object): + """The option parser is an internal class that is ultimately used to + parse options and arguments. It's modelled after optparse and brings + a similar but vastly simplified API. It should generally not be used + directly as the high level Click classes wrap it for you. + + It's not nearly as extensible as optparse or argparse as it does not + implement features that are implemented on a higher level (such as + types or defaults). + + :param ctx: optionally the :class:`~click.Context` where this parser + should go with. + """ + + def __init__(self, ctx=None): + #: The :class:`~click.Context` for this parser. This might be + #: `None` for some advanced use cases. + self.ctx = ctx + #: This controls how the parser deals with interspersed arguments. + #: If this is set to `False`, the parser will stop on the first + #: non-option. Click uses this to implement nested subcommands + #: safely. + self.allow_interspersed_args = True + #: This tells the parser how to deal with unknown options. By + #: default it will error out (which is sensible), but there is a + #: second mode where it will ignore it and continue processing + #: after shifting all the unknown options into the resulting args. + self.ignore_unknown_options = False + if ctx is not None: + self.allow_interspersed_args = ctx.allow_interspersed_args + self.ignore_unknown_options = ctx.ignore_unknown_options + self._short_opt = {} + self._long_opt = {} + self._opt_prefixes = set(['-', '--']) + self._args = [] + + def add_option(self, opts, dest, action=None, nargs=1, const=None, + obj=None): + """Adds a new option named `dest` to the parser. The destination + is not inferred (unlike with optparse) and needs to be explicitly + provided. Action can be any of ``store``, ``store_const``, + ``append``, ``appnd_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + if obj is None: + obj = dest + opts = [normalize_opt(opt, self.ctx) for opt in opts] + option = Option(opts, dest, action=action, nargs=nargs, + const=const, obj=obj) + self._opt_prefixes.update(option.prefixes) + for opt in option._short_opts: + self._short_opt[opt] = option + for opt in option._long_opts: + self._long_opt[opt] = option + + def add_argument(self, dest, nargs=1, obj=None): + """Adds a positional argument named `dest` to the parser. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + if obj is None: + obj = dest + self._args.append(Argument(dest=dest, nargs=nargs, obj=obj)) + + def parse_args(self, args): + """Parses positional arguments and returns ``(values, args, order)`` + for the parsed options and arguments as well as the leftover + arguments if there are any. The order is a list of objects as they + appear on the command line. If arguments appear multiple times they + will be memorized multiple times as well. + """ + state = ParsingState(args) + try: + self._process_args_for_options(state) + self._process_args_for_args(state) + except UsageError: + if self.ctx is None or not self.ctx.resilient_parsing: + raise + return state.opts, state.largs, state.order + + def _process_args_for_args(self, state): + pargs, args = _unpack_args(state.largs + state.rargs, + [x.nargs for x in self._args]) + + for idx, arg in enumerate(self._args): + arg.process(pargs[idx], state) + + state.largs = args + state.rargs = [] + + def _process_args_for_options(self, state): + while state.rargs: + arg = state.rargs.pop(0) + arglen = len(arg) + # Double dashes always handled explicitly regardless of what + # prefixes are valid. + if arg == '--': + return + elif arg[:1] in self._opt_prefixes and arglen > 1: + self._process_opts(arg, state) + elif self.allow_interspersed_args: + state.largs.append(arg) + else: + state.rargs.insert(0, arg) + return + + # Say this is the original argument list: + # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] + # ^ + # (we are about to process arg(i)). + # + # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of + # [arg0, ..., arg(i-1)] (any options and their arguments will have + # been removed from largs). + # + # The while loop will usually consume 1 or more arguments per pass. + # If it consumes 1 (eg. arg is an option that takes no arguments), + # then after _process_arg() is done the situation is: + # + # largs = subset of [arg0, ..., arg(i)] + # rargs = [arg(i+1), ..., arg(N-1)] + # + # If allow_interspersed_args is false, largs will always be + # *empty* -- still a subset of [arg0, ..., arg(i-1)], but + # not a very interesting subset! + + def _match_long_opt(self, opt, explicit_value, state): + if opt not in self._long_opt: + possibilities = [word for word in self._long_opt + if word.startswith(opt)] + raise NoSuchOption(opt, possibilities=possibilities) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + elif explicit_value is not None: + raise BadOptionUsage('%s option does not take a value' % opt) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg, state): + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = normalize_opt(prefix + ch, self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + nargs = option.nargs + if len(state.rargs) < nargs: + _error_opt_args(nargs, opt) + elif nargs == 1: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + else: + value = None + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we re-combinate the string of the + # remaining options and re-attach the prefix, then report that + # to the state as new larg. This way there is basic combinatorics + # that can be achieved while still ignoring unknown arguments. + if self.ignore_unknown_options and unknown_options: + state.largs.append(prefix + ''.join(unknown_options)) + + def _process_opts(self, arg, state): + explicit_value = None + # Long option handling happens in two parts. The first part is + # supporting explicitly attached values. In any case, we will try + # to long match the option first. + if '=' in arg: + long_opt, explicit_value = arg.split('=', 1) + else: + long_opt = arg + norm_long_opt = normalize_opt(long_opt, self.ctx) + + # At this point we will match the (assumed) long option through + # the long option matching code. Note that this allows options + # like "-foo" to be matched as long options. + try: + self._match_long_opt(norm_long_opt, explicit_value, state) + except NoSuchOption: + # At this point the long option matching failed, and we need + # to try with short options. However there is a special rule + # which says, that if we have a two character options prefix + # (applies to "--foo" for instance), we do not dispatch to the + # short option code and will instead raise the no option + # error. + if arg[:2] not in self._opt_prefixes: + return self._match_short_opt(arg, state) + if not self.ignore_unknown_options: + raise + state.largs.append(arg) diff --git a/app/lib/click/termui.py b/app/lib/click/termui.py new file mode 100644 index 0000000..d9fba52 --- /dev/null +++ b/app/lib/click/termui.py @@ -0,0 +1,539 @@ +import os +import sys +import struct + +from ._compat import raw_input, text_type, string_types, \ + isatty, strip_ansi, get_winterm_size, DEFAULT_COLUMNS, WIN +from .utils import echo +from .exceptions import Abort, UsageError +from .types import convert_type +from .globals import resolve_color_default + + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func = raw_input + +_ansi_colors = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', + 'cyan', 'white', 'reset') +_ansi_reset_all = '\033[0m' + + +def hidden_prompt_func(prompt): + import getpass + return getpass.getpass(prompt) + + +def _build_prompt(text, suffix, show_default=False, default=None): + prompt = text + if default is not None and show_default: + prompt = '%s [%s]' % (prompt, default) + return prompt + suffix + + +def prompt(text, default=None, hide_input=False, + confirmation_prompt=False, type=None, + value_proc=None, prompt_suffix=': ', + show_default=True, err=False): + """Prompts a user for input. This is a convenience function that can + be used to prompt a user for input later. + + If the user aborts the input by sending a interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param text: the text to show for the prompt. + :param default: the default value to use if no input happens. If this + is not given it will prompt until it's aborted. + :param hide_input: if this is set to true then the input value will + be hidden. + :param confirmation_prompt: asks for confirmation for the value. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + result = None + + def prompt_func(text): + f = hide_input and hidden_prompt_func or visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text, nl=False, err=err) + return f('') + except (KeyboardInterrupt, EOFError): + # getpass doesn't print a newline if the user aborts input with ^C. + # Allegedly this behavior is inherited from getpass(3). + # A doc bug has been filed at https://bugs.python.org/issue24711 + if hide_input: + echo(None, err=err) + raise Abort() + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt(text, prompt_suffix, show_default, default) + + while 1: + while 1: + value = prompt_func(prompt) + if value: + break + # If a default is set and used, then the confirmation + # prompt is always skipped because that's the only thing + # that really makes sense. + elif default is not None: + return default + try: + result = value_proc(value) + except UsageError as e: + echo('Error: %s' % e.message, err=err) + continue + if not confirmation_prompt: + return result + while 1: + value2 = prompt_func('Repeat for confirmation: ') + if value2: + break + if value == value2: + return result + echo('Error: the two entered values do not match', err=err) + + +def confirm(text, default=False, abort=False, prompt_suffix=': ', + show_default=True, err=False): + """Prompts for confirmation (yes/no question). + + If the user aborts the input by sending a interrupt signal this + function will catch it and raise a :exc:`Abort` exception. + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param text: the question to ask. + :param default: the default for the prompt. + :param abort: if this is set to `True` a negative answer aborts the + exception by raising :exc:`Abort`. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + prompt = _build_prompt(text, prompt_suffix, show_default, + default and 'Y/n' or 'y/N') + while 1: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt, nl=False, err=err) + value = visible_prompt_func('').lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() + if value in ('y', 'yes'): + rv = True + elif value in ('n', 'no'): + rv = False + elif value == '': + rv = default + else: + echo('Error: invalid input', err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def get_terminal_size(): + """Returns the current size of the terminal as tuple in the form + ``(width, height)`` in columns and rows. + """ + # If shutil has get_terminal_size() (Python 3.3 and later) use that + if sys.version_info >= (3, 3): + import shutil + shutil_get_terminal_size = getattr(shutil, 'get_terminal_size', None) + if shutil_get_terminal_size: + sz = shutil_get_terminal_size() + return sz.columns, sz.lines + + if get_winterm_size is not None: + return get_winterm_size() + + def ioctl_gwinsz(fd): + try: + import fcntl + import termios + cr = struct.unpack( + 'hh', fcntl.ioctl(fd, termios.TIOCGWINSZ, '1234')) + except Exception: + return + return cr + + cr = ioctl_gwinsz(0) or ioctl_gwinsz(1) or ioctl_gwinsz(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + try: + cr = ioctl_gwinsz(fd) + finally: + os.close(fd) + except Exception: + pass + if not cr or not cr[0] or not cr[1]: + cr = (os.environ.get('LINES', 25), + os.environ.get('COLUMNS', DEFAULT_COLUMNS)) + return int(cr[1]), int(cr[0]) + + +def echo_via_pager(text, color=None): + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text: the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + if not isinstance(text, string_types): + text = text_type(text) + from ._termui_impl import pager + return pager(text + '\n', color) + + +def progressbar(iterable=None, length=None, label=None, show_eta=True, + show_percent=None, show_pos=False, + item_show_func=None, fill_char='#', empty_char='-', + bar_template='%(label)s [%(bar)s] %(info)s', + info_sep=' ', width=36, file=None, color=None): + """This function creates an iterable context manager that can be used + to iterate over something while showing a progress bar. It will + either iterate over the `iterable` or `length` items (that are counted + up). While iteration happens, this function will print a rendered + progress bar to the given `file` (defaults to stdout) and will attempt + to calculate remaining time and more. By default, this progress bar + will not be rendered if the file is not a terminal. + + The context manager creates the progress bar. When the context + manager is entered the progress bar is already displayed. With every + iteration over the progress bar, the iterable passed to the bar is + advanced and the bar is updated. When the context manager exits, + a newline is printed and the progress bar is finalized on screen. + + No printing must happen or the progress bar will be unintentionally + destroyed. + + Example usage:: + + with progressbar(items) as bar: + for item in bar: + do_something_with(item) + + Alternatively, if no iterable is specified, one can manually update the + progress bar through the `update()` method instead of directly + iterating over the progress bar. The update method accepts the number + of steps to increment the bar with:: + + with progressbar(length=chunks.total_bytes) as bar: + for chunk in chunks: + process_chunk(chunk) + bar.update(chunks.bytes) + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `color` parameter. Added a `update` method to the + progressbar object. + + :param iterable: an iterable to iterate over. If not provided the length + is required. + :param length: the number of items to iterate over. By default the + progressbar will attempt to ask the iterator about its + length, which might or might not work. If an iterable is + also provided this parameter can be used to override the + length. If an iterable is not provided the progress bar + will iterate over a range of that length. + :param label: the label to show next to the progress bar. + :param show_eta: enables or disables the estimated time display. This is + automatically disabled if the length cannot be + determined. + :param show_percent: enables or disables the percentage display. The + default is `True` if the iterable has a length or + `False` if not. + :param show_pos: enables or disables the absolute position display. The + default is `False`. + :param item_show_func: a function called with the current item which + can return a string to show the current item + next to the progress bar. Note that the current + item can be `None`! + :param fill_char: the character to use to show the filled part of the + progress bar. + :param empty_char: the character to use to show the non-filled part of + the progress bar. + :param bar_template: the format string to use as template for the bar. + The parameters in it are ``label`` for the label, + ``bar`` for the progress bar and ``info`` for the + info section. + :param info_sep: the separator between multiple info items (eta etc.) + :param width: the width of the progress bar in characters, 0 means full + terminal width + :param file: the file to write to. If this is not a terminal then + only the label is printed. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are included anywhere in the progress bar output + which is not the case by default. + """ + from ._termui_impl import ProgressBar + color = resolve_color_default(color) + return ProgressBar(iterable=iterable, length=length, show_eta=show_eta, + show_percent=show_percent, show_pos=show_pos, + item_show_func=item_show_func, fill_char=fill_char, + empty_char=empty_char, bar_template=bar_template, + info_sep=info_sep, file=file, label=label, + width=width, color=color) + + +def clear(): + """Clears the terminal screen. This will have the effect of clearing + the whole visible space of the terminal and moving the cursor to the + top left. This does not do anything if not connected to a terminal. + + .. versionadded:: 2.0 + """ + if not isatty(sys.stdout): + return + # If we're on Windows and we don't have colorama available, then we + # clear the screen by shelling out. Otherwise we can use an escape + # sequence. + if WIN: + os.system('cls') + else: + sys.stdout.write('\033[2J\033[1;1H') + + +def style(text, fg=None, bg=None, bold=None, dim=None, underline=None, + blink=None, reverse=None, reset=True): + """Styles a text with ANSI styles and returns the new string. By + default the styling is self contained which means that at the end + of the string a reset code is issued. This can be prevented by + passing ``reset=False``. + + Examples:: + + click.echo(click.style('Hello World!', fg='green')) + click.echo(click.style('ATTENTION!', blink=True)) + click.echo(click.style('Some things', reverse=True, fg='cyan')) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``reset`` (reset the color code only) + + .. versionadded:: 2.0 + + :param text: the string to style with ansi codes. + :param fg: if provided this will become the foreground color. + :param bg: if provided this will become the background color. + :param bold: if provided this will enable or disable bold mode. + :param dim: if provided this will enable or disable dim mode. This is + badly supported. + :param underline: if provided this will enable or disable underline. + :param blink: if provided this will enable or disable blinking. + :param reverse: if provided this will enable or disable inverse + rendering (foreground becomes background and the + other way round). + :param reset: by default a reset-all code is added at the end of the + string which means that styles do not carry over. This + can be disabled to compose styles. + """ + bits = [] + if fg: + try: + bits.append('\033[%dm' % (_ansi_colors.index(fg) + 30)) + except ValueError: + raise TypeError('Unknown color %r' % fg) + if bg: + try: + bits.append('\033[%dm' % (_ansi_colors.index(bg) + 40)) + except ValueError: + raise TypeError('Unknown color %r' % bg) + if bold is not None: + bits.append('\033[%dm' % (1 if bold else 22)) + if dim is not None: + bits.append('\033[%dm' % (2 if dim else 22)) + if underline is not None: + bits.append('\033[%dm' % (4 if underline else 24)) + if blink is not None: + bits.append('\033[%dm' % (5 if blink else 25)) + if reverse is not None: + bits.append('\033[%dm' % (7 if reverse else 27)) + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return ''.join(bits) + + +def unstyle(text): + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho(text, file=None, nl=True, err=False, color=None, **styles): + """This function combines :func:`echo` and :func:`style` into one + call. As such the following two calls are the same:: + + click.secho('Hello World!', fg='green') + click.echo(click.style('Hello World!', fg='green')) + + All keyword arguments are forwarded to the underlying functions + depending on which one they go with. + + .. versionadded:: 2.0 + """ + return echo(style(text, **styles), file=file, nl=nl, err=err, color=color) + + +def edit(text=None, editor=None, env=None, require_save=True, + extension='.txt', filename=None): + r"""Edits the given text in the defined editor. If an editor is given + (should be the full path to the executable but the regular operating + system search path is used for finding the executable) it overrides + the detected editor. Optionally, some environment variables can be + used. If the editor is closed without changes, `None` is returned. In + case a file is edited directly the return value is always `None` and + `require_save` and `extension` are ignored. + + If the editor cannot be opened a :exc:`UsageError` is raised. + + Note for Windows: to simplify cross-platform usage, the newlines are + automatically converted from POSIX to Windows and vice versa. As such, + the message here will have ``\n`` as newline markers. + + :param text: the text to edit. + :param editor: optionally the editor to use. Defaults to automatic + detection. + :param env: environment variables to forward to the editor. + :param require_save: if this is true, then not saving in the editor + will make the return value become `None`. + :param extension: the extension to tell the editor about. This defaults + to `.txt` but changing this might change syntax + highlighting. + :param filename: if provided it will edit this file instead of the + provided text contents. It will not use a temporary + file as an indirection in that case. + """ + from ._termui_impl import Editor + editor = Editor(editor=editor, env=env, require_save=require_save, + extension=extension) + if filename is None: + return editor.edit(text) + editor.edit_file(filename) + + +def launch(url, wait=False, locate=False): + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('http://click.pocoo.org/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: waits for the program to stop. + :param locate: if this is set to `True` then instead of launching the + application associated with the URL it will attempt to + launch a file manager with the file located. This + might have weird effects if the URL does not point to + the filesystem. + """ + from ._termui_impl import open_url + return open_url(url, wait=wait, locate=locate) + + +# If this is provided, getchar() calls into this instead. This is used +# for unittesting purposes. +_getchar = None + + +def getchar(echo=False): + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + f = _getchar + if f is None: + from ._termui_impl import getchar as f + return f(echo) + + +def pause(info='Press any key to continue ...', err=False): + """This command stops execution and waits for the user to press any + key to continue. This is similar to the Windows batch "pause" + command. If the program is not run through a terminal, this command + will instead do nothing. + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param info: the info string to print before pausing. + :param err: if set to message goes to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + if not isatty(sys.stdin) or not isatty(sys.stdout): + return + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/app/lib/click/testing.py b/app/lib/click/testing.py new file mode 100644 index 0000000..4416c77 --- /dev/null +++ b/app/lib/click/testing.py @@ -0,0 +1,322 @@ +import os +import sys +import shutil +import tempfile +import contextlib + +from ._compat import iteritems, PY2 + + +# If someone wants to vendor click, we want to ensure the +# correct package is discovered. Ideally we could use a +# relative import here but unfortunately Python does not +# support that. +clickpkg = sys.modules[__name__.rsplit('.', 1)[0]] + + +if PY2: + from cStringIO import StringIO +else: + import io + from ._compat import _find_binary_reader + + +class EchoingStdin(object): + + def __init__(self, input, output): + self._input = input + self._output = output + + def __getattr__(self, x): + return getattr(self._input, x) + + def _echo(self, rv): + self._output.write(rv) + return rv + + def read(self, n=-1): + return self._echo(self._input.read(n)) + + def readline(self, n=-1): + return self._echo(self._input.readline(n)) + + def readlines(self): + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self): + return iter(self._echo(x) for x in self._input) + + def __repr__(self): + return repr(self._input) + + +def make_input_stream(input, charset): + # Is already an input stream. + if hasattr(input, 'read'): + if PY2: + return input + rv = _find_binary_reader(input) + if rv is not None: + return rv + raise TypeError('Could not find binary reader for input stream.') + + if input is None: + input = b'' + elif not isinstance(input, bytes): + input = input.encode(charset) + if PY2: + return StringIO(input) + return io.BytesIO(input) + + +class Result(object): + """Holds the captured result of an invoked CLI script.""" + + def __init__(self, runner, output_bytes, exit_code, exception, + exc_info=None): + #: The runner that created the result + self.runner = runner + #: The output as bytes. + self.output_bytes = output_bytes + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happend if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self): + """The output as unicode string.""" + return self.output_bytes.decode(self.runner.charset, 'replace') \ + .replace('\r\n', '\n') + + def __repr__(self): + return '' % ( + self.exception and repr(self.exception) or 'okay', + ) + + +class CliRunner(object): + """The CLI runner provides functionality to invoke a Click command line + script for unittesting purposes in a isolated environment. This only + works in single-threaded systems without any concurrency as it changes the + global interpreter state. + + :param charset: the character set for the input and output data. This is + UTF-8 by default and should not be changed currently as + the reporting to Click only works in Python 2 properly. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from stdin writes + to stdout. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + """ + + def __init__(self, charset=None, env=None, echo_stdin=False): + if charset is None: + charset = 'utf-8' + self.charset = charset + self.env = env or {} + self.echo_stdin = echo_stdin + + def get_default_prog_name(self, cli): + """Given a command object it will return the default program name + for it. The default is the `name` attribute or ``"root"`` if not + set. + """ + return cli.name or 'root' + + def make_env(self, overrides=None): + """Returns the environment overrides for invoking a script.""" + rv = dict(self.env) + if overrides: + rv.update(overrides) + return rv + + @contextlib.contextmanager + def isolation(self, input=None, env=None, color=False): + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up stdin with the given input data + and `os.environ` with the overrides from the given dictionary. + This also rebinds some internals in Click to be mocked (like the + prompt functionality). + + This is automatically done in the :meth:`invoke` method. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :param input: the input stream to put into sys.stdin. + :param env: the environment overrides as dictionary. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + """ + input = make_input_stream(input, self.charset) + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = clickpkg.formatting.FORCED_WIDTH + clickpkg.formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + if PY2: + sys.stdout = sys.stderr = bytes_output = StringIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + else: + bytes_output = io.BytesIO() + if self.echo_stdin: + input = EchoingStdin(input, bytes_output) + input = io.TextIOWrapper(input, encoding=self.charset) + sys.stdout = sys.stderr = io.TextIOWrapper( + bytes_output, encoding=self.charset) + + sys.stdin = input + + def visible_input(prompt=None): + sys.stdout.write(prompt or '') + val = input.readline().rstrip('\r\n') + sys.stdout.write(val + '\n') + sys.stdout.flush() + return val + + def hidden_input(prompt=None): + sys.stdout.write((prompt or '') + '\n') + sys.stdout.flush() + return input.readline().rstrip('\r\n') + + def _getchar(echo): + char = sys.stdin.read(1) + if echo: + sys.stdout.write(char) + sys.stdout.flush() + return char + + default_color = color + def should_strip_ansi(stream=None, color=None): + if color is None: + return not default_color + return not color + + old_visible_prompt_func = clickpkg.termui.visible_prompt_func + old_hidden_prompt_func = clickpkg.termui.hidden_prompt_func + old__getchar_func = clickpkg.termui._getchar + old_should_strip_ansi = clickpkg.utils.should_strip_ansi + clickpkg.termui.visible_prompt_func = visible_input + clickpkg.termui.hidden_prompt_func = hidden_input + clickpkg.termui._getchar = _getchar + clickpkg.utils.should_strip_ansi = should_strip_ansi + + old_env = {} + try: + for key, value in iteritems(env): + old_env[key] = os.environ.get(key) + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + yield bytes_output + finally: + for key, value in iteritems(old_env): + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + sys.stdout = old_stdout + sys.stderr = old_stderr + sys.stdin = old_stdin + clickpkg.termui.visible_prompt_func = old_visible_prompt_func + clickpkg.termui.hidden_prompt_func = old_hidden_prompt_func + clickpkg.termui._getchar = old__getchar_func + clickpkg.utils.should_strip_ansi = old_should_strip_ansi + clickpkg.formatting.FORCED_WIDTH = old_forced_width + + def invoke(self, cli, args=None, input=None, env=None, + catch_exceptions=True, color=False, **extra): + """Invokes a command in an isolated environment. The arguments are + forwarded directly to the command line script, the `extra` keyword + arguments are passed to the :meth:`~clickpkg.Command.main` function of + the command. + + This returns a :class:`Result` object. + + .. versionadded:: 3.0 + The ``catch_exceptions`` parameter was added. + + .. versionchanged:: 3.0 + The result object now has an `exc_info` attribute with the + traceback if available. + + .. versionadded:: 4.0 + The ``color`` parameter was added. + + :param cli: the command to invoke + :param args: the arguments to invoke + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + """ + exc_info = None + with self.isolation(input=input, env=env, color=color) as out: + exception = None + exit_code = 0 + + try: + cli.main(args=args or (), + prog_name=self.get_default_prog_name(cli), **extra) + except SystemExit as e: + if e.code != 0: + exception = e + + exc_info = sys.exc_info() + + exit_code = e.code + if not isinstance(exit_code, int): + sys.stdout.write(str(exit_code)) + sys.stdout.write('\n') + exit_code = 1 + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = -1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + output = out.getvalue() + + return Result(runner=self, + output_bytes=output, + exit_code=exit_code, + exception=exception, + exc_info=exc_info) + + @contextlib.contextmanager + def isolated_filesystem(self): + """A context manager that creates a temporary folder and changes + the current working directory to it for isolated filesystem tests. + """ + cwd = os.getcwd() + t = tempfile.mkdtemp() + os.chdir(t) + try: + yield t + finally: + os.chdir(cwd) + try: + shutil.rmtree(t) + except (OSError, IOError): + pass diff --git a/app/lib/click/types.py b/app/lib/click/types.py new file mode 100644 index 0000000..3639002 --- /dev/null +++ b/app/lib/click/types.py @@ -0,0 +1,550 @@ +import os +import stat + +from ._compat import open_stream, text_type, filename_to_ui, \ + get_filesystem_encoding, get_streerror, _get_argv_encoding, PY2 +from .exceptions import BadParameter +from .utils import safecall, LazyFile + + +class ParamType(object): + """Helper for converting values through types. The following is + necessary for a valid type: + + * it needs a name + * it needs to pass through None unchanged + * it needs to convert from a string + * it needs to convert its result type through unchanged + (eg: needs to be idempotent) + * it needs to be able to deal with param and context being `None`. + This can be the case when the object is used with prompt + inputs. + """ + is_composite = False + + #: the descriptive name of this type + name = None + + #: if a list of this type is expected and the value is pulled from a + #: string environment variable, this is what splits it up. `None` + #: means any whitespace. For all parameters the general rule is that + #: whitespace splits them up. The exception are paths and files which + #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on + #: Windows). + envvar_list_splitter = None + + def __call__(self, value, param=None, ctx=None): + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param): + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param): + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert(self, value, param, ctx): + """Converts the value. This is not invoked for values that are + `None` (the missing value). + """ + return value + + def split_envvar_value(self, rv): + """Given a value from an environment variable this splits it up + into small chunks depending on the defined envvar list splitter. + + If the splitter is set to `None`, which means that whitespace splits, + then leading and trailing whitespace is ignored. Otherwise, leading + and trailing splitters usually lead to empty items being included. + """ + return (rv or '').split(self.envvar_list_splitter) + + def fail(self, message, param=None, ctx=None): + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self): + raise NotImplementedError() + + +class FuncParamType(ParamType): + + def __init__(self, func): + self.name = func.__name__ + self.func = func + + def convert(self, value, param, ctx): + try: + return self.func(value) + except ValueError: + try: + value = text_type(value) + except UnicodeError: + value = str(value).decode('utf-8', 'replace') + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = 'text' + + def convert(self, value, param, ctx): + return value + + def __repr__(self): + return 'UNPROCESSED' + + +class StringParamType(ParamType): + name = 'text' + + def convert(self, value, param, ctx): + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = get_filesystem_encoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode('utf-8', 'replace') + return value + return value + + def __repr__(self): + return 'STRING' + + +class Choice(ParamType): + """The choice type allows a value to be checked against a fixed set of + supported values. All of these values have to be strings. + + See :ref:`choice-opts` for an example. + """ + name = 'choice' + + def __init__(self, choices): + self.choices = choices + + def get_metavar(self, param): + return '[%s]' % '|'.join(self.choices) + + def get_missing_message(self, param): + return 'Choose from %s.' % ', '.join(self.choices) + + def convert(self, value, param, ctx): + # Exact match + if value in self.choices: + return value + + # Match through normalization + if ctx is not None and \ + ctx.token_normalize_func is not None: + value = ctx.token_normalize_func(value) + for choice in self.choices: + if ctx.token_normalize_func(choice) == value: + return choice + + self.fail('invalid choice: %s. (choose from %s)' % + (value, ', '.join(self.choices)), param, ctx) + + def __repr__(self): + return 'Choice(%r)' % list(self.choices) + + +class IntParamType(ParamType): + name = 'integer' + + def convert(self, value, param, ctx): + try: + return int(value) + except (ValueError, UnicodeError): + self.fail('%s is not a valid integer' % value, param, ctx) + + def __repr__(self): + return 'INT' + + +class IntRange(IntParamType): + """A parameter that works similar to :data:`click.INT` but restricts + the value to fit into a range. The default behavior is to fail if the + value falls outside the range, but it can also be silently clamped + between the two edges. + + See :ref:`ranges` for an example. + """ + name = 'integer range' + + def __init__(self, min=None, max=None, clamp=False): + self.min = min + self.max = max + self.clamp = clamp + + def convert(self, value, param, ctx): + rv = IntParamType.convert(self, value, param, ctx) + if self.clamp: + if self.min is not None and rv < self.min: + return self.min + if self.max is not None and rv > self.max: + return self.max + if self.min is not None and rv < self.min or \ + self.max is not None and rv > self.max: + if self.min is None: + self.fail('%s is bigger than the maximum valid value ' + '%s.' % (rv, self.max), param, ctx) + elif self.max is None: + self.fail('%s is smaller than the minimum valid value ' + '%s.' % (rv, self.min), param, ctx) + else: + self.fail('%s is not in the valid range of %s to %s.' + % (rv, self.min, self.max), param, ctx) + return rv + + def __repr__(self): + return 'IntRange(%r, %r)' % (self.min, self.max) + + +class BoolParamType(ParamType): + name = 'boolean' + + def convert(self, value, param, ctx): + if isinstance(value, bool): + return bool(value) + value = value.lower() + if value in ('true', '1', 'yes', 'y'): + return True + elif value in ('false', '0', 'no', 'n'): + return False + self.fail('%s is not a valid boolean' % value, param, ctx) + + def __repr__(self): + return 'BOOL' + + +class FloatParamType(ParamType): + name = 'float' + + def convert(self, value, param, ctx): + try: + return float(value) + except (UnicodeError, ValueError): + self.fail('%s is not a valid floating point value' % + value, param, ctx) + + def __repr__(self): + return 'FLOAT' + + +class UUIDParameterType(ParamType): + name = 'uuid' + + def convert(self, value, param, ctx): + import uuid + try: + if PY2 and isinstance(value, text_type): + value = value.encode('ascii') + return uuid.UUID(value) + except (UnicodeError, ValueError): + self.fail('%s is not a valid UUID value' % value, param, ctx) + + def __repr__(self): + return 'UUID' + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or + upon first IO. The default is to be non lazy for standard input and + output streams as well as files opened for reading, lazy otherwise. + + Starting with Click 2.0, files can also be opened atomically in which + case all writes go into a separate file in the same folder and upon + completion the file will be moved over to the original location. This + is useful if a file regularly read by other users is modified. + + See :ref:`file-args` for more information. + """ + name = 'filename' + envvar_list_splitter = os.path.pathsep + + def __init__(self, mode='r', encoding=None, errors='strict', lazy=None, + atomic=False): + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def resolve_lazy_flag(self, value): + if self.lazy is not None: + return self.lazy + if value == '-': + return False + elif 'w' in self.mode: + return True + return False + + def convert(self, value, param, ctx): + try: + if hasattr(value, 'read') or hasattr(value, 'write'): + return value + + lazy = self.resolve_lazy_flag(value) + + if lazy: + f = LazyFile(value, self.mode, self.encoding, self.errors, + atomic=self.atomic) + if ctx is not None: + ctx.call_on_close(f.close_intelligently) + return f + + f, should_close = open_stream(value, self.mode, + self.encoding, self.errors, + atomic=self.atomic) + # If a context is provided, we automatically close the file + # at the end of the context execution (or flush out). If a + # context does not exist, it's the caller's responsibility to + # properly close the file. This for instance happens when the + # type is used with prompts. + if ctx is not None: + if should_close: + ctx.call_on_close(safecall(f.close)) + else: + ctx.call_on_close(safecall(f.flush)) + return f + except (IOError, OSError) as e: + self.fail('Could not open file: %s: %s' % ( + filename_to_ui(value), + get_streerror(e), + ), param, ctx) + + +class Path(ParamType): + """The path type is similar to the :class:`File` type but it performs + different checks. First of all, instead of returning an open file + handle it returns just the filename. Secondly, it can perform various + basic checks about what the file or directory should be. + + .. versionchanged:: 6.0 + `allow_dash` was added. + + :param exists: if set to true, the file or directory needs to exist for + this value to be valid. If this is not required and a + file does indeed not exist, then all further checks are + silently skipped. + :param file_okay: controls if a file is a possible value. + :param dir_okay: controls if a directory is a possible value. + :param writable: if true, a writable check is performed. + :param readable: if true, a readable check is performed. + :param resolve_path: if this is true, then the path is fully resolved + before the value is passed onwards. This means + that it's absolute and symlinks are resolved. + :param allow_dash: If this is set to `True`, a single dash to indicate + standard streams is permitted. + :param type: optionally a string type that should be used to + represent the path. The default is `None` which + means the return value will be either bytes or + unicode depending on what makes most sense given the + input data Click deals with. + """ + envvar_list_splitter = os.path.pathsep + + def __init__(self, exists=False, file_okay=True, dir_okay=True, + writable=False, readable=True, resolve_path=False, + allow_dash=False, path_type=None): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.writable = writable + self.readable = readable + self.resolve_path = resolve_path + self.allow_dash = allow_dash + self.type = path_type + + if self.file_okay and not self.dir_okay: + self.name = 'file' + self.path_type = 'File' + if self.dir_okay and not self.file_okay: + self.name = 'directory' + self.path_type = 'Directory' + else: + self.name = 'path' + self.path_type = 'Path' + + def coerce_path_result(self, rv): + if self.type is not None and not isinstance(rv, self.type): + if self.type is text_type: + rv = rv.decode(get_filesystem_encoding()) + else: + rv = rv.encode(get_filesystem_encoding()) + return rv + + def convert(self, value, param, ctx): + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b'-', '-') + + if not is_dash: + if self.resolve_path: + rv = os.path.realpath(rv) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail('%s "%s" does not exist.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail('%s "%s" is a file.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail('%s "%s" is a directory.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if self.writable and not os.access(value, os.W_OK): + self.fail('%s "%s" is not writable.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + if self.readable and not os.access(value, os.R_OK): + self.fail('%s "%s" is not readable.' % ( + self.path_type, + filename_to_ui(value) + ), param, ctx) + + return self.coerce_path_result(rv) + + +class Tuple(CompositeParamType): + """The default behavior of Click is to apply a type on a value directly. + This works well in most cases, except for when `nargs` is set to a fixed + count and different types should be used for different items. In this + case the :class:`Tuple` type can be used. This type can only be used + if `nargs` is set to a fixed number. + + For more information see :ref:`tuple-type`. + + This can be selected by using a Python tuple literal as a type. + + :param types: a list of types that should be used for the tuple items. + """ + + def __init__(self, types): + self.types = [convert_type(ty) for ty in types] + + @property + def name(self): + return "<" + " ".join(ty.name for ty in self.types) + ">" + + @property + def arity(self): + return len(self.types) + + def convert(self, value, param, ctx): + if len(value) != len(self.types): + raise TypeError('It would appear that nargs is set to conflict ' + 'with the composite type arity.') + return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) + + +def convert_type(ty, default=None): + """Converts a callable or python ty into the most appropriate param + ty. + """ + guessed_type = False + if ty is None and default is not None: + if isinstance(default, tuple): + ty = tuple(map(type, default)) + else: + ty = type(default) + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + if isinstance(ty, ParamType): + return ty + if ty is text_type or ty is str or ty is None: + return STRING + if ty is int: + return INT + # Booleans are only okay if not guessed. This is done because for + # flags the default value is actually a bit of a lie in that it + # indicates which of the flags is the one we want. See get_default() + # for more information. + if ty is bool and not guessed_type: + return BOOL + if ty is float: + return FLOAT + if guessed_type: + return STRING + + # Catch a common mistake + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError('Attempted to use an uninstantiated ' + 'parameter type (%s).' % ty) + except TypeError: + pass + return FuncParamType(ty) + + +#: A dummy parameter type that just does nothing. From a user's +#: perspective this appears to just be the same as `STRING` but internally +#: no string conversion takes place. This is necessary to achieve the +#: same bytes/unicode behavior on Python 2/3 in situations where you want +#: to not convert argument types. This is usually useful when working +#: with file paths as they can appear in bytes and unicode. +#: +#: For path related uses the :class:`Path` type is a better choice but +#: there are situations where an unprocessed type is useful which is why +#: it is is provided. +#: +#: .. versionadded:: 4.0 +UNPROCESSED = UnprocessedParamType() + +#: A unicode string parameter type which is the implicit default. This +#: can also be selected by using ``str`` as type. +STRING = StringParamType() + +#: An integer parameter. This can also be selected by using ``int`` as +#: type. +INT = IntParamType() + +#: A floating point value parameter. This can also be selected by using +#: ``float`` as type. +FLOAT = FloatParamType() + +#: A boolean parameter. This is the default for boolean flags. This can +#: also be selected by using ``bool`` as a type. +BOOL = BoolParamType() + +#: A UUID parameter. +UUID = UUIDParameterType() diff --git a/app/lib/click/utils.py b/app/lib/click/utils.py new file mode 100644 index 0000000..eee626d --- /dev/null +++ b/app/lib/click/utils.py @@ -0,0 +1,415 @@ +import os +import sys + +from .globals import resolve_color_default + +from ._compat import text_type, open_stream, get_filesystem_encoding, \ + get_streerror, string_types, PY2, binary_streams, text_streams, \ + filename_to_ui, auto_wrap_for_ansi, strip_ansi, should_strip_ansi, \ + _default_text_stdout, _default_text_stderr, is_bytes, WIN + +if not PY2: + from ._compat import _find_binary_writer +elif WIN: + from ._winconsole import _get_windows_argv, \ + _hash_py_argv, _initial_argv_hash + + +echo_native_types = string_types + (bytes, bytearray) + + +def _posixify(name): + return '-'.join(name.split()).lower() + + +def safecall(func): + """Wraps a function so that it swallows exceptions.""" + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception: + pass + return wrapper + + +def make_str(value): + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(get_filesystem_encoding()) + except UnicodeError: + return value.decode('utf-8', 'replace') + return text_type(value) + + +def make_default_short_help(help, max_length=45): + words = help.split() + total_length = 0 + result = [] + done = False + + for word in words: + if word[-1:] == '.': + done = True + new_length = result and 1 + len(word) or len(word) + if total_length + new_length > max_length: + result.append('...') + done = True + else: + if result: + result.append(' ') + result.append(word) + if done: + break + total_length += new_length + + return ''.join(result) + + +class LazyFile(object): + """A lazy file works like a regular file but it does not fully open + the file but it does perform some basic checks early to see if the + filename parameter does make sense. This is useful for safely opening + files for writing. + """ + + def __init__(self, filename, mode='r', encoding=None, errors='strict', + atomic=False): + self.name = filename + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + + if filename == '-': + self._f, self.should_close = open_stream(filename, mode, + encoding, errors) + else: + if 'r' in mode: + # Open and close the file in case we're opening it for + # reading so that we can catch at least some errors in + # some cases early. + open(filename, mode).close() + self._f = None + self.should_close = True + + def __getattr__(self, name): + return getattr(self.open(), name) + + def __repr__(self): + if self._f is not None: + return repr(self._f) + return '' % (self.name, self.mode) + + def open(self): + """Opens the file if it's not yet open. This call might fail with + a :exc:`FileError`. Not handling this error will produce an error + that Click shows. + """ + if self._f is not None: + return self._f + try: + rv, self.should_close = open_stream(self.name, self.mode, + self.encoding, + self.errors, + atomic=self.atomic) + except (IOError, OSError) as e: + from .exceptions import FileError + raise FileError(self.name, hint=get_streerror(e)) + self._f = rv + return rv + + def close(self): + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self): + """This function only closes the file if it was opened by the lazy + file wrapper. For instance this will never close stdin. + """ + if self.should_close: + self.close() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + self.close_intelligently() + + def __iter__(self): + self.open() + return iter(self._f) + + +class KeepOpenFile(object): + + def __init__(self, file): + self._file = file + + def __getattr__(self, name): + return getattr(self._file, name) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, tb): + pass + + def __repr__(self): + return repr(self._file) + + def __iter__(self): + return iter(self._file) + + +def echo(message=None, file=None, nl=True, err=False, color=None): + """Prints a message plus a newline to the given file or stdout. On + first sight, this looks like the print function, but it has improved + support for handling Unicode and binary data that does not fail no + matter how badly configured the system is. + + Primarily it means that you can print binary data as well as Unicode + data on both 2.x and 3.x to the given file in the most appropriate way + possible. This is a very carefree function as in that it will try its + best to not fail. As of Click 6.0 this includes support for unicode + output on the Windows console. + + In addition to that, if `colorama`_ is installed, the echo function will + also support clever handling of ANSI codes. Essentially it will then + do the following: + + - add transparent handling of ANSI color codes on Windows. + - hide ANSI codes automatically if the destination file is not a + terminal. + + .. _colorama: http://pypi.python.org/pypi/colorama + + .. versionchanged:: 6.0 + As of Click 6.0 the echo function will properly support unicode + output on the windows console. Not that click does not modify + the interpreter in any way which means that `sys.stdout` or the + print statement or function will still not provide unicode support. + + .. versionchanged:: 2.0 + Starting with version 2.0 of Click, the echo function will work + with colorama if it's installed. + + .. versionadded:: 3.0 + The `err` parameter was added. + + .. versionchanged:: 4.0 + Added the `color` flag. + + :param message: the message to print + :param file: the file to write to (defaults to ``stdout``) + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``. This is faster and easier than calling + :func:`get_text_stderr` yourself. + :param nl: if set to `True` (the default) a newline is printed afterwards. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, echo_native_types): + message = text_type(message) + + if nl: + message = message or u'' + if isinstance(message, text_type): + message += u'\n' + else: + message += b'\n' + + # If there is a message, and we're in Python 3, and the value looks + # like bytes, we manually need to find the binary stream and write the + # message in there. This is done separately so that most stream + # types will work as you would expect. Eg: you can write to StringIO + # for other cases. + if message and not PY2 and is_bytes(message): + binary_file = _find_binary_writer(file) + if binary_file is not None: + file.flush() + binary_file.write(message) + binary_file.flush() + return + + # ANSI-style support. If there is no message or we are dealing with + # bytes nothing is happening. If we are connected to a file we want + # to strip colors. If we are on windows we either wrap the stream + # to strip the color or we use the colorama support to translate the + # ansi codes to API calls. + if message and not is_bytes(message): + color = resolve_color_default(color) + if should_strip_ansi(file, color): + message = strip_ansi(message) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file) + elif not color: + message = strip_ansi(message) + + if message: + file.write(message) + file.flush() + + +def get_binary_stream(name): + """Returns a system stream for byte processing. This essentially + returns the stream from the sys module with the given name but it + solves some compatibility issues between different Python versions. + Primarily this function is necessary for getting binary streams on + Python 3. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + """ + opener = binary_streams.get(name) + if opener is None: + raise TypeError('Unknown standard stream %r' % name) + return opener() + + +def get_text_stream(name, encoding=None, errors='strict'): + """Returns a system stream for text processing. This usually returns + a wrapped stream around a binary stream returned from + :func:`get_binary_stream` but it also can take shortcuts on Python 3 + for already correctly configured streams. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + :param encoding: overrides the detected default encoding. + :param errors: overrides the default error mode. + """ + opener = text_streams.get(name) + if opener is None: + raise TypeError('Unknown standard stream %r' % name) + return opener(encoding, errors) + + +def open_file(filename, mode='r', encoding=None, errors='strict', + lazy=False, atomic=False): + """This is similar to how the :class:`File` works but for manual + usage. Files are opened non lazy by default. This can open regular + files as well as stdin/stdout if ``'-'`` is passed. + + If stdin/stdout is returned the stream is wrapped so that the context + manager will not close the stream accidentally. This makes it possible + to always use the function like this without having to worry to + accidentally close a standard stream:: + + with open_file(filename) as f: + ... + + .. versionadded:: 3.0 + + :param filename: the name of the file to open (or ``'-'`` for stdin/stdout). + :param mode: the mode in which to open the file. + :param encoding: the encoding to use. + :param errors: the error handling for this file. + :param lazy: can be flipped to true to open the file lazily. + :param atomic: in atomic mode writes go into a temporary file and it's + moved on close. + """ + if lazy: + return LazyFile(filename, mode, encoding, errors, atomic=atomic) + f, should_close = open_stream(filename, mode, encoding, errors, + atomic=atomic) + if not should_close: + f = KeepOpenFile(f) + return f + + +def get_os_args(): + """This returns the argument part of sys.argv in the most appropriate + form for processing. What this means is that this return value is in + a format that works for Click to process but does not necessarily + correspond well to what's actually standard for the interpreter. + + On most environments the return value is ``sys.argv[:1]`` unchanged. + However if you are on Windows and running Python 2 the return value + will actually be a list of unicode strings instead because the + default behavior on that platform otherwise will not be able to + carry all possible values that sys.argv can have. + + .. versionadded:: 6.0 + """ + # We can only extract the unicode argv if sys.argv has not been + # changed since the startup of the application. + if PY2 and WIN and _initial_argv_hash == _hash_py_argv(): + return _get_windows_argv() + return sys.argv[1:] + + +def format_filename(filename, shorten=False): + """Formats a filename for user display. The main purpose of this + function is to ensure that the filename can be displayed at all. This + will decode the filename to unicode if necessary in a way that it will + not fail. Optionally, it can shorten the filename to not include the + full path to the filename. + + :param filename: formats a filename for UI display. This will also convert + the filename into unicode without failing. + :param shorten: this optionally shortens the filename to strip of the + path that leads up to it. + """ + if shorten: + filename = os.path.basename(filename) + return filename_to_ui(filename) + + +def get_app_dir(app_name, roaming=True, force_posix=False): + r"""Returns the config folder for the application. The default behavior + is to return whatever is most appropriate for the operating system. + + To give you an idea, for an app called ``"Foo Bar"``, something like + the following folders could be returned: + + Mac OS X: + ``~/Library/Application Support/Foo Bar`` + Mac OS X (POSIX): + ``~/.foo-bar`` + Unix: + ``~/.config/foo-bar`` + Unix (POSIX): + ``~/.foo-bar`` + Win XP (roaming): + ``C:\Documents and Settings\\Local Settings\Application Data\Foo Bar`` + Win XP (not roaming): + ``C:\Documents and Settings\\Application Data\Foo Bar`` + Win 7 (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Win 7 (not roaming): + ``C:\Users\\AppData\Local\Foo Bar`` + + .. versionadded:: 2.0 + + :param app_name: the application name. This should be properly capitalized + and can contain whitespace. + :param roaming: controls if the folder should be roaming or not on Windows. + Has no affect otherwise. + :param force_posix: if this is set to `True` then on any POSIX system the + folder will be stored in the home folder with a leading + dot instead of the XDG config home or darwin's + application support folder. + """ + if WIN: + key = roaming and 'APPDATA' or 'LOCALAPPDATA' + folder = os.environ.get(key) + if folder is None: + folder = os.path.expanduser('~') + return os.path.join(folder, app_name) + if force_posix: + return os.path.join(os.path.expanduser('~/.' + _posixify(app_name))) + if sys.platform == 'darwin': + return os.path.join(os.path.expanduser( + '~/Library/Application Support'), app_name) + return os.path.join( + os.environ.get('XDG_CONFIG_HOME', os.path.expanduser('~/.config')), + _posixify(app_name)) diff --git a/app/lib/dateutil/__init__.py b/app/lib/dateutil/__init__.py new file mode 100644 index 0000000..ba89aa7 --- /dev/null +++ b/app/lib/dateutil/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +__version__ = "2.6.0" diff --git a/app/lib/dateutil/_common.py b/app/lib/dateutil/_common.py new file mode 100644 index 0000000..cd2a338 --- /dev/null +++ b/app/lib/dateutil/_common.py @@ -0,0 +1,33 @@ +""" +Common code used in multiple modules. +""" + +class weekday(object): + __slots__ = ["weekday", "n"] + + def __init__(self, weekday, n=None): + self.weekday = weekday + self.n = n + + def __call__(self, n): + if n == self.n: + return self + else: + return self.__class__(self.weekday, n) + + def __eq__(self, other): + try: + if self.weekday != other.weekday or self.n != other.n: + return False + except AttributeError: + return False + return True + + __hash__ = None + + def __repr__(self): + s = ("MO", "TU", "WE", "TH", "FR", "SA", "SU")[self.weekday] + if not self.n: + return s + else: + return "%s(%+d)" % (s, self.n) diff --git a/app/lib/dateutil/easter.py b/app/lib/dateutil/easter.py new file mode 100644 index 0000000..e4def97 --- /dev/null +++ b/app/lib/dateutil/easter.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +""" +This module offers a generic easter computing method for any given year, using +Western, Orthodox or Julian algorithms. +""" + +import datetime + +__all__ = ["easter", "EASTER_JULIAN", "EASTER_ORTHODOX", "EASTER_WESTERN"] + +EASTER_JULIAN = 1 +EASTER_ORTHODOX = 2 +EASTER_WESTERN = 3 + + +def easter(year, method=EASTER_WESTERN): + """ + This method was ported from the work done by GM Arts, + on top of the algorithm by Claus Tondering, which was + based in part on the algorithm of Ouding (1940), as + quoted in "Explanatory Supplement to the Astronomical + Almanac", P. Kenneth Seidelmann, editor. + + This algorithm implements three different easter + calculation methods: + + 1 - Original calculation in Julian calendar, valid in + dates after 326 AD + 2 - Original method, with date converted to Gregorian + calendar, valid in years 1583 to 4099 + 3 - Revised method, in Gregorian calendar, valid in + years 1583 to 4099 as well + + These methods are represented by the constants: + + * ``EASTER_JULIAN = 1`` + * ``EASTER_ORTHODOX = 2`` + * ``EASTER_WESTERN = 3`` + + The default method is method 3. + + More about the algorithm may be found at: + + http://users.chariot.net.au/~gmarts/eastalg.htm + + and + + http://www.tondering.dk/claus/calendar.html + + """ + + if not (1 <= method <= 3): + raise ValueError("invalid method") + + # g - Golden year - 1 + # c - Century + # h - (23 - Epact) mod 30 + # i - Number of days from March 21 to Paschal Full Moon + # j - Weekday for PFM (0=Sunday, etc) + # p - Number of days from March 21 to Sunday on or before PFM + # (-6 to 28 methods 1 & 3, to 56 for method 2) + # e - Extra days to add for method 2 (converting Julian + # date to Gregorian date) + + y = year + g = y % 19 + e = 0 + if method < 3: + # Old method + i = (19*g + 15) % 30 + j = (y + y//4 + i) % 7 + if method == 2: + # Extra dates to convert Julian to Gregorian date + e = 10 + if y > 1600: + e = e + y//100 - 16 - (y//100 - 16)//4 + else: + # New method + c = y//100 + h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30 + i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11)) + j = (y + y//4 + i + 2 - c + c//4) % 7 + + # p can be from -6 to 56 corresponding to dates 22 March to 23 May + # (later dates apply to method 2, although 23 May never actually occurs) + p = i - j + e + d = 1 + (p + 27 + (p + 6)//40) % 31 + m = 3 + (p + 26)//30 + return datetime.date(int(y), int(m), int(d)) diff --git a/app/lib/dateutil/parser.py b/app/lib/dateutil/parser.py new file mode 100644 index 0000000..147b3f2 --- /dev/null +++ b/app/lib/dateutil/parser.py @@ -0,0 +1,1360 @@ +# -*- coding:iso-8859-1 -*- +""" +This module offers a generic date/time string parser which is able to parse +most known formats to represent a date and/or time. + +This module attempts to be forgiving with regards to unlikely input formats, +returning a datetime object even for dates which are ambiguous. If an element +of a date/time stamp is omitted, the following rules are applied: +- If AM or PM is left unspecified, a 24-hour clock is assumed, however, an hour + on a 12-hour clock (``0 <= hour <= 12``) *must* be specified if AM or PM is + specified. +- If a time zone is omitted, a timezone-naive datetime is returned. + +If any other elements are missing, they are taken from the +:class:`datetime.datetime` object passed to the parameter ``default``. If this +results in a day number exceeding the valid number of days per month, the +value falls back to the end of the month. + +Additional resources about date/time string formats can be found below: + +- `A summary of the international standard date and time notation + `_ +- `W3C Date and Time Formats `_ +- `Time Formats (Planetary Rings Node) `_ +- `CPAN ParseDate module + `_ +- `Java SimpleDateFormat Class + `_ +""" +from __future__ import unicode_literals + +import datetime +import string +import time +import collections +import re +from io import StringIO +from calendar import monthrange, isleap + +from six import text_type, binary_type, integer_types + +from . import relativedelta +from . import tz + +__all__ = ["parse", "parserinfo"] + + +class _timelex(object): + # Fractional seconds are sometimes split by a comma + _split_decimal = re.compile("([\.,])") + + def __init__(self, instream): + if isinstance(instream, binary_type): + instream = instream.decode() + + if isinstance(instream, text_type): + instream = StringIO(instream) + + if getattr(instream, 'read', None) is None: + raise TypeError('Parser must be a string or character stream, not ' + '{itype}'.format(itype=instream.__class__.__name__)) + + self.instream = instream + self.charstack = [] + self.tokenstack = [] + self.eof = False + + def get_token(self): + """ + This function breaks the time string into lexical units (tokens), which + can be parsed by the parser. Lexical units are demarcated by changes in + the character set, so any continuous string of letters is considered + one unit, any continuous string of numbers is considered one unit. + + The main complication arises from the fact that dots ('.') can be used + both as separators (e.g. "Sep.20.2009") or decimal points (e.g. + "4:30:21.447"). As such, it is necessary to read the full context of + any dot-separated strings before breaking it into tokens; as such, this + function maintains a "token stack", for when the ambiguous context + demands that multiple tokens be parsed at once. + """ + if self.tokenstack: + return self.tokenstack.pop(0) + + seenletters = False + token = None + state = None + + while not self.eof: + # We only realize that we've reached the end of a token when we + # find a character that's not part of the current token - since + # that character may be part of the next token, it's stored in the + # charstack. + if self.charstack: + nextchar = self.charstack.pop(0) + else: + nextchar = self.instream.read(1) + while nextchar == '\x00': + nextchar = self.instream.read(1) + + if not nextchar: + self.eof = True + break + elif not state: + # First character of the token - determines if we're starting + # to parse a word, a number or something else. + token = nextchar + if self.isword(nextchar): + state = 'a' + elif self.isnum(nextchar): + state = '0' + elif self.isspace(nextchar): + token = ' ' + break # emit token + else: + break # emit token + elif state == 'a': + # If we've already started reading a word, we keep reading + # letters until we find something that's not part of a word. + seenletters = True + if self.isword(nextchar): + token += nextchar + elif nextchar == '.': + token += nextchar + state = 'a.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == '0': + # If we've already started reading a number, we keep reading + # numbers until we find something that doesn't fit. + if self.isnum(nextchar): + token += nextchar + elif nextchar == '.' or (nextchar == ',' and len(token) >= 2): + token += nextchar + state = '0.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == 'a.': + # If we've seen some letters and a dot separator, continue + # parsing, and the tokens will be broken up later. + seenletters = True + if nextchar == '.' or self.isword(nextchar): + token += nextchar + elif self.isnum(nextchar) and token[-1] == '.': + token += nextchar + state = '0.' + else: + self.charstack.append(nextchar) + break # emit token + elif state == '0.': + # If we've seen at least one dot separator, keep going, we'll + # break up the tokens later. + if nextchar == '.' or self.isnum(nextchar): + token += nextchar + elif self.isword(nextchar) and token[-1] == '.': + token += nextchar + state = 'a.' + else: + self.charstack.append(nextchar) + break # emit token + + if (state in ('a.', '0.') and (seenletters or token.count('.') > 1 or + token[-1] in '.,')): + l = self._split_decimal.split(token) + token = l[0] + for tok in l[1:]: + if tok: + self.tokenstack.append(tok) + + if state == '0.' and token.count('.') == 0: + token = token.replace(',', '.') + + return token + + def __iter__(self): + return self + + def __next__(self): + token = self.get_token() + if token is None: + raise StopIteration + + return token + + def next(self): + return self.__next__() # Python 2.x support + + @classmethod + def split(cls, s): + return list(cls(s)) + + @classmethod + def isword(cls, nextchar): + """ Whether or not the next character is part of a word """ + return nextchar.isalpha() + + @classmethod + def isnum(cls, nextchar): + """ Whether the next character is part of a number """ + return nextchar.isdigit() + + @classmethod + def isspace(cls, nextchar): + """ Whether the next character is whitespace """ + return nextchar.isspace() + + +class _resultbase(object): + + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, None) + + def _repr(self, classname): + l = [] + for attr in self.__slots__: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, repr(value))) + return "%s(%s)" % (classname, ", ".join(l)) + + def __len__(self): + return (sum(getattr(self, attr) is not None + for attr in self.__slots__)) + + def __repr__(self): + return self._repr(self.__class__.__name__) + + +class parserinfo(object): + """ + Class which handles what inputs are accepted. Subclass this to customize + the language and acceptable values for each parameter. + + :param dayfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the day (``True``) or month (``False``). If + ``yearfirst`` is set to ``True``, this distinguishes between YDM + and YMD. Default is ``False``. + + :param yearfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the year. If ``True``, the first number is taken + to be the year, otherwise the last number is taken to be the year. + Default is ``False``. + """ + + # m from a.m/p.m, t from ISO T separator + JUMP = [" ", ".", ",", ";", "-", "/", "'", + "at", "on", "and", "ad", "m", "t", "of", + "st", "nd", "rd", "th"] + + WEEKDAYS = [("Mon", "Monday"), + ("Tue", "Tuesday"), + ("Wed", "Wednesday"), + ("Thu", "Thursday"), + ("Fri", "Friday"), + ("Sat", "Saturday"), + ("Sun", "Sunday")] + MONTHS = [("Jan", "January"), + ("Feb", "February"), + ("Mar", "March"), + ("Apr", "April"), + ("May", "May"), + ("Jun", "June"), + ("Jul", "July"), + ("Aug", "August"), + ("Sep", "Sept", "September"), + ("Oct", "October"), + ("Nov", "November"), + ("Dec", "December")] + HMS = [("h", "hour", "hours"), + ("m", "minute", "minutes"), + ("s", "second", "seconds")] + AMPM = [("am", "a"), + ("pm", "p")] + UTCZONE = ["UTC", "GMT", "Z"] + PERTAIN = ["of"] + TZOFFSET = {} + + def __init__(self, dayfirst=False, yearfirst=False): + self._jump = self._convert(self.JUMP) + self._weekdays = self._convert(self.WEEKDAYS) + self._months = self._convert(self.MONTHS) + self._hms = self._convert(self.HMS) + self._ampm = self._convert(self.AMPM) + self._utczone = self._convert(self.UTCZONE) + self._pertain = self._convert(self.PERTAIN) + + self.dayfirst = dayfirst + self.yearfirst = yearfirst + + self._year = time.localtime().tm_year + self._century = self._year // 100 * 100 + + def _convert(self, lst): + dct = {} + for i, v in enumerate(lst): + if isinstance(v, tuple): + for v in v: + dct[v.lower()] = i + else: + dct[v.lower()] = i + return dct + + def jump(self, name): + return name.lower() in self._jump + + def weekday(self, name): + if len(name) >= 3: + try: + return self._weekdays[name.lower()] + except KeyError: + pass + return None + + def month(self, name): + if len(name) >= 3: + try: + return self._months[name.lower()] + 1 + except KeyError: + pass + return None + + def hms(self, name): + try: + return self._hms[name.lower()] + except KeyError: + return None + + def ampm(self, name): + try: + return self._ampm[name.lower()] + except KeyError: + return None + + def pertain(self, name): + return name.lower() in self._pertain + + def utczone(self, name): + return name.lower() in self._utczone + + def tzoffset(self, name): + if name in self._utczone: + return 0 + + return self.TZOFFSET.get(name) + + def convertyear(self, year, century_specified=False): + if year < 100 and not century_specified: + year += self._century + if abs(year - self._year) >= 50: + if year < self._year: + year += 100 + else: + year -= 100 + return year + + def validate(self, res): + # move to info + if res.year is not None: + res.year = self.convertyear(res.year, res.century_specified) + + if res.tzoffset == 0 and not res.tzname or res.tzname == 'Z': + res.tzname = "UTC" + res.tzoffset = 0 + elif res.tzoffset != 0 and res.tzname and self.utczone(res.tzname): + res.tzoffset = 0 + return True + + +class _ymd(list): + def __init__(self, tzstr, *args, **kwargs): + super(self.__class__, self).__init__(*args, **kwargs) + self.century_specified = False + self.tzstr = tzstr + + @staticmethod + def token_could_be_year(token, year): + try: + return int(token) == year + except ValueError: + return False + + @staticmethod + def find_potential_year_tokens(year, tokens): + return [token for token in tokens if _ymd.token_could_be_year(token, year)] + + def find_probable_year_index(self, tokens): + """ + attempt to deduce if a pre 100 year was lost + due to padded zeros being taken off + """ + for index, token in enumerate(self): + potential_year_tokens = _ymd.find_potential_year_tokens(token, tokens) + if len(potential_year_tokens) == 1 and len(potential_year_tokens[0]) > 2: + return index + + def append(self, val): + if hasattr(val, '__len__'): + if val.isdigit() and len(val) > 2: + self.century_specified = True + elif val > 100: + self.century_specified = True + + super(self.__class__, self).append(int(val)) + + def resolve_ymd(self, mstridx, yearfirst, dayfirst): + len_ymd = len(self) + year, month, day = (None, None, None) + + if len_ymd > 3: + raise ValueError("More than three YMD values") + elif len_ymd == 1 or (mstridx != -1 and len_ymd == 2): + # One member, or two members with a month string + if mstridx != -1: + month = self[mstridx] + del self[mstridx] + + if len_ymd > 1 or mstridx == -1: + if self[0] > 31: + year = self[0] + else: + day = self[0] + + elif len_ymd == 2: + # Two members with numbers + if self[0] > 31: + # 99-01 + year, month = self + elif self[1] > 31: + # 01-99 + month, year = self + elif dayfirst and self[1] <= 12: + # 13-01 + day, month = self + else: + # 01-13 + month, day = self + + elif len_ymd == 3: + # Three members + if mstridx == 0: + month, day, year = self + elif mstridx == 1: + if self[0] > 31 or (yearfirst and self[2] <= 31): + # 99-Jan-01 + year, month, day = self + else: + # 01-Jan-01 + # Give precendence to day-first, since + # two-digit years is usually hand-written. + day, month, year = self + + elif mstridx == 2: + # WTF!? + if self[1] > 31: + # 01-99-Jan + day, year, month = self + else: + # 99-01-Jan + year, day, month = self + + else: + if self[0] > 31 or \ + self.find_probable_year_index(_timelex.split(self.tzstr)) == 0 or \ + (yearfirst and self[1] <= 12 and self[2] <= 31): + # 99-01-01 + if dayfirst and self[2] <= 12: + year, day, month = self + else: + year, month, day = self + elif self[0] > 12 or (dayfirst and self[1] <= 12): + # 13-01-01 + day, month, year = self + else: + # 01-13-01 + month, day, year = self + + return year, month, day + + +class parser(object): + def __init__(self, info=None): + self.info = info or parserinfo() + + def parse(self, timestr, default=None, ignoretz=False, tzinfos=None, **kwargs): + """ + Parse the date/time string into a :class:`datetime.datetime` object. + + :param timestr: + Any date/time string using the supported formats. + + :param default: + The default datetime object, if this is a datetime object and not + ``None``, elements specified in ``timestr`` replace elements in the + default object. + + :param ignoretz: + If set ``True``, time zones in parsed strings are ignored and a + naive :class:`datetime.datetime` object is returned. + + :param tzinfos: + Additional time zone names / aliases which may be present in the + string. This argument maps time zone names (and optionally offsets + from those time zones) to time zones. This parameter can be a + dictionary with timezone aliases mapping time zone names to time + zones or a function taking two parameters (``tzname`` and + ``tzoffset``) and returning a time zone. + + The timezones to which the names are mapped can be an integer + offset from UTC in minutes or a :class:`tzinfo` object. + + .. doctest:: + :options: +NORMALIZE_WHITESPACE + + >>> from dateutil.parser import parse + >>> from dateutil.tz import gettz + >>> tzinfos = {"BRST": -10800, "CST": gettz("America/Chicago")} + >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -10800)) + >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, + tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) + + This parameter is ignored if ``ignoretz`` is set. + + :param **kwargs: + Keyword arguments as passed to ``_parse()``. + + :return: + Returns a :class:`datetime.datetime` object or, if the + ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the + first element being a :class:`datetime.datetime` object, the second + a tuple containing the fuzzy tokens. + + :raises ValueError: + Raised for invalid or unknown string format, if the provided + :class:`tzinfo` is not in a valid format, or if an invalid date + would be created. + + :raises OverflowError: + Raised if the parsed date exceeds the largest valid C integer on + your system. + """ + + if default is None: + effective_dt = datetime.datetime.now() + default = datetime.datetime.now().replace(hour=0, minute=0, + second=0, microsecond=0) + else: + effective_dt = default + + res, skipped_tokens = self._parse(timestr, **kwargs) + + if res is None: + raise ValueError("Unknown string format") + + if len(res) == 0: + raise ValueError("String does not contain a date.") + + repl = {} + for attr in ("year", "month", "day", "hour", + "minute", "second", "microsecond"): + value = getattr(res, attr) + if value is not None: + repl[attr] = value + + if 'day' not in repl: + # If the default day exceeds the last day of the month, fall back to + # the end of the month. + cyear = default.year if res.year is None else res.year + cmonth = default.month if res.month is None else res.month + cday = default.day if res.day is None else res.day + + if cday > monthrange(cyear, cmonth)[1]: + repl['day'] = monthrange(cyear, cmonth)[1] + + ret = default.replace(**repl) + + if res.weekday is not None and not res.day: + ret = ret+relativedelta.relativedelta(weekday=res.weekday) + + if not ignoretz: + if (isinstance(tzinfos, collections.Callable) or + tzinfos and res.tzname in tzinfos): + + if isinstance(tzinfos, collections.Callable): + tzdata = tzinfos(res.tzname, res.tzoffset) + else: + tzdata = tzinfos.get(res.tzname) + + if isinstance(tzdata, datetime.tzinfo): + tzinfo = tzdata + elif isinstance(tzdata, text_type): + tzinfo = tz.tzstr(tzdata) + elif isinstance(tzdata, integer_types): + tzinfo = tz.tzoffset(res.tzname, tzdata) + else: + raise ValueError("Offset must be tzinfo subclass, " + "tz string, or int offset.") + ret = ret.replace(tzinfo=tzinfo) + elif res.tzname and res.tzname in time.tzname: + ret = ret.replace(tzinfo=tz.tzlocal()) + elif res.tzoffset == 0: + ret = ret.replace(tzinfo=tz.tzutc()) + elif res.tzoffset: + ret = ret.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset)) + + if kwargs.get('fuzzy_with_tokens', False): + return ret, skipped_tokens + else: + return ret + + class _result(_resultbase): + __slots__ = ["year", "month", "day", "weekday", + "hour", "minute", "second", "microsecond", + "tzname", "tzoffset", "ampm"] + + def _parse(self, timestr, dayfirst=None, yearfirst=None, fuzzy=False, + fuzzy_with_tokens=False): + """ + Private method which performs the heavy lifting of parsing, called from + ``parse()``, which passes on its ``kwargs`` to this function. + + :param timestr: + The string to parse. + + :param dayfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the day (``True``) or month (``False``). If + ``yearfirst`` is set to ``True``, this distinguishes between YDM + and YMD. If set to ``None``, this value is retrieved from the + current :class:`parserinfo` object (which itself defaults to + ``False``). + + :param yearfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the year. If ``True``, the first number is taken + to be the year, otherwise the last number is taken to be the year. + If this is set to ``None``, the value is retrieved from the current + :class:`parserinfo` object (which itself defaults to ``False``). + + :param fuzzy: + Whether to allow fuzzy parsing, allowing for string like "Today is + January 1, 2047 at 8:21:00AM". + + :param fuzzy_with_tokens: + If ``True``, ``fuzzy`` is automatically set to True, and the parser + will return a tuple where the first element is the parsed + :class:`datetime.datetime` datetimestamp and the second element is + a tuple containing the portions of the string which were ignored: + + .. doctest:: + + >>> from dateutil.parser import parse + >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) + (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) + + """ + if fuzzy_with_tokens: + fuzzy = True + + info = self.info + + if dayfirst is None: + dayfirst = info.dayfirst + + if yearfirst is None: + yearfirst = info.yearfirst + + res = self._result() + l = _timelex.split(timestr) # Splits the timestr into tokens + + # keep up with the last token skipped so we can recombine + # consecutively skipped tokens (-2 for when i begins at 0). + last_skipped_token_i = -2 + skipped_tokens = list() + + try: + # year/month/day list + ymd = _ymd(timestr) + + # Index of the month string in ymd + mstridx = -1 + + len_l = len(l) + i = 0 + while i < len_l: + + # Check if it's a number + try: + value_repr = l[i] + value = float(value_repr) + except ValueError: + value = None + + if value is not None: + # Token is a number + len_li = len(l[i]) + i += 1 + + if (len(ymd) == 3 and len_li in (2, 4) + and res.hour is None and (i >= len_l or (l[i] != ':' and + info.hms(l[i]) is None))): + # 19990101T23[59] + s = l[i-1] + res.hour = int(s[:2]) + + if len_li == 4: + res.minute = int(s[2:]) + + elif len_li == 6 or (len_li > 6 and l[i-1].find('.') == 6): + # YYMMDD or HHMMSS[.ss] + s = l[i-1] + + if not ymd and l[i-1].find('.') == -1: + #ymd.append(info.convertyear(int(s[:2]))) + + ymd.append(s[:2]) + ymd.append(s[2:4]) + ymd.append(s[4:]) + else: + # 19990101T235959[.59] + res.hour = int(s[:2]) + res.minute = int(s[2:4]) + res.second, res.microsecond = _parsems(s[4:]) + + elif len_li in (8, 12, 14): + # YYYYMMDD + s = l[i-1] + ymd.append(s[:4]) + ymd.append(s[4:6]) + ymd.append(s[6:8]) + + if len_li > 8: + res.hour = int(s[8:10]) + res.minute = int(s[10:12]) + + if len_li > 12: + res.second = int(s[12:]) + + elif ((i < len_l and info.hms(l[i]) is not None) or + (i+1 < len_l and l[i] == ' ' and + info.hms(l[i+1]) is not None)): + + # HH[ ]h or MM[ ]m or SS[.ss][ ]s + if l[i] == ' ': + i += 1 + + idx = info.hms(l[i]) + + while True: + if idx == 0: + res.hour = int(value) + + if value % 1: + res.minute = int(60*(value % 1)) + + elif idx == 1: + res.minute = int(value) + + if value % 1: + res.second = int(60*(value % 1)) + + elif idx == 2: + res.second, res.microsecond = \ + _parsems(value_repr) + + i += 1 + + if i >= len_l or idx == 2: + break + + # 12h00 + try: + value_repr = l[i] + value = float(value_repr) + except ValueError: + break + else: + i += 1 + idx += 1 + + if i < len_l: + newidx = info.hms(l[i]) + + if newidx is not None: + idx = newidx + + elif (i == len_l and l[i-2] == ' ' and + info.hms(l[i-3]) is not None): + # X h MM or X m SS + idx = info.hms(l[i-3]) + 1 + + if idx == 1: + res.minute = int(value) + + if value % 1: + res.second = int(60*(value % 1)) + elif idx == 2: + res.second, res.microsecond = \ + _parsems(value_repr) + i += 1 + + elif i+1 < len_l and l[i] == ':': + # HH:MM[:SS[.ss]] + res.hour = int(value) + i += 1 + value = float(l[i]) + res.minute = int(value) + + if value % 1: + res.second = int(60*(value % 1)) + + i += 1 + + if i < len_l and l[i] == ':': + res.second, res.microsecond = _parsems(l[i+1]) + i += 2 + + elif i < len_l and l[i] in ('-', '/', '.'): + sep = l[i] + ymd.append(value_repr) + i += 1 + + if i < len_l and not info.jump(l[i]): + try: + # 01-01[-01] + ymd.append(l[i]) + except ValueError: + # 01-Jan[-01] + value = info.month(l[i]) + + if value is not None: + ymd.append(value) + assert mstridx == -1 + mstridx = len(ymd)-1 + else: + return None, None + + i += 1 + + if i < len_l and l[i] == sep: + # We have three members + i += 1 + value = info.month(l[i]) + + if value is not None: + ymd.append(value) + mstridx = len(ymd)-1 + assert mstridx == -1 + else: + ymd.append(l[i]) + + i += 1 + elif i >= len_l or info.jump(l[i]): + if i+1 < len_l and info.ampm(l[i+1]) is not None: + # 12 am + res.hour = int(value) + + if res.hour < 12 and info.ampm(l[i+1]) == 1: + res.hour += 12 + elif res.hour == 12 and info.ampm(l[i+1]) == 0: + res.hour = 0 + + i += 1 + else: + # Year, month or day + ymd.append(value) + i += 1 + elif info.ampm(l[i]) is not None: + + # 12am + res.hour = int(value) + + if res.hour < 12 and info.ampm(l[i]) == 1: + res.hour += 12 + elif res.hour == 12 and info.ampm(l[i]) == 0: + res.hour = 0 + i += 1 + + elif not fuzzy: + return None, None + else: + i += 1 + continue + + # Check weekday + value = info.weekday(l[i]) + if value is not None: + res.weekday = value + i += 1 + continue + + # Check month name + value = info.month(l[i]) + if value is not None: + ymd.append(value) + assert mstridx == -1 + mstridx = len(ymd)-1 + + i += 1 + if i < len_l: + if l[i] in ('-', '/'): + # Jan-01[-99] + sep = l[i] + i += 1 + ymd.append(l[i]) + i += 1 + + if i < len_l and l[i] == sep: + # Jan-01-99 + i += 1 + ymd.append(l[i]) + i += 1 + + elif (i+3 < len_l and l[i] == l[i+2] == ' ' + and info.pertain(l[i+1])): + # Jan of 01 + # In this case, 01 is clearly year + try: + value = int(l[i+3]) + except ValueError: + # Wrong guess + pass + else: + # Convert it here to become unambiguous + ymd.append(str(info.convertyear(value))) + i += 4 + continue + + # Check am/pm + value = info.ampm(l[i]) + if value is not None: + # For fuzzy parsing, 'a' or 'am' (both valid English words) + # may erroneously trigger the AM/PM flag. Deal with that + # here. + val_is_ampm = True + + # If there's already an AM/PM flag, this one isn't one. + if fuzzy and res.ampm is not None: + val_is_ampm = False + + # If AM/PM is found and hour is not, raise a ValueError + if res.hour is None: + if fuzzy: + val_is_ampm = False + else: + raise ValueError('No hour specified with ' + + 'AM or PM flag.') + elif not 0 <= res.hour <= 12: + # If AM/PM is found, it's a 12 hour clock, so raise + # an error for invalid range + if fuzzy: + val_is_ampm = False + else: + raise ValueError('Invalid hour specified for ' + + '12-hour clock.') + + if val_is_ampm: + if value == 1 and res.hour < 12: + res.hour += 12 + elif value == 0 and res.hour == 12: + res.hour = 0 + + res.ampm = value + + i += 1 + continue + + # Check for a timezone name + if (res.hour is not None and len(l[i]) <= 5 and + res.tzname is None and res.tzoffset is None and + not [x for x in l[i] if x not in + string.ascii_uppercase]): + res.tzname = l[i] + res.tzoffset = info.tzoffset(res.tzname) + i += 1 + + # Check for something like GMT+3, or BRST+3. Notice + # that it doesn't mean "I am 3 hours after GMT", but + # "my time +3 is GMT". If found, we reverse the + # logic so that timezone parsing code will get it + # right. + if i < len_l and l[i] in ('+', '-'): + l[i] = ('+', '-')[l[i] == '+'] + res.tzoffset = None + if info.utczone(res.tzname): + # With something like GMT+3, the timezone + # is *not* GMT. + res.tzname = None + + continue + + # Check for a numbered timezone + if res.hour is not None and l[i] in ('+', '-'): + signal = (-1, 1)[l[i] == '+'] + i += 1 + len_li = len(l[i]) + + if len_li == 4: + # -0300 + res.tzoffset = int(l[i][:2])*3600+int(l[i][2:])*60 + elif i+1 < len_l and l[i+1] == ':': + # -03:00 + res.tzoffset = int(l[i])*3600+int(l[i+2])*60 + i += 2 + elif len_li <= 2: + # -[0]3 + res.tzoffset = int(l[i][:2])*3600 + else: + return None, None + i += 1 + + res.tzoffset *= signal + + # Look for a timezone name between parenthesis + if (i+3 < len_l and + info.jump(l[i]) and l[i+1] == '(' and l[i+3] == ')' and + 3 <= len(l[i+2]) <= 5 and + not [x for x in l[i+2] + if x not in string.ascii_uppercase]): + # -0300 (BRST) + res.tzname = l[i+2] + i += 4 + continue + + # Check jumps + if not (info.jump(l[i]) or fuzzy): + return None, None + + if last_skipped_token_i == i - 1: + # recombine the tokens + skipped_tokens[-1] += l[i] + else: + # just append + skipped_tokens.append(l[i]) + last_skipped_token_i = i + i += 1 + + # Process year/month/day + year, month, day = ymd.resolve_ymd(mstridx, yearfirst, dayfirst) + if year is not None: + res.year = year + res.century_specified = ymd.century_specified + + if month is not None: + res.month = month + + if day is not None: + res.day = day + + except (IndexError, ValueError, AssertionError): + return None, None + + if not info.validate(res): + return None, None + + if fuzzy_with_tokens: + return res, tuple(skipped_tokens) + else: + return res, None + +DEFAULTPARSER = parser() + + +def parse(timestr, parserinfo=None, **kwargs): + """ + + Parse a string in one of the supported formats, using the + ``parserinfo`` parameters. + + :param timestr: + A string containing a date/time stamp. + + :param parserinfo: + A :class:`parserinfo` object containing parameters for the parser. + If ``None``, the default arguments to the :class:`parserinfo` + constructor are used. + + The ``**kwargs`` parameter takes the following keyword arguments: + + :param default: + The default datetime object, if this is a datetime object and not + ``None``, elements specified in ``timestr`` replace elements in the + default object. + + :param ignoretz: + If set ``True``, time zones in parsed strings are ignored and a naive + :class:`datetime` object is returned. + + :param tzinfos: + Additional time zone names / aliases which may be present in the + string. This argument maps time zone names (and optionally offsets + from those time zones) to time zones. This parameter can be a + dictionary with timezone aliases mapping time zone names to time + zones or a function taking two parameters (``tzname`` and + ``tzoffset``) and returning a time zone. + + The timezones to which the names are mapped can be an integer + offset from UTC in minutes or a :class:`tzinfo` object. + + .. doctest:: + :options: +NORMALIZE_WHITESPACE + + >>> from dateutil.parser import parse + >>> from dateutil.tz import gettz + >>> tzinfos = {"BRST": -10800, "CST": gettz("America/Chicago")} + >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -10800)) + >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) + datetime.datetime(2012, 1, 19, 17, 21, + tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) + + This parameter is ignored if ``ignoretz`` is set. + + :param dayfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the day (``True``) or month (``False``). If + ``yearfirst`` is set to ``True``, this distinguishes between YDM and + YMD. If set to ``None``, this value is retrieved from the current + :class:`parserinfo` object (which itself defaults to ``False``). + + :param yearfirst: + Whether to interpret the first value in an ambiguous 3-integer date + (e.g. 01/05/09) as the year. If ``True``, the first number is taken to + be the year, otherwise the last number is taken to be the year. If + this is set to ``None``, the value is retrieved from the current + :class:`parserinfo` object (which itself defaults to ``False``). + + :param fuzzy: + Whether to allow fuzzy parsing, allowing for string like "Today is + January 1, 2047 at 8:21:00AM". + + :param fuzzy_with_tokens: + If ``True``, ``fuzzy`` is automatically set to True, and the parser + will return a tuple where the first element is the parsed + :class:`datetime.datetime` datetimestamp and the second element is + a tuple containing the portions of the string which were ignored: + + .. doctest:: + + >>> from dateutil.parser import parse + >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) + (datetime.datetime(2011, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) + + :return: + Returns a :class:`datetime.datetime` object or, if the + ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the + first element being a :class:`datetime.datetime` object, the second + a tuple containing the fuzzy tokens. + + :raises ValueError: + Raised for invalid or unknown string format, if the provided + :class:`tzinfo` is not in a valid format, or if an invalid date + would be created. + + :raises OverflowError: + Raised if the parsed date exceeds the largest valid C integer on + your system. + """ + if parserinfo: + return parser(parserinfo).parse(timestr, **kwargs) + else: + return DEFAULTPARSER.parse(timestr, **kwargs) + + +class _tzparser(object): + + class _result(_resultbase): + + __slots__ = ["stdabbr", "stdoffset", "dstabbr", "dstoffset", + "start", "end"] + + class _attr(_resultbase): + __slots__ = ["month", "week", "weekday", + "yday", "jyday", "day", "time"] + + def __repr__(self): + return self._repr("") + + def __init__(self): + _resultbase.__init__(self) + self.start = self._attr() + self.end = self._attr() + + def parse(self, tzstr): + res = self._result() + l = _timelex.split(tzstr) + try: + + len_l = len(l) + + i = 0 + while i < len_l: + # BRST+3[BRDT[+2]] + j = i + while j < len_l and not [x for x in l[j] + if x in "0123456789:,-+"]: + j += 1 + if j != i: + if not res.stdabbr: + offattr = "stdoffset" + res.stdabbr = "".join(l[i:j]) + else: + offattr = "dstoffset" + res.dstabbr = "".join(l[i:j]) + i = j + if (i < len_l and (l[i] in ('+', '-') or l[i][0] in + "0123456789")): + if l[i] in ('+', '-'): + # Yes, that's right. See the TZ variable + # documentation. + signal = (1, -1)[l[i] == '+'] + i += 1 + else: + signal = -1 + len_li = len(l[i]) + if len_li == 4: + # -0300 + setattr(res, offattr, (int(l[i][:2])*3600 + + int(l[i][2:])*60)*signal) + elif i+1 < len_l and l[i+1] == ':': + # -03:00 + setattr(res, offattr, + (int(l[i])*3600+int(l[i+2])*60)*signal) + i += 2 + elif len_li <= 2: + # -[0]3 + setattr(res, offattr, + int(l[i][:2])*3600*signal) + else: + return None + i += 1 + if res.dstabbr: + break + else: + break + + if i < len_l: + for j in range(i, len_l): + if l[j] == ';': + l[j] = ',' + + assert l[i] == ',' + + i += 1 + + if i >= len_l: + pass + elif (8 <= l.count(',') <= 9 and + not [y for x in l[i:] if x != ',' + for y in x if y not in "0123456789"]): + # GMT0BST,3,0,30,3600,10,0,26,7200[,3600] + for x in (res.start, res.end): + x.month = int(l[i]) + i += 2 + if l[i] == '-': + value = int(l[i+1])*-1 + i += 1 + else: + value = int(l[i]) + i += 2 + if value: + x.week = value + x.weekday = (int(l[i])-1) % 7 + else: + x.day = int(l[i]) + i += 2 + x.time = int(l[i]) + i += 2 + if i < len_l: + if l[i] in ('-', '+'): + signal = (-1, 1)[l[i] == "+"] + i += 1 + else: + signal = 1 + res.dstoffset = (res.stdoffset+int(l[i]))*signal + elif (l.count(',') == 2 and l[i:].count('/') <= 2 and + not [y for x in l[i:] if x not in (',', '/', 'J', 'M', + '.', '-', ':') + for y in x if y not in "0123456789"]): + for x in (res.start, res.end): + if l[i] == 'J': + # non-leap year day (1 based) + i += 1 + x.jyday = int(l[i]) + elif l[i] == 'M': + # month[-.]week[-.]weekday + i += 1 + x.month = int(l[i]) + i += 1 + assert l[i] in ('-', '.') + i += 1 + x.week = int(l[i]) + if x.week == 5: + x.week = -1 + i += 1 + assert l[i] in ('-', '.') + i += 1 + x.weekday = (int(l[i])-1) % 7 + else: + # year day (zero based) + x.yday = int(l[i])+1 + + i += 1 + + if i < len_l and l[i] == '/': + i += 1 + # start time + len_li = len(l[i]) + if len_li == 4: + # -0300 + x.time = (int(l[i][:2])*3600+int(l[i][2:])*60) + elif i+1 < len_l and l[i+1] == ':': + # -03:00 + x.time = int(l[i])*3600+int(l[i+2])*60 + i += 2 + if i+1 < len_l and l[i+1] == ':': + i += 2 + x.time += int(l[i]) + elif len_li <= 2: + # -[0]3 + x.time = (int(l[i][:2])*3600) + else: + return None + i += 1 + + assert i == len_l or l[i] == ',' + + i += 1 + + assert i >= len_l + + except (IndexError, ValueError, AssertionError): + return None + + return res + + +DEFAULTTZPARSER = _tzparser() + + +def _parsetz(tzstr): + return DEFAULTTZPARSER.parse(tzstr) + + +def _parsems(value): + """Parse a I[.F] seconds value into (seconds, microseconds).""" + if "." not in value: + return int(value), 0 + else: + i, f = value.split(".") + return int(i), int(f.ljust(6, "0")[:6]) + + +# vim:ts=4:sw=4:et diff --git a/app/lib/dateutil/relativedelta.py b/app/lib/dateutil/relativedelta.py new file mode 100644 index 0000000..7e3bd12 --- /dev/null +++ b/app/lib/dateutil/relativedelta.py @@ -0,0 +1,531 @@ +# -*- coding: utf-8 -*- +import datetime +import calendar + +import operator +from math import copysign + +from six import integer_types +from warnings import warn + +from ._common import weekday + +MO, TU, WE, TH, FR, SA, SU = weekdays = tuple([weekday(x) for x in range(7)]) + +__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + + +class relativedelta(object): + """ + The relativedelta type is based on the specification of the excellent + work done by M.-A. Lemburg in his + `mx.DateTime `_ extension. + However, notice that this type does *NOT* implement the same algorithm as + his work. Do *NOT* expect it to behave like mx.DateTime's counterpart. + + There are two different ways to build a relativedelta instance. The + first one is passing it two date/datetime classes:: + + relativedelta(datetime1, datetime2) + + The second one is passing it any number of the following keyword arguments:: + + relativedelta(arg1=x,arg2=y,arg3=z...) + + year, month, day, hour, minute, second, microsecond: + Absolute information (argument is singular); adding or subtracting a + relativedelta with absolute information does not perform an aritmetic + operation, but rather REPLACES the corresponding value in the + original datetime with the value(s) in relativedelta. + + years, months, weeks, days, hours, minutes, seconds, microseconds: + Relative information, may be negative (argument is plural); adding + or subtracting a relativedelta with relative information performs + the corresponding aritmetic operation on the original datetime value + with the information in the relativedelta. + + weekday: + One of the weekday instances (MO, TU, etc). These instances may + receive a parameter N, specifying the Nth weekday, which could + be positive or negative (like MO(+1) or MO(-2). Not specifying + it is the same as specifying +1. You can also use an integer, + where 0=MO. + + leapdays: + Will add given days to the date found, if year is a leap + year, and the date found is post 28 of february. + + yearday, nlyearday: + Set the yearday or the non-leap year day (jump leap days). + These are converted to day/month/leapdays information. + + Here is the behavior of operations with relativedelta: + + 1. Calculate the absolute year, using the 'year' argument, or the + original datetime year, if the argument is not present. + + 2. Add the relative 'years' argument to the absolute year. + + 3. Do steps 1 and 2 for month/months. + + 4. Calculate the absolute day, using the 'day' argument, or the + original datetime day, if the argument is not present. Then, + subtract from the day until it fits in the year and month + found after their operations. + + 5. Add the relative 'days' argument to the absolute day. Notice + that the 'weeks' argument is multiplied by 7 and added to + 'days'. + + 6. Do steps 1 and 2 for hour/hours, minute/minutes, second/seconds, + microsecond/microseconds. + + 7. If the 'weekday' argument is present, calculate the weekday, + with the given (wday, nth) tuple. wday is the index of the + weekday (0-6, 0=Mon), and nth is the number of weeks to add + forward or backward, depending on its signal. Notice that if + the calculated date is already Monday, for example, using + (0, 1) or (0, -1) won't change the day. + """ + + def __init__(self, dt1=None, dt2=None, + years=0, months=0, days=0, leapdays=0, weeks=0, + hours=0, minutes=0, seconds=0, microseconds=0, + year=None, month=None, day=None, weekday=None, + yearday=None, nlyearday=None, + hour=None, minute=None, second=None, microsecond=None): + + # Check for non-integer values in integer-only quantities + if any(x is not None and x != int(x) for x in (years, months)): + raise ValueError("Non-integer years and months are " + "ambiguous and not currently supported.") + + if dt1 and dt2: + # datetime is a subclass of date. So both must be date + if not (isinstance(dt1, datetime.date) and + isinstance(dt2, datetime.date)): + raise TypeError("relativedelta only diffs datetime/date") + + # We allow two dates, or two datetimes, so we coerce them to be + # of the same type + if (isinstance(dt1, datetime.datetime) != + isinstance(dt2, datetime.datetime)): + if not isinstance(dt1, datetime.datetime): + dt1 = datetime.datetime.fromordinal(dt1.toordinal()) + elif not isinstance(dt2, datetime.datetime): + dt2 = datetime.datetime.fromordinal(dt2.toordinal()) + + self.years = 0 + self.months = 0 + self.days = 0 + self.leapdays = 0 + self.hours = 0 + self.minutes = 0 + self.seconds = 0 + self.microseconds = 0 + self.year = None + self.month = None + self.day = None + self.weekday = None + self.hour = None + self.minute = None + self.second = None + self.microsecond = None + self._has_time = 0 + + # Get year / month delta between the two + months = (dt1.year - dt2.year) * 12 + (dt1.month - dt2.month) + self._set_months(months) + + # Remove the year/month delta so the timedelta is just well-defined + # time units (seconds, days and microseconds) + dtm = self.__radd__(dt2) + + # If we've overshot our target, make an adjustment + if dt1 < dt2: + compare = operator.gt + increment = 1 + else: + compare = operator.lt + increment = -1 + + while compare(dt1, dtm): + months += increment + self._set_months(months) + dtm = self.__radd__(dt2) + + # Get the timedelta between the "months-adjusted" date and dt1 + delta = dt1 - dtm + self.seconds = delta.seconds + delta.days * 86400 + self.microseconds = delta.microseconds + else: + # Relative information + self.years = years + self.months = months + self.days = days + weeks * 7 + self.leapdays = leapdays + self.hours = hours + self.minutes = minutes + self.seconds = seconds + self.microseconds = microseconds + + # Absolute information + self.year = year + self.month = month + self.day = day + self.hour = hour + self.minute = minute + self.second = second + self.microsecond = microsecond + + if any(x is not None and int(x) != x + for x in (year, month, day, hour, + minute, second, microsecond)): + # For now we'll deprecate floats - later it'll be an error. + warn("Non-integer value passed as absolute information. " + + "This is not a well-defined condition and will raise " + + "errors in future versions.", DeprecationWarning) + + + if isinstance(weekday, integer_types): + self.weekday = weekdays[weekday] + else: + self.weekday = weekday + + yday = 0 + if nlyearday: + yday = nlyearday + elif yearday: + yday = yearday + if yearday > 59: + self.leapdays = -1 + if yday: + ydayidx = [31, 59, 90, 120, 151, 181, 212, + 243, 273, 304, 334, 366] + for idx, ydays in enumerate(ydayidx): + if yday <= ydays: + self.month = idx+1 + if idx == 0: + self.day = yday + else: + self.day = yday-ydayidx[idx-1] + break + else: + raise ValueError("invalid year day (%d)" % yday) + + self._fix() + + def _fix(self): + if abs(self.microseconds) > 999999: + s = _sign(self.microseconds) + div, mod = divmod(self.microseconds * s, 1000000) + self.microseconds = mod * s + self.seconds += div * s + if abs(self.seconds) > 59: + s = _sign(self.seconds) + div, mod = divmod(self.seconds * s, 60) + self.seconds = mod * s + self.minutes += div * s + if abs(self.minutes) > 59: + s = _sign(self.minutes) + div, mod = divmod(self.minutes * s, 60) + self.minutes = mod * s + self.hours += div * s + if abs(self.hours) > 23: + s = _sign(self.hours) + div, mod = divmod(self.hours * s, 24) + self.hours = mod * s + self.days += div * s + if abs(self.months) > 11: + s = _sign(self.months) + div, mod = divmod(self.months * s, 12) + self.months = mod * s + self.years += div * s + if (self.hours or self.minutes or self.seconds or self.microseconds + or self.hour is not None or self.minute is not None or + self.second is not None or self.microsecond is not None): + self._has_time = 1 + else: + self._has_time = 0 + + @property + def weeks(self): + return self.days // 7 + @weeks.setter + def weeks(self, value): + self.days = self.days - (self.weeks * 7) + value * 7 + + def _set_months(self, months): + self.months = months + if abs(self.months) > 11: + s = _sign(self.months) + div, mod = divmod(self.months * s, 12) + self.months = mod * s + self.years = div * s + else: + self.years = 0 + + def normalized(self): + """ + Return a version of this object represented entirely using integer + values for the relative attributes. + + >>> relativedelta(days=1.5, hours=2).normalized() + relativedelta(days=1, hours=14) + + :return: + Returns a :class:`dateutil.relativedelta.relativedelta` object. + """ + # Cascade remainders down (rounding each to roughly nearest microsecond) + days = int(self.days) + + hours_f = round(self.hours + 24 * (self.days - days), 11) + hours = int(hours_f) + + minutes_f = round(self.minutes + 60 * (hours_f - hours), 10) + minutes = int(minutes_f) + + seconds_f = round(self.seconds + 60 * (minutes_f - minutes), 8) + seconds = int(seconds_f) + + microseconds = round(self.microseconds + 1e6 * (seconds_f - seconds)) + + # Constructor carries overflow back up with call to _fix() + return self.__class__(years=self.years, months=self.months, + days=days, hours=hours, minutes=minutes, + seconds=seconds, microseconds=microseconds, + leapdays=self.leapdays, year=self.year, + month=self.month, day=self.day, + weekday=self.weekday, hour=self.hour, + minute=self.minute, second=self.second, + microsecond=self.microsecond) + + def __add__(self, other): + if isinstance(other, relativedelta): + return self.__class__(years=other.years + self.years, + months=other.months + self.months, + days=other.days + self.days, + hours=other.hours + self.hours, + minutes=other.minutes + self.minutes, + seconds=other.seconds + self.seconds, + microseconds=(other.microseconds + + self.microseconds), + leapdays=other.leapdays or self.leapdays, + year=other.year or self.year, + month=other.month or self.month, + day=other.day or self.day, + weekday=other.weekday or self.weekday, + hour=other.hour or self.hour, + minute=other.minute or self.minute, + second=other.second or self.second, + microsecond=(other.microsecond or + self.microsecond)) + if isinstance(other, datetime.timedelta): + return self.__class__(years=self.years, + months=self.months, + days=self.days + other.days, + hours=self.hours, + minutes=self.minutes, + seconds=self.seconds + other.seconds, + microseconds=self.microseconds + other.microseconds, + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + if not isinstance(other, datetime.date): + return NotImplemented + elif self._has_time and not isinstance(other, datetime.datetime): + other = datetime.datetime.fromordinal(other.toordinal()) + year = (self.year or other.year)+self.years + month = self.month or other.month + if self.months: + assert 1 <= abs(self.months) <= 12 + month += self.months + if month > 12: + year += 1 + month -= 12 + elif month < 1: + year -= 1 + month += 12 + day = min(calendar.monthrange(year, month)[1], + self.day or other.day) + repl = {"year": year, "month": month, "day": day} + for attr in ["hour", "minute", "second", "microsecond"]: + value = getattr(self, attr) + if value is not None: + repl[attr] = value + days = self.days + if self.leapdays and month > 2 and calendar.isleap(year): + days += self.leapdays + ret = (other.replace(**repl) + + datetime.timedelta(days=days, + hours=self.hours, + minutes=self.minutes, + seconds=self.seconds, + microseconds=self.microseconds)) + if self.weekday: + weekday, nth = self.weekday.weekday, self.weekday.n or 1 + jumpdays = (abs(nth) - 1) * 7 + if nth > 0: + jumpdays += (7 - ret.weekday() + weekday) % 7 + else: + jumpdays += (ret.weekday() - weekday) % 7 + jumpdays *= -1 + ret += datetime.timedelta(days=jumpdays) + return ret + + def __radd__(self, other): + return self.__add__(other) + + def __rsub__(self, other): + return self.__neg__().__radd__(other) + + def __sub__(self, other): + if not isinstance(other, relativedelta): + return NotImplemented # In case the other object defines __rsub__ + return self.__class__(years=self.years - other.years, + months=self.months - other.months, + days=self.days - other.days, + hours=self.hours - other.hours, + minutes=self.minutes - other.minutes, + seconds=self.seconds - other.seconds, + microseconds=self.microseconds - other.microseconds, + leapdays=self.leapdays or other.leapdays, + year=self.year or other.year, + month=self.month or other.month, + day=self.day or other.day, + weekday=self.weekday or other.weekday, + hour=self.hour or other.hour, + minute=self.minute or other.minute, + second=self.second or other.second, + microsecond=self.microsecond or other.microsecond) + + def __neg__(self): + return self.__class__(years=-self.years, + months=-self.months, + days=-self.days, + hours=-self.hours, + minutes=-self.minutes, + seconds=-self.seconds, + microseconds=-self.microseconds, + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + def __bool__(self): + return not (not self.years and + not self.months and + not self.days and + not self.hours and + not self.minutes and + not self.seconds and + not self.microseconds and + not self.leapdays and + self.year is None and + self.month is None and + self.day is None and + self.weekday is None and + self.hour is None and + self.minute is None and + self.second is None and + self.microsecond is None) + # Compatibility with Python 2.x + __nonzero__ = __bool__ + + def __mul__(self, other): + try: + f = float(other) + except TypeError: + return NotImplemented + + return self.__class__(years=int(self.years * f), + months=int(self.months * f), + days=int(self.days * f), + hours=int(self.hours * f), + minutes=int(self.minutes * f), + seconds=int(self.seconds * f), + microseconds=int(self.microseconds * f), + leapdays=self.leapdays, + year=self.year, + month=self.month, + day=self.day, + weekday=self.weekday, + hour=self.hour, + minute=self.minute, + second=self.second, + microsecond=self.microsecond) + + __rmul__ = __mul__ + + def __eq__(self, other): + if not isinstance(other, relativedelta): + return NotImplemented + if self.weekday or other.weekday: + if not self.weekday or not other.weekday: + return False + if self.weekday.weekday != other.weekday.weekday: + return False + n1, n2 = self.weekday.n, other.weekday.n + if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)): + return False + return (self.years == other.years and + self.months == other.months and + self.days == other.days and + self.hours == other.hours and + self.minutes == other.minutes and + self.seconds == other.seconds and + self.microseconds == other.microseconds and + self.leapdays == other.leapdays and + self.year == other.year and + self.month == other.month and + self.day == other.day and + self.hour == other.hour and + self.minute == other.minute and + self.second == other.second and + self.microsecond == other.microsecond) + + __hash__ = None + + def __ne__(self, other): + return not self.__eq__(other) + + def __div__(self, other): + try: + reciprocal = 1 / float(other) + except TypeError: + return NotImplemented + + return self.__mul__(reciprocal) + + __truediv__ = __div__ + + def __repr__(self): + l = [] + for attr in ["years", "months", "days", "leapdays", + "hours", "minutes", "seconds", "microseconds"]: + value = getattr(self, attr) + if value: + l.append("{attr}={value:+g}".format(attr=attr, value=value)) + for attr in ["year", "month", "day", "weekday", + "hour", "minute", "second", "microsecond"]: + value = getattr(self, attr) + if value is not None: + l.append("{attr}={value}".format(attr=attr, value=repr(value))) + return "{classname}({attrs})".format(classname=self.__class__.__name__, + attrs=", ".join(l)) + +def _sign(x): + return int(copysign(1, x)) + +# vim:ts=4:sw=4:et diff --git a/app/lib/dateutil/rrule.py b/app/lib/dateutil/rrule.py new file mode 100644 index 0000000..da94351 --- /dev/null +++ b/app/lib/dateutil/rrule.py @@ -0,0 +1,1607 @@ +# -*- coding: utf-8 -*- +""" +The rrule module offers a small, complete, and very fast, implementation of +the recurrence rules documented in the +`iCalendar RFC `_, +including support for caching of results. +""" +import itertools +import datetime +import calendar +import sys + +try: + from math import gcd +except ImportError: + from fractions import gcd + +from six import advance_iterator, integer_types +from six.moves import _thread, range +import heapq + +from ._common import weekday as weekdaybase + +# For warning about deprecation of until and count +from warnings import warn + +__all__ = ["rrule", "rruleset", "rrulestr", + "YEARLY", "MONTHLY", "WEEKLY", "DAILY", + "HOURLY", "MINUTELY", "SECONDLY", + "MO", "TU", "WE", "TH", "FR", "SA", "SU"] + +# Every mask is 7 days longer to handle cross-year weekly periods. +M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30 + + [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7) +M365MASK = list(M366MASK) +M29, M30, M31 = list(range(1, 30)), list(range(1, 31)), list(range(1, 32)) +MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) +MDAY365MASK = list(MDAY366MASK) +M29, M30, M31 = list(range(-29, 0)), list(range(-30, 0)), list(range(-31, 0)) +NMDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) +NMDAY365MASK = list(NMDAY366MASK) +M366RANGE = (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366) +M365RANGE = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365) +WDAYMASK = [0, 1, 2, 3, 4, 5, 6]*55 +del M29, M30, M31, M365MASK[59], MDAY365MASK[59], NMDAY365MASK[31] +MDAY365MASK = tuple(MDAY365MASK) +M365MASK = tuple(M365MASK) + +FREQNAMES = ['YEARLY','MONTHLY','WEEKLY','DAILY','HOURLY','MINUTELY','SECONDLY'] + +(YEARLY, + MONTHLY, + WEEKLY, + DAILY, + HOURLY, + MINUTELY, + SECONDLY) = list(range(7)) + +# Imported on demand. +easter = None +parser = None + +class weekday(weekdaybase): + """ + This version of weekday does not allow n = 0. + """ + def __init__(self, wkday, n=None): + if n == 0: + raise ValueError("Can't create weekday with n==0") + + super(weekday, self).__init__(wkday, n) + +MO, TU, WE, TH, FR, SA, SU = weekdays = tuple([weekday(x) for x in range(7)]) + + +def _invalidates_cache(f): + """ + Decorator for rruleset methods which may invalidate the + cached length. + """ + def inner_func(self, *args, **kwargs): + rv = f(self, *args, **kwargs) + self._invalidate_cache() + return rv + + return inner_func + + +class rrulebase(object): + def __init__(self, cache=False): + if cache: + self._cache = [] + self._cache_lock = _thread.allocate_lock() + self._invalidate_cache() + else: + self._cache = None + self._cache_complete = False + self._len = None + + def __iter__(self): + if self._cache_complete: + return iter(self._cache) + elif self._cache is None: + return self._iter() + else: + return self._iter_cached() + + def _invalidate_cache(self): + if self._cache is not None: + self._cache = [] + self._cache_complete = False + self._cache_gen = self._iter() + + if self._cache_lock.locked(): + self._cache_lock.release() + + self._len = None + + def _iter_cached(self): + i = 0 + gen = self._cache_gen + cache = self._cache + acquire = self._cache_lock.acquire + release = self._cache_lock.release + while gen: + if i == len(cache): + acquire() + if self._cache_complete: + break + try: + for j in range(10): + cache.append(advance_iterator(gen)) + except StopIteration: + self._cache_gen = gen = None + self._cache_complete = True + break + release() + yield cache[i] + i += 1 + while i < self._len: + yield cache[i] + i += 1 + + def __getitem__(self, item): + if self._cache_complete: + return self._cache[item] + elif isinstance(item, slice): + if item.step and item.step < 0: + return list(iter(self))[item] + else: + return list(itertools.islice(self, + item.start or 0, + item.stop or sys.maxsize, + item.step or 1)) + elif item >= 0: + gen = iter(self) + try: + for i in range(item+1): + res = advance_iterator(gen) + except StopIteration: + raise IndexError + return res + else: + return list(iter(self))[item] + + def __contains__(self, item): + if self._cache_complete: + return item in self._cache + else: + for i in self: + if i == item: + return True + elif i > item: + return False + return False + + # __len__() introduces a large performance penality. + def count(self): + """ Returns the number of recurrences in this set. It will have go + trough the whole recurrence, if this hasn't been done before. """ + if self._len is None: + for x in self: + pass + return self._len + + def before(self, dt, inc=False): + """ Returns the last recurrence before the given datetime instance. The + inc keyword defines what happens if dt is an occurrence. With + inc=True, if dt itself is an occurrence, it will be returned. """ + if self._cache_complete: + gen = self._cache + else: + gen = self + last = None + if inc: + for i in gen: + if i > dt: + break + last = i + else: + for i in gen: + if i >= dt: + break + last = i + return last + + def after(self, dt, inc=False): + """ Returns the first recurrence after the given datetime instance. The + inc keyword defines what happens if dt is an occurrence. With + inc=True, if dt itself is an occurrence, it will be returned. """ + if self._cache_complete: + gen = self._cache + else: + gen = self + if inc: + for i in gen: + if i >= dt: + return i + else: + for i in gen: + if i > dt: + return i + return None + + def xafter(self, dt, count=None, inc=False): + """ + Generator which yields up to `count` recurrences after the given + datetime instance, equivalent to `after`. + + :param dt: + The datetime at which to start generating recurrences. + + :param count: + The maximum number of recurrences to generate. If `None` (default), + dates are generated until the recurrence rule is exhausted. + + :param inc: + If `dt` is an instance of the rule and `inc` is `True`, it is + included in the output. + + :yields: Yields a sequence of `datetime` objects. + """ + + if self._cache_complete: + gen = self._cache + else: + gen = self + + # Select the comparison function + if inc: + comp = lambda dc, dtc: dc >= dtc + else: + comp = lambda dc, dtc: dc > dtc + + # Generate dates + n = 0 + for d in gen: + if comp(d, dt): + yield d + + if count is not None: + n += 1 + if n >= count: + break + + def between(self, after, before, inc=False, count=1): + """ Returns all the occurrences of the rrule between after and before. + The inc keyword defines what happens if after and/or before are + themselves occurrences. With inc=True, they will be included in the + list, if they are found in the recurrence set. """ + if self._cache_complete: + gen = self._cache + else: + gen = self + started = False + l = [] + if inc: + for i in gen: + if i > before: + break + elif not started: + if i >= after: + started = True + l.append(i) + else: + l.append(i) + else: + for i in gen: + if i >= before: + break + elif not started: + if i > after: + started = True + l.append(i) + else: + l.append(i) + return l + + +class rrule(rrulebase): + """ + That's the base of the rrule operation. It accepts all the keywords + defined in the RFC as its constructor parameters (except byday, + which was renamed to byweekday) and more. The constructor prototype is:: + + rrule(freq) + + Where freq must be one of YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, + or SECONDLY. + + .. note:: + Per RFC section 3.3.10, recurrence instances falling on invalid dates + and times are ignored rather than coerced: + + Recurrence rules may generate recurrence instances with an invalid + date (e.g., February 30) or nonexistent local time (e.g., 1:30 AM + on a day where the local time is moved forward by an hour at 1:00 + AM). Such recurrence instances MUST be ignored and MUST NOT be + counted as part of the recurrence set. + + This can lead to possibly surprising behavior when, for example, the + start date occurs at the end of the month: + + >>> from dateutil.rrule import rrule, MONTHLY + >>> from datetime import datetime + >>> start_date = datetime(2014, 12, 31) + >>> list(rrule(freq=MONTHLY, count=4, dtstart=start_date)) + ... # doctest: +NORMALIZE_WHITESPACE + [datetime.datetime(2014, 12, 31, 0, 0), + datetime.datetime(2015, 1, 31, 0, 0), + datetime.datetime(2015, 3, 31, 0, 0), + datetime.datetime(2015, 5, 31, 0, 0)] + + Additionally, it supports the following keyword arguments: + + :param cache: + If given, it must be a boolean value specifying to enable or disable + caching of results. If you will use the same rrule instance multiple + times, enabling caching will improve the performance considerably. + :param dtstart: + The recurrence start. Besides being the base for the recurrence, + missing parameters in the final recurrence instances will also be + extracted from this date. If not given, datetime.now() will be used + instead. + :param interval: + The interval between each freq iteration. For example, when using + YEARLY, an interval of 2 means once every two years, but with HOURLY, + it means once every two hours. The default interval is 1. + :param wkst: + The week start day. Must be one of the MO, TU, WE constants, or an + integer, specifying the first day of the week. This will affect + recurrences based on weekly periods. The default week start is got + from calendar.firstweekday(), and may be modified by + calendar.setfirstweekday(). + :param count: + How many occurrences will be generated. + + .. note:: + As of version 2.5.0, the use of the ``until`` keyword together + with the ``count`` keyword is deprecated per RFC-2445 Sec. 4.3.10. + :param until: + If given, this must be a datetime instance, that will specify the + limit of the recurrence. The last recurrence in the rule is the greatest + datetime that is less than or equal to the value specified in the + ``until`` parameter. + + .. note:: + As of version 2.5.0, the use of the ``until`` keyword together + with the ``count`` keyword is deprecated per RFC-2445 Sec. 4.3.10. + :param bysetpos: + If given, it must be either an integer, or a sequence of integers, + positive or negative. Each given integer will specify an occurrence + number, corresponding to the nth occurrence of the rule inside the + frequency period. For example, a bysetpos of -1 if combined with a + MONTHLY frequency, and a byweekday of (MO, TU, WE, TH, FR), will + result in the last work day of every month. + :param bymonth: + If given, it must be either an integer, or a sequence of integers, + meaning the months to apply the recurrence to. + :param bymonthday: + If given, it must be either an integer, or a sequence of integers, + meaning the month days to apply the recurrence to. + :param byyearday: + If given, it must be either an integer, or a sequence of integers, + meaning the year days to apply the recurrence to. + :param byweekno: + If given, it must be either an integer, or a sequence of integers, + meaning the week numbers to apply the recurrence to. Week numbers + have the meaning described in ISO8601, that is, the first week of + the year is that containing at least four days of the new year. + :param byweekday: + If given, it must be either an integer (0 == MO), a sequence of + integers, one of the weekday constants (MO, TU, etc), or a sequence + of these constants. When given, these variables will define the + weekdays where the recurrence will be applied. It's also possible to + use an argument n for the weekday instances, which will mean the nth + occurrence of this weekday in the period. For example, with MONTHLY, + or with YEARLY and BYMONTH, using FR(+1) in byweekday will specify the + first friday of the month where the recurrence happens. Notice that in + the RFC documentation, this is specified as BYDAY, but was renamed to + avoid the ambiguity of that keyword. + :param byhour: + If given, it must be either an integer, or a sequence of integers, + meaning the hours to apply the recurrence to. + :param byminute: + If given, it must be either an integer, or a sequence of integers, + meaning the minutes to apply the recurrence to. + :param bysecond: + If given, it must be either an integer, or a sequence of integers, + meaning the seconds to apply the recurrence to. + :param byeaster: + If given, it must be either an integer, or a sequence of integers, + positive or negative. Each integer will define an offset from the + Easter Sunday. Passing the offset 0 to byeaster will yield the Easter + Sunday itself. This is an extension to the RFC specification. + """ + def __init__(self, freq, dtstart=None, + interval=1, wkst=None, count=None, until=None, bysetpos=None, + bymonth=None, bymonthday=None, byyearday=None, byeaster=None, + byweekno=None, byweekday=None, + byhour=None, byminute=None, bysecond=None, + cache=False): + super(rrule, self).__init__(cache) + global easter + if not dtstart: + dtstart = datetime.datetime.now().replace(microsecond=0) + elif not isinstance(dtstart, datetime.datetime): + dtstart = datetime.datetime.fromordinal(dtstart.toordinal()) + else: + dtstart = dtstart.replace(microsecond=0) + self._dtstart = dtstart + self._tzinfo = dtstart.tzinfo + self._freq = freq + self._interval = interval + self._count = count + + # Cache the original byxxx rules, if they are provided, as the _byxxx + # attributes do not necessarily map to the inputs, and this can be + # a problem in generating the strings. Only store things if they've + # been supplied (the string retrieval will just use .get()) + self._original_rule = {} + + if until and not isinstance(until, datetime.datetime): + until = datetime.datetime.fromordinal(until.toordinal()) + self._until = until + + if count and until: + warn("Using both 'count' and 'until' is inconsistent with RFC 2445" + " and has been deprecated in dateutil. Future versions will " + "raise an error.", DeprecationWarning) + + if wkst is None: + self._wkst = calendar.firstweekday() + elif isinstance(wkst, integer_types): + self._wkst = wkst + else: + self._wkst = wkst.weekday + + if bysetpos is None: + self._bysetpos = None + elif isinstance(bysetpos, integer_types): + if bysetpos == 0 or not (-366 <= bysetpos <= 366): + raise ValueError("bysetpos must be between 1 and 366, " + "or between -366 and -1") + self._bysetpos = (bysetpos,) + else: + self._bysetpos = tuple(bysetpos) + for pos in self._bysetpos: + if pos == 0 or not (-366 <= pos <= 366): + raise ValueError("bysetpos must be between 1 and 366, " + "or between -366 and -1") + + if self._bysetpos: + self._original_rule['bysetpos'] = self._bysetpos + + if (byweekno is None and byyearday is None and bymonthday is None and + byweekday is None and byeaster is None): + if freq == YEARLY: + if bymonth is None: + bymonth = dtstart.month + self._original_rule['bymonth'] = None + bymonthday = dtstart.day + self._original_rule['bymonthday'] = None + elif freq == MONTHLY: + bymonthday = dtstart.day + self._original_rule['bymonthday'] = None + elif freq == WEEKLY: + byweekday = dtstart.weekday() + self._original_rule['byweekday'] = None + + # bymonth + if bymonth is None: + self._bymonth = None + else: + if isinstance(bymonth, integer_types): + bymonth = (bymonth,) + + self._bymonth = tuple(sorted(set(bymonth))) + + if 'bymonth' not in self._original_rule: + self._original_rule['bymonth'] = self._bymonth + + # byyearday + if byyearday is None: + self._byyearday = None + else: + if isinstance(byyearday, integer_types): + byyearday = (byyearday,) + + self._byyearday = tuple(sorted(set(byyearday))) + self._original_rule['byyearday'] = self._byyearday + + # byeaster + if byeaster is not None: + if not easter: + from dateutil import easter + if isinstance(byeaster, integer_types): + self._byeaster = (byeaster,) + else: + self._byeaster = tuple(sorted(byeaster)) + + self._original_rule['byeaster'] = self._byeaster + else: + self._byeaster = None + + # bymonthday + if bymonthday is None: + self._bymonthday = () + self._bynmonthday = () + else: + if isinstance(bymonthday, integer_types): + bymonthday = (bymonthday,) + + bymonthday = set(bymonthday) # Ensure it's unique + + self._bymonthday = tuple(sorted([x for x in bymonthday if x > 0])) + self._bynmonthday = tuple(sorted([x for x in bymonthday if x < 0])) + + # Storing positive numbers first, then negative numbers + if 'bymonthday' not in self._original_rule: + self._original_rule['bymonthday'] = tuple( + itertools.chain(self._bymonthday, self._bynmonthday)) + + # byweekno + if byweekno is None: + self._byweekno = None + else: + if isinstance(byweekno, integer_types): + byweekno = (byweekno,) + + self._byweekno = tuple(sorted(set(byweekno))) + + self._original_rule['byweekno'] = self._byweekno + + # byweekday / bynweekday + if byweekday is None: + self._byweekday = None + self._bynweekday = None + else: + # If it's one of the valid non-sequence types, convert to a + # single-element sequence before the iterator that builds the + # byweekday set. + if isinstance(byweekday, integer_types) or hasattr(byweekday, "n"): + byweekday = (byweekday,) + + self._byweekday = set() + self._bynweekday = set() + for wday in byweekday: + if isinstance(wday, integer_types): + self._byweekday.add(wday) + elif not wday.n or freq > MONTHLY: + self._byweekday.add(wday.weekday) + else: + self._bynweekday.add((wday.weekday, wday.n)) + + if not self._byweekday: + self._byweekday = None + elif not self._bynweekday: + self._bynweekday = None + + if self._byweekday is not None: + self._byweekday = tuple(sorted(self._byweekday)) + orig_byweekday = [weekday(x) for x in self._byweekday] + else: + orig_byweekday = tuple() + + if self._bynweekday is not None: + self._bynweekday = tuple(sorted(self._bynweekday)) + orig_bynweekday = [weekday(*x) for x in self._bynweekday] + else: + orig_bynweekday = tuple() + + if 'byweekday' not in self._original_rule: + self._original_rule['byweekday'] = tuple(itertools.chain( + orig_byweekday, orig_bynweekday)) + + # byhour + if byhour is None: + if freq < HOURLY: + self._byhour = set((dtstart.hour,)) + else: + self._byhour = None + else: + if isinstance(byhour, integer_types): + byhour = (byhour,) + + if freq == HOURLY: + self._byhour = self.__construct_byset(start=dtstart.hour, + byxxx=byhour, + base=24) + else: + self._byhour = set(byhour) + + self._byhour = tuple(sorted(self._byhour)) + self._original_rule['byhour'] = self._byhour + + # byminute + if byminute is None: + if freq < MINUTELY: + self._byminute = set((dtstart.minute,)) + else: + self._byminute = None + else: + if isinstance(byminute, integer_types): + byminute = (byminute,) + + if freq == MINUTELY: + self._byminute = self.__construct_byset(start=dtstart.minute, + byxxx=byminute, + base=60) + else: + self._byminute = set(byminute) + + self._byminute = tuple(sorted(self._byminute)) + self._original_rule['byminute'] = self._byminute + + # bysecond + if bysecond is None: + if freq < SECONDLY: + self._bysecond = ((dtstart.second,)) + else: + self._bysecond = None + else: + if isinstance(bysecond, integer_types): + bysecond = (bysecond,) + + self._bysecond = set(bysecond) + + if freq == SECONDLY: + self._bysecond = self.__construct_byset(start=dtstart.second, + byxxx=bysecond, + base=60) + else: + self._bysecond = set(bysecond) + + self._bysecond = tuple(sorted(self._bysecond)) + self._original_rule['bysecond'] = self._bysecond + + if self._freq >= HOURLY: + self._timeset = None + else: + self._timeset = [] + for hour in self._byhour: + for minute in self._byminute: + for second in self._bysecond: + self._timeset.append( + datetime.time(hour, minute, second, + tzinfo=self._tzinfo)) + self._timeset.sort() + self._timeset = tuple(self._timeset) + + def __str__(self): + """ + Output a string that would generate this RRULE if passed to rrulestr. + This is mostly compatible with RFC2445, except for the + dateutil-specific extension BYEASTER. + """ + + output = [] + h, m, s = [None] * 3 + if self._dtstart: + output.append(self._dtstart.strftime('DTSTART:%Y%m%dT%H%M%S')) + h, m, s = self._dtstart.timetuple()[3:6] + + parts = ['FREQ=' + FREQNAMES[self._freq]] + if self._interval != 1: + parts.append('INTERVAL=' + str(self._interval)) + + if self._wkst: + parts.append('WKST=' + repr(weekday(self._wkst))[0:2]) + + if self._count: + parts.append('COUNT=' + str(self._count)) + + if self._until: + parts.append(self._until.strftime('UNTIL=%Y%m%dT%H%M%S')) + + if self._original_rule.get('byweekday') is not None: + # The str() method on weekday objects doesn't generate + # RFC2445-compliant strings, so we should modify that. + original_rule = dict(self._original_rule) + wday_strings = [] + for wday in original_rule['byweekday']: + if wday.n: + wday_strings.append('{n:+d}{wday}'.format( + n=wday.n, + wday=repr(wday)[0:2])) + else: + wday_strings.append(repr(wday)) + + original_rule['byweekday'] = wday_strings + else: + original_rule = self._original_rule + + partfmt = '{name}={vals}' + for name, key in [('BYSETPOS', 'bysetpos'), + ('BYMONTH', 'bymonth'), + ('BYMONTHDAY', 'bymonthday'), + ('BYYEARDAY', 'byyearday'), + ('BYWEEKNO', 'byweekno'), + ('BYDAY', 'byweekday'), + ('BYHOUR', 'byhour'), + ('BYMINUTE', 'byminute'), + ('BYSECOND', 'bysecond'), + ('BYEASTER', 'byeaster')]: + value = original_rule.get(key) + if value: + parts.append(partfmt.format(name=name, vals=(','.join(str(v) + for v in value)))) + + output.append(';'.join(parts)) + return '\n'.join(output) + + def replace(self, **kwargs): + """Return new rrule with same attributes except for those attributes given new + values by whichever keyword arguments are specified.""" + new_kwargs = {"interval": self._interval, + "count": self._count, + "dtstart": self._dtstart, + "freq": self._freq, + "until": self._until, + "wkst": self._wkst, + "cache": False if self._cache is None else True } + new_kwargs.update(self._original_rule) + new_kwargs.update(kwargs) + return rrule(**new_kwargs) + + + def _iter(self): + year, month, day, hour, minute, second, weekday, yearday, _ = \ + self._dtstart.timetuple() + + # Some local variables to speed things up a bit + freq = self._freq + interval = self._interval + wkst = self._wkst + until = self._until + bymonth = self._bymonth + byweekno = self._byweekno + byyearday = self._byyearday + byweekday = self._byweekday + byeaster = self._byeaster + bymonthday = self._bymonthday + bynmonthday = self._bynmonthday + bysetpos = self._bysetpos + byhour = self._byhour + byminute = self._byminute + bysecond = self._bysecond + + ii = _iterinfo(self) + ii.rebuild(year, month) + + getdayset = {YEARLY: ii.ydayset, + MONTHLY: ii.mdayset, + WEEKLY: ii.wdayset, + DAILY: ii.ddayset, + HOURLY: ii.ddayset, + MINUTELY: ii.ddayset, + SECONDLY: ii.ddayset}[freq] + + if freq < HOURLY: + timeset = self._timeset + else: + gettimeset = {HOURLY: ii.htimeset, + MINUTELY: ii.mtimeset, + SECONDLY: ii.stimeset}[freq] + if ((freq >= HOURLY and + self._byhour and hour not in self._byhour) or + (freq >= MINUTELY and + self._byminute and minute not in self._byminute) or + (freq >= SECONDLY and + self._bysecond and second not in self._bysecond)): + timeset = () + else: + timeset = gettimeset(hour, minute, second) + + total = 0 + count = self._count + while True: + # Get dayset with the right frequency + dayset, start, end = getdayset(year, month, day) + + # Do the "hard" work ;-) + filtered = False + for i in dayset[start:end]: + if ((bymonth and ii.mmask[i] not in bymonth) or + (byweekno and not ii.wnomask[i]) or + (byweekday and ii.wdaymask[i] not in byweekday) or + (ii.nwdaymask and not ii.nwdaymask[i]) or + (byeaster and not ii.eastermask[i]) or + ((bymonthday or bynmonthday) and + ii.mdaymask[i] not in bymonthday and + ii.nmdaymask[i] not in bynmonthday) or + (byyearday and + ((i < ii.yearlen and i+1 not in byyearday and + -ii.yearlen+i not in byyearday) or + (i >= ii.yearlen and i+1-ii.yearlen not in byyearday and + -ii.nextyearlen+i-ii.yearlen not in byyearday)))): + dayset[i] = None + filtered = True + + # Output results + if bysetpos and timeset: + poslist = [] + for pos in bysetpos: + if pos < 0: + daypos, timepos = divmod(pos, len(timeset)) + else: + daypos, timepos = divmod(pos-1, len(timeset)) + try: + i = [x for x in dayset[start:end] + if x is not None][daypos] + time = timeset[timepos] + except IndexError: + pass + else: + date = datetime.date.fromordinal(ii.yearordinal+i) + res = datetime.datetime.combine(date, time) + if res not in poslist: + poslist.append(res) + poslist.sort() + for res in poslist: + if until and res > until: + self._len = total + return + elif res >= self._dtstart: + total += 1 + yield res + if count: + count -= 1 + if not count: + self._len = total + return + else: + for i in dayset[start:end]: + if i is not None: + date = datetime.date.fromordinal(ii.yearordinal + i) + for time in timeset: + res = datetime.datetime.combine(date, time) + if until and res > until: + self._len = total + return + elif res >= self._dtstart: + total += 1 + yield res + if count: + count -= 1 + if not count: + self._len = total + return + + # Handle frequency and interval + fixday = False + if freq == YEARLY: + year += interval + if year > datetime.MAXYEAR: + self._len = total + return + ii.rebuild(year, month) + elif freq == MONTHLY: + month += interval + if month > 12: + div, mod = divmod(month, 12) + month = mod + year += div + if month == 0: + month = 12 + year -= 1 + if year > datetime.MAXYEAR: + self._len = total + return + ii.rebuild(year, month) + elif freq == WEEKLY: + if wkst > weekday: + day += -(weekday+1+(6-wkst))+self._interval*7 + else: + day += -(weekday-wkst)+self._interval*7 + weekday = wkst + fixday = True + elif freq == DAILY: + day += interval + fixday = True + elif freq == HOURLY: + if filtered: + # Jump to one iteration before next day + hour += ((23-hour)//interval)*interval + + if byhour: + ndays, hour = self.__mod_distance(value=hour, + byxxx=self._byhour, + base=24) + else: + ndays, hour = divmod(hour+interval, 24) + + if ndays: + day += ndays + fixday = True + + timeset = gettimeset(hour, minute, second) + elif freq == MINUTELY: + if filtered: + # Jump to one iteration before next day + minute += ((1439-(hour*60+minute))//interval)*interval + + valid = False + rep_rate = (24*60) + for j in range(rep_rate // gcd(interval, rep_rate)): + if byminute: + nhours, minute = \ + self.__mod_distance(value=minute, + byxxx=self._byminute, + base=60) + else: + nhours, minute = divmod(minute+interval, 60) + + div, hour = divmod(hour+nhours, 24) + if div: + day += div + fixday = True + filtered = False + + if not byhour or hour in byhour: + valid = True + break + + if not valid: + raise ValueError('Invalid combination of interval and ' + + 'byhour resulting in empty rule.') + + timeset = gettimeset(hour, minute, second) + elif freq == SECONDLY: + if filtered: + # Jump to one iteration before next day + second += (((86399 - (hour * 3600 + minute * 60 + second)) + // interval) * interval) + + rep_rate = (24 * 3600) + valid = False + for j in range(0, rep_rate // gcd(interval, rep_rate)): + if bysecond: + nminutes, second = \ + self.__mod_distance(value=second, + byxxx=self._bysecond, + base=60) + else: + nminutes, second = divmod(second+interval, 60) + + div, minute = divmod(minute+nminutes, 60) + if div: + hour += div + div, hour = divmod(hour, 24) + if div: + day += div + fixday = True + + if ((not byhour or hour in byhour) and + (not byminute or minute in byminute) and + (not bysecond or second in bysecond)): + valid = True + break + + if not valid: + raise ValueError('Invalid combination of interval, ' + + 'byhour and byminute resulting in empty' + + ' rule.') + + timeset = gettimeset(hour, minute, second) + + if fixday and day > 28: + daysinmonth = calendar.monthrange(year, month)[1] + if day > daysinmonth: + while day > daysinmonth: + day -= daysinmonth + month += 1 + if month == 13: + month = 1 + year += 1 + if year > datetime.MAXYEAR: + self._len = total + return + daysinmonth = calendar.monthrange(year, month)[1] + ii.rebuild(year, month) + + def __construct_byset(self, start, byxxx, base): + """ + If a `BYXXX` sequence is passed to the constructor at the same level as + `FREQ` (e.g. `FREQ=HOURLY,BYHOUR={2,4,7},INTERVAL=3`), there are some + specifications which cannot be reached given some starting conditions. + + This occurs whenever the interval is not coprime with the base of a + given unit and the difference between the starting position and the + ending position is not coprime with the greatest common denominator + between the interval and the base. For example, with a FREQ of hourly + starting at 17:00 and an interval of 4, the only valid values for + BYHOUR would be {21, 1, 5, 9, 13, 17}, because 4 and 24 are not + coprime. + + :param start: + Specifies the starting position. + :param byxxx: + An iterable containing the list of allowed values. + :param base: + The largest allowable value for the specified frequency (e.g. + 24 hours, 60 minutes). + + This does not preserve the type of the iterable, returning a set, since + the values should be unique and the order is irrelevant, this will + speed up later lookups. + + In the event of an empty set, raises a :exception:`ValueError`, as this + results in an empty rrule. + """ + + cset = set() + + # Support a single byxxx value. + if isinstance(byxxx, integer_types): + byxxx = (byxxx, ) + + for num in byxxx: + i_gcd = gcd(self._interval, base) + # Use divmod rather than % because we need to wrap negative nums. + if i_gcd == 1 or divmod(num - start, i_gcd)[1] == 0: + cset.add(num) + + if len(cset) == 0: + raise ValueError("Invalid rrule byxxx generates an empty set.") + + return cset + + def __mod_distance(self, value, byxxx, base): + """ + Calculates the next value in a sequence where the `FREQ` parameter is + specified along with a `BYXXX` parameter at the same "level" + (e.g. `HOURLY` specified with `BYHOUR`). + + :param value: + The old value of the component. + :param byxxx: + The `BYXXX` set, which should have been generated by + `rrule._construct_byset`, or something else which checks that a + valid rule is present. + :param base: + The largest allowable value for the specified frequency (e.g. + 24 hours, 60 minutes). + + If a valid value is not found after `base` iterations (the maximum + number before the sequence would start to repeat), this raises a + :exception:`ValueError`, as no valid values were found. + + This returns a tuple of `divmod(n*interval, base)`, where `n` is the + smallest number of `interval` repetitions until the next specified + value in `byxxx` is found. + """ + accumulator = 0 + for ii in range(1, base + 1): + # Using divmod() over % to account for negative intervals + div, value = divmod(value + self._interval, base) + accumulator += div + if value in byxxx: + return (accumulator, value) + + +class _iterinfo(object): + __slots__ = ["rrule", "lastyear", "lastmonth", + "yearlen", "nextyearlen", "yearordinal", "yearweekday", + "mmask", "mrange", "mdaymask", "nmdaymask", + "wdaymask", "wnomask", "nwdaymask", "eastermask"] + + def __init__(self, rrule): + for attr in self.__slots__: + setattr(self, attr, None) + self.rrule = rrule + + def rebuild(self, year, month): + # Every mask is 7 days longer to handle cross-year weekly periods. + rr = self.rrule + if year != self.lastyear: + self.yearlen = 365 + calendar.isleap(year) + self.nextyearlen = 365 + calendar.isleap(year + 1) + firstyday = datetime.date(year, 1, 1) + self.yearordinal = firstyday.toordinal() + self.yearweekday = firstyday.weekday() + + wday = datetime.date(year, 1, 1).weekday() + if self.yearlen == 365: + self.mmask = M365MASK + self.mdaymask = MDAY365MASK + self.nmdaymask = NMDAY365MASK + self.wdaymask = WDAYMASK[wday:] + self.mrange = M365RANGE + else: + self.mmask = M366MASK + self.mdaymask = MDAY366MASK + self.nmdaymask = NMDAY366MASK + self.wdaymask = WDAYMASK[wday:] + self.mrange = M366RANGE + + if not rr._byweekno: + self.wnomask = None + else: + self.wnomask = [0]*(self.yearlen+7) + # no1wkst = firstwkst = self.wdaymask.index(rr._wkst) + no1wkst = firstwkst = (7-self.yearweekday+rr._wkst) % 7 + if no1wkst >= 4: + no1wkst = 0 + # Number of days in the year, plus the days we got + # from last year. + wyearlen = self.yearlen+(self.yearweekday-rr._wkst) % 7 + else: + # Number of days in the year, minus the days we + # left in last year. + wyearlen = self.yearlen-no1wkst + div, mod = divmod(wyearlen, 7) + numweeks = div+mod//4 + for n in rr._byweekno: + if n < 0: + n += numweeks+1 + if not (0 < n <= numweeks): + continue + if n > 1: + i = no1wkst+(n-1)*7 + if no1wkst != firstwkst: + i -= 7-firstwkst + else: + i = no1wkst + for j in range(7): + self.wnomask[i] = 1 + i += 1 + if self.wdaymask[i] == rr._wkst: + break + if 1 in rr._byweekno: + # Check week number 1 of next year as well + # TODO: Check -numweeks for next year. + i = no1wkst+numweeks*7 + if no1wkst != firstwkst: + i -= 7-firstwkst + if i < self.yearlen: + # If week starts in next year, we + # don't care about it. + for j in range(7): + self.wnomask[i] = 1 + i += 1 + if self.wdaymask[i] == rr._wkst: + break + if no1wkst: + # Check last week number of last year as + # well. If no1wkst is 0, either the year + # started on week start, or week number 1 + # got days from last year, so there are no + # days from last year's last week number in + # this year. + if -1 not in rr._byweekno: + lyearweekday = datetime.date(year-1, 1, 1).weekday() + lno1wkst = (7-lyearweekday+rr._wkst) % 7 + lyearlen = 365+calendar.isleap(year-1) + if lno1wkst >= 4: + lno1wkst = 0 + lnumweeks = 52+(lyearlen + + (lyearweekday-rr._wkst) % 7) % 7//4 + else: + lnumweeks = 52+(self.yearlen-no1wkst) % 7//4 + else: + lnumweeks = -1 + if lnumweeks in rr._byweekno: + for i in range(no1wkst): + self.wnomask[i] = 1 + + if (rr._bynweekday and (month != self.lastmonth or + year != self.lastyear)): + ranges = [] + if rr._freq == YEARLY: + if rr._bymonth: + for month in rr._bymonth: + ranges.append(self.mrange[month-1:month+1]) + else: + ranges = [(0, self.yearlen)] + elif rr._freq == MONTHLY: + ranges = [self.mrange[month-1:month+1]] + if ranges: + # Weekly frequency won't get here, so we may not + # care about cross-year weekly periods. + self.nwdaymask = [0]*self.yearlen + for first, last in ranges: + last -= 1 + for wday, n in rr._bynweekday: + if n < 0: + i = last+(n+1)*7 + i -= (self.wdaymask[i]-wday) % 7 + else: + i = first+(n-1)*7 + i += (7-self.wdaymask[i]+wday) % 7 + if first <= i <= last: + self.nwdaymask[i] = 1 + + if rr._byeaster: + self.eastermask = [0]*(self.yearlen+7) + eyday = easter.easter(year).toordinal()-self.yearordinal + for offset in rr._byeaster: + self.eastermask[eyday+offset] = 1 + + self.lastyear = year + self.lastmonth = month + + def ydayset(self, year, month, day): + return list(range(self.yearlen)), 0, self.yearlen + + def mdayset(self, year, month, day): + dset = [None]*self.yearlen + start, end = self.mrange[month-1:month+1] + for i in range(start, end): + dset[i] = i + return dset, start, end + + def wdayset(self, year, month, day): + # We need to handle cross-year weeks here. + dset = [None]*(self.yearlen+7) + i = datetime.date(year, month, day).toordinal()-self.yearordinal + start = i + for j in range(7): + dset[i] = i + i += 1 + # if (not (0 <= i < self.yearlen) or + # self.wdaymask[i] == self.rrule._wkst): + # This will cross the year boundary, if necessary. + if self.wdaymask[i] == self.rrule._wkst: + break + return dset, start, i + + def ddayset(self, year, month, day): + dset = [None] * self.yearlen + i = datetime.date(year, month, day).toordinal() - self.yearordinal + dset[i] = i + return dset, i, i + 1 + + def htimeset(self, hour, minute, second): + tset = [] + rr = self.rrule + for minute in rr._byminute: + for second in rr._bysecond: + tset.append(datetime.time(hour, minute, second, + tzinfo=rr._tzinfo)) + tset.sort() + return tset + + def mtimeset(self, hour, minute, second): + tset = [] + rr = self.rrule + for second in rr._bysecond: + tset.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) + tset.sort() + return tset + + def stimeset(self, hour, minute, second): + return (datetime.time(hour, minute, second, + tzinfo=self.rrule._tzinfo),) + + +class rruleset(rrulebase): + """ The rruleset type allows more complex recurrence setups, mixing + multiple rules, dates, exclusion rules, and exclusion dates. The type + constructor takes the following keyword arguments: + + :param cache: If True, caching of results will be enabled, improving + performance of multiple queries considerably. """ + + class _genitem(object): + def __init__(self, genlist, gen): + try: + self.dt = advance_iterator(gen) + genlist.append(self) + except StopIteration: + pass + self.genlist = genlist + self.gen = gen + + def __next__(self): + try: + self.dt = advance_iterator(self.gen) + except StopIteration: + if self.genlist[0] is self: + heapq.heappop(self.genlist) + else: + self.genlist.remove(self) + heapq.heapify(self.genlist) + + next = __next__ + + def __lt__(self, other): + return self.dt < other.dt + + def __gt__(self, other): + return self.dt > other.dt + + def __eq__(self, other): + return self.dt == other.dt + + def __ne__(self, other): + return self.dt != other.dt + + def __init__(self, cache=False): + super(rruleset, self).__init__(cache) + self._rrule = [] + self._rdate = [] + self._exrule = [] + self._exdate = [] + + @_invalidates_cache + def rrule(self, rrule): + """ Include the given :py:class:`rrule` instance in the recurrence set + generation. """ + self._rrule.append(rrule) + + @_invalidates_cache + def rdate(self, rdate): + """ Include the given :py:class:`datetime` instance in the recurrence + set generation. """ + self._rdate.append(rdate) + + @_invalidates_cache + def exrule(self, exrule): + """ Include the given rrule instance in the recurrence set exclusion + list. Dates which are part of the given recurrence rules will not + be generated, even if some inclusive rrule or rdate matches them. + """ + self._exrule.append(exrule) + + @_invalidates_cache + def exdate(self, exdate): + """ Include the given datetime instance in the recurrence set + exclusion list. Dates included that way will not be generated, + even if some inclusive rrule or rdate matches them. """ + self._exdate.append(exdate) + + def _iter(self): + rlist = [] + self._rdate.sort() + self._genitem(rlist, iter(self._rdate)) + for gen in [iter(x) for x in self._rrule]: + self._genitem(rlist, gen) + exlist = [] + self._exdate.sort() + self._genitem(exlist, iter(self._exdate)) + for gen in [iter(x) for x in self._exrule]: + self._genitem(exlist, gen) + lastdt = None + total = 0 + heapq.heapify(rlist) + heapq.heapify(exlist) + while rlist: + ritem = rlist[0] + if not lastdt or lastdt != ritem.dt: + while exlist and exlist[0] < ritem: + exitem = exlist[0] + advance_iterator(exitem) + if exlist and exlist[0] is exitem: + heapq.heapreplace(exlist, exitem) + if not exlist or ritem != exlist[0]: + total += 1 + yield ritem.dt + lastdt = ritem.dt + advance_iterator(ritem) + if rlist and rlist[0] is ritem: + heapq.heapreplace(rlist, ritem) + self._len = total + + +class _rrulestr(object): + + _freq_map = {"YEARLY": YEARLY, + "MONTHLY": MONTHLY, + "WEEKLY": WEEKLY, + "DAILY": DAILY, + "HOURLY": HOURLY, + "MINUTELY": MINUTELY, + "SECONDLY": SECONDLY} + + _weekday_map = {"MO": 0, "TU": 1, "WE": 2, "TH": 3, + "FR": 4, "SA": 5, "SU": 6} + + def _handle_int(self, rrkwargs, name, value, **kwargs): + rrkwargs[name.lower()] = int(value) + + def _handle_int_list(self, rrkwargs, name, value, **kwargs): + rrkwargs[name.lower()] = [int(x) for x in value.split(',')] + + _handle_INTERVAL = _handle_int + _handle_COUNT = _handle_int + _handle_BYSETPOS = _handle_int_list + _handle_BYMONTH = _handle_int_list + _handle_BYMONTHDAY = _handle_int_list + _handle_BYYEARDAY = _handle_int_list + _handle_BYEASTER = _handle_int_list + _handle_BYWEEKNO = _handle_int_list + _handle_BYHOUR = _handle_int_list + _handle_BYMINUTE = _handle_int_list + _handle_BYSECOND = _handle_int_list + + def _handle_FREQ(self, rrkwargs, name, value, **kwargs): + rrkwargs["freq"] = self._freq_map[value] + + def _handle_UNTIL(self, rrkwargs, name, value, **kwargs): + global parser + if not parser: + from dateutil import parser + try: + rrkwargs["until"] = parser.parse(value, + ignoretz=kwargs.get("ignoretz"), + tzinfos=kwargs.get("tzinfos")) + except ValueError: + raise ValueError("invalid until date") + + def _handle_WKST(self, rrkwargs, name, value, **kwargs): + rrkwargs["wkst"] = self._weekday_map[value] + + def _handle_BYWEEKDAY(self, rrkwargs, name, value, **kwargs): + """ + Two ways to specify this: +1MO or MO(+1) + """ + l = [] + for wday in value.split(','): + if '(' in wday: + # If it's of the form TH(+1), etc. + splt = wday.split('(') + w = splt[0] + n = int(splt[1][:-1]) + elif len(wday): + # If it's of the form +1MO + for i in range(len(wday)): + if wday[i] not in '+-0123456789': + break + n = wday[:i] or None + w = wday[i:] + if n: + n = int(n) + else: + raise ValueError("Invalid (empty) BYDAY specification.") + + l.append(weekdays[self._weekday_map[w]](n)) + rrkwargs["byweekday"] = l + + _handle_BYDAY = _handle_BYWEEKDAY + + def _parse_rfc_rrule(self, line, + dtstart=None, + cache=False, + ignoretz=False, + tzinfos=None): + if line.find(':') != -1: + name, value = line.split(':') + if name != "RRULE": + raise ValueError("unknown parameter name") + else: + value = line + rrkwargs = {} + for pair in value.split(';'): + name, value = pair.split('=') + name = name.upper() + value = value.upper() + try: + getattr(self, "_handle_"+name)(rrkwargs, name, value, + ignoretz=ignoretz, + tzinfos=tzinfos) + except AttributeError: + raise ValueError("unknown parameter '%s'" % name) + except (KeyError, ValueError): + raise ValueError("invalid '%s': %s" % (name, value)) + return rrule(dtstart=dtstart, cache=cache, **rrkwargs) + + def _parse_rfc(self, s, + dtstart=None, + cache=False, + unfold=False, + forceset=False, + compatible=False, + ignoretz=False, + tzinfos=None): + global parser + if compatible: + forceset = True + unfold = True + s = s.upper() + if not s.strip(): + raise ValueError("empty string") + if unfold: + lines = s.splitlines() + i = 0 + while i < len(lines): + line = lines[i].rstrip() + if not line: + del lines[i] + elif i > 0 and line[0] == " ": + lines[i-1] += line[1:] + del lines[i] + else: + i += 1 + else: + lines = s.split() + if (not forceset and len(lines) == 1 and (s.find(':') == -1 or + s.startswith('RRULE:'))): + return self._parse_rfc_rrule(lines[0], cache=cache, + dtstart=dtstart, ignoretz=ignoretz, + tzinfos=tzinfos) + else: + rrulevals = [] + rdatevals = [] + exrulevals = [] + exdatevals = [] + for line in lines: + if not line: + continue + if line.find(':') == -1: + name = "RRULE" + value = line + else: + name, value = line.split(':', 1) + parms = name.split(';') + if not parms: + raise ValueError("empty property name") + name = parms[0] + parms = parms[1:] + if name == "RRULE": + for parm in parms: + raise ValueError("unsupported RRULE parm: "+parm) + rrulevals.append(value) + elif name == "RDATE": + for parm in parms: + if parm != "VALUE=DATE-TIME": + raise ValueError("unsupported RDATE parm: "+parm) + rdatevals.append(value) + elif name == "EXRULE": + for parm in parms: + raise ValueError("unsupported EXRULE parm: "+parm) + exrulevals.append(value) + elif name == "EXDATE": + for parm in parms: + if parm != "VALUE=DATE-TIME": + raise ValueError("unsupported RDATE parm: "+parm) + exdatevals.append(value) + elif name == "DTSTART": + for parm in parms: + raise ValueError("unsupported DTSTART parm: "+parm) + if not parser: + from dateutil import parser + dtstart = parser.parse(value, ignoretz=ignoretz, + tzinfos=tzinfos) + else: + raise ValueError("unsupported property: "+name) + if (forceset or len(rrulevals) > 1 or rdatevals + or exrulevals or exdatevals): + if not parser and (rdatevals or exdatevals): + from dateutil import parser + rset = rruleset(cache=cache) + for value in rrulevals: + rset.rrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in rdatevals: + for datestr in value.split(','): + rset.rdate(parser.parse(datestr, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exrulevals: + rset.exrule(self._parse_rfc_rrule(value, dtstart=dtstart, + ignoretz=ignoretz, + tzinfos=tzinfos)) + for value in exdatevals: + for datestr in value.split(','): + rset.exdate(parser.parse(datestr, + ignoretz=ignoretz, + tzinfos=tzinfos)) + if compatible and dtstart: + rset.rdate(dtstart) + return rset + else: + return self._parse_rfc_rrule(rrulevals[0], + dtstart=dtstart, + cache=cache, + ignoretz=ignoretz, + tzinfos=tzinfos) + + def __call__(self, s, **kwargs): + return self._parse_rfc(s, **kwargs) + +rrulestr = _rrulestr() + +# vim:ts=4:sw=4:et diff --git a/app/lib/dateutil/tz/__init__.py b/app/lib/dateutil/tz/__init__.py new file mode 100644 index 0000000..1cba7b9 --- /dev/null +++ b/app/lib/dateutil/tz/__init__.py @@ -0,0 +1,4 @@ +from .tz import * + +__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange", + "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz"] diff --git a/app/lib/dateutil/tz/_common.py b/app/lib/dateutil/tz/_common.py new file mode 100644 index 0000000..212e8ce --- /dev/null +++ b/app/lib/dateutil/tz/_common.py @@ -0,0 +1,380 @@ +from six import PY3 +from six.moves import _thread + +from datetime import datetime, timedelta, tzinfo +import copy + +ZERO = timedelta(0) + +__all__ = ['tzname_in_python2', 'enfold'] + + +def tzname_in_python2(namefunc): + """Change unicode output into bytestrings in Python 2 + + tzname() API changed in Python 3. It used to return bytes, but was changed + to unicode strings + """ + def adjust_encoding(*args, **kwargs): + name = namefunc(*args, **kwargs) + if name is not None and not PY3: + name = name.encode() + + return name + + return adjust_encoding + + +# The following is adapted from Alexander Belopolsky's tz library +# https://github.com/abalkin/tz +if hasattr(datetime, 'fold'): + # This is the pre-python 3.6 fold situation + def enfold(dt, fold=1): + """ + Provides a unified interface for assigning the ``fold`` attribute to + datetimes both before and after the implementation of PEP-495. + + :param fold: + The value for the ``fold`` attribute in the returned datetime. This + should be either 0 or 1. + + :return: + Returns an object for which ``getattr(dt, 'fold', 0)`` returns + ``fold`` for all versions of Python. In versions prior to + Python 3.6, this is a ``_DatetimeWithFold`` object, which is a + subclass of :py:class:`datetime.datetime` with the ``fold`` + attribute added, if ``fold`` is 1. + + ..versionadded:: 2.6.0 + """ + return dt.replace(fold=fold) + +else: + class _DatetimeWithFold(datetime): + """ + This is a class designed to provide a PEP 495-compliant interface for + Python versions before 3.6. It is used only for dates in a fold, so + the ``fold`` attribute is fixed at ``1``. + + ..versionadded:: 2.6.0 + """ + __slots__ = () + + @property + def fold(self): + return 1 + + def enfold(dt, fold=1): + """ + Provides a unified interface for assigning the ``fold`` attribute to + datetimes both before and after the implementation of PEP-495. + + :param fold: + The value for the ``fold`` attribute in the returned datetime. This + should be either 0 or 1. + + :return: + Returns an object for which ``getattr(dt, 'fold', 0)`` returns + ``fold`` for all versions of Python. In versions prior to + Python 3.6, this is a ``_DatetimeWithFold`` object, which is a + subclass of :py:class:`datetime.datetime` with the ``fold`` + attribute added, if ``fold`` is 1. + + ..versionadded:: 2.6.0 + """ + if getattr(dt, 'fold', 0) == fold: + return dt + + args = dt.timetuple()[:6] + args += (dt.microsecond, dt.tzinfo) + + if fold: + return _DatetimeWithFold(*args) + else: + return datetime(*args) + + +class _tzinfo(tzinfo): + """ + Base class for all ``dateutil`` ``tzinfo`` objects. + """ + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + ..versionadded:: 2.6.0 + """ + + dt = dt.replace(tzinfo=self) + + wall_0 = enfold(dt, fold=0) + wall_1 = enfold(dt, fold=1) + + same_offset = wall_0.utcoffset() == wall_1.utcoffset() + same_dt = wall_0.replace(tzinfo=None) == wall_1.replace(tzinfo=None) + + return same_dt and not same_offset + + def _fold_status(self, dt_utc, dt_wall): + """ + Determine the fold status of a "wall" datetime, given a representation + of the same datetime as a (naive) UTC datetime. This is calculated based + on the assumption that ``dt.utcoffset() - dt.dst()`` is constant for all + datetimes, and that this offset is the actual number of hours separating + ``dt_utc`` and ``dt_wall``. + + :param dt_utc: + Representation of the datetime as UTC + + :param dt_wall: + Representation of the datetime as "wall time". This parameter must + either have a `fold` attribute or have a fold-naive + :class:`datetime.tzinfo` attached, otherwise the calculation may + fail. + """ + if self.is_ambiguous(dt_wall): + delta_wall = dt_wall - dt_utc + _fold = int(delta_wall == (dt_utc.utcoffset() - dt_utc.dst())) + else: + _fold = 0 + + return _fold + + def _fold(self, dt): + return getattr(dt, 'fold', 0) + + def _fromutc(self, dt): + """ + Given a timezone-aware datetime in a given timezone, calculates a + timezone-aware datetime in a new timezone. + + Since this is the one time that we *know* we have an unambiguous + datetime object, we take this opportunity to determine whether the + datetime is ambiguous and in a "fold" state (e.g. if it's the first + occurence, chronologically, of the ambiguous datetime). + + :param dt: + A timezone-aware :class:`datetime.dateime` object. + """ + + # Re-implement the algorithm from Python's datetime.py + if not isinstance(dt, datetime): + raise TypeError("fromutc() requires a datetime argument") + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + dtoff = dt.utcoffset() + if dtoff is None: + raise ValueError("fromutc() requires a non-None utcoffset() " + "result") + + # The original datetime.py code assumes that `dst()` defaults to + # zero during ambiguous times. PEP 495 inverts this presumption, so + # for pre-PEP 495 versions of python, we need to tweak the algorithm. + dtdst = dt.dst() + if dtdst is None: + raise ValueError("fromutc() requires a non-None dst() result") + delta = dtoff - dtdst + if delta: + dt += delta + # Set fold=1 so we can default to being in the fold for + # ambiguous dates. + dtdst = enfold(dt, fold=1).dst() + if dtdst is None: + raise ValueError("fromutc(): dt.dst gave inconsistent " + "results; cannot convert") + return dt + dtdst + + def fromutc(self, dt): + """ + Given a timezone-aware datetime in a given timezone, calculates a + timezone-aware datetime in a new timezone. + + Since this is the one time that we *know* we have an unambiguous + datetime object, we take this opportunity to determine whether the + datetime is ambiguous and in a "fold" state (e.g. if it's the first + occurance, chronologically, of the ambiguous datetime). + + :param dt: + A timezone-aware :class:`datetime.dateime` object. + """ + dt_wall = self._fromutc(dt) + + # Calculate the fold status given the two datetimes. + _fold = self._fold_status(dt, dt_wall) + + # Set the default fold value for ambiguous dates + return enfold(dt_wall, fold=_fold) + + +class tzrangebase(_tzinfo): + """ + This is an abstract base class for time zones represented by an annual + transition into and out of DST. Child classes should implement the following + methods: + + * ``__init__(self, *args, **kwargs)`` + * ``transitions(self, year)`` - this is expected to return a tuple of + datetimes representing the DST on and off transitions in standard + time. + + A fully initialized ``tzrangebase`` subclass should also provide the + following attributes: + * ``hasdst``: Boolean whether or not the zone uses DST. + * ``_dst_offset`` / ``_std_offset``: :class:`datetime.timedelta` objects + representing the respective UTC offsets. + * ``_dst_abbr`` / ``_std_abbr``: Strings representing the timezone short + abbreviations in DST and STD, respectively. + * ``_hasdst``: Whether or not the zone has DST. + + ..versionadded:: 2.6.0 + """ + def __init__(self): + raise NotImplementedError('tzrangebase is an abstract base class') + + def utcoffset(self, dt): + isdst = self._isdst(dt) + + if isdst is None: + return None + elif isdst: + return self._dst_offset + else: + return self._std_offset + + def dst(self, dt): + isdst = self._isdst(dt) + + if isdst is None: + return None + elif isdst: + return self._dst_base_offset + else: + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + if self._isdst(dt): + return self._dst_abbr + else: + return self._std_abbr + + def fromutc(self, dt): + """ Given a datetime in UTC, return local time """ + if not isinstance(dt, datetime): + raise TypeError("fromutc() requires a datetime argument") + + if dt.tzinfo is not self: + raise ValueError("dt.tzinfo is not self") + + # Get transitions - if there are none, fixed offset + transitions = self.transitions(dt.year) + if transitions is None: + return dt + self.utcoffset(dt) + + # Get the transition times in UTC + dston, dstoff = transitions + + dston -= self._std_offset + dstoff -= self._std_offset + + utc_transitions = (dston, dstoff) + dt_utc = dt.replace(tzinfo=None) + + + isdst = self._naive_isdst(dt_utc, utc_transitions) + + if isdst: + dt_wall = dt + self._dst_offset + else: + dt_wall = dt + self._std_offset + + _fold = int(not isdst and self.is_ambiguous(dt_wall)) + + return enfold(dt_wall, fold=_fold) + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + if not self.hasdst: + return False + + start, end = self.transitions(dt.year) + + dt = dt.replace(tzinfo=None) + return (end <= dt < end + self._dst_base_offset) + + def _isdst(self, dt): + if not self.hasdst: + return False + elif dt is None: + return None + + transitions = self.transitions(dt.year) + + if transitions is None: + return False + + dt = dt.replace(tzinfo=None) + + isdst = self._naive_isdst(dt, transitions) + + # Handle ambiguous dates + if not isdst and self.is_ambiguous(dt): + return not self._fold(dt) + else: + return isdst + + def _naive_isdst(self, dt, transitions): + dston, dstoff = transitions + + dt = dt.replace(tzinfo=None) + + if dston < dstoff: + isdst = dston <= dt < dstoff + else: + isdst = not dstoff <= dt < dston + + return isdst + + @property + def _dst_base_offset(self): + return self._dst_offset - self._std_offset + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s(...)" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + + +def _total_seconds(td): + # Python 2.6 doesn't have a total_seconds() method on timedelta objects + return ((td.seconds + td.days * 86400) * 1000000 + + td.microseconds) // 1000000 + +_total_seconds = getattr(timedelta, 'total_seconds', _total_seconds) diff --git a/app/lib/dateutil/tz/tz.py b/app/lib/dateutil/tz/tz.py new file mode 100644 index 0000000..6bee291 --- /dev/null +++ b/app/lib/dateutil/tz/tz.py @@ -0,0 +1,1464 @@ +# -*- coding: utf-8 -*- +""" +This module offers timezone implementations subclassing the abstract +:py:`datetime.tzinfo` type. There are classes to handle tzfile format files +(usually are in :file:`/etc/localtime`, :file:`/usr/share/zoneinfo`, etc), TZ +environment string (in all known formats), given ranges (with help from +relative deltas), local machine timezone, fixed offset timezone, and UTC +timezone. +""" +import datetime +import struct +import time +import sys +import os +import bisect +import copy + +from operator import itemgetter + +from contextlib import contextmanager + +from six import string_types, PY3 +from ._common import tzname_in_python2, _tzinfo, _total_seconds +from ._common import tzrangebase, enfold + +try: + from .win import tzwin, tzwinlocal +except ImportError: + tzwin = tzwinlocal = None + +ZERO = datetime.timedelta(0) +EPOCH = datetime.datetime.utcfromtimestamp(0) +EPOCHORDINAL = EPOCH.toordinal() + +class tzutc(datetime.tzinfo): + """ + This is a tzinfo object that represents the UTC time zone. + """ + def utcoffset(self, dt): + return ZERO + + def dst(self, dt): + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return "UTC" + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + return False + + def __eq__(self, other): + if not isinstance(other, (tzutc, tzoffset)): + return NotImplemented + + return (isinstance(other, tzutc) or + (isinstance(other, tzoffset) and other._offset == ZERO)) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s()" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + + +class tzoffset(datetime.tzinfo): + """ + A simple class for representing a fixed offset from UTC. + + :param name: + The timezone name, to be returned when ``tzname()`` is called. + + :param offset: + The time zone offset in seconds, or (since version 2.6.0, represented + as a :py:class:`datetime.timedelta` object. + """ + def __init__(self, name, offset): + self._name = name + + try: + # Allow a timedelta + offset = _total_seconds(offset) + except (TypeError, AttributeError): + pass + self._offset = datetime.timedelta(seconds=offset) + + def utcoffset(self, dt): + return self._offset + + def dst(self, dt): + return ZERO + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + return False + + @tzname_in_python2 + def tzname(self, dt): + return self._name + + def __eq__(self, other): + if not isinstance(other, tzoffset): + return NotImplemented + + return self._offset == other._offset + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s(%s, %s)" % (self.__class__.__name__, + repr(self._name), + int(_total_seconds(self._offset))) + + __reduce__ = object.__reduce__ + + +class tzlocal(_tzinfo): + """ + A :class:`tzinfo` subclass built around the ``time`` timezone functions. + """ + def __init__(self): + super(tzlocal, self).__init__() + + self._std_offset = datetime.timedelta(seconds=-time.timezone) + if time.daylight: + self._dst_offset = datetime.timedelta(seconds=-time.altzone) + else: + self._dst_offset = self._std_offset + + self._dst_saved = self._dst_offset - self._std_offset + self._hasdst = bool(self._dst_saved) + + def utcoffset(self, dt): + if dt is None and self._hasdst: + return None + + if self._isdst(dt): + return self._dst_offset + else: + return self._std_offset + + def dst(self, dt): + if dt is None and self._hasdst: + return None + + if self._isdst(dt): + return self._dst_offset - self._std_offset + else: + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return time.tzname[self._isdst(dt)] + + def is_ambiguous(self, dt): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + naive_dst = self._naive_is_dst(dt) + return (not naive_dst and + (naive_dst != self._naive_is_dst(dt - self._dst_saved))) + + def _naive_is_dst(self, dt): + timestamp = _datetime_to_timestamp(dt) + return time.localtime(timestamp + time.timezone).tm_isdst + + def _isdst(self, dt, fold_naive=True): + # We can't use mktime here. It is unstable when deciding if + # the hour near to a change is DST or not. + # + # timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour, + # dt.minute, dt.second, dt.weekday(), 0, -1)) + # return time.localtime(timestamp).tm_isdst + # + # The code above yields the following result: + # + # >>> import tz, datetime + # >>> t = tz.tzlocal() + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRDT' + # >>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname() + # 'BRST' + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRST' + # >>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname() + # 'BRDT' + # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() + # 'BRDT' + # + # Here is a more stable implementation: + # + if not self._hasdst: + return False + + # Check for ambiguous times: + dstval = self._naive_is_dst(dt) + fold = getattr(dt, 'fold', None) + + if self.is_ambiguous(dt): + if fold is not None: + return not self._fold(dt) + else: + return True + + return dstval + + def __eq__(self, other): + if not isinstance(other, tzlocal): + return NotImplemented + + return (self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s()" % self.__class__.__name__ + + __reduce__ = object.__reduce__ + + +class _ttinfo(object): + __slots__ = ["offset", "delta", "isdst", "abbr", + "isstd", "isgmt", "dstoffset"] + + def __init__(self): + for attr in self.__slots__: + setattr(self, attr, None) + + def __repr__(self): + l = [] + for attr in self.__slots__: + value = getattr(self, attr) + if value is not None: + l.append("%s=%s" % (attr, repr(value))) + return "%s(%s)" % (self.__class__.__name__, ", ".join(l)) + + def __eq__(self, other): + if not isinstance(other, _ttinfo): + return NotImplemented + + return (self.offset == other.offset and + self.delta == other.delta and + self.isdst == other.isdst and + self.abbr == other.abbr and + self.isstd == other.isstd and + self.isgmt == other.isgmt and + self.dstoffset == other.dstoffset) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __getstate__(self): + state = {} + for name in self.__slots__: + state[name] = getattr(self, name, None) + return state + + def __setstate__(self, state): + for name in self.__slots__: + if name in state: + setattr(self, name, state[name]) + + +class _tzfile(object): + """ + Lightweight class for holding the relevant transition and time zone + information read from binary tzfiles. + """ + attrs = ['trans_list', 'trans_idx', 'ttinfo_list', + 'ttinfo_std', 'ttinfo_dst', 'ttinfo_before', 'ttinfo_first'] + + def __init__(self, **kwargs): + for attr in self.attrs: + setattr(self, attr, kwargs.get(attr, None)) + + +class tzfile(_tzinfo): + """ + This is a ``tzinfo`` subclass that allows one to use the ``tzfile(5)`` + format timezone files to extract current and historical zone information. + + :param fileobj: + This can be an opened file stream or a file name that the time zone + information can be read from. + + :param filename: + This is an optional parameter specifying the source of the time zone + information in the event that ``fileobj`` is a file object. If omitted + and ``fileobj`` is a file stream, this parameter will be set either to + ``fileobj``'s ``name`` attribute or to ``repr(fileobj)``. + + See `Sources for Time Zone and Daylight Saving Time Data + `_ for more information. Time zone + files can be compiled from the `IANA Time Zone database files + `_ with the `zic time zone compiler + `_ + """ + + def __init__(self, fileobj, filename=None): + super(tzfile, self).__init__() + + file_opened_here = False + if isinstance(fileobj, string_types): + self._filename = fileobj + fileobj = open(fileobj, 'rb') + file_opened_here = True + elif filename is not None: + self._filename = filename + elif hasattr(fileobj, "name"): + self._filename = fileobj.name + else: + self._filename = repr(fileobj) + + if fileobj is not None: + if not file_opened_here: + fileobj = _ContextWrapper(fileobj) + + with fileobj as file_stream: + tzobj = self._read_tzfile(file_stream) + + self._set_tzdata(tzobj) + + def _set_tzdata(self, tzobj): + """ Set the time zone data of this object from a _tzfile object """ + # Copy the relevant attributes over as private attributes + for attr in _tzfile.attrs: + setattr(self, '_' + attr, getattr(tzobj, attr)) + + def _read_tzfile(self, fileobj): + out = _tzfile() + + # From tzfile(5): + # + # The time zone information files used by tzset(3) + # begin with the magic characters "TZif" to identify + # them as time zone information files, followed by + # sixteen bytes reserved for future use, followed by + # six four-byte values of type long, written in a + # ``standard'' byte order (the high-order byte + # of the value is written first). + if fileobj.read(4).decode() != "TZif": + raise ValueError("magic not found") + + fileobj.read(16) + + ( + # The number of UTC/local indicators stored in the file. + ttisgmtcnt, + + # The number of standard/wall indicators stored in the file. + ttisstdcnt, + + # The number of leap seconds for which data is + # stored in the file. + leapcnt, + + # The number of "transition times" for which data + # is stored in the file. + timecnt, + + # The number of "local time types" for which data + # is stored in the file (must not be zero). + typecnt, + + # The number of characters of "time zone + # abbreviation strings" stored in the file. + charcnt, + + ) = struct.unpack(">6l", fileobj.read(24)) + + # The above header is followed by tzh_timecnt four-byte + # values of type long, sorted in ascending order. + # These values are written in ``standard'' byte order. + # Each is used as a transition time (as returned by + # time(2)) at which the rules for computing local time + # change. + + if timecnt: + out.trans_list = list(struct.unpack(">%dl" % timecnt, + fileobj.read(timecnt*4))) + else: + out.trans_list = [] + + # Next come tzh_timecnt one-byte values of type unsigned + # char; each one tells which of the different types of + # ``local time'' types described in the file is associated + # with the same-indexed transition time. These values + # serve as indices into an array of ttinfo structures that + # appears next in the file. + + if timecnt: + out.trans_idx = struct.unpack(">%dB" % timecnt, + fileobj.read(timecnt)) + else: + out.trans_idx = [] + + # Each ttinfo structure is written as a four-byte value + # for tt_gmtoff of type long, in a standard byte + # order, followed by a one-byte value for tt_isdst + # and a one-byte value for tt_abbrind. In each + # structure, tt_gmtoff gives the number of + # seconds to be added to UTC, tt_isdst tells whether + # tm_isdst should be set by localtime(3), and + # tt_abbrind serves as an index into the array of + # time zone abbreviation characters that follow the + # ttinfo structure(s) in the file. + + ttinfo = [] + + for i in range(typecnt): + ttinfo.append(struct.unpack(">lbb", fileobj.read(6))) + + abbr = fileobj.read(charcnt).decode() + + # Then there are tzh_leapcnt pairs of four-byte + # values, written in standard byte order; the + # first value of each pair gives the time (as + # returned by time(2)) at which a leap second + # occurs; the second gives the total number of + # leap seconds to be applied after the given time. + # The pairs of values are sorted in ascending order + # by time. + + # Not used, for now (but read anyway for correct file position) + if leapcnt: + leap = struct.unpack(">%dl" % (leapcnt*2), + fileobj.read(leapcnt*8)) + + # Then there are tzh_ttisstdcnt standard/wall + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as standard + # time or wall clock time, and are used when + # a time zone file is used in handling POSIX-style + # time zone environment variables. + + if ttisstdcnt: + isstd = struct.unpack(">%db" % ttisstdcnt, + fileobj.read(ttisstdcnt)) + + # Finally, there are tzh_ttisgmtcnt UTC/local + # indicators, each stored as a one-byte value; + # they tell whether the transition times associated + # with local time types were specified as UTC or + # local time, and are used when a time zone file + # is used in handling POSIX-style time zone envi- + # ronment variables. + + if ttisgmtcnt: + isgmt = struct.unpack(">%db" % ttisgmtcnt, + fileobj.read(ttisgmtcnt)) + + # Build ttinfo list + out.ttinfo_list = [] + for i in range(typecnt): + gmtoff, isdst, abbrind = ttinfo[i] + # Round to full-minutes if that's not the case. Python's + # datetime doesn't accept sub-minute timezones. Check + # http://python.org/sf/1447945 for some information. + gmtoff = 60 * ((gmtoff + 30) // 60) + tti = _ttinfo() + tti.offset = gmtoff + tti.dstoffset = datetime.timedelta(0) + tti.delta = datetime.timedelta(seconds=gmtoff) + tti.isdst = isdst + tti.abbr = abbr[abbrind:abbr.find('\x00', abbrind)] + tti.isstd = (ttisstdcnt > i and isstd[i] != 0) + tti.isgmt = (ttisgmtcnt > i and isgmt[i] != 0) + out.ttinfo_list.append(tti) + + # Replace ttinfo indexes for ttinfo objects. + out.trans_idx = [out.ttinfo_list[idx] for idx in out.trans_idx] + + # Set standard, dst, and before ttinfos. before will be + # used when a given time is before any transitions, + # and will be set to the first non-dst ttinfo, or to + # the first dst, if all of them are dst. + out.ttinfo_std = None + out.ttinfo_dst = None + out.ttinfo_before = None + if out.ttinfo_list: + if not out.trans_list: + out.ttinfo_std = out.ttinfo_first = out.ttinfo_list[0] + else: + for i in range(timecnt-1, -1, -1): + tti = out.trans_idx[i] + if not out.ttinfo_std and not tti.isdst: + out.ttinfo_std = tti + elif not out.ttinfo_dst and tti.isdst: + out.ttinfo_dst = tti + + if out.ttinfo_std and out.ttinfo_dst: + break + else: + if out.ttinfo_dst and not out.ttinfo_std: + out.ttinfo_std = out.ttinfo_dst + + for tti in out.ttinfo_list: + if not tti.isdst: + out.ttinfo_before = tti + break + else: + out.ttinfo_before = out.ttinfo_list[0] + + # Now fix transition times to become relative to wall time. + # + # I'm not sure about this. In my tests, the tz source file + # is setup to wall time, and in the binary file isstd and + # isgmt are off, so it should be in wall time. OTOH, it's + # always in gmt time. Let me know if you have comments + # about this. + laststdoffset = None + for i, tti in enumerate(out.trans_idx): + if not tti.isdst: + offset = tti.offset + laststdoffset = offset + else: + if laststdoffset is not None: + # Store the DST offset as well and update it in the list + tti.dstoffset = tti.offset - laststdoffset + out.trans_idx[i] = tti + + offset = laststdoffset or 0 + + out.trans_list[i] += offset + + # In case we missed any DST offsets on the way in for some reason, make + # a second pass over the list, looking for the /next/ DST offset. + laststdoffset = None + for i in reversed(range(len(out.trans_idx))): + tti = out.trans_idx[i] + if tti.isdst: + if not (tti.dstoffset or laststdoffset is None): + tti.dstoffset = tti.offset - laststdoffset + else: + laststdoffset = tti.offset + + if not isinstance(tti.dstoffset, datetime.timedelta): + tti.dstoffset = datetime.timedelta(seconds=tti.dstoffset) + + out.trans_idx[i] = tti + + out.trans_idx = tuple(out.trans_idx) + out.trans_list = tuple(out.trans_list) + + return out + + def _find_last_transition(self, dt): + # If there's no list, there are no transitions to find + if not self._trans_list: + return None + + timestamp = _datetime_to_timestamp(dt) + + # Find where the timestamp fits in the transition list - if the + # timestamp is a transition time, it's part of the "after" period. + idx = bisect.bisect_right(self._trans_list, timestamp) + + # We want to know when the previous transition was, so subtract off 1 + return idx - 1 + + def _get_ttinfo(self, idx): + # For no list or after the last transition, default to _ttinfo_std + if idx is None or (idx + 1) == len(self._trans_list): + return self._ttinfo_std + + # If there is a list and the time is before it, return _ttinfo_before + if idx < 0: + return self._ttinfo_before + + return self._trans_idx[idx] + + def _find_ttinfo(self, dt): + idx = self._resolve_ambiguous_time(dt) + + return self._get_ttinfo(idx) + + def is_ambiguous(self, dt, idx=None): + """ + Whether or not the "wall time" of a given datetime is ambiguous in this + zone. + + :param dt: + A :py:class:`datetime.datetime`, naive or time zone aware. + + + :return: + Returns ``True`` if ambiguous, ``False`` otherwise. + + .. versionadded:: 2.6.0 + """ + if idx is None: + idx = self._find_last_transition(dt) + + # Calculate the difference in offsets from current to previous + timestamp = _datetime_to_timestamp(dt) + tti = self._get_ttinfo(idx) + + if idx is None or idx <= 0: + return False + + od = self._get_ttinfo(idx - 1).offset - tti.offset + tt = self._trans_list[idx] # Transition time + + return timestamp < tt + od + + def _resolve_ambiguous_time(self, dt): + idx = self._find_last_transition(dt) + + # If we have no transitions, return the index + _fold = self._fold(dt) + if idx is None or idx == 0: + return idx + + # Get the current datetime as a timestamp + idx_offset = int(not _fold and self.is_ambiguous(dt, idx)) + + return idx - idx_offset + + def utcoffset(self, dt): + if dt is None: + return None + + if not self._ttinfo_std: + return ZERO + + return self._find_ttinfo(dt).delta + + def dst(self, dt): + if dt is None: + return None + + if not self._ttinfo_dst: + return ZERO + + tti = self._find_ttinfo(dt) + + if not tti.isdst: + return ZERO + + # The documentation says that utcoffset()-dst() must + # be constant for every dt. + return tti.dstoffset + + @tzname_in_python2 + def tzname(self, dt): + if not self._ttinfo_std or dt is None: + return None + return self._find_ttinfo(dt).abbr + + def __eq__(self, other): + if not isinstance(other, tzfile): + return NotImplemented + return (self._trans_list == other._trans_list and + self._trans_idx == other._trans_idx and + self._ttinfo_list == other._ttinfo_list) + + __hash__ = None + + def __ne__(self, other): + return not (self == other) + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self._filename)) + + def __reduce__(self): + return self.__reduce_ex__(None) + + def __reduce_ex__(self, protocol): + return (self.__class__, (None, self._filename), self.__dict__) + + +class tzrange(tzrangebase): + """ + The ``tzrange`` object is a time zone specified by a set of offsets and + abbreviations, equivalent to the way the ``TZ`` variable can be specified + in POSIX-like systems, but using Python delta objects to specify DST + start, end and offsets. + + :param stdabbr: + The abbreviation for standard time (e.g. ``'EST'``). + + :param stdoffset: + An integer or :class:`datetime.timedelta` object or equivalent + specifying the base offset from UTC. + + If unspecified, +00:00 is used. + + :param dstabbr: + The abbreviation for DST / "Summer" time (e.g. ``'EDT'``). + + If specified, with no other DST information, DST is assumed to occur + and the default behavior or ``dstoffset``, ``start`` and ``end`` is + used. If unspecified and no other DST information is specified, it + is assumed that this zone has no DST. + + If this is unspecified and other DST information is *is* specified, + DST occurs in the zone but the time zone abbreviation is left + unchanged. + + :param dstoffset: + A an integer or :class:`datetime.timedelta` object or equivalent + specifying the UTC offset during DST. If unspecified and any other DST + information is specified, it is assumed to be the STD offset +1 hour. + + :param start: + A :class:`relativedelta.relativedelta` object or equivalent specifying + the time and time of year that daylight savings time starts. To specify, + for example, that DST starts at 2AM on the 2nd Sunday in March, pass: + + ``relativedelta(hours=2, month=3, day=1, weekday=SU(+2))`` + + If unspecified and any other DST information is specified, the default + value is 2 AM on the first Sunday in April. + + :param end: + A :class:`relativedelta.relativedelta` object or equivalent representing + the time and time of year that daylight savings time ends, with the + same specification method as in ``start``. One note is that this should + point to the first time in the *standard* zone, so if a transition + occurs at 2AM in the DST zone and the clocks are set back 1 hour to 1AM, + set the `hours` parameter to +1. + + + **Examples:** + + .. testsetup:: tzrange + + from dateutil.tz import tzrange, tzstr + + .. doctest:: tzrange + + >>> tzstr('EST5EDT') == tzrange("EST", -18000, "EDT") + True + + >>> from dateutil.relativedelta import * + >>> range1 = tzrange("EST", -18000, "EDT") + >>> range2 = tzrange("EST", -18000, "EDT", -14400, + ... relativedelta(hours=+2, month=4, day=1, + ... weekday=SU(+1)), + ... relativedelta(hours=+1, month=10, day=31, + ... weekday=SU(-1))) + >>> tzstr('EST5EDT') == range1 == range2 + True + + """ + def __init__(self, stdabbr, stdoffset=None, + dstabbr=None, dstoffset=None, + start=None, end=None): + + global relativedelta + from dateutil import relativedelta + + self._std_abbr = stdabbr + self._dst_abbr = dstabbr + + try: + stdoffset = _total_seconds(stdoffset) + except (TypeError, AttributeError): + pass + + try: + dstoffset = _total_seconds(dstoffset) + except (TypeError, AttributeError): + pass + + if stdoffset is not None: + self._std_offset = datetime.timedelta(seconds=stdoffset) + else: + self._std_offset = ZERO + + if dstoffset is not None: + self._dst_offset = datetime.timedelta(seconds=dstoffset) + elif dstabbr and stdoffset is not None: + self._dst_offset = self._std_offset + datetime.timedelta(hours=+1) + else: + self._dst_offset = ZERO + + if dstabbr and start is None: + self._start_delta = relativedelta.relativedelta( + hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) + else: + self._start_delta = start + + if dstabbr and end is None: + self._end_delta = relativedelta.relativedelta( + hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) + else: + self._end_delta = end + + self._dst_base_offset_ = self._dst_offset - self._std_offset + self.hasdst = bool(self._start_delta) + + def transitions(self, year): + """ + For a given year, get the DST on and off transition times, expressed + always on the standard time side. For zones with no transitions, this + function returns ``None``. + + :param year: + The year whose transitions you would like to query. + + :return: + Returns a :class:`tuple` of :class:`datetime.datetime` objects, + ``(dston, dstoff)`` for zones with an annual DST transition, or + ``None`` for fixed offset zones. + """ + if not self.hasdst: + return None + + base_year = datetime.datetime(year, 1, 1) + + start = base_year + self._start_delta + end = base_year + self._end_delta + + return (start, end) + + def __eq__(self, other): + if not isinstance(other, tzrange): + return NotImplemented + + return (self._std_abbr == other._std_abbr and + self._dst_abbr == other._dst_abbr and + self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset and + self._start_delta == other._start_delta and + self._end_delta == other._end_delta) + + @property + def _dst_base_offset(self): + return self._dst_base_offset_ + + +class tzstr(tzrange): + """ + ``tzstr`` objects are time zone objects specified by a time-zone string as + it would be passed to a ``TZ`` variable on POSIX-style systems (see + the `GNU C Library: TZ Variable`_ for more details). + + There is one notable exception, which is that POSIX-style time zones use an + inverted offset format, so normally ``GMT+3`` would be parsed as an offset + 3 hours *behind* GMT. The ``tzstr`` time zone object will parse this as an + offset 3 hours *ahead* of GMT. If you would like to maintain the POSIX + behavior, pass a ``True`` value to ``posix_offset``. + + The :class:`tzrange` object provides the same functionality, but is + specified using :class:`relativedelta.relativedelta` objects. rather than + strings. + + :param s: + A time zone string in ``TZ`` variable format. This can be a + :class:`bytes` (2.x: :class:`str`), :class:`str` (2.x: :class:`unicode`) + or a stream emitting unicode characters (e.g. :class:`StringIO`). + + :param posix_offset: + Optional. If set to ``True``, interpret strings such as ``GMT+3`` or + ``UTC+3`` as being 3 hours *behind* UTC rather than ahead, per the + POSIX standard. + + .. _`GNU C Library: TZ Variable`: + https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html + """ + def __init__(self, s, posix_offset=False): + global parser + from dateutil import parser + + self._s = s + + res = parser._parsetz(s) + if res is None: + raise ValueError("unknown string format") + + # Here we break the compatibility with the TZ variable handling. + # GMT-3 actually *means* the timezone -3. + if res.stdabbr in ("GMT", "UTC") and not posix_offset: + res.stdoffset *= -1 + + # We must initialize it first, since _delta() needs + # _std_offset and _dst_offset set. Use False in start/end + # to avoid building it two times. + tzrange.__init__(self, res.stdabbr, res.stdoffset, + res.dstabbr, res.dstoffset, + start=False, end=False) + + if not res.dstabbr: + self._start_delta = None + self._end_delta = None + else: + self._start_delta = self._delta(res.start) + if self._start_delta: + self._end_delta = self._delta(res.end, isend=1) + + self.hasdst = bool(self._start_delta) + + def _delta(self, x, isend=0): + from dateutil import relativedelta + kwargs = {} + if x.month is not None: + kwargs["month"] = x.month + if x.weekday is not None: + kwargs["weekday"] = relativedelta.weekday(x.weekday, x.week) + if x.week > 0: + kwargs["day"] = 1 + else: + kwargs["day"] = 31 + elif x.day: + kwargs["day"] = x.day + elif x.yday is not None: + kwargs["yearday"] = x.yday + elif x.jyday is not None: + kwargs["nlyearday"] = x.jyday + if not kwargs: + # Default is to start on first sunday of april, and end + # on last sunday of october. + if not isend: + kwargs["month"] = 4 + kwargs["day"] = 1 + kwargs["weekday"] = relativedelta.SU(+1) + else: + kwargs["month"] = 10 + kwargs["day"] = 31 + kwargs["weekday"] = relativedelta.SU(-1) + if x.time is not None: + kwargs["seconds"] = x.time + else: + # Default is 2AM. + kwargs["seconds"] = 7200 + if isend: + # Convert to standard time, to follow the documented way + # of working with the extra hour. See the documentation + # of the tzinfo class. + delta = self._dst_offset - self._std_offset + kwargs["seconds"] -= delta.seconds + delta.days * 86400 + return relativedelta.relativedelta(**kwargs) + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self._s)) + + +class _tzicalvtzcomp(object): + def __init__(self, tzoffsetfrom, tzoffsetto, isdst, + tzname=None, rrule=None): + self.tzoffsetfrom = datetime.timedelta(seconds=tzoffsetfrom) + self.tzoffsetto = datetime.timedelta(seconds=tzoffsetto) + self.tzoffsetdiff = self.tzoffsetto - self.tzoffsetfrom + self.isdst = isdst + self.tzname = tzname + self.rrule = rrule + + +class _tzicalvtz(_tzinfo): + def __init__(self, tzid, comps=[]): + super(_tzicalvtz, self).__init__() + + self._tzid = tzid + self._comps = comps + self._cachedate = [] + self._cachecomp = [] + + def _find_comp(self, dt): + if len(self._comps) == 1: + return self._comps[0] + + dt = dt.replace(tzinfo=None) + + try: + return self._cachecomp[self._cachedate.index((dt, self._fold(dt)))] + except ValueError: + pass + + + lastcompdt = None + lastcomp = None + + for comp in self._comps: + compdt = self._find_compdt(comp, dt) + + if compdt and (not lastcompdt or lastcompdt < compdt): + lastcompdt = compdt + lastcomp = comp + + if not lastcomp: + # RFC says nothing about what to do when a given + # time is before the first onset date. We'll look for the + # first standard component, or the first component, if + # none is found. + for comp in self._comps: + if not comp.isdst: + lastcomp = comp + break + else: + lastcomp = comp[0] + + self._cachedate.insert(0, (dt, self._fold(dt))) + self._cachecomp.insert(0, lastcomp) + + if len(self._cachedate) > 10: + self._cachedate.pop() + self._cachecomp.pop() + + return lastcomp + + def _find_compdt(self, comp, dt): + if comp.tzoffsetdiff < ZERO and self._fold(dt): + dt -= comp.tzoffsetdiff + + compdt = comp.rrule.before(dt, inc=True) + + return compdt + + def utcoffset(self, dt): + if dt is None: + return None + + return self._find_comp(dt).tzoffsetto + + def dst(self, dt): + comp = self._find_comp(dt) + if comp.isdst: + return comp.tzoffsetdiff + else: + return ZERO + + @tzname_in_python2 + def tzname(self, dt): + return self._find_comp(dt).tzname + + def __repr__(self): + return "" % repr(self._tzid) + + __reduce__ = object.__reduce__ + + +class tzical(object): + """ + This object is designed to parse an iCalendar-style ``VTIMEZONE`` structure + as set out in `RFC 2445`_ Section 4.6.5 into one or more `tzinfo` objects. + + :param `fileobj`: + A file or stream in iCalendar format, which should be UTF-8 encoded + with CRLF endings. + + .. _`RFC 2445`: https://www.ietf.org/rfc/rfc2445.txt + """ + def __init__(self, fileobj): + global rrule + from dateutil import rrule + + if isinstance(fileobj, string_types): + self._s = fileobj + # ical should be encoded in UTF-8 with CRLF + fileobj = open(fileobj, 'r') + file_opened_here = True + else: + self._s = getattr(fileobj, 'name', repr(fileobj)) + fileobj = _ContextWrapper(fileobj) + + self._vtz = {} + + with fileobj as fobj: + self._parse_rfc(fobj.read()) + + def keys(self): + """ + Retrieves the available time zones as a list. + """ + return list(self._vtz.keys()) + + def get(self, tzid=None): + """ + Retrieve a :py:class:`datetime.tzinfo` object by its ``tzid``. + + :param tzid: + If there is exactly one time zone available, omitting ``tzid`` + or passing :py:const:`None` value returns it. Otherwise a valid + key (which can be retrieved from :func:`keys`) is required. + + :raises ValueError: + Raised if ``tzid`` is not specified but there are either more + or fewer than 1 zone defined. + + :returns: + Returns either a :py:class:`datetime.tzinfo` object representing + the relevant time zone or :py:const:`None` if the ``tzid`` was + not found. + """ + if tzid is None: + if len(self._vtz) == 0: + raise ValueError("no timezones defined") + elif len(self._vtz) > 1: + raise ValueError("more than one timezone available") + tzid = next(iter(self._vtz)) + + return self._vtz.get(tzid) + + def _parse_offset(self, s): + s = s.strip() + if not s: + raise ValueError("empty offset") + if s[0] in ('+', '-'): + signal = (-1, +1)[s[0] == '+'] + s = s[1:] + else: + signal = +1 + if len(s) == 4: + return (int(s[:2]) * 3600 + int(s[2:]) * 60) * signal + elif len(s) == 6: + return (int(s[:2]) * 3600 + int(s[2:4]) * 60 + int(s[4:])) * signal + else: + raise ValueError("invalid offset: " + s) + + def _parse_rfc(self, s): + lines = s.splitlines() + if not lines: + raise ValueError("empty string") + + # Unfold + i = 0 + while i < len(lines): + line = lines[i].rstrip() + if not line: + del lines[i] + elif i > 0 and line[0] == " ": + lines[i-1] += line[1:] + del lines[i] + else: + i += 1 + + tzid = None + comps = [] + invtz = False + comptype = None + for line in lines: + if not line: + continue + name, value = line.split(':', 1) + parms = name.split(';') + if not parms: + raise ValueError("empty property name") + name = parms[0].upper() + parms = parms[1:] + if invtz: + if name == "BEGIN": + if value in ("STANDARD", "DAYLIGHT"): + # Process component + pass + else: + raise ValueError("unknown component: "+value) + comptype = value + founddtstart = False + tzoffsetfrom = None + tzoffsetto = None + rrulelines = [] + tzname = None + elif name == "END": + if value == "VTIMEZONE": + if comptype: + raise ValueError("component not closed: "+comptype) + if not tzid: + raise ValueError("mandatory TZID not found") + if not comps: + raise ValueError( + "at least one component is needed") + # Process vtimezone + self._vtz[tzid] = _tzicalvtz(tzid, comps) + invtz = False + elif value == comptype: + if not founddtstart: + raise ValueError("mandatory DTSTART not found") + if tzoffsetfrom is None: + raise ValueError( + "mandatory TZOFFSETFROM not found") + if tzoffsetto is None: + raise ValueError( + "mandatory TZOFFSETFROM not found") + # Process component + rr = None + if rrulelines: + rr = rrule.rrulestr("\n".join(rrulelines), + compatible=True, + ignoretz=True, + cache=True) + comp = _tzicalvtzcomp(tzoffsetfrom, tzoffsetto, + (comptype == "DAYLIGHT"), + tzname, rr) + comps.append(comp) + comptype = None + else: + raise ValueError("invalid component end: "+value) + elif comptype: + if name == "DTSTART": + rrulelines.append(line) + founddtstart = True + elif name in ("RRULE", "RDATE", "EXRULE", "EXDATE"): + rrulelines.append(line) + elif name == "TZOFFSETFROM": + if parms: + raise ValueError( + "unsupported %s parm: %s " % (name, parms[0])) + tzoffsetfrom = self._parse_offset(value) + elif name == "TZOFFSETTO": + if parms: + raise ValueError( + "unsupported TZOFFSETTO parm: "+parms[0]) + tzoffsetto = self._parse_offset(value) + elif name == "TZNAME": + if parms: + raise ValueError( + "unsupported TZNAME parm: "+parms[0]) + tzname = value + elif name == "COMMENT": + pass + else: + raise ValueError("unsupported property: "+name) + else: + if name == "TZID": + if parms: + raise ValueError( + "unsupported TZID parm: "+parms[0]) + tzid = value + elif name in ("TZURL", "LAST-MODIFIED", "COMMENT"): + pass + else: + raise ValueError("unsupported property: "+name) + elif name == "BEGIN" and value == "VTIMEZONE": + tzid = None + comps = [] + invtz = True + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self._s)) + +if sys.platform != "win32": + TZFILES = ["/etc/localtime", "localtime"] + TZPATHS = ["/usr/share/zoneinfo", + "/usr/lib/zoneinfo", + "/usr/share/lib/zoneinfo", + "/etc/zoneinfo"] +else: + TZFILES = [] + TZPATHS = [] + + +def gettz(name=None): + tz = None + if not name: + try: + name = os.environ["TZ"] + except KeyError: + pass + if name is None or name == ":": + for filepath in TZFILES: + if not os.path.isabs(filepath): + filename = filepath + for path in TZPATHS: + filepath = os.path.join(path, filename) + if os.path.isfile(filepath): + break + else: + continue + if os.path.isfile(filepath): + try: + tz = tzfile(filepath) + break + except (IOError, OSError, ValueError): + pass + else: + tz = tzlocal() + else: + if name.startswith(":"): + name = name[:-1] + if os.path.isabs(name): + if os.path.isfile(name): + tz = tzfile(name) + else: + tz = None + else: + for path in TZPATHS: + filepath = os.path.join(path, name) + if not os.path.isfile(filepath): + filepath = filepath.replace(' ', '_') + if not os.path.isfile(filepath): + continue + try: + tz = tzfile(filepath) + break + except (IOError, OSError, ValueError): + pass + else: + tz = None + if tzwin is not None: + try: + tz = tzwin(name) + except WindowsError: + tz = None + + if not tz: + from dateutil.zoneinfo import get_zonefile_instance + tz = get_zonefile_instance().get(name) + + if not tz: + for c in name: + # name must have at least one offset to be a tzstr + if c in "0123456789": + try: + tz = tzstr(name) + except ValueError: + pass + break + else: + if name in ("GMT", "UTC"): + tz = tzutc() + elif name in time.tzname: + tz = tzlocal() + return tz + + +def datetime_exists(dt, tz=None): + """ + Given a datetime and a time zone, determine whether or not a given datetime + would fall in a gap. + + :param dt: + A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` + is provided.) + + :param tz: + A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If + ``None`` or not provided, the datetime's own time zone will be used. + + :return: + Returns a boolean value whether or not the "wall time" exists in ``tz``. + """ + if tz is None: + if dt.tzinfo is None: + raise ValueError('Datetime is naive and no time zone provided.') + tz = dt.tzinfo + + dt = dt.replace(tzinfo=None) + + # This is essentially a test of whether or not the datetime can survive + # a round trip to UTC. + dt_rt = dt.replace(tzinfo=tz).astimezone(tzutc()).astimezone(tz) + dt_rt = dt_rt.replace(tzinfo=None) + + return dt == dt_rt + + +def datetime_ambiguous(dt, tz=None): + """ + Given a datetime and a time zone, determine whether or not a given datetime + is ambiguous (i.e if there are two times differentiated only by their DST + status). + + :param dt: + A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` + is provided.) + + :param tz: + A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If + ``None`` or not provided, the datetime's own time zone will be used. + + :return: + Returns a boolean value whether or not the "wall time" is ambiguous in + ``tz``. + + .. versionadded:: 2.6.0 + """ + if tz is None: + if dt.tzinfo is None: + raise ValueError('Datetime is naive and no time zone provided.') + + tz = dt.tzinfo + + # If a time zone defines its own "is_ambiguous" function, we'll use that. + is_ambiguous_fn = getattr(tz, 'is_ambiguous', None) + if is_ambiguous_fn is not None: + try: + return tz.is_ambiguous(dt) + except: + pass + + # If it doesn't come out and tell us it's ambiguous, we'll just check if + # the fold attribute has any effect on this particular date and time. + dt = dt.replace(tzinfo=tz) + wall_0 = enfold(dt, fold=0) + wall_1 = enfold(dt, fold=1) + + same_offset = wall_0.utcoffset() == wall_1.utcoffset() + same_dst = wall_0.dst() == wall_1.dst() + + return not (same_offset and same_dst) + + +def _datetime_to_timestamp(dt): + """ + Convert a :class:`datetime.datetime` object to an epoch timestamp in seconds + since January 1, 1970, ignoring the time zone. + """ + return _total_seconds((dt.replace(tzinfo=None) - EPOCH)) + +class _ContextWrapper(object): + """ + Class for wrapping contexts so that they are passed through in a + with statement. + """ + def __init__(self, context): + self.context = context + + def __enter__(self): + return self.context + + def __exit__(*args, **kwargs): + pass + +# vim:ts=4:sw=4:et diff --git a/app/lib/dateutil/tz/win.py b/app/lib/dateutil/tz/win.py new file mode 100644 index 0000000..9f4e551 --- /dev/null +++ b/app/lib/dateutil/tz/win.py @@ -0,0 +1,332 @@ +# This code was originally contributed by Jeffrey Harris. +import datetime +import struct + +from six.moves import winreg +from six import text_type + +try: + import ctypes + from ctypes import wintypes +except ValueError: + # ValueError is raised on non-Windows systems for some horrible reason. + raise ImportError("Running tzwin on non-Windows system") + +from ._common import tzname_in_python2, _tzinfo +from ._common import tzrangebase + +__all__ = ["tzwin", "tzwinlocal", "tzres"] + +ONEWEEK = datetime.timedelta(7) + +TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" +TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones" +TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" + + +def _settzkeyname(): + handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) + try: + winreg.OpenKey(handle, TZKEYNAMENT).Close() + TZKEYNAME = TZKEYNAMENT + except WindowsError: + TZKEYNAME = TZKEYNAME9X + handle.Close() + return TZKEYNAME + +TZKEYNAME = _settzkeyname() + + +class tzres(object): + """ + Class for accessing `tzres.dll`, which contains timezone name related + resources. + + .. versionadded:: 2.5.0 + """ + p_wchar = ctypes.POINTER(wintypes.WCHAR) # Pointer to a wide char + + def __init__(self, tzres_loc='tzres.dll'): + # Load the user32 DLL so we can load strings from tzres + user32 = ctypes.WinDLL('user32') + + # Specify the LoadStringW function + user32.LoadStringW.argtypes = (wintypes.HINSTANCE, + wintypes.UINT, + wintypes.LPWSTR, + ctypes.c_int) + + self.LoadStringW = user32.LoadStringW + self._tzres = ctypes.WinDLL(tzres_loc) + self.tzres_loc = tzres_loc + + def load_name(self, offset): + """ + Load a timezone name from a DLL offset (integer). + + >>> from dateutil.tzwin import tzres + >>> tzr = tzres() + >>> print(tzr.load_name(112)) + 'Eastern Standard Time' + + :param offset: + A positive integer value referring to a string from the tzres dll. + + ..note: + Offsets found in the registry are generally of the form + `@tzres.dll,-114`. The offset in this case if 114, not -114. + + """ + resource = self.p_wchar() + lpBuffer = ctypes.cast(ctypes.byref(resource), wintypes.LPWSTR) + nchar = self.LoadStringW(self._tzres._handle, offset, lpBuffer, 0) + return resource[:nchar] + + def name_from_string(self, tzname_str): + """ + Parse strings as returned from the Windows registry into the time zone + name as defined in the registry. + + >>> from dateutil.tzwin import tzres + >>> tzr = tzres() + >>> print(tzr.name_from_string('@tzres.dll,-251')) + 'Dateline Daylight Time' + >>> print(tzr.name_from_string('Eastern Standard Time')) + 'Eastern Standard Time' + + :param tzname_str: + A timezone name string as returned from a Windows registry key. + + :return: + Returns the localized timezone string from tzres.dll if the string + is of the form `@tzres.dll,-offset`, else returns the input string. + """ + if not tzname_str.startswith('@'): + return tzname_str + + name_splt = tzname_str.split(',-') + try: + offset = int(name_splt[1]) + except: + raise ValueError("Malformed timezone string.") + + return self.load_name(offset) + + +class tzwinbase(tzrangebase): + """tzinfo class based on win32's timezones available in the registry.""" + def __init__(self): + raise NotImplementedError('tzwinbase is an abstract base class') + + def __eq__(self, other): + # Compare on all relevant dimensions, including name. + if not isinstance(other, tzwinbase): + return NotImplemented + + return (self._std_offset == other._std_offset and + self._dst_offset == other._dst_offset and + self._stddayofweek == other._stddayofweek and + self._dstdayofweek == other._dstdayofweek and + self._stdweeknumber == other._stdweeknumber and + self._dstweeknumber == other._dstweeknumber and + self._stdhour == other._stdhour and + self._dsthour == other._dsthour and + self._stdminute == other._stdminute and + self._dstminute == other._dstminute and + self._std_abbr == other._std_abbr and + self._dst_abbr == other._dst_abbr) + + @staticmethod + def list(): + """Return a list of all time zones known to the system.""" + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + with winreg.OpenKey(handle, TZKEYNAME) as tzkey: + result = [winreg.EnumKey(tzkey, i) + for i in range(winreg.QueryInfoKey(tzkey)[0])] + return result + + def display(self): + return self._display + + def transitions(self, year): + """ + For a given year, get the DST on and off transition times, expressed + always on the standard time side. For zones with no transitions, this + function returns ``None``. + + :param year: + The year whose transitions you would like to query. + + :return: + Returns a :class:`tuple` of :class:`datetime.datetime` objects, + ``(dston, dstoff)`` for zones with an annual DST transition, or + ``None`` for fixed offset zones. + """ + + if not self.hasdst: + return None + + dston = picknthweekday(year, self._dstmonth, self._dstdayofweek, + self._dsthour, self._dstminute, + self._dstweeknumber) + + dstoff = picknthweekday(year, self._stdmonth, self._stddayofweek, + self._stdhour, self._stdminute, + self._stdweeknumber) + + # Ambiguous dates default to the STD side + dstoff -= self._dst_base_offset + + return dston, dstoff + + def _get_hasdst(self): + return self._dstmonth != 0 + + @property + def _dst_base_offset(self): + return self._dst_base_offset_ + + +class tzwin(tzwinbase): + + def __init__(self, name): + self._name = name + + # multiple contexts only possible in 2.7 and 3.1, we still support 2.6 + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + tzkeyname = text_type("{kn}\{name}").format(kn=TZKEYNAME, name=name) + with winreg.OpenKey(handle, tzkeyname) as tzkey: + keydict = valuestodict(tzkey) + + self._std_abbr = keydict["Std"] + self._dst_abbr = keydict["Dlt"] + + self._display = keydict["Display"] + + # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm + tup = struct.unpack("=3l16h", keydict["TZI"]) + stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 + dstoffset = stdoffset-tup[2] # + DaylightBias * -1 + self._std_offset = datetime.timedelta(minutes=stdoffset) + self._dst_offset = datetime.timedelta(minutes=dstoffset) + + # for the meaning see the win32 TIME_ZONE_INFORMATION structure docs + # http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx + (self._stdmonth, + self._stddayofweek, # Sunday = 0 + self._stdweeknumber, # Last = 5 + self._stdhour, + self._stdminute) = tup[4:9] + + (self._dstmonth, + self._dstdayofweek, # Sunday = 0 + self._dstweeknumber, # Last = 5 + self._dsthour, + self._dstminute) = tup[12:17] + + self._dst_base_offset_ = self._dst_offset - self._std_offset + self.hasdst = self._get_hasdst() + + def __repr__(self): + return "tzwin(%s)" % repr(self._name) + + def __reduce__(self): + return (self.__class__, (self._name,)) + + +class tzwinlocal(tzwinbase): + def __init__(self): + with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: + with winreg.OpenKey(handle, TZLOCALKEYNAME) as tzlocalkey: + keydict = valuestodict(tzlocalkey) + + self._std_abbr = keydict["StandardName"] + self._dst_abbr = keydict["DaylightName"] + + try: + tzkeyname = text_type('{kn}\{sn}').format(kn=TZKEYNAME, + sn=self._std_abbr) + with winreg.OpenKey(handle, tzkeyname) as tzkey: + _keydict = valuestodict(tzkey) + self._display = _keydict["Display"] + except OSError: + self._display = None + + stdoffset = -keydict["Bias"]-keydict["StandardBias"] + dstoffset = stdoffset-keydict["DaylightBias"] + + self._std_offset = datetime.timedelta(minutes=stdoffset) + self._dst_offset = datetime.timedelta(minutes=dstoffset) + + # For reasons unclear, in this particular key, the day of week has been + # moved to the END of the SYSTEMTIME structure. + tup = struct.unpack("=8h", keydict["StandardStart"]) + + (self._stdmonth, + self._stdweeknumber, # Last = 5 + self._stdhour, + self._stdminute) = tup[1:5] + + self._stddayofweek = tup[7] + + tup = struct.unpack("=8h", keydict["DaylightStart"]) + + (self._dstmonth, + self._dstweeknumber, # Last = 5 + self._dsthour, + self._dstminute) = tup[1:5] + + self._dstdayofweek = tup[7] + + self._dst_base_offset_ = self._dst_offset - self._std_offset + self.hasdst = self._get_hasdst() + + def __repr__(self): + return "tzwinlocal()" + + def __str__(self): + # str will return the standard name, not the daylight name. + return "tzwinlocal(%s)" % repr(self._std_abbr) + + def __reduce__(self): + return (self.__class__, ()) + + +def picknthweekday(year, month, dayofweek, hour, minute, whichweek): + """ dayofweek == 0 means Sunday, whichweek 5 means last instance """ + first = datetime.datetime(year, month, 1, hour, minute) + + # This will work if dayofweek is ISO weekday (1-7) or Microsoft-style (0-6), + # Because 7 % 7 = 0 + weekdayone = first.replace(day=((dayofweek - first.isoweekday()) % 7) + 1) + wd = weekdayone + ((whichweek - 1) * ONEWEEK) + if (wd.month != month): + wd -= ONEWEEK + + return wd + + +def valuestodict(key): + """Convert a registry key's values to a dictionary.""" + dout = {} + size = winreg.QueryInfoKey(key)[1] + tz_res = None + + for i in range(size): + key_name, value, dtype = winreg.EnumValue(key, i) + if dtype == winreg.REG_DWORD or dtype == winreg.REG_DWORD_LITTLE_ENDIAN: + # If it's a DWORD (32-bit integer), it's stored as unsigned - convert + # that to a proper signed integer + if value & (1 << 31): + value = value - (1 << 32) + elif dtype == winreg.REG_SZ: + # If it's a reference to the tzres DLL, load the actual string + if value.startswith('@tzres'): + tz_res = tz_res or tzres() + value = tz_res.name_from_string(value) + + value = value.rstrip('\x00') # Remove trailing nulls + + dout[key_name] = value + + return dout diff --git a/app/lib/dateutil/tzwin.py b/app/lib/dateutil/tzwin.py new file mode 100644 index 0000000..55cd910 --- /dev/null +++ b/app/lib/dateutil/tzwin.py @@ -0,0 +1,2 @@ +# tzwin has moved to dateutil.tz.win +from .tz.win import * \ No newline at end of file diff --git a/app/lib/dateutil/zoneinfo/__init__.py b/app/lib/dateutil/zoneinfo/__init__.py new file mode 100644 index 0000000..7145e05 --- /dev/null +++ b/app/lib/dateutil/zoneinfo/__init__.py @@ -0,0 +1,187 @@ +# -*- coding: utf-8 -*- +import logging +import os +import warnings +import tempfile +import shutil +import json + +from tarfile import TarFile +from pkgutil import get_data +from io import BytesIO +from contextlib import closing + +from dateutil.tz import tzfile + +__all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata", "rebuild"] + +ZONEFILENAME = "dateutil-zoneinfo.tar.gz" +METADATA_FN = 'METADATA' + +# python2.6 compatability. Note that TarFile.__exit__ != TarFile.close, but +# it's close enough for python2.6 +tar_open = TarFile.open +if not hasattr(TarFile, '__exit__'): + def tar_open(*args, **kwargs): + return closing(TarFile.open(*args, **kwargs)) + + +class tzfile(tzfile): + def __reduce__(self): + return (gettz, (self._filename,)) + + +def getzoneinfofile_stream(): + try: + return BytesIO(get_data(__name__, ZONEFILENAME)) + except IOError as e: # TODO switch to FileNotFoundError? + warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror)) + return None + + +class ZoneInfoFile(object): + def __init__(self, zonefile_stream=None): + if zonefile_stream is not None: + with tar_open(fileobj=zonefile_stream, mode='r') as tf: + # dict comprehension does not work on python2.6 + # TODO: get back to the nicer syntax when we ditch python2.6 + # self.zones = {zf.name: tzfile(tf.extractfile(zf), + # filename = zf.name) + # for zf in tf.getmembers() if zf.isfile()} + self.zones = dict((zf.name, tzfile(tf.extractfile(zf), + filename=zf.name)) + for zf in tf.getmembers() + if zf.isfile() and zf.name != METADATA_FN) + # deal with links: They'll point to their parent object. Less + # waste of memory + # links = {zl.name: self.zones[zl.linkname] + # for zl in tf.getmembers() if zl.islnk() or zl.issym()} + links = dict((zl.name, self.zones[zl.linkname]) + for zl in tf.getmembers() if + zl.islnk() or zl.issym()) + self.zones.update(links) + try: + metadata_json = tf.extractfile(tf.getmember(METADATA_FN)) + metadata_str = metadata_json.read().decode('UTF-8') + self.metadata = json.loads(metadata_str) + except KeyError: + # no metadata in tar file + self.metadata = None + else: + self.zones = dict() + self.metadata = None + + def get(self, name, default=None): + """ + Wrapper for :func:`ZoneInfoFile.zones.get`. This is a convenience method + for retrieving zones from the zone dictionary. + + :param name: + The name of the zone to retrieve. (Generally IANA zone names) + + :param default: + The value to return in the event of a missing key. + + .. versionadded:: 2.6.0 + + """ + return self.zones.get(name, default) + + +# The current API has gettz as a module function, although in fact it taps into +# a stateful class. So as a workaround for now, without changing the API, we +# will create a new "global" class instance the first time a user requests a +# timezone. Ugly, but adheres to the api. +# +# TODO: Remove after deprecation period. +_CLASS_ZONE_INSTANCE = list() + +def get_zonefile_instance(new_instance=False): + """ + This is a convenience function which provides a :class:`ZoneInfoFile` + instance using the data provided by the ``dateutil`` package. By default, it + caches a single instance of the ZoneInfoFile object and returns that. + + :param new_instance: + If ``True``, a new instance of :class:`ZoneInfoFile` is instantiated and + used as the cached instance for the next call. Otherwise, new instances + are created only as necessary. + + :return: + Returns a :class:`ZoneInfoFile` object. + + .. versionadded:: 2.6 + """ + if new_instance: + zif = None + else: + zif = getattr(get_zonefile_instance, '_cached_instance', None) + + if zif is None: + zif = ZoneInfoFile(getzoneinfofile_stream()) + + get_zonefile_instance._cached_instance = zif + + return zif + +def gettz(name): + """ + This retrieves a time zone from the local zoneinfo tarball that is packaged + with dateutil. + + :param name: + An IANA-style time zone name, as found in the zoneinfo file. + + :return: + Returns a :class:`dateutil.tz.tzfile` time zone object. + + .. warning:: + It is generally inadvisable to use this function, and it is only + provided for API compatibility with earlier versions. This is *not* + equivalent to ``dateutil.tz.gettz()``, which selects an appropriate + time zone based on the inputs, favoring system zoneinfo. This is ONLY + for accessing the dateutil-specific zoneinfo (which may be out of + date compared to the system zoneinfo). + + .. deprecated:: 2.6 + If you need to use a specific zoneinfofile over the system zoneinfo, + instantiate a :class:`dateutil.zoneinfo.ZoneInfoFile` object and call + :func:`dateutil.zoneinfo.ZoneInfoFile.get(name)` instead. + + Use :func:`get_zonefile_instance` to retrieve an instance of the + dateutil-provided zoneinfo. + """ + warnings.warn("zoneinfo.gettz() will be removed in future versions, " + "to use the dateutil-provided zoneinfo files, instantiate a " + "ZoneInfoFile object and use ZoneInfoFile.zones.get() " + "instead. See the documentation for details.", + DeprecationWarning) + + if len(_CLASS_ZONE_INSTANCE) == 0: + _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) + return _CLASS_ZONE_INSTANCE[0].zones.get(name) + + +def gettz_db_metadata(): + """ Get the zonefile metadata + + See `zonefile_metadata`_ + + :returns: + A dictionary with the database metadata + + .. deprecated:: 2.6 + See deprecation warning in :func:`zoneinfo.gettz`. To get metadata, + query the attribute ``zoneinfo.ZoneInfoFile.metadata``. + """ + warnings.warn("zoneinfo.gettz_db_metadata() will be removed in future " + "versions, to use the dateutil-provided zoneinfo files, " + "ZoneInfoFile object and query the 'metadata' attribute " + "instead. See the documentation for details.", + DeprecationWarning) + + if len(_CLASS_ZONE_INSTANCE) == 0: + _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) + return _CLASS_ZONE_INSTANCE[0].metadata + + diff --git a/app/lib/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz b/app/lib/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1d15597b4630ade143d8408477858d1ba18dc707 GIT binary patch literal 139671 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

    aF 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 1. + if sys.exc_info()[-1].tb_next: + raise + else: + raise NoAppException('The file/path provided (%s) does not appear' + ' to exist. Please verify the path is ' + 'correct. If app is not on PYTHONPATH, ' + 'ensure the extension is .py' % module) + + mod = sys.modules[module] + if app_obj is None: + app = find_best_app(mod) + else: + app = getattr(mod, app_obj, None) + if app is None: + raise RuntimeError('Failed to find application in module "%s"' + % module) + + return app + + +def find_default_import_path(): + app = os.environ.get('FLASK_APP') + if app is None: + return + if os.path.isfile(app): + return prepare_exec_for_file(app) + return app + + +def get_version(ctx, param, value): + if not value or ctx.resilient_parsing: + return + message = 'Flask %(version)s\nPython %(python_version)s' + click.echo(message % { + 'version': __version__, + 'python_version': sys.version, + }, color=ctx.color) + ctx.exit() + +version_option = click.Option(['--version'], + help='Show the flask version', + expose_value=False, + callback=get_version, + is_flag=True, is_eager=True) + +class DispatchingApp(object): + """Special application that dispatches to a Flask application which + is imported by name in a background thread. If an error happens + it is recorded and shown as part of the WSGI handling which in case + of the Werkzeug debugger means that it shows up in the browser. + """ + + def __init__(self, loader, use_eager_loading=False): + self.loader = loader + self._app = None + self._lock = Lock() + self._bg_loading_exc_info = None + if use_eager_loading: + self._load_unlocked() + else: + self._load_in_background() + + def _load_in_background(self): + def _load_app(): + __traceback_hide__ = True + with self._lock: + try: + self._load_unlocked() + except Exception: + self._bg_loading_exc_info = sys.exc_info() + t = Thread(target=_load_app, args=()) + t.start() + + def _flush_bg_loading_exception(self): + __traceback_hide__ = True + exc_info = self._bg_loading_exc_info + if exc_info is not None: + self._bg_loading_exc_info = None + reraise(*exc_info) + + def _load_unlocked(self): + __traceback_hide__ = True + self._app = rv = self.loader() + self._bg_loading_exc_info = None + return rv + + def __call__(self, environ, start_response): + __traceback_hide__ = True + if self._app is not None: + return self._app(environ, start_response) + self._flush_bg_loading_exception() + with self._lock: + if self._app is not None: + rv = self._app + else: + rv = self._load_unlocked() + return rv(environ, start_response) + + +class ScriptInfo(object): + """Help object to deal with Flask applications. This is usually not + necessary to interface with as it's used internally in the dispatching + to click. In future versions of Flask this object will most likely play + a bigger role. Typically it's created automatically by the + :class:`FlaskGroup` but you can also manually create it and pass it + onwards as click object. + """ + + def __init__(self, app_import_path=None, create_app=None): + if create_app is None: + if app_import_path is None: + app_import_path = find_default_import_path() + self.app_import_path = app_import_path + else: + app_import_path = None + + #: Optionally the import path for the Flask application. + self.app_import_path = app_import_path + #: Optionally a function that is passed the script info to create + #: the instance of the application. + self.create_app = create_app + #: A dictionary with arbitrary data that can be associated with + #: this script info. + self.data = {} + self._loaded_app = None + + def load_app(self): + """Loads the Flask app (if not yet loaded) and returns it. Calling + this multiple times will just result in the already loaded app to + be returned. + """ + __traceback_hide__ = True + if self._loaded_app is not None: + return self._loaded_app + if self.create_app is not None: + rv = self.create_app(self) + else: + if not self.app_import_path: + raise NoAppException( + 'Could not locate Flask application. You did not provide ' + 'the FLASK_APP environment variable.\n\nFor more ' + 'information see ' + 'http://flask.pocoo.org/docs/latest/quickstart/') + rv = locate_app(self.app_import_path) + debug = get_debug_flag() + if debug is not None: + rv.debug = debug + self._loaded_app = rv + return rv + + +pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) + + +def with_appcontext(f): + """Wraps a callback so that it's guaranteed to be executed with the + script's application context. If callbacks are registered directly + to the ``app.cli`` object then they are wrapped with this function + by default unless it's disabled. + """ + @click.pass_context + def decorator(__ctx, *args, **kwargs): + with __ctx.ensure_object(ScriptInfo).load_app().app_context(): + return __ctx.invoke(f, *args, **kwargs) + return update_wrapper(decorator, f) + + +class AppGroup(click.Group): + """This works similar to a regular click :class:`~click.Group` but it + changes the behavior of the :meth:`command` decorator so that it + automatically wraps the functions in :func:`with_appcontext`. + + Not to be confused with :class:`FlaskGroup`. + """ + + def command(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` + unless it's disabled by passing ``with_appcontext=False``. + """ + wrap_for_ctx = kwargs.pop('with_appcontext', True) + def decorator(f): + if wrap_for_ctx: + f = with_appcontext(f) + return click.Group.command(self, *args, **kwargs)(f) + return decorator + + def group(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it defaults the group class to + :class:`AppGroup`. + """ + kwargs.setdefault('cls', AppGroup) + return click.Group.group(self, *args, **kwargs) + + +class FlaskGroup(AppGroup): + """Special subclass of the :class:`AppGroup` group that supports + loading more commands from the configured Flask app. Normally a + developer does not have to interface with this class but there are + some very advanced use cases for which it makes sense to create an + instance of this. + + For information as of why this is useful see :ref:`custom-scripts`. + + :param add_default_commands: if this is True then the default run and + shell commands wil be added. + :param add_version_option: adds the ``--version`` option. + :param create_app: an optional callback that is passed the script info + and returns the loaded app. + """ + + def __init__(self, add_default_commands=True, create_app=None, + add_version_option=True, **extra): + params = list(extra.pop('params', None) or ()) + + if add_version_option: + params.append(version_option) + + AppGroup.__init__(self, params=params, **extra) + self.create_app = create_app + + if add_default_commands: + self.add_command(run_command) + self.add_command(shell_command) + + self._loaded_plugin_commands = False + + def _load_plugin_commands(self): + if self._loaded_plugin_commands: + return + try: + import pkg_resources + except ImportError: + self._loaded_plugin_commands = True + return + + for ep in pkg_resources.iter_entry_points('flask.commands'): + self.add_command(ep.load(), ep.name) + self._loaded_plugin_commands = True + + def get_command(self, ctx, name): + self._load_plugin_commands() + + # We load built-in commands first as these should always be the + # same no matter what the app does. If the app does want to + # override this it needs to make a custom instance of this group + # and not attach the default commands. + # + # This also means that the script stays functional in case the + # application completely fails. + rv = AppGroup.get_command(self, ctx, name) + if rv is not None: + return rv + + info = ctx.ensure_object(ScriptInfo) + try: + rv = info.load_app().cli.get_command(ctx, name) + if rv is not None: + return rv + except NoAppException: + pass + + def list_commands(self, ctx): + self._load_plugin_commands() + + # The commands available is the list of both the application (if + # available) plus the builtin commands. + rv = set(click.Group.list_commands(self, ctx)) + info = ctx.ensure_object(ScriptInfo) + try: + rv.update(info.load_app().cli.list_commands(ctx)) + except Exception: + # Here we intentionally swallow all exceptions as we don't + # want the help page to break if the app does not exist. + # If someone attempts to use the command we try to create + # the app again and this will give us the error. + pass + return sorted(rv) + + def main(self, *args, **kwargs): + obj = kwargs.get('obj') + if obj is None: + obj = ScriptInfo(create_app=self.create_app) + kwargs['obj'] = obj + kwargs.setdefault('auto_envvar_prefix', 'FLASK') + return AppGroup.main(self, *args, **kwargs) + + +@click.command('run', short_help='Runs a development server.') +@click.option('--host', '-h', default='127.0.0.1', + help='The interface to bind to.') +@click.option('--port', '-p', default=5000, + help='The port to bind to.') +@click.option('--reload/--no-reload', default=None, + help='Enable or disable the reloader. By default the reloader ' + 'is active if debug is enabled.') +@click.option('--debugger/--no-debugger', default=None, + help='Enable or disable the debugger. By default the debugger ' + 'is active if debug is enabled.') +@click.option('--eager-loading/--lazy-loader', default=None, + help='Enable or disable eager loading. By default eager ' + 'loading is enabled if the reloader is disabled.') +@click.option('--with-threads/--without-threads', default=False, + help='Enable or disable multithreading.') +@pass_script_info +def run_command(info, host, port, reload, debugger, eager_loading, + with_threads): + """Runs a local development server for the Flask application. + + This local server is recommended for development purposes only but it + can also be used for simple intranet deployments. By default it will + not support any sort of concurrency at all to simplify debugging. This + can be changed with the --with-threads option which will enable basic + multithreading. + + The reloader and debugger are by default enabled if the debug flag of + Flask is enabled and disabled otherwise. + """ + from werkzeug.serving import run_simple + + debug = get_debug_flag() + if reload is None: + reload = bool(debug) + if debugger is None: + debugger = bool(debug) + if eager_loading is None: + eager_loading = not reload + + app = DispatchingApp(info.load_app, use_eager_loading=eager_loading) + + # Extra startup messages. This depends a bit on Werkzeug internals to + # not double execute when the reloader kicks in. + if os.environ.get('WERKZEUG_RUN_MAIN') != 'true': + # If we have an import path we can print it out now which can help + # people understand what's being served. If we do not have an + # import path because the app was loaded through a callback then + # we won't print anything. + if info.app_import_path is not None: + print(' * Serving Flask app "%s"' % info.app_import_path) + if debug is not None: + print(' * Forcing debug mode %s' % (debug and 'on' or 'off')) + + run_simple(host, port, app, use_reloader=reload, + use_debugger=debugger, threaded=with_threads) + + +@click.command('shell', short_help='Runs a shell in the app context.') +@with_appcontext +def shell_command(): + """Runs an interactive Python shell in the context of a given + Flask application. The application will populate the default + namespace of this shell according to it's configuration. + + This is useful for executing small snippets of management code + without having to manually configuring the application. + """ + import code + from flask.globals import _app_ctx_stack + app = _app_ctx_stack.top.app + banner = 'Python %s on %s\nApp: %s%s\nInstance: %s' % ( + sys.version, + sys.platform, + app.import_name, + app.debug and ' [debug]' or '', + app.instance_path, + ) + ctx = {} + + # Support the regular Python interpreter startup script if someone + # is using it. + startup = os.environ.get('PYTHONSTARTUP') + if startup and os.path.isfile(startup): + with open(startup, 'r') as f: + eval(compile(f.read(), startup, 'exec'), ctx) + + ctx.update(app.make_shell_context()) + + code.interact(banner=banner, local=ctx) + + +cli = FlaskGroup(help="""\ +This shell command acts as general utility script for Flask applications. + +It loads the application configured (through the FLASK_APP environment +variable) and then provides commands either provided by the application or +Flask itself. + +The most useful commands are the "run" and "shell" command. + +Example usage: + +\b + %(prefix)s%(cmd)s FLASK_APP=hello.py + %(prefix)s%(cmd)s FLASK_DEBUG=1 + %(prefix)sflask run +""" % { + 'cmd': os.name == 'posix' and 'export' or 'set', + 'prefix': os.name == 'posix' and '$ ' or '', +}) + + +def main(as_module=False): + this_module = __package__ + '.cli' + args = sys.argv[1:] + + if as_module: + if sys.version_info >= (2, 7): + name = 'python -m ' + this_module.rsplit('.', 1)[0] + else: + name = 'python -m ' + this_module + + # This module is always executed as "python -m flask.run" and as such + # we need to ensure that we restore the actual command line so that + # the reloader can properly operate. + sys.argv = ['-m', this_module] + sys.argv[1:] + else: + name = None + + cli.main(args=args, prog_name=name) + + +if __name__ == '__main__': + main(as_module=True) diff --git a/src/lib/flask/config.py b/app/lib/flask/config.py similarity index 57% rename from src/lib/flask/config.py rename to app/lib/flask/config.py index 155afa2..697add7 100644 --- a/src/lib/flask/config.py +++ b/app/lib/flask/config.py @@ -5,16 +5,17 @@ Implements the configuration related objects. - :copyright: (c) 2011 by Armin Ronacher. + :copyright: (c) 2015 by Armin Ronacher. :license: BSD, see LICENSE for more details. """ -import imp import os +import types import errno from werkzeug.utils import import_string -from ._compat import string_types +from ._compat import string_types, iteritems +from . import json class ConfigAttribute(object): @@ -92,9 +93,9 @@ def from_envvar(self, variable_name, silent=False): app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) :param variable_name: name of the environment variable - :param silent: set to `True` if you want silent failure for missing + :param silent: set to ``True`` if you want silent failure for missing files. - :return: bool. `True` if able to load config, `False` otherwise. + :return: bool. ``True`` if able to load config, ``False`` otherwise. """ rv = os.environ.get(variable_name) if not rv: @@ -115,17 +116,17 @@ def from_pyfile(self, filename, silent=False): :param filename: the filename of the config. This can either be an absolute filename or a filename relative to the root path. - :param silent: set to `True` if you want silent failure for missing + :param silent: set to ``True`` if you want silent failure for missing files. .. versionadded:: 0.7 `silent` parameter. """ filename = os.path.join(self.root_path, filename) - d = imp.new_module('config') + d = types.ModuleType('config') d.__file__ = filename try: - with open(filename) as config_file: + with open(filename, mode='rb') as config_file: exec(compile(config_file.read(), filename, 'exec'), d.__dict__) except IOError as e: if silent and e.errno in (errno.ENOENT, errno.EISDIR): @@ -142,10 +143,12 @@ def from_object(self, obj): - a string: in this case the object with that name will be imported - an actual object reference: that object is used directly - Objects are usually either modules or classes. + Objects are usually either modules or classes. :meth:`from_object` + loads only the uppercase attributes of the module/class. A ``dict`` + object will not work with :meth:`from_object` because the keys of a + ``dict`` are not attributes of the ``dict`` class. - Just the uppercase variables in that object are stored in the config. - Example usage:: + Example of module-based configuration:: app.config.from_object('yourapplication.default_config') from yourapplication import default_config @@ -156,6 +159,9 @@ def from_object(self, obj): with :meth:`from_pyfile` and ideally from a location not within the package because the package might be installed system wide. + See :ref:`config-dev-prod` for an example of class-based configuration + using :meth:`from_object`. + :param obj: an import name or object """ if isinstance(obj, string_types): @@ -164,5 +170,94 @@ def from_object(self, obj): if key.isupper(): self[key] = getattr(obj, key) + def from_json(self, filename, silent=False): + """Updates the values in the config from a JSON file. This function + behaves as if the JSON object was a dictionary and passed to the + :meth:`from_mapping` function. + + :param filename: the filename of the JSON file. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + + .. versionadded:: 0.11 + """ + filename = os.path.join(self.root_path, filename) + + try: + with open(filename) as json_file: + obj = json.loads(json_file.read()) + except IOError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR): + return False + e.strerror = 'Unable to load configuration file (%s)' % e.strerror + raise + return self.from_mapping(obj) + + def from_mapping(self, *mapping, **kwargs): + """Updates the config like :meth:`update` ignoring items with non-upper + keys. + + .. versionadded:: 0.11 + """ + mappings = [] + if len(mapping) == 1: + if hasattr(mapping[0], 'items'): + mappings.append(mapping[0].items()) + else: + mappings.append(mapping[0]) + elif len(mapping) > 1: + raise TypeError( + 'expected at most 1 positional argument, got %d' % len(mapping) + ) + mappings.append(kwargs.items()) + for mapping in mappings: + for (key, value) in mapping: + if key.isupper(): + self[key] = value + return True + + def get_namespace(self, namespace, lowercase=True, trim_namespace=True): + """Returns a dictionary containing a subset of configuration options + that match the specified namespace/prefix. Example usage:: + + app.config['IMAGE_STORE_TYPE'] = 'fs' + app.config['IMAGE_STORE_PATH'] = '/var/app/images' + app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' + image_store_config = app.config.get_namespace('IMAGE_STORE_') + + The resulting dictionary `image_store_config` would look like:: + + { + 'type': 'fs', + 'path': '/var/app/images', + 'base_url': 'http://img.website.com' + } + + This is often useful when configuration options map directly to + keyword arguments in functions or class constructors. + + :param namespace: a configuration namespace + :param lowercase: a flag indicating if the keys of the resulting + dictionary should be lowercase + :param trim_namespace: a flag indicating if the keys of the resulting + dictionary should not include the namespace + + .. versionadded:: 0.11 + """ + rv = {} + for k, v in iteritems(self): + if not k.startswith(namespace): + continue + if trim_namespace: + key = k[len(namespace):] + else: + key = k + if lowercase: + key = key.lower() + rv[key] = v + return rv + def __repr__(self): return '<%s %s>' % (self.__class__.__name__, dict.__repr__(self)) diff --git a/src/lib/flask/ctx.py b/app/lib/flask/ctx.py similarity index 81% rename from src/lib/flask/ctx.py rename to app/lib/flask/ctx.py index f134237..480d9c5 100644 --- a/src/lib/flask/ctx.py +++ b/app/lib/flask/ctx.py @@ -5,20 +5,22 @@ Implements the objects required to keep the context. - :copyright: (c) 2011 by Armin Ronacher. + :copyright: (c) 2015 by Armin Ronacher. :license: BSD, see LICENSE for more details. """ -from __future__ import with_statement - import sys from functools import update_wrapper from werkzeug.exceptions import HTTPException from .globals import _request_ctx_stack, _app_ctx_stack -from .module import blueprint_is_module from .signals import appcontext_pushed, appcontext_popped +from ._compat import BROKEN_PYPY_CTXMGR_EXIT, reraise + + +# a singleton sentinel value for parameter defaults +_sentinel = object() class _AppCtxGlobals(object): @@ -27,6 +29,15 @@ class _AppCtxGlobals(object): def get(self, name, default=None): return self.__dict__.get(name, default) + def pop(self, name, default=_sentinel): + if default is _sentinel: + return self.__dict__.pop(name) + else: + return self.__dict__.pop(name, default) + + def setdefault(self, name, default=None): + return self.__dict__.setdefault(name, default) + def __contains__(self, item): return item in self.__dict__ @@ -163,17 +174,21 @@ def __init__(self, app): def push(self): """Binds the app context to the current context.""" self._refcnt += 1 + if hasattr(sys, 'exc_clear'): + sys.exc_clear() _app_ctx_stack.push(self) appcontext_pushed.send(self.app) - def pop(self, exc=None): + def pop(self, exc=_sentinel): """Pops the app context.""" - self._refcnt -= 1 - if self._refcnt <= 0: - if exc is None: - exc = sys.exc_info()[1] - self.app.do_teardown_appcontext(exc) - rv = _app_ctx_stack.pop() + try: + self._refcnt -= 1 + if self._refcnt <= 0: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_appcontext(exc) + finally: + rv = _app_ctx_stack.pop() assert rv is self, 'Popped wrong app context. (%r instead of %r)' \ % (rv, self) appcontext_popped.send(self.app) @@ -185,6 +200,9 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, tb): self.pop(exc_value) + if BROKEN_PYPY_CTXMGR_EXIT and exc_type is not None: + reraise(exc_type, exc_value, tb) + class RequestContext(object): """The request context contains all request relevant information. It is @@ -204,8 +222,8 @@ class RequestContext(object): for you. In debug mode the request context is kept around if exceptions happen so that interactive debuggers have a chance to introspect the data. With 0.4 this can also be forced for requests - that did not fail and outside of `DEBUG` mode. By setting - ``'flask._preserve_context'`` to `True` on the WSGI environment the + that did not fail and outside of ``DEBUG`` mode. By setting + ``'flask._preserve_context'`` to ``True`` on the WSGI environment the context will not pop itself at the end of the request. This is used by the :meth:`~flask.Flask.test_client` for example to implement the deferred cleanup functionality. @@ -246,16 +264,6 @@ def __init__(self, app, environ, request=None): self.match_request() - # XXX: Support for deprecated functionality. This is going away with - # Flask 1.0 - blueprint = self.request.blueprint - if blueprint is not None: - # better safe than sorry, we don't want to break code that - # already worked - bp = app.blueprints.get(blueprint) - if bp is not None and blueprint_is_module(bp): - self.request._is_old_module = True - def _get_g(self): return _app_ctx_stack.top.g def _set_g(self, value): @@ -296,7 +304,7 @@ def push(self): # information under debug situations. However if someone forgets to # pop that context again we want to make sure that on the next push # it's invalidated, otherwise we run at risk that something leaks - # memory. This is usually only a problem in testsuite since this + # memory. This is usually only a problem in test suite since this # functionality is not active in production environments. top = _request_ctx_stack.top if top is not None and top.preserved: @@ -312,6 +320,9 @@ def push(self): else: self._implicit_app_ctx_stack.append(None) + if hasattr(sys, 'exc_clear'): + sys.exc_clear() + _request_ctx_stack.push(self) # Open the session at the moment that the request context is @@ -322,7 +333,7 @@ def push(self): if self.session is None: self.session = self.app.make_null_session() - def pop(self, exc=None): + def pop(self, exc=_sentinel): """Pops the request context and unbinds it by doing that. This will also trigger the execution of functions registered by the :meth:`~flask.Flask.teardown_request` decorator. @@ -332,38 +343,40 @@ def pop(self, exc=None): """ app_ctx = self._implicit_app_ctx_stack.pop() - clear_request = False - if not self._implicit_app_ctx_stack: - self.preserved = False - self._preserved_exc = None - if exc is None: - exc = sys.exc_info()[1] - self.app.do_teardown_request(exc) - - # If this interpreter supports clearing the exception information - # we do that now. This will only go into effect on Python 2.x, - # on 3.x it disappears automatically at the end of the exception - # stack. - if hasattr(sys, 'exc_clear'): - sys.exc_clear() - - request_close = getattr(self.request, 'close', None) - if request_close is not None: - request_close() - clear_request = True - - rv = _request_ctx_stack.pop() - assert rv is self, 'Popped wrong request context. (%r instead of %r)' \ - % (rv, self) - - # get rid of circular dependencies at the end of the request - # so that we don't require the GC to be active. - if clear_request: - rv.request.environ['werkzeug.request'] = None - - # Get rid of the app as well if necessary. - if app_ctx is not None: - app_ctx.pop(exc) + try: + clear_request = False + if not self._implicit_app_ctx_stack: + self.preserved = False + self._preserved_exc = None + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_request(exc) + + # If this interpreter supports clearing the exception information + # we do that now. This will only go into effect on Python 2.x, + # on 3.x it disappears automatically at the end of the exception + # stack. + if hasattr(sys, 'exc_clear'): + sys.exc_clear() + + request_close = getattr(self.request, 'close', None) + if request_close is not None: + request_close() + clear_request = True + finally: + rv = _request_ctx_stack.pop() + + # get rid of circular dependencies at the end of the request + # so that we don't require the GC to be active. + if clear_request: + rv.request.environ['werkzeug.request'] = None + + # Get rid of the app as well if necessary. + if app_ctx is not None: + app_ctx.pop(exc) + + assert rv is self, 'Popped wrong request context. ' \ + '(%r instead of %r)' % (rv, self) def auto_pop(self, exc): if self.request.environ.get('flask._preserve_context') or \ @@ -385,6 +398,9 @@ def __exit__(self, exc_type, exc_value, tb): # See flask.testing for how this works. self.auto_pop(exc_value) + if BROKEN_PYPY_CTXMGR_EXIT and exc_type is not None: + reraise(exc_type, exc_value, tb) + def __repr__(self): return '<%s \'%s\' [%s] of %s>' % ( self.__class__.__name__, diff --git a/src/lib/flask/debughelpers.py b/app/lib/flask/debughelpers.py similarity index 56% rename from src/lib/flask/debughelpers.py rename to app/lib/flask/debughelpers.py index 2f8510f..90710dd 100644 --- a/src/lib/flask/debughelpers.py +++ b/app/lib/flask/debughelpers.py @@ -5,10 +5,13 @@ Various helpers to make the development experience better. - :copyright: (c) 2011 by Armin Ronacher. + :copyright: (c) 2015 by Armin Ronacher. :license: BSD, see LICENSE for more details. """ -from ._compat import implements_to_string +from ._compat import implements_to_string, text_type +from .app import Flask +from .blueprints import Blueprint +from .globals import _request_ctx_stack class UnexpectedUnicodeError(AssertionError, UnicodeError): @@ -78,10 +81,75 @@ class newcls(oldcls): def __getitem__(self, key): try: return oldcls.__getitem__(self, key) - except KeyError as e: + except KeyError: if key not in request.form: raise raise DebugFilesKeyError(request, key) newcls.__name__ = oldcls.__name__ newcls.__module__ = oldcls.__module__ request.files.__class__ = newcls + + +def _dump_loader_info(loader): + yield 'class: %s.%s' % (type(loader).__module__, type(loader).__name__) + for key, value in sorted(loader.__dict__.items()): + if key.startswith('_'): + continue + if isinstance(value, (tuple, list)): + if not all(isinstance(x, (str, text_type)) for x in value): + continue + yield '%s:' % key + for item in value: + yield ' - %s' % item + continue + elif not isinstance(value, (str, text_type, int, float, bool)): + continue + yield '%s: %r' % (key, value) + + +def explain_template_loading_attempts(app, template, attempts): + """This should help developers understand what failed""" + info = ['Locating template "%s":' % template] + total_found = 0 + blueprint = None + reqctx = _request_ctx_stack.top + if reqctx is not None and reqctx.request.blueprint is not None: + blueprint = reqctx.request.blueprint + + for idx, (loader, srcobj, triple) in enumerate(attempts): + if isinstance(srcobj, Flask): + src_info = 'application "%s"' % srcobj.import_name + elif isinstance(srcobj, Blueprint): + src_info = 'blueprint "%s" (%s)' % (srcobj.name, + srcobj.import_name) + else: + src_info = repr(srcobj) + + info.append('% 5d: trying loader of %s' % ( + idx + 1, src_info)) + + for line in _dump_loader_info(loader): + info.append(' %s' % line) + + if triple is None: + detail = 'no match' + else: + detail = 'found (%r)' % (triple[1] or '') + total_found += 1 + info.append(' -> %s' % detail) + + seems_fishy = False + if total_found == 0: + info.append('Error: the template could not be found.') + seems_fishy = True + elif total_found > 1: + info.append('Warning: multiple loaders returned a match for the template.') + seems_fishy = True + + if blueprint is not None and seems_fishy: + info.append(' The template was looked up from an endpoint that ' + 'belongs to the blueprint "%s".' % blueprint) + info.append(' Maybe you did not place a template in the right folder?') + info.append(' See http://flask.pocoo.org/docs/blueprints/#templates') + + app.logger.info('\n'.join(info)) diff --git a/src/lib/flask/ext/__init__.py b/app/lib/flask/ext/__init__.py similarity index 94% rename from src/lib/flask/ext/__init__.py rename to app/lib/flask/ext/__init__.py index f29958a..051f44a 100644 --- a/src/lib/flask/ext/__init__.py +++ b/app/lib/flask/ext/__init__.py @@ -14,7 +14,7 @@ We're switching from namespace packages because it was just too painful for everybody involved. - :copyright: (c) 2011 by Armin Ronacher. + :copyright: (c) 2015 by Armin Ronacher. :license: BSD, see LICENSE for more details. """ diff --git a/src/lib/flask/exthook.py b/app/lib/flask/exthook.py similarity index 85% rename from src/lib/flask/exthook.py rename to app/lib/flask/exthook.py index d0d814c..d884280 100644 --- a/src/lib/flask/exthook.py +++ b/app/lib/flask/exthook.py @@ -16,14 +16,21 @@ This is used by `flask.ext`. - :copyright: (c) 2011 by Armin Ronacher. + :copyright: (c) 2015 by Armin Ronacher. :license: BSD, see LICENSE for more details. """ import sys import os +import warnings from ._compat import reraise +class ExtDeprecationWarning(DeprecationWarning): + pass + +warnings.simplefilter('always', ExtDeprecationWarning) + + class ExtensionImporter(object): """This importer redirects imports from this submodule to other locations. This makes it possible to transition from the old flaskext.name to the @@ -49,13 +56,21 @@ def install(self): sys.meta_path[:] = [x for x in sys.meta_path if self != x] + [self] def find_module(self, fullname, path=None): - if fullname.startswith(self.prefix): + if fullname.startswith(self.prefix) and \ + fullname != 'flask.ext.ExtDeprecationWarning': return self def load_module(self, fullname): if fullname in sys.modules: return sys.modules[fullname] + modname = fullname.split('.', self.prefix_cutoff)[self.prefix_cutoff] + + warnings.warn( + "Importing flask.ext.{x} is deprecated, use flask_{x} instead." + .format(x=modname), ExtDeprecationWarning, stacklevel=2 + ) + for path in self.module_choices: realname = path % modname try: @@ -83,6 +98,14 @@ def load_module(self, fullname): module = sys.modules[fullname] = sys.modules[realname] if '.' not in modname: setattr(sys.modules[self.wrapper_module], modname, module) + + if realname.startswith('flaskext.'): + warnings.warn( + "Detected extension named flaskext.{x}, please rename it " + "to flask_{x}. The old form is deprecated." + .format(x=modname), ExtDeprecationWarning + ) + return module raise ImportError('No module named %s' % fullname) @@ -111,7 +134,7 @@ def is_important_frame(self, important_module, tb): if module_name == important_module: return True - # Some python versions will will clean up modules so early that the + # Some python versions will clean up modules so early that the # module name at that point is no longer set. Try guessing from # the filename then. filename = os.path.abspath(tb.tb_frame.f_code.co_filename) diff --git a/src/lib/flask/globals.py b/app/lib/flask/globals.py similarity index 54% rename from src/lib/flask/globals.py rename to app/lib/flask/globals.py index 67d41f5..0b70a3e 100644 --- a/src/lib/flask/globals.py +++ b/app/lib/flask/globals.py @@ -6,7 +6,7 @@ Defines all the global objects that are proxies to the current active context. - :copyright: (c) 2011 by Armin Ronacher. + :copyright: (c) 2015 by Armin Ronacher. :license: BSD, see LICENSE for more details. """ @@ -14,24 +14,41 @@ from werkzeug.local import LocalStack, LocalProxy +_request_ctx_err_msg = '''\ +Working outside of request context. + +This typically means that you attempted to use functionality that needed +an active HTTP request. Consult the documentation on testing for +information about how to avoid this problem.\ +''' +_app_ctx_err_msg = '''\ +Working outside of application context. + +This typically means that you attempted to use functionality that needed +to interface with the current application object in a way. To solve +this set up an application context with app.app_context(). See the +documentation for more information.\ +''' + + def _lookup_req_object(name): top = _request_ctx_stack.top if top is None: - raise RuntimeError('working outside of request context') + raise RuntimeError(_request_ctx_err_msg) return getattr(top, name) def _lookup_app_object(name): top = _app_ctx_stack.top if top is None: - raise RuntimeError('working outside of application context') + raise RuntimeError(_app_ctx_err_msg) return getattr(top, name) def _find_app(): top = _app_ctx_stack.top if top is None: - raise RuntimeError('working outside of application context') + raise RuntimeError(_app_ctx_err_msg) return top.app diff --git a/src/lib/flask/helpers.py b/app/lib/flask/helpers.py similarity index 71% rename from src/lib/flask/helpers.py rename to app/lib/flask/helpers.py index 1e7c87f..c6c2cdd 100644 --- a/src/lib/flask/helpers.py +++ b/app/lib/flask/helpers.py @@ -5,7 +5,7 @@ Implements various helpers. - :copyright: (c) 2011 by Armin Ronacher. + :copyright: (c) 2015 by Armin Ronacher. :license: BSD, see LICENSE for more details. """ @@ -25,8 +25,9 @@ except ImportError: from urlparse import quote as url_quote -from werkzeug.datastructures import Headers -from werkzeug.exceptions import NotFound +from werkzeug.datastructures import Headers, Range +from werkzeug.exceptions import BadRequest, NotFound, \ + RequestedRangeNotSatisfiable # this was moved in 0.7 try: @@ -53,6 +54,13 @@ if sep not in (None, '/')) +def get_debug_flag(default=None): + val = os.environ.get('FLASK_DEBUG') + if not val: + return default + return val not in ('0', 'false', 'no') + + def _endpoint_from_view_func(view_func): """Internal helper that returns the default endpoint for a given function. This always is the function name. @@ -100,7 +108,7 @@ def generate(): gen = iter(generator_or_function) except TypeError: def decorator(*args, **kwargs): - gen = generator_or_function() + gen = generator_or_function(*args, **kwargs) return stream_with_context(gen) return update_wrapper(decorator, generator_or_function) @@ -188,7 +196,7 @@ def url_for(endpoint, **values): Variable arguments that are unknown to the target endpoint are appended to the generated URL as query arguments. If the value of a query argument - is `None`, the whole pair is skipped. In case blueprints are active + is ``None``, the whole pair is skipped. In case blueprints are active you can shortcut references to the same blueprint by prefixing the local endpoint with a dot (``.``). @@ -199,16 +207,16 @@ def url_for(endpoint, **values): For more information, head over to the :ref:`Quickstart `. To integrate applications, :class:`Flask` has a hook to intercept URL build - errors through :attr:`Flask.build_error_handler`. The `url_for` function - results in a :exc:`~werkzeug.routing.BuildError` when the current app does - not have a URL for the given endpoint and values. When it does, the - :data:`~flask.current_app` calls its :attr:`~Flask.build_error_handler` if - it is not `None`, which can return a string to use as the result of + errors through :attr:`Flask.url_build_error_handlers`. The `url_for` + function results in a :exc:`~werkzeug.routing.BuildError` when the current + app does not have a URL for the given endpoint and values. When it does, the + :data:`~flask.current_app` calls its :attr:`~Flask.url_build_error_handlers` if + it is not ``None``, which can return a string to use as the result of `url_for` (instead of `url_for`'s default to raise the :exc:`~werkzeug.routing.BuildError` exception) or re-raise the exception. An example:: - def external_url_handler(error, endpoint, **values): + def external_url_handler(error, endpoint, values): "Looks up an external URL when `url_for` cannot build a URL." # This is an example of hooking the build_error_handler. # Here, lookup_url is some utility function you've built @@ -225,10 +233,10 @@ def external_url_handler(error, endpoint, **values): # url_for will use this result, instead of raising BuildError. return url - app.build_error_handler = external_url_handler + app.url_build_error_handlers.append(external_url_handler) Here, `error` is the instance of :exc:`~werkzeug.routing.BuildError`, and - `endpoint` and `**values` are the arguments passed into `url_for`. Note + `endpoint` and `values` are the arguments passed into `url_for`. Note that this is for building URLs outside the current application, and not for handling 404 NotFound errors. @@ -244,11 +252,15 @@ def external_url_handler(error, endpoint, **values): :param endpoint: the endpoint of the URL (name of the function) :param values: the variable arguments of the URL rule - :param _external: if set to `True`, an absolute URL is generated. Server - address can be changed via `SERVER_NAME` configuration variable which + :param _external: if set to ``True``, an absolute URL is generated. Server + address can be changed via ``SERVER_NAME`` configuration variable which defaults to `localhost`. :param _scheme: a string specifying the desired URL scheme. The `_external` - parameter must be set to `True` or a `ValueError` is raised. + parameter must be set to ``True`` or a :exc:`ValueError` is raised. The default + behavior uses the same scheme as the current request, or + ``PREFERRED_URL_SCHEME`` from the :ref:`app configuration ` if no + request context is available. As of Werkzeug 0.10, this also can be set + to an empty string to build protocol-relative URLs. :param _anchor: if provided this is added as anchor to the URL. :param _method: if provided this explicitly specifies an HTTP method. """ @@ -260,7 +272,7 @@ def external_url_handler(error, endpoint, **values): 'executed when application context is available.') # If request specific information is available we have some extra - # features that support "relative" urls. + # features that support "relative" URLs. if reqctx is not None: url_adapter = reqctx.url_adapter blueprint_name = request.blueprint @@ -280,7 +292,7 @@ def external_url_handler(error, endpoint, **values): external = values.pop('_external', False) # Otherwise go with the url adapter from the appctx and make - # the urls external by default. + # the URLs external by default. else: url_adapter = appctx.url_adapter if url_adapter is None: @@ -295,14 +307,23 @@ def external_url_handler(error, endpoint, **values): scheme = values.pop('_scheme', None) appctx.app.inject_url_defaults(endpoint, values) + # This is not the best way to deal with this but currently the + # underlying Werkzeug router does not support overriding the scheme on + # a per build call basis. + old_scheme = None if scheme is not None: if not external: raise ValueError('When specifying _scheme, _external must be True') + old_scheme = url_adapter.url_scheme url_adapter.url_scheme = scheme try: - rv = url_adapter.build(endpoint, values, method=method, - force_external=external) + try: + rv = url_adapter.build(endpoint, values, method=method, + force_external=external) + finally: + if old_scheme is not None: + url_adapter.url_scheme = old_scheme except BuildError as error: # We need to inject the values again so that the app callback can # deal with that sort of stuff. @@ -319,7 +340,7 @@ def external_url_handler(error, endpoint, **values): def get_template_attribute(template_name, attribute): """Loads a macro (or variable) a template exports. This can be used to invoke a macro from within Python code. If you for example have a - template named `_cider.html` with the following contents: + template named :file:`_cider.html` with the following contents: .. sourcecode:: html+jinja @@ -359,7 +380,7 @@ def flash(message, category='message'): # session.setdefault('_flashes', []).append((category, message)) # # This assumed that changes made to mutable structures in the session are - # are always in sync with the sess on object, which is not true for session + # are always in sync with the session object, which is not true for session # implementations that use external storage for keeping their keys/values. flashes = session.get('_flashes', []) flashes.append((category, message)) @@ -372,7 +393,7 @@ def get_flashed_messages(with_categories=False, category_filter=[]): """Pulls all flashed messages from the session and returns them. Further calls in the same request to the function will return the same messages. By default just the messages are returned, - but when `with_categories` is set to `True`, the return value will + but when `with_categories` is set to ``True``, the return value will be a list of tuples in the form ``(category, message)`` instead. Filter the flashed messages to one or more categories by providing those @@ -381,7 +402,7 @@ def get_flashed_messages(with_categories=False, category_filter=[]): arguments are distinct: * `with_categories` controls whether categories are returned with message - text (`True` gives a tuple, where `False` gives just the message text). + text (``True`` gives a tuple, where ``False`` gives just the message text). * `category_filter` filters the messages down to only those matching the provided categories. @@ -393,7 +414,7 @@ def get_flashed_messages(with_categories=False, category_filter=[]): .. versionchanged:: 0.9 `category_filter` parameter added. - :param with_categories: set to `True` to also receive categories. + :param with_categories: set to ``True`` to also receive categories. :param category_filter: whitelist of categories to limit return values """ flashes = _request_ctx_stack.top.flashes @@ -409,13 +430,13 @@ def get_flashed_messages(with_categories=False, category_filter=[]): def send_file(filename_or_fp, mimetype=None, as_attachment=False, attachment_filename=None, add_etags=True, - cache_timeout=None, conditional=False): + cache_timeout=None, conditional=False, last_modified=None): """Sends the contents of a file to the client. This will use the most efficient method available and configured. By default it will try to use the WSGI server's file_wrapper support. Alternatively you can set the application's :attr:`~Flask.use_x_sendfile` attribute - to ``True`` to directly emit an `X-Sendfile` header. This however - requires support of the underlying webserver for `X-Sendfile`. + to ``True`` to directly emit an ``X-Sendfile`` header. This however + requires support of the underlying webserver for ``X-Sendfile``. By default it will try to guess the mimetype for you, but you can also explicitly provide one. For extra security you probably want @@ -423,12 +444,15 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False, guessing requires a `filename` or an `attachment_filename` to be provided. - Please never pass filenames to this function from user sources without - checking them first. Something like this is usually sufficient to - avoid security problems:: + ETags will also be attached automatically if a `filename` is provided. You + can turn this off by setting `add_etags=False`. - if '..' in filename or filename.startswith('/'): - abort(404) + If `conditional=True` and `filename` is provided, this method will try to + upgrade the response stream to support range requests. This will allow + the request to be answered with partial content response. + + Please never pass filenames to this function from user sources; + you should use :func:`send_from_directory` instead. .. versionadded:: 0.2 @@ -445,67 +469,71 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False, .. versionchanged:: 0.9 cache_timeout pulls its default from application config, when None. - :param filename_or_fp: the filename of the file to send. This is - relative to the :attr:`~Flask.root_path` if a - relative path is specified. - Alternatively a file object might be provided - in which case `X-Sendfile` might not work and - fall back to the traditional method. Make sure - that the file pointer is positioned at the start - of data to send before calling :func:`send_file`. - :param mimetype: the mimetype of the file if provided, otherwise - auto detection happens. - :param as_attachment: set to `True` if you want to send this file with + .. versionchanged:: 0.12 + The filename is no longer automatically inferred from file objects. If + you want to use automatic mimetype and etag support, pass a filepath via + `filename_or_fp` or `attachment_filename`. + + .. versionchanged:: 0.12 + The `attachment_filename` is preferred over `filename` for MIME-type + detection. + + :param filename_or_fp: the filename of the file to send in `latin-1`. + This is relative to the :attr:`~Flask.root_path` + if a relative path is specified. + Alternatively a file object might be provided in + which case ``X-Sendfile`` might not work and fall + back to the traditional method. Make sure that the + file pointer is positioned at the start of data to + send before calling :func:`send_file`. + :param mimetype: the mimetype of the file if provided. If a file path is + given, auto detection happens as fallback, otherwise an + error will be raised. + :param as_attachment: set to ``True`` if you want to send this file with a ``Content-Disposition: attachment`` header. :param attachment_filename: the filename for the attachment if it differs from the file's filename. - :param add_etags: set to `False` to disable attaching of etags. - :param conditional: set to `True` to enable conditional responses. + :param add_etags: set to ``False`` to disable attaching of etags. + :param conditional: set to ``True`` to enable conditional responses. - :param cache_timeout: the timeout in seconds for the headers. When `None` + :param cache_timeout: the timeout in seconds for the headers. When ``None`` (default), this value is set by :meth:`~Flask.get_send_file_max_age` of :data:`~flask.current_app`. + :param last_modified: set the ``Last-Modified`` header to this value, + a :class:`~datetime.datetime` or timestamp. + If a file was passed, this overrides its mtime. """ mtime = None + fsize = None if isinstance(filename_or_fp, string_types): filename = filename_or_fp + if not os.path.isabs(filename): + filename = os.path.join(current_app.root_path, filename) file = None + if attachment_filename is None: + attachment_filename = os.path.basename(filename) else: - from warnings import warn file = filename_or_fp - filename = getattr(file, 'name', None) - - # XXX: this behavior is now deprecated because it was unreliable. - # removed in Flask 1.0 - if not attachment_filename and not mimetype \ - and isinstance(filename, string_types): - warn(DeprecationWarning('The filename support for file objects ' - 'passed to send_file is now deprecated. Pass an ' - 'attach_filename if you want mimetypes to be guessed.'), - stacklevel=2) - if add_etags: - warn(DeprecationWarning('In future flask releases etags will no ' - 'longer be generated for file objects passed to the send_file ' - 'function because this behavior was unreliable. Pass ' - 'filenames instead if possible, otherwise attach an etag ' - 'yourself based on another value'), stacklevel=2) - - if filename is not None: - if not os.path.isabs(filename): - filename = os.path.join(current_app.root_path, filename) - if mimetype is None and (filename or attachment_filename): - mimetype = mimetypes.guess_type(filename or attachment_filename)[0] + filename = None + if mimetype is None: - mimetype = 'application/octet-stream' + if attachment_filename is not None: + mimetype = mimetypes.guess_type(attachment_filename)[0] \ + or 'application/octet-stream' + + if mimetype is None: + raise ValueError( + 'Unable to infer MIME-type because no filename is available. ' + 'Please set either `attachment_filename`, pass a filepath to ' + '`filename_or_fp` or set your own MIME-type via `mimetype`.' + ) headers = Headers() if as_attachment: if attachment_filename is None: - if filename is None: - raise TypeError('filename unavailable, required for ' - 'sending as attachment') - attachment_filename = os.path.basename(filename) + raise TypeError('filename unavailable, required for ' + 'sending as attachment') headers.add('Content-Disposition', 'attachment', filename=attachment_filename) @@ -513,22 +541,24 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False, if file is not None: file.close() headers['X-Sendfile'] = filename - headers['Content-Length'] = os.path.getsize(filename) + fsize = os.path.getsize(filename) + headers['Content-Length'] = fsize data = None else: if file is None: file = open(filename, 'rb') mtime = os.path.getmtime(filename) - headers['Content-Length'] = os.path.getsize(filename) + fsize = os.path.getsize(filename) + headers['Content-Length'] = fsize data = wrap_file(request.environ, file) rv = current_app.response_class(data, mimetype=mimetype, headers=headers, direct_passthrough=True) - # if we know the file modification date, we can store it as the - # the time of the last modification. - if mtime is not None: - rv.last_modified = int(mtime) + if last_modified is not None: + rv.last_modified = last_modified + elif mtime is not None: + rv.last_modified = mtime rv.cache_control.public = True if cache_timeout is None: @@ -538,25 +568,43 @@ def send_file(filename_or_fp, mimetype=None, as_attachment=False, rv.expires = int(time() + cache_timeout) if add_etags and filename is not None: - rv.set_etag('flask-%s-%s-%s' % ( - os.path.getmtime(filename), - os.path.getsize(filename), - adler32( - filename.encode('utf-8') if isinstance(filename, text_type) - else filename - ) & 0xffffffff - )) - if conditional: + from warnings import warn + + try: + rv.set_etag('%s-%s-%s' % ( + os.path.getmtime(filename), + os.path.getsize(filename), + adler32( + filename.encode('utf-8') if isinstance(filename, text_type) + else filename + ) & 0xffffffff + )) + except OSError: + warn('Access %s failed, maybe it does not exist, so ignore etags in ' + 'headers' % filename, stacklevel=2) + + if conditional: + if callable(getattr(Range, 'to_content_range_header', None)): + # Werkzeug supports Range Requests + # Remove this test when support for Werkzeug <0.12 is dropped + try: + rv = rv.make_conditional(request, accept_ranges=True, + complete_length=fsize) + except RequestedRangeNotSatisfiable: + file.close() + raise + else: rv = rv.make_conditional(request) - # make sure we don't send x-sendfile for servers that - # ignore the 304 status code for x-sendfile. - if rv.status_code == 304: - rv.headers.pop('x-sendfile', None) + # make sure we don't send x-sendfile for servers that + # ignore the 304 status code for x-sendfile. + if rv.status_code == 304: + rv.headers.pop('x-sendfile', None) return rv -def safe_join(directory, filename): - """Safely join `directory` and `filename`. +def safe_join(directory, *pathnames): + """Safely join `directory` and zero or more untrusted `pathnames` + components. Example usage:: @@ -564,22 +612,25 @@ def safe_join(directory, filename): def wiki_page(filename): filename = safe_join(app.config['WIKI_FOLDER'], filename) with open(filename, 'rb') as fd: - content = fd.read() # Read and process the file content... + content = fd.read() # Read and process the file content... - :param directory: the base directory. - :param filename: the untrusted filename relative to that directory. - :raises: :class:`~werkzeug.exceptions.NotFound` if the resulting path - would fall out of `directory`. + :param directory: the trusted base directory. + :param pathnames: the untrusted pathnames relative to that directory. + :raises: :class:`~werkzeug.exceptions.NotFound` if one or more passed + paths fall out of its boundaries. """ - filename = posixpath.normpath(filename) - for sep in _os_alt_seps: - if sep in filename: + for filename in pathnames: + if filename != '': + filename = posixpath.normpath(filename) + for sep in _os_alt_seps: + if sep in filename: + raise NotFound() + if os.path.isabs(filename) or \ + filename == '..' or \ + filename.startswith('../'): raise NotFound() - if os.path.isabs(filename) or \ - filename == '..' or \ - filename.startswith('../'): - raise NotFound() - return os.path.join(directory, filename) + directory = os.path.join(directory, filename) + return directory def send_from_directory(directory, filename, **options): @@ -596,7 +647,7 @@ def download_file(filename): .. admonition:: Sending files and Performance - It is strongly recommended to activate either `X-Sendfile` support in + It is strongly recommended to activate either ``X-Sendfile`` support in your webserver or (if no authentication happens) to tell the webserver to serve files for the given path on its own without calling into the web application for improved performance. @@ -610,8 +661,13 @@ def download_file(filename): forwarded to :func:`send_file`. """ filename = safe_join(directory, filename) - if not os.path.isfile(filename): - raise NotFound() + if not os.path.isabs(filename): + filename = os.path.join(current_app.root_path, filename) + try: + if not os.path.isfile(filename): + raise NotFound() + except (TypeError, ValueError): + raise BadRequest() options.setdefault('conditional', True) return send_file(filename, **options) @@ -643,12 +699,48 @@ def get_root_path(import_name): else: # Fall back to imports. __import__(import_name) - filepath = sys.modules[import_name].__file__ + mod = sys.modules[import_name] + filepath = getattr(mod, '__file__', None) + + # If we don't have a filepath it might be because we are a + # namespace package. In this case we pick the root path from the + # first module that is contained in our package. + if filepath is None: + raise RuntimeError('No root path can be found for the provided ' + 'module "%s". This can happen because the ' + 'module came from an import hook that does ' + 'not provide file name information or because ' + 'it\'s a namespace package. In this case ' + 'the root path needs to be explicitly ' + 'provided.' % import_name) # filepath is import_name.py for a module, or __init__.py for a package. return os.path.dirname(os.path.abspath(filepath)) +def _matching_loader_thinks_module_is_package(loader, mod_name): + """Given the loader that loaded a module and the module this function + attempts to figure out if the given module is actually a package. + """ + # If the loader can tell us if something is a package, we can + # directly ask the loader. + if hasattr(loader, 'is_package'): + return loader.is_package(mod_name) + # importlib's namespace loaders do not have this functionality but + # all the modules it loads are packages, so we can take advantage of + # this information. + elif (loader.__class__.__module__ == '_frozen_importlib' and + loader.__class__.__name__ == 'NamespaceLoader'): + return True + # Otherwise we need to fail with an error that explains what went + # wrong. + raise AttributeError( + ('%s.is_package() method is missing but is required by Flask of ' + 'PEP 302 import hooks. If you do not use import hooks and ' + 'you encounter this error please file a bug against Flask.') % + loader.__class__.__name__) + + def find_package(import_name): """Finds a package and returns the prefix (or None if the package is not installed) as well as the folder that contains the package or @@ -678,8 +770,12 @@ def find_package(import_name): __import__(import_name) filename = sys.modules[import_name].__file__ package_path = os.path.abspath(os.path.dirname(filename)) - # package_path ends with __init__.py for a package - if loader.is_package(root_mod_name): + + # In case the root module is a package we need to chop of the + # rightmost part. This needs to go through a helper function + # because of python 3.3 namespace packages. + if _matching_loader_thinks_module_is_package( + loader, root_mod_name): package_path = os.path.dirname(package_path) site_parent, site_folder = os.path.split(package_path) @@ -728,17 +824,20 @@ def __get__(self, obj, type=None): class _PackageBoundObject(object): - def __init__(self, import_name, template_folder=None): + def __init__(self, import_name, template_folder=None, root_path=None): #: The name of the package or module. Do not change this once #: it was set by the constructor. self.import_name = import_name - #: location of the templates. `None` if templates should not be + #: location of the templates. ``None`` if templates should not be #: exposed. self.template_folder = template_folder + if root_path is None: + root_path = get_root_path(self.import_name) + #: Where is the app root located? - self.root_path = get_root_path(self.import_name) + self.root_path = root_path self._static_folder = None self._static_url_path = None @@ -748,15 +847,16 @@ def _get_static_folder(self): return os.path.join(self.root_path, self._static_folder) def _set_static_folder(self, value): self._static_folder = value - static_folder = property(_get_static_folder, _set_static_folder) + static_folder = property(_get_static_folder, _set_static_folder, doc=''' + The absolute path to the configured static folder. + ''') del _get_static_folder, _set_static_folder def _get_static_url_path(self): - if self._static_url_path is None: - if self.static_folder is None: - return None + if self._static_url_path is not None: + return self._static_url_path + if self.static_folder is not None: return '/' + os.path.basename(self.static_folder) - return self._static_url_path def _set_static_url_path(self, value): self._static_url_path = value static_url_path = property(_get_static_url_path, _set_static_url_path) @@ -764,8 +864,8 @@ def _set_static_url_path(self, value): @property def has_static_folder(self): - """This is `True` if the package bound object's container has a - folder named ``'static'``. + """This is ``True`` if the package bound object's container has a + folder for static files. .. versionadded:: 0.5 """ @@ -789,7 +889,7 @@ def get_send_file_max_age(self, filename): Static file functions such as :func:`send_from_directory` use this function, and :func:`send_file` calls this function on - :data:`~flask.current_app` when the given cache_timeout is `None`. If a + :data:`~flask.current_app` when the given cache_timeout is ``None``. If a cache_timeout is given in :func:`send_file`, that timeout is used; otherwise, this method is called. @@ -805,7 +905,7 @@ def get_send_file_max_age(self, name): .. versionadded:: 0.9 """ - return current_app.config['SEND_FILE_MAX_AGE_DEFAULT'] + return total_seconds(current_app.send_file_max_age_default) def send_static_file(self, filename): """Function used internally to send static files from the static @@ -833,7 +933,7 @@ def open_resource(self, resource, mode='rb'): /layout.html /index.html - If you want to open the `schema.sql` file you would do the + If you want to open the :file:`schema.sql` file you would do the following:: with app.open_resource('schema.sql') as f: @@ -847,3 +947,14 @@ def open_resource(self, resource, mode='rb'): if mode not in ('r', 'rb'): raise ValueError('Resources can only be opened for reading') return open(os.path.join(self.root_path, resource), mode) + + +def total_seconds(td): + """Returns the total seconds from a timedelta object. + + :param timedelta td: the timedelta to be converted in seconds + + :returns: number of seconds + :rtype: int + """ + return td.days * 60 * 60 * 24 + td.seconds diff --git a/src/lib/flask/json.py b/app/lib/flask/json.py similarity index 68% rename from src/lib/flask/json.py rename to app/lib/flask/json.py index d1cda5a..16e0c29 100644 --- a/src/lib/flask/json.py +++ b/app/lib/flask/json.py @@ -5,12 +5,12 @@ Implementation helpers for the JSON support in Flask. - :copyright: (c) 2012 by Armin Ronacher. + :copyright: (c) 2015 by Armin Ronacher. :license: BSD, see LICENSE for more details. """ import io import uuid -from datetime import datetime +from datetime import date from .globals import current_app, request from ._compat import text_type, PY2 @@ -19,13 +19,10 @@ # Use the same json implementation as itsdangerous on which we # depend anyways. -try: - from itsdangerous import simplejson as _json -except ImportError: - from itsdangerous import json as _json +from itsdangerous import json as _json -# figure out if simplejson escapes slashes. This behavior was changed +# Figure out if simplejson escapes slashes. This behavior was changed # from one version to another without reason. _slash_escape = '\\/' not in _json.dumps('/') @@ -60,7 +57,7 @@ class JSONEncoder(_json.JSONEncoder): def default(self, o): """Implement this method in a subclass such that it returns a serializable object for ``o``, or calls the base implementation (to - raise a ``TypeError``). + raise a :exc:`TypeError`). For example, to support arbitrary iterators, you could implement default like this:: @@ -74,8 +71,8 @@ def default(self, o): return list(iterable) return JSONEncoder.default(self, o) """ - if isinstance(o, datetime): - return http_date(o) + if isinstance(o, date): + return http_date(o.timetuple()) if isinstance(o, uuid.UUID): return str(o) if hasattr(o, '__html__'): @@ -85,7 +82,7 @@ def default(self, o): class JSONDecoder(_json.JSONDecoder): """The default JSON decoder. This one does not change the behavior from - the default simplejson encoder. Consult the :mod:`json` documentation + the default simplejson decoder. Consult the :mod:`json` documentation for more information. This decoder is not only used for the load functions of this module but also :attr:`~flask.Request`. """ @@ -119,7 +116,7 @@ def dumps(obj, **kwargs): This function can return ``unicode`` strings or ascii-only bytestrings by default which coerce into unicode strings automatically. That behavior by default is controlled by the ``JSON_AS_ASCII`` configuration variable - and can be overriden by the simplejson ``ensure_ascii`` parameter. + and can be overridden by the simplejson ``ensure_ascii`` parameter. """ _dump_arg_defaults(kwargs) encoding = kwargs.pop('encoding', None) @@ -165,14 +162,29 @@ def htmlsafe_dumps(obj, **kwargs): also mark the result as safe. Due to how this function escapes certain characters this is safe even if used outside of ``' + self.assertEqual( + r'"\u003c/script\u003e\u003cscript\u003e' + r'alert(\"gotcha\")\u003c/script\u003e"', + self.encoder.encode(bad_string)) + self.assertEqual( + bad_string, self.decoder.decode( + self.encoder.encode(bad_string))) diff --git a/app/lib/simplejson/tests/test_errors.py b/app/lib/simplejson/tests/test_errors.py new file mode 100644 index 0000000..8dede38 --- /dev/null +++ b/app/lib/simplejson/tests/test_errors.py @@ -0,0 +1,51 @@ +import sys, pickle +from unittest import TestCase + +import simplejson as json +from simplejson.compat import u, b + +class TestErrors(TestCase): + def test_string_keys_error(self): + data = [{'a': 'A', 'b': (2, 4), 'c': 3.0, ('d',): 'D tuple'}] + self.assertRaises(TypeError, json.dumps, data) + + def test_decode_error(self): + err = None + try: + json.loads('{}\na\nb') + except json.JSONDecodeError: + err = sys.exc_info()[1] + else: + self.fail('Expected JSONDecodeError') + self.assertEqual(err.lineno, 2) + self.assertEqual(err.colno, 1) + self.assertEqual(err.endlineno, 3) + self.assertEqual(err.endcolno, 2) + + def test_scan_error(self): + err = None + for t in (u, b): + try: + json.loads(t('{"asdf": "')) + except json.JSONDecodeError: + err = sys.exc_info()[1] + else: + self.fail('Expected JSONDecodeError') + self.assertEqual(err.lineno, 1) + self.assertEqual(err.colno, 10) + + def test_error_is_pickable(self): + err = None + try: + json.loads('{}\na\nb') + except json.JSONDecodeError: + err = sys.exc_info()[1] + else: + self.fail('Expected JSONDecodeError') + s = pickle.dumps(err) + e = pickle.loads(s) + + self.assertEqual(err.msg, e.msg) + self.assertEqual(err.doc, e.doc) + self.assertEqual(err.pos, e.pos) + self.assertEqual(err.end, e.end) diff --git a/app/lib/simplejson/tests/test_fail.py b/app/lib/simplejson/tests/test_fail.py new file mode 100644 index 0000000..788f3a5 --- /dev/null +++ b/app/lib/simplejson/tests/test_fail.py @@ -0,0 +1,176 @@ +import sys +from unittest import TestCase + +import simplejson as json + +# 2007-10-05 +JSONDOCS = [ + # http://json.org/JSON_checker/test/fail1.json + '"A JSON payload should be an object or array, not a string."', + # http://json.org/JSON_checker/test/fail2.json + '["Unclosed array"', + # http://json.org/JSON_checker/test/fail3.json + '{unquoted_key: "keys must be quoted"}', + # http://json.org/JSON_checker/test/fail4.json + '["extra comma",]', + # http://json.org/JSON_checker/test/fail5.json + '["double extra comma",,]', + # http://json.org/JSON_checker/test/fail6.json + '[ , "<-- missing value"]', + # http://json.org/JSON_checker/test/fail7.json + '["Comma after the close"],', + # http://json.org/JSON_checker/test/fail8.json + '["Extra close"]]', + # http://json.org/JSON_checker/test/fail9.json + '{"Extra comma": true,}', + # http://json.org/JSON_checker/test/fail10.json + '{"Extra value after close": true} "misplaced quoted value"', + # http://json.org/JSON_checker/test/fail11.json + '{"Illegal expression": 1 + 2}', + # http://json.org/JSON_checker/test/fail12.json + '{"Illegal invocation": alert()}', + # http://json.org/JSON_checker/test/fail13.json + '{"Numbers cannot have leading zeroes": 013}', + # http://json.org/JSON_checker/test/fail14.json + '{"Numbers cannot be hex": 0x14}', + # http://json.org/JSON_checker/test/fail15.json + '["Illegal backslash escape: \\x15"]', + # http://json.org/JSON_checker/test/fail16.json + '[\\naked]', + # http://json.org/JSON_checker/test/fail17.json + '["Illegal backslash escape: \\017"]', + # http://json.org/JSON_checker/test/fail18.json + '[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', + # http://json.org/JSON_checker/test/fail19.json + '{"Missing colon" null}', + # http://json.org/JSON_checker/test/fail20.json + '{"Double colon":: null}', + # http://json.org/JSON_checker/test/fail21.json + '{"Comma instead of colon", null}', + # http://json.org/JSON_checker/test/fail22.json + '["Colon instead of comma": false]', + # http://json.org/JSON_checker/test/fail23.json + '["Bad value", truth]', + # http://json.org/JSON_checker/test/fail24.json + "['single quote']", + # http://json.org/JSON_checker/test/fail25.json + '["\ttab\tcharacter\tin\tstring\t"]', + # http://json.org/JSON_checker/test/fail26.json + '["tab\\ character\\ in\\ string\\ "]', + # http://json.org/JSON_checker/test/fail27.json + '["line\nbreak"]', + # http://json.org/JSON_checker/test/fail28.json + '["line\\\nbreak"]', + # http://json.org/JSON_checker/test/fail29.json + '[0e]', + # http://json.org/JSON_checker/test/fail30.json + '[0e+]', + # http://json.org/JSON_checker/test/fail31.json + '[0e+-1]', + # http://json.org/JSON_checker/test/fail32.json + '{"Comma instead if closing brace": true,', + # http://json.org/JSON_checker/test/fail33.json + '["mismatch"}', + # http://code.google.com/p/simplejson/issues/detail?id=3 + u'["A\u001FZ control characters in string"]', + # misc based on coverage + '{', + '{]', + '{"foo": "bar"]', + '{"foo": "bar"', + 'nul', + 'nulx', + '-', + '-x', + '-e', + '-e0', + '-Infinite', + '-Inf', + 'Infinit', + 'Infinite', + 'NaM', + 'NuN', + 'falsy', + 'fal', + 'trug', + 'tru', + '1e', + '1ex', + '1e-', + '1e-x', +] + +SKIPS = { + 1: "why not have a string payload?", + 18: "spec doesn't specify any nesting limitations", +} + +class TestFail(TestCase): + def test_failures(self): + for idx, doc in enumerate(JSONDOCS): + idx = idx + 1 + if idx in SKIPS: + json.loads(doc) + continue + try: + json.loads(doc) + except json.JSONDecodeError: + pass + else: + self.fail("Expected failure for fail%d.json: %r" % (idx, doc)) + + def test_array_decoder_issue46(self): + # http://code.google.com/p/simplejson/issues/detail?id=46 + for doc in [u'[,]', '[,]']: + try: + json.loads(doc) + except json.JSONDecodeError: + e = sys.exc_info()[1] + self.assertEqual(e.pos, 1) + self.assertEqual(e.lineno, 1) + self.assertEqual(e.colno, 2) + except Exception: + e = sys.exc_info()[1] + self.fail("Unexpected exception raised %r %s" % (e, e)) + else: + self.fail("Unexpected success parsing '[,]'") + + def test_truncated_input(self): + test_cases = [ + ('', 'Expecting value', 0), + ('[', "Expecting value or ']'", 1), + ('[42', "Expecting ',' delimiter", 3), + ('[42,', 'Expecting value', 4), + ('["', 'Unterminated string starting at', 1), + ('["spam', 'Unterminated string starting at', 1), + ('["spam"', "Expecting ',' delimiter", 7), + ('["spam",', 'Expecting value', 8), + ('{', 'Expecting property name enclosed in double quotes', 1), + ('{"', 'Unterminated string starting at', 1), + ('{"spam', 'Unterminated string starting at', 1), + ('{"spam"', "Expecting ':' delimiter", 7), + ('{"spam":', 'Expecting value', 8), + ('{"spam":42', "Expecting ',' delimiter", 10), + ('{"spam":42,', 'Expecting property name enclosed in double quotes', + 11), + ('"', 'Unterminated string starting at', 0), + ('"spam', 'Unterminated string starting at', 0), + ('[,', "Expecting value", 1), + ] + for data, msg, idx in test_cases: + try: + json.loads(data) + except json.JSONDecodeError: + e = sys.exc_info()[1] + self.assertEqual( + e.msg[:len(msg)], + msg, + "%r doesn't start with %r for %r" % (e.msg, msg, data)) + self.assertEqual( + e.pos, idx, + "pos %r != %r for %r" % (e.pos, idx, data)) + except Exception: + e = sys.exc_info()[1] + self.fail("Unexpected exception raised %r %s" % (e, e)) + else: + self.fail("Unexpected success parsing '%r'" % (data,)) diff --git a/app/lib/simplejson/tests/test_float.py b/app/lib/simplejson/tests/test_float.py new file mode 100644 index 0000000..e382ec2 --- /dev/null +++ b/app/lib/simplejson/tests/test_float.py @@ -0,0 +1,35 @@ +import math +from unittest import TestCase +from simplejson.compat import long_type, text_type +import simplejson as json +from simplejson.decoder import NaN, PosInf, NegInf + +class TestFloat(TestCase): + def test_degenerates_allow(self): + for inf in (PosInf, NegInf): + self.assertEqual(json.loads(json.dumps(inf)), inf) + # Python 2.5 doesn't have math.isnan + nan = json.loads(json.dumps(NaN)) + self.assertTrue((0 + nan) != nan) + + def test_degenerates_ignore(self): + for f in (PosInf, NegInf, NaN): + self.assertEqual(json.loads(json.dumps(f, ignore_nan=True)), None) + + def test_degenerates_deny(self): + for f in (PosInf, NegInf, NaN): + self.assertRaises(ValueError, json.dumps, f, allow_nan=False) + + def test_floats(self): + for num in [1617161771.7650001, math.pi, math.pi**100, + math.pi**-100, 3.1]: + self.assertEqual(float(json.dumps(num)), num) + self.assertEqual(json.loads(json.dumps(num)), num) + self.assertEqual(json.loads(text_type(json.dumps(num))), num) + + def test_ints(self): + for num in [1, long_type(1), 1<<32, 1<<64]: + self.assertEqual(json.dumps(num), str(num)) + self.assertEqual(int(json.dumps(num)), num) + self.assertEqual(json.loads(json.dumps(num)), num) + self.assertEqual(json.loads(text_type(json.dumps(num))), num) diff --git a/app/lib/simplejson/tests/test_for_json.py b/app/lib/simplejson/tests/test_for_json.py new file mode 100644 index 0000000..b791b88 --- /dev/null +++ b/app/lib/simplejson/tests/test_for_json.py @@ -0,0 +1,97 @@ +import unittest +import simplejson as json + + +class ForJson(object): + def for_json(self): + return {'for_json': 1} + + +class NestedForJson(object): + def for_json(self): + return {'nested': ForJson()} + + +class ForJsonList(object): + def for_json(self): + return ['list'] + + +class DictForJson(dict): + def for_json(self): + return {'alpha': 1} + + +class ListForJson(list): + def for_json(self): + return ['list'] + + +class TestForJson(unittest.TestCase): + def assertRoundTrip(self, obj, other, for_json=True): + if for_json is None: + # None will use the default + s = json.dumps(obj) + else: + s = json.dumps(obj, for_json=for_json) + self.assertEqual( + json.loads(s), + other) + + def test_for_json_encodes_stand_alone_object(self): + self.assertRoundTrip( + ForJson(), + ForJson().for_json()) + + def test_for_json_encodes_object_nested_in_dict(self): + self.assertRoundTrip( + {'hooray': ForJson()}, + {'hooray': ForJson().for_json()}) + + def test_for_json_encodes_object_nested_in_list_within_dict(self): + self.assertRoundTrip( + {'list': [0, ForJson(), 2, 3]}, + {'list': [0, ForJson().for_json(), 2, 3]}) + + def test_for_json_encodes_object_nested_within_object(self): + self.assertRoundTrip( + NestedForJson(), + {'nested': {'for_json': 1}}) + + def test_for_json_encodes_list(self): + self.assertRoundTrip( + ForJsonList(), + ForJsonList().for_json()) + + def test_for_json_encodes_list_within_object(self): + self.assertRoundTrip( + {'nested': ForJsonList()}, + {'nested': ForJsonList().for_json()}) + + def test_for_json_encodes_dict_subclass(self): + self.assertRoundTrip( + DictForJson(a=1), + DictForJson(a=1).for_json()) + + def test_for_json_encodes_list_subclass(self): + self.assertRoundTrip( + ListForJson(['l']), + ListForJson(['l']).for_json()) + + def test_for_json_ignored_if_not_true_with_dict_subclass(self): + for for_json in (None, False): + self.assertRoundTrip( + DictForJson(a=1), + {'a': 1}, + for_json=for_json) + + def test_for_json_ignored_if_not_true_with_list_subclass(self): + for for_json in (None, False): + self.assertRoundTrip( + ListForJson(['l']), + ['l'], + for_json=for_json) + + def test_raises_typeerror_if_for_json_not_true_with_object(self): + self.assertRaises(TypeError, json.dumps, ForJson()) + self.assertRaises(TypeError, json.dumps, ForJson(), for_json=False) diff --git a/app/lib/simplejson/tests/test_indent.py b/app/lib/simplejson/tests/test_indent.py new file mode 100644 index 0000000..cea25a5 --- /dev/null +++ b/app/lib/simplejson/tests/test_indent.py @@ -0,0 +1,86 @@ +from unittest import TestCase +import textwrap + +import simplejson as json +from simplejson.compat import StringIO + +class TestIndent(TestCase): + def test_indent(self): + h = [['blorpie'], ['whoops'], [], 'd-shtaeou', 'd-nthiouh', + 'i-vhbjkhnth', + {'nifty': 87}, {'field': 'yes', 'morefield': False} ] + + expect = textwrap.dedent("""\ + [ + \t[ + \t\t"blorpie" + \t], + \t[ + \t\t"whoops" + \t], + \t[], + \t"d-shtaeou", + \t"d-nthiouh", + \t"i-vhbjkhnth", + \t{ + \t\t"nifty": 87 + \t}, + \t{ + \t\t"field": "yes", + \t\t"morefield": false + \t} + ]""") + + + d1 = json.dumps(h) + d2 = json.dumps(h, indent='\t', sort_keys=True, separators=(',', ': ')) + d3 = json.dumps(h, indent=' ', sort_keys=True, separators=(',', ': ')) + d4 = json.dumps(h, indent=2, sort_keys=True, separators=(',', ': ')) + + h1 = json.loads(d1) + h2 = json.loads(d2) + h3 = json.loads(d3) + h4 = json.loads(d4) + + self.assertEqual(h1, h) + self.assertEqual(h2, h) + self.assertEqual(h3, h) + self.assertEqual(h4, h) + self.assertEqual(d3, expect.replace('\t', ' ')) + self.assertEqual(d4, expect.replace('\t', ' ')) + # NOTE: Python 2.4 textwrap.dedent converts tabs to spaces, + # so the following is expected to fail. Python 2.4 is not a + # supported platform in simplejson 2.1.0+. + self.assertEqual(d2, expect) + + def test_indent0(self): + h = {3: 1} + def check(indent, expected): + d1 = json.dumps(h, indent=indent) + self.assertEqual(d1, expected) + + sio = StringIO() + json.dump(h, sio, indent=indent) + self.assertEqual(sio.getvalue(), expected) + + # indent=0 should emit newlines + check(0, '{\n"3": 1\n}') + # indent=None is more compact + check(None, '{"3": 1}') + + def test_separators(self): + lst = [1,2,3,4] + expect = '[\n1,\n2,\n3,\n4\n]' + expect_spaces = '[\n1, \n2, \n3, \n4\n]' + # Ensure that separators still works + self.assertEqual( + expect_spaces, + json.dumps(lst, indent=0, separators=(', ', ': '))) + # Force the new defaults + self.assertEqual( + expect, + json.dumps(lst, indent=0, separators=(',', ': '))) + # Added in 2.1.4 + self.assertEqual( + expect, + json.dumps(lst, indent=0)) diff --git a/app/lib/simplejson/tests/test_item_sort_key.py b/app/lib/simplejson/tests/test_item_sort_key.py new file mode 100644 index 0000000..b05bfc8 --- /dev/null +++ b/app/lib/simplejson/tests/test_item_sort_key.py @@ -0,0 +1,20 @@ +from unittest import TestCase + +import simplejson as json +from operator import itemgetter + +class TestItemSortKey(TestCase): + def test_simple_first(self): + a = {'a': 1, 'c': 5, 'jack': 'jill', 'pick': 'axe', 'array': [1, 5, 6, 9], 'tuple': (83, 12, 3), 'crate': 'dog', 'zeak': 'oh'} + self.assertEqual( + '{"a": 1, "c": 5, "crate": "dog", "jack": "jill", "pick": "axe", "zeak": "oh", "array": [1, 5, 6, 9], "tuple": [83, 12, 3]}', + json.dumps(a, item_sort_key=json.simple_first)) + + def test_case(self): + a = {'a': 1, 'c': 5, 'Jack': 'jill', 'pick': 'axe', 'Array': [1, 5, 6, 9], 'tuple': (83, 12, 3), 'crate': 'dog', 'zeak': 'oh'} + self.assertEqual( + '{"Array": [1, 5, 6, 9], "Jack": "jill", "a": 1, "c": 5, "crate": "dog", "pick": "axe", "tuple": [83, 12, 3], "zeak": "oh"}', + json.dumps(a, item_sort_key=itemgetter(0))) + self.assertEqual( + '{"a": 1, "Array": [1, 5, 6, 9], "c": 5, "crate": "dog", "Jack": "jill", "pick": "axe", "tuple": [83, 12, 3], "zeak": "oh"}', + json.dumps(a, item_sort_key=lambda kv: kv[0].lower())) diff --git a/app/lib/simplejson/tests/test_iterable.py b/app/lib/simplejson/tests/test_iterable.py new file mode 100644 index 0000000..35d3e75 --- /dev/null +++ b/app/lib/simplejson/tests/test_iterable.py @@ -0,0 +1,31 @@ +import unittest +from simplejson.compat import StringIO + +import simplejson as json + +def iter_dumps(obj, **kw): + return ''.join(json.JSONEncoder(**kw).iterencode(obj)) + +def sio_dump(obj, **kw): + sio = StringIO() + json.dumps(obj, **kw) + return sio.getvalue() + +class TestIterable(unittest.TestCase): + def test_iterable(self): + for l in ([], [1], [1, 2], [1, 2, 3]): + for opts in [{}, {'indent': 2}]: + for dumps in (json.dumps, iter_dumps, sio_dump): + expect = dumps(l, **opts) + default_expect = dumps(sum(l), **opts) + # Default is False + self.assertRaises(TypeError, dumps, iter(l), **opts) + self.assertRaises(TypeError, dumps, iter(l), iterable_as_array=False, **opts) + self.assertEqual(expect, dumps(iter(l), iterable_as_array=True, **opts)) + # Ensure that the "default" gets called + self.assertEqual(default_expect, dumps(iter(l), default=sum, **opts)) + self.assertEqual(default_expect, dumps(iter(l), iterable_as_array=False, default=sum, **opts)) + # Ensure that the "default" does not get called + self.assertEqual( + expect, + dumps(iter(l), iterable_as_array=True, default=sum, **opts)) diff --git a/app/lib/simplejson/tests/test_namedtuple.py b/app/lib/simplejson/tests/test_namedtuple.py new file mode 100644 index 0000000..4387894 --- /dev/null +++ b/app/lib/simplejson/tests/test_namedtuple.py @@ -0,0 +1,122 @@ +from __future__ import absolute_import +import unittest +import simplejson as json +from simplejson.compat import StringIO + +try: + from collections import namedtuple +except ImportError: + class Value(tuple): + def __new__(cls, *args): + return tuple.__new__(cls, args) + + def _asdict(self): + return {'value': self[0]} + class Point(tuple): + def __new__(cls, *args): + return tuple.__new__(cls, args) + + def _asdict(self): + return {'x': self[0], 'y': self[1]} +else: + Value = namedtuple('Value', ['value']) + Point = namedtuple('Point', ['x', 'y']) + +class DuckValue(object): + def __init__(self, *args): + self.value = Value(*args) + + def _asdict(self): + return self.value._asdict() + +class DuckPoint(object): + def __init__(self, *args): + self.point = Point(*args) + + def _asdict(self): + return self.point._asdict() + +class DeadDuck(object): + _asdict = None + +class DeadDict(dict): + _asdict = None + +CONSTRUCTORS = [ + lambda v: v, + lambda v: [v], + lambda v: [{'key': v}], +] + +class TestNamedTuple(unittest.TestCase): + def test_namedtuple_dumps(self): + for v in [Value(1), Point(1, 2), DuckValue(1), DuckPoint(1, 2)]: + d = v._asdict() + self.assertEqual(d, json.loads(json.dumps(v))) + self.assertEqual( + d, + json.loads(json.dumps(v, namedtuple_as_object=True))) + self.assertEqual(d, json.loads(json.dumps(v, tuple_as_array=False))) + self.assertEqual( + d, + json.loads(json.dumps(v, namedtuple_as_object=True, + tuple_as_array=False))) + + def test_namedtuple_dumps_false(self): + for v in [Value(1), Point(1, 2)]: + l = list(v) + self.assertEqual( + l, + json.loads(json.dumps(v, namedtuple_as_object=False))) + self.assertRaises(TypeError, json.dumps, v, + tuple_as_array=False, namedtuple_as_object=False) + + def test_namedtuple_dump(self): + for v in [Value(1), Point(1, 2), DuckValue(1), DuckPoint(1, 2)]: + d = v._asdict() + sio = StringIO() + json.dump(v, sio) + self.assertEqual(d, json.loads(sio.getvalue())) + sio = StringIO() + json.dump(v, sio, namedtuple_as_object=True) + self.assertEqual( + d, + json.loads(sio.getvalue())) + sio = StringIO() + json.dump(v, sio, tuple_as_array=False) + self.assertEqual(d, json.loads(sio.getvalue())) + sio = StringIO() + json.dump(v, sio, namedtuple_as_object=True, + tuple_as_array=False) + self.assertEqual( + d, + json.loads(sio.getvalue())) + + def test_namedtuple_dump_false(self): + for v in [Value(1), Point(1, 2)]: + l = list(v) + sio = StringIO() + json.dump(v, sio, namedtuple_as_object=False) + self.assertEqual( + l, + json.loads(sio.getvalue())) + self.assertRaises(TypeError, json.dump, v, StringIO(), + tuple_as_array=False, namedtuple_as_object=False) + + def test_asdict_not_callable_dump(self): + for f in CONSTRUCTORS: + self.assertRaises(TypeError, + json.dump, f(DeadDuck()), StringIO(), namedtuple_as_object=True) + sio = StringIO() + json.dump(f(DeadDict()), sio, namedtuple_as_object=True) + self.assertEqual( + json.dumps(f({})), + sio.getvalue()) + + def test_asdict_not_callable_dumps(self): + for f in CONSTRUCTORS: + self.assertRaises(TypeError, + json.dumps, f(DeadDuck()), namedtuple_as_object=True) + self.assertEqual( + json.dumps(f({})), + json.dumps(f(DeadDict()), namedtuple_as_object=True)) diff --git a/app/lib/simplejson/tests/test_pass1.py b/app/lib/simplejson/tests/test_pass1.py new file mode 100644 index 0000000..f0b5b10 --- /dev/null +++ b/app/lib/simplejson/tests/test_pass1.py @@ -0,0 +1,71 @@ +from unittest import TestCase + +import simplejson as json + +# from http://json.org/JSON_checker/test/pass1.json +JSON = r''' +[ + "JSON Test Pattern pass1", + {"object with 1 member":["array with 1 element"]}, + {}, + [], + -42, + true, + false, + null, + { + "integer": 1234567890, + "real": -9876.543210, + "e": 0.123456789e-12, + "E": 1.234567890E+34, + "": 23456789012E66, + "zero": 0, + "one": 1, + "space": " ", + "quote": "\"", + "backslash": "\\", + "controls": "\b\f\n\r\t", + "slash": "/ & \/", + "alpha": "abcdefghijklmnopqrstuvwyz", + "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", + "digit": "0123456789", + "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", + "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", + "true": true, + "false": false, + "null": null, + "array":[ ], + "object":{ }, + "address": "50 St. James Street", + "url": "http://www.JSON.org/", + "comment": "// /* */": " ", + " s p a c e d " :[1,2 , 3 + +, + +4 , 5 , 6 ,7 ],"compact": [1,2,3,4,5,6,7], + "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", + "quotes": "" \u0022 %22 0x22 034 "", + "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" +: "A key can be any string" + }, + 0.5 ,98.6 +, +99.44 +, + +1066, +1e1, +0.1e1, +1e-1, +1e00,2e+00,2e-00 +,"rosebud"] +''' + +class TestPass1(TestCase): + def test_parse(self): + # test in/out equivalence and parsing + res = json.loads(JSON) + out = json.dumps(res) + self.assertEqual(res, json.loads(out)) diff --git a/app/lib/simplejson/tests/test_pass2.py b/app/lib/simplejson/tests/test_pass2.py new file mode 100644 index 0000000..5d812b3 --- /dev/null +++ b/app/lib/simplejson/tests/test_pass2.py @@ -0,0 +1,14 @@ +from unittest import TestCase +import simplejson as json + +# from http://json.org/JSON_checker/test/pass2.json +JSON = r''' +[[[[[[[[[[[[[[[[[[["Not too deep"]]]]]]]]]]]]]]]]]]] +''' + +class TestPass2(TestCase): + def test_parse(self): + # test in/out equivalence and parsing + res = json.loads(JSON) + out = json.dumps(res) + self.assertEqual(res, json.loads(out)) diff --git a/app/lib/simplejson/tests/test_pass3.py b/app/lib/simplejson/tests/test_pass3.py new file mode 100644 index 0000000..821d60b --- /dev/null +++ b/app/lib/simplejson/tests/test_pass3.py @@ -0,0 +1,20 @@ +from unittest import TestCase + +import simplejson as json + +# from http://json.org/JSON_checker/test/pass3.json +JSON = r''' +{ + "JSON Test Pattern pass3": { + "The outermost value": "must be an object or array.", + "In this test": "It is an object." + } +} +''' + +class TestPass3(TestCase): + def test_parse(self): + # test in/out equivalence and parsing + res = json.loads(JSON) + out = json.dumps(res) + self.assertEqual(res, json.loads(out)) diff --git a/app/lib/simplejson/tests/test_raw_json.py b/app/lib/simplejson/tests/test_raw_json.py new file mode 100644 index 0000000..1dfcc2c --- /dev/null +++ b/app/lib/simplejson/tests/test_raw_json.py @@ -0,0 +1,47 @@ +import unittest +import simplejson as json + +dct1 = { + 'key1': 'value1' +} + +dct2 = { + 'key2': 'value2', + 'd1': dct1 +} + +dct3 = { + 'key2': 'value2', + 'd1': json.dumps(dct1) +} + +dct4 = { + 'key2': 'value2', + 'd1': json.RawJSON(json.dumps(dct1)) +} + + +class TestRawJson(unittest.TestCase): + + def test_normal_str(self): + self.assertNotEqual(json.dumps(dct2), json.dumps(dct3)) + + def test_raw_json_str(self): + self.assertEqual(json.dumps(dct2), json.dumps(dct4)) + self.assertEqual(dct2, json.loads(json.dumps(dct4))) + + def test_list(self): + self.assertEqual( + json.dumps([dct2]), + json.dumps([json.RawJSON(json.dumps(dct2))])) + self.assertEqual( + [dct2], + json.loads(json.dumps([json.RawJSON(json.dumps(dct2))]))) + + def test_direct(self): + self.assertEqual( + json.dumps(dct2), + json.dumps(json.RawJSON(json.dumps(dct2)))) + self.assertEqual( + dct2, + json.loads(json.dumps(json.RawJSON(json.dumps(dct2))))) diff --git a/app/lib/simplejson/tests/test_recursion.py b/app/lib/simplejson/tests/test_recursion.py new file mode 100644 index 0000000..662eb66 --- /dev/null +++ b/app/lib/simplejson/tests/test_recursion.py @@ -0,0 +1,67 @@ +from unittest import TestCase + +import simplejson as json + +class JSONTestObject: + pass + + +class RecursiveJSONEncoder(json.JSONEncoder): + recurse = False + def default(self, o): + if o is JSONTestObject: + if self.recurse: + return [JSONTestObject] + else: + return 'JSONTestObject' + return json.JSONEncoder.default(o) + + +class TestRecursion(TestCase): + def test_listrecursion(self): + x = [] + x.append(x) + try: + json.dumps(x) + except ValueError: + pass + else: + self.fail("didn't raise ValueError on list recursion") + x = [] + y = [x] + x.append(y) + try: + json.dumps(x) + except ValueError: + pass + else: + self.fail("didn't raise ValueError on alternating list recursion") + y = [] + x = [y, y] + # ensure that the marker is cleared + json.dumps(x) + + def test_dictrecursion(self): + x = {} + x["test"] = x + try: + json.dumps(x) + except ValueError: + pass + else: + self.fail("didn't raise ValueError on dict recursion") + x = {} + y = {"a": x, "b": x} + # ensure that the marker is cleared + json.dumps(y) + + def test_defaultrecursion(self): + enc = RecursiveJSONEncoder() + self.assertEqual(enc.encode(JSONTestObject), '"JSONTestObject"') + enc.recurse = True + try: + enc.encode(JSONTestObject) + except ValueError: + pass + else: + self.fail("didn't raise ValueError on default recursion") diff --git a/app/lib/simplejson/tests/test_scanstring.py b/app/lib/simplejson/tests/test_scanstring.py new file mode 100644 index 0000000..3d98f0d --- /dev/null +++ b/app/lib/simplejson/tests/test_scanstring.py @@ -0,0 +1,194 @@ +import sys +from unittest import TestCase + +import simplejson as json +import simplejson.decoder +from simplejson.compat import b, PY3 + +class TestScanString(TestCase): + # The bytes type is intentionally not used in most of these tests + # under Python 3 because the decoder immediately coerces to str before + # calling scanstring. In Python 2 we are testing the code paths + # for both unicode and str. + # + # The reason this is done is because Python 3 would require + # entirely different code paths for parsing bytes and str. + # + def test_py_scanstring(self): + self._test_scanstring(simplejson.decoder.py_scanstring) + + def test_c_scanstring(self): + if not simplejson.decoder.c_scanstring: + return + self._test_scanstring(simplejson.decoder.c_scanstring) + + def _test_scanstring(self, scanstring): + if sys.maxunicode == 65535: + self.assertEqual( + scanstring(u'"z\U0001d120x"', 1, None, True), + (u'z\U0001d120x', 6)) + else: + self.assertEqual( + scanstring(u'"z\U0001d120x"', 1, None, True), + (u'z\U0001d120x', 5)) + + self.assertEqual( + scanstring('"\\u007b"', 1, None, True), + (u'{', 8)) + + self.assertEqual( + scanstring('"A JSON payload should be an object or array, not a string."', 1, None, True), + (u'A JSON payload should be an object or array, not a string.', 60)) + + self.assertEqual( + scanstring('["Unclosed array"', 2, None, True), + (u'Unclosed array', 17)) + + self.assertEqual( + scanstring('["extra comma",]', 2, None, True), + (u'extra comma', 14)) + + self.assertEqual( + scanstring('["double extra comma",,]', 2, None, True), + (u'double extra comma', 21)) + + self.assertEqual( + scanstring('["Comma after the close"],', 2, None, True), + (u'Comma after the close', 24)) + + self.assertEqual( + scanstring('["Extra close"]]', 2, None, True), + (u'Extra close', 14)) + + self.assertEqual( + scanstring('{"Extra comma": true,}', 2, None, True), + (u'Extra comma', 14)) + + self.assertEqual( + scanstring('{"Extra value after close": true} "misplaced quoted value"', 2, None, True), + (u'Extra value after close', 26)) + + self.assertEqual( + scanstring('{"Illegal expression": 1 + 2}', 2, None, True), + (u'Illegal expression', 21)) + + self.assertEqual( + scanstring('{"Illegal invocation": alert()}', 2, None, True), + (u'Illegal invocation', 21)) + + self.assertEqual( + scanstring('{"Numbers cannot have leading zeroes": 013}', 2, None, True), + (u'Numbers cannot have leading zeroes', 37)) + + self.assertEqual( + scanstring('{"Numbers cannot be hex": 0x14}', 2, None, True), + (u'Numbers cannot be hex', 24)) + + self.assertEqual( + scanstring('[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]', 21, None, True), + (u'Too deep', 30)) + + self.assertEqual( + scanstring('{"Missing colon" null}', 2, None, True), + (u'Missing colon', 16)) + + self.assertEqual( + scanstring('{"Double colon":: null}', 2, None, True), + (u'Double colon', 15)) + + self.assertEqual( + scanstring('{"Comma instead of colon", null}', 2, None, True), + (u'Comma instead of colon', 25)) + + self.assertEqual( + scanstring('["Colon instead of comma": false]', 2, None, True), + (u'Colon instead of comma', 25)) + + self.assertEqual( + scanstring('["Bad value", truth]', 2, None, True), + (u'Bad value', 12)) + + for c in map(chr, range(0x00, 0x1f)): + self.assertEqual( + scanstring(c + '"', 0, None, False), + (c, 2)) + self.assertRaises( + ValueError, + scanstring, c + '"', 0, None, True) + + self.assertRaises(ValueError, scanstring, '', 0, None, True) + self.assertRaises(ValueError, scanstring, 'a', 0, None, True) + self.assertRaises(ValueError, scanstring, '\\', 0, None, True) + self.assertRaises(ValueError, scanstring, '\\u', 0, None, True) + self.assertRaises(ValueError, scanstring, '\\u0', 0, None, True) + self.assertRaises(ValueError, scanstring, '\\u01', 0, None, True) + self.assertRaises(ValueError, scanstring, '\\u012', 0, None, True) + self.assertRaises(ValueError, scanstring, '\\u0123', 0, None, True) + if sys.maxunicode > 65535: + self.assertRaises(ValueError, + scanstring, '\\ud834\\u"', 0, None, True) + self.assertRaises(ValueError, + scanstring, '\\ud834\\x0123"', 0, None, True) + + def test_issue3623(self): + self.assertRaises(ValueError, json.decoder.scanstring, "xxx", 1, + "xxx") + self.assertRaises(UnicodeDecodeError, + json.encoder.encode_basestring_ascii, b("xx\xff")) + + def test_overflow(self): + # Python 2.5 does not have maxsize, Python 3 does not have maxint + maxsize = getattr(sys, 'maxsize', getattr(sys, 'maxint', None)) + assert maxsize is not None + self.assertRaises(OverflowError, json.decoder.scanstring, "xxx", + maxsize + 1) + + def test_surrogates(self): + scanstring = json.decoder.scanstring + + def assertScan(given, expect, test_utf8=True): + givens = [given] + if not PY3 and test_utf8: + givens.append(given.encode('utf8')) + for given in givens: + (res, count) = scanstring(given, 1, None, True) + self.assertEqual(len(given), count) + self.assertEqual(res, expect) + + assertScan( + u'"z\\ud834\\u0079x"', + u'z\ud834yx') + assertScan( + u'"z\\ud834\\udd20x"', + u'z\U0001d120x') + assertScan( + u'"z\\ud834\\ud834\\udd20x"', + u'z\ud834\U0001d120x') + assertScan( + u'"z\\ud834x"', + u'z\ud834x') + assertScan( + u'"z\\udd20x"', + u'z\udd20x') + assertScan( + u'"z\ud834x"', + u'z\ud834x') + # It may look strange to join strings together, but Python is drunk. + # https://gist.github.com/etrepum/5538443 + assertScan( + u'"z\\ud834\udd20x12345"', + u''.join([u'z\ud834', u'\udd20x12345'])) + assertScan( + u'"z\ud834\\udd20x"', + u''.join([u'z\ud834', u'\udd20x'])) + # these have different behavior given UTF8 input, because the surrogate + # pair may be joined (in maxunicode > 65535 builds) + assertScan( + u''.join([u'"z\ud834', u'\udd20x"']), + u''.join([u'z\ud834', u'\udd20x']), + test_utf8=False) + + self.assertRaises(ValueError, + scanstring, u'"z\\ud83x"', 1, None, True) + self.assertRaises(ValueError, + scanstring, u'"z\\ud834\\udd2x"', 1, None, True) diff --git a/app/lib/simplejson/tests/test_separators.py b/app/lib/simplejson/tests/test_separators.py new file mode 100644 index 0000000..91b4d4f --- /dev/null +++ b/app/lib/simplejson/tests/test_separators.py @@ -0,0 +1,42 @@ +import textwrap +from unittest import TestCase + +import simplejson as json + + +class TestSeparators(TestCase): + def test_separators(self): + h = [['blorpie'], ['whoops'], [], 'd-shtaeou', 'd-nthiouh', 'i-vhbjkhnth', + {'nifty': 87}, {'field': 'yes', 'morefield': False} ] + + expect = textwrap.dedent("""\ + [ + [ + "blorpie" + ] , + [ + "whoops" + ] , + [] , + "d-shtaeou" , + "d-nthiouh" , + "i-vhbjkhnth" , + { + "nifty" : 87 + } , + { + "field" : "yes" , + "morefield" : false + } + ]""") + + + d1 = json.dumps(h) + d2 = json.dumps(h, indent=' ', sort_keys=True, separators=(' ,', ' : ')) + + h1 = json.loads(d1) + h2 = json.loads(d2) + + self.assertEqual(h1, h) + self.assertEqual(h2, h) + self.assertEqual(d2, expect) diff --git a/app/lib/simplejson/tests/test_speedups.py b/app/lib/simplejson/tests/test_speedups.py new file mode 100644 index 0000000..0a2b63b --- /dev/null +++ b/app/lib/simplejson/tests/test_speedups.py @@ -0,0 +1,39 @@ +import sys +import unittest +from unittest import TestCase + +from simplejson import encoder, scanner + + +def has_speedups(): + return encoder.c_make_encoder is not None + + +def skip_if_speedups_missing(func): + def wrapper(*args, **kwargs): + if not has_speedups(): + if hasattr(unittest, 'SkipTest'): + raise unittest.SkipTest("C Extension not available") + else: + sys.stdout.write("C Extension not available") + return + return func(*args, **kwargs) + + return wrapper + + +class TestDecode(TestCase): + @skip_if_speedups_missing + def test_make_scanner(self): + self.assertRaises(AttributeError, scanner.c_make_scanner, 1) + + @skip_if_speedups_missing + def test_make_encoder(self): + self.assertRaises( + TypeError, + encoder.c_make_encoder, + None, + ("\xCD\x7D\x3D\x4E\x12\x4C\xF9\x79\xD7" + "\x52\xBA\x82\xF2\x27\x4A\x7D\xA0\xCA\x75"), + None + ) diff --git a/app/lib/simplejson/tests/test_str_subclass.py b/app/lib/simplejson/tests/test_str_subclass.py new file mode 100644 index 0000000..771eb67 --- /dev/null +++ b/app/lib/simplejson/tests/test_str_subclass.py @@ -0,0 +1,16 @@ +from unittest import TestCase + +import simplejson +from simplejson.compat import text_type, u + +# Tests for issue demonstrated in https://github.com/simplejson/simplejson/issues/144 +class WonkyTextSubclass(text_type): + def __getslice__(self, start, end): + return self.__class__('not what you wanted!') + +class TestStrSubclass(TestCase): + def test_dump_load(self): + for s in ['', '"hello"', 'text', u('\u005c')]: + self.assertEqual( + s, + simplejson.loads(simplejson.dumps(WonkyTextSubclass(s)))) diff --git a/app/lib/simplejson/tests/test_subclass.py b/app/lib/simplejson/tests/test_subclass.py new file mode 100644 index 0000000..2bae3b6 --- /dev/null +++ b/app/lib/simplejson/tests/test_subclass.py @@ -0,0 +1,37 @@ +from unittest import TestCase +import simplejson as json + +from decimal import Decimal + +class AlternateInt(int): + def __repr__(self): + return 'invalid json' + __str__ = __repr__ + + +class AlternateFloat(float): + def __repr__(self): + return 'invalid json' + __str__ = __repr__ + + +# class AlternateDecimal(Decimal): +# def __repr__(self): +# return 'invalid json' + + +class TestSubclass(TestCase): + def test_int(self): + self.assertEqual(json.dumps(AlternateInt(1)), '1') + self.assertEqual(json.dumps(AlternateInt(-1)), '-1') + self.assertEqual(json.loads(json.dumps({AlternateInt(1): 1})), {'1': 1}) + + def test_float(self): + self.assertEqual(json.dumps(AlternateFloat(1.0)), '1.0') + self.assertEqual(json.dumps(AlternateFloat(-1.0)), '-1.0') + self.assertEqual(json.loads(json.dumps({AlternateFloat(1.0): 1})), {'1.0': 1}) + + # NOTE: Decimal subclasses are not supported as-is + # def test_decimal(self): + # self.assertEqual(json.dumps(AlternateDecimal('1.0')), '1.0') + # self.assertEqual(json.dumps(AlternateDecimal('-1.0')), '-1.0') diff --git a/app/lib/simplejson/tests/test_tool.py b/app/lib/simplejson/tests/test_tool.py new file mode 100644 index 0000000..ac2a14c --- /dev/null +++ b/app/lib/simplejson/tests/test_tool.py @@ -0,0 +1,97 @@ +from __future__ import with_statement +import os +import sys +import textwrap +import unittest +import subprocess +import tempfile +try: + # Python 3.x + from test.support import strip_python_stderr +except ImportError: + # Python 2.6+ + try: + from test.test_support import strip_python_stderr + except ImportError: + # Python 2.5 + import re + def strip_python_stderr(stderr): + return re.sub( + r"\[\d+ refs\]\r?\n?$".encode(), + "".encode(), + stderr).strip() + +class TestTool(unittest.TestCase): + data = """ + + [["blorpie"],[ "whoops" ] , [ + ],\t"d-shtaeou",\r"d-nthiouh", + "i-vhbjkhnth", {"nifty":87}, {"morefield" :\tfalse,"field" + :"yes"} ] + """ + + expect = textwrap.dedent("""\ + [ + [ + "blorpie" + ], + [ + "whoops" + ], + [], + "d-shtaeou", + "d-nthiouh", + "i-vhbjkhnth", + { + "nifty": 87 + }, + { + "field": "yes", + "morefield": false + } + ] + """) + + def runTool(self, args=None, data=None): + argv = [sys.executable, '-m', 'simplejson.tool'] + if args: + argv.extend(args) + proc = subprocess.Popen(argv, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE, + stdout=subprocess.PIPE) + out, err = proc.communicate(data) + self.assertEqual(strip_python_stderr(err), ''.encode()) + self.assertEqual(proc.returncode, 0) + return out + + def test_stdin_stdout(self): + self.assertEqual( + self.runTool(data=self.data.encode()), + self.expect.encode()) + + def test_infile_stdout(self): + with tempfile.NamedTemporaryFile() as infile: + infile.write(self.data.encode()) + infile.flush() + self.assertEqual( + self.runTool(args=[infile.name]), + self.expect.encode()) + + def test_infile_outfile(self): + with tempfile.NamedTemporaryFile() as infile: + infile.write(self.data.encode()) + infile.flush() + # outfile will get overwritten by tool, so the delete + # may not work on some platforms. Do it manually. + outfile = tempfile.NamedTemporaryFile() + try: + self.assertEqual( + self.runTool(args=[infile.name, outfile.name]), + ''.encode()) + with open(outfile.name, 'rb') as f: + self.assertEqual(f.read(), self.expect.encode()) + finally: + outfile.close() + if os.path.exists(outfile.name): + os.unlink(outfile.name) diff --git a/app/lib/simplejson/tests/test_tuple.py b/app/lib/simplejson/tests/test_tuple.py new file mode 100644 index 0000000..4ad7b0e --- /dev/null +++ b/app/lib/simplejson/tests/test_tuple.py @@ -0,0 +1,47 @@ +import unittest + +from simplejson.compat import StringIO +import simplejson as json + +class TestTuples(unittest.TestCase): + def test_tuple_array_dumps(self): + t = (1, 2, 3) + expect = json.dumps(list(t)) + # Default is True + self.assertEqual(expect, json.dumps(t)) + self.assertEqual(expect, json.dumps(t, tuple_as_array=True)) + self.assertRaises(TypeError, json.dumps, t, tuple_as_array=False) + # Ensure that the "default" does not get called + self.assertEqual(expect, json.dumps(t, default=repr)) + self.assertEqual(expect, json.dumps(t, tuple_as_array=True, + default=repr)) + # Ensure that the "default" gets called + self.assertEqual( + json.dumps(repr(t)), + json.dumps(t, tuple_as_array=False, default=repr)) + + def test_tuple_array_dump(self): + t = (1, 2, 3) + expect = json.dumps(list(t)) + # Default is True + sio = StringIO() + json.dump(t, sio) + self.assertEqual(expect, sio.getvalue()) + sio = StringIO() + json.dump(t, sio, tuple_as_array=True) + self.assertEqual(expect, sio.getvalue()) + self.assertRaises(TypeError, json.dump, t, StringIO(), + tuple_as_array=False) + # Ensure that the "default" does not get called + sio = StringIO() + json.dump(t, sio, default=repr) + self.assertEqual(expect, sio.getvalue()) + sio = StringIO() + json.dump(t, sio, tuple_as_array=True, default=repr) + self.assertEqual(expect, sio.getvalue()) + # Ensure that the "default" gets called + sio = StringIO() + json.dump(t, sio, tuple_as_array=False, default=repr) + self.assertEqual( + json.dumps(repr(t)), + sio.getvalue()) diff --git a/app/lib/simplejson/tests/test_unicode.py b/app/lib/simplejson/tests/test_unicode.py new file mode 100644 index 0000000..3b37f65 --- /dev/null +++ b/app/lib/simplejson/tests/test_unicode.py @@ -0,0 +1,153 @@ +import sys +import codecs +from unittest import TestCase + +import simplejson as json +from simplejson.compat import unichr, text_type, b, u, BytesIO + +class TestUnicode(TestCase): + def test_encoding1(self): + encoder = json.JSONEncoder(encoding='utf-8') + u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' + s = u.encode('utf-8') + ju = encoder.encode(u) + js = encoder.encode(s) + self.assertEqual(ju, js) + + def test_encoding2(self): + u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' + s = u.encode('utf-8') + ju = json.dumps(u, encoding='utf-8') + js = json.dumps(s, encoding='utf-8') + self.assertEqual(ju, js) + + def test_encoding3(self): + u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' + j = json.dumps(u) + self.assertEqual(j, '"\\u03b1\\u03a9"') + + def test_encoding4(self): + u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' + j = json.dumps([u]) + self.assertEqual(j, '["\\u03b1\\u03a9"]') + + def test_encoding5(self): + u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' + j = json.dumps(u, ensure_ascii=False) + self.assertEqual(j, u'"' + u + u'"') + + def test_encoding6(self): + u = u'\N{GREEK SMALL LETTER ALPHA}\N{GREEK CAPITAL LETTER OMEGA}' + j = json.dumps([u], ensure_ascii=False) + self.assertEqual(j, u'["' + u + u'"]') + + def test_big_unicode_encode(self): + u = u'\U0001d120' + self.assertEqual(json.dumps(u), '"\\ud834\\udd20"') + self.assertEqual(json.dumps(u, ensure_ascii=False), u'"\U0001d120"') + + def test_big_unicode_decode(self): + u = u'z\U0001d120x' + self.assertEqual(json.loads('"' + u + '"'), u) + self.assertEqual(json.loads('"z\\ud834\\udd20x"'), u) + + def test_unicode_decode(self): + for i in range(0, 0xd7ff): + u = unichr(i) + #s = '"\\u{0:04x}"'.format(i) + s = '"\\u%04x"' % (i,) + self.assertEqual(json.loads(s), u) + + def test_object_pairs_hook_with_unicode(self): + s = u'{"xkd":1, "kcw":2, "art":3, "hxm":4, "qrt":5, "pad":6, "hoy":7}' + p = [(u"xkd", 1), (u"kcw", 2), (u"art", 3), (u"hxm", 4), + (u"qrt", 5), (u"pad", 6), (u"hoy", 7)] + self.assertEqual(json.loads(s), eval(s)) + self.assertEqual(json.loads(s, object_pairs_hook=lambda x: x), p) + od = json.loads(s, object_pairs_hook=json.OrderedDict) + self.assertEqual(od, json.OrderedDict(p)) + self.assertEqual(type(od), json.OrderedDict) + # the object_pairs_hook takes priority over the object_hook + self.assertEqual(json.loads(s, + object_pairs_hook=json.OrderedDict, + object_hook=lambda x: None), + json.OrderedDict(p)) + + + def test_default_encoding(self): + self.assertEqual(json.loads(u'{"a": "\xe9"}'.encode('utf-8')), + {'a': u'\xe9'}) + + def test_unicode_preservation(self): + self.assertEqual(type(json.loads(u'""')), text_type) + self.assertEqual(type(json.loads(u'"a"')), text_type) + self.assertEqual(type(json.loads(u'["a"]')[0]), text_type) + + def test_ensure_ascii_false_returns_unicode(self): + # http://code.google.com/p/simplejson/issues/detail?id=48 + self.assertEqual(type(json.dumps([], ensure_ascii=False)), text_type) + self.assertEqual(type(json.dumps(0, ensure_ascii=False)), text_type) + self.assertEqual(type(json.dumps({}, ensure_ascii=False)), text_type) + self.assertEqual(type(json.dumps("", ensure_ascii=False)), text_type) + + def test_ensure_ascii_false_bytestring_encoding(self): + # http://code.google.com/p/simplejson/issues/detail?id=48 + doc1 = {u'quux': b('Arr\xc3\xaat sur images')} + doc2 = {u'quux': u('Arr\xeat sur images')} + doc_ascii = '{"quux": "Arr\\u00eat sur images"}' + doc_unicode = u'{"quux": "Arr\xeat sur images"}' + self.assertEqual(json.dumps(doc1), doc_ascii) + self.assertEqual(json.dumps(doc2), doc_ascii) + self.assertEqual(json.dumps(doc1, ensure_ascii=False), doc_unicode) + self.assertEqual(json.dumps(doc2, ensure_ascii=False), doc_unicode) + + def test_ensure_ascii_linebreak_encoding(self): + # http://timelessrepo.com/json-isnt-a-javascript-subset + s1 = u'\u2029\u2028' + s2 = s1.encode('utf8') + expect = '"\\u2029\\u2028"' + self.assertEqual(json.dumps(s1), expect) + self.assertEqual(json.dumps(s2), expect) + self.assertEqual(json.dumps(s1, ensure_ascii=False), expect) + self.assertEqual(json.dumps(s2, ensure_ascii=False), expect) + + def test_invalid_escape_sequences(self): + # incomplete escape sequence + self.assertRaises(json.JSONDecodeError, json.loads, '"\\u') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\u1') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\u12') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\u123') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\u1234') + # invalid escape sequence + self.assertRaises(json.JSONDecodeError, json.loads, '"\\u123x"') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\u12x4"') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\u1x34"') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\ux234"') + if sys.maxunicode > 65535: + # invalid escape sequence for low surrogate + self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u"') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u0"') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u00"') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u000"') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u000x"') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u00x0"') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\u0x00"') + self.assertRaises(json.JSONDecodeError, json.loads, '"\\ud800\\ux000"') + + def test_ensure_ascii_still_works(self): + # in the ascii range, ensure that everything is the same + for c in map(unichr, range(0, 127)): + self.assertEqual( + json.dumps(c, ensure_ascii=False), + json.dumps(c)) + snowman = u'\N{SNOWMAN}' + self.assertEqual( + json.dumps(c, ensure_ascii=False), + '"' + c + '"') + + def test_strip_bom(self): + content = u"\u3053\u3093\u306b\u3061\u308f" + json_doc = codecs.BOM_UTF8 + b(json.dumps(content)) + self.assertEqual(json.load(BytesIO(json_doc)), content) + for doc in json_doc, json_doc.decode('utf8'): + self.assertEqual(json.loads(doc), content) diff --git a/app/lib/simplejson/tool.py b/app/lib/simplejson/tool.py new file mode 100644 index 0000000..062e8e2 --- /dev/null +++ b/app/lib/simplejson/tool.py @@ -0,0 +1,42 @@ +r"""Command-line tool to validate and pretty-print JSON + +Usage:: + + $ echo '{"json":"obj"}' | python -m simplejson.tool + { + "json": "obj" + } + $ echo '{ 1.2:3.4}' | python -m simplejson.tool + Expecting property name: line 1 column 2 (char 2) + +""" +from __future__ import with_statement +import sys +import simplejson as json + +def main(): + if len(sys.argv) == 1: + infile = sys.stdin + outfile = sys.stdout + elif len(sys.argv) == 2: + infile = open(sys.argv[1], 'r') + outfile = sys.stdout + elif len(sys.argv) == 3: + infile = open(sys.argv[1], 'r') + outfile = open(sys.argv[2], 'w') + else: + raise SystemExit(sys.argv[0] + " [infile [outfile]]") + with infile: + try: + obj = json.load(infile, + object_pairs_hook=json.OrderedDict, + use_decimal=True) + except ValueError: + raise SystemExit(sys.exc_info()[1]) + with outfile: + json.dump(obj, outfile, sort_keys=True, indent=' ', use_decimal=True) + outfile.write('\n') + + +if __name__ == '__main__': + main() diff --git a/app/lib/six-1.10.0.dist-info/DESCRIPTION.rst b/app/lib/six-1.10.0.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..2e2607d --- /dev/null +++ b/app/lib/six-1.10.0.dist-info/DESCRIPTION.rst @@ -0,0 +1,18 @@ +Six is a Python 2 and 3 compatibility library. It provides utility functions +for smoothing over the differences between the Python versions with the goal of +writing Python code that is compatible on both Python versions. See the +documentation for more information on what is provided. + +Six supports every Python version since 2.6. It is contained in only one Python +file, so it can be easily copied into your project. (The copyright and license +notice must be retained.) + +Online documentation is at https://pythonhosted.org/six/. + +Bugs can be reported to https://bitbucket.org/gutworth/six. The code can also +be found there. + +For questions about six or porting in general, email the python-porting mailing +list: https://mail.python.org/mailman/listinfo/python-porting + + diff --git a/app/lib/six-1.10.0.dist-info/METADATA b/app/lib/six-1.10.0.dist-info/METADATA new file mode 100644 index 0000000..4fc3d07 --- /dev/null +++ b/app/lib/six-1.10.0.dist-info/METADATA @@ -0,0 +1,34 @@ +Metadata-Version: 2.0 +Name: six +Version: 1.10.0 +Summary: Python 2 and 3 compatibility utilities +Home-page: http://pypi.python.org/pypi/six/ +Author: Benjamin Peterson +Author-email: benjamin@python.org +License: MIT +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 3 +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Utilities + +Six is a Python 2 and 3 compatibility library. It provides utility functions +for smoothing over the differences between the Python versions with the goal of +writing Python code that is compatible on both Python versions. See the +documentation for more information on what is provided. + +Six supports every Python version since 2.6. It is contained in only one Python +file, so it can be easily copied into your project. (The copyright and license +notice must be retained.) + +Online documentation is at https://pythonhosted.org/six/. + +Bugs can be reported to https://bitbucket.org/gutworth/six. The code can also +be found there. + +For questions about six or porting in general, email the python-porting mailing +list: https://mail.python.org/mailman/listinfo/python-porting + + diff --git a/app/lib/six-1.10.0.dist-info/RECORD b/app/lib/six-1.10.0.dist-info/RECORD new file mode 100644 index 0000000..6350c4e --- /dev/null +++ b/app/lib/six-1.10.0.dist-info/RECORD @@ -0,0 +1,8 @@ +six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +six-1.10.0.dist-info/DESCRIPTION.rst,sha256=QWBtSTT2zzabwJv1NQbTfClSX13m-Qc6tqU4TRL1RLs,774 +six-1.10.0.dist-info/METADATA,sha256=5HceJsUnHof2IRamlCKO2MwNjve1eSP4rLzVQDfwpCQ,1283 +six-1.10.0.dist-info/RECORD,, +six-1.10.0.dist-info/WHEEL,sha256=GrqQvamwgBV4nLoJe0vhYRSWzWsx7xjlt74FT0SWYfE,110 +six-1.10.0.dist-info/metadata.json,sha256=jtOeeTBubYDChl_5Ql5ZPlKoHgg6rdqRIjOz1e5Ek2U,658 +six-1.10.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4 +__pycache__/six.cpython-34.pyc,, diff --git a/app/lib/six-1.10.0.dist-info/WHEEL b/app/lib/six-1.10.0.dist-info/WHEEL new file mode 100644 index 0000000..0de529b --- /dev/null +++ b/app/lib/six-1.10.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.26.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/app/lib/six-1.10.0.dist-info/metadata.json b/app/lib/six-1.10.0.dist-info/metadata.json new file mode 100644 index 0000000..21f9f6c --- /dev/null +++ b/app/lib/six-1.10.0.dist-info/metadata.json @@ -0,0 +1 @@ +{"generator": "bdist_wheel (0.26.0)", "summary": "Python 2 and 3 compatibility utilities", "classifiers": ["Programming Language :: Python :: 2", "Programming Language :: Python :: 3", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Topic :: Software Development :: Libraries", "Topic :: Utilities"], "extensions": {"python.details": {"project_urls": {"Home": "http://pypi.python.org/pypi/six/"}, "contacts": [{"email": "benjamin@python.org", "name": "Benjamin Peterson", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}}}, "license": "MIT", "metadata_version": "2.0", "name": "six", "version": "1.10.0"} \ No newline at end of file diff --git a/app/lib/six-1.10.0.dist-info/top_level.txt b/app/lib/six-1.10.0.dist-info/top_level.txt new file mode 100644 index 0000000..ffe2fce --- /dev/null +++ b/app/lib/six-1.10.0.dist-info/top_level.txt @@ -0,0 +1 @@ +six diff --git a/app/lib/six.py b/app/lib/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/app/lib/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# 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. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/app/lib/sqlalchemy/__init__.py b/app/lib/sqlalchemy/__init__.py new file mode 100644 index 0000000..a2116e0 --- /dev/null +++ b/app/lib/sqlalchemy/__init__.py @@ -0,0 +1,146 @@ +# sqlalchemy/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + + +from .sql import ( + alias, + all_, + and_, + any_, + asc, + between, + bindparam, + case, + cast, + collate, + column, + delete, + desc, + distinct, + except_, + except_all, + exists, + extract, + false, + func, + funcfilter, + insert, + intersect, + intersect_all, + join, + lateral, + literal, + literal_column, + modifier, + not_, + null, + or_, + outerjoin, + outparam, + over, + select, + subquery, + table, + tablesample, + text, + true, + tuple_, + type_coerce, + union, + union_all, + update, + within_group, + ) + +from .types import ( + ARRAY, + BIGINT, + BINARY, + BLOB, + BOOLEAN, + BigInteger, + Binary, + Boolean, + CHAR, + CLOB, + DATE, + DATETIME, + DECIMAL, + Date, + DateTime, + Enum, + FLOAT, + Float, + INT, + INTEGER, + Integer, + Interval, + JSON, + LargeBinary, + NCHAR, + NVARCHAR, + NUMERIC, + Numeric, + PickleType, + REAL, + SMALLINT, + SmallInteger, + String, + TEXT, + TIME, + TIMESTAMP, + Text, + Time, + TypeDecorator, + Unicode, + UnicodeText, + VARBINARY, + VARCHAR, + ) + + +from .schema import ( + CheckConstraint, + Column, + ColumnDefault, + Constraint, + DefaultClause, + FetchedValue, + ForeignKey, + ForeignKeyConstraint, + Index, + MetaData, + PassiveDefault, + PrimaryKeyConstraint, + Sequence, + Table, + ThreadLocalMetaData, + UniqueConstraint, + DDL, + BLANK_SCHEMA +) + + +from .inspection import inspect +from .engine import create_engine, engine_from_config + +__version__ = '1.1.9' + + +def __go(lcls): + global __all__ + + from . import events + from . import util as _sa_util + + import inspect as _inspect + + __all__ = sorted(name for name, obj in lcls.items() + if not (name.startswith('_') or _inspect.ismodule(obj))) + + _sa_util.dependencies.resolve_all("sqlalchemy") +__go(locals()) diff --git a/app/lib/sqlalchemy/connectors/__init__.py b/app/lib/sqlalchemy/connectors/__init__.py new file mode 100644 index 0000000..5cf06d8 --- /dev/null +++ b/app/lib/sqlalchemy/connectors/__init__.py @@ -0,0 +1,10 @@ +# connectors/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + + +class Connector(object): + pass diff --git a/app/lib/sqlalchemy/connectors/mxodbc.py b/app/lib/sqlalchemy/connectors/mxodbc.py new file mode 100644 index 0000000..32e7e18 --- /dev/null +++ b/app/lib/sqlalchemy/connectors/mxodbc.py @@ -0,0 +1,150 @@ +# connectors/mxodbc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +Provide a SQLALchemy connector for the eGenix mxODBC commercial +Python adapter for ODBC. This is not a free product, but eGenix +provides SQLAlchemy with a license for use in continuous integration +testing. + +This has been tested for use with mxODBC 3.1.2 on SQL Server 2005 +and 2008, using the SQL Server Native driver. However, it is +possible for this to be used on other database platforms. + +For more info on mxODBC, see http://www.egenix.com/ + +""" + +import sys +import re +import warnings + +from . import Connector + + +class MxODBCConnector(Connector): + driver = 'mxodbc' + + supports_sane_multi_rowcount = False + supports_unicode_statements = True + supports_unicode_binds = True + + supports_native_decimal = True + + @classmethod + def dbapi(cls): + # this classmethod will normally be replaced by an instance + # attribute of the same name, so this is normally only called once. + cls._load_mx_exceptions() + platform = sys.platform + if platform == 'win32': + from mx.ODBC import Windows as module + # this can be the string "linux2", and possibly others + elif 'linux' in platform: + from mx.ODBC import unixODBC as module + elif platform == 'darwin': + from mx.ODBC import iODBC as module + else: + raise ImportError("Unrecognized platform for mxODBC import") + return module + + @classmethod + def _load_mx_exceptions(cls): + """ Import mxODBC exception classes into the module namespace, + as if they had been imported normally. This is done here + to avoid requiring all SQLAlchemy users to install mxODBC. + """ + global InterfaceError, ProgrammingError + from mx.ODBC import InterfaceError + from mx.ODBC import ProgrammingError + + def on_connect(self): + def connect(conn): + conn.stringformat = self.dbapi.MIXED_STRINGFORMAT + conn.datetimeformat = self.dbapi.PYDATETIME_DATETIMEFORMAT + conn.decimalformat = self.dbapi.DECIMAL_DECIMALFORMAT + conn.errorhandler = self._error_handler() + return connect + + def _error_handler(self): + """ Return a handler that adjusts mxODBC's raised Warnings to + emit Python standard warnings. + """ + from mx.ODBC.Error import Warning as MxOdbcWarning + + def error_handler(connection, cursor, errorclass, errorvalue): + if issubclass(errorclass, MxOdbcWarning): + errorclass.__bases__ = (Warning,) + warnings.warn(message=str(errorvalue), + category=errorclass, + stacklevel=2) + else: + raise errorclass(errorvalue) + return error_handler + + def create_connect_args(self, url): + """ Return a tuple of *args,**kwargs for creating a connection. + + The mxODBC 3.x connection constructor looks like this: + + connect(dsn, user='', password='', + clear_auto_commit=1, errorhandler=None) + + This method translates the values in the provided uri + into args and kwargs needed to instantiate an mxODBC Connection. + + The arg 'errorhandler' is not used by SQLAlchemy and will + not be populated. + + """ + opts = url.translate_connect_args(username='user') + opts.update(url.query) + args = opts.pop('host') + opts.pop('port', None) + opts.pop('database', None) + return (args,), opts + + def is_disconnect(self, e, connection, cursor): + # TODO: eGenix recommends checking connection.closed here + # Does that detect dropped connections ? + if isinstance(e, self.dbapi.ProgrammingError): + return "connection already closed" in str(e) + elif isinstance(e, self.dbapi.Error): + return '[08S01]' in str(e) + else: + return False + + def _get_server_version_info(self, connection): + # eGenix suggests using conn.dbms_version instead + # of what we're doing here + dbapi_con = connection.connection + version = [] + r = re.compile(r'[.\-]') + # 18 == pyodbc.SQL_DBMS_VER + for n in r.split(dbapi_con.getinfo(18)[1]): + try: + version.append(int(n)) + except ValueError: + version.append(n) + return tuple(version) + + def _get_direct(self, context): + if context: + native_odbc_execute = context.execution_options.\ + get('native_odbc_execute', 'auto') + # default to direct=True in all cases, is more generally + # compatible especially with SQL Server + return False if native_odbc_execute is True else True + else: + return True + + def do_executemany(self, cursor, statement, parameters, context=None): + cursor.executemany( + statement, parameters, direct=self._get_direct(context)) + + def do_execute(self, cursor, statement, parameters, context=None): + cursor.execute(statement, parameters, direct=self._get_direct(context)) diff --git a/app/lib/sqlalchemy/connectors/pyodbc.py b/app/lib/sqlalchemy/connectors/pyodbc.py new file mode 100644 index 0000000..ee8445d --- /dev/null +++ b/app/lib/sqlalchemy/connectors/pyodbc.py @@ -0,0 +1,196 @@ +# connectors/pyodbc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from . import Connector +from .. import util + + +import sys +import re + + +class PyODBCConnector(Connector): + driver = 'pyodbc' + + supports_sane_multi_rowcount = False + + if util.py2k: + # PyODBC unicode is broken on UCS-4 builds + supports_unicode = sys.maxunicode == 65535 + supports_unicode_statements = supports_unicode + + supports_native_decimal = True + default_paramstyle = 'named' + + # for non-DSN connections, this *may* be used to + # hold the desired driver name + pyodbc_driver_name = None + + # will be set to True after initialize() + # if the freetds.so is detected + freetds = False + + # will be set to the string version of + # the FreeTDS driver if freetds is detected + freetds_driver_version = None + + # will be set to True after initialize() + # if the libessqlsrv.so is detected + easysoft = False + + def __init__(self, supports_unicode_binds=None, **kw): + super(PyODBCConnector, self).__init__(**kw) + self._user_supports_unicode_binds = supports_unicode_binds + + @classmethod + def dbapi(cls): + return __import__('pyodbc') + + def create_connect_args(self, url): + opts = url.translate_connect_args(username='user') + opts.update(url.query) + + keys = opts + + query = url.query + + connect_args = {} + for param in ('ansi', 'unicode_results', 'autocommit'): + if param in keys: + connect_args[param] = util.asbool(keys.pop(param)) + + if 'odbc_connect' in keys: + connectors = [util.unquote_plus(keys.pop('odbc_connect'))] + else: + def check_quote(token): + if ";" in str(token): + token = "'%s'" % token + return token + + keys = dict( + (k, check_quote(v)) for k, v in keys.items() + ) + + dsn_connection = 'dsn' in keys or \ + ('host' in keys and 'database' not in keys) + if dsn_connection: + connectors = ['dsn=%s' % (keys.pop('host', '') or + keys.pop('dsn', ''))] + else: + port = '' + if 'port' in keys and 'port' not in query: + port = ',%d' % int(keys.pop('port')) + + connectors = [] + driver = keys.pop('driver', self.pyodbc_driver_name) + if driver is None: + util.warn( + "No driver name specified; " + "this is expected by PyODBC when using " + "DSN-less connections") + else: + connectors.append("DRIVER={%s}" % driver) + + connectors.extend( + [ + 'Server=%s%s' % (keys.pop('host', ''), port), + 'Database=%s' % keys.pop('database', '') + ]) + + user = keys.pop("user", None) + if user: + connectors.append("UID=%s" % user) + connectors.append("PWD=%s" % keys.pop('password', '')) + else: + connectors.append("Trusted_Connection=Yes") + + # if set to 'Yes', the ODBC layer will try to automagically + # convert textual data from your database encoding to your + # client encoding. This should obviously be set to 'No' if + # you query a cp1253 encoded database from a latin1 client... + if 'odbc_autotranslate' in keys: + connectors.append("AutoTranslate=%s" % + keys.pop("odbc_autotranslate")) + + connectors.extend(['%s=%s' % (k, v) for k, v in keys.items()]) + + return [[";".join(connectors)], connect_args] + + def is_disconnect(self, e, connection, cursor): + if isinstance(e, self.dbapi.ProgrammingError): + return "The cursor's connection has been closed." in str(e) or \ + 'Attempt to use a closed connection.' in str(e) + elif isinstance(e, self.dbapi.Error): + return '[08S01]' in str(e) + else: + return False + + def initialize(self, connection): + # determine FreeTDS first. can't issue SQL easily + # without getting unicode_statements/binds set up. + + pyodbc = self.dbapi + + dbapi_con = connection.connection + + _sql_driver_name = dbapi_con.getinfo(pyodbc.SQL_DRIVER_NAME) + self.freetds = bool(re.match(r".*libtdsodbc.*\.so", _sql_driver_name + )) + self.easysoft = bool(re.match(r".*libessqlsrv.*\.so", _sql_driver_name + )) + + if self.freetds: + self.freetds_driver_version = dbapi_con.getinfo( + pyodbc.SQL_DRIVER_VER) + + self.supports_unicode_statements = ( + not util.py2k or + (not self.freetds and not self.easysoft) + ) + + if self._user_supports_unicode_binds is not None: + self.supports_unicode_binds = self._user_supports_unicode_binds + elif util.py2k: + self.supports_unicode_binds = ( + not self.freetds or self.freetds_driver_version >= '0.91' + ) and not self.easysoft + else: + self.supports_unicode_binds = True + + # run other initialization which asks for user name, etc. + super(PyODBCConnector, self).initialize(connection) + + def _dbapi_version(self): + if not self.dbapi: + return () + return self._parse_dbapi_version(self.dbapi.version) + + def _parse_dbapi_version(self, vers): + m = re.match( + r'(?:py.*-)?([\d\.]+)(?:-(\w+))?', + vers + ) + if not m: + return () + vers = tuple([int(x) for x in m.group(1).split(".")]) + if m.group(2): + vers += (m.group(2),) + return vers + + def _get_server_version_info(self, connection): + # NOTE: this function is not reliable, particularly when + # freetds is in use. Implement database-specific server version + # queries. + dbapi_con = connection.connection + version = [] + r = re.compile(r'[.\-]') + for n in r.split(dbapi_con.getinfo(self.dbapi.SQL_DBMS_VER)): + try: + version.append(int(n)) + except ValueError: + version.append(n) + return tuple(version) diff --git a/app/lib/sqlalchemy/connectors/zxJDBC.py b/app/lib/sqlalchemy/connectors/zxJDBC.py new file mode 100644 index 0000000..8a5b749 --- /dev/null +++ b/app/lib/sqlalchemy/connectors/zxJDBC.py @@ -0,0 +1,60 @@ +# connectors/zxJDBC.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import sys +from . import Connector + + +class ZxJDBCConnector(Connector): + driver = 'zxjdbc' + + supports_sane_rowcount = False + supports_sane_multi_rowcount = False + + supports_unicode_binds = True + supports_unicode_statements = sys.version > '2.5.0+' + description_encoding = None + default_paramstyle = 'qmark' + + jdbc_db_name = None + jdbc_driver_name = None + + @classmethod + def dbapi(cls): + from com.ziclix.python.sql import zxJDBC + return zxJDBC + + def _driver_kwargs(self): + """Return kw arg dict to be sent to connect().""" + return {} + + def _create_jdbc_url(self, url): + """Create a JDBC url from a :class:`~sqlalchemy.engine.url.URL`""" + return 'jdbc:%s://%s%s/%s' % (self.jdbc_db_name, url.host, + url.port is not None + and ':%s' % url.port or '', + url.database) + + def create_connect_args(self, url): + opts = self._driver_kwargs() + opts.update(url.query) + return [ + [self._create_jdbc_url(url), + url.username, url.password, + self.jdbc_driver_name], + opts] + + def is_disconnect(self, e, connection, cursor): + if not isinstance(e, self.dbapi.ProgrammingError): + return False + e = str(e) + return 'connection is closed' in e or 'cursor is closed' in e + + def _get_server_version_info(self, connection): + # use connection.connection.dbversion, and parse appropriately + # to get a tuple + raise NotImplementedError() diff --git a/app/lib/sqlalchemy/cprocessors.so b/app/lib/sqlalchemy/cprocessors.so new file mode 100755 index 0000000000000000000000000000000000000000..f64d60c882dfc5c491913bf9d6bc2995d8775099 GIT binary patch literal 41468 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 literal 0 HcmV?d00001 diff --git a/app/lib/sqlalchemy/cresultproxy.so b/app/lib/sqlalchemy/cresultproxy.so new file mode 100755 index 0000000000000000000000000000000000000000..c00c034179790d4321548bb837b5ce875c643ffa GIT binary patch literal 43412 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

    vNJmBbzDR!~(&HliP^2eC`a6-H5~+dVO3oT5 z(tMFl5NV-E&lRahq*Fxd73p~*ohDK`2Zi4&CLhO_*lO|#Ut;_e(eWk54;&p|Vowsv z$DC<>p3q4ot#1$-CG-KIcL+@Yi{nddI-yrdD<^b_(5-|hptXh2(}eCN^ff|H5E>vf zNQhrhw!T4V7a@L>>i8172y5H%C00qOlcoFw)$t|PM(8fm_{pi`OYBiXi%I(?p#_BK z*3j`K_BNqX(oPb(gwPbszG2))8m*TT!fm_JT0;l`o?|XvhWmo*70FrE$aDV0a{k0L z4^BCMV#;qBJ_;J+q$`u=IG)lxZlylrs>%5i`yb~|3=atEm4L{x8#ClxW{k_rGxGAL zPRh^w(H#YOd@tum0i$}yMi~1uE}K)01_Rd$JdzE8)PssRD=6S^1;8*4zXQu3ME#+2 zjPdkEK3Ztx4`CBG&NcFSu+0x3_u&d$HOa_p%)^iP5O^J6$lJ2q$m{mzc|GS8?nX%o zXm}-Ml#lS9J(>J8nHZ|4cz2AenLJ@(oGJ;vMaa7)UzkJ&7vCI^+7SmO-xtZlp!k-= zC+sSCF#jPT)sf4Ggz{rf`vJkM@z=!j9|SM;+>dyNmcae7wAhpyb^WKWEp3{#1`d|H1Dab=v1|STgwQ zGx@2F4ft&?$7RXs3XMvmrau�7`*6Q!i^>H**nu{guQ2Uvbz6pMQnn((ukaH~{ns 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 +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Include imports from the sqlalchemy.dialects package for backwards +compatibility with pre 0.6 versions. + +""" +from ..dialects.sqlite import base as sqlite +from ..dialects.postgresql import base as postgresql +postgres = postgresql +from ..dialects.mysql import base as mysql +from ..dialects.oracle import base as oracle +from ..dialects.firebird import base as firebird +from ..dialects.mssql import base as mssql +from ..dialects.sybase import base as sybase + + +__all__ = ( + 'firebird', + 'mssql', + 'mysql', + 'postgresql', + 'sqlite', + 'oracle', + 'sybase', +) diff --git a/app/lib/sqlalchemy/dialects/__init__.py b/app/lib/sqlalchemy/dialects/__init__.py new file mode 100644 index 0000000..44051f0 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/__init__.py @@ -0,0 +1,56 @@ +# dialects/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +__all__ = ( + 'firebird', + 'mssql', + 'mysql', + 'oracle', + 'postgresql', + 'sqlite', + 'sybase', +) + +from .. import util + +_translates = {'postgres': 'postgresql'} + +def _auto_fn(name): + """default dialect importer. + + plugs into the :class:`.PluginLoader` + as a first-hit system. + + """ + if "." in name: + dialect, driver = name.split(".") + else: + dialect = name + driver = "base" + + if dialect in _translates: + translated = _translates[dialect] + util.warn_deprecated( + "The '%s' dialect name has been " + "renamed to '%s'" % (dialect, translated) + ) + dialect = translated + try: + module = __import__('sqlalchemy.dialects.%s' % (dialect, )).dialects + except ImportError: + return None + + module = getattr(module, dialect) + if hasattr(module, driver): + module = getattr(module, driver) + return lambda: module.dialect + else: + return None + +registry = util.PluginLoader("sqlalchemy.dialects", auto_fn=_auto_fn) + +plugins = util.PluginLoader("sqlalchemy.plugins") \ No newline at end of file diff --git a/app/lib/sqlalchemy/dialects/firebird/__init__.py b/app/lib/sqlalchemy/dialects/firebird/__init__.py new file mode 100644 index 0000000..8dd9d11 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/firebird/__init__.py @@ -0,0 +1,21 @@ +# firebird/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from sqlalchemy.dialects.firebird import base, kinterbasdb, fdb + +base.dialect = fdb.dialect + +from sqlalchemy.dialects.firebird.base import \ + SMALLINT, BIGINT, FLOAT, FLOAT, DATE, TIME, \ + TEXT, NUMERIC, FLOAT, TIMESTAMP, VARCHAR, CHAR, BLOB,\ + dialect + +__all__ = ( + 'SMALLINT', 'BIGINT', 'FLOAT', 'FLOAT', 'DATE', 'TIME', + 'TEXT', 'NUMERIC', 'FLOAT', 'TIMESTAMP', 'VARCHAR', 'CHAR', 'BLOB', + 'dialect' +) diff --git a/app/lib/sqlalchemy/dialects/firebird/base.py b/app/lib/sqlalchemy/dialects/firebird/base.py new file mode 100644 index 0000000..7d4aca5 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/firebird/base.py @@ -0,0 +1,741 @@ +# firebird/base.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +r""" + +.. dialect:: firebird + :name: Firebird + +Firebird Dialects +----------------- + +Firebird offers two distinct dialects_ (not to be confused with a +SQLAlchemy ``Dialect``): + +dialect 1 + This is the old syntax and behaviour, inherited from Interbase pre-6.0. + +dialect 3 + This is the newer and supported syntax, introduced in Interbase 6.0. + +The SQLAlchemy Firebird dialect detects these versions and +adjusts its representation of SQL accordingly. However, +support for dialect 1 is not well tested and probably has +incompatibilities. + +Locking Behavior +---------------- + +Firebird locks tables aggressively. For this reason, a DROP TABLE may +hang until other transactions are released. SQLAlchemy does its best +to release transactions as quickly as possible. The most common cause +of hanging transactions is a non-fully consumed result set, i.e.:: + + result = engine.execute("select * from table") + row = result.fetchone() + return + +Where above, the ``ResultProxy`` has not been fully consumed. The +connection will be returned to the pool and the transactional state +rolled back once the Python garbage collector reclaims the objects +which hold onto the connection, which often occurs asynchronously. +The above use case can be alleviated by calling ``first()`` on the +``ResultProxy`` which will fetch the first row and immediately close +all remaining cursor/connection resources. + +RETURNING support +----------------- + +Firebird 2.0 supports returning a result set from inserts, and 2.1 +extends that to deletes and updates. This is generically exposed by +the SQLAlchemy ``returning()`` method, such as:: + + # INSERT..RETURNING + result = table.insert().returning(table.c.col1, table.c.col2).\ + values(name='foo') + print result.fetchall() + + # UPDATE..RETURNING + raises = empl.update().returning(empl.c.id, empl.c.salary).\ + where(empl.c.sales>100).\ + values(dict(salary=empl.c.salary * 1.1)) + print raises.fetchall() + + +.. _dialects: http://mc-computing.com/Databases/Firebird/SQL_Dialect.html + +""" + +import datetime + +from sqlalchemy import schema as sa_schema +from sqlalchemy import exc, types as sqltypes, sql, util +from sqlalchemy.sql import expression +from sqlalchemy.engine import base, default, reflection +from sqlalchemy.sql import compiler +from sqlalchemy.sql.elements import quoted_name + +from sqlalchemy.types import (BIGINT, BLOB, DATE, FLOAT, INTEGER, NUMERIC, + SMALLINT, TEXT, TIME, TIMESTAMP, Integer) + + +RESERVED_WORDS = set([ + "active", "add", "admin", "after", "all", "alter", "and", "any", "as", + "asc", "ascending", "at", "auto", "avg", "before", "begin", "between", + "bigint", "bit_length", "blob", "both", "by", "case", "cast", "char", + "character", "character_length", "char_length", "check", "close", + "collate", "column", "commit", "committed", "computed", "conditional", + "connect", "constraint", "containing", "count", "create", "cross", + "cstring", "current", "current_connection", "current_date", + "current_role", "current_time", "current_timestamp", + "current_transaction", "current_user", "cursor", "database", "date", + "day", "dec", "decimal", "declare", "default", "delete", "desc", + "descending", "disconnect", "distinct", "do", "domain", "double", + "drop", "else", "end", "entry_point", "escape", "exception", + "execute", "exists", "exit", "external", "extract", "fetch", "file", + "filter", "float", "for", "foreign", "from", "full", "function", + "gdscode", "generator", "gen_id", "global", "grant", "group", + "having", "hour", "if", "in", "inactive", "index", "inner", + "input_type", "insensitive", "insert", "int", "integer", "into", "is", + "isolation", "join", "key", "leading", "left", "length", "level", + "like", "long", "lower", "manual", "max", "maximum_segment", "merge", + "min", "minute", "module_name", "month", "names", "national", + "natural", "nchar", "no", "not", "null", "numeric", "octet_length", + "of", "on", "only", "open", "option", "or", "order", "outer", + "output_type", "overflow", "page", "pages", "page_size", "parameter", + "password", "plan", "position", "post_event", "precision", "primary", + "privileges", "procedure", "protected", "rdb$db_key", "read", "real", + "record_version", "recreate", "recursive", "references", "release", + "reserv", "reserving", "retain", "returning_values", "returns", + "revoke", "right", "rollback", "rows", "row_count", "savepoint", + "schema", "second", "segment", "select", "sensitive", "set", "shadow", + "shared", "singular", "size", "smallint", "snapshot", "some", "sort", + "sqlcode", "stability", "start", "starting", "starts", "statistics", + "sub_type", "sum", "suspend", "table", "then", "time", "timestamp", + "to", "trailing", "transaction", "trigger", "trim", "uncommitted", + "union", "unique", "update", "upper", "user", "using", "value", + "values", "varchar", "variable", "varying", "view", "wait", "when", + "where", "while", "with", "work", "write", "year", +]) + + +class _StringType(sqltypes.String): + """Base for Firebird string types.""" + + def __init__(self, charset=None, **kw): + self.charset = charset + super(_StringType, self).__init__(**kw) + + +class VARCHAR(_StringType, sqltypes.VARCHAR): + """Firebird VARCHAR type""" + __visit_name__ = 'VARCHAR' + + def __init__(self, length=None, **kwargs): + super(VARCHAR, self).__init__(length=length, **kwargs) + + +class CHAR(_StringType, sqltypes.CHAR): + """Firebird CHAR type""" + __visit_name__ = 'CHAR' + + def __init__(self, length=None, **kwargs): + super(CHAR, self).__init__(length=length, **kwargs) + + +class _FBDateTime(sqltypes.DateTime): + def bind_processor(self, dialect): + def process(value): + if type(value) == datetime.date: + return datetime.datetime(value.year, value.month, value.day) + else: + return value + return process + +colspecs = { + sqltypes.DateTime: _FBDateTime +} + +ischema_names = { + 'SHORT': SMALLINT, + 'LONG': INTEGER, + 'QUAD': FLOAT, + 'FLOAT': FLOAT, + 'DATE': DATE, + 'TIME': TIME, + 'TEXT': TEXT, + 'INT64': BIGINT, + 'DOUBLE': FLOAT, + 'TIMESTAMP': TIMESTAMP, + 'VARYING': VARCHAR, + 'CSTRING': CHAR, + 'BLOB': BLOB, +} + + +# TODO: date conversion types (should be implemented as _FBDateTime, +# _FBDate, etc. as bind/result functionality is required) + +class FBTypeCompiler(compiler.GenericTypeCompiler): + def visit_boolean(self, type_, **kw): + return self.visit_SMALLINT(type_, **kw) + + def visit_datetime(self, type_, **kw): + return self.visit_TIMESTAMP(type_, **kw) + + def visit_TEXT(self, type_, **kw): + return "BLOB SUB_TYPE 1" + + def visit_BLOB(self, type_, **kw): + return "BLOB SUB_TYPE 0" + + def _extend_string(self, type_, basic): + charset = getattr(type_, 'charset', None) + if charset is None: + return basic + else: + return '%s CHARACTER SET %s' % (basic, charset) + + def visit_CHAR(self, type_, **kw): + basic = super(FBTypeCompiler, self).visit_CHAR(type_, **kw) + return self._extend_string(type_, basic) + + def visit_VARCHAR(self, type_, **kw): + if not type_.length: + raise exc.CompileError( + "VARCHAR requires a length on dialect %s" % + self.dialect.name) + basic = super(FBTypeCompiler, self).visit_VARCHAR(type_, **kw) + return self._extend_string(type_, basic) + + +class FBCompiler(sql.compiler.SQLCompiler): + """Firebird specific idiosyncrasies""" + + ansi_bind_rules = True + + # def visit_contains_op_binary(self, binary, operator, **kw): + # cant use CONTAINING b.c. it's case insensitive. + + # def visit_notcontains_op_binary(self, binary, operator, **kw): + # cant use NOT CONTAINING b.c. it's case insensitive. + + def visit_now_func(self, fn, **kw): + return "CURRENT_TIMESTAMP" + + def visit_startswith_op_binary(self, binary, operator, **kw): + return '%s STARTING WITH %s' % ( + binary.left._compiler_dispatch(self, **kw), + binary.right._compiler_dispatch(self, **kw)) + + def visit_notstartswith_op_binary(self, binary, operator, **kw): + return '%s NOT STARTING WITH %s' % ( + binary.left._compiler_dispatch(self, **kw), + binary.right._compiler_dispatch(self, **kw)) + + def visit_mod_binary(self, binary, operator, **kw): + return "mod(%s, %s)" % ( + self.process(binary.left, **kw), + self.process(binary.right, **kw)) + + def visit_alias(self, alias, asfrom=False, **kwargs): + if self.dialect._version_two: + return super(FBCompiler, self).\ + visit_alias(alias, asfrom=asfrom, **kwargs) + else: + # Override to not use the AS keyword which FB 1.5 does not like + if asfrom: + alias_name = isinstance(alias.name, + expression._truncated_label) and \ + self._truncated_identifier("alias", + alias.name) or alias.name + + return self.process( + alias.original, asfrom=asfrom, **kwargs) + \ + " " + \ + self.preparer.format_alias(alias, alias_name) + else: + return self.process(alias.original, **kwargs) + + def visit_substring_func(self, func, **kw): + s = self.process(func.clauses.clauses[0]) + start = self.process(func.clauses.clauses[1]) + if len(func.clauses.clauses) > 2: + length = self.process(func.clauses.clauses[2]) + return "SUBSTRING(%s FROM %s FOR %s)" % (s, start, length) + else: + return "SUBSTRING(%s FROM %s)" % (s, start) + + def visit_length_func(self, function, **kw): + if self.dialect._version_two: + return "char_length" + self.function_argspec(function) + else: + return "strlen" + self.function_argspec(function) + + visit_char_length_func = visit_length_func + + def function_argspec(self, func, **kw): + # TODO: this probably will need to be + # narrowed to a fixed list, some no-arg functions + # may require parens - see similar example in the oracle + # dialect + if func.clauses is not None and len(func.clauses): + return self.process(func.clause_expr, **kw) + else: + return "" + + def default_from(self): + return " FROM rdb$database" + + def visit_sequence(self, seq): + return "gen_id(%s, 1)" % self.preparer.format_sequence(seq) + + def get_select_precolumns(self, select, **kw): + """Called when building a ``SELECT`` statement, position is just + before column list Firebird puts the limit and offset right + after the ``SELECT``... + """ + + result = "" + if select._limit_clause is not None: + result += "FIRST %s " % self.process(select._limit_clause, **kw) + if select._offset_clause is not None: + result += "SKIP %s " % self.process(select._offset_clause, **kw) + if select._distinct: + result += "DISTINCT " + return result + + def limit_clause(self, select, **kw): + """Already taken care of in the `get_select_precolumns` method.""" + + return "" + + def returning_clause(self, stmt, returning_cols): + columns = [ + self._label_select_column(None, c, True, False, {}) + for c in expression._select_iterables(returning_cols) + ] + + return 'RETURNING ' + ', '.join(columns) + + +class FBDDLCompiler(sql.compiler.DDLCompiler): + """Firebird syntactic idiosyncrasies""" + + def visit_create_sequence(self, create): + """Generate a ``CREATE GENERATOR`` statement for the sequence.""" + + # no syntax for these + # http://www.firebirdsql.org/manual/generatorguide-sqlsyntax.html + if create.element.start is not None: + raise NotImplemented( + "Firebird SEQUENCE doesn't support START WITH") + if create.element.increment is not None: + raise NotImplemented( + "Firebird SEQUENCE doesn't support INCREMENT BY") + + if self.dialect._version_two: + return "CREATE SEQUENCE %s" % \ + self.preparer.format_sequence(create.element) + else: + return "CREATE GENERATOR %s" % \ + self.preparer.format_sequence(create.element) + + def visit_drop_sequence(self, drop): + """Generate a ``DROP GENERATOR`` statement for the sequence.""" + + if self.dialect._version_two: + return "DROP SEQUENCE %s" % \ + self.preparer.format_sequence(drop.element) + else: + return "DROP GENERATOR %s" % \ + self.preparer.format_sequence(drop.element) + + +class FBIdentifierPreparer(sql.compiler.IdentifierPreparer): + """Install Firebird specific reserved words.""" + + reserved_words = RESERVED_WORDS + illegal_initial_characters = compiler.ILLEGAL_INITIAL_CHARACTERS.union( + ['_']) + + def __init__(self, dialect): + super(FBIdentifierPreparer, self).__init__(dialect, omit_schema=True) + + +class FBExecutionContext(default.DefaultExecutionContext): + def fire_sequence(self, seq, type_): + """Get the next value from the sequence using ``gen_id()``.""" + + return self._execute_scalar( + "SELECT gen_id(%s, 1) FROM rdb$database" % + self.dialect.identifier_preparer.format_sequence(seq), + type_ + ) + + +class FBDialect(default.DefaultDialect): + """Firebird dialect""" + + name = 'firebird' + + max_identifier_length = 31 + + supports_sequences = True + sequences_optional = False + supports_default_values = True + postfetch_lastrowid = False + + supports_native_boolean = False + + requires_name_normalize = True + supports_empty_insert = False + + statement_compiler = FBCompiler + ddl_compiler = FBDDLCompiler + preparer = FBIdentifierPreparer + type_compiler = FBTypeCompiler + execution_ctx_cls = FBExecutionContext + + colspecs = colspecs + ischema_names = ischema_names + + construct_arguments = [] + + # defaults to dialect ver. 3, + # will be autodetected off upon + # first connect + _version_two = True + + def initialize(self, connection): + super(FBDialect, self).initialize(connection) + self._version_two = ('firebird' in self.server_version_info and + self.server_version_info >= (2, ) + ) or \ + ('interbase' in self.server_version_info and + self.server_version_info >= (6, ) + ) + + if not self._version_two: + # TODO: whatever other pre < 2.0 stuff goes here + self.ischema_names = ischema_names.copy() + self.ischema_names['TIMESTAMP'] = sqltypes.DATE + self.colspecs = { + sqltypes.DateTime: sqltypes.DATE + } + + self.implicit_returning = self._version_two and \ + self.__dict__.get('implicit_returning', True) + + def normalize_name(self, name): + # Remove trailing spaces: FB uses a CHAR() type, + # that is padded with spaces + name = name and name.rstrip() + if name is None: + return None + elif name.upper() == name and \ + not self.identifier_preparer._requires_quotes(name.lower()): + return name.lower() + elif name.lower() == name: + return quoted_name(name, quote=True) + else: + return name + + def denormalize_name(self, name): + if name is None: + return None + elif name.lower() == name and \ + not self.identifier_preparer._requires_quotes(name.lower()): + return name.upper() + else: + return name + + def has_table(self, connection, table_name, schema=None): + """Return ``True`` if the given table exists, ignoring + the `schema`.""" + + tblqry = """ + SELECT 1 AS has_table FROM rdb$database + WHERE EXISTS (SELECT rdb$relation_name + FROM rdb$relations + WHERE rdb$relation_name=?) + """ + c = connection.execute(tblqry, [self.denormalize_name(table_name)]) + return c.first() is not None + + def has_sequence(self, connection, sequence_name, schema=None): + """Return ``True`` if the given sequence (generator) exists.""" + + genqry = """ + SELECT 1 AS has_sequence FROM rdb$database + WHERE EXISTS (SELECT rdb$generator_name + FROM rdb$generators + WHERE rdb$generator_name=?) + """ + c = connection.execute(genqry, [self.denormalize_name(sequence_name)]) + return c.first() is not None + + @reflection.cache + def get_table_names(self, connection, schema=None, **kw): + # there are two queries commonly mentioned for this. + # this one, using view_blr, is at the Firebird FAQ among other places: + # http://www.firebirdfaq.org/faq174/ + s = """ + select rdb$relation_name + from rdb$relations + where rdb$view_blr is null + and (rdb$system_flag is null or rdb$system_flag = 0); + """ + + # the other query is this one. It's not clear if there's really + # any difference between these two. This link: + # http://www.alberton.info/firebird_sql_meta_info.html#.Ur3vXfZGni8 + # states them as interchangeable. Some discussion at [ticket:2898] + # SELECT DISTINCT rdb$relation_name + # FROM rdb$relation_fields + # WHERE rdb$system_flag=0 AND rdb$view_context IS NULL + + return [self.normalize_name(row[0]) for row in connection.execute(s)] + + @reflection.cache + def get_view_names(self, connection, schema=None, **kw): + # see http://www.firebirdfaq.org/faq174/ + s = """ + select rdb$relation_name + from rdb$relations + where rdb$view_blr is not null + and (rdb$system_flag is null or rdb$system_flag = 0); + """ + return [self.normalize_name(row[0]) for row in connection.execute(s)] + + @reflection.cache + def get_view_definition(self, connection, view_name, schema=None, **kw): + qry = """ + SELECT rdb$view_source AS view_source + FROM rdb$relations + WHERE rdb$relation_name=? + """ + rp = connection.execute(qry, [self.denormalize_name(view_name)]) + row = rp.first() + if row: + return row['view_source'] + else: + return None + + @reflection.cache + def get_pk_constraint(self, connection, table_name, schema=None, **kw): + # Query to extract the PK/FK constrained fields of the given table + keyqry = """ + SELECT se.rdb$field_name AS fname + FROM rdb$relation_constraints rc + JOIN rdb$index_segments se ON rc.rdb$index_name=se.rdb$index_name + WHERE rc.rdb$constraint_type=? AND rc.rdb$relation_name=? + """ + tablename = self.denormalize_name(table_name) + # get primary key fields + c = connection.execute(keyqry, ["PRIMARY KEY", tablename]) + pkfields = [self.normalize_name(r['fname']) for r in c.fetchall()] + return {'constrained_columns': pkfields, 'name': None} + + @reflection.cache + def get_column_sequence(self, connection, + table_name, column_name, + schema=None, **kw): + tablename = self.denormalize_name(table_name) + colname = self.denormalize_name(column_name) + # Heuristic-query to determine the generator associated to a PK field + genqry = """ + SELECT trigdep.rdb$depended_on_name AS fgenerator + FROM rdb$dependencies tabdep + JOIN rdb$dependencies trigdep + ON tabdep.rdb$dependent_name=trigdep.rdb$dependent_name + AND trigdep.rdb$depended_on_type=14 + AND trigdep.rdb$dependent_type=2 + JOIN rdb$triggers trig ON + trig.rdb$trigger_name=tabdep.rdb$dependent_name + WHERE tabdep.rdb$depended_on_name=? + AND tabdep.rdb$depended_on_type=0 + AND trig.rdb$trigger_type=1 + AND tabdep.rdb$field_name=? + AND (SELECT count(*) + FROM rdb$dependencies trigdep2 + WHERE trigdep2.rdb$dependent_name = trigdep.rdb$dependent_name) = 2 + """ + genr = connection.execute(genqry, [tablename, colname]).first() + if genr is not None: + return dict(name=self.normalize_name(genr['fgenerator'])) + + @reflection.cache + def get_columns(self, connection, table_name, schema=None, **kw): + # Query to extract the details of all the fields of the given table + tblqry = """ + SELECT r.rdb$field_name AS fname, + r.rdb$null_flag AS null_flag, + t.rdb$type_name AS ftype, + f.rdb$field_sub_type AS stype, + f.rdb$field_length/ + COALESCE(cs.rdb$bytes_per_character,1) AS flen, + f.rdb$field_precision AS fprec, + f.rdb$field_scale AS fscale, + COALESCE(r.rdb$default_source, + f.rdb$default_source) AS fdefault + FROM rdb$relation_fields r + JOIN rdb$fields f ON r.rdb$field_source=f.rdb$field_name + JOIN rdb$types t + ON t.rdb$type=f.rdb$field_type AND + t.rdb$field_name='RDB$FIELD_TYPE' + LEFT JOIN rdb$character_sets cs ON + f.rdb$character_set_id=cs.rdb$character_set_id + WHERE f.rdb$system_flag=0 AND r.rdb$relation_name=? + ORDER BY r.rdb$field_position + """ + # get the PK, used to determine the eventual associated sequence + pk_constraint = self.get_pk_constraint(connection, table_name) + pkey_cols = pk_constraint['constrained_columns'] + + tablename = self.denormalize_name(table_name) + # get all of the fields for this table + c = connection.execute(tblqry, [tablename]) + cols = [] + while True: + row = c.fetchone() + if row is None: + break + name = self.normalize_name(row['fname']) + orig_colname = row['fname'] + + # get the data type + colspec = row['ftype'].rstrip() + coltype = self.ischema_names.get(colspec) + if coltype is None: + util.warn("Did not recognize type '%s' of column '%s'" % + (colspec, name)) + coltype = sqltypes.NULLTYPE + elif issubclass(coltype, Integer) and row['fprec'] != 0: + coltype = NUMERIC( + precision=row['fprec'], + scale=row['fscale'] * -1) + elif colspec in ('VARYING', 'CSTRING'): + coltype = coltype(row['flen']) + elif colspec == 'TEXT': + coltype = TEXT(row['flen']) + elif colspec == 'BLOB': + if row['stype'] == 1: + coltype = TEXT() + else: + coltype = BLOB() + else: + coltype = coltype() + + # does it have a default value? + defvalue = None + if row['fdefault'] is not None: + # the value comes down as "DEFAULT 'value'": there may be + # more than one whitespace around the "DEFAULT" keyword + # and it may also be lower case + # (see also http://tracker.firebirdsql.org/browse/CORE-356) + defexpr = row['fdefault'].lstrip() + assert defexpr[:8].rstrip().upper() == \ + 'DEFAULT', "Unrecognized default value: %s" % \ + defexpr + defvalue = defexpr[8:].strip() + if defvalue == 'NULL': + # Redundant + defvalue = None + col_d = { + 'name': name, + 'type': coltype, + 'nullable': not bool(row['null_flag']), + 'default': defvalue, + 'autoincrement': 'auto', + } + + if orig_colname.lower() == orig_colname: + col_d['quote'] = True + + # if the PK is a single field, try to see if its linked to + # a sequence thru a trigger + if len(pkey_cols) == 1 and name == pkey_cols[0]: + seq_d = self.get_column_sequence(connection, tablename, name) + if seq_d is not None: + col_d['sequence'] = seq_d + + cols.append(col_d) + return cols + + @reflection.cache + def get_foreign_keys(self, connection, table_name, schema=None, **kw): + # Query to extract the details of each UK/FK of the given table + fkqry = """ + SELECT rc.rdb$constraint_name AS cname, + cse.rdb$field_name AS fname, + ix2.rdb$relation_name AS targetrname, + se.rdb$field_name AS targetfname + FROM rdb$relation_constraints rc + JOIN rdb$indices ix1 ON ix1.rdb$index_name=rc.rdb$index_name + JOIN rdb$indices ix2 ON ix2.rdb$index_name=ix1.rdb$foreign_key + JOIN rdb$index_segments cse ON + cse.rdb$index_name=ix1.rdb$index_name + JOIN rdb$index_segments se + ON se.rdb$index_name=ix2.rdb$index_name + AND se.rdb$field_position=cse.rdb$field_position + WHERE rc.rdb$constraint_type=? AND rc.rdb$relation_name=? + ORDER BY se.rdb$index_name, se.rdb$field_position + """ + tablename = self.denormalize_name(table_name) + + c = connection.execute(fkqry, ["FOREIGN KEY", tablename]) + fks = util.defaultdict(lambda: { + 'name': None, + 'constrained_columns': [], + 'referred_schema': None, + 'referred_table': None, + 'referred_columns': [] + }) + + for row in c: + cname = self.normalize_name(row['cname']) + fk = fks[cname] + if not fk['name']: + fk['name'] = cname + fk['referred_table'] = self.normalize_name(row['targetrname']) + fk['constrained_columns'].append( + self.normalize_name(row['fname'])) + fk['referred_columns'].append( + self.normalize_name(row['targetfname'])) + return list(fks.values()) + + @reflection.cache + def get_indexes(self, connection, table_name, schema=None, **kw): + qry = """ + SELECT ix.rdb$index_name AS index_name, + ix.rdb$unique_flag AS unique_flag, + ic.rdb$field_name AS field_name + FROM rdb$indices ix + JOIN rdb$index_segments ic + ON ix.rdb$index_name=ic.rdb$index_name + LEFT OUTER JOIN rdb$relation_constraints + ON rdb$relation_constraints.rdb$index_name = + ic.rdb$index_name + WHERE ix.rdb$relation_name=? AND ix.rdb$foreign_key IS NULL + AND rdb$relation_constraints.rdb$constraint_type IS NULL + ORDER BY index_name, ic.rdb$field_position + """ + c = connection.execute(qry, [self.denormalize_name(table_name)]) + + indexes = util.defaultdict(dict) + for row in c: + indexrec = indexes[row['index_name']] + if 'name' not in indexrec: + indexrec['name'] = self.normalize_name(row['index_name']) + indexrec['column_names'] = [] + indexrec['unique'] = bool(row['unique_flag']) + + indexrec['column_names'].append( + self.normalize_name(row['field_name'])) + + return list(indexes.values()) diff --git a/app/lib/sqlalchemy/dialects/firebird/fdb.py b/app/lib/sqlalchemy/dialects/firebird/fdb.py new file mode 100644 index 0000000..d590df7 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/firebird/fdb.py @@ -0,0 +1,118 @@ +# firebird/fdb.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: firebird+fdb + :name: fdb + :dbapi: pyodbc + :connectstring: firebird+fdb://user:password@host:port/path/to/db\ +[?key=value&key=value...] + :url: http://pypi.python.org/pypi/fdb/ + + fdb is a kinterbasdb compatible DBAPI for Firebird. + + .. versionadded:: 0.8 - Support for the fdb Firebird driver. + + .. versionchanged:: 0.9 - The fdb dialect is now the default dialect + under the ``firebird://`` URL space, as ``fdb`` is now the official + Python driver for Firebird. + +Arguments +---------- + +The ``fdb`` dialect is based on the +:mod:`sqlalchemy.dialects.firebird.kinterbasdb` dialect, however does not +accept every argument that Kinterbasdb does. + +* ``enable_rowcount`` - True by default, setting this to False disables + the usage of "cursor.rowcount" with the + Kinterbasdb dialect, which SQLAlchemy ordinarily calls upon automatically + after any UPDATE or DELETE statement. When disabled, SQLAlchemy's + ResultProxy will return -1 for result.rowcount. The rationale here is + that Kinterbasdb requires a second round trip to the database when + .rowcount is called - since SQLA's resultproxy automatically closes + the cursor after a non-result-returning statement, rowcount must be + called, if at all, before the result object is returned. Additionally, + cursor.rowcount may not return correct results with older versions + of Firebird, and setting this flag to False will also cause the + SQLAlchemy ORM to ignore its usage. The behavior can also be controlled on a + per-execution basis using the ``enable_rowcount`` option with + :meth:`.Connection.execution_options`:: + + conn = engine.connect().execution_options(enable_rowcount=True) + r = conn.execute(stmt) + print r.rowcount + +* ``retaining`` - False by default. Setting this to True will pass the + ``retaining=True`` keyword argument to the ``.commit()`` and ``.rollback()`` + methods of the DBAPI connection, which can improve performance in some + situations, but apparently with significant caveats. + Please read the fdb and/or kinterbasdb DBAPI documentation in order to + understand the implications of this flag. + + .. versionadded:: 0.8.2 - ``retaining`` keyword argument specifying + transaction retaining behavior - in 0.8 it defaults to ``True`` + for backwards compatibility. + + .. versionchanged:: 0.9.0 - the ``retaining`` flag defaults to ``False``. + In 0.8 it defaulted to ``True``. + + .. seealso:: + + http://pythonhosted.org/fdb/usage-guide.html#retaining-transactions + - information on the "retaining" flag. + +""" + +from .kinterbasdb import FBDialect_kinterbasdb +from ... import util + + +class FBDialect_fdb(FBDialect_kinterbasdb): + + def __init__(self, enable_rowcount=True, + retaining=False, **kwargs): + super(FBDialect_fdb, self).__init__( + enable_rowcount=enable_rowcount, + retaining=retaining, **kwargs) + + @classmethod + def dbapi(cls): + return __import__('fdb') + + def create_connect_args(self, url): + opts = url.translate_connect_args(username='user') + if opts.get('port'): + opts['host'] = "%s/%s" % (opts['host'], opts['port']) + del opts['port'] + opts.update(url.query) + + util.coerce_kw_type(opts, 'type_conv', int) + + return ([], opts) + + def _get_server_version_info(self, connection): + """Get the version of the Firebird server used by a connection. + + Returns a tuple of (`major`, `minor`, `build`), three integers + representing the version of the attached server. + """ + + # This is the simpler approach (the other uses the services api), + # that for backward compatibility reasons returns a string like + # LI-V6.3.3.12981 Firebird 2.0 + # where the first version is a fake one resembling the old + # Interbase signature. + + isc_info_firebird_version = 103 + fbconn = connection.connection + + version = fbconn.db_info(isc_info_firebird_version) + + return self._parse_version_info(version) + +dialect = FBDialect_fdb diff --git a/app/lib/sqlalchemy/dialects/firebird/kinterbasdb.py b/app/lib/sqlalchemy/dialects/firebird/kinterbasdb.py new file mode 100644 index 0000000..b7c1563 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/firebird/kinterbasdb.py @@ -0,0 +1,184 @@ +# firebird/kinterbasdb.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: firebird+kinterbasdb + :name: kinterbasdb + :dbapi: kinterbasdb + :connectstring: firebird+kinterbasdb://user:password@host:port/path/to/db\ +[?key=value&key=value...] + :url: http://firebirdsql.org/index.php?op=devel&sub=python + +Arguments +---------- + +The Kinterbasdb backend accepts the ``enable_rowcount`` and ``retaining`` +arguments accepted by the :mod:`sqlalchemy.dialects.firebird.fdb` dialect. +In addition, it also accepts the following: + +* ``type_conv`` - select the kind of mapping done on the types: by default + SQLAlchemy uses 200 with Unicode, datetime and decimal support. See + the linked documents below for further information. + +* ``concurrency_level`` - set the backend policy with regards to threading + issues: by default SQLAlchemy uses policy 1. See the linked documents + below for further information. + +.. seealso:: + + http://sourceforge.net/projects/kinterbasdb + + http://kinterbasdb.sourceforge.net/dist_docs/usage.html#adv_param_conv_dynamic_type_translation + + http://kinterbasdb.sourceforge.net/dist_docs/usage.html#special_issue_concurrency + +""" + +from .base import FBDialect, FBExecutionContext +from ... import util, types as sqltypes +from re import match +import decimal + + +class _kinterbasdb_numeric(object): + def bind_processor(self, dialect): + def process(value): + if isinstance(value, decimal.Decimal): + return str(value) + else: + return value + return process + + +class _FBNumeric_kinterbasdb(_kinterbasdb_numeric, sqltypes.Numeric): + pass + + +class _FBFloat_kinterbasdb(_kinterbasdb_numeric, sqltypes.Float): + pass + + +class FBExecutionContext_kinterbasdb(FBExecutionContext): + @property + def rowcount(self): + if self.execution_options.get('enable_rowcount', + self.dialect.enable_rowcount): + return self.cursor.rowcount + else: + return -1 + + +class FBDialect_kinterbasdb(FBDialect): + driver = 'kinterbasdb' + supports_sane_rowcount = False + supports_sane_multi_rowcount = False + execution_ctx_cls = FBExecutionContext_kinterbasdb + + supports_native_decimal = True + + colspecs = util.update_copy( + FBDialect.colspecs, + { + sqltypes.Numeric: _FBNumeric_kinterbasdb, + sqltypes.Float: _FBFloat_kinterbasdb, + } + + ) + + def __init__(self, type_conv=200, concurrency_level=1, + enable_rowcount=True, + retaining=False, **kwargs): + super(FBDialect_kinterbasdb, self).__init__(**kwargs) + self.enable_rowcount = enable_rowcount + self.type_conv = type_conv + self.concurrency_level = concurrency_level + self.retaining = retaining + if enable_rowcount: + self.supports_sane_rowcount = True + + @classmethod + def dbapi(cls): + return __import__('kinterbasdb') + + def do_execute(self, cursor, statement, parameters, context=None): + # kinterbase does not accept a None, but wants an empty list + # when there are no arguments. + cursor.execute(statement, parameters or []) + + def do_rollback(self, dbapi_connection): + dbapi_connection.rollback(self.retaining) + + def do_commit(self, dbapi_connection): + dbapi_connection.commit(self.retaining) + + def create_connect_args(self, url): + opts = url.translate_connect_args(username='user') + if opts.get('port'): + opts['host'] = "%s/%s" % (opts['host'], opts['port']) + del opts['port'] + opts.update(url.query) + + util.coerce_kw_type(opts, 'type_conv', int) + + type_conv = opts.pop('type_conv', self.type_conv) + concurrency_level = opts.pop('concurrency_level', + self.concurrency_level) + + if self.dbapi is not None: + initialized = getattr(self.dbapi, 'initialized', None) + if initialized is None: + # CVS rev 1.96 changed the name of the attribute: + # http://kinterbasdb.cvs.sourceforge.net/viewvc/kinterbasdb/ + # Kinterbasdb-3.0/__init__.py?r1=1.95&r2=1.96 + initialized = getattr(self.dbapi, '_initialized', False) + if not initialized: + self.dbapi.init(type_conv=type_conv, + concurrency_level=concurrency_level) + return ([], opts) + + def _get_server_version_info(self, connection): + """Get the version of the Firebird server used by a connection. + + Returns a tuple of (`major`, `minor`, `build`), three integers + representing the version of the attached server. + """ + + # This is the simpler approach (the other uses the services api), + # that for backward compatibility reasons returns a string like + # LI-V6.3.3.12981 Firebird 2.0 + # where the first version is a fake one resembling the old + # Interbase signature. + + fbconn = connection.connection + version = fbconn.server_version + + return self._parse_version_info(version) + + def _parse_version_info(self, version): + m = match( + r'\w+-V(\d+)\.(\d+)\.(\d+)\.(\d+)( \w+ (\d+)\.(\d+))?', version) + if not m: + raise AssertionError( + "Could not determine version from string '%s'" % version) + + if m.group(5) != None: + return tuple([int(x) for x in m.group(6, 7, 4)] + ['firebird']) + else: + return tuple([int(x) for x in m.group(1, 2, 3)] + ['interbase']) + + def is_disconnect(self, e, connection, cursor): + if isinstance(e, (self.dbapi.OperationalError, + self.dbapi.ProgrammingError)): + msg = str(e) + return ('Unable to complete network request to host' in msg or + 'Invalid connection state' in msg or + 'Invalid cursor state' in msg or + 'connection shutdown' in msg) + else: + return False + +dialect = FBDialect_kinterbasdb diff --git a/app/lib/sqlalchemy/dialects/mssql/__init__.py b/app/lib/sqlalchemy/dialects/mssql/__init__.py new file mode 100644 index 0000000..6b70df3 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mssql/__init__.py @@ -0,0 +1,27 @@ +# mssql/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from sqlalchemy.dialects.mssql import base, pyodbc, adodbapi, \ + pymssql, zxjdbc, mxodbc + +base.dialect = pyodbc.dialect + +from sqlalchemy.dialects.mssql.base import \ + INTEGER, BIGINT, SMALLINT, TINYINT, VARCHAR, NVARCHAR, CHAR, \ + NCHAR, TEXT, NTEXT, DECIMAL, NUMERIC, FLOAT, DATETIME,\ + DATETIME2, DATETIMEOFFSET, DATE, TIME, SMALLDATETIME, \ + BINARY, VARBINARY, BIT, REAL, IMAGE, TIMESTAMP,\ + MONEY, SMALLMONEY, UNIQUEIDENTIFIER, SQL_VARIANT, dialect + + +__all__ = ( + 'INTEGER', 'BIGINT', 'SMALLINT', 'TINYINT', 'VARCHAR', 'NVARCHAR', 'CHAR', + 'NCHAR', 'TEXT', 'NTEXT', 'DECIMAL', 'NUMERIC', 'FLOAT', 'DATETIME', + 'DATETIME2', 'DATETIMEOFFSET', 'DATE', 'TIME', 'SMALLDATETIME', + 'BINARY', 'VARBINARY', 'BIT', 'REAL', 'IMAGE', 'TIMESTAMP', + 'MONEY', 'SMALLMONEY', 'UNIQUEIDENTIFIER', 'SQL_VARIANT', 'dialect' +) diff --git a/app/lib/sqlalchemy/dialects/mssql/adodbapi.py b/app/lib/sqlalchemy/dialects/mssql/adodbapi.py new file mode 100644 index 0000000..221bf50 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mssql/adodbapi.py @@ -0,0 +1,87 @@ +# mssql/adodbapi.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: mssql+adodbapi + :name: adodbapi + :dbapi: adodbapi + :connectstring: mssql+adodbapi://:@ + :url: http://adodbapi.sourceforge.net/ + +.. note:: + + The adodbapi dialect is not implemented SQLAlchemy versions 0.6 and + above at this time. + +""" +import datetime +from sqlalchemy import types as sqltypes, util +from sqlalchemy.dialects.mssql.base import MSDateTime, MSDialect +import sys + + +class MSDateTime_adodbapi(MSDateTime): + def result_processor(self, dialect, coltype): + def process(value): + # adodbapi will return datetimes with empty time + # values as datetime.date() objects. + # Promote them back to full datetime.datetime() + if type(value) is datetime.date: + return datetime.datetime(value.year, value.month, value.day) + return value + return process + + +class MSDialect_adodbapi(MSDialect): + supports_sane_rowcount = True + supports_sane_multi_rowcount = True + supports_unicode = sys.maxunicode == 65535 + supports_unicode_statements = True + driver = 'adodbapi' + + @classmethod + def import_dbapi(cls): + import adodbapi as module + return module + + colspecs = util.update_copy( + MSDialect.colspecs, + { + sqltypes.DateTime: MSDateTime_adodbapi + } + ) + + def create_connect_args(self, url): + def check_quote(token): + if ";" in str(token): + token = "'%s'" % token + return token + + keys = dict( + (k, check_quote(v)) for k, v in url.query.items() + ) + + connectors = ["Provider=SQLOLEDB"] + if 'port' in keys: + connectors.append("Data Source=%s, %s" % + (keys.get("host"), keys.get("port"))) + else: + connectors.append("Data Source=%s" % keys.get("host")) + connectors.append("Initial Catalog=%s" % keys.get("database")) + user = keys.get("user") + if user: + connectors.append("User Id=%s" % user) + connectors.append("Password=%s" % keys.get("password", "")) + else: + connectors.append("Integrated Security=SSPI") + return [[";".join(connectors)], {}] + + def is_disconnect(self, e, connection, cursor): + return isinstance(e, self.dbapi.adodbapi.DatabaseError) and \ + "'connection failure'" in str(e) + +dialect = MSDialect_adodbapi diff --git a/app/lib/sqlalchemy/dialects/mssql/base.py b/app/lib/sqlalchemy/dialects/mssql/base.py new file mode 100644 index 0000000..6975754 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mssql/base.py @@ -0,0 +1,2064 @@ +# mssql/base.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: mssql + :name: Microsoft SQL Server + + +Auto Increment Behavior +----------------------- + +SQL Server provides so-called "auto incrementing" behavior using the +``IDENTITY`` construct, which can be placed on an integer primary key. +SQLAlchemy considers ``IDENTITY`` within its default "autoincrement" behavior, +described at :paramref:`.Column.autoincrement`; this means +that by default, the first integer primary key column in a :class:`.Table` +will be considered to be the identity column and will generate DDL as such:: + + from sqlalchemy import Table, MetaData, Column, Integer + + m = MetaData() + t = Table('t', m, + Column('id', Integer, primary_key=True), + Column('x', Integer)) + m.create_all(engine) + +The above example will generate DDL as: + +.. sourcecode:: sql + + CREATE TABLE t ( + id INTEGER NOT NULL IDENTITY(1,1), + x INTEGER NULL, + PRIMARY KEY (id) + ) + +For the case where this default generation of ``IDENTITY`` is not desired, +specify ``autoincrement=False`` on all integer primary key columns:: + + m = MetaData() + t = Table('t', m, + Column('id', Integer, primary_key=True, autoincrement=False), + Column('x', Integer)) + m.create_all(engine) + +.. note:: + + An INSERT statement which refers to an explicit value for such + a column is prohibited by SQL Server, however SQLAlchemy will detect this + and modify the ``IDENTITY_INSERT`` flag accordingly at statement execution + time. As this is not a high performing process, care should be taken to + set the ``autoincrement`` flag appropriately for columns that will not + actually require IDENTITY behavior. + +Controlling "Start" and "Increment" +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Specific control over the parameters of the ``IDENTITY`` value is supported +using the :class:`.schema.Sequence` object. While this object normally +represents an explicit "sequence" for supporting backends, on SQL Server it is +re-purposed to specify behavior regarding the identity column, including +support of the "start" and "increment" values:: + + from sqlalchemy import Table, Integer, Sequence, Column + + Table('test', metadata, + Column('id', Integer, + Sequence('blah', start=100, increment=10), + primary_key=True), + Column('name', String(20)) + ).create(some_engine) + +would yield: + +.. sourcecode:: sql + + CREATE TABLE test ( + id INTEGER NOT NULL IDENTITY(100,10) PRIMARY KEY, + name VARCHAR(20) NULL, + ) + +Note that the ``start`` and ``increment`` values for sequences are +optional and will default to 1,1. + +INSERT behavior +^^^^^^^^^^^^^^^^ + +Handling of the ``IDENTITY`` column at INSERT time involves two key +techniques. The most common is being able to fetch the "last inserted value" +for a given ``IDENTITY`` column, a process which SQLAlchemy performs +implicitly in many cases, most importantly within the ORM. + +The process for fetching this value has several variants: + +* In the vast majority of cases, RETURNING is used in conjunction with INSERT + statements on SQL Server in order to get newly generated primary key values: + + .. sourcecode:: sql + + INSERT INTO t (x) OUTPUT inserted.id VALUES (?) + +* When RETURNING is not available or has been disabled via + ``implicit_returning=False``, either the ``scope_identity()`` function or + the ``@@identity`` variable is used; behavior varies by backend: + + * when using PyODBC, the phrase ``; select scope_identity()`` will be + appended to the end of the INSERT statement; a second result set will be + fetched in order to receive the value. Given a table as:: + + t = Table('t', m, Column('id', Integer, primary_key=True), + Column('x', Integer), + implicit_returning=False) + + an INSERT will look like: + + .. sourcecode:: sql + + INSERT INTO t (x) VALUES (?); select scope_identity() + + * Other dialects such as pymssql will call upon + ``SELECT scope_identity() AS lastrowid`` subsequent to an INSERT + statement. If the flag ``use_scope_identity=False`` is passed to + :func:`.create_engine`, the statement ``SELECT @@identity AS lastrowid`` + is used instead. + +A table that contains an ``IDENTITY`` column will prohibit an INSERT statement +that refers to the identity column explicitly. The SQLAlchemy dialect will +detect when an INSERT construct, created using a core :func:`.insert` +construct (not a plain string SQL), refers to the identity column, and +in this case will emit ``SET IDENTITY_INSERT ON`` prior to the insert +statement proceeding, and ``SET IDENTITY_INSERT OFF`` subsequent to the +execution. Given this example:: + + m = MetaData() + t = Table('t', m, Column('id', Integer, primary_key=True), + Column('x', Integer)) + m.create_all(engine) + + engine.execute(t.insert(), {'id': 1, 'x':1}, {'id':2, 'x':2}) + +The above column will be created with IDENTITY, however the INSERT statement +we emit is specifying explicit values. In the echo output we can see +how SQLAlchemy handles this: + +.. sourcecode:: sql + + CREATE TABLE t ( + id INTEGER NOT NULL IDENTITY(1,1), + x INTEGER NULL, + PRIMARY KEY (id) + ) + + COMMIT + SET IDENTITY_INSERT t ON + INSERT INTO t (id, x) VALUES (?, ?) + ((1, 1), (2, 2)) + SET IDENTITY_INSERT t OFF + COMMIT + + + +This +is an auxiliary use case suitable for testing and bulk insert scenarios. + +MAX on VARCHAR / NVARCHAR +------------------------- + +SQL Server supports the special string "MAX" within the +:class:`.sqltypes.VARCHAR` and :class:`.sqltypes.NVARCHAR` datatypes, +to indicate "maximum length possible". The dialect currently handles this as +a length of "None" in the base type, rather than supplying a +dialect-specific version of these types, so that a base type +specified such as ``VARCHAR(None)`` can assume "unlengthed" behavior on +more than one backend without using dialect-specific types. + +To build a SQL Server VARCHAR or NVARCHAR with MAX length, use None:: + + my_table = Table( + 'my_table', metadata, + Column('my_data', VARCHAR(None)), + Column('my_n_data', NVARCHAR(None)) + ) + + +Collation Support +----------------- + +Character collations are supported by the base string types, +specified by the string argument "collation":: + + from sqlalchemy import VARCHAR + Column('login', VARCHAR(32, collation='Latin1_General_CI_AS')) + +When such a column is associated with a :class:`.Table`, the +CREATE TABLE statement for this column will yield:: + + login VARCHAR(32) COLLATE Latin1_General_CI_AS NULL + +.. versionadded:: 0.8 Character collations are now part of the base string + types. + +LIMIT/OFFSET Support +-------------------- + +MSSQL has no support for the LIMIT or OFFSET keywords. LIMIT is +supported directly through the ``TOP`` Transact SQL keyword:: + + select.limit + +will yield:: + + SELECT TOP n + +If using SQL Server 2005 or above, LIMIT with OFFSET +support is available through the ``ROW_NUMBER OVER`` construct. +For versions below 2005, LIMIT with OFFSET usage will fail. + +.. _mssql_isolation_level: + +Transaction Isolation Level +--------------------------- + +All SQL Server dialects support setting of transaction isolation level +both via a dialect-specific parameter +:paramref:`.create_engine.isolation_level` +accepted by :func:`.create_engine`, +as well as the :paramref:`.Connection.execution_options.isolation_level` +argument as passed to +:meth:`.Connection.execution_options`. This feature works by issuing the +command ``SET TRANSACTION ISOLATION LEVEL `` for +each new connection. + +To set isolation level using :func:`.create_engine`:: + + engine = create_engine( + "mssql+pyodbc://scott:tiger@ms_2008", + isolation_level="REPEATABLE READ" + ) + +To set using per-connection execution options:: + + connection = engine.connect() + connection = connection.execution_options( + isolation_level="READ COMMITTED" + ) + +Valid values for ``isolation_level`` include: + +* ``READ COMMITTED`` +* ``READ UNCOMMITTED`` +* ``REPEATABLE READ`` +* ``SERIALIZABLE`` +* ``SNAPSHOT`` - specific to SQL Server + +.. versionadded:: 1.1 support for isolation level setting on Microsoft + SQL Server. + + +Nullability +----------- +MSSQL has support for three levels of column nullability. The default +nullability allows nulls and is explicit in the CREATE TABLE +construct:: + + name VARCHAR(20) NULL + +If ``nullable=None`` is specified then no specification is made. In +other words the database's configured default is used. This will +render:: + + name VARCHAR(20) + +If ``nullable`` is ``True`` or ``False`` then the column will be +``NULL`` or ``NOT NULL`` respectively. + +Date / Time Handling +-------------------- +DATE and TIME are supported. Bind parameters are converted +to datetime.datetime() objects as required by most MSSQL drivers, +and results are processed from strings if needed. +The DATE and TIME types are not available for MSSQL 2005 and +previous - if a server version below 2008 is detected, DDL +for these types will be issued as DATETIME. + +.. _mssql_large_type_deprecation: + +Large Text/Binary Type Deprecation +---------------------------------- + +Per `SQL Server 2012/2014 Documentation `_, +the ``NTEXT``, ``TEXT`` and ``IMAGE`` datatypes are to be removed from SQL Server +in a future release. SQLAlchemy normally relates these types to the +:class:`.UnicodeText`, :class:`.Text` and :class:`.LargeBinary` datatypes. + +In order to accommodate this change, a new flag ``deprecate_large_types`` +is added to the dialect, which will be automatically set based on detection +of the server version in use, if not otherwise set by the user. The +behavior of this flag is as follows: + +* When this flag is ``True``, the :class:`.UnicodeText`, :class:`.Text` and + :class:`.LargeBinary` datatypes, when used to render DDL, will render the + types ``NVARCHAR(max)``, ``VARCHAR(max)``, and ``VARBINARY(max)``, + respectively. This is a new behavior as of the addition of this flag. + +* When this flag is ``False``, the :class:`.UnicodeText`, :class:`.Text` and + :class:`.LargeBinary` datatypes, when used to render DDL, will render the + types ``NTEXT``, ``TEXT``, and ``IMAGE``, + respectively. This is the long-standing behavior of these types. + +* The flag begins with the value ``None``, before a database connection is + established. If the dialect is used to render DDL without the flag being + set, it is interpreted the same as ``False``. + +* On first connection, the dialect detects if SQL Server version 2012 or greater + is in use; if the flag is still at ``None``, it sets it to ``True`` or + ``False`` based on whether 2012 or greater is detected. + +* The flag can be set to either ``True`` or ``False`` when the dialect + is created, typically via :func:`.create_engine`:: + + eng = create_engine("mssql+pymssql://user:pass@host/db", + deprecate_large_types=True) + +* Complete control over whether the "old" or "new" types are rendered is + available in all SQLAlchemy versions by using the UPPERCASE type objects + instead: :class:`.NVARCHAR`, :class:`.VARCHAR`, :class:`.types.VARBINARY`, + :class:`.TEXT`, :class:`.mssql.NTEXT`, :class:`.mssql.IMAGE` will always remain + fixed and always output exactly that type. + +.. versionadded:: 1.0.0 + +.. _legacy_schema_rendering: + +Legacy Schema Mode +------------------ + +Very old versions of the MSSQL dialect introduced the behavior such that a +schema-qualified table would be auto-aliased when used in a +SELECT statement; given a table:: + + account_table = Table( + 'account', metadata, + Column('id', Integer, primary_key=True), + Column('info', String(100)), + schema="customer_schema" + ) + +this legacy mode of rendering would assume that "customer_schema.account" +would not be accepted by all parts of the SQL statement, as illustrated +below:: + + >>> eng = create_engine("mssql+pymssql://mydsn", legacy_schema_aliasing=True) + >>> print(account_table.select().compile(eng)) + SELECT account_1.id, account_1.info + FROM customer_schema.account AS account_1 + +This mode of behavior is now off by default, as it appears to have served +no purpose; however in the case that legacy applications rely upon it, +it is available using the ``legacy_schema_aliasing`` argument to +:func:`.create_engine` as illustrated above. + +.. versionchanged:: 1.1 the ``legacy_schema_aliasing`` flag introduced + in version 1.0.5 to allow disabling of legacy mode for schemas now + defaults to False. + + +.. _mssql_indexes: + +Clustered Index Support +----------------------- + +The MSSQL dialect supports clustered indexes (and primary keys) via the +``mssql_clustered`` option. This option is available to :class:`.Index`, +:class:`.UniqueConstraint`. and :class:`.PrimaryKeyConstraint`. + +To generate a clustered index:: + + Index("my_index", table.c.x, mssql_clustered=True) + +which renders the index as ``CREATE CLUSTERED INDEX my_index ON table (x)``. + +To generate a clustered primary key use:: + + Table('my_table', metadata, + Column('x', ...), + Column('y', ...), + PrimaryKeyConstraint("x", "y", mssql_clustered=True)) + +which will render the table, for example, as:: + + CREATE TABLE my_table (x INTEGER NOT NULL, y INTEGER NOT NULL, + PRIMARY KEY CLUSTERED (x, y)) + +Similarly, we can generate a clustered unique constraint using:: + + Table('my_table', metadata, + Column('x', ...), + Column('y', ...), + PrimaryKeyConstraint("x"), + UniqueConstraint("y", mssql_clustered=True), + ) + +To explicitly request a non-clustered primary key (for example, when +a separate clustered index is desired), use:: + + Table('my_table', metadata, + Column('x', ...), + Column('y', ...), + PrimaryKeyConstraint("x", "y", mssql_clustered=False)) + +which will render the table, for example, as:: + + CREATE TABLE my_table (x INTEGER NOT NULL, y INTEGER NOT NULL, + PRIMARY KEY NONCLUSTERED (x, y)) + +.. versionchanged:: 1.1 the ``mssql_clustered`` option now defaults + to None, rather than False. ``mssql_clustered=False`` now explicitly + renders the NONCLUSTERED clause, whereas None omits the CLUSTERED + clause entirely, allowing SQL Server defaults to take effect. + + +MSSQL-Specific Index Options +----------------------------- + +In addition to clustering, the MSSQL dialect supports other special options +for :class:`.Index`. + +INCLUDE +^^^^^^^ + +The ``mssql_include`` option renders INCLUDE(colname) for the given string +names:: + + Index("my_index", table.c.x, mssql_include=['y']) + +would render the index as ``CREATE INDEX my_index ON table (x) INCLUDE (y)`` + +.. versionadded:: 0.8 + +Index ordering +^^^^^^^^^^^^^^ + +Index ordering is available via functional expressions, such as:: + + Index("my_index", table.c.x.desc()) + +would render the index as ``CREATE INDEX my_index ON table (x DESC)`` + +.. versionadded:: 0.8 + +.. seealso:: + + :ref:`schema_indexes_functional` + +Compatibility Levels +-------------------- +MSSQL supports the notion of setting compatibility levels at the +database level. This allows, for instance, to run a database that +is compatible with SQL2000 while running on a SQL2005 database +server. ``server_version_info`` will always return the database +server version information (in this case SQL2005) and not the +compatibility level information. Because of this, if running under +a backwards compatibility mode SQAlchemy may attempt to use T-SQL +statements that are unable to be parsed by the database server. + +Triggers +-------- + +SQLAlchemy by default uses OUTPUT INSERTED to get at newly +generated primary key values via IDENTITY columns or other +server side defaults. MS-SQL does not +allow the usage of OUTPUT INSERTED on tables that have triggers. +To disable the usage of OUTPUT INSERTED on a per-table basis, +specify ``implicit_returning=False`` for each :class:`.Table` +which has triggers:: + + Table('mytable', metadata, + Column('id', Integer, primary_key=True), + # ..., + implicit_returning=False + ) + +Declarative form:: + + class MyClass(Base): + # ... + __table_args__ = {'implicit_returning':False} + + +This option can also be specified engine-wide using the +``implicit_returning=False`` argument on :func:`.create_engine`. + +.. _mssql_rowcount_versioning: + +Rowcount Support / ORM Versioning +--------------------------------- + +The SQL Server drivers have very limited ability to return the number +of rows updated from an UPDATE or DELETE statement. In particular, the +pymssql driver has no support, whereas the pyodbc driver can only return +this value under certain conditions. + +In particular, updated rowcount is not available when OUTPUT INSERTED +is used. This impacts the SQLAlchemy ORM's versioning feature when +server-side versioning schemes are used. When +using pyodbc, the "implicit_returning" flag needs to be set to false +for any ORM mapped class that uses a version_id column in conjunction with +a server-side version generator:: + + class MyTable(Base): + __tablename__ = 'mytable' + id = Column(Integer, primary_key=True) + stuff = Column(String(10)) + timestamp = Column(TIMESTAMP(), default=text('DEFAULT')) + __mapper_args__ = { + 'version_id_col': timestamp, + 'version_id_generator': False, + } + __table_args__ = { + 'implicit_returning': False + } + +Without the implicit_returning flag above, the UPDATE statement will +use ``OUTPUT inserted.timestamp`` and the rowcount will be returned as +-1, causing the versioning logic to fail. + +Enabling Snapshot Isolation +--------------------------- + +Not necessarily specific to SQLAlchemy, SQL Server has a default transaction +isolation mode that locks entire tables, and causes even mildly concurrent +applications to have long held locks and frequent deadlocks. +Enabling snapshot isolation for the database as a whole is recommended +for modern levels of concurrency support. This is accomplished via the +following ALTER DATABASE commands executed at the SQL prompt:: + + ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON + + ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON + +Background on SQL Server snapshot isolation is available at +http://msdn.microsoft.com/en-us/library/ms175095.aspx. + +Known Issues +------------ + +* No support for more than one ``IDENTITY`` column per table +* reflection of indexes does not work with versions older than + SQL Server 2005 + +""" +import datetime +import operator +import re + +from ... import sql, schema as sa_schema, exc, util +from ...sql import compiler, expression, util as sql_util +from ... import engine +from ...engine import reflection, default +from ... import types as sqltypes +from ...types import INTEGER, BIGINT, SMALLINT, DECIMAL, NUMERIC, \ + FLOAT, TIMESTAMP, DATETIME, DATE, BINARY,\ + TEXT, VARCHAR, NVARCHAR, CHAR, NCHAR + + +from ...util import update_wrapper +from . import information_schema as ischema + +# http://sqlserverbuilds.blogspot.com/ +MS_2016_VERSION = (13,) +MS_2014_VERSION = (12,) +MS_2012_VERSION = (11,) +MS_2008_VERSION = (10,) +MS_2005_VERSION = (9,) +MS_2000_VERSION = (8,) + +RESERVED_WORDS = set( + ['add', 'all', 'alter', 'and', 'any', 'as', 'asc', 'authorization', + 'backup', 'begin', 'between', 'break', 'browse', 'bulk', 'by', 'cascade', + 'case', 'check', 'checkpoint', 'close', 'clustered', 'coalesce', + 'collate', 'column', 'commit', 'compute', 'constraint', 'contains', + 'containstable', 'continue', 'convert', 'create', 'cross', 'current', + 'current_date', 'current_time', 'current_timestamp', 'current_user', + 'cursor', 'database', 'dbcc', 'deallocate', 'declare', 'default', + 'delete', 'deny', 'desc', 'disk', 'distinct', 'distributed', 'double', + 'drop', 'dump', 'else', 'end', 'errlvl', 'escape', 'except', 'exec', + 'execute', 'exists', 'exit', 'external', 'fetch', 'file', 'fillfactor', + 'for', 'foreign', 'freetext', 'freetexttable', 'from', 'full', + 'function', 'goto', 'grant', 'group', 'having', 'holdlock', 'identity', + 'identity_insert', 'identitycol', 'if', 'in', 'index', 'inner', 'insert', + 'intersect', 'into', 'is', 'join', 'key', 'kill', 'left', 'like', + 'lineno', 'load', 'merge', 'national', 'nocheck', 'nonclustered', 'not', + 'null', 'nullif', 'of', 'off', 'offsets', 'on', 'open', 'opendatasource', + 'openquery', 'openrowset', 'openxml', 'option', 'or', 'order', 'outer', + 'over', 'percent', 'pivot', 'plan', 'precision', 'primary', 'print', + 'proc', 'procedure', 'public', 'raiserror', 'read', 'readtext', + 'reconfigure', 'references', 'replication', 'restore', 'restrict', + 'return', 'revert', 'revoke', 'right', 'rollback', 'rowcount', + 'rowguidcol', 'rule', 'save', 'schema', 'securityaudit', 'select', + 'session_user', 'set', 'setuser', 'shutdown', 'some', 'statistics', + 'system_user', 'table', 'tablesample', 'textsize', 'then', 'to', 'top', + 'tran', 'transaction', 'trigger', 'truncate', 'tsequal', 'union', + 'unique', 'unpivot', 'update', 'updatetext', 'use', 'user', 'values', + 'varying', 'view', 'waitfor', 'when', 'where', 'while', 'with', + 'writetext', + ]) + + +class REAL(sqltypes.REAL): + __visit_name__ = 'REAL' + + def __init__(self, **kw): + # REAL is a synonym for FLOAT(24) on SQL server + kw['precision'] = 24 + super(REAL, self).__init__(**kw) + + +class TINYINT(sqltypes.Integer): + __visit_name__ = 'TINYINT' + + +# MSSQL DATE/TIME types have varied behavior, sometimes returning +# strings. MSDate/TIME check for everything, and always +# filter bind parameters into datetime objects (required by pyodbc, +# not sure about other dialects). + +class _MSDate(sqltypes.Date): + + def bind_processor(self, dialect): + def process(value): + if type(value) == datetime.date: + return datetime.datetime(value.year, value.month, value.day) + else: + return value + return process + + _reg = re.compile(r"(\d+)-(\d+)-(\d+)") + + def result_processor(self, dialect, coltype): + def process(value): + if isinstance(value, datetime.datetime): + return value.date() + elif isinstance(value, util.string_types): + m = self._reg.match(value) + if not m: + raise ValueError( + "could not parse %r as a date value" % (value, )) + return datetime.date(*[ + int(x or 0) + for x in m.groups() + ]) + else: + return value + return process + + +class TIME(sqltypes.TIME): + + def __init__(self, precision=None, **kwargs): + self.precision = precision + super(TIME, self).__init__() + + __zero_date = datetime.date(1900, 1, 1) + + def bind_processor(self, dialect): + def process(value): + if isinstance(value, datetime.datetime): + value = datetime.datetime.combine( + self.__zero_date, value.time()) + elif isinstance(value, datetime.time): + value = datetime.datetime.combine(self.__zero_date, value) + return value + return process + + _reg = re.compile(r"(\d+):(\d+):(\d+)(?:\.(\d{0,6}))?") + + def result_processor(self, dialect, coltype): + def process(value): + if isinstance(value, datetime.datetime): + return value.time() + elif isinstance(value, util.string_types): + m = self._reg.match(value) + if not m: + raise ValueError( + "could not parse %r as a time value" % (value, )) + return datetime.time(*[ + int(x or 0) + for x in m.groups()]) + else: + return value + return process +_MSTime = TIME + + +class _DateTimeBase(object): + + def bind_processor(self, dialect): + def process(value): + if type(value) == datetime.date: + return datetime.datetime(value.year, value.month, value.day) + else: + return value + return process + + +class _MSDateTime(_DateTimeBase, sqltypes.DateTime): + pass + + +class SMALLDATETIME(_DateTimeBase, sqltypes.DateTime): + __visit_name__ = 'SMALLDATETIME' + + +class DATETIME2(_DateTimeBase, sqltypes.DateTime): + __visit_name__ = 'DATETIME2' + + def __init__(self, precision=None, **kw): + super(DATETIME2, self).__init__(**kw) + self.precision = precision + + +# TODO: is this not an Interval ? +class DATETIMEOFFSET(sqltypes.TypeEngine): + __visit_name__ = 'DATETIMEOFFSET' + + def __init__(self, precision=None, **kwargs): + self.precision = precision + + +class _StringType(object): + + """Base for MSSQL string types.""" + + def __init__(self, collation=None): + super(_StringType, self).__init__(collation=collation) + + +class NTEXT(sqltypes.UnicodeText): + + """MSSQL NTEXT type, for variable-length unicode text up to 2^30 + characters.""" + + __visit_name__ = 'NTEXT' + + +class VARBINARY(sqltypes.VARBINARY, sqltypes.LargeBinary): + """The MSSQL VARBINARY type. + + This type extends both :class:`.types.VARBINARY` and + :class:`.types.LargeBinary`. In "deprecate_large_types" mode, + the :class:`.types.LargeBinary` type will produce ``VARBINARY(max)`` + on SQL Server. + + .. versionadded:: 1.0.0 + + .. seealso:: + + :ref:`mssql_large_type_deprecation` + + + + """ + __visit_name__ = 'VARBINARY' + + +class IMAGE(sqltypes.LargeBinary): + __visit_name__ = 'IMAGE' + + +class BIT(sqltypes.TypeEngine): + __visit_name__ = 'BIT' + + +class MONEY(sqltypes.TypeEngine): + __visit_name__ = 'MONEY' + + +class SMALLMONEY(sqltypes.TypeEngine): + __visit_name__ = 'SMALLMONEY' + + +class UNIQUEIDENTIFIER(sqltypes.TypeEngine): + __visit_name__ = "UNIQUEIDENTIFIER" + + +class SQL_VARIANT(sqltypes.TypeEngine): + __visit_name__ = 'SQL_VARIANT' + +# old names. +MSDateTime = _MSDateTime +MSDate = _MSDate +MSReal = REAL +MSTinyInteger = TINYINT +MSTime = TIME +MSSmallDateTime = SMALLDATETIME +MSDateTime2 = DATETIME2 +MSDateTimeOffset = DATETIMEOFFSET +MSText = TEXT +MSNText = NTEXT +MSString = VARCHAR +MSNVarchar = NVARCHAR +MSChar = CHAR +MSNChar = NCHAR +MSBinary = BINARY +MSVarBinary = VARBINARY +MSImage = IMAGE +MSBit = BIT +MSMoney = MONEY +MSSmallMoney = SMALLMONEY +MSUniqueIdentifier = UNIQUEIDENTIFIER +MSVariant = SQL_VARIANT + +ischema_names = { + 'int': INTEGER, + 'bigint': BIGINT, + 'smallint': SMALLINT, + 'tinyint': TINYINT, + 'varchar': VARCHAR, + 'nvarchar': NVARCHAR, + 'char': CHAR, + 'nchar': NCHAR, + 'text': TEXT, + 'ntext': NTEXT, + 'decimal': DECIMAL, + 'numeric': NUMERIC, + 'float': FLOAT, + 'datetime': DATETIME, + 'datetime2': DATETIME2, + 'datetimeoffset': DATETIMEOFFSET, + 'date': DATE, + 'time': TIME, + 'smalldatetime': SMALLDATETIME, + 'binary': BINARY, + 'varbinary': VARBINARY, + 'bit': BIT, + 'real': REAL, + 'image': IMAGE, + 'timestamp': TIMESTAMP, + 'money': MONEY, + 'smallmoney': SMALLMONEY, + 'uniqueidentifier': UNIQUEIDENTIFIER, + 'sql_variant': SQL_VARIANT, +} + + +class MSTypeCompiler(compiler.GenericTypeCompiler): + def _extend(self, spec, type_, length=None): + """Extend a string-type declaration with standard SQL + COLLATE annotations. + + """ + + if getattr(type_, 'collation', None): + collation = 'COLLATE %s' % type_.collation + else: + collation = None + + if not length: + length = type_.length + + if length: + spec = spec + "(%s)" % length + + return ' '.join([c for c in (spec, collation) + if c is not None]) + + def visit_FLOAT(self, type_, **kw): + precision = getattr(type_, 'precision', None) + if precision is None: + return "FLOAT" + else: + return "FLOAT(%(precision)s)" % {'precision': precision} + + def visit_TINYINT(self, type_, **kw): + return "TINYINT" + + def visit_DATETIMEOFFSET(self, type_, **kw): + if type_.precision is not None: + return "DATETIMEOFFSET(%s)" % type_.precision + else: + return "DATETIMEOFFSET" + + def visit_TIME(self, type_, **kw): + precision = getattr(type_, 'precision', None) + if precision is not None: + return "TIME(%s)" % precision + else: + return "TIME" + + def visit_DATETIME2(self, type_, **kw): + precision = getattr(type_, 'precision', None) + if precision is not None: + return "DATETIME2(%s)" % precision + else: + return "DATETIME2" + + def visit_SMALLDATETIME(self, type_, **kw): + return "SMALLDATETIME" + + def visit_unicode(self, type_, **kw): + return self.visit_NVARCHAR(type_, **kw) + + def visit_text(self, type_, **kw): + if self.dialect.deprecate_large_types: + return self.visit_VARCHAR(type_, **kw) + else: + return self.visit_TEXT(type_, **kw) + + def visit_unicode_text(self, type_, **kw): + if self.dialect.deprecate_large_types: + return self.visit_NVARCHAR(type_, **kw) + else: + return self.visit_NTEXT(type_, **kw) + + def visit_NTEXT(self, type_, **kw): + return self._extend("NTEXT", type_) + + def visit_TEXT(self, type_, **kw): + return self._extend("TEXT", type_) + + def visit_VARCHAR(self, type_, **kw): + return self._extend("VARCHAR", type_, length=type_.length or 'max') + + def visit_CHAR(self, type_, **kw): + return self._extend("CHAR", type_) + + def visit_NCHAR(self, type_, **kw): + return self._extend("NCHAR", type_) + + def visit_NVARCHAR(self, type_, **kw): + return self._extend("NVARCHAR", type_, length=type_.length or 'max') + + def visit_date(self, type_, **kw): + if self.dialect.server_version_info < MS_2008_VERSION: + return self.visit_DATETIME(type_, **kw) + else: + return self.visit_DATE(type_, **kw) + + def visit_time(self, type_, **kw): + if self.dialect.server_version_info < MS_2008_VERSION: + return self.visit_DATETIME(type_, **kw) + else: + return self.visit_TIME(type_, **kw) + + def visit_large_binary(self, type_, **kw): + if self.dialect.deprecate_large_types: + return self.visit_VARBINARY(type_, **kw) + else: + return self.visit_IMAGE(type_, **kw) + + def visit_IMAGE(self, type_, **kw): + return "IMAGE" + + def visit_VARBINARY(self, type_, **kw): + return self._extend( + "VARBINARY", + type_, + length=type_.length or 'max') + + def visit_boolean(self, type_, **kw): + return self.visit_BIT(type_) + + def visit_BIT(self, type_, **kw): + return "BIT" + + def visit_MONEY(self, type_, **kw): + return "MONEY" + + def visit_SMALLMONEY(self, type_, **kw): + return 'SMALLMONEY' + + def visit_UNIQUEIDENTIFIER(self, type_, **kw): + return "UNIQUEIDENTIFIER" + + def visit_SQL_VARIANT(self, type_, **kw): + return 'SQL_VARIANT' + + +class MSExecutionContext(default.DefaultExecutionContext): + _enable_identity_insert = False + _select_lastrowid = False + _result_proxy = None + _lastrowid = None + + def _opt_encode(self, statement): + if not self.dialect.supports_unicode_statements: + return self.dialect._encoder(statement)[0] + else: + return statement + + def pre_exec(self): + """Activate IDENTITY_INSERT if needed.""" + + if self.isinsert: + tbl = self.compiled.statement.table + seq_column = tbl._autoincrement_column + insert_has_sequence = seq_column is not None + + if insert_has_sequence: + self._enable_identity_insert = \ + seq_column.key in self.compiled_parameters[0] or \ + ( + self.compiled.statement.parameters and ( + ( + self.compiled.statement._has_multi_parameters + and + seq_column.key in + self.compiled.statement.parameters[0] + ) or ( + not + self.compiled.statement._has_multi_parameters + and + seq_column.key in + self.compiled.statement.parameters + ) + ) + ) + else: + self._enable_identity_insert = False + + self._select_lastrowid = not self.compiled.inline and \ + insert_has_sequence and \ + not self.compiled.returning and \ + not self._enable_identity_insert and \ + not self.executemany + + if self._enable_identity_insert: + self.root_connection._cursor_execute( + self.cursor, + self._opt_encode( + "SET IDENTITY_INSERT %s ON" % + self.dialect.identifier_preparer.format_table(tbl)), + (), + self) + + def post_exec(self): + """Disable IDENTITY_INSERT if enabled.""" + + conn = self.root_connection + if self._select_lastrowid: + if self.dialect.use_scope_identity: + conn._cursor_execute( + self.cursor, + "SELECT scope_identity() AS lastrowid", (), self) + else: + conn._cursor_execute(self.cursor, + "SELECT @@identity AS lastrowid", + (), + self) + # fetchall() ensures the cursor is consumed without closing it + row = self.cursor.fetchall()[0] + self._lastrowid = int(row[0]) + + if (self.isinsert or self.isupdate or self.isdelete) and \ + self.compiled.returning: + self._result_proxy = engine.FullyBufferedResultProxy(self) + + if self._enable_identity_insert: + conn._cursor_execute( + self.cursor, + self._opt_encode( + "SET IDENTITY_INSERT %s OFF" % + self.dialect.identifier_preparer. format_table( + self.compiled.statement.table)), + (), + self) + + def get_lastrowid(self): + return self._lastrowid + + def handle_dbapi_exception(self, e): + if self._enable_identity_insert: + try: + self.cursor.execute( + self._opt_encode( + "SET IDENTITY_INSERT %s OFF" % + self.dialect.identifier_preparer. format_table( + self.compiled.statement.table))) + except Exception: + pass + + def get_result_proxy(self): + if self._result_proxy: + return self._result_proxy + else: + return engine.ResultProxy(self) + + +class MSSQLCompiler(compiler.SQLCompiler): + returning_precedes_values = True + + extract_map = util.update_copy( + compiler.SQLCompiler.extract_map, + { + 'doy': 'dayofyear', + 'dow': 'weekday', + 'milliseconds': 'millisecond', + 'microseconds': 'microsecond' + }) + + def __init__(self, *args, **kwargs): + self.tablealiases = {} + super(MSSQLCompiler, self).__init__(*args, **kwargs) + + def _with_legacy_schema_aliasing(fn): + def decorate(self, *arg, **kw): + if self.dialect.legacy_schema_aliasing: + return fn(self, *arg, **kw) + else: + super_ = getattr(super(MSSQLCompiler, self), fn.__name__) + return super_(*arg, **kw) + return decorate + + def visit_now_func(self, fn, **kw): + return "CURRENT_TIMESTAMP" + + def visit_current_date_func(self, fn, **kw): + return "GETDATE()" + + def visit_length_func(self, fn, **kw): + return "LEN%s" % self.function_argspec(fn, **kw) + + def visit_char_length_func(self, fn, **kw): + return "LEN%s" % self.function_argspec(fn, **kw) + + def visit_concat_op_binary(self, binary, operator, **kw): + return "%s + %s" % \ + (self.process(binary.left, **kw), + self.process(binary.right, **kw)) + + def visit_true(self, expr, **kw): + return '1' + + def visit_false(self, expr, **kw): + return '0' + + def visit_match_op_binary(self, binary, operator, **kw): + return "CONTAINS (%s, %s)" % ( + self.process(binary.left, **kw), + self.process(binary.right, **kw)) + + def get_select_precolumns(self, select, **kw): + """ MS-SQL puts TOP, it's version of LIMIT here """ + + s = "" + if select._distinct: + s += "DISTINCT " + + if select._simple_int_limit and not select._offset: + # ODBC drivers and possibly others + # don't support bind params in the SELECT clause on SQL Server. + # so have to use literal here. + s += "TOP %d " % select._limit + + if s: + return s + else: + return compiler.SQLCompiler.get_select_precolumns( + self, select, **kw) + + def get_from_hint_text(self, table, text): + return text + + def get_crud_hint_text(self, table, text): + return text + + def limit_clause(self, select, **kw): + # Limit in mssql is after the select keyword + return "" + + def visit_select(self, select, **kwargs): + """Look for ``LIMIT`` and OFFSET in a select statement, and if + so tries to wrap it in a subquery with ``row_number()`` criterion. + + """ + if ( + ( + not select._simple_int_limit and + select._limit_clause is not None + ) or ( + select._offset_clause is not None and + not select._simple_int_offset or select._offset + ) + ) and not getattr(select, '_mssql_visit', None): + + # to use ROW_NUMBER(), an ORDER BY is required. + if not select._order_by_clause.clauses: + raise exc.CompileError('MSSQL requires an order_by when ' + 'using an OFFSET or a non-simple ' + 'LIMIT clause') + + _order_by_clauses = [ + sql_util.unwrap_label_reference(elem) + for elem in select._order_by_clause.clauses + ] + + limit_clause = select._limit_clause + offset_clause = select._offset_clause + kwargs['select_wraps_for'] = select + select = select._generate() + select._mssql_visit = True + select = select.column( + sql.func.ROW_NUMBER().over(order_by=_order_by_clauses) + .label("mssql_rn")).order_by(None).alias() + + mssql_rn = sql.column('mssql_rn') + limitselect = sql.select([c for c in select.c if + c.key != 'mssql_rn']) + if offset_clause is not None: + limitselect.append_whereclause(mssql_rn > offset_clause) + if limit_clause is not None: + limitselect.append_whereclause( + mssql_rn <= (limit_clause + offset_clause)) + else: + limitselect.append_whereclause( + mssql_rn <= (limit_clause)) + return self.process(limitselect, **kwargs) + else: + return compiler.SQLCompiler.visit_select(self, select, **kwargs) + + @_with_legacy_schema_aliasing + def visit_table(self, table, mssql_aliased=False, iscrud=False, **kwargs): + if mssql_aliased is table or iscrud: + return super(MSSQLCompiler, self).visit_table(table, **kwargs) + + # alias schema-qualified tables + alias = self._schema_aliased_table(table) + if alias is not None: + return self.process(alias, mssql_aliased=table, **kwargs) + else: + return super(MSSQLCompiler, self).visit_table(table, **kwargs) + + @_with_legacy_schema_aliasing + def visit_alias(self, alias, **kw): + # translate for schema-qualified table aliases + kw['mssql_aliased'] = alias.original + return super(MSSQLCompiler, self).visit_alias(alias, **kw) + + @_with_legacy_schema_aliasing + def visit_column(self, column, add_to_result_map=None, **kw): + if column.table is not None and \ + (not self.isupdate and not self.isdelete) or \ + self.is_subquery(): + # translate for schema-qualified table aliases + t = self._schema_aliased_table(column.table) + if t is not None: + converted = expression._corresponding_column_or_error( + t, column) + if add_to_result_map is not None: + add_to_result_map( + column.name, + column.name, + (column, column.name, column.key), + column.type + ) + + return super(MSSQLCompiler, self).\ + visit_column(converted, **kw) + + return super(MSSQLCompiler, self).visit_column( + column, add_to_result_map=add_to_result_map, **kw) + + def _schema_aliased_table(self, table): + if getattr(table, 'schema', None) is not None: + if table not in self.tablealiases: + self.tablealiases[table] = table.alias() + return self.tablealiases[table] + else: + return None + + def visit_extract(self, extract, **kw): + field = self.extract_map.get(extract.field, extract.field) + return 'DATEPART(%s, %s)' % \ + (field, self.process(extract.expr, **kw)) + + def visit_savepoint(self, savepoint_stmt): + return "SAVE TRANSACTION %s" % \ + self.preparer.format_savepoint(savepoint_stmt) + + def visit_rollback_to_savepoint(self, savepoint_stmt): + return ("ROLLBACK TRANSACTION %s" + % self.preparer.format_savepoint(savepoint_stmt)) + + def visit_binary(self, binary, **kwargs): + """Move bind parameters to the right-hand side of an operator, where + possible. + + """ + if ( + isinstance(binary.left, expression.BindParameter) + and binary.operator == operator.eq + and not isinstance(binary.right, expression.BindParameter) + ): + return self.process( + expression.BinaryExpression(binary.right, + binary.left, + binary.operator), + **kwargs) + return super(MSSQLCompiler, self).visit_binary(binary, **kwargs) + + def returning_clause(self, stmt, returning_cols): + + if self.isinsert or self.isupdate: + target = stmt.table.alias("inserted") + else: + target = stmt.table.alias("deleted") + + adapter = sql_util.ClauseAdapter(target) + + columns = [ + self._label_select_column(None, adapter.traverse(c), + True, False, {}) + for c in expression._select_iterables(returning_cols) + ] + + return 'OUTPUT ' + ', '.join(columns) + + def get_cte_preamble(self, recursive): + # SQL Server finds it too inconvenient to accept + # an entirely optional, SQL standard specified, + # "RECURSIVE" word with their "WITH", + # so here we go + return "WITH" + + def label_select_column(self, select, column, asfrom): + if isinstance(column, expression.Function): + return column.label(None) + else: + return super(MSSQLCompiler, self).\ + label_select_column(select, column, asfrom) + + def for_update_clause(self, select): + # "FOR UPDATE" is only allowed on "DECLARE CURSOR" which + # SQLAlchemy doesn't use + return '' + + def order_by_clause(self, select, **kw): + order_by = self.process(select._order_by_clause, **kw) + + # MSSQL only allows ORDER BY in subqueries if there is a LIMIT + if order_by and (not self.is_subquery() or select._limit): + return " ORDER BY " + order_by + else: + return "" + + def update_from_clause(self, update_stmt, + from_table, extra_froms, + from_hints, + **kw): + """Render the UPDATE..FROM clause specific to MSSQL. + + In MSSQL, if the UPDATE statement involves an alias of the table to + be updated, then the table itself must be added to the FROM list as + well. Otherwise, it is optional. Here, we add it regardless. + + """ + return "FROM " + ', '.join( + t._compiler_dispatch(self, asfrom=True, + fromhints=from_hints, **kw) + for t in [from_table] + extra_froms) + + +class MSSQLStrictCompiler(MSSQLCompiler): + + """A subclass of MSSQLCompiler which disables the usage of bind + parameters where not allowed natively by MS-SQL. + + A dialect may use this compiler on a platform where native + binds are used. + + """ + ansi_bind_rules = True + + def visit_in_op_binary(self, binary, operator, **kw): + kw['literal_binds'] = True + return "%s IN %s" % ( + self.process(binary.left, **kw), + self.process(binary.right, **kw) + ) + + def visit_notin_op_binary(self, binary, operator, **kw): + kw['literal_binds'] = True + return "%s NOT IN %s" % ( + self.process(binary.left, **kw), + self.process(binary.right, **kw) + ) + + def render_literal_value(self, value, type_): + """ + For date and datetime values, convert to a string + format acceptable to MSSQL. That seems to be the + so-called ODBC canonical date format which looks + like this: + + yyyy-mm-dd hh:mi:ss.mmm(24h) + + For other data types, call the base class implementation. + """ + # datetime and date are both subclasses of datetime.date + if issubclass(type(value), datetime.date): + # SQL Server wants single quotes around the date string. + return "'" + str(value) + "'" + else: + return super(MSSQLStrictCompiler, self).\ + render_literal_value(value, type_) + + +class MSDDLCompiler(compiler.DDLCompiler): + + def get_column_specification(self, column, **kwargs): + colspec = ( + self.preparer.format_column(column) + " " + + self.dialect.type_compiler.process( + column.type, type_expression=column) + ) + + if column.nullable is not None: + if not column.nullable or column.primary_key or \ + isinstance(column.default, sa_schema.Sequence): + colspec += " NOT NULL" + else: + colspec += " NULL" + + if column.table is None: + raise exc.CompileError( + "mssql requires Table-bound columns " + "in order to generate DDL") + + # install an IDENTITY Sequence if we either a sequence or an implicit + # IDENTITY column + if isinstance(column.default, sa_schema.Sequence): + if column.default.start == 0: + start = 0 + else: + start = column.default.start or 1 + + colspec += " IDENTITY(%s,%s)" % (start, + column.default.increment or 1) + elif column is column.table._autoincrement_column: + colspec += " IDENTITY(1,1)" + else: + default = self.get_column_default_string(column) + if default is not None: + colspec += " DEFAULT " + default + + return colspec + + def visit_create_index(self, create, include_schema=False): + index = create.element + self._verify_index_table(index) + preparer = self.preparer + text = "CREATE " + if index.unique: + text += "UNIQUE " + + # handle clustering option + clustered = index.dialect_options['mssql']['clustered'] + if clustered is not None: + if clustered: + text += "CLUSTERED " + else: + text += "NONCLUSTERED " + + text += "INDEX %s ON %s (%s)" \ + % ( + self._prepared_index_name(index, + include_schema=include_schema), + preparer.format_table(index.table), + ', '.join( + self.sql_compiler.process(expr, + include_table=False, + literal_binds=True) for + expr in index.expressions) + ) + + # handle other included columns + if index.dialect_options['mssql']['include']: + inclusions = [index.table.c[col] + if isinstance(col, util.string_types) else col + for col in + index.dialect_options['mssql']['include'] + ] + + text += " INCLUDE (%s)" \ + % ', '.join([preparer.quote(c.name) + for c in inclusions]) + + return text + + def visit_drop_index(self, drop): + return "\nDROP INDEX %s ON %s" % ( + self._prepared_index_name(drop.element, include_schema=False), + self.preparer.format_table(drop.element.table) + ) + + def visit_primary_key_constraint(self, constraint): + if len(constraint) == 0: + return '' + text = "" + if constraint.name is not None: + text += "CONSTRAINT %s " % \ + self.preparer.format_constraint(constraint) + text += "PRIMARY KEY " + + clustered = constraint.dialect_options['mssql']['clustered'] + if clustered is not None: + if clustered: + text += "CLUSTERED " + else: + text += "NONCLUSTERED " + + text += "(%s)" % ', '.join(self.preparer.quote(c.name) + for c in constraint) + text += self.define_constraint_deferrability(constraint) + return text + + def visit_unique_constraint(self, constraint): + if len(constraint) == 0: + return '' + text = "" + if constraint.name is not None: + text += "CONSTRAINT %s " % \ + self.preparer.format_constraint(constraint) + text += "UNIQUE " + + clustered = constraint.dialect_options['mssql']['clustered'] + if clustered is not None: + if clustered: + text += "CLUSTERED " + else: + text += "NONCLUSTERED " + + text += "(%s)" % ', '.join(self.preparer.quote(c.name) + for c in constraint) + text += self.define_constraint_deferrability(constraint) + return text + + +class MSIdentifierPreparer(compiler.IdentifierPreparer): + reserved_words = RESERVED_WORDS + + def __init__(self, dialect): + super(MSIdentifierPreparer, self).__init__(dialect, initial_quote='[', + final_quote=']') + + def _escape_identifier(self, value): + return value + + def quote_schema(self, schema, force=None): + """Prepare a quoted table and schema name.""" + result = '.'.join([self.quote(x, force) for x in schema.split('.')]) + return result + + +def _db_plus_owner_listing(fn): + def wrap(dialect, connection, schema=None, **kw): + dbname, owner = _owner_plus_db(dialect, schema) + return _switch_db(dbname, connection, fn, dialect, connection, + dbname, owner, schema, **kw) + return update_wrapper(wrap, fn) + + +def _db_plus_owner(fn): + def wrap(dialect, connection, tablename, schema=None, **kw): + dbname, owner = _owner_plus_db(dialect, schema) + return _switch_db(dbname, connection, fn, dialect, connection, + tablename, dbname, owner, schema, **kw) + return update_wrapper(wrap, fn) + + +def _switch_db(dbname, connection, fn, *arg, **kw): + if dbname: + current_db = connection.scalar("select db_name()") + connection.execute("use %s" % dbname) + try: + return fn(*arg, **kw) + finally: + if dbname: + connection.execute("use %s" % current_db) + + +def _owner_plus_db(dialect, schema): + if not schema: + return None, dialect.default_schema_name + elif "." in schema: + return schema.split(".", 1) + else: + return None, schema + + +class MSDialect(default.DefaultDialect): + name = 'mssql' + supports_default_values = True + supports_empty_insert = False + execution_ctx_cls = MSExecutionContext + use_scope_identity = True + max_identifier_length = 128 + schema_name = "dbo" + + colspecs = { + sqltypes.DateTime: _MSDateTime, + sqltypes.Date: _MSDate, + sqltypes.Time: TIME, + } + + engine_config_types = default.DefaultDialect.engine_config_types.union([ + ('legacy_schema_aliasing', util.asbool), + ]) + + ischema_names = ischema_names + + supports_native_boolean = False + supports_unicode_binds = True + postfetch_lastrowid = True + + server_version_info = () + + statement_compiler = MSSQLCompiler + ddl_compiler = MSDDLCompiler + type_compiler = MSTypeCompiler + preparer = MSIdentifierPreparer + + construct_arguments = [ + (sa_schema.PrimaryKeyConstraint, { + "clustered": None + }), + (sa_schema.UniqueConstraint, { + "clustered": None + }), + (sa_schema.Index, { + "clustered": None, + "include": None + }) + ] + + def __init__(self, + query_timeout=None, + use_scope_identity=True, + max_identifier_length=None, + schema_name="dbo", + isolation_level=None, + deprecate_large_types=None, + legacy_schema_aliasing=False, **opts): + self.query_timeout = int(query_timeout or 0) + self.schema_name = schema_name + + self.use_scope_identity = use_scope_identity + self.max_identifier_length = int(max_identifier_length or 0) or \ + self.max_identifier_length + self.deprecate_large_types = deprecate_large_types + self.legacy_schema_aliasing = legacy_schema_aliasing + + super(MSDialect, self).__init__(**opts) + + self.isolation_level = isolation_level + + def do_savepoint(self, connection, name): + # give the DBAPI a push + connection.execute("IF @@TRANCOUNT = 0 BEGIN TRANSACTION") + super(MSDialect, self).do_savepoint(connection, name) + + def do_release_savepoint(self, connection, name): + # SQL Server does not support RELEASE SAVEPOINT + pass + + _isolation_lookup = set(['SERIALIZABLE', 'READ UNCOMMITTED', + 'READ COMMITTED', 'REPEATABLE READ', + 'SNAPSHOT']) + + def set_isolation_level(self, connection, level): + level = level.replace('_', ' ') + if level not in self._isolation_lookup: + raise exc.ArgumentError( + "Invalid value '%s' for isolation_level. " + "Valid isolation levels for %s are %s" % + (level, self.name, ", ".join(self._isolation_lookup)) + ) + cursor = connection.cursor() + cursor.execute( + "SET TRANSACTION ISOLATION LEVEL %s" % level) + cursor.close() + + def get_isolation_level(self, connection): + if self.server_version_info < MS_2005_VERSION: + raise NotImplementedError( + "Can't fetch isolation level prior to SQL Server 2005") + + cursor = connection.cursor() + cursor.execute(""" + SELECT CASE transaction_isolation_level + WHEN 0 THEN NULL + WHEN 1 THEN 'READ UNCOMMITTED' + WHEN 2 THEN 'READ COMMITTED' + WHEN 3 THEN 'REPEATABLE READ' + WHEN 4 THEN 'SERIALIZABLE' + WHEN 5 THEN 'SNAPSHOT' END AS TRANSACTION_ISOLATION_LEVEL + FROM sys.dm_exec_sessions + where session_id = @@SPID + """) + val = cursor.fetchone()[0] + cursor.close() + return val.upper() + + def initialize(self, connection): + super(MSDialect, self).initialize(connection) + self._setup_version_attributes() + + def on_connect(self): + if self.isolation_level is not None: + def connect(conn): + self.set_isolation_level(conn, self.isolation_level) + return connect + else: + return None + + def _setup_version_attributes(self): + if self.server_version_info[0] not in list(range(8, 17)): + util.warn( + "Unrecognized server version info '%s'. Some SQL Server " + "features may not function properly." % + ".".join(str(x) for x in self.server_version_info)) + if self.server_version_info >= MS_2005_VERSION and \ + 'implicit_returning' not in self.__dict__: + self.implicit_returning = True + if self.server_version_info >= MS_2008_VERSION: + self.supports_multivalues_insert = True + if self.deprecate_large_types is None: + self.deprecate_large_types = \ + self.server_version_info >= MS_2012_VERSION + + def _get_default_schema_name(self, connection): + if self.server_version_info < MS_2005_VERSION: + return self.schema_name + else: + query = sql.text("SELECT schema_name()") + default_schema_name = connection.scalar(query) + if default_schema_name is not None: + return util.text_type(default_schema_name) + else: + return self.schema_name + + @_db_plus_owner + def has_table(self, connection, tablename, dbname, owner, schema): + columns = ischema.columns + + whereclause = columns.c.table_name == tablename + + if owner: + whereclause = sql.and_(whereclause, + columns.c.table_schema == owner) + s = sql.select([columns], whereclause) + c = connection.execute(s) + return c.first() is not None + + @reflection.cache + def get_schema_names(self, connection, **kw): + s = sql.select([ischema.schemata.c.schema_name], + order_by=[ischema.schemata.c.schema_name] + ) + schema_names = [r[0] for r in connection.execute(s)] + return schema_names + + @reflection.cache + @_db_plus_owner_listing + def get_table_names(self, connection, dbname, owner, schema, **kw): + tables = ischema.tables + s = sql.select([tables.c.table_name], + sql.and_( + tables.c.table_schema == owner, + tables.c.table_type == 'BASE TABLE' + ), + order_by=[tables.c.table_name] + ) + table_names = [r[0] for r in connection.execute(s)] + return table_names + + @reflection.cache + @_db_plus_owner_listing + def get_view_names(self, connection, dbname, owner, schema, **kw): + tables = ischema.tables + s = sql.select([tables.c.table_name], + sql.and_( + tables.c.table_schema == owner, + tables.c.table_type == 'VIEW' + ), + order_by=[tables.c.table_name] + ) + view_names = [r[0] for r in connection.execute(s)] + return view_names + + @reflection.cache + @_db_plus_owner + def get_indexes(self, connection, tablename, dbname, owner, schema, **kw): + # using system catalogs, don't support index reflection + # below MS 2005 + if self.server_version_info < MS_2005_VERSION: + return [] + + rp = connection.execute( + sql.text("select ind.index_id, ind.is_unique, ind.name " + "from sys.indexes as ind join sys.tables as tab on " + "ind.object_id=tab.object_id " + "join sys.schemas as sch on sch.schema_id=tab.schema_id " + "where tab.name = :tabname " + "and sch.name=:schname " + "and ind.is_primary_key=0", + bindparams=[ + sql.bindparam('tabname', tablename, + sqltypes.String(convert_unicode=True)), + sql.bindparam('schname', owner, + sqltypes.String(convert_unicode=True)) + ], + typemap={ + 'name': sqltypes.Unicode() + } + ) + ) + indexes = {} + for row in rp: + indexes[row['index_id']] = { + 'name': row['name'], + 'unique': row['is_unique'] == 1, + 'column_names': [] + } + rp = connection.execute( + sql.text( + "select ind_col.index_id, ind_col.object_id, col.name " + "from sys.columns as col " + "join sys.tables as tab on tab.object_id=col.object_id " + "join sys.index_columns as ind_col on " + "(ind_col.column_id=col.column_id and " + "ind_col.object_id=tab.object_id) " + "join sys.schemas as sch on sch.schema_id=tab.schema_id " + "where tab.name=:tabname " + "and sch.name=:schname", + bindparams=[ + sql.bindparam('tabname', tablename, + sqltypes.String(convert_unicode=True)), + sql.bindparam('schname', owner, + sqltypes.String(convert_unicode=True)) + ], + typemap={'name': sqltypes.Unicode()} + ), + ) + for row in rp: + if row['index_id'] in indexes: + indexes[row['index_id']]['column_names'].append(row['name']) + + return list(indexes.values()) + + @reflection.cache + @_db_plus_owner + def get_view_definition(self, connection, viewname, + dbname, owner, schema, **kw): + rp = connection.execute( + sql.text( + "select definition from sys.sql_modules as mod, " + "sys.views as views, " + "sys.schemas as sch" + " where " + "mod.object_id=views.object_id and " + "views.schema_id=sch.schema_id and " + "views.name=:viewname and sch.name=:schname", + bindparams=[ + sql.bindparam('viewname', viewname, + sqltypes.String(convert_unicode=True)), + sql.bindparam('schname', owner, + sqltypes.String(convert_unicode=True)) + ] + ) + ) + + if rp: + view_def = rp.scalar() + return view_def + + @reflection.cache + @_db_plus_owner + def get_columns(self, connection, tablename, dbname, owner, schema, **kw): + # Get base columns + columns = ischema.columns + if owner: + whereclause = sql.and_(columns.c.table_name == tablename, + columns.c.table_schema == owner) + else: + whereclause = columns.c.table_name == tablename + s = sql.select([columns], whereclause, + order_by=[columns.c.ordinal_position]) + + c = connection.execute(s) + cols = [] + while True: + row = c.fetchone() + if row is None: + break + (name, type, nullable, charlen, + numericprec, numericscale, default, collation) = ( + row[columns.c.column_name], + row[columns.c.data_type], + row[columns.c.is_nullable] == 'YES', + row[columns.c.character_maximum_length], + row[columns.c.numeric_precision], + row[columns.c.numeric_scale], + row[columns.c.column_default], + row[columns.c.collation_name] + ) + coltype = self.ischema_names.get(type, None) + + kwargs = {} + if coltype in (MSString, MSChar, MSNVarchar, MSNChar, MSText, + MSNText, MSBinary, MSVarBinary, + sqltypes.LargeBinary): + if charlen == -1: + charlen = None + kwargs['length'] = charlen + if collation: + kwargs['collation'] = collation + + if coltype is None: + util.warn( + "Did not recognize type '%s' of column '%s'" % + (type, name)) + coltype = sqltypes.NULLTYPE + else: + if issubclass(coltype, sqltypes.Numeric) and \ + coltype is not MSReal: + kwargs['scale'] = numericscale + kwargs['precision'] = numericprec + + coltype = coltype(**kwargs) + cdict = { + 'name': name, + 'type': coltype, + 'nullable': nullable, + 'default': default, + 'autoincrement': False, + } + cols.append(cdict) + # autoincrement and identity + colmap = {} + for col in cols: + colmap[col['name']] = col + # We also run an sp_columns to check for identity columns: + cursor = connection.execute("sp_columns @table_name = '%s', " + "@table_owner = '%s'" + % (tablename, owner)) + ic = None + while True: + row = cursor.fetchone() + if row is None: + break + (col_name, type_name) = row[3], row[5] + if type_name.endswith("identity") and col_name in colmap: + ic = col_name + colmap[col_name]['autoincrement'] = True + colmap[col_name]['sequence'] = dict( + name='%s_identity' % col_name) + break + cursor.close() + + if ic is not None and self.server_version_info >= MS_2005_VERSION: + table_fullname = "%s.%s" % (owner, tablename) + cursor = connection.execute( + "select ident_seed('%s'), ident_incr('%s')" + % (table_fullname, table_fullname) + ) + + row = cursor.first() + if row is not None and row[0] is not None: + colmap[ic]['sequence'].update({ + 'start': int(row[0]), + 'increment': int(row[1]) + }) + return cols + + @reflection.cache + @_db_plus_owner + def get_pk_constraint(self, connection, tablename, + dbname, owner, schema, **kw): + pkeys = [] + TC = ischema.constraints + C = ischema.key_constraints.alias('C') + + # Primary key constraints + s = sql.select([C.c.column_name, + TC.c.constraint_type, + C.c.constraint_name], + sql.and_(TC.c.constraint_name == C.c.constraint_name, + TC.c.table_schema == C.c.table_schema, + C.c.table_name == tablename, + C.c.table_schema == owner) + ) + c = connection.execute(s) + constraint_name = None + for row in c: + if 'PRIMARY' in row[TC.c.constraint_type.name]: + pkeys.append(row[0]) + if constraint_name is None: + constraint_name = row[C.c.constraint_name.name] + return {'constrained_columns': pkeys, 'name': constraint_name} + + @reflection.cache + @_db_plus_owner + def get_foreign_keys(self, connection, tablename, + dbname, owner, schema, **kw): + RR = ischema.ref_constraints + C = ischema.key_constraints.alias('C') + R = ischema.key_constraints.alias('R') + + # Foreign key constraints + s = sql.select([C.c.column_name, + R.c.table_schema, R.c.table_name, R.c.column_name, + RR.c.constraint_name, RR.c.match_option, + RR.c.update_rule, + RR.c.delete_rule], + sql.and_(C.c.table_name == tablename, + C.c.table_schema == owner, + C.c.constraint_name == RR.c.constraint_name, + R.c.constraint_name == + RR.c.unique_constraint_name, + C.c.ordinal_position == R.c.ordinal_position + ), + order_by=[RR.c.constraint_name, R.c.ordinal_position] + ) + + # group rows by constraint ID, to handle multi-column FKs + fkeys = [] + fknm, scols, rcols = (None, [], []) + + def fkey_rec(): + return { + 'name': None, + 'constrained_columns': [], + 'referred_schema': None, + 'referred_table': None, + 'referred_columns': [] + } + + fkeys = util.defaultdict(fkey_rec) + + for r in connection.execute(s).fetchall(): + scol, rschema, rtbl, rcol, rfknm, fkmatch, fkuprule, fkdelrule = r + + rec = fkeys[rfknm] + rec['name'] = rfknm + if not rec['referred_table']: + rec['referred_table'] = rtbl + if schema is not None or owner != rschema: + if dbname: + rschema = dbname + "." + rschema + rec['referred_schema'] = rschema + + local_cols, remote_cols = \ + rec['constrained_columns'],\ + rec['referred_columns'] + + local_cols.append(scol) + remote_cols.append(rcol) + + return list(fkeys.values()) diff --git a/app/lib/sqlalchemy/dialects/mssql/information_schema.py b/app/lib/sqlalchemy/dialects/mssql/information_schema.py new file mode 100644 index 0000000..625479b --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mssql/information_schema.py @@ -0,0 +1,136 @@ +# mssql/information_schema.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +# TODO: should be using the sys. catalog with SQL Server, not information +# schema + +from ... import Table, MetaData, Column +from ...types import String, Unicode, UnicodeText, Integer, TypeDecorator +from ... import cast +from ... import util +from ...sql import expression +from ...ext.compiler import compiles + +ischema = MetaData() + + +class CoerceUnicode(TypeDecorator): + impl = Unicode + + def process_bind_param(self, value, dialect): + if util.py2k and isinstance(value, util.binary_type): + value = value.decode(dialect.encoding) + return value + + def bind_expression(self, bindvalue): + return _cast_on_2005(bindvalue) + + +class _cast_on_2005(expression.ColumnElement): + def __init__(self, bindvalue): + self.bindvalue = bindvalue + + +@compiles(_cast_on_2005) +def _compile(element, compiler, **kw): + from . import base + if compiler.dialect.server_version_info < base.MS_2005_VERSION: + return compiler.process(element.bindvalue, **kw) + else: + return compiler.process(cast(element.bindvalue, Unicode), **kw) + +schemata = Table("SCHEMATA", ischema, + Column("CATALOG_NAME", CoerceUnicode, key="catalog_name"), + Column("SCHEMA_NAME", CoerceUnicode, key="schema_name"), + Column("SCHEMA_OWNER", CoerceUnicode, key="schema_owner"), + schema="INFORMATION_SCHEMA") + +tables = Table("TABLES", ischema, + Column("TABLE_CATALOG", CoerceUnicode, key="table_catalog"), + Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"), + Column("TABLE_NAME", CoerceUnicode, key="table_name"), + Column( + "TABLE_TYPE", String(convert_unicode=True), + key="table_type"), + schema="INFORMATION_SCHEMA") + +columns = Table("COLUMNS", ischema, + Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"), + Column("TABLE_NAME", CoerceUnicode, key="table_name"), + Column("COLUMN_NAME", CoerceUnicode, key="column_name"), + Column("IS_NULLABLE", Integer, key="is_nullable"), + Column("DATA_TYPE", String, key="data_type"), + Column("ORDINAL_POSITION", Integer, key="ordinal_position"), + Column("CHARACTER_MAXIMUM_LENGTH", Integer, + key="character_maximum_length"), + Column("NUMERIC_PRECISION", Integer, key="numeric_precision"), + Column("NUMERIC_SCALE", Integer, key="numeric_scale"), + Column("COLUMN_DEFAULT", Integer, key="column_default"), + Column("COLLATION_NAME", String, key="collation_name"), + schema="INFORMATION_SCHEMA") + +constraints = Table("TABLE_CONSTRAINTS", ischema, + Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"), + Column("TABLE_NAME", CoerceUnicode, key="table_name"), + Column("CONSTRAINT_NAME", CoerceUnicode, + key="constraint_name"), + Column("CONSTRAINT_TYPE", String( + convert_unicode=True), key="constraint_type"), + schema="INFORMATION_SCHEMA") + +column_constraints = Table("CONSTRAINT_COLUMN_USAGE", ischema, + Column("TABLE_SCHEMA", CoerceUnicode, + key="table_schema"), + Column("TABLE_NAME", CoerceUnicode, + key="table_name"), + Column("COLUMN_NAME", CoerceUnicode, + key="column_name"), + Column("CONSTRAINT_NAME", CoerceUnicode, + key="constraint_name"), + schema="INFORMATION_SCHEMA") + +key_constraints = Table("KEY_COLUMN_USAGE", ischema, + Column("TABLE_SCHEMA", CoerceUnicode, + key="table_schema"), + Column("TABLE_NAME", CoerceUnicode, + key="table_name"), + Column("COLUMN_NAME", CoerceUnicode, + key="column_name"), + Column("CONSTRAINT_NAME", CoerceUnicode, + key="constraint_name"), + Column("ORDINAL_POSITION", Integer, + key="ordinal_position"), + schema="INFORMATION_SCHEMA") + +ref_constraints = Table("REFERENTIAL_CONSTRAINTS", ischema, + Column("CONSTRAINT_CATALOG", CoerceUnicode, + key="constraint_catalog"), + Column("CONSTRAINT_SCHEMA", CoerceUnicode, + key="constraint_schema"), + Column("CONSTRAINT_NAME", CoerceUnicode, + key="constraint_name"), + # TODO: is CATLOG misspelled ? + Column("UNIQUE_CONSTRAINT_CATLOG", CoerceUnicode, + key="unique_constraint_catalog"), + + Column("UNIQUE_CONSTRAINT_SCHEMA", CoerceUnicode, + key="unique_constraint_schema"), + Column("UNIQUE_CONSTRAINT_NAME", CoerceUnicode, + key="unique_constraint_name"), + Column("MATCH_OPTION", String, key="match_option"), + Column("UPDATE_RULE", String, key="update_rule"), + Column("DELETE_RULE", String, key="delete_rule"), + schema="INFORMATION_SCHEMA") + +views = Table("VIEWS", ischema, + Column("TABLE_CATALOG", CoerceUnicode, key="table_catalog"), + Column("TABLE_SCHEMA", CoerceUnicode, key="table_schema"), + Column("TABLE_NAME", CoerceUnicode, key="table_name"), + Column("VIEW_DEFINITION", CoerceUnicode, key="view_definition"), + Column("CHECK_OPTION", String, key="check_option"), + Column("IS_UPDATABLE", String, key="is_updatable"), + schema="INFORMATION_SCHEMA") diff --git a/app/lib/sqlalchemy/dialects/mssql/mxodbc.py b/app/lib/sqlalchemy/dialects/mssql/mxodbc.py new file mode 100644 index 0000000..41729b7 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mssql/mxodbc.py @@ -0,0 +1,139 @@ +# mssql/mxodbc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: mssql+mxodbc + :name: mxODBC + :dbapi: mxodbc + :connectstring: mssql+mxodbc://:@ + :url: http://www.egenix.com/ + +Execution Modes +--------------- + +mxODBC features two styles of statement execution, using the +``cursor.execute()`` and ``cursor.executedirect()`` methods (the second being +an extension to the DBAPI specification). The former makes use of a particular +API call specific to the SQL Server Native Client ODBC driver known +SQLDescribeParam, while the latter does not. + +mxODBC apparently only makes repeated use of a single prepared statement +when SQLDescribeParam is used. The advantage to prepared statement reuse is +one of performance. The disadvantage is that SQLDescribeParam has a limited +set of scenarios in which bind parameters are understood, including that they +cannot be placed within the argument lists of function calls, anywhere outside +the FROM, or even within subqueries within the FROM clause - making the usage +of bind parameters within SELECT statements impossible for all but the most +simplistic statements. + +For this reason, the mxODBC dialect uses the "native" mode by default only for +INSERT, UPDATE, and DELETE statements, and uses the escaped string mode for +all other statements. + +This behavior can be controlled via +:meth:`~sqlalchemy.sql.expression.Executable.execution_options` using the +``native_odbc_execute`` flag with a value of ``True`` or ``False``, where a +value of ``True`` will unconditionally use native bind parameters and a value +of ``False`` will unconditionally use string-escaped parameters. + +""" + + +from ... import types as sqltypes +from ...connectors.mxodbc import MxODBCConnector +from .pyodbc import MSExecutionContext_pyodbc, _MSNumeric_pyodbc +from .base import (MSDialect, + MSSQLStrictCompiler, + VARBINARY, + _MSDateTime, _MSDate, _MSTime) + + +class _MSNumeric_mxodbc(_MSNumeric_pyodbc): + """Include pyodbc's numeric processor. + """ + + +class _MSDate_mxodbc(_MSDate): + def bind_processor(self, dialect): + def process(value): + if value is not None: + return "%s-%s-%s" % (value.year, value.month, value.day) + else: + return None + return process + + +class _MSTime_mxodbc(_MSTime): + def bind_processor(self, dialect): + def process(value): + if value is not None: + return "%s:%s:%s" % (value.hour, value.minute, value.second) + else: + return None + return process + + +class _VARBINARY_mxodbc(VARBINARY): + + """ + mxODBC Support for VARBINARY column types. + + This handles the special case for null VARBINARY values, + which maps None values to the mx.ODBC.Manager.BinaryNull symbol. + """ + + def bind_processor(self, dialect): + if dialect.dbapi is None: + return None + + DBAPIBinary = dialect.dbapi.Binary + + def process(value): + if value is not None: + return DBAPIBinary(value) + else: + # should pull from mx.ODBC.Manager.BinaryNull + return dialect.dbapi.BinaryNull + return process + + +class MSExecutionContext_mxodbc(MSExecutionContext_pyodbc): + """ + The pyodbc execution context is useful for enabling + SELECT SCOPE_IDENTITY in cases where OUTPUT clause + does not work (tables with insert triggers). + """ + # todo - investigate whether the pyodbc execution context + # is really only being used in cases where OUTPUT + # won't work. + + +class MSDialect_mxodbc(MxODBCConnector, MSDialect): + + # this is only needed if "native ODBC" mode is used, + # which is now disabled by default. + # statement_compiler = MSSQLStrictCompiler + + execution_ctx_cls = MSExecutionContext_mxodbc + + # flag used by _MSNumeric_mxodbc + _need_decimal_fix = True + + colspecs = { + sqltypes.Numeric: _MSNumeric_mxodbc, + sqltypes.DateTime: _MSDateTime, + sqltypes.Date: _MSDate_mxodbc, + sqltypes.Time: _MSTime_mxodbc, + VARBINARY: _VARBINARY_mxodbc, + sqltypes.LargeBinary: _VARBINARY_mxodbc, + } + + def __init__(self, description_encoding=None, **params): + super(MSDialect_mxodbc, self).__init__(**params) + self.description_encoding = description_encoding + +dialect = MSDialect_mxodbc diff --git a/app/lib/sqlalchemy/dialects/mssql/pymssql.py b/app/lib/sqlalchemy/dialects/mssql/pymssql.py new file mode 100644 index 0000000..57ca8ab --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mssql/pymssql.py @@ -0,0 +1,97 @@ +# mssql/pymssql.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: mssql+pymssql + :name: pymssql + :dbapi: pymssql + :connectstring: mssql+pymssql://:@/?\ +charset=utf8 + :url: http://pymssql.org/ + +pymssql is a Python module that provides a Python DBAPI interface around +`FreeTDS `_. Compatible builds are available for +Linux, MacOSX and Windows platforms. + +""" +from .base import MSDialect +from ... import types as sqltypes, util, processors +import re + + +class _MSNumeric_pymssql(sqltypes.Numeric): + def result_processor(self, dialect, type_): + if not self.asdecimal: + return processors.to_float + else: + return sqltypes.Numeric.result_processor(self, dialect, type_) + + +class MSDialect_pymssql(MSDialect): + supports_sane_rowcount = False + driver = 'pymssql' + + colspecs = util.update_copy( + MSDialect.colspecs, + { + sqltypes.Numeric: _MSNumeric_pymssql, + sqltypes.Float: sqltypes.Float, + } + ) + + @classmethod + def dbapi(cls): + module = __import__('pymssql') + # pymmsql < 2.1.1 doesn't have a Binary method. we use string + client_ver = tuple(int(x) for x in module.__version__.split(".")) + if client_ver < (2, 1, 1): + # TODO: monkeypatching here is less than ideal + module.Binary = lambda x: x if hasattr(x, 'decode') else str(x) + + if client_ver < (1, ): + util.warn("The pymssql dialect expects at least " + "the 1.0 series of the pymssql DBAPI.") + return module + + def __init__(self, **params): + super(MSDialect_pymssql, self).__init__(**params) + self.use_scope_identity = True + + def _get_server_version_info(self, connection): + vers = connection.scalar("select @@version") + m = re.match( + r"Microsoft .*? - (\d+).(\d+).(\d+).(\d+)", vers) + if m: + return tuple(int(x) for x in m.group(1, 2, 3, 4)) + else: + return None + + def create_connect_args(self, url): + opts = url.translate_connect_args(username='user') + opts.update(url.query) + port = opts.pop('port', None) + if port and 'host' in opts: + opts['host'] = "%s:%s" % (opts['host'], port) + return [[], opts] + + def is_disconnect(self, e, connection, cursor): + for msg in ( + "Adaptive Server connection timed out", + "Net-Lib error during Connection reset by peer", + "message 20003", # connection timeout + "Error 10054", + "Not connected to any MS SQL server", + "Connection is closed", + "message 20006", # Write to the server failed + "message 20017", # Unexpected EOF from the server + ): + if msg in str(e): + return True + else: + return False + +dialect = MSDialect_pymssql diff --git a/app/lib/sqlalchemy/dialects/mssql/pyodbc.py b/app/lib/sqlalchemy/dialects/mssql/pyodbc.py new file mode 100644 index 0000000..c6368f9 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mssql/pyodbc.py @@ -0,0 +1,292 @@ +# mssql/pyodbc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +r""" +.. dialect:: mssql+pyodbc + :name: PyODBC + :dbapi: pyodbc + :connectstring: mssql+pyodbc://:@ + :url: http://pypi.python.org/pypi/pyodbc/ + +Connecting to PyODBC +-------------------- + +The URL here is to be translated to PyODBC connection strings, as +detailed in `ConnectionStrings `_. + +DSN Connections +^^^^^^^^^^^^^^^ + +A DSN-based connection is **preferred** overall when using ODBC. A +basic DSN-based connection looks like:: + + engine = create_engine("mssql+pyodbc://scott:tiger@some_dsn") + +Which above, will pass the following connection string to PyODBC:: + + dsn=mydsn;UID=user;PWD=pass + +If the username and password are omitted, the DSN form will also add +the ``Trusted_Connection=yes`` directive to the ODBC string. + +Hostname Connections +^^^^^^^^^^^^^^^^^^^^ + +Hostname-based connections are **not preferred**, however are supported. +The ODBC driver name must be explicitly specified:: + + engine = create_engine("mssql+pyodbc://scott:tiger@myhost:port/databasename?driver=SQL+Server+Native+Client+10.0") + +.. versionchanged:: 1.0.0 Hostname-based PyODBC connections now require the + SQL Server driver name specified explicitly. SQLAlchemy cannot + choose an optimal default here as it varies based on platform + and installed drivers. + +Other keywords interpreted by the Pyodbc dialect to be passed to +``pyodbc.connect()`` in both the DSN and hostname cases include: +``odbc_autotranslate``, ``ansi``, ``unicode_results``, ``autocommit``. + +Pass through exact Pyodbc string +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +A PyODBC connection string can also be sent exactly as specified in +`ConnectionStrings `_ +into the driver using the parameter ``odbc_connect``. The delimeters must be URL escaped, however, +as illustrated below using ``urllib.quote_plus``:: + + import urllib + params = urllib.quote_plus("DRIVER={SQL Server Native Client 10.0};SERVER=dagger;DATABASE=test;UID=user;PWD=password") + + engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params) + + +Unicode Binds +------------- + +The current state of PyODBC on a unix backend with FreeTDS and/or +EasySoft is poor regarding unicode; different OS platforms and versions of +UnixODBC versus IODBC versus FreeTDS/EasySoft versus PyODBC itself +dramatically alter how strings are received. The PyODBC dialect attempts to +use all the information it knows to determine whether or not a Python unicode +literal can be passed directly to the PyODBC driver or not; while SQLAlchemy +can encode these to bytestrings first, some users have reported that PyODBC +mis-handles bytestrings for certain encodings and requires a Python unicode +object, while the author has observed widespread cases where a Python unicode +is completely misinterpreted by PyODBC, particularly when dealing with +the information schema tables used in table reflection, and the value +must first be encoded to a bytestring. + +It is for this reason that whether or not unicode literals for bound +parameters be sent to PyODBC can be controlled using the +``supports_unicode_binds`` parameter to ``create_engine()``. When +left at its default of ``None``, the PyODBC dialect will use its +best guess as to whether or not the driver deals with unicode literals +well. When ``False``, unicode literals will be encoded first, and when +``True`` unicode literals will be passed straight through. This is an interim +flag that hopefully should not be needed when the unicode situation stabilizes +for unix + PyODBC. + +.. versionadded:: 0.7.7 + ``supports_unicode_binds`` parameter to ``create_engine()``\ . + +Rowcount Support +---------------- + +Pyodbc only has partial support for rowcount. See the notes at +:ref:`mssql_rowcount_versioning` for important notes when using ORM +versioning. + +""" + +from .base import MSExecutionContext, MSDialect, VARBINARY +from ...connectors.pyodbc import PyODBCConnector +from ... import types as sqltypes, util, exc +import decimal +import re + + +class _ms_numeric_pyodbc(object): + + """Turns Decimals with adjusted() < 0 or > 7 into strings. + + The routines here are needed for older pyodbc versions + as well as current mxODBC versions. + + """ + + def bind_processor(self, dialect): + + super_process = super(_ms_numeric_pyodbc, self).\ + bind_processor(dialect) + + if not dialect._need_decimal_fix: + return super_process + + def process(value): + if self.asdecimal and \ + isinstance(value, decimal.Decimal): + + adjusted = value.adjusted() + if adjusted < 0: + return self._small_dec_to_string(value) + elif adjusted > 7: + return self._large_dec_to_string(value) + + if super_process: + return super_process(value) + else: + return value + return process + + # these routines needed for older versions of pyodbc. + # as of 2.1.8 this logic is integrated. + + def _small_dec_to_string(self, value): + return "%s0.%s%s" % ( + (value < 0 and '-' or ''), + '0' * (abs(value.adjusted()) - 1), + "".join([str(nint) for nint in value.as_tuple()[1]])) + + def _large_dec_to_string(self, value): + _int = value.as_tuple()[1] + if 'E' in str(value): + result = "%s%s%s" % ( + (value < 0 and '-' or ''), + "".join([str(s) for s in _int]), + "0" * (value.adjusted() - (len(_int) - 1))) + else: + if (len(_int) - 1) > value.adjusted(): + result = "%s%s.%s" % ( + (value < 0 and '-' or ''), + "".join( + [str(s) for s in _int][0:value.adjusted() + 1]), + "".join( + [str(s) for s in _int][value.adjusted() + 1:])) + else: + result = "%s%s" % ( + (value < 0 and '-' or ''), + "".join( + [str(s) for s in _int][0:value.adjusted() + 1])) + return result + + +class _MSNumeric_pyodbc(_ms_numeric_pyodbc, sqltypes.Numeric): + pass + + +class _MSFloat_pyodbc(_ms_numeric_pyodbc, sqltypes.Float): + pass + + +class _VARBINARY_pyodbc(VARBINARY): + def bind_processor(self, dialect): + if dialect.dbapi is None: + return None + + DBAPIBinary = dialect.dbapi.Binary + + def process(value): + if value is not None: + return DBAPIBinary(value) + else: + # pyodbc-specific + return dialect.dbapi.BinaryNull + return process + + +class MSExecutionContext_pyodbc(MSExecutionContext): + _embedded_scope_identity = False + + def pre_exec(self): + """where appropriate, issue "select scope_identity()" in the same + statement. + + Background on why "scope_identity()" is preferable to "@@identity": + http://msdn.microsoft.com/en-us/library/ms190315.aspx + + Background on why we attempt to embed "scope_identity()" into the same + statement as the INSERT: + http://code.google.com/p/pyodbc/wiki/FAQs#How_do_I_retrieve_autogenerated/identity_values? + + """ + + super(MSExecutionContext_pyodbc, self).pre_exec() + + # don't embed the scope_identity select into an + # "INSERT .. DEFAULT VALUES" + if self._select_lastrowid and \ + self.dialect.use_scope_identity and \ + len(self.parameters[0]): + self._embedded_scope_identity = True + + self.statement += "; select scope_identity()" + + def post_exec(self): + if self._embedded_scope_identity: + # Fetch the last inserted id from the manipulated statement + # We may have to skip over a number of result sets with + # no data (due to triggers, etc.) + while True: + try: + # fetchall() ensures the cursor is consumed + # without closing it (FreeTDS particularly) + row = self.cursor.fetchall()[0] + break + except self.dialect.dbapi.Error as e: + # no way around this - nextset() consumes the previous set + # so we need to just keep flipping + self.cursor.nextset() + + self._lastrowid = int(row[0]) + else: + super(MSExecutionContext_pyodbc, self).post_exec() + + +class MSDialect_pyodbc(PyODBCConnector, MSDialect): + + execution_ctx_cls = MSExecutionContext_pyodbc + + colspecs = util.update_copy( + MSDialect.colspecs, + { + sqltypes.Numeric: _MSNumeric_pyodbc, + sqltypes.Float: _MSFloat_pyodbc, + VARBINARY: _VARBINARY_pyodbc, + sqltypes.LargeBinary: _VARBINARY_pyodbc, + } + ) + + def __init__(self, description_encoding=None, **params): + if 'description_encoding' in params: + self.description_encoding = params.pop('description_encoding') + super(MSDialect_pyodbc, self).__init__(**params) + self.use_scope_identity = self.use_scope_identity and \ + self.dbapi and \ + hasattr(self.dbapi.Cursor, 'nextset') + self._need_decimal_fix = self.dbapi and \ + self._dbapi_version() < (2, 1, 8) + + def _get_server_version_info(self, connection): + try: + raw = connection.scalar("SELECT SERVERPROPERTY('ProductVersion')") + except exc.DBAPIError: + # SQL Server docs indicate this function isn't present prior to + # 2008; additionally, unknown combinations of pyodbc aren't + # able to run this query. + return super(MSDialect_pyodbc, self).\ + _get_server_version_info(connection) + else: + version = [] + r = re.compile(r'[.\-]') + for n in r.split(raw): + try: + version.append(int(n)) + except ValueError: + version.append(n) + return tuple(version) + +dialect = MSDialect_pyodbc diff --git a/app/lib/sqlalchemy/dialects/mssql/zxjdbc.py b/app/lib/sqlalchemy/dialects/mssql/zxjdbc.py new file mode 100644 index 0000000..eaf5c96 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mssql/zxjdbc.py @@ -0,0 +1,69 @@ +# mssql/zxjdbc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: mssql+zxjdbc + :name: zxJDBC for Jython + :dbapi: zxjdbc + :connectstring: mssql+zxjdbc://user:pass@host:port/dbname\ +[?key=value&key=value...] + :driverurl: http://jtds.sourceforge.net/ + + .. note:: Jython is not supported by current versions of SQLAlchemy. The + zxjdbc dialect should be considered as experimental. + +""" +from ...connectors.zxJDBC import ZxJDBCConnector +from .base import MSDialect, MSExecutionContext +from ... import engine + + +class MSExecutionContext_zxjdbc(MSExecutionContext): + + _embedded_scope_identity = False + + def pre_exec(self): + super(MSExecutionContext_zxjdbc, self).pre_exec() + # scope_identity after the fact returns null in jTDS so we must + # embed it + if self._select_lastrowid and self.dialect.use_scope_identity: + self._embedded_scope_identity = True + self.statement += "; SELECT scope_identity()" + + def post_exec(self): + if self._embedded_scope_identity: + while True: + try: + row = self.cursor.fetchall()[0] + break + except self.dialect.dbapi.Error: + self.cursor.nextset() + self._lastrowid = int(row[0]) + + if (self.isinsert or self.isupdate or self.isdelete) and \ + self.compiled.returning: + self._result_proxy = engine.FullyBufferedResultProxy(self) + + if self._enable_identity_insert: + table = self.dialect.identifier_preparer.format_table( + self.compiled.statement.table) + self.cursor.execute("SET IDENTITY_INSERT %s OFF" % table) + + +class MSDialect_zxjdbc(ZxJDBCConnector, MSDialect): + jdbc_db_name = 'jtds:sqlserver' + jdbc_driver_name = 'net.sourceforge.jtds.jdbc.Driver' + + execution_ctx_cls = MSExecutionContext_zxjdbc + + def _get_server_version_info(self, connection): + return tuple( + int(x) + for x in connection.connection.dbversion.split('.') + ) + +dialect = MSDialect_zxjdbc diff --git a/app/lib/sqlalchemy/dialects/mysql/__init__.py b/app/lib/sqlalchemy/dialects/mysql/__init__.py new file mode 100644 index 0000000..2ff8542 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/__init__.py @@ -0,0 +1,31 @@ +# mysql/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from . import base, mysqldb, oursql, \ + pyodbc, zxjdbc, mysqlconnector, pymysql,\ + gaerdbms, cymysql + +# default dialect +base.dialect = mysqldb.dialect + +from .base import \ + BIGINT, BINARY, BIT, BLOB, BOOLEAN, CHAR, DATE, DATETIME, \ + DECIMAL, DOUBLE, ENUM, DECIMAL,\ + FLOAT, INTEGER, INTEGER, JSON, LONGBLOB, LONGTEXT, MEDIUMBLOB, \ + MEDIUMINT, MEDIUMTEXT, NCHAR, \ + NVARCHAR, NUMERIC, SET, SMALLINT, REAL, TEXT, TIME, TIMESTAMP, \ + TINYBLOB, TINYINT, TINYTEXT,\ + VARBINARY, VARCHAR, YEAR, dialect + +__all__ = ( + 'BIGINT', 'BINARY', 'BIT', 'BLOB', 'BOOLEAN', 'CHAR', 'DATE', 'DATETIME', + 'DECIMAL', 'DOUBLE', 'ENUM', 'DECIMAL', 'FLOAT', 'INTEGER', 'INTEGER', + 'JSON', 'LONGBLOB', 'LONGTEXT', 'MEDIUMBLOB', 'MEDIUMINT', 'MEDIUMTEXT', + 'NCHAR', 'NVARCHAR', 'NUMERIC', 'SET', 'SMALLINT', 'REAL', 'TEXT', 'TIME', + 'TIMESTAMP', 'TINYBLOB', 'TINYINT', 'TINYTEXT', 'VARBINARY', 'VARCHAR', + 'YEAR', 'dialect' +) diff --git a/app/lib/sqlalchemy/dialects/mysql/base.py b/app/lib/sqlalchemy/dialects/mysql/base.py new file mode 100644 index 0000000..822e932 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/base.py @@ -0,0 +1,2056 @@ +# mysql/base.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +r""" + +.. dialect:: mysql + :name: MySQL + +Supported Versions and Features +------------------------------- + +SQLAlchemy supports MySQL starting with version 4.1 through modern releases. +However, no heroic measures are taken to work around major missing +SQL features - if your server version does not support sub-selects, for +example, they won't work in SQLAlchemy either. + +See the official MySQL documentation for detailed information about features +supported in any given server release. + +.. _mysql_connection_timeouts: + +Connection Timeouts +------------------- + +MySQL features an automatic connection close behavior, for connections that +have been idle for eight hours or more. To circumvent having this issue, use +the ``pool_recycle`` option which controls the maximum age of any connection:: + + engine = create_engine('mysql+mysqldb://...', pool_recycle=3600) + +.. seealso:: + + :ref:`pool_setting_recycle` - full description of the pool recycle feature. + + +.. _mysql_storage_engines: + +CREATE TABLE arguments including Storage Engines +------------------------------------------------ + +MySQL's CREATE TABLE syntax includes a wide array of special options, +including ``ENGINE``, ``CHARSET``, ``MAX_ROWS``, ``ROW_FORMAT``, +``INSERT_METHOD``, and many more. +To accommodate the rendering of these arguments, specify the form +``mysql_argument_name="value"``. For example, to specify a table with +``ENGINE`` of ``InnoDB``, ``CHARSET`` of ``utf8``, and ``KEY_BLOCK_SIZE`` +of ``1024``:: + + Table('mytable', metadata, + Column('data', String(32)), + mysql_engine='InnoDB', + mysql_charset='utf8', + mysql_key_block_size="1024" + ) + +The MySQL dialect will normally transfer any keyword specified as +``mysql_keyword_name`` to be rendered as ``KEYWORD_NAME`` in the +``CREATE TABLE`` statement. A handful of these names will render with a space +instead of an underscore; to support this, the MySQL dialect has awareness of +these particular names, which include ``DATA DIRECTORY`` +(e.g. ``mysql_data_directory``), ``CHARACTER SET`` (e.g. +``mysql_character_set``) and ``INDEX DIRECTORY`` (e.g. +``mysql_index_directory``). + +The most common argument is ``mysql_engine``, which refers to the storage +engine for the table. Historically, MySQL server installations would default +to ``MyISAM`` for this value, although newer versions may be defaulting +to ``InnoDB``. The ``InnoDB`` engine is typically preferred for its support +of transactions and foreign keys. + +A :class:`.Table` that is created in a MySQL database with a storage engine +of ``MyISAM`` will be essentially non-transactional, meaning any +INSERT/UPDATE/DELETE statement referring to this table will be invoked as +autocommit. It also will have no support for foreign key constraints; while +the ``CREATE TABLE`` statement accepts foreign key options, when using the +``MyISAM`` storage engine these arguments are discarded. Reflecting such a +table will also produce no foreign key constraint information. + +For fully atomic transactions as well as support for foreign key +constraints, all participating ``CREATE TABLE`` statements must specify a +transactional engine, which in the vast majority of cases is ``InnoDB``. + +.. seealso:: + + `The InnoDB Storage Engine + `_ - + on the MySQL website. + +Case Sensitivity and Table Reflection +------------------------------------- + +MySQL has inconsistent support for case-sensitive identifier +names, basing support on specific details of the underlying +operating system. However, it has been observed that no matter +what case sensitivity behavior is present, the names of tables in +foreign key declarations are *always* received from the database +as all-lower case, making it impossible to accurately reflect a +schema where inter-related tables use mixed-case identifier names. + +Therefore it is strongly advised that table names be declared as +all lower case both within SQLAlchemy as well as on the MySQL +database itself, especially if database reflection features are +to be used. + +.. _mysql_isolation_level: + +Transaction Isolation Level +--------------------------- + +All MySQL dialects support setting of transaction isolation level +both via a dialect-specific parameter :paramref:`.create_engine.isolation_level` +accepted by :func:`.create_engine`, +as well as the :paramref:`.Connection.execution_options.isolation_level` +argument as passed to :meth:`.Connection.execution_options`. +This feature works by issuing the command +``SET SESSION TRANSACTION ISOLATION LEVEL `` for +each new connection. For the special AUTOCOMMIT isolation level, DBAPI-specific +techniques are used. + +To set isolation level using :func:`.create_engine`:: + + engine = create_engine( + "mysql://scott:tiger@localhost/test", + isolation_level="READ UNCOMMITTED" + ) + +To set using per-connection execution options:: + + connection = engine.connect() + connection = connection.execution_options( + isolation_level="READ COMMITTED" + ) + +Valid values for ``isolation_level`` include: + +* ``READ COMMITTED`` +* ``READ UNCOMMITTED`` +* ``REPEATABLE READ`` +* ``SERIALIZABLE`` +* ``AUTOCOMMIT`` + +The special ``AUTOCOMMIT`` value makes use of the various "autocommit" +attributes provided by specific DBAPIs, and is currently supported by +MySQLdb, MySQL-Client, MySQL-Connector Python, and PyMySQL. Using it, +the MySQL connection will return true for the value of +``SELECT @@autocommit;``. + +.. versionadded:: 1.1 - added support for the AUTOCOMMIT isolation level. + +AUTO_INCREMENT Behavior +----------------------- + +When creating tables, SQLAlchemy will automatically set ``AUTO_INCREMENT`` on +the first :class:`.Integer` primary key column which is not marked as a +foreign key:: + + >>> t = Table('mytable', metadata, + ... Column('mytable_id', Integer, primary_key=True) + ... ) + >>> t.create() + CREATE TABLE mytable ( + id INTEGER NOT NULL AUTO_INCREMENT, + PRIMARY KEY (id) + ) + +You can disable this behavior by passing ``False`` to the +:paramref:`~.Column.autoincrement` argument of :class:`.Column`. This flag +can also be used to enable auto-increment on a secondary column in a +multi-column key for some storage engines:: + + Table('mytable', metadata, + Column('gid', Integer, primary_key=True, autoincrement=False), + Column('id', Integer, primary_key=True) + ) + +.. _mysql_ss_cursors: + +Server Side Cursors +------------------- + +Server-side cursor support is available for the MySQLdb and PyMySQL dialects. +From a MySQL point of view this means that the ``MySQLdb.cursors.SSCursor`` or +``pymysql.cursors.SSCursor`` class is used when building up the cursor which +will receive results. The most typical way of invoking this feature is via the +:paramref:`.Connection.execution_options.stream_results` connection execution +option. Server side cursors can also be enabled for all SELECT statements +unconditionally by passing ``server_side_cursors=True`` to +:func:`.create_engine`. + +.. versionadded:: 1.1.4 - added server-side cursor support. + +.. _mysql_unicode: + +Unicode +------- + +Charset Selection +~~~~~~~~~~~~~~~~~ + +Most MySQL DBAPIs offer the option to set the client character set for +a connection. This is typically delivered using the ``charset`` parameter +in the URL, such as:: + + e = create_engine("mysql+pymysql://scott:tiger@localhost/\ +test?charset=utf8") + +This charset is the **client character set** for the connection. Some +MySQL DBAPIs will default this to a value such as ``latin1``, and some +will make use of the ``default-character-set`` setting in the ``my.cnf`` +file as well. Documentation for the DBAPI in use should be consulted +for specific behavior. + +The encoding used for Unicode has traditionally been ``'utf8'``. However, +for MySQL versions 5.5.3 on forward, a new MySQL-specific encoding +``'utf8mb4'`` has been introduced. The rationale for this new encoding +is due to the fact that MySQL's utf-8 encoding only supports +codepoints up to three bytes instead of four. Therefore, +when communicating with a MySQL database +that includes codepoints more than three bytes in size, +this new charset is preferred, if supported by both the database as well +as the client DBAPI, as in:: + + e = create_engine("mysql+pymysql://scott:tiger@localhost/\ +test?charset=utf8mb4") + +At the moment, up-to-date versions of MySQLdb and PyMySQL support the +``utf8mb4`` charset. Other DBAPIs such as MySQL-Connector and OurSQL +may **not** support it as of yet. + +In order to use ``utf8mb4`` encoding, changes to +the MySQL schema and/or server configuration may be required. + +.. seealso:: + + `The utf8mb4 Character Set \ +`_ - \ +in the MySQL documentation + +Unicode Encoding / Decoding +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +All modern MySQL DBAPIs all offer the service of handling the encoding and +decoding of unicode data between the Python application space and the database. +As this was not always the case, SQLAlchemy also includes a comprehensive system +of performing the encode/decode task as well. As only one of these systems +should be in use at at time, SQLAlchemy has long included functionality +to automatically detect upon first connection whether or not the DBAPI is +automatically handling unicode. + +Whether or not the MySQL DBAPI will handle encoding can usually be configured +using a DBAPI flag ``use_unicode``, which is known to be supported at least +by MySQLdb, PyMySQL, and MySQL-Connector. Setting this value to ``0`` +in the "connect args" or query string will have the effect of disabling the +DBAPI's handling of unicode, such that it instead will return data of the +``str`` type or ``bytes`` type, with data in the configured charset:: + + # connect while disabling the DBAPI's unicode encoding/decoding + e = create_engine("mysql+mysqldb://scott:tiger@localhost/test?charset=utf8&use_unicode=0") + +Current recommendations for modern DBAPIs are as follows: + +* It is generally always safe to leave the ``use_unicode`` flag set at + its default; that is, don't use it at all. +* Under Python 3, the ``use_unicode=0`` flag should **never be used**. + SQLAlchemy under Python 3 generally assumes the DBAPI receives and returns + string values as Python 3 strings, which are inherently unicode objects. +* Under Python 2 with MySQLdb, the ``use_unicode=0`` flag will **offer + superior performance**, as MySQLdb's unicode converters under Python 2 only + have been observed to have unusually slow performance compared to SQLAlchemy's + fast C-based encoders/decoders. + +In short: don't specify ``use_unicode`` *at all*, with the possible +exception of ``use_unicode=0`` on MySQLdb with Python 2 **only** for a +potential performance gain. + +Ansi Quoting Style +------------------ + +MySQL features two varieties of identifier "quoting style", one using +backticks and the other using quotes, e.g. ```some_identifier``` vs. +``"some_identifier"``. All MySQL dialects detect which version +is in use by checking the value of ``sql_mode`` when a connection is first +established with a particular :class:`.Engine`. This quoting style comes +into play when rendering table and column names as well as when reflecting +existing database structures. The detection is entirely automatic and +no special configuration is needed to use either quoting style. + +.. versionchanged:: 0.6 detection of ANSI quoting style is entirely automatic, + there's no longer any end-user ``create_engine()`` options in this regard. + +MySQL SQL Extensions +-------------------- + +Many of the MySQL SQL extensions are handled through SQLAlchemy's generic +function and operator support:: + + table.select(table.c.password==func.md5('plaintext')) + table.select(table.c.username.op('regexp')('^[a-d]')) + +And of course any valid MySQL statement can be executed as a string as well. + +Some limited direct support for MySQL extensions to SQL is currently +available. + +* SELECT pragma:: + + select(..., prefixes=['HIGH_PRIORITY', 'SQL_SMALL_RESULT']) + +* UPDATE with LIMIT:: + + update(..., mysql_limit=10) + +rowcount Support +---------------- + +SQLAlchemy standardizes the DBAPI ``cursor.rowcount`` attribute to be the +usual definition of "number of rows matched by an UPDATE or DELETE" statement. +This is in contradiction to the default setting on most MySQL DBAPI drivers, +which is "number of rows actually modified/deleted". For this reason, the +SQLAlchemy MySQL dialects always add the ``constants.CLIENT.FOUND_ROWS`` +flag, or whatever is equivalent for the target dialect, upon connection. +This setting is currently hardcoded. + +.. seealso:: + + :attr:`.ResultProxy.rowcount` + + +CAST Support +------------ + +MySQL documents the CAST operator as available in version 4.0.2. When using +the SQLAlchemy :func:`.cast` function, SQLAlchemy +will not render the CAST token on MySQL before this version, based on server +version detection, instead rendering the internal expression directly. + +CAST may still not be desirable on an early MySQL version post-4.0.2, as it +didn't add all datatype support until 4.1.1. If your application falls into +this narrow area, the behavior of CAST can be controlled using the +:ref:`sqlalchemy.ext.compiler_toplevel` system, as per the recipe below:: + + from sqlalchemy.sql.expression import Cast + from sqlalchemy.ext.compiler import compiles + + @compiles(Cast, 'mysql') + def _check_mysql_version(element, compiler, **kw): + if compiler.dialect.server_version_info < (4, 1, 0): + return compiler.process(element.clause, **kw) + else: + return compiler.visit_cast(element, **kw) + +The above function, which only needs to be declared once +within an application, overrides the compilation of the +:func:`.cast` construct to check for version 4.1.0 before +fully rendering CAST; else the internal element of the +construct is rendered directly. + + +.. _mysql_indexes: + +MySQL Specific Index Options +---------------------------- + +MySQL-specific extensions to the :class:`.Index` construct are available. + +Index Length +~~~~~~~~~~~~~ + +MySQL provides an option to create index entries with a certain length, where +"length" refers to the number of characters or bytes in each value which will +become part of the index. SQLAlchemy provides this feature via the +``mysql_length`` parameter:: + + Index('my_index', my_table.c.data, mysql_length=10) + + Index('a_b_idx', my_table.c.a, my_table.c.b, mysql_length={'a': 4, + 'b': 9}) + +Prefix lengths are given in characters for nonbinary string types and in bytes +for binary string types. The value passed to the keyword argument *must* be +either an integer (and, thus, specify the same prefix length value for all +columns of the index) or a dict in which keys are column names and values are +prefix length values for corresponding columns. MySQL only allows a length for +a column of an index if it is for a CHAR, VARCHAR, TEXT, BINARY, VARBINARY and +BLOB. + +.. versionadded:: 0.8.2 ``mysql_length`` may now be specified as a dictionary + for use with composite indexes. + +Index Prefixes +~~~~~~~~~~~~~~ + +MySQL storage engines permit you to specify an index prefix when creating +an index. SQLAlchemy provides this feature via the +``mysql_prefix`` parameter on :class:`.Index`:: + + Index('my_index', my_table.c.data, mysql_prefix='FULLTEXT') + +The value passed to the keyword argument will be simply passed through to the +underlying CREATE INDEX, so it *must* be a valid index prefix for your MySQL +storage engine. + +.. versionadded:: 1.1.5 + +.. seealso:: + + `CREATE INDEX `_ - MySQL documentation + +Index Types +~~~~~~~~~~~~~ + +Some MySQL storage engines permit you to specify an index type when creating +an index or primary key constraint. SQLAlchemy provides this feature via the +``mysql_using`` parameter on :class:`.Index`:: + + Index('my_index', my_table.c.data, mysql_using='hash') + +As well as the ``mysql_using`` parameter on :class:`.PrimaryKeyConstraint`:: + + PrimaryKeyConstraint("data", mysql_using='hash') + +The value passed to the keyword argument will be simply passed through to the +underlying CREATE INDEX or PRIMARY KEY clause, so it *must* be a valid index +type for your MySQL storage engine. + +More information can be found at: + +http://dev.mysql.com/doc/refman/5.0/en/create-index.html + +http://dev.mysql.com/doc/refman/5.0/en/create-table.html + +.. _mysql_foreign_keys: + +MySQL Foreign Keys +------------------ + +MySQL's behavior regarding foreign keys has some important caveats. + +Foreign Key Arguments to Avoid +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +MySQL does not support the foreign key arguments "DEFERRABLE", "INITIALLY", +or "MATCH". Using the ``deferrable`` or ``initially`` keyword argument with +:class:`.ForeignKeyConstraint` or :class:`.ForeignKey` will have the effect of +these keywords being rendered in a DDL expression, which will then raise an +error on MySQL. In order to use these keywords on a foreign key while having +them ignored on a MySQL backend, use a custom compile rule:: + + from sqlalchemy.ext.compiler import compiles + from sqlalchemy.schema import ForeignKeyConstraint + + @compiles(ForeignKeyConstraint, "mysql") + def process(element, compiler, **kw): + element.deferrable = element.initially = None + return compiler.visit_foreign_key_constraint(element, **kw) + +.. versionchanged:: 0.9.0 - the MySQL backend no longer silently ignores + the ``deferrable`` or ``initially`` keyword arguments of + :class:`.ForeignKeyConstraint` and :class:`.ForeignKey`. + +The "MATCH" keyword is in fact more insidious, and is explicitly disallowed +by SQLAlchemy in conjunction with the MySQL backend. This argument is +silently ignored by MySQL, but in addition has the effect of ON UPDATE and ON +DELETE options also being ignored by the backend. Therefore MATCH should +never be used with the MySQL backend; as is the case with DEFERRABLE and +INITIALLY, custom compilation rules can be used to correct a MySQL +ForeignKeyConstraint at DDL definition time. + +.. versionadded:: 0.9.0 - the MySQL backend will raise a + :class:`.CompileError` when the ``match`` keyword is used with + :class:`.ForeignKeyConstraint` or :class:`.ForeignKey`. + +Reflection of Foreign Key Constraints +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Not all MySQL storage engines support foreign keys. When using the +very common ``MyISAM`` MySQL storage engine, the information loaded by table +reflection will not include foreign keys. For these tables, you may supply a +:class:`~sqlalchemy.ForeignKeyConstraint` at reflection time:: + + Table('mytable', metadata, + ForeignKeyConstraint(['other_id'], ['othertable.other_id']), + autoload=True + ) + +.. seealso:: + + :ref:`mysql_storage_engines` + +.. _mysql_unique_constraints: + +MySQL Unique Constraints and Reflection +--------------------------------------- + +SQLAlchemy supports both the :class:`.Index` construct with the +flag ``unique=True``, indicating a UNIQUE index, as well as the +:class:`.UniqueConstraint` construct, representing a UNIQUE constraint. +Both objects/syntaxes are supported by MySQL when emitting DDL to create +these constraints. However, MySQL does not have a unique constraint +construct that is separate from a unique index; that is, the "UNIQUE" +constraint on MySQL is equivalent to creating a "UNIQUE INDEX". + +When reflecting these constructs, the :meth:`.Inspector.get_indexes` +and the :meth:`.Inspector.get_unique_constraints` methods will **both** +return an entry for a UNIQUE index in MySQL. However, when performing +full table reflection using ``Table(..., autoload=True)``, +the :class:`.UniqueConstraint` construct is +**not** part of the fully reflected :class:`.Table` construct under any +circumstances; this construct is always represented by a :class:`.Index` +with the ``unique=True`` setting present in the :attr:`.Table.indexes` +collection. + + +.. _mysql_timestamp_null: + +TIMESTAMP Columns and NULL +-------------------------- + +MySQL historically enforces that a column which specifies the +TIMESTAMP datatype implicitly includes a default value of +CURRENT_TIMESTAMP, even though this is not stated, and additionally +sets the column as NOT NULL, the opposite behavior vs. that of all +other datatypes:: + + mysql> CREATE TABLE ts_test ( + -> a INTEGER, + -> b INTEGER NOT NULL, + -> c TIMESTAMP, + -> d TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + -> e TIMESTAMP NULL); + Query OK, 0 rows affected (0.03 sec) + + mysql> SHOW CREATE TABLE ts_test; + +---------+----------------------------------------------------- + | Table | Create Table + +---------+----------------------------------------------------- + | ts_test | CREATE TABLE `ts_test` ( + `a` int(11) DEFAULT NULL, + `b` int(11) NOT NULL, + `c` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `e` timestamp NULL DEFAULT NULL + ) ENGINE=MyISAM DEFAULT CHARSET=latin1 + +Above, we see that an INTEGER column defaults to NULL, unless it is specified +with NOT NULL. But when the column is of type TIMESTAMP, an implicit +default of CURRENT_TIMESTAMP is generated which also coerces the column +to be a NOT NULL, even though we did not specify it as such. + +This behavior of MySQL can be changed on the MySQL side using the +`explicit_defaults_for_timestamp +`_ configuration flag introduced in +MySQL 5.6. With this server setting enabled, TIMESTAMP columns behave like +any other datatype on the MySQL side with regards to defaults and nullability. + +However, to accommodate the vast majority of MySQL databases that do not +specify this new flag, SQLAlchemy emits the "NULL" specifier explicitly with +any TIMESTAMP column that does not specify ``nullable=False``. In order +to accommodate newer databases that specify ``explicit_defaults_for_timestamp``, +SQLAlchemy also emits NOT NULL for TIMESTAMP columns that do specify +``nullable=False``. The following example illustrates:: + + from sqlalchemy import MetaData, Integer, Table, Column, text + from sqlalchemy.dialects.mysql import TIMESTAMP + + m = MetaData() + t = Table('ts_test', m, + Column('a', Integer), + Column('b', Integer, nullable=False), + Column('c', TIMESTAMP), + Column('d', TIMESTAMP, nullable=False) + ) + + + from sqlalchemy import create_engine + e = create_engine("mysql://scott:tiger@localhost/test", echo=True) + m.create_all(e) + +output:: + + CREATE TABLE ts_test ( + a INTEGER, + b INTEGER NOT NULL, + c TIMESTAMP NULL, + d TIMESTAMP NOT NULL + ) + +.. versionchanged:: 1.0.0 - SQLAlchemy now renders NULL or NOT NULL in all + cases for TIMESTAMP columns, to accommodate + ``explicit_defaults_for_timestamp``. Prior to this version, it will + not render "NOT NULL" for a TIMESTAMP column that is ``nullable=False``. + +""" + +import re +import sys +import json + +from ... import schema as sa_schema +from ... import exc, log, sql, util +from ...sql import compiler, elements +from array import array as _array + +from ...engine import reflection +from ...engine import default +from ... import types as sqltypes +from ...util import topological +from ...types import DATE, BOOLEAN, \ + BLOB, BINARY, VARBINARY + +from . import reflection as _reflection +from .types import BIGINT, BIT, CHAR, DECIMAL, DATETIME, \ + DOUBLE, FLOAT, INTEGER, LONGBLOB, LONGTEXT, MEDIUMBLOB, MEDIUMINT, \ + MEDIUMTEXT, NCHAR, NUMERIC, NVARCHAR, REAL, SMALLINT, TEXT, TIME, \ + TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, VARCHAR, YEAR +from .types import _StringType, _IntegerType, _NumericType, \ + _FloatType, _MatchType +from .enumerated import ENUM, SET +from .json import JSON, JSONIndexType, JSONPathType + + +RESERVED_WORDS = set( + ['accessible', 'add', 'all', 'alter', 'analyze', 'and', 'as', 'asc', + 'asensitive', 'before', 'between', 'bigint', 'binary', 'blob', 'both', + 'by', 'call', 'cascade', 'case', 'change', 'char', 'character', 'check', + 'collate', 'column', 'condition', 'constraint', 'continue', 'convert', + 'create', 'cross', 'current_date', 'current_time', 'current_timestamp', + 'current_user', 'cursor', 'database', 'databases', 'day_hour', + 'day_microsecond', 'day_minute', 'day_second', 'dec', 'decimal', + 'declare', 'default', 'delayed', 'delete', 'desc', 'describe', + 'deterministic', 'distinct', 'distinctrow', 'div', 'double', 'drop', + 'dual', 'each', 'else', 'elseif', 'enclosed', 'escaped', 'exists', + 'exit', 'explain', 'false', 'fetch', 'float', 'float4', 'float8', + 'for', 'force', 'foreign', 'from', 'fulltext', 'grant', 'group', + 'having', 'high_priority', 'hour_microsecond', 'hour_minute', + 'hour_second', 'if', 'ignore', 'in', 'index', 'infile', 'inner', 'inout', + 'insensitive', 'insert', 'int', 'int1', 'int2', 'int3', 'int4', 'int8', + 'integer', 'interval', 'into', 'is', 'iterate', 'join', 'key', 'keys', + 'kill', 'leading', 'leave', 'left', 'like', 'limit', 'linear', 'lines', + 'load', 'localtime', 'localtimestamp', 'lock', 'long', 'longblob', + 'longtext', 'loop', 'low_priority', 'master_ssl_verify_server_cert', + 'match', 'mediumblob', 'mediumint', 'mediumtext', 'middleint', + 'minute_microsecond', 'minute_second', 'mod', 'modifies', 'natural', + 'not', 'no_write_to_binlog', 'null', 'numeric', 'on', 'optimize', + 'option', 'optionally', 'or', 'order', 'out', 'outer', 'outfile', + 'precision', 'primary', 'procedure', 'purge', 'range', 'read', 'reads', + 'read_only', 'read_write', 'real', 'references', 'regexp', 'release', + 'rename', 'repeat', 'replace', 'require', 'restrict', 'return', + 'revoke', 'right', 'rlike', 'schema', 'schemas', 'second_microsecond', + 'select', 'sensitive', 'separator', 'set', 'show', 'smallint', 'spatial', + 'specific', 'sql', 'sqlexception', 'sqlstate', 'sqlwarning', + 'sql_big_result', 'sql_calc_found_rows', 'sql_small_result', 'ssl', + 'starting', 'straight_join', 'table', 'terminated', 'then', 'tinyblob', + 'tinyint', 'tinytext', 'to', 'trailing', 'trigger', 'true', 'undo', + 'union', 'unique', 'unlock', 'unsigned', 'update', 'usage', 'use', + 'using', 'utc_date', 'utc_time', 'utc_timestamp', 'values', 'varbinary', + 'varchar', 'varcharacter', 'varying', 'when', 'where', 'while', 'with', + + 'write', 'x509', 'xor', 'year_month', 'zerofill', # 5.0 + + 'columns', 'fields', 'privileges', 'soname', 'tables', # 4.1 + + 'accessible', 'linear', 'master_ssl_verify_server_cert', 'range', + 'read_only', 'read_write', # 5.1 + + 'general', 'ignore_server_ids', 'master_heartbeat_period', 'maxvalue', + 'resignal', 'signal', 'slow', # 5.5 + + 'get', 'io_after_gtids', 'io_before_gtids', 'master_bind', 'one_shot', + 'partition', 'sql_after_gtids', 'sql_before_gtids', # 5.6 + + 'generated', 'optimizer_costs', 'stored', 'virtual', # 5.7 + + 'admin', 'except', 'grouping', 'of', 'persist', 'recursive', + 'role', # 8.0 + + ]) + +AUTOCOMMIT_RE = re.compile( + r'\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER|LOAD +DATA|REPLACE)', + re.I | re.UNICODE) +SET_RE = re.compile( + r'\s*SET\s+(?:(?:GLOBAL|SESSION)\s+)?\w', + re.I | re.UNICODE) + + +# old names +MSTime = TIME +MSSet = SET +MSEnum = ENUM +MSLongBlob = LONGBLOB +MSMediumBlob = MEDIUMBLOB +MSTinyBlob = TINYBLOB +MSBlob = BLOB +MSBinary = BINARY +MSVarBinary = VARBINARY +MSNChar = NCHAR +MSNVarChar = NVARCHAR +MSChar = CHAR +MSString = VARCHAR +MSLongText = LONGTEXT +MSMediumText = MEDIUMTEXT +MSTinyText = TINYTEXT +MSText = TEXT +MSYear = YEAR +MSTimeStamp = TIMESTAMP +MSBit = BIT +MSSmallInteger = SMALLINT +MSTinyInteger = TINYINT +MSMediumInteger = MEDIUMINT +MSBigInteger = BIGINT +MSNumeric = NUMERIC +MSDecimal = DECIMAL +MSDouble = DOUBLE +MSReal = REAL +MSFloat = FLOAT +MSInteger = INTEGER + +colspecs = { + _IntegerType: _IntegerType, + _NumericType: _NumericType, + _FloatType: _FloatType, + sqltypes.Numeric: NUMERIC, + sqltypes.Float: FLOAT, + sqltypes.Time: TIME, + sqltypes.Enum: ENUM, + sqltypes.MatchType: _MatchType, + sqltypes.JSON: JSON, + sqltypes.JSON.JSONIndexType: JSONIndexType, + sqltypes.JSON.JSONPathType: JSONPathType + +} + +# Everything 3.23 through 5.1 excepting OpenGIS types. +ischema_names = { + 'bigint': BIGINT, + 'binary': BINARY, + 'bit': BIT, + 'blob': BLOB, + 'boolean': BOOLEAN, + 'char': CHAR, + 'date': DATE, + 'datetime': DATETIME, + 'decimal': DECIMAL, + 'double': DOUBLE, + 'enum': ENUM, + 'fixed': DECIMAL, + 'float': FLOAT, + 'int': INTEGER, + 'integer': INTEGER, + 'json': JSON, + 'longblob': LONGBLOB, + 'longtext': LONGTEXT, + 'mediumblob': MEDIUMBLOB, + 'mediumint': MEDIUMINT, + 'mediumtext': MEDIUMTEXT, + 'nchar': NCHAR, + 'nvarchar': NVARCHAR, + 'numeric': NUMERIC, + 'set': SET, + 'smallint': SMALLINT, + 'text': TEXT, + 'time': TIME, + 'timestamp': TIMESTAMP, + 'tinyblob': TINYBLOB, + 'tinyint': TINYINT, + 'tinytext': TINYTEXT, + 'varbinary': VARBINARY, + 'varchar': VARCHAR, + 'year': YEAR, +} + + +class MySQLExecutionContext(default.DefaultExecutionContext): + + def should_autocommit_text(self, statement): + return AUTOCOMMIT_RE.match(statement) + + def create_server_side_cursor(self): + if self.dialect.supports_server_side_cursors: + return self._dbapi_connection.cursor(self.dialect._sscursor) + else: + raise NotImplementedError() + + +class MySQLCompiler(compiler.SQLCompiler): + + render_table_with_column_in_update_from = True + """Overridden from base SQLCompiler value""" + + extract_map = compiler.SQLCompiler.extract_map.copy() + extract_map.update({'milliseconds': 'millisecond'}) + + def visit_random_func(self, fn, **kw): + return "rand%s" % self.function_argspec(fn) + + def visit_utc_timestamp_func(self, fn, **kw): + return "UTC_TIMESTAMP" + + def visit_sysdate_func(self, fn, **kw): + return "SYSDATE()" + + def visit_json_getitem_op_binary(self, binary, operator, **kw): + return "JSON_EXTRACT(%s, %s)" % ( + self.process(binary.left, **kw), + self.process(binary.right, **kw)) + + def visit_json_path_getitem_op_binary(self, binary, operator, **kw): + return "JSON_EXTRACT(%s, %s)" % ( + self.process(binary.left, **kw), + self.process(binary.right, **kw)) + + def visit_concat_op_binary(self, binary, operator, **kw): + return "concat(%s, %s)" % (self.process(binary.left), + self.process(binary.right)) + + def visit_match_op_binary(self, binary, operator, **kw): + return "MATCH (%s) AGAINST (%s IN BOOLEAN MODE)" % \ + (self.process(binary.left), self.process(binary.right)) + + def get_from_hint_text(self, table, text): + return text + + def visit_typeclause(self, typeclause, type_=None): + if type_ is None: + type_ = typeclause.type.dialect_impl(self.dialect) + if isinstance(type_, sqltypes.TypeDecorator): + return self.visit_typeclause(typeclause, type_.impl) + elif isinstance(type_, sqltypes.Integer): + if getattr(type_, 'unsigned', False): + return 'UNSIGNED INTEGER' + else: + return 'SIGNED INTEGER' + elif isinstance(type_, sqltypes.TIMESTAMP): + return 'DATETIME' + elif isinstance(type_, (sqltypes.DECIMAL, sqltypes.DateTime, + sqltypes.Date, sqltypes.Time)): + return self.dialect.type_compiler.process(type_) + elif isinstance(type_, sqltypes.String) \ + and not isinstance(type_, (ENUM, SET)): + adapted = CHAR._adapt_string_for_cast(type_) + return self.dialect.type_compiler.process(adapted) + elif isinstance(type_, sqltypes._Binary): + return 'BINARY' + elif isinstance(type_, sqltypes.JSON): + return "JSON" + elif isinstance(type_, sqltypes.NUMERIC): + return self.dialect.type_compiler.process( + type_).replace('NUMERIC', 'DECIMAL') + else: + return None + + def visit_cast(self, cast, **kw): + # No cast until 4, no decimals until 5. + if not self.dialect._supports_cast: + util.warn( + "Current MySQL version does not support " + "CAST; the CAST will be skipped.") + return self.process(cast.clause.self_group(), **kw) + + type_ = self.process(cast.typeclause) + if type_ is None: + util.warn( + "Datatype %s does not support CAST on MySQL; " + "the CAST will be skipped." % + self.dialect.type_compiler.process(cast.typeclause.type)) + return self.process(cast.clause.self_group(), **kw) + + return 'CAST(%s AS %s)' % (self.process(cast.clause, **kw), type_) + + def render_literal_value(self, value, type_): + value = super(MySQLCompiler, self).render_literal_value(value, type_) + if self.dialect._backslash_escapes: + value = value.replace('\\', '\\\\') + return value + + # override native_boolean=False behavior here, as + # MySQL still supports native boolean + def visit_true(self, element, **kw): + return "true" + + def visit_false(self, element, **kw): + return "false" + + def get_select_precolumns(self, select, **kw): + """Add special MySQL keywords in place of DISTINCT. + + .. note:: + + this usage is deprecated. :meth:`.Select.prefix_with` + should be used for special keywords at the start + of a SELECT. + + """ + if isinstance(select._distinct, util.string_types): + return select._distinct.upper() + " " + elif select._distinct: + return "DISTINCT " + else: + return "" + + def visit_join(self, join, asfrom=False, **kwargs): + if join.full: + join_type = " FULL OUTER JOIN " + elif join.isouter: + join_type = " LEFT OUTER JOIN " + else: + join_type = " INNER JOIN " + + return ''.join( + (self.process(join.left, asfrom=True, **kwargs), + join_type, + self.process(join.right, asfrom=True, **kwargs), + " ON ", + self.process(join.onclause, **kwargs))) + + def for_update_clause(self, select, **kw): + if select._for_update_arg.read: + return " LOCK IN SHARE MODE" + else: + return " FOR UPDATE" + + def limit_clause(self, select, **kw): + # MySQL supports: + # LIMIT + # LIMIT , + # and in server versions > 3.3: + # LIMIT OFFSET + # The latter is more readable for offsets but we're stuck with the + # former until we can refine dialects by server revision. + + limit_clause, offset_clause = select._limit_clause, \ + select._offset_clause + + if limit_clause is None and offset_clause is None: + return '' + elif offset_clause is not None: + # As suggested by the MySQL docs, need to apply an + # artificial limit if one wasn't provided + # http://dev.mysql.com/doc/refman/5.0/en/select.html + if limit_clause is None: + # hardwire the upper limit. Currently + # needed by OurSQL with Python 3 + # (https://bugs.launchpad.net/oursql/+bug/686232), + # but also is consistent with the usage of the upper + # bound as part of MySQL's "syntax" for OFFSET with + # no LIMIT + return ' \n LIMIT %s, %s' % ( + self.process(offset_clause, **kw), + "18446744073709551615") + else: + return ' \n LIMIT %s, %s' % ( + self.process(offset_clause, **kw), + self.process(limit_clause, **kw)) + else: + # No offset provided, so just use the limit + return ' \n LIMIT %s' % (self.process(limit_clause, **kw),) + + def update_limit_clause(self, update_stmt): + limit = update_stmt.kwargs.get('%s_limit' % self.dialect.name, None) + if limit: + return "LIMIT %s" % limit + else: + return None + + def update_tables_clause(self, update_stmt, from_table, + extra_froms, **kw): + return ', '.join(t._compiler_dispatch(self, asfrom=True, **kw) + for t in [from_table] + list(extra_froms)) + + def update_from_clause(self, update_stmt, from_table, + extra_froms, from_hints, **kw): + return None + + +class MySQLDDLCompiler(compiler.DDLCompiler): + def get_column_specification(self, column, **kw): + """Builds column DDL.""" + + colspec = [ + self.preparer.format_column(column), + self.dialect.type_compiler.process( + column.type, type_expression=column) + ] + + is_timestamp = isinstance(column.type, sqltypes.TIMESTAMP) + + if not column.nullable: + colspec.append('NOT NULL') + + # see: http://docs.sqlalchemy.org/en/latest/dialects/ + # mysql.html#mysql_timestamp_null + elif column.nullable and is_timestamp: + colspec.append('NULL') + + default = self.get_column_default_string(column) + if default is not None: + colspec.append('DEFAULT ' + default) + + if column.table is not None \ + and column is column.table._autoincrement_column and \ + column.server_default is None: + colspec.append('AUTO_INCREMENT') + + return ' '.join(colspec) + + def post_create_table(self, table): + """Build table-level CREATE options like ENGINE and COLLATE.""" + + table_opts = [] + + opts = dict( + ( + k[len(self.dialect.name) + 1:].upper(), + v + ) + for k, v in table.kwargs.items() + if k.startswith('%s_' % self.dialect.name) + ) + + for opt in topological.sort([ + ('DEFAULT_CHARSET', 'COLLATE'), + ('DEFAULT_CHARACTER_SET', 'COLLATE'), + ('PARTITION_BY', 'PARTITIONS'), # only for test consistency + ], opts): + arg = opts[opt] + if opt in _reflection._options_of_type_string: + arg = "'%s'" % arg.replace("\\", "\\\\").replace("'", "''") + + if opt in ('DATA_DIRECTORY', 'INDEX_DIRECTORY', + 'DEFAULT_CHARACTER_SET', 'CHARACTER_SET', + 'DEFAULT_CHARSET', + 'DEFAULT_COLLATE', 'PARTITION_BY'): + opt = opt.replace('_', ' ') + + joiner = '=' + if opt in ('TABLESPACE', 'DEFAULT CHARACTER SET', + 'CHARACTER SET', 'COLLATE', + 'PARTITION BY', 'PARTITIONS'): + joiner = ' ' + + table_opts.append(joiner.join((opt, arg))) + return ' '.join(table_opts) + + def visit_create_index(self, create): + index = create.element + self._verify_index_table(index) + preparer = self.preparer + table = preparer.format_table(index.table) + columns = [self.sql_compiler.process(expr, include_table=False, + literal_binds=True) + for expr in index.expressions] + + name = self._prepared_index_name(index) + + text = "CREATE " + if index.unique: + text += "UNIQUE " + + index_prefix = index.kwargs.get('mysql_prefix', None) + if index_prefix: + text += index_prefix + ' ' + + text += "INDEX %s ON %s " % (name, table) + + length = index.dialect_options['mysql']['length'] + if length is not None: + + if isinstance(length, dict): + # length value can be a (column_name --> integer value) + # mapping specifying the prefix length for each column of the + # index + columns = ', '.join( + '%s(%d)' % (expr, length[col.name]) if col.name in length + else + ( + '%s(%d)' % (expr, length[expr]) if expr in length + else '%s' % expr + ) + for col, expr in zip(index.expressions, columns) + ) + else: + # or can be an integer value specifying the same + # prefix length for all columns of the index + columns = ', '.join( + '%s(%d)' % (col, length) + for col in columns + ) + else: + columns = ', '.join(columns) + text += '(%s)' % columns + + using = index.dialect_options['mysql']['using'] + if using is not None: + text += " USING %s" % (preparer.quote(using)) + + return text + + def visit_primary_key_constraint(self, constraint): + text = super(MySQLDDLCompiler, self).\ + visit_primary_key_constraint(constraint) + using = constraint.dialect_options['mysql']['using'] + if using: + text += " USING %s" % (self.preparer.quote(using)) + return text + + def visit_drop_index(self, drop): + index = drop.element + + return "\nDROP INDEX %s ON %s" % ( + self._prepared_index_name(index, + include_schema=False), + self.preparer.format_table(index.table)) + + def visit_drop_constraint(self, drop): + constraint = drop.element + if isinstance(constraint, sa_schema.ForeignKeyConstraint): + qual = "FOREIGN KEY " + const = self.preparer.format_constraint(constraint) + elif isinstance(constraint, sa_schema.PrimaryKeyConstraint): + qual = "PRIMARY KEY " + const = "" + elif isinstance(constraint, sa_schema.UniqueConstraint): + qual = "INDEX " + const = self.preparer.format_constraint(constraint) + else: + qual = "" + const = self.preparer.format_constraint(constraint) + return "ALTER TABLE %s DROP %s%s" % \ + (self.preparer.format_table(constraint.table), + qual, const) + + def define_constraint_match(self, constraint): + if constraint.match is not None: + raise exc.CompileError( + "MySQL ignores the 'MATCH' keyword while at the same time " + "causes ON UPDATE/ON DELETE clauses to be ignored.") + return "" + + +class MySQLTypeCompiler(compiler.GenericTypeCompiler): + def _extend_numeric(self, type_, spec): + "Extend a numeric-type declaration with MySQL specific extensions." + + if not self._mysql_type(type_): + return spec + + if type_.unsigned: + spec += ' UNSIGNED' + if type_.zerofill: + spec += ' ZEROFILL' + return spec + + def _extend_string(self, type_, defaults, spec): + """Extend a string-type declaration with standard SQL CHARACTER SET / + COLLATE annotations and MySQL specific extensions. + + """ + + def attr(name): + return getattr(type_, name, defaults.get(name)) + + if attr('charset'): + charset = 'CHARACTER SET %s' % attr('charset') + elif attr('ascii'): + charset = 'ASCII' + elif attr('unicode'): + charset = 'UNICODE' + else: + charset = None + + if attr('collation'): + collation = 'COLLATE %s' % type_.collation + elif attr('binary'): + collation = 'BINARY' + else: + collation = None + + if attr('national'): + # NATIONAL (aka NCHAR/NVARCHAR) trumps charsets. + return ' '.join([c for c in ('NATIONAL', spec, collation) + if c is not None]) + return ' '.join([c for c in (spec, charset, collation) + if c is not None]) + + def _mysql_type(self, type_): + return isinstance(type_, (_StringType, _NumericType)) + + def visit_NUMERIC(self, type_, **kw): + if type_.precision is None: + return self._extend_numeric(type_, "NUMERIC") + elif type_.scale is None: + return self._extend_numeric(type_, + "NUMERIC(%(precision)s)" % + {'precision': type_.precision}) + else: + return self._extend_numeric(type_, + "NUMERIC(%(precision)s, %(scale)s)" % + {'precision': type_.precision, + 'scale': type_.scale}) + + def visit_DECIMAL(self, type_, **kw): + if type_.precision is None: + return self._extend_numeric(type_, "DECIMAL") + elif type_.scale is None: + return self._extend_numeric(type_, + "DECIMAL(%(precision)s)" % + {'precision': type_.precision}) + else: + return self._extend_numeric(type_, + "DECIMAL(%(precision)s, %(scale)s)" % + {'precision': type_.precision, + 'scale': type_.scale}) + + def visit_DOUBLE(self, type_, **kw): + if type_.precision is not None and type_.scale is not None: + return self._extend_numeric(type_, + "DOUBLE(%(precision)s, %(scale)s)" % + {'precision': type_.precision, + 'scale': type_.scale}) + else: + return self._extend_numeric(type_, 'DOUBLE') + + def visit_REAL(self, type_, **kw): + if type_.precision is not None and type_.scale is not None: + return self._extend_numeric(type_, + "REAL(%(precision)s, %(scale)s)" % + {'precision': type_.precision, + 'scale': type_.scale}) + else: + return self._extend_numeric(type_, 'REAL') + + def visit_FLOAT(self, type_, **kw): + if self._mysql_type(type_) and \ + type_.scale is not None and \ + type_.precision is not None: + return self._extend_numeric( + type_, "FLOAT(%s, %s)" % (type_.precision, type_.scale)) + elif type_.precision is not None: + return self._extend_numeric(type_, + "FLOAT(%s)" % (type_.precision,)) + else: + return self._extend_numeric(type_, "FLOAT") + + def visit_INTEGER(self, type_, **kw): + if self._mysql_type(type_) and type_.display_width is not None: + return self._extend_numeric( + type_, "INTEGER(%(display_width)s)" % + {'display_width': type_.display_width}) + else: + return self._extend_numeric(type_, "INTEGER") + + def visit_BIGINT(self, type_, **kw): + if self._mysql_type(type_) and type_.display_width is not None: + return self._extend_numeric( + type_, "BIGINT(%(display_width)s)" % + {'display_width': type_.display_width}) + else: + return self._extend_numeric(type_, "BIGINT") + + def visit_MEDIUMINT(self, type_, **kw): + if self._mysql_type(type_) and type_.display_width is not None: + return self._extend_numeric( + type_, "MEDIUMINT(%(display_width)s)" % + {'display_width': type_.display_width}) + else: + return self._extend_numeric(type_, "MEDIUMINT") + + def visit_TINYINT(self, type_, **kw): + if self._mysql_type(type_) and type_.display_width is not None: + return self._extend_numeric(type_, + "TINYINT(%s)" % type_.display_width) + else: + return self._extend_numeric(type_, "TINYINT") + + def visit_SMALLINT(self, type_, **kw): + if self._mysql_type(type_) and type_.display_width is not None: + return self._extend_numeric(type_, + "SMALLINT(%(display_width)s)" % + {'display_width': type_.display_width} + ) + else: + return self._extend_numeric(type_, "SMALLINT") + + def visit_BIT(self, type_, **kw): + if type_.length is not None: + return "BIT(%s)" % type_.length + else: + return "BIT" + + def visit_DATETIME(self, type_, **kw): + if getattr(type_, 'fsp', None): + return "DATETIME(%d)" % type_.fsp + else: + return "DATETIME" + + def visit_DATE(self, type_, **kw): + return "DATE" + + def visit_TIME(self, type_, **kw): + if getattr(type_, 'fsp', None): + return "TIME(%d)" % type_.fsp + else: + return "TIME" + + def visit_TIMESTAMP(self, type_, **kw): + if getattr(type_, 'fsp', None): + return "TIMESTAMP(%d)" % type_.fsp + else: + return "TIMESTAMP" + + def visit_YEAR(self, type_, **kw): + if type_.display_width is None: + return "YEAR" + else: + return "YEAR(%s)" % type_.display_width + + def visit_TEXT(self, type_, **kw): + if type_.length: + return self._extend_string(type_, {}, "TEXT(%d)" % type_.length) + else: + return self._extend_string(type_, {}, "TEXT") + + def visit_TINYTEXT(self, type_, **kw): + return self._extend_string(type_, {}, "TINYTEXT") + + def visit_MEDIUMTEXT(self, type_, **kw): + return self._extend_string(type_, {}, "MEDIUMTEXT") + + def visit_LONGTEXT(self, type_, **kw): + return self._extend_string(type_, {}, "LONGTEXT") + + def visit_VARCHAR(self, type_, **kw): + if type_.length: + return self._extend_string( + type_, {}, "VARCHAR(%d)" % type_.length) + else: + raise exc.CompileError( + "VARCHAR requires a length on dialect %s" % + self.dialect.name) + + def visit_CHAR(self, type_, **kw): + if type_.length: + return self._extend_string(type_, {}, "CHAR(%(length)s)" % + {'length': type_.length}) + else: + return self._extend_string(type_, {}, "CHAR") + + def visit_NVARCHAR(self, type_, **kw): + # We'll actually generate the equiv. "NATIONAL VARCHAR" instead + # of "NVARCHAR". + if type_.length: + return self._extend_string( + type_, {'national': True}, + "VARCHAR(%(length)s)" % {'length': type_.length}) + else: + raise exc.CompileError( + "NVARCHAR requires a length on dialect %s" % + self.dialect.name) + + def visit_NCHAR(self, type_, **kw): + # We'll actually generate the equiv. + # "NATIONAL CHAR" instead of "NCHAR". + if type_.length: + return self._extend_string( + type_, {'national': True}, + "CHAR(%(length)s)" % {'length': type_.length}) + else: + return self._extend_string(type_, {'national': True}, "CHAR") + + def visit_VARBINARY(self, type_, **kw): + return "VARBINARY(%d)" % type_.length + + def visit_JSON(self, type_, **kw): + return "JSON" + + def visit_large_binary(self, type_, **kw): + return self.visit_BLOB(type_) + + def visit_enum(self, type_, **kw): + if not type_.native_enum: + return super(MySQLTypeCompiler, self).visit_enum(type_) + else: + return self._visit_enumerated_values("ENUM", type_, type_.enums) + + def visit_BLOB(self, type_, **kw): + if type_.length: + return "BLOB(%d)" % type_.length + else: + return "BLOB" + + def visit_TINYBLOB(self, type_, **kw): + return "TINYBLOB" + + def visit_MEDIUMBLOB(self, type_, **kw): + return "MEDIUMBLOB" + + def visit_LONGBLOB(self, type_, **kw): + return "LONGBLOB" + + def _visit_enumerated_values(self, name, type_, enumerated_values): + quoted_enums = [] + for e in enumerated_values: + quoted_enums.append("'%s'" % e.replace("'", "''")) + return self._extend_string(type_, {}, "%s(%s)" % ( + name, ",".join(quoted_enums)) + ) + + def visit_ENUM(self, type_, **kw): + return self._visit_enumerated_values("ENUM", type_, + type_._enumerated_values) + + def visit_SET(self, type_, **kw): + return self._visit_enumerated_values("SET", type_, + type_._enumerated_values) + + def visit_BOOLEAN(self, type, **kw): + return "BOOL" + + +class MySQLIdentifierPreparer(compiler.IdentifierPreparer): + + reserved_words = RESERVED_WORDS + + def __init__(self, dialect, server_ansiquotes=False, **kw): + if not server_ansiquotes: + quote = "`" + else: + quote = '"' + + super(MySQLIdentifierPreparer, self).__init__( + dialect, + initial_quote=quote, + escape_quote=quote) + + def _quote_free_identifiers(self, *ids): + """Unilaterally identifier-quote any number of strings.""" + + return tuple([self.quote_identifier(i) for i in ids if i is not None]) + + +@log.class_logger +class MySQLDialect(default.DefaultDialect): + """Details of the MySQL dialect. + Not used directly in application code. + """ + + name = 'mysql' + supports_alter = True + + # MySQL has no true "boolean" type; we + # allow for the "true" and "false" keywords, however + supports_native_boolean = False + + # identifiers are 64, however aliases can be 255... + max_identifier_length = 255 + max_index_name_length = 64 + + supports_native_enum = True + + supports_sane_rowcount = True + supports_sane_multi_rowcount = False + supports_multivalues_insert = True + + default_paramstyle = 'format' + colspecs = colspecs + + statement_compiler = MySQLCompiler + ddl_compiler = MySQLDDLCompiler + type_compiler = MySQLTypeCompiler + ischema_names = ischema_names + preparer = MySQLIdentifierPreparer + + # default SQL compilation settings - + # these are modified upon initialize(), + # i.e. first connect + _backslash_escapes = True + _server_ansiquotes = False + + construct_arguments = [ + (sa_schema.Table, { + "*": None + }), + (sql.Update, { + "limit": None + }), + (sa_schema.PrimaryKeyConstraint, { + "using": None + }), + (sa_schema.Index, { + "using": None, + "length": None, + "prefix": None, + }) + ] + + def __init__(self, isolation_level=None, json_serializer=None, + json_deserializer=None, **kwargs): + kwargs.pop('use_ansiquotes', None) # legacy + default.DefaultDialect.__init__(self, **kwargs) + self.isolation_level = isolation_level + self._json_serializer = json_serializer + self._json_deserializer = json_deserializer + + def on_connect(self): + if self.isolation_level is not None: + def connect(conn): + self.set_isolation_level(conn, self.isolation_level) + return connect + else: + return None + + _isolation_lookup = set(['SERIALIZABLE', 'READ UNCOMMITTED', + 'READ COMMITTED', 'REPEATABLE READ']) + + def set_isolation_level(self, connection, level): + level = level.replace('_', ' ') + + # adjust for ConnectionFairy being present + # allows attribute set e.g. "connection.autocommit = True" + # to work properly + if hasattr(connection, 'connection'): + connection = connection.connection + + self._set_isolation_level(connection, level) + + def _set_isolation_level(self, connection, level): + if level not in self._isolation_lookup: + raise exc.ArgumentError( + "Invalid value '%s' for isolation_level. " + "Valid isolation levels for %s are %s" % + (level, self.name, ", ".join(self._isolation_lookup)) + ) + cursor = connection.cursor() + cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL %s" % level) + cursor.execute("COMMIT") + cursor.close() + + def get_isolation_level(self, connection): + cursor = connection.cursor() + cursor.execute('SELECT @@tx_isolation') + val = cursor.fetchone()[0] + cursor.close() + if util.py3k and isinstance(val, bytes): + val = val.decode() + return val.upper().replace("-", " ") + + def do_commit(self, dbapi_connection): + """Execute a COMMIT.""" + + # COMMIT/ROLLBACK were introduced in 3.23.15. + # Yes, we have at least one user who has to talk to these old + # versions! + # + # Ignore commit/rollback if support isn't present, otherwise even + # basic operations via autocommit fail. + try: + dbapi_connection.commit() + except Exception: + if self.server_version_info < (3, 23, 15): + args = sys.exc_info()[1].args + if args and args[0] == 1064: + return + raise + + def do_rollback(self, dbapi_connection): + """Execute a ROLLBACK.""" + + try: + dbapi_connection.rollback() + except Exception: + if self.server_version_info < (3, 23, 15): + args = sys.exc_info()[1].args + if args and args[0] == 1064: + return + raise + + def do_begin_twophase(self, connection, xid): + connection.execute(sql.text("XA BEGIN :xid"), xid=xid) + + def do_prepare_twophase(self, connection, xid): + connection.execute(sql.text("XA END :xid"), xid=xid) + connection.execute(sql.text("XA PREPARE :xid"), xid=xid) + + def do_rollback_twophase(self, connection, xid, is_prepared=True, + recover=False): + if not is_prepared: + connection.execute(sql.text("XA END :xid"), xid=xid) + connection.execute(sql.text("XA ROLLBACK :xid"), xid=xid) + + def do_commit_twophase(self, connection, xid, is_prepared=True, + recover=False): + if not is_prepared: + self.do_prepare_twophase(connection, xid) + connection.execute(sql.text("XA COMMIT :xid"), xid=xid) + + def do_recover_twophase(self, connection): + resultset = connection.execute("XA RECOVER") + return [row['data'][0:row['gtrid_length']] for row in resultset] + + def is_disconnect(self, e, connection, cursor): + if isinstance(e, (self.dbapi.OperationalError, + self.dbapi.ProgrammingError)): + return self._extract_error_code(e) in \ + (2006, 2013, 2014, 2045, 2055) + elif isinstance(e, self.dbapi.InterfaceError): + # if underlying connection is closed, + # this is the error you get + return "(0, '')" in str(e) + else: + return False + + def _compat_fetchall(self, rp, charset=None): + """Proxy result rows to smooth over MySQL-Python driver + inconsistencies.""" + + return [_DecodingRowProxy(row, charset) for row in rp.fetchall()] + + def _compat_fetchone(self, rp, charset=None): + """Proxy a result row to smooth over MySQL-Python driver + inconsistencies.""" + + return _DecodingRowProxy(rp.fetchone(), charset) + + def _compat_first(self, rp, charset=None): + """Proxy a result row to smooth over MySQL-Python driver + inconsistencies.""" + + return _DecodingRowProxy(rp.first(), charset) + + def _extract_error_code(self, exception): + raise NotImplementedError() + + def _get_default_schema_name(self, connection): + return connection.execute('SELECT DATABASE()').scalar() + + def has_table(self, connection, table_name, schema=None): + # SHOW TABLE STATUS LIKE and SHOW TABLES LIKE do not function properly + # on macosx (and maybe win?) with multibyte table names. + # + # TODO: if this is not a problem on win, make the strategy swappable + # based on platform. DESCRIBE is slower. + + # [ticket:726] + # full_name = self.identifier_preparer.format_table(table, + # use_schema=True) + + full_name = '.'.join(self.identifier_preparer._quote_free_identifiers( + schema, table_name)) + + st = "DESCRIBE %s" % full_name + rs = None + try: + try: + rs = connection.execution_options( + skip_user_error_events=True).execute(st) + have = rs.fetchone() is not None + rs.close() + return have + except exc.DBAPIError as e: + if self._extract_error_code(e.orig) == 1146: + return False + raise + finally: + if rs: + rs.close() + + def initialize(self, connection): + self._connection_charset = self._detect_charset(connection) + self._detect_ansiquotes(connection) + if self._server_ansiquotes: + # if ansiquotes == True, build a new IdentifierPreparer + # with the new setting + self.identifier_preparer = self.preparer( + self, server_ansiquotes=self._server_ansiquotes) + + default.DefaultDialect.initialize(self, connection) + + @property + def _is_mariadb(self): + return 'MariaDB' in self.server_version_info + + @property + def _supports_cast(self): + return self.server_version_info is None or \ + self.server_version_info >= (4, 0, 2) + + @reflection.cache + def get_schema_names(self, connection, **kw): + rp = connection.execute("SHOW schemas") + return [r[0] for r in rp] + + @reflection.cache + def get_table_names(self, connection, schema=None, **kw): + """Return a Unicode SHOW TABLES from a given schema.""" + if schema is not None: + current_schema = schema + else: + current_schema = self.default_schema_name + + charset = self._connection_charset + if self.server_version_info < (5, 0, 2): + rp = connection.execute( + "SHOW TABLES FROM %s" % + self.identifier_preparer.quote_identifier(current_schema)) + return [row[0] for + row in self._compat_fetchall(rp, charset=charset)] + else: + rp = connection.execute( + "SHOW FULL TABLES FROM %s" % + self.identifier_preparer.quote_identifier(current_schema)) + + return [row[0] + for row in self._compat_fetchall(rp, charset=charset) + if row[1] == 'BASE TABLE'] + + @reflection.cache + def get_view_names(self, connection, schema=None, **kw): + if self.server_version_info < (5, 0, 2): + raise NotImplementedError + if schema is None: + schema = self.default_schema_name + if self.server_version_info < (5, 0, 2): + return self.get_table_names(connection, schema) + charset = self._connection_charset + rp = connection.execute( + "SHOW FULL TABLES FROM %s" % + self.identifier_preparer.quote_identifier(schema)) + return [row[0] + for row in self._compat_fetchall(rp, charset=charset) + if row[1] in ('VIEW', 'SYSTEM VIEW')] + + @reflection.cache + def get_table_options(self, connection, table_name, schema=None, **kw): + + parsed_state = self._parsed_state_or_create( + connection, table_name, schema, **kw) + return parsed_state.table_options + + @reflection.cache + def get_columns(self, connection, table_name, schema=None, **kw): + parsed_state = self._parsed_state_or_create( + connection, table_name, schema, **kw) + return parsed_state.columns + + @reflection.cache + def get_pk_constraint(self, connection, table_name, schema=None, **kw): + parsed_state = self._parsed_state_or_create( + connection, table_name, schema, **kw) + for key in parsed_state.keys: + if key['type'] == 'PRIMARY': + # There can be only one. + cols = [s[0] for s in key['columns']] + return {'constrained_columns': cols, 'name': None} + return {'constrained_columns': [], 'name': None} + + @reflection.cache + def get_foreign_keys(self, connection, table_name, schema=None, **kw): + + parsed_state = self._parsed_state_or_create( + connection, table_name, schema, **kw) + default_schema = None + + fkeys = [] + + for spec in parsed_state.constraints: + # only FOREIGN KEYs + ref_name = spec['table'][-1] + ref_schema = len(spec['table']) > 1 and \ + spec['table'][-2] or schema + + if not ref_schema: + if default_schema is None: + default_schema = \ + connection.dialect.default_schema_name + if schema == default_schema: + ref_schema = schema + + loc_names = spec['local'] + ref_names = spec['foreign'] + + con_kw = {} + for opt in ('onupdate', 'ondelete'): + if spec.get(opt, False): + con_kw[opt] = spec[opt] + + fkey_d = { + 'name': spec['name'], + 'constrained_columns': loc_names, + 'referred_schema': ref_schema, + 'referred_table': ref_name, + 'referred_columns': ref_names, + 'options': con_kw + } + fkeys.append(fkey_d) + return fkeys + + @reflection.cache + def get_indexes(self, connection, table_name, schema=None, **kw): + + parsed_state = self._parsed_state_or_create( + connection, table_name, schema, **kw) + + indexes = [] + for spec in parsed_state.keys: + unique = False + flavor = spec['type'] + if flavor == 'PRIMARY': + continue + if flavor == 'UNIQUE': + unique = True + elif flavor in (None, 'FULLTEXT', 'SPATIAL'): + pass + else: + self.logger.info( + "Converting unknown KEY type %s to a plain KEY", flavor) + pass + index_d = {} + index_d['name'] = spec['name'] + index_d['column_names'] = [s[0] for s in spec['columns']] + index_d['unique'] = unique + if flavor: + index_d['type'] = flavor + indexes.append(index_d) + return indexes + + @reflection.cache + def get_unique_constraints(self, connection, table_name, + schema=None, **kw): + parsed_state = self._parsed_state_or_create( + connection, table_name, schema, **kw) + + return [ + { + 'name': key['name'], + 'column_names': [col[0] for col in key['columns']], + 'duplicates_index': key['name'], + } + for key in parsed_state.keys + if key['type'] == 'UNIQUE' + ] + + @reflection.cache + def get_view_definition(self, connection, view_name, schema=None, **kw): + + charset = self._connection_charset + full_name = '.'.join(self.identifier_preparer._quote_free_identifiers( + schema, view_name)) + sql = self._show_create_table(connection, None, charset, + full_name=full_name) + return sql + + def _parsed_state_or_create(self, connection, table_name, + schema=None, **kw): + return self._setup_parser( + connection, + table_name, + schema, + info_cache=kw.get('info_cache', None) + ) + + @util.memoized_property + def _tabledef_parser(self): + """return the MySQLTableDefinitionParser, generate if needed. + + The deferred creation ensures that the dialect has + retrieved server version information first. + + """ + if (self.server_version_info < (4, 1) and self._server_ansiquotes): + # ANSI_QUOTES doesn't affect SHOW CREATE TABLE on < 4.1 + preparer = self.preparer(self, server_ansiquotes=False) + else: + preparer = self.identifier_preparer + return _reflection.MySQLTableDefinitionParser(self, preparer) + + @reflection.cache + def _setup_parser(self, connection, table_name, schema=None, **kw): + charset = self._connection_charset + parser = self._tabledef_parser + full_name = '.'.join(self.identifier_preparer._quote_free_identifiers( + schema, table_name)) + sql = self._show_create_table(connection, None, charset, + full_name=full_name) + if re.match(r'^CREATE (?:ALGORITHM)?.* VIEW', sql): + # Adapt views to something table-like. + columns = self._describe_table(connection, None, charset, + full_name=full_name) + sql = parser._describe_to_create(table_name, columns) + return parser.parse(sql, charset) + + def _detect_charset(self, connection): + raise NotImplementedError() + + def _detect_casing(self, connection): + """Sniff out identifier case sensitivity. + + Cached per-connection. This value can not change without a server + restart. + + """ + # http://dev.mysql.com/doc/refman/5.0/en/name-case-sensitivity.html + + charset = self._connection_charset + row = self._compat_first(connection.execute( + "SHOW VARIABLES LIKE 'lower_case_table_names'"), + charset=charset) + if not row: + cs = 0 + else: + # 4.0.15 returns OFF or ON according to [ticket:489] + # 3.23 doesn't, 4.0.27 doesn't.. + if row[1] == 'OFF': + cs = 0 + elif row[1] == 'ON': + cs = 1 + else: + cs = int(row[1]) + return cs + + def _detect_collations(self, connection): + """Pull the active COLLATIONS list from the server. + + Cached per-connection. + """ + + collations = {} + if self.server_version_info < (4, 1, 0): + pass + else: + charset = self._connection_charset + rs = connection.execute('SHOW COLLATION') + for row in self._compat_fetchall(rs, charset): + collations[row[0]] = row[1] + return collations + + def _detect_ansiquotes(self, connection): + """Detect and adjust for the ANSI_QUOTES sql mode.""" + + row = self._compat_first( + connection.execute("SHOW VARIABLES LIKE 'sql_mode'"), + charset=self._connection_charset) + + if not row: + mode = '' + else: + mode = row[1] or '' + # 4.0 + if mode.isdigit(): + mode_no = int(mode) + mode = (mode_no | 4 == mode_no) and 'ANSI_QUOTES' or '' + + self._server_ansiquotes = 'ANSI_QUOTES' in mode + + # as of MySQL 5.0.1 + self._backslash_escapes = 'NO_BACKSLASH_ESCAPES' not in mode + + def _show_create_table(self, connection, table, charset=None, + full_name=None): + """Run SHOW CREATE TABLE for a ``Table``.""" + + if full_name is None: + full_name = self.identifier_preparer.format_table(table) + st = "SHOW CREATE TABLE %s" % full_name + + rp = None + try: + rp = connection.execution_options( + skip_user_error_events=True).execute(st) + except exc.DBAPIError as e: + if self._extract_error_code(e.orig) == 1146: + raise exc.NoSuchTableError(full_name) + else: + raise + row = self._compat_first(rp, charset=charset) + if not row: + raise exc.NoSuchTableError(full_name) + return row[1].strip() + + return sql + + def _describe_table(self, connection, table, charset=None, + full_name=None): + """Run DESCRIBE for a ``Table`` and return processed rows.""" + + if full_name is None: + full_name = self.identifier_preparer.format_table(table) + st = "DESCRIBE %s" % full_name + + rp, rows = None, None + try: + try: + rp = connection.execution_options( + skip_user_error_events=True).execute(st) + except exc.DBAPIError as e: + if self._extract_error_code(e.orig) == 1146: + raise exc.NoSuchTableError(full_name) + else: + raise + rows = self._compat_fetchall(rp, charset=charset) + finally: + if rp: + rp.close() + return rows + + + +class _DecodingRowProxy(object): + """Return unicode-decoded values based on type inspection. + + Smooth over data type issues (esp. with alpha driver versions) and + normalize strings as Unicode regardless of user-configured driver + encoding settings. + + """ + + # Some MySQL-python versions can return some columns as + # sets.Set(['value']) (seriously) but thankfully that doesn't + # seem to come up in DDL queries. + + _encoding_compat = { + 'koi8r': 'koi8_r', + 'koi8u': 'koi8_u', + 'utf16': 'utf-16-be', # MySQL's uft16 is always bigendian + 'utf8mb4': 'utf8', # real utf8 + 'eucjpms': 'ujis', + } + + def __init__(self, rowproxy, charset): + self.rowproxy = rowproxy + self.charset = self._encoding_compat.get(charset, charset) + + def __getitem__(self, index): + item = self.rowproxy[index] + if isinstance(item, _array): + item = item.tostring() + + if self.charset and isinstance(item, util.binary_type): + return item.decode(self.charset) + else: + return item + + def __getattr__(self, attr): + item = getattr(self.rowproxy, attr) + if isinstance(item, _array): + item = item.tostring() + if self.charset and isinstance(item, util.binary_type): + return item.decode(self.charset) + else: + return item + diff --git a/app/lib/sqlalchemy/dialects/mysql/cymysql.py b/app/lib/sqlalchemy/dialects/mysql/cymysql.py new file mode 100644 index 0000000..a5ddb1a --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/cymysql.py @@ -0,0 +1,87 @@ +# mysql/cymysql.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" + +.. dialect:: mysql+cymysql + :name: CyMySQL + :dbapi: cymysql + :connectstring: mysql+cymysql://:@/\ +[?] + :url: https://github.com/nakagami/CyMySQL + +""" +import re + +from .mysqldb import MySQLDialect_mysqldb +from .base import (BIT, MySQLDialect) +from ... import util + + +class _cymysqlBIT(BIT): + def result_processor(self, dialect, coltype): + """Convert a MySQL's 64 bit, variable length binary string to a long. + """ + + def process(value): + if value is not None: + v = 0 + for i in util.iterbytes(value): + v = v << 8 | i + return v + return value + return process + + +class MySQLDialect_cymysql(MySQLDialect_mysqldb): + driver = 'cymysql' + + description_encoding = None + supports_sane_rowcount = True + supports_sane_multi_rowcount = False + supports_unicode_statements = True + + colspecs = util.update_copy( + MySQLDialect.colspecs, + { + BIT: _cymysqlBIT, + } + ) + + @classmethod + def dbapi(cls): + return __import__('cymysql') + + def _get_server_version_info(self, connection): + dbapi_con = connection.connection + version = [] + r = re.compile(r'[.\-]') + for n in r.split(dbapi_con.server_version): + try: + version.append(int(n)) + except ValueError: + version.append(n) + return tuple(version) + + def _detect_charset(self, connection): + return connection.connection.charset + + def _extract_error_code(self, exception): + return exception.errno + + def is_disconnect(self, e, connection, cursor): + if isinstance(e, self.dbapi.OperationalError): + return self._extract_error_code(e) in \ + (2006, 2013, 2014, 2045, 2055) + elif isinstance(e, self.dbapi.InterfaceError): + # if underlying connection is closed, + # this is the error you get + return True + else: + return False + +dialect = MySQLDialect_cymysql diff --git a/app/lib/sqlalchemy/dialects/mysql/enumerated.py b/app/lib/sqlalchemy/dialects/mysql/enumerated.py new file mode 100644 index 0000000..495bee5 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/enumerated.py @@ -0,0 +1,311 @@ +# mysql/enumerated.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import re + +from .types import _StringType +from ... import exc, sql, util +from ... import types as sqltypes + + +class _EnumeratedValues(_StringType): + def _init_values(self, values, kw): + self.quoting = kw.pop('quoting', 'auto') + + if self.quoting == 'auto' and len(values): + # What quoting character are we using? + q = None + for e in values: + if len(e) == 0: + self.quoting = 'unquoted' + break + elif q is None: + q = e[0] + + if len(e) == 1 or e[0] != q or e[-1] != q: + self.quoting = 'unquoted' + break + else: + self.quoting = 'quoted' + + if self.quoting == 'quoted': + util.warn_deprecated( + 'Manually quoting %s value literals is deprecated. Supply ' + 'unquoted values and use the quoting= option in cases of ' + 'ambiguity.' % self.__class__.__name__) + + values = self._strip_values(values) + + self._enumerated_values = values + length = max([len(v) for v in values] + [0]) + return values, length + + @classmethod + def _strip_values(cls, values): + strip_values = [] + for a in values: + if a[0:1] == '"' or a[0:1] == "'": + # strip enclosing quotes and unquote interior + a = a[1:-1].replace(a[0] * 2, a[0]) + strip_values.append(a) + return strip_values + + +class ENUM(sqltypes.Enum, _EnumeratedValues): + """MySQL ENUM type.""" + + __visit_name__ = 'ENUM' + + def __init__(self, *enums, **kw): + """Construct an ENUM. + + E.g.:: + + Column('myenum', ENUM("foo", "bar", "baz")) + + :param enums: The range of valid values for this ENUM. Values will be + quoted when generating the schema according to the quoting flag (see + below). This object may also be a PEP-435-compliant enumerated + type. + + .. versionadded: 1.1 added support for PEP-435-compliant enumerated + types. + + :param strict: This flag has no effect. + + .. versionchanged:: The MySQL ENUM type as well as the base Enum + type now validates all Python data values. + + :param charset: Optional, a column-level character set for this string + value. Takes precedence to 'ascii' or 'unicode' short-hand. + + :param collation: Optional, a column-level collation for this string + value. Takes precedence to 'binary' short-hand. + + :param ascii: Defaults to False: short-hand for the ``latin1`` + character set, generates ASCII in schema. + + :param unicode: Defaults to False: short-hand for the ``ucs2`` + character set, generates UNICODE in schema. + + :param binary: Defaults to False: short-hand, pick the binary + collation type that matches the column's character set. Generates + BINARY in schema. This does not affect the type of data stored, + only the collation of character data. + + :param quoting: Defaults to 'auto': automatically determine enum value + quoting. If all enum values are surrounded by the same quoting + character, then use 'quoted' mode. Otherwise, use 'unquoted' mode. + + 'quoted': values in enums are already quoted, they will be used + directly when generating the schema - this usage is deprecated. + + 'unquoted': values in enums are not quoted, they will be escaped and + surrounded by single quotes when generating the schema. + + Previous versions of this type always required manually quoted + values to be supplied; future versions will always quote the string + literals for you. This is a transitional option. + + """ + + kw.pop('strict', None) + validate_strings = kw.pop("validate_strings", False) + sqltypes.Enum.__init__( + self, validate_strings=validate_strings, *enums) + kw.pop('metadata', None) + kw.pop('schema', None) + kw.pop('name', None) + kw.pop('quote', None) + kw.pop('native_enum', None) + kw.pop('inherit_schema', None) + kw.pop('_create_events', None) + _StringType.__init__(self, length=self.length, **kw) + + def _setup_for_values(self, values, objects, kw): + values, length = self._init_values(values, kw) + return sqltypes.Enum._setup_for_values(self, values, objects, kw) + + def _object_value_for_elem(self, elem): + # mysql sends back a blank string for any value that + # was persisted that was not in the enums; that is, it does no + # validation on the incoming data, it "truncates" it to be + # the blank string. Return it straight. + if elem == "": + return elem + else: + return super(ENUM, self)._object_value_for_elem(elem) + + def __repr__(self): + return util.generic_repr( + self, to_inspect=[ENUM, _StringType, sqltypes.Enum]) + + def adapt(self, cls, **kw): + return sqltypes.Enum.adapt(self, cls, **kw) + + +class SET(_EnumeratedValues): + """MySQL SET type.""" + + __visit_name__ = 'SET' + + def __init__(self, *values, **kw): + """Construct a SET. + + E.g.:: + + Column('myset', SET("foo", "bar", "baz")) + + + The list of potential values is required in the case that this + set will be used to generate DDL for a table, or if the + :paramref:`.SET.retrieve_as_bitwise` flag is set to True. + + :param values: The range of valid values for this SET. + + :param convert_unicode: Same flag as that of + :paramref:`.String.convert_unicode`. + + :param collation: same as that of :paramref:`.String.collation` + + :param charset: same as that of :paramref:`.VARCHAR.charset`. + + :param ascii: same as that of :paramref:`.VARCHAR.ascii`. + + :param unicode: same as that of :paramref:`.VARCHAR.unicode`. + + :param binary: same as that of :paramref:`.VARCHAR.binary`. + + :param quoting: Defaults to 'auto': automatically determine set value + quoting. If all values are surrounded by the same quoting + character, then use 'quoted' mode. Otherwise, use 'unquoted' mode. + + 'quoted': values in enums are already quoted, they will be used + directly when generating the schema - this usage is deprecated. + + 'unquoted': values in enums are not quoted, they will be escaped and + surrounded by single quotes when generating the schema. + + Previous versions of this type always required manually quoted + values to be supplied; future versions will always quote the string + literals for you. This is a transitional option. + + .. versionadded:: 0.9.0 + + :param retrieve_as_bitwise: if True, the data for the set type will be + persisted and selected using an integer value, where a set is coerced + into a bitwise mask for persistence. MySQL allows this mode which + has the advantage of being able to store values unambiguously, + such as the blank string ``''``. The datatype will appear + as the expression ``col + 0`` in a SELECT statement, so that the + value is coerced into an integer value in result sets. + This flag is required if one wishes + to persist a set that can store the blank string ``''`` as a value. + + .. warning:: + + When using :paramref:`.mysql.SET.retrieve_as_bitwise`, it is + essential that the list of set values is expressed in the + **exact same order** as exists on the MySQL database. + + .. versionadded:: 1.0.0 + + + """ + self.retrieve_as_bitwise = kw.pop('retrieve_as_bitwise', False) + values, length = self._init_values(values, kw) + self.values = tuple(values) + if not self.retrieve_as_bitwise and '' in values: + raise exc.ArgumentError( + "Can't use the blank value '' in a SET without " + "setting retrieve_as_bitwise=True") + if self.retrieve_as_bitwise: + self._bitmap = dict( + (value, 2 ** idx) + for idx, value in enumerate(self.values) + ) + self._bitmap.update( + (2 ** idx, value) + for idx, value in enumerate(self.values) + ) + kw.setdefault('length', length) + super(SET, self).__init__(**kw) + + def column_expression(self, colexpr): + if self.retrieve_as_bitwise: + return sql.type_coerce( + sql.type_coerce(colexpr, sqltypes.Integer) + 0, + self + ) + else: + return colexpr + + def result_processor(self, dialect, coltype): + if self.retrieve_as_bitwise: + def process(value): + if value is not None: + value = int(value) + + return set( + util.map_bits(self._bitmap.__getitem__, value) + ) + else: + return None + else: + super_convert = super(SET, self).result_processor(dialect, coltype) + + def process(value): + if isinstance(value, util.string_types): + # MySQLdb returns a string, let's parse + if super_convert: + value = super_convert(value) + return set(re.findall(r'[^,]+', value)) + else: + # mysql-connector-python does a naive + # split(",") which throws in an empty string + if value is not None: + value.discard('') + return value + return process + + def bind_processor(self, dialect): + super_convert = super(SET, self).bind_processor(dialect) + if self.retrieve_as_bitwise: + def process(value): + if value is None: + return None + elif isinstance(value, util.int_types + util.string_types): + if super_convert: + return super_convert(value) + else: + return value + else: + int_value = 0 + for v in value: + int_value |= self._bitmap[v] + return int_value + else: + + def process(value): + # accept strings and int (actually bitflag) values directly + if value is not None and not isinstance( + value, util.int_types + util.string_types): + value = ",".join(value) + + if super_convert: + return super_convert(value) + else: + return value + return process + + def adapt(self, impltype, **kw): + kw['retrieve_as_bitwise'] = self.retrieve_as_bitwise + return util.constructor_copy( + self, impltype, + *self.values, + **kw + ) diff --git a/app/lib/sqlalchemy/dialects/mysql/gaerdbms.py b/app/lib/sqlalchemy/dialects/mysql/gaerdbms.py new file mode 100644 index 0000000..1c64823 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/gaerdbms.py @@ -0,0 +1,102 @@ +# mysql/gaerdbms.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +""" +.. dialect:: mysql+gaerdbms + :name: Google Cloud SQL + :dbapi: rdbms + :connectstring: mysql+gaerdbms:///?instance= + :url: https://developers.google.com/appengine/docs/python/cloud-sql/\ +developers-guide + + This dialect is based primarily on the :mod:`.mysql.mysqldb` dialect with + minimal changes. + + .. versionadded:: 0.7.8 + + .. deprecated:: 1.0 This dialect is **no longer necessary** for + Google Cloud SQL; the MySQLdb dialect can be used directly. + Cloud SQL now recommends creating connections via the + mysql dialect using the URL format + + ``mysql+mysqldb://root@/?unix_socket=/cloudsql/:`` + + +Pooling +------- + +Google App Engine connections appear to be randomly recycled, +so the dialect does not pool connections. The :class:`.NullPool` +implementation is installed within the :class:`.Engine` by +default. + +""" + +import os + +from .mysqldb import MySQLDialect_mysqldb +from ...pool import NullPool +import re +from sqlalchemy.util import warn_deprecated + + +def _is_dev_environment(): + return os.environ.get('SERVER_SOFTWARE', '').startswith('Development/') + + +class MySQLDialect_gaerdbms(MySQLDialect_mysqldb): + + @classmethod + def dbapi(cls): + + warn_deprecated( + "Google Cloud SQL now recommends creating connections via the " + "MySQLdb dialect directly, using the URL format " + "mysql+mysqldb://root@/?unix_socket=/cloudsql/" + ":" + ) + + # from django: + # http://code.google.com/p/googleappengine/source/ + # browse/trunk/python/google/storage/speckle/ + # python/django/backend/base.py#118 + # see also [ticket:2649] + # see also http://stackoverflow.com/q/14224679/34549 + from google.appengine.api import apiproxy_stub_map + + if _is_dev_environment(): + from google.appengine.api import rdbms_mysqldb + return rdbms_mysqldb + elif apiproxy_stub_map.apiproxy.GetStub('rdbms'): + from google.storage.speckle.python.api import rdbms_apiproxy + return rdbms_apiproxy + else: + from google.storage.speckle.python.api import rdbms_googleapi + return rdbms_googleapi + + @classmethod + def get_pool_class(cls, url): + # Cloud SQL connections die at any moment + return NullPool + + def create_connect_args(self, url): + opts = url.translate_connect_args() + if not _is_dev_environment(): + # 'dsn' and 'instance' are because we are skipping + # the traditional google.api.rdbms wrapper + opts['dsn'] = '' + opts['instance'] = url.query['instance'] + return [], opts + + def _extract_error_code(self, exception): + match = re.compile(r"^(\d+)L?:|^\((\d+)L?,").match(str(exception)) + # The rdbms api will wrap then re-raise some types of errors + # making this regex return no matches. + code = match.group(1) or match.group(2) if match else None + if code: + return int(code) + +dialect = MySQLDialect_gaerdbms diff --git a/app/lib/sqlalchemy/dialects/mysql/json.py b/app/lib/sqlalchemy/dialects/mysql/json.py new file mode 100644 index 0000000..d7b8666 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/json.py @@ -0,0 +1,79 @@ +# mysql/json.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from __future__ import absolute_import + +import json + +from ...sql import elements +from ... import types as sqltypes +from ... import util + + +class JSON(sqltypes.JSON): + """MySQL JSON type. + + MySQL supports JSON as of version 5.7. Note that MariaDB does **not** + support JSON at the time of this writing. + + The :class:`.mysql.JSON` type supports persistence of JSON values + as well as the core index operations provided by :class:`.types.JSON` + datatype, by adapting the operations to render the ``JSON_EXTRACT`` + function at the database level. + + .. versionadded:: 1.1 + + """ + + pass + + +class _FormatTypeMixin(object): + def _format_value(self, value): + raise NotImplementedError() + + def bind_processor(self, dialect): + super_proc = self.string_bind_processor(dialect) + + def process(value): + value = self._format_value(value) + if super_proc: + value = super_proc(value) + return value + + return process + + def literal_processor(self, dialect): + super_proc = self.string_literal_processor(dialect) + + def process(value): + value = self._format_value(value) + if super_proc: + value = super_proc(value) + return value + + return process + + +class JSONIndexType(_FormatTypeMixin, sqltypes.JSON.JSONIndexType): + + def _format_value(self, value): + if isinstance(value, int): + value = "$[%s]" % value + else: + value = '$."%s"' % value + return value + + +class JSONPathType(_FormatTypeMixin, sqltypes.JSON.JSONPathType): + def _format_value(self, value): + return "$%s" % ( + "".join([ + "[%s]" % elem if isinstance(elem, int) + else '."%s"' % elem for elem in value + ]) + ) diff --git a/app/lib/sqlalchemy/dialects/mysql/mysqlconnector.py b/app/lib/sqlalchemy/dialects/mysql/mysqlconnector.py new file mode 100644 index 0000000..ac77ebc --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/mysqlconnector.py @@ -0,0 +1,203 @@ +# mysql/mysqlconnector.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: mysql+mysqlconnector + :name: MySQL Connector/Python + :dbapi: myconnpy + :connectstring: mysql+mysqlconnector://:@\ +[:]/ + :url: http://dev.mysql.com/downloads/connector/python/ + + +Unicode +------- + +Please see :ref:`mysql_unicode` for current recommendations on unicode +handling. + +""" + +from .base import (MySQLDialect, MySQLExecutionContext, + MySQLCompiler, MySQLIdentifierPreparer, + BIT) + +from ... import util +import re + + +class MySQLExecutionContext_mysqlconnector(MySQLExecutionContext): + + def get_lastrowid(self): + return self.cursor.lastrowid + + +class MySQLCompiler_mysqlconnector(MySQLCompiler): + def visit_mod_binary(self, binary, operator, **kw): + if self.dialect._mysqlconnector_double_percents: + return self.process(binary.left, **kw) + " %% " + \ + self.process(binary.right, **kw) + else: + return self.process(binary.left, **kw) + " % " + \ + self.process(binary.right, **kw) + + def post_process_text(self, text): + if self.dialect._mysqlconnector_double_percents: + return text.replace('%', '%%') + else: + return text + + def escape_literal_column(self, text): + if self.dialect._mysqlconnector_double_percents: + return text.replace('%', '%%') + else: + return text + + +class MySQLIdentifierPreparer_mysqlconnector(MySQLIdentifierPreparer): + + def _escape_identifier(self, value): + value = value.replace(self.escape_quote, self.escape_to_quote) + if self.dialect._mysqlconnector_double_percents: + return value.replace("%", "%%") + else: + return value + + +class _myconnpyBIT(BIT): + def result_processor(self, dialect, coltype): + """MySQL-connector already converts mysql bits, so.""" + + return None + + +class MySQLDialect_mysqlconnector(MySQLDialect): + driver = 'mysqlconnector' + + supports_unicode_binds = True + + supports_sane_rowcount = True + supports_sane_multi_rowcount = True + + supports_native_decimal = True + + default_paramstyle = 'format' + execution_ctx_cls = MySQLExecutionContext_mysqlconnector + statement_compiler = MySQLCompiler_mysqlconnector + + preparer = MySQLIdentifierPreparer_mysqlconnector + + colspecs = util.update_copy( + MySQLDialect.colspecs, + { + BIT: _myconnpyBIT, + } + ) + + @util.memoized_property + def supports_unicode_statements(self): + return util.py3k or self._mysqlconnector_version_info > (2, 0) + + @classmethod + def dbapi(cls): + from mysql import connector + return connector + + def create_connect_args(self, url): + opts = url.translate_connect_args(username='user') + + opts.update(url.query) + + util.coerce_kw_type(opts, 'allow_local_infile', bool) + util.coerce_kw_type(opts, 'autocommit', bool) + util.coerce_kw_type(opts, 'buffered', bool) + util.coerce_kw_type(opts, 'compress', bool) + util.coerce_kw_type(opts, 'connection_timeout', int) + util.coerce_kw_type(opts, 'connect_timeout', int) + util.coerce_kw_type(opts, 'consume_results', bool) + util.coerce_kw_type(opts, 'force_ipv6', bool) + util.coerce_kw_type(opts, 'get_warnings', bool) + util.coerce_kw_type(opts, 'pool_reset_session', bool) + util.coerce_kw_type(opts, 'pool_size', int) + util.coerce_kw_type(opts, 'raise_on_warnings', bool) + util.coerce_kw_type(opts, 'raw', bool) + util.coerce_kw_type(opts, 'ssl_verify_cert', bool) + util.coerce_kw_type(opts, 'use_pure', bool) + util.coerce_kw_type(opts, 'use_unicode', bool) + + # unfortunately, MySQL/connector python refuses to release a + # cursor without reading fully, so non-buffered isn't an option + opts.setdefault('buffered', True) + + # FOUND_ROWS must be set in ClientFlag to enable + # supports_sane_rowcount. + if self.dbapi is not None: + try: + from mysql.connector.constants import ClientFlag + client_flags = opts.get( + 'client_flags', ClientFlag.get_default()) + client_flags |= ClientFlag.FOUND_ROWS + opts['client_flags'] = client_flags + except Exception: + pass + return [[], opts] + + @util.memoized_property + def _mysqlconnector_version_info(self): + if self.dbapi and hasattr(self.dbapi, '__version__'): + m = re.match(r'(\d+)\.(\d+)(?:\.(\d+))?', + self.dbapi.__version__) + if m: + return tuple( + int(x) + for x in m.group(1, 2, 3) + if x is not None) + + @util.memoized_property + def _mysqlconnector_double_percents(self): + return not util.py3k and self._mysqlconnector_version_info < (2, 0) + + def _get_server_version_info(self, connection): + dbapi_con = connection.connection + version = dbapi_con.get_server_version() + return tuple(version) + + def _detect_charset(self, connection): + return connection.connection.charset + + def _extract_error_code(self, exception): + return exception.errno + + def is_disconnect(self, e, connection, cursor): + errnos = (2006, 2013, 2014, 2045, 2055, 2048) + exceptions = (self.dbapi.OperationalError, self.dbapi.InterfaceError) + if isinstance(e, exceptions): + return e.errno in errnos or \ + "MySQL Connection not available." in str(e) + else: + return False + + def _compat_fetchall(self, rp, charset=None): + return rp.fetchall() + + def _compat_fetchone(self, rp, charset=None): + return rp.fetchone() + + _isolation_lookup = set(['SERIALIZABLE', 'READ UNCOMMITTED', + 'READ COMMITTED', 'REPEATABLE READ', + 'AUTOCOMMIT']) + + def _set_isolation_level(self, connection, level): + if level == 'AUTOCOMMIT': + connection.autocommit = True + else: + connection.autocommit = False + super(MySQLDialect_mysqlconnector, self)._set_isolation_level( + connection, level) + + +dialect = MySQLDialect_mysqlconnector diff --git a/app/lib/sqlalchemy/dialects/mysql/mysqldb.py b/app/lib/sqlalchemy/dialects/mysql/mysqldb.py new file mode 100644 index 0000000..6af8601 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/mysqldb.py @@ -0,0 +1,228 @@ +# mysql/mysqldb.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" + +.. dialect:: mysql+mysqldb + :name: MySQL-Python + :dbapi: mysqldb + :connectstring: mysql+mysqldb://:@[:]/ + :url: http://sourceforge.net/projects/mysql-python + +.. _mysqldb_unicode: + +Unicode +------- + +Please see :ref:`mysql_unicode` for current recommendations on unicode +handling. + +Py3K Support +------------ + +Currently, MySQLdb only runs on Python 2 and development has been stopped. +`mysqlclient`_ is fork of MySQLdb and provides Python 3 support as well +as some bugfixes. + +.. _mysqlclient: https://github.com/PyMySQL/mysqlclient-python + +Using MySQLdb with Google Cloud SQL +----------------------------------- + +Google Cloud SQL now recommends use of the MySQLdb dialect. Connect +using a URL like the following:: + + mysql+mysqldb://root@/?unix_socket=/cloudsql/: + +Server Side Cursors +------------------- + +The mysqldb dialect supports server-side cursors. See :ref:`mysql_ss_cursors`. + +""" + +from .base import (MySQLDialect, MySQLExecutionContext, + MySQLCompiler, MySQLIdentifierPreparer) +from .base import TEXT +from ... import sql +from ... import util +import re + + +class MySQLExecutionContext_mysqldb(MySQLExecutionContext): + + @property + def rowcount(self): + if hasattr(self, '_rowcount'): + return self._rowcount + else: + return self.cursor.rowcount + + +class MySQLCompiler_mysqldb(MySQLCompiler): + def visit_mod_binary(self, binary, operator, **kw): + return self.process(binary.left, **kw) + " %% " + \ + self.process(binary.right, **kw) + + def post_process_text(self, text): + return text.replace('%', '%%') + + +class MySQLIdentifierPreparer_mysqldb(MySQLIdentifierPreparer): + + def _escape_identifier(self, value): + value = value.replace(self.escape_quote, self.escape_to_quote) + return value.replace("%", "%%") + + +class MySQLDialect_mysqldb(MySQLDialect): + driver = 'mysqldb' + supports_unicode_statements = True + supports_sane_rowcount = True + supports_sane_multi_rowcount = True + + supports_native_decimal = True + + default_paramstyle = 'format' + execution_ctx_cls = MySQLExecutionContext_mysqldb + statement_compiler = MySQLCompiler_mysqldb + preparer = MySQLIdentifierPreparer_mysqldb + + def __init__(self, server_side_cursors=False, **kwargs): + super(MySQLDialect_mysqldb, self).__init__(**kwargs) + self.server_side_cursors = server_side_cursors + + @util.langhelpers.memoized_property + def supports_server_side_cursors(self): + try: + cursors = __import__('MySQLdb.cursors').cursors + self._sscursor = cursors.SSCursor + return True + except (ImportError, AttributeError): + return False + + @classmethod + def dbapi(cls): + return __import__('MySQLdb') + + def do_executemany(self, cursor, statement, parameters, context=None): + rowcount = cursor.executemany(statement, parameters) + if context is not None: + context._rowcount = rowcount + + def _check_unicode_returns(self, connection): + # work around issue fixed in + # https://github.com/farcepest/MySQLdb1/commit/cd44524fef63bd3fcb71947392326e9742d520e8 + # specific issue w/ the utf8_bin collation and unicode returns + + has_utf8_bin = self.server_version_info > (5, ) and \ + connection.scalar( + "show collation where %s = 'utf8' and %s = 'utf8_bin'" + % ( + self.identifier_preparer.quote("Charset"), + self.identifier_preparer.quote("Collation") + )) + if has_utf8_bin: + additional_tests = [ + sql.collate(sql.cast( + sql.literal_column( + "'test collated returns'"), + TEXT(charset='utf8')), "utf8_bin") + ] + else: + additional_tests = [] + return super(MySQLDialect_mysqldb, self)._check_unicode_returns( + connection, additional_tests) + + def create_connect_args(self, url): + opts = url.translate_connect_args(database='db', username='user', + password='passwd') + opts.update(url.query) + + util.coerce_kw_type(opts, 'compress', bool) + util.coerce_kw_type(opts, 'connect_timeout', int) + util.coerce_kw_type(opts, 'read_timeout', int) + util.coerce_kw_type(opts, 'client_flag', int) + util.coerce_kw_type(opts, 'local_infile', int) + # Note: using either of the below will cause all strings to be + # returned as Unicode, both in raw SQL operations and with column + # types like String and MSString. + util.coerce_kw_type(opts, 'use_unicode', bool) + util.coerce_kw_type(opts, 'charset', str) + + # Rich values 'cursorclass' and 'conv' are not supported via + # query string. + + ssl = {} + keys = ['ssl_ca', 'ssl_key', 'ssl_cert', 'ssl_capath', 'ssl_cipher'] + for key in keys: + if key in opts: + ssl[key[4:]] = opts[key] + util.coerce_kw_type(ssl, key[4:], str) + del opts[key] + if ssl: + opts['ssl'] = ssl + + # FOUND_ROWS must be set in CLIENT_FLAGS to enable + # supports_sane_rowcount. + client_flag = opts.get('client_flag', 0) + if self.dbapi is not None: + try: + CLIENT_FLAGS = __import__( + self.dbapi.__name__ + '.constants.CLIENT' + ).constants.CLIENT + client_flag |= CLIENT_FLAGS.FOUND_ROWS + except (AttributeError, ImportError): + self.supports_sane_rowcount = False + opts['client_flag'] = client_flag + return [[], opts] + + def _get_server_version_info(self, connection): + dbapi_con = connection.connection + version = [] + r = re.compile(r'[.\-]') + for n in r.split(dbapi_con.get_server_info()): + try: + version.append(int(n)) + except ValueError: + version.append(n) + return tuple(version) + + def _extract_error_code(self, exception): + return exception.args[0] + + def _detect_charset(self, connection): + """Sniff out the character set in use for connection results.""" + + try: + # note: the SQL here would be + # "SHOW VARIABLES LIKE 'character_set%%'" + cset_name = connection.connection.character_set_name + except AttributeError: + util.warn( + "No 'character_set_name' can be detected with " + "this MySQL-Python version; " + "please upgrade to a recent version of MySQL-Python. " + "Assuming latin1.") + return 'latin1' + else: + return cset_name() + + _isolation_lookup = set(['SERIALIZABLE', 'READ UNCOMMITTED', + 'READ COMMITTED', 'REPEATABLE READ', + 'AUTOCOMMIT']) + + def _set_isolation_level(self, connection, level): + if level == 'AUTOCOMMIT': + connection.autocommit(True) + else: + connection.autocommit(False) + super(MySQLDialect_mysqldb, self)._set_isolation_level(connection, + level) + + +dialect = MySQLDialect_mysqldb diff --git a/app/lib/sqlalchemy/dialects/mysql/oursql.py b/app/lib/sqlalchemy/dialects/mysql/oursql.py new file mode 100644 index 0000000..f7f90e9 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/oursql.py @@ -0,0 +1,254 @@ +# mysql/oursql.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" + +.. dialect:: mysql+oursql + :name: OurSQL + :dbapi: oursql + :connectstring: mysql+oursql://:@[:]/ + :url: http://packages.python.org/oursql/ + +Unicode +------- + +Please see :ref:`mysql_unicode` for current recommendations on unicode +handling. + + +""" + +import re + +from .base import (BIT, MySQLDialect, MySQLExecutionContext) +from ... import types as sqltypes, util + + +class _oursqlBIT(BIT): + def result_processor(self, dialect, coltype): + """oursql already converts mysql bits, so.""" + + return None + + +class MySQLExecutionContext_oursql(MySQLExecutionContext): + + @property + def plain_query(self): + return self.execution_options.get('_oursql_plain_query', False) + + +class MySQLDialect_oursql(MySQLDialect): + driver = 'oursql' + + if util.py2k: + supports_unicode_binds = True + supports_unicode_statements = True + + supports_native_decimal = True + + supports_sane_rowcount = True + supports_sane_multi_rowcount = True + execution_ctx_cls = MySQLExecutionContext_oursql + + colspecs = util.update_copy( + MySQLDialect.colspecs, + { + sqltypes.Time: sqltypes.Time, + BIT: _oursqlBIT, + } + ) + + @classmethod + def dbapi(cls): + return __import__('oursql') + + def do_execute(self, cursor, statement, parameters, context=None): + """Provide an implementation of + *cursor.execute(statement, parameters)*.""" + + if context and context.plain_query: + cursor.execute(statement, plain_query=True) + else: + cursor.execute(statement, parameters) + + def do_begin(self, connection): + connection.cursor().execute('BEGIN', plain_query=True) + + def _xa_query(self, connection, query, xid): + if util.py2k: + arg = connection.connection._escape_string(xid) + else: + charset = self._connection_charset + arg = connection.connection._escape_string( + xid.encode(charset)).decode(charset) + arg = "'%s'" % arg + connection.execution_options( + _oursql_plain_query=True).execute(query % arg) + + # Because mysql is bad, these methods have to be + # reimplemented to use _PlainQuery. Basically, some queries + # refuse to return any data if they're run through + # the parameterized query API, or refuse to be parameterized + # in the first place. + def do_begin_twophase(self, connection, xid): + self._xa_query(connection, 'XA BEGIN %s', xid) + + def do_prepare_twophase(self, connection, xid): + self._xa_query(connection, 'XA END %s', xid) + self._xa_query(connection, 'XA PREPARE %s', xid) + + def do_rollback_twophase(self, connection, xid, is_prepared=True, + recover=False): + if not is_prepared: + self._xa_query(connection, 'XA END %s', xid) + self._xa_query(connection, 'XA ROLLBACK %s', xid) + + def do_commit_twophase(self, connection, xid, is_prepared=True, + recover=False): + if not is_prepared: + self.do_prepare_twophase(connection, xid) + self._xa_query(connection, 'XA COMMIT %s', xid) + + # Q: why didn't we need all these "plain_query" overrides earlier ? + # am i on a newer/older version of OurSQL ? + def has_table(self, connection, table_name, schema=None): + return MySQLDialect.has_table( + self, + connection.connect().execution_options(_oursql_plain_query=True), + table_name, + schema + ) + + def get_table_options(self, connection, table_name, schema=None, **kw): + return MySQLDialect.get_table_options( + self, + connection.connect().execution_options(_oursql_plain_query=True), + table_name, + schema=schema, + **kw + ) + + def get_columns(self, connection, table_name, schema=None, **kw): + return MySQLDialect.get_columns( + self, + connection.connect().execution_options(_oursql_plain_query=True), + table_name, + schema=schema, + **kw + ) + + def get_view_names(self, connection, schema=None, **kw): + return MySQLDialect.get_view_names( + self, + connection.connect().execution_options(_oursql_plain_query=True), + schema=schema, + **kw + ) + + def get_table_names(self, connection, schema=None, **kw): + return MySQLDialect.get_table_names( + self, + connection.connect().execution_options(_oursql_plain_query=True), + schema + ) + + def get_schema_names(self, connection, **kw): + return MySQLDialect.get_schema_names( + self, + connection.connect().execution_options(_oursql_plain_query=True), + **kw + ) + + def initialize(self, connection): + return MySQLDialect.initialize( + self, + connection.execution_options(_oursql_plain_query=True) + ) + + def _show_create_table(self, connection, table, charset=None, + full_name=None): + return MySQLDialect._show_create_table( + self, + connection.contextual_connect(close_with_result=True). + execution_options(_oursql_plain_query=True), + table, charset, full_name + ) + + def is_disconnect(self, e, connection, cursor): + if isinstance(e, self.dbapi.ProgrammingError): + return e.errno is None and 'cursor' not in e.args[1] \ + and e.args[1].endswith('closed') + else: + return e.errno in (2006, 2013, 2014, 2045, 2055) + + def create_connect_args(self, url): + opts = url.translate_connect_args(database='db', username='user', + password='passwd') + opts.update(url.query) + + util.coerce_kw_type(opts, 'port', int) + util.coerce_kw_type(opts, 'compress', bool) + util.coerce_kw_type(opts, 'autoping', bool) + util.coerce_kw_type(opts, 'raise_on_warnings', bool) + + util.coerce_kw_type(opts, 'default_charset', bool) + if opts.pop('default_charset', False): + opts['charset'] = None + else: + util.coerce_kw_type(opts, 'charset', str) + opts['use_unicode'] = opts.get('use_unicode', True) + util.coerce_kw_type(opts, 'use_unicode', bool) + + # FOUND_ROWS must be set in CLIENT_FLAGS to enable + # supports_sane_rowcount. + opts.setdefault('found_rows', True) + + ssl = {} + for key in ['ssl_ca', 'ssl_key', 'ssl_cert', + 'ssl_capath', 'ssl_cipher']: + if key in opts: + ssl[key[4:]] = opts[key] + util.coerce_kw_type(ssl, key[4:], str) + del opts[key] + if ssl: + opts['ssl'] = ssl + + return [[], opts] + + def _get_server_version_info(self, connection): + dbapi_con = connection.connection + version = [] + r = re.compile(r'[.\-]') + for n in r.split(dbapi_con.server_info): + try: + version.append(int(n)) + except ValueError: + version.append(n) + return tuple(version) + + def _extract_error_code(self, exception): + return exception.errno + + def _detect_charset(self, connection): + """Sniff out the character set in use for connection results.""" + + return connection.connection.charset + + def _compat_fetchall(self, rp, charset=None): + """oursql isn't super-broken like MySQLdb, yaaay.""" + return rp.fetchall() + + def _compat_fetchone(self, rp, charset=None): + """oursql isn't super-broken like MySQLdb, yaaay.""" + return rp.fetchone() + + def _compat_first(self, rp, charset=None): + return rp.first() + + +dialect = MySQLDialect_oursql diff --git a/app/lib/sqlalchemy/dialects/mysql/pymysql.py b/app/lib/sqlalchemy/dialects/mysql/pymysql.py new file mode 100644 index 0000000..b787bc2 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/pymysql.py @@ -0,0 +1,70 @@ +# mysql/pymysql.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" + +.. dialect:: mysql+pymysql + :name: PyMySQL + :dbapi: pymysql + :connectstring: mysql+pymysql://:@/\ +[?] + :url: http://www.pymysql.org/ + +Unicode +------- + +Please see :ref:`mysql_unicode` for current recommendations on unicode +handling. + +MySQL-Python Compatibility +-------------------------- + +The pymysql DBAPI is a pure Python port of the MySQL-python (MySQLdb) driver, +and targets 100% compatibility. Most behavioral notes for MySQL-python apply +to the pymysql driver as well. + +""" + +from .mysqldb import MySQLDialect_mysqldb +from ...util import langhelpers, py3k + + +class MySQLDialect_pymysql(MySQLDialect_mysqldb): + driver = 'pymysql' + + description_encoding = None + + # generally, these two values should be both True + # or both False. PyMySQL unicode tests pass all the way back + # to 0.4 either way. See [ticket:3337] + supports_unicode_statements = True + supports_unicode_binds = True + + def __init__(self, server_side_cursors=False, **kwargs): + super(MySQLDialect_pymysql, self).__init__(**kwargs) + self.server_side_cursors = server_side_cursors + + @langhelpers.memoized_property + def supports_server_side_cursors(self): + try: + cursors = __import__('pymysql.cursors').cursors + self._sscursor = cursors.SSCursor + return True + except (ImportError, AttributeError): + return False + + @classmethod + def dbapi(cls): + return __import__('pymysql') + + if py3k: + def _extract_error_code(self, exception): + if isinstance(exception.args[0], Exception): + exception = exception.args[0] + return exception.args[0] + +dialect = MySQLDialect_pymysql diff --git a/app/lib/sqlalchemy/dialects/mysql/pyodbc.py b/app/lib/sqlalchemy/dialects/mysql/pyodbc.py new file mode 100644 index 0000000..2ec6edf --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/pyodbc.py @@ -0,0 +1,79 @@ +# mysql/pyodbc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" + + +.. dialect:: mysql+pyodbc + :name: PyODBC + :dbapi: pyodbc + :connectstring: mysql+pyodbc://:@ + :url: http://pypi.python.org/pypi/pyodbc/ + + .. note:: The PyODBC for MySQL dialect is not well supported, and + is subject to unresolved character encoding issues + which exist within the current ODBC drivers available. + (see http://code.google.com/p/pyodbc/issues/detail?id=25). + Other dialects for MySQL are recommended. + +""" + +from .base import MySQLDialect, MySQLExecutionContext +from ...connectors.pyodbc import PyODBCConnector +from ... import util +import re + + +class MySQLExecutionContext_pyodbc(MySQLExecutionContext): + + def get_lastrowid(self): + cursor = self.create_cursor() + cursor.execute("SELECT LAST_INSERT_ID()") + lastrowid = cursor.fetchone()[0] + cursor.close() + return lastrowid + + +class MySQLDialect_pyodbc(PyODBCConnector, MySQLDialect): + supports_unicode_statements = False + execution_ctx_cls = MySQLExecutionContext_pyodbc + + pyodbc_driver_name = "MySQL" + + def __init__(self, **kw): + # deal with http://code.google.com/p/pyodbc/issues/detail?id=25 + kw.setdefault('convert_unicode', True) + super(MySQLDialect_pyodbc, self).__init__(**kw) + + def _detect_charset(self, connection): + """Sniff out the character set in use for connection results.""" + + # Prefer 'character_set_results' for the current connection over the + # value in the driver. SET NAMES or individual variable SETs will + # change the charset without updating the driver's view of the world. + # + # If it's decided that issuing that sort of SQL leaves you SOL, then + # this can prefer the driver value. + rs = connection.execute("SHOW VARIABLES LIKE 'character_set%%'") + opts = dict([(row[0], row[1]) for row in self._compat_fetchall(rs)]) + for key in ('character_set_connection', 'character_set'): + if opts.get(key, None): + return opts[key] + + util.warn("Could not detect the connection character set. " + "Assuming latin1.") + return 'latin1' + + def _extract_error_code(self, exception): + m = re.compile(r"\((\d+)\)").search(str(exception.args)) + c = m.group(1) + if c: + return int(c) + else: + return None + +dialect = MySQLDialect_pyodbc diff --git a/app/lib/sqlalchemy/dialects/mysql/reflection.py b/app/lib/sqlalchemy/dialects/mysql/reflection.py new file mode 100644 index 0000000..f5f09b8 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/reflection.py @@ -0,0 +1,450 @@ +# mysql/reflection.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import re +from ... import log, util +from ... import types as sqltypes +from .enumerated import _EnumeratedValues, SET +from .types import DATETIME, TIME, TIMESTAMP + + +class ReflectedState(object): + """Stores raw information about a SHOW CREATE TABLE statement.""" + + def __init__(self): + self.columns = [] + self.table_options = {} + self.table_name = None + self.keys = [] + self.constraints = [] + + +@log.class_logger +class MySQLTableDefinitionParser(object): + """Parses the results of a SHOW CREATE TABLE statement.""" + + def __init__(self, dialect, preparer): + self.dialect = dialect + self.preparer = preparer + self._prep_regexes() + + def parse(self, show_create, charset): + state = ReflectedState() + state.charset = charset + for line in re.split(r'\r?\n', show_create): + if line.startswith(' ' + self.preparer.initial_quote): + self._parse_column(line, state) + # a regular table options line + elif line.startswith(') '): + self._parse_table_options(line, state) + # an ANSI-mode table options line + elif line == ')': + pass + elif line.startswith('CREATE '): + self._parse_table_name(line, state) + # Not present in real reflection, but may be if + # loading from a file. + elif not line: + pass + else: + type_, spec = self._parse_constraints(line) + if type_ is None: + util.warn("Unknown schema content: %r" % line) + elif type_ == 'key': + state.keys.append(spec) + elif type_ == 'constraint': + state.constraints.append(spec) + else: + pass + return state + + def _parse_constraints(self, line): + """Parse a KEY or CONSTRAINT line. + + :param line: A line of SHOW CREATE TABLE output + """ + + # KEY + m = self._re_key.match(line) + if m: + spec = m.groupdict() + # convert columns into name, length pairs + spec['columns'] = self._parse_keyexprs(spec['columns']) + return 'key', spec + + # CONSTRAINT + m = self._re_constraint.match(line) + if m: + spec = m.groupdict() + spec['table'] = \ + self.preparer.unformat_identifiers(spec['table']) + spec['local'] = [c[0] + for c in self._parse_keyexprs(spec['local'])] + spec['foreign'] = [c[0] + for c in self._parse_keyexprs(spec['foreign'])] + return 'constraint', spec + + # PARTITION and SUBPARTITION + m = self._re_partition.match(line) + if m: + # Punt! + return 'partition', line + + # No match. + return (None, line) + + def _parse_table_name(self, line, state): + """Extract the table name. + + :param line: The first line of SHOW CREATE TABLE + """ + + regex, cleanup = self._pr_name + m = regex.match(line) + if m: + state.table_name = cleanup(m.group('name')) + + def _parse_table_options(self, line, state): + """Build a dictionary of all reflected table-level options. + + :param line: The final line of SHOW CREATE TABLE output. + """ + + options = {} + + if not line or line == ')': + pass + + else: + rest_of_line = line[:] + for regex, cleanup in self._pr_options: + m = regex.search(rest_of_line) + if not m: + continue + directive, value = m.group('directive'), m.group('val') + if cleanup: + value = cleanup(value) + options[directive.lower()] = value + rest_of_line = regex.sub('', rest_of_line) + + for nope in ('auto_increment', 'data directory', 'index directory'): + options.pop(nope, None) + + for opt, val in options.items(): + state.table_options['%s_%s' % (self.dialect.name, opt)] = val + + def _parse_column(self, line, state): + """Extract column details. + + Falls back to a 'minimal support' variant if full parse fails. + + :param line: Any column-bearing line from SHOW CREATE TABLE + """ + + spec = None + m = self._re_column.match(line) + if m: + spec = m.groupdict() + spec['full'] = True + else: + m = self._re_column_loose.match(line) + if m: + spec = m.groupdict() + spec['full'] = False + if not spec: + util.warn("Unknown column definition %r" % line) + return + if not spec['full']: + util.warn("Incomplete reflection of column definition %r" % line) + + name, type_, args = spec['name'], spec['coltype'], spec['arg'] + + try: + col_type = self.dialect.ischema_names[type_] + except KeyError: + util.warn("Did not recognize type '%s' of column '%s'" % + (type_, name)) + col_type = sqltypes.NullType + + # Column type positional arguments eg. varchar(32) + if args is None or args == '': + type_args = [] + elif args[0] == "'" and args[-1] == "'": + type_args = self._re_csv_str.findall(args) + else: + type_args = [int(v) for v in self._re_csv_int.findall(args)] + + # Column type keyword options + type_kw = {} + + if issubclass(col_type, (DATETIME, TIME, TIMESTAMP)): + if type_args: + type_kw['fsp'] = type_args.pop(0) + + for kw in ('unsigned', 'zerofill'): + if spec.get(kw, False): + type_kw[kw] = True + for kw in ('charset', 'collate'): + if spec.get(kw, False): + type_kw[kw] = spec[kw] + if issubclass(col_type, _EnumeratedValues): + type_args = _EnumeratedValues._strip_values(type_args) + + if issubclass(col_type, SET) and '' in type_args: + type_kw['retrieve_as_bitwise'] = True + + type_instance = col_type(*type_args, **type_kw) + + col_kw = {} + + # NOT NULL + col_kw['nullable'] = True + # this can be "NULL" in the case of TIMESTAMP + if spec.get('notnull', False) == 'NOT NULL': + col_kw['nullable'] = False + + # AUTO_INCREMENT + if spec.get('autoincr', False): + col_kw['autoincrement'] = True + elif issubclass(col_type, sqltypes.Integer): + col_kw['autoincrement'] = False + + # DEFAULT + default = spec.get('default', None) + + if default == 'NULL': + # eliminates the need to deal with this later. + default = None + + col_d = dict(name=name, type=type_instance, default=default) + col_d.update(col_kw) + state.columns.append(col_d) + + def _describe_to_create(self, table_name, columns): + """Re-format DESCRIBE output as a SHOW CREATE TABLE string. + + DESCRIBE is a much simpler reflection and is sufficient for + reflecting views for runtime use. This method formats DDL + for columns only- keys are omitted. + + :param columns: A sequence of DESCRIBE or SHOW COLUMNS 6-tuples. + SHOW FULL COLUMNS FROM rows must be rearranged for use with + this function. + """ + + buffer = [] + for row in columns: + (name, col_type, nullable, default, extra) = \ + [row[i] for i in (0, 1, 2, 4, 5)] + + line = [' '] + line.append(self.preparer.quote_identifier(name)) + line.append(col_type) + if not nullable: + line.append('NOT NULL') + if default: + if 'auto_increment' in default: + pass + elif (col_type.startswith('timestamp') and + default.startswith('C')): + line.append('DEFAULT') + line.append(default) + elif default == 'NULL': + line.append('DEFAULT') + line.append(default) + else: + line.append('DEFAULT') + line.append("'%s'" % default.replace("'", "''")) + if extra: + line.append(extra) + + buffer.append(' '.join(line)) + + return ''.join([('CREATE TABLE %s (\n' % + self.preparer.quote_identifier(table_name)), + ',\n'.join(buffer), + '\n) ']) + + def _parse_keyexprs(self, identifiers): + """Unpack '"col"(2),"col" ASC'-ish strings into components.""" + + return self._re_keyexprs.findall(identifiers) + + def _prep_regexes(self): + """Pre-compile regular expressions.""" + + self._re_columns = [] + self._pr_options = [] + + _final = self.preparer.final_quote + + quotes = dict(zip(('iq', 'fq', 'esc_fq'), + [re.escape(s) for s in + (self.preparer.initial_quote, + _final, + self.preparer._escape_identifier(_final))])) + + self._pr_name = _pr_compile( + r'^CREATE (?:\w+ +)?TABLE +' + r'%(iq)s(?P(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +\($' % quotes, + self.preparer._unescape_identifier) + + # `col`,`col2`(32),`col3`(15) DESC + # + # Note: ASC and DESC aren't reflected, so we'll punt... + self._re_keyexprs = _re_compile( + r'(?:' + r'(?:%(iq)s((?:%(esc_fq)s|[^%(fq)s])+)%(fq)s)' + r'(?:\((\d+)\))?(?=\,|$))+' % quotes) + + # 'foo' or 'foo','bar' or 'fo,o','ba''a''r' + self._re_csv_str = _re_compile(r'\x27(?:\x27\x27|[^\x27])*\x27') + + # 123 or 123,456 + self._re_csv_int = _re_compile(r'\d+') + + # `colname` [type opts] + # (NOT NULL | NULL) + # DEFAULT ('value' | CURRENT_TIMESTAMP...) + # COMMENT 'comment' + # COLUMN_FORMAT (FIXED|DYNAMIC|DEFAULT) + # STORAGE (DISK|MEMORY) + self._re_column = _re_compile( + r' ' + r'%(iq)s(?P(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +' + r'(?P\w+)' + r'(?:\((?P(?:\d+|\d+,\d+|' + r'(?:\x27(?:\x27\x27|[^\x27])*\x27,?)+))\))?' + r'(?: +(?PUNSIGNED))?' + r'(?: +(?PZEROFILL))?' + r'(?: +CHARACTER SET +(?P[\w_]+))?' + r'(?: +COLLATE +(?P[\w_]+))?' + r'(?: +(?P(?:NOT )?NULL))?' + r'(?: +DEFAULT +(?P' + r'(?:NULL|\x27(?:\x27\x27|[^\x27])*\x27|\w+' + r'(?: +ON UPDATE \w+)?)' + r'))?' + r'(?: +(?PAUTO_INCREMENT))?' + r'(?: +COMMENT +(P(?:\x27\x27|[^\x27])+))?' + r'(?: +COLUMN_FORMAT +(?P\w+))?' + r'(?: +STORAGE +(?P\w+))?' + r'(?: +(?P.*))?' + r',?$' + % quotes + ) + + # Fallback, try to parse as little as possible + self._re_column_loose = _re_compile( + r' ' + r'%(iq)s(?P(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +' + r'(?P\w+)' + r'(?:\((?P(?:\d+|\d+,\d+|\x27(?:\x27\x27|[^\x27])+\x27))\))?' + r'.*?(?P(?:NOT )NULL)?' + % quotes + ) + + # (PRIMARY|UNIQUE|FULLTEXT|SPATIAL) INDEX `name` (USING (BTREE|HASH))? + # (`col` (ASC|DESC)?, `col` (ASC|DESC)?) + # KEY_BLOCK_SIZE size | WITH PARSER name + self._re_key = _re_compile( + r' ' + r'(?:(?P\S+) )?KEY' + r'(?: +%(iq)s(?P(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s)?' + r'(?: +USING +(?P\S+))?' + r' +\((?P.+?)\)' + r'(?: +USING +(?P\S+))?' + r'(?: +KEY_BLOCK_SIZE *[ =]? *(?P\S+))?' + r'(?: +WITH PARSER +(?P\S+))?' + r'(?: +COMMENT +(?P(\x27\x27|\x27([^\x27])*?\x27)+))?' + r',?$' + % quotes + ) + + # CONSTRAINT `name` FOREIGN KEY (`local_col`) + # REFERENCES `remote` (`remote_col`) + # MATCH FULL | MATCH PARTIAL | MATCH SIMPLE + # ON DELETE CASCADE ON UPDATE RESTRICT + # + # unique constraints come back as KEYs + kw = quotes.copy() + kw['on'] = 'RESTRICT|CASCADE|SET NULL|NOACTION' + self._re_constraint = _re_compile( + r' ' + r'CONSTRAINT +' + r'%(iq)s(?P(?:%(esc_fq)s|[^%(fq)s])+)%(fq)s +' + r'FOREIGN KEY +' + r'\((?P[^\)]+?)\) REFERENCES +' + r'(?P%(iq)s[^%(fq)s]+%(fq)s' + r'(?:\.%(iq)s[^%(fq)s]+%(fq)s)?) +' + r'\((?P[^\)]+?)\)' + r'(?: +(?PMATCH \w+))?' + r'(?: +ON DELETE (?P%(on)s))?' + r'(?: +ON UPDATE (?P%(on)s))?' + % kw + ) + + # PARTITION + # + # punt! + self._re_partition = _re_compile(r'(?:.*)(?:SUB)?PARTITION(?:.*)') + + # Table-level options (COLLATE, ENGINE, etc.) + # Do the string options first, since they have quoted + # strings we need to get rid of. + for option in _options_of_type_string: + self._add_option_string(option) + + for option in ('ENGINE', 'TYPE', 'AUTO_INCREMENT', + 'AVG_ROW_LENGTH', 'CHARACTER SET', + 'DEFAULT CHARSET', 'CHECKSUM', + 'COLLATE', 'DELAY_KEY_WRITE', 'INSERT_METHOD', + 'MAX_ROWS', 'MIN_ROWS', 'PACK_KEYS', 'ROW_FORMAT', + 'KEY_BLOCK_SIZE'): + self._add_option_word(option) + + self._add_option_regex('UNION', r'\([^\)]+\)') + self._add_option_regex('TABLESPACE', r'.*? STORAGE DISK') + self._add_option_regex( + 'RAID_TYPE', + r'\w+\s+RAID_CHUNKS\s*\=\s*\w+RAID_CHUNKSIZE\s*=\s*\w+') + + _optional_equals = r'(?:\s*(?:=\s*)|\s+)' + + def _add_option_string(self, directive): + regex = (r'(?P%s)%s' + r"'(?P(?:[^']|'')*?)'(?!')" % + (re.escape(directive), self._optional_equals)) + self._pr_options.append(_pr_compile( + regex, lambda v: v.replace("\\\\", "\\").replace("''", "'") + )) + + def _add_option_word(self, directive): + regex = (r'(?P%s)%s' + r'(?P\w+)' % + (re.escape(directive), self._optional_equals)) + self._pr_options.append(_pr_compile(regex)) + + def _add_option_regex(self, directive, regex): + regex = (r'(?P%s)%s' + r'(?P%s)' % + (re.escape(directive), self._optional_equals, regex)) + self._pr_options.append(_pr_compile(regex)) + +_options_of_type_string = ('COMMENT', 'DATA DIRECTORY', 'INDEX DIRECTORY', + 'PASSWORD', 'CONNECTION') + + +def _pr_compile(regex, cleanup=None): + """Prepare a 2-tuple of compiled regex and callable.""" + + return (_re_compile(regex), cleanup) + + +def _re_compile(regex): + """Compile a string to regex, I and UNICODE.""" + + return re.compile(regex, re.I | re.UNICODE) diff --git a/app/lib/sqlalchemy/dialects/mysql/types.py b/app/lib/sqlalchemy/dialects/mysql/types.py new file mode 100644 index 0000000..cf80d79 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/types.py @@ -0,0 +1,766 @@ +# mysql/types.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import datetime +from ... import exc, util +from ... import types as sqltypes + + +class _NumericType(object): + """Base for MySQL numeric types. + + This is the base both for NUMERIC as well as INTEGER, hence + it's a mixin. + + """ + + def __init__(self, unsigned=False, zerofill=False, **kw): + self.unsigned = unsigned + self.zerofill = zerofill + super(_NumericType, self).__init__(**kw) + + def __repr__(self): + return util.generic_repr(self, + to_inspect=[_NumericType, sqltypes.Numeric]) + + +class _FloatType(_NumericType, sqltypes.Float): + def __init__(self, precision=None, scale=None, asdecimal=True, **kw): + if isinstance(self, (REAL, DOUBLE)) and \ + ( + (precision is None and scale is not None) or + (precision is not None and scale is None) + ): + raise exc.ArgumentError( + "You must specify both precision and scale or omit " + "both altogether.") + super(_FloatType, self).__init__( + precision=precision, asdecimal=asdecimal, **kw) + self.scale = scale + + def __repr__(self): + return util.generic_repr(self, to_inspect=[_FloatType, + _NumericType, + sqltypes.Float]) + + +class _IntegerType(_NumericType, sqltypes.Integer): + def __init__(self, display_width=None, **kw): + self.display_width = display_width + super(_IntegerType, self).__init__(**kw) + + def __repr__(self): + return util.generic_repr(self, to_inspect=[_IntegerType, + _NumericType, + sqltypes.Integer]) + + +class _StringType(sqltypes.String): + """Base for MySQL string types.""" + + def __init__(self, charset=None, collation=None, + ascii=False, binary=False, unicode=False, + national=False, **kw): + self.charset = charset + + # allow collate= or collation= + kw.setdefault('collation', kw.pop('collate', collation)) + + self.ascii = ascii + self.unicode = unicode + self.binary = binary + self.national = national + super(_StringType, self).__init__(**kw) + + def __repr__(self): + return util.generic_repr(self, + to_inspect=[_StringType, sqltypes.String]) + + +class _MatchType(sqltypes.Float, sqltypes.MatchType): + def __init__(self, **kw): + # TODO: float arguments? + sqltypes.Float.__init__(self) + sqltypes.MatchType.__init__(self) + + + +class NUMERIC(_NumericType, sqltypes.NUMERIC): + """MySQL NUMERIC type.""" + + __visit_name__ = 'NUMERIC' + + def __init__(self, precision=None, scale=None, asdecimal=True, **kw): + """Construct a NUMERIC. + + :param precision: Total digits in this number. If scale and precision + are both None, values are stored to limits allowed by the server. + + :param scale: The number of digits after the decimal point. + + :param unsigned: a boolean, optional. + + :param zerofill: Optional. If true, values will be stored as strings + left-padded with zeros. Note that this does not effect the values + returned by the underlying database API, which continue to be + numeric. + + """ + super(NUMERIC, self).__init__(precision=precision, + scale=scale, asdecimal=asdecimal, **kw) + + +class DECIMAL(_NumericType, sqltypes.DECIMAL): + """MySQL DECIMAL type.""" + + __visit_name__ = 'DECIMAL' + + def __init__(self, precision=None, scale=None, asdecimal=True, **kw): + """Construct a DECIMAL. + + :param precision: Total digits in this number. If scale and precision + are both None, values are stored to limits allowed by the server. + + :param scale: The number of digits after the decimal point. + + :param unsigned: a boolean, optional. + + :param zerofill: Optional. If true, values will be stored as strings + left-padded with zeros. Note that this does not effect the values + returned by the underlying database API, which continue to be + numeric. + + """ + super(DECIMAL, self).__init__(precision=precision, scale=scale, + asdecimal=asdecimal, **kw) + + +class DOUBLE(_FloatType): + """MySQL DOUBLE type.""" + + __visit_name__ = 'DOUBLE' + + def __init__(self, precision=None, scale=None, asdecimal=True, **kw): + """Construct a DOUBLE. + + .. note:: + + The :class:`.DOUBLE` type by default converts from float + to Decimal, using a truncation that defaults to 10 digits. + Specify either ``scale=n`` or ``decimal_return_scale=n`` in order + to change this scale, or ``asdecimal=False`` to return values + directly as Python floating points. + + :param precision: Total digits in this number. If scale and precision + are both None, values are stored to limits allowed by the server. + + :param scale: The number of digits after the decimal point. + + :param unsigned: a boolean, optional. + + :param zerofill: Optional. If true, values will be stored as strings + left-padded with zeros. Note that this does not effect the values + returned by the underlying database API, which continue to be + numeric. + + """ + super(DOUBLE, self).__init__(precision=precision, scale=scale, + asdecimal=asdecimal, **kw) + + +class REAL(_FloatType, sqltypes.REAL): + """MySQL REAL type.""" + + __visit_name__ = 'REAL' + + def __init__(self, precision=None, scale=None, asdecimal=True, **kw): + """Construct a REAL. + + .. note:: + + The :class:`.REAL` type by default converts from float + to Decimal, using a truncation that defaults to 10 digits. + Specify either ``scale=n`` or ``decimal_return_scale=n`` in order + to change this scale, or ``asdecimal=False`` to return values + directly as Python floating points. + + :param precision: Total digits in this number. If scale and precision + are both None, values are stored to limits allowed by the server. + + :param scale: The number of digits after the decimal point. + + :param unsigned: a boolean, optional. + + :param zerofill: Optional. If true, values will be stored as strings + left-padded with zeros. Note that this does not effect the values + returned by the underlying database API, which continue to be + numeric. + + """ + super(REAL, self).__init__(precision=precision, scale=scale, + asdecimal=asdecimal, **kw) + + +class FLOAT(_FloatType, sqltypes.FLOAT): + """MySQL FLOAT type.""" + + __visit_name__ = 'FLOAT' + + def __init__(self, precision=None, scale=None, asdecimal=False, **kw): + """Construct a FLOAT. + + :param precision: Total digits in this number. If scale and precision + are both None, values are stored to limits allowed by the server. + + :param scale: The number of digits after the decimal point. + + :param unsigned: a boolean, optional. + + :param zerofill: Optional. If true, values will be stored as strings + left-padded with zeros. Note that this does not effect the values + returned by the underlying database API, which continue to be + numeric. + + """ + super(FLOAT, self).__init__(precision=precision, scale=scale, + asdecimal=asdecimal, **kw) + + def bind_processor(self, dialect): + return None + + +class INTEGER(_IntegerType, sqltypes.INTEGER): + """MySQL INTEGER type.""" + + __visit_name__ = 'INTEGER' + + def __init__(self, display_width=None, **kw): + """Construct an INTEGER. + + :param display_width: Optional, maximum display width for this number. + + :param unsigned: a boolean, optional. + + :param zerofill: Optional. If true, values will be stored as strings + left-padded with zeros. Note that this does not effect the values + returned by the underlying database API, which continue to be + numeric. + + """ + super(INTEGER, self).__init__(display_width=display_width, **kw) + + +class BIGINT(_IntegerType, sqltypes.BIGINT): + """MySQL BIGINTEGER type.""" + + __visit_name__ = 'BIGINT' + + def __init__(self, display_width=None, **kw): + """Construct a BIGINTEGER. + + :param display_width: Optional, maximum display width for this number. + + :param unsigned: a boolean, optional. + + :param zerofill: Optional. If true, values will be stored as strings + left-padded with zeros. Note that this does not effect the values + returned by the underlying database API, which continue to be + numeric. + + """ + super(BIGINT, self).__init__(display_width=display_width, **kw) + + +class MEDIUMINT(_IntegerType): + """MySQL MEDIUMINTEGER type.""" + + __visit_name__ = 'MEDIUMINT' + + def __init__(self, display_width=None, **kw): + """Construct a MEDIUMINTEGER + + :param display_width: Optional, maximum display width for this number. + + :param unsigned: a boolean, optional. + + :param zerofill: Optional. If true, values will be stored as strings + left-padded with zeros. Note that this does not effect the values + returned by the underlying database API, which continue to be + numeric. + + """ + super(MEDIUMINT, self).__init__(display_width=display_width, **kw) + + +class TINYINT(_IntegerType): + """MySQL TINYINT type.""" + + __visit_name__ = 'TINYINT' + + def __init__(self, display_width=None, **kw): + """Construct a TINYINT. + + :param display_width: Optional, maximum display width for this number. + + :param unsigned: a boolean, optional. + + :param zerofill: Optional. If true, values will be stored as strings + left-padded with zeros. Note that this does not effect the values + returned by the underlying database API, which continue to be + numeric. + + """ + super(TINYINT, self).__init__(display_width=display_width, **kw) + + +class SMALLINT(_IntegerType, sqltypes.SMALLINT): + """MySQL SMALLINTEGER type.""" + + __visit_name__ = 'SMALLINT' + + def __init__(self, display_width=None, **kw): + """Construct a SMALLINTEGER. + + :param display_width: Optional, maximum display width for this number. + + :param unsigned: a boolean, optional. + + :param zerofill: Optional. If true, values will be stored as strings + left-padded with zeros. Note that this does not effect the values + returned by the underlying database API, which continue to be + numeric. + + """ + super(SMALLINT, self).__init__(display_width=display_width, **kw) + + +class BIT(sqltypes.TypeEngine): + """MySQL BIT type. + + This type is for MySQL 5.0.3 or greater for MyISAM, and 5.0.5 or greater + for MyISAM, MEMORY, InnoDB and BDB. For older versions, use a + MSTinyInteger() type. + + """ + + __visit_name__ = 'BIT' + + def __init__(self, length=None): + """Construct a BIT. + + :param length: Optional, number of bits. + + """ + self.length = length + + def result_processor(self, dialect, coltype): + """Convert a MySQL's 64 bit, variable length binary string to a long. + + TODO: this is MySQL-db, pyodbc specific. OurSQL and mysqlconnector + already do this, so this logic should be moved to those dialects. + + """ + + def process(value): + if value is not None: + v = 0 + for i in value: + if not isinstance(i, int): + i = ord(i) # convert byte to int on Python 2 + v = v << 8 | i + return v + return value + return process + + +class TIME(sqltypes.TIME): + """MySQL TIME type. """ + + __visit_name__ = 'TIME' + + def __init__(self, timezone=False, fsp=None): + """Construct a MySQL TIME type. + + :param timezone: not used by the MySQL dialect. + :param fsp: fractional seconds precision value. + MySQL 5.6 supports storage of fractional seconds; + this parameter will be used when emitting DDL + for the TIME type. + + .. note:: + + DBAPI driver support for fractional seconds may + be limited; current support includes + MySQL Connector/Python. + + .. versionadded:: 0.8 The MySQL-specific TIME + type as well as fractional seconds support. + + """ + super(TIME, self).__init__(timezone=timezone) + self.fsp = fsp + + def result_processor(self, dialect, coltype): + time = datetime.time + + def process(value): + # convert from a timedelta value + if value is not None: + microseconds = value.microseconds + seconds = value.seconds + minutes = seconds // 60 + return time(minutes // 60, + minutes % 60, + seconds - minutes * 60, + microsecond=microseconds) + else: + return None + return process + + +class TIMESTAMP(sqltypes.TIMESTAMP): + """MySQL TIMESTAMP type. + + """ + + __visit_name__ = 'TIMESTAMP' + + def __init__(self, timezone=False, fsp=None): + """Construct a MySQL TIMESTAMP type. + + :param timezone: not used by the MySQL dialect. + :param fsp: fractional seconds precision value. + MySQL 5.6.4 supports storage of fractional seconds; + this parameter will be used when emitting DDL + for the TIMESTAMP type. + + .. note:: + + DBAPI driver support for fractional seconds may + be limited; current support includes + MySQL Connector/Python. + + .. versionadded:: 0.8.5 Added MySQL-specific :class:`.mysql.TIMESTAMP` + with fractional seconds support. + + """ + super(TIMESTAMP, self).__init__(timezone=timezone) + self.fsp = fsp + + +class DATETIME(sqltypes.DATETIME): + """MySQL DATETIME type. + + """ + + __visit_name__ = 'DATETIME' + + def __init__(self, timezone=False, fsp=None): + """Construct a MySQL DATETIME type. + + :param timezone: not used by the MySQL dialect. + :param fsp: fractional seconds precision value. + MySQL 5.6.4 supports storage of fractional seconds; + this parameter will be used when emitting DDL + for the DATETIME type. + + .. note:: + + DBAPI driver support for fractional seconds may + be limited; current support includes + MySQL Connector/Python. + + .. versionadded:: 0.8.5 Added MySQL-specific :class:`.mysql.DATETIME` + with fractional seconds support. + + """ + super(DATETIME, self).__init__(timezone=timezone) + self.fsp = fsp + + +class YEAR(sqltypes.TypeEngine): + """MySQL YEAR type, for single byte storage of years 1901-2155.""" + + __visit_name__ = 'YEAR' + + def __init__(self, display_width=None): + self.display_width = display_width + + +class TEXT(_StringType, sqltypes.TEXT): + """MySQL TEXT type, for text up to 2^16 characters.""" + + __visit_name__ = 'TEXT' + + def __init__(self, length=None, **kw): + """Construct a TEXT. + + :param length: Optional, if provided the server may optimize storage + by substituting the smallest TEXT type sufficient to store + ``length`` characters. + + :param charset: Optional, a column-level character set for this string + value. Takes precedence to 'ascii' or 'unicode' short-hand. + + :param collation: Optional, a column-level collation for this string + value. Takes precedence to 'binary' short-hand. + + :param ascii: Defaults to False: short-hand for the ``latin1`` + character set, generates ASCII in schema. + + :param unicode: Defaults to False: short-hand for the ``ucs2`` + character set, generates UNICODE in schema. + + :param national: Optional. If true, use the server's configured + national character set. + + :param binary: Defaults to False: short-hand, pick the binary + collation type that matches the column's character set. Generates + BINARY in schema. This does not affect the type of data stored, + only the collation of character data. + + """ + super(TEXT, self).__init__(length=length, **kw) + + +class TINYTEXT(_StringType): + """MySQL TINYTEXT type, for text up to 2^8 characters.""" + + __visit_name__ = 'TINYTEXT' + + def __init__(self, **kwargs): + """Construct a TINYTEXT. + + :param charset: Optional, a column-level character set for this string + value. Takes precedence to 'ascii' or 'unicode' short-hand. + + :param collation: Optional, a column-level collation for this string + value. Takes precedence to 'binary' short-hand. + + :param ascii: Defaults to False: short-hand for the ``latin1`` + character set, generates ASCII in schema. + + :param unicode: Defaults to False: short-hand for the ``ucs2`` + character set, generates UNICODE in schema. + + :param national: Optional. If true, use the server's configured + national character set. + + :param binary: Defaults to False: short-hand, pick the binary + collation type that matches the column's character set. Generates + BINARY in schema. This does not affect the type of data stored, + only the collation of character data. + + """ + super(TINYTEXT, self).__init__(**kwargs) + + +class MEDIUMTEXT(_StringType): + """MySQL MEDIUMTEXT type, for text up to 2^24 characters.""" + + __visit_name__ = 'MEDIUMTEXT' + + def __init__(self, **kwargs): + """Construct a MEDIUMTEXT. + + :param charset: Optional, a column-level character set for this string + value. Takes precedence to 'ascii' or 'unicode' short-hand. + + :param collation: Optional, a column-level collation for this string + value. Takes precedence to 'binary' short-hand. + + :param ascii: Defaults to False: short-hand for the ``latin1`` + character set, generates ASCII in schema. + + :param unicode: Defaults to False: short-hand for the ``ucs2`` + character set, generates UNICODE in schema. + + :param national: Optional. If true, use the server's configured + national character set. + + :param binary: Defaults to False: short-hand, pick the binary + collation type that matches the column's character set. Generates + BINARY in schema. This does not affect the type of data stored, + only the collation of character data. + + """ + super(MEDIUMTEXT, self).__init__(**kwargs) + + +class LONGTEXT(_StringType): + """MySQL LONGTEXT type, for text up to 2^32 characters.""" + + __visit_name__ = 'LONGTEXT' + + def __init__(self, **kwargs): + """Construct a LONGTEXT. + + :param charset: Optional, a column-level character set for this string + value. Takes precedence to 'ascii' or 'unicode' short-hand. + + :param collation: Optional, a column-level collation for this string + value. Takes precedence to 'binary' short-hand. + + :param ascii: Defaults to False: short-hand for the ``latin1`` + character set, generates ASCII in schema. + + :param unicode: Defaults to False: short-hand for the ``ucs2`` + character set, generates UNICODE in schema. + + :param national: Optional. If true, use the server's configured + national character set. + + :param binary: Defaults to False: short-hand, pick the binary + collation type that matches the column's character set. Generates + BINARY in schema. This does not affect the type of data stored, + only the collation of character data. + + """ + super(LONGTEXT, self).__init__(**kwargs) + + +class VARCHAR(_StringType, sqltypes.VARCHAR): + """MySQL VARCHAR type, for variable-length character data.""" + + __visit_name__ = 'VARCHAR' + + def __init__(self, length=None, **kwargs): + """Construct a VARCHAR. + + :param charset: Optional, a column-level character set for this string + value. Takes precedence to 'ascii' or 'unicode' short-hand. + + :param collation: Optional, a column-level collation for this string + value. Takes precedence to 'binary' short-hand. + + :param ascii: Defaults to False: short-hand for the ``latin1`` + character set, generates ASCII in schema. + + :param unicode: Defaults to False: short-hand for the ``ucs2`` + character set, generates UNICODE in schema. + + :param national: Optional. If true, use the server's configured + national character set. + + :param binary: Defaults to False: short-hand, pick the binary + collation type that matches the column's character set. Generates + BINARY in schema. This does not affect the type of data stored, + only the collation of character data. + + """ + super(VARCHAR, self).__init__(length=length, **kwargs) + + +class CHAR(_StringType, sqltypes.CHAR): + """MySQL CHAR type, for fixed-length character data.""" + + __visit_name__ = 'CHAR' + + def __init__(self, length=None, **kwargs): + """Construct a CHAR. + + :param length: Maximum data length, in characters. + + :param binary: Optional, use the default binary collation for the + national character set. This does not affect the type of data + stored, use a BINARY type for binary data. + + :param collation: Optional, request a particular collation. Must be + compatible with the national character set. + + """ + super(CHAR, self).__init__(length=length, **kwargs) + + @classmethod + def _adapt_string_for_cast(self, type_): + # copy the given string type into a CHAR + # for the purposes of rendering a CAST expression + type_ = sqltypes.to_instance(type_) + if isinstance(type_, sqltypes.CHAR): + return type_ + elif isinstance(type_, _StringType): + return CHAR( + length=type_.length, + charset=type_.charset, + collation=type_.collation, + ascii=type_.ascii, + binary=type_.binary, + unicode=type_.unicode, + national=False # not supported in CAST + ) + else: + return CHAR(length=type_.length) + + +class NVARCHAR(_StringType, sqltypes.NVARCHAR): + """MySQL NVARCHAR type. + + For variable-length character data in the server's configured national + character set. + """ + + __visit_name__ = 'NVARCHAR' + + def __init__(self, length=None, **kwargs): + """Construct an NVARCHAR. + + :param length: Maximum data length, in characters. + + :param binary: Optional, use the default binary collation for the + national character set. This does not affect the type of data + stored, use a BINARY type for binary data. + + :param collation: Optional, request a particular collation. Must be + compatible with the national character set. + + """ + kwargs['national'] = True + super(NVARCHAR, self).__init__(length=length, **kwargs) + + +class NCHAR(_StringType, sqltypes.NCHAR): + """MySQL NCHAR type. + + For fixed-length character data in the server's configured national + character set. + """ + + __visit_name__ = 'NCHAR' + + def __init__(self, length=None, **kwargs): + """Construct an NCHAR. + + :param length: Maximum data length, in characters. + + :param binary: Optional, use the default binary collation for the + national character set. This does not affect the type of data + stored, use a BINARY type for binary data. + + :param collation: Optional, request a particular collation. Must be + compatible with the national character set. + + """ + kwargs['national'] = True + super(NCHAR, self).__init__(length=length, **kwargs) + + +class TINYBLOB(sqltypes._Binary): + """MySQL TINYBLOB type, for binary data up to 2^8 bytes.""" + + __visit_name__ = 'TINYBLOB' + + +class MEDIUMBLOB(sqltypes._Binary): + """MySQL MEDIUMBLOB type, for binary data up to 2^24 bytes.""" + + __visit_name__ = 'MEDIUMBLOB' + + +class LONGBLOB(sqltypes._Binary): + """MySQL LONGBLOB type, for binary data up to 2^32 bytes.""" + + __visit_name__ = 'LONGBLOB' diff --git a/app/lib/sqlalchemy/dialects/mysql/zxjdbc.py b/app/lib/sqlalchemy/dialects/mysql/zxjdbc.py new file mode 100644 index 0000000..9c92be4 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/mysql/zxjdbc.py @@ -0,0 +1,117 @@ +# mysql/zxjdbc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" + +.. dialect:: mysql+zxjdbc + :name: zxjdbc for Jython + :dbapi: zxjdbc + :connectstring: mysql+zxjdbc://:@[:]/\ + + :driverurl: http://dev.mysql.com/downloads/connector/j/ + + .. note:: Jython is not supported by current versions of SQLAlchemy. The + zxjdbc dialect should be considered as experimental. + +Character Sets +-------------- + +SQLAlchemy zxjdbc dialects pass unicode straight through to the +zxjdbc/JDBC layer. To allow multiple character sets to be sent from the +MySQL Connector/J JDBC driver, by default SQLAlchemy sets its +``characterEncoding`` connection property to ``UTF-8``. It may be +overridden via a ``create_engine`` URL parameter. + +""" +import re + +from ... import types as sqltypes, util +from ...connectors.zxJDBC import ZxJDBCConnector +from .base import BIT, MySQLDialect, MySQLExecutionContext + + +class _ZxJDBCBit(BIT): + def result_processor(self, dialect, coltype): + """Converts boolean or byte arrays from MySQL Connector/J to longs.""" + def process(value): + if value is None: + return value + if isinstance(value, bool): + return int(value) + v = 0 + for i in value: + v = v << 8 | (i & 0xff) + value = v + return value + return process + + +class MySQLExecutionContext_zxjdbc(MySQLExecutionContext): + def get_lastrowid(self): + cursor = self.create_cursor() + cursor.execute("SELECT LAST_INSERT_ID()") + lastrowid = cursor.fetchone()[0] + cursor.close() + return lastrowid + + +class MySQLDialect_zxjdbc(ZxJDBCConnector, MySQLDialect): + jdbc_db_name = 'mysql' + jdbc_driver_name = 'com.mysql.jdbc.Driver' + + execution_ctx_cls = MySQLExecutionContext_zxjdbc + + colspecs = util.update_copy( + MySQLDialect.colspecs, + { + sqltypes.Time: sqltypes.Time, + BIT: _ZxJDBCBit + } + ) + + def _detect_charset(self, connection): + """Sniff out the character set in use for connection results.""" + # Prefer 'character_set_results' for the current connection over the + # value in the driver. SET NAMES or individual variable SETs will + # change the charset without updating the driver's view of the world. + # + # If it's decided that issuing that sort of SQL leaves you SOL, then + # this can prefer the driver value. + rs = connection.execute("SHOW VARIABLES LIKE 'character_set%%'") + opts = dict((row[0], row[1]) for row in self._compat_fetchall(rs)) + for key in ('character_set_connection', 'character_set'): + if opts.get(key, None): + return opts[key] + + util.warn("Could not detect the connection character set. " + "Assuming latin1.") + return 'latin1' + + def _driver_kwargs(self): + """return kw arg dict to be sent to connect().""" + return dict(characterEncoding='UTF-8', yearIsDateType='false') + + def _extract_error_code(self, exception): + # e.g.: DBAPIError: (Error) Table 'test.u2' doesn't exist + # [SQLCode: 1146], [SQLState: 42S02] 'DESCRIBE `u2`' () + m = re.compile(r"\[SQLCode\: (\d+)\]").search(str(exception.args)) + c = m.group(1) + if c: + return int(c) + + def _get_server_version_info(self, connection): + dbapi_con = connection.connection + version = [] + r = re.compile(r'[.\-]') + for n in r.split(dbapi_con.dbversion): + try: + version.append(int(n)) + except ValueError: + version.append(n) + return tuple(version) + +dialect = MySQLDialect_zxjdbc diff --git a/app/lib/sqlalchemy/dialects/oracle/__init__.py b/app/lib/sqlalchemy/dialects/oracle/__init__.py new file mode 100644 index 0000000..210fe50 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/oracle/__init__.py @@ -0,0 +1,24 @@ +# oracle/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from sqlalchemy.dialects.oracle import base, cx_oracle, zxjdbc + +base.dialect = cx_oracle.dialect + +from sqlalchemy.dialects.oracle.base import \ + VARCHAR, NVARCHAR, CHAR, DATE, NUMBER,\ + BLOB, BFILE, CLOB, NCLOB, TIMESTAMP, RAW,\ + FLOAT, DOUBLE_PRECISION, LONG, dialect, INTERVAL,\ + VARCHAR2, NVARCHAR2, ROWID, dialect + + +__all__ = ( + 'VARCHAR', 'NVARCHAR', 'CHAR', 'DATE', 'NUMBER', + 'BLOB', 'BFILE', 'CLOB', 'NCLOB', 'TIMESTAMP', 'RAW', + 'FLOAT', 'DOUBLE_PRECISION', 'LONG', 'dialect', 'INTERVAL', + 'VARCHAR2', 'NVARCHAR2', 'ROWID' +) diff --git a/app/lib/sqlalchemy/dialects/oracle/base.py b/app/lib/sqlalchemy/dialects/oracle/base.py new file mode 100644 index 0000000..7c23e9c --- /dev/null +++ b/app/lib/sqlalchemy/dialects/oracle/base.py @@ -0,0 +1,1602 @@ +# oracle/base.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: oracle + :name: Oracle + + Oracle version 8 through current (11g at the time of this writing) are + supported. + +Connect Arguments +----------------- + +The dialect supports several :func:`~sqlalchemy.create_engine()` arguments +which affect the behavior of the dialect regardless of driver in use. + +* ``use_ansi`` - Use ANSI JOIN constructs (see the section on Oracle 8). + Defaults to ``True``. If ``False``, Oracle-8 compatible constructs are used + for joins. + +* ``optimize_limits`` - defaults to ``False``. see the section on + LIMIT/OFFSET. + +* ``use_binds_for_limits`` - defaults to ``True``. see the section on + LIMIT/OFFSET. + +Auto Increment Behavior +----------------------- + +SQLAlchemy Table objects which include integer primary keys are usually +assumed to have "autoincrementing" behavior, meaning they can generate their +own primary key values upon INSERT. Since Oracle has no "autoincrement" +feature, SQLAlchemy relies upon sequences to produce these values. With the +Oracle dialect, *a sequence must always be explicitly specified to enable +autoincrement*. This is divergent with the majority of documentation +examples which assume the usage of an autoincrement-capable database. To +specify sequences, use the sqlalchemy.schema.Sequence object which is passed +to a Column construct:: + + t = Table('mytable', metadata, + Column('id', Integer, Sequence('id_seq'), primary_key=True), + Column(...), ... + ) + +This step is also required when using table reflection, i.e. autoload=True:: + + t = Table('mytable', metadata, + Column('id', Integer, Sequence('id_seq'), primary_key=True), + autoload=True + ) + +Identifier Casing +----------------- + +In Oracle, the data dictionary represents all case insensitive identifier +names using UPPERCASE text. SQLAlchemy on the other hand considers an +all-lower case identifier name to be case insensitive. The Oracle dialect +converts all case insensitive identifiers to and from those two formats during +schema level communication, such as reflection of tables and indexes. Using +an UPPERCASE name on the SQLAlchemy side indicates a case sensitive +identifier, and SQLAlchemy will quote the name - this will cause mismatches +against data dictionary data received from Oracle, so unless identifier names +have been truly created as case sensitive (i.e. using quoted names), all +lowercase names should be used on the SQLAlchemy side. + + +LIMIT/OFFSET Support +-------------------- + +Oracle has no support for the LIMIT or OFFSET keywords. SQLAlchemy uses +a wrapped subquery approach in conjunction with ROWNUM. The exact methodology +is taken from +http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html . + +There are two options which affect its behavior: + +* the "FIRST ROWS()" optimization keyword is not used by default. To enable + the usage of this optimization directive, specify ``optimize_limits=True`` + to :func:`.create_engine`. +* the values passed for the limit/offset are sent as bound parameters. Some + users have observed that Oracle produces a poor query plan when the values + are sent as binds and not rendered literally. To render the limit/offset + values literally within the SQL statement, specify + ``use_binds_for_limits=False`` to :func:`.create_engine`. + +Some users have reported better performance when the entirely different +approach of a window query is used, i.e. ROW_NUMBER() OVER (ORDER BY), to +provide LIMIT/OFFSET (note that the majority of users don't observe this). +To suit this case the method used for LIMIT/OFFSET can be replaced entirely. +See the recipe at +http://www.sqlalchemy.org/trac/wiki/UsageRecipes/WindowFunctionsByDefault +which installs a select compiler that overrides the generation of limit/offset +with a window function. + +.. _oracle_returning: + +RETURNING Support +----------------- + +The Oracle database supports a limited form of RETURNING, in order to retrieve +result sets of matched rows from INSERT, UPDATE and DELETE statements. +Oracle's RETURNING..INTO syntax only supports one row being returned, as it +relies upon OUT parameters in order to function. In addition, supported +DBAPIs have further limitations (see :ref:`cx_oracle_returning`). + +SQLAlchemy's "implicit returning" feature, which employs RETURNING within an +INSERT and sometimes an UPDATE statement in order to fetch newly generated +primary key values and other SQL defaults and expressions, is normally enabled +on the Oracle backend. By default, "implicit returning" typically only +fetches the value of a single ``nextval(some_seq)`` expression embedded into +an INSERT in order to increment a sequence within an INSERT statement and get +the value back at the same time. To disable this feature across the board, +specify ``implicit_returning=False`` to :func:`.create_engine`:: + + engine = create_engine("oracle://scott:tiger@dsn", + implicit_returning=False) + +Implicit returning can also be disabled on a table-by-table basis as a table +option:: + + # Core Table + my_table = Table("my_table", metadata, ..., implicit_returning=False) + + + # declarative + class MyClass(Base): + __tablename__ = 'my_table' + __table_args__ = {"implicit_returning": False} + +.. seealso:: + + :ref:`cx_oracle_returning` - additional cx_oracle-specific restrictions on + implicit returning. + +ON UPDATE CASCADE +----------------- + +Oracle doesn't have native ON UPDATE CASCADE functionality. A trigger based +solution is available at +http://asktom.oracle.com/tkyte/update_cascade/index.html . + +When using the SQLAlchemy ORM, the ORM has limited ability to manually issue +cascading updates - specify ForeignKey objects using the +"deferrable=True, initially='deferred'" keyword arguments, +and specify "passive_updates=False" on each relationship(). + +Oracle 8 Compatibility +---------------------- + +When Oracle 8 is detected, the dialect internally configures itself to the +following behaviors: + +* the use_ansi flag is set to False. This has the effect of converting all + JOIN phrases into the WHERE clause, and in the case of LEFT OUTER JOIN + makes use of Oracle's (+) operator. + +* the NVARCHAR2 and NCLOB datatypes are no longer generated as DDL when + the :class:`~sqlalchemy.types.Unicode` is used - VARCHAR2 and CLOB are + issued instead. This because these types don't seem to work correctly on + Oracle 8 even though they are available. The + :class:`~sqlalchemy.types.NVARCHAR` and + :class:`~sqlalchemy.dialects.oracle.NCLOB` types will always generate + NVARCHAR2 and NCLOB. + +* the "native unicode" mode is disabled when using cx_oracle, i.e. SQLAlchemy + encodes all Python unicode objects to "string" before passing in as bind + parameters. + +Synonym/DBLINK Reflection +------------------------- + +When using reflection with Table objects, the dialect can optionally search +for tables indicated by synonyms, either in local or remote schemas or +accessed over DBLINK, by passing the flag ``oracle_resolve_synonyms=True`` as +a keyword argument to the :class:`.Table` construct:: + + some_table = Table('some_table', autoload=True, + autoload_with=some_engine, + oracle_resolve_synonyms=True) + +When this flag is set, the given name (such as ``some_table`` above) will +be searched not just in the ``ALL_TABLES`` view, but also within the +``ALL_SYNONYMS`` view to see if this name is actually a synonym to another +name. If the synonym is located and refers to a DBLINK, the oracle dialect +knows how to locate the table's information using DBLINK syntax(e.g. +``@dblink``). + +``oracle_resolve_synonyms`` is accepted wherever reflection arguments are +accepted, including methods such as :meth:`.MetaData.reflect` and +:meth:`.Inspector.get_columns`. + +If synonyms are not in use, this flag should be left disabled. + +Table names with SYSTEM/SYSAUX tablespaces +------------------------------------------- + +The :meth:`.Inspector.get_table_names` and +:meth:`.Inspector.get_temp_table_names` +methods each return a list of table names for the current engine. These methods +are also part of the reflection which occurs within an operation such as +:meth:`.MetaData.reflect`. By default, these operations exclude the ``SYSTEM`` +and ``SYSAUX`` tablespaces from the operation. In order to change this, the +default list of tablespaces excluded can be changed at the engine level using +the ``exclude_tablespaces`` parameter:: + + # exclude SYSAUX and SOME_TABLESPACE, but not SYSTEM + e = create_engine( + "oracle://scott:tiger@xe", + exclude_tablespaces=["SYSAUX", "SOME_TABLESPACE"]) + +.. versionadded:: 1.1 + +DateTime Compatibility +---------------------- + +Oracle has no datatype known as ``DATETIME``, it instead has only ``DATE``, +which can actually store a date and time value. For this reason, the Oracle +dialect provides a type :class:`.oracle.DATE` which is a subclass of +:class:`.DateTime`. This type has no special behavior, and is only +present as a "marker" for this type; additionally, when a database column +is reflected and the type is reported as ``DATE``, the time-supporting +:class:`.oracle.DATE` type is used. + +.. versionchanged:: 0.9.4 Added :class:`.oracle.DATE` to subclass + :class:`.DateTime`. This is a change as previous versions + would reflect a ``DATE`` column as :class:`.types.DATE`, which subclasses + :class:`.Date`. The only significance here is for schemes that are + examining the type of column for use in special Python translations or + for migrating schemas to other database backends. + +.. _oracle_table_options: + +Oracle Table Options +------------------------- + +The CREATE TABLE phrase supports the following options with Oracle +in conjunction with the :class:`.Table` construct: + + +* ``ON COMMIT``:: + + Table( + "some_table", metadata, ..., + prefixes=['GLOBAL TEMPORARY'], oracle_on_commit='PRESERVE ROWS') + +.. versionadded:: 1.0.0 + +* ``COMPRESS``:: + + Table('mytable', metadata, Column('data', String(32)), + oracle_compress=True) + + Table('mytable', metadata, Column('data', String(32)), + oracle_compress=6) + + The ``oracle_compress`` parameter accepts either an integer compression + level, or ``True`` to use the default compression level. + +.. versionadded:: 1.0.0 + +.. _oracle_index_options: + +Oracle Specific Index Options +----------------------------- + +Bitmap Indexes +~~~~~~~~~~~~~~ + +You can specify the ``oracle_bitmap`` parameter to create a bitmap index +instead of a B-tree index:: + + Index('my_index', my_table.c.data, oracle_bitmap=True) + +Bitmap indexes cannot be unique and cannot be compressed. SQLAlchemy will not +check for such limitations, only the database will. + +.. versionadded:: 1.0.0 + +Index compression +~~~~~~~~~~~~~~~~~ + +Oracle has a more efficient storage mode for indexes containing lots of +repeated values. Use the ``oracle_compress`` parameter to turn on key c +ompression:: + + Index('my_index', my_table.c.data, oracle_compress=True) + + Index('my_index', my_table.c.data1, my_table.c.data2, unique=True, + oracle_compress=1) + +The ``oracle_compress`` parameter accepts either an integer specifying the +number of prefix columns to compress, or ``True`` to use the default (all +columns for non-unique indexes, all but the last column for unique indexes). + +.. versionadded:: 1.0.0 + +""" + +import re + +from sqlalchemy import util, sql +from sqlalchemy.engine import default, reflection +from sqlalchemy.sql import compiler, visitors, expression, util as sql_util +from sqlalchemy.sql import operators as sql_operators +from sqlalchemy.sql.elements import quoted_name +from sqlalchemy import types as sqltypes, schema as sa_schema +from sqlalchemy.types import VARCHAR, NVARCHAR, CHAR, \ + BLOB, CLOB, TIMESTAMP, FLOAT + +RESERVED_WORDS = \ + set('SHARE RAW DROP BETWEEN FROM DESC OPTION PRIOR LONG THEN ' + 'DEFAULT ALTER IS INTO MINUS INTEGER NUMBER GRANT IDENTIFIED ' + 'ALL TO ORDER ON FLOAT DATE HAVING CLUSTER NOWAIT RESOURCE ' + 'ANY TABLE INDEX FOR UPDATE WHERE CHECK SMALLINT WITH DELETE ' + 'BY ASC REVOKE LIKE SIZE RENAME NOCOMPRESS NULL GROUP VALUES ' + 'AS IN VIEW EXCLUSIVE COMPRESS SYNONYM SELECT INSERT EXISTS ' + 'NOT TRIGGER ELSE CREATE INTERSECT PCTFREE DISTINCT USER ' + 'CONNECT SET MODE OF UNIQUE VARCHAR2 VARCHAR LOCK OR CHAR ' + 'DECIMAL UNION PUBLIC AND START UID COMMENT CURRENT LEVEL'.split()) + +NO_ARG_FNS = set('UID CURRENT_DATE SYSDATE USER ' + 'CURRENT_TIME CURRENT_TIMESTAMP'.split()) + + +class RAW(sqltypes._Binary): + __visit_name__ = 'RAW' +OracleRaw = RAW + + +class NCLOB(sqltypes.Text): + __visit_name__ = 'NCLOB' + + +class VARCHAR2(VARCHAR): + __visit_name__ = 'VARCHAR2' + +NVARCHAR2 = NVARCHAR + + +class NUMBER(sqltypes.Numeric, sqltypes.Integer): + __visit_name__ = 'NUMBER' + + def __init__(self, precision=None, scale=None, asdecimal=None): + if asdecimal is None: + asdecimal = bool(scale and scale > 0) + + super(NUMBER, self).__init__( + precision=precision, scale=scale, asdecimal=asdecimal) + + def adapt(self, impltype): + ret = super(NUMBER, self).adapt(impltype) + # leave a hint for the DBAPI handler + ret._is_oracle_number = True + return ret + + @property + def _type_affinity(self): + if bool(self.scale and self.scale > 0): + return sqltypes.Numeric + else: + return sqltypes.Integer + + +class DOUBLE_PRECISION(sqltypes.Numeric): + __visit_name__ = 'DOUBLE_PRECISION' + + def __init__(self, precision=None, scale=None, asdecimal=None): + if asdecimal is None: + asdecimal = False + + super(DOUBLE_PRECISION, self).__init__( + precision=precision, scale=scale, asdecimal=asdecimal) + + +class BFILE(sqltypes.LargeBinary): + __visit_name__ = 'BFILE' + + +class LONG(sqltypes.Text): + __visit_name__ = 'LONG' + + +class DATE(sqltypes.DateTime): + """Provide the oracle DATE type. + + This type has no special Python behavior, except that it subclasses + :class:`.types.DateTime`; this is to suit the fact that the Oracle + ``DATE`` type supports a time value. + + .. versionadded:: 0.9.4 + + """ + __visit_name__ = 'DATE' + + def _compare_type_affinity(self, other): + return other._type_affinity in (sqltypes.DateTime, sqltypes.Date) + + +class INTERVAL(sqltypes.TypeEngine): + __visit_name__ = 'INTERVAL' + + def __init__(self, + day_precision=None, + second_precision=None): + """Construct an INTERVAL. + + Note that only DAY TO SECOND intervals are currently supported. + This is due to a lack of support for YEAR TO MONTH intervals + within available DBAPIs (cx_oracle and zxjdbc). + + :param day_precision: the day precision value. this is the number of + digits to store for the day field. Defaults to "2" + :param second_precision: the second precision value. this is the + number of digits to store for the fractional seconds field. + Defaults to "6". + + """ + self.day_precision = day_precision + self.second_precision = second_precision + + @classmethod + def _adapt_from_generic_interval(cls, interval): + return INTERVAL(day_precision=interval.day_precision, + second_precision=interval.second_precision) + + @property + def _type_affinity(self): + return sqltypes.Interval + + +class ROWID(sqltypes.TypeEngine): + """Oracle ROWID type. + + When used in a cast() or similar, generates ROWID. + + """ + __visit_name__ = 'ROWID' + + +class _OracleBoolean(sqltypes.Boolean): + def get_dbapi_type(self, dbapi): + return dbapi.NUMBER + +colspecs = { + sqltypes.Boolean: _OracleBoolean, + sqltypes.Interval: INTERVAL, + sqltypes.DateTime: DATE +} + +ischema_names = { + 'VARCHAR2': VARCHAR, + 'NVARCHAR2': NVARCHAR, + 'CHAR': CHAR, + 'DATE': DATE, + 'NUMBER': NUMBER, + 'BLOB': BLOB, + 'BFILE': BFILE, + 'CLOB': CLOB, + 'NCLOB': NCLOB, + 'TIMESTAMP': TIMESTAMP, + 'TIMESTAMP WITH TIME ZONE': TIMESTAMP, + 'INTERVAL DAY TO SECOND': INTERVAL, + 'RAW': RAW, + 'FLOAT': FLOAT, + 'DOUBLE PRECISION': DOUBLE_PRECISION, + 'LONG': LONG, +} + + +class OracleTypeCompiler(compiler.GenericTypeCompiler): + # Note: + # Oracle DATE == DATETIME + # Oracle does not allow milliseconds in DATE + # Oracle does not support TIME columns + + def visit_datetime(self, type_, **kw): + return self.visit_DATE(type_, **kw) + + def visit_float(self, type_, **kw): + return self.visit_FLOAT(type_, **kw) + + def visit_unicode(self, type_, **kw): + if self.dialect._supports_nchar: + return self.visit_NVARCHAR2(type_, **kw) + else: + return self.visit_VARCHAR2(type_, **kw) + + def visit_INTERVAL(self, type_, **kw): + return "INTERVAL DAY%s TO SECOND%s" % ( + type_.day_precision is not None and + "(%d)" % type_.day_precision or + "", + type_.second_precision is not None and + "(%d)" % type_.second_precision or + "", + ) + + def visit_LONG(self, type_, **kw): + return "LONG" + + def visit_TIMESTAMP(self, type_, **kw): + if type_.timezone: + return "TIMESTAMP WITH TIME ZONE" + else: + return "TIMESTAMP" + + def visit_DOUBLE_PRECISION(self, type_, **kw): + return self._generate_numeric(type_, "DOUBLE PRECISION", **kw) + + def visit_NUMBER(self, type_, **kw): + return self._generate_numeric(type_, "NUMBER", **kw) + + def _generate_numeric(self, type_, name, precision=None, scale=None, **kw): + if precision is None: + precision = type_.precision + + if scale is None: + scale = getattr(type_, 'scale', None) + + if precision is None: + return name + elif scale is None: + n = "%(name)s(%(precision)s)" + return n % {'name': name, 'precision': precision} + else: + n = "%(name)s(%(precision)s, %(scale)s)" + return n % {'name': name, 'precision': precision, 'scale': scale} + + def visit_string(self, type_, **kw): + return self.visit_VARCHAR2(type_, **kw) + + def visit_VARCHAR2(self, type_, **kw): + return self._visit_varchar(type_, '', '2') + + def visit_NVARCHAR2(self, type_, **kw): + return self._visit_varchar(type_, 'N', '2') + visit_NVARCHAR = visit_NVARCHAR2 + + def visit_VARCHAR(self, type_, **kw): + return self._visit_varchar(type_, '', '') + + def _visit_varchar(self, type_, n, num): + if not type_.length: + return "%(n)sVARCHAR%(two)s" % {'two': num, 'n': n} + elif not n and self.dialect._supports_char_length: + varchar = "VARCHAR%(two)s(%(length)s CHAR)" + return varchar % {'length': type_.length, 'two': num} + else: + varchar = "%(n)sVARCHAR%(two)s(%(length)s)" + return varchar % {'length': type_.length, 'two': num, 'n': n} + + def visit_text(self, type_, **kw): + return self.visit_CLOB(type_, **kw) + + def visit_unicode_text(self, type_, **kw): + if self.dialect._supports_nchar: + return self.visit_NCLOB(type_, **kw) + else: + return self.visit_CLOB(type_, **kw) + + def visit_large_binary(self, type_, **kw): + return self.visit_BLOB(type_, **kw) + + def visit_big_integer(self, type_, **kw): + return self.visit_NUMBER(type_, precision=19, **kw) + + def visit_boolean(self, type_, **kw): + return self.visit_SMALLINT(type_, **kw) + + def visit_RAW(self, type_, **kw): + if type_.length: + return "RAW(%(length)s)" % {'length': type_.length} + else: + return "RAW" + + def visit_ROWID(self, type_, **kw): + return "ROWID" + + +class OracleCompiler(compiler.SQLCompiler): + """Oracle compiler modifies the lexical structure of Select + statements to work under non-ANSI configured Oracle databases, if + the use_ansi flag is False. + """ + + compound_keywords = util.update_copy( + compiler.SQLCompiler.compound_keywords, + { + expression.CompoundSelect.EXCEPT: 'MINUS' + } + ) + + def __init__(self, *args, **kwargs): + self.__wheres = {} + self._quoted_bind_names = {} + super(OracleCompiler, self).__init__(*args, **kwargs) + + def visit_mod_binary(self, binary, operator, **kw): + return "mod(%s, %s)" % (self.process(binary.left, **kw), + self.process(binary.right, **kw)) + + def visit_now_func(self, fn, **kw): + return "CURRENT_TIMESTAMP" + + def visit_char_length_func(self, fn, **kw): + return "LENGTH" + self.function_argspec(fn, **kw) + + def visit_match_op_binary(self, binary, operator, **kw): + return "CONTAINS (%s, %s)" % (self.process(binary.left), + self.process(binary.right)) + + def visit_true(self, expr, **kw): + return '1' + + def visit_false(self, expr, **kw): + return '0' + + def get_cte_preamble(self, recursive): + return "WITH" + + def get_select_hint_text(self, byfroms): + return " ".join( + "/*+ %s */" % text for table, text in byfroms.items() + ) + + def function_argspec(self, fn, **kw): + if len(fn.clauses) > 0 or fn.name.upper() not in NO_ARG_FNS: + return compiler.SQLCompiler.function_argspec(self, fn, **kw) + else: + return "" + + def default_from(self): + """Called when a ``SELECT`` statement has no froms, + and no ``FROM`` clause is to be appended. + + The Oracle compiler tacks a "FROM DUAL" to the statement. + """ + + return " FROM DUAL" + + def visit_join(self, join, **kwargs): + if self.dialect.use_ansi: + return compiler.SQLCompiler.visit_join(self, join, **kwargs) + else: + kwargs['asfrom'] = True + if isinstance(join.right, expression.FromGrouping): + right = join.right.element + else: + right = join.right + return self.process(join.left, **kwargs) + \ + ", " + self.process(right, **kwargs) + + def _get_nonansi_join_whereclause(self, froms): + clauses = [] + + def visit_join(join): + if join.isouter: + def visit_binary(binary): + if binary.operator == sql_operators.eq: + if join.right.is_derived_from(binary.left.table): + binary.left = _OuterJoinColumn(binary.left) + elif join.right.is_derived_from(binary.right.table): + binary.right = _OuterJoinColumn(binary.right) + clauses.append(visitors.cloned_traverse( + join.onclause, {}, {'binary': visit_binary})) + else: + clauses.append(join.onclause) + + for j in join.left, join.right: + if isinstance(j, expression.Join): + visit_join(j) + elif isinstance(j, expression.FromGrouping): + visit_join(j.element) + + for f in froms: + if isinstance(f, expression.Join): + visit_join(f) + + if not clauses: + return None + else: + return sql.and_(*clauses) + + def visit_outer_join_column(self, vc, **kw): + return self.process(vc.column, **kw) + "(+)" + + def visit_sequence(self, seq): + return (self.dialect.identifier_preparer.format_sequence(seq) + + ".nextval") + + def get_render_as_alias_suffix(self, alias_name_text): + """Oracle doesn't like ``FROM table AS alias``""" + + return " " + alias_name_text + + def returning_clause(self, stmt, returning_cols): + columns = [] + binds = [] + for i, column in enumerate( + expression._select_iterables(returning_cols)): + if column.type._has_column_expression: + col_expr = column.type.column_expression(column) + else: + col_expr = column + outparam = sql.outparam("ret_%d" % i, type_=column.type) + self.binds[outparam.key] = outparam + binds.append( + self.bindparam_string(self._truncate_bindparam(outparam))) + columns.append( + self.process(col_expr, within_columns_clause=False)) + + self._add_to_result_map( + outparam.key, outparam.key, + (column, getattr(column, 'name', None), + getattr(column, 'key', None)), + column.type + ) + + return 'RETURNING ' + ', '.join(columns) + " INTO " + ", ".join(binds) + + def _TODO_visit_compound_select(self, select): + """Need to determine how to get ``LIMIT``/``OFFSET`` into a + ``UNION`` for Oracle. + """ + pass + + def visit_select(self, select, **kwargs): + """Look for ``LIMIT`` and OFFSET in a select statement, and if + so tries to wrap it in a subquery with ``rownum`` criterion. + """ + + if not getattr(select, '_oracle_visit', None): + if not self.dialect.use_ansi: + froms = self._display_froms_for_select( + select, kwargs.get('asfrom', False)) + whereclause = self._get_nonansi_join_whereclause(froms) + if whereclause is not None: + select = select.where(whereclause) + select._oracle_visit = True + + limit_clause = select._limit_clause + offset_clause = select._offset_clause + if limit_clause is not None or offset_clause is not None: + # See http://www.oracle.com/technology/oramag/oracle/06-sep/\ + # o56asktom.html + # + # Generalized form of an Oracle pagination query: + # select ... from ( + # select /*+ FIRST_ROWS(N) */ ...., rownum as ora_rn from + # ( select distinct ... where ... order by ... + # ) where ROWNUM <= :limit+:offset + # ) where ora_rn > :offset + # Outer select and "ROWNUM as ora_rn" can be dropped if + # limit=0 + + kwargs['select_wraps_for'] = select + select = select._generate() + select._oracle_visit = True + + # Wrap the middle select and add the hint + limitselect = sql.select([c for c in select.c]) + if limit_clause is not None and \ + self.dialect.optimize_limits and \ + select._simple_int_limit: + limitselect = limitselect.prefix_with( + "/*+ FIRST_ROWS(%d) */" % + select._limit) + + limitselect._oracle_visit = True + limitselect._is_wrapper = True + + # add expressions to accommodate FOR UPDATE OF + for_update = select._for_update_arg + if for_update is not None and for_update.of: + for_update = for_update._clone() + for_update._copy_internals() + + for elem in for_update.of: + select.append_column(elem) + + adapter = sql_util.ClauseAdapter(select) + for_update.of = [ + adapter.traverse(elem) + for elem in for_update.of] + + # If needed, add the limiting clause + if limit_clause is not None: + if not self.dialect.use_binds_for_limits: + # use simple int limits, will raise an exception + # if the limit isn't specified this way + max_row = select._limit + + if offset_clause is not None: + max_row += select._offset + max_row = sql.literal_column("%d" % max_row) + else: + max_row = limit_clause + if offset_clause is not None: + max_row = max_row + offset_clause + limitselect.append_whereclause( + sql.literal_column("ROWNUM") <= max_row) + + # If needed, add the ora_rn, and wrap again with offset. + if offset_clause is None: + limitselect._for_update_arg = for_update + select = limitselect + else: + limitselect = limitselect.column( + sql.literal_column("ROWNUM").label("ora_rn")) + limitselect._oracle_visit = True + limitselect._is_wrapper = True + + offsetselect = sql.select( + [c for c in limitselect.c if c.key != 'ora_rn']) + offsetselect._oracle_visit = True + offsetselect._is_wrapper = True + + if for_update is not None and for_update.of: + for elem in for_update.of: + if limitselect.corresponding_column(elem) is None: + limitselect.append_column(elem) + + if not self.dialect.use_binds_for_limits: + offset_clause = sql.literal_column( + "%d" % select._offset) + offsetselect.append_whereclause( + sql.literal_column("ora_rn") > offset_clause) + + offsetselect._for_update_arg = for_update + select = offsetselect + + return compiler.SQLCompiler.visit_select(self, select, **kwargs) + + def limit_clause(self, select, **kw): + return "" + + def for_update_clause(self, select, **kw): + if self.is_subquery(): + return "" + + tmp = ' FOR UPDATE' + + if select._for_update_arg.of: + tmp += ' OF ' + ', '.join( + self.process(elem, **kw) for elem in + select._for_update_arg.of + ) + + if select._for_update_arg.nowait: + tmp += " NOWAIT" + if select._for_update_arg.skip_locked: + tmp += " SKIP LOCKED" + + return tmp + + +class OracleDDLCompiler(compiler.DDLCompiler): + + def define_constraint_cascades(self, constraint): + text = "" + if constraint.ondelete is not None: + text += " ON DELETE %s" % constraint.ondelete + + # oracle has no ON UPDATE CASCADE - + # its only available via triggers + # http://asktom.oracle.com/tkyte/update_cascade/index.html + if constraint.onupdate is not None: + util.warn( + "Oracle does not contain native UPDATE CASCADE " + "functionality - onupdates will not be rendered for foreign " + "keys. Consider using deferrable=True, initially='deferred' " + "or triggers.") + + return text + + def visit_create_index(self, create): + index = create.element + self._verify_index_table(index) + preparer = self.preparer + text = "CREATE " + if index.unique: + text += "UNIQUE " + if index.dialect_options['oracle']['bitmap']: + text += "BITMAP " + text += "INDEX %s ON %s (%s)" % ( + self._prepared_index_name(index, include_schema=True), + preparer.format_table(index.table, use_schema=True), + ', '.join( + self.sql_compiler.process( + expr, + include_table=False, literal_binds=True) + for expr in index.expressions) + ) + if index.dialect_options['oracle']['compress'] is not False: + if index.dialect_options['oracle']['compress'] is True: + text += " COMPRESS" + else: + text += " COMPRESS %d" % ( + index.dialect_options['oracle']['compress'] + ) + return text + + def post_create_table(self, table): + table_opts = [] + opts = table.dialect_options['oracle'] + + if opts['on_commit']: + on_commit_options = opts['on_commit'].replace("_", " ").upper() + table_opts.append('\n ON COMMIT %s' % on_commit_options) + + if opts['compress']: + if opts['compress'] is True: + table_opts.append("\n COMPRESS") + else: + table_opts.append("\n COMPRESS FOR %s" % ( + opts['compress'] + )) + + return ''.join(table_opts) + + +class OracleIdentifierPreparer(compiler.IdentifierPreparer): + + reserved_words = set([x.lower() for x in RESERVED_WORDS]) + illegal_initial_characters = set( + (str(dig) for dig in range(0, 10))).union(["_", "$"]) + + def _bindparam_requires_quotes(self, value): + """Return True if the given identifier requires quoting.""" + lc_value = value.lower() + return (lc_value in self.reserved_words + or value[0] in self.illegal_initial_characters + or not self.legal_characters.match(util.text_type(value)) + ) + + def format_savepoint(self, savepoint): + name = savepoint.ident.lstrip('_') + return super( + OracleIdentifierPreparer, self).format_savepoint(savepoint, name) + + +class OracleExecutionContext(default.DefaultExecutionContext): + def fire_sequence(self, seq, type_): + return self._execute_scalar( + "SELECT " + + self.dialect.identifier_preparer.format_sequence(seq) + + ".nextval FROM DUAL", type_) + + +class OracleDialect(default.DefaultDialect): + name = 'oracle' + supports_alter = True + supports_unicode_statements = False + supports_unicode_binds = False + max_identifier_length = 30 + supports_sane_rowcount = True + supports_sane_multi_rowcount = False + + supports_simple_order_by_label = False + + supports_sequences = True + sequences_optional = False + postfetch_lastrowid = False + + default_paramstyle = 'named' + colspecs = colspecs + ischema_names = ischema_names + requires_name_normalize = True + + supports_default_values = False + supports_empty_insert = False + + statement_compiler = OracleCompiler + ddl_compiler = OracleDDLCompiler + type_compiler = OracleTypeCompiler + preparer = OracleIdentifierPreparer + execution_ctx_cls = OracleExecutionContext + + reflection_options = ('oracle_resolve_synonyms', ) + + construct_arguments = [ + (sa_schema.Table, { + "resolve_synonyms": False, + "on_commit": None, + "compress": False + }), + (sa_schema.Index, { + "bitmap": False, + "compress": False + }) + ] + + def __init__(self, + use_ansi=True, + optimize_limits=False, + use_binds_for_limits=True, + exclude_tablespaces=('SYSTEM', 'SYSAUX', ), + **kwargs): + default.DefaultDialect.__init__(self, **kwargs) + self.use_ansi = use_ansi + self.optimize_limits = optimize_limits + self.use_binds_for_limits = use_binds_for_limits + self.exclude_tablespaces = exclude_tablespaces + + def initialize(self, connection): + super(OracleDialect, self).initialize(connection) + self.implicit_returning = self.__dict__.get( + 'implicit_returning', + self.server_version_info > (10, ) + ) + + if self._is_oracle_8: + self.colspecs = self.colspecs.copy() + self.colspecs.pop(sqltypes.Interval) + self.use_ansi = False + + @property + def _is_oracle_8(self): + return self.server_version_info and \ + self.server_version_info < (9, ) + + @property + def _supports_table_compression(self): + return self.server_version_info and \ + self.server_version_info >= (10, 1, ) + + @property + def _supports_table_compress_for(self): + return self.server_version_info and \ + self.server_version_info >= (11, ) + + @property + def _supports_char_length(self): + return not self._is_oracle_8 + + @property + def _supports_nchar(self): + return not self._is_oracle_8 + + def do_release_savepoint(self, connection, name): + # Oracle does not support RELEASE SAVEPOINT + pass + + def has_table(self, connection, table_name, schema=None): + if not schema: + schema = self.default_schema_name + cursor = connection.execute( + sql.text("SELECT table_name FROM all_tables " + "WHERE table_name = :name AND owner = :schema_name"), + name=self.denormalize_name(table_name), + schema_name=self.denormalize_name(schema)) + return cursor.first() is not None + + def has_sequence(self, connection, sequence_name, schema=None): + if not schema: + schema = self.default_schema_name + cursor = connection.execute( + sql.text("SELECT sequence_name FROM all_sequences " + "WHERE sequence_name = :name AND " + "sequence_owner = :schema_name"), + name=self.denormalize_name(sequence_name), + schema_name=self.denormalize_name(schema)) + return cursor.first() is not None + + def normalize_name(self, name): + if name is None: + return None + if util.py2k: + if isinstance(name, str): + name = name.decode(self.encoding) + if name.upper() == name and not \ + self.identifier_preparer._requires_quotes(name.lower()): + return name.lower() + elif name.lower() == name: + return quoted_name(name, quote=True) + else: + return name + + def denormalize_name(self, name): + if name is None: + return None + elif name.lower() == name and not \ + self.identifier_preparer._requires_quotes(name.lower()): + name = name.upper() + if util.py2k: + if not self.supports_unicode_binds: + name = name.encode(self.encoding) + else: + name = unicode(name) + return name + + def _get_default_schema_name(self, connection): + return self.normalize_name( + connection.execute('SELECT USER FROM DUAL').scalar()) + + def _resolve_synonym(self, connection, desired_owner=None, + desired_synonym=None, desired_table=None): + """search for a local synonym matching the given desired owner/name. + + if desired_owner is None, attempts to locate a distinct owner. + + returns the actual name, owner, dblink name, and synonym name if + found. + """ + + q = "SELECT owner, table_owner, table_name, db_link, "\ + "synonym_name FROM all_synonyms WHERE " + clauses = [] + params = {} + if desired_synonym: + clauses.append("synonym_name = :synonym_name") + params['synonym_name'] = desired_synonym + if desired_owner: + clauses.append("owner = :desired_owner") + params['desired_owner'] = desired_owner + if desired_table: + clauses.append("table_name = :tname") + params['tname'] = desired_table + + q += " AND ".join(clauses) + + result = connection.execute(sql.text(q), **params) + if desired_owner: + row = result.first() + if row: + return (row['table_name'], row['table_owner'], + row['db_link'], row['synonym_name']) + else: + return None, None, None, None + else: + rows = result.fetchall() + if len(rows) > 1: + raise AssertionError( + "There are multiple tables visible to the schema, you " + "must specify owner") + elif len(rows) == 1: + row = rows[0] + return (row['table_name'], row['table_owner'], + row['db_link'], row['synonym_name']) + else: + return None, None, None, None + + @reflection.cache + def _prepare_reflection_args(self, connection, table_name, schema=None, + resolve_synonyms=False, dblink='', **kw): + + if resolve_synonyms: + actual_name, owner, dblink, synonym = self._resolve_synonym( + connection, + desired_owner=self.denormalize_name(schema), + desired_synonym=self.denormalize_name(table_name) + ) + else: + actual_name, owner, dblink, synonym = None, None, None, None + if not actual_name: + actual_name = self.denormalize_name(table_name) + + if dblink: + # using user_db_links here since all_db_links appears + # to have more restricted permissions. + # http://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_admin005.htm + # will need to hear from more users if we are doing + # the right thing here. See [ticket:2619] + owner = connection.scalar( + sql.text("SELECT username FROM user_db_links " + "WHERE db_link=:link"), link=dblink) + dblink = "@" + dblink + elif not owner: + owner = self.denormalize_name(schema or self.default_schema_name) + + return (actual_name, owner, dblink or '', synonym) + + @reflection.cache + def get_schema_names(self, connection, **kw): + s = "SELECT username FROM all_users ORDER BY username" + cursor = connection.execute(s,) + return [self.normalize_name(row[0]) for row in cursor] + + @reflection.cache + def get_table_names(self, connection, schema=None, **kw): + schema = self.denormalize_name(schema or self.default_schema_name) + + # note that table_names() isn't loading DBLINKed or synonym'ed tables + if schema is None: + schema = self.default_schema_name + + sql_str = "SELECT table_name FROM all_tables WHERE " + if self.exclude_tablespaces: + sql_str += ( + "nvl(tablespace_name, 'no tablespace') " + "NOT IN (%s) AND " % ( + ', '.join(["'%s'" % ts for ts in self.exclude_tablespaces]) + ) + ) + sql_str += ( + "OWNER = :owner " + "AND IOT_NAME IS NULL " + "AND DURATION IS NULL") + + cursor = connection.execute(sql.text(sql_str), owner=schema) + return [self.normalize_name(row[0]) for row in cursor] + + @reflection.cache + def get_temp_table_names(self, connection, **kw): + schema = self.denormalize_name(self.default_schema_name) + + sql_str = "SELECT table_name FROM all_tables WHERE " + if self.exclude_tablespaces: + sql_str += ( + "nvl(tablespace_name, 'no tablespace') " + "NOT IN (%s) AND " % ( + ', '.join(["'%s'" % ts for ts in self.exclude_tablespaces]) + ) + ) + sql_str += ( + "OWNER = :owner " + "AND IOT_NAME IS NULL " + "AND DURATION IS NOT NULL") + + cursor = connection.execute(sql.text(sql_str), owner=schema) + return [self.normalize_name(row[0]) for row in cursor] + + @reflection.cache + def get_view_names(self, connection, schema=None, **kw): + schema = self.denormalize_name(schema or self.default_schema_name) + s = sql.text("SELECT view_name FROM all_views WHERE owner = :owner") + cursor = connection.execute(s, owner=self.denormalize_name(schema)) + return [self.normalize_name(row[0]) for row in cursor] + + @reflection.cache + def get_table_options(self, connection, table_name, schema=None, **kw): + options = {} + + resolve_synonyms = kw.get('oracle_resolve_synonyms', False) + dblink = kw.get('dblink', '') + info_cache = kw.get('info_cache') + + (table_name, schema, dblink, synonym) = \ + self._prepare_reflection_args(connection, table_name, schema, + resolve_synonyms, dblink, + info_cache=info_cache) + + params = {"table_name": table_name} + + columns = ["table_name"] + if self._supports_table_compression: + columns.append("compression") + if self._supports_table_compress_for: + columns.append("compress_for") + + text = "SELECT %(columns)s "\ + "FROM ALL_TABLES%(dblink)s "\ + "WHERE table_name = :table_name" + + if schema is not None: + params['owner'] = schema + text += " AND owner = :owner " + text = text % {'dblink': dblink, 'columns': ", ".join(columns)} + + result = connection.execute(sql.text(text), **params) + + enabled = dict(DISABLED=False, ENABLED=True) + + row = result.first() + if row: + if "compression" in row and enabled.get(row.compression, False): + if "compress_for" in row: + options['oracle_compress'] = row.compress_for + else: + options['oracle_compress'] = True + + return options + + @reflection.cache + def get_columns(self, connection, table_name, schema=None, **kw): + """ + + kw arguments can be: + + oracle_resolve_synonyms + + dblink + + """ + + resolve_synonyms = kw.get('oracle_resolve_synonyms', False) + dblink = kw.get('dblink', '') + info_cache = kw.get('info_cache') + + (table_name, schema, dblink, synonym) = \ + self._prepare_reflection_args(connection, table_name, schema, + resolve_synonyms, dblink, + info_cache=info_cache) + columns = [] + if self._supports_char_length: + char_length_col = 'char_length' + else: + char_length_col = 'data_length' + + params = {"table_name": table_name} + text = "SELECT column_name, data_type, %(char_length_col)s, "\ + "data_precision, data_scale, "\ + "nullable, data_default FROM ALL_TAB_COLUMNS%(dblink)s "\ + "WHERE table_name = :table_name" + if schema is not None: + params['owner'] = schema + text += " AND owner = :owner " + text += " ORDER BY column_id" + text = text % {'dblink': dblink, 'char_length_col': char_length_col} + + c = connection.execute(sql.text(text), **params) + + for row in c: + (colname, orig_colname, coltype, length, precision, scale, nullable, default) = \ + (self.normalize_name(row[0]), row[0], row[1], row[ + 2], row[3], row[4], row[5] == 'Y', row[6]) + + if coltype == 'NUMBER': + coltype = NUMBER(precision, scale) + elif coltype in ('VARCHAR2', 'NVARCHAR2', 'CHAR'): + coltype = self.ischema_names.get(coltype)(length) + elif 'WITH TIME ZONE' in coltype: + coltype = TIMESTAMP(timezone=True) + else: + coltype = re.sub(r'\(\d+\)', '', coltype) + try: + coltype = self.ischema_names[coltype] + except KeyError: + util.warn("Did not recognize type '%s' of column '%s'" % + (coltype, colname)) + coltype = sqltypes.NULLTYPE + + cdict = { + 'name': colname, + 'type': coltype, + 'nullable': nullable, + 'default': default, + 'autoincrement': 'auto', + } + if orig_colname.lower() == orig_colname: + cdict['quote'] = True + + columns.append(cdict) + return columns + + @reflection.cache + def get_indexes(self, connection, table_name, schema=None, + resolve_synonyms=False, dblink='', **kw): + + info_cache = kw.get('info_cache') + (table_name, schema, dblink, synonym) = \ + self._prepare_reflection_args(connection, table_name, schema, + resolve_synonyms, dblink, + info_cache=info_cache) + indexes = [] + + params = {'table_name': table_name} + text = \ + "SELECT a.index_name, a.column_name, "\ + "\nb.index_type, b.uniqueness, b.compression, b.prefix_length "\ + "\nFROM ALL_IND_COLUMNS%(dblink)s a, "\ + "\nALL_INDEXES%(dblink)s b "\ + "\nWHERE "\ + "\na.index_name = b.index_name "\ + "\nAND a.table_owner = b.table_owner "\ + "\nAND a.table_name = b.table_name "\ + "\nAND a.table_name = :table_name " + + if schema is not None: + params['schema'] = schema + text += "AND a.table_owner = :schema " + + text += "ORDER BY a.index_name, a.column_position" + + text = text % {'dblink': dblink} + + q = sql.text(text) + rp = connection.execute(q, **params) + indexes = [] + last_index_name = None + pk_constraint = self.get_pk_constraint( + connection, table_name, schema, resolve_synonyms=resolve_synonyms, + dblink=dblink, info_cache=kw.get('info_cache')) + pkeys = pk_constraint['constrained_columns'] + uniqueness = dict(NONUNIQUE=False, UNIQUE=True) + enabled = dict(DISABLED=False, ENABLED=True) + + oracle_sys_col = re.compile(r'SYS_NC\d+\$', re.IGNORECASE) + + def upper_name_set(names): + return set([i.upper() for i in names]) + + pk_names = upper_name_set(pkeys) + + def remove_if_primary_key(index): + # don't include the primary key index + if index is not None and \ + upper_name_set(index['column_names']) == pk_names: + indexes.pop() + + index = None + for rset in rp: + if rset.index_name != last_index_name: + remove_if_primary_key(index) + index = dict(name=self.normalize_name(rset.index_name), + column_names=[], dialect_options={}) + indexes.append(index) + index['unique'] = uniqueness.get(rset.uniqueness, False) + + if rset.index_type in ('BITMAP', 'FUNCTION-BASED BITMAP'): + index['dialect_options']['oracle_bitmap'] = True + if enabled.get(rset.compression, False): + index['dialect_options']['oracle_compress'] = rset.prefix_length + + # filter out Oracle SYS_NC names. could also do an outer join + # to the all_tab_columns table and check for real col names there. + if not oracle_sys_col.match(rset.column_name): + index['column_names'].append( + self.normalize_name(rset.column_name)) + last_index_name = rset.index_name + remove_if_primary_key(index) + return indexes + + @reflection.cache + def _get_constraint_data(self, connection, table_name, schema=None, + dblink='', **kw): + + params = {'table_name': table_name} + + text = \ + "SELECT"\ + "\nac.constraint_name,"\ + "\nac.constraint_type,"\ + "\nloc.column_name AS local_column,"\ + "\nrem.table_name AS remote_table,"\ + "\nrem.column_name AS remote_column,"\ + "\nrem.owner AS remote_owner,"\ + "\nloc.position as loc_pos,"\ + "\nrem.position as rem_pos"\ + "\nFROM all_constraints%(dblink)s ac,"\ + "\nall_cons_columns%(dblink)s loc,"\ + "\nall_cons_columns%(dblink)s rem"\ + "\nWHERE ac.table_name = :table_name"\ + "\nAND ac.constraint_type IN ('R','P')" + + if schema is not None: + params['owner'] = schema + text += "\nAND ac.owner = :owner" + + text += \ + "\nAND ac.owner = loc.owner"\ + "\nAND ac.constraint_name = loc.constraint_name"\ + "\nAND ac.r_owner = rem.owner(+)"\ + "\nAND ac.r_constraint_name = rem.constraint_name(+)"\ + "\nAND (rem.position IS NULL or loc.position=rem.position)"\ + "\nORDER BY ac.constraint_name, loc.position" + + text = text % {'dblink': dblink} + rp = connection.execute(sql.text(text), **params) + constraint_data = rp.fetchall() + return constraint_data + + @reflection.cache + def get_pk_constraint(self, connection, table_name, schema=None, **kw): + resolve_synonyms = kw.get('oracle_resolve_synonyms', False) + dblink = kw.get('dblink', '') + info_cache = kw.get('info_cache') + + (table_name, schema, dblink, synonym) = \ + self._prepare_reflection_args(connection, table_name, schema, + resolve_synonyms, dblink, + info_cache=info_cache) + pkeys = [] + constraint_name = None + constraint_data = self._get_constraint_data( + connection, table_name, schema, dblink, + info_cache=kw.get('info_cache')) + + for row in constraint_data: + (cons_name, cons_type, local_column, remote_table, remote_column, remote_owner) = \ + row[0:2] + tuple([self.normalize_name(x) for x in row[2:6]]) + if cons_type == 'P': + if constraint_name is None: + constraint_name = self.normalize_name(cons_name) + pkeys.append(local_column) + return {'constrained_columns': pkeys, 'name': constraint_name} + + @reflection.cache + def get_foreign_keys(self, connection, table_name, schema=None, **kw): + """ + + kw arguments can be: + + oracle_resolve_synonyms + + dblink + + """ + + requested_schema = schema # to check later on + resolve_synonyms = kw.get('oracle_resolve_synonyms', False) + dblink = kw.get('dblink', '') + info_cache = kw.get('info_cache') + + (table_name, schema, dblink, synonym) = \ + self._prepare_reflection_args(connection, table_name, schema, + resolve_synonyms, dblink, + info_cache=info_cache) + + constraint_data = self._get_constraint_data( + connection, table_name, schema, dblink, + info_cache=kw.get('info_cache')) + + def fkey_rec(): + return { + 'name': None, + 'constrained_columns': [], + 'referred_schema': None, + 'referred_table': None, + 'referred_columns': [] + } + + fkeys = util.defaultdict(fkey_rec) + + for row in constraint_data: + (cons_name, cons_type, local_column, remote_table, remote_column, remote_owner) = \ + row[0:2] + tuple([self.normalize_name(x) for x in row[2:6]]) + + if cons_type == 'R': + if remote_table is None: + # ticket 363 + util.warn( + ("Got 'None' querying 'table_name' from " + "all_cons_columns%(dblink)s - does the user have " + "proper rights to the table?") % {'dblink': dblink}) + continue + + rec = fkeys[cons_name] + rec['name'] = cons_name + local_cols, remote_cols = rec[ + 'constrained_columns'], rec['referred_columns'] + + if not rec['referred_table']: + if resolve_synonyms: + ref_remote_name, ref_remote_owner, ref_dblink, ref_synonym = \ + self._resolve_synonym( + connection, + desired_owner=self.denormalize_name( + remote_owner), + desired_table=self.denormalize_name( + remote_table) + ) + if ref_synonym: + remote_table = self.normalize_name(ref_synonym) + remote_owner = self.normalize_name( + ref_remote_owner) + + rec['referred_table'] = remote_table + + if requested_schema is not None or \ + self.denormalize_name(remote_owner) != schema: + rec['referred_schema'] = remote_owner + + local_cols.append(local_column) + remote_cols.append(remote_column) + + return list(fkeys.values()) + + @reflection.cache + def get_view_definition(self, connection, view_name, schema=None, + resolve_synonyms=False, dblink='', **kw): + info_cache = kw.get('info_cache') + (view_name, schema, dblink, synonym) = \ + self._prepare_reflection_args(connection, view_name, schema, + resolve_synonyms, dblink, + info_cache=info_cache) + + params = {'view_name': view_name} + text = "SELECT text FROM all_views WHERE view_name=:view_name" + + if schema is not None: + text += " AND owner = :schema" + params['schema'] = schema + + rp = connection.execute(sql.text(text), **params).scalar() + if rp: + if util.py2k: + rp = rp.decode(self.encoding) + return rp + else: + return None + + +class _OuterJoinColumn(sql.ClauseElement): + __visit_name__ = 'outer_join_column' + + def __init__(self, column): + self.column = column diff --git a/app/lib/sqlalchemy/dialects/oracle/cx_oracle.py b/app/lib/sqlalchemy/dialects/oracle/cx_oracle.py new file mode 100644 index 0000000..f85324f --- /dev/null +++ b/app/lib/sqlalchemy/dialects/oracle/cx_oracle.py @@ -0,0 +1,1020 @@ +# oracle/cx_oracle.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" + +.. dialect:: oracle+cx_oracle + :name: cx-Oracle + :dbapi: cx_oracle + :connectstring: oracle+cx_oracle://user:pass@host:port/dbname\ +[?key=value&key=value...] + :url: http://cx-oracle.sourceforge.net/ + +Additional Connect Arguments +---------------------------- + +When connecting with ``dbname`` present, the host, port, and dbname tokens are +converted to a TNS name using +the cx_oracle ``makedsn()`` function. Otherwise, the host token is taken +directly as a TNS name. + +Additional arguments which may be specified either as query string arguments +on the URL, or as keyword arguments to :func:`.create_engine()` are: + +* ``allow_twophase`` - enable two-phase transactions. Defaults to ``True``. + +* ``arraysize`` - set the cx_oracle.arraysize value on cursors, defaulted + to 50. This setting is significant with cx_Oracle as the contents of LOB + objects are only readable within a "live" row (e.g. within a batch of + 50 rows). + +* ``auto_convert_lobs`` - defaults to True; See :ref:`cx_oracle_lob`. + +* ``auto_setinputsizes`` - the cx_oracle.setinputsizes() call is issued for + all bind parameters. This is required for LOB datatypes but can be + disabled to reduce overhead. Defaults to ``True``. Specific types + can be excluded from this process using the ``exclude_setinputsizes`` + parameter. + +* ``coerce_to_unicode`` - see :ref:`cx_oracle_unicode` for detail. + +* ``coerce_to_decimal`` - see :ref:`cx_oracle_numeric` for detail. + +* ``exclude_setinputsizes`` - a tuple or list of string DBAPI type names to + be excluded from the "auto setinputsizes" feature. The type names here + must match DBAPI types that are found in the "cx_Oracle" module namespace, + such as cx_Oracle.UNICODE, cx_Oracle.NCLOB, etc. Defaults to + ``(STRING, UNICODE)``. + + .. versionadded:: 0.8 specific DBAPI types can be excluded from the + auto_setinputsizes feature via the exclude_setinputsizes attribute. + +* ``mode`` - This is given the string value of SYSDBA or SYSOPER, or + alternatively an integer value. This value is only available as a URL query + string argument. + +* ``threaded`` - enable multithreaded access to cx_oracle connections. + Defaults to ``True``. Note that this is the opposite default of the + cx_Oracle DBAPI itself. + +* ``service_name`` - An option to use connection string (DSN) with + ``SERVICE_NAME`` instead of ``SID``. It can't be passed when a ``database`` + part is given. + E.g. ``oracle+cx_oracle://scott:tiger@host:1521/?service_name=hr`` + is a valid url. This value is only available as a URL query string argument. + + .. versionadded:: 1.0.0 + +.. _cx_oracle_unicode: + +Unicode +------- + +The cx_Oracle DBAPI as of version 5 fully supports unicode, and has the +ability to return string results as Python unicode objects natively. + +When used in Python 3, cx_Oracle returns all strings as Python unicode objects +(that is, plain ``str`` in Python 3). In Python 2, it will return as Python +unicode those column values that are of type ``NVARCHAR`` or ``NCLOB``. For +column values that are of type ``VARCHAR`` or other non-unicode string types, +it will return values as Python strings (e.g. bytestrings). + +The cx_Oracle SQLAlchemy dialect presents two different options for the use +case of returning ``VARCHAR`` column values as Python unicode objects under +Python 2: + +* the cx_Oracle DBAPI has the ability to coerce all string results to Python + unicode objects unconditionally using output type handlers. This has + the advantage that the unicode conversion is global to all statements + at the cx_Oracle driver level, meaning it works with raw textual SQL + statements that have no typing information associated. However, this system + has been observed to incur signfiicant performance overhead, not only + because it takes effect for all string values unconditionally, but also + because cx_Oracle under Python 2 seems to use a pure-Python function call in + order to do the decode operation, which under cPython can orders of + magnitude slower than doing it using C functions alone. + +* SQLAlchemy has unicode-decoding services built in, and when using + SQLAlchemy's C extensions, these functions do not use any Python function + calls and are very fast. The disadvantage to this approach is that the + unicode conversion only takes effect for statements where the + :class:`.Unicode` type or :class:`.String` type with + ``convert_unicode=True`` is explicitly associated with the result column. + This is the case for any ORM or Core query or SQL expression as well as for + a :func:`.text` construct that specifies output column types, so in the vast + majority of cases this is not an issue. However, when sending a completely + raw string to :meth:`.Connection.execute`, this typing information isn't + present, unless the string is handled within a :func:`.text` construct that + adds typing information. + +As of version 0.9.2 of SQLAlchemy, the default approach is to use SQLAlchemy's +typing system. This keeps cx_Oracle's expensive Python 2 approach +disabled unless the user explicitly wants it. Under Python 3, SQLAlchemy +detects that cx_Oracle is returning unicode objects natively and cx_Oracle's +system is used. + +To re-enable cx_Oracle's output type handler under Python 2, the +``coerce_to_unicode=True`` flag (new in 0.9.4) can be passed to +:func:`.create_engine`:: + + engine = create_engine("oracle+cx_oracle://dsn", coerce_to_unicode=True) + +Alternatively, to run a pure string SQL statement and get ``VARCHAR`` results +as Python unicode under Python 2 without using cx_Oracle's native handlers, +the :func:`.text` feature can be used:: + + from sqlalchemy import text, Unicode + result = conn.execute( + text("select username from user").columns(username=Unicode)) + +.. versionchanged:: 0.9.2 cx_Oracle's outputtypehandlers are no longer used + for unicode results of non-unicode datatypes in Python 2, after they were + identified as a major performance bottleneck. SQLAlchemy's own unicode + facilities are used instead. + +.. versionadded:: 0.9.4 Added the ``coerce_to_unicode`` flag, to re-enable + cx_Oracle's outputtypehandler and revert to pre-0.9.2 behavior. + +.. _cx_oracle_returning: + +RETURNING Support +----------------- + +The cx_oracle DBAPI supports a limited subset of Oracle's already limited +RETURNING support. Typically, results can only be guaranteed for at most one +column being returned; this is the typical case when SQLAlchemy uses RETURNING +to get just the value of a primary-key-associated sequence value. +Additional column expressions will cause problems in a non-determinative way, +due to cx_oracle's lack of support for the OCI_DATA_AT_EXEC API which is +required for more complex RETURNING scenarios. + +For this reason, stability may be enhanced by disabling RETURNING support +completely; SQLAlchemy otherwise will use RETURNING to fetch newly +sequence-generated primary keys. As illustrated in :ref:`oracle_returning`:: + + engine = create_engine("oracle://scott:tiger@dsn", + implicit_returning=False) + +.. seealso:: + + http://docs.oracle.com/cd/B10501_01/appdev.920/a96584/oci05bnd.htm#420693 + - OCI documentation for RETURNING + + http://sourceforge.net/mailarchive/message.php?msg_id=31338136 + - cx_oracle developer commentary + +.. _cx_oracle_lob: + +LOB Objects +----------- + +cx_oracle returns oracle LOBs using the cx_oracle.LOB object. SQLAlchemy +converts these to strings so that the interface of the Binary type is +consistent with that of other backends, and so that the linkage to a live +cursor is not needed in scenarios like result.fetchmany() and +result.fetchall(). This means that by default, LOB objects are fully fetched +unconditionally by SQLAlchemy, and the linkage to a live cursor is broken. + +To disable this processing, pass ``auto_convert_lobs=False`` to +:func:`.create_engine()`. + +Two Phase Transaction Support +----------------------------- + +Two Phase transactions are implemented using XA transactions, and are known +to work in a rudimental fashion with recent versions of cx_Oracle +as of SQLAlchemy 0.8.0b2, 0.7.10. However, the mechanism is not yet +considered to be robust and should still be regarded as experimental. + +In particular, the cx_Oracle DBAPI as recently as 5.1.2 has a bug regarding +two phase which prevents +a particular DBAPI connection from being consistently usable in both +prepared transactions as well as traditional DBAPI usage patterns; therefore +once a particular connection is used via :meth:`.Connection.begin_prepared`, +all subsequent usages of the underlying DBAPI connection must be within +the context of prepared transactions. + +The default behavior of :class:`.Engine` is to maintain a pool of DBAPI +connections. Therefore, due to the above glitch, a DBAPI connection that has +been used in a two-phase operation, and is then returned to the pool, will +not be usable in a non-two-phase context. To avoid this situation, +the application can make one of several choices: + +* Disable connection pooling using :class:`.NullPool` + +* Ensure that the particular :class:`.Engine` in use is only used + for two-phase operations. A :class:`.Engine` bound to an ORM + :class:`.Session` which includes ``twophase=True`` will consistently + use the two-phase transaction style. + +* For ad-hoc two-phase operations without disabling pooling, the DBAPI + connection in use can be evicted from the connection pool using the + :meth:`.Connection.detach` method. + +.. versionchanged:: 0.8.0b2,0.7.10 + Support for cx_oracle prepared transactions has been implemented + and tested. + +.. _cx_oracle_numeric: + +Precision Numerics +------------------ + +The SQLAlchemy dialect goes through a lot of steps to ensure +that decimal numbers are sent and received with full accuracy. +An "outputtypehandler" callable is associated with each +cx_oracle connection object which detects numeric types and +receives them as string values, instead of receiving a Python +``float`` directly, which is then passed to the Python +``Decimal`` constructor. The :class:`.Numeric` and +:class:`.Float` types under the cx_oracle dialect are aware of +this behavior, and will coerce the ``Decimal`` to ``float`` if +the ``asdecimal`` flag is ``False`` (default on :class:`.Float`, +optional on :class:`.Numeric`). + +Because the handler coerces to ``Decimal`` in all cases first, +the feature can detract significantly from performance. +If precision numerics aren't required, the decimal handling +can be disabled by passing the flag ``coerce_to_decimal=False`` +to :func:`.create_engine`:: + + engine = create_engine("oracle+cx_oracle://dsn", coerce_to_decimal=False) + +.. versionadded:: 0.7.6 + Add the ``coerce_to_decimal`` flag. + +Another alternative to performance is to use the +`cdecimal `_ library; +see :class:`.Numeric` for additional notes. + +The handler attempts to use the "precision" and "scale" +attributes of the result set column to best determine if +subsequent incoming values should be received as ``Decimal`` as +opposed to int (in which case no processing is added). There are +several scenarios where OCI_ does not provide unambiguous data +as to the numeric type, including some situations where +individual rows may return a combination of floating point and +integer values. Certain values for "precision" and "scale" have +been observed to determine this scenario. When it occurs, the +outputtypehandler receives as string and then passes off to a +processing function which detects, for each returned value, if a +decimal point is present, and if so converts to ``Decimal``, +otherwise to int. The intention is that simple int-based +statements like "SELECT my_seq.nextval() FROM DUAL" continue to +return ints and not ``Decimal`` objects, and that any kind of +floating point value is received as a string so that there is no +floating point loss of precision. + +The "decimal point is present" logic itself is also sensitive to +locale. Under OCI_, this is controlled by the NLS_LANG +environment variable. Upon first connection, the dialect runs a +test to determine the current "decimal" character, which can be +a comma "," for European locales. From that point forward the +outputtypehandler uses that character to represent a decimal +point. Note that cx_oracle 5.0.3 or greater is required +when dealing with numerics with locale settings that don't use +a period "." as the decimal character. + +.. versionchanged:: 0.6.6 + The outputtypehandler supports the case where the locale uses a + comma "," character to represent a decimal point. + +.. _OCI: http://www.oracle.com/technetwork/database/features/oci/index.html + +""" + +from __future__ import absolute_import + +from .base import OracleCompiler, OracleDialect, OracleExecutionContext +from . import base as oracle +from ...engine import result as _result +from sqlalchemy import types as sqltypes, util, exc, processors +from sqlalchemy import util +import random +import collections +import decimal +import re +import time + + +class _OracleNumeric(sqltypes.Numeric): + def bind_processor(self, dialect): + # cx_oracle accepts Decimal objects and floats + return None + + def result_processor(self, dialect, coltype): + # we apply a cx_oracle type handler to all connections + # that converts floating point strings to Decimal(). + # However, in some subquery situations, Oracle doesn't + # give us enough information to determine int or Decimal. + # It could even be int/Decimal differently on each row, + # regardless of the scale given for the originating type. + # So we still need an old school isinstance() handler + # here for decimals. + + if dialect.supports_native_decimal: + if self.asdecimal: + fstring = "%%.%df" % self._effective_decimal_return_scale + + def to_decimal(value): + if value is None: + return None + elif isinstance(value, decimal.Decimal): + return value + else: + return decimal.Decimal(fstring % value) + + return to_decimal + else: + if self.precision is None and self.scale is None: + return processors.to_float + elif not getattr(self, '_is_oracle_number', False) \ + and self.scale is not None: + return processors.to_float + else: + return None + else: + # cx_oracle 4 behavior, will assume + # floats + return super(_OracleNumeric, self).\ + result_processor(dialect, coltype) + + +class _OracleDate(sqltypes.Date): + def bind_processor(self, dialect): + return None + + def result_processor(self, dialect, coltype): + def process(value): + if value is not None: + return value.date() + else: + return value + return process + + +class _LOBMixin(object): + def result_processor(self, dialect, coltype): + if not dialect.auto_convert_lobs: + # return the cx_oracle.LOB directly. + return None + + def process(value): + if value is not None: + return value.read() + else: + return value + return process + + +class _NativeUnicodeMixin(object): + if util.py2k: + def bind_processor(self, dialect): + if dialect._cx_oracle_with_unicode: + def process(value): + if value is None: + return value + else: + return unicode(value) + return process + else: + return super( + _NativeUnicodeMixin, self).bind_processor(dialect) + + # we apply a connection output handler that returns + # unicode in all cases, so the "native_unicode" flag + # will be set for the default String.result_processor. + + +class _OracleChar(_NativeUnicodeMixin, sqltypes.CHAR): + def get_dbapi_type(self, dbapi): + return dbapi.FIXED_CHAR + + +class _OracleNVarChar(_NativeUnicodeMixin, sqltypes.NVARCHAR): + def get_dbapi_type(self, dbapi): + return getattr(dbapi, 'UNICODE', dbapi.STRING) + + +class _OracleText(_LOBMixin, sqltypes.Text): + def get_dbapi_type(self, dbapi): + return dbapi.CLOB + + +class _OracleLong(oracle.LONG): + # a raw LONG is a text type, but does *not* + # get the LobMixin with cx_oracle. + + def get_dbapi_type(self, dbapi): + return dbapi.LONG_STRING + + +class _OracleString(_NativeUnicodeMixin, sqltypes.String): + pass + +class _OracleEnum(_NativeUnicodeMixin, sqltypes.Enum): + def bind_processor(self, dialect): + enum_proc = sqltypes.Enum.bind_processor(self, dialect) + if util.py2k: + unicode_proc = _NativeUnicodeMixin.bind_processor(self, dialect) + else: + unicode_proc = None + + def process(value): + raw_str = enum_proc(value) + if unicode_proc: + raw_str = unicode_proc(raw_str) + return raw_str + return process + + +class _OracleUnicodeText( + _LOBMixin, _NativeUnicodeMixin, sqltypes.UnicodeText): + def get_dbapi_type(self, dbapi): + return dbapi.NCLOB + + def result_processor(self, dialect, coltype): + lob_processor = _LOBMixin.result_processor(self, dialect, coltype) + if lob_processor is None: + return None + + string_processor = sqltypes.UnicodeText.result_processor( + self, dialect, coltype) + + if string_processor is None: + return lob_processor + else: + def process(value): + return string_processor(lob_processor(value)) + return process + + +class _OracleInteger(sqltypes.Integer): + def result_processor(self, dialect, coltype): + def to_int(val): + if val is not None: + val = int(val) + return val + return to_int + + +class _OracleBinary(_LOBMixin, sqltypes.LargeBinary): + def get_dbapi_type(self, dbapi): + return dbapi.BLOB + + def bind_processor(self, dialect): + return None + + +class _OracleInterval(oracle.INTERVAL): + def get_dbapi_type(self, dbapi): + return dbapi.INTERVAL + + +class _OracleRaw(oracle.RAW): + pass + + +class _OracleRowid(oracle.ROWID): + def get_dbapi_type(self, dbapi): + return dbapi.ROWID + + +class OracleCompiler_cx_oracle(OracleCompiler): + def bindparam_string(self, name, **kw): + quote = getattr(name, 'quote', None) + if quote is True or quote is not False and \ + self.preparer._bindparam_requires_quotes(name): + quoted_name = '"%s"' % name + self._quoted_bind_names[name] = quoted_name + return OracleCompiler.bindparam_string(self, quoted_name, **kw) + else: + return OracleCompiler.bindparam_string(self, name, **kw) + + +class OracleExecutionContext_cx_oracle(OracleExecutionContext): + + def pre_exec(self): + quoted_bind_names = \ + getattr(self.compiled, '_quoted_bind_names', None) + if quoted_bind_names: + if not self.dialect.supports_unicode_statements: + # if DBAPI doesn't accept unicode statements, + # keys in self.parameters would have been encoded + # here. so convert names in quoted_bind_names + # to encoded as well. + quoted_bind_names = \ + dict( + (fromname.encode(self.dialect.encoding), + toname.encode(self.dialect.encoding)) + for fromname, toname in + quoted_bind_names.items() + ) + for param in self.parameters: + for fromname, toname in quoted_bind_names.items(): + param[toname] = param[fromname] + del param[fromname] + + if self.dialect.auto_setinputsizes: + # cx_oracle really has issues when you setinputsizes + # on String, including that outparams/RETURNING + # breaks for varchars + self.set_input_sizes( + quoted_bind_names, + exclude_types=self.dialect.exclude_setinputsizes + ) + + # if a single execute, check for outparams + if len(self.compiled_parameters) == 1: + for bindparam in self.compiled.binds.values(): + if bindparam.isoutparam: + dbtype = bindparam.type.dialect_impl(self.dialect).\ + get_dbapi_type(self.dialect.dbapi) + if not hasattr(self, 'out_parameters'): + self.out_parameters = {} + if dbtype is None: + raise exc.InvalidRequestError( + "Cannot create out parameter for parameter " + "%r - its type %r is not supported by" + " cx_oracle" % + (bindparam.key, bindparam.type) + ) + name = self.compiled.bind_names[bindparam] + self.out_parameters[name] = self.cursor.var(dbtype) + self.parameters[0][quoted_bind_names.get(name, name)] = \ + self.out_parameters[name] + + def create_cursor(self): + c = self._dbapi_connection.cursor() + if self.dialect.arraysize: + c.arraysize = self.dialect.arraysize + + return c + + def get_result_proxy(self): + if hasattr(self, 'out_parameters') and self.compiled.returning: + returning_params = dict( + (k, v.getvalue()) + for k, v in self.out_parameters.items() + ) + return ReturningResultProxy(self, returning_params) + + result = None + if self.cursor.description is not None: + for column in self.cursor.description: + type_code = column[1] + if type_code in self.dialect._cx_oracle_binary_types: + result = _result.BufferedColumnResultProxy(self) + + if result is None: + result = _result.ResultProxy(self) + + if hasattr(self, 'out_parameters'): + if self.compiled_parameters is not None and \ + len(self.compiled_parameters) == 1: + result.out_parameters = out_parameters = {} + + for bind, name in self.compiled.bind_names.items(): + if name in self.out_parameters: + type = bind.type + impl_type = type.dialect_impl(self.dialect) + dbapi_type = impl_type.get_dbapi_type( + self.dialect.dbapi) + result_processor = impl_type.\ + result_processor(self.dialect, + dbapi_type) + if result_processor is not None: + out_parameters[name] = \ + result_processor( + self.out_parameters[name].getvalue()) + else: + out_parameters[name] = self.out_parameters[ + name].getvalue() + else: + result.out_parameters = dict( + (k, v.getvalue()) + for k, v in self.out_parameters.items() + ) + + return result + + +class OracleExecutionContext_cx_oracle_with_unicode( + OracleExecutionContext_cx_oracle): + """Support WITH_UNICODE in Python 2.xx. + + WITH_UNICODE allows cx_Oracle's Python 3 unicode handling + behavior under Python 2.x. This mode in some cases disallows + and in other cases silently passes corrupted data when + non-Python-unicode strings (a.k.a. plain old Python strings) + are passed as arguments to connect(), the statement sent to execute(), + or any of the bind parameter keys or values sent to execute(). + This optional context therefore ensures that all statements are + passed as Python unicode objects. + + """ + + def __init__(self, *arg, **kw): + OracleExecutionContext_cx_oracle.__init__(self, *arg, **kw) + self.statement = util.text_type(self.statement) + + def _execute_scalar(self, stmt, type_): + return super(OracleExecutionContext_cx_oracle_with_unicode, self).\ + _execute_scalar(util.text_type(stmt), type_) + + +class ReturningResultProxy(_result.FullyBufferedResultProxy): + """Result proxy which stuffs the _returning clause + outparams + into the fetch.""" + + def __init__(self, context, returning_params): + self._returning_params = returning_params + super(ReturningResultProxy, self).__init__(context) + + def _cursor_description(self): + returning = self.context.compiled.returning + return [ + ("ret_%d" % i, None) + for i, col in enumerate(returning) + ] + + def _buffer_rows(self): + return collections.deque( + [tuple(self._returning_params["ret_%d" % i] + for i, c in enumerate(self._returning_params))] + ) + + +class OracleDialect_cx_oracle(OracleDialect): + execution_ctx_cls = OracleExecutionContext_cx_oracle + statement_compiler = OracleCompiler_cx_oracle + + driver = "cx_oracle" + + colspecs = colspecs = { + sqltypes.Numeric: _OracleNumeric, + # generic type, assume datetime.date is desired + sqltypes.Date: _OracleDate, + sqltypes.LargeBinary: _OracleBinary, + sqltypes.Boolean: oracle._OracleBoolean, + sqltypes.Interval: _OracleInterval, + oracle.INTERVAL: _OracleInterval, + sqltypes.Text: _OracleText, + sqltypes.String: _OracleString, + sqltypes.UnicodeText: _OracleUnicodeText, + sqltypes.CHAR: _OracleChar, + sqltypes.Enum: _OracleEnum, + + # a raw LONG is a text type, but does *not* + # get the LobMixin with cx_oracle. + oracle.LONG: _OracleLong, + + # this is only needed for OUT parameters. + # it would be nice if we could not use it otherwise. + sqltypes.Integer: _OracleInteger, + + oracle.RAW: _OracleRaw, + sqltypes.Unicode: _OracleNVarChar, + sqltypes.NVARCHAR: _OracleNVarChar, + oracle.ROWID: _OracleRowid, + } + + execute_sequence_format = list + + def __init__(self, + auto_setinputsizes=True, + exclude_setinputsizes=("STRING", "UNICODE"), + auto_convert_lobs=True, + threaded=True, + allow_twophase=True, + coerce_to_decimal=True, + coerce_to_unicode=False, + arraysize=50, _retry_on_12516=False, + **kwargs): + OracleDialect.__init__(self, **kwargs) + self.threaded = threaded + self.arraysize = arraysize + self.allow_twophase = allow_twophase + self.supports_timestamp = self.dbapi is None or \ + hasattr(self.dbapi, 'TIMESTAMP') + self.auto_setinputsizes = auto_setinputsizes + self.auto_convert_lobs = auto_convert_lobs + self._retry_on_12516 = _retry_on_12516 + + if hasattr(self.dbapi, 'version'): + self.cx_oracle_ver = tuple([int(x) for x in + self.dbapi.version.split('.')]) + else: + self.cx_oracle_ver = (0, 0, 0) + + def types(*names): + return set( + getattr(self.dbapi, name, None) for name in names + ).difference([None]) + + self.exclude_setinputsizes = types(*(exclude_setinputsizes or ())) + self._cx_oracle_string_types = types("STRING", "UNICODE", + "NCLOB", "CLOB") + self._cx_oracle_unicode_types = types("UNICODE", "NCLOB") + self._cx_oracle_binary_types = types("BFILE", "CLOB", "NCLOB", "BLOB") + self.supports_unicode_binds = self.cx_oracle_ver >= (5, 0) + + self.coerce_to_unicode = ( + self.cx_oracle_ver >= (5, 0) and + coerce_to_unicode + ) + + self.supports_native_decimal = ( + self.cx_oracle_ver >= (5, 0) and + coerce_to_decimal + ) + + self._cx_oracle_native_nvarchar = self.cx_oracle_ver >= (5, 0) + + if self.cx_oracle_ver is None: + # this occurs in tests with mock DBAPIs + self._cx_oracle_string_types = set() + self._cx_oracle_with_unicode = False + elif util.py3k or ( + self.cx_oracle_ver >= (5,) and not \ + hasattr(self.dbapi, 'UNICODE') + ): + # cx_Oracle WITH_UNICODE mode. *only* python + # unicode objects accepted for anything + self.supports_unicode_statements = True + self.supports_unicode_binds = True + self._cx_oracle_with_unicode = True + + if util.py2k: + # There's really no reason to run with WITH_UNICODE under + # Python 2.x. However as of cx_oracle 5.3 it seems to be + # set to ON for default builds + self.execution_ctx_cls = \ + OracleExecutionContext_cx_oracle_with_unicode + else: + self._cx_oracle_with_unicode = False + + if self.cx_oracle_ver is None or \ + not self.auto_convert_lobs or \ + not hasattr(self.dbapi, 'CLOB'): + self.dbapi_type_map = {} + else: + # only use this for LOB objects. using it for strings, dates + # etc. leads to a little too much magic, reflection doesn't know + # if it should expect encoded strings or unicodes, etc. + self.dbapi_type_map = { + self.dbapi.CLOB: oracle.CLOB(), + self.dbapi.NCLOB: oracle.NCLOB(), + self.dbapi.BLOB: oracle.BLOB(), + self.dbapi.BINARY: oracle.RAW(), + } + + @classmethod + def dbapi(cls): + import cx_Oracle + return cx_Oracle + + def connect(self, *cargs, **cparams): + if self._retry_on_12516: + # emergency flag for the SQLAlchemy test suite, which has + # decreased in stability since cx_oracle 5.3; generalized + # "retry on connect" functionality is part of an upcoming + # SQLAlchemy feature + try: + return self.dbapi.connect(*cargs, **cparams) + except self.dbapi.DatabaseError as err: + if "ORA-12516" in str(err): + time.sleep(2) + return self.dbapi.connect(*cargs, **cparams) + else: + raise + else: + return super(OracleDialect_cx_oracle, self).connect( + *cargs, **cparams) + + def initialize(self, connection): + super(OracleDialect_cx_oracle, self).initialize(connection) + if self._is_oracle_8: + self.supports_unicode_binds = False + self._detect_decimal_char(connection) + + def _detect_decimal_char(self, connection): + """detect if the decimal separator character is not '.', as + is the case with European locale settings for NLS_LANG. + + cx_oracle itself uses similar logic when it formats Python + Decimal objects to strings on the bind side (as of 5.0.3), + as Oracle sends/receives string numerics only in the + current locale. + + """ + if self.cx_oracle_ver < (5,): + # no output type handlers before version 5 + return + + cx_Oracle = self.dbapi + conn = connection.connection + + # override the output_type_handler that's + # on the cx_oracle connection with a plain + # one on the cursor + + def output_type_handler(cursor, name, defaultType, + size, precision, scale): + return cursor.var( + cx_Oracle.STRING, + 255, arraysize=cursor.arraysize) + + cursor = conn.cursor() + cursor.outputtypehandler = output_type_handler + cursor.execute("SELECT 0.1 FROM DUAL") + val = cursor.fetchone()[0] + cursor.close() + char = re.match(r"([\.,])", val).group(1) + if char != '.': + _detect_decimal = self._detect_decimal + self._detect_decimal = \ + lambda value: _detect_decimal(value.replace(char, '.')) + self._to_decimal = \ + lambda value: decimal.Decimal(value.replace(char, '.')) + + def _detect_decimal(self, value): + if "." in value: + return decimal.Decimal(value) + else: + return int(value) + + _to_decimal = decimal.Decimal + + def on_connect(self): + if self.cx_oracle_ver < (5,): + # no output type handlers before version 5 + return + + cx_Oracle = self.dbapi + + def output_type_handler(cursor, name, defaultType, + size, precision, scale): + # convert all NUMBER with precision + positive scale to Decimal + # this almost allows "native decimal" mode. + if self.supports_native_decimal and \ + defaultType == cx_Oracle.NUMBER and \ + precision and scale > 0: + return cursor.var( + cx_Oracle.STRING, + 255, + outconverter=self._to_decimal, + arraysize=cursor.arraysize) + # if NUMBER with zero precision and 0 or neg scale, this appears + # to indicate "ambiguous". Use a slower converter that will + # make a decision based on each value received - the type + # may change from row to row (!). This kills + # off "native decimal" mode, handlers still needed. + elif self.supports_native_decimal and \ + defaultType == cx_Oracle.NUMBER \ + and not precision and scale <= 0: + return cursor.var( + cx_Oracle.STRING, + 255, + outconverter=self._detect_decimal, + arraysize=cursor.arraysize) + # allow all strings to come back natively as Unicode + elif self.coerce_to_unicode and \ + defaultType in (cx_Oracle.STRING, cx_Oracle.FIXED_CHAR): + return cursor.var(util.text_type, size, cursor.arraysize) + + def on_connect(conn): + conn.outputtypehandler = output_type_handler + + return on_connect + + def create_connect_args(self, url): + dialect_opts = dict(url.query) + for opt in ('use_ansi', 'auto_setinputsizes', 'auto_convert_lobs', + 'threaded', 'allow_twophase'): + if opt in dialect_opts: + util.coerce_kw_type(dialect_opts, opt, bool) + setattr(self, opt, dialect_opts[opt]) + + database = url.database + service_name = dialect_opts.get('service_name', None) + if database or service_name: + # if we have a database, then we have a remote host + port = url.port + if port: + port = int(port) + else: + port = 1521 + + if database and service_name: + raise exc.InvalidRequestError( + '"service_name" option shouldn\'t ' + 'be used with a "database" part of the url') + if database: + makedsn_kwargs = {'sid': database} + if service_name: + makedsn_kwargs = {'service_name': service_name} + + dsn = self.dbapi.makedsn(url.host, port, **makedsn_kwargs) + else: + # we have a local tnsname + dsn = url.host + + opts = dict( + threaded=self.threaded, + twophase=self.allow_twophase, + ) + + if dsn is not None: + opts['dsn'] = dsn + if url.password is not None: + opts['password'] = url.password + if url.username is not None: + opts['user'] = url.username + + if util.py2k: + if self._cx_oracle_with_unicode: + for k, v in opts.items(): + if isinstance(v, str): + opts[k] = unicode(v) + else: + for k, v in opts.items(): + if isinstance(v, unicode): + opts[k] = str(v) + + if 'mode' in url.query: + opts['mode'] = url.query['mode'] + if isinstance(opts['mode'], util.string_types): + mode = opts['mode'].upper() + if mode == 'SYSDBA': + opts['mode'] = self.dbapi.SYSDBA + elif mode == 'SYSOPER': + opts['mode'] = self.dbapi.SYSOPER + else: + util.coerce_kw_type(opts, 'mode', int) + return ([], opts) + + def _get_server_version_info(self, connection): + return tuple( + int(x) + for x in connection.connection.version.split('.') + ) + + def is_disconnect(self, e, connection, cursor): + error, = e.args + if isinstance(e, self.dbapi.InterfaceError): + return "not connected" in str(e) + elif hasattr(error, 'code'): + # ORA-00028: your session has been killed + # ORA-03114: not connected to ORACLE + # ORA-03113: end-of-file on communication channel + # ORA-03135: connection lost contact + # ORA-01033: ORACLE initialization or shutdown in progress + # ORA-02396: exceeded maximum idle time, please connect again + # TODO: Others ? + return error.code in (28, 3114, 3113, 3135, 1033, 2396) + else: + return False + + def create_xid(self): + """create a two-phase transaction ID. + + this id will be passed to do_begin_twophase(), do_rollback_twophase(), + do_commit_twophase(). its format is unspecified.""" + + id = random.randint(0, 2 ** 128) + return (0x1234, "%032x" % id, "%032x" % 9) + + def do_executemany(self, cursor, statement, parameters, context=None): + if isinstance(parameters, tuple): + parameters = list(parameters) + cursor.executemany(statement, parameters) + + def do_begin_twophase(self, connection, xid): + connection.connection.begin(*xid) + + def do_prepare_twophase(self, connection, xid): + result = connection.connection.prepare() + connection.info['cx_oracle_prepared'] = result + + def do_rollback_twophase(self, connection, xid, is_prepared=True, + recover=False): + self.do_rollback(connection.connection) + + def do_commit_twophase(self, connection, xid, is_prepared=True, + recover=False): + if not is_prepared: + self.do_commit(connection.connection) + else: + oci_prepared = connection.info['cx_oracle_prepared'] + if oci_prepared: + self.do_commit(connection.connection) + + def do_recover_twophase(self, connection): + connection.info.pop('cx_oracle_prepared', None) + +dialect = OracleDialect_cx_oracle diff --git a/app/lib/sqlalchemy/dialects/oracle/zxjdbc.py b/app/lib/sqlalchemy/dialects/oracle/zxjdbc.py new file mode 100644 index 0000000..c8a31f1 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/oracle/zxjdbc.py @@ -0,0 +1,235 @@ +# oracle/zxjdbc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: oracle+zxjdbc + :name: zxJDBC for Jython + :dbapi: zxjdbc + :connectstring: oracle+zxjdbc://user:pass@host/dbname + :driverurl: http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html + + .. note:: Jython is not supported by current versions of SQLAlchemy. The + zxjdbc dialect should be considered as experimental. + +""" +import decimal +import re + +from sqlalchemy import sql, types as sqltypes, util +from sqlalchemy.connectors.zxJDBC import ZxJDBCConnector +from sqlalchemy.dialects.oracle.base import (OracleCompiler, + OracleDialect, + OracleExecutionContext) +from sqlalchemy.engine import result as _result +from sqlalchemy.sql import expression +import collections + +SQLException = zxJDBC = None + + +class _ZxJDBCDate(sqltypes.Date): + + def result_processor(self, dialect, coltype): + def process(value): + if value is None: + return None + else: + return value.date() + return process + + +class _ZxJDBCNumeric(sqltypes.Numeric): + + def result_processor(self, dialect, coltype): + # XXX: does the dialect return Decimal or not??? + # if it does (in all cases), we could use a None processor as well as + # the to_float generic processor + if self.asdecimal: + def process(value): + if isinstance(value, decimal.Decimal): + return value + else: + return decimal.Decimal(str(value)) + else: + def process(value): + if isinstance(value, decimal.Decimal): + return float(value) + else: + return value + return process + + +class OracleCompiler_zxjdbc(OracleCompiler): + + def returning_clause(self, stmt, returning_cols): + self.returning_cols = list( + expression._select_iterables(returning_cols)) + + # within_columns_clause=False so that labels (foo AS bar) don't render + columns = [self.process(c, within_columns_clause=False) + for c in self.returning_cols] + + if not hasattr(self, 'returning_parameters'): + self.returning_parameters = [] + + binds = [] + for i, col in enumerate(self.returning_cols): + dbtype = col.type.dialect_impl( + self.dialect).get_dbapi_type(self.dialect.dbapi) + self.returning_parameters.append((i + 1, dbtype)) + + bindparam = sql.bindparam( + "ret_%d" % i, value=ReturningParam(dbtype)) + self.binds[bindparam.key] = bindparam + binds.append( + self.bindparam_string(self._truncate_bindparam(bindparam))) + + return 'RETURNING ' + ', '.join(columns) + " INTO " + ", ".join(binds) + + +class OracleExecutionContext_zxjdbc(OracleExecutionContext): + + def pre_exec(self): + if hasattr(self.compiled, 'returning_parameters'): + # prepare a zxJDBC statement so we can grab its underlying + # OraclePreparedStatement's getReturnResultSet later + self.statement = self.cursor.prepare(self.statement) + + def get_result_proxy(self): + if hasattr(self.compiled, 'returning_parameters'): + rrs = None + try: + try: + rrs = self.statement.__statement__.getReturnResultSet() + next(rrs) + except SQLException as sqle: + msg = '%s [SQLCode: %d]' % ( + sqle.getMessage(), sqle.getErrorCode()) + if sqle.getSQLState() is not None: + msg += ' [SQLState: %s]' % sqle.getSQLState() + raise zxJDBC.Error(msg) + else: + row = tuple( + self.cursor.datahandler.getPyObject( + rrs, index, dbtype) + for index, dbtype in + self.compiled.returning_parameters) + return ReturningResultProxy(self, row) + finally: + if rrs is not None: + try: + rrs.close() + except SQLException: + pass + self.statement.close() + + return _result.ResultProxy(self) + + def create_cursor(self): + cursor = self._dbapi_connection.cursor() + cursor.datahandler = self.dialect.DataHandler(cursor.datahandler) + return cursor + + +class ReturningResultProxy(_result.FullyBufferedResultProxy): + + """ResultProxy backed by the RETURNING ResultSet results.""" + + def __init__(self, context, returning_row): + self._returning_row = returning_row + super(ReturningResultProxy, self).__init__(context) + + def _cursor_description(self): + ret = [] + for c in self.context.compiled.returning_cols: + if hasattr(c, 'name'): + ret.append((c.name, c.type)) + else: + ret.append((c.anon_label, c.type)) + return ret + + def _buffer_rows(self): + return collections.deque([self._returning_row]) + + +class ReturningParam(object): + + """A bindparam value representing a RETURNING parameter. + + Specially handled by OracleReturningDataHandler. + """ + + def __init__(self, type): + self.type = type + + def __eq__(self, other): + if isinstance(other, ReturningParam): + return self.type == other.type + return NotImplemented + + def __ne__(self, other): + if isinstance(other, ReturningParam): + return self.type != other.type + return NotImplemented + + def __repr__(self): + kls = self.__class__ + return '<%s.%s object at 0x%x type=%s>' % ( + kls.__module__, kls.__name__, id(self), self.type) + + +class OracleDialect_zxjdbc(ZxJDBCConnector, OracleDialect): + jdbc_db_name = 'oracle' + jdbc_driver_name = 'oracle.jdbc.OracleDriver' + + statement_compiler = OracleCompiler_zxjdbc + execution_ctx_cls = OracleExecutionContext_zxjdbc + + colspecs = util.update_copy( + OracleDialect.colspecs, + { + sqltypes.Date: _ZxJDBCDate, + sqltypes.Numeric: _ZxJDBCNumeric + } + ) + + def __init__(self, *args, **kwargs): + super(OracleDialect_zxjdbc, self).__init__(*args, **kwargs) + global SQLException, zxJDBC + from java.sql import SQLException + from com.ziclix.python.sql import zxJDBC + from com.ziclix.python.sql.handler import OracleDataHandler + + class OracleReturningDataHandler(OracleDataHandler): + """zxJDBC DataHandler that specially handles ReturningParam.""" + + def setJDBCObject(self, statement, index, object, dbtype=None): + if type(object) is ReturningParam: + statement.registerReturnParameter(index, object.type) + elif dbtype is None: + OracleDataHandler.setJDBCObject( + self, statement, index, object) + else: + OracleDataHandler.setJDBCObject( + self, statement, index, object, dbtype) + self.DataHandler = OracleReturningDataHandler + + def initialize(self, connection): + super(OracleDialect_zxjdbc, self).initialize(connection) + self.implicit_returning = \ + connection.connection.driverversion >= '10.2' + + def _create_jdbc_url(self, url): + return 'jdbc:oracle:thin:@%s:%s:%s' % ( + url.host, url.port or 1521, url.database) + + def _get_server_version_info(self, connection): + version = re.search( + r'Release ([\d\.]+)', connection.connection.dbversion).group(1) + return tuple(int(x) for x in version.split('.')) + +dialect = OracleDialect_zxjdbc diff --git a/app/lib/sqlalchemy/dialects/postgresql/__init__.py b/app/lib/sqlalchemy/dialects/postgresql/__init__.py new file mode 100644 index 0000000..a6872cf --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/__init__.py @@ -0,0 +1,36 @@ +# postgresql/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from . import base, psycopg2, pg8000, pypostgresql, pygresql, \ + zxjdbc, psycopg2cffi + +base.dialect = psycopg2.dialect + +from .base import \ + INTEGER, BIGINT, SMALLINT, VARCHAR, CHAR, TEXT, NUMERIC, FLOAT, REAL, \ + INET, CIDR, UUID, BIT, MACADDR, OID, DOUBLE_PRECISION, TIMESTAMP, TIME, \ + DATE, BYTEA, BOOLEAN, INTERVAL, ENUM, dialect, TSVECTOR, DropEnumType, \ + CreateEnumType +from .hstore import HSTORE, hstore +from .json import JSON, JSONB +from .array import array, ARRAY, Any, All +from .ext import aggregate_order_by, ExcludeConstraint, array_agg +from .dml import insert, Insert + +from .ranges import INT4RANGE, INT8RANGE, NUMRANGE, DATERANGE, TSRANGE, \ + TSTZRANGE + +__all__ = ( + 'INTEGER', 'BIGINT', 'SMALLINT', 'VARCHAR', 'CHAR', 'TEXT', 'NUMERIC', + 'FLOAT', 'REAL', 'INET', 'CIDR', 'UUID', 'BIT', 'MACADDR', 'OID', + 'DOUBLE_PRECISION', 'TIMESTAMP', 'TIME', 'DATE', 'BYTEA', 'BOOLEAN', + 'INTERVAL', 'ARRAY', 'ENUM', 'dialect', 'array', 'HSTORE', + 'hstore', 'INT4RANGE', 'INT8RANGE', 'NUMRANGE', 'DATERANGE', + 'TSRANGE', 'TSTZRANGE', 'json', 'JSON', 'JSONB', 'Any', 'All', + 'DropEnumType', 'CreateEnumType', 'ExcludeConstraint', + 'aggregate_order_by', 'array_agg', 'insert', 'Insert' +) diff --git a/app/lib/sqlalchemy/dialects/postgresql/array.py b/app/lib/sqlalchemy/dialects/postgresql/array.py new file mode 100644 index 0000000..98cab95 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/array.py @@ -0,0 +1,314 @@ +# postgresql/array.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from .base import ischema_names +from ...sql import expression, operators +from ...sql.base import SchemaEventTarget +from ... import types as sqltypes + +try: + from uuid import UUID as _python_UUID +except ImportError: + _python_UUID = None + + +def Any(other, arrexpr, operator=operators.eq): + """A synonym for the :meth:`.ARRAY.Comparator.any` method. + + This method is legacy and is here for backwards-compatibility. + + .. seealso:: + + :func:`.expression.any_` + + """ + + return arrexpr.any(other, operator) + + +def All(other, arrexpr, operator=operators.eq): + """A synonym for the :meth:`.ARRAY.Comparator.all` method. + + This method is legacy and is here for backwards-compatibility. + + .. seealso:: + + :func:`.expression.all_` + + """ + + return arrexpr.all(other, operator) + + +class array(expression.Tuple): + + """A PostgreSQL ARRAY literal. + + This is used to produce ARRAY literals in SQL expressions, e.g.:: + + from sqlalchemy.dialects.postgresql import array + from sqlalchemy.dialects import postgresql + from sqlalchemy import select, func + + stmt = select([ + array([1,2]) + array([3,4,5]) + ]) + + print stmt.compile(dialect=postgresql.dialect()) + + Produces the SQL:: + + SELECT ARRAY[%(param_1)s, %(param_2)s] || + ARRAY[%(param_3)s, %(param_4)s, %(param_5)s]) AS anon_1 + + An instance of :class:`.array` will always have the datatype + :class:`.ARRAY`. The "inner" type of the array is inferred from + the values present, unless the ``type_`` keyword argument is passed:: + + array(['foo', 'bar'], type_=CHAR) + + .. versionadded:: 0.8 Added the :class:`~.postgresql.array` literal type. + + See also: + + :class:`.postgresql.ARRAY` + + """ + __visit_name__ = 'array' + + def __init__(self, clauses, **kw): + super(array, self).__init__(*clauses, **kw) + self.type = ARRAY(self.type) + + def _bind_param(self, operator, obj, _assume_scalar=False, type_=None): + if _assume_scalar or operator is operators.getitem: + # if getitem->slice were called, Indexable produces + # a Slice object from that + assert isinstance(obj, int) + return expression.BindParameter( + None, obj, _compared_to_operator=operator, + type_=type_, + _compared_to_type=self.type, unique=True) + + else: + return array([ + self._bind_param(operator, o, _assume_scalar=True, type_=type_) + for o in obj]) + + def self_group(self, against=None): + if (against in ( + operators.any_op, operators.all_op, operators.getitem)): + return expression.Grouping(self) + else: + return self + + +CONTAINS = operators.custom_op("@>", precedence=5) + +CONTAINED_BY = operators.custom_op("<@", precedence=5) + +OVERLAP = operators.custom_op("&&", precedence=5) + + +class ARRAY(SchemaEventTarget, sqltypes.ARRAY): + + """PostgreSQL ARRAY type. + + .. versionchanged:: 1.1 The :class:`.postgresql.ARRAY` type is now + a subclass of the core :class:`.types.ARRAY` type. + + The :class:`.postgresql.ARRAY` type is constructed in the same way + as the core :class:`.types.ARRAY` type; a member type is required, and a + number of dimensions is recommended if the type is to be used for more + than one dimension:: + + from sqlalchemy.dialects import postgresql + + mytable = Table("mytable", metadata, + Column("data", postgresql.ARRAY(Integer, dimensions=2)) + ) + + The :class:`.postgresql.ARRAY` type provides all operations defined on the + core :class:`.types.ARRAY` type, including support for "dimensions", indexed + access, and simple matching such as :meth:`.types.ARRAY.Comparator.any` + and :meth:`.types.ARRAY.Comparator.all`. :class:`.postgresql.ARRAY` class also + provides PostgreSQL-specific methods for containment operations, including + :meth:`.postgresql.ARRAY.Comparator.contains` + :meth:`.postgresql.ARRAY.Comparator.contained_by`, + and :meth:`.postgresql.ARRAY.Comparator.overlap`, e.g.:: + + mytable.c.data.contains([1, 2]) + + The :class:`.postgresql.ARRAY` type may not be supported on all + PostgreSQL DBAPIs; it is currently known to work on psycopg2 only. + + Additionally, the :class:`.postgresql.ARRAY` type does not work directly in + conjunction with the :class:`.ENUM` type. For a workaround, see the + special type at :ref:`postgresql_array_of_enum`. + + .. seealso:: + + :class:`.types.ARRAY` - base array type + + :class:`.postgresql.array` - produces a literal array value. + + """ + + class Comparator(sqltypes.ARRAY.Comparator): + + """Define comparison operations for :class:`.ARRAY`. + + Note that these operations are in addition to those provided + by the base :class:`.types.ARRAY.Comparator` class, including + :meth:`.types.ARRAY.Comparator.any` and + :meth:`.types.ARRAY.Comparator.all`. + + """ + + def contains(self, other, **kwargs): + """Boolean expression. Test if elements are a superset of the + elements of the argument array expression. + """ + return self.operate(CONTAINS, other, result_type=sqltypes.Boolean) + + def contained_by(self, other): + """Boolean expression. Test if elements are a proper subset of the + elements of the argument array expression. + """ + return self.operate( + CONTAINED_BY, other, result_type=sqltypes.Boolean) + + def overlap(self, other): + """Boolean expression. Test if array has elements in common with + an argument array expression. + """ + return self.operate(OVERLAP, other, result_type=sqltypes.Boolean) + + comparator_factory = Comparator + + def __init__(self, item_type, as_tuple=False, dimensions=None, + zero_indexes=False): + """Construct an ARRAY. + + E.g.:: + + Column('myarray', ARRAY(Integer)) + + Arguments are: + + :param item_type: The data type of items of this array. Note that + dimensionality is irrelevant here, so multi-dimensional arrays like + ``INTEGER[][]``, are constructed as ``ARRAY(Integer)``, not as + ``ARRAY(ARRAY(Integer))`` or such. + + :param as_tuple=False: Specify whether return results + should be converted to tuples from lists. DBAPIs such + as psycopg2 return lists by default. When tuples are + returned, the results are hashable. + + :param dimensions: if non-None, the ARRAY will assume a fixed + number of dimensions. This will cause the DDL emitted for this + ARRAY to include the exact number of bracket clauses ``[]``, + and will also optimize the performance of the type overall. + Note that PG arrays are always implicitly "non-dimensioned", + meaning they can store any number of dimensions no matter how + they were declared. + + :param zero_indexes=False: when True, index values will be converted + between Python zero-based and PostgreSQL one-based indexes, e.g. + a value of one will be added to all index values before passing + to the database. + + .. versionadded:: 0.9.5 + + + """ + if isinstance(item_type, ARRAY): + raise ValueError("Do not nest ARRAY types; ARRAY(basetype) " + "handles multi-dimensional arrays of basetype") + if isinstance(item_type, type): + item_type = item_type() + self.item_type = item_type + self.as_tuple = as_tuple + self.dimensions = dimensions + self.zero_indexes = zero_indexes + + @property + def hashable(self): + return self.as_tuple + + @property + def python_type(self): + return list + + def compare_values(self, x, y): + return x == y + + def _set_parent(self, column): + """Support SchemaEventTarget""" + + if isinstance(self.item_type, SchemaEventTarget): + self.item_type._set_parent(column) + + def _set_parent_with_dispatch(self, parent): + """Support SchemaEventTarget""" + + if isinstance(self.item_type, SchemaEventTarget): + self.item_type._set_parent_with_dispatch(parent) + + def _proc_array(self, arr, itemproc, dim, collection): + if dim is None: + arr = list(arr) + if dim == 1 or dim is None and ( + # this has to be (list, tuple), or at least + # not hasattr('__iter__'), since Py3K strings + # etc. have __iter__ + not arr or not isinstance(arr[0], (list, tuple))): + if itemproc: + return collection(itemproc(x) for x in arr) + else: + return collection(arr) + else: + return collection( + self._proc_array( + x, itemproc, + dim - 1 if dim is not None else None, + collection) + for x in arr + ) + + def bind_processor(self, dialect): + item_proc = self.item_type.dialect_impl(dialect).\ + bind_processor(dialect) + + def process(value): + if value is None: + return value + else: + return self._proc_array( + value, + item_proc, + self.dimensions, + list) + return process + + def result_processor(self, dialect, coltype): + item_proc = self.item_type.dialect_impl(dialect).\ + result_processor(dialect, coltype) + + def process(value): + if value is None: + return value + else: + return self._proc_array( + value, + item_proc, + self.dimensions, + tuple if self.as_tuple else list) + return process + +ischema_names['_array'] = ARRAY diff --git a/app/lib/sqlalchemy/dialects/postgresql/base.py b/app/lib/sqlalchemy/dialects/postgresql/base.py new file mode 100644 index 0000000..26d974e --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/base.py @@ -0,0 +1,2989 @@ +# postgresql/base.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +r""" +.. dialect:: postgresql + :name: PostgreSQL + +.. _postgresql_sequences: + +Sequences/SERIAL +---------------- + +PostgreSQL supports sequences, and SQLAlchemy uses these as the default means +of creating new primary key values for integer-based primary key columns. When +creating tables, SQLAlchemy will issue the ``SERIAL`` datatype for +integer-based primary key columns, which generates a sequence and server side +default corresponding to the column. + +To specify a specific named sequence to be used for primary key generation, +use the :func:`~sqlalchemy.schema.Sequence` construct:: + + Table('sometable', metadata, + Column('id', Integer, Sequence('some_id_seq'), primary_key=True) + ) + +When SQLAlchemy issues a single INSERT statement, to fulfill the contract of +having the "last insert identifier" available, a RETURNING clause is added to +the INSERT statement which specifies the primary key columns should be +returned after the statement completes. The RETURNING functionality only takes +place if PostgreSQL 8.2 or later is in use. As a fallback approach, the +sequence, whether specified explicitly or implicitly via ``SERIAL``, is +executed independently beforehand, the returned value to be used in the +subsequent insert. Note that when an +:func:`~sqlalchemy.sql.expression.insert()` construct is executed using +"executemany" semantics, the "last inserted identifier" functionality does not +apply; no RETURNING clause is emitted nor is the sequence pre-executed in this +case. + +To force the usage of RETURNING by default off, specify the flag +``implicit_returning=False`` to :func:`.create_engine`. + +.. _postgresql_isolation_level: + +Transaction Isolation Level +--------------------------- + +All PostgreSQL dialects support setting of transaction isolation level +both via a dialect-specific parameter +:paramref:`.create_engine.isolation_level` accepted by :func:`.create_engine`, +as well as the :paramref:`.Connection.execution_options.isolation_level` +argument as passed to :meth:`.Connection.execution_options`. +When using a non-psycopg2 dialect, this feature works by issuing the command +``SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL `` for +each new connection. For the special AUTOCOMMIT isolation level, +DBAPI-specific techniques are used. + +To set isolation level using :func:`.create_engine`:: + + engine = create_engine( + "postgresql+pg8000://scott:tiger@localhost/test", + isolation_level="READ UNCOMMITTED" + ) + +To set using per-connection execution options:: + + connection = engine.connect() + connection = connection.execution_options( + isolation_level="READ COMMITTED" + ) + +Valid values for ``isolation_level`` include: + +* ``READ COMMITTED`` +* ``READ UNCOMMITTED`` +* ``REPEATABLE READ`` +* ``SERIALIZABLE`` +* ``AUTOCOMMIT`` - on psycopg2 / pg8000 only + +.. seealso:: + + :ref:`psycopg2_isolation_level` + + :ref:`pg8000_isolation_level` + +.. _postgresql_schema_reflection: + +Remote-Schema Table Introspection and PostgreSQL search_path +------------------------------------------------------------ + +The PostgreSQL dialect can reflect tables from any schema. The +:paramref:`.Table.schema` argument, or alternatively the +:paramref:`.MetaData.reflect.schema` argument determines which schema will +be searched for the table or tables. The reflected :class:`.Table` objects +will in all cases retain this ``.schema`` attribute as was specified. +However, with regards to tables which these :class:`.Table` objects refer to +via foreign key constraint, a decision must be made as to how the ``.schema`` +is represented in those remote tables, in the case where that remote +schema name is also a member of the current +`PostgreSQL search path +`_. + +By default, the PostgreSQL dialect mimics the behavior encouraged by +PostgreSQL's own ``pg_get_constraintdef()`` builtin procedure. This function +returns a sample definition for a particular foreign key constraint, +omitting the referenced schema name from that definition when the name is +also in the PostgreSQL schema search path. The interaction below +illustrates this behavior:: + + test=> CREATE TABLE test_schema.referred(id INTEGER PRIMARY KEY); + CREATE TABLE + test=> CREATE TABLE referring( + test(> id INTEGER PRIMARY KEY, + test(> referred_id INTEGER REFERENCES test_schema.referred(id)); + CREATE TABLE + test=> SET search_path TO public, test_schema; + test=> SELECT pg_catalog.pg_get_constraintdef(r.oid, true) FROM + test-> pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n + test-> ON n.oid = c.relnamespace + test-> JOIN pg_catalog.pg_constraint r ON c.oid = r.conrelid + test-> WHERE c.relname='referring' AND r.contype = 'f' + test-> ; + pg_get_constraintdef + --------------------------------------------------- + FOREIGN KEY (referred_id) REFERENCES referred(id) + (1 row) + +Above, we created a table ``referred`` as a member of the remote schema +``test_schema``, however when we added ``test_schema`` to the +PG ``search_path`` and then asked ``pg_get_constraintdef()`` for the +``FOREIGN KEY`` syntax, ``test_schema`` was not included in the output of +the function. + +On the other hand, if we set the search path back to the typical default +of ``public``:: + + test=> SET search_path TO public; + SET + +The same query against ``pg_get_constraintdef()`` now returns the fully +schema-qualified name for us:: + + test=> SELECT pg_catalog.pg_get_constraintdef(r.oid, true) FROM + test-> pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n + test-> ON n.oid = c.relnamespace + test-> JOIN pg_catalog.pg_constraint r ON c.oid = r.conrelid + test-> WHERE c.relname='referring' AND r.contype = 'f'; + pg_get_constraintdef + --------------------------------------------------------------- + FOREIGN KEY (referred_id) REFERENCES test_schema.referred(id) + (1 row) + +SQLAlchemy will by default use the return value of ``pg_get_constraintdef()`` +in order to determine the remote schema name. That is, if our ``search_path`` +were set to include ``test_schema``, and we invoked a table +reflection process as follows:: + + >>> from sqlalchemy import Table, MetaData, create_engine + >>> engine = create_engine("postgresql://scott:tiger@localhost/test") + >>> with engine.connect() as conn: + ... conn.execute("SET search_path TO test_schema, public") + ... meta = MetaData() + ... referring = Table('referring', meta, + ... autoload=True, autoload_with=conn) + ... + + +The above process would deliver to the :attr:`.MetaData.tables` collection +``referred`` table named **without** the schema:: + + >>> meta.tables['referred'].schema is None + True + +To alter the behavior of reflection such that the referred schema is +maintained regardless of the ``search_path`` setting, use the +``postgresql_ignore_search_path`` option, which can be specified as a +dialect-specific argument to both :class:`.Table` as well as +:meth:`.MetaData.reflect`:: + + >>> with engine.connect() as conn: + ... conn.execute("SET search_path TO test_schema, public") + ... meta = MetaData() + ... referring = Table('referring', meta, autoload=True, + ... autoload_with=conn, + ... postgresql_ignore_search_path=True) + ... + + +We will now have ``test_schema.referred`` stored as schema-qualified:: + + >>> meta.tables['test_schema.referred'].schema + 'test_schema' + +.. sidebar:: Best Practices for PostgreSQL Schema reflection + + The description of PostgreSQL schema reflection behavior is complex, and + is the product of many years of dealing with widely varied use cases and + user preferences. But in fact, there's no need to understand any of it if + you just stick to the simplest use pattern: leave the ``search_path`` set + to its default of ``public`` only, never refer to the name ``public`` as + an explicit schema name otherwise, and refer to all other schema names + explicitly when building up a :class:`.Table` object. The options + described here are only for those users who can't, or prefer not to, stay + within these guidelines. + +Note that **in all cases**, the "default" schema is always reflected as +``None``. The "default" schema on PostgreSQL is that which is returned by the +PostgreSQL ``current_schema()`` function. On a typical PostgreSQL +installation, this is the name ``public``. So a table that refers to another +which is in the ``public`` (i.e. default) schema will always have the +``.schema`` attribute set to ``None``. + +.. versionadded:: 0.9.2 Added the ``postgresql_ignore_search_path`` + dialect-level option accepted by :class:`.Table` and + :meth:`.MetaData.reflect`. + + +.. seealso:: + + `The Schema Search Path + `_ + - on the PostgreSQL website. + +INSERT/UPDATE...RETURNING +------------------------- + +The dialect supports PG 8.2's ``INSERT..RETURNING``, ``UPDATE..RETURNING`` and +``DELETE..RETURNING`` syntaxes. ``INSERT..RETURNING`` is used by default +for single-row INSERT statements in order to fetch newly generated +primary key identifiers. To specify an explicit ``RETURNING`` clause, +use the :meth:`._UpdateBase.returning` method on a per-statement basis:: + + # INSERT..RETURNING + result = table.insert().returning(table.c.col1, table.c.col2).\ + values(name='foo') + print result.fetchall() + + # UPDATE..RETURNING + result = table.update().returning(table.c.col1, table.c.col2).\ + where(table.c.name=='foo').values(name='bar') + print result.fetchall() + + # DELETE..RETURNING + result = table.delete().returning(table.c.col1, table.c.col2).\ + where(table.c.name=='foo') + print result.fetchall() + +.. _postgresql_insert_on_conflict: + +INSERT...ON CONFLICT (Upsert) +------------------------------ + +Starting with version 9.5, PostgreSQL allows "upserts" (update or insert) +of rows into a table via the ``ON CONFLICT`` clause of the ``INSERT`` statement. +A candidate row will only be inserted if that row does not violate +any unique constraints. In the case of a unique constraint violation, +a secondary action can occur which can be either "DO UPDATE", indicating +that the data in the target row should be updated, or "DO NOTHING", +which indicates to silently skip this row. + +Conflicts are determined using existing unique constraints and indexes. These +constraints may be identified either using their name as stated in DDL, +or they may be *inferred* by stating the columns and conditions that comprise +the indexes. + +SQLAlchemy provides ``ON CONFLICT`` support via the PostgreSQL-specific +:func:`.postgresql.dml.insert()` function, which provides +the generative methods :meth:`~.postgresql.dml.Insert.on_conflict_do_update` +and :meth:`~.postgresql.dml.Insert.on_conflict_do_nothing`:: + + from sqlalchemy.dialects.postgresql import insert + + insert_stmt = insert(my_table).values( + id='some_existing_id', + data='inserted value') + + do_nothing_stmt = insert_stmt.on_conflict_do_nothing( + index_elements=['id'] + ) + + conn.execute(do_nothing_stmt) + + do_update_stmt = insert_stmt.on_conflict_do_update( + constraint='pk_my_table', + set_=dict(data='updated value') + ) + + conn.execute(do_update_stmt) + +Both methods supply the "target" of the conflict using either the +named constraint or by column inference: + +* The :paramref:`.Insert.on_conflict_do_update.index_elements` argument + specifies a sequence containing string column names, :class:`.Column` objects, + and/or SQL expression elements, which would identify a unique index:: + + do_update_stmt = insert_stmt.on_conflict_do_update( + index_elements=['id'], + set_=dict(data='updated value') + ) + + do_update_stmt = insert_stmt.on_conflict_do_update( + index_elements=[my_table.c.id], + set_=dict(data='updated value') + ) + +* When using :paramref:`.Insert.on_conflict_do_update.index_elements` to + infer an index, a partial index can be inferred by also specifying the + use the :paramref:`.Insert.on_conflict_do_update.index_where` parameter:: + + from sqlalchemy.dialects.postgresql import insert + + stmt = insert(my_table).values(user_email='a@b.com', data='inserted data') + stmt = stmt.on_conflict_do_update( + index_elements=[my_table.c.user_email], + index_where=my_table.c.user_email.like('%@gmail.com'), + set_=dict(data=stmt.excluded.data) + ) + conn.execute(stmt) + + +* The :paramref:`.Insert.on_conflict_do_update.constraint` argument is + used to specify an index directly rather than inferring it. This can be + the name of a UNIQUE constraint, a PRIMARY KEY constraint, or an INDEX:: + + do_update_stmt = insert_stmt.on_conflict_do_update( + constraint='my_table_idx_1', + set_=dict(data='updated value') + ) + + do_update_stmt = insert_stmt.on_conflict_do_update( + constraint='my_table_pk', + set_=dict(data='updated value') + ) + +* The :paramref:`.Insert.on_conflict_do_update.constraint` argument may + also refer to a SQLAlchemy construct representing a constraint, + e.g. :class:`.UniqueConstraint`, :class:`.PrimaryKeyConstraint`, + :class:`.Index`, or :class:`.ExcludeConstraint`. In this use, + if the constraint has a name, it is used directly. Otherwise, if the + constraint is unnamed, then inference will be used, where the expressions + and optional WHERE clause of the constraint will be spelled out in the + construct. This use is especially convenient + to refer to the named or unnamed primary key of a :class:`.Table` using the + :attr:`.Table.primary_key` attribute:: + + do_update_stmt = insert_stmt.on_conflict_do_update( + constraint=my_table.primary_key, + set_=dict(data='updated value') + ) + +``ON CONFLICT...DO UPDATE`` is used to perform an update of the already +existing row, using any combination of new values as well as values +from the proposed insertion. These values are specified using the +:paramref:`.Insert.on_conflict_do_update.set_` parameter. This +parameter accepts a dictionary which consists of direct values +for UPDATE:: + + from sqlalchemy.dialects.postgresql import insert + + stmt = insert(my_table).values(id='some_id', data='inserted value') + do_update_stmt = stmt.on_conflict_do_update( + index_elements=['id'], + set_=dict(data='updated value') + ) + conn.execute(do_update_stmt) + +.. warning:: + + The :meth:`.Insert.on_conflict_do_update` method does **not** take into + account Python-side default UPDATE values or generation functions, e.g. + e.g. those specified using :paramref:`.Column.onupdate`. + These values will not be exercised for an ON CONFLICT style of UPDATE, + unless they are manually specified in the + :paramref:`.Insert.on_conflict_do_update.set_` dictionary. + +In order to refer to the proposed insertion row, the special alias +:attr:`~.postgresql.dml.Insert.excluded` is available as an attribute on +the :class:`.postgresql.dml.Insert` object; this object is a +:class:`.ColumnCollection` which alias contains all columns of the target +table:: + + from sqlalchemy.dialects.postgresql import insert + + stmt = insert(my_table).values( + id='some_id', + data='inserted value', + author='jlh') + do_update_stmt = stmt.on_conflict_do_update( + index_elements=['id'], + set_=dict(data='updated value', author=stmt.excluded.author) + ) + conn.execute(do_update_stmt) + +The :meth:`.Insert.on_conflict_do_update` method also accepts +a WHERE clause using the :paramref:`.Insert.on_conflict_do_update.where` +parameter, which will limit those rows which receive an UPDATE:: + + from sqlalchemy.dialects.postgresql import insert + + stmt = insert(my_table).values( + id='some_id', + data='inserted value', + author='jlh') + on_update_stmt = stmt.on_conflict_do_update( + index_elements=['id'], + set_=dict(data='updated value', author=stmt.excluded.author) + where=(my_table.c.status == 2) + ) + conn.execute(on_update_stmt) + +``ON CONFLICT`` may also be used to skip inserting a row entirely +if any conflict with a unique or exclusion constraint occurs; below +this is illustrated using the +:meth:`~.postgresql.dml.Insert.on_conflict_do_nothing` method:: + + from sqlalchemy.dialects.postgresql import insert + + stmt = insert(my_table).values(id='some_id', data='inserted value') + stmt = stmt.on_conflict_do_nothing(index_elements=['id']) + conn.execute(stmt) + +If ``DO NOTHING`` is used without specifying any columns or constraint, +it has the effect of skipping the INSERT for any unique or exclusion +constraint violation which occurs:: + + from sqlalchemy.dialects.postgresql import insert + + stmt = insert(my_table).values(id='some_id', data='inserted value') + stmt = stmt.on_conflict_do_nothing() + conn.execute(stmt) + +.. versionadded:: 1.1 Added support for PostgreSQL ON CONFLICT clauses + +.. seealso:: + + `INSERT .. ON CONFLICT `_ - in the PostgreSQL documentation. + +.. _postgresql_match: + +Full Text Search +---------------- + +SQLAlchemy makes available the PostgreSQL ``@@`` operator via the +:meth:`.ColumnElement.match` method on any textual column expression. +On a PostgreSQL dialect, an expression like the following:: + + select([sometable.c.text.match("search string")]) + +will emit to the database:: + + SELECT text @@ to_tsquery('search string') FROM table + +The PostgreSQL text search functions such as ``to_tsquery()`` +and ``to_tsvector()`` are available +explicitly using the standard :data:`.func` construct. For example:: + + select([ + func.to_tsvector('fat cats ate rats').match('cat & rat') + ]) + +Emits the equivalent of:: + + SELECT to_tsvector('fat cats ate rats') @@ to_tsquery('cat & rat') + +The :class:`.postgresql.TSVECTOR` type can provide for explicit CAST:: + + from sqlalchemy.dialects.postgresql import TSVECTOR + from sqlalchemy import select, cast + select([cast("some text", TSVECTOR)]) + +produces a statement equivalent to:: + + SELECT CAST('some text' AS TSVECTOR) AS anon_1 + +Full Text Searches in PostgreSQL are influenced by a combination of: the +PostgresSQL setting of ``default_text_search_config``, the ``regconfig`` used +to build the GIN/GiST indexes, and the ``regconfig`` optionally passed in +during a query. + +When performing a Full Text Search against a column that has a GIN or +GiST index that is already pre-computed (which is common on full text +searches) one may need to explicitly pass in a particular PostgresSQL +``regconfig`` value to ensure the query-planner utilizes the index and does +not re-compute the column on demand. + +In order to provide for this explicit query planning, or to use different +search strategies, the ``match`` method accepts a ``postgresql_regconfig`` +keyword argument:: + + select([mytable.c.id]).where( + mytable.c.title.match('somestring', postgresql_regconfig='english') + ) + +Emits the equivalent of:: + + SELECT mytable.id FROM mytable + WHERE mytable.title @@ to_tsquery('english', 'somestring') + +One can also specifically pass in a `'regconfig'` value to the +``to_tsvector()`` command as the initial argument:: + + select([mytable.c.id]).where( + func.to_tsvector('english', mytable.c.title )\ + .match('somestring', postgresql_regconfig='english') + ) + +produces a statement equivalent to:: + + SELECT mytable.id FROM mytable + WHERE to_tsvector('english', mytable.title) @@ + to_tsquery('english', 'somestring') + +It is recommended that you use the ``EXPLAIN ANALYZE...`` tool from +PostgresSQL to ensure that you are generating queries with SQLAlchemy that +take full advantage of any indexes you may have created for full text search. + +FROM ONLY ... +------------------------ + +The dialect supports PostgreSQL's ONLY keyword for targeting only a particular +table in an inheritance hierarchy. This can be used to produce the +``SELECT ... FROM ONLY``, ``UPDATE ONLY ...``, and ``DELETE FROM ONLY ...`` +syntaxes. It uses SQLAlchemy's hints mechanism:: + + # SELECT ... FROM ONLY ... + result = table.select().with_hint(table, 'ONLY', 'postgresql') + print result.fetchall() + + # UPDATE ONLY ... + table.update(values=dict(foo='bar')).with_hint('ONLY', + dialect_name='postgresql') + + # DELETE FROM ONLY ... + table.delete().with_hint('ONLY', dialect_name='postgresql') + + +.. _postgresql_indexes: + +PostgreSQL-Specific Index Options +--------------------------------- + +Several extensions to the :class:`.Index` construct are available, specific +to the PostgreSQL dialect. + +.. _postgresql_partial_indexes: + +Partial Indexes +^^^^^^^^^^^^^^^^ + +Partial indexes add criterion to the index definition so that the index is +applied to a subset of rows. These can be specified on :class:`.Index` +using the ``postgresql_where`` keyword argument:: + + Index('my_index', my_table.c.id, postgresql_where=my_table.c.value > 10) + +Operator Classes +^^^^^^^^^^^^^^^^^ + +PostgreSQL allows the specification of an *operator class* for each column of +an index (see +http://www.postgresql.org/docs/8.3/interactive/indexes-opclass.html). +The :class:`.Index` construct allows these to be specified via the +``postgresql_ops`` keyword argument:: + + Index('my_index', my_table.c.id, my_table.c.data, + postgresql_ops={ + 'data': 'text_pattern_ops', + 'id': 'int4_ops' + }) + +.. versionadded:: 0.7.2 + ``postgresql_ops`` keyword argument to :class:`.Index` construct. + +Note that the keys in the ``postgresql_ops`` dictionary are the "key" name of +the :class:`.Column`, i.e. the name used to access it from the ``.c`` +collection of :class:`.Table`, which can be configured to be different than +the actual name of the column as expressed in the database. + +Index Types +^^^^^^^^^^^^ + +PostgreSQL provides several index types: B-Tree, Hash, GiST, and GIN, as well +as the ability for users to create their own (see +http://www.postgresql.org/docs/8.3/static/indexes-types.html). These can be +specified on :class:`.Index` using the ``postgresql_using`` keyword argument:: + + Index('my_index', my_table.c.data, postgresql_using='gin') + +The value passed to the keyword argument will be simply passed through to the +underlying CREATE INDEX command, so it *must* be a valid index type for your +version of PostgreSQL. + +.. _postgresql_index_storage: + +Index Storage Parameters +^^^^^^^^^^^^^^^^^^^^^^^^ + +PostgreSQL allows storage parameters to be set on indexes. The storage +parameters available depend on the index method used by the index. Storage +parameters can be specified on :class:`.Index` using the ``postgresql_with`` +keyword argument:: + + Index('my_index', my_table.c.data, postgresql_with={"fillfactor": 50}) + +.. versionadded:: 1.0.6 + +PostgreSQL allows to define the tablespace in which to create the index. +The tablespace can be specified on :class:`.Index` using the +``postgresql_tablespace`` keyword argument:: + + Index('my_index', my_table.c.data, postgresql_tablespace='my_tablespace') + +.. versionadded:: 1.1 + +Note that the same option is available on :class:`.Table` as well. + +.. _postgresql_index_concurrently: + +Indexes with CONCURRENTLY +^^^^^^^^^^^^^^^^^^^^^^^^^ + +The PostgreSQL index option CONCURRENTLY is supported by passing the +flag ``postgresql_concurrently`` to the :class:`.Index` construct:: + + tbl = Table('testtbl', m, Column('data', Integer)) + + idx1 = Index('test_idx1', tbl.c.data, postgresql_concurrently=True) + +The above index construct will render DDL for CREATE INDEX, assuming +PostgreSQL 8.2 or higher is detected or for a connection-less dialect, as:: + + CREATE INDEX CONCURRENTLY test_idx1 ON testtbl (data) + +For DROP INDEX, assuming PostgreSQL 9.2 or higher is detected or for +a connection-less dialect, it will emit:: + + DROP INDEX CONCURRENTLY test_idx1 + +.. versionadded:: 1.1 support for CONCURRENTLY on DROP INDEX. The + CONCURRENTLY keyword is now only emitted if a high enough version + of PostgreSQL is detected on the connection (or for a connection-less + dialect). + +When using CONCURRENTLY, the Postgresql database requires that the statement +be invoked outside of a transaction block. The Python DBAPI enforces that +even for a single statement, a transaction is present, so to use this +construct, the DBAPI's "autocommit" mode must be used:: + + metadata = MetaData() + table = Table( + "foo", metadata, + Column("id", String)) + index = Index( + "foo_idx", table.c.id, postgresql_concurrently=True) + + with engine.connect() as conn: + with conn.execution_options(isolation_level='AUTOCOMMIT'): + table.create(conn) + +.. seealso:: + + :ref:`postgresql_isolation_level` + +.. _postgresql_index_reflection: + +PostgreSQL Index Reflection +--------------------------- + +The PostgreSQL database creates a UNIQUE INDEX implicitly whenever the +UNIQUE CONSTRAINT construct is used. When inspecting a table using +:class:`.Inspector`, the :meth:`.Inspector.get_indexes` +and the :meth:`.Inspector.get_unique_constraints` will report on these +two constructs distinctly; in the case of the index, the key +``duplicates_constraint`` will be present in the index entry if it is +detected as mirroring a constraint. When performing reflection using +``Table(..., autoload=True)``, the UNIQUE INDEX is **not** returned +in :attr:`.Table.indexes` when it is detected as mirroring a +:class:`.UniqueConstraint` in the :attr:`.Table.constraints` collection. + +.. versionchanged:: 1.0.0 - :class:`.Table` reflection now includes + :class:`.UniqueConstraint` objects present in the :attr:`.Table.constraints` + collection; the PostgreSQL backend will no longer include a "mirrored" + :class:`.Index` construct in :attr:`.Table.indexes` if it is detected + as corresponding to a unique constraint. + +Special Reflection Options +-------------------------- + +The :class:`.Inspector` used for the PostgreSQL backend is an instance +of :class:`.PGInspector`, which offers additional methods:: + + from sqlalchemy import create_engine, inspect + + engine = create_engine("postgresql+psycopg2://localhost/test") + insp = inspect(engine) # will be a PGInspector + + print(insp.get_enums()) + +.. autoclass:: PGInspector + :members: + +.. _postgresql_table_options: + +PostgreSQL Table Options +------------------------- + +Several options for CREATE TABLE are supported directly by the PostgreSQL +dialect in conjunction with the :class:`.Table` construct: + +* ``TABLESPACE``:: + + Table("some_table", metadata, ..., postgresql_tablespace='some_tablespace') + + The above option is also available on the :class:`.Index` construct. + +* ``ON COMMIT``:: + + Table("some_table", metadata, ..., postgresql_on_commit='PRESERVE ROWS') + +* ``WITH OIDS``:: + + Table("some_table", metadata, ..., postgresql_with_oids=True) + +* ``WITHOUT OIDS``:: + + Table("some_table", metadata, ..., postgresql_with_oids=False) + +* ``INHERITS``:: + + Table("some_table", metadata, ..., postgresql_inherits="some_supertable") + + Table("some_table", metadata, ..., postgresql_inherits=("t1", "t2", ...)) + +.. versionadded:: 1.0.0 + +.. seealso:: + + `PostgreSQL CREATE TABLE options + `_ + +ARRAY Types +----------- + +The PostgreSQL dialect supports arrays, both as multidimensional column types +as well as array literals: + +* :class:`.postgresql.ARRAY` - ARRAY datatype + +* :class:`.postgresql.array` - array literal + +* :func:`.postgresql.array_agg` - ARRAY_AGG SQL function + +* :class:`.postgresql.aggregate_order_by` - helper for PG's ORDER BY aggregate + function syntax. + +JSON Types +---------- + +The PostgreSQL dialect supports both JSON and JSONB datatypes, including +psycopg2's native support and support for all of PostgreSQL's special +operators: + +* :class:`.postgresql.JSON` + +* :class:`.postgresql.JSONB` + +HSTORE Type +----------- + +The PostgreSQL HSTORE type as well as hstore literals are supported: + +* :class:`.postgresql.HSTORE` - HSTORE datatype + +* :class:`.postgresql.hstore` - hstore literal + +ENUM Types +---------- + +PostgreSQL has an independently creatable TYPE structure which is used +to implement an enumerated type. This approach introduces significant +complexity on the SQLAlchemy side in terms of when this type should be +CREATED and DROPPED. The type object is also an independently reflectable +entity. The following sections should be consulted: + +* :class:`.postgresql.ENUM` - DDL and typing support for ENUM. + +* :meth:`.PGInspector.get_enums` - retrieve a listing of current ENUM types + +* :meth:`.postgresql.ENUM.create` , :meth:`.postgresql.ENUM.drop` - individual + CREATE and DROP commands for ENUM. + +.. _postgresql_array_of_enum: + +Using ENUM with ARRAY +^^^^^^^^^^^^^^^^^^^^^ + +The combination of ENUM and ARRAY is not directly supported by backend +DBAPIs at this time. In order to send and receive an ARRAY of ENUM, +use the following workaround type:: + + class ArrayOfEnum(ARRAY): + + def bind_expression(self, bindvalue): + return sa.cast(bindvalue, self) + + def result_processor(self, dialect, coltype): + super_rp = super(ArrayOfEnum, self).result_processor( + dialect, coltype) + + def handle_raw_string(value): + inner = re.match(r"^{(.*)}$", value).group(1) + return inner.split(",") if inner else [] + + def process(value): + if value is None: + return None + return super_rp(handle_raw_string(value)) + return process + +E.g.:: + + Table( + 'mydata', metadata, + Column('id', Integer, primary_key=True), + Column('data', ArrayOfEnum(ENUM('a', 'b, 'c', name='myenum'))) + + ) + +This type is not included as a built-in type as it would be incompatible +with a DBAPI that suddenly decides to support ARRAY of ENUM directly in +a new version. + +.. _postgresql_array_of_json: + +Using JSON/JSONB with ARRAY +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Similar to using ENUM, for an ARRAY of JSON/JSONB we need to render the +appropriate CAST, however current psycopg2 drivers seem to handle the result +for ARRAY of JSON automatically, so the type is simpler:: + + + class CastingArray(ARRAY): + def bind_expression(self, bindvalue): + return sa.cast(bindvalue, self) + +E.g.:: + + Table( + 'mydata', metadata, + Column('id', Integer, primary_key=True), + Column('data', CastingArray(JSONB)) + ) + + +""" +from collections import defaultdict +import re +import datetime as dt + + +from sqlalchemy.sql import elements +from ... import sql, schema, exc, util +from ...engine import default, reflection +from ...sql import compiler, expression +from ... import types as sqltypes + +try: + from uuid import UUID as _python_UUID +except ImportError: + _python_UUID = None + +from sqlalchemy.types import INTEGER, BIGINT, SMALLINT, VARCHAR, \ + CHAR, TEXT, FLOAT, NUMERIC, \ + DATE, BOOLEAN, REAL + +AUTOCOMMIT_REGEXP = re.compile( + r'\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER|' + 'IMPORT FOREIGN SCHEMA|REFRESH MATERIALIZED VIEW)', + re.I | re.UNICODE) + +RESERVED_WORDS = set( + ["all", "analyse", "analyze", "and", "any", "array", "as", "asc", + "asymmetric", "both", "case", "cast", "check", "collate", "column", + "constraint", "create", "current_catalog", "current_date", + "current_role", "current_time", "current_timestamp", "current_user", + "default", "deferrable", "desc", "distinct", "do", "else", "end", + "except", "false", "fetch", "for", "foreign", "from", "grant", "group", + "having", "in", "initially", "intersect", "into", "leading", "limit", + "localtime", "localtimestamp", "new", "not", "null", "of", "off", + "offset", "old", "on", "only", "or", "order", "placing", "primary", + "references", "returning", "select", "session_user", "some", "symmetric", + "table", "then", "to", "trailing", "true", "union", "unique", "user", + "using", "variadic", "when", "where", "window", "with", "authorization", + "between", "binary", "cross", "current_schema", "freeze", "full", + "ilike", "inner", "is", "isnull", "join", "left", "like", "natural", + "notnull", "outer", "over", "overlaps", "right", "similar", "verbose" + ]) + +_DECIMAL_TYPES = (1231, 1700) +_FLOAT_TYPES = (700, 701, 1021, 1022) +_INT_TYPES = (20, 21, 23, 26, 1005, 1007, 1016) + +class BYTEA(sqltypes.LargeBinary): + __visit_name__ = 'BYTEA' + + +class DOUBLE_PRECISION(sqltypes.Float): + __visit_name__ = 'DOUBLE_PRECISION' + + +class INET(sqltypes.TypeEngine): + __visit_name__ = "INET" +PGInet = INET + + +class CIDR(sqltypes.TypeEngine): + __visit_name__ = "CIDR" +PGCidr = CIDR + + +class MACADDR(sqltypes.TypeEngine): + __visit_name__ = "MACADDR" +PGMacAddr = MACADDR + + +class OID(sqltypes.TypeEngine): + + """Provide the PostgreSQL OID type. + + .. versionadded:: 0.9.5 + + """ + __visit_name__ = "OID" + + +class TIMESTAMP(sqltypes.TIMESTAMP): + + def __init__(self, timezone=False, precision=None): + super(TIMESTAMP, self).__init__(timezone=timezone) + self.precision = precision + + +class TIME(sqltypes.TIME): + + def __init__(self, timezone=False, precision=None): + super(TIME, self).__init__(timezone=timezone) + self.precision = precision + + +class INTERVAL(sqltypes.TypeEngine): + + """PostgreSQL INTERVAL type. + + The INTERVAL type may not be supported on all DBAPIs. + It is known to work on psycopg2 and not pg8000 or zxjdbc. + + """ + __visit_name__ = 'INTERVAL' + + def __init__(self, precision=None): + self.precision = precision + + @classmethod + def _adapt_from_generic_interval(cls, interval): + return INTERVAL(precision=interval.second_precision) + + @property + def _type_affinity(self): + return sqltypes.Interval + + @property + def python_type(self): + return dt.timedelta + +PGInterval = INTERVAL + + +class BIT(sqltypes.TypeEngine): + __visit_name__ = 'BIT' + + def __init__(self, length=None, varying=False): + if not varying: + # BIT without VARYING defaults to length 1 + self.length = length or 1 + else: + # but BIT VARYING can be unlimited-length, so no default + self.length = length + self.varying = varying + +PGBit = BIT + + +class UUID(sqltypes.TypeEngine): + + """PostgreSQL UUID type. + + Represents the UUID column type, interpreting + data either as natively returned by the DBAPI + or as Python uuid objects. + + The UUID type may not be supported on all DBAPIs. + It is known to work on psycopg2 and not pg8000. + + """ + __visit_name__ = 'UUID' + + def __init__(self, as_uuid=False): + """Construct a UUID type. + + + :param as_uuid=False: if True, values will be interpreted + as Python uuid objects, converting to/from string via the + DBAPI. + + """ + if as_uuid and _python_UUID is None: + raise NotImplementedError( + "This version of Python does not support " + "the native UUID type." + ) + self.as_uuid = as_uuid + + def bind_processor(self, dialect): + if self.as_uuid: + def process(value): + if value is not None: + value = util.text_type(value) + return value + return process + else: + return None + + def result_processor(self, dialect, coltype): + if self.as_uuid: + def process(value): + if value is not None: + value = _python_UUID(value) + return value + return process + else: + return None + +PGUuid = UUID + + +class TSVECTOR(sqltypes.TypeEngine): + + """The :class:`.postgresql.TSVECTOR` type implements the PostgreSQL + text search type TSVECTOR. + + It can be used to do full text queries on natural language + documents. + + .. versionadded:: 0.9.0 + + .. seealso:: + + :ref:`postgresql_match` + + """ + __visit_name__ = 'TSVECTOR' + + +class ENUM(sqltypes.Enum): + + """PostgreSQL ENUM type. + + This is a subclass of :class:`.types.Enum` which includes + support for PG's ``CREATE TYPE`` and ``DROP TYPE``. + + When the builtin type :class:`.types.Enum` is used and the + :paramref:`.Enum.native_enum` flag is left at its default of + True, the PostgreSQL backend will use a :class:`.postgresql.ENUM` + type as the implementation, so the special create/drop rules + will be used. + + The create/drop behavior of ENUM is necessarily intricate, due to the + awkward relationship the ENUM type has in relationship to the + parent table, in that it may be "owned" by just a single table, or + may be shared among many tables. + + When using :class:`.types.Enum` or :class:`.postgresql.ENUM` + in an "inline" fashion, the ``CREATE TYPE`` and ``DROP TYPE`` is emitted + corresponding to when the :meth:`.Table.create` and :meth:`.Table.drop` + methods are called:: + + table = Table('sometable', metadata, + Column('some_enum', ENUM('a', 'b', 'c', name='myenum')) + ) + + table.create(engine) # will emit CREATE ENUM and CREATE TABLE + table.drop(engine) # will emit DROP TABLE and DROP ENUM + + To use a common enumerated type between multiple tables, the best + practice is to declare the :class:`.types.Enum` or + :class:`.postgresql.ENUM` independently, and associate it with the + :class:`.MetaData` object itself:: + + my_enum = ENUM('a', 'b', 'c', name='myenum', metadata=metadata) + + t1 = Table('sometable_one', metadata, + Column('some_enum', myenum) + ) + + t2 = Table('sometable_two', metadata, + Column('some_enum', myenum) + ) + + When this pattern is used, care must still be taken at the level + of individual table creates. Emitting CREATE TABLE without also + specifying ``checkfirst=True`` will still cause issues:: + + t1.create(engine) # will fail: no such type 'myenum' + + If we specify ``checkfirst=True``, the individual table-level create + operation will check for the ``ENUM`` and create if not exists:: + + # will check if enum exists, and emit CREATE TYPE if not + t1.create(engine, checkfirst=True) + + When using a metadata-level ENUM type, the type will always be created + and dropped if either the metadata-wide create/drop is called:: + + metadata.create_all(engine) # will emit CREATE TYPE + metadata.drop_all(engine) # will emit DROP TYPE + + The type can also be created and dropped directly:: + + my_enum.create(engine) + my_enum.drop(engine) + + .. versionchanged:: 1.0.0 The PostgreSQL :class:`.postgresql.ENUM` type + now behaves more strictly with regards to CREATE/DROP. A metadata-level + ENUM type will only be created and dropped at the metadata level, + not the table level, with the exception of + ``table.create(checkfirst=True)``. + The ``table.drop()`` call will now emit a DROP TYPE for a table-level + enumerated type. + + """ + + def __init__(self, *enums, **kw): + """Construct an :class:`~.postgresql.ENUM`. + + Arguments are the same as that of + :class:`.types.Enum`, but also including + the following parameters. + + :param create_type: Defaults to True. + Indicates that ``CREATE TYPE`` should be + emitted, after optionally checking for the + presence of the type, when the parent + table is being created; and additionally + that ``DROP TYPE`` is called when the table + is dropped. When ``False``, no check + will be performed and no ``CREATE TYPE`` + or ``DROP TYPE`` is emitted, unless + :meth:`~.postgresql.ENUM.create` + or :meth:`~.postgresql.ENUM.drop` + are called directly. + Setting to ``False`` is helpful + when invoking a creation scheme to a SQL file + without access to the actual database - + the :meth:`~.postgresql.ENUM.create` and + :meth:`~.postgresql.ENUM.drop` methods can + be used to emit SQL to a target bind. + + .. versionadded:: 0.7.4 + + """ + self.create_type = kw.pop("create_type", True) + super(ENUM, self).__init__(*enums, **kw) + + def create(self, bind=None, checkfirst=True): + """Emit ``CREATE TYPE`` for this + :class:`~.postgresql.ENUM`. + + If the underlying dialect does not support + PostgreSQL CREATE TYPE, no action is taken. + + :param bind: a connectable :class:`.Engine`, + :class:`.Connection`, or similar object to emit + SQL. + :param checkfirst: if ``True``, a query against + the PG catalog will be first performed to see + if the type does not exist already before + creating. + + """ + if not bind.dialect.supports_native_enum: + return + + if not checkfirst or \ + not bind.dialect.has_type( + bind, self.name, schema=self.schema): + bind.execute(CreateEnumType(self)) + + def drop(self, bind=None, checkfirst=True): + """Emit ``DROP TYPE`` for this + :class:`~.postgresql.ENUM`. + + If the underlying dialect does not support + PostgreSQL DROP TYPE, no action is taken. + + :param bind: a connectable :class:`.Engine`, + :class:`.Connection`, or similar object to emit + SQL. + :param checkfirst: if ``True``, a query against + the PG catalog will be first performed to see + if the type actually exists before dropping. + + """ + if not bind.dialect.supports_native_enum: + return + + if not checkfirst or \ + bind.dialect.has_type(bind, self.name, schema=self.schema): + bind.execute(DropEnumType(self)) + + def _check_for_name_in_memos(self, checkfirst, kw): + """Look in the 'ddl runner' for 'memos', then + note our name in that collection. + + This to ensure a particular named enum is operated + upon only once within any kind of create/drop + sequence without relying upon "checkfirst". + + """ + if not self.create_type: + return True + if '_ddl_runner' in kw: + ddl_runner = kw['_ddl_runner'] + if '_pg_enums' in ddl_runner.memo: + pg_enums = ddl_runner.memo['_pg_enums'] + else: + pg_enums = ddl_runner.memo['_pg_enums'] = set() + present = self.name in pg_enums + pg_enums.add(self.name) + return present + else: + return False + + def _on_table_create(self, target, bind, checkfirst=False, **kw): + if checkfirst or ( + not self.metadata and + not kw.get('_is_metadata_operation', False)) and \ + not self._check_for_name_in_memos(checkfirst, kw): + self.create(bind=bind, checkfirst=checkfirst) + + def _on_table_drop(self, target, bind, checkfirst=False, **kw): + if not self.metadata and \ + not kw.get('_is_metadata_operation', False) and \ + not self._check_for_name_in_memos(checkfirst, kw): + self.drop(bind=bind, checkfirst=checkfirst) + + def _on_metadata_create(self, target, bind, checkfirst=False, **kw): + if not self._check_for_name_in_memos(checkfirst, kw): + self.create(bind=bind, checkfirst=checkfirst) + + def _on_metadata_drop(self, target, bind, checkfirst=False, **kw): + if not self._check_for_name_in_memos(checkfirst, kw): + self.drop(bind=bind, checkfirst=checkfirst) + +colspecs = { + sqltypes.Interval: INTERVAL, + sqltypes.Enum: ENUM, +} + +ischema_names = { + 'integer': INTEGER, + 'bigint': BIGINT, + 'smallint': SMALLINT, + 'character varying': VARCHAR, + 'character': CHAR, + '"char"': sqltypes.String, + 'name': sqltypes.String, + 'text': TEXT, + 'numeric': NUMERIC, + 'float': FLOAT, + 'real': REAL, + 'inet': INET, + 'cidr': CIDR, + 'uuid': UUID, + 'bit': BIT, + 'bit varying': BIT, + 'macaddr': MACADDR, + 'oid': OID, + 'double precision': DOUBLE_PRECISION, + 'timestamp': TIMESTAMP, + 'timestamp with time zone': TIMESTAMP, + 'timestamp without time zone': TIMESTAMP, + 'time with time zone': TIME, + 'time without time zone': TIME, + 'date': DATE, + 'time': TIME, + 'bytea': BYTEA, + 'boolean': BOOLEAN, + 'interval': INTERVAL, + 'interval year to month': INTERVAL, + 'interval day to second': INTERVAL, + 'tsvector': TSVECTOR +} + + +class PGCompiler(compiler.SQLCompiler): + + def visit_array(self, element, **kw): + return "ARRAY[%s]" % self.visit_clauselist(element, **kw) + + def visit_slice(self, element, **kw): + return "%s:%s" % ( + self.process(element.start, **kw), + self.process(element.stop, **kw), + ) + + def visit_json_getitem_op_binary(self, binary, operator, **kw): + kw['eager_grouping'] = True + return self._generate_generic_binary( + binary, " -> ", **kw + ) + + def visit_json_path_getitem_op_binary(self, binary, operator, **kw): + kw['eager_grouping'] = True + return self._generate_generic_binary( + binary, " #> ", **kw + ) + + def visit_getitem_binary(self, binary, operator, **kw): + return "%s[%s]" % ( + self.process(binary.left, **kw), + self.process(binary.right, **kw) + ) + + def visit_aggregate_order_by(self, element, **kw): + return "%s ORDER BY %s" % ( + self.process(element.target, **kw), + self.process(element.order_by, **kw) + ) + + def visit_match_op_binary(self, binary, operator, **kw): + if "postgresql_regconfig" in binary.modifiers: + regconfig = self.render_literal_value( + binary.modifiers['postgresql_regconfig'], + sqltypes.STRINGTYPE) + if regconfig: + return "%s @@ to_tsquery(%s, %s)" % ( + self.process(binary.left, **kw), + regconfig, + self.process(binary.right, **kw) + ) + return "%s @@ to_tsquery(%s)" % ( + self.process(binary.left, **kw), + self.process(binary.right, **kw) + ) + + def visit_ilike_op_binary(self, binary, operator, **kw): + escape = binary.modifiers.get("escape", None) + + return '%s ILIKE %s' % \ + (self.process(binary.left, **kw), + self.process(binary.right, **kw)) \ + + ( + ' ESCAPE ' + + self.render_literal_value(escape, sqltypes.STRINGTYPE) + if escape else '' + ) + + def visit_notilike_op_binary(self, binary, operator, **kw): + escape = binary.modifiers.get("escape", None) + return '%s NOT ILIKE %s' % \ + (self.process(binary.left, **kw), + self.process(binary.right, **kw)) \ + + ( + ' ESCAPE ' + + self.render_literal_value(escape, sqltypes.STRINGTYPE) + if escape else '' + ) + + def render_literal_value(self, value, type_): + value = super(PGCompiler, self).render_literal_value(value, type_) + + if self.dialect._backslash_escapes: + value = value.replace('\\', '\\\\') + return value + + def visit_sequence(self, seq): + return "nextval('%s')" % self.preparer.format_sequence(seq) + + def limit_clause(self, select, **kw): + text = "" + if select._limit_clause is not None: + text += " \n LIMIT " + self.process(select._limit_clause, **kw) + if select._offset_clause is not None: + if select._limit_clause is None: + text += " \n LIMIT ALL" + text += " OFFSET " + self.process(select._offset_clause, **kw) + return text + + def format_from_hint_text(self, sqltext, table, hint, iscrud): + if hint.upper() != 'ONLY': + raise exc.CompileError("Unrecognized hint: %r" % hint) + return "ONLY " + sqltext + + def get_select_precolumns(self, select, **kw): + if select._distinct is not False: + if select._distinct is True: + return "DISTINCT " + elif isinstance(select._distinct, (list, tuple)): + return "DISTINCT ON (" + ', '.join( + [self.process(col) for col in select._distinct] + ) + ") " + else: + return "DISTINCT ON (" + \ + self.process(select._distinct, **kw) + ") " + else: + return "" + + def for_update_clause(self, select, **kw): + + if select._for_update_arg.read: + if select._for_update_arg.key_share: + tmp = " FOR KEY SHARE" + else: + tmp = " FOR SHARE" + elif select._for_update_arg.key_share: + tmp = " FOR NO KEY UPDATE" + else: + tmp = " FOR UPDATE" + + if select._for_update_arg.of: + tables = util.OrderedSet( + c.table if isinstance(c, expression.ColumnClause) + else c for c in select._for_update_arg.of) + tmp += " OF " + ", ".join( + self.process(table, ashint=True, use_schema=False, **kw) + for table in tables + ) + + if select._for_update_arg.nowait: + tmp += " NOWAIT" + if select._for_update_arg.skip_locked: + tmp += " SKIP LOCKED" + + return tmp + + def returning_clause(self, stmt, returning_cols): + + columns = [ + self._label_select_column(None, c, True, False, {}) + for c in expression._select_iterables(returning_cols) + ] + + return 'RETURNING ' + ', '.join(columns) + + def visit_substring_func(self, func, **kw): + s = self.process(func.clauses.clauses[0], **kw) + start = self.process(func.clauses.clauses[1], **kw) + if len(func.clauses.clauses) > 2: + length = self.process(func.clauses.clauses[2], **kw) + return "SUBSTRING(%s FROM %s FOR %s)" % (s, start, length) + else: + return "SUBSTRING(%s FROM %s)" % (s, start) + + def _on_conflict_target(self, clause, **kw): + + if clause.constraint_target is not None: + target_text = 'ON CONSTRAINT %s' % clause.constraint_target + elif clause.inferred_target_elements is not None: + target_text = '(%s)' % ', '.join( + (self.preparer.quote(c) + if isinstance(c, util.string_types) + else + self.process(c, include_table=False, use_schema=False)) + for c in clause.inferred_target_elements + ) + if clause.inferred_target_whereclause is not None: + target_text += ' WHERE %s' % \ + self.process( + clause.inferred_target_whereclause, + include_table=False, + use_schema=False + ) + else: + target_text = '' + + return target_text + + def visit_on_conflict_do_nothing(self, on_conflict, **kw): + + target_text = self._on_conflict_target(on_conflict, **kw) + + if target_text: + return "ON CONFLICT %s DO NOTHING" % target_text + else: + return "ON CONFLICT DO NOTHING" + + def visit_on_conflict_do_update(self, on_conflict, **kw): + + clause = on_conflict + + target_text = self._on_conflict_target(on_conflict, **kw) + + action_set_ops = [] + + set_parameters = dict(clause.update_values_to_set) + # create a list of column assignment clauses as tuples + cols = self.statement.table.c + for c in cols: + col_key = c.key + if col_key in set_parameters: + value = set_parameters.pop(col_key) + if elements._is_literal(value): + value = elements.BindParameter( + None, value, type_=c.type + ) + + else: + if isinstance(value, elements.BindParameter) and \ + value.type._isnull: + value = value._clone() + value.type = c.type + value_text = self.process(value.self_group(), use_schema=False) + + key_text = ( + self.preparer.quote(col_key) + ) + action_set_ops.append('%s = %s' % (key_text, value_text)) + + # check for names that don't match columns + if set_parameters: + util.warn( + "Additional column names not matching " + "any column keys in table '%s': %s" % ( + self.statement.table.name, + (", ".join("'%s'" % c for c in set_parameters)) + ) + ) + for k, v in set_parameters.items(): + key_text = ( + self.preparer.quote(k) + if isinstance(k, util.string_types) + else self.process(k, use_schema=False) + ) + value_text = self.process( + elements._literal_as_binds(v), + use_schema=False + ) + action_set_ops.append('%s = %s' % (key_text, value_text)) + + action_text = ', '.join(action_set_ops) + if clause.update_whereclause is not None: + action_text += ' WHERE %s' % \ + self.process( + clause.update_whereclause, + include_table=True, + use_schema=False + ) + + return 'ON CONFLICT %s DO UPDATE SET %s' % (target_text, action_text) + + +class PGDDLCompiler(compiler.DDLCompiler): + + def get_column_specification(self, column, **kwargs): + + colspec = self.preparer.format_column(column) + impl_type = column.type.dialect_impl(self.dialect) + if isinstance(impl_type, sqltypes.TypeDecorator): + impl_type = impl_type.impl + + if column.primary_key and \ + column is column.table._autoincrement_column and \ + ( + self.dialect.supports_smallserial or + not isinstance(impl_type, sqltypes.SmallInteger) + ) and ( + column.default is None or + ( + isinstance(column.default, schema.Sequence) and + column.default.optional + )): + if isinstance(impl_type, sqltypes.BigInteger): + colspec += " BIGSERIAL" + elif isinstance(impl_type, sqltypes.SmallInteger): + colspec += " SMALLSERIAL" + else: + colspec += " SERIAL" + else: + colspec += " " + self.dialect.type_compiler.process( + column.type, type_expression=column) + default = self.get_column_default_string(column) + if default is not None: + colspec += " DEFAULT " + default + + if not column.nullable: + colspec += " NOT NULL" + return colspec + + def visit_create_enum_type(self, create): + type_ = create.element + + return "CREATE TYPE %s AS ENUM (%s)" % ( + self.preparer.format_type(type_), + ", ".join( + self.sql_compiler.process(sql.literal(e), literal_binds=True) + for e in type_.enums) + ) + + def visit_drop_enum_type(self, drop): + type_ = drop.element + + return "DROP TYPE %s" % ( + self.preparer.format_type(type_) + ) + + def visit_create_index(self, create): + preparer = self.preparer + index = create.element + self._verify_index_table(index) + text = "CREATE " + if index.unique: + text += "UNIQUE " + text += "INDEX " + + if self.dialect._supports_create_index_concurrently: + concurrently = index.dialect_options['postgresql']['concurrently'] + if concurrently: + text += "CONCURRENTLY " + + text += "%s ON %s " % ( + self._prepared_index_name(index, + include_schema=False), + preparer.format_table(index.table) + ) + + using = index.dialect_options['postgresql']['using'] + if using: + text += "USING %s " % preparer.quote(using) + + ops = index.dialect_options["postgresql"]["ops"] + text += "(%s)" \ + % ( + ', '.join([ + self.sql_compiler.process( + expr.self_group() + if not isinstance(expr, expression.ColumnClause) + else expr, + include_table=False, literal_binds=True) + + ( + (' ' + ops[expr.key]) + if hasattr(expr, 'key') + and expr.key in ops else '' + ) + for expr in index.expressions + ]) + ) + + withclause = index.dialect_options['postgresql']['with'] + + if withclause: + text += " WITH (%s)" % (', '.join( + ['%s = %s' % storage_parameter + for storage_parameter in withclause.items()])) + + tablespace_name = index.dialect_options['postgresql']['tablespace'] + + if tablespace_name: + text += " TABLESPACE %s" % preparer.quote(tablespace_name) + + whereclause = index.dialect_options["postgresql"]["where"] + + if whereclause is not None: + where_compiled = self.sql_compiler.process( + whereclause, include_table=False, + literal_binds=True) + text += " WHERE " + where_compiled + return text + + def visit_drop_index(self, drop): + index = drop.element + + text = "\nDROP INDEX " + + if self.dialect._supports_drop_index_concurrently: + concurrently = index.dialect_options['postgresql']['concurrently'] + if concurrently: + text += "CONCURRENTLY " + + text += self._prepared_index_name(index, include_schema=True) + return text + + def visit_exclude_constraint(self, constraint, **kw): + text = "" + if constraint.name is not None: + text += "CONSTRAINT %s " % \ + self.preparer.format_constraint(constraint) + elements = [] + for expr, name, op in constraint._render_exprs: + kw['include_table'] = False + elements.append( + "%s WITH %s" % (self.sql_compiler.process(expr, **kw), op) + ) + text += "EXCLUDE USING %s (%s)" % (constraint.using, + ', '.join(elements)) + if constraint.where is not None: + text += ' WHERE (%s)' % self.sql_compiler.process( + constraint.where, + literal_binds=True) + text += self.define_constraint_deferrability(constraint) + return text + + def post_create_table(self, table): + table_opts = [] + pg_opts = table.dialect_options['postgresql'] + + inherits = pg_opts.get('inherits') + if inherits is not None: + if not isinstance(inherits, (list, tuple)): + inherits = (inherits, ) + table_opts.append( + '\n INHERITS ( ' + + ', '.join(self.preparer.quote(name) for name in inherits) + + ' )') + + if pg_opts['with_oids'] is True: + table_opts.append('\n WITH OIDS') + elif pg_opts['with_oids'] is False: + table_opts.append('\n WITHOUT OIDS') + + if pg_opts['on_commit']: + on_commit_options = pg_opts['on_commit'].replace("_", " ").upper() + table_opts.append('\n ON COMMIT %s' % on_commit_options) + + if pg_opts['tablespace']: + tablespace_name = pg_opts['tablespace'] + table_opts.append( + '\n TABLESPACE %s' % self.preparer.quote(tablespace_name) + ) + + return ''.join(table_opts) + + +class PGTypeCompiler(compiler.GenericTypeCompiler): + def visit_TSVECTOR(self, type, **kw): + return "TSVECTOR" + + def visit_INET(self, type_, **kw): + return "INET" + + def visit_CIDR(self, type_, **kw): + return "CIDR" + + def visit_MACADDR(self, type_, **kw): + return "MACADDR" + + def visit_OID(self, type_, **kw): + return "OID" + + def visit_FLOAT(self, type_, **kw): + if not type_.precision: + return "FLOAT" + else: + return "FLOAT(%(precision)s)" % {'precision': type_.precision} + + def visit_DOUBLE_PRECISION(self, type_, **kw): + return "DOUBLE PRECISION" + + def visit_BIGINT(self, type_, **kw): + return "BIGINT" + + def visit_HSTORE(self, type_, **kw): + return "HSTORE" + + def visit_JSON(self, type_, **kw): + return "JSON" + + def visit_JSONB(self, type_, **kw): + return "JSONB" + + def visit_INT4RANGE(self, type_, **kw): + return "INT4RANGE" + + def visit_INT8RANGE(self, type_, **kw): + return "INT8RANGE" + + def visit_NUMRANGE(self, type_, **kw): + return "NUMRANGE" + + def visit_DATERANGE(self, type_, **kw): + return "DATERANGE" + + def visit_TSRANGE(self, type_, **kw): + return "TSRANGE" + + def visit_TSTZRANGE(self, type_, **kw): + return "TSTZRANGE" + + def visit_datetime(self, type_, **kw): + return self.visit_TIMESTAMP(type_, **kw) + + def visit_enum(self, type_, **kw): + if not type_.native_enum or not self.dialect.supports_native_enum: + return super(PGTypeCompiler, self).visit_enum(type_, **kw) + else: + return self.visit_ENUM(type_, **kw) + + def visit_ENUM(self, type_, **kw): + return self.dialect.identifier_preparer.format_type(type_) + + def visit_TIMESTAMP(self, type_, **kw): + return "TIMESTAMP%s %s" % ( + "(%d)" % type_.precision + if getattr(type_, 'precision', None) is not None else "", + (type_.timezone and "WITH" or "WITHOUT") + " TIME ZONE" + ) + + def visit_TIME(self, type_, **kw): + return "TIME%s %s" % ( + "(%d)" % type_.precision + if getattr(type_, 'precision', None) is not None else "", + (type_.timezone and "WITH" or "WITHOUT") + " TIME ZONE" + ) + + def visit_INTERVAL(self, type_, **kw): + if type_.precision is not None: + return "INTERVAL(%d)" % type_.precision + else: + return "INTERVAL" + + def visit_BIT(self, type_, **kw): + if type_.varying: + compiled = "BIT VARYING" + if type_.length is not None: + compiled += "(%d)" % type_.length + else: + compiled = "BIT(%d)" % type_.length + return compiled + + def visit_UUID(self, type_, **kw): + return "UUID" + + def visit_large_binary(self, type_, **kw): + return self.visit_BYTEA(type_, **kw) + + def visit_BYTEA(self, type_, **kw): + return "BYTEA" + + def visit_ARRAY(self, type_, **kw): + return self.process(type_.item_type) + ('[]' * (type_.dimensions + if type_.dimensions + is not None else 1)) + + +class PGIdentifierPreparer(compiler.IdentifierPreparer): + + reserved_words = RESERVED_WORDS + + def _unquote_identifier(self, value): + if value[0] == self.initial_quote: + value = value[1:-1].\ + replace(self.escape_to_quote, self.escape_quote) + return value + + def format_type(self, type_, use_schema=True): + if not type_.name: + raise exc.CompileError("PostgreSQL ENUM type requires a name.") + + name = self.quote(type_.name) + effective_schema = self.schema_for_object(type_) + + if not self.omit_schema and use_schema and \ + effective_schema is not None: + name = self.quote_schema(effective_schema) + "." + name + return name + + +class PGInspector(reflection.Inspector): + + def __init__(self, conn): + reflection.Inspector.__init__(self, conn) + + def get_table_oid(self, table_name, schema=None): + """Return the OID for the given table name.""" + + return self.dialect.get_table_oid(self.bind, table_name, schema, + info_cache=self.info_cache) + + def get_enums(self, schema=None): + """Return a list of ENUM objects. + + Each member is a dictionary containing these fields: + + * name - name of the enum + * schema - the schema name for the enum. + * visible - boolean, whether or not this enum is visible + in the default search path. + * labels - a list of string labels that apply to the enum. + + :param schema: schema name. If None, the default schema + (typically 'public') is used. May also be set to '*' to + indicate load enums for all schemas. + + .. versionadded:: 1.0.0 + + """ + schema = schema or self.default_schema_name + return self.dialect._load_enums(self.bind, schema) + + def get_foreign_table_names(self, schema=None): + """Return a list of FOREIGN TABLE names. + + Behavior is similar to that of :meth:`.Inspector.get_table_names`, + except that the list is limited to those tables tha report a + ``relkind`` value of ``f``. + + .. versionadded:: 1.0.0 + + """ + schema = schema or self.default_schema_name + return self.dialect._get_foreign_table_names(self.bind, schema) + + def get_view_names(self, schema=None, include=('plain', 'materialized')): + """Return all view names in `schema`. + + :param schema: Optional, retrieve names from a non-default schema. + For special quoting, use :class:`.quoted_name`. + + :param include: specify which types of views to return. Passed + as a string value (for a single type) or a tuple (for any number + of types). Defaults to ``('plain', 'materialized')``. + + .. versionadded:: 1.1 + + """ + + return self.dialect.get_view_names(self.bind, schema, + info_cache=self.info_cache, + include=include) + + +class CreateEnumType(schema._CreateDropBase): + __visit_name__ = "create_enum_type" + + +class DropEnumType(schema._CreateDropBase): + __visit_name__ = "drop_enum_type" + + +class PGExecutionContext(default.DefaultExecutionContext): + + def fire_sequence(self, seq, type_): + return self._execute_scalar(( + "select nextval('%s')" % + self.dialect.identifier_preparer.format_sequence(seq)), type_) + + def get_insert_default(self, column): + if column.primary_key and \ + column is column.table._autoincrement_column: + if column.server_default and column.server_default.has_argument: + + # pre-execute passive defaults on primary key columns + return self._execute_scalar("select %s" % + column.server_default.arg, + column.type) + + elif (column.default is None or + (column.default.is_sequence and + column.default.optional)): + + # execute the sequence associated with a SERIAL primary + # key column. for non-primary-key SERIAL, the ID just + # generates server side. + + try: + seq_name = column._postgresql_seq_name + except AttributeError: + tab = column.table.name + col = column.name + tab = tab[0:29 + max(0, (29 - len(col)))] + col = col[0:29 + max(0, (29 - len(tab)))] + name = "%s_%s_seq" % (tab, col) + column._postgresql_seq_name = seq_name = name + + if column.table is not None: + effective_schema = self.connection.schema_for_object( + column.table) + else: + effective_schema = None + + if effective_schema is not None: + exc = "select nextval('\"%s\".\"%s\"')" % \ + (effective_schema, seq_name) + else: + exc = "select nextval('\"%s\"')" % \ + (seq_name, ) + + return self._execute_scalar(exc, column.type) + + return super(PGExecutionContext, self).get_insert_default(column) + + def should_autocommit_text(self, statement): + return AUTOCOMMIT_REGEXP.match(statement) + + +class PGDialect(default.DefaultDialect): + name = 'postgresql' + supports_alter = True + max_identifier_length = 63 + supports_sane_rowcount = True + + supports_native_enum = True + supports_native_boolean = True + supports_smallserial = True + + supports_sequences = True + sequences_optional = True + preexecute_autoincrement_sequences = True + postfetch_lastrowid = False + + supports_default_values = True + supports_empty_insert = False + supports_multivalues_insert = True + default_paramstyle = 'pyformat' + ischema_names = ischema_names + colspecs = colspecs + + statement_compiler = PGCompiler + ddl_compiler = PGDDLCompiler + type_compiler = PGTypeCompiler + preparer = PGIdentifierPreparer + execution_ctx_cls = PGExecutionContext + inspector = PGInspector + isolation_level = None + + construct_arguments = [ + (schema.Index, { + "using": False, + "where": None, + "ops": {}, + "concurrently": False, + "with": {}, + "tablespace": None + }), + (schema.Table, { + "ignore_search_path": False, + "tablespace": None, + "with_oids": None, + "on_commit": None, + "inherits": None + }), + ] + + reflection_options = ('postgresql_ignore_search_path', ) + + _backslash_escapes = True + _supports_create_index_concurrently = True + _supports_drop_index_concurrently = True + + def __init__(self, isolation_level=None, json_serializer=None, + json_deserializer=None, **kwargs): + default.DefaultDialect.__init__(self, **kwargs) + self.isolation_level = isolation_level + self._json_deserializer = json_deserializer + self._json_serializer = json_serializer + + def initialize(self, connection): + super(PGDialect, self).initialize(connection) + self.implicit_returning = self.server_version_info > (8, 2) and \ + self.__dict__.get('implicit_returning', True) + self.supports_native_enum = self.server_version_info >= (8, 3) + if not self.supports_native_enum: + self.colspecs = self.colspecs.copy() + # pop base Enum type + self.colspecs.pop(sqltypes.Enum, None) + # psycopg2, others may have placed ENUM here as well + self.colspecs.pop(ENUM, None) + + # http://www.postgresql.org/docs/9.3/static/release-9-2.html#AEN116689 + self.supports_smallserial = self.server_version_info >= (9, 2) + + self._backslash_escapes = self.server_version_info < (8, 2) or \ + connection.scalar( + "show standard_conforming_strings" + ) == 'off' + + self._supports_create_index_concurrently = \ + self.server_version_info >= (8, 2) + self._supports_drop_index_concurrently = \ + self.server_version_info >= (9, 2) + + def on_connect(self): + if self.isolation_level is not None: + def connect(conn): + self.set_isolation_level(conn, self.isolation_level) + return connect + else: + return None + + _isolation_lookup = set(['SERIALIZABLE', 'READ UNCOMMITTED', + 'READ COMMITTED', 'REPEATABLE READ']) + + def set_isolation_level(self, connection, level): + level = level.replace('_', ' ') + if level not in self._isolation_lookup: + raise exc.ArgumentError( + "Invalid value '%s' for isolation_level. " + "Valid isolation levels for %s are %s" % + (level, self.name, ", ".join(self._isolation_lookup)) + ) + cursor = connection.cursor() + cursor.execute( + "SET SESSION CHARACTERISTICS AS TRANSACTION " + "ISOLATION LEVEL %s" % level) + cursor.execute("COMMIT") + cursor.close() + + def get_isolation_level(self, connection): + cursor = connection.cursor() + cursor.execute('show transaction isolation level') + val = cursor.fetchone()[0] + cursor.close() + return val.upper() + + def do_begin_twophase(self, connection, xid): + self.do_begin(connection.connection) + + def do_prepare_twophase(self, connection, xid): + connection.execute("PREPARE TRANSACTION '%s'" % xid) + + def do_rollback_twophase(self, connection, xid, + is_prepared=True, recover=False): + if is_prepared: + if recover: + # FIXME: ugly hack to get out of transaction + # context when committing recoverable transactions + # Must find out a way how to make the dbapi not + # open a transaction. + connection.execute("ROLLBACK") + connection.execute("ROLLBACK PREPARED '%s'" % xid) + connection.execute("BEGIN") + self.do_rollback(connection.connection) + else: + self.do_rollback(connection.connection) + + def do_commit_twophase(self, connection, xid, + is_prepared=True, recover=False): + if is_prepared: + if recover: + connection.execute("ROLLBACK") + connection.execute("COMMIT PREPARED '%s'" % xid) + connection.execute("BEGIN") + self.do_rollback(connection.connection) + else: + self.do_commit(connection.connection) + + def do_recover_twophase(self, connection): + resultset = connection.execute( + sql.text("SELECT gid FROM pg_prepared_xacts")) + return [row[0] for row in resultset] + + def _get_default_schema_name(self, connection): + return connection.scalar("select current_schema()") + + def has_schema(self, connection, schema): + query = ("select nspname from pg_namespace " + "where lower(nspname)=:schema") + cursor = connection.execute( + sql.text( + query, + bindparams=[ + sql.bindparam( + 'schema', util.text_type(schema.lower()), + type_=sqltypes.Unicode)] + ) + ) + + return bool(cursor.first()) + + def has_table(self, connection, table_name, schema=None): + # seems like case gets folded in pg_class... + if schema is None: + cursor = connection.execute( + sql.text( + "select relname from pg_class c join pg_namespace n on " + "n.oid=c.relnamespace where " + "pg_catalog.pg_table_is_visible(c.oid) " + "and relname=:name", + bindparams=[ + sql.bindparam('name', util.text_type(table_name), + type_=sqltypes.Unicode)] + ) + ) + else: + cursor = connection.execute( + sql.text( + "select relname from pg_class c join pg_namespace n on " + "n.oid=c.relnamespace where n.nspname=:schema and " + "relname=:name", + bindparams=[ + sql.bindparam('name', + util.text_type(table_name), + type_=sqltypes.Unicode), + sql.bindparam('schema', + util.text_type(schema), + type_=sqltypes.Unicode)] + ) + ) + return bool(cursor.first()) + + def has_sequence(self, connection, sequence_name, schema=None): + if schema is None: + cursor = connection.execute( + sql.text( + "SELECT relname FROM pg_class c join pg_namespace n on " + "n.oid=c.relnamespace where relkind='S' and " + "n.nspname=current_schema() " + "and relname=:name", + bindparams=[ + sql.bindparam('name', util.text_type(sequence_name), + type_=sqltypes.Unicode) + ] + ) + ) + else: + cursor = connection.execute( + sql.text( + "SELECT relname FROM pg_class c join pg_namespace n on " + "n.oid=c.relnamespace where relkind='S' and " + "n.nspname=:schema and relname=:name", + bindparams=[ + sql.bindparam('name', util.text_type(sequence_name), + type_=sqltypes.Unicode), + sql.bindparam('schema', + util.text_type(schema), + type_=sqltypes.Unicode) + ] + ) + ) + + return bool(cursor.first()) + + def has_type(self, connection, type_name, schema=None): + if schema is not None: + query = """ + SELECT EXISTS ( + SELECT * FROM pg_catalog.pg_type t, pg_catalog.pg_namespace n + WHERE t.typnamespace = n.oid + AND t.typname = :typname + AND n.nspname = :nspname + ) + """ + query = sql.text(query) + else: + query = """ + SELECT EXISTS ( + SELECT * FROM pg_catalog.pg_type t + WHERE t.typname = :typname + AND pg_type_is_visible(t.oid) + ) + """ + query = sql.text(query) + query = query.bindparams( + sql.bindparam('typname', + util.text_type(type_name), type_=sqltypes.Unicode), + ) + if schema is not None: + query = query.bindparams( + sql.bindparam('nspname', + util.text_type(schema), type_=sqltypes.Unicode), + ) + cursor = connection.execute(query) + return bool(cursor.scalar()) + + def _get_server_version_info(self, connection): + v = connection.execute("select version()").scalar() + m = re.match( + r'.*(?:PostgreSQL|EnterpriseDB) ' + r'(\d+)\.?(\d+)?(?:\.(\d+))?(?:\.\d+)?(?:devel)?', + v) + if not m: + raise AssertionError( + "Could not determine version from string '%s'" % v) + return tuple([int(x) for x in m.group(1, 2, 3) if x is not None]) + + @reflection.cache + def get_table_oid(self, connection, table_name, schema=None, **kw): + """Fetch the oid for schema.table_name. + + Several reflection methods require the table oid. The idea for using + this method is that it can be fetched one time and cached for + subsequent calls. + + """ + table_oid = None + if schema is not None: + schema_where_clause = "n.nspname = :schema" + else: + schema_where_clause = "pg_catalog.pg_table_is_visible(c.oid)" + query = """ + SELECT c.oid + FROM pg_catalog.pg_class c + LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace + WHERE (%s) + AND c.relname = :table_name AND c.relkind in ('r', 'v', 'm', 'f') + """ % schema_where_clause + # Since we're binding to unicode, table_name and schema_name must be + # unicode. + table_name = util.text_type(table_name) + if schema is not None: + schema = util.text_type(schema) + s = sql.text(query).bindparams(table_name=sqltypes.Unicode) + s = s.columns(oid=sqltypes.Integer) + if schema: + s = s.bindparams(sql.bindparam('schema', type_=sqltypes.Unicode)) + c = connection.execute(s, table_name=table_name, schema=schema) + table_oid = c.scalar() + if table_oid is None: + raise exc.NoSuchTableError(table_name) + return table_oid + + @reflection.cache + def get_schema_names(self, connection, **kw): + result = connection.execute( + sql.text("SELECT nspname FROM pg_namespace " + "WHERE nspname NOT LIKE 'pg_%' " + "ORDER BY nspname" + ).columns(nspname=sqltypes.Unicode)) + return [name for name, in result] + + @reflection.cache + def get_table_names(self, connection, schema=None, **kw): + result = connection.execute( + sql.text("SELECT c.relname FROM pg_class c " + "JOIN pg_namespace n ON n.oid = c.relnamespace " + "WHERE n.nspname = :schema AND c.relkind = 'r'" + ).columns(relname=sqltypes.Unicode), + schema=schema if schema is not None else self.default_schema_name) + return [name for name, in result] + + @reflection.cache + def _get_foreign_table_names(self, connection, schema=None, **kw): + result = connection.execute( + sql.text("SELECT c.relname FROM pg_class c " + "JOIN pg_namespace n ON n.oid = c.relnamespace " + "WHERE n.nspname = :schema AND c.relkind = 'f'" + ).columns(relname=sqltypes.Unicode), + schema=schema if schema is not None else self.default_schema_name) + return [name for name, in result] + + @reflection.cache + def get_view_names( + self, connection, schema=None, + include=('plain', 'materialized'), **kw): + + include_kind = {'plain': 'v', 'materialized': 'm'} + try: + kinds = [include_kind[i] for i in util.to_list(include)] + except KeyError: + raise ValueError( + "include %r unknown, needs to be a sequence containing " + "one or both of 'plain' and 'materialized'" % (include,)) + if not kinds: + raise ValueError( + "empty include, needs to be a sequence containing " + "one or both of 'plain' and 'materialized'") + + result = connection.execute( + sql.text("SELECT c.relname FROM pg_class c " + "JOIN pg_namespace n ON n.oid = c.relnamespace " + "WHERE n.nspname = :schema AND c.relkind IN (%s)" % + (", ".join("'%s'" % elem for elem in kinds)) + ).columns(relname=sqltypes.Unicode), + schema=schema if schema is not None else self.default_schema_name) + return [name for name, in result] + + @reflection.cache + def get_view_definition(self, connection, view_name, schema=None, **kw): + view_def = connection.scalar( + sql.text("SELECT pg_get_viewdef(c.oid) view_def FROM pg_class c " + "JOIN pg_namespace n ON n.oid = c.relnamespace " + "WHERE n.nspname = :schema AND c.relname = :view_name " + "AND c.relkind IN ('v', 'm')" + ).columns(view_def=sqltypes.Unicode), + schema=schema if schema is not None else self.default_schema_name, + view_name=view_name) + return view_def + + @reflection.cache + def get_columns(self, connection, table_name, schema=None, **kw): + + table_oid = self.get_table_oid(connection, table_name, schema, + info_cache=kw.get('info_cache')) + SQL_COLS = """ + SELECT a.attname, + pg_catalog.format_type(a.atttypid, a.atttypmod), + (SELECT pg_catalog.pg_get_expr(d.adbin, d.adrelid) + FROM pg_catalog.pg_attrdef d + WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum + AND a.atthasdef) + AS DEFAULT, + a.attnotnull, a.attnum, a.attrelid as table_oid + FROM pg_catalog.pg_attribute a + WHERE a.attrelid = :table_oid + AND a.attnum > 0 AND NOT a.attisdropped + ORDER BY a.attnum + """ + s = sql.text(SQL_COLS, + bindparams=[ + sql.bindparam('table_oid', type_=sqltypes.Integer)], + typemap={ + 'attname': sqltypes.Unicode, + 'default': sqltypes.Unicode} + ) + c = connection.execute(s, table_oid=table_oid) + rows = c.fetchall() + domains = self._load_domains(connection) + enums = dict( + ( + "%s.%s" % (rec['schema'], rec['name']) + if not rec['visible'] else rec['name'], rec) for rec in + self._load_enums(connection, schema='*') + ) + + # format columns + columns = [] + for name, format_type, default, notnull, attnum, table_oid in rows: + column_info = self._get_column_info( + name, format_type, default, notnull, domains, enums, schema) + columns.append(column_info) + return columns + + def _get_column_info(self, name, format_type, default, + notnull, domains, enums, schema): + # strip (*) from character varying(5), timestamp(5) + # with time zone, geometry(POLYGON), etc. + attype = re.sub(r'\(.*\)', '', format_type) + + # strip '[]' from integer[], etc. + attype = attype.replace('[]', '') + + nullable = not notnull + is_array = format_type.endswith('[]') + charlen = re.search(r'\(([\d,]+)\)', format_type) + if charlen: + charlen = charlen.group(1) + args = re.search(r'\((.*)\)', format_type) + if args and args.group(1): + args = tuple(re.split(r'\s*,\s*', args.group(1))) + else: + args = () + kwargs = {} + + if attype == 'numeric': + if charlen: + prec, scale = charlen.split(',') + args = (int(prec), int(scale)) + else: + args = () + elif attype == 'double precision': + args = (53, ) + elif attype == 'integer': + args = () + elif attype in ('timestamp with time zone', + 'time with time zone'): + kwargs['timezone'] = True + if charlen: + kwargs['precision'] = int(charlen) + args = () + elif attype in ('timestamp without time zone', + 'time without time zone', 'time'): + kwargs['timezone'] = False + if charlen: + kwargs['precision'] = int(charlen) + args = () + elif attype == 'bit varying': + kwargs['varying'] = True + if charlen: + args = (int(charlen),) + else: + args = () + elif attype in ('interval', 'interval year to month', + 'interval day to second'): + if charlen: + kwargs['precision'] = int(charlen) + args = () + elif charlen: + args = (int(charlen),) + + while True: + if attype in self.ischema_names: + coltype = self.ischema_names[attype] + break + elif attype in enums: + enum = enums[attype] + coltype = ENUM + kwargs['name'] = enum['name'] + if not enum['visible']: + kwargs['schema'] = enum['schema'] + args = tuple(enum['labels']) + break + elif attype in domains: + domain = domains[attype] + attype = domain['attype'] + # A table can't override whether the domain is nullable. + nullable = domain['nullable'] + if domain['default'] and not default: + # It can, however, override the default + # value, but can't set it to null. + default = domain['default'] + continue + else: + coltype = None + break + + if coltype: + coltype = coltype(*args, **kwargs) + if is_array: + coltype = self.ischema_names['_array'](coltype) + else: + util.warn("Did not recognize type '%s' of column '%s'" % + (attype, name)) + coltype = sqltypes.NULLTYPE + # adjust the default value + autoincrement = False + if default is not None: + match = re.search(r"""(nextval\(')([^']+)('.*$)""", default) + if match is not None: + if issubclass(coltype._type_affinity, sqltypes.Integer): + autoincrement = True + # the default is related to a Sequence + sch = schema + if '.' not in match.group(2) and sch is not None: + # unconditionally quote the schema name. this could + # later be enhanced to obey quoting rules / + # "quote schema" + default = match.group(1) + \ + ('"%s"' % sch) + '.' + \ + match.group(2) + match.group(3) + + column_info = dict(name=name, type=coltype, nullable=nullable, + default=default, autoincrement=autoincrement) + return column_info + + @reflection.cache + def get_pk_constraint(self, connection, table_name, schema=None, **kw): + table_oid = self.get_table_oid(connection, table_name, schema, + info_cache=kw.get('info_cache')) + + if self.server_version_info < (8, 4): + PK_SQL = """ + SELECT a.attname + FROM + pg_class t + join pg_index ix on t.oid = ix.indrelid + join pg_attribute a + on t.oid=a.attrelid AND %s + WHERE + t.oid = :table_oid and ix.indisprimary = 't' + ORDER BY a.attnum + """ % self._pg_index_any("a.attnum", "ix.indkey") + + else: + # unnest() and generate_subscripts() both introduced in + # version 8.4 + PK_SQL = """ + SELECT a.attname + FROM pg_attribute a JOIN ( + SELECT unnest(ix.indkey) attnum, + generate_subscripts(ix.indkey, 1) ord + FROM pg_index ix + WHERE ix.indrelid = :table_oid AND ix.indisprimary + ) k ON a.attnum=k.attnum + WHERE a.attrelid = :table_oid + ORDER BY k.ord + """ + t = sql.text(PK_SQL, typemap={'attname': sqltypes.Unicode}) + c = connection.execute(t, table_oid=table_oid) + cols = [r[0] for r in c.fetchall()] + + PK_CONS_SQL = """ + SELECT conname + FROM pg_catalog.pg_constraint r + WHERE r.conrelid = :table_oid AND r.contype = 'p' + ORDER BY 1 + """ + t = sql.text(PK_CONS_SQL, typemap={'conname': sqltypes.Unicode}) + c = connection.execute(t, table_oid=table_oid) + name = c.scalar() + + return {'constrained_columns': cols, 'name': name} + + @reflection.cache + def get_foreign_keys(self, connection, table_name, schema=None, + postgresql_ignore_search_path=False, **kw): + preparer = self.identifier_preparer + table_oid = self.get_table_oid(connection, table_name, schema, + info_cache=kw.get('info_cache')) + + FK_SQL = """ + SELECT r.conname, + pg_catalog.pg_get_constraintdef(r.oid, true) as condef, + n.nspname as conschema + FROM pg_catalog.pg_constraint r, + pg_namespace n, + pg_class c + + WHERE r.conrelid = :table AND + r.contype = 'f' AND + c.oid = confrelid AND + n.oid = c.relnamespace + ORDER BY 1 + """ + # http://www.postgresql.org/docs/9.0/static/sql-createtable.html + FK_REGEX = re.compile( + r'FOREIGN KEY \((.*?)\) REFERENCES (?:(.*?)\.)?(.*?)\((.*?)\)' + r'[\s]?(MATCH (FULL|PARTIAL|SIMPLE)+)?' + r'[\s]?(ON UPDATE ' + r'(CASCADE|RESTRICT|NO ACTION|SET NULL|SET DEFAULT)+)?' + r'[\s]?(ON DELETE ' + r'(CASCADE|RESTRICT|NO ACTION|SET NULL|SET DEFAULT)+)?' + r'[\s]?(DEFERRABLE|NOT DEFERRABLE)?' + r'[\s]?(INITIALLY (DEFERRED|IMMEDIATE)+)?' + ) + + t = sql.text(FK_SQL, typemap={ + 'conname': sqltypes.Unicode, + 'condef': sqltypes.Unicode}) + c = connection.execute(t, table=table_oid) + fkeys = [] + for conname, condef, conschema in c.fetchall(): + m = re.search(FK_REGEX, condef).groups() + + constrained_columns, referred_schema, \ + referred_table, referred_columns, \ + _, match, _, onupdate, _, ondelete, \ + deferrable, _, initially = m + + if deferrable is not None: + deferrable = True if deferrable == 'DEFERRABLE' else False + constrained_columns = [preparer._unquote_identifier(x) + for x in re.split( + r'\s*,\s*', constrained_columns)] + + if postgresql_ignore_search_path: + # when ignoring search path, we use the actual schema + # provided it isn't the "default" schema + if conschema != self.default_schema_name: + referred_schema = conschema + else: + referred_schema = schema + elif referred_schema: + # referred_schema is the schema that we regexp'ed from + # pg_get_constraintdef(). If the schema is in the search + # path, pg_get_constraintdef() will give us None. + referred_schema = \ + preparer._unquote_identifier(referred_schema) + elif schema is not None and schema == conschema: + # If the actual schema matches the schema of the table + # we're reflecting, then we will use that. + referred_schema = schema + + referred_table = preparer._unquote_identifier(referred_table) + referred_columns = [preparer._unquote_identifier(x) + for x in + re.split(r'\s*,\s', referred_columns)] + fkey_d = { + 'name': conname, + 'constrained_columns': constrained_columns, + 'referred_schema': referred_schema, + 'referred_table': referred_table, + 'referred_columns': referred_columns, + 'options': { + 'onupdate': onupdate, + 'ondelete': ondelete, + 'deferrable': deferrable, + 'initially': initially, + 'match': match + } + } + fkeys.append(fkey_d) + return fkeys + + def _pg_index_any(self, col, compare_to): + if self.server_version_info < (8, 1): + # http://www.postgresql.org/message-id/10279.1124395722@sss.pgh.pa.us + # "In CVS tip you could replace this with "attnum = ANY (indkey)". + # Unfortunately, most array support doesn't work on int2vector in + # pre-8.1 releases, so I think you're kinda stuck with the above + # for now. + # regards, tom lane" + return "(%s)" % " OR ".join( + "%s[%d] = %s" % (compare_to, ind, col) + for ind in range(0, 10) + ) + else: + return "%s = ANY(%s)" % (col, compare_to) + + @reflection.cache + def get_indexes(self, connection, table_name, schema, **kw): + table_oid = self.get_table_oid(connection, table_name, schema, + info_cache=kw.get('info_cache')) + + # cast indkey as varchar since it's an int2vector, + # returned as a list by some drivers such as pypostgresql + + if self.server_version_info < (8, 5): + IDX_SQL = """ + SELECT + i.relname as relname, + ix.indisunique, ix.indexprs, ix.indpred, + a.attname, a.attnum, NULL, ix.indkey%s, + %s, am.amname + FROM + pg_class t + join pg_index ix on t.oid = ix.indrelid + join pg_class i on i.oid = ix.indexrelid + left outer join + pg_attribute a + on t.oid = a.attrelid and %s + left outer join + pg_am am + on i.relam = am.oid + WHERE + t.relkind IN ('r', 'v', 'f', 'm') + and t.oid = :table_oid + and ix.indisprimary = 'f' + ORDER BY + t.relname, + i.relname + """ % ( + # version 8.3 here was based on observing the + # cast does not work in PG 8.2.4, does work in 8.3.0. + # nothing in PG changelogs regarding this. + "::varchar" if self.server_version_info >= (8, 3) else "", + "i.reloptions" if self.server_version_info >= (8, 2) + else "NULL", + self._pg_index_any("a.attnum", "ix.indkey") + ) + else: + IDX_SQL = """ + SELECT + i.relname as relname, + ix.indisunique, ix.indexprs, ix.indpred, + a.attname, a.attnum, c.conrelid, ix.indkey::varchar, + i.reloptions, am.amname + FROM + pg_class t + join pg_index ix on t.oid = ix.indrelid + join pg_class i on i.oid = ix.indexrelid + left outer join + pg_attribute a + on t.oid = a.attrelid and a.attnum = ANY(ix.indkey) + left outer join + pg_constraint c + on (ix.indrelid = c.conrelid and + ix.indexrelid = c.conindid and + c.contype in ('p', 'u', 'x')) + left outer join + pg_am am + on i.relam = am.oid + WHERE + t.relkind IN ('r', 'v', 'f', 'm') + and t.oid = :table_oid + and ix.indisprimary = 'f' + ORDER BY + t.relname, + i.relname + """ + + t = sql.text(IDX_SQL, typemap={ + 'relname': sqltypes.Unicode, + 'attname': sqltypes.Unicode}) + c = connection.execute(t, table_oid=table_oid) + + indexes = defaultdict(lambda: defaultdict(dict)) + + sv_idx_name = None + for row in c.fetchall(): + (idx_name, unique, expr, prd, col, + col_num, conrelid, idx_key, options, amname) = row + + if expr: + if idx_name != sv_idx_name: + util.warn( + "Skipped unsupported reflection of " + "expression-based index %s" + % idx_name) + sv_idx_name = idx_name + continue + + if prd and not idx_name == sv_idx_name: + util.warn( + "Predicate of partial index %s ignored during reflection" + % idx_name) + sv_idx_name = idx_name + + has_idx = idx_name in indexes + index = indexes[idx_name] + if col is not None: + index['cols'][col_num] = col + if not has_idx: + index['key'] = [int(k.strip()) for k in idx_key.split()] + index['unique'] = unique + if conrelid is not None: + index['duplicates_constraint'] = idx_name + if options: + index['options'] = dict( + [option.split("=") for option in options]) + + # it *might* be nice to include that this is 'btree' in the + # reflection info. But we don't want an Index object + # to have a ``postgresql_using`` in it that is just the + # default, so for the moment leaving this out. + if amname and amname != 'btree': + index['amname'] = amname + + result = [] + for name, idx in indexes.items(): + entry = { + 'name': name, + 'unique': idx['unique'], + 'column_names': [idx['cols'][i] for i in idx['key']] + } + if 'duplicates_constraint' in idx: + entry['duplicates_constraint'] = idx['duplicates_constraint'] + if 'options' in idx: + entry.setdefault( + 'dialect_options', {})["postgresql_with"] = idx['options'] + if 'amname' in idx: + entry.setdefault( + 'dialect_options', {})["postgresql_using"] = idx['amname'] + result.append(entry) + return result + + @reflection.cache + def get_unique_constraints(self, connection, table_name, + schema=None, **kw): + table_oid = self.get_table_oid(connection, table_name, schema, + info_cache=kw.get('info_cache')) + + UNIQUE_SQL = """ + SELECT + cons.conname as name, + cons.conkey as key, + a.attnum as col_num, + a.attname as col_name + FROM + pg_catalog.pg_constraint cons + join pg_attribute a + on cons.conrelid = a.attrelid AND + a.attnum = ANY(cons.conkey) + WHERE + cons.conrelid = :table_oid AND + cons.contype = 'u' + """ + + t = sql.text(UNIQUE_SQL, typemap={'col_name': sqltypes.Unicode}) + c = connection.execute(t, table_oid=table_oid) + + uniques = defaultdict(lambda: defaultdict(dict)) + for row in c.fetchall(): + uc = uniques[row.name] + uc["key"] = row.key + uc["cols"][row.col_num] = row.col_name + + return [ + {'name': name, + 'column_names': [uc["cols"][i] for i in uc["key"]]} + for name, uc in uniques.items() + ] + + @reflection.cache + def get_check_constraints( + self, connection, table_name, schema=None, **kw): + table_oid = self.get_table_oid(connection, table_name, schema, + info_cache=kw.get('info_cache')) + + CHECK_SQL = """ + SELECT + cons.conname as name, + cons.consrc as src + FROM + pg_catalog.pg_constraint cons + WHERE + cons.conrelid = :table_oid AND + cons.contype = 'c' + """ + + c = connection.execute(sql.text(CHECK_SQL), table_oid=table_oid) + + return [ + {'name': name, + 'sqltext': src[1:-1]} + for name, src in c.fetchall() + ] + + def _load_enums(self, connection, schema=None): + schema = schema or self.default_schema_name + if not self.supports_native_enum: + return {} + + # Load data types for enums: + SQL_ENUMS = """ + SELECT t.typname as "name", + -- no enum defaults in 8.4 at least + -- t.typdefault as "default", + pg_catalog.pg_type_is_visible(t.oid) as "visible", + n.nspname as "schema", + e.enumlabel as "label" + FROM pg_catalog.pg_type t + LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace + LEFT JOIN pg_catalog.pg_enum e ON t.oid = e.enumtypid + WHERE t.typtype = 'e' + """ + + if schema != '*': + SQL_ENUMS += "AND n.nspname = :schema " + + # e.oid gives us label order within an enum + SQL_ENUMS += 'ORDER BY "schema", "name", e.oid' + + s = sql.text(SQL_ENUMS, typemap={ + 'attname': sqltypes.Unicode, + 'label': sqltypes.Unicode}) + + if schema != '*': + s = s.bindparams(schema=schema) + + c = connection.execute(s) + + enums = [] + enum_by_name = {} + for enum in c.fetchall(): + key = (enum['schema'], enum['name']) + if key in enum_by_name: + enum_by_name[key]['labels'].append(enum['label']) + else: + enum_by_name[key] = enum_rec = { + 'name': enum['name'], + 'schema': enum['schema'], + 'visible': enum['visible'], + 'labels': [enum['label']], + } + enums.append(enum_rec) + + return enums + + def _load_domains(self, connection): + # Load data types for domains: + SQL_DOMAINS = """ + SELECT t.typname as "name", + pg_catalog.format_type(t.typbasetype, t.typtypmod) as "attype", + not t.typnotnull as "nullable", + t.typdefault as "default", + pg_catalog.pg_type_is_visible(t.oid) as "visible", + n.nspname as "schema" + FROM pg_catalog.pg_type t + LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace + WHERE t.typtype = 'd' + """ + + s = sql.text(SQL_DOMAINS, typemap={'attname': sqltypes.Unicode}) + c = connection.execute(s) + + domains = {} + for domain in c.fetchall(): + # strip (30) from character varying(30) + attype = re.search(r'([^\(]+)', domain['attype']).group(1) + if domain['visible']: + # 'visible' just means whether or not the domain is in a + # schema that's on the search path -- or not overridden by + # a schema with higher precedence. If it's not visible, + # it will be prefixed with the schema-name when it's used. + name = domain['name'] + else: + name = "%s.%s" % (domain['schema'], domain['name']) + + domains[name] = { + 'attype': attype, + 'nullable': domain['nullable'], + 'default': domain['default'] + } + + return domains diff --git a/app/lib/sqlalchemy/dialects/postgresql/dml.py b/app/lib/sqlalchemy/dialects/postgresql/dml.py new file mode 100644 index 0000000..bfdfbfa --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/dml.py @@ -0,0 +1,213 @@ +# postgresql/on_conflict.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from ...sql.elements import ClauseElement, _literal_as_binds +from ...sql.dml import Insert as StandardInsert +from ...sql.expression import alias +from ...sql import schema +from ...util.langhelpers import public_factory +from ...sql.base import _generative +from ... import util +from . import ext + +__all__ = ('Insert', 'insert') + + +class Insert(StandardInsert): + """PostgreSQL-specific implementation of INSERT. + + Adds methods for PG-specific syntaxes such as ON CONFLICT. + + .. versionadded:: 1.1 + + """ + + @util.memoized_property + def excluded(self): + """Provide the ``excluded`` namespace for an ON CONFLICT statement + + PG's ON CONFLICT clause allows reference to the row that would + be inserted, known as ``excluded``. This attribute provides + all columns in this row to be referenaceable. + + .. seealso:: + + :ref:`postgresql_insert_on_conflict` - example of how + to use :attr:`.Insert.excluded` + + """ + return alias(self.table, name='excluded').columns + + @_generative + def on_conflict_do_update( + self, + constraint=None, index_elements=None, + index_where=None, set_=None, where=None): + """ + Specifies a DO UPDATE SET action for ON CONFLICT clause. + + Either the ``constraint`` or ``index_elements`` argument is + required, but only one of these can be specified. + + :param constraint: + The name of a unique or exclusion constraint on the table, + or the constraint object itself if it has a .name attribute. + + :param index_elements: + A sequence consisting of string column names, :class:`.Column` + objects, or other column expression objects that will be used + to infer a target index. + + :param index_where: + Additional WHERE criterion that can be used to infer a + conditional target index. + + :param set_: + Required argument. A dictionary or other mapping object + with column names as keys and expressions or literals as values, + specifying the ``SET`` actions to take. + If the target :class:`.Column` specifies a ".key" attribute distinct + from the column name, that key should be used. + + .. warning:: This dictionary does **not** take into account + Python-specified default UPDATE values or generation functions, + e.g. those specified using :paramref:`.Column.onupdate`. + These values will not be exercised for an ON CONFLICT style of + UPDATE, unless they are manually specified in the + :paramref:`.Insert.on_conflict_do_update.set_` dictionary. + + :param where: + Optional argument. If present, can be a literal SQL + string or an acceptable expression for a ``WHERE`` clause + that restricts the rows affected by ``DO UPDATE SET``. Rows + not meeting the ``WHERE`` condition will not be updated + (effectively a ``DO NOTHING`` for those rows). + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`postgresql_insert_on_conflict` + + """ + self._post_values_clause = OnConflictDoUpdate( + constraint, index_elements, index_where, set_, where) + return self + + @_generative + def on_conflict_do_nothing( + self, + constraint=None, index_elements=None, index_where=None): + """ + Specifies a DO NOTHING action for ON CONFLICT clause. + + The ``constraint`` and ``index_elements`` arguments + are optional, but only one of these can be specified. + + :param constraint: + The name of a unique or exclusion constraint on the table, + or the constraint object itself if it has a .name attribute. + + :param index_elements: + A sequence consisting of string column names, :class:`.Column` + objects, or other column expression objects that will be used + to infer a target index. + + :param index_where: + Additional WHERE criterion that can be used to infer a + conditional target index. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`postgresql_insert_on_conflict` + + """ + self._post_values_clause = OnConflictDoNothing( + constraint, index_elements, index_where) + return self + +insert = public_factory(Insert, '.dialects.postgresql.insert') + + +class OnConflictClause(ClauseElement): + def __init__( + self, + constraint=None, + index_elements=None, + index_where=None): + + if constraint is not None: + if not isinstance(constraint, util.string_types) and \ + isinstance(constraint, ( + schema.Index, schema.Constraint, + ext.ExcludeConstraint)): + constraint = getattr(constraint, 'name') or constraint + + if constraint is not None: + if index_elements is not None: + raise ValueError( + "'constraint' and 'index_elements' are mutually exclusive") + + if isinstance(constraint, util.string_types): + self.constraint_target = constraint + self.inferred_target_elements = None + self.inferred_target_whereclause = None + elif isinstance(constraint, schema.Index): + index_elements = constraint.expressions + index_where = \ + constraint.dialect_options['postgresql'].get("where") + elif isinstance(constraint, ext.ExcludeConstraint): + index_elements = constraint.columns + index_where = constraint.where + else: + index_elements = constraint.columns + index_where = \ + constraint.dialect_options['postgresql'].get("where") + + if index_elements is not None: + self.constraint_target = None + self.inferred_target_elements = index_elements + self.inferred_target_whereclause = index_where + elif constraint is None: + self.constraint_target = self.inferred_target_elements = \ + self.inferred_target_whereclause = None + + +class OnConflictDoNothing(OnConflictClause): + __visit_name__ = 'on_conflict_do_nothing' + + +class OnConflictDoUpdate(OnConflictClause): + __visit_name__ = 'on_conflict_do_update' + + def __init__( + self, + constraint=None, + index_elements=None, + index_where=None, + set_=None, + where=None): + super(OnConflictDoUpdate, self).__init__( + constraint=constraint, + index_elements=index_elements, + index_where=index_where) + + if self.inferred_target_elements is None and \ + self.constraint_target is None: + raise ValueError( + "Either constraint or index_elements, " + "but not both, must be specified unless DO NOTHING") + + if (not isinstance(set_, dict) or not set_): + raise ValueError("set parameter must be a non-empty dictionary") + self.update_values_to_set = [ + (key, value) + for key, value in set_.items() + ] + self.update_whereclause = where diff --git a/app/lib/sqlalchemy/dialects/postgresql/ext.py b/app/lib/sqlalchemy/dialects/postgresql/ext.py new file mode 100644 index 0000000..55eded9 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/ext.py @@ -0,0 +1,218 @@ +# postgresql/ext.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from ...sql import expression +from ...sql import elements +from ...sql import functions +from ...sql.schema import ColumnCollectionConstraint +from .array import ARRAY + + +class aggregate_order_by(expression.ColumnElement): + """Represent a PostgreSQL aggregate order by expression. + + E.g.:: + + from sqlalchemy.dialects.postgresql import aggregate_order_by + expr = func.array_agg(aggregate_order_by(table.c.a, table.c.b.desc())) + stmt = select([expr]) + + would represent the expression:: + + SELECT array_agg(a ORDER BY b DESC) FROM table; + + Similarly:: + + expr = func.string_agg( + table.c.a, + aggregate_order_by(literal_column("','"), table.c.a) + ) + stmt = select([expr]) + + Would represent:: + + SELECT string_agg(a, ',' ORDER BY a) FROM table; + + .. versionadded:: 1.1 + + .. seealso:: + + :class:`.array_agg` + + """ + + __visit_name__ = 'aggregate_order_by' + + def __init__(self, target, order_by): + self.target = elements._literal_as_binds(target) + self.order_by = elements._literal_as_binds(order_by) + + def self_group(self, against=None): + return self + + def get_children(self, **kwargs): + return self.target, self.order_by + + def _copy_internals(self, clone=elements._clone, **kw): + self.target = clone(self.target, **kw) + self.order_by = clone(self.order_by, **kw) + + @property + def _from_objects(self): + return self.target._from_objects + self.order_by._from_objects + + +class ExcludeConstraint(ColumnCollectionConstraint): + """A table-level EXCLUDE constraint. + + Defines an EXCLUDE constraint as described in the `postgres + documentation`__. + + __ http://www.postgresql.org/docs/9.0/\ +static/sql-createtable.html#SQL-CREATETABLE-EXCLUDE + """ + + __visit_name__ = 'exclude_constraint' + + where = None + + def __init__(self, *elements, **kw): + r""" + Create an :class:`.ExcludeConstraint` object. + + E.g.:: + + const = ExcludeConstraint( + (Column('period'), '&&'), + (Column('group'), '='), + where=(Column('group') != 'some group') + ) + + The constraint is normally embedded into the :class:`.Table` construct + directly, or added later using :meth:`.append_constraint`:: + + some_table = Table( + 'some_table', metadata, + Column('id', Integer, primary_key=True), + Column('period', TSRANGE()), + Column('group', String) + ) + + some_table.append_constraint( + ExcludeConstraint( + (some_table.c.period, '&&'), + (some_table.c.group, '='), + where=some_table.c.group != 'some group', + name='some_table_excl_const' + ) + ) + + :param \*elements: + A sequence of two tuples of the form ``(column, operator)`` where + "column" is a SQL expression element or a raw SQL string, most + typically a :class:`.Column` object, + and "operator" is a string containing the operator to use. + + .. note:: + + A plain string passed for the value of "column" is interpreted + as an arbitrary SQL expression; when passing a plain string, + any necessary quoting and escaping syntaxes must be applied + manually. In order to specify a column name when a + :class:`.Column` object is not available, while ensuring that + any necessary quoting rules take effect, an ad-hoc + :class:`.Column` or :func:`.sql.expression.column` object may + be used. + + :param name: + Optional, the in-database name of this constraint. + + :param deferrable: + Optional bool. If set, emit DEFERRABLE or NOT DEFERRABLE when + issuing DDL for this constraint. + + :param initially: + Optional string. If set, emit INITIALLY when issuing DDL + for this constraint. + + :param using: + Optional string. If set, emit USING when issuing DDL + for this constraint. Defaults to 'gist'. + + :param where: + Optional SQL expression construct or literal SQL string. + If set, emit WHERE when issuing DDL + for this constraint. + + .. note:: + + A plain string passed here is interpreted as an arbitrary SQL + expression; when passing a plain string, any necessary quoting + and escaping syntaxes must be applied manually. + + """ + columns = [] + render_exprs = [] + self.operators = {} + + expressions, operators = zip(*elements) + + for (expr, column, strname, add_element), operator in zip( + self._extract_col_expression_collection(expressions), + operators + ): + if add_element is not None: + columns.append(add_element) + + name = column.name if column is not None else strname + + if name is not None: + # backwards compat + self.operators[name] = operator + + expr = expression._literal_as_text(expr) + + render_exprs.append( + (expr, name, operator) + ) + + self._render_exprs = render_exprs + ColumnCollectionConstraint.__init__( + self, + *columns, + name=kw.get('name'), + deferrable=kw.get('deferrable'), + initially=kw.get('initially') + ) + self.using = kw.get('using', 'gist') + where = kw.get('where') + if where is not None: + self.where = expression._literal_as_text(where) + + def copy(self, **kw): + elements = [(col, self.operators[col]) + for col in self.columns.keys()] + c = self.__class__(*elements, + name=self.name, + deferrable=self.deferrable, + initially=self.initially, + where=self.where, + using=self.using) + c.dispatch._update(self.dispatch) + return c + + +def array_agg(*arg, **kw): + """PostgreSQL-specific form of :class:`.array_agg`, ensures + return type is :class:`.postgresql.ARRAY` and not + the plain :class:`.types.ARRAY`. + + .. versionadded:: 1.1 + + """ + kw['type_'] = ARRAY(functions._type_from_args(arg)) + return functions.func.array_agg(*arg, **kw) diff --git a/app/lib/sqlalchemy/dialects/postgresql/hstore.py b/app/lib/sqlalchemy/dialects/postgresql/hstore.py new file mode 100644 index 0000000..952c6ed --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/hstore.py @@ -0,0 +1,420 @@ +# postgresql/hstore.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import re + +from .base import ischema_names +from .array import ARRAY +from ... import types as sqltypes +from ...sql import functions as sqlfunc +from ...sql import operators +from ... import util + +__all__ = ('HSTORE', 'hstore') + +idx_precedence = operators._PRECEDENCE[operators.json_getitem_op] + +GETITEM = operators.custom_op( + "->", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + +HAS_KEY = operators.custom_op( + "?", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + +HAS_ALL = operators.custom_op( + "?&", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + +HAS_ANY = operators.custom_op( + "?|", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + +CONTAINS = operators.custom_op( + "@>", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + +CONTAINED_BY = operators.custom_op( + "<@", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + + +class HSTORE(sqltypes.Indexable, sqltypes.Concatenable, sqltypes.TypeEngine): + """Represent the PostgreSQL HSTORE type. + + The :class:`.HSTORE` type stores dictionaries containing strings, e.g.:: + + data_table = Table('data_table', metadata, + Column('id', Integer, primary_key=True), + Column('data', HSTORE) + ) + + with engine.connect() as conn: + conn.execute( + data_table.insert(), + data = {"key1": "value1", "key2": "value2"} + ) + + :class:`.HSTORE` provides for a wide range of operations, including: + + * Index operations:: + + data_table.c.data['some key'] == 'some value' + + * Containment operations:: + + data_table.c.data.has_key('some key') + + data_table.c.data.has_all(['one', 'two', 'three']) + + * Concatenation:: + + data_table.c.data + {"k1": "v1"} + + For a full list of special methods see + :class:`.HSTORE.comparator_factory`. + + For usage with the SQLAlchemy ORM, it may be desirable to combine + the usage of :class:`.HSTORE` with :class:`.MutableDict` dictionary + now part of the :mod:`sqlalchemy.ext.mutable` + extension. This extension will allow "in-place" changes to the + dictionary, e.g. addition of new keys or replacement/removal of existing + keys to/from the current dictionary, to produce events which will be + detected by the unit of work:: + + from sqlalchemy.ext.mutable import MutableDict + + class MyClass(Base): + __tablename__ = 'data_table' + + id = Column(Integer, primary_key=True) + data = Column(MutableDict.as_mutable(HSTORE)) + + my_object = session.query(MyClass).one() + + # in-place mutation, requires Mutable extension + # in order for the ORM to detect + my_object.data['some_key'] = 'some value' + + session.commit() + + When the :mod:`sqlalchemy.ext.mutable` extension is not used, the ORM + will not be alerted to any changes to the contents of an existing + dictionary, unless that dictionary value is re-assigned to the + HSTORE-attribute itself, thus generating a change event. + + .. versionadded:: 0.8 + + .. seealso:: + + :class:`.hstore` - render the PostgreSQL ``hstore()`` function. + + + """ + + __visit_name__ = 'HSTORE' + hashable = False + text_type = sqltypes.Text() + + def __init__(self, text_type=None): + """Construct a new :class:`.HSTORE`. + + :param text_type: the type that should be used for indexed values. + Defaults to :class:`.types.Text`. + + .. versionadded:: 1.1.0 + + """ + if text_type is not None: + self.text_type = text_type + + class Comparator( + sqltypes.Indexable.Comparator, sqltypes.Concatenable.Comparator): + """Define comparison operations for :class:`.HSTORE`.""" + + def has_key(self, other): + """Boolean expression. Test for presence of a key. Note that the + key may be a SQLA expression. + """ + return self.operate(HAS_KEY, other, result_type=sqltypes.Boolean) + + def has_all(self, other): + """Boolean expression. Test for presence of all keys in jsonb + """ + return self.operate(HAS_ALL, other, result_type=sqltypes.Boolean) + + def has_any(self, other): + """Boolean expression. Test for presence of any key in jsonb + """ + return self.operate(HAS_ANY, other, result_type=sqltypes.Boolean) + + def contains(self, other, **kwargs): + """Boolean expression. Test if keys (or array) are a superset + of/contained the keys of the argument jsonb expression. + """ + return self.operate(CONTAINS, other, result_type=sqltypes.Boolean) + + def contained_by(self, other): + """Boolean expression. Test if keys are a proper subset of the + keys of the argument jsonb expression. + """ + return self.operate( + CONTAINED_BY, other, result_type=sqltypes.Boolean) + + def _setup_getitem(self, index): + return GETITEM, index, self.type.text_type + + def defined(self, key): + """Boolean expression. Test for presence of a non-NULL value for + the key. Note that the key may be a SQLA expression. + """ + return _HStoreDefinedFunction(self.expr, key) + + def delete(self, key): + """HStore expression. Returns the contents of this hstore with the + given key deleted. Note that the key may be a SQLA expression. + """ + if isinstance(key, dict): + key = _serialize_hstore(key) + return _HStoreDeleteFunction(self.expr, key) + + def slice(self, array): + """HStore expression. Returns a subset of an hstore defined by + array of keys. + """ + return _HStoreSliceFunction(self.expr, array) + + def keys(self): + """Text array expression. Returns array of keys.""" + return _HStoreKeysFunction(self.expr) + + def vals(self): + """Text array expression. Returns array of values.""" + return _HStoreValsFunction(self.expr) + + def array(self): + """Text array expression. Returns array of alternating keys and + values. + """ + return _HStoreArrayFunction(self.expr) + + def matrix(self): + """Text array expression. Returns array of [key, value] pairs.""" + return _HStoreMatrixFunction(self.expr) + + comparator_factory = Comparator + + def bind_processor(self, dialect): + if util.py2k: + encoding = dialect.encoding + + def process(value): + if isinstance(value, dict): + return _serialize_hstore(value).encode(encoding) + else: + return value + else: + def process(value): + if isinstance(value, dict): + return _serialize_hstore(value) + else: + return value + return process + + def result_processor(self, dialect, coltype): + if util.py2k: + encoding = dialect.encoding + + def process(value): + if value is not None: + return _parse_hstore(value.decode(encoding)) + else: + return value + else: + def process(value): + if value is not None: + return _parse_hstore(value) + else: + return value + return process + + +ischema_names['hstore'] = HSTORE + + +class hstore(sqlfunc.GenericFunction): + """Construct an hstore value within a SQL expression using the + PostgreSQL ``hstore()`` function. + + The :class:`.hstore` function accepts one or two arguments as described + in the PostgreSQL documentation. + + E.g.:: + + from sqlalchemy.dialects.postgresql import array, hstore + + select([hstore('key1', 'value1')]) + + select([ + hstore( + array(['key1', 'key2', 'key3']), + array(['value1', 'value2', 'value3']) + ) + ]) + + .. versionadded:: 0.8 + + .. seealso:: + + :class:`.HSTORE` - the PostgreSQL ``HSTORE`` datatype. + + """ + type = HSTORE + name = 'hstore' + + +class _HStoreDefinedFunction(sqlfunc.GenericFunction): + type = sqltypes.Boolean + name = 'defined' + + +class _HStoreDeleteFunction(sqlfunc.GenericFunction): + type = HSTORE + name = 'delete' + + +class _HStoreSliceFunction(sqlfunc.GenericFunction): + type = HSTORE + name = 'slice' + + +class _HStoreKeysFunction(sqlfunc.GenericFunction): + type = ARRAY(sqltypes.Text) + name = 'akeys' + + +class _HStoreValsFunction(sqlfunc.GenericFunction): + type = ARRAY(sqltypes.Text) + name = 'avals' + + +class _HStoreArrayFunction(sqlfunc.GenericFunction): + type = ARRAY(sqltypes.Text) + name = 'hstore_to_array' + + +class _HStoreMatrixFunction(sqlfunc.GenericFunction): + type = ARRAY(sqltypes.Text) + name = 'hstore_to_matrix' + + +# +# parsing. note that none of this is used with the psycopg2 backend, +# which provides its own native extensions. +# + +# My best guess at the parsing rules of hstore literals, since no formal +# grammar is given. This is mostly reverse engineered from PG's input parser +# behavior. +HSTORE_PAIR_RE = re.compile(r""" +( + "(?P (\\ . | [^"])* )" # Quoted key +) +[ ]* => [ ]* # Pair operator, optional adjoining whitespace +( + (?P NULL ) # NULL value + | "(?P (\\ . | [^"])* )" # Quoted value +) +""", re.VERBOSE) + +HSTORE_DELIMITER_RE = re.compile(r""" +[ ]* , [ ]* +""", re.VERBOSE) + + +def _parse_error(hstore_str, pos): + """format an unmarshalling error.""" + + ctx = 20 + hslen = len(hstore_str) + + parsed_tail = hstore_str[max(pos - ctx - 1, 0):min(pos, hslen)] + residual = hstore_str[min(pos, hslen):min(pos + ctx + 1, hslen)] + + if len(parsed_tail) > ctx: + parsed_tail = '[...]' + parsed_tail[1:] + if len(residual) > ctx: + residual = residual[:-1] + '[...]' + + return "After %r, could not parse residual at position %d: %r" % ( + parsed_tail, pos, residual) + + +def _parse_hstore(hstore_str): + """Parse an hstore from its literal string representation. + + Attempts to approximate PG's hstore input parsing rules as closely as + possible. Although currently this is not strictly necessary, since the + current implementation of hstore's output syntax is stricter than what it + accepts as input, the documentation makes no guarantees that will always + be the case. + + + + """ + result = {} + pos = 0 + pair_match = HSTORE_PAIR_RE.match(hstore_str) + + while pair_match is not None: + key = pair_match.group('key').replace(r'\"', '"').replace( + "\\\\", "\\") + if pair_match.group('value_null'): + value = None + else: + value = pair_match.group('value').replace( + r'\"', '"').replace("\\\\", "\\") + result[key] = value + + pos += pair_match.end() + + delim_match = HSTORE_DELIMITER_RE.match(hstore_str[pos:]) + if delim_match is not None: + pos += delim_match.end() + + pair_match = HSTORE_PAIR_RE.match(hstore_str[pos:]) + + if pos != len(hstore_str): + raise ValueError(_parse_error(hstore_str, pos)) + + return result + + +def _serialize_hstore(val): + """Serialize a dictionary into an hstore literal. Keys and values must + both be strings (except None for values). + + """ + def esc(s, position): + if position == 'value' and s is None: + return 'NULL' + elif isinstance(s, util.string_types): + return '"%s"' % s.replace("\\", "\\\\").replace('"', r'\"') + else: + raise ValueError("%r in %s position is not a string." % + (s, position)) + + return ', '.join('%s=>%s' % (esc(k, 'key'), esc(v, 'value')) + for k, v in val.items()) + + diff --git a/app/lib/sqlalchemy/dialects/postgresql/json.py b/app/lib/sqlalchemy/dialects/postgresql/json.py new file mode 100644 index 0000000..f145806 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/json.py @@ -0,0 +1,301 @@ +# postgresql/json.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +from __future__ import absolute_import + +import json +import collections + +from .base import ischema_names, colspecs +from ... import types as sqltypes +from ...sql import operators +from ...sql import elements +from ... import util + +__all__ = ('JSON', 'JSONB') + +idx_precedence = operators._PRECEDENCE[operators.json_getitem_op] + +ASTEXT = operators.custom_op( + "->>", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + +JSONPATH_ASTEXT = operators.custom_op( + "#>>", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + + +HAS_KEY = operators.custom_op( + "?", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + +HAS_ALL = operators.custom_op( + "?&", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + +HAS_ANY = operators.custom_op( + "?|", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + +CONTAINS = operators.custom_op( + "@>", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + +CONTAINED_BY = operators.custom_op( + "<@", precedence=idx_precedence, natural_self_precedent=True, + eager_grouping=True +) + + +class JSONPathType(sqltypes.JSON.JSONPathType): + def bind_processor(self, dialect): + super_proc = self.string_bind_processor(dialect) + + def process(value): + assert isinstance(value, collections.Sequence) + tokens = [util.text_type(elem)for elem in value] + value = "{%s}" % (", ".join(tokens)) + if super_proc: + value = super_proc(value) + return value + + return process + + def literal_processor(self, dialect): + super_proc = self.string_literal_processor(dialect) + + def process(value): + assert isinstance(value, collections.Sequence) + tokens = [util.text_type(elem)for elem in value] + value = "{%s}" % (", ".join(tokens)) + if super_proc: + value = super_proc(value) + return value + + return process + +colspecs[sqltypes.JSON.JSONPathType] = JSONPathType + + +class JSON(sqltypes.JSON): + """Represent the PostgreSQL JSON type. + + This type is a specialization of the Core-level :class:`.types.JSON` + type. Be sure to read the documentation for :class:`.types.JSON` for + important tips regarding treatment of NULL values and ORM use. + + .. versionchanged:: 1.1 :class:`.postgresql.JSON` is now a PostgreSQL- + specific specialization of the new :class:`.types.JSON` type. + + The operators provided by the PostgreSQL version of :class:`.JSON` + include: + + * Index operations (the ``->`` operator):: + + data_table.c.data['some key'] + + data_table.c.data[5] + + + * Index operations returning text (the ``->>`` operator):: + + data_table.c.data['some key'].astext == 'some value' + + * Index operations with CAST + (equivalent to ``CAST(col ->> ['some key'] AS )``):: + + data_table.c.data['some key'].astext.cast(Integer) == 5 + + * Path index operations (the ``#>`` operator):: + + data_table.c.data[('key_1', 'key_2', 5, ..., 'key_n')] + + * Path index operations returning text (the ``#>>`` operator):: + + data_table.c.data[('key_1', 'key_2', 5, ..., 'key_n')].astext == \ +'some value' + + .. versionchanged:: 1.1 The :meth:`.ColumnElement.cast` operator on + JSON objects now requires that the :attr:`.JSON.Comparator.astext` + modifier be called explicitly, if the cast works only from a textual + string. + + Index operations return an expression object whose type defaults to + :class:`.JSON` by default, so that further JSON-oriented instructions + may be called upon the result type. + + Custom serializers and deserializers are specified at the dialect level, + that is using :func:`.create_engine`. The reason for this is that when + using psycopg2, the DBAPI only allows serializers at the per-cursor + or per-connection level. E.g.:: + + engine = create_engine("postgresql://scott:tiger@localhost/test", + json_serializer=my_serialize_fn, + json_deserializer=my_deserialize_fn + ) + + When using the psycopg2 dialect, the json_deserializer is registered + against the database using ``psycopg2.extras.register_default_json``. + + .. seealso:: + + :class:`.types.JSON` - Core level JSON type + + :class:`.JSONB` + + """ + + astext_type = sqltypes.Text() + + def __init__(self, none_as_null=False, astext_type=None): + """Construct a :class:`.JSON` type. + + :param none_as_null: if True, persist the value ``None`` as a + SQL NULL value, not the JSON encoding of ``null``. Note that + when this flag is False, the :func:`.null` construct can still + be used to persist a NULL value:: + + from sqlalchemy import null + conn.execute(table.insert(), data=null()) + + .. versionchanged:: 0.9.8 - Added ``none_as_null``, and :func:`.null` + is now supported in order to persist a NULL value. + + .. seealso:: + + :attr:`.JSON.NULL` + + :param astext_type: the type to use for the + :attr:`.JSON.Comparator.astext` + accessor on indexed attributes. Defaults to :class:`.types.Text`. + + .. versionadded:: 1.1 + + """ + super(JSON, self).__init__(none_as_null=none_as_null) + if astext_type is not None: + self.astext_type = astext_type + + class Comparator(sqltypes.JSON.Comparator): + """Define comparison operations for :class:`.JSON`.""" + + @property + def astext(self): + """On an indexed expression, use the "astext" (e.g. "->>") + conversion when rendered in SQL. + + E.g.:: + + select([data_table.c.data['some key'].astext]) + + .. seealso:: + + :meth:`.ColumnElement.cast` + + """ + + if isinstance(self.expr.right.type, sqltypes.JSON.JSONPathType): + return self.expr.left.operate( + JSONPATH_ASTEXT, + self.expr.right, result_type=self.type.astext_type) + else: + return self.expr.left.operate( + ASTEXT, self.expr.right, result_type=self.type.astext_type) + + comparator_factory = Comparator + + +colspecs[sqltypes.JSON] = JSON +ischema_names['json'] = JSON + + +class JSONB(JSON): + """Represent the PostgreSQL JSONB type. + + The :class:`.JSONB` type stores arbitrary JSONB format data, e.g.:: + + data_table = Table('data_table', metadata, + Column('id', Integer, primary_key=True), + Column('data', JSONB) + ) + + with engine.connect() as conn: + conn.execute( + data_table.insert(), + data = {"key1": "value1", "key2": "value2"} + ) + + The :class:`.JSONB` type includes all operations provided by + :class:`.JSON`, including the same behaviors for indexing operations. + It also adds additional operators specific to JSONB, including + :meth:`.JSONB.Comparator.has_key`, :meth:`.JSONB.Comparator.has_all`, + :meth:`.JSONB.Comparator.has_any`, :meth:`.JSONB.Comparator.contains`, + and :meth:`.JSONB.Comparator.contained_by`. + + Like the :class:`.JSON` type, the :class:`.JSONB` type does not detect + in-place changes when used with the ORM, unless the + :mod:`sqlalchemy.ext.mutable` extension is used. + + Custom serializers and deserializers + are shared with the :class:`.JSON` class, using the ``json_serializer`` + and ``json_deserializer`` keyword arguments. These must be specified + at the dialect level using :func:`.create_engine`. When using + psycopg2, the serializers are associated with the jsonb type using + ``psycopg2.extras.register_default_jsonb`` on a per-connection basis, + in the same way that ``psycopg2.extras.register_default_json`` is used + to register these handlers with the json type. + + .. versionadded:: 0.9.7 + + .. seealso:: + + :class:`.JSON` + + """ + + __visit_name__ = 'JSONB' + + class Comparator(JSON.Comparator): + """Define comparison operations for :class:`.JSON`.""" + + def has_key(self, other): + """Boolean expression. Test for presence of a key. Note that the + key may be a SQLA expression. + """ + return self.operate(HAS_KEY, other, result_type=sqltypes.Boolean) + + def has_all(self, other): + """Boolean expression. Test for presence of all keys in jsonb + """ + return self.operate(HAS_ALL, other, result_type=sqltypes.Boolean) + + def has_any(self, other): + """Boolean expression. Test for presence of any key in jsonb + """ + return self.operate(HAS_ANY, other, result_type=sqltypes.Boolean) + + def contains(self, other, **kwargs): + """Boolean expression. Test if keys (or array) are a superset + of/contained the keys of the argument jsonb expression. + """ + return self.operate(CONTAINS, other, result_type=sqltypes.Boolean) + + def contained_by(self, other): + """Boolean expression. Test if keys are a proper subset of the + keys of the argument jsonb expression. + """ + return self.operate( + CONTAINED_BY, other, result_type=sqltypes.Boolean) + + comparator_factory = Comparator + +ischema_names['jsonb'] = JSONB diff --git a/app/lib/sqlalchemy/dialects/postgresql/pg8000.py b/app/lib/sqlalchemy/dialects/postgresql/pg8000.py new file mode 100644 index 0000000..8c019a2 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/pg8000.py @@ -0,0 +1,265 @@ +# postgresql/pg8000.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: postgresql+pg8000 + :name: pg8000 + :dbapi: pg8000 + :connectstring: \ +postgresql+pg8000://user:password@host:port/dbname[?key=value&key=value...] + :url: https://pythonhosted.org/pg8000/ + + +.. _pg8000_unicode: + +Unicode +------- + +pg8000 will encode / decode string values between it and the server using the +PostgreSQL ``client_encoding`` parameter; by default this is the value in +the ``postgresql.conf`` file, which often defaults to ``SQL_ASCII``. +Typically, this can be changed to ``utf-8``, as a more useful default:: + + #client_encoding = sql_ascii # actually, defaults to database + # encoding + client_encoding = utf8 + +The ``client_encoding`` can be overridden for a session by executing the SQL: + +SET CLIENT_ENCODING TO 'utf8'; + +SQLAlchemy will execute this SQL on all new connections based on the value +passed to :func:`.create_engine` using the ``client_encoding`` parameter:: + + engine = create_engine( + "postgresql+pg8000://user:pass@host/dbname", client_encoding='utf8') + + +.. _pg8000_isolation_level: + +pg8000 Transaction Isolation Level +------------------------------------- + +The pg8000 dialect offers the same isolation level settings as that +of the :ref:`psycopg2 ` dialect: + +* ``READ COMMITTED`` +* ``READ UNCOMMITTED`` +* ``REPEATABLE READ`` +* ``SERIALIZABLE`` +* ``AUTOCOMMIT`` + +.. versionadded:: 0.9.5 support for AUTOCOMMIT isolation level when using + pg8000. + +.. seealso:: + + :ref:`postgresql_isolation_level` + + :ref:`psycopg2_isolation_level` + + +""" +from ... import util, exc +import decimal +from ... import processors +from ... import types as sqltypes +from .base import ( + PGDialect, PGCompiler, PGIdentifierPreparer, PGExecutionContext, + _DECIMAL_TYPES, _FLOAT_TYPES, _INT_TYPES) +import re +from sqlalchemy.dialects.postgresql.json import JSON + + +class _PGNumeric(sqltypes.Numeric): + def result_processor(self, dialect, coltype): + if self.asdecimal: + if coltype in _FLOAT_TYPES: + return processors.to_decimal_processor_factory( + decimal.Decimal, self._effective_decimal_return_scale) + elif coltype in _DECIMAL_TYPES or coltype in _INT_TYPES: + # pg8000 returns Decimal natively for 1700 + return None + else: + raise exc.InvalidRequestError( + "Unknown PG numeric type: %d" % coltype) + else: + if coltype in _FLOAT_TYPES: + # pg8000 returns float natively for 701 + return None + elif coltype in _DECIMAL_TYPES or coltype in _INT_TYPES: + return processors.to_float + else: + raise exc.InvalidRequestError( + "Unknown PG numeric type: %d" % coltype) + + +class _PGNumericNoBind(_PGNumeric): + def bind_processor(self, dialect): + return None + + +class _PGJSON(JSON): + + def result_processor(self, dialect, coltype): + if dialect._dbapi_version > (1, 10, 1): + return None # Has native JSON + else: + return super(_PGJSON, self).result_processor(dialect, coltype) + + +class PGExecutionContext_pg8000(PGExecutionContext): + pass + + +class PGCompiler_pg8000(PGCompiler): + def visit_mod_binary(self, binary, operator, **kw): + return self.process(binary.left, **kw) + " %% " + \ + self.process(binary.right, **kw) + + def post_process_text(self, text): + if '%%' in text: + util.warn("The SQLAlchemy postgresql dialect " + "now automatically escapes '%' in text() " + "expressions to '%%'.") + return text.replace('%', '%%') + + +class PGIdentifierPreparer_pg8000(PGIdentifierPreparer): + def _escape_identifier(self, value): + value = value.replace(self.escape_quote, self.escape_to_quote) + return value.replace('%', '%%') + + +class PGDialect_pg8000(PGDialect): + driver = 'pg8000' + + supports_unicode_statements = True + + supports_unicode_binds = True + + default_paramstyle = 'format' + supports_sane_multi_rowcount = True + execution_ctx_cls = PGExecutionContext_pg8000 + statement_compiler = PGCompiler_pg8000 + preparer = PGIdentifierPreparer_pg8000 + description_encoding = 'use_encoding' + + colspecs = util.update_copy( + PGDialect.colspecs, + { + sqltypes.Numeric: _PGNumericNoBind, + sqltypes.Float: _PGNumeric, + JSON: _PGJSON, + sqltypes.JSON: _PGJSON + } + ) + + def __init__(self, client_encoding=None, **kwargs): + PGDialect.__init__(self, **kwargs) + self.client_encoding = client_encoding + + def initialize(self, connection): + self.supports_sane_multi_rowcount = self._dbapi_version >= (1, 9, 14) + super(PGDialect_pg8000, self).initialize(connection) + + @util.memoized_property + def _dbapi_version(self): + if self.dbapi and hasattr(self.dbapi, '__version__'): + return tuple( + [ + int(x) for x in re.findall( + r'(\d+)(?:[-\.]?|$)', self.dbapi.__version__)]) + else: + return (99, 99, 99) + + @classmethod + def dbapi(cls): + return __import__('pg8000') + + def create_connect_args(self, url): + opts = url.translate_connect_args(username='user') + if 'port' in opts: + opts['port'] = int(opts['port']) + opts.update(url.query) + return ([], opts) + + def is_disconnect(self, e, connection, cursor): + return "connection is closed" in str(e) + + def set_isolation_level(self, connection, level): + level = level.replace('_', ' ') + + # adjust for ConnectionFairy possibly being present + if hasattr(connection, 'connection'): + connection = connection.connection + + if level == 'AUTOCOMMIT': + connection.autocommit = True + elif level in self._isolation_lookup: + connection.autocommit = False + cursor = connection.cursor() + cursor.execute( + "SET SESSION CHARACTERISTICS AS TRANSACTION " + "ISOLATION LEVEL %s" % level) + cursor.execute("COMMIT") + cursor.close() + else: + raise exc.ArgumentError( + "Invalid value '%s' for isolation_level. " + "Valid isolation levels for %s are %s or AUTOCOMMIT" % + (level, self.name, ", ".join(self._isolation_lookup)) + ) + + def set_client_encoding(self, connection, client_encoding): + # adjust for ConnectionFairy possibly being present + if hasattr(connection, 'connection'): + connection = connection.connection + + cursor = connection.cursor() + cursor.execute("SET CLIENT_ENCODING TO '" + client_encoding + "'") + cursor.execute("COMMIT") + cursor.close() + + def do_begin_twophase(self, connection, xid): + connection.connection.tpc_begin((0, xid, '')) + + def do_prepare_twophase(self, connection, xid): + connection.connection.tpc_prepare() + + def do_rollback_twophase( + self, connection, xid, is_prepared=True, recover=False): + connection.connection.tpc_rollback((0, xid, '')) + + def do_commit_twophase( + self, connection, xid, is_prepared=True, recover=False): + connection.connection.tpc_commit((0, xid, '')) + + def do_recover_twophase(self, connection): + return [row[1] for row in connection.connection.tpc_recover()] + + def on_connect(self): + fns = [] + if self.client_encoding is not None: + def on_connect(conn): + self.set_client_encoding(conn, self.client_encoding) + fns.append(on_connect) + + if self.isolation_level is not None: + def on_connect(conn): + self.set_isolation_level(conn, self.isolation_level) + fns.append(on_connect) + + if len(fns) > 0: + def on_connect(conn): + for fn in fns: + fn(conn) + return on_connect + else: + return None + +dialect = PGDialect_pg8000 diff --git a/app/lib/sqlalchemy/dialects/postgresql/psycopg2.py b/app/lib/sqlalchemy/dialects/postgresql/psycopg2.py new file mode 100644 index 0000000..5032814 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/psycopg2.py @@ -0,0 +1,702 @@ +# postgresql/psycopg2.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: postgresql+psycopg2 + :name: psycopg2 + :dbapi: psycopg2 + :connectstring: postgresql+psycopg2://user:password@host:port/dbname\ +[?key=value&key=value...] + :url: http://pypi.python.org/pypi/psycopg2/ + +psycopg2 Connect Arguments +----------------------------------- + +psycopg2-specific keyword arguments which are accepted by +:func:`.create_engine()` are: + +* ``server_side_cursors``: Enable the usage of "server side cursors" for SQL + statements which support this feature. What this essentially means from a + psycopg2 point of view is that the cursor is created using a name, e.g. + ``connection.cursor('some name')``, which has the effect that result rows + are not immediately pre-fetched and buffered after statement execution, but + are instead left on the server and only retrieved as needed. SQLAlchemy's + :class:`~sqlalchemy.engine.ResultProxy` uses special row-buffering + behavior when this feature is enabled, such that groups of 100 rows at a + time are fetched over the wire to reduce conversational overhead. + Note that the :paramref:`.Connection.execution_options.stream_results` + execution option is a more targeted + way of enabling this mode on a per-execution basis. +* ``use_native_unicode``: Enable the usage of Psycopg2 "native unicode" mode + per connection. True by default. + + .. seealso:: + + :ref:`psycopg2_disable_native_unicode` + +* ``isolation_level``: This option, available for all PostgreSQL dialects, + includes the ``AUTOCOMMIT`` isolation level when using the psycopg2 + dialect. + + .. seealso:: + + :ref:`psycopg2_isolation_level` + +* ``client_encoding``: sets the client encoding in a libpq-agnostic way, + using psycopg2's ``set_client_encoding()`` method. + + .. seealso:: + + :ref:`psycopg2_unicode` + +Unix Domain Connections +------------------------ + +psycopg2 supports connecting via Unix domain connections. When the ``host`` +portion of the URL is omitted, SQLAlchemy passes ``None`` to psycopg2, +which specifies Unix-domain communication rather than TCP/IP communication:: + + create_engine("postgresql+psycopg2://user:password@/dbname") + +By default, the socket file used is to connect to a Unix-domain socket +in ``/tmp``, or whatever socket directory was specified when PostgreSQL +was built. This value can be overridden by passing a pathname to psycopg2, +using ``host`` as an additional keyword argument:: + + create_engine("postgresql+psycopg2://user:password@/dbname?\ +host=/var/lib/postgresql") + +See also: + +`PQconnectdbParams `_ + +.. _psycopg2_execution_options: + +Per-Statement/Connection Execution Options +------------------------------------------- + +The following DBAPI-specific options are respected when used with +:meth:`.Connection.execution_options`, :meth:`.Executable.execution_options`, +:meth:`.Query.execution_options`, in addition to those not specific to DBAPIs: + +* ``isolation_level`` - Set the transaction isolation level for the lifespan of a + :class:`.Connection` (can only be set on a connection, not a statement + or query). See :ref:`psycopg2_isolation_level`. + +* ``stream_results`` - Enable or disable usage of psycopg2 server side cursors - + this feature makes use of "named" cursors in combination with special + result handling methods so that result rows are not fully buffered. + If ``None`` or not set, the ``server_side_cursors`` option of the + :class:`.Engine` is used. + +* ``max_row_buffer`` - when using ``stream_results``, an integer value that + specifies the maximum number of rows to buffer at a time. This is + interpreted by the :class:`.BufferedRowResultProxy`, and if omitted the + buffer will grow to ultimately store 1000 rows at a time. + + .. versionadded:: 1.0.6 + +.. _psycopg2_unicode: + +Unicode with Psycopg2 +---------------------- + +By default, the psycopg2 driver uses the ``psycopg2.extensions.UNICODE`` +extension, such that the DBAPI receives and returns all strings as Python +Unicode objects directly - SQLAlchemy passes these values through without +change. Psycopg2 here will encode/decode string values based on the +current "client encoding" setting; by default this is the value in +the ``postgresql.conf`` file, which often defaults to ``SQL_ASCII``. +Typically, this can be changed to ``utf8``, as a more useful default:: + + # postgresql.conf file + + # client_encoding = sql_ascii # actually, defaults to database + # encoding + client_encoding = utf8 + +A second way to affect the client encoding is to set it within Psycopg2 +locally. SQLAlchemy will call psycopg2's +:meth:`psycopg2:connection.set_client_encoding` method +on all new connections based on the value passed to +:func:`.create_engine` using the ``client_encoding`` parameter:: + + # set_client_encoding() setting; + # works for *all* PostgreSQL versions + engine = create_engine("postgresql://user:pass@host/dbname", + client_encoding='utf8') + +This overrides the encoding specified in the PostgreSQL client configuration. +When using the parameter in this way, the psycopg2 driver emits +``SET client_encoding TO 'utf8'`` on the connection explicitly, and works +in all PostgreSQL versions. + +Note that the ``client_encoding`` setting as passed to :func:`.create_engine` +is **not the same** as the more recently added ``client_encoding`` parameter +now supported by libpq directly. This is enabled when ``client_encoding`` +is passed directly to ``psycopg2.connect()``, and from SQLAlchemy is passed +using the :paramref:`.create_engine.connect_args` parameter:: + + # libpq direct parameter setting; + # only works for PostgreSQL **9.1 and above** + engine = create_engine("postgresql://user:pass@host/dbname", + connect_args={'client_encoding': 'utf8'}) + + # using the query string is equivalent + engine = create_engine("postgresql://user:pass@host/dbname?client_encoding=utf8") + +The above parameter was only added to libpq as of version 9.1 of PostgreSQL, +so using the previous method is better for cross-version support. + +.. _psycopg2_disable_native_unicode: + +Disabling Native Unicode +^^^^^^^^^^^^^^^^^^^^^^^^ + +SQLAlchemy can also be instructed to skip the usage of the psycopg2 +``UNICODE`` extension and to instead utilize its own unicode encode/decode +services, which are normally reserved only for those DBAPIs that don't +fully support unicode directly. Passing ``use_native_unicode=False`` to +:func:`.create_engine` will disable usage of ``psycopg2.extensions.UNICODE``. +SQLAlchemy will instead encode data itself into Python bytestrings on the way +in and coerce from bytes on the way back, +using the value of the :func:`.create_engine` ``encoding`` parameter, which +defaults to ``utf-8``. +SQLAlchemy's own unicode encode/decode functionality is steadily becoming +obsolete as most DBAPIs now support unicode fully. + +Bound Parameter Styles +---------------------- + +The default parameter style for the psycopg2 dialect is "pyformat", where +SQL is rendered using ``%(paramname)s`` style. This format has the limitation +that it does not accommodate the unusual case of parameter names that +actually contain percent or parenthesis symbols; as SQLAlchemy in many cases +generates bound parameter names based on the name of a column, the presence +of these characters in a column name can lead to problems. + +There are two solutions to the issue of a :class:`.schema.Column` that contains +one of these characters in its name. One is to specify the +:paramref:`.schema.Column.key` for columns that have such names:: + + measurement = Table('measurement', metadata, + Column('Size (meters)', Integer, key='size_meters') + ) + +Above, an INSERT statement such as ``measurement.insert()`` will use +``size_meters`` as the parameter name, and a SQL expression such as +``measurement.c.size_meters > 10`` will derive the bound parameter name +from the ``size_meters`` key as well. + +.. versionchanged:: 1.0.0 - SQL expressions will use :attr:`.Column.key` + as the source of naming when anonymous bound parameters are created + in SQL expressions; previously, this behavior only applied to + :meth:`.Table.insert` and :meth:`.Table.update` parameter names. + +The other solution is to use a positional format; psycopg2 allows use of the +"format" paramstyle, which can be passed to +:paramref:`.create_engine.paramstyle`:: + + engine = create_engine( + 'postgresql://scott:tiger@localhost:5432/test', paramstyle='format') + +With the above engine, instead of a statement like:: + + INSERT INTO measurement ("Size (meters)") VALUES (%(Size (meters))s) + {'Size (meters)': 1} + +we instead see:: + + INSERT INTO measurement ("Size (meters)") VALUES (%s) + (1, ) + +Where above, the dictionary style is converted into a tuple with positional +style. + + +Transactions +------------ + +The psycopg2 dialect fully supports SAVEPOINT and two-phase commit operations. + +.. _psycopg2_isolation_level: + +Psycopg2 Transaction Isolation Level +------------------------------------- + +As discussed in :ref:`postgresql_isolation_level`, +all PostgreSQL dialects support setting of transaction isolation level +both via the ``isolation_level`` parameter passed to :func:`.create_engine`, +as well as the ``isolation_level`` argument used by +:meth:`.Connection.execution_options`. When using the psycopg2 dialect, these +options make use of psycopg2's ``set_isolation_level()`` connection method, +rather than emitting a PostgreSQL directive; this is because psycopg2's +API-level setting is always emitted at the start of each transaction in any +case. + +The psycopg2 dialect supports these constants for isolation level: + +* ``READ COMMITTED`` +* ``READ UNCOMMITTED`` +* ``REPEATABLE READ`` +* ``SERIALIZABLE`` +* ``AUTOCOMMIT`` + +.. versionadded:: 0.8.2 support for AUTOCOMMIT isolation level when using + psycopg2. + +.. seealso:: + + :ref:`postgresql_isolation_level` + + :ref:`pg8000_isolation_level` + + +NOTICE logging +--------------- + +The psycopg2 dialect will log PostgreSQL NOTICE messages via the +``sqlalchemy.dialects.postgresql`` logger:: + + import logging + logging.getLogger('sqlalchemy.dialects.postgresql').setLevel(logging.INFO) + +.. _psycopg2_hstore:: + +HSTORE type +------------ + +The ``psycopg2`` DBAPI includes an extension to natively handle marshalling of +the HSTORE type. The SQLAlchemy psycopg2 dialect will enable this extension +by default when psycopg2 version 2.4 or greater is used, and +it is detected that the target database has the HSTORE type set up for use. +In other words, when the dialect makes the first +connection, a sequence like the following is performed: + +1. Request the available HSTORE oids using + ``psycopg2.extras.HstoreAdapter.get_oids()``. + If this function returns a list of HSTORE identifiers, we then determine + that the ``HSTORE`` extension is present. + This function is **skipped** if the version of psycopg2 installed is + less than version 2.4. + +2. If the ``use_native_hstore`` flag is at its default of ``True``, and + we've detected that ``HSTORE`` oids are available, the + ``psycopg2.extensions.register_hstore()`` extension is invoked for all + connections. + +The ``register_hstore()`` extension has the effect of **all Python +dictionaries being accepted as parameters regardless of the type of target +column in SQL**. The dictionaries are converted by this extension into a +textual HSTORE expression. If this behavior is not desired, disable the +use of the hstore extension by setting ``use_native_hstore`` to ``False`` as +follows:: + + engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test", + use_native_hstore=False) + +The ``HSTORE`` type is **still supported** when the +``psycopg2.extensions.register_hstore()`` extension is not used. It merely +means that the coercion between Python dictionaries and the HSTORE +string format, on both the parameter side and the result side, will take +place within SQLAlchemy's own marshalling logic, and not that of ``psycopg2`` +which may be more performant. + +""" +from __future__ import absolute_import + +import re +import logging + +from ... import util, exc +import decimal +from ... import processors +from ...engine import result as _result +from ...sql import expression +from ... import types as sqltypes +from .base import PGDialect, PGCompiler, \ + PGIdentifierPreparer, PGExecutionContext, \ + ENUM, _DECIMAL_TYPES, _FLOAT_TYPES,\ + _INT_TYPES, UUID +from .hstore import HSTORE +from .json import JSON, JSONB + +try: + from uuid import UUID as _python_UUID +except ImportError: + _python_UUID = None + + +logger = logging.getLogger('sqlalchemy.dialects.postgresql') + + +class _PGNumeric(sqltypes.Numeric): + def bind_processor(self, dialect): + return None + + def result_processor(self, dialect, coltype): + if self.asdecimal: + if coltype in _FLOAT_TYPES: + return processors.to_decimal_processor_factory( + decimal.Decimal, + self._effective_decimal_return_scale) + elif coltype in _DECIMAL_TYPES or coltype in _INT_TYPES: + # pg8000 returns Decimal natively for 1700 + return None + else: + raise exc.InvalidRequestError( + "Unknown PG numeric type: %d" % coltype) + else: + if coltype in _FLOAT_TYPES: + # pg8000 returns float natively for 701 + return None + elif coltype in _DECIMAL_TYPES or coltype in _INT_TYPES: + return processors.to_float + else: + raise exc.InvalidRequestError( + "Unknown PG numeric type: %d" % coltype) + + +class _PGEnum(ENUM): + def result_processor(self, dialect, coltype): + if self.native_enum and util.py2k and self.convert_unicode is True: + # we can't easily use PG's extensions here because + # the OID is on the fly, and we need to give it a python + # function anyway - not really worth it. + self.convert_unicode = "force_nocheck" + return super(_PGEnum, self).result_processor(dialect, coltype) + + +class _PGHStore(HSTORE): + def bind_processor(self, dialect): + if dialect._has_native_hstore: + return None + else: + return super(_PGHStore, self).bind_processor(dialect) + + def result_processor(self, dialect, coltype): + if dialect._has_native_hstore: + return None + else: + return super(_PGHStore, self).result_processor(dialect, coltype) + + +class _PGJSON(JSON): + + def result_processor(self, dialect, coltype): + if dialect._has_native_json: + return None + else: + return super(_PGJSON, self).result_processor(dialect, coltype) + + +class _PGJSONB(JSONB): + + def result_processor(self, dialect, coltype): + if dialect._has_native_jsonb: + return None + else: + return super(_PGJSONB, self).result_processor(dialect, coltype) + + +class _PGUUID(UUID): + def bind_processor(self, dialect): + if not self.as_uuid and dialect.use_native_uuid: + nonetype = type(None) + + def process(value): + if value is not None: + value = _python_UUID(value) + return value + return process + + def result_processor(self, dialect, coltype): + if not self.as_uuid and dialect.use_native_uuid: + def process(value): + if value is not None: + value = str(value) + return value + return process + + +_server_side_id = util.counter() + + +class PGExecutionContext_psycopg2(PGExecutionContext): + def create_server_side_cursor(self): + # use server-side cursors: + # http://lists.initd.org/pipermail/psycopg/2007-January/005251.html + ident = "c_%s_%s" % (hex(id(self))[2:], + hex(_server_side_id())[2:]) + return self._dbapi_connection.cursor(ident) + + def get_result_proxy(self): + # TODO: ouch + if logger.isEnabledFor(logging.INFO): + self._log_notices(self.cursor) + + if self._is_server_side: + return _result.BufferedRowResultProxy(self) + else: + return _result.ResultProxy(self) + + def _log_notices(self, cursor): + for notice in cursor.connection.notices: + # NOTICE messages have a + # newline character at the end + logger.info(notice.rstrip()) + + cursor.connection.notices[:] = [] + + +class PGCompiler_psycopg2(PGCompiler): + def visit_mod_binary(self, binary, operator, **kw): + return self.process(binary.left, **kw) + " %% " + \ + self.process(binary.right, **kw) + + def post_process_text(self, text): + return text.replace('%', '%%') + + +class PGIdentifierPreparer_psycopg2(PGIdentifierPreparer): + def _escape_identifier(self, value): + value = value.replace(self.escape_quote, self.escape_to_quote) + return value.replace('%', '%%') + + +class PGDialect_psycopg2(PGDialect): + driver = 'psycopg2' + if util.py2k: + supports_unicode_statements = False + + supports_server_side_cursors = True + + default_paramstyle = 'pyformat' + # set to true based on psycopg2 version + supports_sane_multi_rowcount = False + execution_ctx_cls = PGExecutionContext_psycopg2 + statement_compiler = PGCompiler_psycopg2 + preparer = PGIdentifierPreparer_psycopg2 + psycopg2_version = (0, 0) + + FEATURE_VERSION_MAP = dict( + native_json=(2, 5), + native_jsonb=(2, 5, 4), + sane_multi_rowcount=(2, 0, 9), + array_oid=(2, 4, 3), + hstore_adapter=(2, 4) + ) + + _has_native_hstore = False + _has_native_json = False + _has_native_jsonb = False + + engine_config_types = PGDialect.engine_config_types.union([ + ('use_native_unicode', util.asbool), + ]) + + colspecs = util.update_copy( + PGDialect.colspecs, + { + sqltypes.Numeric: _PGNumeric, + ENUM: _PGEnum, # needs force_unicode + sqltypes.Enum: _PGEnum, # needs force_unicode + HSTORE: _PGHStore, + JSON: _PGJSON, + sqltypes.JSON: _PGJSON, + JSONB: _PGJSONB, + UUID: _PGUUID + } + ) + + def __init__(self, server_side_cursors=False, use_native_unicode=True, + client_encoding=None, + use_native_hstore=True, use_native_uuid=True, + **kwargs): + PGDialect.__init__(self, **kwargs) + self.server_side_cursors = server_side_cursors + self.use_native_unicode = use_native_unicode + self.use_native_hstore = use_native_hstore + self.use_native_uuid = use_native_uuid + self.supports_unicode_binds = use_native_unicode + self.client_encoding = client_encoding + if self.dbapi and hasattr(self.dbapi, '__version__'): + m = re.match(r'(\d+)\.(\d+)(?:\.(\d+))?', + self.dbapi.__version__) + if m: + self.psycopg2_version = tuple( + int(x) + for x in m.group(1, 2, 3) + if x is not None) + + def initialize(self, connection): + super(PGDialect_psycopg2, self).initialize(connection) + self._has_native_hstore = self.use_native_hstore and \ + self._hstore_oids(connection.connection) \ + is not None + self._has_native_json = \ + self.psycopg2_version >= self.FEATURE_VERSION_MAP['native_json'] + self._has_native_jsonb = \ + self.psycopg2_version >= self.FEATURE_VERSION_MAP['native_jsonb'] + + # http://initd.org/psycopg/docs/news.html#what-s-new-in-psycopg-2-0-9 + self.supports_sane_multi_rowcount = \ + self.psycopg2_version >= \ + self.FEATURE_VERSION_MAP['sane_multi_rowcount'] + + @classmethod + def dbapi(cls): + import psycopg2 + return psycopg2 + + @classmethod + def _psycopg2_extensions(cls): + from psycopg2 import extensions + return extensions + + @classmethod + def _psycopg2_extras(cls): + from psycopg2 import extras + return extras + + @util.memoized_property + def _isolation_lookup(self): + extensions = self._psycopg2_extensions() + return { + 'AUTOCOMMIT': extensions.ISOLATION_LEVEL_AUTOCOMMIT, + 'READ COMMITTED': extensions.ISOLATION_LEVEL_READ_COMMITTED, + 'READ UNCOMMITTED': extensions.ISOLATION_LEVEL_READ_UNCOMMITTED, + 'REPEATABLE READ': extensions.ISOLATION_LEVEL_REPEATABLE_READ, + 'SERIALIZABLE': extensions.ISOLATION_LEVEL_SERIALIZABLE + } + + def set_isolation_level(self, connection, level): + try: + level = self._isolation_lookup[level.replace('_', ' ')] + except KeyError: + raise exc.ArgumentError( + "Invalid value '%s' for isolation_level. " + "Valid isolation levels for %s are %s" % + (level, self.name, ", ".join(self._isolation_lookup)) + ) + + connection.set_isolation_level(level) + + def on_connect(self): + extras = self._psycopg2_extras() + extensions = self._psycopg2_extensions() + + fns = [] + if self.client_encoding is not None: + def on_connect(conn): + conn.set_client_encoding(self.client_encoding) + fns.append(on_connect) + + if self.isolation_level is not None: + def on_connect(conn): + self.set_isolation_level(conn, self.isolation_level) + fns.append(on_connect) + + if self.dbapi and self.use_native_uuid: + def on_connect(conn): + extras.register_uuid(None, conn) + fns.append(on_connect) + + if self.dbapi and self.use_native_unicode: + def on_connect(conn): + extensions.register_type(extensions.UNICODE, conn) + extensions.register_type(extensions.UNICODEARRAY, conn) + fns.append(on_connect) + + if self.dbapi and self.use_native_hstore: + def on_connect(conn): + hstore_oids = self._hstore_oids(conn) + if hstore_oids is not None: + oid, array_oid = hstore_oids + kw = {'oid': oid} + if util.py2k: + kw['unicode'] = True + if self.psycopg2_version >= \ + self.FEATURE_VERSION_MAP['array_oid']: + kw['array_oid'] = array_oid + extras.register_hstore(conn, **kw) + fns.append(on_connect) + + if self.dbapi and self._json_deserializer: + def on_connect(conn): + if self._has_native_json: + extras.register_default_json( + conn, loads=self._json_deserializer) + if self._has_native_jsonb: + extras.register_default_jsonb( + conn, loads=self._json_deserializer) + fns.append(on_connect) + + if fns: + def on_connect(conn): + for fn in fns: + fn(conn) + return on_connect + else: + return None + + @util.memoized_instancemethod + def _hstore_oids(self, conn): + if self.psycopg2_version >= self.FEATURE_VERSION_MAP['hstore_adapter']: + extras = self._psycopg2_extras() + oids = extras.HstoreAdapter.get_oids(conn) + if oids is not None and oids[0]: + return oids[0:2] + return None + + def create_connect_args(self, url): + opts = url.translate_connect_args(username='user') + if 'port' in opts: + opts['port'] = int(opts['port']) + opts.update(url.query) + return ([], opts) + + def is_disconnect(self, e, connection, cursor): + if isinstance(e, self.dbapi.Error): + # check the "closed" flag. this might not be + # present on old psycopg2 versions. Also, + # this flag doesn't actually help in a lot of disconnect + # situations, so don't rely on it. + if getattr(connection, 'closed', False): + return True + + # checks based on strings. in the case that .closed + # didn't cut it, fall back onto these. + str_e = str(e).partition("\n")[0] + for msg in [ + # these error messages from libpq: interfaces/libpq/fe-misc.c + # and interfaces/libpq/fe-secure.c. + 'terminating connection', + 'closed the connection', + 'connection not open', + 'could not receive data from server', + 'could not send data to server', + # psycopg2 client errors, psycopg2/conenction.h, + # psycopg2/cursor.h + 'connection already closed', + 'cursor already closed', + # not sure where this path is originally from, it may + # be obsolete. It really says "losed", not "closed". + 'losed the connection unexpectedly', + # these can occur in newer SSL + 'connection has been closed unexpectedly', + 'SSL SYSCALL error: Bad file descriptor', + 'SSL SYSCALL error: EOF detected', + 'SSL error: decryption failed or bad record mac', + ]: + idx = str_e.find(msg) + if idx >= 0 and '"' not in str_e[:idx]: + return True + return False + +dialect = PGDialect_psycopg2 diff --git a/app/lib/sqlalchemy/dialects/postgresql/psycopg2cffi.py b/app/lib/sqlalchemy/dialects/postgresql/psycopg2cffi.py new file mode 100644 index 0000000..e99389d --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/psycopg2cffi.py @@ -0,0 +1,61 @@ +# testing/engines.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +""" +.. dialect:: postgresql+psycopg2cffi + :name: psycopg2cffi + :dbapi: psycopg2cffi + :connectstring: \ +postgresql+psycopg2cffi://user:password@host:port/dbname\ +[?key=value&key=value...] + :url: http://pypi.python.org/pypi/psycopg2cffi/ + +``psycopg2cffi`` is an adaptation of ``psycopg2``, using CFFI for the C +layer. This makes it suitable for use in e.g. PyPy. Documentation +is as per ``psycopg2``. + +.. versionadded:: 1.0.0 + +.. seealso:: + + :mod:`sqlalchemy.dialects.postgresql.psycopg2` + +""" +from .psycopg2 import PGDialect_psycopg2 + + +class PGDialect_psycopg2cffi(PGDialect_psycopg2): + driver = 'psycopg2cffi' + supports_unicode_statements = True + + # psycopg2cffi's first release is 2.5.0, but reports + # __version__ as 2.4.4. Subsequent releases seem to have + # fixed this. + + FEATURE_VERSION_MAP = dict( + native_json=(2, 4, 4), + native_jsonb=(2, 7, 1), + sane_multi_rowcount=(2, 4, 4), + array_oid=(2, 4, 4), + hstore_adapter=(2, 4, 4) + ) + + @classmethod + def dbapi(cls): + return __import__('psycopg2cffi') + + @classmethod + def _psycopg2_extensions(cls): + root = __import__('psycopg2cffi', fromlist=['extensions']) + return root.extensions + + @classmethod + def _psycopg2_extras(cls): + root = __import__('psycopg2cffi', fromlist=['extras']) + return root.extras + + +dialect = PGDialect_psycopg2cffi diff --git a/app/lib/sqlalchemy/dialects/postgresql/pygresql.py b/app/lib/sqlalchemy/dialects/postgresql/pygresql.py new file mode 100644 index 0000000..aa877a2 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/pygresql.py @@ -0,0 +1,243 @@ +# postgresql/pygresql.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: postgresql+pygresql + :name: pygresql + :dbapi: pgdb + :connectstring: postgresql+pygresql://user:password@host:port/dbname\ +[?key=value&key=value...] + :url: http://www.pygresql.org/ +""" + +import decimal +import re + +from ... import exc, processors, util +from ...types import Numeric, JSON as Json +from ...sql.elements import Null +from .base import PGDialect, PGCompiler, PGIdentifierPreparer, \ + _DECIMAL_TYPES, _FLOAT_TYPES, _INT_TYPES, UUID +from .hstore import HSTORE +from .json import JSON, JSONB + + +class _PGNumeric(Numeric): + + def bind_processor(self, dialect): + return None + + def result_processor(self, dialect, coltype): + if not isinstance(coltype, int): + coltype = coltype.oid + if self.asdecimal: + if coltype in _FLOAT_TYPES: + return processors.to_decimal_processor_factory( + decimal.Decimal, + self._effective_decimal_return_scale) + elif coltype in _DECIMAL_TYPES or coltype in _INT_TYPES: + # PyGreSQL returns Decimal natively for 1700 (numeric) + return None + else: + raise exc.InvalidRequestError( + "Unknown PG numeric type: %d" % coltype) + else: + if coltype in _FLOAT_TYPES: + # PyGreSQL returns float natively for 701 (float8) + return None + elif coltype in _DECIMAL_TYPES or coltype in _INT_TYPES: + return processors.to_float + else: + raise exc.InvalidRequestError( + "Unknown PG numeric type: %d" % coltype) + + +class _PGHStore(HSTORE): + + def bind_processor(self, dialect): + if not dialect.has_native_hstore: + return super(_PGHStore, self).bind_processor(dialect) + hstore = dialect.dbapi.Hstore + def process(value): + if isinstance(value, dict): + return hstore(value) + return value + return process + + def result_processor(self, dialect, coltype): + if not dialect.has_native_hstore: + return super(_PGHStore, self).result_processor(dialect, coltype) + + +class _PGJSON(JSON): + + def bind_processor(self, dialect): + if not dialect.has_native_json: + return super(_PGJSON, self).bind_processor(dialect) + json = dialect.dbapi.Json + + def process(value): + if value is self.NULL: + value = None + elif isinstance(value, Null) or ( + value is None and self.none_as_null): + return None + if value is None or isinstance(value, (dict, list)): + return json(value) + return value + + return process + + def result_processor(self, dialect, coltype): + if not dialect.has_native_json: + return super(_PGJSON, self).result_processor(dialect, coltype) + + +class _PGJSONB(JSONB): + + def bind_processor(self, dialect): + if not dialect.has_native_json: + return super(_PGJSONB, self).bind_processor(dialect) + json = dialect.dbapi.Json + + def process(value): + if value is self.NULL: + value = None + elif isinstance(value, Null) or ( + value is None and self.none_as_null): + return None + if value is None or isinstance(value, (dict, list)): + return json(value) + return value + + return process + + def result_processor(self, dialect, coltype): + if not dialect.has_native_json: + return super(_PGJSONB, self).result_processor(dialect, coltype) + + +class _PGUUID(UUID): + + def bind_processor(self, dialect): + if not dialect.has_native_uuid: + return super(_PGUUID, self).bind_processor(dialect) + uuid = dialect.dbapi.Uuid + + def process(value): + if value is None: + return None + if isinstance(value, (str, bytes)): + if len(value) == 16: + return uuid(bytes=value) + return uuid(value) + if isinstance(value, int): + return uuid(int=value) + return value + + return process + + def result_processor(self, dialect, coltype): + if not dialect.has_native_uuid: + return super(_PGUUID, self).result_processor(dialect, coltype) + if not self.as_uuid: + def process(value): + if value is not None: + return str(value) + return process + + +class _PGCompiler(PGCompiler): + + def visit_mod_binary(self, binary, operator, **kw): + return self.process(binary.left, **kw) + " %% " + \ + self.process(binary.right, **kw) + + def post_process_text(self, text): + return text.replace('%', '%%') + + +class _PGIdentifierPreparer(PGIdentifierPreparer): + + def _escape_identifier(self, value): + value = value.replace(self.escape_quote, self.escape_to_quote) + return value.replace('%', '%%') + + +class PGDialect_pygresql(PGDialect): + + driver = 'pygresql' + + statement_compiler = _PGCompiler + preparer = _PGIdentifierPreparer + + @classmethod + def dbapi(cls): + import pgdb + return pgdb + + colspecs = util.update_copy( + PGDialect.colspecs, + { + Numeric: _PGNumeric, + HSTORE: _PGHStore, + Json: _PGJSON, + JSON: _PGJSON, + JSONB: _PGJSONB, + UUID: _PGUUID, + } + ) + + def __init__(self, **kwargs): + super(PGDialect_pygresql, self).__init__(**kwargs) + try: + version = self.dbapi.version + m = re.match(r'(\d+)\.(\d+)', version) + version = (int(m.group(1)), int(m.group(2))) + except (AttributeError, ValueError, TypeError): + version = (0, 0) + self.dbapi_version = version + if version < (5, 0): + has_native_hstore = has_native_json = has_native_uuid = False + if version != (0, 0): + util.warn("PyGreSQL is only fully supported by SQLAlchemy" + " since version 5.0.") + else: + self.supports_unicode_statements = True + self.supports_unicode_binds = True + has_native_hstore = has_native_json = has_native_uuid = True + self.has_native_hstore = has_native_hstore + self.has_native_json = has_native_json + self.has_native_uuid = has_native_uuid + + def create_connect_args(self, url): + opts = url.translate_connect_args(username='user') + if 'port' in opts: + opts['host'] = '%s:%s' % ( + opts.get('host', '').rsplit(':', 1)[0], opts.pop('port')) + opts.update(url.query) + return [], opts + + def is_disconnect(self, e, connection, cursor): + if isinstance(e, self.dbapi.Error): + if not connection: + return False + try: + connection = connection.connection + except AttributeError: + pass + else: + if not connection: + return False + try: + return connection.closed + except AttributeError: # PyGreSQL < 5.0 + return connection._cnx is None + return False + + +dialect = PGDialect_pygresql diff --git a/app/lib/sqlalchemy/dialects/postgresql/pypostgresql.py b/app/lib/sqlalchemy/dialects/postgresql/pypostgresql.py new file mode 100644 index 0000000..ab77493 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/pypostgresql.py @@ -0,0 +1,97 @@ +# postgresql/pypostgresql.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: postgresql+pypostgresql + :name: py-postgresql + :dbapi: pypostgresql + :connectstring: postgresql+pypostgresql://user:password@host:port/dbname\ +[?key=value&key=value...] + :url: http://python.projects.pgfoundry.org/ + + +""" +from ... import util +from ... import types as sqltypes +from .base import PGDialect, PGExecutionContext +from ... import processors + + +class PGNumeric(sqltypes.Numeric): + def bind_processor(self, dialect): + return processors.to_str + + def result_processor(self, dialect, coltype): + if self.asdecimal: + return None + else: + return processors.to_float + + +class PGExecutionContext_pypostgresql(PGExecutionContext): + pass + + +class PGDialect_pypostgresql(PGDialect): + driver = 'pypostgresql' + + supports_unicode_statements = True + supports_unicode_binds = True + description_encoding = None + default_paramstyle = 'pyformat' + + # requires trunk version to support sane rowcounts + # TODO: use dbapi version information to set this flag appropriately + supports_sane_rowcount = True + supports_sane_multi_rowcount = False + + execution_ctx_cls = PGExecutionContext_pypostgresql + colspecs = util.update_copy( + PGDialect.colspecs, + { + sqltypes.Numeric: PGNumeric, + + # prevents PGNumeric from being used + sqltypes.Float: sqltypes.Float, + } + ) + + @classmethod + def dbapi(cls): + from postgresql.driver import dbapi20 + return dbapi20 + + _DBAPI_ERROR_NAMES = [ + "Error", + "InterfaceError", "DatabaseError", "DataError", + "OperationalError", "IntegrityError", "InternalError", + "ProgrammingError", "NotSupportedError" + ] + + @util.memoized_property + def dbapi_exception_translation_map(self): + if self.dbapi is None: + return {} + + return dict( + (getattr(self.dbapi, name).__name__, name) + for name in self._DBAPI_ERROR_NAMES + ) + + def create_connect_args(self, url): + opts = url.translate_connect_args(username='user') + if 'port' in opts: + opts['port'] = int(opts['port']) + else: + opts['port'] = 5432 + opts.update(url.query) + return ([], opts) + + def is_disconnect(self, e, connection, cursor): + return "connection is closed" in str(e) + +dialect = PGDialect_pypostgresql diff --git a/app/lib/sqlalchemy/dialects/postgresql/ranges.py b/app/lib/sqlalchemy/dialects/postgresql/ranges.py new file mode 100644 index 0000000..e7f7da4 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/ranges.py @@ -0,0 +1,168 @@ +# Copyright (C) 2013-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from .base import ischema_names +from ... import types as sqltypes + +__all__ = ('INT4RANGE', 'INT8RANGE', 'NUMRANGE') + + +class RangeOperators(object): + """ + This mixin provides functionality for the Range Operators + listed in Table 9-44 of the `postgres documentation`__ for Range + Functions and Operators. It is used by all the range types + provided in the ``postgres`` dialect and can likely be used for + any range types you create yourself. + + __ http://www.postgresql.org/docs/devel/static/functions-range.html + + No extra support is provided for the Range Functions listed in + Table 9-45 of the postgres documentation. For these, the normal + :func:`~sqlalchemy.sql.expression.func` object should be used. + + .. versionadded:: 0.8.2 Support for PostgreSQL RANGE operations. + + """ + + class comparator_factory(sqltypes.Concatenable.Comparator): + """Define comparison operations for range types.""" + + def __ne__(self, other): + "Boolean expression. Returns true if two ranges are not equal" + return self.expr.op('<>')(other) + + def contains(self, other, **kw): + """Boolean expression. Returns true if the right hand operand, + which can be an element or a range, is contained within the + column. + """ + return self.expr.op('@>')(other) + + def contained_by(self, other): + """Boolean expression. Returns true if the column is contained + within the right hand operand. + """ + return self.expr.op('<@')(other) + + def overlaps(self, other): + """Boolean expression. Returns true if the column overlaps + (has points in common with) the right hand operand. + """ + return self.expr.op('&&')(other) + + def strictly_left_of(self, other): + """Boolean expression. Returns true if the column is strictly + left of the right hand operand. + """ + return self.expr.op('<<')(other) + + __lshift__ = strictly_left_of + + def strictly_right_of(self, other): + """Boolean expression. Returns true if the column is strictly + right of the right hand operand. + """ + return self.expr.op('>>')(other) + + __rshift__ = strictly_right_of + + def not_extend_right_of(self, other): + """Boolean expression. Returns true if the range in the column + does not extend right of the range in the operand. + """ + return self.expr.op('&<')(other) + + def not_extend_left_of(self, other): + """Boolean expression. Returns true if the range in the column + does not extend left of the range in the operand. + """ + return self.expr.op('&>')(other) + + def adjacent_to(self, other): + """Boolean expression. Returns true if the range in the column + is adjacent to the range in the operand. + """ + return self.expr.op('-|-')(other) + + def __add__(self, other): + """Range expression. Returns the union of the two ranges. + Will raise an exception if the resulting range is not + contigous. + """ + return self.expr.op('+')(other) + + +class INT4RANGE(RangeOperators, sqltypes.TypeEngine): + """Represent the PostgreSQL INT4RANGE type. + + .. versionadded:: 0.8.2 + + """ + + __visit_name__ = 'INT4RANGE' + +ischema_names['int4range'] = INT4RANGE + + +class INT8RANGE(RangeOperators, sqltypes.TypeEngine): + """Represent the PostgreSQL INT8RANGE type. + + .. versionadded:: 0.8.2 + + """ + + __visit_name__ = 'INT8RANGE' + +ischema_names['int8range'] = INT8RANGE + + +class NUMRANGE(RangeOperators, sqltypes.TypeEngine): + """Represent the PostgreSQL NUMRANGE type. + + .. versionadded:: 0.8.2 + + """ + + __visit_name__ = 'NUMRANGE' + +ischema_names['numrange'] = NUMRANGE + + +class DATERANGE(RangeOperators, sqltypes.TypeEngine): + """Represent the PostgreSQL DATERANGE type. + + .. versionadded:: 0.8.2 + + """ + + __visit_name__ = 'DATERANGE' + +ischema_names['daterange'] = DATERANGE + + +class TSRANGE(RangeOperators, sqltypes.TypeEngine): + """Represent the PostgreSQL TSRANGE type. + + .. versionadded:: 0.8.2 + + """ + + __visit_name__ = 'TSRANGE' + +ischema_names['tsrange'] = TSRANGE + + +class TSTZRANGE(RangeOperators, sqltypes.TypeEngine): + """Represent the PostgreSQL TSTZRANGE type. + + .. versionadded:: 0.8.2 + + """ + + __visit_name__ = 'TSTZRANGE' + +ischema_names['tstzrange'] = TSTZRANGE diff --git a/app/lib/sqlalchemy/dialects/postgresql/zxjdbc.py b/app/lib/sqlalchemy/dialects/postgresql/zxjdbc.py new file mode 100644 index 0000000..f3cfbb8 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/postgresql/zxjdbc.py @@ -0,0 +1,46 @@ +# postgresql/zxjdbc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: postgresql+zxjdbc + :name: zxJDBC for Jython + :dbapi: zxjdbc + :connectstring: postgresql+zxjdbc://scott:tiger@localhost/db + :driverurl: http://jdbc.postgresql.org/ + + +""" +from ...connectors.zxJDBC import ZxJDBCConnector +from .base import PGDialect, PGExecutionContext + + +class PGExecutionContext_zxjdbc(PGExecutionContext): + + def create_cursor(self): + cursor = self._dbapi_connection.cursor() + cursor.datahandler = self.dialect.DataHandler(cursor.datahandler) + return cursor + + +class PGDialect_zxjdbc(ZxJDBCConnector, PGDialect): + jdbc_db_name = 'postgresql' + jdbc_driver_name = 'org.postgresql.Driver' + + execution_ctx_cls = PGExecutionContext_zxjdbc + + supports_native_decimal = True + + def __init__(self, *args, **kwargs): + super(PGDialect_zxjdbc, self).__init__(*args, **kwargs) + from com.ziclix.python.sql.handler import PostgresqlDataHandler + self.DataHandler = PostgresqlDataHandler + + def _get_server_version_info(self, connection): + parts = connection.connection.dbversion.split('.') + return tuple(int(x) for x in parts) + +dialect = PGDialect_zxjdbc diff --git a/app/lib/sqlalchemy/dialects/sqlite/__init__.py b/app/lib/sqlalchemy/dialects/sqlite/__init__.py new file mode 100644 index 0000000..a0ec025 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/sqlite/__init__.py @@ -0,0 +1,20 @@ +# sqlite/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from sqlalchemy.dialects.sqlite import base, pysqlite, pysqlcipher + +# default dialect +base.dialect = pysqlite.dialect + +from sqlalchemy.dialects.sqlite.base import ( + BLOB, BOOLEAN, CHAR, DATE, DATETIME, DECIMAL, FLOAT, INTEGER, REAL, + NUMERIC, SMALLINT, TEXT, TIME, TIMESTAMP, VARCHAR, dialect, +) + +__all__ = ('BLOB', 'BOOLEAN', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', + 'FLOAT', 'INTEGER', 'NUMERIC', 'SMALLINT', 'TEXT', 'TIME', + 'TIMESTAMP', 'VARCHAR', 'REAL', 'dialect') diff --git a/app/lib/sqlalchemy/dialects/sqlite/base.py b/app/lib/sqlalchemy/dialects/sqlite/base.py new file mode 100644 index 0000000..76193ff --- /dev/null +++ b/app/lib/sqlalchemy/dialects/sqlite/base.py @@ -0,0 +1,1577 @@ +# sqlite/base.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +r""" +.. dialect:: sqlite + :name: SQLite + +.. _sqlite_datetime: + +Date and Time Types +------------------- + +SQLite does not have built-in DATE, TIME, or DATETIME types, and pysqlite does +not provide out of the box functionality for translating values between Python +`datetime` objects and a SQLite-supported format. SQLAlchemy's own +:class:`~sqlalchemy.types.DateTime` and related types provide date formatting +and parsing functionality when SQlite is used. The implementation classes are +:class:`~.sqlite.DATETIME`, :class:`~.sqlite.DATE` and :class:`~.sqlite.TIME`. +These types represent dates and times as ISO formatted strings, which also +nicely support ordering. There's no reliance on typical "libc" internals for +these functions so historical dates are fully supported. + +Ensuring Text affinity +^^^^^^^^^^^^^^^^^^^^^^ + +The DDL rendered for these types is the standard ``DATE``, ``TIME`` +and ``DATETIME`` indicators. However, custom storage formats can also be +applied to these types. When the +storage format is detected as containing no alpha characters, the DDL for +these types is rendered as ``DATE_CHAR``, ``TIME_CHAR``, and ``DATETIME_CHAR``, +so that the column continues to have textual affinity. + +.. seealso:: + + `Type Affinity `_ - in the SQLite documentation + +.. _sqlite_autoincrement: + +SQLite Auto Incrementing Behavior +---------------------------------- + +Background on SQLite's autoincrement is at: http://sqlite.org/autoinc.html + +Key concepts: + +* SQLite has an implicit "auto increment" feature that takes place for any + non-composite primary-key column that is specifically created using + "INTEGER PRIMARY KEY" for the type + primary key. + +* SQLite also has an explicit "AUTOINCREMENT" keyword, that is **not** + equivalent to the implicit autoincrement feature; this keyword is not + recommended for general use. SQLAlchemy does not render this keyword + unless a special SQLite-specific directive is used (see below). However, + it still requires that the column's type is named "INTEGER". + +Using the AUTOINCREMENT Keyword +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To specifically render the AUTOINCREMENT keyword on the primary key column +when rendering DDL, add the flag ``sqlite_autoincrement=True`` to the Table +construct:: + + Table('sometable', metadata, + Column('id', Integer, primary_key=True), + sqlite_autoincrement=True) + +Allowing autoincrement behavior SQLAlchemy types other than Integer/INTEGER +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +SQLite's typing model is based on naming conventions. Among +other things, this means that any type name which contains the +substring ``"INT"`` will be determined to be of "integer affinity". A +type named ``"BIGINT"``, ``"SPECIAL_INT"`` or even ``"XYZINTQPR"``, will be considered by +SQLite to be of "integer" affinity. However, **the SQLite +autoincrement feature, whether implicitly or explicitly enabled, +requires that the name of the column's type +is exactly the string "INTEGER"**. Therefore, if an +application uses a type like :class:`.BigInteger` for a primary key, on +SQLite this type will need to be rendered as the name ``"INTEGER"`` when +emitting the initial ``CREATE TABLE`` statement in order for the autoincrement +behavior to be available. + +One approach to achieve this is to use :class:`.Integer` on SQLite +only using :meth:`.TypeEngine.with_variant`:: + + table = Table( + "my_table", metadata, + Column("id", BigInteger().with_variant(Integer, "sqlite"), primary_key=True) + ) + +Another is to use a subclass of :class:`.BigInteger` that overrides its DDL name +to be ``INTEGER`` when compiled against SQLite:: + + from sqlalchemy import BigInteger + from sqlalchemy.ext.compiler import compiles + + class SLBigInteger(BigInteger): + pass + + @compiles(SLBigInteger, 'sqlite') + def bi_c(element, compiler, **kw): + return "INTEGER" + + @compiles(SLBigInteger) + def bi_c(element, compiler, **kw): + return compiler.visit_BIGINT(element, **kw) + + + table = Table( + "my_table", metadata, + Column("id", SLBigInteger(), primary_key=True) + ) + +.. seealso:: + + :meth:`.TypeEngine.with_variant` + + :ref:`sqlalchemy.ext.compiler_toplevel` + + `Datatypes In SQLite Version 3 `_ + +.. _sqlite_concurrency: + +Database Locking Behavior / Concurrency +--------------------------------------- + +SQLite is not designed for a high level of write concurrency. The database +itself, being a file, is locked completely during write operations within +transactions, meaning exactly one "connection" (in reality a file handle) +has exclusive access to the database during this period - all other +"connections" will be blocked during this time. + +The Python DBAPI specification also calls for a connection model that is +always in a transaction; there is no ``connection.begin()`` method, +only ``connection.commit()`` and ``connection.rollback()``, upon which a +new transaction is to be begun immediately. This may seem to imply +that the SQLite driver would in theory allow only a single filehandle on a +particular database file at any time; however, there are several +factors both within SQlite itself as well as within the pysqlite driver +which loosen this restriction significantly. + +However, no matter what locking modes are used, SQLite will still always +lock the database file once a transaction is started and DML (e.g. INSERT, +UPDATE, DELETE) has at least been emitted, and this will block +other transactions at least at the point that they also attempt to emit DML. +By default, the length of time on this block is very short before it times out +with an error. + +This behavior becomes more critical when used in conjunction with the +SQLAlchemy ORM. SQLAlchemy's :class:`.Session` object by default runs +within a transaction, and with its autoflush model, may emit DML preceding +any SELECT statement. This may lead to a SQLite database that locks +more quickly than is expected. The locking mode of SQLite and the pysqlite +driver can be manipulated to some degree, however it should be noted that +achieving a high degree of write-concurrency with SQLite is a losing battle. + +For more information on SQLite's lack of write concurrency by design, please +see +`Situations Where Another RDBMS May Work Better - High Concurrency +`_ near the bottom of the page. + +The following subsections introduce areas that are impacted by SQLite's +file-based architecture and additionally will usually require workarounds to +work when using the pysqlite driver. + +.. _sqlite_isolation_level: + +Transaction Isolation Level +---------------------------- + +SQLite supports "transaction isolation" in a non-standard way, along two +axes. One is that of the `PRAGMA read_uncommitted `_ +instruction. This setting can essentially switch SQLite between its +default mode of ``SERIALIZABLE`` isolation, and a "dirty read" isolation +mode normally referred to as ``READ UNCOMMITTED``. + +SQLAlchemy ties into this PRAGMA statement using the +:paramref:`.create_engine.isolation_level` parameter of :func:`.create_engine`. +Valid values for this parameter when used with SQLite are ``"SERIALIZABLE"`` +and ``"READ UNCOMMITTED"`` corresponding to a value of 0 and 1, respectively. +SQLite defaults to ``SERIALIZABLE``, however its behavior is impacted by +the pysqlite driver's default behavior. + +The other axis along which SQLite's transactional locking is impacted is +via the nature of the ``BEGIN`` statement used. The three varieties +are "deferred", "immediate", and "exclusive", as described at +`BEGIN TRANSACTION `_. A straight +``BEGIN`` statement uses the "deferred" mode, where the the database file is +not locked until the first read or write operation, and read access remains +open to other transactions until the first write operation. But again, +it is critical to note that the pysqlite driver interferes with this behavior +by *not even emitting BEGIN* until the first write operation. + +.. warning:: + + SQLite's transactional scope is impacted by unresolved + issues in the pysqlite driver, which defers BEGIN statements to a greater + degree than is often feasible. See the section :ref:`pysqlite_serializable` + for techniques to work around this behavior. + +SAVEPOINT Support +---------------------------- + +SQLite supports SAVEPOINTs, which only function once a transaction is +begun. SQLAlchemy's SAVEPOINT support is available using the +:meth:`.Connection.begin_nested` method at the Core level, and +:meth:`.Session.begin_nested` at the ORM level. However, SAVEPOINTs +won't work at all with pysqlite unless workarounds are taken. + +.. warning:: + + SQLite's SAVEPOINT feature is impacted by unresolved + issues in the pysqlite driver, which defers BEGIN statements to a greater + degree than is often feasible. See the section :ref:`pysqlite_serializable` + for techniques to work around this behavior. + +Transactional DDL +---------------------------- + +The SQLite database supports transactional :term:`DDL` as well. +In this case, the pysqlite driver is not only failing to start transactions, +it also is ending any existing transction when DDL is detected, so again, +workarounds are required. + +.. warning:: + + SQLite's transactional DDL is impacted by unresolved issues + in the pysqlite driver, which fails to emit BEGIN and additionally + forces a COMMIT to cancel any transaction when DDL is encountered. + See the section :ref:`pysqlite_serializable` + for techniques to work around this behavior. + +.. _sqlite_foreign_keys: + +Foreign Key Support +------------------- + +SQLite supports FOREIGN KEY syntax when emitting CREATE statements for tables, +however by default these constraints have no effect on the operation of the +table. + +Constraint checking on SQLite has three prerequisites: + +* At least version 3.6.19 of SQLite must be in use +* The SQLite library must be compiled *without* the SQLITE_OMIT_FOREIGN_KEY + or SQLITE_OMIT_TRIGGER symbols enabled. +* The ``PRAGMA foreign_keys = ON`` statement must be emitted on all + connections before use. + +SQLAlchemy allows for the ``PRAGMA`` statement to be emitted automatically for +new connections through the usage of events:: + + from sqlalchemy.engine import Engine + from sqlalchemy import event + + @event.listens_for(Engine, "connect") + def set_sqlite_pragma(dbapi_connection, connection_record): + cursor = dbapi_connection.cursor() + cursor.execute("PRAGMA foreign_keys=ON") + cursor.close() + +.. warning:: + + When SQLite foreign keys are enabled, it is **not possible** + to emit CREATE or DROP statements for tables that contain + mutually-dependent foreign key constraints; + to emit the DDL for these tables requires that ALTER TABLE be used to + create or drop these constraints separately, for which SQLite has + no support. + +.. seealso:: + + `SQLite Foreign Key Support `_ + - on the SQLite web site. + + :ref:`event_toplevel` - SQLAlchemy event API. + + :ref:`use_alter` - more information on SQLAlchemy's facilities for handling + mutually-dependent foreign key constraints. + +.. _sqlite_type_reflection: + +Type Reflection +--------------- + +SQLite types are unlike those of most other database backends, in that +the string name of the type usually does not correspond to a "type" in a +one-to-one fashion. Instead, SQLite links per-column typing behavior +to one of five so-called "type affinities" based on a string matching +pattern for the type. + +SQLAlchemy's reflection process, when inspecting types, uses a simple +lookup table to link the keywords returned to provided SQLAlchemy types. +This lookup table is present within the SQLite dialect as it is for all +other dialects. However, the SQLite dialect has a different "fallback" +routine for when a particular type name is not located in the lookup map; +it instead implements the SQLite "type affinity" scheme located at +http://www.sqlite.org/datatype3.html section 2.1. + +The provided typemap will make direct associations from an exact string +name match for the following types: + +:class:`~.types.BIGINT`, :class:`~.types.BLOB`, +:class:`~.types.BOOLEAN`, :class:`~.types.BOOLEAN`, +:class:`~.types.CHAR`, :class:`~.types.DATE`, +:class:`~.types.DATETIME`, :class:`~.types.FLOAT`, +:class:`~.types.DECIMAL`, :class:`~.types.FLOAT`, +:class:`~.types.INTEGER`, :class:`~.types.INTEGER`, +:class:`~.types.NUMERIC`, :class:`~.types.REAL`, +:class:`~.types.SMALLINT`, :class:`~.types.TEXT`, +:class:`~.types.TIME`, :class:`~.types.TIMESTAMP`, +:class:`~.types.VARCHAR`, :class:`~.types.NVARCHAR`, +:class:`~.types.NCHAR` + +When a type name does not match one of the above types, the "type affinity" +lookup is used instead: + +* :class:`~.types.INTEGER` is returned if the type name includes the + string ``INT`` +* :class:`~.types.TEXT` is returned if the type name includes the + string ``CHAR``, ``CLOB`` or ``TEXT`` +* :class:`~.types.NullType` is returned if the type name includes the + string ``BLOB`` +* :class:`~.types.REAL` is returned if the type name includes the string + ``REAL``, ``FLOA`` or ``DOUB``. +* Otherwise, the :class:`~.types.NUMERIC` type is used. + +.. versionadded:: 0.9.3 Support for SQLite type affinity rules when reflecting + columns. + + +.. _sqlite_partial_index: + +Partial Indexes +--------------- + +A partial index, e.g. one which uses a WHERE clause, can be specified +with the DDL system using the argument ``sqlite_where``:: + + tbl = Table('testtbl', m, Column('data', Integer)) + idx = Index('test_idx1', tbl.c.data, + sqlite_where=and_(tbl.c.data > 5, tbl.c.data < 10)) + +The index will be rendered at create time as:: + + CREATE INDEX test_idx1 ON testtbl (data) + WHERE data > 5 AND data < 10 + +.. versionadded:: 0.9.9 + +.. _sqlite_dotted_column_names: + +Dotted Column Names +------------------- + +Using table or column names that explicitly have periods in them is +**not recommended**. While this is generally a bad idea for relational +databases in general, as the dot is a syntactically significant character, +the SQLite driver up until version **3.10.0** of SQLite has a bug which +requires that SQLAlchemy filter out these dots in result sets. + +.. versionchanged:: 1.1 + + The following SQLite issue has been resolved as of version 3.10.0 + of SQLite. SQLAlchemy as of **1.1** automatically disables its internal + workarounds based on detection of this version. + +The bug, entirely outside of SQLAlchemy, can be illustrated thusly:: + + import sqlite3 + + assert sqlite3.sqlite_version_info < (3, 10, 0), "bug is fixed in this version" + + conn = sqlite3.connect(":memory:") + cursor = conn.cursor() + + cursor.execute("create table x (a integer, b integer)") + cursor.execute("insert into x (a, b) values (1, 1)") + cursor.execute("insert into x (a, b) values (2, 2)") + + cursor.execute("select x.a, x.b from x") + assert [c[0] for c in cursor.description] == ['a', 'b'] + + cursor.execute(''' + select x.a, x.b from x where a=1 + union + select x.a, x.b from x where a=2 + ''') + assert [c[0] for c in cursor.description] == ['a', 'b'], \ + [c[0] for c in cursor.description] + +The second assertion fails:: + + Traceback (most recent call last): + File "test.py", line 19, in + [c[0] for c in cursor.description] + AssertionError: ['x.a', 'x.b'] + +Where above, the driver incorrectly reports the names of the columns +including the name of the table, which is entirely inconsistent vs. +when the UNION is not present. + +SQLAlchemy relies upon column names being predictable in how they match +to the original statement, so the SQLAlchemy dialect has no choice but +to filter these out:: + + + from sqlalchemy import create_engine + + eng = create_engine("sqlite://") + conn = eng.connect() + + conn.execute("create table x (a integer, b integer)") + conn.execute("insert into x (a, b) values (1, 1)") + conn.execute("insert into x (a, b) values (2, 2)") + + result = conn.execute("select x.a, x.b from x") + assert result.keys() == ["a", "b"] + + result = conn.execute(''' + select x.a, x.b from x where a=1 + union + select x.a, x.b from x where a=2 + ''') + assert result.keys() == ["a", "b"] + +Note that above, even though SQLAlchemy filters out the dots, *both +names are still addressable*:: + + >>> row = result.first() + >>> row["a"] + 1 + >>> row["x.a"] + 1 + >>> row["b"] + 1 + >>> row["x.b"] + 1 + +Therefore, the workaround applied by SQLAlchemy only impacts +:meth:`.ResultProxy.keys` and :meth:`.RowProxy.keys()` in the public API. +In the very specific case where +an application is forced to use column names that contain dots, and the +functionality of :meth:`.ResultProxy.keys` and :meth:`.RowProxy.keys()` +is required to return these dotted names unmodified, the ``sqlite_raw_colnames`` +execution option may be provided, either on a per-:class:`.Connection` basis:: + + result = conn.execution_options(sqlite_raw_colnames=True).execute(''' + select x.a, x.b from x where a=1 + union + select x.a, x.b from x where a=2 + ''') + assert result.keys() == ["x.a", "x.b"] + +or on a per-:class:`.Engine` basis:: + + engine = create_engine("sqlite://", execution_options={"sqlite_raw_colnames": True}) + +When using the per-:class:`.Engine` execution option, note that +**Core and ORM queries that use UNION may not function properly**. + +""" + +import datetime +import re + +from ... import processors +from ... import sql, exc +from ... import types as sqltypes, schema as sa_schema +from ... import util +from ...engine import default, reflection +from ...sql import compiler + +from ...types import (BLOB, BOOLEAN, CHAR, DECIMAL, FLOAT, + INTEGER, REAL, NUMERIC, SMALLINT, TEXT, + TIMESTAMP, VARCHAR) + + +class _DateTimeMixin(object): + _reg = None + _storage_format = None + + def __init__(self, storage_format=None, regexp=None, **kw): + super(_DateTimeMixin, self).__init__(**kw) + if regexp is not None: + self._reg = re.compile(regexp) + if storage_format is not None: + self._storage_format = storage_format + + @property + def format_is_text_affinity(self): + """return True if the storage format will automatically imply + a TEXT affinity. + + If the storage format contains no non-numeric characters, + it will imply a NUMERIC storage format on SQLite; in this case, + the type will generate its DDL as DATE_CHAR, DATETIME_CHAR, + TIME_CHAR. + + .. versionadded:: 1.0.0 + + """ + spec = self._storage_format % { + "year": 0, "month": 0, "day": 0, "hour": 0, + "minute": 0, "second": 0, "microsecond": 0 + } + return bool(re.search(r'[^0-9]', spec)) + + def adapt(self, cls, **kw): + if issubclass(cls, _DateTimeMixin): + if self._storage_format: + kw["storage_format"] = self._storage_format + if self._reg: + kw["regexp"] = self._reg + return super(_DateTimeMixin, self).adapt(cls, **kw) + + def literal_processor(self, dialect): + bp = self.bind_processor(dialect) + + def process(value): + return "'%s'" % bp(value) + return process + + +class DATETIME(_DateTimeMixin, sqltypes.DateTime): + r"""Represent a Python datetime object in SQLite using a string. + + The default string storage format is:: + + "%(year)04d-%(month)02d-%(day)02d %(hour)02d:%(min)02d:\ +%(second)02d.%(microsecond)06d" + + e.g.:: + + 2011-03-15 12:05:57.10558 + + The storage format can be customized to some degree using the + ``storage_format`` and ``regexp`` parameters, such as:: + + import re + from sqlalchemy.dialects.sqlite import DATETIME + + dt = DATETIME( + storage_format="%(year)04d/%(month)02d/%(day)02d %(hour)02d:\ +%(min)02d:%(second)02d", + regexp=r"(\d+)/(\d+)/(\d+) (\d+)-(\d+)-(\d+)" + ) + + :param storage_format: format string which will be applied to the dict + with keys year, month, day, hour, minute, second, and microsecond. + + :param regexp: regular expression which will be applied to incoming result + rows. If the regexp contains named groups, the resulting match dict is + applied to the Python datetime() constructor as keyword arguments. + Otherwise, if positional groups are used, the datetime() constructor + is called with positional arguments via + ``*map(int, match_obj.groups(0))``. + """ + + _storage_format = ( + "%(year)04d-%(month)02d-%(day)02d " + "%(hour)02d:%(minute)02d:%(second)02d.%(microsecond)06d" + ) + + def __init__(self, *args, **kwargs): + truncate_microseconds = kwargs.pop('truncate_microseconds', False) + super(DATETIME, self).__init__(*args, **kwargs) + if truncate_microseconds: + assert 'storage_format' not in kwargs, "You can specify only "\ + "one of truncate_microseconds or storage_format." + assert 'regexp' not in kwargs, "You can specify only one of "\ + "truncate_microseconds or regexp." + self._storage_format = ( + "%(year)04d-%(month)02d-%(day)02d " + "%(hour)02d:%(minute)02d:%(second)02d" + ) + + def bind_processor(self, dialect): + datetime_datetime = datetime.datetime + datetime_date = datetime.date + format = self._storage_format + + def process(value): + if value is None: + return None + elif isinstance(value, datetime_datetime): + return format % { + 'year': value.year, + 'month': value.month, + 'day': value.day, + 'hour': value.hour, + 'minute': value.minute, + 'second': value.second, + 'microsecond': value.microsecond, + } + elif isinstance(value, datetime_date): + return format % { + 'year': value.year, + 'month': value.month, + 'day': value.day, + 'hour': 0, + 'minute': 0, + 'second': 0, + 'microsecond': 0, + } + else: + raise TypeError("SQLite DateTime type only accepts Python " + "datetime and date objects as input.") + return process + + def result_processor(self, dialect, coltype): + if self._reg: + return processors.str_to_datetime_processor_factory( + self._reg, datetime.datetime) + else: + return processors.str_to_datetime + + +class DATE(_DateTimeMixin, sqltypes.Date): + r"""Represent a Python date object in SQLite using a string. + + The default string storage format is:: + + "%(year)04d-%(month)02d-%(day)02d" + + e.g.:: + + 2011-03-15 + + The storage format can be customized to some degree using the + ``storage_format`` and ``regexp`` parameters, such as:: + + import re + from sqlalchemy.dialects.sqlite import DATE + + d = DATE( + storage_format="%(month)02d/%(day)02d/%(year)04d", + regexp=re.compile("(?P\d+)/(?P\d+)/(?P\d+)") + ) + + :param storage_format: format string which will be applied to the + dict with keys year, month, and day. + + :param regexp: regular expression which will be applied to + incoming result rows. If the regexp contains named groups, the + resulting match dict is applied to the Python date() constructor + as keyword arguments. Otherwise, if positional groups are used, the + date() constructor is called with positional arguments via + ``*map(int, match_obj.groups(0))``. + """ + + _storage_format = "%(year)04d-%(month)02d-%(day)02d" + + def bind_processor(self, dialect): + datetime_date = datetime.date + format = self._storage_format + + def process(value): + if value is None: + return None + elif isinstance(value, datetime_date): + return format % { + 'year': value.year, + 'month': value.month, + 'day': value.day, + } + else: + raise TypeError("SQLite Date type only accepts Python " + "date objects as input.") + return process + + def result_processor(self, dialect, coltype): + if self._reg: + return processors.str_to_datetime_processor_factory( + self._reg, datetime.date) + else: + return processors.str_to_date + + +class TIME(_DateTimeMixin, sqltypes.Time): + r"""Represent a Python time object in SQLite using a string. + + The default string storage format is:: + + "%(hour)02d:%(minute)02d:%(second)02d.%(microsecond)06d" + + e.g.:: + + 12:05:57.10558 + + The storage format can be customized to some degree using the + ``storage_format`` and ``regexp`` parameters, such as:: + + import re + from sqlalchemy.dialects.sqlite import TIME + + t = TIME( + storage_format="%(hour)02d-%(minute)02d-%(second)02d-\ +%(microsecond)06d", + regexp=re.compile("(\d+)-(\d+)-(\d+)-(?:-(\d+))?") + ) + + :param storage_format: format string which will be applied to the dict + with keys hour, minute, second, and microsecond. + + :param regexp: regular expression which will be applied to incoming result + rows. If the regexp contains named groups, the resulting match dict is + applied to the Python time() constructor as keyword arguments. Otherwise, + if positional groups are used, the time() constructor is called with + positional arguments via ``*map(int, match_obj.groups(0))``. + """ + + _storage_format = "%(hour)02d:%(minute)02d:%(second)02d.%(microsecond)06d" + + def __init__(self, *args, **kwargs): + truncate_microseconds = kwargs.pop('truncate_microseconds', False) + super(TIME, self).__init__(*args, **kwargs) + if truncate_microseconds: + assert 'storage_format' not in kwargs, "You can specify only "\ + "one of truncate_microseconds or storage_format." + assert 'regexp' not in kwargs, "You can specify only one of "\ + "truncate_microseconds or regexp." + self._storage_format = "%(hour)02d:%(minute)02d:%(second)02d" + + def bind_processor(self, dialect): + datetime_time = datetime.time + format = self._storage_format + + def process(value): + if value is None: + return None + elif isinstance(value, datetime_time): + return format % { + 'hour': value.hour, + 'minute': value.minute, + 'second': value.second, + 'microsecond': value.microsecond, + } + else: + raise TypeError("SQLite Time type only accepts Python " + "time objects as input.") + return process + + def result_processor(self, dialect, coltype): + if self._reg: + return processors.str_to_datetime_processor_factory( + self._reg, datetime.time) + else: + return processors.str_to_time + +colspecs = { + sqltypes.Date: DATE, + sqltypes.DateTime: DATETIME, + sqltypes.Time: TIME, +} + +ischema_names = { + 'BIGINT': sqltypes.BIGINT, + 'BLOB': sqltypes.BLOB, + 'BOOL': sqltypes.BOOLEAN, + 'BOOLEAN': sqltypes.BOOLEAN, + 'CHAR': sqltypes.CHAR, + 'DATE': sqltypes.DATE, + 'DATE_CHAR': sqltypes.DATE, + 'DATETIME': sqltypes.DATETIME, + 'DATETIME_CHAR': sqltypes.DATETIME, + 'DOUBLE': sqltypes.FLOAT, + 'DECIMAL': sqltypes.DECIMAL, + 'FLOAT': sqltypes.FLOAT, + 'INT': sqltypes.INTEGER, + 'INTEGER': sqltypes.INTEGER, + 'NUMERIC': sqltypes.NUMERIC, + 'REAL': sqltypes.REAL, + 'SMALLINT': sqltypes.SMALLINT, + 'TEXT': sqltypes.TEXT, + 'TIME': sqltypes.TIME, + 'TIME_CHAR': sqltypes.TIME, + 'TIMESTAMP': sqltypes.TIMESTAMP, + 'VARCHAR': sqltypes.VARCHAR, + 'NVARCHAR': sqltypes.NVARCHAR, + 'NCHAR': sqltypes.NCHAR, +} + + +class SQLiteCompiler(compiler.SQLCompiler): + extract_map = util.update_copy( + compiler.SQLCompiler.extract_map, + { + 'month': '%m', + 'day': '%d', + 'year': '%Y', + 'second': '%S', + 'hour': '%H', + 'doy': '%j', + 'minute': '%M', + 'epoch': '%s', + 'dow': '%w', + 'week': '%W', + }) + + def visit_now_func(self, fn, **kw): + return "CURRENT_TIMESTAMP" + + def visit_localtimestamp_func(self, func, **kw): + return 'DATETIME(CURRENT_TIMESTAMP, "localtime")' + + def visit_true(self, expr, **kw): + return '1' + + def visit_false(self, expr, **kw): + return '0' + + def visit_char_length_func(self, fn, **kw): + return "length%s" % self.function_argspec(fn) + + def visit_cast(self, cast, **kwargs): + if self.dialect.supports_cast: + return super(SQLiteCompiler, self).visit_cast(cast, **kwargs) + else: + return self.process(cast.clause, **kwargs) + + def visit_extract(self, extract, **kw): + try: + return "CAST(STRFTIME('%s', %s) AS INTEGER)" % ( + self.extract_map[extract.field], + self.process(extract.expr, **kw) + ) + except KeyError: + raise exc.CompileError( + "%s is not a valid extract argument." % extract.field) + + def limit_clause(self, select, **kw): + text = "" + if select._limit_clause is not None: + text += "\n LIMIT " + self.process(select._limit_clause, **kw) + if select._offset_clause is not None: + if select._limit_clause is None: + text += "\n LIMIT " + self.process(sql.literal(-1)) + text += " OFFSET " + self.process(select._offset_clause, **kw) + else: + text += " OFFSET " + self.process(sql.literal(0), **kw) + return text + + def for_update_clause(self, select, **kw): + # sqlite has no "FOR UPDATE" AFAICT + return '' + + def visit_is_distinct_from_binary(self, binary, operator, **kw): + return "%s IS NOT %s" % (self.process(binary.left), + self.process(binary.right)) + + def visit_isnot_distinct_from_binary(self, binary, operator, **kw): + return "%s IS %s" % (self.process(binary.left), + self.process(binary.right)) + + +class SQLiteDDLCompiler(compiler.DDLCompiler): + + def get_column_specification(self, column, **kwargs): + coltype = self.dialect.type_compiler.process( + column.type, type_expression=column) + colspec = self.preparer.format_column(column) + " " + coltype + default = self.get_column_default_string(column) + if default is not None: + colspec += " DEFAULT " + default + + if not column.nullable: + colspec += " NOT NULL" + + if column.primary_key: + if ( + column.autoincrement is True and + len(column.table.primary_key.columns) != 1 + ): + raise exc.CompileError( + "SQLite does not support autoincrement for " + "composite primary keys") + + if (column.table.dialect_options['sqlite']['autoincrement'] and + len(column.table.primary_key.columns) == 1 and + issubclass(column.type._type_affinity, sqltypes.Integer) and + not column.foreign_keys): + colspec += " PRIMARY KEY AUTOINCREMENT" + + return colspec + + def visit_primary_key_constraint(self, constraint): + # for columns with sqlite_autoincrement=True, + # the PRIMARY KEY constraint can only be inline + # with the column itself. + if len(constraint.columns) == 1: + c = list(constraint)[0] + if (c.primary_key and + c.table.dialect_options['sqlite']['autoincrement'] and + issubclass(c.type._type_affinity, sqltypes.Integer) and + not c.foreign_keys): + return None + + return super(SQLiteDDLCompiler, self).visit_primary_key_constraint( + constraint) + + def visit_foreign_key_constraint(self, constraint): + + local_table = constraint.elements[0].parent.table + remote_table = constraint.elements[0].column.table + + if local_table.schema != remote_table.schema: + return None + else: + return super( + SQLiteDDLCompiler, + self).visit_foreign_key_constraint(constraint) + + def define_constraint_remote_table(self, constraint, table, preparer): + """Format the remote table clause of a CREATE CONSTRAINT clause.""" + + return preparer.format_table(table, use_schema=False) + + def visit_create_index(self, create, include_schema=False, + include_table_schema=True): + index = create.element + self._verify_index_table(index) + preparer = self.preparer + text = "CREATE " + if index.unique: + text += "UNIQUE " + text += "INDEX %s ON %s (%s)" \ + % ( + self._prepared_index_name(index, + include_schema=True), + preparer.format_table(index.table, + use_schema=False), + ', '.join( + self.sql_compiler.process( + expr, include_table=False, literal_binds=True) for + expr in index.expressions) + ) + + whereclause = index.dialect_options["sqlite"]["where"] + if whereclause is not None: + where_compiled = self.sql_compiler.process( + whereclause, include_table=False, + literal_binds=True) + text += " WHERE " + where_compiled + + return text + + +class SQLiteTypeCompiler(compiler.GenericTypeCompiler): + def visit_large_binary(self, type_, **kw): + return self.visit_BLOB(type_) + + def visit_DATETIME(self, type_, **kw): + if not isinstance(type_, _DateTimeMixin) or \ + type_.format_is_text_affinity: + return super(SQLiteTypeCompiler, self).visit_DATETIME(type_) + else: + return "DATETIME_CHAR" + + def visit_DATE(self, type_, **kw): + if not isinstance(type_, _DateTimeMixin) or \ + type_.format_is_text_affinity: + return super(SQLiteTypeCompiler, self).visit_DATE(type_) + else: + return "DATE_CHAR" + + def visit_TIME(self, type_, **kw): + if not isinstance(type_, _DateTimeMixin) or \ + type_.format_is_text_affinity: + return super(SQLiteTypeCompiler, self).visit_TIME(type_) + else: + return "TIME_CHAR" + + +class SQLiteIdentifierPreparer(compiler.IdentifierPreparer): + reserved_words = set([ + 'add', 'after', 'all', 'alter', 'analyze', 'and', 'as', 'asc', + 'attach', 'autoincrement', 'before', 'begin', 'between', 'by', + 'cascade', 'case', 'cast', 'check', 'collate', 'column', 'commit', + 'conflict', 'constraint', 'create', 'cross', 'current_date', + 'current_time', 'current_timestamp', 'database', 'default', + 'deferrable', 'deferred', 'delete', 'desc', 'detach', 'distinct', + 'drop', 'each', 'else', 'end', 'escape', 'except', 'exclusive', + 'explain', 'false', 'fail', 'for', 'foreign', 'from', 'full', 'glob', + 'group', 'having', 'if', 'ignore', 'immediate', 'in', 'index', + 'indexed', 'initially', 'inner', 'insert', 'instead', 'intersect', + 'into', 'is', 'isnull', 'join', 'key', 'left', 'like', 'limit', + 'match', 'natural', 'not', 'notnull', 'null', 'of', 'offset', 'on', + 'or', 'order', 'outer', 'plan', 'pragma', 'primary', 'query', + 'raise', 'references', 'reindex', 'rename', 'replace', 'restrict', + 'right', 'rollback', 'row', 'select', 'set', 'table', 'temp', + 'temporary', 'then', 'to', 'transaction', 'trigger', 'true', 'union', + 'unique', 'update', 'using', 'vacuum', 'values', 'view', 'virtual', + 'when', 'where', + ]) + + def format_index(self, index, use_schema=True, name=None): + """Prepare a quoted index and schema name.""" + + if name is None: + name = index.name + result = self.quote(name, index.quote) + if (not self.omit_schema and + use_schema and + getattr(index.table, "schema", None)): + result = self.quote_schema( + index.table.schema, index.table.quote_schema) + "." + result + return result + + +class SQLiteExecutionContext(default.DefaultExecutionContext): + @util.memoized_property + def _preserve_raw_colnames(self): + return not self.dialect._broken_dotted_colnames or \ + self.execution_options.get("sqlite_raw_colnames", False) + + def _translate_colname(self, colname): + # TODO: detect SQLite version 3.10.0 or greater; + # see [ticket:3633] + + # adjust for dotted column names. SQLite + # in the case of UNION may store col names as + # "tablename.colname", or if using an attached database, + # "database.tablename.colname", in cursor.description + if not self._preserve_raw_colnames and "." in colname: + return colname.split(".")[-1], colname + else: + return colname, None + + +class SQLiteDialect(default.DefaultDialect): + name = 'sqlite' + supports_alter = False + supports_unicode_statements = True + supports_unicode_binds = True + supports_default_values = True + supports_empty_insert = False + supports_cast = True + supports_multivalues_insert = True + + default_paramstyle = 'qmark' + execution_ctx_cls = SQLiteExecutionContext + statement_compiler = SQLiteCompiler + ddl_compiler = SQLiteDDLCompiler + type_compiler = SQLiteTypeCompiler + preparer = SQLiteIdentifierPreparer + ischema_names = ischema_names + colspecs = colspecs + isolation_level = None + + supports_cast = True + supports_default_values = True + + construct_arguments = [ + (sa_schema.Table, { + "autoincrement": False + }), + (sa_schema.Index, { + "where": None, + }), + ] + + _broken_fk_pragma_quotes = False + _broken_dotted_colnames = False + + def __init__(self, isolation_level=None, native_datetime=False, **kwargs): + default.DefaultDialect.__init__(self, **kwargs) + self.isolation_level = isolation_level + + # this flag used by pysqlite dialect, and perhaps others in the + # future, to indicate the driver is handling date/timestamp + # conversions (and perhaps datetime/time as well on some hypothetical + # driver ?) + self.native_datetime = native_datetime + + if self.dbapi is not None: + self.supports_right_nested_joins = ( + self.dbapi.sqlite_version_info >= (3, 7, 16)) + self._broken_dotted_colnames = ( + self.dbapi.sqlite_version_info < (3, 10, 0) + ) + self.supports_default_values = ( + self.dbapi.sqlite_version_info >= (3, 3, 8)) + self.supports_cast = ( + self.dbapi.sqlite_version_info >= (3, 2, 3)) + self.supports_multivalues_insert = ( + # http://www.sqlite.org/releaselog/3_7_11.html + self.dbapi.sqlite_version_info >= (3, 7, 11)) + # see http://www.sqlalchemy.org/trac/ticket/2568 + # as well as http://www.sqlite.org/src/info/600482d161 + self._broken_fk_pragma_quotes = ( + self.dbapi.sqlite_version_info < (3, 6, 14)) + + _isolation_lookup = { + 'READ UNCOMMITTED': 1, + 'SERIALIZABLE': 0, + } + + def set_isolation_level(self, connection, level): + try: + isolation_level = self._isolation_lookup[level.replace('_', ' ')] + except KeyError: + raise exc.ArgumentError( + "Invalid value '%s' for isolation_level. " + "Valid isolation levels for %s are %s" % + (level, self.name, ", ".join(self._isolation_lookup)) + ) + cursor = connection.cursor() + cursor.execute("PRAGMA read_uncommitted = %d" % isolation_level) + cursor.close() + + def get_isolation_level(self, connection): + cursor = connection.cursor() + cursor.execute('PRAGMA read_uncommitted') + res = cursor.fetchone() + if res: + value = res[0] + else: + # http://www.sqlite.org/changes.html#version_3_3_3 + # "Optional READ UNCOMMITTED isolation (instead of the + # default isolation level of SERIALIZABLE) and + # table level locking when database connections + # share a common cache."" + # pre-SQLite 3.3.0 default to 0 + value = 0 + cursor.close() + if value == 0: + return "SERIALIZABLE" + elif value == 1: + return "READ UNCOMMITTED" + else: + assert False, "Unknown isolation level %s" % value + + def on_connect(self): + if self.isolation_level is not None: + def connect(conn): + self.set_isolation_level(conn, self.isolation_level) + return connect + else: + return None + + @reflection.cache + def get_schema_names(self, connection, **kw): + s = "PRAGMA database_list" + dl = connection.execute(s) + + return [db[1] for db in dl if db[1] != "temp"] + + @reflection.cache + def get_table_names(self, connection, schema=None, **kw): + if schema is not None: + qschema = self.identifier_preparer.quote_identifier(schema) + master = '%s.sqlite_master' % qschema + else: + master = "sqlite_master" + s = ("SELECT name FROM %s " + "WHERE type='table' ORDER BY name") % (master,) + rs = connection.execute(s) + return [row[0] for row in rs] + + @reflection.cache + def get_temp_table_names(self, connection, **kw): + s = "SELECT name FROM sqlite_temp_master "\ + "WHERE type='table' ORDER BY name " + rs = connection.execute(s) + + return [row[0] for row in rs] + + @reflection.cache + def get_temp_view_names(self, connection, **kw): + s = "SELECT name FROM sqlite_temp_master "\ + "WHERE type='view' ORDER BY name " + rs = connection.execute(s) + + return [row[0] for row in rs] + + def has_table(self, connection, table_name, schema=None): + info = self._get_table_pragma( + connection, "table_info", table_name, schema=schema) + return bool(info) + + @reflection.cache + def get_view_names(self, connection, schema=None, **kw): + if schema is not None: + qschema = self.identifier_preparer.quote_identifier(schema) + master = '%s.sqlite_master' % qschema + else: + master = "sqlite_master" + s = ("SELECT name FROM %s " + "WHERE type='view' ORDER BY name") % (master,) + rs = connection.execute(s) + + return [row[0] for row in rs] + + @reflection.cache + def get_view_definition(self, connection, view_name, schema=None, **kw): + if schema is not None: + qschema = self.identifier_preparer.quote_identifier(schema) + master = '%s.sqlite_master' % qschema + s = ("SELECT sql FROM %s WHERE name = '%s'" + "AND type='view'") % (master, view_name) + rs = connection.execute(s) + else: + try: + s = ("SELECT sql FROM " + " (SELECT * FROM sqlite_master UNION ALL " + " SELECT * FROM sqlite_temp_master) " + "WHERE name = '%s' " + "AND type='view'") % view_name + rs = connection.execute(s) + except exc.DBAPIError: + s = ("SELECT sql FROM sqlite_master WHERE name = '%s' " + "AND type='view'") % view_name + rs = connection.execute(s) + + result = rs.fetchall() + if result: + return result[0].sql + + @reflection.cache + def get_columns(self, connection, table_name, schema=None, **kw): + info = self._get_table_pragma( + connection, "table_info", table_name, schema=schema) + + columns = [] + for row in info: + (name, type_, nullable, default, primary_key) = ( + row[1], row[2].upper(), not row[3], row[4], row[5]) + + columns.append(self._get_column_info(name, type_, nullable, + default, primary_key)) + return columns + + def _get_column_info(self, name, type_, nullable, default, primary_key): + coltype = self._resolve_type_affinity(type_) + + if default is not None: + default = util.text_type(default) + + return { + 'name': name, + 'type': coltype, + 'nullable': nullable, + 'default': default, + 'autoincrement': 'auto', + 'primary_key': primary_key, + } + + def _resolve_type_affinity(self, type_): + """Return a data type from a reflected column, using affinity tules. + + SQLite's goal for universal compatibility introduces some complexity + during reflection, as a column's defined type might not actually be a + type that SQLite understands - or indeed, my not be defined *at all*. + Internally, SQLite handles this with a 'data type affinity' for each + column definition, mapping to one of 'TEXT', 'NUMERIC', 'INTEGER', + 'REAL', or 'NONE' (raw bits). The algorithm that determines this is + listed in http://www.sqlite.org/datatype3.html section 2.1. + + This method allows SQLAlchemy to support that algorithm, while still + providing access to smarter reflection utilities by regcognizing + column definitions that SQLite only supports through affinity (like + DATE and DOUBLE). + + """ + match = re.match(r'([\w ]+)(\(.*?\))?', type_) + if match: + coltype = match.group(1) + args = match.group(2) + else: + coltype = '' + args = '' + + if coltype in self.ischema_names: + coltype = self.ischema_names[coltype] + elif 'INT' in coltype: + coltype = sqltypes.INTEGER + elif 'CHAR' in coltype or 'CLOB' in coltype or 'TEXT' in coltype: + coltype = sqltypes.TEXT + elif 'BLOB' in coltype or not coltype: + coltype = sqltypes.NullType + elif 'REAL' in coltype or 'FLOA' in coltype or 'DOUB' in coltype: + coltype = sqltypes.REAL + else: + coltype = sqltypes.NUMERIC + + if args is not None: + args = re.findall(r'(\d+)', args) + try: + coltype = coltype(*[int(a) for a in args]) + except TypeError: + util.warn( + "Could not instantiate type %s with " + "reflected arguments %s; using no arguments." % + (coltype, args)) + coltype = coltype() + else: + coltype = coltype() + + return coltype + + @reflection.cache + def get_pk_constraint(self, connection, table_name, schema=None, **kw): + constraint_name = None + table_data = self._get_table_sql(connection, table_name, schema=schema) + if table_data: + PK_PATTERN = r'CONSTRAINT (\w+) PRIMARY KEY' + result = re.search(PK_PATTERN, table_data, re.I) + constraint_name = result.group(1) if result else None + + cols = self.get_columns(connection, table_name, schema, **kw) + pkeys = [] + for col in cols: + if col['primary_key']: + pkeys.append(col['name']) + + return {'constrained_columns': pkeys, 'name': constraint_name} + + @reflection.cache + def get_foreign_keys(self, connection, table_name, schema=None, **kw): + # sqlite makes this *extremely difficult*. + # First, use the pragma to get the actual FKs. + pragma_fks = self._get_table_pragma( + connection, "foreign_key_list", + table_name, schema=schema + ) + + fks = {} + + for row in pragma_fks: + (numerical_id, rtbl, lcol, rcol) = ( + row[0], row[2], row[3], row[4]) + + if rcol is None: + rcol = lcol + + if self._broken_fk_pragma_quotes: + rtbl = re.sub(r'^[\"\[`\']|[\"\]`\']$', '', rtbl) + + if numerical_id in fks: + fk = fks[numerical_id] + else: + fk = fks[numerical_id] = { + 'name': None, + 'constrained_columns': [], + 'referred_schema': schema, + 'referred_table': rtbl, + 'referred_columns': [], + 'options': {} + } + fks[numerical_id] = fk + + fk['constrained_columns'].append(lcol) + fk['referred_columns'].append(rcol) + + def fk_sig(constrained_columns, referred_table, referred_columns): + return tuple(constrained_columns) + (referred_table,) + \ + tuple(referred_columns) + + # then, parse the actual SQL and attempt to find DDL that matches + # the names as well. SQLite saves the DDL in whatever format + # it was typed in as, so need to be liberal here. + + keys_by_signature = dict( + ( + fk_sig( + fk['constrained_columns'], + fk['referred_table'], fk['referred_columns']), + fk + ) for fk in fks.values() + ) + + table_data = self._get_table_sql(connection, table_name, schema=schema) + if table_data is None: + # system tables, etc. + return [] + + def parse_fks(): + FK_PATTERN = ( + r'(?:CONSTRAINT (\w+) +)?' + r'FOREIGN KEY *\( *(.+?) *\) +' + r'REFERENCES +(?:(?:"(.+?)")|([a-z0-9_]+)) *\((.+?)\) *' + r'((?:ON (?:DELETE|UPDATE) ' + r'(?:SET NULL|SET DEFAULT|CASCADE|RESTRICT|NO ACTION) *)*)' + ) + for match in re.finditer(FK_PATTERN, table_data, re.I): + ( + constraint_name, constrained_columns, + referred_quoted_name, referred_name, + referred_columns, onupdatedelete) = \ + match.group(1, 2, 3, 4, 5, 6) + constrained_columns = list( + self._find_cols_in_sig(constrained_columns)) + if not referred_columns: + referred_columns = constrained_columns + else: + referred_columns = list( + self._find_cols_in_sig(referred_columns)) + referred_name = referred_quoted_name or referred_name + options = {} + + for token in re.split(r" *\bON\b *", onupdatedelete.upper()): + if token.startswith("DELETE"): + options['ondelete'] = token[6:].strip() + elif token.startswith("UPDATE"): + options["onupdate"] = token[6:].strip() + yield ( + constraint_name, constrained_columns, + referred_name, referred_columns, options) + fkeys = [] + + for ( + constraint_name, constrained_columns, + referred_name, referred_columns, options) in parse_fks(): + sig = fk_sig( + constrained_columns, referred_name, referred_columns) + if sig not in keys_by_signature: + util.warn( + "WARNING: SQL-parsed foreign key constraint " + "'%s' could not be located in PRAGMA " + "foreign_keys for table %s" % ( + sig, + table_name + )) + continue + key = keys_by_signature.pop(sig) + key['name'] = constraint_name + key['options'] = options + fkeys.append(key) + # assume the remainders are the unnamed, inline constraints, just + # use them as is as it's extremely difficult to parse inline + # constraints + fkeys.extend(keys_by_signature.values()) + return fkeys + + def _find_cols_in_sig(self, sig): + for match in re.finditer(r'(?:"(.+?)")|([a-z0-9_]+)', sig, re.I): + yield match.group(1) or match.group(2) + + @reflection.cache + def get_unique_constraints(self, connection, table_name, + schema=None, **kw): + + auto_index_by_sig = {} + for idx in self.get_indexes( + connection, table_name, schema=schema, + include_auto_indexes=True, **kw): + if not idx['name'].startswith("sqlite_autoindex"): + continue + sig = tuple(idx['column_names']) + auto_index_by_sig[sig] = idx + + table_data = self._get_table_sql( + connection, table_name, schema=schema, **kw) + if not table_data: + return [] + + unique_constraints = [] + + def parse_uqs(): + UNIQUE_PATTERN = r'(?:CONSTRAINT "?(.+?)"? +)?UNIQUE *\((.+?)\)' + INLINE_UNIQUE_PATTERN = ( + r'(?:(".+?")|([a-z0-9]+)) ' + r'+[a-z0-9_ ]+? +UNIQUE') + + for match in re.finditer(UNIQUE_PATTERN, table_data, re.I): + name, cols = match.group(1, 2) + yield name, list(self._find_cols_in_sig(cols)) + + # we need to match inlines as well, as we seek to differentiate + # a UNIQUE constraint from a UNIQUE INDEX, even though these + # are kind of the same thing :) + for match in re.finditer(INLINE_UNIQUE_PATTERN, table_data, re.I): + cols = list( + self._find_cols_in_sig(match.group(1) or match.group(2))) + yield None, cols + + for name, cols in parse_uqs(): + sig = tuple(cols) + if sig in auto_index_by_sig: + auto_index_by_sig.pop(sig) + parsed_constraint = { + 'name': name, + 'column_names': cols + } + unique_constraints.append(parsed_constraint) + # NOTE: auto_index_by_sig might not be empty here, + # the PRIMARY KEY may have an entry. + return unique_constraints + + @reflection.cache + def get_check_constraints(self, connection, table_name, + schema=None, **kw): + table_data = self._get_table_sql( + connection, table_name, schema=schema, **kw) + if not table_data: + return [] + + CHECK_PATTERN = ( + r'(?:CONSTRAINT (\w+) +)?' + r'CHECK *\( *(.+) *\),? *' + ) + check_constraints = [] + # NOTE: we aren't using re.S here because we actually are + # taking advantage of each CHECK constraint being all on one + # line in the table definition in order to delineate. This + # necessarily makes assumptions as to how the CREATE TABLE + # was emitted. + for match in re.finditer(CHECK_PATTERN, table_data, re.I): + check_constraints.append({ + 'sqltext': match.group(2), + 'name': match.group(1) + }) + + return check_constraints + + @reflection.cache + def get_indexes(self, connection, table_name, schema=None, **kw): + pragma_indexes = self._get_table_pragma( + connection, "index_list", table_name, schema=schema) + indexes = [] + + include_auto_indexes = kw.pop('include_auto_indexes', False) + for row in pragma_indexes: + # ignore implicit primary key index. + # http://www.mail-archive.com/sqlite-users@sqlite.org/msg30517.html + if (not include_auto_indexes and + row[1].startswith('sqlite_autoindex')): + continue + + indexes.append(dict(name=row[1], column_names=[], unique=row[2])) + + # loop thru unique indexes to get the column names. + for idx in indexes: + pragma_index = self._get_table_pragma( + connection, "index_info", idx['name']) + + for row in pragma_index: + idx['column_names'].append(row[2]) + return indexes + + @reflection.cache + def _get_table_sql(self, connection, table_name, schema=None, **kw): + try: + s = ("SELECT sql FROM " + " (SELECT * FROM sqlite_master UNION ALL " + " SELECT * FROM sqlite_temp_master) " + "WHERE name = '%s' " + "AND type = 'table'") % table_name + rs = connection.execute(s) + except exc.DBAPIError: + s = ("SELECT sql FROM sqlite_master WHERE name = '%s' " + "AND type = 'table'") % table_name + rs = connection.execute(s) + return rs.scalar() + + def _get_table_pragma(self, connection, pragma, table_name, schema=None): + quote = self.identifier_preparer.quote_identifier + if schema is not None: + statement = "PRAGMA %s." % quote(schema) + else: + statement = "PRAGMA " + qtable = quote(table_name) + statement = "%s%s(%s)" % (statement, pragma, qtable) + cursor = connection.execute(statement) + if not cursor._soft_closed: + # work around SQLite issue whereby cursor.description + # is blank when PRAGMA returns no rows: + # http://www.sqlite.org/cvstrac/tktview?tn=1884 + result = cursor.fetchall() + else: + result = [] + return result diff --git a/app/lib/sqlalchemy/dialects/sqlite/pysqlcipher.py b/app/lib/sqlalchemy/dialects/sqlite/pysqlcipher.py new file mode 100644 index 0000000..e005d2e --- /dev/null +++ b/app/lib/sqlalchemy/dialects/sqlite/pysqlcipher.py @@ -0,0 +1,130 @@ +# sqlite/pysqlcipher.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: sqlite+pysqlcipher + :name: pysqlcipher + :dbapi: pysqlcipher + :connectstring: sqlite+pysqlcipher://:passphrase/file_path[?kdf_iter=] + :url: https://pypi.python.org/pypi/pysqlcipher + + ``pysqlcipher`` is a fork of the standard ``pysqlite`` driver to make + use of the `SQLCipher `_ backend. + + ``pysqlcipher3`` is a fork of ``pysqlcipher`` for Python 3. This dialect + will attempt to import it if ``pysqlcipher`` is non-present. + + .. versionadded:: 1.1.4 - added fallback import for pysqlcipher3 + + .. versionadded:: 0.9.9 - added pysqlcipher dialect + +Driver +------ + +The driver here is the `pysqlcipher `_ +driver, which makes use of the SQLCipher engine. This system essentially +introduces new PRAGMA commands to SQLite which allows the setting of a +passphrase and other encryption parameters, allowing the database +file to be encrypted. + +`pysqlcipher3` is a fork of `pysqlcipher` with support for Python 3, +the driver is the same. + +Connect Strings +--------------- + +The format of the connect string is in every way the same as that +of the :mod:`~sqlalchemy.dialects.sqlite.pysqlite` driver, except that the +"password" field is now accepted, which should contain a passphrase:: + + e = create_engine('sqlite+pysqlcipher://:testing@/foo.db') + +For an absolute file path, two leading slashes should be used for the +database name:: + + e = create_engine('sqlite+pysqlcipher://:testing@//path/to/foo.db') + +A selection of additional encryption-related pragmas supported by SQLCipher +as documented at https://www.zetetic.net/sqlcipher/sqlcipher-api/ can be passed +in the query string, and will result in that PRAGMA being called for each +new connection. Currently, ``cipher``, ``kdf_iter`` +``cipher_page_size`` and ``cipher_use_hmac`` are supported:: + + e = create_engine('sqlite+pysqlcipher://:testing@/foo.db?cipher=aes-256-cfb&kdf_iter=64000') + + +Pooling Behavior +---------------- + +The driver makes a change to the default pool behavior of pysqlite +as described in :ref:`pysqlite_threading_pooling`. The pysqlcipher driver +has been observed to be significantly slower on connection than the +pysqlite driver, most likely due to the encryption overhead, so the +dialect here defaults to using the :class:`.SingletonThreadPool` +implementation, +instead of the :class:`.NullPool` pool used by pysqlite. As always, the pool +implementation is entirely configurable using the +:paramref:`.create_engine.poolclass` parameter; the :class:`.StaticPool` may +be more feasible for single-threaded use, or :class:`.NullPool` may be used +to prevent unencrypted connections from being held open for long periods of +time, at the expense of slower startup time for new connections. + + +""" +from __future__ import absolute_import +from .pysqlite import SQLiteDialect_pysqlite +from ...engine import url as _url +from ... import pool + + +class SQLiteDialect_pysqlcipher(SQLiteDialect_pysqlite): + driver = 'pysqlcipher' + + pragmas = ('kdf_iter', 'cipher', 'cipher_page_size', 'cipher_use_hmac') + + @classmethod + def dbapi(cls): + try: + from pysqlcipher import dbapi2 as sqlcipher + except ImportError as e: + try: + from pysqlcipher3 import dbapi2 as sqlcipher + except ImportError: + raise e + return sqlcipher + + @classmethod + def get_pool_class(cls, url): + return pool.SingletonThreadPool + + def connect(self, *cargs, **cparams): + passphrase = cparams.pop('passphrase', '') + + pragmas = dict( + (key, cparams.pop(key, None)) for key in + self.pragmas + ) + + conn = super(SQLiteDialect_pysqlcipher, self).\ + connect(*cargs, **cparams) + conn.execute('pragma key="%s"' % passphrase) + for prag, value in pragmas.items(): + if value is not None: + conn.execute('pragma %s="%s"' % (prag, value)) + + return conn + + def create_connect_args(self, url): + super_url = _url.URL( + url.drivername, username=url.username, + host=url.host, database=url.database, query=url.query) + c_args, opts = super(SQLiteDialect_pysqlcipher, self).\ + create_connect_args(super_url) + opts['passphrase'] = url.password + return c_args, opts + +dialect = SQLiteDialect_pysqlcipher diff --git a/app/lib/sqlalchemy/dialects/sqlite/pysqlite.py b/app/lib/sqlalchemy/dialects/sqlite/pysqlite.py new file mode 100644 index 0000000..40a7cbb --- /dev/null +++ b/app/lib/sqlalchemy/dialects/sqlite/pysqlite.py @@ -0,0 +1,377 @@ +# sqlite/pysqlite.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +r""" +.. dialect:: sqlite+pysqlite + :name: pysqlite + :dbapi: sqlite3 + :connectstring: sqlite+pysqlite:///file_path + :url: http://docs.python.org/library/sqlite3.html + + Note that ``pysqlite`` is the same driver as the ``sqlite3`` + module included with the Python distribution. + +Driver +------ + +When using Python 2.5 and above, the built in ``sqlite3`` driver is +already installed and no additional installation is needed. Otherwise, +the ``pysqlite2`` driver needs to be present. This is the same driver as +``sqlite3``, just with a different name. + +The ``pysqlite2`` driver will be loaded first, and if not found, ``sqlite3`` +is loaded. This allows an explicitly installed pysqlite driver to take +precedence over the built in one. As with all dialects, a specific +DBAPI module may be provided to :func:`~sqlalchemy.create_engine()` to control +this explicitly:: + + from sqlite3 import dbapi2 as sqlite + e = create_engine('sqlite+pysqlite:///file.db', module=sqlite) + + +Connect Strings +--------------- + +The file specification for the SQLite database is taken as the "database" +portion of the URL. Note that the format of a SQLAlchemy url is:: + + driver://user:pass@host/database + +This means that the actual filename to be used starts with the characters to +the **right** of the third slash. So connecting to a relative filepath +looks like:: + + # relative path + e = create_engine('sqlite:///path/to/database.db') + +An absolute path, which is denoted by starting with a slash, means you +need **four** slashes:: + + # absolute path + e = create_engine('sqlite:////path/to/database.db') + +To use a Windows path, regular drive specifications and backslashes can be +used. Double backslashes are probably needed:: + + # absolute path on Windows + e = create_engine('sqlite:///C:\\path\\to\\database.db') + +The sqlite ``:memory:`` identifier is the default if no filepath is +present. Specify ``sqlite://`` and nothing else:: + + # in-memory database + e = create_engine('sqlite://') + +Compatibility with sqlite3 "native" date and datetime types +----------------------------------------------------------- + +The pysqlite driver includes the sqlite3.PARSE_DECLTYPES and +sqlite3.PARSE_COLNAMES options, which have the effect of any column +or expression explicitly cast as "date" or "timestamp" will be converted +to a Python date or datetime object. The date and datetime types provided +with the pysqlite dialect are not currently compatible with these options, +since they render the ISO date/datetime including microseconds, which +pysqlite's driver does not. Additionally, SQLAlchemy does not at +this time automatically render the "cast" syntax required for the +freestanding functions "current_timestamp" and "current_date" to return +datetime/date types natively. Unfortunately, pysqlite +does not provide the standard DBAPI types in ``cursor.description``, +leaving SQLAlchemy with no way to detect these types on the fly +without expensive per-row type checks. + +Keeping in mind that pysqlite's parsing option is not recommended, +nor should be necessary, for use with SQLAlchemy, usage of PARSE_DECLTYPES +can be forced if one configures "native_datetime=True" on create_engine():: + + engine = create_engine('sqlite://', + connect_args={'detect_types': + sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES}, + native_datetime=True + ) + +With this flag enabled, the DATE and TIMESTAMP types (but note - not the +DATETIME or TIME types...confused yet ?) will not perform any bind parameter +or result processing. Execution of "func.current_date()" will return a string. +"func.current_timestamp()" is registered as returning a DATETIME type in +SQLAlchemy, so this function still receives SQLAlchemy-level result +processing. + +.. _pysqlite_threading_pooling: + +Threading/Pooling Behavior +--------------------------- + +Pysqlite's default behavior is to prohibit the usage of a single connection +in more than one thread. This is originally intended to work with older +versions of SQLite that did not support multithreaded operation under +various circumstances. In particular, older SQLite versions +did not allow a ``:memory:`` database to be used in multiple threads +under any circumstances. + +Pysqlite does include a now-undocumented flag known as +``check_same_thread`` which will disable this check, however note that +pysqlite connections are still not safe to use in concurrently in multiple +threads. In particular, any statement execution calls would need to be +externally mutexed, as Pysqlite does not provide for thread-safe propagation +of error messages among other things. So while even ``:memory:`` databases +can be shared among threads in modern SQLite, Pysqlite doesn't provide enough +thread-safety to make this usage worth it. + +SQLAlchemy sets up pooling to work with Pysqlite's default behavior: + +* When a ``:memory:`` SQLite database is specified, the dialect by default + will use :class:`.SingletonThreadPool`. This pool maintains a single + connection per thread, so that all access to the engine within the current + thread use the same ``:memory:`` database - other threads would access a + different ``:memory:`` database. +* When a file-based database is specified, the dialect will use + :class:`.NullPool` as the source of connections. This pool closes and + discards connections which are returned to the pool immediately. SQLite + file-based connections have extremely low overhead, so pooling is not + necessary. The scheme also prevents a connection from being used again in + a different thread and works best with SQLite's coarse-grained file locking. + + .. versionchanged:: 0.7 + Default selection of :class:`.NullPool` for SQLite file-based databases. + Previous versions select :class:`.SingletonThreadPool` by + default for all SQLite databases. + + +Using a Memory Database in Multiple Threads +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To use a ``:memory:`` database in a multithreaded scenario, the same +connection object must be shared among threads, since the database exists +only within the scope of that connection. The +:class:`.StaticPool` implementation will maintain a single connection +globally, and the ``check_same_thread`` flag can be passed to Pysqlite +as ``False``:: + + from sqlalchemy.pool import StaticPool + engine = create_engine('sqlite://', + connect_args={'check_same_thread':False}, + poolclass=StaticPool) + +Note that using a ``:memory:`` database in multiple threads requires a recent +version of SQLite. + +Using Temporary Tables with SQLite +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Due to the way SQLite deals with temporary tables, if you wish to use a +temporary table in a file-based SQLite database across multiple checkouts +from the connection pool, such as when using an ORM :class:`.Session` where +the temporary table should continue to remain after :meth:`.Session.commit` or +:meth:`.Session.rollback` is called, a pool which maintains a single +connection must be used. Use :class:`.SingletonThreadPool` if the scope is +only needed within the current thread, or :class:`.StaticPool` is scope is +needed within multiple threads for this case:: + + # maintain the same connection per thread + from sqlalchemy.pool import SingletonThreadPool + engine = create_engine('sqlite:///mydb.db', + poolclass=SingletonThreadPool) + + + # maintain the same connection across all threads + from sqlalchemy.pool import StaticPool + engine = create_engine('sqlite:///mydb.db', + poolclass=StaticPool) + +Note that :class:`.SingletonThreadPool` should be configured for the number +of threads that are to be used; beyond that number, connections will be +closed out in a non deterministic way. + +Unicode +------- + +The pysqlite driver only returns Python ``unicode`` objects in result sets, +never plain strings, and accommodates ``unicode`` objects within bound +parameter values in all cases. Regardless of the SQLAlchemy string type in +use, string-based result values will by Python ``unicode`` in Python 2. +The :class:`.Unicode` type should still be used to indicate those columns that +require unicode, however, so that non-``unicode`` values passed inadvertently +will emit a warning. Pysqlite will emit an error if a non-``unicode`` string +is passed containing non-ASCII characters. + +.. _pysqlite_serializable: + +Serializable isolation / Savepoints / Transactional DDL +------------------------------------------------------- + +In the section :ref:`sqlite_concurrency`, we refer to the pysqlite +driver's assortment of issues that prevent several features of SQLite +from working correctly. The pysqlite DBAPI driver has several +long-standing bugs which impact the correctness of its transactional +behavior. In its default mode of operation, SQLite features such as +SERIALIZABLE isolation, transactional DDL, and SAVEPOINT support are +non-functional, and in order to use these features, workarounds must +be taken. + +The issue is essentially that the driver attempts to second-guess the user's +intent, failing to start transactions and sometimes ending them prematurely, in +an effort to minimize the SQLite databases's file locking behavior, even +though SQLite itself uses "shared" locks for read-only activities. + +SQLAlchemy chooses to not alter this behavior by default, as it is the +long-expected behavior of the pysqlite driver; if and when the pysqlite +driver attempts to repair these issues, that will be more of a driver towards +defaults for SQLAlchemy. + +The good news is that with a few events, we can implement transactional +support fully, by disabling pysqlite's feature entirely and emitting BEGIN +ourselves. This is achieved using two event listeners:: + + from sqlalchemy import create_engine, event + + engine = create_engine("sqlite:///myfile.db") + + @event.listens_for(engine, "connect") + def do_connect(dbapi_connection, connection_record): + # disable pysqlite's emitting of the BEGIN statement entirely. + # also stops it from emitting COMMIT before any DDL. + dbapi_connection.isolation_level = None + + @event.listens_for(engine, "begin") + def do_begin(conn): + # emit our own BEGIN + conn.execute("BEGIN") + +Above, we intercept a new pysqlite connection and disable any transactional +integration. Then, at the point at which SQLAlchemy knows that transaction +scope is to begin, we emit ``"BEGIN"`` ourselves. + +When we take control of ``"BEGIN"``, we can also control directly SQLite's +locking modes, introduced at `BEGIN TRANSACTION `_, +by adding the desired locking mode to our ``"BEGIN"``:: + + @event.listens_for(engine, "begin") + def do_begin(conn): + conn.execute("BEGIN EXCLUSIVE") + +.. seealso:: + + `BEGIN TRANSACTION `_ - on the SQLite site + + `sqlite3 SELECT does not BEGIN a transaction `_ - on the Python bug tracker + + `sqlite3 module breaks transactions and potentially corrupts data `_ - on the Python bug tracker + + +""" + +from sqlalchemy.dialects.sqlite.base import SQLiteDialect, DATETIME, DATE +from sqlalchemy import exc, pool +from sqlalchemy import types as sqltypes +from sqlalchemy import util + +import os + + +class _SQLite_pysqliteTimeStamp(DATETIME): + def bind_processor(self, dialect): + if dialect.native_datetime: + return None + else: + return DATETIME.bind_processor(self, dialect) + + def result_processor(self, dialect, coltype): + if dialect.native_datetime: + return None + else: + return DATETIME.result_processor(self, dialect, coltype) + + +class _SQLite_pysqliteDate(DATE): + def bind_processor(self, dialect): + if dialect.native_datetime: + return None + else: + return DATE.bind_processor(self, dialect) + + def result_processor(self, dialect, coltype): + if dialect.native_datetime: + return None + else: + return DATE.result_processor(self, dialect, coltype) + + +class SQLiteDialect_pysqlite(SQLiteDialect): + default_paramstyle = 'qmark' + + colspecs = util.update_copy( + SQLiteDialect.colspecs, + { + sqltypes.Date: _SQLite_pysqliteDate, + sqltypes.TIMESTAMP: _SQLite_pysqliteTimeStamp, + } + ) + + if not util.py2k: + description_encoding = None + + driver = 'pysqlite' + + def __init__(self, **kwargs): + SQLiteDialect.__init__(self, **kwargs) + + if self.dbapi is not None: + sqlite_ver = self.dbapi.version_info + if sqlite_ver < (2, 1, 3): + util.warn( + ("The installed version of pysqlite2 (%s) is out-dated " + "and will cause errors in some cases. Version 2.1.3 " + "or greater is recommended.") % + '.'.join([str(subver) for subver in sqlite_ver])) + + @classmethod + def dbapi(cls): + try: + from pysqlite2 import dbapi2 as sqlite + except ImportError as e: + try: + from sqlite3 import dbapi2 as sqlite # try 2.5+ stdlib name. + except ImportError: + raise e + return sqlite + + @classmethod + def get_pool_class(cls, url): + if url.database and url.database != ':memory:': + return pool.NullPool + else: + return pool.SingletonThreadPool + + def _get_server_version_info(self, connection): + return self.dbapi.sqlite_version_info + + def create_connect_args(self, url): + if url.username or url.password or url.host or url.port: + raise exc.ArgumentError( + "Invalid SQLite URL: %s\n" + "Valid SQLite URL forms are:\n" + " sqlite:///:memory: (or, sqlite://)\n" + " sqlite:///relative/path/to/file.db\n" + " sqlite:////absolute/path/to/file.db" % (url,)) + filename = url.database or ':memory:' + if filename != ':memory:': + filename = os.path.abspath(filename) + + opts = url.query.copy() + util.coerce_kw_type(opts, 'timeout', float) + util.coerce_kw_type(opts, 'isolation_level', str) + util.coerce_kw_type(opts, 'detect_types', int) + util.coerce_kw_type(opts, 'check_same_thread', bool) + util.coerce_kw_type(opts, 'cached_statements', int) + + return ([filename], opts) + + def is_disconnect(self, e, connection, cursor): + return isinstance(e, self.dbapi.ProgrammingError) and \ + "Cannot operate on a closed database." in str(e) + +dialect = SQLiteDialect_pysqlite diff --git a/app/lib/sqlalchemy/dialects/sybase/__init__.py b/app/lib/sqlalchemy/dialects/sybase/__init__.py new file mode 100644 index 0000000..1e72790 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/sybase/__init__.py @@ -0,0 +1,28 @@ +# sybase/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from sqlalchemy.dialects.sybase import base, pysybase, pyodbc + +# default dialect +base.dialect = pyodbc.dialect + +from .base import CHAR, VARCHAR, TIME, NCHAR, NVARCHAR,\ + TEXT, DATE, DATETIME, FLOAT, NUMERIC,\ + BIGINT, INT, INTEGER, SMALLINT, BINARY,\ + VARBINARY, UNITEXT, UNICHAR, UNIVARCHAR,\ + IMAGE, BIT, MONEY, SMALLMONEY, TINYINT,\ + dialect + + +__all__ = ( + 'CHAR', 'VARCHAR', 'TIME', 'NCHAR', 'NVARCHAR', + 'TEXT', 'DATE', 'DATETIME', 'FLOAT', 'NUMERIC', + 'BIGINT', 'INT', 'INTEGER', 'SMALLINT', 'BINARY', + 'VARBINARY', 'UNITEXT', 'UNICHAR', 'UNIVARCHAR', + 'IMAGE', 'BIT', 'MONEY', 'SMALLMONEY', 'TINYINT', + 'dialect' +) diff --git a/app/lib/sqlalchemy/dialects/sybase/base.py b/app/lib/sqlalchemy/dialects/sybase/base.py new file mode 100644 index 0000000..5d2f0f7 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/sybase/base.py @@ -0,0 +1,821 @@ +# sybase/base.py +# Copyright (C) 2010-2017 the SQLAlchemy authors and contributors +# +# get_select_precolumns(), limit_clause() implementation +# copyright (C) 2007 Fisch Asset Management +# AG http://www.fam.ch, with coding by Alexander Houben +# alexander.houben@thor-solutions.ch +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" + +.. dialect:: sybase + :name: Sybase + +.. note:: + + The Sybase dialect functions on current SQLAlchemy versions + but is not regularly tested, and may have many issues and + caveats not currently handled. + +""" +import operator +import re + +from sqlalchemy.sql import compiler, expression, text, bindparam +from sqlalchemy.engine import default, base, reflection +from sqlalchemy import types as sqltypes +from sqlalchemy.sql import operators as sql_operators +from sqlalchemy import schema as sa_schema +from sqlalchemy import util, sql, exc + +from sqlalchemy.types import CHAR, VARCHAR, TIME, NCHAR, NVARCHAR,\ + TEXT, DATE, DATETIME, FLOAT, NUMERIC,\ + BIGINT, INT, INTEGER, SMALLINT, BINARY,\ + VARBINARY, DECIMAL, TIMESTAMP, Unicode,\ + UnicodeText, REAL + +RESERVED_WORDS = set([ + "add", "all", "alter", "and", + "any", "as", "asc", "backup", + "begin", "between", "bigint", "binary", + "bit", "bottom", "break", "by", + "call", "capability", "cascade", "case", + "cast", "char", "char_convert", "character", + "check", "checkpoint", "close", "comment", + "commit", "connect", "constraint", "contains", + "continue", "convert", "create", "cross", + "cube", "current", "current_timestamp", "current_user", + "cursor", "date", "dbspace", "deallocate", + "dec", "decimal", "declare", "default", + "delete", "deleting", "desc", "distinct", + "do", "double", "drop", "dynamic", + "else", "elseif", "encrypted", "end", + "endif", "escape", "except", "exception", + "exec", "execute", "existing", "exists", + "externlogin", "fetch", "first", "float", + "for", "force", "foreign", "forward", + "from", "full", "goto", "grant", + "group", "having", "holdlock", "identified", + "if", "in", "index", "index_lparen", + "inner", "inout", "insensitive", "insert", + "inserting", "install", "instead", "int", + "integer", "integrated", "intersect", "into", + "iq", "is", "isolation", "join", + "key", "lateral", "left", "like", + "lock", "login", "long", "match", + "membership", "message", "mode", "modify", + "natural", "new", "no", "noholdlock", + "not", "notify", "null", "numeric", + "of", "off", "on", "open", + "option", "options", "or", "order", + "others", "out", "outer", "over", + "passthrough", "precision", "prepare", "primary", + "print", "privileges", "proc", "procedure", + "publication", "raiserror", "readtext", "real", + "reference", "references", "release", "remote", + "remove", "rename", "reorganize", "resource", + "restore", "restrict", "return", "revoke", + "right", "rollback", "rollup", "save", + "savepoint", "scroll", "select", "sensitive", + "session", "set", "setuser", "share", + "smallint", "some", "sqlcode", "sqlstate", + "start", "stop", "subtrans", "subtransaction", + "synchronize", "syntax_error", "table", "temporary", + "then", "time", "timestamp", "tinyint", + "to", "top", "tran", "trigger", + "truncate", "tsequal", "unbounded", "union", + "unique", "unknown", "unsigned", "update", + "updating", "user", "using", "validate", + "values", "varbinary", "varchar", "variable", + "varying", "view", "wait", "waitfor", + "when", "where", "while", "window", + "with", "with_cube", "with_lparen", "with_rollup", + "within", "work", "writetext", +]) + + +class _SybaseUnitypeMixin(object): + """these types appear to return a buffer object.""" + + def result_processor(self, dialect, coltype): + def process(value): + if value is not None: + return str(value) # decode("ucs-2") + else: + return None + return process + + +class UNICHAR(_SybaseUnitypeMixin, sqltypes.Unicode): + __visit_name__ = 'UNICHAR' + + +class UNIVARCHAR(_SybaseUnitypeMixin, sqltypes.Unicode): + __visit_name__ = 'UNIVARCHAR' + + +class UNITEXT(_SybaseUnitypeMixin, sqltypes.UnicodeText): + __visit_name__ = 'UNITEXT' + + +class TINYINT(sqltypes.Integer): + __visit_name__ = 'TINYINT' + + +class BIT(sqltypes.TypeEngine): + __visit_name__ = 'BIT' + + +class MONEY(sqltypes.TypeEngine): + __visit_name__ = "MONEY" + + +class SMALLMONEY(sqltypes.TypeEngine): + __visit_name__ = "SMALLMONEY" + + +class UNIQUEIDENTIFIER(sqltypes.TypeEngine): + __visit_name__ = "UNIQUEIDENTIFIER" + + +class IMAGE(sqltypes.LargeBinary): + __visit_name__ = 'IMAGE' + + +class SybaseTypeCompiler(compiler.GenericTypeCompiler): + def visit_large_binary(self, type_, **kw): + return self.visit_IMAGE(type_) + + def visit_boolean(self, type_, **kw): + return self.visit_BIT(type_) + + def visit_unicode(self, type_, **kw): + return self.visit_NVARCHAR(type_) + + def visit_UNICHAR(self, type_, **kw): + return "UNICHAR(%d)" % type_.length + + def visit_UNIVARCHAR(self, type_, **kw): + return "UNIVARCHAR(%d)" % type_.length + + def visit_UNITEXT(self, type_, **kw): + return "UNITEXT" + + def visit_TINYINT(self, type_, **kw): + return "TINYINT" + + def visit_IMAGE(self, type_, **kw): + return "IMAGE" + + def visit_BIT(self, type_, **kw): + return "BIT" + + def visit_MONEY(self, type_, **kw): + return "MONEY" + + def visit_SMALLMONEY(self, type_, **kw): + return "SMALLMONEY" + + def visit_UNIQUEIDENTIFIER(self, type_, **kw): + return "UNIQUEIDENTIFIER" + +ischema_names = { + 'bigint': BIGINT, + 'int': INTEGER, + 'integer': INTEGER, + 'smallint': SMALLINT, + 'tinyint': TINYINT, + 'unsigned bigint': BIGINT, # TODO: unsigned flags + 'unsigned int': INTEGER, # TODO: unsigned flags + 'unsigned smallint': SMALLINT, # TODO: unsigned flags + 'numeric': NUMERIC, + 'decimal': DECIMAL, + 'dec': DECIMAL, + 'float': FLOAT, + 'double': NUMERIC, # TODO + 'double precision': NUMERIC, # TODO + 'real': REAL, + 'smallmoney': SMALLMONEY, + 'money': MONEY, + 'smalldatetime': DATETIME, + 'datetime': DATETIME, + 'date': DATE, + 'time': TIME, + 'char': CHAR, + 'character': CHAR, + 'varchar': VARCHAR, + 'character varying': VARCHAR, + 'char varying': VARCHAR, + 'unichar': UNICHAR, + 'unicode character': UNIVARCHAR, + 'nchar': NCHAR, + 'national char': NCHAR, + 'national character': NCHAR, + 'nvarchar': NVARCHAR, + 'nchar varying': NVARCHAR, + 'national char varying': NVARCHAR, + 'national character varying': NVARCHAR, + 'text': TEXT, + 'unitext': UNITEXT, + 'binary': BINARY, + 'varbinary': VARBINARY, + 'image': IMAGE, + 'bit': BIT, + + # not in documentation for ASE 15.7 + 'long varchar': TEXT, # TODO + 'timestamp': TIMESTAMP, + 'uniqueidentifier': UNIQUEIDENTIFIER, + +} + + +class SybaseInspector(reflection.Inspector): + + def __init__(self, conn): + reflection.Inspector.__init__(self, conn) + + def get_table_id(self, table_name, schema=None): + """Return the table id from `table_name` and `schema`.""" + + return self.dialect.get_table_id(self.bind, table_name, schema, + info_cache=self.info_cache) + + +class SybaseExecutionContext(default.DefaultExecutionContext): + _enable_identity_insert = False + + def set_ddl_autocommit(self, connection, value): + """Must be implemented by subclasses to accommodate DDL executions. + + "connection" is the raw unwrapped DBAPI connection. "value" + is True or False. when True, the connection should be configured + such that a DDL can take place subsequently. when False, + a DDL has taken place and the connection should be resumed + into non-autocommit mode. + + """ + raise NotImplementedError() + + def pre_exec(self): + if self.isinsert: + tbl = self.compiled.statement.table + seq_column = tbl._autoincrement_column + insert_has_sequence = seq_column is not None + + if insert_has_sequence: + self._enable_identity_insert = \ + seq_column.key in self.compiled_parameters[0] + else: + self._enable_identity_insert = False + + if self._enable_identity_insert: + self.cursor.execute( + "SET IDENTITY_INSERT %s ON" % + self.dialect.identifier_preparer.format_table(tbl)) + + if self.isddl: + # TODO: to enhance this, we can detect "ddl in tran" on the + # database settings. this error message should be improved to + # include a note about that. + if not self.should_autocommit: + raise exc.InvalidRequestError( + "The Sybase dialect only supports " + "DDL in 'autocommit' mode at this time.") + + self.root_connection.engine.logger.info( + "AUTOCOMMIT (Assuming no Sybase 'ddl in tran')") + + self.set_ddl_autocommit( + self.root_connection.connection.connection, + True) + + def post_exec(self): + if self.isddl: + self.set_ddl_autocommit(self.root_connection, False) + + if self._enable_identity_insert: + self.cursor.execute( + "SET IDENTITY_INSERT %s OFF" % + self.dialect.identifier_preparer. + format_table(self.compiled.statement.table) + ) + + def get_lastrowid(self): + cursor = self.create_cursor() + cursor.execute("SELECT @@identity AS lastrowid") + lastrowid = cursor.fetchone()[0] + cursor.close() + return lastrowid + + +class SybaseSQLCompiler(compiler.SQLCompiler): + ansi_bind_rules = True + + extract_map = util.update_copy( + compiler.SQLCompiler.extract_map, + { + 'doy': 'dayofyear', + 'dow': 'weekday', + 'milliseconds': 'millisecond' + }) + + def get_select_precolumns(self, select, **kw): + s = select._distinct and "DISTINCT " or "" + # TODO: don't think Sybase supports + # bind params for FIRST / TOP + limit = select._limit + if limit: + # if select._limit == 1: + # s += "FIRST " + # else: + # s += "TOP %s " % (select._limit,) + s += "TOP %s " % (limit,) + offset = select._offset + if offset: + raise NotImplementedError("Sybase ASE does not support OFFSET") + return s + + def get_from_hint_text(self, table, text): + return text + + def limit_clause(self, select, **kw): + # Limit in sybase is after the select keyword + return "" + + def visit_extract(self, extract, **kw): + field = self.extract_map.get(extract.field, extract.field) + return 'DATEPART("%s", %s)' % ( + field, self.process(extract.expr, **kw)) + + def visit_now_func(self, fn, **kw): + return "GETDATE()" + + def for_update_clause(self, select): + # "FOR UPDATE" is only allowed on "DECLARE CURSOR" + # which SQLAlchemy doesn't use + return '' + + def order_by_clause(self, select, **kw): + kw['literal_binds'] = True + order_by = self.process(select._order_by_clause, **kw) + + # SybaseSQL only allows ORDER BY in subqueries if there is a LIMIT + if order_by and (not self.is_subquery() or select._limit): + return " ORDER BY " + order_by + else: + return "" + + +class SybaseDDLCompiler(compiler.DDLCompiler): + def get_column_specification(self, column, **kwargs): + colspec = self.preparer.format_column(column) + " " + \ + self.dialect.type_compiler.process( + column.type, type_expression=column) + + if column.table is None: + raise exc.CompileError( + "The Sybase dialect requires Table-bound " + "columns in order to generate DDL") + seq_col = column.table._autoincrement_column + + # install a IDENTITY Sequence if we have an implicit IDENTITY column + if seq_col is column: + sequence = isinstance(column.default, sa_schema.Sequence) \ + and column.default + if sequence: + start, increment = sequence.start or 1, \ + sequence.increment or 1 + else: + start, increment = 1, 1 + if (start, increment) == (1, 1): + colspec += " IDENTITY" + else: + # TODO: need correct syntax for this + colspec += " IDENTITY(%s,%s)" % (start, increment) + else: + default = self.get_column_default_string(column) + if default is not None: + colspec += " DEFAULT " + default + + if column.nullable is not None: + if not column.nullable or column.primary_key: + colspec += " NOT NULL" + else: + colspec += " NULL" + + return colspec + + def visit_drop_index(self, drop): + index = drop.element + return "\nDROP INDEX %s.%s" % ( + self.preparer.quote_identifier(index.table.name), + self._prepared_index_name(drop.element, + include_schema=False) + ) + + +class SybaseIdentifierPreparer(compiler.IdentifierPreparer): + reserved_words = RESERVED_WORDS + + +class SybaseDialect(default.DefaultDialect): + name = 'sybase' + supports_unicode_statements = False + supports_sane_rowcount = False + supports_sane_multi_rowcount = False + + supports_native_boolean = False + supports_unicode_binds = False + postfetch_lastrowid = True + + colspecs = {} + ischema_names = ischema_names + + type_compiler = SybaseTypeCompiler + statement_compiler = SybaseSQLCompiler + ddl_compiler = SybaseDDLCompiler + preparer = SybaseIdentifierPreparer + inspector = SybaseInspector + + construct_arguments = [] + + def _get_default_schema_name(self, connection): + return connection.scalar( + text("SELECT user_name() as user_name", + typemap={'user_name': Unicode}) + ) + + def initialize(self, connection): + super(SybaseDialect, self).initialize(connection) + if self.server_version_info is not None and\ + self.server_version_info < (15, ): + self.max_identifier_length = 30 + else: + self.max_identifier_length = 255 + + def get_table_id(self, connection, table_name, schema=None, **kw): + """Fetch the id for schema.table_name. + + Several reflection methods require the table id. The idea for using + this method is that it can be fetched one time and cached for + subsequent calls. + + """ + + table_id = None + if schema is None: + schema = self.default_schema_name + + TABLEID_SQL = text(""" + SELECT o.id AS id + FROM sysobjects o JOIN sysusers u ON o.uid=u.uid + WHERE u.name = :schema_name + AND o.name = :table_name + AND o.type in ('U', 'V') + """) + + if util.py2k: + if isinstance(schema, unicode): + schema = schema.encode("ascii") + if isinstance(table_name, unicode): + table_name = table_name.encode("ascii") + result = connection.execute(TABLEID_SQL, + schema_name=schema, + table_name=table_name) + table_id = result.scalar() + if table_id is None: + raise exc.NoSuchTableError(table_name) + return table_id + + @reflection.cache + def get_columns(self, connection, table_name, schema=None, **kw): + table_id = self.get_table_id(connection, table_name, schema, + info_cache=kw.get("info_cache")) + + COLUMN_SQL = text(""" + SELECT col.name AS name, + t.name AS type, + (col.status & 8) AS nullable, + (col.status & 128) AS autoincrement, + com.text AS 'default', + col.prec AS precision, + col.scale AS scale, + col.length AS length + FROM systypes t, syscolumns col LEFT OUTER JOIN syscomments com ON + col.cdefault = com.id + WHERE col.usertype = t.usertype + AND col.id = :table_id + ORDER BY col.colid + """) + + results = connection.execute(COLUMN_SQL, table_id=table_id) + + columns = [] + for (name, type_, nullable, autoincrement, default, precision, scale, + length) in results: + col_info = self._get_column_info(name, type_, bool(nullable), + bool(autoincrement), + default, precision, scale, + length) + columns.append(col_info) + + return columns + + def _get_column_info(self, name, type_, nullable, autoincrement, default, + precision, scale, length): + + coltype = self.ischema_names.get(type_, None) + + kwargs = {} + + if coltype in (NUMERIC, DECIMAL): + args = (precision, scale) + elif coltype == FLOAT: + args = (precision,) + elif coltype in (CHAR, VARCHAR, UNICHAR, UNIVARCHAR, NCHAR, NVARCHAR): + args = (length,) + else: + args = () + + if coltype: + coltype = coltype(*args, **kwargs) + # is this necessary + # if is_array: + # coltype = ARRAY(coltype) + else: + util.warn("Did not recognize type '%s' of column '%s'" % + (type_, name)) + coltype = sqltypes.NULLTYPE + + if default: + default = default.replace("DEFAULT", "").strip() + default = re.sub("^'(.*)'$", lambda m: m.group(1), default) + else: + default = None + + column_info = dict(name=name, type=coltype, nullable=nullable, + default=default, autoincrement=autoincrement) + return column_info + + @reflection.cache + def get_foreign_keys(self, connection, table_name, schema=None, **kw): + + table_id = self.get_table_id(connection, table_name, schema, + info_cache=kw.get("info_cache")) + + table_cache = {} + column_cache = {} + foreign_keys = [] + + table_cache[table_id] = {"name": table_name, "schema": schema} + + COLUMN_SQL = text(""" + SELECT c.colid AS id, c.name AS name + FROM syscolumns c + WHERE c.id = :table_id + """) + + results = connection.execute(COLUMN_SQL, table_id=table_id) + columns = {} + for col in results: + columns[col["id"]] = col["name"] + column_cache[table_id] = columns + + REFCONSTRAINT_SQL = text(""" + SELECT o.name AS name, r.reftabid AS reftable_id, + r.keycnt AS 'count', + r.fokey1 AS fokey1, r.fokey2 AS fokey2, r.fokey3 AS fokey3, + r.fokey4 AS fokey4, r.fokey5 AS fokey5, r.fokey6 AS fokey6, + r.fokey7 AS fokey7, r.fokey1 AS fokey8, r.fokey9 AS fokey9, + r.fokey10 AS fokey10, r.fokey11 AS fokey11, r.fokey12 AS fokey12, + r.fokey13 AS fokey13, r.fokey14 AS fokey14, r.fokey15 AS fokey15, + r.fokey16 AS fokey16, + r.refkey1 AS refkey1, r.refkey2 AS refkey2, r.refkey3 AS refkey3, + r.refkey4 AS refkey4, r.refkey5 AS refkey5, r.refkey6 AS refkey6, + r.refkey7 AS refkey7, r.refkey1 AS refkey8, r.refkey9 AS refkey9, + r.refkey10 AS refkey10, r.refkey11 AS refkey11, + r.refkey12 AS refkey12, r.refkey13 AS refkey13, + r.refkey14 AS refkey14, r.refkey15 AS refkey15, + r.refkey16 AS refkey16 + FROM sysreferences r JOIN sysobjects o on r.tableid = o.id + WHERE r.tableid = :table_id + """) + referential_constraints = connection.execute( + REFCONSTRAINT_SQL, table_id=table_id).fetchall() + + REFTABLE_SQL = text(""" + SELECT o.name AS name, u.name AS 'schema' + FROM sysobjects o JOIN sysusers u ON o.uid = u.uid + WHERE o.id = :table_id + """) + + for r in referential_constraints: + reftable_id = r["reftable_id"] + + if reftable_id not in table_cache: + c = connection.execute(REFTABLE_SQL, table_id=reftable_id) + reftable = c.fetchone() + c.close() + table_info = {"name": reftable["name"], "schema": None} + if (schema is not None or + reftable["schema"] != self.default_schema_name): + table_info["schema"] = reftable["schema"] + + table_cache[reftable_id] = table_info + results = connection.execute(COLUMN_SQL, table_id=reftable_id) + reftable_columns = {} + for col in results: + reftable_columns[col["id"]] = col["name"] + column_cache[reftable_id] = reftable_columns + + reftable = table_cache[reftable_id] + reftable_columns = column_cache[reftable_id] + + constrained_columns = [] + referred_columns = [] + for i in range(1, r["count"] + 1): + constrained_columns.append(columns[r["fokey%i" % i]]) + referred_columns.append(reftable_columns[r["refkey%i" % i]]) + + fk_info = { + "constrained_columns": constrained_columns, + "referred_schema": reftable["schema"], + "referred_table": reftable["name"], + "referred_columns": referred_columns, + "name": r["name"] + } + + foreign_keys.append(fk_info) + + return foreign_keys + + @reflection.cache + def get_indexes(self, connection, table_name, schema=None, **kw): + table_id = self.get_table_id(connection, table_name, schema, + info_cache=kw.get("info_cache")) + + INDEX_SQL = text(""" + SELECT object_name(i.id) AS table_name, + i.keycnt AS 'count', + i.name AS name, + (i.status & 0x2) AS 'unique', + index_col(object_name(i.id), i.indid, 1) AS col_1, + index_col(object_name(i.id), i.indid, 2) AS col_2, + index_col(object_name(i.id), i.indid, 3) AS col_3, + index_col(object_name(i.id), i.indid, 4) AS col_4, + index_col(object_name(i.id), i.indid, 5) AS col_5, + index_col(object_name(i.id), i.indid, 6) AS col_6, + index_col(object_name(i.id), i.indid, 7) AS col_7, + index_col(object_name(i.id), i.indid, 8) AS col_8, + index_col(object_name(i.id), i.indid, 9) AS col_9, + index_col(object_name(i.id), i.indid, 10) AS col_10, + index_col(object_name(i.id), i.indid, 11) AS col_11, + index_col(object_name(i.id), i.indid, 12) AS col_12, + index_col(object_name(i.id), i.indid, 13) AS col_13, + index_col(object_name(i.id), i.indid, 14) AS col_14, + index_col(object_name(i.id), i.indid, 15) AS col_15, + index_col(object_name(i.id), i.indid, 16) AS col_16 + FROM sysindexes i, sysobjects o + WHERE o.id = i.id + AND o.id = :table_id + AND (i.status & 2048) = 0 + AND i.indid BETWEEN 1 AND 254 + """) + + results = connection.execute(INDEX_SQL, table_id=table_id) + indexes = [] + for r in results: + column_names = [] + for i in range(1, r["count"]): + column_names.append(r["col_%i" % (i,)]) + index_info = {"name": r["name"], + "unique": bool(r["unique"]), + "column_names": column_names} + indexes.append(index_info) + + return indexes + + @reflection.cache + def get_pk_constraint(self, connection, table_name, schema=None, **kw): + table_id = self.get_table_id(connection, table_name, schema, + info_cache=kw.get("info_cache")) + + PK_SQL = text(""" + SELECT object_name(i.id) AS table_name, + i.keycnt AS 'count', + i.name AS name, + index_col(object_name(i.id), i.indid, 1) AS pk_1, + index_col(object_name(i.id), i.indid, 2) AS pk_2, + index_col(object_name(i.id), i.indid, 3) AS pk_3, + index_col(object_name(i.id), i.indid, 4) AS pk_4, + index_col(object_name(i.id), i.indid, 5) AS pk_5, + index_col(object_name(i.id), i.indid, 6) AS pk_6, + index_col(object_name(i.id), i.indid, 7) AS pk_7, + index_col(object_name(i.id), i.indid, 8) AS pk_8, + index_col(object_name(i.id), i.indid, 9) AS pk_9, + index_col(object_name(i.id), i.indid, 10) AS pk_10, + index_col(object_name(i.id), i.indid, 11) AS pk_11, + index_col(object_name(i.id), i.indid, 12) AS pk_12, + index_col(object_name(i.id), i.indid, 13) AS pk_13, + index_col(object_name(i.id), i.indid, 14) AS pk_14, + index_col(object_name(i.id), i.indid, 15) AS pk_15, + index_col(object_name(i.id), i.indid, 16) AS pk_16 + FROM sysindexes i, sysobjects o + WHERE o.id = i.id + AND o.id = :table_id + AND (i.status & 2048) = 2048 + AND i.indid BETWEEN 1 AND 254 + """) + + results = connection.execute(PK_SQL, table_id=table_id) + pks = results.fetchone() + results.close() + + constrained_columns = [] + if pks: + for i in range(1, pks["count"] + 1): + constrained_columns.append(pks["pk_%i" % (i,)]) + return {"constrained_columns": constrained_columns, + "name": pks["name"]} + else: + return {"constrained_columns": [], "name": None} + + @reflection.cache + def get_schema_names(self, connection, **kw): + + SCHEMA_SQL = text("SELECT u.name AS name FROM sysusers u") + + schemas = connection.execute(SCHEMA_SQL) + + return [s["name"] for s in schemas] + + @reflection.cache + def get_table_names(self, connection, schema=None, **kw): + if schema is None: + schema = self.default_schema_name + + TABLE_SQL = text(""" + SELECT o.name AS name + FROM sysobjects o JOIN sysusers u ON o.uid = u.uid + WHERE u.name = :schema_name + AND o.type = 'U' + """) + + if util.py2k: + if isinstance(schema, unicode): + schema = schema.encode("ascii") + + tables = connection.execute(TABLE_SQL, schema_name=schema) + + return [t["name"] for t in tables] + + @reflection.cache + def get_view_definition(self, connection, view_name, schema=None, **kw): + if schema is None: + schema = self.default_schema_name + + VIEW_DEF_SQL = text(""" + SELECT c.text + FROM syscomments c JOIN sysobjects o ON c.id = o.id + WHERE o.name = :view_name + AND o.type = 'V' + """) + + if util.py2k: + if isinstance(view_name, unicode): + view_name = view_name.encode("ascii") + + view = connection.execute(VIEW_DEF_SQL, view_name=view_name) + + return view.scalar() + + @reflection.cache + def get_view_names(self, connection, schema=None, **kw): + if schema is None: + schema = self.default_schema_name + + VIEW_SQL = text(""" + SELECT o.name AS name + FROM sysobjects o JOIN sysusers u ON o.uid = u.uid + WHERE u.name = :schema_name + AND o.type = 'V' + """) + + if util.py2k: + if isinstance(schema, unicode): + schema = schema.encode("ascii") + views = connection.execute(VIEW_SQL, schema_name=schema) + + return [v["name"] for v in views] + + def has_table(self, connection, table_name, schema=None): + try: + self.get_table_id(connection, table_name, schema) + except exc.NoSuchTableError: + return False + else: + return True diff --git a/app/lib/sqlalchemy/dialects/sybase/mxodbc.py b/app/lib/sqlalchemy/dialects/sybase/mxodbc.py new file mode 100644 index 0000000..1e77edc --- /dev/null +++ b/app/lib/sqlalchemy/dialects/sybase/mxodbc.py @@ -0,0 +1,33 @@ +# sybase/mxodbc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +""" + +.. dialect:: sybase+mxodbc + :name: mxODBC + :dbapi: mxodbc + :connectstring: sybase+mxodbc://:@ + :url: http://www.egenix.com/ + +.. note:: + + This dialect is a stub only and is likely non functional at this time. + + +""" +from sqlalchemy.dialects.sybase.base import SybaseDialect +from sqlalchemy.dialects.sybase.base import SybaseExecutionContext +from sqlalchemy.connectors.mxodbc import MxODBCConnector + + +class SybaseExecutionContext_mxodbc(SybaseExecutionContext): + pass + + +class SybaseDialect_mxodbc(MxODBCConnector, SybaseDialect): + execution_ctx_cls = SybaseExecutionContext_mxodbc + +dialect = SybaseDialect_mxodbc diff --git a/app/lib/sqlalchemy/dialects/sybase/pyodbc.py b/app/lib/sqlalchemy/dialects/sybase/pyodbc.py new file mode 100644 index 0000000..9690f49 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/sybase/pyodbc.py @@ -0,0 +1,86 @@ +# sybase/pyodbc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: sybase+pyodbc + :name: PyODBC + :dbapi: pyodbc + :connectstring: sybase+pyodbc://:@\ +[/] + :url: http://pypi.python.org/pypi/pyodbc/ + + +Unicode Support +--------------- + +The pyodbc driver currently supports usage of these Sybase types with +Unicode or multibyte strings:: + + CHAR + NCHAR + NVARCHAR + TEXT + VARCHAR + +Currently *not* supported are:: + + UNICHAR + UNITEXT + UNIVARCHAR + +""" + +from sqlalchemy.dialects.sybase.base import SybaseDialect,\ + SybaseExecutionContext +from sqlalchemy.connectors.pyodbc import PyODBCConnector +from sqlalchemy import types as sqltypes, processors +import decimal + + +class _SybNumeric_pyodbc(sqltypes.Numeric): + """Turns Decimals with adjusted() < -6 into floats. + + It's not yet known how to get decimals with many + significant digits or very large adjusted() into Sybase + via pyodbc. + + """ + + def bind_processor(self, dialect): + super_process = super(_SybNumeric_pyodbc, self).\ + bind_processor(dialect) + + def process(value): + if self.asdecimal and \ + isinstance(value, decimal.Decimal): + + if value.adjusted() < -6: + return processors.to_float(value) + + if super_process: + return super_process(value) + else: + return value + return process + + +class SybaseExecutionContext_pyodbc(SybaseExecutionContext): + def set_ddl_autocommit(self, connection, value): + if value: + connection.autocommit = True + else: + connection.autocommit = False + + +class SybaseDialect_pyodbc(PyODBCConnector, SybaseDialect): + execution_ctx_cls = SybaseExecutionContext_pyodbc + + colspecs = { + sqltypes.Numeric: _SybNumeric_pyodbc, + } + +dialect = SybaseDialect_pyodbc diff --git a/app/lib/sqlalchemy/dialects/sybase/pysybase.py b/app/lib/sqlalchemy/dialects/sybase/pysybase.py new file mode 100644 index 0000000..00a7ca3 --- /dev/null +++ b/app/lib/sqlalchemy/dialects/sybase/pysybase.py @@ -0,0 +1,102 @@ +# sybase/pysybase.py +# Copyright (C) 2010-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +.. dialect:: sybase+pysybase + :name: Python-Sybase + :dbapi: Sybase + :connectstring: sybase+pysybase://:@/\ +[database name] + :url: http://python-sybase.sourceforge.net/ + +Unicode Support +--------------- + +The python-sybase driver does not appear to support non-ASCII strings of any +kind at this time. + +""" + +from sqlalchemy import types as sqltypes, processors +from sqlalchemy.dialects.sybase.base import SybaseDialect, \ + SybaseExecutionContext, SybaseSQLCompiler + + +class _SybNumeric(sqltypes.Numeric): + def result_processor(self, dialect, type_): + if not self.asdecimal: + return processors.to_float + else: + return sqltypes.Numeric.result_processor(self, dialect, type_) + + +class SybaseExecutionContext_pysybase(SybaseExecutionContext): + + def set_ddl_autocommit(self, dbapi_connection, value): + if value: + # call commit() on the Sybase connection directly, + # to avoid any side effects of calling a Connection + # transactional method inside of pre_exec() + dbapi_connection.commit() + + def pre_exec(self): + SybaseExecutionContext.pre_exec(self) + + for param in self.parameters: + for key in list(param): + param["@" + key] = param[key] + del param[key] + + +class SybaseSQLCompiler_pysybase(SybaseSQLCompiler): + def bindparam_string(self, name, **kw): + return "@" + name + + +class SybaseDialect_pysybase(SybaseDialect): + driver = 'pysybase' + execution_ctx_cls = SybaseExecutionContext_pysybase + statement_compiler = SybaseSQLCompiler_pysybase + + colspecs = { + sqltypes.Numeric: _SybNumeric, + sqltypes.Float: sqltypes.Float + } + + @classmethod + def dbapi(cls): + import Sybase + return Sybase + + def create_connect_args(self, url): + opts = url.translate_connect_args(username='user', password='passwd') + + return ([opts.pop('host')], opts) + + def do_executemany(self, cursor, statement, parameters, context=None): + # calling python-sybase executemany yields: + # TypeError: string too long for buffer + for param in parameters: + cursor.execute(statement, param) + + def _get_server_version_info(self, connection): + vers = connection.scalar("select @@version_number") + # i.e. 15500, 15000, 12500 == (15, 5, 0, 0), (15, 0, 0, 0), + # (12, 5, 0, 0) + return (vers / 1000, vers % 1000 / 100, vers % 100 / 10, vers % 10) + + def is_disconnect(self, e, connection, cursor): + if isinstance(e, (self.dbapi.OperationalError, + self.dbapi.ProgrammingError)): + msg = str(e) + return ('Unable to complete network request to host' in msg or + 'Invalid connection state' in msg or + 'Invalid cursor state' in msg) + else: + return False + +dialect = SybaseDialect_pysybase diff --git a/app/lib/sqlalchemy/engine/__init__.py b/app/lib/sqlalchemy/engine/__init__.py new file mode 100644 index 0000000..2a6c68d --- /dev/null +++ b/app/lib/sqlalchemy/engine/__init__.py @@ -0,0 +1,434 @@ +# engine/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""SQL connections, SQL execution and high-level DB-API interface. + +The engine package defines the basic components used to interface +DB-API modules with higher-level statement construction, +connection-management, execution and result contexts. The primary +"entry point" class into this package is the Engine and its public +constructor ``create_engine()``. + +This package includes: + +base.py + Defines interface classes and some implementation classes which + comprise the basic components used to interface between a DB-API, + constructed and plain-text statements, connections, transactions, + and results. + +default.py + Contains default implementations of some of the components defined + in base.py. All current database dialects use the classes in + default.py as base classes for their own database-specific + implementations. + +strategies.py + The mechanics of constructing ``Engine`` objects are represented + here. Defines the ``EngineStrategy`` class which represents how + to go from arguments specified to the ``create_engine()`` + function, to a fully constructed ``Engine``, including + initialization of connection pooling, dialects, and specific + subclasses of ``Engine``. + +threadlocal.py + The ``TLEngine`` class is defined here, which is a subclass of + the generic ``Engine`` and tracks ``Connection`` and + ``Transaction`` objects against the identity of the current + thread. This allows certain programming patterns based around + the concept of a "thread-local connection" to be possible. + The ``TLEngine`` is created by using the "threadlocal" engine + strategy in conjunction with the ``create_engine()`` function. + +url.py + Defines the ``URL`` class which represents the individual + components of a string URL passed to ``create_engine()``. Also + defines a basic module-loading strategy for the dialect specifier + within a URL. +""" + +from .interfaces import ( + Connectable, + CreateEnginePlugin, + Dialect, + ExecutionContext, + ExceptionContext, + + # backwards compat + Compiled, + TypeCompiler +) + +from .base import ( + Connection, + Engine, + NestedTransaction, + RootTransaction, + Transaction, + TwoPhaseTransaction, +) + +from .result import ( + BaseRowProxy, + BufferedColumnResultProxy, + BufferedColumnRow, + BufferedRowResultProxy, + FullyBufferedResultProxy, + ResultProxy, + RowProxy, +) + +from .util import ( + connection_memoize +) + + +from . import util, strategies + +# backwards compat +from ..sql import ddl + +default_strategy = 'plain' + + +def create_engine(*args, **kwargs): + """Create a new :class:`.Engine` instance. + + The standard calling form is to send the URL as the + first positional argument, usually a string + that indicates database dialect and connection arguments:: + + + engine = create_engine("postgresql://scott:tiger@localhost/test") + + Additional keyword arguments may then follow it which + establish various options on the resulting :class:`.Engine` + and its underlying :class:`.Dialect` and :class:`.Pool` + constructs:: + + engine = create_engine("mysql://scott:tiger@hostname/dbname", + encoding='latin1', echo=True) + + The string form of the URL is + ``dialect[+driver]://user:password@host/dbname[?key=value..]``, where + ``dialect`` is a database name such as ``mysql``, ``oracle``, + ``postgresql``, etc., and ``driver`` the name of a DBAPI, such as + ``psycopg2``, ``pyodbc``, ``cx_oracle``, etc. Alternatively, + the URL can be an instance of :class:`~sqlalchemy.engine.url.URL`. + + ``**kwargs`` takes a wide variety of options which are routed + towards their appropriate components. Arguments may be specific to + the :class:`.Engine`, the underlying :class:`.Dialect`, as well as the + :class:`.Pool`. Specific dialects also accept keyword arguments that + are unique to that dialect. Here, we describe the parameters + that are common to most :func:`.create_engine()` usage. + + Once established, the newly resulting :class:`.Engine` will + request a connection from the underlying :class:`.Pool` once + :meth:`.Engine.connect` is called, or a method which depends on it + such as :meth:`.Engine.execute` is invoked. The :class:`.Pool` in turn + will establish the first actual DBAPI connection when this request + is received. The :func:`.create_engine` call itself does **not** + establish any actual DBAPI connections directly. + + .. seealso:: + + :doc:`/core/engines` + + :doc:`/dialects/index` + + :ref:`connections_toplevel` + + :param case_sensitive=True: if False, result column names + will match in a case-insensitive fashion, that is, + ``row['SomeColumn']``. + + .. versionchanged:: 0.8 + By default, result row names match case-sensitively. + In version 0.7 and prior, all matches were case-insensitive. + + :param connect_args: a dictionary of options which will be + passed directly to the DBAPI's ``connect()`` method as + additional keyword arguments. See the example + at :ref:`custom_dbapi_args`. + + :param convert_unicode=False: if set to True, sets + the default behavior of ``convert_unicode`` on the + :class:`.String` type to ``True``, regardless + of a setting of ``False`` on an individual + :class:`.String` type, thus causing all :class:`.String` + -based columns + to accommodate Python ``unicode`` objects. This flag + is useful as an engine-wide setting when using a + DBAPI that does not natively support Python + ``unicode`` objects and raises an error when + one is received (such as pyodbc with FreeTDS). + + See :class:`.String` for further details on + what this flag indicates. + + :param creator: a callable which returns a DBAPI connection. + This creation function will be passed to the underlying + connection pool and will be used to create all new database + connections. Usage of this function causes connection + parameters specified in the URL argument to be bypassed. + + :param echo=False: if True, the Engine will log all statements + as well as a repr() of their parameter lists to the engines + logger, which defaults to sys.stdout. The ``echo`` attribute of + ``Engine`` can be modified at any time to turn logging on and + off. If set to the string ``"debug"``, result rows will be + printed to the standard output as well. This flag ultimately + controls a Python logger; see :ref:`dbengine_logging` for + information on how to configure logging directly. + + :param echo_pool=False: if True, the connection pool will log + all checkouts/checkins to the logging stream, which defaults to + sys.stdout. This flag ultimately controls a Python logger; see + :ref:`dbengine_logging` for information on how to configure logging + directly. + + :param encoding: Defaults to ``utf-8``. This is the string + encoding used by SQLAlchemy for string encode/decode + operations which occur within SQLAlchemy, **outside of + the DBAPI.** Most modern DBAPIs feature some degree of + direct support for Python ``unicode`` objects, + what you see in Python 2 as a string of the form + ``u'some string'``. For those scenarios where the + DBAPI is detected as not supporting a Python ``unicode`` + object, this encoding is used to determine the + source/destination encoding. It is **not used** + for those cases where the DBAPI handles unicode + directly. + + To properly configure a system to accommodate Python + ``unicode`` objects, the DBAPI should be + configured to handle unicode to the greatest + degree as is appropriate - see + the notes on unicode pertaining to the specific + target database in use at :ref:`dialect_toplevel`. + + Areas where string encoding may need to be accommodated + outside of the DBAPI include zero or more of: + + * the values passed to bound parameters, corresponding to + the :class:`.Unicode` type or the :class:`.String` type + when ``convert_unicode`` is ``True``; + * the values returned in result set columns corresponding + to the :class:`.Unicode` type or the :class:`.String` + type when ``convert_unicode`` is ``True``; + * the string SQL statement passed to the DBAPI's + ``cursor.execute()`` method; + * the string names of the keys in the bound parameter + dictionary passed to the DBAPI's ``cursor.execute()`` + as well as ``cursor.setinputsizes()`` methods; + * the string column names retrieved from the DBAPI's + ``cursor.description`` attribute. + + When using Python 3, the DBAPI is required to support + *all* of the above values as Python ``unicode`` objects, + which in Python 3 are just known as ``str``. In Python 2, + the DBAPI does not specify unicode behavior at all, + so SQLAlchemy must make decisions for each of the above + values on a per-DBAPI basis - implementations are + completely inconsistent in their behavior. + + :param execution_options: Dictionary execution options which will + be applied to all connections. See + :meth:`~sqlalchemy.engine.Connection.execution_options` + + :param implicit_returning=True: When ``True``, a RETURNING- + compatible construct, if available, will be used to + fetch newly generated primary key values when a single row + INSERT statement is emitted with no existing returning() + clause. This applies to those backends which support RETURNING + or a compatible construct, including PostgreSQL, Firebird, Oracle, + Microsoft SQL Server. Set this to ``False`` to disable + the automatic usage of RETURNING. + + :param isolation_level: this string parameter is interpreted by various + dialects in order to affect the transaction isolation level of the + database connection. The parameter essentially accepts some subset of + these string arguments: ``"SERIALIZABLE"``, ``"REPEATABLE_READ"``, + ``"READ_COMMITTED"``, ``"READ_UNCOMMITTED"`` and ``"AUTOCOMMIT"``. + Behavior here varies per backend, and + individual dialects should be consulted directly. + + Note that the isolation level can also be set on a per-:class:`.Connection` + basis as well, using the + :paramref:`.Connection.execution_options.isolation_level` + feature. + + .. seealso:: + + :attr:`.Connection.default_isolation_level` - view default level + + :paramref:`.Connection.execution_options.isolation_level` + - set per :class:`.Connection` isolation level + + :ref:`SQLite Transaction Isolation ` + + :ref:`PostgreSQL Transaction Isolation ` + + :ref:`MySQL Transaction Isolation ` + + :ref:`session_transaction_isolation` - for the ORM + + :param label_length=None: optional integer value which limits + the size of dynamically generated column labels to that many + characters. If less than 6, labels are generated as + "_(counter)". If ``None``, the value of + ``dialect.max_identifier_length`` is used instead. + + :param listeners: A list of one or more + :class:`~sqlalchemy.interfaces.PoolListener` objects which will + receive connection pool events. + + :param logging_name: String identifier which will be used within + the "name" field of logging records generated within the + "sqlalchemy.engine" logger. Defaults to a hexstring of the + object's id. + + :param max_overflow=10: the number of connections to allow in + connection pool "overflow", that is connections that can be + opened above and beyond the pool_size setting, which defaults + to five. this is only used with :class:`~sqlalchemy.pool.QueuePool`. + + :param module=None: reference to a Python module object (the module + itself, not its string name). Specifies an alternate DBAPI module to + be used by the engine's dialect. Each sub-dialect references a + specific DBAPI which will be imported before first connect. This + parameter causes the import to be bypassed, and the given module to + be used instead. Can be used for testing of DBAPIs as well as to + inject "mock" DBAPI implementations into the :class:`.Engine`. + + :param paramstyle=None: The `paramstyle `_ + to use when rendering bound parameters. This style defaults to the + one recommended by the DBAPI itself, which is retrieved from the + ``.paramstyle`` attribute of the DBAPI. However, most DBAPIs accept + more than one paramstyle, and in particular it may be desirable + to change a "named" paramstyle into a "positional" one, or vice versa. + When this attribute is passed, it should be one of the values + ``"qmark"``, ``"numeric"``, ``"named"``, ``"format"`` or + ``"pyformat"``, and should correspond to a parameter style known + to be supported by the DBAPI in use. + + :param pool=None: an already-constructed instance of + :class:`~sqlalchemy.pool.Pool`, such as a + :class:`~sqlalchemy.pool.QueuePool` instance. If non-None, this + pool will be used directly as the underlying connection pool + for the engine, bypassing whatever connection parameters are + present in the URL argument. For information on constructing + connection pools manually, see :ref:`pooling_toplevel`. + + :param poolclass=None: a :class:`~sqlalchemy.pool.Pool` + subclass, which will be used to create a connection pool + instance using the connection parameters given in the URL. Note + this differs from ``pool`` in that you don't actually + instantiate the pool in this case, you just indicate what type + of pool to be used. + + :param pool_logging_name: String identifier which will be used within + the "name" field of logging records generated within the + "sqlalchemy.pool" logger. Defaults to a hexstring of the object's + id. + + :param pool_size=5: the number of connections to keep open + inside the connection pool. This used with + :class:`~sqlalchemy.pool.QueuePool` as + well as :class:`~sqlalchemy.pool.SingletonThreadPool`. With + :class:`~sqlalchemy.pool.QueuePool`, a ``pool_size`` setting + of 0 indicates no limit; to disable pooling, set ``poolclass`` to + :class:`~sqlalchemy.pool.NullPool` instead. + + :param pool_recycle=-1: this setting causes the pool to recycle + connections after the given number of seconds has passed. It + defaults to -1, or no timeout. For example, setting to 3600 + means connections will be recycled after one hour. Note that + MySQL in particular will disconnect automatically if no + activity is detected on a connection for eight hours (although + this is configurable with the MySQLDB connection itself and the + server configuration as well). + + :param pool_reset_on_return='rollback': set the "reset on return" + behavior of the pool, which is whether ``rollback()``, + ``commit()``, or nothing is called upon connections + being returned to the pool. See the docstring for + ``reset_on_return`` at :class:`.Pool`. + + .. versionadded:: 0.7.6 + + :param pool_timeout=30: number of seconds to wait before giving + up on getting a connection from the pool. This is only used + with :class:`~sqlalchemy.pool.QueuePool`. + + :param strategy='plain': selects alternate engine implementations. + Currently available are: + + * the ``threadlocal`` strategy, which is described in + :ref:`threadlocal_strategy`; + * the ``mock`` strategy, which dispatches all statement + execution to a function passed as the argument ``executor``. + See `example in the FAQ + `_. + + :param executor=None: a function taking arguments + ``(sql, *multiparams, **params)``, to which the ``mock`` strategy will + dispatch all statement execution. Used only by ``strategy='mock'``. + + """ + + strategy = kwargs.pop('strategy', default_strategy) + strategy = strategies.strategies[strategy] + return strategy.create(*args, **kwargs) + + +def engine_from_config(configuration, prefix='sqlalchemy.', **kwargs): + """Create a new Engine instance using a configuration dictionary. + + The dictionary is typically produced from a config file. + + The keys of interest to ``engine_from_config()`` should be prefixed, e.g. + ``sqlalchemy.url``, ``sqlalchemy.echo``, etc. The 'prefix' argument + indicates the prefix to be searched for. Each matching key (after the + prefix is stripped) is treated as though it were the corresponding keyword + argument to a :func:`.create_engine` call. + + The only required key is (assuming the default prefix) ``sqlalchemy.url``, + which provides the :ref:`database URL `. + + A select set of keyword arguments will be "coerced" to their + expected type based on string values. The set of arguments + is extensible per-dialect using the ``engine_config_types`` accessor. + + :param configuration: A dictionary (typically produced from a config file, + but this is not a requirement). Items whose keys start with the value + of 'prefix' will have that prefix stripped, and will then be passed to + :ref:`create_engine`. + + :param prefix: Prefix to match and then strip from keys + in 'configuration'. + + :param kwargs: Each keyword argument to ``engine_from_config()`` itself + overrides the corresponding item taken from the 'configuration' + dictionary. Keyword arguments should *not* be prefixed. + + """ + + options = dict((key[len(prefix):], configuration[key]) + for key in configuration + if key.startswith(prefix)) + options['_coerce_config'] = True + options.update(kwargs) + url = options.pop('url') + return create_engine(url, **options) + + +__all__ = ( + 'create_engine', + 'engine_from_config', +) diff --git a/app/lib/sqlalchemy/engine/base.py b/app/lib/sqlalchemy/engine/base.py new file mode 100644 index 0000000..91f4493 --- /dev/null +++ b/app/lib/sqlalchemy/engine/base.py @@ -0,0 +1,2207 @@ +# engine/base.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +from __future__ import with_statement + +"""Defines :class:`.Connection` and :class:`.Engine`. + +""" + + +import sys +from .. import exc, util, log, interfaces +from ..sql import util as sql_util +from ..sql import schema +from .interfaces import Connectable, ExceptionContext +from .util import _distill_params +import contextlib + + +class Connection(Connectable): + """Provides high-level functionality for a wrapped DB-API connection. + + Provides execution support for string-based SQL statements as well as + :class:`.ClauseElement`, :class:`.Compiled` and :class:`.DefaultGenerator` + objects. Provides a :meth:`begin` method to return :class:`.Transaction` + objects. + + The Connection object is **not** thread-safe. While a Connection can be + shared among threads using properly synchronized access, it is still + possible that the underlying DBAPI connection may not support shared + access between threads. Check the DBAPI documentation for details. + + The Connection object represents a single dbapi connection checked out + from the connection pool. In this state, the connection pool has no affect + upon the connection, including its expiration or timeout state. For the + connection pool to properly manage connections, connections should be + returned to the connection pool (i.e. ``connection.close()``) whenever the + connection is not in use. + + .. index:: + single: thread safety; Connection + + """ + + schema_for_object = schema._schema_getter(None) + """Return the ".schema" attribute for an object. + + Used for :class:`.Table`, :class:`.Sequence` and similar objects, + and takes into account + the :paramref:`.Connection.execution_options.schema_translate_map` + parameter. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`schema_translating` + + """ + + def __init__(self, engine, connection=None, close_with_result=False, + _branch_from=None, _execution_options=None, + _dispatch=None, + _has_events=None): + """Construct a new Connection. + + The constructor here is not public and is only called only by an + :class:`.Engine`. See :meth:`.Engine.connect` and + :meth:`.Engine.contextual_connect` methods. + + """ + self.engine = engine + self.dialect = engine.dialect + self.__branch_from = _branch_from + self.__branch = _branch_from is not None + + if _branch_from: + self.__connection = connection + self._execution_options = _execution_options + self._echo = _branch_from._echo + self.should_close_with_result = False + self.dispatch = _dispatch + self._has_events = _branch_from._has_events + self.schema_for_object = _branch_from.schema_for_object + else: + self.__connection = connection \ + if connection is not None else engine.raw_connection() + self.__transaction = None + self.__savepoint_seq = 0 + self.should_close_with_result = close_with_result + self.__invalid = False + self.__can_reconnect = True + self._echo = self.engine._should_log_info() + + if _has_events is None: + # if _has_events is sent explicitly as False, + # then don't join the dispatch of the engine; we don't + # want to handle any of the engine's events in that case. + self.dispatch = self.dispatch._join(engine.dispatch) + self._has_events = _has_events or ( + _has_events is None and engine._has_events) + + assert not _execution_options + self._execution_options = engine._execution_options + + if self._has_events or self.engine._has_events: + self.dispatch.engine_connect(self, self.__branch) + + def _branch(self): + """Return a new Connection which references this Connection's + engine and connection; but does not have close_with_result enabled, + and also whose close() method does nothing. + + The Core uses this very sparingly, only in the case of + custom SQL default functions that are to be INSERTed as the + primary key of a row where we need to get the value back, so we have + to invoke it distinctly - this is a very uncommon case. + + Userland code accesses _branch() when the connect() or + contextual_connect() methods are called. The branched connection + acts as much as possible like the parent, except that it stays + connected when a close() event occurs. + + """ + if self.__branch_from: + return self.__branch_from._branch() + else: + return self.engine._connection_cls( + self.engine, + self.__connection, + _branch_from=self, + _execution_options=self._execution_options, + _has_events=self._has_events, + _dispatch=self.dispatch) + + @property + def _root(self): + """return the 'root' connection. + + Returns 'self' if this connection is not a branch, else + returns the root connection from which we ultimately branched. + + """ + + if self.__branch_from: + return self.__branch_from + else: + return self + + def _clone(self): + """Create a shallow copy of this Connection. + + """ + c = self.__class__.__new__(self.__class__) + c.__dict__ = self.__dict__.copy() + return c + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + self.close() + + def execution_options(self, **opt): + r""" Set non-SQL options for the connection which take effect + during execution. + + The method returns a copy of this :class:`.Connection` which references + the same underlying DBAPI connection, but also defines the given + execution options which will take effect for a call to + :meth:`execute`. As the new :class:`.Connection` references the same + underlying resource, it's usually a good idea to ensure that the copies + will be discarded immediately, which is implicit if used as in:: + + result = connection.execution_options(stream_results=True).\ + execute(stmt) + + Note that any key/value can be passed to + :meth:`.Connection.execution_options`, and it will be stored in the + ``_execution_options`` dictionary of the :class:`.Connection`. It + is suitable for usage by end-user schemes to communicate with + event listeners, for example. + + The keywords that are currently recognized by SQLAlchemy itself + include all those listed under :meth:`.Executable.execution_options`, + as well as others that are specific to :class:`.Connection`. + + :param autocommit: Available on: Connection, statement. + When True, a COMMIT will be invoked after execution + when executed in 'autocommit' mode, i.e. when an explicit + transaction is not begun on the connection. Note that DBAPI + connections by default are always in a transaction - SQLAlchemy uses + rules applied to different kinds of statements to determine if + COMMIT will be invoked in order to provide its "autocommit" feature. + Typically, all INSERT/UPDATE/DELETE statements as well as + CREATE/DROP statements have autocommit behavior enabled; SELECT + constructs do not. Use this option when invoking a SELECT or other + specific SQL construct where COMMIT is desired (typically when + calling stored procedures and such), and an explicit + transaction is not in progress. + + :param compiled_cache: Available on: Connection. + A dictionary where :class:`.Compiled` objects + will be cached when the :class:`.Connection` compiles a clause + expression into a :class:`.Compiled` object. + It is the user's responsibility to + manage the size of this dictionary, which will have keys + corresponding to the dialect, clause element, the column + names within the VALUES or SET clause of an INSERT or UPDATE, + as well as the "batch" mode for an INSERT or UPDATE statement. + The format of this dictionary is not guaranteed to stay the + same in future releases. + + Note that the ORM makes use of its own "compiled" caches for + some operations, including flush operations. The caching + used by the ORM internally supersedes a cache dictionary + specified here. + + :param isolation_level: Available on: :class:`.Connection`. + Set the transaction isolation level for + the lifespan of this :class:`.Connection` object (*not* the + underlying DBAPI connection, for which the level is reset + to its original setting upon termination of this + :class:`.Connection` object). + + Valid values include + those string values accepted by the + :paramref:`.create_engine.isolation_level` + parameter passed to :func:`.create_engine`. These levels are + semi-database specific; see individual dialect documentation for + valid levels. + + Note that this option necessarily affects the underlying + DBAPI connection for the lifespan of the originating + :class:`.Connection`, and is not per-execution. This + setting is not removed until the underlying DBAPI connection + is returned to the connection pool, i.e. + the :meth:`.Connection.close` method is called. + + .. warning:: The ``isolation_level`` execution option should + **not** be used when a transaction is already established, that + is, the :meth:`.Connection.begin` method or similar has been + called. A database cannot change the isolation level on a + transaction in progress, and different DBAPIs and/or + SQLAlchemy dialects may implicitly roll back or commit + the transaction, or not affect the connection at all. + + .. versionchanged:: 0.9.9 A warning is emitted when the + ``isolation_level`` execution option is used after a + transaction has been started with :meth:`.Connection.begin` + or similar. + + .. note:: The ``isolation_level`` execution option is implicitly + reset if the :class:`.Connection` is invalidated, e.g. via + the :meth:`.Connection.invalidate` method, or if a + disconnection error occurs. The new connection produced after + the invalidation will not have the isolation level re-applied + to it automatically. + + .. seealso:: + + :paramref:`.create_engine.isolation_level` + - set per :class:`.Engine` isolation level + + :meth:`.Connection.get_isolation_level` - view current level + + :ref:`SQLite Transaction Isolation ` + + :ref:`PostgreSQL Transaction Isolation ` + + :ref:`MySQL Transaction Isolation ` + + :ref:`SQL Server Transaction Isolation ` + + :ref:`session_transaction_isolation` - for the ORM + + :param no_parameters: When ``True``, if the final parameter + list or dictionary is totally empty, will invoke the + statement on the cursor as ``cursor.execute(statement)``, + not passing the parameter collection at all. + Some DBAPIs such as psycopg2 and mysql-python consider + percent signs as significant only when parameters are + present; this option allows code to generate SQL + containing percent signs (and possibly other characters) + that is neutral regarding whether it's executed by the DBAPI + or piped into a script that's later invoked by + command line tools. + + .. versionadded:: 0.7.6 + + :param stream_results: Available on: Connection, statement. + Indicate to the dialect that results should be + "streamed" and not pre-buffered, if possible. This is a limitation + of many DBAPIs. The flag is currently understood only by the + psycopg2, mysqldb and pymysql dialects. + + :param schema_translate_map: Available on: Connection, Engine. + A dictionary mapping schema names to schema names, that will be + applied to the :paramref:`.Table.schema` element of each + :class:`.Table` encountered when SQL or DDL expression elements + are compiled into strings; the resulting schema name will be + converted based on presence in the map of the original name. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`schema_translating` + + """ + c = self._clone() + c._execution_options = c._execution_options.union(opt) + if self._has_events or self.engine._has_events: + self.dispatch.set_connection_execution_options(c, opt) + self.dialect.set_connection_execution_options(c, opt) + return c + + @property + def closed(self): + """Return True if this connection is closed.""" + + return '_Connection__connection' not in self.__dict__ \ + and not self.__can_reconnect + + @property + def invalidated(self): + """Return True if this connection was invalidated.""" + + return self._root.__invalid + + @property + def connection(self): + """The underlying DB-API connection managed by this Connection. + + .. seealso:: + + + :ref:`dbapi_connections` + + """ + + try: + return self.__connection + except AttributeError: + try: + return self._revalidate_connection() + except BaseException as e: + self._handle_dbapi_exception(e, None, None, None, None) + + def get_isolation_level(self): + """Return the current isolation level assigned to this + :class:`.Connection`. + + This will typically be the default isolation level as determined + by the dialect, unless if the + :paramref:`.Connection.execution_options.isolation_level` + feature has been used to alter the isolation level on a + per-:class:`.Connection` basis. + + This attribute will typically perform a live SQL operation in order + to procure the current isolation level, so the value returned is the + actual level on the underlying DBAPI connection regardless of how + this state was set. Compare to the + :attr:`.Connection.default_isolation_level` accessor + which returns the dialect-level setting without performing a SQL + query. + + .. versionadded:: 0.9.9 + + .. seealso:: + + :attr:`.Connection.default_isolation_level` - view default level + + :paramref:`.create_engine.isolation_level` + - set per :class:`.Engine` isolation level + + :paramref:`.Connection.execution_options.isolation_level` + - set per :class:`.Connection` isolation level + + """ + try: + return self.dialect.get_isolation_level(self.connection) + except BaseException as e: + self._handle_dbapi_exception(e, None, None, None, None) + + @property + def default_isolation_level(self): + """The default isolation level assigned to this :class:`.Connection`. + + This is the isolation level setting that the :class:`.Connection` + has when first procured via the :meth:`.Engine.connect` method. + This level stays in place until the + :paramref:`.Connection.execution_options.isolation_level` is used + to change the setting on a per-:class:`.Connection` basis. + + Unlike :meth:`.Connection.get_isolation_level`, this attribute is set + ahead of time from the first connection procured by the dialect, + so SQL query is not invoked when this accessor is called. + + .. versionadded:: 0.9.9 + + .. seealso:: + + :meth:`.Connection.get_isolation_level` - view current level + + :paramref:`.create_engine.isolation_level` + - set per :class:`.Engine` isolation level + + :paramref:`.Connection.execution_options.isolation_level` + - set per :class:`.Connection` isolation level + + """ + return self.dialect.default_isolation_level + + def _revalidate_connection(self): + if self.__branch_from: + return self.__branch_from._revalidate_connection() + if self.__can_reconnect and self.__invalid: + if self.__transaction is not None: + raise exc.InvalidRequestError( + "Can't reconnect until invalid " + "transaction is rolled back") + self.__connection = self.engine.raw_connection(_connection=self) + self.__invalid = False + return self.__connection + raise exc.ResourceClosedError("This Connection is closed") + + @property + def _connection_is_valid(self): + # use getattr() for is_valid to support exceptions raised in + # dialect initializer, where the connection is not wrapped in + # _ConnectionFairy + + return getattr(self.__connection, 'is_valid', False) + + @property + def _still_open_and_connection_is_valid(self): + return \ + not self.closed and \ + not self.invalidated and \ + getattr(self.__connection, 'is_valid', False) + + @property + def info(self): + """Info dictionary associated with the underlying DBAPI connection + referred to by this :class:`.Connection`, allowing user-defined + data to be associated with the connection. + + The data here will follow along with the DBAPI connection including + after it is returned to the connection pool and used again + in subsequent instances of :class:`.Connection`. + + """ + + return self.connection.info + + def connect(self): + """Returns a branched version of this :class:`.Connection`. + + The :meth:`.Connection.close` method on the returned + :class:`.Connection` can be called and this + :class:`.Connection` will remain open. + + This method provides usage symmetry with + :meth:`.Engine.connect`, including for usage + with context managers. + + """ + + return self._branch() + + def contextual_connect(self, **kwargs): + """Returns a branched version of this :class:`.Connection`. + + The :meth:`.Connection.close` method on the returned + :class:`.Connection` can be called and this + :class:`.Connection` will remain open. + + This method provides usage symmetry with + :meth:`.Engine.contextual_connect`, including for usage + with context managers. + + """ + + return self._branch() + + def invalidate(self, exception=None): + """Invalidate the underlying DBAPI connection associated with + this :class:`.Connection`. + + The underlying DBAPI connection is literally closed (if + possible), and is discarded. Its source connection pool will + typically lazily create a new connection to replace it. + + Upon the next use (where "use" typically means using the + :meth:`.Connection.execute` method or similar), + this :class:`.Connection` will attempt to + procure a new DBAPI connection using the services of the + :class:`.Pool` as a source of connectivity (e.g. a "reconnection"). + + If a transaction was in progress (e.g. the + :meth:`.Connection.begin` method has been called) when + :meth:`.Connection.invalidate` method is called, at the DBAPI + level all state associated with this transaction is lost, as + the DBAPI connection is closed. The :class:`.Connection` + will not allow a reconnection to proceed until the + :class:`.Transaction` object is ended, by calling the + :meth:`.Transaction.rollback` method; until that point, any attempt at + continuing to use the :class:`.Connection` will raise an + :class:`~sqlalchemy.exc.InvalidRequestError`. + This is to prevent applications from accidentally + continuing an ongoing transactional operations despite the + fact that the transaction has been lost due to an + invalidation. + + The :meth:`.Connection.invalidate` method, just like auto-invalidation, + will at the connection pool level invoke the + :meth:`.PoolEvents.invalidate` event. + + .. seealso:: + + :ref:`pool_connection_invalidation` + + """ + + if self.invalidated: + return + + if self.closed: + raise exc.ResourceClosedError("This Connection is closed") + + if self._root._connection_is_valid: + self._root.__connection.invalidate(exception) + del self._root.__connection + self._root.__invalid = True + + def detach(self): + """Detach the underlying DB-API connection from its connection pool. + + E.g.:: + + with engine.connect() as conn: + conn.detach() + conn.execute("SET search_path TO schema1, schema2") + + # work with connection + + # connection is fully closed (since we used "with:", can + # also call .close()) + + This :class:`.Connection` instance will remain usable. When closed + (or exited from a context manager context as above), + the DB-API connection will be literally closed and not + returned to its originating pool. + + This method can be used to insulate the rest of an application + from a modified state on a connection (such as a transaction + isolation level or similar). + + """ + + self.__connection.detach() + + def begin(self): + """Begin a transaction and return a transaction handle. + + The returned object is an instance of :class:`.Transaction`. + This object represents the "scope" of the transaction, + which completes when either the :meth:`.Transaction.rollback` + or :meth:`.Transaction.commit` method is called. + + Nested calls to :meth:`.begin` on the same :class:`.Connection` + will return new :class:`.Transaction` objects that represent + an emulated transaction within the scope of the enclosing + transaction, that is:: + + trans = conn.begin() # outermost transaction + trans2 = conn.begin() # "nested" + trans2.commit() # does nothing + trans.commit() # actually commits + + Calls to :meth:`.Transaction.commit` only have an effect + when invoked via the outermost :class:`.Transaction` object, though the + :meth:`.Transaction.rollback` method of any of the + :class:`.Transaction` objects will roll back the + transaction. + + See also: + + :meth:`.Connection.begin_nested` - use a SAVEPOINT + + :meth:`.Connection.begin_twophase` - use a two phase /XID transaction + + :meth:`.Engine.begin` - context manager available from + :class:`.Engine`. + + """ + if self.__branch_from: + return self.__branch_from.begin() + + if self.__transaction is None: + self.__transaction = RootTransaction(self) + return self.__transaction + else: + return Transaction(self, self.__transaction) + + def begin_nested(self): + """Begin a nested transaction and return a transaction handle. + + The returned object is an instance of :class:`.NestedTransaction`. + + Nested transactions require SAVEPOINT support in the + underlying database. Any transaction in the hierarchy may + ``commit`` and ``rollback``, however the outermost transaction + still controls the overall ``commit`` or ``rollback`` of the + transaction of a whole. + + See also :meth:`.Connection.begin`, + :meth:`.Connection.begin_twophase`. + """ + if self.__branch_from: + return self.__branch_from.begin_nested() + + if self.__transaction is None: + self.__transaction = RootTransaction(self) + else: + self.__transaction = NestedTransaction(self, self.__transaction) + return self.__transaction + + def begin_twophase(self, xid=None): + """Begin a two-phase or XA transaction and return a transaction + handle. + + The returned object is an instance of :class:`.TwoPhaseTransaction`, + which in addition to the methods provided by + :class:`.Transaction`, also provides a + :meth:`~.TwoPhaseTransaction.prepare` method. + + :param xid: the two phase transaction id. If not supplied, a + random id will be generated. + + See also :meth:`.Connection.begin`, + :meth:`.Connection.begin_twophase`. + + """ + + if self.__branch_from: + return self.__branch_from.begin_twophase(xid=xid) + + if self.__transaction is not None: + raise exc.InvalidRequestError( + "Cannot start a two phase transaction when a transaction " + "is already in progress.") + if xid is None: + xid = self.engine.dialect.create_xid() + self.__transaction = TwoPhaseTransaction(self, xid) + return self.__transaction + + def recover_twophase(self): + return self.engine.dialect.do_recover_twophase(self) + + def rollback_prepared(self, xid, recover=False): + self.engine.dialect.do_rollback_twophase(self, xid, recover=recover) + + def commit_prepared(self, xid, recover=False): + self.engine.dialect.do_commit_twophase(self, xid, recover=recover) + + def in_transaction(self): + """Return True if a transaction is in progress.""" + return self._root.__transaction is not None + + def _begin_impl(self, transaction): + assert not self.__branch_from + + if self._echo: + self.engine.logger.info("BEGIN (implicit)") + + if self._has_events or self.engine._has_events: + self.dispatch.begin(self) + + try: + self.engine.dialect.do_begin(self.connection) + if self.connection._reset_agent is None: + self.connection._reset_agent = transaction + except BaseException as e: + self._handle_dbapi_exception(e, None, None, None, None) + + def _rollback_impl(self): + assert not self.__branch_from + + if self._has_events or self.engine._has_events: + self.dispatch.rollback(self) + + if self._still_open_and_connection_is_valid: + if self._echo: + self.engine.logger.info("ROLLBACK") + try: + self.engine.dialect.do_rollback(self.connection) + except BaseException as e: + self._handle_dbapi_exception(e, None, None, None, None) + finally: + if not self.__invalid and \ + self.connection._reset_agent is self.__transaction: + self.connection._reset_agent = None + self.__transaction = None + else: + self.__transaction = None + + def _commit_impl(self, autocommit=False): + assert not self.__branch_from + + if self._has_events or self.engine._has_events: + self.dispatch.commit(self) + + if self._echo: + self.engine.logger.info("COMMIT") + try: + self.engine.dialect.do_commit(self.connection) + except BaseException as e: + self._handle_dbapi_exception(e, None, None, None, None) + finally: + if not self.__invalid and \ + self.connection._reset_agent is self.__transaction: + self.connection._reset_agent = None + self.__transaction = None + + def _savepoint_impl(self, name=None): + assert not self.__branch_from + + if self._has_events or self.engine._has_events: + self.dispatch.savepoint(self, name) + + if name is None: + self.__savepoint_seq += 1 + name = 'sa_savepoint_%s' % self.__savepoint_seq + if self._still_open_and_connection_is_valid: + self.engine.dialect.do_savepoint(self, name) + return name + + def _rollback_to_savepoint_impl(self, name, context): + assert not self.__branch_from + + if self._has_events or self.engine._has_events: + self.dispatch.rollback_savepoint(self, name, context) + + if self._still_open_and_connection_is_valid: + self.engine.dialect.do_rollback_to_savepoint(self, name) + self.__transaction = context + + def _release_savepoint_impl(self, name, context): + assert not self.__branch_from + + if self._has_events or self.engine._has_events: + self.dispatch.release_savepoint(self, name, context) + + if self._still_open_and_connection_is_valid: + self.engine.dialect.do_release_savepoint(self, name) + self.__transaction = context + + def _begin_twophase_impl(self, transaction): + assert not self.__branch_from + + if self._echo: + self.engine.logger.info("BEGIN TWOPHASE (implicit)") + if self._has_events or self.engine._has_events: + self.dispatch.begin_twophase(self, transaction.xid) + + if self._still_open_and_connection_is_valid: + self.engine.dialect.do_begin_twophase(self, transaction.xid) + + if self.connection._reset_agent is None: + self.connection._reset_agent = transaction + + def _prepare_twophase_impl(self, xid): + assert not self.__branch_from + + if self._has_events or self.engine._has_events: + self.dispatch.prepare_twophase(self, xid) + + if self._still_open_and_connection_is_valid: + assert isinstance(self.__transaction, TwoPhaseTransaction) + self.engine.dialect.do_prepare_twophase(self, xid) + + def _rollback_twophase_impl(self, xid, is_prepared): + assert not self.__branch_from + + if self._has_events or self.engine._has_events: + self.dispatch.rollback_twophase(self, xid, is_prepared) + + if self._still_open_and_connection_is_valid: + assert isinstance(self.__transaction, TwoPhaseTransaction) + try: + self.engine.dialect.do_rollback_twophase( + self, xid, is_prepared) + finally: + if self.connection._reset_agent is self.__transaction: + self.connection._reset_agent = None + self.__transaction = None + else: + self.__transaction = None + + def _commit_twophase_impl(self, xid, is_prepared): + assert not self.__branch_from + + if self._has_events or self.engine._has_events: + self.dispatch.commit_twophase(self, xid, is_prepared) + + if self._still_open_and_connection_is_valid: + assert isinstance(self.__transaction, TwoPhaseTransaction) + try: + self.engine.dialect.do_commit_twophase(self, xid, is_prepared) + finally: + if self.connection._reset_agent is self.__transaction: + self.connection._reset_agent = None + self.__transaction = None + else: + self.__transaction = None + + def _autorollback(self): + if not self._root.in_transaction(): + self._root._rollback_impl() + + def close(self): + """Close this :class:`.Connection`. + + This results in a release of the underlying database + resources, that is, the DBAPI connection referenced + internally. The DBAPI connection is typically restored + back to the connection-holding :class:`.Pool` referenced + by the :class:`.Engine` that produced this + :class:`.Connection`. Any transactional state present on + the DBAPI connection is also unconditionally released via + the DBAPI connection's ``rollback()`` method, regardless + of any :class:`.Transaction` object that may be + outstanding with regards to this :class:`.Connection`. + + After :meth:`~.Connection.close` is called, the + :class:`.Connection` is permanently in a closed state, + and will allow no further operations. + + """ + if self.__branch_from: + try: + del self.__connection + except AttributeError: + pass + finally: + self.__can_reconnect = False + return + try: + conn = self.__connection + except AttributeError: + pass + else: + + conn.close() + if conn._reset_agent is self.__transaction: + conn._reset_agent = None + + # the close() process can end up invalidating us, + # as the pool will call our transaction as the "reset_agent" + # for rollback(), which can then cause an invalidation + if not self.__invalid: + del self.__connection + self.__can_reconnect = False + self.__transaction = None + + def scalar(self, object, *multiparams, **params): + """Executes and returns the first column of the first row. + + The underlying result/cursor is closed after execution. + """ + + return self.execute(object, *multiparams, **params).scalar() + + def execute(self, object, *multiparams, **params): + r"""Executes a SQL statement construct and returns a + :class:`.ResultProxy`. + + :param object: The statement to be executed. May be + one of: + + * a plain string + * any :class:`.ClauseElement` construct that is also + a subclass of :class:`.Executable`, such as a + :func:`~.expression.select` construct + * a :class:`.FunctionElement`, such as that generated + by :data:`.func`, will be automatically wrapped in + a SELECT statement, which is then executed. + * a :class:`.DDLElement` object + * a :class:`.DefaultGenerator` object + * a :class:`.Compiled` object + + :param \*multiparams/\**params: represent bound parameter + values to be used in the execution. Typically, + the format is either a collection of one or more + dictionaries passed to \*multiparams:: + + conn.execute( + table.insert(), + {"id":1, "value":"v1"}, + {"id":2, "value":"v2"} + ) + + ...or individual key/values interpreted by \**params:: + + conn.execute( + table.insert(), id=1, value="v1" + ) + + In the case that a plain SQL string is passed, and the underlying + DBAPI accepts positional bind parameters, a collection of tuples + or individual values in \*multiparams may be passed:: + + conn.execute( + "INSERT INTO table (id, value) VALUES (?, ?)", + (1, "v1"), (2, "v2") + ) + + conn.execute( + "INSERT INTO table (id, value) VALUES (?, ?)", + 1, "v1" + ) + + Note above, the usage of a question mark "?" or other + symbol is contingent upon the "paramstyle" accepted by the DBAPI + in use, which may be any of "qmark", "named", "pyformat", "format", + "numeric". See `pep-249 `_ + for details on paramstyle. + + To execute a textual SQL statement which uses bound parameters in a + DBAPI-agnostic way, use the :func:`~.expression.text` construct. + + """ + if isinstance(object, util.string_types[0]): + return self._execute_text(object, multiparams, params) + try: + meth = object._execute_on_connection + except AttributeError: + raise exc.ObjectNotExecutableError(object) + else: + return meth(self, multiparams, params) + + def _execute_function(self, func, multiparams, params): + """Execute a sql.FunctionElement object.""" + + return self._execute_clauseelement(func.select(), + multiparams, params) + + def _execute_default(self, default, multiparams, params): + """Execute a schema.ColumnDefault object.""" + + if self._has_events or self.engine._has_events: + for fn in self.dispatch.before_execute: + default, multiparams, params = \ + fn(self, default, multiparams, params) + + try: + try: + conn = self.__connection + except AttributeError: + conn = self._revalidate_connection() + + dialect = self.dialect + ctx = dialect.execution_ctx_cls._init_default( + dialect, self, conn) + except BaseException as e: + self._handle_dbapi_exception(e, None, None, None, None) + + ret = ctx._exec_default(default, None) + if self.should_close_with_result: + self.close() + + if self._has_events or self.engine._has_events: + self.dispatch.after_execute(self, + default, multiparams, params, ret) + + return ret + + def _execute_ddl(self, ddl, multiparams, params): + """Execute a schema.DDL object.""" + + if self._has_events or self.engine._has_events: + for fn in self.dispatch.before_execute: + ddl, multiparams, params = \ + fn(self, ddl, multiparams, params) + + dialect = self.dialect + + compiled = ddl.compile( + dialect=dialect, + schema_translate_map=self.schema_for_object + if not self.schema_for_object.is_default else None) + ret = self._execute_context( + dialect, + dialect.execution_ctx_cls._init_ddl, + compiled, + None, + compiled + ) + if self._has_events or self.engine._has_events: + self.dispatch.after_execute(self, + ddl, multiparams, params, ret) + return ret + + def _execute_clauseelement(self, elem, multiparams, params): + """Execute a sql.ClauseElement object.""" + + if self._has_events or self.engine._has_events: + for fn in self.dispatch.before_execute: + elem, multiparams, params = \ + fn(self, elem, multiparams, params) + + distilled_params = _distill_params(multiparams, params) + if distilled_params: + # note this is usually dict but we support RowProxy + # as well; but dict.keys() as an iterable is OK + keys = distilled_params[0].keys() + else: + keys = [] + + dialect = self.dialect + if 'compiled_cache' in self._execution_options: + key = ( + dialect, elem, tuple(sorted(keys)), + self.schema_for_object.hash_key, + len(distilled_params) > 1 + ) + compiled_sql = self._execution_options['compiled_cache'].get(key) + if compiled_sql is None: + compiled_sql = elem.compile( + dialect=dialect, column_keys=keys, + inline=len(distilled_params) > 1, + schema_translate_map=self.schema_for_object + if not self.schema_for_object.is_default else None + ) + self._execution_options['compiled_cache'][key] = compiled_sql + else: + compiled_sql = elem.compile( + dialect=dialect, column_keys=keys, + inline=len(distilled_params) > 1, + schema_translate_map=self.schema_for_object + if not self.schema_for_object.is_default else None) + + ret = self._execute_context( + dialect, + dialect.execution_ctx_cls._init_compiled, + compiled_sql, + distilled_params, + compiled_sql, distilled_params + ) + if self._has_events or self.engine._has_events: + self.dispatch.after_execute(self, + elem, multiparams, params, ret) + return ret + + def _execute_compiled(self, compiled, multiparams, params): + """Execute a sql.Compiled object.""" + + if self._has_events or self.engine._has_events: + for fn in self.dispatch.before_execute: + compiled, multiparams, params = \ + fn(self, compiled, multiparams, params) + + dialect = self.dialect + parameters = _distill_params(multiparams, params) + ret = self._execute_context( + dialect, + dialect.execution_ctx_cls._init_compiled, + compiled, + parameters, + compiled, parameters + ) + if self._has_events or self.engine._has_events: + self.dispatch.after_execute(self, + compiled, multiparams, params, ret) + return ret + + def _execute_text(self, statement, multiparams, params): + """Execute a string SQL statement.""" + + if self._has_events or self.engine._has_events: + for fn in self.dispatch.before_execute: + statement, multiparams, params = \ + fn(self, statement, multiparams, params) + + dialect = self.dialect + parameters = _distill_params(multiparams, params) + ret = self._execute_context( + dialect, + dialect.execution_ctx_cls._init_statement, + statement, + parameters, + statement, parameters + ) + if self._has_events or self.engine._has_events: + self.dispatch.after_execute(self, + statement, multiparams, params, ret) + return ret + + def _execute_context(self, dialect, constructor, + statement, parameters, + *args): + """Create an :class:`.ExecutionContext` and execute, returning + a :class:`.ResultProxy`.""" + + try: + try: + conn = self.__connection + except AttributeError: + conn = self._revalidate_connection() + + context = constructor(dialect, self, conn, *args) + except BaseException as e: + self._handle_dbapi_exception( + e, + util.text_type(statement), parameters, + None, None) + + if context.compiled: + context.pre_exec() + + cursor, statement, parameters = context.cursor, \ + context.statement, \ + context.parameters + + if not context.executemany: + parameters = parameters[0] + + if self._has_events or self.engine._has_events: + for fn in self.dispatch.before_cursor_execute: + statement, parameters = \ + fn(self, cursor, statement, parameters, + context, context.executemany) + + if self._echo: + self.engine.logger.info(statement) + self.engine.logger.info( + "%r", + sql_util._repr_params(parameters, batches=10) + ) + + evt_handled = False + try: + if context.executemany: + if self.dialect._has_events: + for fn in self.dialect.dispatch.do_executemany: + if fn(cursor, statement, parameters, context): + evt_handled = True + break + if not evt_handled: + self.dialect.do_executemany( + cursor, + statement, + parameters, + context) + elif not parameters and context.no_parameters: + if self.dialect._has_events: + for fn in self.dialect.dispatch.do_execute_no_params: + if fn(cursor, statement, context): + evt_handled = True + break + if not evt_handled: + self.dialect.do_execute_no_params( + cursor, + statement, + context) + else: + if self.dialect._has_events: + for fn in self.dialect.dispatch.do_execute: + if fn(cursor, statement, parameters, context): + evt_handled = True + break + if not evt_handled: + self.dialect.do_execute( + cursor, + statement, + parameters, + context) + except BaseException as e: + self._handle_dbapi_exception( + e, + statement, + parameters, + cursor, + context) + + if self._has_events or self.engine._has_events: + self.dispatch.after_cursor_execute(self, cursor, + statement, + parameters, + context, + context.executemany) + + if context.compiled: + context.post_exec() + + if context.is_crud or context.is_text: + result = context._setup_crud_result_proxy() + else: + result = context.get_result_proxy() + if result._metadata is None: + result._soft_close() + + if context.should_autocommit and self._root.__transaction is None: + self._root._commit_impl(autocommit=True) + + # for "connectionless" execution, we have to close this + # Connection after the statement is complete. + if self.should_close_with_result: + # ResultProxy already exhausted rows / has no rows. + # close us now + if result._soft_closed: + self.close() + else: + # ResultProxy will close this Connection when no more + # rows to fetch. + result._autoclose_connection = True + return result + + def _cursor_execute(self, cursor, statement, parameters, context=None): + """Execute a statement + params on the given cursor. + + Adds appropriate logging and exception handling. + + This method is used by DefaultDialect for special-case + executions, such as for sequences and column defaults. + The path of statement execution in the majority of cases + terminates at _execute_context(). + + """ + if self._has_events or self.engine._has_events: + for fn in self.dispatch.before_cursor_execute: + statement, parameters = \ + fn(self, cursor, statement, parameters, + context, + False) + + if self._echo: + self.engine.logger.info(statement) + self.engine.logger.info("%r", parameters) + try: + for fn in () if not self.dialect._has_events \ + else self.dialect.dispatch.do_execute: + if fn(cursor, statement, parameters, context): + break + else: + self.dialect.do_execute( + cursor, + statement, + parameters, + context) + except BaseException as e: + self._handle_dbapi_exception( + e, + statement, + parameters, + cursor, + context) + + if self._has_events or self.engine._has_events: + self.dispatch.after_cursor_execute(self, cursor, + statement, + parameters, + context, + False) + + def _safe_close_cursor(self, cursor): + """Close the given cursor, catching exceptions + and turning into log warnings. + + """ + try: + cursor.close() + except Exception: + # log the error through the connection pool's logger. + self.engine.pool.logger.error( + "Error closing cursor", exc_info=True) + + _reentrant_error = False + _is_disconnect = False + + def _handle_dbapi_exception(self, + e, + statement, + parameters, + cursor, + context): + exc_info = sys.exc_info() + + if context and context.exception is None: + context.exception = e + + is_exit_exception = not isinstance(e, Exception) + + if not self._is_disconnect: + self._is_disconnect = ( + isinstance(e, self.dialect.dbapi.Error) and + not self.closed and + self.dialect.is_disconnect( + e, + self.__connection if not self.invalidated else None, + cursor) + ) or ( + is_exit_exception and not self.closed + ) + + if context: + context.is_disconnect = self._is_disconnect + + invalidate_pool_on_disconnect = not is_exit_exception + + if self._reentrant_error: + util.raise_from_cause( + exc.DBAPIError.instance(statement, + parameters, + e, + self.dialect.dbapi.Error, + dialect=self.dialect), + exc_info + ) + self._reentrant_error = True + try: + # non-DBAPI error - if we already got a context, + # or there's no string statement, don't wrap it + should_wrap = isinstance(e, self.dialect.dbapi.Error) or \ + (statement is not None + and context is None and not is_exit_exception) + + if should_wrap: + sqlalchemy_exception = exc.DBAPIError.instance( + statement, + parameters, + e, + self.dialect.dbapi.Error, + connection_invalidated=self._is_disconnect, + dialect=self.dialect) + else: + sqlalchemy_exception = None + + newraise = None + + if (self._has_events or self.engine._has_events) and \ + not self._execution_options.get( + 'skip_user_error_events', False): + # legacy dbapi_error event + if should_wrap and context: + self.dispatch.dbapi_error(self, + cursor, + statement, + parameters, + context, + e) + + # new handle_error event + ctx = ExceptionContextImpl( + e, sqlalchemy_exception, self.engine, + self, cursor, statement, + parameters, context, self._is_disconnect, + invalidate_pool_on_disconnect) + + for fn in self.dispatch.handle_error: + try: + # handler returns an exception; + # call next handler in a chain + per_fn = fn(ctx) + if per_fn is not None: + ctx.chained_exception = newraise = per_fn + except Exception as _raised: + # handler raises an exception - stop processing + newraise = _raised + break + + if self._is_disconnect != ctx.is_disconnect: + self._is_disconnect = ctx.is_disconnect + if sqlalchemy_exception: + sqlalchemy_exception.connection_invalidated = \ + ctx.is_disconnect + + # set up potentially user-defined value for + # invalidate pool. + invalidate_pool_on_disconnect = \ + ctx.invalidate_pool_on_disconnect + + if should_wrap and context: + context.handle_dbapi_exception(e) + + if not self._is_disconnect: + if cursor: + self._safe_close_cursor(cursor) + with util.safe_reraise(warn_only=True): + self._autorollback() + + if newraise: + util.raise_from_cause(newraise, exc_info) + elif should_wrap: + util.raise_from_cause( + sqlalchemy_exception, + exc_info + ) + else: + util.reraise(*exc_info) + + finally: + del self._reentrant_error + if self._is_disconnect: + del self._is_disconnect + if not self.invalidated: + dbapi_conn_wrapper = self.__connection + if invalidate_pool_on_disconnect: + self.engine.pool._invalidate(dbapi_conn_wrapper, e) + self.invalidate(e) + if self.should_close_with_result: + self.close() + + @classmethod + def _handle_dbapi_exception_noconnection(cls, e, dialect, engine): + exc_info = sys.exc_info() + + is_disconnect = dialect.is_disconnect(e, None, None) + + should_wrap = isinstance(e, dialect.dbapi.Error) + + if should_wrap: + sqlalchemy_exception = exc.DBAPIError.instance( + None, + None, + e, + dialect.dbapi.Error, + connection_invalidated=is_disconnect) + else: + sqlalchemy_exception = None + + newraise = None + + if engine._has_events: + ctx = ExceptionContextImpl( + e, sqlalchemy_exception, engine, None, None, None, + None, None, is_disconnect, True) + for fn in engine.dispatch.handle_error: + try: + # handler returns an exception; + # call next handler in a chain + per_fn = fn(ctx) + if per_fn is not None: + ctx.chained_exception = newraise = per_fn + except Exception as _raised: + # handler raises an exception - stop processing + newraise = _raised + break + + if sqlalchemy_exception and \ + is_disconnect != ctx.is_disconnect: + sqlalchemy_exception.connection_invalidated = \ + is_disconnect = ctx.is_disconnect + + if newraise: + util.raise_from_cause(newraise, exc_info) + elif should_wrap: + util.raise_from_cause( + sqlalchemy_exception, + exc_info + ) + else: + util.reraise(*exc_info) + + def transaction(self, callable_, *args, **kwargs): + r"""Execute the given function within a transaction boundary. + + The function is passed this :class:`.Connection` + as the first argument, followed by the given \*args and \**kwargs, + e.g.:: + + def do_something(conn, x, y): + conn.execute("some statement", {'x':x, 'y':y}) + + conn.transaction(do_something, 5, 10) + + The operations inside the function are all invoked within the + context of a single :class:`.Transaction`. + Upon success, the transaction is committed. If an + exception is raised, the transaction is rolled back + before propagating the exception. + + .. note:: + + The :meth:`.transaction` method is superseded by + the usage of the Python ``with:`` statement, which can + be used with :meth:`.Connection.begin`:: + + with conn.begin(): + conn.execute("some statement", {'x':5, 'y':10}) + + As well as with :meth:`.Engine.begin`:: + + with engine.begin() as conn: + conn.execute("some statement", {'x':5, 'y':10}) + + See also: + + :meth:`.Engine.begin` - engine-level transactional + context + + :meth:`.Engine.transaction` - engine-level version of + :meth:`.Connection.transaction` + + """ + + trans = self.begin() + try: + ret = self.run_callable(callable_, *args, **kwargs) + trans.commit() + return ret + except: + with util.safe_reraise(): + trans.rollback() + + def run_callable(self, callable_, *args, **kwargs): + r"""Given a callable object or function, execute it, passing + a :class:`.Connection` as the first argument. + + The given \*args and \**kwargs are passed subsequent + to the :class:`.Connection` argument. + + This function, along with :meth:`.Engine.run_callable`, + allows a function to be run with a :class:`.Connection` + or :class:`.Engine` object without the need to know + which one is being dealt with. + + """ + return callable_(self, *args, **kwargs) + + def _run_visitor(self, visitorcallable, element, **kwargs): + visitorcallable(self.dialect, self, + **kwargs).traverse_single(element) + + +class ExceptionContextImpl(ExceptionContext): + """Implement the :class:`.ExceptionContext` interface.""" + + def __init__(self, exception, sqlalchemy_exception, + engine, connection, cursor, statement, parameters, + context, is_disconnect, invalidate_pool_on_disconnect): + self.engine = engine + self.connection = connection + self.sqlalchemy_exception = sqlalchemy_exception + self.original_exception = exception + self.execution_context = context + self.statement = statement + self.parameters = parameters + self.is_disconnect = is_disconnect + self.invalidate_pool_on_disconnect = invalidate_pool_on_disconnect + + +class Transaction(object): + """Represent a database transaction in progress. + + The :class:`.Transaction` object is procured by + calling the :meth:`~.Connection.begin` method of + :class:`.Connection`:: + + from sqlalchemy import create_engine + engine = create_engine("postgresql://scott:tiger@localhost/test") + connection = engine.connect() + trans = connection.begin() + connection.execute("insert into x (a, b) values (1, 2)") + trans.commit() + + The object provides :meth:`.rollback` and :meth:`.commit` + methods in order to control transaction boundaries. It + also implements a context manager interface so that + the Python ``with`` statement can be used with the + :meth:`.Connection.begin` method:: + + with connection.begin(): + connection.execute("insert into x (a, b) values (1, 2)") + + The Transaction object is **not** threadsafe. + + See also: :meth:`.Connection.begin`, :meth:`.Connection.begin_twophase`, + :meth:`.Connection.begin_nested`. + + .. index:: + single: thread safety; Transaction + """ + + def __init__(self, connection, parent): + self.connection = connection + self._actual_parent = parent + self.is_active = True + + @property + def _parent(self): + return self._actual_parent or self + + def close(self): + """Close this :class:`.Transaction`. + + If this transaction is the base transaction in a begin/commit + nesting, the transaction will rollback(). Otherwise, the + method returns. + + This is used to cancel a Transaction without affecting the scope of + an enclosing transaction. + + """ + if not self._parent.is_active: + return + if self._parent is self: + self.rollback() + + def rollback(self): + """Roll back this :class:`.Transaction`. + + """ + if not self._parent.is_active: + return + self._do_rollback() + self.is_active = False + + def _do_rollback(self): + self._parent.rollback() + + def commit(self): + """Commit this :class:`.Transaction`.""" + + if not self._parent.is_active: + raise exc.InvalidRequestError("This transaction is inactive") + self._do_commit() + self.is_active = False + + def _do_commit(self): + pass + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + if type is None and self.is_active: + try: + self.commit() + except: + with util.safe_reraise(): + self.rollback() + else: + self.rollback() + + +class RootTransaction(Transaction): + def __init__(self, connection): + super(RootTransaction, self).__init__(connection, None) + self.connection._begin_impl(self) + + def _do_rollback(self): + if self.is_active: + self.connection._rollback_impl() + + def _do_commit(self): + if self.is_active: + self.connection._commit_impl() + + +class NestedTransaction(Transaction): + """Represent a 'nested', or SAVEPOINT transaction. + + A new :class:`.NestedTransaction` object may be procured + using the :meth:`.Connection.begin_nested` method. + + The interface is the same as that of :class:`.Transaction`. + + """ + + def __init__(self, connection, parent): + super(NestedTransaction, self).__init__(connection, parent) + self._savepoint = self.connection._savepoint_impl() + + def _do_rollback(self): + if self.is_active: + self.connection._rollback_to_savepoint_impl( + self._savepoint, self._parent) + + def _do_commit(self): + if self.is_active: + self.connection._release_savepoint_impl( + self._savepoint, self._parent) + + +class TwoPhaseTransaction(Transaction): + """Represent a two-phase transaction. + + A new :class:`.TwoPhaseTransaction` object may be procured + using the :meth:`.Connection.begin_twophase` method. + + The interface is the same as that of :class:`.Transaction` + with the addition of the :meth:`prepare` method. + + """ + + def __init__(self, connection, xid): + super(TwoPhaseTransaction, self).__init__(connection, None) + self._is_prepared = False + self.xid = xid + self.connection._begin_twophase_impl(self) + + def prepare(self): + """Prepare this :class:`.TwoPhaseTransaction`. + + After a PREPARE, the transaction can be committed. + + """ + if not self._parent.is_active: + raise exc.InvalidRequestError("This transaction is inactive") + self.connection._prepare_twophase_impl(self.xid) + self._is_prepared = True + + def _do_rollback(self): + self.connection._rollback_twophase_impl(self.xid, self._is_prepared) + + def _do_commit(self): + self.connection._commit_twophase_impl(self.xid, self._is_prepared) + + +class Engine(Connectable, log.Identified): + """ + Connects a :class:`~sqlalchemy.pool.Pool` and + :class:`~sqlalchemy.engine.interfaces.Dialect` together to provide a + source of database connectivity and behavior. + + An :class:`.Engine` object is instantiated publicly using the + :func:`~sqlalchemy.create_engine` function. + + See also: + + :doc:`/core/engines` + + :ref:`connections_toplevel` + + """ + + _execution_options = util.immutabledict() + _has_events = False + _connection_cls = Connection + + schema_for_object = schema._schema_getter(None) + """Return the ".schema" attribute for an object. + + Used for :class:`.Table`, :class:`.Sequence` and similar objects, + and takes into account + the :paramref:`.Connection.execution_options.schema_translate_map` + parameter. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`schema_translating` + + """ + + def __init__(self, pool, dialect, url, + logging_name=None, echo=None, proxy=None, + execution_options=None + ): + self.pool = pool + self.url = url + self.dialect = dialect + if logging_name: + self.logging_name = logging_name + self.echo = echo + self.engine = self + log.instance_logger(self, echoflag=echo) + if proxy: + interfaces.ConnectionProxy._adapt_listener(self, proxy) + if execution_options: + self.update_execution_options(**execution_options) + + def update_execution_options(self, **opt): + r"""Update the default execution_options dictionary + of this :class:`.Engine`. + + The given keys/values in \**opt are added to the + default execution options that will be used for + all connections. The initial contents of this dictionary + can be sent via the ``execution_options`` parameter + to :func:`.create_engine`. + + .. seealso:: + + :meth:`.Connection.execution_options` + + :meth:`.Engine.execution_options` + + """ + self._execution_options = \ + self._execution_options.union(opt) + self.dispatch.set_engine_execution_options(self, opt) + self.dialect.set_engine_execution_options(self, opt) + + def execution_options(self, **opt): + """Return a new :class:`.Engine` that will provide + :class:`.Connection` objects with the given execution options. + + The returned :class:`.Engine` remains related to the original + :class:`.Engine` in that it shares the same connection pool and + other state: + + * The :class:`.Pool` used by the new :class:`.Engine` is the + same instance. The :meth:`.Engine.dispose` method will replace + the connection pool instance for the parent engine as well + as this one. + * Event listeners are "cascaded" - meaning, the new :class:`.Engine` + inherits the events of the parent, and new events can be associated + with the new :class:`.Engine` individually. + * The logging configuration and logging_name is copied from the parent + :class:`.Engine`. + + The intent of the :meth:`.Engine.execution_options` method is + to implement "sharding" schemes where multiple :class:`.Engine` + objects refer to the same connection pool, but are differentiated + by options that would be consumed by a custom event:: + + primary_engine = create_engine("mysql://") + shard1 = primary_engine.execution_options(shard_id="shard1") + shard2 = primary_engine.execution_options(shard_id="shard2") + + Above, the ``shard1`` engine serves as a factory for + :class:`.Connection` objects that will contain the execution option + ``shard_id=shard1``, and ``shard2`` will produce :class:`.Connection` + objects that contain the execution option ``shard_id=shard2``. + + An event handler can consume the above execution option to perform + a schema switch or other operation, given a connection. Below + we emit a MySQL ``use`` statement to switch databases, at the same + time keeping track of which database we've established using the + :attr:`.Connection.info` dictionary, which gives us a persistent + storage space that follows the DBAPI connection:: + + from sqlalchemy import event + from sqlalchemy.engine import Engine + + shards = {"default": "base", shard_1: "db1", "shard_2": "db2"} + + @event.listens_for(Engine, "before_cursor_execute") + def _switch_shard(conn, cursor, stmt, + params, context, executemany): + shard_id = conn._execution_options.get('shard_id', "default") + current_shard = conn.info.get("current_shard", None) + + if current_shard != shard_id: + cursor.execute("use %s" % shards[shard_id]) + conn.info["current_shard"] = shard_id + + .. versionadded:: 0.8 + + .. seealso:: + + :meth:`.Connection.execution_options` - update execution options + on a :class:`.Connection` object. + + :meth:`.Engine.update_execution_options` - update the execution + options for a given :class:`.Engine` in place. + + """ + return OptionEngine(self, opt) + + @property + def name(self): + """String name of the :class:`~sqlalchemy.engine.interfaces.Dialect` + in use by this :class:`Engine`.""" + + return self.dialect.name + + @property + def driver(self): + """Driver name of the :class:`~sqlalchemy.engine.interfaces.Dialect` + in use by this :class:`Engine`.""" + + return self.dialect.driver + + echo = log.echo_property() + + def __repr__(self): + return 'Engine(%r)' % self.url + + def dispose(self): + """Dispose of the connection pool used by this :class:`.Engine`. + + This has the effect of fully closing all **currently checked in** + database connections. Connections that are still checked out + will **not** be closed, however they will no longer be associated + with this :class:`.Engine`, so when they are closed individually, + eventually the :class:`.Pool` which they are associated with will + be garbage collected and they will be closed out fully, if + not already closed on checkin. + + A new connection pool is created immediately after the old one has + been disposed. This new pool, like all SQLAlchemy connection pools, + does not make any actual connections to the database until one is + first requested, so as long as the :class:`.Engine` isn't used again, + no new connections will be made. + + .. seealso:: + + :ref:`engine_disposal` + + """ + self.pool.dispose() + self.pool = self.pool.recreate() + self.dispatch.engine_disposed(self) + + def _execute_default(self, default): + with self.contextual_connect() as conn: + return conn._execute_default(default, (), {}) + + @contextlib.contextmanager + def _optional_conn_ctx_manager(self, connection=None): + if connection is None: + with self.contextual_connect() as conn: + yield conn + else: + yield connection + + def _run_visitor(self, visitorcallable, element, + connection=None, **kwargs): + with self._optional_conn_ctx_manager(connection) as conn: + conn._run_visitor(visitorcallable, element, **kwargs) + + class _trans_ctx(object): + def __init__(self, conn, transaction, close_with_result): + self.conn = conn + self.transaction = transaction + self.close_with_result = close_with_result + + def __enter__(self): + return self.conn + + def __exit__(self, type, value, traceback): + if type is not None: + self.transaction.rollback() + else: + self.transaction.commit() + if not self.close_with_result: + self.conn.close() + + def begin(self, close_with_result=False): + """Return a context manager delivering a :class:`.Connection` + with a :class:`.Transaction` established. + + E.g.:: + + with engine.begin() as conn: + conn.execute("insert into table (x, y, z) values (1, 2, 3)") + conn.execute("my_special_procedure(5)") + + Upon successful operation, the :class:`.Transaction` + is committed. If an error is raised, the :class:`.Transaction` + is rolled back. + + The ``close_with_result`` flag is normally ``False``, and indicates + that the :class:`.Connection` will be closed when the operation + is complete. When set to ``True``, it indicates the + :class:`.Connection` is in "single use" mode, where the + :class:`.ResultProxy` returned by the first call to + :meth:`.Connection.execute` will close the :class:`.Connection` when + that :class:`.ResultProxy` has exhausted all result rows. + + .. versionadded:: 0.7.6 + + See also: + + :meth:`.Engine.connect` - procure a :class:`.Connection` from + an :class:`.Engine`. + + :meth:`.Connection.begin` - start a :class:`.Transaction` + for a particular :class:`.Connection`. + + """ + conn = self.contextual_connect(close_with_result=close_with_result) + try: + trans = conn.begin() + except: + with util.safe_reraise(): + conn.close() + return Engine._trans_ctx(conn, trans, close_with_result) + + def transaction(self, callable_, *args, **kwargs): + r"""Execute the given function within a transaction boundary. + + The function is passed a :class:`.Connection` newly procured + from :meth:`.Engine.contextual_connect` as the first argument, + followed by the given \*args and \**kwargs. + + e.g.:: + + def do_something(conn, x, y): + conn.execute("some statement", {'x':x, 'y':y}) + + engine.transaction(do_something, 5, 10) + + The operations inside the function are all invoked within the + context of a single :class:`.Transaction`. + Upon success, the transaction is committed. If an + exception is raised, the transaction is rolled back + before propagating the exception. + + .. note:: + + The :meth:`.transaction` method is superseded by + the usage of the Python ``with:`` statement, which can + be used with :meth:`.Engine.begin`:: + + with engine.begin() as conn: + conn.execute("some statement", {'x':5, 'y':10}) + + See also: + + :meth:`.Engine.begin` - engine-level transactional + context + + :meth:`.Connection.transaction` - connection-level version of + :meth:`.Engine.transaction` + + """ + + with self.contextual_connect() as conn: + return conn.transaction(callable_, *args, **kwargs) + + def run_callable(self, callable_, *args, **kwargs): + r"""Given a callable object or function, execute it, passing + a :class:`.Connection` as the first argument. + + The given \*args and \**kwargs are passed subsequent + to the :class:`.Connection` argument. + + This function, along with :meth:`.Connection.run_callable`, + allows a function to be run with a :class:`.Connection` + or :class:`.Engine` object without the need to know + which one is being dealt with. + + """ + with self.contextual_connect() as conn: + return conn.run_callable(callable_, *args, **kwargs) + + def execute(self, statement, *multiparams, **params): + """Executes the given construct and returns a :class:`.ResultProxy`. + + The arguments are the same as those used by + :meth:`.Connection.execute`. + + Here, a :class:`.Connection` is acquired using the + :meth:`~.Engine.contextual_connect` method, and the statement executed + with that connection. The returned :class:`.ResultProxy` is flagged + such that when the :class:`.ResultProxy` is exhausted and its + underlying cursor is closed, the :class:`.Connection` created here + will also be closed, which allows its associated DBAPI connection + resource to be returned to the connection pool. + + """ + + connection = self.contextual_connect(close_with_result=True) + return connection.execute(statement, *multiparams, **params) + + def scalar(self, statement, *multiparams, **params): + return self.execute(statement, *multiparams, **params).scalar() + + def _execute_clauseelement(self, elem, multiparams=None, params=None): + connection = self.contextual_connect(close_with_result=True) + return connection._execute_clauseelement(elem, multiparams, params) + + def _execute_compiled(self, compiled, multiparams, params): + connection = self.contextual_connect(close_with_result=True) + return connection._execute_compiled(compiled, multiparams, params) + + def connect(self, **kwargs): + """Return a new :class:`.Connection` object. + + The :class:`.Connection` object is a facade that uses a DBAPI + connection internally in order to communicate with the database. This + connection is procured from the connection-holding :class:`.Pool` + referenced by this :class:`.Engine`. When the + :meth:`~.Connection.close` method of the :class:`.Connection` object + is called, the underlying DBAPI connection is then returned to the + connection pool, where it may be used again in a subsequent call to + :meth:`~.Engine.connect`. + + """ + + return self._connection_cls(self, **kwargs) + + def contextual_connect(self, close_with_result=False, **kwargs): + """Return a :class:`.Connection` object which may be part of some + ongoing context. + + By default, this method does the same thing as :meth:`.Engine.connect`. + Subclasses of :class:`.Engine` may override this method + to provide contextual behavior. + + :param close_with_result: When True, the first :class:`.ResultProxy` + created by the :class:`.Connection` will call the + :meth:`.Connection.close` method of that connection as soon as any + pending result rows are exhausted. This is used to supply the + "connectionless execution" behavior provided by the + :meth:`.Engine.execute` method. + + """ + + return self._connection_cls( + self, + self._wrap_pool_connect(self.pool.connect, None), + close_with_result=close_with_result, + **kwargs) + + def table_names(self, schema=None, connection=None): + """Return a list of all table names available in the database. + + :param schema: Optional, retrieve names from a non-default schema. + + :param connection: Optional, use a specified connection. Default is + the ``contextual_connect`` for this ``Engine``. + """ + + with self._optional_conn_ctx_manager(connection) as conn: + if not schema: + schema = self.dialect.default_schema_name + return self.dialect.get_table_names(conn, schema) + + def has_table(self, table_name, schema=None): + """Return True if the given backend has a table of the given name. + + .. seealso:: + + :ref:`metadata_reflection_inspector` - detailed schema inspection + using the :class:`.Inspector` interface. + + :class:`.quoted_name` - used to pass quoting information along + with a schema identifier. + + """ + return self.run_callable(self.dialect.has_table, table_name, schema) + + def _wrap_pool_connect(self, fn, connection): + dialect = self.dialect + try: + return fn() + except dialect.dbapi.Error as e: + if connection is None: + Connection._handle_dbapi_exception_noconnection( + e, dialect, self) + else: + util.reraise(*sys.exc_info()) + + def raw_connection(self, _connection=None): + """Return a "raw" DBAPI connection from the connection pool. + + The returned object is a proxied version of the DBAPI + connection object used by the underlying driver in use. + The object will have all the same behavior as the real DBAPI + connection, except that its ``close()`` method will result in the + connection being returned to the pool, rather than being closed + for real. + + This method provides direct DBAPI connection access for + special situations when the API provided by :class:`.Connection` + is not needed. When a :class:`.Connection` object is already + present, the DBAPI connection is available using + the :attr:`.Connection.connection` accessor. + + .. seealso:: + + :ref:`dbapi_connections` + + """ + return self._wrap_pool_connect( + self.pool.unique_connection, _connection) + + +class OptionEngine(Engine): + def __init__(self, proxied, execution_options): + self._proxied = proxied + self.url = proxied.url + self.dialect = proxied.dialect + self.logging_name = proxied.logging_name + self.echo = proxied.echo + log.instance_logger(self, echoflag=self.echo) + self.dispatch = self.dispatch._join(proxied.dispatch) + self._execution_options = proxied._execution_options + self.update_execution_options(**execution_options) + + def _get_pool(self): + return self._proxied.pool + + def _set_pool(self, pool): + self._proxied.pool = pool + + pool = property(_get_pool, _set_pool) + + def _get_has_events(self): + return self._proxied._has_events or \ + self.__dict__.get('_has_events', False) + + def _set_has_events(self, value): + self.__dict__['_has_events'] = value + + _has_events = property(_get_has_events, _set_has_events) diff --git a/app/lib/sqlalchemy/engine/default.py b/app/lib/sqlalchemy/engine/default.py new file mode 100644 index 0000000..bcc78be --- /dev/null +++ b/app/lib/sqlalchemy/engine/default.py @@ -0,0 +1,1119 @@ +# engine/default.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Default implementations of per-dialect sqlalchemy.engine classes. + +These are semi-private implementation classes which are only of importance +to database dialect authors; dialects will usually use the classes here +as the base class for their own corresponding classes. + +""" + +import re +import random +from . import reflection, interfaces, result +from ..sql import compiler, expression, schema +from .. import types as sqltypes +from .. import exc, util, pool, processors +import codecs +import weakref +from .. import event + +AUTOCOMMIT_REGEXP = re.compile( + r'\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER)', + re.I | re.UNICODE) + +# When we're handed literal SQL, ensure it's a SELECT query +SERVER_SIDE_CURSOR_RE = re.compile( + r'\s*SELECT', + re.I | re.UNICODE) + + +class DefaultDialect(interfaces.Dialect): + """Default implementation of Dialect""" + + statement_compiler = compiler.SQLCompiler + ddl_compiler = compiler.DDLCompiler + type_compiler = compiler.GenericTypeCompiler + preparer = compiler.IdentifierPreparer + supports_alter = True + + # the first value we'd get for an autoincrement + # column. + default_sequence_base = 1 + + # most DBAPIs happy with this for execute(). + # not cx_oracle. + execute_sequence_format = tuple + + supports_views = True + supports_sequences = False + sequences_optional = False + preexecute_autoincrement_sequences = False + postfetch_lastrowid = True + implicit_returning = False + + supports_right_nested_joins = True + + supports_native_enum = False + supports_native_boolean = False + + supports_simple_order_by_label = True + + engine_config_types = util.immutabledict([ + ('convert_unicode', util.bool_or_str('force')), + ('pool_timeout', util.asint), + ('echo', util.bool_or_str('debug')), + ('echo_pool', util.bool_or_str('debug')), + ('pool_recycle', util.asint), + ('pool_size', util.asint), + ('max_overflow', util.asint), + ('pool_threadlocal', util.asbool), + ]) + + # if the NUMERIC type + # returns decimal.Decimal. + # *not* the FLOAT type however. + supports_native_decimal = False + + if util.py3k: + supports_unicode_statements = True + supports_unicode_binds = True + returns_unicode_strings = True + description_encoding = None + else: + supports_unicode_statements = False + supports_unicode_binds = False + returns_unicode_strings = False + description_encoding = 'use_encoding' + + name = 'default' + + # length at which to truncate + # any identifier. + max_identifier_length = 9999 + + # length at which to truncate + # the name of an index. + # Usually None to indicate + # 'use max_identifier_length'. + # thanks to MySQL, sigh + max_index_name_length = None + + supports_sane_rowcount = True + supports_sane_multi_rowcount = True + dbapi_type_map = {} + colspecs = {} + default_paramstyle = 'named' + supports_default_values = False + supports_empty_insert = True + supports_multivalues_insert = False + + supports_server_side_cursors = False + + server_version_info = None + + construct_arguments = None + """Optional set of argument specifiers for various SQLAlchemy + constructs, typically schema items. + + To implement, establish as a series of tuples, as in:: + + construct_arguments = [ + (schema.Index, { + "using": False, + "where": None, + "ops": None + }) + ] + + If the above construct is established on the PostgreSQL dialect, + the :class:`.Index` construct will now accept the keyword arguments + ``postgresql_using``, ``postgresql_where``, nad ``postgresql_ops``. + Any other argument specified to the constructor of :class:`.Index` + which is prefixed with ``postgresql_`` will raise :class:`.ArgumentError`. + + A dialect which does not include a ``construct_arguments`` member will + not participate in the argument validation system. For such a dialect, + any argument name is accepted by all participating constructs, within + the namespace of arguments prefixed with that dialect name. The rationale + here is so that third-party dialects that haven't yet implemented this + feature continue to function in the old way. + + .. versionadded:: 0.9.2 + + .. seealso:: + + :class:`.DialectKWArgs` - implementing base class which consumes + :attr:`.DefaultDialect.construct_arguments` + + + """ + + # indicates symbol names are + # UPPERCASEd if they are case insensitive + # within the database. + # if this is True, the methods normalize_name() + # and denormalize_name() must be provided. + requires_name_normalize = False + + reflection_options = () + + dbapi_exception_translation_map = util.immutabledict() + """mapping used in the extremely unusual case that a DBAPI's + published exceptions don't actually have the __name__ that they + are linked towards. + + .. versionadded:: 1.0.5 + + """ + + def __init__(self, convert_unicode=False, + encoding='utf-8', paramstyle=None, dbapi=None, + implicit_returning=None, + supports_right_nested_joins=None, + case_sensitive=True, + supports_native_boolean=None, + label_length=None, **kwargs): + + if not getattr(self, 'ported_sqla_06', True): + util.warn( + "The %s dialect is not yet ported to the 0.6 format" % + self.name) + + self.convert_unicode = convert_unicode + self.encoding = encoding + self.positional = False + self._ischema = None + self.dbapi = dbapi + if paramstyle is not None: + self.paramstyle = paramstyle + elif self.dbapi is not None: + self.paramstyle = self.dbapi.paramstyle + else: + self.paramstyle = self.default_paramstyle + if implicit_returning is not None: + self.implicit_returning = implicit_returning + self.positional = self.paramstyle in ('qmark', 'format', 'numeric') + self.identifier_preparer = self.preparer(self) + self.type_compiler = self.type_compiler(self) + if supports_right_nested_joins is not None: + self.supports_right_nested_joins = supports_right_nested_joins + if supports_native_boolean is not None: + self.supports_native_boolean = supports_native_boolean + self.case_sensitive = case_sensitive + + if label_length and label_length > self.max_identifier_length: + raise exc.ArgumentError( + "Label length of %d is greater than this dialect's" + " maximum identifier length of %d" % + (label_length, self.max_identifier_length)) + self.label_length = label_length + + if self.description_encoding == 'use_encoding': + self._description_decoder = \ + processors.to_unicode_processor_factory( + encoding + ) + elif self.description_encoding is not None: + self._description_decoder = \ + processors.to_unicode_processor_factory( + self.description_encoding + ) + self._encoder = codecs.getencoder(self.encoding) + self._decoder = processors.to_unicode_processor_factory(self.encoding) + + @util.memoized_property + def _type_memos(self): + return weakref.WeakKeyDictionary() + + @property + def dialect_description(self): + return self.name + "+" + self.driver + + @classmethod + def get_pool_class(cls, url): + return getattr(cls, 'poolclass', pool.QueuePool) + + def initialize(self, connection): + try: + self.server_version_info = \ + self._get_server_version_info(connection) + except NotImplementedError: + self.server_version_info = None + try: + self.default_schema_name = \ + self._get_default_schema_name(connection) + except NotImplementedError: + self.default_schema_name = None + + try: + self.default_isolation_level = \ + self.get_isolation_level(connection.connection) + except NotImplementedError: + self.default_isolation_level = None + + self.returns_unicode_strings = self._check_unicode_returns(connection) + + if self.description_encoding is not None and \ + self._check_unicode_description(connection): + self._description_decoder = self.description_encoding = None + + self.do_rollback(connection.connection) + + def on_connect(self): + """return a callable which sets up a newly created DBAPI connection. + + This is used to set dialect-wide per-connection options such as + isolation modes, unicode modes, etc. + + If a callable is returned, it will be assembled into a pool listener + that receives the direct DBAPI connection, with all wrappers removed. + + If None is returned, no listener will be generated. + + """ + return None + + def _check_unicode_returns(self, connection, additional_tests=None): + if util.py2k and not self.supports_unicode_statements: + cast_to = util.binary_type + else: + cast_to = util.text_type + + if self.positional: + parameters = self.execute_sequence_format() + else: + parameters = {} + + def check_unicode(test): + statement = cast_to( + expression.select([test]).compile(dialect=self)) + try: + cursor = connection.connection.cursor() + connection._cursor_execute(cursor, statement, parameters) + row = cursor.fetchone() + cursor.close() + except exc.DBAPIError as de: + # note that _cursor_execute() will have closed the cursor + # if an exception is thrown. + util.warn("Exception attempting to " + "detect unicode returns: %r" % de) + return False + else: + return isinstance(row[0], util.text_type) + + tests = [ + # detect plain VARCHAR + expression.cast( + expression.literal_column("'test plain returns'"), + sqltypes.VARCHAR(60) + ), + # detect if there's an NVARCHAR type with different behavior + # available + expression.cast( + expression.literal_column("'test unicode returns'"), + sqltypes.Unicode(60) + ), + ] + + if additional_tests: + tests += additional_tests + + results = set([check_unicode(test) for test in tests]) + + if results.issuperset([True, False]): + return "conditional" + else: + return results == set([True]) + + def _check_unicode_description(self, connection): + # all DBAPIs on Py2K return cursor.description as encoded, + # until pypy2.1beta2 with sqlite, so let's just check it - + # it's likely others will start doing this too in Py2k. + + if util.py2k and not self.supports_unicode_statements: + cast_to = util.binary_type + else: + cast_to = util.text_type + + cursor = connection.connection.cursor() + try: + cursor.execute( + cast_to( + expression.select([ + expression.literal_column("'x'").label("some_label") + ]).compile(dialect=self) + ) + ) + return isinstance(cursor.description[0][0], util.text_type) + finally: + cursor.close() + + def type_descriptor(self, typeobj): + """Provide a database-specific :class:`.TypeEngine` object, given + the generic object which comes from the types module. + + This method looks for a dictionary called + ``colspecs`` as a class or instance-level variable, + and passes on to :func:`.types.adapt_type`. + + """ + return sqltypes.adapt_type(typeobj, self.colspecs) + + def reflecttable( + self, connection, table, include_columns, exclude_columns, **opts): + insp = reflection.Inspector.from_engine(connection) + return insp.reflecttable( + table, include_columns, exclude_columns, **opts) + + def get_pk_constraint(self, conn, table_name, schema=None, **kw): + """Compatibility method, adapts the result of get_primary_keys() + for those dialects which don't implement get_pk_constraint(). + + """ + return { + 'constrained_columns': + self.get_primary_keys(conn, table_name, + schema=schema, **kw) + } + + def validate_identifier(self, ident): + if len(ident) > self.max_identifier_length: + raise exc.IdentifierError( + "Identifier '%s' exceeds maximum length of %d characters" % + (ident, self.max_identifier_length) + ) + + def connect(self, *cargs, **cparams): + return self.dbapi.connect(*cargs, **cparams) + + def create_connect_args(self, url): + opts = url.translate_connect_args() + opts.update(url.query) + return [[], opts] + + def set_engine_execution_options(self, engine, opts): + if 'isolation_level' in opts: + isolation_level = opts['isolation_level'] + + @event.listens_for(engine, "engine_connect") + def set_isolation(connection, branch): + if not branch: + self._set_connection_isolation(connection, isolation_level) + + if 'schema_translate_map' in opts: + getter = schema._schema_getter(opts['schema_translate_map']) + engine.schema_for_object = getter + + @event.listens_for(engine, "engine_connect") + def set_schema_translate_map(connection, branch): + connection.schema_for_object = getter + + def set_connection_execution_options(self, connection, opts): + if 'isolation_level' in opts: + self._set_connection_isolation(connection, opts['isolation_level']) + + if 'schema_translate_map' in opts: + getter = schema._schema_getter(opts['schema_translate_map']) + connection.schema_for_object = getter + + def _set_connection_isolation(self, connection, level): + if connection.in_transaction(): + util.warn( + "Connection is already established with a Transaction; " + "setting isolation_level may implicitly rollback or commit " + "the existing transaction, or have no effect until " + "next transaction") + self.set_isolation_level(connection.connection, level) + connection.connection._connection_record.\ + finalize_callback.append(self.reset_isolation_level) + + def do_begin(self, dbapi_connection): + pass + + def do_rollback(self, dbapi_connection): + dbapi_connection.rollback() + + def do_commit(self, dbapi_connection): + dbapi_connection.commit() + + def do_close(self, dbapi_connection): + dbapi_connection.close() + + def create_xid(self): + """Create a random two-phase transaction ID. + + This id will be passed to do_begin_twophase(), do_rollback_twophase(), + do_commit_twophase(). Its format is unspecified. + """ + + return "_sa_%032x" % random.randint(0, 2 ** 128) + + def do_savepoint(self, connection, name): + connection.execute(expression.SavepointClause(name)) + + def do_rollback_to_savepoint(self, connection, name): + connection.execute(expression.RollbackToSavepointClause(name)) + + def do_release_savepoint(self, connection, name): + connection.execute(expression.ReleaseSavepointClause(name)) + + def do_executemany(self, cursor, statement, parameters, context=None): + cursor.executemany(statement, parameters) + + def do_execute(self, cursor, statement, parameters, context=None): + cursor.execute(statement, parameters) + + def do_execute_no_params(self, cursor, statement, context=None): + cursor.execute(statement) + + def is_disconnect(self, e, connection, cursor): + return False + + def reset_isolation_level(self, dbapi_conn): + # default_isolation_level is read from the first connection + # after the initial set of 'isolation_level', if any, so is + # the configured default of this dialect. + self.set_isolation_level(dbapi_conn, self.default_isolation_level) + + +class StrCompileDialect(DefaultDialect): + + statement_compiler = compiler.StrSQLCompiler + ddl_compiler = compiler.DDLCompiler + type_compiler = compiler.StrSQLTypeCompiler + preparer = compiler.IdentifierPreparer + + supports_sequences = True + sequences_optional = True + preexecute_autoincrement_sequences = False + implicit_returning = False + + supports_native_boolean = True + + supports_simple_order_by_label = True + + +class DefaultExecutionContext(interfaces.ExecutionContext): + isinsert = False + isupdate = False + isdelete = False + is_crud = False + is_text = False + isddl = False + executemany = False + compiled = None + statement = None + result_column_struct = None + returned_defaults = None + _is_implicit_returning = False + _is_explicit_returning = False + + # a hook for SQLite's translation of + # result column names + _translate_colname = None + + @classmethod + def _init_ddl(cls, dialect, connection, dbapi_connection, compiled_ddl): + """Initialize execution context for a DDLElement construct.""" + + self = cls.__new__(cls) + self.root_connection = connection + self._dbapi_connection = dbapi_connection + self.dialect = connection.dialect + + self.compiled = compiled = compiled_ddl + self.isddl = True + + self.execution_options = compiled.execution_options + if connection._execution_options: + self.execution_options = dict(self.execution_options) + self.execution_options.update(connection._execution_options) + + if not dialect.supports_unicode_statements: + self.unicode_statement = util.text_type(compiled) + self.statement = dialect._encoder(self.unicode_statement)[0] + else: + self.statement = self.unicode_statement = util.text_type(compiled) + + self.cursor = self.create_cursor() + self.compiled_parameters = [] + + if dialect.positional: + self.parameters = [dialect.execute_sequence_format()] + else: + self.parameters = [{}] + + return self + + @classmethod + def _init_compiled(cls, dialect, connection, dbapi_connection, + compiled, parameters): + """Initialize execution context for a Compiled construct.""" + + self = cls.__new__(cls) + self.root_connection = connection + self._dbapi_connection = dbapi_connection + self.dialect = connection.dialect + + self.compiled = compiled + + # this should be caught in the engine before + # we get here + assert compiled.can_execute + + self.execution_options = compiled.execution_options.union( + connection._execution_options) + + self.result_column_struct = ( + compiled._result_columns, compiled._ordered_columns, + compiled._textual_ordered_columns) + + self.unicode_statement = util.text_type(compiled) + if not dialect.supports_unicode_statements: + self.statement = self.unicode_statement.encode( + self.dialect.encoding) + else: + self.statement = self.unicode_statement + + self.isinsert = compiled.isinsert + self.isupdate = compiled.isupdate + self.isdelete = compiled.isdelete + self.is_text = compiled.isplaintext + + if not parameters: + self.compiled_parameters = [compiled.construct_params()] + else: + self.compiled_parameters = \ + [compiled.construct_params(m, _group_number=grp) for + grp, m in enumerate(parameters)] + + self.executemany = len(parameters) > 1 + + self.cursor = self.create_cursor() + + if self.isinsert or self.isupdate or self.isdelete: + self.is_crud = True + self._is_explicit_returning = bool(compiled.statement._returning) + self._is_implicit_returning = bool( + compiled.returning and not compiled.statement._returning) + + if self.compiled.insert_prefetch or self.compiled.update_prefetch: + if self.executemany: + self._process_executemany_defaults() + else: + self._process_executesingle_defaults() + + processors = compiled._bind_processors + + # Convert the dictionary of bind parameter values + # into a dict or list to be sent to the DBAPI's + # execute() or executemany() method. + parameters = [] + if dialect.positional: + for compiled_params in self.compiled_parameters: + param = [] + for key in self.compiled.positiontup: + if key in processors: + param.append(processors[key](compiled_params[key])) + else: + param.append(compiled_params[key]) + parameters.append(dialect.execute_sequence_format(param)) + else: + encode = not dialect.supports_unicode_statements + for compiled_params in self.compiled_parameters: + + if encode: + param = dict( + ( + dialect._encoder(key)[0], + processors[key](compiled_params[key]) + if key in processors + else compiled_params[key] + ) + for key in compiled_params + ) + else: + param = dict( + ( + key, + processors[key](compiled_params[key]) + if key in processors + else compiled_params[key] + ) + for key in compiled_params + ) + + parameters.append(param) + self.parameters = dialect.execute_sequence_format(parameters) + + return self + + @classmethod + def _init_statement(cls, dialect, connection, dbapi_connection, + statement, parameters): + """Initialize execution context for a string SQL statement.""" + + self = cls.__new__(cls) + self.root_connection = connection + self._dbapi_connection = dbapi_connection + self.dialect = connection.dialect + self.is_text = True + + # plain text statement + self.execution_options = connection._execution_options + + if not parameters: + if self.dialect.positional: + self.parameters = [dialect.execute_sequence_format()] + else: + self.parameters = [{}] + elif isinstance(parameters[0], dialect.execute_sequence_format): + self.parameters = parameters + elif isinstance(parameters[0], dict): + if dialect.supports_unicode_statements: + self.parameters = parameters + else: + self.parameters = [ + dict((dialect._encoder(k)[0], d[k]) for k in d) + for d in parameters + ] or [{}] + else: + self.parameters = [dialect.execute_sequence_format(p) + for p in parameters] + + self.executemany = len(parameters) > 1 + + if not dialect.supports_unicode_statements and \ + isinstance(statement, util.text_type): + self.unicode_statement = statement + self.statement = dialect._encoder(statement)[0] + else: + self.statement = self.unicode_statement = statement + + self.cursor = self.create_cursor() + return self + + @classmethod + def _init_default(cls, dialect, connection, dbapi_connection): + """Initialize execution context for a ColumnDefault construct.""" + + self = cls.__new__(cls) + self.root_connection = connection + self._dbapi_connection = dbapi_connection + self.dialect = connection.dialect + self.execution_options = connection._execution_options + self.cursor = self.create_cursor() + return self + + @util.memoized_property + def engine(self): + return self.root_connection.engine + + @util.memoized_property + def postfetch_cols(self): + return self.compiled.postfetch + + @util.memoized_property + def prefetch_cols(self): + if self.isinsert: + return self.compiled.insert_prefetch + elif self.isupdate: + return self.compiled.update_prefetch + else: + return () + + @util.memoized_property + def returning_cols(self): + self.compiled.returning + + @util.memoized_property + def no_parameters(self): + return self.execution_options.get("no_parameters", False) + + @util.memoized_property + def should_autocommit(self): + autocommit = self.execution_options.get('autocommit', + not self.compiled and + self.statement and + expression.PARSE_AUTOCOMMIT + or False) + + if autocommit is expression.PARSE_AUTOCOMMIT: + return self.should_autocommit_text(self.unicode_statement) + else: + return autocommit + + def _execute_scalar(self, stmt, type_): + """Execute a string statement on the current cursor, returning a + scalar result. + + Used to fire off sequences, default phrases, and "select lastrowid" + types of statements individually or in the context of a parent INSERT + or UPDATE statement. + + """ + + conn = self.root_connection + if isinstance(stmt, util.text_type) and \ + not self.dialect.supports_unicode_statements: + stmt = self.dialect._encoder(stmt)[0] + + if self.dialect.positional: + default_params = self.dialect.execute_sequence_format() + else: + default_params = {} + + conn._cursor_execute(self.cursor, stmt, default_params, context=self) + r = self.cursor.fetchone()[0] + if type_ is not None: + # apply type post processors to the result + proc = type_._cached_result_processor( + self.dialect, + self.cursor.description[0][1] + ) + if proc: + return proc(r) + return r + + @property + def connection(self): + return self.root_connection._branch() + + def should_autocommit_text(self, statement): + return AUTOCOMMIT_REGEXP.match(statement) + + def _use_server_side_cursor(self): + if not self.dialect.supports_server_side_cursors: + return False + + if self.dialect.server_side_cursors: + use_server_side = \ + self.execution_options.get('stream_results', True) and ( + (self.compiled and isinstance(self.compiled.statement, + expression.Selectable) + or + ( + (not self.compiled or + isinstance(self.compiled.statement, + expression.TextClause)) + and self.statement and SERVER_SIDE_CURSOR_RE.match( + self.statement)) + ) + ) + else: + use_server_side = \ + self.execution_options.get('stream_results', False) + + return use_server_side + + def create_cursor(self): + if self._use_server_side_cursor(): + self._is_server_side = True + return self.create_server_side_cursor() + else: + self._is_server_side = False + return self._dbapi_connection.cursor() + + def create_server_side_cursor(self): + raise NotImplementedError() + + def pre_exec(self): + pass + + def post_exec(self): + pass + + def get_result_processor(self, type_, colname, coltype): + """Return a 'result processor' for a given type as present in + cursor.description. + + This has a default implementation that dialects can override + for context-sensitive result type handling. + + """ + return type_._cached_result_processor(self.dialect, coltype) + + def get_lastrowid(self): + """return self.cursor.lastrowid, or equivalent, after an INSERT. + + This may involve calling special cursor functions, + issuing a new SELECT on the cursor (or a new one), + or returning a stored value that was + calculated within post_exec(). + + This function will only be called for dialects + which support "implicit" primary key generation, + keep preexecute_autoincrement_sequences set to False, + and when no explicit id value was bound to the + statement. + + The function is called once, directly after + post_exec() and before the transaction is committed + or ResultProxy is generated. If the post_exec() + method assigns a value to `self._lastrowid`, the + value is used in place of calling get_lastrowid(). + + Note that this method is *not* equivalent to the + ``lastrowid`` method on ``ResultProxy``, which is a + direct proxy to the DBAPI ``lastrowid`` accessor + in all cases. + + """ + return self.cursor.lastrowid + + def handle_dbapi_exception(self, e): + pass + + def get_result_proxy(self): + if self._is_server_side: + return result.BufferedRowResultProxy(self) + else: + return result.ResultProxy(self) + + @property + def rowcount(self): + return self.cursor.rowcount + + def supports_sane_rowcount(self): + return self.dialect.supports_sane_rowcount + + def supports_sane_multi_rowcount(self): + return self.dialect.supports_sane_multi_rowcount + + def _setup_crud_result_proxy(self): + if self.isinsert and \ + not self.executemany: + if not self._is_implicit_returning and \ + not self.compiled.inline and \ + self.dialect.postfetch_lastrowid: + + self._setup_ins_pk_from_lastrowid() + + elif not self._is_implicit_returning: + self._setup_ins_pk_from_empty() + + result = self.get_result_proxy() + + if self.isinsert: + if self._is_implicit_returning: + row = result.fetchone() + self.returned_defaults = row + self._setup_ins_pk_from_implicit_returning(row) + result._soft_close() + result._metadata = None + elif not self._is_explicit_returning: + result._soft_close() + result._metadata = None + elif self.isupdate and self._is_implicit_returning: + row = result.fetchone() + self.returned_defaults = row + result._soft_close() + result._metadata = None + + elif result._metadata is None: + # no results, get rowcount + # (which requires open cursor on some drivers + # such as kintersbasdb, mxodbc) + result.rowcount + result._soft_close() + return result + + def _setup_ins_pk_from_lastrowid(self): + key_getter = self.compiled._key_getters_for_crud_column[2] + table = self.compiled.statement.table + compiled_params = self.compiled_parameters[0] + + lastrowid = self.get_lastrowid() + if lastrowid is not None: + autoinc_col = table._autoincrement_column + if autoinc_col is not None: + # apply type post processors to the lastrowid + proc = autoinc_col.type._cached_result_processor( + self.dialect, None) + if proc is not None: + lastrowid = proc(lastrowid) + self.inserted_primary_key = [ + lastrowid if c is autoinc_col else + compiled_params.get(key_getter(c), None) + for c in table.primary_key + ] + else: + # don't have a usable lastrowid, so + # do the same as _setup_ins_pk_from_empty + self.inserted_primary_key = [ + compiled_params.get(key_getter(c), None) + for c in table.primary_key + ] + + def _setup_ins_pk_from_empty(self): + key_getter = self.compiled._key_getters_for_crud_column[2] + table = self.compiled.statement.table + compiled_params = self.compiled_parameters[0] + self.inserted_primary_key = [ + compiled_params.get(key_getter(c), None) + for c in table.primary_key + ] + + def _setup_ins_pk_from_implicit_returning(self, row): + if row is None: + self.inserted_primary_key = None + return + + key_getter = self.compiled._key_getters_for_crud_column[2] + table = self.compiled.statement.table + compiled_params = self.compiled_parameters[0] + self.inserted_primary_key = [ + row[col] if value is None else value + for col, value in [ + (col, compiled_params.get(key_getter(col), None)) + for col in table.primary_key + ] + ] + + def lastrow_has_defaults(self): + return (self.isinsert or self.isupdate) and \ + bool(self.compiled.postfetch) + + def set_input_sizes(self, translate=None, exclude_types=None): + """Given a cursor and ClauseParameters, call the appropriate + style of ``setinputsizes()`` on the cursor, using DB-API types + from the bind parameter's ``TypeEngine`` objects. + + This method only called by those dialects which require it, + currently cx_oracle. + + """ + + if not hasattr(self.compiled, 'bind_names'): + return + + types = dict( + (self.compiled.bind_names[bindparam], bindparam.type) + for bindparam in self.compiled.bind_names) + + if self.dialect.positional: + inputsizes = [] + for key in self.compiled.positiontup: + typeengine = types[key] + dbtype = typeengine.dialect_impl(self.dialect).\ + get_dbapi_type(self.dialect.dbapi) + if dbtype is not None and \ + (not exclude_types or dbtype not in exclude_types): + inputsizes.append(dbtype) + try: + self.cursor.setinputsizes(*inputsizes) + except BaseException as e: + self.root_connection._handle_dbapi_exception( + e, None, None, None, self) + else: + inputsizes = {} + for key in self.compiled.bind_names.values(): + typeengine = types[key] + dbtype = typeengine.dialect_impl(self.dialect).\ + get_dbapi_type(self.dialect.dbapi) + if dbtype is not None and \ + (not exclude_types or dbtype not in exclude_types): + if translate: + key = translate.get(key, key) + if not self.dialect.supports_unicode_binds: + key = self.dialect._encoder(key)[0] + inputsizes[key] = dbtype + try: + self.cursor.setinputsizes(**inputsizes) + except BaseException as e: + self.root_connection._handle_dbapi_exception( + e, None, None, None, self) + + def _exec_default(self, default, type_): + if default.is_sequence: + return self.fire_sequence(default, type_) + elif default.is_callable: + return default.arg(self) + elif default.is_clause_element: + # TODO: expensive branching here should be + # pulled into _exec_scalar() + conn = self.connection + c = expression.select([default.arg]).compile(bind=conn) + return conn._execute_compiled(c, (), {}).scalar() + else: + return default.arg + + def get_insert_default(self, column): + if column.default is None: + return None + else: + return self._exec_default(column.default, column.type) + + def get_update_default(self, column): + if column.onupdate is None: + return None + else: + return self._exec_default(column.onupdate, column.type) + + def _process_executemany_defaults(self): + key_getter = self.compiled._key_getters_for_crud_column[2] + + scalar_defaults = {} + + insert_prefetch = self.compiled.insert_prefetch + update_prefetch = self.compiled.update_prefetch + + # pre-determine scalar Python-side defaults + # to avoid many calls of get_insert_default()/ + # get_update_default() + for c in insert_prefetch: + if c.default and c.default.is_scalar: + scalar_defaults[c] = c.default.arg + for c in update_prefetch: + if c.onupdate and c.onupdate.is_scalar: + scalar_defaults[c] = c.onupdate.arg + + for param in self.compiled_parameters: + self.current_parameters = param + for c in insert_prefetch: + if c in scalar_defaults: + val = scalar_defaults[c] + else: + val = self.get_insert_default(c) + if val is not None: + param[key_getter(c)] = val + for c in update_prefetch: + if c in scalar_defaults: + val = scalar_defaults[c] + else: + val = self.get_update_default(c) + if val is not None: + param[key_getter(c)] = val + + del self.current_parameters + + def _process_executesingle_defaults(self): + key_getter = self.compiled._key_getters_for_crud_column[2] + self.current_parameters = compiled_parameters = \ + self.compiled_parameters[0] + + for c in self.compiled.insert_prefetch: + if c.default and \ + not c.default.is_sequence and c.default.is_scalar: + val = c.default.arg + else: + val = self.get_insert_default(c) + + if val is not None: + compiled_parameters[key_getter(c)] = val + + for c in self.compiled.update_prefetch: + val = self.get_update_default(c) + + if val is not None: + compiled_parameters[key_getter(c)] = val + del self.current_parameters + + +DefaultDialect.execution_ctx_cls = DefaultExecutionContext diff --git a/app/lib/sqlalchemy/engine/interfaces.py b/app/lib/sqlalchemy/engine/interfaces.py new file mode 100644 index 0000000..d0eff1c --- /dev/null +++ b/app/lib/sqlalchemy/engine/interfaces.py @@ -0,0 +1,1286 @@ +# engine/interfaces.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Define core interfaces used by the engine system.""" + +from .. import util + +# backwards compat +from ..sql.compiler import Compiled, TypeCompiler + + +class Dialect(object): + """Define the behavior of a specific database and DB-API combination. + + Any aspect of metadata definition, SQL query generation, + execution, result-set handling, or anything else which varies + between databases is defined under the general category of the + Dialect. The Dialect acts as a factory for other + database-specific object implementations including + ExecutionContext, Compiled, DefaultGenerator, and TypeEngine. + + All Dialects implement the following attributes: + + name + identifying name for the dialect from a DBAPI-neutral point of view + (i.e. 'sqlite') + + driver + identifying name for the dialect's DBAPI + + positional + True if the paramstyle for this Dialect is positional. + + paramstyle + the paramstyle to be used (some DB-APIs support multiple + paramstyles). + + convert_unicode + True if Unicode conversion should be applied to all ``str`` + types. + + encoding + type of encoding to use for unicode, usually defaults to + 'utf-8'. + + statement_compiler + a :class:`.Compiled` class used to compile SQL statements + + ddl_compiler + a :class:`.Compiled` class used to compile DDL statements + + server_version_info + a tuple containing a version number for the DB backend in use. + This value is only available for supporting dialects, and is + typically populated during the initial connection to the database. + + default_schema_name + the name of the default schema. This value is only available for + supporting dialects, and is typically populated during the + initial connection to the database. + + execution_ctx_cls + a :class:`.ExecutionContext` class used to handle statement execution + + execute_sequence_format + either the 'tuple' or 'list' type, depending on what cursor.execute() + accepts for the second argument (they vary). + + preparer + a :class:`~sqlalchemy.sql.compiler.IdentifierPreparer` class used to + quote identifiers. + + supports_alter + ``True`` if the database supports ``ALTER TABLE``. + + max_identifier_length + The maximum length of identifier names. + + supports_unicode_statements + Indicate whether the DB-API can receive SQL statements as Python + unicode strings + + supports_unicode_binds + Indicate whether the DB-API can receive string bind parameters + as Python unicode strings + + supports_sane_rowcount + Indicate whether the dialect properly implements rowcount for + ``UPDATE`` and ``DELETE`` statements. + + supports_sane_multi_rowcount + Indicate whether the dialect properly implements rowcount for + ``UPDATE`` and ``DELETE`` statements when executed via + executemany. + + preexecute_autoincrement_sequences + True if 'implicit' primary key functions must be executed separately + in order to get their value. This is currently oriented towards + PostgreSQL. + + implicit_returning + use RETURNING or equivalent during INSERT execution in order to load + newly generated primary keys and other column defaults in one execution, + which are then available via inserted_primary_key. + If an insert statement has returning() specified explicitly, + the "implicit" functionality is not used and inserted_primary_key + will not be available. + + dbapi_type_map + A mapping of DB-API type objects present in this Dialect's + DB-API implementation mapped to TypeEngine implementations used + by the dialect. + + This is used to apply types to result sets based on the DB-API + types present in cursor.description; it only takes effect for + result sets against textual statements where no explicit + typemap was present. + + colspecs + A dictionary of TypeEngine classes from sqlalchemy.types mapped + to subclasses that are specific to the dialect class. This + dictionary is class-level only and is not accessed from the + dialect instance itself. + + supports_default_values + Indicates if the construct ``INSERT INTO tablename DEFAULT + VALUES`` is supported + + supports_sequences + Indicates if the dialect supports CREATE SEQUENCE or similar. + + sequences_optional + If True, indicates if the "optional" flag on the Sequence() construct + should signal to not generate a CREATE SEQUENCE. Applies only to + dialects that support sequences. Currently used only to allow PostgreSQL + SERIAL to be used on a column that specifies Sequence() for usage on + other backends. + + supports_native_enum + Indicates if the dialect supports a native ENUM construct. + This will prevent types.Enum from generating a CHECK + constraint when that type is used. + + supports_native_boolean + Indicates if the dialect supports a native boolean construct. + This will prevent types.Boolean from generating a CHECK + constraint when that type is used. + + dbapi_exception_translation_map + A dictionary of names that will contain as values the names of + pep-249 exceptions ("IntegrityError", "OperationalError", etc) + keyed to alternate class names, to support the case where a + DBAPI has exception classes that aren't named as they are + referred to (e.g. IntegrityError = MyException). In the vast + majority of cases this dictionary is empty. + + .. versionadded:: 1.0.5 + + """ + + _has_events = False + + def create_connect_args(self, url): + """Build DB-API compatible connection arguments. + + Given a :class:`~sqlalchemy.engine.url.URL` object, returns a tuple + consisting of a `*args`/`**kwargs` suitable to send directly + to the dbapi's connect function. + + """ + + raise NotImplementedError() + + @classmethod + def type_descriptor(cls, typeobj): + """Transform a generic type to a dialect-specific type. + + Dialect classes will usually use the + :func:`.types.adapt_type` function in the types module to + accomplish this. + + The returned result is cached *per dialect class* so can + contain no dialect-instance state. + + """ + + raise NotImplementedError() + + def initialize(self, connection): + """Called during strategized creation of the dialect with a + connection. + + Allows dialects to configure options based on server version info or + other properties. + + The connection passed here is a SQLAlchemy Connection object, + with full capabilities. + + The initialize() method of the base dialect should be called via + super(). + + """ + + pass + + def reflecttable( + self, connection, table, include_columns, exclude_columns): + """Load table description from the database. + + Given a :class:`.Connection` and a + :class:`~sqlalchemy.schema.Table` object, reflect its columns and + properties from the database. + + The implementation of this method is provided by + :meth:`.DefaultDialect.reflecttable`, which makes use of + :class:`.Inspector` to retrieve column information. + + Dialects should **not** seek to implement this method, and should + instead implement individual schema inspection operations such as + :meth:`.Dialect.get_columns`, :meth:`.Dialect.get_pk_constraint`, + etc. + + """ + + raise NotImplementedError() + + def get_columns(self, connection, table_name, schema=None, **kw): + """Return information about columns in `table_name`. + + Given a :class:`.Connection`, a string + `table_name`, and an optional string `schema`, return column + information as a list of dictionaries with these keys: + + name + the column's name + + type + [sqlalchemy.types#TypeEngine] + + nullable + boolean + + default + the column's default value + + autoincrement + boolean + + sequence + a dictionary of the form + {'name' : str, 'start' :int, 'increment': int, 'minvalue': int, + 'maxvalue': int, 'nominvalue': bool, 'nomaxvalue': bool, + 'cycle': bool} + + Additional column attributes may be present. + """ + + raise NotImplementedError() + + def get_primary_keys(self, connection, table_name, schema=None, **kw): + """Return information about primary keys in `table_name`. + + + Deprecated. This method is only called by the default + implementation of :meth:`.Dialect.get_pk_constraint`. Dialects should + instead implement the :meth:`.Dialect.get_pk_constraint` method + directly. + + """ + + raise NotImplementedError() + + def get_pk_constraint(self, connection, table_name, schema=None, **kw): + """Return information about the primary key constraint on + table_name`. + + Given a :class:`.Connection`, a string + `table_name`, and an optional string `schema`, return primary + key information as a dictionary with these keys: + + constrained_columns + a list of column names that make up the primary key + + name + optional name of the primary key constraint. + + """ + raise NotImplementedError() + + def get_foreign_keys(self, connection, table_name, schema=None, **kw): + """Return information about foreign_keys in `table_name`. + + Given a :class:`.Connection`, a string + `table_name`, and an optional string `schema`, return foreign + key information as a list of dicts with these keys: + + name + the constraint's name + + constrained_columns + a list of column names that make up the foreign key + + referred_schema + the name of the referred schema + + referred_table + the name of the referred table + + referred_columns + a list of column names in the referred table that correspond to + constrained_columns + """ + + raise NotImplementedError() + + def get_table_names(self, connection, schema=None, **kw): + """Return a list of table names for `schema`.""" + + raise NotImplementedError() + + def get_temp_table_names(self, connection, schema=None, **kw): + """Return a list of temporary table names on the given connection, + if supported by the underlying backend. + + """ + + raise NotImplementedError() + + def get_view_names(self, connection, schema=None, **kw): + """Return a list of all view names available in the database. + + schema: + Optional, retrieve names from a non-default schema. + """ + + raise NotImplementedError() + + def get_temp_view_names(self, connection, schema=None, **kw): + """Return a list of temporary view names on the given connection, + if supported by the underlying backend. + + """ + + raise NotImplementedError() + + def get_view_definition(self, connection, view_name, schema=None, **kw): + """Return view definition. + + Given a :class:`.Connection`, a string + `view_name`, and an optional string `schema`, return the view + definition. + """ + + raise NotImplementedError() + + def get_indexes(self, connection, table_name, schema=None, **kw): + """Return information about indexes in `table_name`. + + Given a :class:`.Connection`, a string + `table_name` and an optional string `schema`, return index + information as a list of dictionaries with these keys: + + name + the index's name + + column_names + list of column names in order + + unique + boolean + """ + + raise NotImplementedError() + + def get_unique_constraints( + self, connection, table_name, schema=None, **kw): + r"""Return information about unique constraints in `table_name`. + + Given a string `table_name` and an optional string `schema`, return + unique constraint information as a list of dicts with these keys: + + name + the unique constraint's name + + column_names + list of column names in order + + \**kw + other options passed to the dialect's get_unique_constraints() + method. + + .. versionadded:: 0.9.0 + + """ + + raise NotImplementedError() + + def get_check_constraints( + self, connection, table_name, schema=None, **kw): + r"""Return information about check constraints in `table_name`. + + Given a string `table_name` and an optional string `schema`, return + check constraint information as a list of dicts with these keys: + + name + the check constraint's name + + sqltext + the check constraint's SQL expression + + \**kw + other options passed to the dialect's get_check_constraints() + method. + + .. versionadded:: 1.1.0 + + """ + + raise NotImplementedError() + + def normalize_name(self, name): + """convert the given name to lowercase if it is detected as + case insensitive. + + this method is only used if the dialect defines + requires_name_normalize=True. + + """ + raise NotImplementedError() + + def denormalize_name(self, name): + """convert the given name to a case insensitive identifier + for the backend if it is an all-lowercase name. + + this method is only used if the dialect defines + requires_name_normalize=True. + + """ + raise NotImplementedError() + + def has_table(self, connection, table_name, schema=None): + """Check the existence of a particular table in the database. + + Given a :class:`.Connection` object and a string + `table_name`, return True if the given table (possibly within + the specified `schema`) exists in the database, False + otherwise. + """ + + raise NotImplementedError() + + def has_sequence(self, connection, sequence_name, schema=None): + """Check the existence of a particular sequence in the database. + + Given a :class:`.Connection` object and a string + `sequence_name`, return True if the given sequence exists in + the database, False otherwise. + """ + + raise NotImplementedError() + + def _get_server_version_info(self, connection): + """Retrieve the server version info from the given connection. + + This is used by the default implementation to populate the + "server_version_info" attribute and is called exactly + once upon first connect. + + """ + + raise NotImplementedError() + + def _get_default_schema_name(self, connection): + """Return the string name of the currently selected schema from + the given connection. + + This is used by the default implementation to populate the + "default_schema_name" attribute and is called exactly + once upon first connect. + + """ + + raise NotImplementedError() + + def do_begin(self, dbapi_connection): + """Provide an implementation of ``connection.begin()``, given a + DB-API connection. + + The DBAPI has no dedicated "begin" method and it is expected + that transactions are implicit. This hook is provided for those + DBAPIs that might need additional help in this area. + + Note that :meth:`.Dialect.do_begin` is not called unless a + :class:`.Transaction` object is in use. The + :meth:`.Dialect.do_autocommit` + hook is provided for DBAPIs that need some extra commands emitted + after a commit in order to enter the next transaction, when the + SQLAlchemy :class:`.Connection` is used in its default "autocommit" + mode. + + :param dbapi_connection: a DBAPI connection, typically + proxied within a :class:`.ConnectionFairy`. + + """ + + raise NotImplementedError() + + def do_rollback(self, dbapi_connection): + """Provide an implementation of ``connection.rollback()``, given + a DB-API connection. + + :param dbapi_connection: a DBAPI connection, typically + proxied within a :class:`.ConnectionFairy`. + + """ + + raise NotImplementedError() + + def do_commit(self, dbapi_connection): + """Provide an implementation of ``connection.commit()``, given a + DB-API connection. + + :param dbapi_connection: a DBAPI connection, typically + proxied within a :class:`.ConnectionFairy`. + + """ + + raise NotImplementedError() + + def do_close(self, dbapi_connection): + """Provide an implementation of ``connection.close()``, given a DBAPI + connection. + + This hook is called by the :class:`.Pool` when a connection has been + detached from the pool, or is being returned beyond the normal + capacity of the pool. + + .. versionadded:: 0.8 + + """ + + raise NotImplementedError() + + def create_xid(self): + """Create a two-phase transaction ID. + + This id will be passed to do_begin_twophase(), + do_rollback_twophase(), do_commit_twophase(). Its format is + unspecified. + """ + + raise NotImplementedError() + + def do_savepoint(self, connection, name): + """Create a savepoint with the given name. + + :param connection: a :class:`.Connection`. + :param name: savepoint name. + + """ + + raise NotImplementedError() + + def do_rollback_to_savepoint(self, connection, name): + """Rollback a connection to the named savepoint. + + :param connection: a :class:`.Connection`. + :param name: savepoint name. + + """ + + raise NotImplementedError() + + def do_release_savepoint(self, connection, name): + """Release the named savepoint on a connection. + + :param connection: a :class:`.Connection`. + :param name: savepoint name. + """ + + raise NotImplementedError() + + def do_begin_twophase(self, connection, xid): + """Begin a two phase transaction on the given connection. + + :param connection: a :class:`.Connection`. + :param xid: xid + + """ + + raise NotImplementedError() + + def do_prepare_twophase(self, connection, xid): + """Prepare a two phase transaction on the given connection. + + :param connection: a :class:`.Connection`. + :param xid: xid + + """ + + raise NotImplementedError() + + def do_rollback_twophase(self, connection, xid, is_prepared=True, + recover=False): + """Rollback a two phase transaction on the given connection. + + :param connection: a :class:`.Connection`. + :param xid: xid + :param is_prepared: whether or not + :meth:`.TwoPhaseTransaction.prepare` was called. + :param recover: if the recover flag was passed. + + """ + + raise NotImplementedError() + + def do_commit_twophase(self, connection, xid, is_prepared=True, + recover=False): + """Commit a two phase transaction on the given connection. + + + :param connection: a :class:`.Connection`. + :param xid: xid + :param is_prepared: whether or not + :meth:`.TwoPhaseTransaction.prepare` was called. + :param recover: if the recover flag was passed. + + """ + + raise NotImplementedError() + + def do_recover_twophase(self, connection): + """Recover list of uncommitted prepared two phase transaction + identifiers on the given connection. + + :param connection: a :class:`.Connection`. + + """ + + raise NotImplementedError() + + def do_executemany(self, cursor, statement, parameters, context=None): + """Provide an implementation of ``cursor.executemany(statement, + parameters)``.""" + + raise NotImplementedError() + + def do_execute(self, cursor, statement, parameters, context=None): + """Provide an implementation of ``cursor.execute(statement, + parameters)``.""" + + raise NotImplementedError() + + def do_execute_no_params(self, cursor, statement, parameters, + context=None): + """Provide an implementation of ``cursor.execute(statement)``. + + The parameter collection should not be sent. + + """ + + raise NotImplementedError() + + def is_disconnect(self, e, connection, cursor): + """Return True if the given DB-API error indicates an invalid + connection""" + + raise NotImplementedError() + + def connect(self): + """return a callable which sets up a newly created DBAPI connection. + + The callable accepts a single argument "conn" which is the + DBAPI connection itself. It has no return value. + + This is used to set dialect-wide per-connection options such as + isolation modes, unicode modes, etc. + + If a callable is returned, it will be assembled into a pool listener + that receives the direct DBAPI connection, with all wrappers removed. + + If None is returned, no listener will be generated. + + """ + return None + + def reset_isolation_level(self, dbapi_conn): + """Given a DBAPI connection, revert its isolation to the default. + + Note that this is a dialect-level method which is used as part + of the implementation of the :class:`.Connection` and + :class:`.Engine` + isolation level facilities; these APIs should be preferred for + most typical use cases. + + .. seealso:: + + :meth:`.Connection.get_isolation_level` - view current level + + :attr:`.Connection.default_isolation_level` - view default level + + :paramref:`.Connection.execution_options.isolation_level` - + set per :class:`.Connection` isolation level + + :paramref:`.create_engine.isolation_level` - + set per :class:`.Engine` isolation level + + """ + + raise NotImplementedError() + + def set_isolation_level(self, dbapi_conn, level): + """Given a DBAPI connection, set its isolation level. + + Note that this is a dialect-level method which is used as part + of the implementation of the :class:`.Connection` and + :class:`.Engine` + isolation level facilities; these APIs should be preferred for + most typical use cases. + + .. seealso:: + + :meth:`.Connection.get_isolation_level` - view current level + + :attr:`.Connection.default_isolation_level` - view default level + + :paramref:`.Connection.execution_options.isolation_level` - + set per :class:`.Connection` isolation level + + :paramref:`.create_engine.isolation_level` - + set per :class:`.Engine` isolation level + + """ + + raise NotImplementedError() + + def get_isolation_level(self, dbapi_conn): + """Given a DBAPI connection, return its isolation level. + + When working with a :class:`.Connection` object, the corresponding + DBAPI connection may be procured using the + :attr:`.Connection.connection` accessor. + + Note that this is a dialect-level method which is used as part + of the implementation of the :class:`.Connection` and + :class:`.Engine` isolation level facilities; + these APIs should be preferred for most typical use cases. + + + .. seealso:: + + :meth:`.Connection.get_isolation_level` - view current level + + :attr:`.Connection.default_isolation_level` - view default level + + :paramref:`.Connection.execution_options.isolation_level` - + set per :class:`.Connection` isolation level + + :paramref:`.create_engine.isolation_level` - + set per :class:`.Engine` isolation level + + + """ + + raise NotImplementedError() + + @classmethod + def get_dialect_cls(cls, url): + """Given a URL, return the :class:`.Dialect` that will be used. + + This is a hook that allows an external plugin to provide functionality + around an existing dialect, by allowing the plugin to be loaded + from the url based on an entrypoint, and then the plugin returns + the actual dialect to be used. + + By default this just returns the cls. + + .. versionadded:: 1.0.3 + + """ + return cls + + @classmethod + def engine_created(cls, engine): + """A convenience hook called before returning the final :class:`.Engine`. + + If the dialect returned a different class from the + :meth:`.get_dialect_cls` + method, then the hook is called on both classes, first on + the dialect class returned by the :meth:`.get_dialect_cls` method and + then on the class on which the method was called. + + The hook should be used by dialects and/or wrappers to apply special + events to the engine or its components. In particular, it allows + a dialect-wrapping class to apply dialect-level events. + + .. versionadded:: 1.0.3 + + """ + pass + + +class CreateEnginePlugin(object): + """A set of hooks intended to augment the construction of an + :class:`.Engine` object based on entrypoint names in a URL. + + The purpose of :class:`.CreateEnginePlugin` is to allow third-party + systems to apply engine, pool and dialect level event listeners without + the need for the target application to be modified; instead, the plugin + names can be added to the database URL. Target applications for + :class:`.CreateEnginePlugin` include: + + * connection and SQL performance tools, e.g. which use events to track + number of checkouts and/or time spent with statements + + * connectivity plugins such as proxies + + Plugins are registered using entry points in a similar way as that + of dialects:: + + entry_points={ + 'sqlalchemy.plugins': [ + 'myplugin = myapp.plugins:MyPlugin' + ] + + A plugin that uses the above names would be invoked from a database + URL as in:: + + from sqlalchemy import create_engine + + engine = create_engine( + "mysql+pymysql://scott:tiger@localhost/test?plugin=myplugin") + + The ``plugin`` argument supports multiple instances, so that a URL + may specify multiple plugins; they are loaded in the order stated + in the URL:: + + engine = create_engine( + "mysql+pymysql://scott:tiger@localhost/" + "test?plugin=plugin_one&plugin=plugin_twp&plugin=plugin_three") + + A plugin can receive additional arguments from the URL string as + well as from the keyword arguments passed to :func:`.create_engine`. + The :class:`.URL` object and the keyword dictionary are passed to the + constructor so that these arguments can be extracted from the url's + :attr:`.URL.query` collection as well as from the dictionary:: + + class MyPlugin(CreateEnginePlugin): + def __init__(self, url, kwargs): + self.my_argument_one = url.query.pop('my_argument_one') + self.my_argument_two = url.query.pop('my_argument_two') + self.my_argument_three = kwargs.pop('my_argument_three', None) + + Arguments like those illustrated above would be consumed from the + following:: + + from sqlalchemy import create_engine + + engine = create_engine( + "mysql+pymysql://scott:tiger@localhost/" + "test?plugin=myplugin&my_argument_one=foo&my_argument_two=bar", + my_argument_three='bat') + + The URL and dictionary are used for subsequent setup of the engine + as they are, so the plugin can modify their arguments in-place. + Arguments that are only understood by the plugin should be popped + or otherwise removed so that they aren't interpreted as erroneous + arguments afterwards. + + When the engine creation process completes and produces the + :class:`.Engine` object, it is again passed to the plugin via the + :meth:`.CreateEnginePlugin.engine_created` hook. In this hook, additional + changes can be made to the engine, most typically involving setup of + events (e.g. those defined in :ref:`core_event_toplevel`). + + .. versionadded:: 1.1 + + """ + def __init__(self, url, kwargs): + """Contruct a new :class:`.CreateEnginePlugin`. + + The plugin object is instantiated individually for each call + to :func:`.create_engine`. A single :class:`.Engine` will be + passed to the :meth:`.CreateEnginePlugin.engine_created` method + corresponding to this URL. + + :param url: the :class:`.URL` object. The plugin should inspect + what it needs here as well as remove its custom arguments from the + :attr:`.URL.query` collection. The URL can be modified in-place + in any other way as well. + :param kwargs: The keyword arguments passed to :func`.create_engine`. + The plugin can read and modify this dictionary in-place, to affect + the ultimate arguments used to create the engine. It should + remove its custom arguments from the dictionary as well. + + """ + self.url = url + + def handle_dialect_kwargs(self, dialect_cls, dialect_args): + """parse and modify dialect kwargs""" + + def handle_pool_kwargs(self, pool_cls, pool_args): + """parse and modify pool kwargs""" + + def engine_created(self, engine): + """Receive the :class:`.Engine` object when it is fully constructed. + + The plugin may make additional changes to the engine, such as + registering engine or connection pool events. + + """ + + +class ExecutionContext(object): + """A messenger object for a Dialect that corresponds to a single + execution. + + ExecutionContext should have these data members: + + connection + Connection object which can be freely used by default value + generators to execute SQL. This Connection should reference the + same underlying connection/transactional resources of + root_connection. + + root_connection + Connection object which is the source of this ExecutionContext. This + Connection may have close_with_result=True set, in which case it can + only be used once. + + dialect + dialect which created this ExecutionContext. + + cursor + DB-API cursor procured from the connection, + + compiled + if passed to constructor, sqlalchemy.engine.base.Compiled object + being executed, + + statement + string version of the statement to be executed. Is either + passed to the constructor, or must be created from the + sql.Compiled object by the time pre_exec() has completed. + + parameters + bind parameters passed to the execute() method. For compiled + statements, this is a dictionary or list of dictionaries. For + textual statements, it should be in a format suitable for the + dialect's paramstyle (i.e. dict or list of dicts for non + positional, list or list of lists/tuples for positional). + + isinsert + True if the statement is an INSERT. + + isupdate + True if the statement is an UPDATE. + + should_autocommit + True if the statement is a "committable" statement. + + prefetch_cols + a list of Column objects for which a client-side default + was fired off. Applies to inserts and updates. + + postfetch_cols + a list of Column objects for which a server-side default or + inline SQL expression value was fired off. Applies to inserts + and updates. + """ + + exception = None + """A DBAPI-level exception that was caught when this ExecutionContext + attempted to execute a statement. + + This attribute is meaningful only within the + :meth:`.ConnectionEvents.dbapi_error` event. + + .. versionadded:: 0.9.7 + + .. seealso:: + + :attr:`.ExecutionContext.is_disconnect` + + :meth:`.ConnectionEvents.dbapi_error` + + """ + + is_disconnect = None + """Boolean flag set to True or False when a DBAPI-level exception + is caught when this ExecutionContext attempted to execute a statement. + + This attribute is meaningful only within the + :meth:`.ConnectionEvents.dbapi_error` event. + + .. versionadded:: 0.9.7 + + .. seealso:: + + :attr:`.ExecutionContext.exception` + + :meth:`.ConnectionEvents.dbapi_error` + + """ + + def create_cursor(self): + """Return a new cursor generated from this ExecutionContext's + connection. + + Some dialects may wish to change the behavior of + connection.cursor(), such as postgresql which may return a PG + "server side" cursor. + """ + + raise NotImplementedError() + + def pre_exec(self): + """Called before an execution of a compiled statement. + + If a compiled statement was passed to this ExecutionContext, + the `statement` and `parameters` datamembers must be + initialized after this statement is complete. + """ + + raise NotImplementedError() + + def post_exec(self): + """Called after the execution of a compiled statement. + + If a compiled statement was passed to this ExecutionContext, + the `last_insert_ids`, `last_inserted_params`, etc. + datamembers should be available after this method completes. + """ + + raise NotImplementedError() + + def result(self): + """Return a result object corresponding to this ExecutionContext. + + Returns a ResultProxy. + """ + + raise NotImplementedError() + + def handle_dbapi_exception(self, e): + """Receive a DBAPI exception which occurred upon execute, result + fetch, etc.""" + + raise NotImplementedError() + + def should_autocommit_text(self, statement): + """Parse the given textual statement and return True if it refers to + a "committable" statement""" + + raise NotImplementedError() + + def lastrow_has_defaults(self): + """Return True if the last INSERT or UPDATE row contained + inlined or database-side defaults. + """ + + raise NotImplementedError() + + def get_rowcount(self): + """Return the DBAPI ``cursor.rowcount`` value, or in some + cases an interpreted value. + + See :attr:`.ResultProxy.rowcount` for details on this. + + """ + + raise NotImplementedError() + + +class Connectable(object): + """Interface for an object which supports execution of SQL constructs. + + The two implementations of :class:`.Connectable` are + :class:`.Connection` and :class:`.Engine`. + + Connectable must also implement the 'dialect' member which references a + :class:`.Dialect` instance. + + """ + + def connect(self, **kwargs): + """Return a :class:`.Connection` object. + + Depending on context, this may be ``self`` if this object + is already an instance of :class:`.Connection`, or a newly + procured :class:`.Connection` if this object is an instance + of :class:`.Engine`. + + """ + + def contextual_connect(self): + """Return a :class:`.Connection` object which may be part of an ongoing + context. + + Depending on context, this may be ``self`` if this object + is already an instance of :class:`.Connection`, or a newly + procured :class:`.Connection` if this object is an instance + of :class:`.Engine`. + + """ + + raise NotImplementedError() + + @util.deprecated("0.7", + "Use the create() method on the given schema " + "object directly, i.e. :meth:`.Table.create`, " + ":meth:`.Index.create`, :meth:`.MetaData.create_all`") + def create(self, entity, **kwargs): + """Emit CREATE statements for the given schema entity. + """ + + raise NotImplementedError() + + @util.deprecated("0.7", + "Use the drop() method on the given schema " + "object directly, i.e. :meth:`.Table.drop`, " + ":meth:`.Index.drop`, :meth:`.MetaData.drop_all`") + def drop(self, entity, **kwargs): + """Emit DROP statements for the given schema entity. + """ + + raise NotImplementedError() + + def execute(self, object, *multiparams, **params): + """Executes the given construct and returns a :class:`.ResultProxy`.""" + raise NotImplementedError() + + def scalar(self, object, *multiparams, **params): + """Executes and returns the first column of the first row. + + The underlying cursor is closed after execution. + """ + raise NotImplementedError() + + def _run_visitor(self, visitorcallable, element, + **kwargs): + raise NotImplementedError() + + def _execute_clauseelement(self, elem, multiparams=None, params=None): + raise NotImplementedError() + + +class ExceptionContext(object): + """Encapsulate information about an error condition in progress. + + This object exists solely to be passed to the + :meth:`.ConnectionEvents.handle_error` event, supporting an interface that + can be extended without backwards-incompatibility. + + .. versionadded:: 0.9.7 + + """ + + connection = None + """The :class:`.Connection` in use during the exception. + + This member is present, except in the case of a failure when + first connecting. + + .. seealso:: + + :attr:`.ExceptionContext.engine` + + + """ + + engine = None + """The :class:`.Engine` in use during the exception. + + This member should always be present, even in the case of a failure + when first connecting. + + .. versionadded:: 1.0.0 + + """ + + cursor = None + """The DBAPI cursor object. + + May be None. + + """ + + statement = None + """String SQL statement that was emitted directly to the DBAPI. + + May be None. + + """ + + parameters = None + """Parameter collection that was emitted directly to the DBAPI. + + May be None. + + """ + + original_exception = None + """The exception object which was caught. + + This member is always present. + + """ + + sqlalchemy_exception = None + """The :class:`sqlalchemy.exc.StatementError` which wraps the original, + and will be raised if exception handling is not circumvented by the event. + + May be None, as not all exception types are wrapped by SQLAlchemy. + For DBAPI-level exceptions that subclass the dbapi's Error class, this + field will always be present. + + """ + + chained_exception = None + """The exception that was returned by the previous handler in the + exception chain, if any. + + If present, this exception will be the one ultimately raised by + SQLAlchemy unless a subsequent handler replaces it. + + May be None. + + """ + + execution_context = None + """The :class:`.ExecutionContext` corresponding to the execution + operation in progress. + + This is present for statement execution operations, but not for + operations such as transaction begin/end. It also is not present when + the exception was raised before the :class:`.ExecutionContext` + could be constructed. + + Note that the :attr:`.ExceptionContext.statement` and + :attr:`.ExceptionContext.parameters` members may represent a + different value than that of the :class:`.ExecutionContext`, + potentially in the case where a + :meth:`.ConnectionEvents.before_cursor_execute` event or similar + modified the statement/parameters to be sent. + + May be None. + + """ + + is_disconnect = None + """Represent whether the exception as occurred represents a "disconnect" + condition. + + This flag will always be True or False within the scope of the + :meth:`.ConnectionEvents.handle_error` handler. + + SQLAlchemy will defer to this flag in order to determine whether or not + the connection should be invalidated subsequently. That is, by + assigning to this flag, a "disconnect" event which then results in + a connection and pool invalidation can be invoked or prevented by + changing this flag. + + """ + + invalidate_pool_on_disconnect = True + """Represent whether all connections in the pool should be invalidated + when a "disconnect" condition is in effect. + + Setting this flag to False within the scope of the + :meth:`.ConnectionEvents.handle_error` event will have the effect such + that the full collection of connections in the pool will not be + invalidated during a disconnect; only the current connection that is the + subject of the error will actually be invalidated. + + The purpose of this flag is for custom disconnect-handling schemes where + the invalidation of other connections in the pool is to be performed + based on other conditions, or even on a per-connection basis. + + .. versionadded:: 1.0.3 + + """ diff --git a/app/lib/sqlalchemy/engine/reflection.py b/app/lib/sqlalchemy/engine/reflection.py new file mode 100644 index 0000000..dfa81f4 --- /dev/null +++ b/app/lib/sqlalchemy/engine/reflection.py @@ -0,0 +1,843 @@ +# engine/reflection.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Provides an abstraction for obtaining database schema information. + +Usage Notes: + +Here are some general conventions when accessing the low level inspector +methods such as get_table_names, get_columns, etc. + +1. Inspector methods return lists of dicts in most cases for the following + reasons: + + * They're both standard types that can be serialized. + * Using a dict instead of a tuple allows easy expansion of attributes. + * Using a list for the outer structure maintains order and is easy to work + with (e.g. list comprehension [d['name'] for d in cols]). + +2. Records that contain a name, such as the column name in a column record + use the key 'name'. So for most return values, each record will have a + 'name' attribute.. +""" + +from .. import exc, sql +from ..sql import schema as sa_schema +from .. import util +from ..sql.type_api import TypeEngine +from ..util import deprecated +from ..util import topological +from .. import inspection +from .base import Connectable + + +@util.decorator +def cache(fn, self, con, *args, **kw): + info_cache = kw.get('info_cache', None) + if info_cache is None: + return fn(self, con, *args, **kw) + key = ( + fn.__name__, + tuple(a for a in args if isinstance(a, util.string_types)), + tuple((k, v) for k, v in kw.items() if + isinstance(v, + util.string_types + util.int_types + (float, ) + ) + ) + ) + ret = info_cache.get(key) + if ret is None: + ret = fn(self, con, *args, **kw) + info_cache[key] = ret + return ret + + +class Inspector(object): + """Performs database schema inspection. + + The Inspector acts as a proxy to the reflection methods of the + :class:`~sqlalchemy.engine.interfaces.Dialect`, providing a + consistent interface as well as caching support for previously + fetched metadata. + + A :class:`.Inspector` object is usually created via the + :func:`.inspect` function:: + + from sqlalchemy import inspect, create_engine + engine = create_engine('...') + insp = inspect(engine) + + The inspection method above is equivalent to using the + :meth:`.Inspector.from_engine` method, i.e.:: + + engine = create_engine('...') + insp = Inspector.from_engine(engine) + + Where above, the :class:`~sqlalchemy.engine.interfaces.Dialect` may opt + to return an :class:`.Inspector` subclass that provides additional + methods specific to the dialect's target database. + + """ + + def __init__(self, bind): + """Initialize a new :class:`.Inspector`. + + :param bind: a :class:`~sqlalchemy.engine.Connectable`, + which is typically an instance of + :class:`~sqlalchemy.engine.Engine` or + :class:`~sqlalchemy.engine.Connection`. + + For a dialect-specific instance of :class:`.Inspector`, see + :meth:`.Inspector.from_engine` + + """ + # this might not be a connection, it could be an engine. + self.bind = bind + + # set the engine + if hasattr(bind, 'engine'): + self.engine = bind.engine + else: + self.engine = bind + + if self.engine is bind: + # if engine, ensure initialized + bind.connect().close() + + self.dialect = self.engine.dialect + self.info_cache = {} + + @classmethod + def from_engine(cls, bind): + """Construct a new dialect-specific Inspector object from the given + engine or connection. + + :param bind: a :class:`~sqlalchemy.engine.Connectable`, + which is typically an instance of + :class:`~sqlalchemy.engine.Engine` or + :class:`~sqlalchemy.engine.Connection`. + + This method differs from direct a direct constructor call of + :class:`.Inspector` in that the + :class:`~sqlalchemy.engine.interfaces.Dialect` is given a chance to + provide a dialect-specific :class:`.Inspector` instance, which may + provide additional methods. + + See the example at :class:`.Inspector`. + + """ + if hasattr(bind.dialect, 'inspector'): + return bind.dialect.inspector(bind) + return Inspector(bind) + + @inspection._inspects(Connectable) + def _insp(bind): + return Inspector.from_engine(bind) + + @property + def default_schema_name(self): + """Return the default schema name presented by the dialect + for the current engine's database user. + + E.g. this is typically ``public`` for PostgreSQL and ``dbo`` + for SQL Server. + + """ + return self.dialect.default_schema_name + + def get_schema_names(self): + """Return all schema names. + """ + + if hasattr(self.dialect, 'get_schema_names'): + return self.dialect.get_schema_names(self.bind, + info_cache=self.info_cache) + return [] + + def get_table_names(self, schema=None, order_by=None): + """Return all table names in referred to within a particular schema. + + The names are expected to be real tables only, not views. + Views are instead returned using the :meth:`.Inspector.get_view_names` + method. + + + :param schema: Schema name. If ``schema`` is left at ``None``, the + database's default schema is + used, else the named schema is searched. If the database does not + support named schemas, behavior is undefined if ``schema`` is not + passed as ``None``. For special quoting, use :class:`.quoted_name`. + + :param order_by: Optional, may be the string "foreign_key" to sort + the result on foreign key dependencies. Does not automatically + resolve cycles, and will raise :class:`.CircularDependencyError` + if cycles exist. + + .. deprecated:: 1.0.0 - see + :meth:`.Inspector.get_sorted_table_and_fkc_names` for a version + of this which resolves foreign key cycles between tables + automatically. + + .. versionchanged:: 0.8 the "foreign_key" sorting sorts tables + in order of dependee to dependent; that is, in creation + order, rather than in drop order. This is to maintain + consistency with similar features such as + :attr:`.MetaData.sorted_tables` and :func:`.util.sort_tables`. + + .. seealso:: + + :meth:`.Inspector.get_sorted_table_and_fkc_names` + + :attr:`.MetaData.sorted_tables` + + """ + + if hasattr(self.dialect, 'get_table_names'): + tnames = self.dialect.get_table_names( + self.bind, schema, info_cache=self.info_cache) + else: + tnames = self.engine.table_names(schema) + if order_by == 'foreign_key': + tuples = [] + for tname in tnames: + for fkey in self.get_foreign_keys(tname, schema): + if tname != fkey['referred_table']: + tuples.append((fkey['referred_table'], tname)) + tnames = list(topological.sort(tuples, tnames)) + return tnames + + def get_sorted_table_and_fkc_names(self, schema=None): + """Return dependency-sorted table and foreign key constraint names in + referred to within a particular schema. + + This will yield 2-tuples of + ``(tablename, [(tname, fkname), (tname, fkname), ...])`` + consisting of table names in CREATE order grouped with the foreign key + constraint names that are not detected as belonging to a cycle. + The final element + will be ``(None, [(tname, fkname), (tname, fkname), ..])`` + which will consist of remaining + foreign key constraint names that would require a separate CREATE + step after-the-fact, based on dependencies between tables. + + .. versionadded:: 1.0.- + + .. seealso:: + + :meth:`.Inspector.get_table_names` + + :func:`.sort_tables_and_constraints` - similar method which works + with an already-given :class:`.MetaData`. + + """ + if hasattr(self.dialect, 'get_table_names'): + tnames = self.dialect.get_table_names( + self.bind, schema, info_cache=self.info_cache) + else: + tnames = self.engine.table_names(schema) + + tuples = set() + remaining_fkcs = set() + + fknames_for_table = {} + for tname in tnames: + fkeys = self.get_foreign_keys(tname, schema) + fknames_for_table[tname] = set( + [fk['name'] for fk in fkeys] + ) + for fkey in fkeys: + if tname != fkey['referred_table']: + tuples.add((fkey['referred_table'], tname)) + try: + candidate_sort = list(topological.sort(tuples, tnames)) + except exc.CircularDependencyError as err: + for edge in err.edges: + tuples.remove(edge) + remaining_fkcs.update( + (edge[1], fkc) + for fkc in fknames_for_table[edge[1]] + ) + + candidate_sort = list(topological.sort(tuples, tnames)) + return [ + (tname, fknames_for_table[tname].difference(remaining_fkcs)) + for tname in candidate_sort + ] + [(None, list(remaining_fkcs))] + + def get_temp_table_names(self): + """return a list of temporary table names for the current bind. + + This method is unsupported by most dialects; currently + only SQLite implements it. + + .. versionadded:: 1.0.0 + + """ + return self.dialect.get_temp_table_names( + self.bind, info_cache=self.info_cache) + + def get_temp_view_names(self): + """return a list of temporary view names for the current bind. + + This method is unsupported by most dialects; currently + only SQLite implements it. + + .. versionadded:: 1.0.0 + + """ + return self.dialect.get_temp_view_names( + self.bind, info_cache=self.info_cache) + + def get_table_options(self, table_name, schema=None, **kw): + """Return a dictionary of options specified when the table of the + given name was created. + + This currently includes some options that apply to MySQL tables. + + :param table_name: string name of the table. For special quoting, + use :class:`.quoted_name`. + + :param schema: string schema name; if omitted, uses the default schema + of the database connection. For special quoting, + use :class:`.quoted_name`. + + """ + if hasattr(self.dialect, 'get_table_options'): + return self.dialect.get_table_options( + self.bind, table_name, schema, + info_cache=self.info_cache, **kw) + return {} + + def get_view_names(self, schema=None): + """Return all view names in `schema`. + + :param schema: Optional, retrieve names from a non-default schema. + For special quoting, use :class:`.quoted_name`. + + """ + + return self.dialect.get_view_names(self.bind, schema, + info_cache=self.info_cache) + + def get_view_definition(self, view_name, schema=None): + """Return definition for `view_name`. + + :param schema: Optional, retrieve names from a non-default schema. + For special quoting, use :class:`.quoted_name`. + + """ + + return self.dialect.get_view_definition( + self.bind, view_name, schema, info_cache=self.info_cache) + + def get_columns(self, table_name, schema=None, **kw): + """Return information about columns in `table_name`. + + Given a string `table_name` and an optional string `schema`, return + column information as a list of dicts with these keys: + + * ``name`` - the column's name + + * ``type`` - the type of this column; an instance of + :class:`~sqlalchemy.types.TypeEngine` + + * ``nullable`` - boolean flag if the column is NULL or NOT NULL + + * ``default`` - the column's server default value - this is returned + as a string SQL expression. + + * ``attrs`` - dict containing optional column attributes + + :param table_name: string name of the table. For special quoting, + use :class:`.quoted_name`. + + :param schema: string schema name; if omitted, uses the default schema + of the database connection. For special quoting, + use :class:`.quoted_name`. + + :return: list of dictionaries, each representing the definition of + a database column. + + """ + + col_defs = self.dialect.get_columns(self.bind, table_name, schema, + info_cache=self.info_cache, + **kw) + for col_def in col_defs: + # make this easy and only return instances for coltype + coltype = col_def['type'] + if not isinstance(coltype, TypeEngine): + col_def['type'] = coltype() + return col_defs + + @deprecated('0.7', 'Call to deprecated method get_primary_keys.' + ' Use get_pk_constraint instead.') + def get_primary_keys(self, table_name, schema=None, **kw): + """Return information about primary keys in `table_name`. + + Given a string `table_name`, and an optional string `schema`, return + primary key information as a list of column names. + """ + + return self.dialect.get_pk_constraint(self.bind, table_name, schema, + info_cache=self.info_cache, + **kw)['constrained_columns'] + + def get_pk_constraint(self, table_name, schema=None, **kw): + """Return information about primary key constraint on `table_name`. + + Given a string `table_name`, and an optional string `schema`, return + primary key information as a dictionary with these keys: + + constrained_columns + a list of column names that make up the primary key + + name + optional name of the primary key constraint. + + :param table_name: string name of the table. For special quoting, + use :class:`.quoted_name`. + + :param schema: string schema name; if omitted, uses the default schema + of the database connection. For special quoting, + use :class:`.quoted_name`. + + """ + return self.dialect.get_pk_constraint(self.bind, table_name, schema, + info_cache=self.info_cache, + **kw) + + def get_foreign_keys(self, table_name, schema=None, **kw): + """Return information about foreign_keys in `table_name`. + + Given a string `table_name`, and an optional string `schema`, return + foreign key information as a list of dicts with these keys: + + constrained_columns + a list of column names that make up the foreign key + + referred_schema + the name of the referred schema + + referred_table + the name of the referred table + + referred_columns + a list of column names in the referred table that correspond to + constrained_columns + + name + optional name of the foreign key constraint. + + :param table_name: string name of the table. For special quoting, + use :class:`.quoted_name`. + + :param schema: string schema name; if omitted, uses the default schema + of the database connection. For special quoting, + use :class:`.quoted_name`. + + """ + + return self.dialect.get_foreign_keys(self.bind, table_name, schema, + info_cache=self.info_cache, + **kw) + + def get_indexes(self, table_name, schema=None, **kw): + """Return information about indexes in `table_name`. + + Given a string `table_name` and an optional string `schema`, return + index information as a list of dicts with these keys: + + name + the index's name + + column_names + list of column names in order + + unique + boolean + + dialect_options + dict of dialect-specific index options. May not be present + for all dialects. + + .. versionadded:: 1.0.0 + + :param table_name: string name of the table. For special quoting, + use :class:`.quoted_name`. + + :param schema: string schema name; if omitted, uses the default schema + of the database connection. For special quoting, + use :class:`.quoted_name`. + + """ + + return self.dialect.get_indexes(self.bind, table_name, + schema, + info_cache=self.info_cache, **kw) + + def get_unique_constraints(self, table_name, schema=None, **kw): + """Return information about unique constraints in `table_name`. + + Given a string `table_name` and an optional string `schema`, return + unique constraint information as a list of dicts with these keys: + + name + the unique constraint's name + + column_names + list of column names in order + + :param table_name: string name of the table. For special quoting, + use :class:`.quoted_name`. + + :param schema: string schema name; if omitted, uses the default schema + of the database connection. For special quoting, + use :class:`.quoted_name`. + + .. versionadded:: 0.8.4 + + """ + + return self.dialect.get_unique_constraints( + self.bind, table_name, schema, info_cache=self.info_cache, **kw) + + def get_check_constraints(self, table_name, schema=None, **kw): + """Return information about check constraints in `table_name`. + + Given a string `table_name` and an optional string `schema`, return + check constraint information as a list of dicts with these keys: + + name + the check constraint's name + + sqltext + the check constraint's SQL expression + + :param table_name: string name of the table. For special quoting, + use :class:`.quoted_name`. + + :param schema: string schema name; if omitted, uses the default schema + of the database connection. For special quoting, + use :class:`.quoted_name`. + + .. versionadded:: 1.1.0 + + """ + + return self.dialect.get_check_constraints( + self.bind, table_name, schema, info_cache=self.info_cache, **kw) + + def reflecttable(self, table, include_columns, exclude_columns=(), + _extend_on=None): + """Given a Table object, load its internal constructs based on + introspection. + + This is the underlying method used by most dialects to produce + table reflection. Direct usage is like:: + + from sqlalchemy import create_engine, MetaData, Table + from sqlalchemy.engine import reflection + + engine = create_engine('...') + meta = MetaData() + user_table = Table('user', meta) + insp = Inspector.from_engine(engine) + insp.reflecttable(user_table, None) + + :param table: a :class:`~sqlalchemy.schema.Table` instance. + :param include_columns: a list of string column names to include + in the reflection process. If ``None``, all columns are reflected. + + """ + + if _extend_on is not None: + if table in _extend_on: + return + else: + _extend_on.add(table) + + dialect = self.bind.dialect + + schema = self.bind.schema_for_object(table) + + table_name = table.name + + # get table-level arguments that are specifically + # intended for reflection, e.g. oracle_resolve_synonyms. + # these are unconditionally passed to related Table + # objects + reflection_options = dict( + (k, table.dialect_kwargs.get(k)) + for k in dialect.reflection_options + if k in table.dialect_kwargs + ) + + # reflect table options, like mysql_engine + tbl_opts = self.get_table_options( + table_name, schema, **table.dialect_kwargs) + if tbl_opts: + # add additional kwargs to the Table if the dialect + # returned them + table._validate_dialect_kwargs(tbl_opts) + + if util.py2k: + if isinstance(schema, str): + schema = schema.decode(dialect.encoding) + if isinstance(table_name, str): + table_name = table_name.decode(dialect.encoding) + + found_table = False + cols_by_orig_name = {} + + for col_d in self.get_columns( + table_name, schema, **table.dialect_kwargs): + found_table = True + + self._reflect_column( + table, col_d, include_columns, + exclude_columns, cols_by_orig_name) + + if not found_table: + raise exc.NoSuchTableError(table.name) + + self._reflect_pk( + table_name, schema, table, cols_by_orig_name, exclude_columns) + + self._reflect_fk( + table_name, schema, table, cols_by_orig_name, + exclude_columns, _extend_on, reflection_options) + + self._reflect_indexes( + table_name, schema, table, cols_by_orig_name, + include_columns, exclude_columns, reflection_options) + + self._reflect_unique_constraints( + table_name, schema, table, cols_by_orig_name, + include_columns, exclude_columns, reflection_options) + + self._reflect_check_constraints( + table_name, schema, table, cols_by_orig_name, + include_columns, exclude_columns, reflection_options) + + def _reflect_column( + self, table, col_d, include_columns, + exclude_columns, cols_by_orig_name): + + orig_name = col_d['name'] + + table.dispatch.column_reflect(self, table, col_d) + + # fetch name again as column_reflect is allowed to + # change it + name = col_d['name'] + if (include_columns and name not in include_columns) \ + or (exclude_columns and name in exclude_columns): + return + + coltype = col_d['type'] + + col_kw = dict( + (k, col_d[k]) + for k in ['nullable', 'autoincrement', 'quote', 'info', 'key'] + if k in col_d + ) + + colargs = [] + if col_d.get('default') is not None: + default = col_d['default'] + if isinstance(default, sql.elements.TextClause): + default = sa_schema.DefaultClause(default, _reflected=True) + elif not isinstance(default, sa_schema.FetchedValue): + default = sa_schema.DefaultClause( + sql.text(col_d['default']), _reflected=True) + + colargs.append(default) + + if 'sequence' in col_d: + self._reflect_col_sequence(col_d, colargs) + + cols_by_orig_name[orig_name] = col = \ + sa_schema.Column(name, coltype, *colargs, **col_kw) + + if col.key in table.primary_key: + col.primary_key = True + table.append_column(col) + + def _reflect_col_sequence(self, col_d, colargs): + if 'sequence' in col_d: + # TODO: mssql and sybase are using this. + seq = col_d['sequence'] + sequence = sa_schema.Sequence(seq['name'], 1, 1) + if 'start' in seq: + sequence.start = seq['start'] + if 'increment' in seq: + sequence.increment = seq['increment'] + colargs.append(sequence) + + def _reflect_pk( + self, table_name, schema, table, + cols_by_orig_name, exclude_columns): + pk_cons = self.get_pk_constraint( + table_name, schema, **table.dialect_kwargs) + if pk_cons: + pk_cols = [ + cols_by_orig_name[pk] + for pk in pk_cons['constrained_columns'] + if pk in cols_by_orig_name and pk not in exclude_columns + ] + + # update pk constraint name + table.primary_key.name = pk_cons.get('name') + + # tell the PKConstraint to re-initialize + # its column collection + table.primary_key._reload(pk_cols) + + def _reflect_fk( + self, table_name, schema, table, cols_by_orig_name, + exclude_columns, _extend_on, reflection_options): + fkeys = self.get_foreign_keys( + table_name, schema, **table.dialect_kwargs) + for fkey_d in fkeys: + conname = fkey_d['name'] + # look for columns by orig name in cols_by_orig_name, + # but support columns that are in-Python only as fallback + constrained_columns = [ + cols_by_orig_name[c].key + if c in cols_by_orig_name else c + for c in fkey_d['constrained_columns'] + ] + if exclude_columns and set(constrained_columns).intersection( + exclude_columns): + continue + referred_schema = fkey_d['referred_schema'] + referred_table = fkey_d['referred_table'] + referred_columns = fkey_d['referred_columns'] + refspec = [] + if referred_schema is not None: + sa_schema.Table(referred_table, table.metadata, + autoload=True, schema=referred_schema, + autoload_with=self.bind, + _extend_on=_extend_on, + **reflection_options + ) + for column in referred_columns: + refspec.append(".".join( + [referred_schema, referred_table, column])) + else: + sa_schema.Table(referred_table, table.metadata, autoload=True, + autoload_with=self.bind, + schema=sa_schema.BLANK_SCHEMA, + _extend_on=_extend_on, + **reflection_options + ) + for column in referred_columns: + refspec.append(".".join([referred_table, column])) + if 'options' in fkey_d: + options = fkey_d['options'] + else: + options = {} + table.append_constraint( + sa_schema.ForeignKeyConstraint(constrained_columns, refspec, + conname, link_to_name=True, + **options)) + + def _reflect_indexes( + self, table_name, schema, table, cols_by_orig_name, + include_columns, exclude_columns, reflection_options): + # Indexes + indexes = self.get_indexes(table_name, schema) + for index_d in indexes: + name = index_d['name'] + columns = index_d['column_names'] + unique = index_d['unique'] + flavor = index_d.get('type', 'index') + dialect_options = index_d.get('dialect_options', {}) + + duplicates = index_d.get('duplicates_constraint') + if include_columns and \ + not set(columns).issubset(include_columns): + util.warn( + "Omitting %s key for (%s), key covers omitted columns." % + (flavor, ', '.join(columns))) + continue + if duplicates: + continue + # look for columns by orig name in cols_by_orig_name, + # but support columns that are in-Python only as fallback + idx_cols = [] + for c in columns: + try: + idx_col = cols_by_orig_name[c] \ + if c in cols_by_orig_name else table.c[c] + except KeyError: + util.warn( + "%s key '%s' was not located in " + "columns for table '%s'" % ( + flavor, c, table_name + )) + else: + idx_cols.append(idx_col) + + sa_schema.Index( + name, *idx_cols, + **dict(list(dialect_options.items()) + [('unique', unique)]) + ) + + def _reflect_unique_constraints( + self, table_name, schema, table, cols_by_orig_name, + include_columns, exclude_columns, reflection_options): + + # Unique Constraints + try: + constraints = self.get_unique_constraints(table_name, schema) + except NotImplementedError: + # optional dialect feature + return + + for const_d in constraints: + conname = const_d['name'] + columns = const_d['column_names'] + duplicates = const_d.get('duplicates_index') + if include_columns and \ + not set(columns).issubset(include_columns): + util.warn( + "Omitting unique constraint key for (%s), " + "key covers omitted columns." % + ', '.join(columns)) + continue + if duplicates: + continue + # look for columns by orig name in cols_by_orig_name, + # but support columns that are in-Python only as fallback + constrained_cols = [] + for c in columns: + try: + constrained_col = cols_by_orig_name[c] \ + if c in cols_by_orig_name else table.c[c] + except KeyError: + util.warn( + "unique constraint key '%s' was not located in " + "columns for table '%s'" % (c, table_name)) + else: + constrained_cols.append(constrained_col) + table.append_constraint( + sa_schema.UniqueConstraint(*constrained_cols, name=conname)) + + def _reflect_check_constraints( + self, table_name, schema, table, cols_by_orig_name, + include_columns, exclude_columns, reflection_options): + try: + constraints = self.get_check_constraints(table_name, schema) + except NotImplementedError: + # optional dialect feature + return + + for const_d in constraints: + table.append_constraint( + sa_schema.CheckConstraint(**const_d)) diff --git a/app/lib/sqlalchemy/engine/result.py b/app/lib/sqlalchemy/engine/result.py new file mode 100644 index 0000000..907dc7b --- /dev/null +++ b/app/lib/sqlalchemy/engine/result.py @@ -0,0 +1,1435 @@ +# engine/result.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Define result set constructs including :class:`.ResultProxy` +and :class:`.RowProxy.""" + + +from .. import exc, util +from ..sql import expression, sqltypes, util as sql_util +import collections +import operator + +# This reconstructor is necessary so that pickles with the C extension or +# without use the same Binary format. +try: + # We need a different reconstructor on the C extension so that we can + # add extra checks that fields have correctly been initialized by + # __setstate__. + from sqlalchemy.cresultproxy import safe_rowproxy_reconstructor + + # The extra function embedding is needed so that the + # reconstructor function has the same signature whether or not + # the extension is present. + def rowproxy_reconstructor(cls, state): + return safe_rowproxy_reconstructor(cls, state) +except ImportError: + def rowproxy_reconstructor(cls, state): + obj = cls.__new__(cls) + obj.__setstate__(state) + return obj + +try: + from sqlalchemy.cresultproxy import BaseRowProxy + _baserowproxy_usecext = True +except ImportError: + _baserowproxy_usecext = False + + class BaseRowProxy(object): + __slots__ = ('_parent', '_row', '_processors', '_keymap') + + def __init__(self, parent, row, processors, keymap): + """RowProxy objects are constructed by ResultProxy objects.""" + + self._parent = parent + self._row = row + self._processors = processors + self._keymap = keymap + + def __reduce__(self): + return (rowproxy_reconstructor, + (self.__class__, self.__getstate__())) + + def values(self): + """Return the values represented by this RowProxy as a list.""" + return list(self) + + def __iter__(self): + for processor, value in zip(self._processors, self._row): + if processor is None: + yield value + else: + yield processor(value) + + def __len__(self): + return len(self._row) + + def __getitem__(self, key): + try: + processor, obj, index = self._keymap[key] + except KeyError: + processor, obj, index = self._parent._key_fallback(key) + except TypeError: + if isinstance(key, slice): + l = [] + for processor, value in zip(self._processors[key], + self._row[key]): + if processor is None: + l.append(value) + else: + l.append(processor(value)) + return tuple(l) + else: + raise + if index is None: + raise exc.InvalidRequestError( + "Ambiguous column name '%s' in " + "result set column descriptions" % obj) + if processor is not None: + return processor(self._row[index]) + else: + return self._row[index] + + def __getattr__(self, name): + try: + return self[name] + except KeyError as e: + raise AttributeError(e.args[0]) + + +class RowProxy(BaseRowProxy): + """Proxy values from a single cursor row. + + Mostly follows "ordered dictionary" behavior, mapping result + values to the string-based column name, the integer position of + the result in the row, as well as Column instances which can be + mapped to the original Columns that produced this result set (for + results that correspond to constructed SQL expressions). + """ + __slots__ = () + + def __contains__(self, key): + return self._parent._has_key(key) + + def __getstate__(self): + return { + '_parent': self._parent, + '_row': tuple(self) + } + + def __setstate__(self, state): + self._parent = parent = state['_parent'] + self._row = state['_row'] + self._processors = parent._processors + self._keymap = parent._keymap + + __hash__ = None + + def _op(self, other, op): + return op(tuple(self), tuple(other)) \ + if isinstance(other, RowProxy) \ + else op(tuple(self), other) + + def __lt__(self, other): + return self._op(other, operator.lt) + + def __le__(self, other): + return self._op(other, operator.le) + + def __ge__(self, other): + return self._op(other, operator.ge) + + def __gt__(self, other): + return self._op(other, operator.gt) + + def __eq__(self, other): + return self._op(other, operator.eq) + + def __ne__(self, other): + return self._op(other, operator.ne) + + def __repr__(self): + return repr(sql_util._repr_row(self)) + + def has_key(self, key): + """Return True if this RowProxy contains the given key.""" + + return self._parent._has_key(key) + + def items(self): + """Return a list of tuples, each tuple containing a key/value pair.""" + # TODO: no coverage here + return [(key, self[key]) for key in self.keys()] + + def keys(self): + """Return the list of keys as strings represented by this RowProxy.""" + + return self._parent.keys + + def iterkeys(self): + return iter(self._parent.keys) + + def itervalues(self): + return iter(self) + +try: + # Register RowProxy with Sequence, + # so sequence protocol is implemented + from collections import Sequence + Sequence.register(RowProxy) +except ImportError: + pass + + +class ResultMetaData(object): + """Handle cursor.description, applying additional info from an execution + context.""" + + __slots__ = ( + '_keymap', 'case_sensitive', 'matched_on_name', + '_processors', 'keys', '_orig_processors') + + def __init__(self, parent, cursor_description): + context = parent.context + dialect = context.dialect + self.case_sensitive = dialect.case_sensitive + self.matched_on_name = False + self._orig_processors = None + + if context.result_column_struct: + result_columns, cols_are_ordered, textual_ordered = \ + context.result_column_struct + num_ctx_cols = len(result_columns) + else: + result_columns = cols_are_ordered = \ + num_ctx_cols = textual_ordered = False + + # merge cursor.description with the column info + # present in the compiled structure, if any + raw = self._merge_cursor_description( + context, cursor_description, result_columns, + num_ctx_cols, cols_are_ordered, textual_ordered) + + self._keymap = {} + if not _baserowproxy_usecext: + # keymap indexes by integer index: this is only used + # in the pure Python BaseRowProxy.__getitem__ + # implementation to avoid an expensive + # isinstance(key, util.int_types) in the most common + # case path + + len_raw = len(raw) + + self._keymap.update([ + (elem[0], (elem[3], elem[4], elem[0])) + for elem in raw + ] + [ + (elem[0] - len_raw, (elem[3], elem[4], elem[0])) + for elem in raw + ]) + + # processors in key order for certain per-row + # views like __iter__ and slices + self._processors = [elem[3] for elem in raw] + + # keymap by primary string... + by_key = dict([ + (elem[2], (elem[3], elem[4], elem[0])) + for elem in raw + ]) + + # for compiled SQL constructs, copy additional lookup keys into + # the key lookup map, such as Column objects, labels, + # column keys and other names + if num_ctx_cols: + + # if by-primary-string dictionary smaller (or bigger?!) than + # number of columns, assume we have dupes, rewrite + # dupe records with "None" for index which results in + # ambiguous column exception when accessed. + if len(by_key) != num_ctx_cols: + seen = set() + for rec in raw: + key = rec[1] + if key in seen: + # this is an "ambiguous" element, replacing + # the full record in the map + key = key.lower() if not self.case_sensitive else key + by_key[key] = (None, key, None) + seen.add(key) + + # copy secondary elements from compiled columns + # into self._keymap, write in the potentially "ambiguous" + # element + self._keymap.update([ + (obj_elem, by_key[elem[2]]) + for elem in raw if elem[4] + for obj_elem in elem[4] + ]) + + # if we did a pure positional match, then reset the + # original "expression element" back to the "unambiguous" + # entry. This is a new behavior in 1.1 which impacts + # TextAsFrom but also straight compiled SQL constructs. + if not self.matched_on_name: + self._keymap.update([ + (elem[4][0], (elem[3], elem[4], elem[0])) + for elem in raw if elem[4] + ]) + else: + # no dupes - copy secondary elements from compiled + # columns into self._keymap + self._keymap.update([ + (obj_elem, (elem[3], elem[4], elem[0])) + for elem in raw if elem[4] + for obj_elem in elem[4] + ]) + + # update keymap with primary string names taking + # precedence + self._keymap.update(by_key) + + # update keymap with "translated" names (sqlite-only thing) + if not num_ctx_cols and context._translate_colname: + self._keymap.update([ + (elem[5], self._keymap[elem[2]]) + for elem in raw if elem[5] + ]) + + def _merge_cursor_description( + self, context, cursor_description, result_columns, + num_ctx_cols, cols_are_ordered, textual_ordered): + """Merge a cursor.description with compiled result column information. + + There are at least four separate strategies used here, selected + depending on the type of SQL construct used to start with. + + The most common case is that of the compiled SQL expression construct, + which generated the column names present in the raw SQL string and + which has the identical number of columns as were reported by + cursor.description. In this case, we assume a 1-1 positional mapping + between the entries in cursor.description and the compiled object. + This is also the most performant case as we disregard extracting / + decoding the column names present in cursor.description since we + already have the desired name we generated in the compiled SQL + construct. + + The next common case is that of the completely raw string SQL, + such as passed to connection.execute(). In this case we have no + compiled construct to work with, so we extract and decode the + names from cursor.description and index those as the primary + result row target keys. + + The remaining fairly common case is that of the textual SQL + that includes at least partial column information; this is when + we use a :class:`.TextAsFrom` construct. This contruct may have + unordered or ordered column information. In the ordered case, we + merge the cursor.description and the compiled construct's information + positionally, and warn if there are additional description names + present, however we still decode the names in cursor.description + as we don't have a guarantee that the names in the columns match + on these. In the unordered case, we match names in cursor.description + to that of the compiled construct based on name matching. + In both of these cases, the cursor.description names and the column + expression objects and names are indexed as result row target keys. + + The final case is much less common, where we have a compiled + non-textual SQL expression construct, but the number of columns + in cursor.description doesn't match what's in the compiled + construct. We make the guess here that there might be textual + column expressions in the compiled construct that themselves include + a comma in them causing them to split. We do the same name-matching + as with textual non-ordered columns. + + The name-matched system of merging is the same as that used by + SQLAlchemy for all cases up through te 0.9 series. Positional + matching for compiled SQL expressions was introduced in 1.0 as a + major performance feature, and positional matching for textual + :class:`.TextAsFrom` objects in 1.1. As name matching is no longer + a common case, it was acceptable to factor it into smaller generator- + oriented methods that are easier to understand, but incur slightly + more performance overhead. + + """ + + case_sensitive = context.dialect.case_sensitive + + if num_ctx_cols and \ + cols_are_ordered and \ + not textual_ordered and \ + num_ctx_cols == len(cursor_description): + self.keys = [elem[0] for elem in result_columns] + # pure positional 1-1 case; doesn't need to read + # the names from cursor.description + return [ + ( + idx, + key, + name.lower() if not case_sensitive else name, + context.get_result_processor( + type_, key, cursor_description[idx][1] + ), + obj, + None + ) for idx, (key, name, obj, type_) + in enumerate(result_columns) + ] + else: + # name-based or text-positional cases, where we need + # to read cursor.description names + if textual_ordered: + # textual positional case + raw_iterator = self._merge_textual_cols_by_position( + context, cursor_description, result_columns) + elif num_ctx_cols: + # compiled SQL with a mismatch of description cols + # vs. compiled cols, or textual w/ unordered columns + raw_iterator = self._merge_cols_by_name( + context, cursor_description, result_columns) + else: + # no compiled SQL, just a raw string + raw_iterator = self._merge_cols_by_none( + context, cursor_description) + + return [ + ( + idx, colname, colname, + context.get_result_processor( + mapped_type, colname, coltype), + obj, untranslated) + + for idx, colname, mapped_type, coltype, obj, untranslated + in raw_iterator + ] + + def _colnames_from_description(self, context, cursor_description): + """Extract column names and data types from a cursor.description. + + Applies unicode decoding, column translation, "normalization", + and case sensitivity rules to the names based on the dialect. + + """ + + dialect = context.dialect + case_sensitive = dialect.case_sensitive + translate_colname = context._translate_colname + description_decoder = dialect._description_decoder \ + if dialect.description_encoding else None + normalize_name = dialect.normalize_name \ + if dialect.requires_name_normalize else None + untranslated = None + + self.keys = [] + + for idx, rec in enumerate(cursor_description): + colname = rec[0] + coltype = rec[1] + + if description_decoder: + colname = description_decoder(colname) + + if translate_colname: + colname, untranslated = translate_colname(colname) + + if normalize_name: + colname = normalize_name(colname) + + self.keys.append(colname) + if not case_sensitive: + colname = colname.lower() + + yield idx, colname, untranslated, coltype + + def _merge_textual_cols_by_position( + self, context, cursor_description, result_columns): + dialect = context.dialect + typemap = dialect.dbapi_type_map + num_ctx_cols = len(result_columns) if result_columns else None + + if num_ctx_cols > len(cursor_description): + util.warn( + "Number of columns in textual SQL (%d) is " + "smaller than number of columns requested (%d)" % ( + num_ctx_cols, len(cursor_description) + )) + + seen = set() + for idx, colname, untranslated, coltype in \ + self._colnames_from_description(context, cursor_description): + if idx < num_ctx_cols: + ctx_rec = result_columns[idx] + obj = ctx_rec[2] + mapped_type = ctx_rec[3] + if obj[0] in seen: + raise exc.InvalidRequestError( + "Duplicate column expression requested " + "in textual SQL: %r" % obj[0]) + seen.add(obj[0]) + else: + mapped_type = typemap.get(coltype, sqltypes.NULLTYPE) + obj = None + + yield idx, colname, mapped_type, coltype, obj, untranslated + + def _merge_cols_by_name(self, context, cursor_description, result_columns): + dialect = context.dialect + typemap = dialect.dbapi_type_map + case_sensitive = dialect.case_sensitive + result_map = self._create_result_map(result_columns, case_sensitive) + + self.matched_on_name = True + for idx, colname, untranslated, coltype in \ + self._colnames_from_description(context, cursor_description): + try: + ctx_rec = result_map[colname] + except KeyError: + mapped_type = typemap.get(coltype, sqltypes.NULLTYPE) + obj = None + else: + obj = ctx_rec[1] + mapped_type = ctx_rec[2] + yield idx, colname, mapped_type, coltype, obj, untranslated + + def _merge_cols_by_none(self, context, cursor_description): + dialect = context.dialect + typemap = dialect.dbapi_type_map + for idx, colname, untranslated, coltype in \ + self._colnames_from_description(context, cursor_description): + mapped_type = typemap.get(coltype, sqltypes.NULLTYPE) + yield idx, colname, mapped_type, coltype, None, untranslated + + @classmethod + def _create_result_map(cls, result_columns, case_sensitive=True): + d = {} + for elem in result_columns: + key, rec = elem[0], elem[1:] + if not case_sensitive: + key = key.lower() + if key in d: + # conflicting keyname, just double up the list + # of objects. this will cause an "ambiguous name" + # error if an attempt is made by the result set to + # access. + e_name, e_obj, e_type = d[key] + d[key] = e_name, e_obj + rec[1], e_type + else: + d[key] = rec + return d + + def _key_fallback(self, key, raiseerr=True): + map = self._keymap + result = None + if isinstance(key, util.string_types): + result = map.get(key if self.case_sensitive else key.lower()) + # fallback for targeting a ColumnElement to a textual expression + # this is a rare use case which only occurs when matching text() + # or colummn('name') constructs to ColumnElements, or after a + # pickle/unpickle roundtrip + elif isinstance(key, expression.ColumnElement): + if key._label and ( + key._label + if self.case_sensitive + else key._label.lower()) in map: + result = map[key._label + if self.case_sensitive + else key._label.lower()] + elif hasattr(key, 'name') and ( + key.name + if self.case_sensitive + else key.name.lower()) in map: + # match is only on name. + result = map[key.name + if self.case_sensitive + else key.name.lower()] + # search extra hard to make sure this + # isn't a column/label name overlap. + # this check isn't currently available if the row + # was unpickled. + if result is not None and \ + result[1] is not None: + for obj in result[1]: + if key._compare_name_for_result(obj): + break + else: + result = None + if result is None: + if raiseerr: + raise exc.NoSuchColumnError( + "Could not locate column in row for column '%s'" % + expression._string_or_unprintable(key)) + else: + return None + else: + map[key] = result + return result + + def _has_key(self, key): + if key in self._keymap: + return True + else: + return self._key_fallback(key, False) is not None + + def _getter(self, key, raiseerr=True): + if key in self._keymap: + processor, obj, index = self._keymap[key] + else: + ret = self._key_fallback(key, raiseerr) + if ret is None: + return None + processor, obj, index = ret + + if index is None: + raise exc.InvalidRequestError( + "Ambiguous column name '%s' in " + "result set column descriptions" % obj) + + return operator.itemgetter(index) + + def __getstate__(self): + return { + '_pickled_keymap': dict( + (key, index) + for key, (processor, obj, index) in self._keymap.items() + if isinstance(key, util.string_types + util.int_types) + ), + 'keys': self.keys, + "case_sensitive": self.case_sensitive, + "matched_on_name": self.matched_on_name + } + + def __setstate__(self, state): + # the row has been processed at pickling time so we don't need any + # processor anymore + self._processors = [None for _ in range(len(state['keys']))] + self._keymap = keymap = {} + for key, index in state['_pickled_keymap'].items(): + # not preserving "obj" here, unfortunately our + # proxy comparison fails with the unpickle + keymap[key] = (None, None, index) + self.keys = state['keys'] + self.case_sensitive = state['case_sensitive'] + self.matched_on_name = state['matched_on_name'] + + +class ResultProxy(object): + """Wraps a DB-API cursor object to provide easier access to row columns. + + Individual columns may be accessed by their integer position, + case-insensitive column name, or by ``schema.Column`` + object. e.g.:: + + row = fetchone() + + col1 = row[0] # access via integer position + + col2 = row['col2'] # access via name + + col3 = row[mytable.c.mycol] # access via Column object. + + ``ResultProxy`` also handles post-processing of result column + data using ``TypeEngine`` objects, which are referenced from + the originating SQL statement that produced this result set. + + """ + + _process_row = RowProxy + out_parameters = None + _autoclose_connection = False + _metadata = None + _soft_closed = False + closed = False + + def __init__(self, context): + self.context = context + self.dialect = context.dialect + self.cursor = self._saved_cursor = context.cursor + self.connection = context.root_connection + self._echo = self.connection._echo and \ + context.engine._should_log_debug() + self._init_metadata() + + def _getter(self, key, raiseerr=True): + try: + getter = self._metadata._getter + except AttributeError: + return self._non_result(None) + else: + return getter(key, raiseerr) + + def _has_key(self, key): + try: + has_key = self._metadata._has_key + except AttributeError: + return self._non_result(None) + else: + return has_key(key) + + def _init_metadata(self): + cursor_description = self._cursor_description() + if cursor_description is not None: + if self.context.compiled and \ + 'compiled_cache' in self.context.execution_options: + if self.context.compiled._cached_metadata: + self._metadata = self.context.compiled._cached_metadata + else: + self._metadata = self.context.compiled._cached_metadata = \ + ResultMetaData(self, cursor_description) + else: + self._metadata = ResultMetaData(self, cursor_description) + if self._echo: + self.context.engine.logger.debug( + "Col %r", tuple(x[0] for x in cursor_description)) + + def keys(self): + """Return the current set of string keys for rows.""" + if self._metadata: + return self._metadata.keys + else: + return [] + + @util.memoized_property + def rowcount(self): + """Return the 'rowcount' for this result. + + The 'rowcount' reports the number of rows *matched* + by the WHERE criterion of an UPDATE or DELETE statement. + + .. note:: + + Notes regarding :attr:`.ResultProxy.rowcount`: + + + * This attribute returns the number of rows *matched*, + which is not necessarily the same as the number of rows + that were actually *modified* - an UPDATE statement, for example, + may have no net change on a given row if the SET values + given are the same as those present in the row already. + Such a row would be matched but not modified. + On backends that feature both styles, such as MySQL, + rowcount is configured by default to return the match + count in all cases. + + * :attr:`.ResultProxy.rowcount` is *only* useful in conjunction + with an UPDATE or DELETE statement. Contrary to what the Python + DBAPI says, it does *not* return the + number of rows available from the results of a SELECT statement + as DBAPIs cannot support this functionality when rows are + unbuffered. + + * :attr:`.ResultProxy.rowcount` may not be fully implemented by + all dialects. In particular, most DBAPIs do not support an + aggregate rowcount result from an executemany call. + The :meth:`.ResultProxy.supports_sane_rowcount` and + :meth:`.ResultProxy.supports_sane_multi_rowcount` methods + will report from the dialect if each usage is known to be + supported. + + * Statements that use RETURNING may not return a correct + rowcount. + + """ + try: + return self.context.rowcount + except BaseException as e: + self.connection._handle_dbapi_exception( + e, None, None, self.cursor, self.context) + + @property + def lastrowid(self): + """return the 'lastrowid' accessor on the DBAPI cursor. + + This is a DBAPI specific method and is only functional + for those backends which support it, for statements + where it is appropriate. It's behavior is not + consistent across backends. + + Usage of this method is normally unnecessary when + using insert() expression constructs; the + :attr:`~ResultProxy.inserted_primary_key` attribute provides a + tuple of primary key values for a newly inserted row, + regardless of database backend. + + """ + try: + return self._saved_cursor.lastrowid + except BaseException as e: + self.connection._handle_dbapi_exception( + e, None, None, + self._saved_cursor, self.context) + + @property + def returns_rows(self): + """True if this :class:`.ResultProxy` returns rows. + + I.e. if it is legal to call the methods + :meth:`~.ResultProxy.fetchone`, + :meth:`~.ResultProxy.fetchmany` + :meth:`~.ResultProxy.fetchall`. + + """ + return self._metadata is not None + + @property + def is_insert(self): + """True if this :class:`.ResultProxy` is the result + of a executing an expression language compiled + :func:`.expression.insert` construct. + + When True, this implies that the + :attr:`inserted_primary_key` attribute is accessible, + assuming the statement did not include + a user defined "returning" construct. + + """ + return self.context.isinsert + + def _cursor_description(self): + """May be overridden by subclasses.""" + + return self._saved_cursor.description + + def _soft_close(self): + """Soft close this :class:`.ResultProxy`. + + This releases all DBAPI cursor resources, but leaves the + ResultProxy "open" from a semantic perspective, meaning the + fetchXXX() methods will continue to return empty results. + + This method is called automatically when: + + * all result rows are exhausted using the fetchXXX() methods. + * cursor.description is None. + + This method is **not public**, but is documented in order to clarify + the "autoclose" process used. + + .. versionadded:: 1.0.0 + + .. seealso:: + + :meth:`.ResultProxy.close` + + + """ + if self._soft_closed: + return + self._soft_closed = True + cursor = self.cursor + self.connection._safe_close_cursor(cursor) + if self._autoclose_connection: + self.connection.close() + self.cursor = None + + def close(self): + """Close this ResultProxy. + + This closes out the underlying DBAPI cursor corresonding + to the statement execution, if one is still present. Note that the + DBAPI cursor is automatically released when the :class:`.ResultProxy` + exhausts all available rows. :meth:`.ResultProxy.close` is generally + an optional method except in the case when discarding a + :class:`.ResultProxy` that still has additional rows pending for fetch. + + In the case of a result that is the product of + :ref:`connectionless execution `, + the underlying :class:`.Connection` object is also closed, which + :term:`releases` DBAPI connection resources. + + After this method is called, it is no longer valid to call upon + the fetch methods, which will raise a :class:`.ResourceClosedError` + on subsequent use. + + .. versionchanged:: 1.0.0 - the :meth:`.ResultProxy.close` method + has been separated out from the process that releases the underlying + DBAPI cursor resource. The "auto close" feature of the + :class:`.Connection` now performs a so-called "soft close", which + releases the underlying DBAPI cursor, but allows the + :class:`.ResultProxy` to still behave as an open-but-exhausted + result set; the actual :meth:`.ResultProxy.close` method is never + called. It is still safe to discard a :class:`.ResultProxy` + that has been fully exhausted without calling this method. + + .. seealso:: + + :ref:`connections_toplevel` + + :meth:`.ResultProxy._soft_close` + + """ + + if not self.closed: + self._soft_close() + self.closed = True + + def __iter__(self): + while True: + row = self.fetchone() + if row is None: + return + else: + yield row + + @util.memoized_property + def inserted_primary_key(self): + """Return the primary key for the row just inserted. + + The return value is a list of scalar values + corresponding to the list of primary key columns + in the target table. + + This only applies to single row :func:`.insert` + constructs which did not explicitly specify + :meth:`.Insert.returning`. + + Note that primary key columns which specify a + server_default clause, + or otherwise do not qualify as "autoincrement" + columns (see the notes at :class:`.Column`), and were + generated using the database-side default, will + appear in this list as ``None`` unless the backend + supports "returning" and the insert statement executed + with the "implicit returning" enabled. + + Raises :class:`~sqlalchemy.exc.InvalidRequestError` if the executed + statement is not a compiled expression construct + or is not an insert() construct. + + """ + + if not self.context.compiled: + raise exc.InvalidRequestError( + "Statement is not a compiled " + "expression construct.") + elif not self.context.isinsert: + raise exc.InvalidRequestError( + "Statement is not an insert() " + "expression construct.") + elif self.context._is_explicit_returning: + raise exc.InvalidRequestError( + "Can't call inserted_primary_key " + "when returning() " + "is used.") + + return self.context.inserted_primary_key + + def last_updated_params(self): + """Return the collection of updated parameters from this + execution. + + Raises :class:`~sqlalchemy.exc.InvalidRequestError` if the executed + statement is not a compiled expression construct + or is not an update() construct. + + """ + if not self.context.compiled: + raise exc.InvalidRequestError( + "Statement is not a compiled " + "expression construct.") + elif not self.context.isupdate: + raise exc.InvalidRequestError( + "Statement is not an update() " + "expression construct.") + elif self.context.executemany: + return self.context.compiled_parameters + else: + return self.context.compiled_parameters[0] + + def last_inserted_params(self): + """Return the collection of inserted parameters from this + execution. + + Raises :class:`~sqlalchemy.exc.InvalidRequestError` if the executed + statement is not a compiled expression construct + or is not an insert() construct. + + """ + if not self.context.compiled: + raise exc.InvalidRequestError( + "Statement is not a compiled " + "expression construct.") + elif not self.context.isinsert: + raise exc.InvalidRequestError( + "Statement is not an insert() " + "expression construct.") + elif self.context.executemany: + return self.context.compiled_parameters + else: + return self.context.compiled_parameters[0] + + @property + def returned_defaults(self): + """Return the values of default columns that were fetched using + the :meth:`.ValuesBase.return_defaults` feature. + + The value is an instance of :class:`.RowProxy`, or ``None`` + if :meth:`.ValuesBase.return_defaults` was not used or if the + backend does not support RETURNING. + + .. versionadded:: 0.9.0 + + .. seealso:: + + :meth:`.ValuesBase.return_defaults` + + """ + return self.context.returned_defaults + + def lastrow_has_defaults(self): + """Return ``lastrow_has_defaults()`` from the underlying + :class:`.ExecutionContext`. + + See :class:`.ExecutionContext` for details. + + """ + + return self.context.lastrow_has_defaults() + + def postfetch_cols(self): + """Return ``postfetch_cols()`` from the underlying + :class:`.ExecutionContext`. + + See :class:`.ExecutionContext` for details. + + Raises :class:`~sqlalchemy.exc.InvalidRequestError` if the executed + statement is not a compiled expression construct + or is not an insert() or update() construct. + + """ + + if not self.context.compiled: + raise exc.InvalidRequestError( + "Statement is not a compiled " + "expression construct.") + elif not self.context.isinsert and not self.context.isupdate: + raise exc.InvalidRequestError( + "Statement is not an insert() or update() " + "expression construct.") + return self.context.postfetch_cols + + def prefetch_cols(self): + """Return ``prefetch_cols()`` from the underlying + :class:`.ExecutionContext`. + + See :class:`.ExecutionContext` for details. + + Raises :class:`~sqlalchemy.exc.InvalidRequestError` if the executed + statement is not a compiled expression construct + or is not an insert() or update() construct. + + """ + + if not self.context.compiled: + raise exc.InvalidRequestError( + "Statement is not a compiled " + "expression construct.") + elif not self.context.isinsert and not self.context.isupdate: + raise exc.InvalidRequestError( + "Statement is not an insert() or update() " + "expression construct.") + return self.context.prefetch_cols + + def supports_sane_rowcount(self): + """Return ``supports_sane_rowcount`` from the dialect. + + See :attr:`.ResultProxy.rowcount` for background. + + """ + + return self.dialect.supports_sane_rowcount + + def supports_sane_multi_rowcount(self): + """Return ``supports_sane_multi_rowcount`` from the dialect. + + See :attr:`.ResultProxy.rowcount` for background. + + """ + + return self.dialect.supports_sane_multi_rowcount + + def _fetchone_impl(self): + try: + return self.cursor.fetchone() + except AttributeError: + return self._non_result(None) + + def _fetchmany_impl(self, size=None): + try: + if size is None: + return self.cursor.fetchmany() + else: + return self.cursor.fetchmany(size) + except AttributeError: + return self._non_result([]) + + def _fetchall_impl(self): + try: + return self.cursor.fetchall() + except AttributeError: + return self._non_result([]) + + def _non_result(self, default): + if self._metadata is None: + raise exc.ResourceClosedError( + "This result object does not return rows. " + "It has been closed automatically.", + ) + elif self.closed: + raise exc.ResourceClosedError("This result object is closed.") + else: + return default + + def process_rows(self, rows): + process_row = self._process_row + metadata = self._metadata + keymap = metadata._keymap + processors = metadata._processors + if self._echo: + log = self.context.engine.logger.debug + l = [] + for row in rows: + log("Row %r", sql_util._repr_row(row)) + l.append(process_row(metadata, row, processors, keymap)) + return l + else: + return [process_row(metadata, row, processors, keymap) + for row in rows] + + def fetchall(self): + """Fetch all rows, just like DB-API ``cursor.fetchall()``. + + After all rows have been exhausted, the underlying DBAPI + cursor resource is released, and the object may be safely + discarded. + + Subsequent calls to :meth:`.ResultProxy.fetchall` will return + an empty list. After the :meth:`.ResultProxy.close` method is + called, the method will raise :class:`.ResourceClosedError`. + + .. versionchanged:: 1.0.0 - Added "soft close" behavior which + allows the result to be used in an "exhausted" state prior to + calling the :meth:`.ResultProxy.close` method. + + """ + + try: + l = self.process_rows(self._fetchall_impl()) + self._soft_close() + return l + except BaseException as e: + self.connection._handle_dbapi_exception( + e, None, None, + self.cursor, self.context) + + def fetchmany(self, size=None): + """Fetch many rows, just like DB-API + ``cursor.fetchmany(size=cursor.arraysize)``. + + After all rows have been exhausted, the underlying DBAPI + cursor resource is released, and the object may be safely + discarded. + + Calls to :meth:`.ResultProxy.fetchmany` after all rows have been + exhausted will return + an empty list. After the :meth:`.ResultProxy.close` method is + called, the method will raise :class:`.ResourceClosedError`. + + .. versionchanged:: 1.0.0 - Added "soft close" behavior which + allows the result to be used in an "exhausted" state prior to + calling the :meth:`.ResultProxy.close` method. + + """ + + try: + l = self.process_rows(self._fetchmany_impl(size)) + if len(l) == 0: + self._soft_close() + return l + except BaseException as e: + self.connection._handle_dbapi_exception( + e, None, None, + self.cursor, self.context) + + def fetchone(self): + """Fetch one row, just like DB-API ``cursor.fetchone()``. + + After all rows have been exhausted, the underlying DBAPI + cursor resource is released, and the object may be safely + discarded. + + Calls to :meth:`.ResultProxy.fetchone` after all rows have + been exhausted will return ``None``. + After the :meth:`.ResultProxy.close` method is + called, the method will raise :class:`.ResourceClosedError`. + + .. versionchanged:: 1.0.0 - Added "soft close" behavior which + allows the result to be used in an "exhausted" state prior to + calling the :meth:`.ResultProxy.close` method. + + """ + try: + row = self._fetchone_impl() + if row is not None: + return self.process_rows([row])[0] + else: + self._soft_close() + return None + except BaseException as e: + self.connection._handle_dbapi_exception( + e, None, None, + self.cursor, self.context) + + def first(self): + """Fetch the first row and then close the result set unconditionally. + + Returns None if no row is present. + + After calling this method, the object is fully closed, + e.g. the :meth:`.ResultProxy.close` method will have been called. + + """ + if self._metadata is None: + return self._non_result(None) + + try: + row = self._fetchone_impl() + except BaseException as e: + self.connection._handle_dbapi_exception( + e, None, None, + self.cursor, self.context) + + try: + if row is not None: + return self.process_rows([row])[0] + else: + return None + finally: + self.close() + + def scalar(self): + """Fetch the first column of the first row, and close the result set. + + Returns None if no row is present. + + After calling this method, the object is fully closed, + e.g. the :meth:`.ResultProxy.close` method will have been called. + + """ + row = self.first() + if row is not None: + return row[0] + else: + return None + + +class BufferedRowResultProxy(ResultProxy): + """A ResultProxy with row buffering behavior. + + ``ResultProxy`` that buffers the contents of a selection of rows + before ``fetchone()`` is called. This is to allow the results of + ``cursor.description`` to be available immediately, when + interfacing with a DB-API that requires rows to be consumed before + this information is available (currently psycopg2, when used with + server-side cursors). + + The pre-fetching behavior fetches only one row initially, and then + grows its buffer size by a fixed amount with each successive need + for additional rows up to a size of 1000. + + The size argument is configurable using the ``max_row_buffer`` + execution option:: + + with psycopg2_engine.connect() as conn: + + result = conn.execution_options( + stream_results=True, max_row_buffer=50 + ).execute("select * from table") + + .. versionadded:: 1.0.6 Added the ``max_row_buffer`` option. + + .. seealso:: + + :ref:`psycopg2_execution_options` + """ + + def _init_metadata(self): + self._max_row_buffer = self.context.execution_options.get( + 'max_row_buffer', None) + self.__buffer_rows() + super(BufferedRowResultProxy, self)._init_metadata() + + # this is a "growth chart" for the buffering of rows. + # each successive __buffer_rows call will use the next + # value in the list for the buffer size until the max + # is reached + size_growth = { + 1: 5, + 5: 10, + 10: 20, + 20: 50, + 50: 100, + 100: 250, + 250: 500, + 500: 1000 + } + + def __buffer_rows(self): + if self.cursor is None: + return + size = getattr(self, '_bufsize', 1) + self.__rowbuffer = collections.deque(self.cursor.fetchmany(size)) + self._bufsize = self.size_growth.get(size, size) + if self._max_row_buffer is not None: + self._bufsize = min(self._max_row_buffer, self._bufsize) + + def _soft_close(self, **kw): + self.__rowbuffer.clear() + super(BufferedRowResultProxy, self)._soft_close(**kw) + + def _fetchone_impl(self): + if self.cursor is None: + return self._non_result(None) + if not self.__rowbuffer: + self.__buffer_rows() + if not self.__rowbuffer: + return None + return self.__rowbuffer.popleft() + + def _fetchmany_impl(self, size=None): + if size is None: + return self._fetchall_impl() + result = [] + for x in range(0, size): + row = self._fetchone_impl() + if row is None: + break + result.append(row) + return result + + def _fetchall_impl(self): + if self.cursor is None: + return self._non_result([]) + self.__rowbuffer.extend(self.cursor.fetchall()) + ret = self.__rowbuffer + self.__rowbuffer = collections.deque() + return ret + + +class FullyBufferedResultProxy(ResultProxy): + """A result proxy that buffers rows fully upon creation. + + Used for operations where a result is to be delivered + after the database conversation can not be continued, + such as MSSQL INSERT...OUTPUT after an autocommit. + + """ + + def _init_metadata(self): + super(FullyBufferedResultProxy, self)._init_metadata() + self.__rowbuffer = self._buffer_rows() + + def _buffer_rows(self): + return collections.deque(self.cursor.fetchall()) + + def _soft_close(self, **kw): + self.__rowbuffer.clear() + super(FullyBufferedResultProxy, self)._soft_close(**kw) + + def _fetchone_impl(self): + if self.__rowbuffer: + return self.__rowbuffer.popleft() + else: + return self._non_result(None) + + def _fetchmany_impl(self, size=None): + if size is None: + return self._fetchall_impl() + result = [] + for x in range(0, size): + row = self._fetchone_impl() + if row is None: + break + result.append(row) + return result + + def _fetchall_impl(self): + if not self.cursor: + return self._non_result([]) + ret = self.__rowbuffer + self.__rowbuffer = collections.deque() + return ret + + +class BufferedColumnRow(RowProxy): + def __init__(self, parent, row, processors, keymap): + # preprocess row + row = list(row) + # this is a tad faster than using enumerate + index = 0 + for processor in parent._orig_processors: + if processor is not None: + row[index] = processor(row[index]) + index += 1 + row = tuple(row) + super(BufferedColumnRow, self).__init__(parent, row, + processors, keymap) + + +class BufferedColumnResultProxy(ResultProxy): + """A ResultProxy with column buffering behavior. + + ``ResultProxy`` that loads all columns into memory each time + fetchone() is called. If fetchmany() or fetchall() are called, + the full grid of results is fetched. This is to operate with + databases where result rows contain "live" results that fall out + of scope unless explicitly fetched. Currently this includes + cx_Oracle LOB objects. + + """ + + _process_row = BufferedColumnRow + + def _init_metadata(self): + super(BufferedColumnResultProxy, self)._init_metadata() + + metadata = self._metadata + + # don't double-replace the processors, in the case + # of a cached ResultMetaData + if metadata._orig_processors is None: + # orig_processors will be used to preprocess each row when + # they are constructed. + metadata._orig_processors = metadata._processors + # replace the all type processors by None processors. + metadata._processors = [None for _ in range(len(metadata.keys))] + keymap = {} + for k, (func, obj, index) in metadata._keymap.items(): + keymap[k] = (None, obj, index) + metadata._keymap = keymap + + def fetchall(self): + # can't call cursor.fetchall(), since rows must be + # fully processed before requesting more from the DBAPI. + l = [] + while True: + row = self.fetchone() + if row is None: + break + l.append(row) + return l + + def fetchmany(self, size=None): + # can't call cursor.fetchmany(), since rows must be + # fully processed before requesting more from the DBAPI. + if size is None: + return self.fetchall() + l = [] + for i in range(size): + row = self.fetchone() + if row is None: + break + l.append(row) + return l diff --git a/app/lib/sqlalchemy/engine/strategies.py b/app/lib/sqlalchemy/engine/strategies.py new file mode 100644 index 0000000..81bb2c5 --- /dev/null +++ b/app/lib/sqlalchemy/engine/strategies.py @@ -0,0 +1,283 @@ +# engine/strategies.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Strategies for creating new instances of Engine types. + +These are semi-private implementation classes which provide the +underlying behavior for the "strategy" keyword argument available on +:func:`~sqlalchemy.engine.create_engine`. Current available options are +``plain``, ``threadlocal``, and ``mock``. + +New strategies can be added via new ``EngineStrategy`` classes. +""" + +from operator import attrgetter + +from sqlalchemy.engine import base, threadlocal, url +from sqlalchemy import util, event +from sqlalchemy import pool as poollib +from sqlalchemy.sql import schema + +strategies = {} + + +class EngineStrategy(object): + """An adaptor that processes input arguments and produces an Engine. + + Provides a ``create`` method that receives input arguments and + produces an instance of base.Engine or a subclass. + + """ + + def __init__(self): + strategies[self.name] = self + + def create(self, *args, **kwargs): + """Given arguments, returns a new Engine instance.""" + + raise NotImplementedError() + + +class DefaultEngineStrategy(EngineStrategy): + """Base class for built-in strategies.""" + + def create(self, name_or_url, **kwargs): + # create url.URL object + u = url.make_url(name_or_url) + + plugins = u._instantiate_plugins(kwargs) + + u.query.pop('plugin', None) + + entrypoint = u._get_entrypoint() + dialect_cls = entrypoint.get_dialect_cls(u) + + if kwargs.pop('_coerce_config', False): + def pop_kwarg(key, default=None): + value = kwargs.pop(key, default) + if key in dialect_cls.engine_config_types: + value = dialect_cls.engine_config_types[key](value) + return value + else: + pop_kwarg = kwargs.pop + + dialect_args = {} + # consume dialect arguments from kwargs + for k in util.get_cls_kwargs(dialect_cls): + if k in kwargs: + dialect_args[k] = pop_kwarg(k) + + dbapi = kwargs.pop('module', None) + if dbapi is None: + dbapi_args = {} + for k in util.get_func_kwargs(dialect_cls.dbapi): + if k in kwargs: + dbapi_args[k] = pop_kwarg(k) + dbapi = dialect_cls.dbapi(**dbapi_args) + + dialect_args['dbapi'] = dbapi + + for plugin in plugins: + plugin.handle_dialect_kwargs(dialect_cls, dialect_args) + + # create dialect + dialect = dialect_cls(**dialect_args) + + # assemble connection arguments + (cargs, cparams) = dialect.create_connect_args(u) + cparams.update(pop_kwarg('connect_args', {})) + cargs = list(cargs) # allow mutability + + # look for existing pool or create + pool = pop_kwarg('pool', None) + if pool is None: + def connect(connection_record=None): + if dialect._has_events: + for fn in dialect.dispatch.do_connect: + connection = fn( + dialect, connection_record, cargs, cparams) + if connection is not None: + return connection + return dialect.connect(*cargs, **cparams) + + creator = pop_kwarg('creator', connect) + + poolclass = pop_kwarg('poolclass', None) + if poolclass is None: + poolclass = dialect_cls.get_pool_class(u) + pool_args = { + 'dialect': dialect + } + + # consume pool arguments from kwargs, translating a few of + # the arguments + translate = {'logging_name': 'pool_logging_name', + 'echo': 'echo_pool', + 'timeout': 'pool_timeout', + 'recycle': 'pool_recycle', + 'events': 'pool_events', + 'use_threadlocal': 'pool_threadlocal', + 'reset_on_return': 'pool_reset_on_return'} + for k in util.get_cls_kwargs(poolclass): + tk = translate.get(k, k) + if tk in kwargs: + pool_args[k] = pop_kwarg(tk) + + for plugin in plugins: + plugin.handle_pool_kwargs(poolclass, pool_args) + + pool = poolclass(creator, **pool_args) + else: + if isinstance(pool, poollib._DBProxy): + pool = pool.get_pool(*cargs, **cparams) + else: + pool = pool + + pool._dialect = dialect + + # create engine. + engineclass = self.engine_cls + engine_args = {} + for k in util.get_cls_kwargs(engineclass): + if k in kwargs: + engine_args[k] = pop_kwarg(k) + + _initialize = kwargs.pop('_initialize', True) + + # all kwargs should be consumed + if kwargs: + raise TypeError( + "Invalid argument(s) %s sent to create_engine(), " + "using configuration %s/%s/%s. Please check that the " + "keyword arguments are appropriate for this combination " + "of components." % (','.join("'%s'" % k for k in kwargs), + dialect.__class__.__name__, + pool.__class__.__name__, + engineclass.__name__)) + + engine = engineclass(pool, dialect, u, **engine_args) + + if _initialize: + do_on_connect = dialect.on_connect() + if do_on_connect: + def on_connect(dbapi_connection, connection_record): + conn = getattr( + dbapi_connection, '_sqla_unwrap', dbapi_connection) + if conn is None: + return + do_on_connect(conn) + + event.listen(pool, 'first_connect', on_connect) + event.listen(pool, 'connect', on_connect) + + def first_connect(dbapi_connection, connection_record): + c = base.Connection(engine, connection=dbapi_connection, + _has_events=False) + c._execution_options = util.immutabledict() + dialect.initialize(c) + event.listen(pool, 'first_connect', first_connect, once=True) + + dialect_cls.engine_created(engine) + if entrypoint is not dialect_cls: + entrypoint.engine_created(engine) + + for plugin in plugins: + plugin.engine_created(engine) + + return engine + + +class PlainEngineStrategy(DefaultEngineStrategy): + """Strategy for configuring a regular Engine.""" + + name = 'plain' + engine_cls = base.Engine + +PlainEngineStrategy() + + +class ThreadLocalEngineStrategy(DefaultEngineStrategy): + """Strategy for configuring an Engine with threadlocal behavior.""" + + name = 'threadlocal' + engine_cls = threadlocal.TLEngine + +ThreadLocalEngineStrategy() + + +class MockEngineStrategy(EngineStrategy): + """Strategy for configuring an Engine-like object with mocked execution. + + Produces a single mock Connectable object which dispatches + statement execution to a passed-in function. + + """ + + name = 'mock' + + def create(self, name_or_url, executor, **kwargs): + # create url.URL object + u = url.make_url(name_or_url) + + dialect_cls = u.get_dialect() + + dialect_args = {} + # consume dialect arguments from kwargs + for k in util.get_cls_kwargs(dialect_cls): + if k in kwargs: + dialect_args[k] = kwargs.pop(k) + + # create dialect + dialect = dialect_cls(**dialect_args) + + return MockEngineStrategy.MockConnection(dialect, executor) + + class MockConnection(base.Connectable): + def __init__(self, dialect, execute): + self._dialect = dialect + self.execute = execute + + engine = property(lambda s: s) + dialect = property(attrgetter('_dialect')) + name = property(lambda s: s._dialect.name) + + schema_for_object = schema._schema_getter(None) + + def contextual_connect(self, **kwargs): + return self + + def execution_options(self, **kw): + return self + + def compiler(self, statement, parameters, **kwargs): + return self._dialect.compiler( + statement, parameters, engine=self, **kwargs) + + def create(self, entity, **kwargs): + kwargs['checkfirst'] = False + from sqlalchemy.engine import ddl + + ddl.SchemaGenerator( + self.dialect, self, **kwargs).traverse_single(entity) + + def drop(self, entity, **kwargs): + kwargs['checkfirst'] = False + from sqlalchemy.engine import ddl + ddl.SchemaDropper( + self.dialect, self, **kwargs).traverse_single(entity) + + def _run_visitor(self, visitorcallable, element, + connection=None, + **kwargs): + kwargs['checkfirst'] = False + visitorcallable(self.dialect, self, + **kwargs).traverse_single(element) + + def execute(self, object, *multiparams, **params): + raise NotImplementedError() + +MockEngineStrategy() diff --git a/app/lib/sqlalchemy/engine/threadlocal.py b/app/lib/sqlalchemy/engine/threadlocal.py new file mode 100644 index 0000000..ee31764 --- /dev/null +++ b/app/lib/sqlalchemy/engine/threadlocal.py @@ -0,0 +1,138 @@ +# engine/threadlocal.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Provides a thread-local transactional wrapper around the root Engine class. + +The ``threadlocal`` module is invoked when using the +``strategy="threadlocal"`` flag with :func:`~sqlalchemy.engine.create_engine`. +This module is semi-private and is invoked automatically when the threadlocal +engine strategy is used. +""" + +from .. import util +from . import base +import weakref + + +class TLConnection(base.Connection): + + def __init__(self, *arg, **kw): + super(TLConnection, self).__init__(*arg, **kw) + self.__opencount = 0 + + def _increment_connect(self): + self.__opencount += 1 + return self + + def close(self): + if self.__opencount == 1: + base.Connection.close(self) + self.__opencount -= 1 + + def _force_close(self): + self.__opencount = 0 + base.Connection.close(self) + + +class TLEngine(base.Engine): + """An Engine that includes support for thread-local managed + transactions. + + """ + _tl_connection_cls = TLConnection + + def __init__(self, *args, **kwargs): + super(TLEngine, self).__init__(*args, **kwargs) + self._connections = util.threading.local() + + def contextual_connect(self, **kw): + if not hasattr(self._connections, 'conn'): + connection = None + else: + connection = self._connections.conn() + + if connection is None or connection.closed: + # guards against pool-level reapers, if desired. + # or not connection.connection.is_valid: + connection = self._tl_connection_cls( + self, + self._wrap_pool_connect( + self.pool.connect, connection), + **kw) + self._connections.conn = weakref.ref(connection) + + return connection._increment_connect() + + def begin_twophase(self, xid=None): + if not hasattr(self._connections, 'trans'): + self._connections.trans = [] + self._connections.trans.append( + self.contextual_connect().begin_twophase(xid=xid)) + return self + + def begin_nested(self): + if not hasattr(self._connections, 'trans'): + self._connections.trans = [] + self._connections.trans.append( + self.contextual_connect().begin_nested()) + return self + + def begin(self): + if not hasattr(self._connections, 'trans'): + self._connections.trans = [] + self._connections.trans.append(self.contextual_connect().begin()) + return self + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + if type is None: + self.commit() + else: + self.rollback() + + def prepare(self): + if not hasattr(self._connections, 'trans') or \ + not self._connections.trans: + return + self._connections.trans[-1].prepare() + + def commit(self): + if not hasattr(self._connections, 'trans') or \ + not self._connections.trans: + return + trans = self._connections.trans.pop(-1) + trans.commit() + + def rollback(self): + if not hasattr(self._connections, 'trans') or \ + not self._connections.trans: + return + trans = self._connections.trans.pop(-1) + trans.rollback() + + def dispose(self): + self._connections = util.threading.local() + super(TLEngine, self).dispose() + + @property + def closed(self): + return not hasattr(self._connections, 'conn') or \ + self._connections.conn() is None or \ + self._connections.conn().closed + + def close(self): + if not self.closed: + self.contextual_connect().close() + connection = self._connections.conn() + connection._force_close() + del self._connections.conn + self._connections.trans = [] + + def __repr__(self): + return 'TLEngine(%r)' % self.url diff --git a/app/lib/sqlalchemy/engine/url.py b/app/lib/sqlalchemy/engine/url.py new file mode 100644 index 0000000..1c16584 --- /dev/null +++ b/app/lib/sqlalchemy/engine/url.py @@ -0,0 +1,261 @@ +# engine/url.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Provides the :class:`~sqlalchemy.engine.url.URL` class which encapsulates +information about a database connection specification. + +The URL object is created automatically when +:func:`~sqlalchemy.engine.create_engine` is called with a string +argument; alternatively, the URL is a public-facing construct which can +be used directly and is also accepted directly by ``create_engine()``. +""" + +import re +from .. import exc, util +from . import Dialect +from ..dialects import registry, plugins + + +class URL(object): + """ + Represent the components of a URL used to connect to a database. + + This object is suitable to be passed directly to a + :func:`~sqlalchemy.create_engine` call. The fields of the URL are parsed + from a string by the :func:`.make_url` function. the string + format of the URL is an RFC-1738-style string. + + All initialization parameters are available as public attributes. + + :param drivername: the name of the database backend. + This name will correspond to a module in sqlalchemy/databases + or a third party plug-in. + + :param username: The user name. + + :param password: database password. + + :param host: The name of the host. + + :param port: The port number. + + :param database: The database name. + + :param query: A dictionary of options to be passed to the + dialect and/or the DBAPI upon connect. + + """ + + def __init__(self, drivername, username=None, password=None, + host=None, port=None, database=None, query=None): + self.drivername = drivername + self.username = username + self.password = password + self.host = host + if port is not None: + self.port = int(port) + else: + self.port = None + self.database = database + self.query = query or {} + + def __to_string__(self, hide_password=True): + s = self.drivername + "://" + if self.username is not None: + s += _rfc_1738_quote(self.username) + if self.password is not None: + s += ':' + ('***' if hide_password + else _rfc_1738_quote(self.password)) + s += "@" + if self.host is not None: + if ':' in self.host: + s += "[%s]" % self.host + else: + s += self.host + if self.port is not None: + s += ':' + str(self.port) + if self.database is not None: + s += '/' + self.database + if self.query: + keys = list(self.query) + keys.sort() + s += '?' + "&".join("%s=%s" % (k, self.query[k]) for k in keys) + return s + + def __str__(self): + return self.__to_string__(hide_password=False) + + def __repr__(self): + return self.__to_string__() + + def __hash__(self): + return hash(str(self)) + + def __eq__(self, other): + return \ + isinstance(other, URL) and \ + self.drivername == other.drivername and \ + self.username == other.username and \ + self.password == other.password and \ + self.host == other.host and \ + self.database == other.database and \ + self.query == other.query + + def get_backend_name(self): + if '+' not in self.drivername: + return self.drivername + else: + return self.drivername.split('+')[0] + + def get_driver_name(self): + if '+' not in self.drivername: + return self.get_dialect().driver + else: + return self.drivername.split('+')[1] + + def _instantiate_plugins(self, kwargs): + plugin_names = util.to_list(self.query.get('plugin', ())) + + return [ + plugins.load(plugin_name)(self, kwargs) + for plugin_name in plugin_names + ] + + def _get_entrypoint(self): + """Return the "entry point" dialect class. + + This is normally the dialect itself except in the case when the + returned class implements the get_dialect_cls() method. + + """ + if '+' not in self.drivername: + name = self.drivername + else: + name = self.drivername.replace('+', '.') + cls = registry.load(name) + # check for legacy dialects that + # would return a module with 'dialect' as the + # actual class + if hasattr(cls, 'dialect') and \ + isinstance(cls.dialect, type) and \ + issubclass(cls.dialect, Dialect): + return cls.dialect + else: + return cls + + def get_dialect(self): + """Return the SQLAlchemy database dialect class corresponding + to this URL's driver name. + """ + entrypoint = self._get_entrypoint() + dialect_cls = entrypoint.get_dialect_cls(self) + return dialect_cls + + def translate_connect_args(self, names=[], **kw): + r"""Translate url attributes into a dictionary of connection arguments. + + Returns attributes of this url (`host`, `database`, `username`, + `password`, `port`) as a plain dictionary. The attribute names are + used as the keys by default. Unset or false attributes are omitted + from the final dictionary. + + :param \**kw: Optional, alternate key names for url attributes. + + :param names: Deprecated. Same purpose as the keyword-based alternate + names, but correlates the name to the original positionally. + """ + + translated = {} + attribute_names = ['host', 'database', 'username', 'password', 'port'] + for sname in attribute_names: + if names: + name = names.pop(0) + elif sname in kw: + name = kw[sname] + else: + name = sname + if name is not None and getattr(self, sname, False): + translated[name] = getattr(self, sname) + return translated + + +def make_url(name_or_url): + """Given a string or unicode instance, produce a new URL instance. + + The given string is parsed according to the RFC 1738 spec. If an + existing URL object is passed, just returns the object. + """ + + if isinstance(name_or_url, util.string_types): + return _parse_rfc1738_args(name_or_url) + else: + return name_or_url + + +def _parse_rfc1738_args(name): + pattern = re.compile(r''' + (?P[\w\+]+):// + (?: + (?P[^:/]*) + (?::(?P.*))? + @)? + (?: + (?: + \[(?P[^/]+)\] | + (?P[^/:]+) + )? + (?::(?P[^/]*))? + )? + (?:/(?P.*))? + ''', re.X) + + m = pattern.match(name) + if m is not None: + components = m.groupdict() + if components['database'] is not None: + tokens = components['database'].split('?', 2) + components['database'] = tokens[0] + query = ( + len(tokens) > 1 and dict(util.parse_qsl(tokens[1]))) or None + if util.py2k and query is not None: + query = dict((k.encode('ascii'), query[k]) for k in query) + else: + query = None + components['query'] = query + + if components['username'] is not None: + components['username'] = _rfc_1738_unquote(components['username']) + + if components['password'] is not None: + components['password'] = _rfc_1738_unquote(components['password']) + + ipv4host = components.pop('ipv4host') + ipv6host = components.pop('ipv6host') + components['host'] = ipv4host or ipv6host + name = components.pop('name') + return URL(name, **components) + else: + raise exc.ArgumentError( + "Could not parse rfc1738 URL from string '%s'" % name) + + +def _rfc_1738_quote(text): + return re.sub(r'[:@/]', lambda m: "%%%X" % ord(m.group(0)), text) + + +def _rfc_1738_unquote(text): + return util.unquote(text) + + +def _parse_keyvalue_args(name): + m = re.match(r'(\w+)://(.*)', name) + if m is not None: + (name, args) = m.group(1, 2) + opts = dict(util.parse_qsl(args)) + return URL(name, *opts) + else: + return None diff --git a/app/lib/sqlalchemy/engine/util.py b/app/lib/sqlalchemy/engine/util.py new file mode 100644 index 0000000..831b63e --- /dev/null +++ b/app/lib/sqlalchemy/engine/util.py @@ -0,0 +1,74 @@ +# engine/util.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from .. import util + + +def connection_memoize(key): + """Decorator, memoize a function in a connection.info stash. + + Only applicable to functions which take no arguments other than a + connection. The memo will be stored in ``connection.info[key]``. + """ + + @util.decorator + def decorated(fn, self, connection): + connection = connection.connect() + try: + return connection.info[key] + except KeyError: + connection.info[key] = val = fn(self, connection) + return val + + return decorated + + +def py_fallback(): + def _distill_params(multiparams, params): + """Given arguments from the calling form *multiparams, **params, + return a list of bind parameter structures, usually a list of + dictionaries. + + In the case of 'raw' execution which accepts positional parameters, + it may be a list of tuples or lists. + + """ + + if not multiparams: + if params: + return [params] + else: + return [] + elif len(multiparams) == 1: + zero = multiparams[0] + if isinstance(zero, (list, tuple)): + if not zero or hasattr(zero[0], '__iter__') and \ + not hasattr(zero[0], 'strip'): + # execute(stmt, [{}, {}, {}, ...]) + # execute(stmt, [(), (), (), ...]) + return zero + else: + # execute(stmt, ("value", "value")) + return [zero] + elif hasattr(zero, 'keys'): + # execute(stmt, {"key":"value"}) + return [zero] + else: + # execute(stmt, "value") + return [[zero]] + else: + if hasattr(multiparams[0], '__iter__') and \ + not hasattr(multiparams[0], 'strip'): + return multiparams + else: + return [multiparams] + + return locals() +try: + from sqlalchemy.cutils import _distill_params +except ImportError: + globals().update(py_fallback()) diff --git a/app/lib/sqlalchemy/event/__init__.py b/app/lib/sqlalchemy/event/__init__.py new file mode 100644 index 0000000..5cd01a9 --- /dev/null +++ b/app/lib/sqlalchemy/event/__init__.py @@ -0,0 +1,11 @@ +# event/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from .api import CANCEL, NO_RETVAL, listen, listens_for, remove, contains +from .base import Events, dispatcher +from .attr import RefCollection +from .legacy import _legacy_signature diff --git a/app/lib/sqlalchemy/event/api.py b/app/lib/sqlalchemy/event/api.py new file mode 100644 index 0000000..b24c8fe --- /dev/null +++ b/app/lib/sqlalchemy/event/api.py @@ -0,0 +1,188 @@ +# event/api.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Public API functions for the event system. + +""" +from __future__ import absolute_import + +from .. import util, exc +from .base import _registrars +from .registry import _EventKey + +CANCEL = util.symbol('CANCEL') +NO_RETVAL = util.symbol('NO_RETVAL') + + +def _event_key(target, identifier, fn): + for evt_cls in _registrars[identifier]: + tgt = evt_cls._accept_with(target) + if tgt is not None: + return _EventKey(target, identifier, fn, tgt) + else: + raise exc.InvalidRequestError("No such event '%s' for target '%s'" % + (identifier, target)) + + +def listen(target, identifier, fn, *args, **kw): + """Register a listener function for the given target. + + e.g.:: + + from sqlalchemy import event + from sqlalchemy.schema import UniqueConstraint + + def unique_constraint_name(const, table): + const.name = "uq_%s_%s" % ( + table.name, + list(const.columns)[0].name + ) + event.listen( + UniqueConstraint, + "after_parent_attach", + unique_constraint_name) + + + A given function can also be invoked for only the first invocation + of the event using the ``once`` argument:: + + def on_config(): + do_config() + + event.listen(Mapper, "before_configure", on_config, once=True) + + .. versionadded:: 0.9.4 Added ``once=True`` to :func:`.event.listen` + and :func:`.event.listens_for`. + + .. note:: + + The :func:`.listen` function cannot be called at the same time + that the target event is being run. This has implications + for thread safety, and also means an event cannot be added + from inside the listener function for itself. The list of + events to be run are present inside of a mutable collection + that can't be changed during iteration. + + Event registration and removal is not intended to be a "high + velocity" operation; it is a configurational operation. For + systems that need to quickly associate and deassociate with + events at high scale, use a mutable structure that is handled + from inside of a single listener. + + .. versionchanged:: 1.0.0 - a ``collections.deque()`` object is now + used as the container for the list of events, which explicitly + disallows collection mutation while the collection is being + iterated. + + .. seealso:: + + :func:`.listens_for` + + :func:`.remove` + + """ + + _event_key(target, identifier, fn).listen(*args, **kw) + + +def listens_for(target, identifier, *args, **kw): + """Decorate a function as a listener for the given target + identifier. + + e.g.:: + + from sqlalchemy import event + from sqlalchemy.schema import UniqueConstraint + + @event.listens_for(UniqueConstraint, "after_parent_attach") + def unique_constraint_name(const, table): + const.name = "uq_%s_%s" % ( + table.name, + list(const.columns)[0].name + ) + + A given function can also be invoked for only the first invocation + of the event using the ``once`` argument:: + + @event.listens_for(Mapper, "before_configure", once=True) + def on_config(): + do_config() + + + .. versionadded:: 0.9.4 Added ``once=True`` to :func:`.event.listen` + and :func:`.event.listens_for`. + + .. seealso:: + + :func:`.listen` - general description of event listening + + """ + def decorate(fn): + listen(target, identifier, fn, *args, **kw) + return fn + return decorate + + +def remove(target, identifier, fn): + """Remove an event listener. + + The arguments here should match exactly those which were sent to + :func:`.listen`; all the event registration which proceeded as a result + of this call will be reverted by calling :func:`.remove` with the same + arguments. + + e.g.:: + + # if a function was registered like this... + @event.listens_for(SomeMappedClass, "before_insert", propagate=True) + def my_listener_function(*arg): + pass + + # ... it's removed like this + event.remove(SomeMappedClass, "before_insert", my_listener_function) + + Above, the listener function associated with ``SomeMappedClass`` was also + propagated to subclasses of ``SomeMappedClass``; the :func:`.remove` + function will revert all of these operations. + + .. versionadded:: 0.9.0 + + .. note:: + + The :func:`.remove` function cannot be called at the same time + that the target event is being run. This has implications + for thread safety, and also means an event cannot be removed + from inside the listener function for itself. The list of + events to be run are present inside of a mutable collection + that can't be changed during iteration. + + Event registration and removal is not intended to be a "high + velocity" operation; it is a configurational operation. For + systems that need to quickly associate and deassociate with + events at high scale, use a mutable structure that is handled + from inside of a single listener. + + .. versionchanged:: 1.0.0 - a ``collections.deque()`` object is now + used as the container for the list of events, which explicitly + disallows collection mutation while the collection is being + iterated. + + .. seealso:: + + :func:`.listen` + + """ + _event_key(target, identifier, fn).remove() + + +def contains(target, identifier, fn): + """Return True if the given target/ident/fn is set up to listen. + + .. versionadded:: 0.9.0 + + """ + + return _event_key(target, identifier, fn).contains() diff --git a/app/lib/sqlalchemy/event/attr.py b/app/lib/sqlalchemy/event/attr.py new file mode 100644 index 0000000..84ef097 --- /dev/null +++ b/app/lib/sqlalchemy/event/attr.py @@ -0,0 +1,373 @@ +# event/attr.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Attribute implementation for _Dispatch classes. + +The various listener targets for a particular event class are represented +as attributes, which refer to collections of listeners to be fired off. +These collections can exist at the class level as well as at the instance +level. An event is fired off using code like this:: + + some_object.dispatch.first_connect(arg1, arg2) + +Above, ``some_object.dispatch`` would be an instance of ``_Dispatch`` and +``first_connect`` is typically an instance of ``_ListenerCollection`` +if event listeners are present, or ``_EmptyListener`` if none are present. + +The attribute mechanics here spend effort trying to ensure listener functions +are available with a minimum of function call overhead, that unnecessary +objects aren't created (i.e. many empty per-instance listener collections), +as well as that everything is garbage collectable when owning references are +lost. Other features such as "propagation" of listener functions across +many ``_Dispatch`` instances, "joining" of multiple ``_Dispatch`` instances, +as well as support for subclass propagation (e.g. events assigned to +``Pool`` vs. ``QueuePool``) are all implemented here. + +""" + +from __future__ import absolute_import, with_statement + +from .. import util +from ..util import threading +from . import registry +from . import legacy +from itertools import chain +import weakref +import collections + + +class RefCollection(util.MemoizedSlots): + __slots__ = 'ref', + + def _memoized_attr_ref(self): + return weakref.ref(self, registry._collection_gced) + + +class _ClsLevelDispatch(RefCollection): + """Class-level events on :class:`._Dispatch` classes.""" + + __slots__ = ('name', 'arg_names', 'has_kw', + 'legacy_signatures', '_clslevel', '__weakref__') + + def __init__(self, parent_dispatch_cls, fn): + self.name = fn.__name__ + argspec = util.inspect_getargspec(fn) + self.arg_names = argspec.args[1:] + self.has_kw = bool(argspec.keywords) + self.legacy_signatures = list(reversed( + sorted( + getattr(fn, '_legacy_signatures', []), + key=lambda s: s[0] + ) + )) + fn.__doc__ = legacy._augment_fn_docs(self, parent_dispatch_cls, fn) + + self._clslevel = weakref.WeakKeyDictionary() + + def _adjust_fn_spec(self, fn, named): + if named: + fn = self._wrap_fn_for_kw(fn) + if self.legacy_signatures: + try: + argspec = util.get_callable_argspec(fn, no_self=True) + except TypeError: + pass + else: + fn = legacy._wrap_fn_for_legacy(self, fn, argspec) + return fn + + def _wrap_fn_for_kw(self, fn): + def wrap_kw(*args, **kw): + argdict = dict(zip(self.arg_names, args)) + argdict.update(kw) + return fn(**argdict) + return wrap_kw + + def insert(self, event_key, propagate): + target = event_key.dispatch_target + assert isinstance(target, type), \ + "Class-level Event targets must be classes." + stack = [target] + while stack: + cls = stack.pop(0) + stack.extend(cls.__subclasses__()) + if cls is not target and cls not in self._clslevel: + self.update_subclass(cls) + else: + if cls not in self._clslevel: + self._clslevel[cls] = collections.deque() + self._clslevel[cls].appendleft(event_key._listen_fn) + registry._stored_in_collection(event_key, self) + + def append(self, event_key, propagate): + target = event_key.dispatch_target + assert isinstance(target, type), \ + "Class-level Event targets must be classes." + + stack = [target] + while stack: + cls = stack.pop(0) + stack.extend(cls.__subclasses__()) + if cls is not target and cls not in self._clslevel: + self.update_subclass(cls) + else: + if cls not in self._clslevel: + self._clslevel[cls] = collections.deque() + self._clslevel[cls].append(event_key._listen_fn) + registry._stored_in_collection(event_key, self) + + def update_subclass(self, target): + if target not in self._clslevel: + self._clslevel[target] = collections.deque() + clslevel = self._clslevel[target] + for cls in target.__mro__[1:]: + if cls in self._clslevel: + clslevel.extend([ + fn for fn + in self._clslevel[cls] + if fn not in clslevel + ]) + + def remove(self, event_key): + target = event_key.dispatch_target + stack = [target] + while stack: + cls = stack.pop(0) + stack.extend(cls.__subclasses__()) + if cls in self._clslevel: + self._clslevel[cls].remove(event_key._listen_fn) + registry._removed_from_collection(event_key, self) + + def clear(self): + """Clear all class level listeners""" + + to_clear = set() + for dispatcher in self._clslevel.values(): + to_clear.update(dispatcher) + dispatcher.clear() + registry._clear(self, to_clear) + + def for_modify(self, obj): + """Return an event collection which can be modified. + + For _ClsLevelDispatch at the class level of + a dispatcher, this returns self. + + """ + return self + + +class _InstanceLevelDispatch(RefCollection): + __slots__ = () + + def _adjust_fn_spec(self, fn, named): + return self.parent._adjust_fn_spec(fn, named) + + +class _EmptyListener(_InstanceLevelDispatch): + """Serves as a proxy interface to the events + served by a _ClsLevelDispatch, when there are no + instance-level events present. + + Is replaced by _ListenerCollection when instance-level + events are added. + + """ + + propagate = frozenset() + listeners = () + + __slots__ = 'parent', 'parent_listeners', 'name' + + def __init__(self, parent, target_cls): + if target_cls not in parent._clslevel: + parent.update_subclass(target_cls) + self.parent = parent # _ClsLevelDispatch + self.parent_listeners = parent._clslevel[target_cls] + self.name = parent.name + + def for_modify(self, obj): + """Return an event collection which can be modified. + + For _EmptyListener at the instance level of + a dispatcher, this generates a new + _ListenerCollection, applies it to the instance, + and returns it. + + """ + result = _ListenerCollection(self.parent, obj._instance_cls) + if getattr(obj, self.name) is self: + setattr(obj, self.name, result) + else: + assert isinstance(getattr(obj, self.name), _JoinedListener) + return result + + def _needs_modify(self, *args, **kw): + raise NotImplementedError("need to call for_modify()") + + exec_once = insert = append = remove = clear = _needs_modify + + def __call__(self, *args, **kw): + """Execute this event.""" + + for fn in self.parent_listeners: + fn(*args, **kw) + + def __len__(self): + return len(self.parent_listeners) + + def __iter__(self): + return iter(self.parent_listeners) + + def __bool__(self): + return bool(self.parent_listeners) + + __nonzero__ = __bool__ + + +class _CompoundListener(_InstanceLevelDispatch): + __slots__ = '_exec_once_mutex', '_exec_once' + + def _memoized_attr__exec_once_mutex(self): + return threading.Lock() + + def exec_once(self, *args, **kw): + """Execute this event, but only if it has not been + executed already for this collection.""" + + if not self._exec_once: + with self._exec_once_mutex: + if not self._exec_once: + try: + self(*args, **kw) + finally: + self._exec_once = True + + def __call__(self, *args, **kw): + """Execute this event.""" + + for fn in self.parent_listeners: + fn(*args, **kw) + for fn in self.listeners: + fn(*args, **kw) + + def __len__(self): + return len(self.parent_listeners) + len(self.listeners) + + def __iter__(self): + return chain(self.parent_listeners, self.listeners) + + def __bool__(self): + return bool(self.listeners or self.parent_listeners) + + __nonzero__ = __bool__ + + +class _ListenerCollection(_CompoundListener): + """Instance-level attributes on instances of :class:`._Dispatch`. + + Represents a collection of listeners. + + As of 0.7.9, _ListenerCollection is only first + created via the _EmptyListener.for_modify() method. + + """ + + __slots__ = ( + 'parent_listeners', 'parent', 'name', 'listeners', + 'propagate', '__weakref__') + + def __init__(self, parent, target_cls): + if target_cls not in parent._clslevel: + parent.update_subclass(target_cls) + self._exec_once = False + self.parent_listeners = parent._clslevel[target_cls] + self.parent = parent + self.name = parent.name + self.listeners = collections.deque() + self.propagate = set() + + def for_modify(self, obj): + """Return an event collection which can be modified. + + For _ListenerCollection at the instance level of + a dispatcher, this returns self. + + """ + return self + + def _update(self, other, only_propagate=True): + """Populate from the listeners in another :class:`_Dispatch` + object.""" + + existing_listeners = self.listeners + existing_listener_set = set(existing_listeners) + self.propagate.update(other.propagate) + other_listeners = [l for l + in other.listeners + if l not in existing_listener_set + and not only_propagate or l in self.propagate + ] + + existing_listeners.extend(other_listeners) + + to_associate = other.propagate.union(other_listeners) + registry._stored_in_collection_multi(self, other, to_associate) + + def insert(self, event_key, propagate): + if event_key.prepend_to_list(self, self.listeners): + if propagate: + self.propagate.add(event_key._listen_fn) + + def append(self, event_key, propagate): + if event_key.append_to_list(self, self.listeners): + if propagate: + self.propagate.add(event_key._listen_fn) + + def remove(self, event_key): + self.listeners.remove(event_key._listen_fn) + self.propagate.discard(event_key._listen_fn) + registry._removed_from_collection(event_key, self) + + def clear(self): + registry._clear(self, self.listeners) + self.propagate.clear() + self.listeners.clear() + + +class _JoinedListener(_CompoundListener): + __slots__ = 'parent', 'name', 'local', 'parent_listeners' + + def __init__(self, parent, name, local): + self._exec_once = False + self.parent = parent + self.name = name + self.local = local + self.parent_listeners = self.local + + @property + def listeners(self): + return getattr(self.parent, self.name) + + def _adjust_fn_spec(self, fn, named): + return self.local._adjust_fn_spec(fn, named) + + def for_modify(self, obj): + self.local = self.parent_listeners = self.local.for_modify(obj) + return self + + def insert(self, event_key, propagate): + self.local.insert(event_key, propagate) + + def append(self, event_key, propagate): + self.local.append(event_key, propagate) + + def remove(self, event_key): + self.local.remove(event_key) + + def clear(self): + raise NotImplementedError() diff --git a/app/lib/sqlalchemy/event/base.py b/app/lib/sqlalchemy/event/base.py new file mode 100644 index 0000000..82ef6a1 --- /dev/null +++ b/app/lib/sqlalchemy/event/base.py @@ -0,0 +1,289 @@ +# event/base.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Base implementation classes. + +The public-facing ``Events`` serves as the base class for an event interface; +its public attributes represent different kinds of events. These attributes +are mirrored onto a ``_Dispatch`` class, which serves as a container for +collections of listener functions. These collections are represented both +at the class level of a particular ``_Dispatch`` class as well as within +instances of ``_Dispatch``. + +""" +from __future__ import absolute_import + +import weakref + +from .. import util +from .attr import _JoinedListener, \ + _EmptyListener, _ClsLevelDispatch + +_registrars = util.defaultdict(list) + + +def _is_event_name(name): + return not name.startswith('_') and name != 'dispatch' + + +class _UnpickleDispatch(object): + """Serializable callable that re-generates an instance of + :class:`_Dispatch` given a particular :class:`.Events` subclass. + + """ + + def __call__(self, _instance_cls): + for cls in _instance_cls.__mro__: + if 'dispatch' in cls.__dict__: + return cls.__dict__['dispatch'].\ + dispatch_cls._for_class(_instance_cls) + else: + raise AttributeError("No class with a 'dispatch' member present.") + + +class _Dispatch(object): + """Mirror the event listening definitions of an Events class with + listener collections. + + Classes which define a "dispatch" member will return a + non-instantiated :class:`._Dispatch` subclass when the member + is accessed at the class level. When the "dispatch" member is + accessed at the instance level of its owner, an instance + of the :class:`._Dispatch` class is returned. + + A :class:`._Dispatch` class is generated for each :class:`.Events` + class defined, by the :func:`._create_dispatcher_class` function. + The original :class:`.Events` classes remain untouched. + This decouples the construction of :class:`.Events` subclasses from + the implementation used by the event internals, and allows + inspecting tools like Sphinx to work in an unsurprising + way against the public API. + + """ + + # in one ORM edge case, an attribute is added to _Dispatch, + # so __dict__ is used in just that case and potentially others. + __slots__ = '_parent', '_instance_cls', '__dict__', '_empty_listeners' + + _empty_listener_reg = weakref.WeakKeyDictionary() + + def __init__(self, parent, instance_cls=None): + self._parent = parent + self._instance_cls = instance_cls + if instance_cls: + try: + self._empty_listeners = self._empty_listener_reg[instance_cls] + except KeyError: + self._empty_listeners = \ + self._empty_listener_reg[instance_cls] = dict( + (ls.name, _EmptyListener(ls, instance_cls)) + for ls in parent._event_descriptors + ) + else: + self._empty_listeners = {} + + def __getattr__(self, name): + # assign EmptyListeners as attributes on demand + # to reduce startup time for new dispatch objects + try: + ls = self._empty_listeners[name] + except KeyError: + raise AttributeError(name) + else: + setattr(self, ls.name, ls) + return ls + + @property + def _event_descriptors(self): + for k in self._event_names: + yield getattr(self, k) + + def _for_class(self, instance_cls): + return self.__class__(self, instance_cls) + + def _for_instance(self, instance): + instance_cls = instance.__class__ + return self._for_class(instance_cls) + + @property + def _listen(self): + return self._events._listen + + def _join(self, other): + """Create a 'join' of this :class:`._Dispatch` and another. + + This new dispatcher will dispatch events to both + :class:`._Dispatch` objects. + + """ + if '_joined_dispatch_cls' not in self.__class__.__dict__: + cls = type( + "Joined%s" % self.__class__.__name__, + (_JoinedDispatcher, ), {'__slots__': self._event_names} + ) + + self.__class__._joined_dispatch_cls = cls + return self._joined_dispatch_cls(self, other) + + def __reduce__(self): + return _UnpickleDispatch(), (self._instance_cls, ) + + def _update(self, other, only_propagate=True): + """Populate from the listeners in another :class:`_Dispatch` + object.""" + for ls in other._event_descriptors: + if isinstance(ls, _EmptyListener): + continue + getattr(self, ls.name).\ + for_modify(self)._update(ls, only_propagate=only_propagate) + + def _clear(self): + for ls in self._event_descriptors: + ls.for_modify(self).clear() + + +class _EventMeta(type): + """Intercept new Event subclasses and create + associated _Dispatch classes.""" + + def __init__(cls, classname, bases, dict_): + _create_dispatcher_class(cls, classname, bases, dict_) + return type.__init__(cls, classname, bases, dict_) + + +def _create_dispatcher_class(cls, classname, bases, dict_): + """Create a :class:`._Dispatch` class corresponding to an + :class:`.Events` class.""" + + # there's all kinds of ways to do this, + # i.e. make a Dispatch class that shares the '_listen' method + # of the Event class, this is the straight monkeypatch. + if hasattr(cls, 'dispatch'): + dispatch_base = cls.dispatch.__class__ + else: + dispatch_base = _Dispatch + + event_names = [k for k in dict_ if _is_event_name(k)] + dispatch_cls = type("%sDispatch" % classname, + (dispatch_base, ), {'__slots__': event_names}) + + dispatch_cls._event_names = event_names + + dispatch_inst = cls._set_dispatch(cls, dispatch_cls) + for k in dispatch_cls._event_names: + setattr(dispatch_inst, k, _ClsLevelDispatch(cls, dict_[k])) + _registrars[k].append(cls) + + for super_ in dispatch_cls.__bases__: + if issubclass(super_, _Dispatch) and super_ is not _Dispatch: + for ls in super_._events.dispatch._event_descriptors: + setattr(dispatch_inst, ls.name, ls) + dispatch_cls._event_names.append(ls.name) + + if getattr(cls, '_dispatch_target', None): + cls._dispatch_target.dispatch = dispatcher(cls) + + +def _remove_dispatcher(cls): + for k in cls.dispatch._event_names: + _registrars[k].remove(cls) + if not _registrars[k]: + del _registrars[k] + + +class Events(util.with_metaclass(_EventMeta, object)): + """Define event listening functions for a particular target type.""" + + @staticmethod + def _set_dispatch(cls, dispatch_cls): + # this allows an Events subclass to define additional utility + # methods made available to the target via + # "self.dispatch._events." + # @staticemethod to allow easy "super" calls while in a metaclass + # constructor. + cls.dispatch = dispatch_cls(None) + dispatch_cls._events = cls + return cls.dispatch + + @classmethod + def _accept_with(cls, target): + # Mapper, ClassManager, Session override this to + # also accept classes, scoped_sessions, sessionmakers, etc. + if hasattr(target, 'dispatch') and ( + + isinstance(target.dispatch, cls.dispatch.__class__) or + + + ( + isinstance(target.dispatch, type) and + isinstance(target.dispatch, cls.dispatch.__class__) + ) or + + ( + isinstance(target.dispatch, _JoinedDispatcher) and + isinstance(target.dispatch.parent, cls.dispatch.__class__) + ) + + + ): + return target + else: + return None + + @classmethod + def _listen(cls, event_key, propagate=False, insert=False, named=False): + event_key.base_listen(propagate=propagate, insert=insert, named=named) + + @classmethod + def _remove(cls, event_key): + event_key.remove() + + @classmethod + def _clear(cls): + cls.dispatch._clear() + + +class _JoinedDispatcher(object): + """Represent a connection between two _Dispatch objects.""" + + __slots__ = 'local', 'parent', '_instance_cls' + + def __init__(self, local, parent): + self.local = local + self.parent = parent + self._instance_cls = self.local._instance_cls + + def __getattr__(self, name): + # assign _JoinedListeners as attributes on demand + # to reduce startup time for new dispatch objects + ls = getattr(self.local, name) + jl = _JoinedListener(self.parent, ls.name, ls) + setattr(self, ls.name, jl) + return jl + + @property + def _listen(self): + return self.parent._listen + + +class dispatcher(object): + """Descriptor used by target classes to + deliver the _Dispatch class at the class level + and produce new _Dispatch instances for target + instances. + + """ + + def __init__(self, events): + self.dispatch_cls = events.dispatch + self.events = events + + def __get__(self, obj, cls): + if obj is None: + return self.dispatch_cls + obj.__dict__['dispatch'] = disp = self.dispatch_cls._for_instance(obj) + return disp diff --git a/app/lib/sqlalchemy/event/legacy.py b/app/lib/sqlalchemy/event/legacy.py new file mode 100644 index 0000000..1063606 --- /dev/null +++ b/app/lib/sqlalchemy/event/legacy.py @@ -0,0 +1,169 @@ +# event/legacy.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Routines to handle adaption of legacy call signatures, +generation of deprecation notes and docstrings. + +""" + +from .. import util + + +def _legacy_signature(since, argnames, converter=None): + def leg(fn): + if not hasattr(fn, '_legacy_signatures'): + fn._legacy_signatures = [] + fn._legacy_signatures.append((since, argnames, converter)) + return fn + return leg + + +def _wrap_fn_for_legacy(dispatch_collection, fn, argspec): + for since, argnames, conv in dispatch_collection.legacy_signatures: + if argnames[-1] == "**kw": + has_kw = True + argnames = argnames[0:-1] + else: + has_kw = False + + if len(argnames) == len(argspec.args) \ + and has_kw is bool(argspec.keywords): + + if conv: + assert not has_kw + + def wrap_leg(*args): + return fn(*conv(*args)) + else: + def wrap_leg(*args, **kw): + argdict = dict(zip(dispatch_collection.arg_names, args)) + args = [argdict[name] for name in argnames] + if has_kw: + return fn(*args, **kw) + else: + return fn(*args) + return wrap_leg + else: + return fn + + +def _indent(text, indent): + return "\n".join( + indent + line + for line in text.split("\n") + ) + + +def _standard_listen_example(dispatch_collection, sample_target, fn): + example_kw_arg = _indent( + "\n".join( + "%(arg)s = kw['%(arg)s']" % {"arg": arg} + for arg in dispatch_collection.arg_names[0:2] + ), + " ") + if dispatch_collection.legacy_signatures: + current_since = max(since for since, args, conv + in dispatch_collection.legacy_signatures) + else: + current_since = None + text = ( + "from sqlalchemy import event\n\n" + "# standard decorator style%(current_since)s\n" + "@event.listens_for(%(sample_target)s, '%(event_name)s')\n" + "def receive_%(event_name)s(" + "%(named_event_arguments)s%(has_kw_arguments)s):\n" + " \"listen for the '%(event_name)s' event\"\n" + "\n # ... (event handling logic) ...\n" + ) + + if len(dispatch_collection.arg_names) > 3: + text += ( + + "\n# named argument style (new in 0.9)\n" + "@event.listens_for(" + "%(sample_target)s, '%(event_name)s', named=True)\n" + "def receive_%(event_name)s(**kw):\n" + " \"listen for the '%(event_name)s' event\"\n" + "%(example_kw_arg)s\n" + "\n # ... (event handling logic) ...\n" + ) + + text %= { + "current_since": " (arguments as of %s)" % + current_since if current_since else "", + "event_name": fn.__name__, + "has_kw_arguments": ", **kw" if dispatch_collection.has_kw else "", + "named_event_arguments": ", ".join(dispatch_collection.arg_names), + "example_kw_arg": example_kw_arg, + "sample_target": sample_target + } + return text + + +def _legacy_listen_examples(dispatch_collection, sample_target, fn): + text = "" + for since, args, conv in dispatch_collection.legacy_signatures: + text += ( + "\n# legacy calling style (pre-%(since)s)\n" + "@event.listens_for(%(sample_target)s, '%(event_name)s')\n" + "def receive_%(event_name)s(" + "%(named_event_arguments)s%(has_kw_arguments)s):\n" + " \"listen for the '%(event_name)s' event\"\n" + "\n # ... (event handling logic) ...\n" % { + "since": since, + "event_name": fn.__name__, + "has_kw_arguments": " **kw" + if dispatch_collection.has_kw else "", + "named_event_arguments": ", ".join(args), + "sample_target": sample_target + } + ) + return text + + +def _version_signature_changes(dispatch_collection): + since, args, conv = dispatch_collection.legacy_signatures[0] + return ( + "\n.. versionchanged:: %(since)s\n" + " The ``%(event_name)s`` event now accepts the \n" + " arguments ``%(named_event_arguments)s%(has_kw_arguments)s``.\n" + " Listener functions which accept the previous argument \n" + " signature(s) listed above will be automatically \n" + " adapted to the new signature." % { + "since": since, + "event_name": dispatch_collection.name, + "named_event_arguments": ", ".join(dispatch_collection.arg_names), + "has_kw_arguments": ", **kw" if dispatch_collection.has_kw else "" + } + ) + + +def _augment_fn_docs(dispatch_collection, parent_dispatch_cls, fn): + header = ".. container:: event_signatures\n\n"\ + " Example argument forms::\n"\ + "\n" + + sample_target = getattr(parent_dispatch_cls, "_target_class_doc", "obj") + text = ( + header + + _indent( + _standard_listen_example( + dispatch_collection, sample_target, fn), + " " * 8) + ) + if dispatch_collection.legacy_signatures: + text += _indent( + _legacy_listen_examples( + dispatch_collection, sample_target, fn), + " " * 8) + + text += _version_signature_changes(dispatch_collection) + + return util.inject_docstring_text(fn.__doc__, + text, + 1 + ) diff --git a/app/lib/sqlalchemy/event/registry.py b/app/lib/sqlalchemy/event/registry.py new file mode 100644 index 0000000..acccadf --- /dev/null +++ b/app/lib/sqlalchemy/event/registry.py @@ -0,0 +1,262 @@ +# event/registry.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Provides managed registration services on behalf of :func:`.listen` +arguments. + +By "managed registration", we mean that event listening functions and +other objects can be added to various collections in such a way that their +membership in all those collections can be revoked at once, based on +an equivalent :class:`._EventKey`. + +""" + +from __future__ import absolute_import + +import weakref +import collections +import types +from .. import exc, util + + +_key_to_collection = collections.defaultdict(dict) +""" +Given an original listen() argument, can locate all +listener collections and the listener fn contained + +(target, identifier, fn) -> { + ref(listenercollection) -> ref(listener_fn) + ref(listenercollection) -> ref(listener_fn) + ref(listenercollection) -> ref(listener_fn) + } +""" + +_collection_to_key = collections.defaultdict(dict) +""" +Given a _ListenerCollection or _ClsLevelListener, can locate +all the original listen() arguments and the listener fn contained + +ref(listenercollection) -> { + ref(listener_fn) -> (target, identifier, fn), + ref(listener_fn) -> (target, identifier, fn), + ref(listener_fn) -> (target, identifier, fn), + } +""" + + +def _collection_gced(ref): + # defaultdict, so can't get a KeyError + if not _collection_to_key or ref not in _collection_to_key: + return + listener_to_key = _collection_to_key.pop(ref) + for key in listener_to_key.values(): + if key in _key_to_collection: + # defaultdict, so can't get a KeyError + dispatch_reg = _key_to_collection[key] + dispatch_reg.pop(ref) + if not dispatch_reg: + _key_to_collection.pop(key) + + +def _stored_in_collection(event_key, owner): + key = event_key._key + + dispatch_reg = _key_to_collection[key] + + owner_ref = owner.ref + listen_ref = weakref.ref(event_key._listen_fn) + + if owner_ref in dispatch_reg: + return False + + dispatch_reg[owner_ref] = listen_ref + + listener_to_key = _collection_to_key[owner_ref] + listener_to_key[listen_ref] = key + + return True + + +def _removed_from_collection(event_key, owner): + key = event_key._key + + dispatch_reg = _key_to_collection[key] + + listen_ref = weakref.ref(event_key._listen_fn) + + owner_ref = owner.ref + dispatch_reg.pop(owner_ref, None) + if not dispatch_reg: + del _key_to_collection[key] + + if owner_ref in _collection_to_key: + listener_to_key = _collection_to_key[owner_ref] + listener_to_key.pop(listen_ref) + + +def _stored_in_collection_multi(newowner, oldowner, elements): + if not elements: + return + + oldowner = oldowner.ref + newowner = newowner.ref + + old_listener_to_key = _collection_to_key[oldowner] + new_listener_to_key = _collection_to_key[newowner] + + for listen_fn in elements: + listen_ref = weakref.ref(listen_fn) + key = old_listener_to_key[listen_ref] + dispatch_reg = _key_to_collection[key] + if newowner in dispatch_reg: + assert dispatch_reg[newowner] == listen_ref + else: + dispatch_reg[newowner] = listen_ref + + new_listener_to_key[listen_ref] = key + + +def _clear(owner, elements): + if not elements: + return + + owner = owner.ref + listener_to_key = _collection_to_key[owner] + for listen_fn in elements: + listen_ref = weakref.ref(listen_fn) + key = listener_to_key[listen_ref] + dispatch_reg = _key_to_collection[key] + dispatch_reg.pop(owner, None) + + if not dispatch_reg: + del _key_to_collection[key] + + +class _EventKey(object): + """Represent :func:`.listen` arguments. + """ + + __slots__ = ( + 'target', 'identifier', 'fn', 'fn_key', 'fn_wrap', 'dispatch_target' + ) + + def __init__(self, target, identifier, + fn, dispatch_target, _fn_wrap=None): + self.target = target + self.identifier = identifier + self.fn = fn + if isinstance(fn, types.MethodType): + self.fn_key = id(fn.__func__), id(fn.__self__) + else: + self.fn_key = id(fn) + self.fn_wrap = _fn_wrap + self.dispatch_target = dispatch_target + + @property + def _key(self): + return (id(self.target), self.identifier, self.fn_key) + + def with_wrapper(self, fn_wrap): + if fn_wrap is self._listen_fn: + return self + else: + return _EventKey( + self.target, + self.identifier, + self.fn, + self.dispatch_target, + _fn_wrap=fn_wrap + ) + + def with_dispatch_target(self, dispatch_target): + if dispatch_target is self.dispatch_target: + return self + else: + return _EventKey( + self.target, + self.identifier, + self.fn, + dispatch_target, + _fn_wrap=self.fn_wrap + ) + + def listen(self, *args, **kw): + once = kw.pop("once", False) + named = kw.pop("named", False) + + target, identifier, fn = \ + self.dispatch_target, self.identifier, self._listen_fn + + dispatch_collection = getattr(target.dispatch, identifier) + + adjusted_fn = dispatch_collection._adjust_fn_spec(fn, named) + + self = self.with_wrapper(adjusted_fn) + + if once: + self.with_wrapper( + util.only_once(self._listen_fn)).listen(*args, **kw) + else: + self.dispatch_target.dispatch._listen(self, *args, **kw) + + def remove(self): + key = self._key + + if key not in _key_to_collection: + raise exc.InvalidRequestError( + "No listeners found for event %s / %r / %s " % + (self.target, self.identifier, self.fn) + ) + dispatch_reg = _key_to_collection.pop(key) + + for collection_ref, listener_ref in dispatch_reg.items(): + collection = collection_ref() + listener_fn = listener_ref() + if collection is not None and listener_fn is not None: + collection.remove(self.with_wrapper(listener_fn)) + + def contains(self): + """Return True if this event key is registered to listen. + """ + return self._key in _key_to_collection + + def base_listen(self, propagate=False, insert=False, + named=False): + + target, identifier, fn = \ + self.dispatch_target, self.identifier, self._listen_fn + + dispatch_collection = getattr(target.dispatch, identifier) + + if insert: + dispatch_collection.\ + for_modify(target.dispatch).insert(self, propagate) + else: + dispatch_collection.\ + for_modify(target.dispatch).append(self, propagate) + + @property + def _listen_fn(self): + return self.fn_wrap or self.fn + + def append_to_list(self, owner, list_): + if _stored_in_collection(self, owner): + list_.append(self._listen_fn) + return True + else: + return False + + def remove_from_list(self, owner, list_): + _removed_from_collection(self, owner) + list_.remove(self._listen_fn) + + def prepend_to_list(self, owner, list_): + if _stored_in_collection(self, owner): + list_.appendleft(self._listen_fn) + return True + else: + return False diff --git a/app/lib/sqlalchemy/events.py b/app/lib/sqlalchemy/events.py new file mode 100644 index 0000000..7aa3001 --- /dev/null +++ b/app/lib/sqlalchemy/events.py @@ -0,0 +1,1173 @@ +# sqlalchemy/events.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Core event interfaces.""" + +from . import event, exc +from .pool import Pool +from .engine import Connectable, Engine, Dialect +from .sql.base import SchemaEventTarget + + +class DDLEvents(event.Events): + """ + Define event listeners for schema objects, + that is, :class:`.SchemaItem` and other :class:`.SchemaEventTarget` + subclasses, including :class:`.MetaData`, :class:`.Table`, + :class:`.Column`. + + :class:`.MetaData` and :class:`.Table` support events + specifically regarding when CREATE and DROP + DDL is emitted to the database. + + Attachment events are also provided to customize + behavior whenever a child schema element is associated + with a parent, such as, when a :class:`.Column` is associated + with its :class:`.Table`, when a :class:`.ForeignKeyConstraint` + is associated with a :class:`.Table`, etc. + + Example using the ``after_create`` event:: + + from sqlalchemy import event + from sqlalchemy import Table, Column, Metadata, Integer + + m = MetaData() + some_table = Table('some_table', m, Column('data', Integer)) + + def after_create(target, connection, **kw): + connection.execute("ALTER TABLE %s SET name=foo_%s" % + (target.name, target.name)) + + event.listen(some_table, "after_create", after_create) + + DDL events integrate closely with the + :class:`.DDL` class and the :class:`.DDLElement` hierarchy + of DDL clause constructs, which are themselves appropriate + as listener callables:: + + from sqlalchemy import DDL + event.listen( + some_table, + "after_create", + DDL("ALTER TABLE %(table)s SET name=foo_%(table)s") + ) + + The methods here define the name of an event as well + as the names of members that are passed to listener + functions. + + See also: + + :ref:`event_toplevel` + + :class:`.DDLElement` + + :class:`.DDL` + + :ref:`schema_ddl_sequences` + + """ + + _target_class_doc = "SomeSchemaClassOrObject" + _dispatch_target = SchemaEventTarget + + def before_create(self, target, connection, **kw): + r"""Called before CREATE statements are emitted. + + :param target: the :class:`.MetaData` or :class:`.Table` + object which is the target of the event. + :param connection: the :class:`.Connection` where the + CREATE statement or statements will be emitted. + :param \**kw: additional keyword arguments relevant + to the event. The contents of this dictionary + may vary across releases, and include the + list of tables being generated for a metadata-level + event, the checkfirst flag, and other + elements used by internal events. + + """ + + def after_create(self, target, connection, **kw): + r"""Called after CREATE statements are emitted. + + :param target: the :class:`.MetaData` or :class:`.Table` + object which is the target of the event. + :param connection: the :class:`.Connection` where the + CREATE statement or statements have been emitted. + :param \**kw: additional keyword arguments relevant + to the event. The contents of this dictionary + may vary across releases, and include the + list of tables being generated for a metadata-level + event, the checkfirst flag, and other + elements used by internal events. + + """ + + def before_drop(self, target, connection, **kw): + r"""Called before DROP statements are emitted. + + :param target: the :class:`.MetaData` or :class:`.Table` + object which is the target of the event. + :param connection: the :class:`.Connection` where the + DROP statement or statements will be emitted. + :param \**kw: additional keyword arguments relevant + to the event. The contents of this dictionary + may vary across releases, and include the + list of tables being generated for a metadata-level + event, the checkfirst flag, and other + elements used by internal events. + + """ + + def after_drop(self, target, connection, **kw): + r"""Called after DROP statements are emitted. + + :param target: the :class:`.MetaData` or :class:`.Table` + object which is the target of the event. + :param connection: the :class:`.Connection` where the + DROP statement or statements have been emitted. + :param \**kw: additional keyword arguments relevant + to the event. The contents of this dictionary + may vary across releases, and include the + list of tables being generated for a metadata-level + event, the checkfirst flag, and other + elements used by internal events. + + """ + + def before_parent_attach(self, target, parent): + """Called before a :class:`.SchemaItem` is associated with + a parent :class:`.SchemaItem`. + + :param target: the target object + :param parent: the parent to which the target is being attached. + + :func:`.event.listen` also accepts a modifier for this event: + + :param propagate=False: When True, the listener function will + be established for any copies made of the target object, + i.e. those copies that are generated when + :meth:`.Table.tometadata` is used. + + """ + + def after_parent_attach(self, target, parent): + """Called after a :class:`.SchemaItem` is associated with + a parent :class:`.SchemaItem`. + + :param target: the target object + :param parent: the parent to which the target is being attached. + + :func:`.event.listen` also accepts a modifier for this event: + + :param propagate=False: When True, the listener function will + be established for any copies made of the target object, + i.e. those copies that are generated when + :meth:`.Table.tometadata` is used. + + """ + + def column_reflect(self, inspector, table, column_info): + """Called for each unit of 'column info' retrieved when + a :class:`.Table` is being reflected. + + The dictionary of column information as returned by the + dialect is passed, and can be modified. The dictionary + is that returned in each element of the list returned + by :meth:`.reflection.Inspector.get_columns`: + + * ``name`` - the column's name + + * ``type`` - the type of this column, which should be an instance + of :class:`~sqlalchemy.types.TypeEngine` + + * ``nullable`` - boolean flag if the column is NULL or NOT NULL + + * ``default`` - the column's server default value. This is + normally specified as a plain string SQL expression, however the + event can pass a :class:`.FetchedValue`, :class:`.DefaultClause`, + or :func:`.sql.expression.text` object as well. + + .. versionchanged:: 1.1.6 + + The :meth:`.DDLEvents.column_reflect` event allows a non + string :class:`.FetchedValue`, + :func:`.sql.expression.text`, or derived object to be + specified as the value of ``default`` in the column + dictionary. + + * ``attrs`` - dict containing optional column attributes + + The event is called before any action is taken against + this dictionary, and the contents can be modified. + The :class:`.Column` specific arguments ``info``, ``key``, + and ``quote`` can also be added to the dictionary and + will be passed to the constructor of :class:`.Column`. + + Note that this event is only meaningful if either + associated with the :class:`.Table` class across the + board, e.g.:: + + from sqlalchemy.schema import Table + from sqlalchemy import event + + def listen_for_reflect(inspector, table, column_info): + "receive a column_reflect event" + # ... + + event.listen( + Table, + 'column_reflect', + listen_for_reflect) + + ...or with a specific :class:`.Table` instance using + the ``listeners`` argument:: + + def listen_for_reflect(inspector, table, column_info): + "receive a column_reflect event" + # ... + + t = Table( + 'sometable', + autoload=True, + listeners=[ + ('column_reflect', listen_for_reflect) + ]) + + This because the reflection process initiated by ``autoload=True`` + completes within the scope of the constructor for :class:`.Table`. + + """ + + +class PoolEvents(event.Events): + """Available events for :class:`.Pool`. + + The methods here define the name of an event as well + as the names of members that are passed to listener + functions. + + e.g.:: + + from sqlalchemy import event + + def my_on_checkout(dbapi_conn, connection_rec, connection_proxy): + "handle an on checkout event" + + event.listen(Pool, 'checkout', my_on_checkout) + + In addition to accepting the :class:`.Pool` class and + :class:`.Pool` instances, :class:`.PoolEvents` also accepts + :class:`.Engine` objects and the :class:`.Engine` class as + targets, which will be resolved to the ``.pool`` attribute of the + given engine or the :class:`.Pool` class:: + + engine = create_engine("postgresql://scott:tiger@localhost/test") + + # will associate with engine.pool + event.listen(engine, 'checkout', my_on_checkout) + + """ + + _target_class_doc = "SomeEngineOrPool" + _dispatch_target = Pool + + @classmethod + def _accept_with(cls, target): + if isinstance(target, type): + if issubclass(target, Engine): + return Pool + elif issubclass(target, Pool): + return target + elif isinstance(target, Engine): + return target.pool + else: + return target + + def connect(self, dbapi_connection, connection_record): + """Called at the moment a particular DBAPI connection is first + created for a given :class:`.Pool`. + + This event allows one to capture the point directly after which + the DBAPI module-level ``.connect()`` method has been used in order + to produce a new DBAPI connection. + + :param dbapi_connection: a DBAPI connection. + + :param connection_record: the :class:`._ConnectionRecord` managing the + DBAPI connection. + + """ + + def first_connect(self, dbapi_connection, connection_record): + """Called exactly once for the first time a DBAPI connection is + checked out from a particular :class:`.Pool`. + + The rationale for :meth:`.PoolEvents.first_connect` is to determine + information about a particular series of database connections based + on the settings used for all connections. Since a particular + :class:`.Pool` refers to a single "creator" function (which in terms + of a :class:`.Engine` refers to the URL and connection options used), + it is typically valid to make observations about a single connection + that can be safely assumed to be valid about all subsequent + connections, such as the database version, the server and client + encoding settings, collation settings, and many others. + + :param dbapi_connection: a DBAPI connection. + + :param connection_record: the :class:`._ConnectionRecord` managing the + DBAPI connection. + + """ + + def checkout(self, dbapi_connection, connection_record, connection_proxy): + """Called when a connection is retrieved from the Pool. + + :param dbapi_connection: a DBAPI connection. + + :param connection_record: the :class:`._ConnectionRecord` managing the + DBAPI connection. + + :param connection_proxy: the :class:`._ConnectionFairy` object which + will proxy the public interface of the DBAPI connection for the + lifespan of the checkout. + + If you raise a :class:`~sqlalchemy.exc.DisconnectionError`, the current + connection will be disposed and a fresh connection retrieved. + Processing of all checkout listeners will abort and restart + using the new connection. + + .. seealso:: :meth:`.ConnectionEvents.engine_connect` - a similar event + which occurs upon creation of a new :class:`.Connection`. + + """ + + def checkin(self, dbapi_connection, connection_record): + """Called when a connection returns to the pool. + + Note that the connection may be closed, and may be None if the + connection has been invalidated. ``checkin`` will not be called + for detached connections. (They do not return to the pool.) + + :param dbapi_connection: a DBAPI connection. + + :param connection_record: the :class:`._ConnectionRecord` managing the + DBAPI connection. + + """ + + def reset(self, dbapi_connection, connection_record): + """Called before the "reset" action occurs for a pooled connection. + + This event represents + when the ``rollback()`` method is called on the DBAPI connection + before it is returned to the pool. The behavior of "reset" can + be controlled, including disabled, using the ``reset_on_return`` + pool argument. + + + The :meth:`.PoolEvents.reset` event is usually followed by the + :meth:`.PoolEvents.checkin` event is called, except in those + cases where the connection is discarded immediately after reset. + + :param dbapi_connection: a DBAPI connection. + + :param connection_record: the :class:`._ConnectionRecord` managing the + DBAPI connection. + + .. versionadded:: 0.8 + + .. seealso:: + + :meth:`.ConnectionEvents.rollback` + + :meth:`.ConnectionEvents.commit` + + """ + + def invalidate(self, dbapi_connection, connection_record, exception): + """Called when a DBAPI connection is to be "invalidated". + + This event is called any time the :meth:`._ConnectionRecord.invalidate` + method is invoked, either from API usage or via "auto-invalidation", + without the ``soft`` flag. + + The event occurs before a final attempt to call ``.close()`` on the + connection occurs. + + :param dbapi_connection: a DBAPI connection. + + :param connection_record: the :class:`._ConnectionRecord` managing the + DBAPI connection. + + :param exception: the exception object corresponding to the reason + for this invalidation, if any. May be ``None``. + + .. versionadded:: 0.9.2 Added support for connection invalidation + listening. + + .. seealso:: + + :ref:`pool_connection_invalidation` + + """ + + def soft_invalidate(self, dbapi_connection, connection_record, exception): + """Called when a DBAPI connection is to be "soft invalidated". + + This event is called any time the :meth:`._ConnectionRecord.invalidate` + method is invoked with the ``soft`` flag. + + Soft invalidation refers to when the connection record that tracks + this connection will force a reconnect after the current connection + is checked in. It does not actively close the dbapi_connection + at the point at which it is called. + + .. versionadded:: 1.0.3 + + """ + + def close(self, dbapi_connection, connection_record): + """Called when a DBAPI connection is closed. + + The event is emitted before the close occurs. + + The close of a connection can fail; typically this is because + the connection is already closed. If the close operation fails, + the connection is discarded. + + The :meth:`.close` event corresponds to a connection that's still + associated with the pool. To intercept close events for detached + connections use :meth:`.close_detached`. + + .. versionadded:: 1.1 + + """ + + def detach(self, dbapi_connection, connection_record): + """Called when a DBAPI connection is "detached" from a pool. + + This event is emitted after the detach occurs. The connection + is no longer associated with the given connection record. + + .. versionadded:: 1.1 + + """ + + def close_detached(self, dbapi_connection): + """Called when a detached DBAPI connection is closed. + + The event is emitted before the close occurs. + + The close of a connection can fail; typically this is because + the connection is already closed. If the close operation fails, + the connection is discarded. + + .. versionadded:: 1.1 + + """ + + +class ConnectionEvents(event.Events): + """Available events for :class:`.Connectable`, which includes + :class:`.Connection` and :class:`.Engine`. + + The methods here define the name of an event as well as the names of + members that are passed to listener functions. + + An event listener can be associated with any :class:`.Connectable` + class or instance, such as an :class:`.Engine`, e.g.:: + + from sqlalchemy import event, create_engine + + def before_cursor_execute(conn, cursor, statement, parameters, context, + executemany): + log.info("Received statement: %s", statement) + + engine = create_engine('postgresql://scott:tiger@localhost/test') + event.listen(engine, "before_cursor_execute", before_cursor_execute) + + or with a specific :class:`.Connection`:: + + with engine.begin() as conn: + @event.listens_for(conn, 'before_cursor_execute') + def before_cursor_execute(conn, cursor, statement, parameters, + context, executemany): + log.info("Received statement: %s", statement) + + When the methods are called with a `statement` parameter, such as in + :meth:`.after_cursor_execute`, :meth:`.before_cursor_execute` and + :meth:`.dbapi_error`, the statement is the exact SQL string that was + prepared for transmission to the DBAPI ``cursor`` in the connection's + :class:`.Dialect`. + + The :meth:`.before_execute` and :meth:`.before_cursor_execute` + events can also be established with the ``retval=True`` flag, which + allows modification of the statement and parameters to be sent + to the database. The :meth:`.before_cursor_execute` event is + particularly useful here to add ad-hoc string transformations, such + as comments, to all executions:: + + from sqlalchemy.engine import Engine + from sqlalchemy import event + + @event.listens_for(Engine, "before_cursor_execute", retval=True) + def comment_sql_calls(conn, cursor, statement, parameters, + context, executemany): + statement = statement + " -- some comment" + return statement, parameters + + .. note:: :class:`.ConnectionEvents` can be established on any + combination of :class:`.Engine`, :class:`.Connection`, as well + as instances of each of those classes. Events across all + four scopes will fire off for a given instance of + :class:`.Connection`. However, for performance reasons, the + :class:`.Connection` object determines at instantiation time + whether or not its parent :class:`.Engine` has event listeners + established. Event listeners added to the :class:`.Engine` + class or to an instance of :class:`.Engine` *after* the instantiation + of a dependent :class:`.Connection` instance will usually + *not* be available on that :class:`.Connection` instance. The newly + added listeners will instead take effect for :class:`.Connection` + instances created subsequent to those event listeners being + established on the parent :class:`.Engine` class or instance. + + :param retval=False: Applies to the :meth:`.before_execute` and + :meth:`.before_cursor_execute` events only. When True, the + user-defined event function must have a return value, which + is a tuple of parameters that replace the given statement + and parameters. See those methods for a description of + specific return arguments. + + .. versionchanged:: 0.8 :class:`.ConnectionEvents` can now be associated + with any :class:`.Connectable` including :class:`.Connection`, + in addition to the existing support for :class:`.Engine`. + + """ + + _target_class_doc = "SomeEngine" + _dispatch_target = Connectable + + @classmethod + def _listen(cls, event_key, retval=False): + target, identifier, fn = \ + event_key.dispatch_target, event_key.identifier, \ + event_key._listen_fn + + target._has_events = True + + if not retval: + if identifier == 'before_execute': + orig_fn = fn + + def wrap_before_execute(conn, clauseelement, + multiparams, params): + orig_fn(conn, clauseelement, multiparams, params) + return clauseelement, multiparams, params + fn = wrap_before_execute + elif identifier == 'before_cursor_execute': + orig_fn = fn + + def wrap_before_cursor_execute(conn, cursor, statement, + parameters, context, + executemany): + orig_fn(conn, cursor, statement, + parameters, context, executemany) + return statement, parameters + fn = wrap_before_cursor_execute + elif retval and \ + identifier not in ('before_execute', + 'before_cursor_execute', 'handle_error'): + raise exc.ArgumentError( + "Only the 'before_execute', " + "'before_cursor_execute' and 'handle_error' engine " + "event listeners accept the 'retval=True' " + "argument.") + event_key.with_wrapper(fn).base_listen() + + def before_execute(self, conn, clauseelement, multiparams, params): + """Intercept high level execute() events, receiving uncompiled + SQL constructs and other objects prior to rendering into SQL. + + This event is good for debugging SQL compilation issues as well + as early manipulation of the parameters being sent to the database, + as the parameter lists will be in a consistent format here. + + This event can be optionally established with the ``retval=True`` + flag. The ``clauseelement``, ``multiparams``, and ``params`` + arguments should be returned as a three-tuple in this case:: + + @event.listens_for(Engine, "before_execute", retval=True) + def before_execute(conn, conn, clauseelement, multiparams, params): + # do something with clauseelement, multiparams, params + return clauseelement, multiparams, params + + :param conn: :class:`.Connection` object + :param clauseelement: SQL expression construct, :class:`.Compiled` + instance, or string statement passed to :meth:`.Connection.execute`. + :param multiparams: Multiple parameter sets, a list of dictionaries. + :param params: Single parameter set, a single dictionary. + + See also: + + :meth:`.before_cursor_execute` + + """ + + def after_execute(self, conn, clauseelement, multiparams, params, result): + """Intercept high level execute() events after execute. + + + :param conn: :class:`.Connection` object + :param clauseelement: SQL expression construct, :class:`.Compiled` + instance, or string statement passed to :meth:`.Connection.execute`. + :param multiparams: Multiple parameter sets, a list of dictionaries. + :param params: Single parameter set, a single dictionary. + :param result: :class:`.ResultProxy` generated by the execution. + + """ + + def before_cursor_execute(self, conn, cursor, statement, + parameters, context, executemany): + """Intercept low-level cursor execute() events before execution, + receiving the string SQL statement and DBAPI-specific parameter list to + be invoked against a cursor. + + This event is a good choice for logging as well as late modifications + to the SQL string. It's less ideal for parameter modifications except + for those which are specific to a target backend. + + This event can be optionally established with the ``retval=True`` + flag. The ``statement`` and ``parameters`` arguments should be + returned as a two-tuple in this case:: + + @event.listens_for(Engine, "before_cursor_execute", retval=True) + def before_cursor_execute(conn, cursor, statement, + parameters, context, executemany): + # do something with statement, parameters + return statement, parameters + + See the example at :class:`.ConnectionEvents`. + + :param conn: :class:`.Connection` object + :param cursor: DBAPI cursor object + :param statement: string SQL statement, as to be passed to the DBAPI + :param parameters: Dictionary, tuple, or list of parameters being + passed to the ``execute()`` or ``executemany()`` method of the + DBAPI ``cursor``. In some cases may be ``None``. + :param context: :class:`.ExecutionContext` object in use. May + be ``None``. + :param executemany: boolean, if ``True``, this is an ``executemany()`` + call, if ``False``, this is an ``execute()`` call. + + See also: + + :meth:`.before_execute` + + :meth:`.after_cursor_execute` + + """ + + def after_cursor_execute(self, conn, cursor, statement, + parameters, context, executemany): + """Intercept low-level cursor execute() events after execution. + + :param conn: :class:`.Connection` object + :param cursor: DBAPI cursor object. Will have results pending + if the statement was a SELECT, but these should not be consumed + as they will be needed by the :class:`.ResultProxy`. + :param statement: string SQL statement, as passed to the DBAPI + :param parameters: Dictionary, tuple, or list of parameters being + passed to the ``execute()`` or ``executemany()`` method of the + DBAPI ``cursor``. In some cases may be ``None``. + :param context: :class:`.ExecutionContext` object in use. May + be ``None``. + :param executemany: boolean, if ``True``, this is an ``executemany()`` + call, if ``False``, this is an ``execute()`` call. + + """ + + def dbapi_error(self, conn, cursor, statement, parameters, + context, exception): + """Intercept a raw DBAPI error. + + This event is called with the DBAPI exception instance + received from the DBAPI itself, *before* SQLAlchemy wraps the + exception with it's own exception wrappers, and before any + other operations are performed on the DBAPI cursor; the + existing transaction remains in effect as well as any state + on the cursor. + + The use case here is to inject low-level exception handling + into an :class:`.Engine`, typically for logging and + debugging purposes. + + .. warning:: + + Code should **not** modify + any state or throw any exceptions here as this will + interfere with SQLAlchemy's cleanup and error handling + routines. For exception modification, please refer to the + new :meth:`.ConnectionEvents.handle_error` event. + + Subsequent to this hook, SQLAlchemy may attempt any + number of operations on the connection/cursor, including + closing the cursor, rolling back of the transaction in the + case of connectionless execution, and disposing of the entire + connection pool if a "disconnect" was detected. The + exception is then wrapped in a SQLAlchemy DBAPI exception + wrapper and re-thrown. + + :param conn: :class:`.Connection` object + :param cursor: DBAPI cursor object + :param statement: string SQL statement, as passed to the DBAPI + :param parameters: Dictionary, tuple, or list of parameters being + passed to the ``execute()`` or ``executemany()`` method of the + DBAPI ``cursor``. In some cases may be ``None``. + :param context: :class:`.ExecutionContext` object in use. May + be ``None``. + :param exception: The **unwrapped** exception emitted directly from the + DBAPI. The class here is specific to the DBAPI module in use. + + .. deprecated:: 0.9.7 - replaced by + :meth:`.ConnectionEvents.handle_error` + + """ + + def handle_error(self, exception_context): + r"""Intercept all exceptions processed by the :class:`.Connection`. + + This includes all exceptions emitted by the DBAPI as well as + within SQLAlchemy's statement invocation process, including + encoding errors and other statement validation errors. Other areas + in which the event is invoked include transaction begin and end, + result row fetching, cursor creation. + + Note that :meth:`.handle_error` may support new kinds of exceptions + and new calling scenarios at *any time*. Code which uses this + event must expect new calling patterns to be present in minor + releases. + + To support the wide variety of members that correspond to an exception, + as well as to allow extensibility of the event without backwards + incompatibility, the sole argument received is an instance of + :class:`.ExceptionContext`. This object contains data members + representing detail about the exception. + + Use cases supported by this hook include: + + * read-only, low-level exception handling for logging and + debugging purposes + * exception re-writing + * Establishing or disabling whether a connection or the owning + connection pool is invalidated or expired in response to a + specific exception. + + The hook is called while the cursor from the failed operation + (if any) is still open and accessible. Special cleanup operations + can be called on this cursor; SQLAlchemy will attempt to close + this cursor subsequent to this hook being invoked. If the connection + is in "autocommit" mode, the transaction also remains open within + the scope of this hook; the rollback of the per-statement transaction + also occurs after the hook is called. + + The user-defined event handler has two options for replacing + the SQLAlchemy-constructed exception into one that is user + defined. It can either raise this new exception directly, in + which case all further event listeners are bypassed and the + exception will be raised, after appropriate cleanup as taken + place:: + + @event.listens_for(Engine, "handle_error") + def handle_exception(context): + if isinstance(context.original_exception, + psycopg2.OperationalError) and \ + "failed" in str(context.original_exception): + raise MySpecialException("failed operation") + + .. warning:: Because the :meth:`.ConnectionEvents.handle_error` + event specifically provides for exceptions to be re-thrown as + the ultimate exception raised by the failed statement, + **stack traces will be misleading** if the user-defined event + handler itself fails and throws an unexpected exception; + the stack trace may not illustrate the actual code line that + failed! It is advised to code carefully here and use + logging and/or inline debugging if unexpected exceptions are + occurring. + + Alternatively, a "chained" style of event handling can be + used, by configuring the handler with the ``retval=True`` + modifier and returning the new exception instance from the + function. In this case, event handling will continue onto the + next handler. The "chained" exception is available using + :attr:`.ExceptionContext.chained_exception`:: + + @event.listens_for(Engine, "handle_error", retval=True) + def handle_exception(context): + if context.chained_exception is not None and \ + "special" in context.chained_exception.message: + return MySpecialException("failed", + cause=context.chained_exception) + + Handlers that return ``None`` may remain within this chain; the + last non-``None`` return value is the one that continues to be + passed to the next handler. + + When a custom exception is raised or returned, SQLAlchemy raises + this new exception as-is, it is not wrapped by any SQLAlchemy + object. If the exception is not a subclass of + :class:`sqlalchemy.exc.StatementError`, + certain features may not be available; currently this includes + the ORM's feature of adding a detail hint about "autoflush" to + exceptions raised within the autoflush process. + + :param context: an :class:`.ExceptionContext` object. See this + class for details on all available members. + + .. versionadded:: 0.9.7 Added the + :meth:`.ConnectionEvents.handle_error` hook. + + .. versionchanged:: 1.1 The :meth:`.handle_error` event will now + receive all exceptions that inherit from ``BaseException``, including + ``SystemExit`` and ``KeyboardInterrupt``. The setting for + :attr:`.ExceptionContext.is_disconnect` is ``True`` in this case + and the default for :attr:`.ExceptionContext.invalidate_pool_on_disconnect` + is ``False``. + + .. versionchanged:: 1.0.0 The :meth:`.handle_error` event is now + invoked when an :class:`.Engine` fails during the initial + call to :meth:`.Engine.connect`, as well as when a + :class:`.Connection` object encounters an error during a + reconnect operation. + + .. versionchanged:: 1.0.0 The :meth:`.handle_error` event is + not fired off when a dialect makes use of the + ``skip_user_error_events`` execution option. This is used + by dialects which intend to catch SQLAlchemy-specific exceptions + within specific operations, such as when the MySQL dialect detects + a table not present within the ``has_table()`` dialect method. + Prior to 1.0.0, code which implements :meth:`.handle_error` needs + to ensure that exceptions thrown in these scenarios are re-raised + without modification. + + """ + + def engine_connect(self, conn, branch): + """Intercept the creation of a new :class:`.Connection`. + + This event is called typically as the direct result of calling + the :meth:`.Engine.connect` method. + + It differs from the :meth:`.PoolEvents.connect` method, which + refers to the actual connection to a database at the DBAPI level; + a DBAPI connection may be pooled and reused for many operations. + In contrast, this event refers only to the production of a higher level + :class:`.Connection` wrapper around such a DBAPI connection. + + It also differs from the :meth:`.PoolEvents.checkout` event + in that it is specific to the :class:`.Connection` object, not the + DBAPI connection that :meth:`.PoolEvents.checkout` deals with, although + this DBAPI connection is available here via the + :attr:`.Connection.connection` attribute. But note there can in fact + be multiple :meth:`.PoolEvents.checkout` events within the lifespan + of a single :class:`.Connection` object, if that :class:`.Connection` + is invalidated and re-established. There can also be multiple + :class:`.Connection` objects generated for the same already-checked-out + DBAPI connection, in the case that a "branch" of a :class:`.Connection` + is produced. + + :param conn: :class:`.Connection` object. + :param branch: if True, this is a "branch" of an existing + :class:`.Connection`. A branch is generated within the course + of a statement execution to invoke supplemental statements, most + typically to pre-execute a SELECT of a default value for the purposes + of an INSERT statement. + + .. versionadded:: 0.9.0 + + .. seealso:: + + :ref:`pool_disconnects_pessimistic` - illustrates how to use + :meth:`.ConnectionEvents.engine_connect` + to transparently ensure pooled connections are connected to the + database. + + :meth:`.PoolEvents.checkout` the lower-level pool checkout event + for an individual DBAPI connection + + :meth:`.ConnectionEvents.set_connection_execution_options` - a copy + of a :class:`.Connection` is also made when the + :meth:`.Connection.execution_options` method is called. + + """ + + def set_connection_execution_options(self, conn, opts): + """Intercept when the :meth:`.Connection.execution_options` + method is called. + + This method is called after the new :class:`.Connection` has been + produced, with the newly updated execution options collection, but + before the :class:`.Dialect` has acted upon any of those new options. + + Note that this method is not called when a new :class:`.Connection` + is produced which is inheriting execution options from its parent + :class:`.Engine`; to intercept this condition, use the + :meth:`.ConnectionEvents.engine_connect` event. + + :param conn: The newly copied :class:`.Connection` object + + :param opts: dictionary of options that were passed to the + :meth:`.Connection.execution_options` method. + + .. versionadded:: 0.9.0 + + .. seealso:: + + :meth:`.ConnectionEvents.set_engine_execution_options` - event + which is called when :meth:`.Engine.execution_options` is called. + + + """ + + def set_engine_execution_options(self, engine, opts): + """Intercept when the :meth:`.Engine.execution_options` + method is called. + + The :meth:`.Engine.execution_options` method produces a shallow + copy of the :class:`.Engine` which stores the new options. That new + :class:`.Engine` is passed here. A particular application of this + method is to add a :meth:`.ConnectionEvents.engine_connect` event + handler to the given :class:`.Engine` which will perform some per- + :class:`.Connection` task specific to these execution options. + + :param conn: The newly copied :class:`.Engine` object + + :param opts: dictionary of options that were passed to the + :meth:`.Connection.execution_options` method. + + .. versionadded:: 0.9.0 + + .. seealso:: + + :meth:`.ConnectionEvents.set_connection_execution_options` - event + which is called when :meth:`.Connection.execution_options` is + called. + + """ + + def engine_disposed(self, engine): + """Intercept when the :meth:`.Engine.dispose` method is called. + + The :meth:`.Engine.dispose` method instructs the engine to + "dispose" of it's connection pool (e.g. :class:`.Pool`), and + replaces it with a new one. Disposing of the old pool has the + effect that existing checked-in connections are closed. The new + pool does not establish any new connections until it is first used. + + This event can be used to indicate that resources related to the + :class:`.Engine` should also be cleaned up, keeping in mind that the + :class:`.Engine` can still be used for new requests in which case + it re-acquires connection resources. + + .. versionadded:: 1.0.5 + + """ + def begin(self, conn): + """Intercept begin() events. + + :param conn: :class:`.Connection` object + + """ + + def rollback(self, conn): + """Intercept rollback() events, as initiated by a + :class:`.Transaction`. + + Note that the :class:`.Pool` also "auto-rolls back" + a DBAPI connection upon checkin, if the ``reset_on_return`` + flag is set to its default value of ``'rollback'``. + To intercept this + rollback, use the :meth:`.PoolEvents.reset` hook. + + :param conn: :class:`.Connection` object + + .. seealso:: + + :meth:`.PoolEvents.reset` + + """ + + def commit(self, conn): + """Intercept commit() events, as initiated by a + :class:`.Transaction`. + + Note that the :class:`.Pool` may also "auto-commit" + a DBAPI connection upon checkin, if the ``reset_on_return`` + flag is set to the value ``'commit'``. To intercept this + commit, use the :meth:`.PoolEvents.reset` hook. + + :param conn: :class:`.Connection` object + """ + + def savepoint(self, conn, name): + """Intercept savepoint() events. + + :param conn: :class:`.Connection` object + :param name: specified name used for the savepoint. + + """ + + def rollback_savepoint(self, conn, name, context): + """Intercept rollback_savepoint() events. + + :param conn: :class:`.Connection` object + :param name: specified name used for the savepoint. + :param context: :class:`.ExecutionContext` in use. May be ``None``. + + """ + + def release_savepoint(self, conn, name, context): + """Intercept release_savepoint() events. + + :param conn: :class:`.Connection` object + :param name: specified name used for the savepoint. + :param context: :class:`.ExecutionContext` in use. May be ``None``. + + """ + + def begin_twophase(self, conn, xid): + """Intercept begin_twophase() events. + + :param conn: :class:`.Connection` object + :param xid: two-phase XID identifier + + """ + + def prepare_twophase(self, conn, xid): + """Intercept prepare_twophase() events. + + :param conn: :class:`.Connection` object + :param xid: two-phase XID identifier + """ + + def rollback_twophase(self, conn, xid, is_prepared): + """Intercept rollback_twophase() events. + + :param conn: :class:`.Connection` object + :param xid: two-phase XID identifier + :param is_prepared: boolean, indicates if + :meth:`.TwoPhaseTransaction.prepare` was called. + + """ + + def commit_twophase(self, conn, xid, is_prepared): + """Intercept commit_twophase() events. + + :param conn: :class:`.Connection` object + :param xid: two-phase XID identifier + :param is_prepared: boolean, indicates if + :meth:`.TwoPhaseTransaction.prepare` was called. + + """ + + +class DialectEvents(event.Events): + """event interface for execution-replacement functions. + + These events allow direct instrumentation and replacement + of key dialect functions which interact with the DBAPI. + + .. note:: + + :class:`.DialectEvents` hooks should be considered **semi-public** + and experimental. + These hooks are not for general use and are only for those situations + where intricate re-statement of DBAPI mechanics must be injected onto + an existing dialect. For general-use statement-interception events, + please use the :class:`.ConnectionEvents` interface. + + .. seealso:: + + :meth:`.ConnectionEvents.before_cursor_execute` + + :meth:`.ConnectionEvents.before_execute` + + :meth:`.ConnectionEvents.after_cursor_execute` + + :meth:`.ConnectionEvents.after_execute` + + + .. versionadded:: 0.9.4 + + """ + + _target_class_doc = "SomeEngine" + _dispatch_target = Dialect + + @classmethod + def _listen(cls, event_key, retval=False): + target, identifier, fn = \ + event_key.dispatch_target, event_key.identifier, event_key.fn + + target._has_events = True + event_key.base_listen() + + @classmethod + def _accept_with(cls, target): + if isinstance(target, type): + if issubclass(target, Engine): + return Dialect + elif issubclass(target, Dialect): + return target + elif isinstance(target, Engine): + return target.dialect + else: + return target + + def do_connect(self, dialect, conn_rec, cargs, cparams): + """Receive connection arguments before a connection is made. + + Return a DBAPI connection to halt further events from invoking; + the returned connection will be used. + + Alternatively, the event can manipulate the cargs and/or cparams + collections; cargs will always be a Python list that can be mutated + in-place and cparams a Python dictionary. Return None to + allow control to pass to the next event handler and ultimately + to allow the dialect to connect normally, given the updated + arguments. + + .. versionadded:: 1.0.3 + + """ + + def do_executemany(self, cursor, statement, parameters, context): + """Receive a cursor to have executemany() called. + + Return the value True to halt further events from invoking, + and to indicate that the cursor execution has already taken + place within the event handler. + + """ + + def do_execute_no_params(self, cursor, statement, context): + """Receive a cursor to have execute() with no parameters called. + + Return the value True to halt further events from invoking, + and to indicate that the cursor execution has already taken + place within the event handler. + + """ + + def do_execute(self, cursor, statement, parameters, context): + """Receive a cursor to have execute() called. + + Return the value True to halt further events from invoking, + and to indicate that the cursor execution has already taken + place within the event handler. + + """ diff --git a/app/lib/sqlalchemy/exc.py b/app/lib/sqlalchemy/exc.py new file mode 100644 index 0000000..b2e07ae --- /dev/null +++ b/app/lib/sqlalchemy/exc.py @@ -0,0 +1,388 @@ +# sqlalchemy/exc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Exceptions used with SQLAlchemy. + +The base exception class is :exc:`.SQLAlchemyError`. Exceptions which are +raised as a result of DBAPI exceptions are all subclasses of +:exc:`.DBAPIError`. + +""" + + +class SQLAlchemyError(Exception): + """Generic error class.""" + + +class ArgumentError(SQLAlchemyError): + """Raised when an invalid or conflicting function argument is supplied. + + This error generally corresponds to construction time state errors. + + """ + + +class ObjectNotExecutableError(ArgumentError): + """Raised when an object is passed to .execute() that can't be + executed as SQL. + + .. versionadded:: 1.1 + + """ + + def __init__(self, target): + super(ObjectNotExecutableError, self).__init__( + "Not an executable object: %r" % target + ) + + +class NoSuchModuleError(ArgumentError): + """Raised when a dynamically-loaded module (usually a database dialect) + of a particular name cannot be located.""" + + +class NoForeignKeysError(ArgumentError): + """Raised when no foreign keys can be located between two selectables + during a join.""" + + +class AmbiguousForeignKeysError(ArgumentError): + """Raised when more than one foreign key matching can be located + between two selectables during a join.""" + + +class CircularDependencyError(SQLAlchemyError): + """Raised by topological sorts when a circular dependency is detected. + + There are two scenarios where this error occurs: + + * In a Session flush operation, if two objects are mutually dependent + on each other, they can not be inserted or deleted via INSERT or + DELETE statements alone; an UPDATE will be needed to post-associate + or pre-deassociate one of the foreign key constrained values. + The ``post_update`` flag described at :ref:`post_update` can resolve + this cycle. + * In a :attr:`.MetaData.sorted_tables` operation, two :class:`.ForeignKey` + or :class:`.ForeignKeyConstraint` objects mutually refer to each + other. Apply the ``use_alter=True`` flag to one or both, + see :ref:`use_alter`. + + """ + def __init__(self, message, cycles, edges, msg=None): + if msg is None: + message += " (%s)" % ", ".join(repr(s) for s in cycles) + else: + message = msg + SQLAlchemyError.__init__(self, message) + self.cycles = cycles + self.edges = edges + + def __reduce__(self): + return self.__class__, (None, self.cycles, + self.edges, self.args[0]) + + +class CompileError(SQLAlchemyError): + """Raised when an error occurs during SQL compilation""" + + +class UnsupportedCompilationError(CompileError): + """Raised when an operation is not supported by the given compiler. + + + .. versionadded:: 0.8.3 + + """ + + def __init__(self, compiler, element_type): + super(UnsupportedCompilationError, self).__init__( + "Compiler %r can't render element of type %s" % + (compiler, element_type)) + + +class IdentifierError(SQLAlchemyError): + """Raised when a schema name is beyond the max character limit""" + + +class DisconnectionError(SQLAlchemyError): + """A disconnect is detected on a raw DB-API connection. + + This error is raised and consumed internally by a connection pool. It can + be raised by the :meth:`.PoolEvents.checkout` event so that the host pool + forces a retry; the exception will be caught three times in a row before + the pool gives up and raises :class:`~sqlalchemy.exc.InvalidRequestError` + regarding the connection attempt. + + """ + + +class TimeoutError(SQLAlchemyError): + """Raised when a connection pool times out on getting a connection.""" + + +class InvalidRequestError(SQLAlchemyError): + """SQLAlchemy was asked to do something it can't do. + + This error generally corresponds to runtime state errors. + + """ + + +class NoInspectionAvailable(InvalidRequestError): + """A subject passed to :func:`sqlalchemy.inspection.inspect` produced + no context for inspection.""" + + +class ResourceClosedError(InvalidRequestError): + """An operation was requested from a connection, cursor, or other + object that's in a closed state.""" + + +class NoSuchColumnError(KeyError, InvalidRequestError): + """A nonexistent column is requested from a ``RowProxy``.""" + + +class NoReferenceError(InvalidRequestError): + """Raised by ``ForeignKey`` to indicate a reference cannot be resolved.""" + + +class NoReferencedTableError(NoReferenceError): + """Raised by ``ForeignKey`` when the referred ``Table`` cannot be + located. + + """ + def __init__(self, message, tname): + NoReferenceError.__init__(self, message) + self.table_name = tname + + def __reduce__(self): + return self.__class__, (self.args[0], self.table_name) + + +class NoReferencedColumnError(NoReferenceError): + """Raised by ``ForeignKey`` when the referred ``Column`` cannot be + located. + + """ + def __init__(self, message, tname, cname): + NoReferenceError.__init__(self, message) + self.table_name = tname + self.column_name = cname + + def __reduce__(self): + return self.__class__, (self.args[0], self.table_name, + self.column_name) + + +class NoSuchTableError(InvalidRequestError): + """Table does not exist or is not visible to a connection.""" + + +class UnboundExecutionError(InvalidRequestError): + """SQL was attempted without a database connection to execute it on.""" + + +class DontWrapMixin(object): + """A mixin class which, when applied to a user-defined Exception class, + will not be wrapped inside of :exc:`.StatementError` if the error is + emitted within the process of executing a statement. + + E.g.:: + + from sqlalchemy.exc import DontWrapMixin + + class MyCustomException(Exception, DontWrapMixin): + pass + + class MySpecialType(TypeDecorator): + impl = String + + def process_bind_param(self, value, dialect): + if value == 'invalid': + raise MyCustomException("invalid!") + + """ + +# Moved to orm.exc; compatibility definition installed by orm import until 0.6 +UnmappedColumnError = None + + +class StatementError(SQLAlchemyError): + """An error occurred during execution of a SQL statement. + + :class:`StatementError` wraps the exception raised + during execution, and features :attr:`.statement` + and :attr:`.params` attributes which supply context regarding + the specifics of the statement which had an issue. + + The wrapped exception object is available in + the :attr:`.orig` attribute. + + """ + + statement = None + """The string SQL statement being invoked when this exception occurred.""" + + params = None + """The parameter list being used when this exception occurred.""" + + orig = None + """The DBAPI exception object.""" + + def __init__(self, message, statement, params, orig): + SQLAlchemyError.__init__(self, message) + self.statement = statement + self.params = params + self.orig = orig + self.detail = [] + + def add_detail(self, msg): + self.detail.append(msg) + + def __reduce__(self): + return self.__class__, (self.args[0], self.statement, + self.params, self.orig) + + def __str__(self): + from sqlalchemy.sql import util + + details = [SQLAlchemyError.__str__(self)] + if self.statement: + details.append("[SQL: %r]" % self.statement) + if self.params: + params_repr = util._repr_params(self.params, 10) + details.append("[parameters: %r]" % params_repr) + return ' '.join([ + "(%s)" % det for det in self.detail + ] + details) + + def __unicode__(self): + return self.__str__() + + +class DBAPIError(StatementError): + """Raised when the execution of a database operation fails. + + Wraps exceptions raised by the DB-API underlying the + database operation. Driver-specific implementations of the standard + DB-API exception types are wrapped by matching sub-types of SQLAlchemy's + :class:`DBAPIError` when possible. DB-API's ``Error`` type maps to + :class:`DBAPIError` in SQLAlchemy, otherwise the names are identical. Note + that there is no guarantee that different DB-API implementations will + raise the same exception type for any given error condition. + + :class:`DBAPIError` features :attr:`~.StatementError.statement` + and :attr:`~.StatementError.params` attributes which supply context + regarding the specifics of the statement which had an issue, for the + typical case when the error was raised within the context of + emitting a SQL statement. + + The wrapped exception object is available in the + :attr:`~.StatementError.orig` attribute. Its type and properties are + DB-API implementation specific. + + """ + + @classmethod + def instance(cls, statement, params, + orig, dbapi_base_err, + connection_invalidated=False, + dialect=None): + # Don't ever wrap these, just return them directly as if + # DBAPIError didn't exist. + if (isinstance(orig, BaseException) and + not isinstance(orig, Exception)) or \ + isinstance(orig, DontWrapMixin): + return orig + + if orig is not None: + # not a DBAPI error, statement is present. + # raise a StatementError + if not isinstance(orig, dbapi_base_err) and statement: + return StatementError( + "(%s.%s) %s" % + (orig.__class__.__module__, orig.__class__.__name__, + orig), + statement, params, orig + ) + + glob = globals() + for super_ in orig.__class__.__mro__: + name = super_.__name__ + if dialect: + name = dialect.dbapi_exception_translation_map.get( + name, name) + if name in glob and issubclass(glob[name], DBAPIError): + cls = glob[name] + break + + return cls(statement, params, orig, connection_invalidated) + + def __reduce__(self): + return self.__class__, (self.statement, self.params, + self.orig, self.connection_invalidated) + + def __init__(self, statement, params, orig, connection_invalidated=False): + try: + text = str(orig) + except Exception as e: + text = 'Error in str() of DB-API-generated exception: ' + str(e) + StatementError.__init__( + self, + '(%s.%s) %s' % ( + orig.__class__.__module__, orig.__class__.__name__, text, ), + statement, + params, + orig + ) + self.connection_invalidated = connection_invalidated + + +class InterfaceError(DBAPIError): + """Wraps a DB-API InterfaceError.""" + + +class DatabaseError(DBAPIError): + """Wraps a DB-API DatabaseError.""" + + +class DataError(DatabaseError): + """Wraps a DB-API DataError.""" + + +class OperationalError(DatabaseError): + """Wraps a DB-API OperationalError.""" + + +class IntegrityError(DatabaseError): + """Wraps a DB-API IntegrityError.""" + + +class InternalError(DatabaseError): + """Wraps a DB-API InternalError.""" + + +class ProgrammingError(DatabaseError): + """Wraps a DB-API ProgrammingError.""" + + +class NotSupportedError(DatabaseError): + """Wraps a DB-API NotSupportedError.""" + + +# Warnings + +class SADeprecationWarning(DeprecationWarning): + """Issued once per usage of a deprecated API.""" + + +class SAPendingDeprecationWarning(PendingDeprecationWarning): + """Issued once per usage of a deprecated API.""" + + +class SAWarning(RuntimeWarning): + """Issued at runtime.""" diff --git a/app/lib/sqlalchemy/ext/__init__.py b/app/lib/sqlalchemy/ext/__init__.py new file mode 100644 index 0000000..bb9ae58 --- /dev/null +++ b/app/lib/sqlalchemy/ext/__init__.py @@ -0,0 +1,11 @@ +# ext/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from .. import util as _sa_util + +_sa_util.dependencies.resolve_all("sqlalchemy.ext") + diff --git a/app/lib/sqlalchemy/ext/associationproxy.py b/app/lib/sqlalchemy/ext/associationproxy.py new file mode 100644 index 0000000..6f570a1 --- /dev/null +++ b/app/lib/sqlalchemy/ext/associationproxy.py @@ -0,0 +1,1068 @@ +# ext/associationproxy.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Contain the ``AssociationProxy`` class. + +The ``AssociationProxy`` is a Python property object which provides +transparent proxied access to the endpoint of an association object. + +See the example ``examples/association/proxied_association.py``. + +""" +import itertools +import operator +import weakref +from .. import exc, orm, util +from ..orm import collections, interfaces +from ..sql import not_, or_ + + +def association_proxy(target_collection, attr, **kw): + r"""Return a Python property implementing a view of a target + attribute which references an attribute on members of the + target. + + The returned value is an instance of :class:`.AssociationProxy`. + + Implements a Python property representing a relationship as a collection + of simpler values, or a scalar value. The proxied property will mimic + the collection type of the target (list, dict or set), or, in the case of + a one to one relationship, a simple scalar value. + + :param target_collection: Name of the attribute we'll proxy to. + This attribute is typically mapped by + :func:`~sqlalchemy.orm.relationship` to link to a target collection, but + can also be a many-to-one or non-scalar relationship. + + :param attr: Attribute on the associated instance or instances we'll + proxy for. + + For example, given a target collection of [obj1, obj2], a list created + by this proxy property would look like [getattr(obj1, *attr*), + getattr(obj2, *attr*)] + + If the relationship is one-to-one or otherwise uselist=False, then + simply: getattr(obj, *attr*) + + :param creator: optional. + + When new items are added to this proxied collection, new instances of + the class collected by the target collection will be created. For list + and set collections, the target class constructor will be called with + the 'value' for the new instance. For dict types, two arguments are + passed: key and value. + + If you want to construct instances differently, supply a *creator* + function that takes arguments as above and returns instances. + + For scalar relationships, creator() will be called if the target is None. + If the target is present, set operations are proxied to setattr() on the + associated object. + + If you have an associated object with multiple attributes, you may set + up multiple association proxies mapping to different attributes. See + the unit tests for examples, and for examples of how creator() functions + can be used to construct the scalar relationship on-demand in this + situation. + + :param \*\*kw: Passes along any other keyword arguments to + :class:`.AssociationProxy`. + + """ + return AssociationProxy(target_collection, attr, **kw) + + +ASSOCIATION_PROXY = util.symbol('ASSOCIATION_PROXY') +"""Symbol indicating an :class:`InspectionAttr` that's + of type :class:`.AssociationProxy`. + + Is assigned to the :attr:`.InspectionAttr.extension_type` + attibute. + +""" + + +class AssociationProxy(interfaces.InspectionAttrInfo): + """A descriptor that presents a read/write view of an object attribute.""" + + is_attribute = False + extension_type = ASSOCIATION_PROXY + + def __init__(self, target_collection, attr, creator=None, + getset_factory=None, proxy_factory=None, + proxy_bulk_set=None, info=None): + """Construct a new :class:`.AssociationProxy`. + + The :func:`.association_proxy` function is provided as the usual + entrypoint here, though :class:`.AssociationProxy` can be instantiated + and/or subclassed directly. + + :param target_collection: Name of the collection we'll proxy to, + usually created with :func:`.relationship`. + + :param attr: Attribute on the collected instances we'll proxy + for. For example, given a target collection of [obj1, obj2], a + list created by this proxy property would look like + [getattr(obj1, attr), getattr(obj2, attr)] + + :param creator: Optional. When new items are added to this proxied + collection, new instances of the class collected by the target + collection will be created. For list and set collections, the + target class constructor will be called with the 'value' for the + new instance. For dict types, two arguments are passed: + key and value. + + If you want to construct instances differently, supply a 'creator' + function that takes arguments as above and returns instances. + + :param getset_factory: Optional. Proxied attribute access is + automatically handled by routines that get and set values based on + the `attr` argument for this proxy. + + If you would like to customize this behavior, you may supply a + `getset_factory` callable that produces a tuple of `getter` and + `setter` functions. The factory is called with two arguments, the + abstract type of the underlying collection and this proxy instance. + + :param proxy_factory: Optional. The type of collection to emulate is + determined by sniffing the target collection. If your collection + type can't be determined by duck typing or you'd like to use a + different collection implementation, you may supply a factory + function to produce those collections. Only applicable to + non-scalar relationships. + + :param proxy_bulk_set: Optional, use with proxy_factory. See + the _set() method for details. + + :param info: optional, will be assigned to + :attr:`.AssociationProxy.info` if present. + + .. versionadded:: 1.0.9 + + """ + self.target_collection = target_collection + self.value_attr = attr + self.creator = creator + self.getset_factory = getset_factory + self.proxy_factory = proxy_factory + self.proxy_bulk_set = proxy_bulk_set + + self.owning_class = None + self.key = '_%s_%s_%s' % ( + type(self).__name__, target_collection, id(self)) + self.collection_class = None + if info: + self.info = info + + @property + def remote_attr(self): + """The 'remote' :class:`.MapperProperty` referenced by this + :class:`.AssociationProxy`. + + .. versionadded:: 0.7.3 + + See also: + + :attr:`.AssociationProxy.attr` + + :attr:`.AssociationProxy.local_attr` + + """ + return getattr(self.target_class, self.value_attr) + + @property + def local_attr(self): + """The 'local' :class:`.MapperProperty` referenced by this + :class:`.AssociationProxy`. + + .. versionadded:: 0.7.3 + + See also: + + :attr:`.AssociationProxy.attr` + + :attr:`.AssociationProxy.remote_attr` + + """ + return getattr(self.owning_class, self.target_collection) + + @property + def attr(self): + """Return a tuple of ``(local_attr, remote_attr)``. + + This attribute is convenient when specifying a join + using :meth:`.Query.join` across two relationships:: + + sess.query(Parent).join(*Parent.proxied.attr) + + .. versionadded:: 0.7.3 + + See also: + + :attr:`.AssociationProxy.local_attr` + + :attr:`.AssociationProxy.remote_attr` + + """ + return (self.local_attr, self.remote_attr) + + def _get_property(self): + return (orm.class_mapper(self.owning_class). + get_property(self.target_collection)) + + @util.memoized_property + def target_class(self): + """The intermediary class handled by this :class:`.AssociationProxy`. + + Intercepted append/set/assignment events will result + in the generation of new instances of this class. + + """ + return self._get_property().mapper.class_ + + @util.memoized_property + def scalar(self): + """Return ``True`` if this :class:`.AssociationProxy` proxies a scalar + relationship on the local side.""" + + scalar = not self._get_property().uselist + if scalar: + self._initialize_scalar_accessors() + return scalar + + @util.memoized_property + def _value_is_scalar(self): + return not self._get_property().\ + mapper.get_property(self.value_attr).uselist + + @util.memoized_property + def _target_is_object(self): + return getattr(self.target_class, self.value_attr).impl.uses_objects + + def __get__(self, obj, class_): + if self.owning_class is None: + self.owning_class = class_ and class_ or type(obj) + if obj is None: + return self + + if self.scalar: + target = getattr(obj, self.target_collection) + return self._scalar_get(target) + else: + try: + # If the owning instance is reborn (orm session resurrect, + # etc.), refresh the proxy cache. + creator_id, proxy = getattr(obj, self.key) + if id(obj) == creator_id: + return proxy + except AttributeError: + pass + proxy = self._new(_lazy_collection(obj, self.target_collection)) + setattr(obj, self.key, (id(obj), proxy)) + return proxy + + def __set__(self, obj, values): + if self.owning_class is None: + self.owning_class = type(obj) + + if self.scalar: + creator = self.creator and self.creator or self.target_class + target = getattr(obj, self.target_collection) + if target is None: + setattr(obj, self.target_collection, creator(values)) + else: + self._scalar_set(target, values) + else: + proxy = self.__get__(obj, None) + if proxy is not values: + proxy.clear() + self._set(proxy, values) + + def __delete__(self, obj): + if self.owning_class is None: + self.owning_class = type(obj) + delattr(obj, self.key) + + def _initialize_scalar_accessors(self): + if self.getset_factory: + get, set = self.getset_factory(None, self) + else: + get, set = self._default_getset(None) + self._scalar_get, self._scalar_set = get, set + + def _default_getset(self, collection_class): + attr = self.value_attr + _getter = operator.attrgetter(attr) + getter = lambda target: _getter(target) if target is not None else None + if collection_class is dict: + setter = lambda o, k, v: setattr(o, attr, v) + else: + setter = lambda o, v: setattr(o, attr, v) + return getter, setter + + def _new(self, lazy_collection): + creator = self.creator and self.creator or self.target_class + self.collection_class = util.duck_type_collection(lazy_collection()) + + if self.proxy_factory: + return self.proxy_factory( + lazy_collection, creator, self.value_attr, self) + + if self.getset_factory: + getter, setter = self.getset_factory(self.collection_class, self) + else: + getter, setter = self._default_getset(self.collection_class) + + if self.collection_class is list: + return _AssociationList( + lazy_collection, creator, getter, setter, self) + elif self.collection_class is dict: + return _AssociationDict( + lazy_collection, creator, getter, setter, self) + elif self.collection_class is set: + return _AssociationSet( + lazy_collection, creator, getter, setter, self) + else: + raise exc.ArgumentError( + 'could not guess which interface to use for ' + 'collection_class "%s" backing "%s"; specify a ' + 'proxy_factory and proxy_bulk_set manually' % + (self.collection_class.__name__, self.target_collection)) + + def _inflate(self, proxy): + creator = self.creator and self.creator or self.target_class + + if self.getset_factory: + getter, setter = self.getset_factory(self.collection_class, self) + else: + getter, setter = self._default_getset(self.collection_class) + + proxy.creator = creator + proxy.getter = getter + proxy.setter = setter + + def _set(self, proxy, values): + if self.proxy_bulk_set: + self.proxy_bulk_set(proxy, values) + elif self.collection_class is list: + proxy.extend(values) + elif self.collection_class is dict: + proxy.update(values) + elif self.collection_class is set: + proxy.update(values) + else: + raise exc.ArgumentError( + 'no proxy_bulk_set supplied for custom ' + 'collection_class implementation') + + @property + def _comparator(self): + return self._get_property().comparator + + def any(self, criterion=None, **kwargs): + """Produce a proxied 'any' expression using EXISTS. + + This expression will be a composed product + using the :meth:`.RelationshipProperty.Comparator.any` + and/or :meth:`.RelationshipProperty.Comparator.has` + operators of the underlying proxied attributes. + + """ + if self._target_is_object: + if self._value_is_scalar: + value_expr = getattr( + self.target_class, self.value_attr).has( + criterion, **kwargs) + else: + value_expr = getattr( + self.target_class, self.value_attr).any( + criterion, **kwargs) + else: + value_expr = criterion + + # check _value_is_scalar here, otherwise + # we're scalar->scalar - call .any() so that + # the "can't call any() on a scalar" msg is raised. + if self.scalar and not self._value_is_scalar: + return self._comparator.has( + value_expr + ) + else: + return self._comparator.any( + value_expr + ) + + def has(self, criterion=None, **kwargs): + """Produce a proxied 'has' expression using EXISTS. + + This expression will be a composed product + using the :meth:`.RelationshipProperty.Comparator.any` + and/or :meth:`.RelationshipProperty.Comparator.has` + operators of the underlying proxied attributes. + + """ + + if self._target_is_object: + return self._comparator.has( + getattr(self.target_class, self.value_attr). + has(criterion, **kwargs) + ) + else: + if criterion is not None or kwargs: + raise exc.ArgumentError( + "Non-empty has() not allowed for " + "column-targeted association proxy; use ==") + return self._comparator.has() + + def contains(self, obj): + """Produce a proxied 'contains' expression using EXISTS. + + This expression will be a composed product + using the :meth:`.RelationshipProperty.Comparator.any` + , :meth:`.RelationshipProperty.Comparator.has`, + and/or :meth:`.RelationshipProperty.Comparator.contains` + operators of the underlying proxied attributes. + """ + + if self.scalar and not self._value_is_scalar: + return self._comparator.has( + getattr(self.target_class, self.value_attr).contains(obj) + ) + else: + return self._comparator.any(**{self.value_attr: obj}) + + def __eq__(self, obj): + # note the has() here will fail for collections; eq_() + # is only allowed with a scalar. + if obj is None: + return or_( + self._comparator.has(**{self.value_attr: obj}), + self._comparator == None + ) + else: + return self._comparator.has(**{self.value_attr: obj}) + + def __ne__(self, obj): + # note the has() here will fail for collections; eq_() + # is only allowed with a scalar. + return self._comparator.has( + getattr(self.target_class, self.value_attr) != obj) + + +class _lazy_collection(object): + def __init__(self, obj, target): + self.ref = weakref.ref(obj) + self.target = target + + def __call__(self): + obj = self.ref() + if obj is None: + raise exc.InvalidRequestError( + "stale association proxy, parent object has gone out of " + "scope") + return getattr(obj, self.target) + + def __getstate__(self): + return {'obj': self.ref(), 'target': self.target} + + def __setstate__(self, state): + self.ref = weakref.ref(state['obj']) + self.target = state['target'] + + +class _AssociationCollection(object): + def __init__(self, lazy_collection, creator, getter, setter, parent): + """Constructs an _AssociationCollection. + + This will always be a subclass of either _AssociationList, + _AssociationSet, or _AssociationDict. + + lazy_collection + A callable returning a list-based collection of entities (usually an + object attribute managed by a SQLAlchemy relationship()) + + creator + A function that creates new target entities. Given one parameter: + value. This assertion is assumed:: + + obj = creator(somevalue) + assert getter(obj) == somevalue + + getter + A function. Given an associated object, return the 'value'. + + setter + A function. Given an associated object and a value, store that + value on the object. + + """ + self.lazy_collection = lazy_collection + self.creator = creator + self.getter = getter + self.setter = setter + self.parent = parent + + col = property(lambda self: self.lazy_collection()) + + def __len__(self): + return len(self.col) + + def __bool__(self): + return bool(self.col) + + __nonzero__ = __bool__ + + def __getstate__(self): + return {'parent': self.parent, 'lazy_collection': self.lazy_collection} + + def __setstate__(self, state): + self.parent = state['parent'] + self.lazy_collection = state['lazy_collection'] + self.parent._inflate(self) + + +class _AssociationList(_AssociationCollection): + """Generic, converting, list-to-list proxy.""" + + def _create(self, value): + return self.creator(value) + + def _get(self, object): + return self.getter(object) + + def _set(self, object, value): + return self.setter(object, value) + + def __getitem__(self, index): + if not isinstance(index, slice): + return self._get(self.col[index]) + else: + return [self._get(member) for member in self.col[index]] + + def __setitem__(self, index, value): + if not isinstance(index, slice): + self._set(self.col[index], value) + else: + if index.stop is None: + stop = len(self) + elif index.stop < 0: + stop = len(self) + index.stop + else: + stop = index.stop + step = index.step or 1 + + start = index.start or 0 + rng = list(range(index.start or 0, stop, step)) + if step == 1: + for i in rng: + del self[start] + i = start + for item in value: + self.insert(i, item) + i += 1 + else: + if len(value) != len(rng): + raise ValueError( + "attempt to assign sequence of size %s to " + "extended slice of size %s" % (len(value), + len(rng))) + for i, item in zip(rng, value): + self._set(self.col[i], item) + + def __delitem__(self, index): + del self.col[index] + + def __contains__(self, value): + for member in self.col: + # testlib.pragma exempt:__eq__ + if self._get(member) == value: + return True + return False + + def __getslice__(self, start, end): + return [self._get(member) for member in self.col[start:end]] + + def __setslice__(self, start, end, values): + members = [self._create(v) for v in values] + self.col[start:end] = members + + def __delslice__(self, start, end): + del self.col[start:end] + + def __iter__(self): + """Iterate over proxied values. + + For the actual domain objects, iterate over .col instead or + just use the underlying collection directly from its property + on the parent. + """ + + for member in self.col: + yield self._get(member) + return + + def append(self, value): + item = self._create(value) + self.col.append(item) + + def count(self, value): + return sum([1 for _ in + util.itertools_filter(lambda v: v == value, iter(self))]) + + def extend(self, values): + for v in values: + self.append(v) + + def insert(self, index, value): + self.col[index:index] = [self._create(value)] + + def pop(self, index=-1): + return self.getter(self.col.pop(index)) + + def remove(self, value): + for i, val in enumerate(self): + if val == value: + del self.col[i] + return + raise ValueError("value not in list") + + def reverse(self): + """Not supported, use reversed(mylist)""" + + raise NotImplementedError + + def sort(self): + """Not supported, use sorted(mylist)""" + + raise NotImplementedError + + def clear(self): + del self.col[0:len(self.col)] + + def __eq__(self, other): + return list(self) == other + + def __ne__(self, other): + return list(self) != other + + def __lt__(self, other): + return list(self) < other + + def __le__(self, other): + return list(self) <= other + + def __gt__(self, other): + return list(self) > other + + def __ge__(self, other): + return list(self) >= other + + def __cmp__(self, other): + return cmp(list(self), other) + + def __add__(self, iterable): + try: + other = list(iterable) + except TypeError: + return NotImplemented + return list(self) + other + + def __radd__(self, iterable): + try: + other = list(iterable) + except TypeError: + return NotImplemented + return other + list(self) + + def __mul__(self, n): + if not isinstance(n, int): + return NotImplemented + return list(self) * n + __rmul__ = __mul__ + + def __iadd__(self, iterable): + self.extend(iterable) + return self + + def __imul__(self, n): + # unlike a regular list *=, proxied __imul__ will generate unique + # backing objects for each copy. *= on proxied lists is a bit of + # a stretch anyhow, and this interpretation of the __imul__ contract + # is more plausibly useful than copying the backing objects. + if not isinstance(n, int): + return NotImplemented + if n == 0: + self.clear() + elif n > 1: + self.extend(list(self) * (n - 1)) + return self + + def copy(self): + return list(self) + + def __repr__(self): + return repr(list(self)) + + def __hash__(self): + raise TypeError("%s objects are unhashable" % type(self).__name__) + + for func_name, func in list(locals().items()): + if (util.callable(func) and func.__name__ == func_name and + not func.__doc__ and hasattr(list, func_name)): + func.__doc__ = getattr(list, func_name).__doc__ + del func_name, func + + +_NotProvided = util.symbol('_NotProvided') + + +class _AssociationDict(_AssociationCollection): + """Generic, converting, dict-to-dict proxy.""" + + def _create(self, key, value): + return self.creator(key, value) + + def _get(self, object): + return self.getter(object) + + def _set(self, object, key, value): + return self.setter(object, key, value) + + def __getitem__(self, key): + return self._get(self.col[key]) + + def __setitem__(self, key, value): + if key in self.col: + self._set(self.col[key], key, value) + else: + self.col[key] = self._create(key, value) + + def __delitem__(self, key): + del self.col[key] + + def __contains__(self, key): + # testlib.pragma exempt:__hash__ + return key in self.col + + def has_key(self, key): + # testlib.pragma exempt:__hash__ + return key in self.col + + def __iter__(self): + return iter(self.col.keys()) + + def clear(self): + self.col.clear() + + def __eq__(self, other): + return dict(self) == other + + def __ne__(self, other): + return dict(self) != other + + def __lt__(self, other): + return dict(self) < other + + def __le__(self, other): + return dict(self) <= other + + def __gt__(self, other): + return dict(self) > other + + def __ge__(self, other): + return dict(self) >= other + + def __cmp__(self, other): + return cmp(dict(self), other) + + def __repr__(self): + return repr(dict(self.items())) + + def get(self, key, default=None): + try: + return self[key] + except KeyError: + return default + + def setdefault(self, key, default=None): + if key not in self.col: + self.col[key] = self._create(key, default) + return default + else: + return self[key] + + def keys(self): + return self.col.keys() + + if util.py2k: + def iteritems(self): + return ((key, self._get(self.col[key])) for key in self.col) + + def itervalues(self): + return (self._get(self.col[key]) for key in self.col) + + def iterkeys(self): + return self.col.iterkeys() + + def values(self): + return [self._get(member) for member in self.col.values()] + + def items(self): + return [(k, self._get(self.col[k])) for k in self] + else: + def items(self): + return ((key, self._get(self.col[key])) for key in self.col) + + def values(self): + return (self._get(self.col[key]) for key in self.col) + + def pop(self, key, default=_NotProvided): + if default is _NotProvided: + member = self.col.pop(key) + else: + member = self.col.pop(key, default) + return self._get(member) + + def popitem(self): + item = self.col.popitem() + return (item[0], self._get(item[1])) + + def update(self, *a, **kw): + if len(a) > 1: + raise TypeError('update expected at most 1 arguments, got %i' % + len(a)) + elif len(a) == 1: + seq_or_map = a[0] + # discern dict from sequence - took the advice from + # http://www.voidspace.org.uk/python/articles/duck_typing.shtml + # still not perfect :( + if hasattr(seq_or_map, 'keys'): + for item in seq_or_map: + self[item] = seq_or_map[item] + else: + try: + for k, v in seq_or_map: + self[k] = v + except ValueError: + raise ValueError( + "dictionary update sequence " + "requires 2-element tuples") + + for key, value in kw: + self[key] = value + + def copy(self): + return dict(self.items()) + + def __hash__(self): + raise TypeError("%s objects are unhashable" % type(self).__name__) + + for func_name, func in list(locals().items()): + if (util.callable(func) and func.__name__ == func_name and + not func.__doc__ and hasattr(dict, func_name)): + func.__doc__ = getattr(dict, func_name).__doc__ + del func_name, func + + +class _AssociationSet(_AssociationCollection): + """Generic, converting, set-to-set proxy.""" + + def _create(self, value): + return self.creator(value) + + def _get(self, object): + return self.getter(object) + + def _set(self, object, value): + return self.setter(object, value) + + def __len__(self): + return len(self.col) + + def __bool__(self): + if self.col: + return True + else: + return False + + __nonzero__ = __bool__ + + def __contains__(self, value): + for member in self.col: + # testlib.pragma exempt:__eq__ + if self._get(member) == value: + return True + return False + + def __iter__(self): + """Iterate over proxied values. + + For the actual domain objects, iterate over .col instead or just use + the underlying collection directly from its property on the parent. + + """ + for member in self.col: + yield self._get(member) + return + + def add(self, value): + if value not in self: + self.col.add(self._create(value)) + + # for discard and remove, choosing a more expensive check strategy rather + # than call self.creator() + def discard(self, value): + for member in self.col: + if self._get(member) == value: + self.col.discard(member) + break + + def remove(self, value): + for member in self.col: + if self._get(member) == value: + self.col.discard(member) + return + raise KeyError(value) + + def pop(self): + if not self.col: + raise KeyError('pop from an empty set') + member = self.col.pop() + return self._get(member) + + def update(self, other): + for value in other: + self.add(value) + + def __ior__(self, other): + if not collections._set_binops_check_strict(self, other): + return NotImplemented + for value in other: + self.add(value) + return self + + def _set(self): + return set(iter(self)) + + def union(self, other): + return set(self).union(other) + + __or__ = union + + def difference(self, other): + return set(self).difference(other) + + __sub__ = difference + + def difference_update(self, other): + for value in other: + self.discard(value) + + def __isub__(self, other): + if not collections._set_binops_check_strict(self, other): + return NotImplemented + for value in other: + self.discard(value) + return self + + def intersection(self, other): + return set(self).intersection(other) + + __and__ = intersection + + def intersection_update(self, other): + want, have = self.intersection(other), set(self) + + remove, add = have - want, want - have + + for value in remove: + self.remove(value) + for value in add: + self.add(value) + + def __iand__(self, other): + if not collections._set_binops_check_strict(self, other): + return NotImplemented + want, have = self.intersection(other), set(self) + + remove, add = have - want, want - have + + for value in remove: + self.remove(value) + for value in add: + self.add(value) + return self + + def symmetric_difference(self, other): + return set(self).symmetric_difference(other) + + __xor__ = symmetric_difference + + def symmetric_difference_update(self, other): + want, have = self.symmetric_difference(other), set(self) + + remove, add = have - want, want - have + + for value in remove: + self.remove(value) + for value in add: + self.add(value) + + def __ixor__(self, other): + if not collections._set_binops_check_strict(self, other): + return NotImplemented + want, have = self.symmetric_difference(other), set(self) + + remove, add = have - want, want - have + + for value in remove: + self.remove(value) + for value in add: + self.add(value) + return self + + def issubset(self, other): + return set(self).issubset(other) + + def issuperset(self, other): + return set(self).issuperset(other) + + def clear(self): + self.col.clear() + + def copy(self): + return set(self) + + def __eq__(self, other): + return set(self) == other + + def __ne__(self, other): + return set(self) != other + + def __lt__(self, other): + return set(self) < other + + def __le__(self, other): + return set(self) <= other + + def __gt__(self, other): + return set(self) > other + + def __ge__(self, other): + return set(self) >= other + + def __repr__(self): + return repr(set(self)) + + def __hash__(self): + raise TypeError("%s objects are unhashable" % type(self).__name__) + + for func_name, func in list(locals().items()): + if (util.callable(func) and func.__name__ == func_name and + not func.__doc__ and hasattr(set, func_name)): + func.__doc__ = getattr(set, func_name).__doc__ + del func_name, func diff --git a/app/lib/sqlalchemy/ext/automap.py b/app/lib/sqlalchemy/ext/automap.py new file mode 100644 index 0000000..219bfe1 --- /dev/null +++ b/app/lib/sqlalchemy/ext/automap.py @@ -0,0 +1,1048 @@ +# ext/automap.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +r"""Define an extension to the :mod:`sqlalchemy.ext.declarative` system +which automatically generates mapped classes and relationships from a database +schema, typically though not necessarily one which is reflected. + +.. versionadded:: 0.9.1 Added :mod:`sqlalchemy.ext.automap`. + +It is hoped that the :class:`.AutomapBase` system provides a quick +and modernized solution to the problem that the very famous +`SQLSoup `_ +also tries to solve, that of generating a quick and rudimentary object +model from an existing database on the fly. By addressing the issue strictly +at the mapper configuration level, and integrating fully with existing +Declarative class techniques, :class:`.AutomapBase` seeks to provide +a well-integrated approach to the issue of expediently auto-generating ad-hoc +mappings. + + +Basic Use +========= + +The simplest usage is to reflect an existing database into a new model. +We create a new :class:`.AutomapBase` class in a similar manner as to how +we create a declarative base class, using :func:`.automap_base`. +We then call :meth:`.AutomapBase.prepare` on the resulting base class, +asking it to reflect the schema and produce mappings:: + + from sqlalchemy.ext.automap import automap_base + from sqlalchemy.orm import Session + from sqlalchemy import create_engine + + Base = automap_base() + + # engine, suppose it has two tables 'user' and 'address' set up + engine = create_engine("sqlite:///mydatabase.db") + + # reflect the tables + Base.prepare(engine, reflect=True) + + # mapped classes are now created with names by default + # matching that of the table name. + User = Base.classes.user + Address = Base.classes.address + + session = Session(engine) + + # rudimentary relationships are produced + session.add(Address(email_address="foo@bar.com", user=User(name="foo"))) + session.commit() + + # collection-based relationships are by default named + # "_collection" + print (u1.address_collection) + +Above, calling :meth:`.AutomapBase.prepare` while passing along the +:paramref:`.AutomapBase.prepare.reflect` parameter indicates that the +:meth:`.MetaData.reflect` method will be called on this declarative base +classes' :class:`.MetaData` collection; then, each **viable** +:class:`.Table` within the :class:`.MetaData` will get a new mapped class +generated automatically. The :class:`.ForeignKeyConstraint` objects which +link the various tables together will be used to produce new, bidirectional +:func:`.relationship` objects between classes. The classes and relationships +follow along a default naming scheme that we can customize. At this point, +our basic mapping consisting of related ``User`` and ``Address`` classes is +ready to use in the traditional way. + +.. note:: By **viable**, we mean that for a table to be mapped, it must + specify a primary key. Additionally, if the table is detected as being + a pure association table between two other tables, it will not be directly + mapped and will instead be configured as a many-to-many table between + the mappings for the two referring tables. + +Generating Mappings from an Existing MetaData +============================================= + +We can pass a pre-declared :class:`.MetaData` object to :func:`.automap_base`. +This object can be constructed in any way, including programmatically, from +a serialized file, or from itself being reflected using +:meth:`.MetaData.reflect`. Below we illustrate a combination of reflection and +explicit table declaration:: + + from sqlalchemy import create_engine, MetaData, Table, Column, ForeignKey + engine = create_engine("sqlite:///mydatabase.db") + + # produce our own MetaData object + metadata = MetaData() + + # we can reflect it ourselves from a database, using options + # such as 'only' to limit what tables we look at... + metadata.reflect(engine, only=['user', 'address']) + + # ... or just define our own Table objects with it (or combine both) + Table('user_order', metadata, + Column('id', Integer, primary_key=True), + Column('user_id', ForeignKey('user.id')) + ) + + # we can then produce a set of mappings from this MetaData. + Base = automap_base(metadata=metadata) + + # calling prepare() just sets up mapped classes and relationships. + Base.prepare() + + # mapped classes are ready + User, Address, Order = Base.classes.user, Base.classes.address,\ + Base.classes.user_order + +Specifying Classes Explicitly +============================= + +The :mod:`.sqlalchemy.ext.automap` extension allows classes to be defined +explicitly, in a way similar to that of the :class:`.DeferredReflection` class. +Classes that extend from :class:`.AutomapBase` act like regular declarative +classes, but are not immediately mapped after their construction, and are +instead mapped when we call :meth:`.AutomapBase.prepare`. The +:meth:`.AutomapBase.prepare` method will make use of the classes we've +established based on the table name we use. If our schema contains tables +``user`` and ``address``, we can define one or both of the classes to be used:: + + from sqlalchemy.ext.automap import automap_base + from sqlalchemy import create_engine + + # automap base + Base = automap_base() + + # pre-declare User for the 'user' table + class User(Base): + __tablename__ = 'user' + + # override schema elements like Columns + user_name = Column('name', String) + + # override relationships too, if desired. + # we must use the same name that automap would use for the + # relationship, and also must refer to the class name that automap will + # generate for "address" + address_collection = relationship("address", collection_class=set) + + # reflect + engine = create_engine("sqlite:///mydatabase.db") + Base.prepare(engine, reflect=True) + + # we still have Address generated from the tablename "address", + # but User is the same as Base.classes.User now + + Address = Base.classes.address + + u1 = session.query(User).first() + print (u1.address_collection) + + # the backref is still there: + a1 = session.query(Address).first() + print (a1.user) + +Above, one of the more intricate details is that we illustrated overriding +one of the :func:`.relationship` objects that automap would have created. +To do this, we needed to make sure the names match up with what automap +would normally generate, in that the relationship name would be +``User.address_collection`` and the name of the class referred to, from +automap's perspective, is called ``address``, even though we are referring to +it as ``Address`` within our usage of this class. + +Overriding Naming Schemes +========================= + +:mod:`.sqlalchemy.ext.automap` is tasked with producing mapped classes and +relationship names based on a schema, which means it has decision points in how +these names are determined. These three decision points are provided using +functions which can be passed to the :meth:`.AutomapBase.prepare` method, and +are known as :func:`.classname_for_table`, +:func:`.name_for_scalar_relationship`, +and :func:`.name_for_collection_relationship`. Any or all of these +functions are provided as in the example below, where we use a "camel case" +scheme for class names and a "pluralizer" for collection names using the +`Inflect `_ package:: + + import re + import inflect + + def camelize_classname(base, tablename, table): + "Produce a 'camelized' class name, e.g. " + "'words_and_underscores' -> 'WordsAndUnderscores'" + + return str(tablename[0].upper() + \ + re.sub(r'_([a-z])', lambda m: m.group(1).upper(), tablename[1:])) + + _pluralizer = inflect.engine() + def pluralize_collection(base, local_cls, referred_cls, constraint): + "Produce an 'uncamelized', 'pluralized' class name, e.g. " + "'SomeTerm' -> 'some_terms'" + + referred_name = referred_cls.__name__ + uncamelized = re.sub(r'[A-Z]', + lambda m: "_%s" % m.group(0).lower(), + referred_name)[1:] + pluralized = _pluralizer.plural(uncamelized) + return pluralized + + from sqlalchemy.ext.automap import automap_base + + Base = automap_base() + + engine = create_engine("sqlite:///mydatabase.db") + + Base.prepare(engine, reflect=True, + classname_for_table=camelize_classname, + name_for_collection_relationship=pluralize_collection + ) + +From the above mapping, we would now have classes ``User`` and ``Address``, +where the collection from ``User`` to ``Address`` is called +``User.addresses``:: + + User, Address = Base.classes.User, Base.classes.Address + + u1 = User(addresses=[Address(email="foo@bar.com")]) + +Relationship Detection +====================== + +The vast majority of what automap accomplishes is the generation of +:func:`.relationship` structures based on foreign keys. The mechanism +by which this works for many-to-one and one-to-many relationships is as +follows: + +1. A given :class:`.Table`, known to be mapped to a particular class, + is examined for :class:`.ForeignKeyConstraint` objects. + +2. From each :class:`.ForeignKeyConstraint`, the remote :class:`.Table` + object present is matched up to the class to which it is to be mapped, + if any, else it is skipped. + +3. As the :class:`.ForeignKeyConstraint` we are examining corresponds to a + reference from the immediate mapped class, the relationship will be set up + as a many-to-one referring to the referred class; a corresponding + one-to-many backref will be created on the referred class referring + to this class. + +4. If any of the columns that are part of the :class:`.ForeignKeyConstraint` + are not nullable (e.g. ``nullable=False``), a + :paramref:`~.relationship.cascade` keyword argument + of ``all, delete-orphan`` will be added to the keyword arguments to + be passed to the relationship or backref. If the + :class:`.ForeignKeyConstraint` reports that + :paramref:`.ForeignKeyConstraint.ondelete` + is set to ``CASCADE`` for a not null or ``SET NULL`` for a nullable + set of columns, the option :paramref:`~.relationship.passive_deletes` + flag is set to ``True`` in the set of relationship keyword arguments. + Note that not all backends support reflection of ON DELETE. + + .. versionadded:: 1.0.0 - automap will detect non-nullable foreign key + constraints when producing a one-to-many relationship and establish + a default cascade of ``all, delete-orphan`` if so; additionally, + if the constraint specifies :paramref:`.ForeignKeyConstraint.ondelete` + of ``CASCADE`` for non-nullable or ``SET NULL`` for nullable columns, + the ``passive_deletes=True`` option is also added. + +5. The names of the relationships are determined using the + :paramref:`.AutomapBase.prepare.name_for_scalar_relationship` and + :paramref:`.AutomapBase.prepare.name_for_collection_relationship` + callable functions. It is important to note that the default relationship + naming derives the name from the **the actual class name**. If you've + given a particular class an explicit name by declaring it, or specified an + alternate class naming scheme, that's the name from which the relationship + name will be derived. + +6. The classes are inspected for an existing mapped property matching these + names. If one is detected on one side, but none on the other side, + :class:`.AutomapBase` attempts to create a relationship on the missing side, + then uses the :paramref:`.relationship.back_populates` parameter in order to + point the new relationship to the other side. + +7. In the usual case where no relationship is on either side, + :meth:`.AutomapBase.prepare` produces a :func:`.relationship` on the + "many-to-one" side and matches it to the other using the + :paramref:`.relationship.backref` parameter. + +8. Production of the :func:`.relationship` and optionally the :func:`.backref` + is handed off to the :paramref:`.AutomapBase.prepare.generate_relationship` + function, which can be supplied by the end-user in order to augment + the arguments passed to :func:`.relationship` or :func:`.backref` or to + make use of custom implementations of these functions. + +Custom Relationship Arguments +----------------------------- + +The :paramref:`.AutomapBase.prepare.generate_relationship` hook can be used +to add parameters to relationships. For most cases, we can make use of the +existing :func:`.automap.generate_relationship` function to return +the object, after augmenting the given keyword dictionary with our own +arguments. + +Below is an illustration of how to send +:paramref:`.relationship.cascade` and +:paramref:`.relationship.passive_deletes` +options along to all one-to-many relationships:: + + from sqlalchemy.ext.automap import generate_relationship + + def _gen_relationship(base, direction, return_fn, + attrname, local_cls, referred_cls, **kw): + if direction is interfaces.ONETOMANY: + kw['cascade'] = 'all, delete-orphan' + kw['passive_deletes'] = True + # make use of the built-in function to actually return + # the result. + return generate_relationship(base, direction, return_fn, + attrname, local_cls, referred_cls, **kw) + + from sqlalchemy.ext.automap import automap_base + from sqlalchemy import create_engine + + # automap base + Base = automap_base() + + engine = create_engine("sqlite:///mydatabase.db") + Base.prepare(engine, reflect=True, + generate_relationship=_gen_relationship) + +Many-to-Many relationships +-------------------------- + +:mod:`.sqlalchemy.ext.automap` will generate many-to-many relationships, e.g. +those which contain a ``secondary`` argument. The process for producing these +is as follows: + +1. A given :class:`.Table` is examined for :class:`.ForeignKeyConstraint` + objects, before any mapped class has been assigned to it. + +2. If the table contains two and exactly two :class:`.ForeignKeyConstraint` + objects, and all columns within this table are members of these two + :class:`.ForeignKeyConstraint` objects, the table is assumed to be a + "secondary" table, and will **not be mapped directly**. + +3. The two (or one, for self-referential) external tables to which the + :class:`.Table` refers to are matched to the classes to which they will be + mapped, if any. + +4. If mapped classes for both sides are located, a many-to-many bi-directional + :func:`.relationship` / :func:`.backref` pair is created between the two + classes. + +5. The override logic for many-to-many works the same as that of one-to-many/ + many-to-one; the :func:`.generate_relationship` function is called upon + to generate the strucures and existing attributes will be maintained. + +Relationships with Inheritance +------------------------------ + +:mod:`.sqlalchemy.ext.automap` will not generate any relationships between +two classes that are in an inheritance relationship. That is, with two +classes given as follows:: + + class Employee(Base): + __tablename__ = 'employee' + id = Column(Integer, primary_key=True) + type = Column(String(50)) + __mapper_args__ = { + 'polymorphic_identity':'employee', 'polymorphic_on': type + } + + class Engineer(Employee): + __tablename__ = 'engineer' + id = Column(Integer, ForeignKey('employee.id'), primary_key=True) + __mapper_args__ = { + 'polymorphic_identity':'engineer', + } + +The foreign key from ``Engineer`` to ``Employee`` is used not for a +relationship, but to establish joined inheritance between the two classes. + +Note that this means automap will not generate *any* relationships +for foreign keys that link from a subclass to a superclass. If a mapping +has actual relationships from subclass to superclass as well, those +need to be explicit. Below, as we have two separate foreign keys +from ``Engineer`` to ``Employee``, we need to set up both the relationship +we want as well as the ``inherit_condition``, as these are not things +SQLAlchemy can guess:: + + class Employee(Base): + __tablename__ = 'employee' + id = Column(Integer, primary_key=True) + type = Column(String(50)) + + __mapper_args__ = { + 'polymorphic_identity':'employee', 'polymorphic_on':type + } + + class Engineer(Employee): + __tablename__ = 'engineer' + id = Column(Integer, ForeignKey('employee.id'), primary_key=True) + favorite_employee_id = Column(Integer, ForeignKey('employee.id')) + + favorite_employee = relationship(Employee, + foreign_keys=favorite_employee_id) + + __mapper_args__ = { + 'polymorphic_identity':'engineer', + 'inherit_condition': id == Employee.id + } + +Handling Simple Naming Conflicts +-------------------------------- + +In the case of naming conflicts during mapping, override any of +:func:`.classname_for_table`, :func:`.name_for_scalar_relationship`, +and :func:`.name_for_collection_relationship` as needed. For example, if +automap is attempting to name a many-to-one relationship the same as an +existing column, an alternate convention can be conditionally selected. Given +a schema: + +.. sourcecode:: sql + + CREATE TABLE table_a ( + id INTEGER PRIMARY KEY + ); + + CREATE TABLE table_b ( + id INTEGER PRIMARY KEY, + table_a INTEGER, + FOREIGN KEY(table_a) REFERENCES table_a(id) + ); + +The above schema will first automap the ``table_a`` table as a class named +``table_a``; it will then automap a relationship onto the class for ``table_b`` +with the same name as this related class, e.g. ``table_a``. This +relationship name conflicts with the mapping column ``table_b.table_a``, +and will emit an error on mapping. + +We can resolve this conflict by using an underscore as follows:: + + def name_for_scalar_relationship(base, local_cls, referred_cls, constraint): + name = referred_cls.__name__.lower() + local_table = local_cls.__table__ + if name in local_table.columns: + newname = name + "_" + warnings.warn( + "Already detected name %s present. using %s" % + (name, newname)) + return newname + return name + + + Base.prepare(engine, reflect=True, + name_for_scalar_relationship=name_for_scalar_relationship) + +Alternatively, we can change the name on the column side. The columns +that are mapped can be modified using the technique described at +:ref:`mapper_column_distinct_names`, by assigning the column explicitly +to a new name:: + + Base = automap_base() + + class TableB(Base): + __tablename__ = 'table_b' + _table_a = Column('table_a', ForeignKey('table_a.id')) + + Base.prepare(engine, reflect=True) + + +Using Automap with Explicit Declarations +======================================== + +As noted previously, automap has no dependency on reflection, and can make +use of any collection of :class:`.Table` objects within a :class:`.MetaData` +collection. From this, it follows that automap can also be used +generate missing relationships given an otherwise complete model that fully +defines table metadata:: + + from sqlalchemy.ext.automap import automap_base + from sqlalchemy import Column, Integer, String, ForeignKey + + Base = automap_base() + + class User(Base): + __tablename__ = 'user' + + id = Column(Integer, primary_key=True) + name = Column(String) + + class Address(Base): + __tablename__ = 'address' + + id = Column(Integer, primary_key=True) + email = Column(String) + user_id = Column(ForeignKey('user.id')) + + # produce relationships + Base.prepare() + + # mapping is complete, with "address_collection" and + # "user" relationships + a1 = Address(email='u1') + a2 = Address(email='u2') + u1 = User(address_collection=[a1, a2]) + assert a1.user is u1 + +Above, given mostly complete ``User`` and ``Address`` mappings, the +:class:`.ForeignKey` which we defined on ``Address.user_id`` allowed a +bidirectional relationship pair ``Address.user`` and +``User.address_collection`` to be generated on the mapped classes. + +Note that when subclassing :class:`.AutomapBase`, +the :meth:`.AutomapBase.prepare` method is required; if not called, the classes +we've declared are in an un-mapped state. + + +""" +from .declarative import declarative_base as _declarative_base +from .declarative.base import _DeferredMapperConfig +from ..sql import and_ +from ..schema import ForeignKeyConstraint +from ..orm import relationship, backref, interfaces +from .. import util + + +def classname_for_table(base, tablename, table): + """Return the class name that should be used, given the name + of a table. + + The default implementation is:: + + return str(tablename) + + Alternate implementations can be specified using the + :paramref:`.AutomapBase.prepare.classname_for_table` + parameter. + + :param base: the :class:`.AutomapBase` class doing the prepare. + + :param tablename: string name of the :class:`.Table`. + + :param table: the :class:`.Table` object itself. + + :return: a string class name. + + .. note:: + + In Python 2, the string used for the class name **must** be a + non-Unicode object, e.g. a ``str()`` object. The ``.name`` attribute + of :class:`.Table` is typically a Python unicode subclass, so the + ``str()`` function should be applied to this name, after accounting for + any non-ASCII characters. + + """ + return str(tablename) + + +def name_for_scalar_relationship(base, local_cls, referred_cls, constraint): + """Return the attribute name that should be used to refer from one + class to another, for a scalar object reference. + + The default implementation is:: + + return referred_cls.__name__.lower() + + Alternate implementations can be specified using the + :paramref:`.AutomapBase.prepare.name_for_scalar_relationship` + parameter. + + :param base: the :class:`.AutomapBase` class doing the prepare. + + :param local_cls: the class to be mapped on the local side. + + :param referred_cls: the class to be mapped on the referring side. + + :param constraint: the :class:`.ForeignKeyConstraint` that is being + inspected to produce this relationship. + + """ + return referred_cls.__name__.lower() + + +def name_for_collection_relationship( + base, local_cls, referred_cls, constraint): + """Return the attribute name that should be used to refer from one + class to another, for a collection reference. + + The default implementation is:: + + return referred_cls.__name__.lower() + "_collection" + + Alternate implementations + can be specified using the + :paramref:`.AutomapBase.prepare.name_for_collection_relationship` + parameter. + + :param base: the :class:`.AutomapBase` class doing the prepare. + + :param local_cls: the class to be mapped on the local side. + + :param referred_cls: the class to be mapped on the referring side. + + :param constraint: the :class:`.ForeignKeyConstraint` that is being + inspected to produce this relationship. + + """ + return referred_cls.__name__.lower() + "_collection" + + +def generate_relationship( + base, direction, return_fn, attrname, local_cls, referred_cls, **kw): + r"""Generate a :func:`.relationship` or :func:`.backref` on behalf of two + mapped classes. + + An alternate implementation of this function can be specified using the + :paramref:`.AutomapBase.prepare.generate_relationship` parameter. + + The default implementation of this function is as follows:: + + if return_fn is backref: + return return_fn(attrname, **kw) + elif return_fn is relationship: + return return_fn(referred_cls, **kw) + else: + raise TypeError("Unknown relationship function: %s" % return_fn) + + :param base: the :class:`.AutomapBase` class doing the prepare. + + :param direction: indicate the "direction" of the relationship; this will + be one of :data:`.ONETOMANY`, :data:`.MANYTOONE`, :data:`.MANYTOMANY`. + + :param return_fn: the function that is used by default to create the + relationship. This will be either :func:`.relationship` or + :func:`.backref`. The :func:`.backref` function's result will be used to + produce a new :func:`.relationship` in a second step, so it is critical + that user-defined implementations correctly differentiate between the two + functions, if a custom relationship function is being used. + + :param attrname: the attribute name to which this relationship is being + assigned. If the value of :paramref:`.generate_relationship.return_fn` is + the :func:`.backref` function, then this name is the name that is being + assigned to the backref. + + :param local_cls: the "local" class to which this relationship or backref + will be locally present. + + :param referred_cls: the "referred" class to which the relationship or + backref refers to. + + :param \**kw: all additional keyword arguments are passed along to the + function. + + :return: a :func:`.relationship` or :func:`.backref` construct, as dictated + by the :paramref:`.generate_relationship.return_fn` parameter. + + """ + if return_fn is backref: + return return_fn(attrname, **kw) + elif return_fn is relationship: + return return_fn(referred_cls, **kw) + else: + raise TypeError("Unknown relationship function: %s" % return_fn) + + +class AutomapBase(object): + """Base class for an "automap" schema. + + The :class:`.AutomapBase` class can be compared to the "declarative base" + class that is produced by the :func:`.declarative.declarative_base` + function. In practice, the :class:`.AutomapBase` class is always used + as a mixin along with an actual declarative base. + + A new subclassable :class:`.AutomapBase` is typically instantated + using the :func:`.automap_base` function. + + .. seealso:: + + :ref:`automap_toplevel` + + """ + __abstract__ = True + + classes = None + """An instance of :class:`.util.Properties` containing classes. + + This object behaves much like the ``.c`` collection on a table. Classes + are present under the name they were given, e.g.:: + + Base = automap_base() + Base.prepare(engine=some_engine, reflect=True) + + User, Address = Base.classes.User, Base.classes.Address + + """ + + @classmethod + def prepare( + cls, + engine=None, + reflect=False, + schema=None, + classname_for_table=classname_for_table, + collection_class=list, + name_for_scalar_relationship=name_for_scalar_relationship, + name_for_collection_relationship=name_for_collection_relationship, + generate_relationship=generate_relationship): + """Extract mapped classes and relationships from the :class:`.MetaData` and + perform mappings. + + :param engine: an :class:`.Engine` or :class:`.Connection` with which + to perform schema reflection, if specified. + If the :paramref:`.AutomapBase.prepare.reflect` argument is False, + this object is not used. + + :param reflect: if True, the :meth:`.MetaData.reflect` method is called + on the :class:`.MetaData` associated with this :class:`.AutomapBase`. + The :class:`.Engine` passed via + :paramref:`.AutomapBase.prepare.engine` will be used to perform the + reflection if present; else, the :class:`.MetaData` should already be + bound to some engine else the operation will fail. + + :param classname_for_table: callable function which will be used to + produce new class names, given a table name. Defaults to + :func:`.classname_for_table`. + + :param name_for_scalar_relationship: callable function which will be + used to produce relationship names for scalar relationships. Defaults + to :func:`.name_for_scalar_relationship`. + + :param name_for_collection_relationship: callable function which will + be used to produce relationship names for collection-oriented + relationships. Defaults to :func:`.name_for_collection_relationship`. + + :param generate_relationship: callable function which will be used to + actually generate :func:`.relationship` and :func:`.backref` + constructs. Defaults to :func:`.generate_relationship`. + + :param collection_class: the Python collection class that will be used + when a new :func:`.relationship` object is created that represents a + collection. Defaults to ``list``. + + :param schema: When present in conjunction with the + :paramref:`.AutomapBase.prepare.reflect` flag, is passed to + :meth:`.MetaData.reflect` to indicate the primary schema where tables + should be reflected from. When omitted, the default schema in use + by the database connection is used. + + .. versionadded:: 1.1 + + """ + if reflect: + cls.metadata.reflect( + engine, + schema=schema, + extend_existing=True, + autoload_replace=False + ) + + table_to_map_config = dict( + (m.local_table, m) + for m in _DeferredMapperConfig. + classes_for_base(cls, sort=False) + ) + + many_to_many = [] + + for table in cls.metadata.tables.values(): + lcl_m2m, rem_m2m, m2m_const = _is_many_to_many(cls, table) + if lcl_m2m is not None: + many_to_many.append((lcl_m2m, rem_m2m, m2m_const, table)) + elif not table.primary_key: + continue + elif table not in table_to_map_config: + mapped_cls = type( + classname_for_table(cls, table.name, table), + (cls, ), + {"__table__": table} + ) + map_config = _DeferredMapperConfig.config_for_cls(mapped_cls) + cls.classes[map_config.cls.__name__] = mapped_cls + table_to_map_config[table] = map_config + + for map_config in table_to_map_config.values(): + _relationships_for_fks(cls, + map_config, + table_to_map_config, + collection_class, + name_for_scalar_relationship, + name_for_collection_relationship, + generate_relationship) + + for lcl_m2m, rem_m2m, m2m_const, table in many_to_many: + _m2m_relationship(cls, lcl_m2m, rem_m2m, m2m_const, table, + table_to_map_config, + collection_class, + name_for_scalar_relationship, + name_for_collection_relationship, + generate_relationship) + + for map_config in _DeferredMapperConfig.classes_for_base(cls): + map_config.map() + + _sa_decl_prepare = True + """Indicate that the mapping of classes should be deferred. + + The presence of this attribute name indicates to declarative + that the call to mapper() should not occur immediately; instead, + information about the table and attributes to be mapped are gathered + into an internal structure called _DeferredMapperConfig. These + objects can be collected later using classes_for_base(), additional + mapping decisions can be made, and then the map() method will actually + apply the mapping. + + The only real reason this deferral of the whole + thing is needed is to support primary key columns that aren't reflected + yet when the class is declared; everything else can theoretically be + added to the mapper later. However, the _DeferredMapperConfig is a + nice interface in any case which exists at that not usually exposed point + at which declarative has the class and the Table but hasn't called + mapper() yet. + + """ + + +def automap_base(declarative_base=None, **kw): + r"""Produce a declarative automap base. + + This function produces a new base class that is a product of the + :class:`.AutomapBase` class as well a declarative base produced by + :func:`.declarative.declarative_base`. + + All parameters other than ``declarative_base`` are keyword arguments + that are passed directly to the :func:`.declarative.declarative_base` + function. + + :param declarative_base: an existing class produced by + :func:`.declarative.declarative_base`. When this is passed, the function + no longer invokes :func:`.declarative.declarative_base` itself, and all + other keyword arguments are ignored. + + :param \**kw: keyword arguments are passed along to + :func:`.declarative.declarative_base`. + + """ + if declarative_base is None: + Base = _declarative_base(**kw) + else: + Base = declarative_base + + return type( + Base.__name__, + (AutomapBase, Base,), + {"__abstract__": True, "classes": util.Properties({})} + ) + + +def _is_many_to_many(automap_base, table): + fk_constraints = [const for const in table.constraints + if isinstance(const, ForeignKeyConstraint)] + if len(fk_constraints) != 2: + return None, None, None + + cols = sum( + [[fk.parent for fk in fk_constraint.elements] + for fk_constraint in fk_constraints], []) + + if set(cols) != set(table.c): + return None, None, None + + return ( + fk_constraints[0].elements[0].column.table, + fk_constraints[1].elements[0].column.table, + fk_constraints + ) + + +def _relationships_for_fks(automap_base, map_config, table_to_map_config, + collection_class, + name_for_scalar_relationship, + name_for_collection_relationship, + generate_relationship): + local_table = map_config.local_table + local_cls = map_config.cls + + if local_table is None: + return + for constraint in local_table.constraints: + if isinstance(constraint, ForeignKeyConstraint): + fks = constraint.elements + referred_table = fks[0].column.table + referred_cfg = table_to_map_config.get(referred_table, None) + if referred_cfg is None: + continue + referred_cls = referred_cfg.cls + + if local_cls is not referred_cls and issubclass( + local_cls, referred_cls): + continue + + relationship_name = name_for_scalar_relationship( + automap_base, + local_cls, + referred_cls, constraint) + backref_name = name_for_collection_relationship( + automap_base, + referred_cls, + local_cls, + constraint + ) + + o2m_kws = {} + nullable = False not in set([fk.parent.nullable for fk in fks]) + if not nullable: + o2m_kws['cascade'] = "all, delete-orphan" + + if constraint.ondelete and \ + constraint.ondelete.lower() == "cascade": + o2m_kws['passive_deletes'] = True + else: + if constraint.ondelete and \ + constraint.ondelete.lower() == "set null": + o2m_kws['passive_deletes'] = True + + create_backref = backref_name not in referred_cfg.properties + + if relationship_name not in map_config.properties: + if create_backref: + backref_obj = generate_relationship( + automap_base, + interfaces.ONETOMANY, backref, + backref_name, referred_cls, local_cls, + collection_class=collection_class, + **o2m_kws) + else: + backref_obj = None + rel = generate_relationship(automap_base, + interfaces.MANYTOONE, + relationship, + relationship_name, + local_cls, referred_cls, + foreign_keys=[ + fk.parent + for fk in constraint.elements], + backref=backref_obj, + remote_side=[ + fk.column + for fk in constraint.elements] + ) + if rel is not None: + map_config.properties[relationship_name] = rel + if not create_backref: + referred_cfg.properties[ + backref_name].back_populates = relationship_name + elif create_backref: + rel = generate_relationship(automap_base, + interfaces.ONETOMANY, + relationship, + backref_name, + referred_cls, local_cls, + foreign_keys=[ + fk.parent + for fk in constraint.elements], + back_populates=relationship_name, + collection_class=collection_class, + **o2m_kws) + if rel is not None: + referred_cfg.properties[backref_name] = rel + map_config.properties[ + relationship_name].back_populates = backref_name + + +def _m2m_relationship(automap_base, lcl_m2m, rem_m2m, m2m_const, table, + table_to_map_config, + collection_class, + name_for_scalar_relationship, + name_for_collection_relationship, + generate_relationship): + + map_config = table_to_map_config.get(lcl_m2m, None) + referred_cfg = table_to_map_config.get(rem_m2m, None) + if map_config is None or referred_cfg is None: + return + + local_cls = map_config.cls + referred_cls = referred_cfg.cls + + relationship_name = name_for_collection_relationship( + automap_base, + local_cls, + referred_cls, m2m_const[0]) + backref_name = name_for_collection_relationship( + automap_base, + referred_cls, + local_cls, + m2m_const[1] + ) + + create_backref = backref_name not in referred_cfg.properties + + if relationship_name not in map_config.properties: + if create_backref: + backref_obj = generate_relationship( + automap_base, + interfaces.MANYTOMANY, + backref, + backref_name, + referred_cls, local_cls, + collection_class=collection_class + ) + else: + backref_obj = None + rel = generate_relationship(automap_base, + interfaces.MANYTOMANY, + relationship, + relationship_name, + local_cls, referred_cls, + secondary=table, + primaryjoin=and_( + fk.column == fk.parent + for fk in m2m_const[0].elements), + secondaryjoin=and_( + fk.column == fk.parent + for fk in m2m_const[1].elements), + backref=backref_obj, + collection_class=collection_class + ) + if rel is not None: + map_config.properties[relationship_name] = rel + + if not create_backref: + referred_cfg.properties[ + backref_name].back_populates = relationship_name + elif create_backref: + rel = generate_relationship(automap_base, + interfaces.MANYTOMANY, + relationship, + backref_name, + referred_cls, local_cls, + secondary=table, + primaryjoin=and_( + fk.column == fk.parent + for fk in m2m_const[1].elements), + secondaryjoin=and_( + fk.column == fk.parent + for fk in m2m_const[0].elements), + back_populates=relationship_name, + collection_class=collection_class) + if rel is not None: + referred_cfg.properties[backref_name] = rel + map_config.properties[ + relationship_name].back_populates = backref_name diff --git a/app/lib/sqlalchemy/ext/baked.py b/app/lib/sqlalchemy/ext/baked.py new file mode 100644 index 0000000..68bd468 --- /dev/null +++ b/app/lib/sqlalchemy/ext/baked.py @@ -0,0 +1,559 @@ +# sqlalchemy/ext/baked.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +"""Baked query extension. + +Provides a creational pattern for the :class:`.query.Query` object which +allows the fully constructed object, Core select statement, and string +compiled result to be fully cached. + + +""" + +from ..orm.query import Query +from ..orm import strategies, attributes, properties, \ + strategy_options, util as orm_util, interfaces +from .. import log as sqla_log +from ..sql import util as sql_util, func, literal_column +from ..orm import exc as orm_exc +from .. import exc as sa_exc +from .. import util + +import copy +import logging + +log = logging.getLogger(__name__) + + +class BakedQuery(object): + """A builder object for :class:`.query.Query` objects.""" + + __slots__ = 'steps', '_bakery', '_cache_key', '_spoiled' + + def __init__(self, bakery, initial_fn, args=()): + self._cache_key = () + self._update_cache_key(initial_fn, args) + self.steps = [initial_fn] + self._spoiled = False + self._bakery = bakery + + @classmethod + def bakery(cls, size=200): + """Construct a new bakery.""" + + _bakery = util.LRUCache(size) + + def call(initial_fn, *args): + return cls(_bakery, initial_fn, args) + + return call + + def _clone(self): + b1 = BakedQuery.__new__(BakedQuery) + b1._cache_key = self._cache_key + b1.steps = list(self.steps) + b1._bakery = self._bakery + b1._spoiled = self._spoiled + return b1 + + def _update_cache_key(self, fn, args=()): + self._cache_key += (fn.__code__,) + args + + def __iadd__(self, other): + if isinstance(other, tuple): + self.add_criteria(*other) + else: + self.add_criteria(other) + return self + + def __add__(self, other): + if isinstance(other, tuple): + return self.with_criteria(*other) + else: + return self.with_criteria(other) + + def add_criteria(self, fn, *args): + """Add a criteria function to this :class:`.BakedQuery`. + + This is equivalent to using the ``+=`` operator to + modify a :class:`.BakedQuery` in-place. + + """ + self._update_cache_key(fn, args) + self.steps.append(fn) + return self + + def with_criteria(self, fn, *args): + """Add a criteria function to a :class:`.BakedQuery` cloned from this one. + + This is equivalent to using the ``+`` operator to + produce a new :class:`.BakedQuery` with modifications. + + """ + return self._clone().add_criteria(fn, *args) + + def for_session(self, session): + """Return a :class:`.Result` object for this :class:`.BakedQuery`. + + This is equivalent to calling the :class:`.BakedQuery` as a + Python callable, e.g. ``result = my_baked_query(session)``. + + """ + return Result(self, session) + + def __call__(self, session): + return self.for_session(session) + + def spoil(self, full=False): + """Cancel any query caching that will occur on this BakedQuery object. + + The BakedQuery can continue to be used normally, however additional + creational functions will not be cached; they will be called + on every invocation. + + This is to support the case where a particular step in constructing + a baked query disqualifies the query from being cacheable, such + as a variant that relies upon some uncacheable value. + + :param full: if False, only functions added to this + :class:`.BakedQuery` object subsequent to the spoil step will be + non-cached; the state of the :class:`.BakedQuery` up until + this point will be pulled from the cache. If True, then the + entire :class:`.Query` object is built from scratch each + time, with all creational functions being called on each + invocation. + + """ + if not full: + _spoil_point = self._clone() + _spoil_point._cache_key += ('_query_only', ) + self.steps = [_spoil_point._retrieve_baked_query] + self._spoiled = True + return self + + def _retrieve_baked_query(self, session): + query = self._bakery.get(self._cache_key, None) + if query is None: + query = self._as_query(session) + self._bakery[self._cache_key] = query.with_session(None) + return query.with_session(session) + + def _bake(self, session): + query = self._as_query(session) + + context = query._compile_context() + self._bake_subquery_loaders(session, context) + context.session = None + context.query = query = context.query.with_session(None) + query._execution_options = query._execution_options.union( + {"compiled_cache": self._bakery} + ) + # we'll be holding onto the query for some of its state, + # so delete some compilation-use-only attributes that can take up + # space + for attr in ( + '_correlate', '_from_obj', '_mapper_adapter_map', + '_joinpath', '_joinpoint'): + query.__dict__.pop(attr, None) + self._bakery[self._cache_key] = context + return context + + def _as_query(self, session): + query = self.steps[0](session) + + for step in self.steps[1:]: + query = step(query) + return query + + def _bake_subquery_loaders(self, session, context): + """convert subquery eager loaders in the cache into baked queries. + + For subquery eager loading to work, all we need here is that the + Query point to the correct session when it is run. However, since + we are "baking" anyway, we may as well also turn the query into + a "baked" query so that we save on performance too. + + """ + context.attributes['baked_queries'] = baked_queries = [] + for k, v in list(context.attributes.items()): + if isinstance(v, Query): + if 'subquery' in k: + bk = BakedQuery(self._bakery, lambda *args: v) + bk._cache_key = self._cache_key + k + bk._bake(session) + baked_queries.append((k, bk._cache_key, v)) + del context.attributes[k] + + def _unbake_subquery_loaders(self, session, context, params): + """Retrieve subquery eager loaders stored by _bake_subquery_loaders + and turn them back into Result objects that will iterate just + like a Query object. + + """ + for k, cache_key, query in context.attributes["baked_queries"]: + bk = BakedQuery(self._bakery, + lambda sess, q=query: q.with_session(sess)) + bk._cache_key = cache_key + context.attributes[k] = bk.for_session(session).params(**params) + + +class Result(object): + """Invokes a :class:`.BakedQuery` against a :class:`.Session`. + + The :class:`.Result` object is where the actual :class:`.query.Query` + object gets created, or retrieved from the cache, + against a target :class:`.Session`, and is then invoked for results. + + """ + __slots__ = 'bq', 'session', '_params' + + def __init__(self, bq, session): + self.bq = bq + self.session = session + self._params = {} + + def params(self, *args, **kw): + """Specify parameters to be replaced into the string SQL statement.""" + + if len(args) == 1: + kw.update(args[0]) + elif len(args) > 0: + raise sa_exc.ArgumentError( + "params() takes zero or one positional argument, " + "which is a dictionary.") + self._params.update(kw) + return self + + def _as_query(self): + return self.bq._as_query(self.session).params(self._params) + + def __str__(self): + return str(self._as_query()) + + def __iter__(self): + bq = self.bq + if bq._spoiled: + return iter(self._as_query()) + + baked_context = bq._bakery.get(bq._cache_key, None) + if baked_context is None: + baked_context = bq._bake(self.session) + + context = copy.copy(baked_context) + context.session = self.session + context.attributes = context.attributes.copy() + + bq._unbake_subquery_loaders(self.session, context, self._params) + + context.statement.use_labels = True + if context.autoflush and not context.populate_existing: + self.session._autoflush() + return context.query.params(self._params).\ + with_session(self.session)._execute_and_instances(context) + + def count(self): + """return the 'count'. + + Equivalent to :meth:`.Query.count`. + + Note this uses a subquery to ensure an accurate count regardless + of the structure of the original statement. + + .. versionadded:: 1.1.6 + + """ + + col = func.count(literal_column('*')) + bq = self.bq.with_criteria(lambda q: q.from_self(col)) + return bq.for_session(self.session).params(self._params).scalar() + + def scalar(self): + """Return the first element of the first result or None + if no rows present. If multiple rows are returned, + raises MultipleResultsFound. + + Equivalent to :meth:`.Query.scalar`. + + .. versionadded:: 1.1.6 + + """ + try: + ret = self.one() + if not isinstance(ret, tuple): + return ret + return ret[0] + except orm_exc.NoResultFound: + return None + + def first(self): + """Return the first row. + + Equivalent to :meth:`.Query.first`. + + """ + bq = self.bq.with_criteria(lambda q: q.slice(0, 1)) + ret = list(bq.for_session(self.session).params(self._params)) + if len(ret) > 0: + return ret[0] + else: + return None + + def one(self): + """Return exactly one result or raise an exception. + + Equivalent to :meth:`.Query.one`. + + """ + try: + ret = self.one_or_none() + except orm_exc.MultipleResultsFound: + raise orm_exc.MultipleResultsFound( + "Multiple rows were found for one()") + else: + if ret is None: + raise orm_exc.NoResultFound("No row was found for one()") + return ret + + def one_or_none(self): + """Return one or zero results, or raise an exception for multiple + rows. + + Equivalent to :meth:`.Query.one_or_none`. + + .. versionadded:: 1.0.9 + + """ + ret = list(self) + + l = len(ret) + if l == 1: + return ret[0] + elif l == 0: + return None + else: + raise orm_exc.MultipleResultsFound( + "Multiple rows were found for one_or_none()") + + def all(self): + """Return all rows. + + Equivalent to :meth:`.Query.all`. + + """ + return list(self) + + def get(self, ident): + """Retrieve an object based on identity. + + Equivalent to :meth:`.Query.get`. + + """ + + query = self.bq.steps[0](self.session) + return query._get_impl(ident, self._load_on_ident) + + def _load_on_ident(self, query, key): + """Load the given identity key from the database.""" + + ident = key[1] + + mapper = query._mapper_zero() + + _get_clause, _get_params = mapper._get_clause + + def setup(query): + _lcl_get_clause = _get_clause + q = query._clone() + q._get_condition() + q._order_by = None + + # None present in ident - turn those comparisons + # into "IS NULL" + if None in ident: + nones = set([ + _get_params[col].key for col, value in + zip(mapper.primary_key, ident) if value is None + ]) + _lcl_get_clause = sql_util.adapt_criterion_to_null( + _lcl_get_clause, nones) + + _lcl_get_clause = q._adapt_clause(_lcl_get_clause, True, False) + q._criterion = _lcl_get_clause + return q + + # cache the query against a key that includes + # which positions in the primary key are NULL + # (remember, we can map to an OUTER JOIN) + bq = self.bq + + # add the clause we got from mapper._get_clause to the cache + # key so that if a race causes multiple calls to _get_clause, + # we've cached on ours + bq = bq._clone() + bq._cache_key += (_get_clause, ) + + bq = bq.with_criteria(setup, tuple(elem is None for elem in ident)) + + params = dict([ + (_get_params[primary_key].key, id_val) + for id_val, primary_key in zip(ident, mapper.primary_key) + ]) + + result = list(bq.for_session(self.session).params(**params)) + l = len(result) + if l > 1: + raise orm_exc.MultipleResultsFound() + elif l: + return result[0] + else: + return None + + +def bake_lazy_loaders(): + """Enable the use of baked queries for all lazyloaders systemwide. + + This operation should be safe for all lazy loaders, and will reduce + Python overhead for these operations. + + """ + BakedLazyLoader._strategy_keys[:] = [] + + properties.RelationshipProperty.strategy_for( + lazy="select")(BakedLazyLoader) + properties.RelationshipProperty.strategy_for( + lazy=True)(BakedLazyLoader) + properties.RelationshipProperty.strategy_for( + lazy="baked_select")(BakedLazyLoader) + + strategies.LazyLoader._strategy_keys[:] = BakedLazyLoader._strategy_keys[:] + + +def unbake_lazy_loaders(): + """Disable the use of baked queries for all lazyloaders systemwide. + + This operation reverts the changes produced by :func:`.bake_lazy_loaders`. + + """ + strategies.LazyLoader._strategy_keys[:] = [] + BakedLazyLoader._strategy_keys[:] = [] + + properties.RelationshipProperty.strategy_for( + lazy="select")(strategies.LazyLoader) + properties.RelationshipProperty.strategy_for( + lazy=True)(strategies.LazyLoader) + properties.RelationshipProperty.strategy_for( + lazy="baked_select")(BakedLazyLoader) + assert strategies.LazyLoader._strategy_keys + + +@sqla_log.class_logger +@properties.RelationshipProperty.strategy_for(lazy="baked_select") +class BakedLazyLoader(strategies.LazyLoader): + + def _emit_lazyload(self, session, state, ident_key, passive): + q = BakedQuery( + self.mapper._compiled_cache, + lambda session: session.query(self.mapper)) + q.add_criteria( + lambda q: q._adapt_all_clauses()._with_invoke_all_eagers(False), + self.parent_property) + + if not self.parent_property.bake_queries: + q.spoil(full=True) + + if self.parent_property.secondary is not None: + q.add_criteria( + lambda q: + q.select_from(self.mapper, self.parent_property.secondary)) + + pending = not state.key + + # don't autoflush on pending + if pending or passive & attributes.NO_AUTOFLUSH: + q.add_criteria(lambda q: q.autoflush(False)) + + if state.load_options: + q.spoil() + args = state.load_path[self.parent_property] + q.add_criteria( + lambda q: + q._with_current_path(args), args) + q.add_criteria( + lambda q: q._conditional_options(*state.load_options)) + + if self.use_get: + return q(session)._load_on_ident( + session.query(self.mapper), ident_key) + + if self.parent_property.order_by: + q.add_criteria( + lambda q: + q.order_by(*util.to_list(self.parent_property.order_by))) + + for rev in self.parent_property._reverse_property: + # reverse props that are MANYTOONE are loading *this* + # object from get(), so don't need to eager out to those. + if rev.direction is interfaces.MANYTOONE and \ + rev._use_get and \ + not isinstance(rev.strategy, strategies.LazyLoader): + + q.add_criteria( + lambda q: + q.options( + strategy_options.Load.for_existing_path( + q._current_path[rev.parent] + ).baked_lazyload(rev.key) + ) + ) + + lazy_clause, params = self._generate_lazy_clause(state, passive) + + if pending: + if orm_util._none_set.intersection(params.values()): + return None + + q.add_criteria(lambda q: q.filter(lazy_clause)) + result = q(session).params(**params).all() + if self.uselist: + return result + else: + l = len(result) + if l: + if l > 1: + util.warn( + "Multiple rows returned with " + "uselist=False for lazily-loaded attribute '%s' " + % self.parent_property) + + return result[0] + else: + return None + + +@strategy_options.loader_option() +def baked_lazyload(loadopt, attr): + """Indicate that the given attribute should be loaded using "lazy" + loading with a "baked" query used in the load. + + """ + return loadopt.set_relationship_strategy(attr, {"lazy": "baked_select"}) + + +@baked_lazyload._add_unbound_fn +def baked_lazyload(*keys): + return strategy_options._UnboundLoad._from_keys( + strategy_options._UnboundLoad.baked_lazyload, keys, False, {}) + + +@baked_lazyload._add_unbound_all_fn +def baked_lazyload_all(*keys): + return strategy_options._UnboundLoad._from_keys( + strategy_options._UnboundLoad.baked_lazyload, keys, True, {}) + +baked_lazyload = baked_lazyload._unbound_fn +baked_lazyload_all = baked_lazyload_all._unbound_all_fn + +bakery = BakedQuery.bakery diff --git a/app/lib/sqlalchemy/ext/compiler.py b/app/lib/sqlalchemy/ext/compiler.py new file mode 100644 index 0000000..8b2bc95 --- /dev/null +++ b/app/lib/sqlalchemy/ext/compiler.py @@ -0,0 +1,474 @@ +# ext/compiler.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +r"""Provides an API for creation of custom ClauseElements and compilers. + +Synopsis +======== + +Usage involves the creation of one or more +:class:`~sqlalchemy.sql.expression.ClauseElement` subclasses and one or +more callables defining its compilation:: + + from sqlalchemy.ext.compiler import compiles + from sqlalchemy.sql.expression import ColumnClause + + class MyColumn(ColumnClause): + pass + + @compiles(MyColumn) + def compile_mycolumn(element, compiler, **kw): + return "[%s]" % element.name + +Above, ``MyColumn`` extends :class:`~sqlalchemy.sql.expression.ColumnClause`, +the base expression element for named column objects. The ``compiles`` +decorator registers itself with the ``MyColumn`` class so that it is invoked +when the object is compiled to a string:: + + from sqlalchemy import select + + s = select([MyColumn('x'), MyColumn('y')]) + print str(s) + +Produces:: + + SELECT [x], [y] + +Dialect-specific compilation rules +================================== + +Compilers can also be made dialect-specific. The appropriate compiler will be +invoked for the dialect in use:: + + from sqlalchemy.schema import DDLElement + + class AlterColumn(DDLElement): + + def __init__(self, column, cmd): + self.column = column + self.cmd = cmd + + @compiles(AlterColumn) + def visit_alter_column(element, compiler, **kw): + return "ALTER COLUMN %s ..." % element.column.name + + @compiles(AlterColumn, 'postgresql') + def visit_alter_column(element, compiler, **kw): + return "ALTER TABLE %s ALTER COLUMN %s ..." % (element.table.name, + element.column.name) + +The second ``visit_alter_table`` will be invoked when any ``postgresql`` +dialect is used. + +Compiling sub-elements of a custom expression construct +======================================================= + +The ``compiler`` argument is the +:class:`~sqlalchemy.engine.interfaces.Compiled` object in use. This object +can be inspected for any information about the in-progress compilation, +including ``compiler.dialect``, ``compiler.statement`` etc. The +:class:`~sqlalchemy.sql.compiler.SQLCompiler` and +:class:`~sqlalchemy.sql.compiler.DDLCompiler` both include a ``process()`` +method which can be used for compilation of embedded attributes:: + + from sqlalchemy.sql.expression import Executable, ClauseElement + + class InsertFromSelect(Executable, ClauseElement): + def __init__(self, table, select): + self.table = table + self.select = select + + @compiles(InsertFromSelect) + def visit_insert_from_select(element, compiler, **kw): + return "INSERT INTO %s (%s)" % ( + compiler.process(element.table, asfrom=True), + compiler.process(element.select) + ) + + insert = InsertFromSelect(t1, select([t1]).where(t1.c.x>5)) + print insert + +Produces:: + + "INSERT INTO mytable (SELECT mytable.x, mytable.y, mytable.z + FROM mytable WHERE mytable.x > :x_1)" + +.. note:: + + The above ``InsertFromSelect`` construct is only an example, this actual + functionality is already available using the + :meth:`.Insert.from_select` method. + +.. note:: + + The above ``InsertFromSelect`` construct probably wants to have "autocommit" + enabled. See :ref:`enabling_compiled_autocommit` for this step. + +Cross Compiling between SQL and DDL compilers +--------------------------------------------- + +SQL and DDL constructs are each compiled using different base compilers - +``SQLCompiler`` and ``DDLCompiler``. A common need is to access the +compilation rules of SQL expressions from within a DDL expression. The +``DDLCompiler`` includes an accessor ``sql_compiler`` for this reason, such as +below where we generate a CHECK constraint that embeds a SQL expression:: + + @compiles(MyConstraint) + def compile_my_constraint(constraint, ddlcompiler, **kw): + return "CONSTRAINT %s CHECK (%s)" % ( + constraint.name, + ddlcompiler.sql_compiler.process( + constraint.expression, literal_binds=True) + ) + +Above, we add an additional flag to the process step as called by +:meth:`.SQLCompiler.process`, which is the ``literal_binds`` flag. This +indicates that any SQL expression which refers to a :class:`.BindParameter` +object or other "literal" object such as those which refer to strings or +integers should be rendered **in-place**, rather than being referred to as +a bound parameter; when emitting DDL, bound parameters are typically not +supported. + + +.. _enabling_compiled_autocommit: + +Enabling Autocommit on a Construct +================================== + +Recall from the section :ref:`autocommit` that the :class:`.Engine`, when +asked to execute a construct in the absence of a user-defined transaction, +detects if the given construct represents DML or DDL, that is, a data +modification or data definition statement, which requires (or may require, +in the case of DDL) that the transaction generated by the DBAPI be committed +(recall that DBAPI always has a transaction going on regardless of what +SQLAlchemy does). Checking for this is actually accomplished by checking for +the "autocommit" execution option on the construct. When building a +construct like an INSERT derivation, a new DDL type, or perhaps a stored +procedure that alters data, the "autocommit" option needs to be set in order +for the statement to function with "connectionless" execution +(as described in :ref:`dbengine_implicit`). + +Currently a quick way to do this is to subclass :class:`.Executable`, then +add the "autocommit" flag to the ``_execution_options`` dictionary (note this +is a "frozen" dictionary which supplies a generative ``union()`` method):: + + from sqlalchemy.sql.expression import Executable, ClauseElement + + class MyInsertThing(Executable, ClauseElement): + _execution_options = \ + Executable._execution_options.union({'autocommit': True}) + +More succinctly, if the construct is truly similar to an INSERT, UPDATE, or +DELETE, :class:`.UpdateBase` can be used, which already is a subclass +of :class:`.Executable`, :class:`.ClauseElement` and includes the +``autocommit`` flag:: + + from sqlalchemy.sql.expression import UpdateBase + + class MyInsertThing(UpdateBase): + def __init__(self, ...): + ... + + + + +DDL elements that subclass :class:`.DDLElement` already have the +"autocommit" flag turned on. + + + + +Changing the default compilation of existing constructs +======================================================= + +The compiler extension applies just as well to the existing constructs. When +overriding the compilation of a built in SQL construct, the @compiles +decorator is invoked upon the appropriate class (be sure to use the class, +i.e. ``Insert`` or ``Select``, instead of the creation function such +as ``insert()`` or ``select()``). + +Within the new compilation function, to get at the "original" compilation +routine, use the appropriate visit_XXX method - this +because compiler.process() will call upon the overriding routine and cause +an endless loop. Such as, to add "prefix" to all insert statements:: + + from sqlalchemy.sql.expression import Insert + + @compiles(Insert) + def prefix_inserts(insert, compiler, **kw): + return compiler.visit_insert(insert.prefix_with("some prefix"), **kw) + +The above compiler will prefix all INSERT statements with "some prefix" when +compiled. + +.. _type_compilation_extension: + +Changing Compilation of Types +============================= + +``compiler`` works for types, too, such as below where we implement the +MS-SQL specific 'max' keyword for ``String``/``VARCHAR``:: + + @compiles(String, 'mssql') + @compiles(VARCHAR, 'mssql') + def compile_varchar(element, compiler, **kw): + if element.length == 'max': + return "VARCHAR('max')" + else: + return compiler.visit_VARCHAR(element, **kw) + + foo = Table('foo', metadata, + Column('data', VARCHAR('max')) + ) + +Subclassing Guidelines +====================== + +A big part of using the compiler extension is subclassing SQLAlchemy +expression constructs. To make this easier, the expression and +schema packages feature a set of "bases" intended for common tasks. +A synopsis is as follows: + +* :class:`~sqlalchemy.sql.expression.ClauseElement` - This is the root + expression class. Any SQL expression can be derived from this base, and is + probably the best choice for longer constructs such as specialized INSERT + statements. + +* :class:`~sqlalchemy.sql.expression.ColumnElement` - The root of all + "column-like" elements. Anything that you'd place in the "columns" clause of + a SELECT statement (as well as order by and group by) can derive from this - + the object will automatically have Python "comparison" behavior. + + :class:`~sqlalchemy.sql.expression.ColumnElement` classes want to have a + ``type`` member which is expression's return type. This can be established + at the instance level in the constructor, or at the class level if its + generally constant:: + + class timestamp(ColumnElement): + type = TIMESTAMP() + +* :class:`~sqlalchemy.sql.functions.FunctionElement` - This is a hybrid of a + ``ColumnElement`` and a "from clause" like object, and represents a SQL + function or stored procedure type of call. Since most databases support + statements along the line of "SELECT FROM " + ``FunctionElement`` adds in the ability to be used in the FROM clause of a + ``select()`` construct:: + + from sqlalchemy.sql.expression import FunctionElement + + class coalesce(FunctionElement): + name = 'coalesce' + + @compiles(coalesce) + def compile(element, compiler, **kw): + return "coalesce(%s)" % compiler.process(element.clauses) + + @compiles(coalesce, 'oracle') + def compile(element, compiler, **kw): + if len(element.clauses) > 2: + raise TypeError("coalesce only supports two arguments on Oracle") + return "nvl(%s)" % compiler.process(element.clauses) + +* :class:`~sqlalchemy.schema.DDLElement` - The root of all DDL expressions, + like CREATE TABLE, ALTER TABLE, etc. Compilation of ``DDLElement`` + subclasses is issued by a ``DDLCompiler`` instead of a ``SQLCompiler``. + ``DDLElement`` also features ``Table`` and ``MetaData`` event hooks via the + ``execute_at()`` method, allowing the construct to be invoked during CREATE + TABLE and DROP TABLE sequences. + +* :class:`~sqlalchemy.sql.expression.Executable` - This is a mixin which + should be used with any expression class that represents a "standalone" + SQL statement that can be passed directly to an ``execute()`` method. It + is already implicit within ``DDLElement`` and ``FunctionElement``. + +Further Examples +================ + +"UTC timestamp" function +------------------------- + +A function that works like "CURRENT_TIMESTAMP" except applies the +appropriate conversions so that the time is in UTC time. Timestamps are best +stored in relational databases as UTC, without time zones. UTC so that your +database doesn't think time has gone backwards in the hour when daylight +savings ends, without timezones because timezones are like character +encodings - they're best applied only at the endpoints of an application +(i.e. convert to UTC upon user input, re-apply desired timezone upon display). + +For PostgreSQL and Microsoft SQL Server:: + + from sqlalchemy.sql import expression + from sqlalchemy.ext.compiler import compiles + from sqlalchemy.types import DateTime + + class utcnow(expression.FunctionElement): + type = DateTime() + + @compiles(utcnow, 'postgresql') + def pg_utcnow(element, compiler, **kw): + return "TIMEZONE('utc', CURRENT_TIMESTAMP)" + + @compiles(utcnow, 'mssql') + def ms_utcnow(element, compiler, **kw): + return "GETUTCDATE()" + +Example usage:: + + from sqlalchemy import ( + Table, Column, Integer, String, DateTime, MetaData + ) + metadata = MetaData() + event = Table("event", metadata, + Column("id", Integer, primary_key=True), + Column("description", String(50), nullable=False), + Column("timestamp", DateTime, server_default=utcnow()) + ) + +"GREATEST" function +------------------- + +The "GREATEST" function is given any number of arguments and returns the one +that is of the highest value - its equivalent to Python's ``max`` +function. A SQL standard version versus a CASE based version which only +accommodates two arguments:: + + from sqlalchemy.sql import expression + from sqlalchemy.ext.compiler import compiles + from sqlalchemy.types import Numeric + + class greatest(expression.FunctionElement): + type = Numeric() + name = 'greatest' + + @compiles(greatest) + def default_greatest(element, compiler, **kw): + return compiler.visit_function(element) + + @compiles(greatest, 'sqlite') + @compiles(greatest, 'mssql') + @compiles(greatest, 'oracle') + def case_greatest(element, compiler, **kw): + arg1, arg2 = list(element.clauses) + return "CASE WHEN %s > %s THEN %s ELSE %s END" % ( + compiler.process(arg1), + compiler.process(arg2), + compiler.process(arg1), + compiler.process(arg2), + ) + +Example usage:: + + Session.query(Account).\ + filter( + greatest( + Account.checking_balance, + Account.savings_balance) > 10000 + ) + +"false" expression +------------------ + +Render a "false" constant expression, rendering as "0" on platforms that +don't have a "false" constant:: + + from sqlalchemy.sql import expression + from sqlalchemy.ext.compiler import compiles + + class sql_false(expression.ColumnElement): + pass + + @compiles(sql_false) + def default_false(element, compiler, **kw): + return "false" + + @compiles(sql_false, 'mssql') + @compiles(sql_false, 'mysql') + @compiles(sql_false, 'oracle') + def int_false(element, compiler, **kw): + return "0" + +Example usage:: + + from sqlalchemy import select, union_all + + exp = union_all( + select([users.c.name, sql_false().label("enrolled")]), + select([customers.c.name, customers.c.enrolled]) + ) + +""" +from .. import exc +from ..sql import visitors + + +def compiles(class_, *specs): + """Register a function as a compiler for a + given :class:`.ClauseElement` type.""" + + def decorate(fn): + # get an existing @compiles handler + existing = class_.__dict__.get('_compiler_dispatcher', None) + + # get the original handler. All ClauseElement classes have one + # of these, but some TypeEngine classes will not. + existing_dispatch = getattr(class_, '_compiler_dispatch', None) + + if not existing: + existing = _dispatcher() + + if existing_dispatch: + def _wrap_existing_dispatch(element, compiler, **kw): + try: + return existing_dispatch(element, compiler, **kw) + except exc.UnsupportedCompilationError: + raise exc.CompileError( + "%s construct has no default " + "compilation handler." % type(element)) + existing.specs['default'] = _wrap_existing_dispatch + + # TODO: why is the lambda needed ? + setattr(class_, '_compiler_dispatch', + lambda *arg, **kw: existing(*arg, **kw)) + setattr(class_, '_compiler_dispatcher', existing) + + if specs: + for s in specs: + existing.specs[s] = fn + + else: + existing.specs['default'] = fn + return fn + return decorate + + +def deregister(class_): + """Remove all custom compilers associated with a given + :class:`.ClauseElement` type.""" + + if hasattr(class_, '_compiler_dispatcher'): + # regenerate default _compiler_dispatch + visitors._generate_dispatch(class_) + # remove custom directive + del class_._compiler_dispatcher + + +class _dispatcher(object): + def __init__(self): + self.specs = {} + + def __call__(self, element, compiler, **kw): + # TODO: yes, this could also switch off of DBAPI in use. + fn = self.specs.get(compiler.dialect.name, None) + if not fn: + try: + fn = self.specs['default'] + except KeyError: + raise exc.CompileError( + "%s construct has no default " + "compilation handler." % type(element)) + + return fn(element, compiler, **kw) diff --git a/app/lib/sqlalchemy/ext/declarative/__init__.py b/app/lib/sqlalchemy/ext/declarative/__init__.py new file mode 100644 index 0000000..69c4f28 --- /dev/null +++ b/app/lib/sqlalchemy/ext/declarative/__init__.py @@ -0,0 +1,18 @@ +# ext/declarative/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from .api import declarative_base, synonym_for, comparable_using, \ + instrument_declarative, ConcreteBase, AbstractConcreteBase, \ + DeclarativeMeta, DeferredReflection, has_inherited_table,\ + declared_attr, as_declarative + + +__all__ = ['declarative_base', 'synonym_for', 'has_inherited_table', + 'comparable_using', 'instrument_declarative', 'declared_attr', + 'as_declarative', + 'ConcreteBase', 'AbstractConcreteBase', 'DeclarativeMeta', + 'DeferredReflection'] diff --git a/app/lib/sqlalchemy/ext/declarative/api.py b/app/lib/sqlalchemy/ext/declarative/api.py new file mode 100644 index 0000000..7c503d4 --- /dev/null +++ b/app/lib/sqlalchemy/ext/declarative/api.py @@ -0,0 +1,696 @@ +# ext/declarative/api.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +"""Public API functions and helpers for declarative.""" + + +from ...schema import Table, MetaData, Column +from ...orm import synonym as _orm_synonym, \ + comparable_property,\ + interfaces, properties, attributes +from ...orm.util import polymorphic_union +from ...orm.base import _mapper_or_none +from ...util import OrderedDict, hybridmethod, hybridproperty +from ... import util +from ... import exc +import weakref + +from .base import _as_declarative, \ + _declarative_constructor,\ + _DeferredMapperConfig, _add_attribute +from .clsregistry import _class_resolver + + +def instrument_declarative(cls, registry, metadata): + """Given a class, configure the class declaratively, + using the given registry, which can be any dictionary, and + MetaData object. + + """ + if '_decl_class_registry' in cls.__dict__: + raise exc.InvalidRequestError( + "Class %r already has been " + "instrumented declaratively" % cls) + cls._decl_class_registry = registry + cls.metadata = metadata + _as_declarative(cls, cls.__name__, cls.__dict__) + + +def has_inherited_table(cls): + """Given a class, return True if any of the classes it inherits from has a + mapped table, otherwise return False. + + This is used in declarative mixins to build attributes that behave + differently for the base class vs. a subclass in an inheritance + hierarchy. + + .. seealso:: + + :ref:`decl_mixin_inheritance` + + """ + for class_ in cls.__mro__[1:]: + if getattr(class_, '__table__', None) is not None: + return True + return False + + +class DeclarativeMeta(type): + def __init__(cls, classname, bases, dict_): + if '_decl_class_registry' not in cls.__dict__: + _as_declarative(cls, classname, cls.__dict__) + type.__init__(cls, classname, bases, dict_) + + def __setattr__(cls, key, value): + _add_attribute(cls, key, value) + + +def synonym_for(name, map_column=False): + """Decorator, make a Python @property a query synonym for a column. + + A decorator version of :func:`~sqlalchemy.orm.synonym`. The function being + decorated is the 'descriptor', otherwise passes its arguments through to + synonym():: + + @synonym_for('col') + @property + def prop(self): + return 'special sauce' + + The regular ``synonym()`` is also usable directly in a declarative setting + and may be convenient for read/write properties:: + + prop = synonym('col', descriptor=property(_read_prop, _write_prop)) + + """ + def decorate(fn): + return _orm_synonym(name, map_column=map_column, descriptor=fn) + return decorate + + +def comparable_using(comparator_factory): + """Decorator, allow a Python @property to be used in query criteria. + + This is a decorator front end to + :func:`~sqlalchemy.orm.comparable_property` that passes + through the comparator_factory and the function being decorated:: + + @comparable_using(MyComparatorType) + @property + def prop(self): + return 'special sauce' + + The regular ``comparable_property()`` is also usable directly in a + declarative setting and may be convenient for read/write properties:: + + prop = comparable_property(MyComparatorType) + + """ + def decorate(fn): + return comparable_property(comparator_factory, fn) + return decorate + + +class declared_attr(interfaces._MappedAttribute, property): + """Mark a class-level method as representing the definition of + a mapped property or special declarative member name. + + @declared_attr turns the attribute into a scalar-like + property that can be invoked from the uninstantiated class. + Declarative treats attributes specifically marked with + @declared_attr as returning a construct that is specific + to mapping or declarative table configuration. The name + of the attribute is that of what the non-dynamic version + of the attribute would be. + + @declared_attr is more often than not applicable to mixins, + to define relationships that are to be applied to different + implementors of the class:: + + class ProvidesUser(object): + "A mixin that adds a 'user' relationship to classes." + + @declared_attr + def user(self): + return relationship("User") + + It also can be applied to mapped classes, such as to provide + a "polymorphic" scheme for inheritance:: + + class Employee(Base): + id = Column(Integer, primary_key=True) + type = Column(String(50), nullable=False) + + @declared_attr + def __tablename__(cls): + return cls.__name__.lower() + + @declared_attr + def __mapper_args__(cls): + if cls.__name__ == 'Employee': + return { + "polymorphic_on":cls.type, + "polymorphic_identity":"Employee" + } + else: + return {"polymorphic_identity":cls.__name__} + + .. versionchanged:: 0.8 :class:`.declared_attr` can be used with + non-ORM or extension attributes, such as user-defined attributes + or :func:`.association_proxy` objects, which will be assigned + to the class at class construction time. + + + """ + + def __init__(self, fget, cascading=False): + super(declared_attr, self).__init__(fget) + self.__doc__ = fget.__doc__ + self._cascading = cascading + + def __get__(desc, self, cls): + reg = cls.__dict__.get('_sa_declared_attr_reg', None) + if reg is None: + manager = attributes.manager_of_class(cls) + if manager is None: + util.warn( + "Unmanaged access of declarative attribute %s from " + "non-mapped class %s" % + (desc.fget.__name__, cls.__name__)) + return desc.fget(cls) + elif desc in reg: + return reg[desc] + else: + reg[desc] = obj = desc.fget(cls) + return obj + + @hybridmethod + def _stateful(cls, **kw): + return _stateful_declared_attr(**kw) + + @hybridproperty + def cascading(cls): + """Mark a :class:`.declared_attr` as cascading. + + This is a special-use modifier which indicates that a column + or MapperProperty-based declared attribute should be configured + distinctly per mapped subclass, within a mapped-inheritance scenario. + + Below, both MyClass as well as MySubClass will have a distinct + ``id`` Column object established:: + + class HasIdMixin(object): + @declared_attr.cascading + def id(cls): + if has_inherited_table(cls): + return Column(ForeignKey('myclass.id'), primary_key=True) + else: + return Column(Integer, primary_key=True) + + class MyClass(HasIdMixin, Base): + __tablename__ = 'myclass' + # ... + + class MySubClass(MyClass): + "" + # ... + + The behavior of the above configuration is that ``MySubClass`` + will refer to both its own ``id`` column as well as that of + ``MyClass`` underneath the attribute named ``some_id``. + + .. seealso:: + + :ref:`declarative_inheritance` + + :ref:`mixin_inheritance_columns` + + + """ + return cls._stateful(cascading=True) + + +class _stateful_declared_attr(declared_attr): + def __init__(self, **kw): + self.kw = kw + + def _stateful(self, **kw): + new_kw = self.kw.copy() + new_kw.update(kw) + return _stateful_declared_attr(**new_kw) + + def __call__(self, fn): + return declared_attr(fn, **self.kw) + + +def declarative_base(bind=None, metadata=None, mapper=None, cls=object, + name='Base', constructor=_declarative_constructor, + class_registry=None, + metaclass=DeclarativeMeta): + r"""Construct a base class for declarative class definitions. + + The new base class will be given a metaclass that produces + appropriate :class:`~sqlalchemy.schema.Table` objects and makes + the appropriate :func:`~sqlalchemy.orm.mapper` calls based on the + information provided declaratively in the class and any subclasses + of the class. + + :param bind: An optional + :class:`~sqlalchemy.engine.Connectable`, will be assigned + the ``bind`` attribute on the :class:`~sqlalchemy.schema.MetaData` + instance. + + :param metadata: + An optional :class:`~sqlalchemy.schema.MetaData` instance. All + :class:`~sqlalchemy.schema.Table` objects implicitly declared by + subclasses of the base will share this MetaData. A MetaData instance + will be created if none is provided. The + :class:`~sqlalchemy.schema.MetaData` instance will be available via the + `metadata` attribute of the generated declarative base class. + + :param mapper: + An optional callable, defaults to :func:`~sqlalchemy.orm.mapper`. Will + be used to map subclasses to their Tables. + + :param cls: + Defaults to :class:`object`. A type to use as the base for the generated + declarative base class. May be a class or tuple of classes. + + :param name: + Defaults to ``Base``. The display name for the generated + class. Customizing this is not required, but can improve clarity in + tracebacks and debugging. + + :param constructor: + Defaults to + :func:`~sqlalchemy.ext.declarative.base._declarative_constructor`, an + __init__ implementation that assigns \**kwargs for declared + fields and relationships to an instance. If ``None`` is supplied, + no __init__ will be provided and construction will fall back to + cls.__init__ by way of the normal Python semantics. + + :param class_registry: optional dictionary that will serve as the + registry of class names-> mapped classes when string names + are used to identify classes inside of :func:`.relationship` + and others. Allows two or more declarative base classes + to share the same registry of class names for simplified + inter-base relationships. + + :param metaclass: + Defaults to :class:`.DeclarativeMeta`. A metaclass or __metaclass__ + compatible callable to use as the meta type of the generated + declarative base class. + + .. versionchanged:: 1.1 if :paramref:`.declarative_base.cls` is a single class (rather + than a tuple), the constructed base class will inherit its docstring. + + .. seealso:: + + :func:`.as_declarative` + + """ + lcl_metadata = metadata or MetaData() + if bind: + lcl_metadata.bind = bind + + if class_registry is None: + class_registry = weakref.WeakValueDictionary() + + bases = not isinstance(cls, tuple) and (cls,) or cls + class_dict = dict(_decl_class_registry=class_registry, + metadata=lcl_metadata) + + if isinstance(cls, type): + class_dict['__doc__'] = cls.__doc__ + + if constructor: + class_dict['__init__'] = constructor + if mapper: + class_dict['__mapper_cls__'] = mapper + + return metaclass(name, bases, class_dict) + + +def as_declarative(**kw): + """ + Class decorator for :func:`.declarative_base`. + + Provides a syntactical shortcut to the ``cls`` argument + sent to :func:`.declarative_base`, allowing the base class + to be converted in-place to a "declarative" base:: + + from sqlalchemy.ext.declarative import as_declarative + + @as_declarative() + class Base(object): + @declared_attr + def __tablename__(cls): + return cls.__name__.lower() + id = Column(Integer, primary_key=True) + + class MyMappedClass(Base): + # ... + + All keyword arguments passed to :func:`.as_declarative` are passed + along to :func:`.declarative_base`. + + .. versionadded:: 0.8.3 + + .. seealso:: + + :func:`.declarative_base` + + """ + def decorate(cls): + kw['cls'] = cls + kw['name'] = cls.__name__ + return declarative_base(**kw) + + return decorate + + +class ConcreteBase(object): + """A helper class for 'concrete' declarative mappings. + + :class:`.ConcreteBase` will use the :func:`.polymorphic_union` + function automatically, against all tables mapped as a subclass + to this class. The function is called via the + ``__declare_last__()`` function, which is essentially + a hook for the :meth:`.after_configured` event. + + :class:`.ConcreteBase` produces a mapped + table for the class itself. Compare to :class:`.AbstractConcreteBase`, + which does not. + + Example:: + + from sqlalchemy.ext.declarative import ConcreteBase + + class Employee(ConcreteBase, Base): + __tablename__ = 'employee' + employee_id = Column(Integer, primary_key=True) + name = Column(String(50)) + __mapper_args__ = { + 'polymorphic_identity':'employee', + 'concrete':True} + + class Manager(Employee): + __tablename__ = 'manager' + employee_id = Column(Integer, primary_key=True) + name = Column(String(50)) + manager_data = Column(String(40)) + __mapper_args__ = { + 'polymorphic_identity':'manager', + 'concrete':True} + + .. seealso:: + + :class:`.AbstractConcreteBase` + + :ref:`concrete_inheritance` + + :ref:`inheritance_concrete_helpers` + + + """ + + @classmethod + def _create_polymorphic_union(cls, mappers): + return polymorphic_union(OrderedDict( + (mp.polymorphic_identity, mp.local_table) + for mp in mappers + ), 'type', 'pjoin') + + @classmethod + def __declare_first__(cls): + m = cls.__mapper__ + if m.with_polymorphic: + return + + mappers = list(m.self_and_descendants) + pjoin = cls._create_polymorphic_union(mappers) + m._set_with_polymorphic(("*", pjoin)) + m._set_polymorphic_on(pjoin.c.type) + + +class AbstractConcreteBase(ConcreteBase): + """A helper class for 'concrete' declarative mappings. + + :class:`.AbstractConcreteBase` will use the :func:`.polymorphic_union` + function automatically, against all tables mapped as a subclass + to this class. The function is called via the + ``__declare_last__()`` function, which is essentially + a hook for the :meth:`.after_configured` event. + + :class:`.AbstractConcreteBase` does produce a mapped class + for the base class, however it is not persisted to any table; it + is instead mapped directly to the "polymorphic" selectable directly + and is only used for selecting. Compare to :class:`.ConcreteBase`, + which does create a persisted table for the base class. + + Example:: + + from sqlalchemy.ext.declarative import AbstractConcreteBase + + class Employee(AbstractConcreteBase, Base): + pass + + class Manager(Employee): + __tablename__ = 'manager' + employee_id = Column(Integer, primary_key=True) + name = Column(String(50)) + manager_data = Column(String(40)) + + __mapper_args__ = { + 'polymorphic_identity':'manager', + 'concrete':True} + + The abstract base class is handled by declarative in a special way; + at class configuration time, it behaves like a declarative mixin + or an ``__abstract__`` base class. Once classes are configured + and mappings are produced, it then gets mapped itself, but + after all of its decscendants. This is a very unique system of mapping + not found in any other SQLAlchemy system. + + Using this approach, we can specify columns and properties + that will take place on mapped subclasses, in the way that + we normally do as in :ref:`declarative_mixins`:: + + class Company(Base): + __tablename__ = 'company' + id = Column(Integer, primary_key=True) + + class Employee(AbstractConcreteBase, Base): + employee_id = Column(Integer, primary_key=True) + + @declared_attr + def company_id(cls): + return Column(ForeignKey('company.id')) + + @declared_attr + def company(cls): + return relationship("Company") + + class Manager(Employee): + __tablename__ = 'manager' + + name = Column(String(50)) + manager_data = Column(String(40)) + + __mapper_args__ = { + 'polymorphic_identity':'manager', + 'concrete':True} + + When we make use of our mappings however, both ``Manager`` and + ``Employee`` will have an independently usable ``.company`` attribute:: + + session.query(Employee).filter(Employee.company.has(id=5)) + + .. versionchanged:: 1.0.0 - The mechanics of :class:`.AbstractConcreteBase` + have been reworked to support relationships established directly + on the abstract base, without any special configurational steps. + + .. seealso:: + + :class:`.ConcreteBase` + + :ref:`concrete_inheritance` + + :ref:`inheritance_concrete_helpers` + + """ + + __no_table__ = True + + @classmethod + def __declare_first__(cls): + cls._sa_decl_prepare_nocascade() + + @classmethod + def _sa_decl_prepare_nocascade(cls): + if getattr(cls, '__mapper__', None): + return + + to_map = _DeferredMapperConfig.config_for_cls(cls) + + # can't rely on 'self_and_descendants' here + # since technically an immediate subclass + # might not be mapped, but a subclass + # may be. + mappers = [] + stack = list(cls.__subclasses__()) + while stack: + klass = stack.pop() + stack.extend(klass.__subclasses__()) + mn = _mapper_or_none(klass) + if mn is not None: + mappers.append(mn) + pjoin = cls._create_polymorphic_union(mappers) + + # For columns that were declared on the class, these + # are normally ignored with the "__no_table__" mapping, + # unless they have a different attribute key vs. col name + # and are in the properties argument. + # In that case, ensure we update the properties entry + # to the correct column from the pjoin target table. + declared_cols = set(to_map.declared_columns) + for k, v in list(to_map.properties.items()): + if v in declared_cols: + to_map.properties[k] = pjoin.c[v.key] + + to_map.local_table = pjoin + + m_args = to_map.mapper_args_fn or dict + + def mapper_args(): + args = m_args() + args['polymorphic_on'] = pjoin.c.type + return args + to_map.mapper_args_fn = mapper_args + + m = to_map.map() + + for scls in cls.__subclasses__(): + sm = _mapper_or_none(scls) + if sm and sm.concrete and cls in scls.__bases__: + sm._set_concrete_base(m) + + +class DeferredReflection(object): + """A helper class for construction of mappings based on + a deferred reflection step. + + Normally, declarative can be used with reflection by + setting a :class:`.Table` object using autoload=True + as the ``__table__`` attribute on a declarative class. + The caveat is that the :class:`.Table` must be fully + reflected, or at the very least have a primary key column, + at the point at which a normal declarative mapping is + constructed, meaning the :class:`.Engine` must be available + at class declaration time. + + The :class:`.DeferredReflection` mixin moves the construction + of mappers to be at a later point, after a specific + method is called which first reflects all :class:`.Table` + objects created so far. Classes can define it as such:: + + from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.ext.declarative import DeferredReflection + Base = declarative_base() + + class MyClass(DeferredReflection, Base): + __tablename__ = 'mytable' + + Above, ``MyClass`` is not yet mapped. After a series of + classes have been defined in the above fashion, all tables + can be reflected and mappings created using + :meth:`.prepare`:: + + engine = create_engine("someengine://...") + DeferredReflection.prepare(engine) + + The :class:`.DeferredReflection` mixin can be applied to individual + classes, used as the base for the declarative base itself, + or used in a custom abstract class. Using an abstract base + allows that only a subset of classes to be prepared for a + particular prepare step, which is necessary for applications + that use more than one engine. For example, if an application + has two engines, you might use two bases, and prepare each + separately, e.g.:: + + class ReflectedOne(DeferredReflection, Base): + __abstract__ = True + + class ReflectedTwo(DeferredReflection, Base): + __abstract__ = True + + class MyClass(ReflectedOne): + __tablename__ = 'mytable' + + class MyOtherClass(ReflectedOne): + __tablename__ = 'myothertable' + + class YetAnotherClass(ReflectedTwo): + __tablename__ = 'yetanothertable' + + # ... etc. + + Above, the class hierarchies for ``ReflectedOne`` and + ``ReflectedTwo`` can be configured separately:: + + ReflectedOne.prepare(engine_one) + ReflectedTwo.prepare(engine_two) + + .. versionadded:: 0.8 + + """ + @classmethod + def prepare(cls, engine): + """Reflect all :class:`.Table` objects for all current + :class:`.DeferredReflection` subclasses""" + + to_map = _DeferredMapperConfig.classes_for_base(cls) + for thingy in to_map: + cls._sa_decl_prepare(thingy.local_table, engine) + thingy.map() + mapper = thingy.cls.__mapper__ + metadata = mapper.class_.metadata + for rel in mapper._props.values(): + if isinstance(rel, properties.RelationshipProperty) and \ + rel.secondary is not None: + if isinstance(rel.secondary, Table): + cls._reflect_table(rel.secondary, engine) + elif isinstance(rel.secondary, _class_resolver): + rel.secondary._resolvers += ( + cls._sa_deferred_table_resolver(engine, metadata), + ) + + @classmethod + def _sa_deferred_table_resolver(cls, engine, metadata): + def _resolve(key): + t1 = Table(key, metadata) + cls._reflect_table(t1, engine) + return t1 + return _resolve + + @classmethod + def _sa_decl_prepare(cls, local_table, engine): + # autoload Table, which is already + # present in the metadata. This + # will fill in db-loaded columns + # into the existing Table object. + if local_table is not None: + cls._reflect_table(local_table, engine) + + @classmethod + def _reflect_table(cls, table, engine): + Table(table.name, + table.metadata, + extend_existing=True, + autoload_replace=False, + autoload=True, + autoload_with=engine, + schema=table.schema) diff --git a/app/lib/sqlalchemy/ext/declarative/base.py b/app/lib/sqlalchemy/ext/declarative/base.py new file mode 100644 index 0000000..3beee31 --- /dev/null +++ b/app/lib/sqlalchemy/ext/declarative/base.py @@ -0,0 +1,662 @@ +# ext/declarative/base.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +"""Internal implementation for declarative.""" + +from ...schema import Table, Column +from ...orm import mapper, class_mapper, synonym +from ...orm.interfaces import MapperProperty +from ...orm.properties import ColumnProperty, CompositeProperty +from ...orm.attributes import QueryableAttribute +from ...orm.base import _is_mapped_class +from ... import util, exc +from ...util import topological +from ...sql import expression +from ... import event +from . import clsregistry +import collections +import weakref +from sqlalchemy.orm import instrumentation + +declared_attr = declarative_props = None + + +def _declared_mapping_info(cls): + # deferred mapping + if _DeferredMapperConfig.has_cls(cls): + return _DeferredMapperConfig.config_for_cls(cls) + # regular mapping + elif _is_mapped_class(cls): + return class_mapper(cls, configure=False) + else: + return None + + +def _resolve_for_abstract(cls): + if cls is object: + return None + + if _get_immediate_cls_attr(cls, '__abstract__', strict=True): + for sup in cls.__bases__: + sup = _resolve_for_abstract(sup) + if sup is not None: + return sup + else: + return None + else: + return cls + + +def _get_immediate_cls_attr(cls, attrname, strict=False): + """return an attribute of the class that is either present directly + on the class, e.g. not on a superclass, or is from a superclass but + this superclass is a mixin, that is, not a descendant of + the declarative base. + + This is used to detect attributes that indicate something about + a mapped class independently from any mapped classes that it may + inherit from. + + """ + if not issubclass(cls, object): + return None + + for base in cls.__mro__: + _is_declarative_inherits = hasattr(base, '_decl_class_registry') + if attrname in base.__dict__ and ( + base is cls or + ((base in cls.__bases__ if strict else True) + and not _is_declarative_inherits) + ): + return getattr(base, attrname) + else: + return None + + +def _as_declarative(cls, classname, dict_): + global declared_attr, declarative_props + if declared_attr is None: + from .api import declared_attr + declarative_props = (declared_attr, util.classproperty) + + if _get_immediate_cls_attr(cls, '__abstract__', strict=True): + return + + _MapperConfig.setup_mapping(cls, classname, dict_) + + +class _MapperConfig(object): + + @classmethod + def setup_mapping(cls, cls_, classname, dict_): + defer_map = _get_immediate_cls_attr( + cls_, '_sa_decl_prepare_nocascade', strict=True) or \ + hasattr(cls_, '_sa_decl_prepare') + + if defer_map: + cfg_cls = _DeferredMapperConfig + else: + cfg_cls = _MapperConfig + cfg_cls(cls_, classname, dict_) + + def __init__(self, cls_, classname, dict_): + + self.cls = cls_ + + # dict_ will be a dictproxy, which we can't write to, and we need to! + self.dict_ = dict(dict_) + self.classname = classname + self.mapped_table = None + self.properties = util.OrderedDict() + self.declared_columns = set() + self.column_copies = {} + self._setup_declared_events() + + # temporary registry. While early 1.0 versions + # set up the ClassManager here, by API contract + # we can't do that until there's a mapper. + self.cls._sa_declared_attr_reg = {} + + self._scan_attributes() + + clsregistry.add_class(self.classname, self.cls) + + self._extract_mappable_attributes() + + self._extract_declared_columns() + + self._setup_table() + + self._setup_inheritance() + + self._early_mapping() + + def _early_mapping(self): + self.map() + + def _setup_declared_events(self): + if _get_immediate_cls_attr(self.cls, '__declare_last__'): + @event.listens_for(mapper, "after_configured") + def after_configured(): + self.cls.__declare_last__() + + if _get_immediate_cls_attr(self.cls, '__declare_first__'): + @event.listens_for(mapper, "before_configured") + def before_configured(): + self.cls.__declare_first__() + + def _scan_attributes(self): + cls = self.cls + dict_ = self.dict_ + column_copies = self.column_copies + mapper_args_fn = None + table_args = inherited_table_args = None + tablename = None + + for base in cls.__mro__: + class_mapped = base is not cls and \ + _declared_mapping_info(base) is not None and \ + not _get_immediate_cls_attr( + base, '_sa_decl_prepare_nocascade', strict=True) + + if not class_mapped and base is not cls: + self._produce_column_copies(base) + + for name, obj in vars(base).items(): + if name == '__mapper_args__': + if not mapper_args_fn and ( + not class_mapped or + isinstance(obj, declarative_props) + ): + # don't even invoke __mapper_args__ until + # after we've determined everything about the + # mapped table. + # make a copy of it so a class-level dictionary + # is not overwritten when we update column-based + # arguments. + mapper_args_fn = lambda: dict(cls.__mapper_args__) + elif name == '__tablename__': + if not tablename and ( + not class_mapped or + isinstance(obj, declarative_props) + ): + tablename = cls.__tablename__ + elif name == '__table_args__': + if not table_args and ( + not class_mapped or + isinstance(obj, declarative_props) + ): + table_args = cls.__table_args__ + if not isinstance( + table_args, (tuple, dict, type(None))): + raise exc.ArgumentError( + "__table_args__ value must be a tuple, " + "dict, or None") + if base is not cls: + inherited_table_args = True + elif class_mapped: + if isinstance(obj, declarative_props): + util.warn("Regular (i.e. not __special__) " + "attribute '%s.%s' uses @declared_attr, " + "but owning class %s is mapped - " + "not applying to subclass %s." + % (base.__name__, name, base, cls)) + continue + elif base is not cls: + # we're a mixin, abstract base, or something that is + # acting like that for now. + if isinstance(obj, Column): + # already copied columns to the mapped class. + continue + elif isinstance(obj, MapperProperty): + raise exc.InvalidRequestError( + "Mapper properties (i.e. deferred," + "column_property(), relationship(), etc.) must " + "be declared as @declared_attr callables " + "on declarative mixin classes.") + elif isinstance(obj, declarative_props): + oldclassprop = isinstance(obj, util.classproperty) + if not oldclassprop and obj._cascading: + dict_[name] = column_copies[obj] = \ + ret = obj.__get__(obj, cls) + setattr(cls, name, ret) + else: + if oldclassprop: + util.warn_deprecated( + "Use of sqlalchemy.util.classproperty on " + "declarative classes is deprecated.") + dict_[name] = column_copies[obj] = \ + ret = getattr(cls, name) + if isinstance(ret, (Column, MapperProperty)) and \ + ret.doc is None: + ret.doc = obj.__doc__ + + if inherited_table_args and not tablename: + table_args = None + + self.table_args = table_args + self.tablename = tablename + self.mapper_args_fn = mapper_args_fn + + def _produce_column_copies(self, base): + cls = self.cls + dict_ = self.dict_ + column_copies = self.column_copies + # copy mixin columns to the mapped class + for name, obj in vars(base).items(): + if isinstance(obj, Column): + if getattr(cls, name) is not obj: + # if column has been overridden + # (like by the InstrumentedAttribute of the + # superclass), skip + continue + elif obj.foreign_keys: + raise exc.InvalidRequestError( + "Columns with foreign keys to other columns " + "must be declared as @declared_attr callables " + "on declarative mixin classes. ") + elif name not in dict_ and not ( + '__table__' in dict_ and + (obj.name or name) in dict_['__table__'].c + ): + column_copies[obj] = copy_ = obj.copy() + copy_._creation_order = obj._creation_order + setattr(cls, name, copy_) + dict_[name] = copy_ + + def _extract_mappable_attributes(self): + cls = self.cls + dict_ = self.dict_ + + our_stuff = self.properties + + for k in list(dict_): + + if k in ('__table__', '__tablename__', '__mapper_args__'): + continue + + value = dict_[k] + if isinstance(value, declarative_props): + value = getattr(cls, k) + + elif isinstance(value, QueryableAttribute) and \ + value.class_ is not cls and \ + value.key != k: + # detect a QueryableAttribute that's already mapped being + # assigned elsewhere in userland, turn into a synonym() + value = synonym(value.key) + setattr(cls, k, value) + + if (isinstance(value, tuple) and len(value) == 1 and + isinstance(value[0], (Column, MapperProperty))): + util.warn("Ignoring declarative-like tuple value of attribute " + "%s: possibly a copy-and-paste error with a comma " + "left at the end of the line?" % k) + continue + elif not isinstance(value, (Column, MapperProperty)): + # using @declared_attr for some object that + # isn't Column/MapperProperty; remove from the dict_ + # and place the evaluated value onto the class. + if not k.startswith('__'): + dict_.pop(k) + setattr(cls, k, value) + continue + # we expect to see the name 'metadata' in some valid cases; + # however at this point we see it's assigned to something trying + # to be mapped, so raise for that. + elif k == 'metadata': + raise exc.InvalidRequestError( + "Attribute name 'metadata' is reserved " + "for the MetaData instance when using a " + "declarative base class." + ) + prop = clsregistry._deferred_relationship(cls, value) + our_stuff[k] = prop + + def _extract_declared_columns(self): + our_stuff = self.properties + + # set up attributes in the order they were created + our_stuff.sort(key=lambda key: our_stuff[key]._creation_order) + + # extract columns from the class dict + declared_columns = self.declared_columns + name_to_prop_key = collections.defaultdict(set) + for key, c in list(our_stuff.items()): + if isinstance(c, (ColumnProperty, CompositeProperty)): + for col in c.columns: + if isinstance(col, Column) and \ + col.table is None: + _undefer_column_name(key, col) + if not isinstance(c, CompositeProperty): + name_to_prop_key[col.name].add(key) + declared_columns.add(col) + elif isinstance(c, Column): + _undefer_column_name(key, c) + name_to_prop_key[c.name].add(key) + declared_columns.add(c) + # if the column is the same name as the key, + # remove it from the explicit properties dict. + # the normal rules for assigning column-based properties + # will take over, including precedence of columns + # in multi-column ColumnProperties. + if key == c.key: + del our_stuff[key] + + for name, keys in name_to_prop_key.items(): + if len(keys) > 1: + util.warn( + "On class %r, Column object %r named " + "directly multiple times, " + "only one will be used: %s. " + "Consider using orm.synonym instead" % + (self.classname, name, (", ".join(sorted(keys)))) + ) + + def _setup_table(self): + cls = self.cls + tablename = self.tablename + table_args = self.table_args + dict_ = self.dict_ + declared_columns = self.declared_columns + + declared_columns = self.declared_columns = sorted( + declared_columns, key=lambda c: c._creation_order) + table = None + + if hasattr(cls, '__table_cls__'): + table_cls = util.unbound_method_to_callable(cls.__table_cls__) + else: + table_cls = Table + + if '__table__' not in dict_: + if tablename is not None: + + args, table_kw = (), {} + if table_args: + if isinstance(table_args, dict): + table_kw = table_args + elif isinstance(table_args, tuple): + if isinstance(table_args[-1], dict): + args, table_kw = table_args[0:-1], table_args[-1] + else: + args = table_args + + autoload = dict_.get('__autoload__') + if autoload: + table_kw['autoload'] = True + + cls.__table__ = table = table_cls( + tablename, cls.metadata, + *(tuple(declared_columns) + tuple(args)), + **table_kw) + else: + table = cls.__table__ + if declared_columns: + for c in declared_columns: + if not table.c.contains_column(c): + raise exc.ArgumentError( + "Can't add additional column %r when " + "specifying __table__" % c.key + ) + self.local_table = table + + def _setup_inheritance(self): + table = self.local_table + cls = self.cls + table_args = self.table_args + declared_columns = self.declared_columns + for c in cls.__bases__: + c = _resolve_for_abstract(c) + if c is None: + continue + if _declared_mapping_info(c) is not None and \ + not _get_immediate_cls_attr( + c, '_sa_decl_prepare_nocascade', strict=True): + self.inherits = c + break + else: + self.inherits = None + + if table is None and self.inherits is None and \ + not _get_immediate_cls_attr(cls, '__no_table__'): + + raise exc.InvalidRequestError( + "Class %r does not have a __table__ or __tablename__ " + "specified and does not inherit from an existing " + "table-mapped class." % cls + ) + elif self.inherits: + inherited_mapper = _declared_mapping_info(self.inherits) + inherited_table = inherited_mapper.local_table + inherited_mapped_table = inherited_mapper.mapped_table + + if table is None: + # single table inheritance. + # ensure no table args + if table_args: + raise exc.ArgumentError( + "Can't place __table_args__ on an inherited class " + "with no table." + ) + # add any columns declared here to the inherited table. + for c in declared_columns: + if c.primary_key: + raise exc.ArgumentError( + "Can't place primary key columns on an inherited " + "class with no table." + ) + if c.name in inherited_table.c: + if inherited_table.c[c.name] is c: + continue + raise exc.ArgumentError( + "Column '%s' on class %s conflicts with " + "existing column '%s'" % + (c, cls, inherited_table.c[c.name]) + ) + inherited_table.append_column(c) + if inherited_mapped_table is not None and \ + inherited_mapped_table is not inherited_table: + inherited_mapped_table._refresh_for_new_column(c) + + def _prepare_mapper_arguments(self): + properties = self.properties + if self.mapper_args_fn: + mapper_args = self.mapper_args_fn() + else: + mapper_args = {} + + # make sure that column copies are used rather + # than the original columns from any mixins + for k in ('version_id_col', 'polymorphic_on',): + if k in mapper_args: + v = mapper_args[k] + mapper_args[k] = self.column_copies.get(v, v) + + assert 'inherits' not in mapper_args, \ + "Can't specify 'inherits' explicitly with declarative mappings" + + if self.inherits: + mapper_args['inherits'] = self.inherits + + if self.inherits and not mapper_args.get('concrete', False): + # single or joined inheritance + # exclude any cols on the inherited table which are + # not mapped on the parent class, to avoid + # mapping columns specific to sibling/nephew classes + inherited_mapper = _declared_mapping_info(self.inherits) + inherited_table = inherited_mapper.local_table + + if 'exclude_properties' not in mapper_args: + mapper_args['exclude_properties'] = exclude_properties = \ + set( + [c.key for c in inherited_table.c + if c not in inherited_mapper._columntoproperty] + ).union( + inherited_mapper.exclude_properties or () + ) + exclude_properties.difference_update( + [c.key for c in self.declared_columns]) + + # look through columns in the current mapper that + # are keyed to a propname different than the colname + # (if names were the same, we'd have popped it out above, + # in which case the mapper makes this combination). + # See if the superclass has a similar column property. + # If so, join them together. + for k, col in list(properties.items()): + if not isinstance(col, expression.ColumnElement): + continue + if k in inherited_mapper._props: + p = inherited_mapper._props[k] + if isinstance(p, ColumnProperty): + # note here we place the subclass column + # first. See [ticket:1892] for background. + properties[k] = [col] + p.columns + result_mapper_args = mapper_args.copy() + result_mapper_args['properties'] = properties + self.mapper_args = result_mapper_args + + def map(self): + self._prepare_mapper_arguments() + if hasattr(self.cls, '__mapper_cls__'): + mapper_cls = util.unbound_method_to_callable( + self.cls.__mapper_cls__) + else: + mapper_cls = mapper + + self.cls.__mapper__ = mp_ = mapper_cls( + self.cls, + self.local_table, + **self.mapper_args + ) + del self.cls._sa_declared_attr_reg + return mp_ + + +class _DeferredMapperConfig(_MapperConfig): + _configs = util.OrderedDict() + + def _early_mapping(self): + pass + + @property + def cls(self): + return self._cls() + + @cls.setter + def cls(self, class_): + self._cls = weakref.ref(class_, self._remove_config_cls) + self._configs[self._cls] = self + + @classmethod + def _remove_config_cls(cls, ref): + cls._configs.pop(ref, None) + + @classmethod + def has_cls(cls, class_): + # 2.6 fails on weakref if class_ is an old style class + return isinstance(class_, type) and \ + weakref.ref(class_) in cls._configs + + @classmethod + def config_for_cls(cls, class_): + return cls._configs[weakref.ref(class_)] + + @classmethod + def classes_for_base(cls, base_cls, sort=True): + classes_for_base = [m for m in cls._configs.values() + if issubclass(m.cls, base_cls)] + if not sort: + return classes_for_base + + all_m_by_cls = dict( + (m.cls, m) + for m in classes_for_base + ) + + tuples = [] + for m_cls in all_m_by_cls: + tuples.extend( + (all_m_by_cls[base_cls], all_m_by_cls[m_cls]) + for base_cls in m_cls.__bases__ + if base_cls in all_m_by_cls + ) + return list( + topological.sort( + tuples, + classes_for_base + ) + ) + + def map(self): + self._configs.pop(self._cls, None) + return super(_DeferredMapperConfig, self).map() + + +def _add_attribute(cls, key, value): + """add an attribute to an existing declarative class. + + This runs through the logic to determine MapperProperty, + adds it to the Mapper, adds a column to the mapped Table, etc. + + """ + + if '__mapper__' in cls.__dict__: + if isinstance(value, Column): + _undefer_column_name(key, value) + cls.__table__.append_column(value) + cls.__mapper__.add_property(key, value) + elif isinstance(value, ColumnProperty): + for col in value.columns: + if isinstance(col, Column) and col.table is None: + _undefer_column_name(key, col) + cls.__table__.append_column(col) + cls.__mapper__.add_property(key, value) + elif isinstance(value, MapperProperty): + cls.__mapper__.add_property( + key, + clsregistry._deferred_relationship(cls, value) + ) + elif isinstance(value, QueryableAttribute) and value.key != key: + # detect a QueryableAttribute that's already mapped being + # assigned elsewhere in userland, turn into a synonym() + value = synonym(value.key) + cls.__mapper__.add_property( + key, + clsregistry._deferred_relationship(cls, value) + ) + else: + type.__setattr__(cls, key, value) + else: + type.__setattr__(cls, key, value) + + +def _declarative_constructor(self, **kwargs): + """A simple constructor that allows initialization from kwargs. + + Sets attributes on the constructed instance using the names and + values in ``kwargs``. + + Only keys that are present as + attributes of the instance's class are allowed. These could be, + for example, any mapped columns or relationships. + """ + cls_ = type(self) + for k in kwargs: + if not hasattr(cls_, k): + raise TypeError( + "%r is an invalid keyword argument for %s" % + (k, cls_.__name__)) + setattr(self, k, kwargs[k]) +_declarative_constructor.__name__ = '__init__' + + +def _undefer_column_name(key, column): + if column.key is None: + column.key = key + if column.name is None: + column.name = key diff --git a/app/lib/sqlalchemy/ext/declarative/clsregistry.py b/app/lib/sqlalchemy/ext/declarative/clsregistry.py new file mode 100644 index 0000000..b2c5bc5 --- /dev/null +++ b/app/lib/sqlalchemy/ext/declarative/clsregistry.py @@ -0,0 +1,328 @@ +# ext/declarative/clsregistry.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +"""Routines to handle the string class registry used by declarative. + +This system allows specification of classes and expressions used in +:func:`.relationship` using strings. + +""" +from ...orm.properties import ColumnProperty, RelationshipProperty, \ + SynonymProperty +from ...schema import _get_table_key +from ...orm import class_mapper, interfaces +from ... import util +from ... import inspection +from ... import exc +import weakref + +# strong references to registries which we place in +# the _decl_class_registry, which is usually weak referencing. +# the internal registries here link to classes with weakrefs and remove +# themselves when all references to contained classes are removed. +_registries = set() + + +def add_class(classname, cls): + """Add a class to the _decl_class_registry associated with the + given declarative class. + + """ + if classname in cls._decl_class_registry: + # class already exists. + existing = cls._decl_class_registry[classname] + if not isinstance(existing, _MultipleClassMarker): + existing = \ + cls._decl_class_registry[classname] = \ + _MultipleClassMarker([cls, existing]) + else: + cls._decl_class_registry[classname] = cls + + try: + root_module = cls._decl_class_registry['_sa_module_registry'] + except KeyError: + cls._decl_class_registry['_sa_module_registry'] = \ + root_module = _ModuleMarker('_sa_module_registry', None) + + tokens = cls.__module__.split(".") + + # build up a tree like this: + # modulename: myapp.snacks.nuts + # + # myapp->snack->nuts->(classes) + # snack->nuts->(classes) + # nuts->(classes) + # + # this allows partial token paths to be used. + while tokens: + token = tokens.pop(0) + module = root_module.get_module(token) + for token in tokens: + module = module.get_module(token) + module.add_class(classname, cls) + + +class _MultipleClassMarker(object): + """refers to multiple classes of the same name + within _decl_class_registry. + + """ + + __slots__ = 'on_remove', 'contents', '__weakref__' + + def __init__(self, classes, on_remove=None): + self.on_remove = on_remove + self.contents = set([ + weakref.ref(item, self._remove_item) for item in classes]) + _registries.add(self) + + def __iter__(self): + return (ref() for ref in self.contents) + + def attempt_get(self, path, key): + if len(self.contents) > 1: + raise exc.InvalidRequestError( + "Multiple classes found for path \"%s\" " + "in the registry of this declarative " + "base. Please use a fully module-qualified path." % + (".".join(path + [key])) + ) + else: + ref = list(self.contents)[0] + cls = ref() + if cls is None: + raise NameError(key) + return cls + + def _remove_item(self, ref): + self.contents.remove(ref) + if not self.contents: + _registries.discard(self) + if self.on_remove: + self.on_remove() + + def add_item(self, item): + # protect against class registration race condition against + # asynchronous garbage collection calling _remove_item, + # [ticket:3208] + modules = set([ + cls.__module__ for cls in + [ref() for ref in self.contents] if cls is not None]) + if item.__module__ in modules: + util.warn( + "This declarative base already contains a class with the " + "same class name and module name as %s.%s, and will " + "be replaced in the string-lookup table." % ( + item.__module__, + item.__name__ + ) + ) + self.contents.add(weakref.ref(item, self._remove_item)) + + +class _ModuleMarker(object): + """"refers to a module name within + _decl_class_registry. + + """ + + __slots__ = 'parent', 'name', 'contents', 'mod_ns', 'path', '__weakref__' + + def __init__(self, name, parent): + self.parent = parent + self.name = name + self.contents = {} + self.mod_ns = _ModNS(self) + if self.parent: + self.path = self.parent.path + [self.name] + else: + self.path = [] + _registries.add(self) + + def __contains__(self, name): + return name in self.contents + + def __getitem__(self, name): + return self.contents[name] + + def _remove_item(self, name): + self.contents.pop(name, None) + if not self.contents and self.parent is not None: + self.parent._remove_item(self.name) + _registries.discard(self) + + def resolve_attr(self, key): + return getattr(self.mod_ns, key) + + def get_module(self, name): + if name not in self.contents: + marker = _ModuleMarker(name, self) + self.contents[name] = marker + else: + marker = self.contents[name] + return marker + + def add_class(self, name, cls): + if name in self.contents: + existing = self.contents[name] + existing.add_item(cls) + else: + existing = self.contents[name] = \ + _MultipleClassMarker([cls], + on_remove=lambda: self._remove_item(name)) + + +class _ModNS(object): + __slots__ = '__parent', + + def __init__(self, parent): + self.__parent = parent + + def __getattr__(self, key): + try: + value = self.__parent.contents[key] + except KeyError: + pass + else: + if value is not None: + if isinstance(value, _ModuleMarker): + return value.mod_ns + else: + assert isinstance(value, _MultipleClassMarker) + return value.attempt_get(self.__parent.path, key) + raise AttributeError("Module %r has no mapped classes " + "registered under the name %r" % ( + self.__parent.name, key)) + + +class _GetColumns(object): + __slots__ = 'cls', + + def __init__(self, cls): + self.cls = cls + + def __getattr__(self, key): + mp = class_mapper(self.cls, configure=False) + if mp: + if key not in mp.all_orm_descriptors: + raise exc.InvalidRequestError( + "Class %r does not have a mapped column named %r" + % (self.cls, key)) + + desc = mp.all_orm_descriptors[key] + if desc.extension_type is interfaces.NOT_EXTENSION: + prop = desc.property + if isinstance(prop, SynonymProperty): + key = prop.name + elif not isinstance(prop, ColumnProperty): + raise exc.InvalidRequestError( + "Property %r is not an instance of" + " ColumnProperty (i.e. does not correspond" + " directly to a Column)." % key) + return getattr(self.cls, key) + +inspection._inspects(_GetColumns)( + lambda target: inspection.inspect(target.cls)) + + +class _GetTable(object): + __slots__ = 'key', 'metadata' + + def __init__(self, key, metadata): + self.key = key + self.metadata = metadata + + def __getattr__(self, key): + return self.metadata.tables[ + _get_table_key(key, self.key) + ] + + +def _determine_container(key, value): + if isinstance(value, _MultipleClassMarker): + value = value.attempt_get([], key) + return _GetColumns(value) + + +class _class_resolver(object): + def __init__(self, cls, prop, fallback, arg): + self.cls = cls + self.prop = prop + self.arg = self._declarative_arg = arg + self.fallback = fallback + self._dict = util.PopulateDict(self._access_cls) + self._resolvers = () + + def _access_cls(self, key): + cls = self.cls + if key in cls._decl_class_registry: + return _determine_container(key, cls._decl_class_registry[key]) + elif key in cls.metadata.tables: + return cls.metadata.tables[key] + elif key in cls.metadata._schemas: + return _GetTable(key, cls.metadata) + elif '_sa_module_registry' in cls._decl_class_registry and \ + key in cls._decl_class_registry['_sa_module_registry']: + registry = cls._decl_class_registry['_sa_module_registry'] + return registry.resolve_attr(key) + elif self._resolvers: + for resolv in self._resolvers: + value = resolv(key) + if value is not None: + return value + + return self.fallback[key] + + def __call__(self): + try: + x = eval(self.arg, globals(), self._dict) + + if isinstance(x, _GetColumns): + return x.cls + else: + return x + except NameError as n: + raise exc.InvalidRequestError( + "When initializing mapper %s, expression %r failed to " + "locate a name (%r). If this is a class name, consider " + "adding this relationship() to the %r class after " + "both dependent classes have been defined." % + (self.prop.parent, self.arg, n.args[0], self.cls) + ) + + +def _resolver(cls, prop): + import sqlalchemy + from sqlalchemy.orm import foreign, remote + + fallback = sqlalchemy.__dict__.copy() + fallback.update({'foreign': foreign, 'remote': remote}) + + def resolve_arg(arg): + return _class_resolver(cls, prop, fallback, arg) + return resolve_arg + + +def _deferred_relationship(cls, prop): + + if isinstance(prop, RelationshipProperty): + resolve_arg = _resolver(cls, prop) + + for attr in ('argument', 'order_by', 'primaryjoin', 'secondaryjoin', + 'secondary', '_user_defined_foreign_keys', 'remote_side'): + v = getattr(prop, attr) + if isinstance(v, util.string_types): + setattr(prop, attr, resolve_arg(v)) + + if prop.backref and isinstance(prop.backref, tuple): + key, kwargs = prop.backref + for attr in ('primaryjoin', 'secondaryjoin', 'secondary', + 'foreign_keys', 'remote_side', 'order_by'): + if attr in kwargs and isinstance(kwargs[attr], + util.string_types): + kwargs[attr] = resolve_arg(kwargs[attr]) + + return prop diff --git a/app/lib/sqlalchemy/ext/horizontal_shard.py b/app/lib/sqlalchemy/ext/horizontal_shard.py new file mode 100644 index 0000000..d20fbd4 --- /dev/null +++ b/app/lib/sqlalchemy/ext/horizontal_shard.py @@ -0,0 +1,131 @@ +# ext/horizontal_shard.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Horizontal sharding support. + +Defines a rudimental 'horizontal sharding' system which allows a Session to +distribute queries and persistence operations across multiple databases. + +For a usage example, see the :ref:`examples_sharding` example included in +the source distribution. + +""" + +from .. import util +from ..orm.session import Session +from ..orm.query import Query + +__all__ = ['ShardedSession', 'ShardedQuery'] + + +class ShardedQuery(Query): + def __init__(self, *args, **kwargs): + super(ShardedQuery, self).__init__(*args, **kwargs) + self.id_chooser = self.session.id_chooser + self.query_chooser = self.session.query_chooser + self._shard_id = None + + def set_shard(self, shard_id): + """return a new query, limited to a single shard ID. + + all subsequent operations with the returned query will + be against the single shard regardless of other state. + """ + + q = self._clone() + q._shard_id = shard_id + return q + + def _execute_and_instances(self, context): + def iter_for_shard(shard_id): + context.attributes['shard_id'] = shard_id + result = self._connection_from_session( + mapper=self._mapper_zero(), + shard_id=shard_id).execute( + context.statement, + self._params) + return self.instances(result, context) + + if self._shard_id is not None: + return iter_for_shard(self._shard_id) + else: + partial = [] + for shard_id in self.query_chooser(self): + partial.extend(iter_for_shard(shard_id)) + + # if some kind of in memory 'sorting' + # were done, this is where it would happen + return iter(partial) + + def get(self, ident, **kwargs): + if self._shard_id is not None: + return super(ShardedQuery, self).get(ident) + else: + ident = util.to_list(ident) + for shard_id in self.id_chooser(self, ident): + o = self.set_shard(shard_id).get(ident, **kwargs) + if o is not None: + return o + else: + return None + + +class ShardedSession(Session): + def __init__(self, shard_chooser, id_chooser, query_chooser, shards=None, + query_cls=ShardedQuery, **kwargs): + """Construct a ShardedSession. + + :param shard_chooser: A callable which, passed a Mapper, a mapped + instance, and possibly a SQL clause, returns a shard ID. This id + may be based off of the attributes present within the object, or on + some round-robin scheme. If the scheme is based on a selection, it + should set whatever state on the instance to mark it in the future as + participating in that shard. + + :param id_chooser: A callable, passed a query and a tuple of identity + values, which should return a list of shard ids where the ID might + reside. The databases will be queried in the order of this listing. + + :param query_chooser: For a given Query, returns the list of shard_ids + where the query should be issued. Results from all shards returned + will be combined together into a single listing. + + :param shards: A dictionary of string shard names + to :class:`~sqlalchemy.engine.Engine` objects. + + """ + super(ShardedSession, self).__init__(query_cls=query_cls, **kwargs) + self.shard_chooser = shard_chooser + self.id_chooser = id_chooser + self.query_chooser = query_chooser + self.__binds = {} + self.connection_callable = self.connection + if shards is not None: + for k in shards: + self.bind_shard(k, shards[k]) + + def connection(self, mapper=None, instance=None, shard_id=None, **kwargs): + if shard_id is None: + shard_id = self.shard_chooser(mapper, instance) + + if self.transaction is not None: + return self.transaction.connection(mapper, shard_id=shard_id) + else: + return self.get_bind( + mapper, + shard_id=shard_id, + instance=instance + ).contextual_connect(**kwargs) + + def get_bind(self, mapper, shard_id=None, + instance=None, clause=None, **kw): + if shard_id is None: + shard_id = self.shard_chooser(mapper, instance, clause=clause) + return self.__binds[shard_id] + + def bind_shard(self, shard_id, bind): + self.__binds[shard_id] = bind diff --git a/app/lib/sqlalchemy/ext/hybrid.py b/app/lib/sqlalchemy/ext/hybrid.py new file mode 100644 index 0000000..509dd56 --- /dev/null +++ b/app/lib/sqlalchemy/ext/hybrid.py @@ -0,0 +1,841 @@ +# ext/hybrid.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +r"""Define attributes on ORM-mapped classes that have "hybrid" behavior. + +"hybrid" means the attribute has distinct behaviors defined at the +class level and at the instance level. + +The :mod:`~sqlalchemy.ext.hybrid` extension provides a special form of +method decorator, is around 50 lines of code and has almost no +dependencies on the rest of SQLAlchemy. It can, in theory, work with +any descriptor-based expression system. + +Consider a mapping ``Interval``, representing integer ``start`` and ``end`` +values. We can define higher level functions on mapped classes that produce +SQL expressions at the class level, and Python expression evaluation at the +instance level. Below, each function decorated with :class:`.hybrid_method` or +:class:`.hybrid_property` may receive ``self`` as an instance of the class, or +as the class itself:: + + from sqlalchemy import Column, Integer + from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.orm import Session, aliased + from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method + + Base = declarative_base() + + class Interval(Base): + __tablename__ = 'interval' + + id = Column(Integer, primary_key=True) + start = Column(Integer, nullable=False) + end = Column(Integer, nullable=False) + + def __init__(self, start, end): + self.start = start + self.end = end + + @hybrid_property + def length(self): + return self.end - self.start + + @hybrid_method + def contains(self, point): + return (self.start <= point) & (point <= self.end) + + @hybrid_method + def intersects(self, other): + return self.contains(other.start) | self.contains(other.end) + +Above, the ``length`` property returns the difference between the +``end`` and ``start`` attributes. With an instance of ``Interval``, +this subtraction occurs in Python, using normal Python descriptor +mechanics:: + + >>> i1 = Interval(5, 10) + >>> i1.length + 5 + +When dealing with the ``Interval`` class itself, the :class:`.hybrid_property` +descriptor evaluates the function body given the ``Interval`` class as +the argument, which when evaluated with SQLAlchemy expression mechanics +returns a new SQL expression:: + + >>> print Interval.length + interval."end" - interval.start + + >>> print Session().query(Interval).filter(Interval.length > 10) + SELECT interval.id AS interval_id, interval.start AS interval_start, + interval."end" AS interval_end + FROM interval + WHERE interval."end" - interval.start > :param_1 + +ORM methods such as :meth:`~.Query.filter_by` generally use ``getattr()`` to +locate attributes, so can also be used with hybrid attributes:: + + >>> print Session().query(Interval).filter_by(length=5) + SELECT interval.id AS interval_id, interval.start AS interval_start, + interval."end" AS interval_end + FROM interval + WHERE interval."end" - interval.start = :param_1 + +The ``Interval`` class example also illustrates two methods, +``contains()`` and ``intersects()``, decorated with +:class:`.hybrid_method`. This decorator applies the same idea to +methods that :class:`.hybrid_property` applies to attributes. The +methods return boolean values, and take advantage of the Python ``|`` +and ``&`` bitwise operators to produce equivalent instance-level and +SQL expression-level boolean behavior:: + + >>> i1.contains(6) + True + >>> i1.contains(15) + False + >>> i1.intersects(Interval(7, 18)) + True + >>> i1.intersects(Interval(25, 29)) + False + + >>> print Session().query(Interval).filter(Interval.contains(15)) + SELECT interval.id AS interval_id, interval.start AS interval_start, + interval."end" AS interval_end + FROM interval + WHERE interval.start <= :start_1 AND interval."end" > :end_1 + + >>> ia = aliased(Interval) + >>> print Session().query(Interval, ia).filter(Interval.intersects(ia)) + SELECT interval.id AS interval_id, interval.start AS interval_start, + interval."end" AS interval_end, interval_1.id AS interval_1_id, + interval_1.start AS interval_1_start, interval_1."end" AS interval_1_end + FROM interval, interval AS interval_1 + WHERE interval.start <= interval_1.start + AND interval."end" > interval_1.start + OR interval.start <= interval_1."end" + AND interval."end" > interval_1."end" + +Defining Expression Behavior Distinct from Attribute Behavior +-------------------------------------------------------------- + +Our usage of the ``&`` and ``|`` bitwise operators above was +fortunate, considering our functions operated on two boolean values to +return a new one. In many cases, the construction of an in-Python +function and a SQLAlchemy SQL expression have enough differences that +two separate Python expressions should be defined. The +:mod:`~sqlalchemy.ext.hybrid` decorators define the +:meth:`.hybrid_property.expression` modifier for this purpose. As an +example we'll define the radius of the interval, which requires the +usage of the absolute value function:: + + from sqlalchemy import func + + class Interval(object): + # ... + + @hybrid_property + def radius(self): + return abs(self.length) / 2 + + @radius.expression + def radius(cls): + return func.abs(cls.length) / 2 + +Above the Python function ``abs()`` is used for instance-level +operations, the SQL function ``ABS()`` is used via the :data:`.func` +object for class-level expressions:: + + >>> i1.radius + 2 + + >>> print Session().query(Interval).filter(Interval.radius > 5) + SELECT interval.id AS interval_id, interval.start AS interval_start, + interval."end" AS interval_end + FROM interval + WHERE abs(interval."end" - interval.start) / :abs_1 > :param_1 + +Defining Setters +---------------- + +Hybrid properties can also define setter methods. If we wanted +``length`` above, when set, to modify the endpoint value:: + + class Interval(object): + # ... + + @hybrid_property + def length(self): + return self.end - self.start + + @length.setter + def length(self, value): + self.end = self.start + value + +The ``length(self, value)`` method is now called upon set:: + + >>> i1 = Interval(5, 10) + >>> i1.length + 5 + >>> i1.length = 12 + >>> i1.end + 17 + +Working with Relationships +-------------------------- + +There's no essential difference when creating hybrids that work with +related objects as opposed to column-based data. The need for distinct +expressions tends to be greater. The two variants we'll illustrate +are the "join-dependent" hybrid, and the "correlated subquery" hybrid. + +Join-Dependent Relationship Hybrid +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Consider the following declarative +mapping which relates a ``User`` to a ``SavingsAccount``:: + + from sqlalchemy import Column, Integer, ForeignKey, Numeric, String + from sqlalchemy.orm import relationship + from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.ext.hybrid import hybrid_property + + Base = declarative_base() + + class SavingsAccount(Base): + __tablename__ = 'account' + id = Column(Integer, primary_key=True) + user_id = Column(Integer, ForeignKey('user.id'), nullable=False) + balance = Column(Numeric(15, 5)) + + class User(Base): + __tablename__ = 'user' + id = Column(Integer, primary_key=True) + name = Column(String(100), nullable=False) + + accounts = relationship("SavingsAccount", backref="owner") + + @hybrid_property + def balance(self): + if self.accounts: + return self.accounts[0].balance + else: + return None + + @balance.setter + def balance(self, value): + if not self.accounts: + account = Account(owner=self) + else: + account = self.accounts[0] + account.balance = value + + @balance.expression + def balance(cls): + return SavingsAccount.balance + +The above hybrid property ``balance`` works with the first +``SavingsAccount`` entry in the list of accounts for this user. The +in-Python getter/setter methods can treat ``accounts`` as a Python +list available on ``self``. + +However, at the expression level, it's expected that the ``User`` class will +be used in an appropriate context such that an appropriate join to +``SavingsAccount`` will be present:: + + >>> print Session().query(User, User.balance).\ + ... join(User.accounts).filter(User.balance > 5000) + SELECT "user".id AS user_id, "user".name AS user_name, + account.balance AS account_balance + FROM "user" JOIN account ON "user".id = account.user_id + WHERE account.balance > :balance_1 + +Note however, that while the instance level accessors need to worry +about whether ``self.accounts`` is even present, this issue expresses +itself differently at the SQL expression level, where we basically +would use an outer join:: + + >>> from sqlalchemy import or_ + >>> print (Session().query(User, User.balance).outerjoin(User.accounts). + ... filter(or_(User.balance < 5000, User.balance == None))) + SELECT "user".id AS user_id, "user".name AS user_name, + account.balance AS account_balance + FROM "user" LEFT OUTER JOIN account ON "user".id = account.user_id + WHERE account.balance < :balance_1 OR account.balance IS NULL + +Correlated Subquery Relationship Hybrid +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We can, of course, forego being dependent on the enclosing query's usage +of joins in favor of the correlated subquery, which can portably be packed +into a single column expression. A correlated subquery is more portable, but +often performs more poorly at the SQL level. Using the same technique +illustrated at :ref:`mapper_column_property_sql_expressions`, +we can adjust our ``SavingsAccount`` example to aggregate the balances for +*all* accounts, and use a correlated subquery for the column expression:: + + from sqlalchemy import Column, Integer, ForeignKey, Numeric, String + from sqlalchemy.orm import relationship + from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.ext.hybrid import hybrid_property + from sqlalchemy import select, func + + Base = declarative_base() + + class SavingsAccount(Base): + __tablename__ = 'account' + id = Column(Integer, primary_key=True) + user_id = Column(Integer, ForeignKey('user.id'), nullable=False) + balance = Column(Numeric(15, 5)) + + class User(Base): + __tablename__ = 'user' + id = Column(Integer, primary_key=True) + name = Column(String(100), nullable=False) + + accounts = relationship("SavingsAccount", backref="owner") + + @hybrid_property + def balance(self): + return sum(acc.balance for acc in self.accounts) + + @balance.expression + def balance(cls): + return select([func.sum(SavingsAccount.balance)]).\ + where(SavingsAccount.user_id==cls.id).\ + label('total_balance') + +The above recipe will give us the ``balance`` column which renders +a correlated SELECT:: + + >>> print s.query(User).filter(User.balance > 400) + SELECT "user".id AS user_id, "user".name AS user_name + FROM "user" + WHERE (SELECT sum(account.balance) AS sum_1 + FROM account + WHERE account.user_id = "user".id) > :param_1 + +.. _hybrid_custom_comparators: + +Building Custom Comparators +--------------------------- + +The hybrid property also includes a helper that allows construction of +custom comparators. A comparator object allows one to customize the +behavior of each SQLAlchemy expression operator individually. They +are useful when creating custom types that have some highly +idiosyncratic behavior on the SQL side. + +The example class below allows case-insensitive comparisons on the attribute +named ``word_insensitive``:: + + from sqlalchemy.ext.hybrid import Comparator, hybrid_property + from sqlalchemy import func, Column, Integer, String + from sqlalchemy.orm import Session + from sqlalchemy.ext.declarative import declarative_base + + Base = declarative_base() + + class CaseInsensitiveComparator(Comparator): + def __eq__(self, other): + return func.lower(self.__clause_element__()) == func.lower(other) + + class SearchWord(Base): + __tablename__ = 'searchword' + id = Column(Integer, primary_key=True) + word = Column(String(255), nullable=False) + + @hybrid_property + def word_insensitive(self): + return self.word.lower() + + @word_insensitive.comparator + def word_insensitive(cls): + return CaseInsensitiveComparator(cls.word) + +Above, SQL expressions against ``word_insensitive`` will apply the ``LOWER()`` +SQL function to both sides:: + + >>> print Session().query(SearchWord).filter_by(word_insensitive="Trucks") + SELECT searchword.id AS searchword_id, searchword.word AS searchword_word + FROM searchword + WHERE lower(searchword.word) = lower(:lower_1) + +The ``CaseInsensitiveComparator`` above implements part of the +:class:`.ColumnOperators` interface. A "coercion" operation like +lowercasing can be applied to all comparison operations (i.e. ``eq``, +``lt``, ``gt``, etc.) using :meth:`.Operators.operate`:: + + class CaseInsensitiveComparator(Comparator): + def operate(self, op, other): + return op(func.lower(self.__clause_element__()), func.lower(other)) + +Hybrid Value Objects +-------------------- + +Note in our previous example, if we were to compare the +``word_insensitive`` attribute of a ``SearchWord`` instance to a plain +Python string, the plain Python string would not be coerced to lower +case - the ``CaseInsensitiveComparator`` we built, being returned by +``@word_insensitive.comparator``, only applies to the SQL side. + +A more comprehensive form of the custom comparator is to construct a +*Hybrid Value Object*. This technique applies the target value or +expression to a value object which is then returned by the accessor in +all cases. The value object allows control of all operations upon +the value as well as how compared values are treated, both on the SQL +expression side as well as the Python value side. Replacing the +previous ``CaseInsensitiveComparator`` class with a new +``CaseInsensitiveWord`` class:: + + class CaseInsensitiveWord(Comparator): + "Hybrid value representing a lower case representation of a word." + + def __init__(self, word): + if isinstance(word, basestring): + self.word = word.lower() + elif isinstance(word, CaseInsensitiveWord): + self.word = word.word + else: + self.word = func.lower(word) + + def operate(self, op, other): + if not isinstance(other, CaseInsensitiveWord): + other = CaseInsensitiveWord(other) + return op(self.word, other.word) + + def __clause_element__(self): + return self.word + + def __str__(self): + return self.word + + key = 'word' + "Label to apply to Query tuple results" + +Above, the ``CaseInsensitiveWord`` object represents ``self.word``, +which may be a SQL function, or may be a Python native. By +overriding ``operate()`` and ``__clause_element__()`` to work in terms +of ``self.word``, all comparison operations will work against the +"converted" form of ``word``, whether it be SQL side or Python side. +Our ``SearchWord`` class can now deliver the ``CaseInsensitiveWord`` +object unconditionally from a single hybrid call:: + + class SearchWord(Base): + __tablename__ = 'searchword' + id = Column(Integer, primary_key=True) + word = Column(String(255), nullable=False) + + @hybrid_property + def word_insensitive(self): + return CaseInsensitiveWord(self.word) + +The ``word_insensitive`` attribute now has case-insensitive comparison +behavior universally, including SQL expression vs. Python expression +(note the Python value is converted to lower case on the Python side +here):: + + >>> print Session().query(SearchWord).filter_by(word_insensitive="Trucks") + SELECT searchword.id AS searchword_id, searchword.word AS searchword_word + FROM searchword + WHERE lower(searchword.word) = :lower_1 + +SQL expression versus SQL expression:: + + >>> sw1 = aliased(SearchWord) + >>> sw2 = aliased(SearchWord) + >>> print Session().query( + ... sw1.word_insensitive, + ... sw2.word_insensitive).\ + ... filter( + ... sw1.word_insensitive > sw2.word_insensitive + ... ) + SELECT lower(searchword_1.word) AS lower_1, + lower(searchword_2.word) AS lower_2 + FROM searchword AS searchword_1, searchword AS searchword_2 + WHERE lower(searchword_1.word) > lower(searchword_2.word) + +Python only expression:: + + >>> ws1 = SearchWord(word="SomeWord") + >>> ws1.word_insensitive == "sOmEwOrD" + True + >>> ws1.word_insensitive == "XOmEwOrX" + False + >>> print ws1.word_insensitive + someword + +The Hybrid Value pattern is very useful for any kind of value that may +have multiple representations, such as timestamps, time deltas, units +of measurement, currencies and encrypted passwords. + +.. seealso:: + + `Hybrids and Value Agnostic Types + `_ + - on the techspot.zzzeek.org blog + + `Value Agnostic Types, Part II + `_ - + on the techspot.zzzeek.org blog + +.. _hybrid_transformers: + +Building Transformers +---------------------- + +A *transformer* is an object which can receive a :class:`.Query` +object and return a new one. The :class:`.Query` object includes a +method :meth:`.with_transformation` that returns a new :class:`.Query` +transformed by the given function. + +We can combine this with the :class:`.Comparator` class to produce one type +of recipe which can both set up the FROM clause of a query as well as assign +filtering criterion. + +Consider a mapped class ``Node``, which assembles using adjacency list +into a hierarchical tree pattern:: + + from sqlalchemy import Column, Integer, ForeignKey + from sqlalchemy.orm import relationship + from sqlalchemy.ext.declarative import declarative_base + Base = declarative_base() + + class Node(Base): + __tablename__ = 'node' + id = Column(Integer, primary_key=True) + parent_id = Column(Integer, ForeignKey('node.id')) + parent = relationship("Node", remote_side=id) + +Suppose we wanted to add an accessor ``grandparent``. This would +return the ``parent`` of ``Node.parent``. When we have an instance of +``Node``, this is simple:: + + from sqlalchemy.ext.hybrid import hybrid_property + + class Node(Base): + # ... + + @hybrid_property + def grandparent(self): + return self.parent.parent + +For the expression, things are not so clear. We'd need to construct +a :class:`.Query` where we :meth:`~.Query.join` twice along +``Node.parent`` to get to the ``grandparent``. We can instead return +a transforming callable that we'll combine with the +:class:`.Comparator` class to receive any :class:`.Query` object, and +return a new one that's joined to the ``Node.parent`` attribute and +filtered based on the given criterion:: + + from sqlalchemy.ext.hybrid import Comparator + + class GrandparentTransformer(Comparator): + def operate(self, op, other): + def transform(q): + cls = self.__clause_element__() + parent_alias = aliased(cls) + return q.join(parent_alias, cls.parent).\ + filter(op(parent_alias.parent, other)) + return transform + + Base = declarative_base() + + class Node(Base): + __tablename__ = 'node' + id =Column(Integer, primary_key=True) + parent_id = Column(Integer, ForeignKey('node.id')) + parent = relationship("Node", remote_side=id) + + @hybrid_property + def grandparent(self): + return self.parent.parent + + @grandparent.comparator + def grandparent(cls): + return GrandparentTransformer(cls) + +The ``GrandparentTransformer`` overrides the core +:meth:`.Operators.operate` method at the base of the +:class:`.Comparator` hierarchy to return a query-transforming +callable, which then runs the given comparison operation in a +particular context. Such as, in the example above, the ``operate`` +method is called, given the :attr:`.Operators.eq` callable as well as +the right side of the comparison ``Node(id=5)``. A function +``transform`` is then returned which will transform a :class:`.Query` +first to join to ``Node.parent``, then to compare ``parent_alias`` +using :attr:`.Operators.eq` against the left and right sides, passing +into :class:`.Query.filter`: + +.. sourcecode:: pycon+sql + + >>> from sqlalchemy.orm import Session + >>> session = Session() + {sql}>>> session.query(Node).\ + ... with_transformation(Node.grandparent==Node(id=5)).\ + ... all() + SELECT node.id AS node_id, node.parent_id AS node_parent_id + FROM node JOIN node AS node_1 ON node_1.id = node.parent_id + WHERE :param_1 = node_1.parent_id + {stop} + +We can modify the pattern to be more verbose but flexible by separating +the "join" step from the "filter" step. The tricky part here is ensuring +that successive instances of ``GrandparentTransformer`` use the same +:class:`.AliasedClass` object against ``Node``. Below we use a simple +memoizing approach that associates a ``GrandparentTransformer`` +with each class:: + + class Node(Base): + + # ... + + @grandparent.comparator + def grandparent(cls): + # memoize a GrandparentTransformer + # per class + if '_gp' not in cls.__dict__: + cls._gp = GrandparentTransformer(cls) + return cls._gp + + class GrandparentTransformer(Comparator): + + def __init__(self, cls): + self.parent_alias = aliased(cls) + + @property + def join(self): + def go(q): + return q.join(self.parent_alias, Node.parent) + return go + + def operate(self, op, other): + return op(self.parent_alias.parent, other) + +.. sourcecode:: pycon+sql + + {sql}>>> session.query(Node).\ + ... with_transformation(Node.grandparent.join).\ + ... filter(Node.grandparent==Node(id=5)) + SELECT node.id AS node_id, node.parent_id AS node_parent_id + FROM node JOIN node AS node_1 ON node_1.id = node.parent_id + WHERE :param_1 = node_1.parent_id + {stop} + +The "transformer" pattern is an experimental pattern that starts +to make usage of some functional programming paradigms. +While it's only recommended for advanced and/or patient developers, +there's probably a whole lot of amazing things it can be used for. + +""" +from .. import util +from ..orm import attributes, interfaces + +HYBRID_METHOD = util.symbol('HYBRID_METHOD') +"""Symbol indicating an :class:`InspectionAttr` that's + of type :class:`.hybrid_method`. + + Is assigned to the :attr:`.InspectionAttr.extension_type` + attibute. + + .. seealso:: + + :attr:`.Mapper.all_orm_attributes` + +""" + +HYBRID_PROPERTY = util.symbol('HYBRID_PROPERTY') +"""Symbol indicating an :class:`InspectionAttr` that's + of type :class:`.hybrid_method`. + + Is assigned to the :attr:`.InspectionAttr.extension_type` + attibute. + + .. seealso:: + + :attr:`.Mapper.all_orm_attributes` + +""" + + +class hybrid_method(interfaces.InspectionAttrInfo): + """A decorator which allows definition of a Python object method with both + instance-level and class-level behavior. + + """ + + is_attribute = True + extension_type = HYBRID_METHOD + + def __init__(self, func, expr=None): + """Create a new :class:`.hybrid_method`. + + Usage is typically via decorator:: + + from sqlalchemy.ext.hybrid import hybrid_method + + class SomeClass(object): + @hybrid_method + def value(self, x, y): + return self._value + x + y + + @value.expression + def value(self, x, y): + return func.some_function(self._value, x, y) + + """ + self.func = func + self.expression(expr or func) + + def __get__(self, instance, owner): + if instance is None: + return self.expr.__get__(owner, owner.__class__) + else: + return self.func.__get__(instance, owner) + + def expression(self, expr): + """Provide a modifying decorator that defines a + SQL-expression producing method.""" + + self.expr = expr + if not self.expr.__doc__: + self.expr.__doc__ = self.func.__doc__ + return self + + +class hybrid_property(interfaces.InspectionAttrInfo): + """A decorator which allows definition of a Python descriptor with both + instance-level and class-level behavior. + + """ + + is_attribute = True + extension_type = HYBRID_PROPERTY + + def __init__(self, fget, fset=None, fdel=None, expr=None): + """Create a new :class:`.hybrid_property`. + + Usage is typically via decorator:: + + from sqlalchemy.ext.hybrid import hybrid_property + + class SomeClass(object): + @hybrid_property + def value(self): + return self._value + + @value.setter + def value(self, value): + self._value = value + + """ + self.fget = fget + self.fset = fset + self.fdel = fdel + self.expression(expr or fget) + util.update_wrapper(self, fget) + + def __get__(self, instance, owner): + if instance is None: + return self.expr(owner) + else: + return self.fget(instance) + + def __set__(self, instance, value): + if self.fset is None: + raise AttributeError("can't set attribute") + self.fset(instance, value) + + def __delete__(self, instance): + if self.fdel is None: + raise AttributeError("can't delete attribute") + self.fdel(instance) + + def setter(self, fset): + """Provide a modifying decorator that defines a value-setter method.""" + + self.fset = fset + return self + + def deleter(self, fdel): + """Provide a modifying decorator that defines a + value-deletion method.""" + + self.fdel = fdel + return self + + def expression(self, expr): + """Provide a modifying decorator that defines a SQL-expression + producing method.""" + + def _expr(cls): + return ExprComparator(expr(cls), self) + util.update_wrapper(_expr, expr) + + self.expr = _expr + return self.comparator(_expr) + + def comparator(self, comparator): + """Provide a modifying decorator that defines a custom + comparator producing method. + + The return value of the decorated method should be an instance of + :class:`~.hybrid.Comparator`. + + """ + + proxy_attr = attributes.\ + create_proxied_attribute(self) + + def expr(owner): + return proxy_attr( + owner, self.__name__, self, comparator(owner), + doc=comparator.__doc__ or self.__doc__) + self.expr = expr + return self + + +class Comparator(interfaces.PropComparator): + """A helper class that allows easy construction of custom + :class:`~.orm.interfaces.PropComparator` + classes for usage with hybrids.""" + + property = None + + def __init__(self, expression): + self.expression = expression + + def __clause_element__(self): + expr = self.expression + if hasattr(expr, '__clause_element__'): + expr = expr.__clause_element__() + return expr + + def adapt_to_entity(self, adapt_to_entity): + # interesting.... + return self + + +class ExprComparator(Comparator): + def __init__(self, expression, hybrid): + self.expression = expression + self.hybrid = hybrid + + def __getattr__(self, key): + return getattr(self.expression, key) + + @property + def info(self): + return self.hybrid.info + + @property + def property(self): + return self.expression.property + + def operate(self, op, *other, **kwargs): + return op(self.expression, *other, **kwargs) + + def reverse_operate(self, op, other, **kwargs): + return op(other, self.expression, **kwargs) diff --git a/app/lib/sqlalchemy/ext/indexable.py b/app/lib/sqlalchemy/ext/indexable.py new file mode 100644 index 0000000..b1ce129 --- /dev/null +++ b/app/lib/sqlalchemy/ext/indexable.py @@ -0,0 +1,349 @@ +# ext/index.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Define attributes on ORM-mapped classes that have "index" attributes for +columns with :class:`~.types.Indexable` types. + +"index" means the attribute is associated with an element of an +:class:`~.types.Indexable` column with the predefined index to access it. +The :class:`~.types.Indexable` types include types such as +:class:`~.types.ARRAY`, :class:`~.types.JSON` and +:class:`~.postgresql.HSTORE`. + + + +The :mod:`~sqlalchemy.ext.indexable` extension provides +:class:`~.schema.Column`-like interface for any element of an +:class:`~.types.Indexable` typed column. In simple cases, it can be +treated as a :class:`~.schema.Column` - mapped attribute. + + +.. versionadded:: 1.1 + +Synopsis +======== + +Given ``Person`` as a model with a primary key and JSON data field. +While this field may have any number of elements encoded within it, +we would like to refer to the element called ``name`` individually +as a dedicated attribute which behaves like a standalone column:: + + from sqlalchemy import Column, JSON, Integer + from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.ext.indexable import index_property + + Base = declarative_base() + + class Person(Base): + __tablename__ = 'person' + + id = Column(Integer, primary_key=True) + data = Column(JSON) + + name = index_property('data', 'name') + + +Above, the ``name`` attribute now behaves like a mapped column. We +can compose a new ``Person`` and set the value of ``name``:: + + >>> person = Person(name='Alchemist') + +The value is now accessible:: + + >>> person.name + 'Alchemist' + +Behind the scenes, the JSON field was initialized to a new blank dictionary +and the field was set:: + + >>> person.data + {"name": "Alchemist'} + +The field is mutable in place:: + + >>> person.name = 'Renamed' + >>> person.name + 'Renamed' + >>> person.data + {'name': 'Renamed'} + +When using :class:`.index_property`, the change that we make to the indexable +structure is also automatically tracked as history; we no longer need +to use :class:`~.mutable.MutableDict` in order to track this change +for the unit of work. + +Deletions work normally as well:: + + >>> del person.name + >>> person.data + {} + +Above, deletion of ``person.name`` deletes the value from the dictionary, +but not the dictionary itself. + +A missing key will produce ``AttributeError``:: + + >>> person = Person() + >>> person.name + ... + AttributeError: 'name' + +Unless you set a default value:: + + >>> class Person(Base): + >>> __tablename__ = 'person' + >>> + >>> id = Column(Integer, primary_key=True) + >>> data = Column(JSON) + >>> + >>> name = index_property('data', 'name', default=None) # See default + + >>> person = Person() + >>> print(person.name) + None + + +The attributes are also accessible at the class level. +Below, we illustrate ``Person.name`` used to generate +an indexed SQL criteria:: + + >>> from sqlalchemy.orm import Session + >>> session = Session() + >>> query = session.query(Person).filter(Person.name == 'Alchemist') + +The above query is equivalent to:: + + >>> query = session.query(Person).filter(Person.data['name'] == 'Alchemist') + +Multiple :class:`.index_property` objects can be chained to produce +multiple levels of indexing:: + + from sqlalchemy import Column, JSON, Integer + from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.ext.indexable import index_property + + Base = declarative_base() + + class Person(Base): + __tablename__ = 'person' + + id = Column(Integer, primary_key=True) + data = Column(JSON) + + birthday = index_property('data', 'birthday') + year = index_property('birthday', 'year') + month = index_property('birthday', 'month') + day = index_property('birthday', 'day') + +Above, a query such as:: + + q = session.query(Person).filter(Person.year == '1980') + +On a PostgreSQL backend, the above query will render as:: + + SELECT person.id, person.data + FROM person + WHERE person.data -> %(data_1)s -> %(param_1)s = %(param_2)s + +Default Values +============== + +:class:`.index_property` includes special behaviors for when the indexed +data structure does not exist, and a set operation is called: + +* For an :class:`.index_property` that is given an integer index value, + the default data structure will be a Python list of ``None`` values, + at least as long as the index value; the value is then set at its + place in the list. This means for an index value of zero, the list + will be initialized to ``[None]`` before setting the given value, + and for an index value of five, the list will be initialized to + ``[None, None, None, None, None]`` before setting the fifth element + to the given value. Note that an existing list is **not** extended + in place to receive a value. + +* for an :class:`.index_property` that is given any other kind of index + value (e.g. strings usually), a Python dictionary is used as the + default data structure. + +* The default data structure can be set to any Python callable using the + :paramref:`.index_property.datatype` parameter, overriding the previous + rules. + + + + + + +Subclassing +=========== + +:class:`.index_property` can be subclassed, in particular for the common +use case of providing coercion of values or SQL expressions as they are +accessed. Below is a common recipe for use with a PostgreSQL JSON type, +where we want to also include automatic casting plus ``astext()``:: + + class pg_json_property(index_property): + def __init__(self, attr_name, index, cast_type): + super(pg_json_property, self).__init__(attr_name, index) + self.cast_type = cast_type + + def expr(self, model): + expr = super(pg_json_property, self).expr(model) + return expr.astext.cast(self.cast_type) + +The above subclass can be used with the PostgreSQL-specific +version of :class:`.postgresql.JSON`:: + + from sqlalchemy import Column, Integer + from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.dialects.postgresql import JSON + + Base = declarative_base() + + class Person(Base): + __tablename__ = 'person' + + id = Column(Integer, primary_key=True) + data = Column(JSON) + + age = pg_json_property('data', 'age', Integer) + +The ``age`` attribute at the instance level works as before; however +when rendering SQL, PostgreSQL's ``->>`` operator will be used +for indexed access, instead of the usual index opearator of ``->``:: + + >>> query = session.query(Person).filter(Person.age < 20) + +The above query will render:: + + SELECT person.id, person.data + FROM person + WHERE CAST(person.data ->> %(data_1)s AS INTEGER) < %(param_1)s + +""" +from __future__ import absolute_import + +from sqlalchemy import inspect +from ..orm.attributes import flag_modified +from ..ext.hybrid import hybrid_property + + +__all__ = ['index_property'] + + +class index_property(hybrid_property): # noqa + """A property generator. The generated property describes an object + attribute that corresponds to an :class:`~.types.Indexable` + column. + + .. versionadded:: 1.1 + + .. seealso:: + + :mod:`sqlalchemy.ext.indexable` + + """ + + _NO_DEFAULT_ARGUMENT = object() + + def __init__( + self, attr_name, index, default=_NO_DEFAULT_ARGUMENT, + datatype=None, mutable=True, onebased=True): + """Create a new :class:`.index_property`. + + :param attr_name: + An attribute name of an `Indexable` typed column, or other + attribute that returns an indexable structure. + :param index: + The index to be used for getting and setting this value. This + should be the Python-side index value for integers. + :param default: + A value which will be returned instead of `AttributeError` + when there is not a value at given index. + :param datatype: default datatype to use when the field is empty. + By default, this is derived from the type of index used; a + Python list for an integer index, or a Python dictionary for + any other style of index. For a list, the list will be + initialized to a list of None values that is at least + ``index`` elements long. + :param mutable: if False, writes and deletes to the attribute will + be disallowed. + :param onebased: assume the SQL representation of this value is + one-based; that is, the first index in SQL is 1, not zero. + """ + + if mutable: + super(index_property, self).__init__( + self.fget, self.fset, self.fdel, self.expr + ) + else: + super(index_property, self).__init__( + self.fget, None, None, self.expr + ) + self.attr_name = attr_name + self.index = index + self.default = default + is_numeric = isinstance(index, int) + onebased = is_numeric and onebased + + if datatype is not None: + self.datatype = datatype + else: + if is_numeric: + self.datatype = lambda: [None for x in range(index + 1)] + else: + self.datatype = dict + self.onebased = onebased + + def _fget_default(self): + if self.default == self._NO_DEFAULT_ARGUMENT: + raise AttributeError(self.attr_name) + else: + return self.default + + def fget(self, instance): + attr_name = self.attr_name + column_value = getattr(instance, attr_name) + if column_value is None: + return self._fget_default() + try: + value = column_value[self.index] + except (KeyError, IndexError): + return self._fget_default() + else: + return value + + def fset(self, instance, value): + attr_name = self.attr_name + column_value = getattr(instance, attr_name, None) + if column_value is None: + column_value = self.datatype() + setattr(instance, attr_name, column_value) + column_value[self.index] = value + setattr(instance, attr_name, column_value) + if attr_name in inspect(instance).mapper.attrs: + flag_modified(instance, attr_name) + + def fdel(self, instance): + attr_name = self.attr_name + column_value = getattr(instance, attr_name) + if column_value is None: + raise AttributeError(self.attr_name) + try: + del column_value[self.index] + except KeyError: + raise AttributeError(self.attr_name) + else: + setattr(instance, attr_name, column_value) + flag_modified(instance, attr_name) + + def expr(self, model): + column = getattr(model, self.attr_name) + index = self.index + if self.onebased: + index += 1 + return column[index] diff --git a/app/lib/sqlalchemy/ext/instrumentation.py b/app/lib/sqlalchemy/ext/instrumentation.py new file mode 100644 index 0000000..30a0ab7 --- /dev/null +++ b/app/lib/sqlalchemy/ext/instrumentation.py @@ -0,0 +1,414 @@ +"""Extensible class instrumentation. + +The :mod:`sqlalchemy.ext.instrumentation` package provides for alternate +systems of class instrumentation within the ORM. Class instrumentation +refers to how the ORM places attributes on the class which maintain +data and track changes to that data, as well as event hooks installed +on the class. + +.. note:: + The extension package is provided for the benefit of integration + with other object management packages, which already perform + their own instrumentation. It is not intended for general use. + +For examples of how the instrumentation extension is used, +see the example :ref:`examples_instrumentation`. + +.. versionchanged:: 0.8 + The :mod:`sqlalchemy.orm.instrumentation` was split out so + that all functionality having to do with non-standard + instrumentation was moved out to :mod:`sqlalchemy.ext.instrumentation`. + When imported, the module installs itself within + :mod:`sqlalchemy.orm.instrumentation` so that it + takes effect, including recognition of + ``__sa_instrumentation_manager__`` on mapped classes, as + well :data:`.instrumentation_finders` + being used to determine class instrumentation resolution. + +""" +from ..orm import instrumentation as orm_instrumentation +from ..orm.instrumentation import ( + ClassManager, InstrumentationFactory, _default_state_getter, + _default_dict_getter, _default_manager_getter +) +from ..orm import attributes, collections, base as orm_base +from .. import util +from ..orm import exc as orm_exc +import weakref + +INSTRUMENTATION_MANAGER = '__sa_instrumentation_manager__' +"""Attribute, elects custom instrumentation when present on a mapped class. + +Allows a class to specify a slightly or wildly different technique for +tracking changes made to mapped attributes and collections. + +Only one instrumentation implementation is allowed in a given object +inheritance hierarchy. + +The value of this attribute must be a callable and will be passed a class +object. The callable must return one of: + + - An instance of an InstrumentationManager or subclass + - An object implementing all or some of InstrumentationManager (TODO) + - A dictionary of callables, implementing all or some of the above (TODO) + - An instance of a ClassManager or subclass + +This attribute is consulted by SQLAlchemy instrumentation +resolution, once the :mod:`sqlalchemy.ext.instrumentation` module +has been imported. If custom finders are installed in the global +instrumentation_finders list, they may or may not choose to honor this +attribute. + +""" + + +def find_native_user_instrumentation_hook(cls): + """Find user-specified instrumentation management for a class.""" + return getattr(cls, INSTRUMENTATION_MANAGER, None) + +instrumentation_finders = [find_native_user_instrumentation_hook] +"""An extensible sequence of callables which return instrumentation +implementations + +When a class is registered, each callable will be passed a class object. +If None is returned, the +next finder in the sequence is consulted. Otherwise the return must be an +instrumentation factory that follows the same guidelines as +sqlalchemy.ext.instrumentation.INSTRUMENTATION_MANAGER. + +By default, the only finder is find_native_user_instrumentation_hook, which +searches for INSTRUMENTATION_MANAGER. If all finders return None, standard +ClassManager instrumentation is used. + +""" + + +class ExtendedInstrumentationRegistry(InstrumentationFactory): + """Extends :class:`.InstrumentationFactory` with additional + bookkeeping, to accommodate multiple types of + class managers. + + """ + _manager_finders = weakref.WeakKeyDictionary() + _state_finders = weakref.WeakKeyDictionary() + _dict_finders = weakref.WeakKeyDictionary() + _extended = False + + def _locate_extended_factory(self, class_): + for finder in instrumentation_finders: + factory = finder(class_) + if factory is not None: + manager = self._extended_class_manager(class_, factory) + return manager, factory + else: + return None, None + + def _check_conflicts(self, class_, factory): + existing_factories = self._collect_management_factories_for(class_).\ + difference([factory]) + if existing_factories: + raise TypeError( + "multiple instrumentation implementations specified " + "in %s inheritance hierarchy: %r" % ( + class_.__name__, list(existing_factories))) + + def _extended_class_manager(self, class_, factory): + manager = factory(class_) + if not isinstance(manager, ClassManager): + manager = _ClassInstrumentationAdapter(class_, manager) + + if factory != ClassManager and not self._extended: + # somebody invoked a custom ClassManager. + # reinstall global "getter" functions with the more + # expensive ones. + self._extended = True + _install_instrumented_lookups() + + self._manager_finders[class_] = manager.manager_getter() + self._state_finders[class_] = manager.state_getter() + self._dict_finders[class_] = manager.dict_getter() + return manager + + def _collect_management_factories_for(self, cls): + """Return a collection of factories in play or specified for a + hierarchy. + + Traverses the entire inheritance graph of a cls and returns a + collection of instrumentation factories for those classes. Factories + are extracted from active ClassManagers, if available, otherwise + instrumentation_finders is consulted. + + """ + hierarchy = util.class_hierarchy(cls) + factories = set() + for member in hierarchy: + manager = self.manager_of_class(member) + if manager is not None: + factories.add(manager.factory) + else: + for finder in instrumentation_finders: + factory = finder(member) + if factory is not None: + break + else: + factory = None + factories.add(factory) + factories.discard(None) + return factories + + def unregister(self, class_): + if class_ in self._manager_finders: + del self._manager_finders[class_] + del self._state_finders[class_] + del self._dict_finders[class_] + super(ExtendedInstrumentationRegistry, self).unregister(class_) + + def manager_of_class(self, cls): + if cls is None: + return None + try: + finder = self._manager_finders.get(cls, _default_manager_getter) + except TypeError: + # due to weakref lookup on invalid object + return None + else: + return finder(cls) + + def state_of(self, instance): + if instance is None: + raise AttributeError("None has no persistent state.") + return self._state_finders.get( + instance.__class__, _default_state_getter)(instance) + + def dict_of(self, instance): + if instance is None: + raise AttributeError("None has no persistent state.") + return self._dict_finders.get( + instance.__class__, _default_dict_getter)(instance) + + +orm_instrumentation._instrumentation_factory = \ + _instrumentation_factory = ExtendedInstrumentationRegistry() +orm_instrumentation.instrumentation_finders = instrumentation_finders + + +class InstrumentationManager(object): + """User-defined class instrumentation extension. + + :class:`.InstrumentationManager` can be subclassed in order + to change + how class instrumentation proceeds. This class exists for + the purposes of integration with other object management + frameworks which would like to entirely modify the + instrumentation methodology of the ORM, and is not intended + for regular usage. For interception of class instrumentation + events, see :class:`.InstrumentationEvents`. + + The API for this class should be considered as semi-stable, + and may change slightly with new releases. + + .. versionchanged:: 0.8 + :class:`.InstrumentationManager` was moved from + :mod:`sqlalchemy.orm.instrumentation` to + :mod:`sqlalchemy.ext.instrumentation`. + + """ + + # r4361 added a mandatory (cls) constructor to this interface. + # given that, perhaps class_ should be dropped from all of these + # signatures. + + def __init__(self, class_): + pass + + def manage(self, class_, manager): + setattr(class_, '_default_class_manager', manager) + + def dispose(self, class_, manager): + delattr(class_, '_default_class_manager') + + def manager_getter(self, class_): + def get(cls): + return cls._default_class_manager + return get + + def instrument_attribute(self, class_, key, inst): + pass + + def post_configure_attribute(self, class_, key, inst): + pass + + def install_descriptor(self, class_, key, inst): + setattr(class_, key, inst) + + def uninstall_descriptor(self, class_, key): + delattr(class_, key) + + def install_member(self, class_, key, implementation): + setattr(class_, key, implementation) + + def uninstall_member(self, class_, key): + delattr(class_, key) + + def instrument_collection_class(self, class_, key, collection_class): + return collections.prepare_instrumentation(collection_class) + + def get_instance_dict(self, class_, instance): + return instance.__dict__ + + def initialize_instance_dict(self, class_, instance): + pass + + def install_state(self, class_, instance, state): + setattr(instance, '_default_state', state) + + def remove_state(self, class_, instance): + delattr(instance, '_default_state') + + def state_getter(self, class_): + return lambda instance: getattr(instance, '_default_state') + + def dict_getter(self, class_): + return lambda inst: self.get_instance_dict(class_, inst) + + +class _ClassInstrumentationAdapter(ClassManager): + """Adapts a user-defined InstrumentationManager to a ClassManager.""" + + def __init__(self, class_, override): + self._adapted = override + self._get_state = self._adapted.state_getter(class_) + self._get_dict = self._adapted.dict_getter(class_) + + ClassManager.__init__(self, class_) + + def manage(self): + self._adapted.manage(self.class_, self) + + def dispose(self): + self._adapted.dispose(self.class_) + + def manager_getter(self): + return self._adapted.manager_getter(self.class_) + + def instrument_attribute(self, key, inst, propagated=False): + ClassManager.instrument_attribute(self, key, inst, propagated) + if not propagated: + self._adapted.instrument_attribute(self.class_, key, inst) + + def post_configure_attribute(self, key): + super(_ClassInstrumentationAdapter, self).post_configure_attribute(key) + self._adapted.post_configure_attribute(self.class_, key, self[key]) + + def install_descriptor(self, key, inst): + self._adapted.install_descriptor(self.class_, key, inst) + + def uninstall_descriptor(self, key): + self._adapted.uninstall_descriptor(self.class_, key) + + def install_member(self, key, implementation): + self._adapted.install_member(self.class_, key, implementation) + + def uninstall_member(self, key): + self._adapted.uninstall_member(self.class_, key) + + def instrument_collection_class(self, key, collection_class): + return self._adapted.instrument_collection_class( + self.class_, key, collection_class) + + def initialize_collection(self, key, state, factory): + delegate = getattr(self._adapted, 'initialize_collection', None) + if delegate: + return delegate(key, state, factory) + else: + return ClassManager.initialize_collection(self, key, + state, factory) + + def new_instance(self, state=None): + instance = self.class_.__new__(self.class_) + self.setup_instance(instance, state) + return instance + + def _new_state_if_none(self, instance): + """Install a default InstanceState if none is present. + + A private convenience method used by the __init__ decorator. + """ + if self.has_state(instance): + return False + else: + return self.setup_instance(instance) + + def setup_instance(self, instance, state=None): + self._adapted.initialize_instance_dict(self.class_, instance) + + if state is None: + state = self._state_constructor(instance, self) + + # the given instance is assumed to have no state + self._adapted.install_state(self.class_, instance, state) + return state + + def teardown_instance(self, instance): + self._adapted.remove_state(self.class_, instance) + + def has_state(self, instance): + try: + self._get_state(instance) + except orm_exc.NO_STATE: + return False + else: + return True + + def state_getter(self): + return self._get_state + + def dict_getter(self): + return self._get_dict + + +def _install_instrumented_lookups(): + """Replace global class/object management functions + with ExtendedInstrumentationRegistry implementations, which + allow multiple types of class managers to be present, + at the cost of performance. + + This function is called only by ExtendedInstrumentationRegistry + and unit tests specific to this behavior. + + The _reinstall_default_lookups() function can be called + after this one to re-establish the default functions. + + """ + _install_lookups( + dict( + instance_state=_instrumentation_factory.state_of, + instance_dict=_instrumentation_factory.dict_of, + manager_of_class=_instrumentation_factory.manager_of_class + ) + ) + + +def _reinstall_default_lookups(): + """Restore simplified lookups.""" + _install_lookups( + dict( + instance_state=_default_state_getter, + instance_dict=_default_dict_getter, + manager_of_class=_default_manager_getter + ) + ) + _instrumentation_factory._extended = False + + +def _install_lookups(lookups): + global instance_state, instance_dict, manager_of_class + instance_state = lookups['instance_state'] + instance_dict = lookups['instance_dict'] + manager_of_class = lookups['manager_of_class'] + orm_base.instance_state = attributes.instance_state = \ + orm_instrumentation.instance_state = instance_state + orm_base.instance_dict = attributes.instance_dict = \ + orm_instrumentation.instance_dict = instance_dict + orm_base.manager_of_class = attributes.manager_of_class = \ + orm_instrumentation.manager_of_class = manager_of_class diff --git a/app/lib/sqlalchemy/ext/mutable.py b/app/lib/sqlalchemy/ext/mutable.py new file mode 100644 index 0000000..53a4971 --- /dev/null +++ b/app/lib/sqlalchemy/ext/mutable.py @@ -0,0 +1,904 @@ +# ext/mutable.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +r"""Provide support for tracking of in-place changes to scalar values, +which are propagated into ORM change events on owning parent objects. + +.. versionadded:: 0.7 :mod:`sqlalchemy.ext.mutable` replaces SQLAlchemy's + legacy approach to in-place mutations of scalar values; see + :ref:`07_migration_mutation_extension`. + +.. _mutable_scalars: + +Establishing Mutability on Scalar Column Values +=============================================== + +A typical example of a "mutable" structure is a Python dictionary. +Following the example introduced in :ref:`types_toplevel`, we +begin with a custom type that marshals Python dictionaries into +JSON strings before being persisted:: + + from sqlalchemy.types import TypeDecorator, VARCHAR + import json + + class JSONEncodedDict(TypeDecorator): + "Represents an immutable structure as a json-encoded string." + + impl = VARCHAR + + def process_bind_param(self, value, dialect): + if value is not None: + value = json.dumps(value) + return value + + def process_result_value(self, value, dialect): + if value is not None: + value = json.loads(value) + return value + +The usage of ``json`` is only for the purposes of example. The +:mod:`sqlalchemy.ext.mutable` extension can be used +with any type whose target Python type may be mutable, including +:class:`.PickleType`, :class:`.postgresql.ARRAY`, etc. + +When using the :mod:`sqlalchemy.ext.mutable` extension, the value itself +tracks all parents which reference it. Below, we illustrate a simple +version of the :class:`.MutableDict` dictionary object, which applies +the :class:`.Mutable` mixin to a plain Python dictionary:: + + from sqlalchemy.ext.mutable import Mutable + + class MutableDict(Mutable, dict): + @classmethod + def coerce(cls, key, value): + "Convert plain dictionaries to MutableDict." + + if not isinstance(value, MutableDict): + if isinstance(value, dict): + return MutableDict(value) + + # this call will raise ValueError + return Mutable.coerce(key, value) + else: + return value + + def __setitem__(self, key, value): + "Detect dictionary set events and emit change events." + + dict.__setitem__(self, key, value) + self.changed() + + def __delitem__(self, key): + "Detect dictionary del events and emit change events." + + dict.__delitem__(self, key) + self.changed() + +The above dictionary class takes the approach of subclassing the Python +built-in ``dict`` to produce a dict +subclass which routes all mutation events through ``__setitem__``. There are +variants on this approach, such as subclassing ``UserDict.UserDict`` or +``collections.MutableMapping``; the part that's important to this example is +that the :meth:`.Mutable.changed` method is called whenever an in-place +change to the datastructure takes place. + +We also redefine the :meth:`.Mutable.coerce` method which will be used to +convert any values that are not instances of ``MutableDict``, such +as the plain dictionaries returned by the ``json`` module, into the +appropriate type. Defining this method is optional; we could just as well +created our ``JSONEncodedDict`` such that it always returns an instance +of ``MutableDict``, and additionally ensured that all calling code +uses ``MutableDict`` explicitly. When :meth:`.Mutable.coerce` is not +overridden, any values applied to a parent object which are not instances +of the mutable type will raise a ``ValueError``. + +Our new ``MutableDict`` type offers a class method +:meth:`~.Mutable.as_mutable` which we can use within column metadata +to associate with types. This method grabs the given type object or +class and associates a listener that will detect all future mappings +of this type, applying event listening instrumentation to the mapped +attribute. Such as, with classical table metadata:: + + from sqlalchemy import Table, Column, Integer + + my_data = Table('my_data', metadata, + Column('id', Integer, primary_key=True), + Column('data', MutableDict.as_mutable(JSONEncodedDict)) + ) + +Above, :meth:`~.Mutable.as_mutable` returns an instance of ``JSONEncodedDict`` +(if the type object was not an instance already), which will intercept any +attributes which are mapped against this type. Below we establish a simple +mapping against the ``my_data`` table:: + + from sqlalchemy import mapper + + class MyDataClass(object): + pass + + # associates mutation listeners with MyDataClass.data + mapper(MyDataClass, my_data) + +The ``MyDataClass.data`` member will now be notified of in place changes +to its value. + +There's no difference in usage when using declarative:: + + from sqlalchemy.ext.declarative import declarative_base + + Base = declarative_base() + + class MyDataClass(Base): + __tablename__ = 'my_data' + id = Column(Integer, primary_key=True) + data = Column(MutableDict.as_mutable(JSONEncodedDict)) + +Any in-place changes to the ``MyDataClass.data`` member +will flag the attribute as "dirty" on the parent object:: + + >>> from sqlalchemy.orm import Session + + >>> sess = Session() + >>> m1 = MyDataClass(data={'value1':'foo'}) + >>> sess.add(m1) + >>> sess.commit() + + >>> m1.data['value1'] = 'bar' + >>> assert m1 in sess.dirty + True + +The ``MutableDict`` can be associated with all future instances +of ``JSONEncodedDict`` in one step, using +:meth:`~.Mutable.associate_with`. This is similar to +:meth:`~.Mutable.as_mutable` except it will intercept all occurrences +of ``MutableDict`` in all mappings unconditionally, without +the need to declare it individually:: + + MutableDict.associate_with(JSONEncodedDict) + + class MyDataClass(Base): + __tablename__ = 'my_data' + id = Column(Integer, primary_key=True) + data = Column(JSONEncodedDict) + + +Supporting Pickling +-------------------- + +The key to the :mod:`sqlalchemy.ext.mutable` extension relies upon the +placement of a ``weakref.WeakKeyDictionary`` upon the value object, which +stores a mapping of parent mapped objects keyed to the attribute name under +which they are associated with this value. ``WeakKeyDictionary`` objects are +not picklable, due to the fact that they contain weakrefs and function +callbacks. In our case, this is a good thing, since if this dictionary were +picklable, it could lead to an excessively large pickle size for our value +objects that are pickled by themselves outside of the context of the parent. +The developer responsibility here is only to provide a ``__getstate__`` method +that excludes the :meth:`~MutableBase._parents` collection from the pickle +stream:: + + class MyMutableType(Mutable): + def __getstate__(self): + d = self.__dict__.copy() + d.pop('_parents', None) + return d + +With our dictionary example, we need to return the contents of the dict itself +(and also restore them on __setstate__):: + + class MutableDict(Mutable, dict): + # .... + + def __getstate__(self): + return dict(self) + + def __setstate__(self, state): + self.update(state) + +In the case that our mutable value object is pickled as it is attached to one +or more parent objects that are also part of the pickle, the :class:`.Mutable` +mixin will re-establish the :attr:`.Mutable._parents` collection on each value +object as the owning parents themselves are unpickled. + +.. _mutable_composites: + +Establishing Mutability on Composites +===================================== + +Composites are a special ORM feature which allow a single scalar attribute to +be assigned an object value which represents information "composed" from one +or more columns from the underlying mapped table. The usual example is that of +a geometric "point", and is introduced in :ref:`mapper_composite`. + +.. versionchanged:: 0.7 + The internals of :func:`.orm.composite` have been + greatly simplified and in-place mutation detection is no longer enabled by + default; instead, the user-defined value must detect changes on its own and + propagate them to all owning parents. The :mod:`sqlalchemy.ext.mutable` + extension provides the helper class :class:`.MutableComposite`, which is a + slight variant on the :class:`.Mutable` class. + +As is the case with :class:`.Mutable`, the user-defined composite class +subclasses :class:`.MutableComposite` as a mixin, and detects and delivers +change events to its parents via the :meth:`.MutableComposite.changed` method. +In the case of a composite class, the detection is usually via the usage of +Python descriptors (i.e. ``@property``), or alternatively via the special +Python method ``__setattr__()``. Below we expand upon the ``Point`` class +introduced in :ref:`mapper_composite` to subclass :class:`.MutableComposite` +and to also route attribute set events via ``__setattr__`` to the +:meth:`.MutableComposite.changed` method:: + + from sqlalchemy.ext.mutable import MutableComposite + + class Point(MutableComposite): + def __init__(self, x, y): + self.x = x + self.y = y + + def __setattr__(self, key, value): + "Intercept set events" + + # set the attribute + object.__setattr__(self, key, value) + + # alert all parents to the change + self.changed() + + def __composite_values__(self): + return self.x, self.y + + def __eq__(self, other): + return isinstance(other, Point) and \ + other.x == self.x and \ + other.y == self.y + + def __ne__(self, other): + return not self.__eq__(other) + +The :class:`.MutableComposite` class uses a Python metaclass to automatically +establish listeners for any usage of :func:`.orm.composite` that specifies our +``Point`` type. Below, when ``Point`` is mapped to the ``Vertex`` class, +listeners are established which will route change events from ``Point`` +objects to each of the ``Vertex.start`` and ``Vertex.end`` attributes:: + + from sqlalchemy.orm import composite, mapper + from sqlalchemy import Table, Column + + vertices = Table('vertices', metadata, + Column('id', Integer, primary_key=True), + Column('x1', Integer), + Column('y1', Integer), + Column('x2', Integer), + Column('y2', Integer), + ) + + class Vertex(object): + pass + + mapper(Vertex, vertices, properties={ + 'start': composite(Point, vertices.c.x1, vertices.c.y1), + 'end': composite(Point, vertices.c.x2, vertices.c.y2) + }) + +Any in-place changes to the ``Vertex.start`` or ``Vertex.end`` members +will flag the attribute as "dirty" on the parent object:: + + >>> from sqlalchemy.orm import Session + + >>> sess = Session() + >>> v1 = Vertex(start=Point(3, 4), end=Point(12, 15)) + >>> sess.add(v1) + >>> sess.commit() + + >>> v1.end.x = 8 + >>> assert v1 in sess.dirty + True + +Coercing Mutable Composites +--------------------------- + +The :meth:`.MutableBase.coerce` method is also supported on composite types. +In the case of :class:`.MutableComposite`, the :meth:`.MutableBase.coerce` +method is only called for attribute set operations, not load operations. +Overriding the :meth:`.MutableBase.coerce` method is essentially equivalent +to using a :func:`.validates` validation routine for all attributes which +make use of the custom composite type:: + + class Point(MutableComposite): + # other Point methods + # ... + + def coerce(cls, key, value): + if isinstance(value, tuple): + value = Point(*value) + elif not isinstance(value, Point): + raise ValueError("tuple or Point expected") + return value + +.. versionadded:: 0.7.10,0.8.0b2 + Support for the :meth:`.MutableBase.coerce` method in conjunction with + objects of type :class:`.MutableComposite`. + +Supporting Pickling +-------------------- + +As is the case with :class:`.Mutable`, the :class:`.MutableComposite` helper +class uses a ``weakref.WeakKeyDictionary`` available via the +:meth:`MutableBase._parents` attribute which isn't picklable. If we need to +pickle instances of ``Point`` or its owning class ``Vertex``, we at least need +to define a ``__getstate__`` that doesn't include the ``_parents`` dictionary. +Below we define both a ``__getstate__`` and a ``__setstate__`` that package up +the minimal form of our ``Point`` class:: + + class Point(MutableComposite): + # ... + + def __getstate__(self): + return self.x, self.y + + def __setstate__(self, state): + self.x, self.y = state + +As with :class:`.Mutable`, the :class:`.MutableComposite` augments the +pickling process of the parent's object-relational state so that the +:meth:`MutableBase._parents` collection is restored to all ``Point`` objects. + +""" +from ..orm.attributes import flag_modified +from .. import event, types +from ..orm import mapper, object_mapper, Mapper +from ..util import memoized_property +from ..sql.base import SchemaEventTarget +import weakref + + +class MutableBase(object): + """Common base class to :class:`.Mutable` + and :class:`.MutableComposite`. + + """ + + @memoized_property + def _parents(self): + """Dictionary of parent object->attribute name on the parent. + + This attribute is a so-called "memoized" property. It initializes + itself with a new ``weakref.WeakKeyDictionary`` the first time + it is accessed, returning the same object upon subsequent access. + + """ + + return weakref.WeakKeyDictionary() + + @classmethod + def coerce(cls, key, value): + """Given a value, coerce it into the target type. + + Can be overridden by custom subclasses to coerce incoming + data into a particular type. + + By default, raises ``ValueError``. + + This method is called in different scenarios depending on if + the parent class is of type :class:`.Mutable` or of type + :class:`.MutableComposite`. In the case of the former, it is called + for both attribute-set operations as well as during ORM loading + operations. For the latter, it is only called during attribute-set + operations; the mechanics of the :func:`.composite` construct + handle coercion during load operations. + + + :param key: string name of the ORM-mapped attribute being set. + :param value: the incoming value. + :return: the method should return the coerced value, or raise + ``ValueError`` if the coercion cannot be completed. + + """ + if value is None: + return None + msg = "Attribute '%s' does not accept objects of type %s" + raise ValueError(msg % (key, type(value))) + + @classmethod + def _get_listen_keys(cls, attribute): + """Given a descriptor attribute, return a ``set()`` of the attribute + keys which indicate a change in the state of this attribute. + + This is normally just ``set([attribute.key])``, but can be overridden + to provide for additional keys. E.g. a :class:`.MutableComposite` + augments this set with the attribute keys associated with the columns + that comprise the composite value. + + This collection is consulted in the case of intercepting the + :meth:`.InstanceEvents.refresh` and + :meth:`.InstanceEvents.refresh_flush` events, which pass along a list + of attribute names that have been refreshed; the list is compared + against this set to determine if action needs to be taken. + + .. versionadded:: 1.0.5 + + """ + return set([attribute.key]) + + @classmethod + def _listen_on_attribute(cls, attribute, coerce, parent_cls): + """Establish this type as a mutation listener for the given + mapped descriptor. + + """ + key = attribute.key + if parent_cls is not attribute.class_: + return + + # rely on "propagate" here + parent_cls = attribute.class_ + + listen_keys = cls._get_listen_keys(attribute) + + def load(state, *args): + """Listen for objects loaded or refreshed. + + Wrap the target data member's value with + ``Mutable``. + + """ + val = state.dict.get(key, None) + if val is not None: + if coerce: + val = cls.coerce(key, val) + state.dict[key] = val + val._parents[state.obj()] = key + + def load_attrs(state, ctx, attrs): + if not attrs or listen_keys.intersection(attrs): + load(state) + + def set(target, value, oldvalue, initiator): + """Listen for set/replace events on the target + data member. + + Establish a weak reference to the parent object + on the incoming value, remove it for the one + outgoing. + + """ + if value is oldvalue: + return value + + if not isinstance(value, cls): + value = cls.coerce(key, value) + if value is not None: + value._parents[target.obj()] = key + if isinstance(oldvalue, cls): + oldvalue._parents.pop(target.obj(), None) + return value + + def pickle(state, state_dict): + val = state.dict.get(key, None) + if val is not None: + if 'ext.mutable.values' not in state_dict: + state_dict['ext.mutable.values'] = [] + state_dict['ext.mutable.values'].append(val) + + def unpickle(state, state_dict): + if 'ext.mutable.values' in state_dict: + for val in state_dict['ext.mutable.values']: + val._parents[state.obj()] = key + + event.listen(parent_cls, 'load', load, + raw=True, propagate=True) + event.listen(parent_cls, 'refresh', load_attrs, + raw=True, propagate=True) + event.listen(parent_cls, 'refresh_flush', load_attrs, + raw=True, propagate=True) + event.listen(attribute, 'set', set, + raw=True, retval=True, propagate=True) + event.listen(parent_cls, 'pickle', pickle, + raw=True, propagate=True) + event.listen(parent_cls, 'unpickle', unpickle, + raw=True, propagate=True) + + +class Mutable(MutableBase): + """Mixin that defines transparent propagation of change + events to a parent object. + + See the example in :ref:`mutable_scalars` for usage information. + + """ + + def changed(self): + """Subclasses should call this method whenever change events occur.""" + + for parent, key in self._parents.items(): + flag_modified(parent, key) + + @classmethod + def associate_with_attribute(cls, attribute): + """Establish this type as a mutation listener for the given + mapped descriptor. + + """ + cls._listen_on_attribute(attribute, True, attribute.class_) + + @classmethod + def associate_with(cls, sqltype): + """Associate this wrapper with all future mapped columns + of the given type. + + This is a convenience method that calls + ``associate_with_attribute`` automatically. + + .. warning:: + + The listeners established by this method are *global* + to all mappers, and are *not* garbage collected. Only use + :meth:`.associate_with` for types that are permanent to an + application, not with ad-hoc types else this will cause unbounded + growth in memory usage. + + """ + + def listen_for_type(mapper, class_): + for prop in mapper.column_attrs: + if isinstance(prop.columns[0].type, sqltype): + cls.associate_with_attribute(getattr(class_, prop.key)) + + event.listen(mapper, 'mapper_configured', listen_for_type) + + @classmethod + def as_mutable(cls, sqltype): + """Associate a SQL type with this mutable Python type. + + This establishes listeners that will detect ORM mappings against + the given type, adding mutation event trackers to those mappings. + + The type is returned, unconditionally as an instance, so that + :meth:`.as_mutable` can be used inline:: + + Table('mytable', metadata, + Column('id', Integer, primary_key=True), + Column('data', MyMutableType.as_mutable(PickleType)) + ) + + Note that the returned type is always an instance, even if a class + is given, and that only columns which are declared specifically with + that type instance receive additional instrumentation. + + To associate a particular mutable type with all occurrences of a + particular type, use the :meth:`.Mutable.associate_with` classmethod + of the particular :class:`.Mutable` subclass to establish a global + association. + + .. warning:: + + The listeners established by this method are *global* + to all mappers, and are *not* garbage collected. Only use + :meth:`.as_mutable` for types that are permanent to an application, + not with ad-hoc types else this will cause unbounded growth + in memory usage. + + """ + sqltype = types.to_instance(sqltype) + + # a SchemaType will be copied when the Column is copied, + # and we'll lose our ability to link that type back to the original. + # so track our original type w/ columns + if isinstance(sqltype, SchemaEventTarget): + @event.listens_for(sqltype, "before_parent_attach") + def _add_column_memo(sqltyp, parent): + parent.info['_ext_mutable_orig_type'] = sqltyp + schema_event_check = True + else: + schema_event_check = False + + def listen_for_type(mapper, class_): + for prop in mapper.column_attrs: + if ( + schema_event_check and + hasattr(prop.expression, 'info') and + prop.expression.info.get('_ext_mutable_orig_type') + is sqltype + ) or ( + prop.columns[0].type is sqltype + ): + cls.associate_with_attribute(getattr(class_, prop.key)) + + event.listen(mapper, 'mapper_configured', listen_for_type) + + return sqltype + + +class MutableComposite(MutableBase): + """Mixin that defines transparent propagation of change + events on a SQLAlchemy "composite" object to its + owning parent or parents. + + See the example in :ref:`mutable_composites` for usage information. + + """ + + @classmethod + def _get_listen_keys(cls, attribute): + return set([attribute.key]).union(attribute.property._attribute_keys) + + def changed(self): + """Subclasses should call this method whenever change events occur.""" + + for parent, key in self._parents.items(): + + prop = object_mapper(parent).get_property(key) + for value, attr_name in zip( + self.__composite_values__(), + prop._attribute_keys): + setattr(parent, attr_name, value) + + +def _setup_composite_listener(): + def _listen_for_type(mapper, class_): + for prop in mapper.iterate_properties: + if (hasattr(prop, 'composite_class') and + isinstance(prop.composite_class, type) and + issubclass(prop.composite_class, MutableComposite)): + prop.composite_class._listen_on_attribute( + getattr(class_, prop.key), False, class_) + if not event.contains(Mapper, "mapper_configured", _listen_for_type): + event.listen(Mapper, 'mapper_configured', _listen_for_type) +_setup_composite_listener() + + +class MutableDict(Mutable, dict): + """A dictionary type that implements :class:`.Mutable`. + + The :class:`.MutableDict` object implements a dictionary that will + emit change events to the underlying mapping when the contents of + the dictionary are altered, including when values are added or removed. + + Note that :class:`.MutableDict` does **not** apply mutable tracking to the + *values themselves* inside the dictionary. Therefore it is not a sufficient + solution for the use case of tracking deep changes to a *recursive* + dictionary structure, such as a JSON structure. To support this use case, + build a subclass of :class:`.MutableDict` that provides appropriate + coersion to the values placed in the dictionary so that they too are + "mutable", and emit events up to their parent structure. + + .. versionadded:: 0.8 + + .. seealso:: + + :class:`.MutableList` + + :class:`.MutableSet` + + """ + + def __setitem__(self, key, value): + """Detect dictionary set events and emit change events.""" + dict.__setitem__(self, key, value) + self.changed() + + def setdefault(self, key, value): + result = dict.setdefault(self, key, value) + self.changed() + return result + + def __delitem__(self, key): + """Detect dictionary del events and emit change events.""" + dict.__delitem__(self, key) + self.changed() + + def update(self, *a, **kw): + dict.update(self, *a, **kw) + self.changed() + + def pop(self, *arg): + result = dict.pop(self, *arg) + self.changed() + return result + + def popitem(self): + result = dict.popitem(self) + self.changed() + return result + + def clear(self): + dict.clear(self) + self.changed() + + @classmethod + def coerce(cls, key, value): + """Convert plain dictionary to instance of this class.""" + if not isinstance(value, cls): + if isinstance(value, dict): + return cls(value) + return Mutable.coerce(key, value) + else: + return value + + def __getstate__(self): + return dict(self) + + def __setstate__(self, state): + self.update(state) + + +class MutableList(Mutable, list): + """A list type that implements :class:`.Mutable`. + + The :class:`.MutableList` object implements a list that will + emit change events to the underlying mapping when the contents of + the list are altered, including when values are added or removed. + + Note that :class:`.MutableList` does **not** apply mutable tracking to the + *values themselves* inside the list. Therefore it is not a sufficient + solution for the use case of tracking deep changes to a *recursive* + mutable structure, such as a JSON structure. To support this use case, + build a subclass of :class:`.MutableList` that provides appropriate + coersion to the values placed in the dictionary so that they too are + "mutable", and emit events up to their parent structure. + + .. versionadded:: 1.1 + + .. seealso:: + + :class:`.MutableDict` + + :class:`.MutableSet` + + """ + + def __setitem__(self, index, value): + """Detect list set events and emit change events.""" + list.__setitem__(self, index, value) + self.changed() + + def __setslice__(self, start, end, value): + """Detect list set events and emit change events.""" + list.__setslice__(self, start, end, value) + self.changed() + + def __delitem__(self, index): + """Detect list del events and emit change events.""" + list.__delitem__(self, index) + self.changed() + + def __delslice__(self, start, end): + """Detect list del events and emit change events.""" + list.__delslice__(self, start, end) + self.changed() + + def pop(self, *arg): + result = list.pop(self, *arg) + self.changed() + return result + + def append(self, x): + list.append(self, x) + self.changed() + + def extend(self, x): + list.extend(self, x) + self.changed() + + def insert(self, i, x): + list.insert(self, i, x) + self.changed() + + def remove(self, i): + list.remove(self, i) + self.changed() + + def clear(self): + list.clear(self) + self.changed() + + def sort(self): + list.sort(self) + self.changed() + + def reverse(self): + list.reverse(self) + self.changed() + + @classmethod + def coerce(cls, index, value): + """Convert plain list to instance of this class.""" + if not isinstance(value, cls): + if isinstance(value, list): + return cls(value) + return Mutable.coerce(index, value) + else: + return value + + def __getstate__(self): + return list(self) + + def __setstate__(self, state): + self[:] = state + + +class MutableSet(Mutable, set): + """A set type that implements :class:`.Mutable`. + + The :class:`.MutableSet` object implements a set that will + emit change events to the underlying mapping when the contents of + the set are altered, including when values are added or removed. + + Note that :class:`.MutableSet` does **not** apply mutable tracking to the + *values themselves* inside the set. Therefore it is not a sufficient + solution for the use case of tracking deep changes to a *recursive* + mutable structure. To support this use case, + build a subclass of :class:`.MutableSet` that provides appropriate + coersion to the values placed in the dictionary so that they too are + "mutable", and emit events up to their parent structure. + + .. versionadded:: 1.1 + + .. seealso:: + + :class:`.MutableDict` + + :class:`.MutableList` + + + """ + + def update(self, *arg): + set.update(self, *arg) + self.changed() + + def intersection_update(self, *arg): + set.intersection_update(self, *arg) + self.changed() + + def difference_update(self, *arg): + set.difference_update(self, *arg) + self.changed() + + def symmetric_difference_update(self, *arg): + set.symmetric_difference_update(self, *arg) + self.changed() + + def add(self, elem): + set.add(self, elem) + self.changed() + + def remove(self, elem): + set.remove(self, elem) + self.changed() + + def discard(self, elem): + set.discard(self, elem) + self.changed() + + def pop(self, *arg): + result = set.pop(self, *arg) + self.changed() + return result + + def clear(self): + set.clear(self) + self.changed() + + @classmethod + def coerce(cls, index, value): + """Convert plain set to instance of this class.""" + if not isinstance(value, cls): + if isinstance(value, set): + return cls(value) + return Mutable.coerce(index, value) + else: + return value + + def __getstate__(self): + return set(self) + + def __setstate__(self, state): + self.update(state) + + def __reduce_ex__(self, proto): + return (self.__class__, (list(self), )) diff --git a/app/lib/sqlalchemy/ext/orderinglist.py b/app/lib/sqlalchemy/ext/orderinglist.py new file mode 100644 index 0000000..6b22aa6 --- /dev/null +++ b/app/lib/sqlalchemy/ext/orderinglist.py @@ -0,0 +1,380 @@ +# ext/orderinglist.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""A custom list that manages index/position information for contained +elements. + +:author: Jason Kirtland + +``orderinglist`` is a helper for mutable ordered relationships. It will +intercept list operations performed on a :func:`.relationship`-managed +collection and +automatically synchronize changes in list position onto a target scalar +attribute. + +Example: A ``slide`` table, where each row refers to zero or more entries +in a related ``bullet`` table. The bullets within a slide are +displayed in order based on the value of the ``position`` column in the +``bullet`` table. As entries are reordered in memory, the value of the +``position`` attribute should be updated to reflect the new sort order:: + + + Base = declarative_base() + + class Slide(Base): + __tablename__ = 'slide' + + id = Column(Integer, primary_key=True) + name = Column(String) + + bullets = relationship("Bullet", order_by="Bullet.position") + + class Bullet(Base): + __tablename__ = 'bullet' + id = Column(Integer, primary_key=True) + slide_id = Column(Integer, ForeignKey('slide.id')) + position = Column(Integer) + text = Column(String) + +The standard relationship mapping will produce a list-like attribute on each +``Slide`` containing all related ``Bullet`` objects, +but coping with changes in ordering is not handled automatically. +When appending a ``Bullet`` into ``Slide.bullets``, the ``Bullet.position`` +attribute will remain unset until manually assigned. When the ``Bullet`` +is inserted into the middle of the list, the following ``Bullet`` objects +will also need to be renumbered. + +The :class:`.OrderingList` object automates this task, managing the +``position`` attribute on all ``Bullet`` objects in the collection. It is +constructed using the :func:`.ordering_list` factory:: + + from sqlalchemy.ext.orderinglist import ordering_list + + Base = declarative_base() + + class Slide(Base): + __tablename__ = 'slide' + + id = Column(Integer, primary_key=True) + name = Column(String) + + bullets = relationship("Bullet", order_by="Bullet.position", + collection_class=ordering_list('position')) + + class Bullet(Base): + __tablename__ = 'bullet' + id = Column(Integer, primary_key=True) + slide_id = Column(Integer, ForeignKey('slide.id')) + position = Column(Integer) + text = Column(String) + +With the above mapping the ``Bullet.position`` attribute is managed:: + + s = Slide() + s.bullets.append(Bullet()) + s.bullets.append(Bullet()) + s.bullets[1].position + >>> 1 + s.bullets.insert(1, Bullet()) + s.bullets[2].position + >>> 2 + +The :class:`.OrderingList` construct only works with **changes** to a +collection, and not the initial load from the database, and requires that the +list be sorted when loaded. Therefore, be sure to specify ``order_by`` on the +:func:`.relationship` against the target ordering attribute, so that the +ordering is correct when first loaded. + +.. warning:: + + :class:`.OrderingList` only provides limited functionality when a primary + key column or unique column is the target of the sort. Operations + that are unsupported or are problematic include: + + * two entries must trade values. This is not supported directly in the + case of a primary key or unique constraint because it means at least + one row would need to be temporarily removed first, or changed to + a third, neutral value while the switch occurs. + + * an entry must be deleted in order to make room for a new entry. + SQLAlchemy's unit of work performs all INSERTs before DELETEs within a + single flush. In the case of a primary key, it will trade + an INSERT/DELETE of the same primary key for an UPDATE statement in order + to lessen the impact of this limitation, however this does not take place + for a UNIQUE column. + A future feature will allow the "DELETE before INSERT" behavior to be + possible, allevating this limitation, though this feature will require + explicit configuration at the mapper level for sets of columns that + are to be handled in this way. + +:func:`.ordering_list` takes the name of the related object's ordering +attribute as an argument. By default, the zero-based integer index of the +object's position in the :func:`.ordering_list` is synchronized with the +ordering attribute: index 0 will get position 0, index 1 position 1, etc. To +start numbering at 1 or some other integer, provide ``count_from=1``. + + +""" +from ..orm.collections import collection, collection_adapter +from .. import util + +__all__ = ['ordering_list'] + + +def ordering_list(attr, count_from=None, **kw): + """Prepares an :class:`OrderingList` factory for use in mapper definitions. + + Returns an object suitable for use as an argument to a Mapper + relationship's ``collection_class`` option. e.g.:: + + from sqlalchemy.ext.orderinglist import ordering_list + + class Slide(Base): + __tablename__ = 'slide' + + id = Column(Integer, primary_key=True) + name = Column(String) + + bullets = relationship("Bullet", order_by="Bullet.position", + collection_class=ordering_list('position')) + + :param attr: + Name of the mapped attribute to use for storage and retrieval of + ordering information + + :param count_from: + Set up an integer-based ordering, starting at ``count_from``. For + example, ``ordering_list('pos', count_from=1)`` would create a 1-based + list in SQL, storing the value in the 'pos' column. Ignored if + ``ordering_func`` is supplied. + + Additional arguments are passed to the :class:`.OrderingList` constructor. + + """ + + kw = _unsugar_count_from(count_from=count_from, **kw) + return lambda: OrderingList(attr, **kw) + + +# Ordering utility functions + + +def count_from_0(index, collection): + """Numbering function: consecutive integers starting at 0.""" + + return index + + +def count_from_1(index, collection): + """Numbering function: consecutive integers starting at 1.""" + + return index + 1 + + +def count_from_n_factory(start): + """Numbering function: consecutive integers starting at arbitrary start.""" + + def f(index, collection): + return index + start + try: + f.__name__ = 'count_from_%i' % start + except TypeError: + pass + return f + + +def _unsugar_count_from(**kw): + """Builds counting functions from keyword arguments. + + Keyword argument filter, prepares a simple ``ordering_func`` from a + ``count_from`` argument, otherwise passes ``ordering_func`` on unchanged. + """ + + count_from = kw.pop('count_from', None) + if kw.get('ordering_func', None) is None and count_from is not None: + if count_from == 0: + kw['ordering_func'] = count_from_0 + elif count_from == 1: + kw['ordering_func'] = count_from_1 + else: + kw['ordering_func'] = count_from_n_factory(count_from) + return kw + + +class OrderingList(list): + """A custom list that manages position information for its children. + + The :class:`.OrderingList` object is normally set up using the + :func:`.ordering_list` factory function, used in conjunction with + the :func:`.relationship` function. + + """ + + def __init__(self, ordering_attr=None, ordering_func=None, + reorder_on_append=False): + """A custom list that manages position information for its children. + + ``OrderingList`` is a ``collection_class`` list implementation that + syncs position in a Python list with a position attribute on the + mapped objects. + + This implementation relies on the list starting in the proper order, + so be **sure** to put an ``order_by`` on your relationship. + + :param ordering_attr: + Name of the attribute that stores the object's order in the + relationship. + + :param ordering_func: Optional. A function that maps the position in + the Python list to a value to store in the + ``ordering_attr``. Values returned are usually (but need not be!) + integers. + + An ``ordering_func`` is called with two positional parameters: the + index of the element in the list, and the list itself. + + If omitted, Python list indexes are used for the attribute values. + Two basic pre-built numbering functions are provided in this module: + ``count_from_0`` and ``count_from_1``. For more exotic examples + like stepped numbering, alphabetical and Fibonacci numbering, see + the unit tests. + + :param reorder_on_append: + Default False. When appending an object with an existing (non-None) + ordering value, that value will be left untouched unless + ``reorder_on_append`` is true. This is an optimization to avoid a + variety of dangerous unexpected database writes. + + SQLAlchemy will add instances to the list via append() when your + object loads. If for some reason the result set from the database + skips a step in the ordering (say, row '1' is missing but you get + '2', '3', and '4'), reorder_on_append=True would immediately + renumber the items to '1', '2', '3'. If you have multiple sessions + making changes, any of whom happen to load this collection even in + passing, all of the sessions would try to "clean up" the numbering + in their commits, possibly causing all but one to fail with a + concurrent modification error. + + Recommend leaving this with the default of False, and just call + ``reorder()`` if you're doing ``append()`` operations with + previously ordered instances or when doing some housekeeping after + manual sql operations. + + """ + self.ordering_attr = ordering_attr + if ordering_func is None: + ordering_func = count_from_0 + self.ordering_func = ordering_func + self.reorder_on_append = reorder_on_append + + # More complex serialization schemes (multi column, e.g.) are possible by + # subclassing and reimplementing these two methods. + def _get_order_value(self, entity): + return getattr(entity, self.ordering_attr) + + def _set_order_value(self, entity, value): + setattr(entity, self.ordering_attr, value) + + def reorder(self): + """Synchronize ordering for the entire collection. + + Sweeps through the list and ensures that each object has accurate + ordering information set. + + """ + for index, entity in enumerate(self): + self._order_entity(index, entity, True) + + # As of 0.5, _reorder is no longer semi-private + _reorder = reorder + + def _order_entity(self, index, entity, reorder=True): + have = self._get_order_value(entity) + + # Don't disturb existing ordering if reorder is False + if have is not None and not reorder: + return + + should_be = self.ordering_func(index, self) + if have != should_be: + self._set_order_value(entity, should_be) + + def append(self, entity): + super(OrderingList, self).append(entity) + self._order_entity(len(self) - 1, entity, self.reorder_on_append) + + def _raw_append(self, entity): + """Append without any ordering behavior.""" + + super(OrderingList, self).append(entity) + _raw_append = collection.adds(1)(_raw_append) + + def insert(self, index, entity): + super(OrderingList, self).insert(index, entity) + self._reorder() + + def remove(self, entity): + super(OrderingList, self).remove(entity) + + adapter = collection_adapter(self) + if adapter and adapter._referenced_by_owner: + self._reorder() + + def pop(self, index=-1): + entity = super(OrderingList, self).pop(index) + self._reorder() + return entity + + def __setitem__(self, index, entity): + if isinstance(index, slice): + step = index.step or 1 + start = index.start or 0 + if start < 0: + start += len(self) + stop = index.stop or len(self) + if stop < 0: + stop += len(self) + + for i in range(start, stop, step): + self.__setitem__(i, entity[i]) + else: + self._order_entity(index, entity, True) + super(OrderingList, self).__setitem__(index, entity) + + def __delitem__(self, index): + super(OrderingList, self).__delitem__(index) + self._reorder() + + def __setslice__(self, start, end, values): + super(OrderingList, self).__setslice__(start, end, values) + self._reorder() + + def __delslice__(self, start, end): + super(OrderingList, self).__delslice__(start, end) + self._reorder() + + def __reduce__(self): + return _reconstitute, (self.__class__, self.__dict__, list(self)) + + for func_name, func in list(locals().items()): + if (util.callable(func) and func.__name__ == func_name and + not func.__doc__ and hasattr(list, func_name)): + func.__doc__ = getattr(list, func_name).__doc__ + del func_name, func + + +def _reconstitute(cls, dict_, items): + """ Reconstitute an :class:`.OrderingList`. + + This is the adjoint to :meth:`.OrderingList.__reduce__`. It is used for + unpickling :class:`.OrderingList` objects. + + """ + obj = cls.__new__(cls) + obj.__dict__.update(dict_) + list.extend(obj, items) + return obj diff --git a/app/lib/sqlalchemy/ext/serializer.py b/app/lib/sqlalchemy/ext/serializer.py new file mode 100644 index 0000000..2fbc62e --- /dev/null +++ b/app/lib/sqlalchemy/ext/serializer.py @@ -0,0 +1,159 @@ +# ext/serializer.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Serializer/Deserializer objects for usage with SQLAlchemy query structures, +allowing "contextual" deserialization. + +Any SQLAlchemy query structure, either based on sqlalchemy.sql.* +or sqlalchemy.orm.* can be used. The mappers, Tables, Columns, Session +etc. which are referenced by the structure are not persisted in serialized +form, but are instead re-associated with the query structure +when it is deserialized. + +Usage is nearly the same as that of the standard Python pickle module:: + + from sqlalchemy.ext.serializer import loads, dumps + metadata = MetaData(bind=some_engine) + Session = scoped_session(sessionmaker()) + + # ... define mappers + + query = Session.query(MyClass). + filter(MyClass.somedata=='foo').order_by(MyClass.sortkey) + + # pickle the query + serialized = dumps(query) + + # unpickle. Pass in metadata + scoped_session + query2 = loads(serialized, metadata, Session) + + print query2.all() + +Similar restrictions as when using raw pickle apply; mapped classes must be +themselves be pickleable, meaning they are importable from a module-level +namespace. + +The serializer module is only appropriate for query structures. It is not +needed for: + +* instances of user-defined classes. These contain no references to engines, + sessions or expression constructs in the typical case and can be serialized + directly. + +* Table metadata that is to be loaded entirely from the serialized structure + (i.e. is not already declared in the application). Regular + pickle.loads()/dumps() can be used to fully dump any ``MetaData`` object, + typically one which was reflected from an existing database at some previous + point in time. The serializer module is specifically for the opposite case, + where the Table metadata is already present in memory. + +""" + +from ..orm import class_mapper +from ..orm.session import Session +from ..orm.mapper import Mapper +from ..orm.interfaces import MapperProperty +from ..orm.attributes import QueryableAttribute +from .. import Table, Column +from ..engine import Engine +from ..util import pickle, byte_buffer, b64encode, b64decode, text_type +import re + + +__all__ = ['Serializer', 'Deserializer', 'dumps', 'loads'] + + +def Serializer(*args, **kw): + pickler = pickle.Pickler(*args, **kw) + + def persistent_id(obj): + # print "serializing:", repr(obj) + if isinstance(obj, QueryableAttribute): + cls = obj.impl.class_ + key = obj.impl.key + id = "attribute:" + key + ":" + b64encode(pickle.dumps(cls)) + elif isinstance(obj, Mapper) and not obj.non_primary: + id = "mapper:" + b64encode(pickle.dumps(obj.class_)) + elif isinstance(obj, MapperProperty) and not obj.parent.non_primary: + id = "mapperprop:" + b64encode(pickle.dumps(obj.parent.class_)) + \ + ":" + obj.key + elif isinstance(obj, Table): + id = "table:" + text_type(obj.key) + elif isinstance(obj, Column) and isinstance(obj.table, Table): + id = "column:" + \ + text_type(obj.table.key) + ":" + text_type(obj.key) + elif isinstance(obj, Session): + id = "session:" + elif isinstance(obj, Engine): + id = "engine:" + else: + return None + return id + + pickler.persistent_id = persistent_id + return pickler + +our_ids = re.compile( + r'(mapperprop|mapper|table|column|session|attribute|engine):(.*)') + + +def Deserializer(file, metadata=None, scoped_session=None, engine=None): + unpickler = pickle.Unpickler(file) + + def get_engine(): + if engine: + return engine + elif scoped_session and scoped_session().bind: + return scoped_session().bind + elif metadata and metadata.bind: + return metadata.bind + else: + return None + + def persistent_load(id): + m = our_ids.match(text_type(id)) + if not m: + return None + else: + type_, args = m.group(1, 2) + if type_ == 'attribute': + key, clsarg = args.split(":") + cls = pickle.loads(b64decode(clsarg)) + return getattr(cls, key) + elif type_ == "mapper": + cls = pickle.loads(b64decode(args)) + return class_mapper(cls) + elif type_ == "mapperprop": + mapper, keyname = args.split(':') + cls = pickle.loads(b64decode(mapper)) + return class_mapper(cls).attrs[keyname] + elif type_ == "table": + return metadata.tables[args] + elif type_ == "column": + table, colname = args.split(':') + return metadata.tables[table].c[colname] + elif type_ == "session": + return scoped_session() + elif type_ == "engine": + return get_engine() + else: + raise Exception("Unknown token: %s" % type_) + unpickler.persistent_load = persistent_load + return unpickler + + +def dumps(obj, protocol=0): + buf = byte_buffer() + pickler = Serializer(buf, protocol) + pickler.dump(obj) + return buf.getvalue() + + +def loads(data, metadata=None, scoped_session=None, engine=None): + buf = byte_buffer(data) + unpickler = Deserializer(buf, metadata, scoped_session, engine) + return unpickler.load() diff --git a/app/lib/sqlalchemy/inspection.py b/app/lib/sqlalchemy/inspection.py new file mode 100644 index 0000000..4f6a5a0 --- /dev/null +++ b/app/lib/sqlalchemy/inspection.py @@ -0,0 +1,93 @@ +# sqlalchemy/inspect.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""The inspection module provides the :func:`.inspect` function, +which delivers runtime information about a wide variety +of SQLAlchemy objects, both within the Core as well as the +ORM. + +The :func:`.inspect` function is the entry point to SQLAlchemy's +public API for viewing the configuration and construction +of in-memory objects. Depending on the type of object +passed to :func:`.inspect`, the return value will either be +a related object which provides a known interface, or in many +cases it will return the object itself. + +The rationale for :func:`.inspect` is twofold. One is that +it replaces the need to be aware of a large variety of "information +getting" functions in SQLAlchemy, such as :meth:`.Inspector.from_engine`, +:func:`.orm.attributes.instance_state`, :func:`.orm.class_mapper`, +and others. The other is that the return value of :func:`.inspect` +is guaranteed to obey a documented API, thus allowing third party +tools which build on top of SQLAlchemy configurations to be constructed +in a forwards-compatible way. + +.. versionadded:: 0.8 The :func:`.inspect` system is introduced + as of version 0.8. + +""" + +from . import util, exc +_registrars = util.defaultdict(list) + + +def inspect(subject, raiseerr=True): + """Produce an inspection object for the given target. + + The returned value in some cases may be the + same object as the one given, such as if a + :class:`.Mapper` object is passed. In other + cases, it will be an instance of the registered + inspection type for the given object, such as + if an :class:`.engine.Engine` is passed, an + :class:`.Inspector` object is returned. + + :param subject: the subject to be inspected. + :param raiseerr: When ``True``, if the given subject + does not + correspond to a known SQLAlchemy inspected type, + :class:`sqlalchemy.exc.NoInspectionAvailable` + is raised. If ``False``, ``None`` is returned. + + """ + type_ = type(subject) + for cls in type_.__mro__: + if cls in _registrars: + reg = _registrars[cls] + if reg is True: + return subject + ret = reg(subject) + if ret is not None: + break + else: + reg = ret = None + + if raiseerr and ( + reg is None or ret is None + ): + raise exc.NoInspectionAvailable( + "No inspection system is " + "available for object of type %s" % + type_) + return ret + + +def _inspects(*types): + def decorate(fn_or_cls): + for type_ in types: + if type_ in _registrars: + raise AssertionError( + "Type %s is already " + "registered" % type_) + _registrars[type_] = fn_or_cls + return fn_or_cls + return decorate + + +def _self_inspects(cls): + _inspects(cls)(True) + return cls diff --git a/app/lib/sqlalchemy/interfaces.py b/app/lib/sqlalchemy/interfaces.py new file mode 100644 index 0000000..33f3cf1 --- /dev/null +++ b/app/lib/sqlalchemy/interfaces.py @@ -0,0 +1,312 @@ +# sqlalchemy/interfaces.py +# Copyright (C) 2007-2017 the SQLAlchemy authors and contributors +# +# Copyright (C) 2007 Jason Kirtland jek@discorporate.us +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Deprecated core event interfaces. + +This module is **deprecated** and is superseded by the +event system. + +""" + +from . import event, util + + +class PoolListener(object): + """Hooks into the lifecycle of connections in a :class:`.Pool`. + + .. note:: + + :class:`.PoolListener` is deprecated. Please + refer to :class:`.PoolEvents`. + + Usage:: + + class MyListener(PoolListener): + def connect(self, dbapi_con, con_record): + '''perform connect operations''' + # etc. + + # create a new pool with a listener + p = QueuePool(..., listeners=[MyListener()]) + + # add a listener after the fact + p.add_listener(MyListener()) + + # usage with create_engine() + e = create_engine("url://", listeners=[MyListener()]) + + All of the standard connection :class:`~sqlalchemy.pool.Pool` types can + accept event listeners for key connection lifecycle events: + creation, pool check-out and check-in. There are no events fired + when a connection closes. + + For any given DB-API connection, there will be one ``connect`` + event, `n` number of ``checkout`` events, and either `n` or `n - 1` + ``checkin`` events. (If a ``Connection`` is detached from its + pool via the ``detach()`` method, it won't be checked back in.) + + These are low-level events for low-level objects: raw Python + DB-API connections, without the conveniences of the SQLAlchemy + ``Connection`` wrapper, ``Dialect`` services or ``ClauseElement`` + execution. If you execute SQL through the connection, explicitly + closing all cursors and other resources is recommended. + + Events also receive a ``_ConnectionRecord``, a long-lived internal + ``Pool`` object that basically represents a "slot" in the + connection pool. ``_ConnectionRecord`` objects have one public + attribute of note: ``info``, a dictionary whose contents are + scoped to the lifetime of the DB-API connection managed by the + record. You can use this shared storage area however you like. + + There is no need to subclass ``PoolListener`` to handle events. + Any class that implements one or more of these methods can be used + as a pool listener. The ``Pool`` will inspect the methods + provided by a listener object and add the listener to one or more + internal event queues based on its capabilities. In terms of + efficiency and function call overhead, you're much better off only + providing implementations for the hooks you'll be using. + + """ + + @classmethod + def _adapt_listener(cls, self, listener): + """Adapt a :class:`.PoolListener` to individual + :class:`event.Dispatch` events. + + """ + + listener = util.as_interface(listener, + methods=('connect', 'first_connect', + 'checkout', 'checkin')) + if hasattr(listener, 'connect'): + event.listen(self, 'connect', listener.connect) + if hasattr(listener, 'first_connect'): + event.listen(self, 'first_connect', listener.first_connect) + if hasattr(listener, 'checkout'): + event.listen(self, 'checkout', listener.checkout) + if hasattr(listener, 'checkin'): + event.listen(self, 'checkin', listener.checkin) + + def connect(self, dbapi_con, con_record): + """Called once for each new DB-API connection or Pool's ``creator()``. + + dbapi_con + A newly connected raw DB-API connection (not a SQLAlchemy + ``Connection`` wrapper). + + con_record + The ``_ConnectionRecord`` that persistently manages the connection + + """ + + def first_connect(self, dbapi_con, con_record): + """Called exactly once for the first DB-API connection. + + dbapi_con + A newly connected raw DB-API connection (not a SQLAlchemy + ``Connection`` wrapper). + + con_record + The ``_ConnectionRecord`` that persistently manages the connection + + """ + + def checkout(self, dbapi_con, con_record, con_proxy): + """Called when a connection is retrieved from the Pool. + + dbapi_con + A raw DB-API connection + + con_record + The ``_ConnectionRecord`` that persistently manages the connection + + con_proxy + The ``_ConnectionFairy`` which manages the connection for the span of + the current checkout. + + If you raise an ``exc.DisconnectionError``, the current + connection will be disposed and a fresh connection retrieved. + Processing of all checkout listeners will abort and restart + using the new connection. + """ + + def checkin(self, dbapi_con, con_record): + """Called when a connection returns to the pool. + + Note that the connection may be closed, and may be None if the + connection has been invalidated. ``checkin`` will not be called + for detached connections. (They do not return to the pool.) + + dbapi_con + A raw DB-API connection + + con_record + The ``_ConnectionRecord`` that persistently manages the connection + + """ + + +class ConnectionProxy(object): + """Allows interception of statement execution by Connections. + + .. note:: + + :class:`.ConnectionProxy` is deprecated. Please + refer to :class:`.ConnectionEvents`. + + Either or both of the ``execute()`` and ``cursor_execute()`` + may be implemented to intercept compiled statement and + cursor level executions, e.g.:: + + class MyProxy(ConnectionProxy): + def execute(self, conn, execute, clauseelement, + *multiparams, **params): + print "compiled statement:", clauseelement + return execute(clauseelement, *multiparams, **params) + + def cursor_execute(self, execute, cursor, statement, + parameters, context, executemany): + print "raw statement:", statement + return execute(cursor, statement, parameters, context) + + The ``execute`` argument is a function that will fulfill the default + execution behavior for the operation. The signature illustrated + in the example should be used. + + The proxy is installed into an :class:`~sqlalchemy.engine.Engine` via + the ``proxy`` argument:: + + e = create_engine('someurl://', proxy=MyProxy()) + + """ + + @classmethod + def _adapt_listener(cls, self, listener): + + def adapt_execute(conn, clauseelement, multiparams, params): + + def execute_wrapper(clauseelement, *multiparams, **params): + return clauseelement, multiparams, params + + return listener.execute(conn, execute_wrapper, + clauseelement, *multiparams, + **params) + + event.listen(self, 'before_execute', adapt_execute) + + def adapt_cursor_execute(conn, cursor, statement, + parameters, context, executemany): + + def execute_wrapper( + cursor, + statement, + parameters, + context, + ): + return statement, parameters + + return listener.cursor_execute( + execute_wrapper, + cursor, + statement, + parameters, + context, + executemany, + ) + + event.listen(self, 'before_cursor_execute', adapt_cursor_execute) + + def do_nothing_callback(*arg, **kw): + pass + + def adapt_listener(fn): + + def go(conn, *arg, **kw): + fn(conn, do_nothing_callback, *arg, **kw) + + return util.update_wrapper(go, fn) + + event.listen(self, 'begin', adapt_listener(listener.begin)) + event.listen(self, 'rollback', + adapt_listener(listener.rollback)) + event.listen(self, 'commit', adapt_listener(listener.commit)) + event.listen(self, 'savepoint', + adapt_listener(listener.savepoint)) + event.listen(self, 'rollback_savepoint', + adapt_listener(listener.rollback_savepoint)) + event.listen(self, 'release_savepoint', + adapt_listener(listener.release_savepoint)) + event.listen(self, 'begin_twophase', + adapt_listener(listener.begin_twophase)) + event.listen(self, 'prepare_twophase', + adapt_listener(listener.prepare_twophase)) + event.listen(self, 'rollback_twophase', + adapt_listener(listener.rollback_twophase)) + event.listen(self, 'commit_twophase', + adapt_listener(listener.commit_twophase)) + + def execute(self, conn, execute, clauseelement, *multiparams, **params): + """Intercept high level execute() events.""" + + return execute(clauseelement, *multiparams, **params) + + def cursor_execute(self, execute, cursor, statement, parameters, + context, executemany): + """Intercept low-level cursor execute() events.""" + + return execute(cursor, statement, parameters, context) + + def begin(self, conn, begin): + """Intercept begin() events.""" + + return begin() + + def rollback(self, conn, rollback): + """Intercept rollback() events.""" + + return rollback() + + def commit(self, conn, commit): + """Intercept commit() events.""" + + return commit() + + def savepoint(self, conn, savepoint, name=None): + """Intercept savepoint() events.""" + + return savepoint(name=name) + + def rollback_savepoint(self, conn, rollback_savepoint, name, context): + """Intercept rollback_savepoint() events.""" + + return rollback_savepoint(name, context) + + def release_savepoint(self, conn, release_savepoint, name, context): + """Intercept release_savepoint() events.""" + + return release_savepoint(name, context) + + def begin_twophase(self, conn, begin_twophase, xid): + """Intercept begin_twophase() events.""" + + return begin_twophase(xid) + + def prepare_twophase(self, conn, prepare_twophase, xid): + """Intercept prepare_twophase() events.""" + + return prepare_twophase(xid) + + def rollback_twophase(self, conn, rollback_twophase, xid, is_prepared): + """Intercept rollback_twophase() events.""" + + return rollback_twophase(xid, is_prepared) + + def commit_twophase(self, conn, commit_twophase, xid, is_prepared): + """Intercept commit_twophase() events.""" + + return commit_twophase(xid, is_prepared) diff --git a/app/lib/sqlalchemy/log.py b/app/lib/sqlalchemy/log.py new file mode 100644 index 0000000..279538a --- /dev/null +++ b/app/lib/sqlalchemy/log.py @@ -0,0 +1,217 @@ +# sqlalchemy/log.py +# Copyright (C) 2006-2017 the SQLAlchemy authors and contributors +# +# Includes alterations by Vinay Sajip vinay_sajip@yahoo.co.uk +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Logging control and utilities. + +Control of logging for SA can be performed from the regular python logging +module. The regular dotted module namespace is used, starting at +'sqlalchemy'. For class-level logging, the class name is appended. + +The "echo" keyword parameter, available on SQLA :class:`.Engine` +and :class:`.Pool` objects, corresponds to a logger specific to that +instance only. + +""" + +import logging +import sys + +# set initial level to WARN. This so that +# log statements don't occur in the absence of explicit +# logging being enabled for 'sqlalchemy'. +rootlogger = logging.getLogger('sqlalchemy') +if rootlogger.level == logging.NOTSET: + rootlogger.setLevel(logging.WARN) + + +def _add_default_handler(logger): + handler = logging.StreamHandler(sys.stdout) + handler.setFormatter(logging.Formatter( + '%(asctime)s %(levelname)s %(name)s %(message)s')) + logger.addHandler(handler) + + +_logged_classes = set() + + +def class_logger(cls): + logger = logging.getLogger(cls.__module__ + "." + cls.__name__) + cls._should_log_debug = lambda self: logger.isEnabledFor(logging.DEBUG) + cls._should_log_info = lambda self: logger.isEnabledFor(logging.INFO) + cls.logger = logger + _logged_classes.add(cls) + return cls + + +class Identified(object): + logging_name = None + + def _should_log_debug(self): + return self.logger.isEnabledFor(logging.DEBUG) + + def _should_log_info(self): + return self.logger.isEnabledFor(logging.INFO) + + +class InstanceLogger(object): + """A logger adapter (wrapper) for :class:`.Identified` subclasses. + + This allows multiple instances (e.g. Engine or Pool instances) + to share a logger, but have its verbosity controlled on a + per-instance basis. + + The basic functionality is to return a logging level + which is based on an instance's echo setting. + + Default implementation is: + + 'debug' -> logging.DEBUG + True -> logging.INFO + False -> Effective level of underlying logger + (logging.WARNING by default) + None -> same as False + """ + + # Map echo settings to logger levels + _echo_map = { + None: logging.NOTSET, + False: logging.NOTSET, + True: logging.INFO, + 'debug': logging.DEBUG, + } + + def __init__(self, echo, name): + self.echo = echo + self.logger = logging.getLogger(name) + + # if echo flag is enabled and no handlers, + # add a handler to the list + if self._echo_map[echo] <= logging.INFO \ + and not self.logger.handlers: + _add_default_handler(self.logger) + + # + # Boilerplate convenience methods + # + def debug(self, msg, *args, **kwargs): + """Delegate a debug call to the underlying logger.""" + + self.log(logging.DEBUG, msg, *args, **kwargs) + + def info(self, msg, *args, **kwargs): + """Delegate an info call to the underlying logger.""" + + self.log(logging.INFO, msg, *args, **kwargs) + + def warning(self, msg, *args, **kwargs): + """Delegate a warning call to the underlying logger.""" + + self.log(logging.WARNING, msg, *args, **kwargs) + + warn = warning + + def error(self, msg, *args, **kwargs): + """ + Delegate an error call to the underlying logger. + """ + self.log(logging.ERROR, msg, *args, **kwargs) + + def exception(self, msg, *args, **kwargs): + """Delegate an exception call to the underlying logger.""" + + kwargs["exc_info"] = 1 + self.log(logging.ERROR, msg, *args, **kwargs) + + def critical(self, msg, *args, **kwargs): + """Delegate a critical call to the underlying logger.""" + + self.log(logging.CRITICAL, msg, *args, **kwargs) + + def log(self, level, msg, *args, **kwargs): + """Delegate a log call to the underlying logger. + + The level here is determined by the echo + flag as well as that of the underlying logger, and + logger._log() is called directly. + + """ + + # inline the logic from isEnabledFor(), + # getEffectiveLevel(), to avoid overhead. + + if self.logger.manager.disable >= level: + return + + selected_level = self._echo_map[self.echo] + if selected_level == logging.NOTSET: + selected_level = self.logger.getEffectiveLevel() + + if level >= selected_level: + self.logger._log(level, msg, args, **kwargs) + + def isEnabledFor(self, level): + """Is this logger enabled for level 'level'?""" + + if self.logger.manager.disable >= level: + return False + return level >= self.getEffectiveLevel() + + def getEffectiveLevel(self): + """What's the effective level for this logger?""" + + level = self._echo_map[self.echo] + if level == logging.NOTSET: + level = self.logger.getEffectiveLevel() + return level + + +def instance_logger(instance, echoflag=None): + """create a logger for an instance that implements :class:`.Identified`.""" + + if instance.logging_name: + name = "%s.%s.%s" % (instance.__class__.__module__, + instance.__class__.__name__, + instance.logging_name) + else: + name = "%s.%s" % (instance.__class__.__module__, + instance.__class__.__name__) + + instance._echo = echoflag + + if echoflag in (False, None): + # if no echo setting or False, return a Logger directly, + # avoiding overhead of filtering + logger = logging.getLogger(name) + else: + # if a specified echo flag, return an EchoLogger, + # which checks the flag, overrides normal log + # levels by calling logger._log() + logger = InstanceLogger(echoflag, name) + + instance.logger = logger + + +class echo_property(object): + __doc__ = """\ + When ``True``, enable log output for this element. + + This has the effect of setting the Python logging level for the namespace + of this element's class and object reference. A value of boolean ``True`` + indicates that the loglevel ``logging.INFO`` will be set for the logger, + whereas the string value ``debug`` will set the loglevel to + ``logging.DEBUG``. + """ + + def __get__(self, instance, owner): + if instance is None: + return self + else: + return instance._echo + + def __set__(self, instance, value): + instance_logger(instance, echoflag=value) diff --git a/app/lib/sqlalchemy/orm/__init__.py b/app/lib/sqlalchemy/orm/__init__.py new file mode 100644 index 0000000..4491735 --- /dev/null +++ b/app/lib/sqlalchemy/orm/__init__.py @@ -0,0 +1,276 @@ +# orm/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" +Functional constructs for ORM configuration. + +See the SQLAlchemy object relational tutorial and mapper configuration +documentation for an overview of how this module is used. + +""" + +from . import exc +from .mapper import ( + Mapper, + _mapper_registry, + class_mapper, + configure_mappers, + reconstructor, + validates +) +from .interfaces import ( + EXT_CONTINUE, + EXT_STOP, + PropComparator, +) +from .deprecated_interfaces import ( + MapperExtension, + SessionExtension, + AttributeExtension, +) +from .util import ( + aliased, + join, + object_mapper, + outerjoin, + polymorphic_union, + was_deleted, + with_parent, + with_polymorphic, +) +from .properties import ColumnProperty +from .relationships import RelationshipProperty +from .descriptor_props import ( + ComparableProperty, + CompositeProperty, + SynonymProperty, +) +from .relationships import ( + foreign, + remote, +) +from .session import ( + Session, + object_session, + sessionmaker, + make_transient, + make_transient_to_detached +) +from .scoping import ( + scoped_session +) +from . import mapper as mapperlib +from .query import AliasOption, Query, Bundle +from ..util.langhelpers import public_factory +from .. import util as _sa_util +from . import strategies as _strategies + + +def create_session(bind=None, **kwargs): + r"""Create a new :class:`.Session` + with no automation enabled by default. + + This function is used primarily for testing. The usual + route to :class:`.Session` creation is via its constructor + or the :func:`.sessionmaker` function. + + :param bind: optional, a single Connectable to use for all + database access in the created + :class:`~sqlalchemy.orm.session.Session`. + + :param \*\*kwargs: optional, passed through to the + :class:`.Session` constructor. + + :returns: an :class:`~sqlalchemy.orm.session.Session` instance + + The defaults of create_session() are the opposite of that of + :func:`sessionmaker`; ``autoflush`` and ``expire_on_commit`` are + False, ``autocommit`` is True. In this sense the session acts + more like the "classic" SQLAlchemy 0.3 session with these. + + Usage:: + + >>> from sqlalchemy.orm import create_session + >>> session = create_session() + + It is recommended to use :func:`sessionmaker` instead of + create_session(). + + """ + kwargs.setdefault('autoflush', False) + kwargs.setdefault('autocommit', True) + kwargs.setdefault('expire_on_commit', False) + return Session(bind=bind, **kwargs) + +relationship = public_factory(RelationshipProperty, ".orm.relationship") + + +def relation(*arg, **kw): + """A synonym for :func:`relationship`.""" + + return relationship(*arg, **kw) + + +def dynamic_loader(argument, **kw): + """Construct a dynamically-loading mapper property. + + This is essentially the same as + using the ``lazy='dynamic'`` argument with :func:`relationship`:: + + dynamic_loader(SomeClass) + + # is the same as + + relationship(SomeClass, lazy="dynamic") + + See the section :ref:`dynamic_relationship` for more details + on dynamic loading. + + """ + kw['lazy'] = 'dynamic' + return relationship(argument, **kw) + + +column_property = public_factory(ColumnProperty, ".orm.column_property") +composite = public_factory(CompositeProperty, ".orm.composite") + + +def backref(name, **kwargs): + """Create a back reference with explicit keyword arguments, which are the + same arguments one can send to :func:`relationship`. + + Used with the ``backref`` keyword argument to :func:`relationship` in + place of a string argument, e.g.:: + + 'items':relationship( + SomeItem, backref=backref('parent', lazy='subquery')) + + .. seealso:: + + :ref:`relationships_backref` + + """ + + return (name, kwargs) + + +def deferred(*columns, **kw): + r"""Indicate a column-based mapped attribute that by default will + not load unless accessed. + + :param \*columns: columns to be mapped. This is typically a single + :class:`.Column` object, however a collection is supported in order + to support multiple columns mapped under the same attribute. + + :param \**kw: additional keyword arguments passed to + :class:`.ColumnProperty`. + + .. seealso:: + + :ref:`deferred` + + """ + return ColumnProperty(deferred=True, *columns, **kw) + + +mapper = public_factory(Mapper, ".orm.mapper") + +synonym = public_factory(SynonymProperty, ".orm.synonym") + +comparable_property = public_factory(ComparableProperty, + ".orm.comparable_property") + + +@_sa_util.deprecated("0.7", message=":func:`.compile_mappers` " + "is renamed to :func:`.configure_mappers`") +def compile_mappers(): + """Initialize the inter-mapper relationships of all mappers that have + been defined. + + """ + configure_mappers() + + +def clear_mappers(): + """Remove all mappers from all classes. + + This function removes all instrumentation from classes and disposes + of their associated mappers. Once called, the classes are unmapped + and can be later re-mapped with new mappers. + + :func:`.clear_mappers` is *not* for normal use, as there is literally no + valid usage for it outside of very specific testing scenarios. Normally, + mappers are permanent structural components of user-defined classes, and + are never discarded independently of their class. If a mapped class + itself is garbage collected, its mapper is automatically disposed of as + well. As such, :func:`.clear_mappers` is only for usage in test suites + that re-use the same classes with different mappings, which is itself an + extremely rare use case - the only such use case is in fact SQLAlchemy's + own test suite, and possibly the test suites of other ORM extension + libraries which intend to test various combinations of mapper construction + upon a fixed set of classes. + + """ + mapperlib._CONFIGURE_MUTEX.acquire() + try: + while _mapper_registry: + try: + # can't even reliably call list(weakdict) in jython + mapper, b = _mapper_registry.popitem() + mapper.dispose() + except KeyError: + pass + finally: + mapperlib._CONFIGURE_MUTEX.release() + +from . import strategy_options + +joinedload = strategy_options.joinedload._unbound_fn +joinedload_all = strategy_options.joinedload._unbound_all_fn +contains_eager = strategy_options.contains_eager._unbound_fn +defer = strategy_options.defer._unbound_fn +undefer = strategy_options.undefer._unbound_fn +undefer_group = strategy_options.undefer_group._unbound_fn +load_only = strategy_options.load_only._unbound_fn +lazyload = strategy_options.lazyload._unbound_fn +lazyload_all = strategy_options.lazyload_all._unbound_all_fn +subqueryload = strategy_options.subqueryload._unbound_fn +subqueryload_all = strategy_options.subqueryload_all._unbound_all_fn +immediateload = strategy_options.immediateload._unbound_fn +noload = strategy_options.noload._unbound_fn +raiseload = strategy_options.raiseload._unbound_fn +defaultload = strategy_options.defaultload._unbound_fn + +from .strategy_options import Load + + +def eagerload(*args, **kwargs): + """A synonym for :func:`joinedload()`.""" + return joinedload(*args, **kwargs) + + +def eagerload_all(*args, **kwargs): + """A synonym for :func:`joinedload_all()`""" + return joinedload_all(*args, **kwargs) + + +contains_alias = public_factory(AliasOption, ".orm.contains_alias") + + +def __go(lcls): + global __all__ + from .. import util as sa_util + from . import dynamic + from . import events + import inspect as _inspect + + __all__ = sorted(name for name, obj in lcls.items() + if not (name.startswith('_') or _inspect.ismodule(obj))) + + _sa_util.dependencies.resolve_all("sqlalchemy.orm") + +__go(locals()) diff --git a/app/lib/sqlalchemy/orm/attributes.py b/app/lib/sqlalchemy/orm/attributes.py new file mode 100644 index 0000000..fc81db7 --- /dev/null +++ b/app/lib/sqlalchemy/orm/attributes.py @@ -0,0 +1,1617 @@ +# orm/attributes.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Defines instrumentation for class attributes and their interaction +with instances. + +This module is usually not directly visible to user applications, but +defines a large part of the ORM's interactivity. + + +""" + +import operator +from .. import util, event, inspection +from . import interfaces, collections, exc as orm_exc + +from .base import instance_state, instance_dict, manager_of_class + +from .base import PASSIVE_NO_RESULT, ATTR_WAS_SET, ATTR_EMPTY, NO_VALUE,\ + NEVER_SET, NO_CHANGE, CALLABLES_OK, SQL_OK, RELATED_OBJECT_OK,\ + INIT_OK, NON_PERSISTENT_OK, LOAD_AGAINST_COMMITTED, PASSIVE_OFF,\ + PASSIVE_RETURN_NEVER_SET, PASSIVE_NO_INITIALIZE, PASSIVE_NO_FETCH,\ + PASSIVE_NO_FETCH_RELATED, PASSIVE_ONLY_PERSISTENT, NO_AUTOFLUSH +from .base import state_str, instance_str + + +@inspection._self_inspects +class QueryableAttribute(interfaces._MappedAttribute, + interfaces.InspectionAttr, + interfaces.PropComparator): + """Base class for :term:`descriptor` objects that intercept + attribute events on behalf of a :class:`.MapperProperty` + object. The actual :class:`.MapperProperty` is accessible + via the :attr:`.QueryableAttribute.property` + attribute. + + + .. seealso:: + + :class:`.InstrumentedAttribute` + + :class:`.MapperProperty` + + :attr:`.Mapper.all_orm_descriptors` + + :attr:`.Mapper.attrs` + """ + + is_attribute = True + + def __init__(self, class_, key, impl=None, + comparator=None, parententity=None, + of_type=None): + self.class_ = class_ + self.key = key + self.impl = impl + self.comparator = comparator + self._parententity = parententity + self._of_type = of_type + + manager = manager_of_class(class_) + # manager is None in the case of AliasedClass + if manager: + # propagate existing event listeners from + # immediate superclass + for base in manager._bases: + if key in base: + self.dispatch._update(base[key].dispatch) + + @util.memoized_property + def _supports_population(self): + return self.impl.supports_population + + def get_history(self, instance, passive=PASSIVE_OFF): + return self.impl.get_history(instance_state(instance), + instance_dict(instance), passive) + + def __selectable__(self): + # TODO: conditionally attach this method based on clause_element ? + return self + + @util.memoized_property + def info(self): + """Return the 'info' dictionary for the underlying SQL element. + + The behavior here is as follows: + + * If the attribute is a column-mapped property, i.e. + :class:`.ColumnProperty`, which is mapped directly + to a schema-level :class:`.Column` object, this attribute + will return the :attr:`.SchemaItem.info` dictionary associated + with the core-level :class:`.Column` object. + + * If the attribute is a :class:`.ColumnProperty` but is mapped to + any other kind of SQL expression other than a :class:`.Column`, + the attribute will refer to the :attr:`.MapperProperty.info` + dictionary associated directly with the :class:`.ColumnProperty`, + assuming the SQL expression itself does not have its own ``.info`` + attribute (which should be the case, unless a user-defined SQL + construct has defined one). + + * If the attribute refers to any other kind of + :class:`.MapperProperty`, including :class:`.RelationshipProperty`, + the attribute will refer to the :attr:`.MapperProperty.info` + dictionary associated with that :class:`.MapperProperty`. + + * To access the :attr:`.MapperProperty.info` dictionary of the + :class:`.MapperProperty` unconditionally, including for a + :class:`.ColumnProperty` that's associated directly with a + :class:`.schema.Column`, the attribute can be referred to using + :attr:`.QueryableAttribute.property` attribute, as + ``MyClass.someattribute.property.info``. + + .. versionadded:: 0.8.0 + + .. seealso:: + + :attr:`.SchemaItem.info` + + :attr:`.MapperProperty.info` + + """ + return self.comparator.info + + @util.memoized_property + def parent(self): + """Return an inspection instance representing the parent. + + This will be either an instance of :class:`.Mapper` + or :class:`.AliasedInsp`, depending upon the nature + of the parent entity which this attribute is associated + with. + + """ + return inspection.inspect(self._parententity) + + @property + def expression(self): + return self.comparator.__clause_element__() + + def __clause_element__(self): + return self.comparator.__clause_element__() + + def _query_clause_element(self): + """like __clause_element__(), but called specifically + by :class:`.Query` to allow special behavior.""" + + return self.comparator._query_clause_element() + + def adapt_to_entity(self, adapt_to_entity): + assert not self._of_type + return self.__class__(adapt_to_entity.entity, + self.key, impl=self.impl, + comparator=self.comparator.adapt_to_entity( + adapt_to_entity), + parententity=adapt_to_entity) + + def of_type(self, cls): + return QueryableAttribute( + self.class_, + self.key, + self.impl, + self.comparator.of_type(cls), + self._parententity, + of_type=cls) + + def label(self, name): + return self._query_clause_element().label(name) + + def operate(self, op, *other, **kwargs): + return op(self.comparator, *other, **kwargs) + + def reverse_operate(self, op, other, **kwargs): + return op(other, self.comparator, **kwargs) + + def hasparent(self, state, optimistic=False): + return self.impl.hasparent(state, optimistic=optimistic) is not False + + def __getattr__(self, key): + try: + return getattr(self.comparator, key) + except AttributeError: + raise AttributeError( + 'Neither %r object nor %r object associated with %s ' + 'has an attribute %r' % ( + type(self).__name__, + type(self.comparator).__name__, + self, + key) + ) + + def __str__(self): + return "%s.%s" % (self.class_.__name__, self.key) + + @util.memoized_property + def property(self): + """Return the :class:`.MapperProperty` associated with this + :class:`.QueryableAttribute`. + + + Return values here will commonly be instances of + :class:`.ColumnProperty` or :class:`.RelationshipProperty`. + + + """ + return self.comparator.property + + +class InstrumentedAttribute(QueryableAttribute): + """Class bound instrumented attribute which adds basic + :term:`descriptor` methods. + + See :class:`.QueryableAttribute` for a description of most features. + + + """ + + def __set__(self, instance, value): + self.impl.set(instance_state(instance), + instance_dict(instance), value, None) + + def __delete__(self, instance): + self.impl.delete(instance_state(instance), instance_dict(instance)) + + def __get__(self, instance, owner): + if instance is None: + return self + + dict_ = instance_dict(instance) + if self._supports_population and self.key in dict_: + return dict_[self.key] + else: + return self.impl.get(instance_state(instance), dict_) + + +def create_proxied_attribute(descriptor): + """Create an QueryableAttribute / user descriptor hybrid. + + Returns a new QueryableAttribute type that delegates descriptor + behavior and getattr() to the given descriptor. + """ + + # TODO: can move this to descriptor_props if the need for this + # function is removed from ext/hybrid.py + + class Proxy(QueryableAttribute): + """Presents the :class:`.QueryableAttribute` interface as a + proxy on top of a Python descriptor / :class:`.PropComparator` + combination. + + """ + + def __init__(self, class_, key, descriptor, + comparator, + adapt_to_entity=None, doc=None, + original_property=None): + self.class_ = class_ + self.key = key + self.descriptor = descriptor + self.original_property = original_property + self._comparator = comparator + self._adapt_to_entity = adapt_to_entity + self.__doc__ = doc + + @property + def property(self): + return self.comparator.property + + @util.memoized_property + def comparator(self): + if util.callable(self._comparator): + self._comparator = self._comparator() + if self._adapt_to_entity: + self._comparator = self._comparator.adapt_to_entity( + self._adapt_to_entity) + return self._comparator + + def adapt_to_entity(self, adapt_to_entity): + return self.__class__(adapt_to_entity.entity, + self.key, + self.descriptor, + self._comparator, + adapt_to_entity) + + def __get__(self, instance, owner): + if instance is None: + return self + else: + return self.descriptor.__get__(instance, owner) + + def __str__(self): + return "%s.%s" % (self.class_.__name__, self.key) + + def __getattr__(self, attribute): + """Delegate __getattr__ to the original descriptor and/or + comparator.""" + + try: + return getattr(descriptor, attribute) + except AttributeError: + try: + return getattr(self.comparator, attribute) + except AttributeError: + raise AttributeError( + 'Neither %r object nor %r object associated with %s ' + 'has an attribute %r' % ( + type(descriptor).__name__, + type(self.comparator).__name__, + self, + attribute) + ) + + Proxy.__name__ = type(descriptor).__name__ + 'Proxy' + + util.monkeypatch_proxied_specials(Proxy, type(descriptor), + name='descriptor', + from_instance=descriptor) + return Proxy + +OP_REMOVE = util.symbol("REMOVE") +OP_APPEND = util.symbol("APPEND") +OP_REPLACE = util.symbol("REPLACE") + + +class Event(object): + """A token propagated throughout the course of a chain of attribute + events. + + Serves as an indicator of the source of the event and also provides + a means of controlling propagation across a chain of attribute + operations. + + The :class:`.Event` object is sent as the ``initiator`` argument + when dealing with the :meth:`.AttributeEvents.append`, + :meth:`.AttributeEvents.set`, + and :meth:`.AttributeEvents.remove` events. + + The :class:`.Event` object is currently interpreted by the backref + event handlers, and is used to control the propagation of operations + across two mutually-dependent attributes. + + .. versionadded:: 0.9.0 + + :var impl: The :class:`.AttributeImpl` which is the current event + initiator. + + :var op: The symbol :attr:`.OP_APPEND`, :attr:`.OP_REMOVE` or + :attr:`.OP_REPLACE`, indicating the source operation. + + """ + + __slots__ = 'impl', 'op', 'parent_token' + + def __init__(self, attribute_impl, op): + self.impl = attribute_impl + self.op = op + self.parent_token = self.impl.parent_token + + def __eq__(self, other): + return isinstance(other, Event) and \ + other.impl is self.impl and \ + other.op == self.op + + @property + def key(self): + return self.impl.key + + def hasparent(self, state): + return self.impl.hasparent(state) + + +class AttributeImpl(object): + """internal implementation for instrumented attributes.""" + + def __init__(self, class_, key, + callable_, dispatch, trackparent=False, extension=None, + compare_function=None, active_history=False, + parent_token=None, expire_missing=True, + send_modified_events=True, + **kwargs): + r"""Construct an AttributeImpl. + + \class_ + associated class + + key + string name of the attribute + + \callable_ + optional function which generates a callable based on a parent + instance, which produces the "default" values for a scalar or + collection attribute when it's first accessed, if not present + already. + + trackparent + if True, attempt to track if an instance has a parent attached + to it via this attribute. + + extension + a single or list of AttributeExtension object(s) which will + receive set/delete/append/remove/etc. events. Deprecated. + The event package is now used. + + compare_function + a function that compares two values which are normally + assignable to this attribute. + + active_history + indicates that get_history() should always return the "old" value, + even if it means executing a lazy callable upon attribute change. + + parent_token + Usually references the MapperProperty, used as a key for + the hasparent() function to identify an "owning" attribute. + Allows multiple AttributeImpls to all match a single + owner attribute. + + expire_missing + if False, don't add an "expiry" callable to this attribute + during state.expire_attributes(None), if no value is present + for this key. + + send_modified_events + if False, the InstanceState._modified_event method will have no + effect; this means the attribute will never show up as changed in a + history entry. + """ + self.class_ = class_ + self.key = key + self.callable_ = callable_ + self.dispatch = dispatch + self.trackparent = trackparent + self.parent_token = parent_token or self + self.send_modified_events = send_modified_events + if compare_function is None: + self.is_equal = operator.eq + else: + self.is_equal = compare_function + + # TODO: pass in the manager here + # instead of doing a lookup + attr = manager_of_class(class_)[key] + + for ext in util.to_list(extension or []): + ext._adapt_listener(attr, ext) + + if active_history: + self.dispatch._active_history = True + + self.expire_missing = expire_missing + + __slots__ = ( + 'class_', 'key', 'callable_', 'dispatch', 'trackparent', + 'parent_token', 'send_modified_events', 'is_equal', 'expire_missing' + ) + + def __str__(self): + return "%s.%s" % (self.class_.__name__, self.key) + + def _get_active_history(self): + """Backwards compat for impl.active_history""" + + return self.dispatch._active_history + + def _set_active_history(self, value): + self.dispatch._active_history = value + + active_history = property(_get_active_history, _set_active_history) + + def hasparent(self, state, optimistic=False): + """Return the boolean value of a `hasparent` flag attached to + the given state. + + The `optimistic` flag determines what the default return value + should be if no `hasparent` flag can be located. + + As this function is used to determine if an instance is an + *orphan*, instances that were loaded from storage should be + assumed to not be orphans, until a True/False value for this + flag is set. + + An instance attribute that is loaded by a callable function + will also not have a `hasparent` flag. + + """ + msg = "This AttributeImpl is not configured to track parents." + assert self.trackparent, msg + + return state.parents.get(id(self.parent_token), optimistic) \ + is not False + + def sethasparent(self, state, parent_state, value): + """Set a boolean flag on the given item corresponding to + whether or not it is attached to a parent object via the + attribute represented by this ``InstrumentedAttribute``. + + """ + msg = "This AttributeImpl is not configured to track parents." + assert self.trackparent, msg + + id_ = id(self.parent_token) + if value: + state.parents[id_] = parent_state + else: + if id_ in state.parents: + last_parent = state.parents[id_] + + if last_parent is not False and \ + last_parent.key != parent_state.key: + + if last_parent.obj() is None: + raise orm_exc.StaleDataError( + "Removing state %s from parent " + "state %s along attribute '%s', " + "but the parent record " + "has gone stale, can't be sure this " + "is the most recent parent." % + (state_str(state), + state_str(parent_state), + self.key)) + + return + + state.parents[id_] = False + + def get_history(self, state, dict_, passive=PASSIVE_OFF): + raise NotImplementedError() + + def get_all_pending(self, state, dict_, passive=PASSIVE_NO_INITIALIZE): + """Return a list of tuples of (state, obj) + for all objects in this attribute's current state + + history. + + Only applies to object-based attributes. + + This is an inlining of existing functionality + which roughly corresponds to: + + get_state_history( + state, + key, + passive=PASSIVE_NO_INITIALIZE).sum() + + """ + raise NotImplementedError() + + def initialize(self, state, dict_): + """Initialize the given state's attribute with an empty value.""" + + value = None + for fn in self.dispatch.init_scalar: + ret = fn(state, value, dict_) + if ret is not ATTR_EMPTY: + value = ret + + return value + + def get(self, state, dict_, passive=PASSIVE_OFF): + """Retrieve a value from the given object. + If a callable is assembled on this object's attribute, and + passive is False, the callable will be executed and the + resulting value will be set as the new value for this attribute. + """ + if self.key in dict_: + return dict_[self.key] + else: + # if history present, don't load + key = self.key + if key not in state.committed_state or \ + state.committed_state[key] is NEVER_SET: + if not passive & CALLABLES_OK: + return PASSIVE_NO_RESULT + + if key in state.expired_attributes: + value = state._load_expired(state, passive) + elif key in state.callables: + callable_ = state.callables[key] + value = callable_(state, passive) + elif self.callable_: + value = self.callable_(state, passive) + else: + value = ATTR_EMPTY + + if value is PASSIVE_NO_RESULT or value is NEVER_SET: + return value + elif value is ATTR_WAS_SET: + try: + return dict_[key] + except KeyError: + # TODO: no test coverage here. + raise KeyError( + "Deferred loader for attribute " + "%r failed to populate " + "correctly" % key) + elif value is not ATTR_EMPTY: + return self.set_committed_value(state, dict_, value) + + if not passive & INIT_OK: + return NEVER_SET + else: + # Return a new, empty value + return self.initialize(state, dict_) + + def append(self, state, dict_, value, initiator, passive=PASSIVE_OFF): + self.set(state, dict_, value, initiator, passive=passive) + + def remove(self, state, dict_, value, initiator, passive=PASSIVE_OFF): + self.set(state, dict_, None, initiator, + passive=passive, check_old=value) + + def pop(self, state, dict_, value, initiator, passive=PASSIVE_OFF): + self.set(state, dict_, None, initiator, + passive=passive, check_old=value, pop=True) + + def set(self, state, dict_, value, initiator, + passive=PASSIVE_OFF, check_old=None, pop=False): + raise NotImplementedError() + + def get_committed_value(self, state, dict_, passive=PASSIVE_OFF): + """return the unchanged value of this attribute""" + + if self.key in state.committed_state: + value = state.committed_state[self.key] + if value in (NO_VALUE, NEVER_SET): + return None + else: + return value + else: + return self.get(state, dict_, passive=passive) + + def set_committed_value(self, state, dict_, value): + """set an attribute value on the given instance and 'commit' it.""" + + dict_[self.key] = value + state._commit(dict_, [self.key]) + return value + + +class ScalarAttributeImpl(AttributeImpl): + """represents a scalar value-holding InstrumentedAttribute.""" + + accepts_scalar_loader = True + uses_objects = False + supports_population = True + collection = False + + __slots__ = '_replace_token', '_append_token', '_remove_token' + + def __init__(self, *arg, **kw): + super(ScalarAttributeImpl, self).__init__(*arg, **kw) + self._replace_token = self._append_token = None + self._remove_token = None + + def _init_append_token(self): + self._replace_token = self._append_token = Event(self, OP_REPLACE) + return self._replace_token + + _init_append_or_replace_token = _init_append_token + + def _init_remove_token(self): + self._remove_token = Event(self, OP_REMOVE) + return self._remove_token + + def delete(self, state, dict_): + + # TODO: catch key errors, convert to attributeerror? + if self.dispatch._active_history: + old = self.get(state, dict_, PASSIVE_RETURN_NEVER_SET) + else: + old = dict_.get(self.key, NO_VALUE) + + if self.dispatch.remove: + self.fire_remove_event(state, dict_, old, self._remove_token) + state._modified_event(dict_, self, old) + del dict_[self.key] + + def get_history(self, state, dict_, passive=PASSIVE_OFF): + if self.key in dict_: + return History.from_scalar_attribute(self, state, dict_[self.key]) + else: + if passive & INIT_OK: + passive ^= INIT_OK + current = self.get(state, dict_, passive=passive) + if current is PASSIVE_NO_RESULT: + return HISTORY_BLANK + else: + return History.from_scalar_attribute(self, state, current) + + def set(self, state, dict_, value, initiator, + passive=PASSIVE_OFF, check_old=None, pop=False): + if self.dispatch._active_history: + old = self.get(state, dict_, PASSIVE_RETURN_NEVER_SET) + else: + old = dict_.get(self.key, NO_VALUE) + + if self.dispatch.set: + value = self.fire_replace_event(state, dict_, + value, old, initiator) + state._modified_event(dict_, self, old) + dict_[self.key] = value + + def fire_replace_event(self, state, dict_, value, previous, initiator): + for fn in self.dispatch.set: + value = fn( + state, value, previous, + initiator or self._replace_token or + self._init_append_or_replace_token()) + return value + + def fire_remove_event(self, state, dict_, value, initiator): + for fn in self.dispatch.remove: + fn(state, value, + initiator or self._remove_token or self._init_remove_token()) + + @property + def type(self): + self.property.columns[0].type + + +class ScalarObjectAttributeImpl(ScalarAttributeImpl): + """represents a scalar-holding InstrumentedAttribute, + where the target object is also instrumented. + + Adds events to delete/set operations. + + """ + + accepts_scalar_loader = False + uses_objects = True + supports_population = True + collection = False + + __slots__ = () + + def delete(self, state, dict_): + old = self.get(state, dict_) + self.fire_remove_event( + state, dict_, old, + self._remove_token or self._init_remove_token()) + del dict_[self.key] + + def get_history(self, state, dict_, passive=PASSIVE_OFF): + if self.key in dict_: + return History.from_object_attribute(self, state, dict_[self.key]) + else: + if passive & INIT_OK: + passive ^= INIT_OK + current = self.get(state, dict_, passive=passive) + if current is PASSIVE_NO_RESULT: + return HISTORY_BLANK + else: + return History.from_object_attribute(self, state, current) + + def get_all_pending(self, state, dict_, passive=PASSIVE_NO_INITIALIZE): + if self.key in dict_: + current = dict_[self.key] + elif passive & CALLABLES_OK: + current = self.get(state, dict_, passive=passive) + else: + return [] + + # can't use __hash__(), can't use __eq__() here + if current is not None and \ + current is not PASSIVE_NO_RESULT and \ + current is not NEVER_SET: + ret = [(instance_state(current), current)] + else: + ret = [(None, None)] + + if self.key in state.committed_state: + original = state.committed_state[self.key] + if original is not None and \ + original is not PASSIVE_NO_RESULT and \ + original is not NEVER_SET and \ + original is not current: + + ret.append((instance_state(original), original)) + return ret + + def set(self, state, dict_, value, initiator, + passive=PASSIVE_OFF, check_old=None, pop=False): + """Set a value on the given InstanceState. + + """ + if self.dispatch._active_history: + old = self.get( + state, dict_, + passive=PASSIVE_ONLY_PERSISTENT | + NO_AUTOFLUSH | LOAD_AGAINST_COMMITTED) + else: + old = self.get( + state, dict_, passive=PASSIVE_NO_FETCH ^ INIT_OK | + LOAD_AGAINST_COMMITTED) + + if check_old is not None and \ + old is not PASSIVE_NO_RESULT and \ + check_old is not old: + if pop: + return + else: + raise ValueError( + "Object %s not associated with %s on attribute '%s'" % ( + instance_str(check_old), + state_str(state), + self.key + )) + + value = self.fire_replace_event(state, dict_, value, old, initiator) + dict_[self.key] = value + + def fire_remove_event(self, state, dict_, value, initiator): + if self.trackparent and value is not None: + self.sethasparent(instance_state(value), state, False) + + for fn in self.dispatch.remove: + fn(state, value, initiator or + self._remove_token or self._init_remove_token()) + + state._modified_event(dict_, self, value) + + def fire_replace_event(self, state, dict_, value, previous, initiator): + if self.trackparent: + if (previous is not value and + previous not in (None, PASSIVE_NO_RESULT, NEVER_SET)): + self.sethasparent(instance_state(previous), state, False) + + for fn in self.dispatch.set: + value = fn( + state, value, previous, initiator or + self._replace_token or self._init_append_or_replace_token()) + + state._modified_event(dict_, self, previous) + + if self.trackparent: + if value is not None: + self.sethasparent(instance_state(value), state, True) + + return value + + +class CollectionAttributeImpl(AttributeImpl): + """A collection-holding attribute that instruments changes in membership. + + Only handles collections of instrumented objects. + + InstrumentedCollectionAttribute holds an arbitrary, user-specified + container object (defaulting to a list) and brokers access to the + CollectionAdapter, a "view" onto that object that presents consistent bag + semantics to the orm layer independent of the user data implementation. + + """ + accepts_scalar_loader = False + uses_objects = True + supports_population = True + collection = True + + __slots__ = ( + 'copy', 'collection_factory', '_append_token', '_remove_token', + '_duck_typed_as' + ) + + def __init__(self, class_, key, callable_, dispatch, + typecallable=None, trackparent=False, extension=None, + copy_function=None, compare_function=None, **kwargs): + super(CollectionAttributeImpl, self).__init__( + class_, + key, + callable_, dispatch, + trackparent=trackparent, + extension=extension, + compare_function=compare_function, + **kwargs) + + if copy_function is None: + copy_function = self.__copy + self.copy = copy_function + self.collection_factory = typecallable + self._append_token = None + self._remove_token = None + self._duck_typed_as = util.duck_type_collection( + self.collection_factory()) + + if getattr(self.collection_factory, "_sa_linker", None): + + @event.listens_for(self, "init_collection") + def link(target, collection, collection_adapter): + collection._sa_linker(collection_adapter) + + @event.listens_for(self, "dispose_collection") + def unlink(target, collection, collection_adapter): + collection._sa_linker(None) + + def _init_append_token(self): + self._append_token = Event(self, OP_APPEND) + return self._append_token + + def _init_remove_token(self): + self._remove_token = Event(self, OP_REMOVE) + return self._remove_token + + def __copy(self, item): + return [y for y in collections.collection_adapter(item)] + + def get_history(self, state, dict_, passive=PASSIVE_OFF): + current = self.get(state, dict_, passive=passive) + if current is PASSIVE_NO_RESULT: + return HISTORY_BLANK + else: + return History.from_collection(self, state, current) + + def get_all_pending(self, state, dict_, passive=PASSIVE_NO_INITIALIZE): + # NOTE: passive is ignored here at the moment + + if self.key not in dict_: + return [] + + current = dict_[self.key] + current = getattr(current, '_sa_adapter') + + if self.key in state.committed_state: + original = state.committed_state[self.key] + if original not in (NO_VALUE, NEVER_SET): + current_states = [((c is not None) and + instance_state(c) or None, c) + for c in current] + original_states = [((c is not None) and + instance_state(c) or None, c) + for c in original] + + current_set = dict(current_states) + original_set = dict(original_states) + + return \ + [(s, o) for s, o in current_states + if s not in original_set] + \ + [(s, o) for s, o in current_states + if s in original_set] + \ + [(s, o) for s, o in original_states + if s not in current_set] + + return [(instance_state(o), o) for o in current] + + def fire_append_event(self, state, dict_, value, initiator): + for fn in self.dispatch.append: + value = fn( + state, value, + initiator or self._append_token or self._init_append_token()) + + state._modified_event(dict_, self, NEVER_SET, True) + + if self.trackparent and value is not None: + self.sethasparent(instance_state(value), state, True) + + return value + + def fire_pre_remove_event(self, state, dict_, initiator): + state._modified_event(dict_, self, NEVER_SET, True) + + def fire_remove_event(self, state, dict_, value, initiator): + if self.trackparent and value is not None: + self.sethasparent(instance_state(value), state, False) + + for fn in self.dispatch.remove: + fn(state, value, + initiator or self._remove_token or self._init_remove_token()) + + state._modified_event(dict_, self, NEVER_SET, True) + + def delete(self, state, dict_): + if self.key not in dict_: + return + + state._modified_event(dict_, self, NEVER_SET, True) + + collection = self.get_collection(state, state.dict) + collection.clear_with_event() + # TODO: catch key errors, convert to attributeerror? + del dict_[self.key] + + def initialize(self, state, dict_): + """Initialize this attribute with an empty collection.""" + + _, user_data = self._initialize_collection(state) + dict_[self.key] = user_data + return user_data + + def _initialize_collection(self, state): + + adapter, collection = state.manager.initialize_collection( + self.key, state, self.collection_factory) + + self.dispatch.init_collection(state, collection, adapter) + + return adapter, collection + + def append(self, state, dict_, value, initiator, passive=PASSIVE_OFF): + collection = self.get_collection(state, dict_, passive=passive) + if collection is PASSIVE_NO_RESULT: + value = self.fire_append_event(state, dict_, value, initiator) + assert self.key not in dict_, \ + "Collection was loaded during event handling." + state._get_pending_mutation(self.key).append(value) + else: + collection.append_with_event(value, initiator) + + def remove(self, state, dict_, value, initiator, passive=PASSIVE_OFF): + collection = self.get_collection(state, state.dict, passive=passive) + if collection is PASSIVE_NO_RESULT: + self.fire_remove_event(state, dict_, value, initiator) + assert self.key not in dict_, \ + "Collection was loaded during event handling." + state._get_pending_mutation(self.key).remove(value) + else: + collection.remove_with_event(value, initiator) + + def pop(self, state, dict_, value, initiator, passive=PASSIVE_OFF): + try: + # TODO: better solution here would be to add + # a "popper" role to collections.py to complement + # "remover". + self.remove(state, dict_, value, initiator, passive=passive) + except (ValueError, KeyError, IndexError): + pass + + def set(self, state, dict_, value, initiator=None, + passive=PASSIVE_OFF, pop=False, _adapt=True): + iterable = orig_iterable = value + + # pulling a new collection first so that an adaptation exception does + # not trigger a lazy load of the old collection. + new_collection, user_data = self._initialize_collection(state) + if _adapt: + if new_collection._converter is not None: + iterable = new_collection._converter(iterable) + else: + setting_type = util.duck_type_collection(iterable) + receiving_type = self._duck_typed_as + + if setting_type is not receiving_type: + given = iterable is None and 'None' or \ + iterable.__class__.__name__ + wanted = self._duck_typed_as.__name__ + raise TypeError( + "Incompatible collection type: %s is not %s-like" % ( + given, wanted)) + + # If the object is an adapted collection, return the (iterable) + # adapter. + if hasattr(iterable, '_sa_iterator'): + iterable = iterable._sa_iterator() + elif setting_type is dict: + if util.py3k: + iterable = iterable.values() + else: + iterable = getattr( + iterable, 'itervalues', iterable.values)() + else: + iterable = iter(iterable) + new_values = list(iterable) + + old = self.get(state, dict_, passive=PASSIVE_ONLY_PERSISTENT) + if old is PASSIVE_NO_RESULT: + old = self.initialize(state, dict_) + elif old is orig_iterable: + # ignore re-assignment of the current collection, as happens + # implicitly with in-place operators (foo.collection |= other) + return + + # place a copy of "old" in state.committed_state + state._modified_event(dict_, self, old, True) + + old_collection = old._sa_adapter + + dict_[self.key] = user_data + + collections.bulk_replace( + new_values, old_collection, new_collection) + + del old._sa_adapter + self.dispatch.dispose_collection(state, old, old_collection) + + def _invalidate_collection(self, collection): + adapter = getattr(collection, '_sa_adapter') + adapter.invalidated = True + + def set_committed_value(self, state, dict_, value): + """Set an attribute value on the given instance and 'commit' it.""" + + collection, user_data = self._initialize_collection(state) + + if value: + collection.append_multiple_without_event(value) + + state.dict[self.key] = user_data + + state._commit(dict_, [self.key]) + + if self.key in state._pending_mutations: + # pending items exist. issue a modified event, + # add/remove new items. + state._modified_event(dict_, self, user_data, True) + + pending = state._pending_mutations.pop(self.key) + added = pending.added_items + removed = pending.deleted_items + for item in added: + collection.append_without_event(item) + for item in removed: + collection.remove_without_event(item) + + return user_data + + def get_collection(self, state, dict_, + user_data=None, passive=PASSIVE_OFF): + """Retrieve the CollectionAdapter associated with the given state. + + Creates a new CollectionAdapter if one does not exist. + + """ + if user_data is None: + user_data = self.get(state, dict_, passive=passive) + if user_data is PASSIVE_NO_RESULT: + return user_data + + return getattr(user_data, '_sa_adapter') + + +def backref_listeners(attribute, key, uselist): + """Apply listeners to synchronize a two-way relationship.""" + + # use easily recognizable names for stack traces + + parent_token = attribute.impl.parent_token + parent_impl = attribute.impl + + def _acceptable_key_err(child_state, initiator, child_impl): + raise ValueError( + "Bidirectional attribute conflict detected: " + 'Passing object %s to attribute "%s" ' + 'triggers a modify event on attribute "%s" ' + 'via the backref "%s".' % ( + state_str(child_state), + initiator.parent_token, + child_impl.parent_token, + attribute.impl.parent_token + ) + ) + + def emit_backref_from_scalar_set_event(state, child, oldchild, initiator): + if oldchild is child: + return child + if oldchild is not None and \ + oldchild is not PASSIVE_NO_RESULT and \ + oldchild is not NEVER_SET: + # With lazy=None, there's no guarantee that the full collection is + # present when updating via a backref. + old_state, old_dict = instance_state(oldchild),\ + instance_dict(oldchild) + impl = old_state.manager[key].impl + + if initiator.impl is not impl or \ + initiator.op not in (OP_REPLACE, OP_REMOVE): + impl.pop(old_state, + old_dict, + state.obj(), + parent_impl._append_token or + parent_impl._init_append_token(), + passive=PASSIVE_NO_FETCH) + + if child is not None: + child_state, child_dict = instance_state(child),\ + instance_dict(child) + child_impl = child_state.manager[key].impl + if initiator.parent_token is not parent_token and \ + initiator.parent_token is not child_impl.parent_token: + _acceptable_key_err(state, initiator, child_impl) + elif initiator.impl is not child_impl or \ + initiator.op not in (OP_APPEND, OP_REPLACE): + child_impl.append( + child_state, + child_dict, + state.obj(), + initiator, + passive=PASSIVE_NO_FETCH) + return child + + def emit_backref_from_collection_append_event(state, child, initiator): + if child is None: + return + + child_state, child_dict = instance_state(child), \ + instance_dict(child) + child_impl = child_state.manager[key].impl + + if initiator.parent_token is not parent_token and \ + initiator.parent_token is not child_impl.parent_token: + _acceptable_key_err(state, initiator, child_impl) + elif initiator.impl is not child_impl or \ + initiator.op not in (OP_APPEND, OP_REPLACE): + child_impl.append( + child_state, + child_dict, + state.obj(), + initiator, + passive=PASSIVE_NO_FETCH) + return child + + def emit_backref_from_collection_remove_event(state, child, initiator): + if child is not None: + child_state, child_dict = instance_state(child),\ + instance_dict(child) + child_impl = child_state.manager[key].impl + if initiator.impl is not child_impl or \ + initiator.op not in (OP_REMOVE, OP_REPLACE): + child_impl.pop( + child_state, + child_dict, + state.obj(), + initiator, + passive=PASSIVE_NO_FETCH) + + if uselist: + event.listen(attribute, "append", + emit_backref_from_collection_append_event, + retval=True, raw=True) + else: + event.listen(attribute, "set", + emit_backref_from_scalar_set_event, + retval=True, raw=True) + # TODO: need coverage in test/orm/ of remove event + event.listen(attribute, "remove", + emit_backref_from_collection_remove_event, + retval=True, raw=True) + +_NO_HISTORY = util.symbol('NO_HISTORY') +_NO_STATE_SYMBOLS = frozenset([ + id(PASSIVE_NO_RESULT), + id(NO_VALUE), + id(NEVER_SET)]) + +History = util.namedtuple("History", [ + "added", "unchanged", "deleted" +]) + + +class History(History): + """A 3-tuple of added, unchanged and deleted values, + representing the changes which have occurred on an instrumented + attribute. + + The easiest way to get a :class:`.History` object for a particular + attribute on an object is to use the :func:`.inspect` function:: + + from sqlalchemy import inspect + + hist = inspect(myobject).attrs.myattribute.history + + Each tuple member is an iterable sequence: + + * ``added`` - the collection of items added to the attribute (the first + tuple element). + + * ``unchanged`` - the collection of items that have not changed on the + attribute (the second tuple element). + + * ``deleted`` - the collection of items that have been removed from the + attribute (the third tuple element). + + """ + + def __bool__(self): + return self != HISTORY_BLANK + __nonzero__ = __bool__ + + def empty(self): + """Return True if this :class:`.History` has no changes + and no existing, unchanged state. + + """ + + return not bool( + (self.added or self.deleted) + or self.unchanged + ) + + def sum(self): + """Return a collection of added + unchanged + deleted.""" + + return (self.added or []) +\ + (self.unchanged or []) +\ + (self.deleted or []) + + def non_deleted(self): + """Return a collection of added + unchanged.""" + + return (self.added or []) +\ + (self.unchanged or []) + + def non_added(self): + """Return a collection of unchanged + deleted.""" + + return (self.unchanged or []) +\ + (self.deleted or []) + + def has_changes(self): + """Return True if this :class:`.History` has changes.""" + + return bool(self.added or self.deleted) + + def as_state(self): + return History( + [(c is not None) + and instance_state(c) or None + for c in self.added], + [(c is not None) + and instance_state(c) or None + for c in self.unchanged], + [(c is not None) + and instance_state(c) or None + for c in self.deleted], + ) + + @classmethod + def from_scalar_attribute(cls, attribute, state, current): + original = state.committed_state.get(attribute.key, _NO_HISTORY) + + if original is _NO_HISTORY: + if current is NEVER_SET: + return cls((), (), ()) + else: + return cls((), [current], ()) + # don't let ClauseElement expressions here trip things up + elif attribute.is_equal(current, original) is True: + return cls((), [current], ()) + else: + # current convention on native scalars is to not + # include information + # about missing previous value in "deleted", but + # we do include None, which helps in some primary + # key situations + if id(original) in _NO_STATE_SYMBOLS: + deleted = () + else: + deleted = [original] + if current is NEVER_SET: + return cls((), (), deleted) + else: + return cls([current], (), deleted) + + @classmethod + def from_object_attribute(cls, attribute, state, current): + original = state.committed_state.get(attribute.key, _NO_HISTORY) + + if original is _NO_HISTORY: + if current is NO_VALUE or current is NEVER_SET: + return cls((), (), ()) + else: + return cls((), [current], ()) + elif current is original: + return cls((), [current], ()) + else: + # current convention on related objects is to not + # include information + # about missing previous value in "deleted", and + # to also not include None - the dependency.py rules + # ignore the None in any case. + if id(original) in _NO_STATE_SYMBOLS or original is None: + deleted = () + else: + deleted = [original] + if current is NO_VALUE or current is NEVER_SET: + return cls((), (), deleted) + else: + return cls([current], (), deleted) + + @classmethod + def from_collection(cls, attribute, state, current): + original = state.committed_state.get(attribute.key, _NO_HISTORY) + + if current is NO_VALUE or current is NEVER_SET: + return cls((), (), ()) + + current = getattr(current, '_sa_adapter') + if original in (NO_VALUE, NEVER_SET): + return cls(list(current), (), ()) + elif original is _NO_HISTORY: + return cls((), list(current), ()) + else: + + current_states = [((c is not None) and instance_state(c) + or None, c) + for c in current + ] + original_states = [((c is not None) and instance_state(c) + or None, c) + for c in original + ] + + current_set = dict(current_states) + original_set = dict(original_states) + + return cls( + [o for s, o in current_states if s not in original_set], + [o for s, o in current_states if s in original_set], + [o for s, o in original_states if s not in current_set] + ) + +HISTORY_BLANK = History(None, None, None) + + +def get_history(obj, key, passive=PASSIVE_OFF): + """Return a :class:`.History` record for the given object + and attribute key. + + :param obj: an object whose class is instrumented by the + attributes package. + + :param key: string attribute name. + + :param passive: indicates loading behavior for the attribute + if the value is not already present. This is a + bitflag attribute, which defaults to the symbol + :attr:`.PASSIVE_OFF` indicating all necessary SQL + should be emitted. + + """ + if passive is True: + util.warn_deprecated("Passing True for 'passive' is deprecated. " + "Use attributes.PASSIVE_NO_INITIALIZE") + passive = PASSIVE_NO_INITIALIZE + elif passive is False: + util.warn_deprecated("Passing False for 'passive' is " + "deprecated. Use attributes.PASSIVE_OFF") + passive = PASSIVE_OFF + + return get_state_history(instance_state(obj), key, passive) + + +def get_state_history(state, key, passive=PASSIVE_OFF): + return state.get_history(key, passive) + + +def has_parent(cls, obj, key, optimistic=False): + """TODO""" + manager = manager_of_class(cls) + state = instance_state(obj) + return manager.has_parent(state, key, optimistic) + + +def register_attribute(class_, key, **kw): + comparator = kw.pop('comparator', None) + parententity = kw.pop('parententity', None) + doc = kw.pop('doc', None) + desc = register_descriptor(class_, key, + comparator, parententity, doc=doc) + register_attribute_impl(class_, key, **kw) + return desc + + +def register_attribute_impl(class_, key, + uselist=False, callable_=None, + useobject=False, + impl_class=None, backref=None, **kw): + + manager = manager_of_class(class_) + if uselist: + factory = kw.pop('typecallable', None) + typecallable = manager.instrument_collection_class( + key, factory or list) + else: + typecallable = kw.pop('typecallable', None) + + dispatch = manager[key].dispatch + + if impl_class: + impl = impl_class(class_, key, typecallable, dispatch, **kw) + elif uselist: + impl = CollectionAttributeImpl(class_, key, callable_, dispatch, + typecallable=typecallable, **kw) + elif useobject: + impl = ScalarObjectAttributeImpl(class_, key, callable_, + dispatch, **kw) + else: + impl = ScalarAttributeImpl(class_, key, callable_, dispatch, **kw) + + manager[key].impl = impl + + if backref: + backref_listeners(manager[key], backref, uselist) + + manager.post_configure_attribute(key) + return manager[key] + + +def register_descriptor(class_, key, comparator=None, + parententity=None, doc=None): + manager = manager_of_class(class_) + + descriptor = InstrumentedAttribute(class_, key, comparator=comparator, + parententity=parententity) + + descriptor.__doc__ = doc + + manager.instrument_attribute(key, descriptor) + return descriptor + + +def unregister_attribute(class_, key): + manager_of_class(class_).uninstrument_attribute(key) + + +def init_collection(obj, key): + """Initialize a collection attribute and return the collection adapter. + + This function is used to provide direct access to collection internals + for a previously unloaded attribute. e.g.:: + + collection_adapter = init_collection(someobject, 'elements') + for elem in values: + collection_adapter.append_without_event(elem) + + For an easier way to do the above, see + :func:`~sqlalchemy.orm.attributes.set_committed_value`. + + obj is an instrumented object instance. An InstanceState + is accepted directly for backwards compatibility but + this usage is deprecated. + + """ + state = instance_state(obj) + dict_ = state.dict + return init_state_collection(state, dict_, key) + + +def init_state_collection(state, dict_, key): + """Initialize a collection attribute and return the collection adapter.""" + + attr = state.manager[key].impl + user_data = attr.initialize(state, dict_) + return attr.get_collection(state, dict_, user_data) + + +def set_committed_value(instance, key, value): + """Set the value of an attribute with no history events. + + Cancels any previous history present. The value should be + a scalar value for scalar-holding attributes, or + an iterable for any collection-holding attribute. + + This is the same underlying method used when a lazy loader + fires off and loads additional data from the database. + In particular, this method can be used by application code + which has loaded additional attributes or collections through + separate queries, which can then be attached to an instance + as though it were part of its original loaded state. + + """ + state, dict_ = instance_state(instance), instance_dict(instance) + state.manager[key].impl.set_committed_value(state, dict_, value) + + +def set_attribute(instance, key, value): + """Set the value of an attribute, firing history events. + + This function may be used regardless of instrumentation + applied directly to the class, i.e. no descriptors are required. + Custom attribute management schemes will need to make usage + of this method to establish attribute state as understood + by SQLAlchemy. + + """ + state, dict_ = instance_state(instance), instance_dict(instance) + state.manager[key].impl.set(state, dict_, value, None) + + +def get_attribute(instance, key): + """Get the value of an attribute, firing any callables required. + + This function may be used regardless of instrumentation + applied directly to the class, i.e. no descriptors are required. + Custom attribute management schemes will need to make usage + of this method to make usage of attribute state as understood + by SQLAlchemy. + + """ + state, dict_ = instance_state(instance), instance_dict(instance) + return state.manager[key].impl.get(state, dict_) + + +def del_attribute(instance, key): + """Delete the value of an attribute, firing history events. + + This function may be used regardless of instrumentation + applied directly to the class, i.e. no descriptors are required. + Custom attribute management schemes will need to make usage + of this method to establish attribute state as understood + by SQLAlchemy. + + """ + state, dict_ = instance_state(instance), instance_dict(instance) + state.manager[key].impl.delete(state, dict_) + + +def flag_modified(instance, key): + """Mark an attribute on an instance as 'modified'. + + This sets the 'modified' flag on the instance and + establishes an unconditional change event for the given attribute. + + """ + state, dict_ = instance_state(instance), instance_dict(instance) + impl = state.manager[key].impl + state._modified_event(dict_, impl, NO_VALUE, force=True) diff --git a/app/lib/sqlalchemy/orm/base.py b/app/lib/sqlalchemy/orm/base.py new file mode 100644 index 0000000..1ad5603 --- /dev/null +++ b/app/lib/sqlalchemy/orm/base.py @@ -0,0 +1,540 @@ +# orm/base.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Constants and rudimental functions used throughout the ORM. + +""" + +from .. import util, inspection, exc as sa_exc +from ..sql import expression +from . import exc +import operator + +PASSIVE_NO_RESULT = util.symbol( + 'PASSIVE_NO_RESULT', + """Symbol returned by a loader callable or other attribute/history + retrieval operation when a value could not be determined, based + on loader callable flags. + """ +) + +ATTR_WAS_SET = util.symbol( + 'ATTR_WAS_SET', + """Symbol returned by a loader callable to indicate the + retrieved value, or values, were assigned to their attributes + on the target object. + """ +) + +ATTR_EMPTY = util.symbol( + 'ATTR_EMPTY', + """Symbol used internally to indicate an attribute had no callable.""" +) + +NO_VALUE = util.symbol( + 'NO_VALUE', + """Symbol which may be placed as the 'previous' value of an attribute, + indicating no value was loaded for an attribute when it was modified, + and flags indicated we were not to load it. + """ +) + +NEVER_SET = util.symbol( + 'NEVER_SET', + """Symbol which may be placed as the 'previous' value of an attribute + indicating that the attribute had not been assigned to previously. + """ +) + +NO_CHANGE = util.symbol( + "NO_CHANGE", + """No callables or SQL should be emitted on attribute access + and no state should change + """, canonical=0 +) + +CALLABLES_OK = util.symbol( + "CALLABLES_OK", + """Loader callables can be fired off if a value + is not present. + """, canonical=1 +) + +SQL_OK = util.symbol( + "SQL_OK", + """Loader callables can emit SQL at least on scalar value attributes.""", + canonical=2 +) + +RELATED_OBJECT_OK = util.symbol( + "RELATED_OBJECT_OK", + """Callables can use SQL to load related objects as well + as scalar value attributes. + """, canonical=4 +) + +INIT_OK = util.symbol( + "INIT_OK", + """Attributes should be initialized with a blank + value (None or an empty collection) upon get, if no other + value can be obtained. + """, canonical=8 +) + +NON_PERSISTENT_OK = util.symbol( + "NON_PERSISTENT_OK", + """Callables can be emitted if the parent is not persistent.""", + canonical=16 +) + +LOAD_AGAINST_COMMITTED = util.symbol( + "LOAD_AGAINST_COMMITTED", + """Callables should use committed values as primary/foreign keys during a + load. + """, canonical=32 +) + +NO_AUTOFLUSH = util.symbol( + "NO_AUTOFLUSH", + """Loader callables should disable autoflush.""", + canonical=64 +) + +# pre-packaged sets of flags used as inputs +PASSIVE_OFF = util.symbol( + "PASSIVE_OFF", + "Callables can be emitted in all cases.", + canonical=(RELATED_OBJECT_OK | NON_PERSISTENT_OK | + INIT_OK | CALLABLES_OK | SQL_OK) +) +PASSIVE_RETURN_NEVER_SET = util.symbol( + "PASSIVE_RETURN_NEVER_SET", + """PASSIVE_OFF ^ INIT_OK""", + canonical=PASSIVE_OFF ^ INIT_OK +) +PASSIVE_NO_INITIALIZE = util.symbol( + "PASSIVE_NO_INITIALIZE", + "PASSIVE_RETURN_NEVER_SET ^ CALLABLES_OK", + canonical=PASSIVE_RETURN_NEVER_SET ^ CALLABLES_OK +) +PASSIVE_NO_FETCH = util.symbol( + "PASSIVE_NO_FETCH", + "PASSIVE_OFF ^ SQL_OK", + canonical=PASSIVE_OFF ^ SQL_OK +) +PASSIVE_NO_FETCH_RELATED = util.symbol( + "PASSIVE_NO_FETCH_RELATED", + "PASSIVE_OFF ^ RELATED_OBJECT_OK", + canonical=PASSIVE_OFF ^ RELATED_OBJECT_OK +) +PASSIVE_ONLY_PERSISTENT = util.symbol( + "PASSIVE_ONLY_PERSISTENT", + "PASSIVE_OFF ^ NON_PERSISTENT_OK", + canonical=PASSIVE_OFF ^ NON_PERSISTENT_OK +) + +DEFAULT_MANAGER_ATTR = '_sa_class_manager' +DEFAULT_STATE_ATTR = '_sa_instance_state' +_INSTRUMENTOR = ('mapper', 'instrumentor') + +EXT_CONTINUE = util.symbol('EXT_CONTINUE') +EXT_STOP = util.symbol('EXT_STOP') + +ONETOMANY = util.symbol( + 'ONETOMANY', + """Indicates the one-to-many direction for a :func:`.relationship`. + + This symbol is typically used by the internals but may be exposed within + certain API features. + + """) + +MANYTOONE = util.symbol( + 'MANYTOONE', + """Indicates the many-to-one direction for a :func:`.relationship`. + + This symbol is typically used by the internals but may be exposed within + certain API features. + + """) + +MANYTOMANY = util.symbol( + 'MANYTOMANY', + """Indicates the many-to-many direction for a :func:`.relationship`. + + This symbol is typically used by the internals but may be exposed within + certain API features. + + """) + +NOT_EXTENSION = util.symbol( + 'NOT_EXTENSION', + """Symbol indicating an :class:`InspectionAttr` that's + not part of sqlalchemy.ext. + + Is assigned to the :attr:`.InspectionAttr.extension_type` + attibute. + + """) + +_never_set = frozenset([NEVER_SET]) + +_none_set = frozenset([None, NEVER_SET, PASSIVE_NO_RESULT]) + +_SET_DEFERRED_EXPIRED = util.symbol("SET_DEFERRED_EXPIRED") + +_DEFER_FOR_STATE = util.symbol("DEFER_FOR_STATE") + + +def _generative(*assertions): + """Mark a method as generative, e.g. method-chained.""" + + @util.decorator + def generate(fn, *args, **kw): + self = args[0]._clone() + for assertion in assertions: + assertion(self, fn.__name__) + fn(self, *args[1:], **kw) + return self + return generate + + +# these can be replaced by sqlalchemy.ext.instrumentation +# if augmented class instrumentation is enabled. +def manager_of_class(cls): + return cls.__dict__.get(DEFAULT_MANAGER_ATTR, None) + +instance_state = operator.attrgetter(DEFAULT_STATE_ATTR) + +instance_dict = operator.attrgetter('__dict__') + + +def instance_str(instance): + """Return a string describing an instance.""" + + return state_str(instance_state(instance)) + + +def state_str(state): + """Return a string describing an instance via its InstanceState.""" + + if state is None: + return "None" + else: + return '<%s at 0x%x>' % (state.class_.__name__, id(state.obj())) + + +def state_class_str(state): + """Return a string describing an instance's class via its + InstanceState. + """ + + if state is None: + return "None" + else: + return '<%s>' % (state.class_.__name__, ) + + +def attribute_str(instance, attribute): + return instance_str(instance) + "." + attribute + + +def state_attribute_str(state, attribute): + return state_str(state) + "." + attribute + + +def object_mapper(instance): + """Given an object, return the primary Mapper associated with the object + instance. + + Raises :class:`sqlalchemy.orm.exc.UnmappedInstanceError` + if no mapping is configured. + + This function is available via the inspection system as:: + + inspect(instance).mapper + + Using the inspection system will raise + :class:`sqlalchemy.exc.NoInspectionAvailable` if the instance is + not part of a mapping. + + """ + return object_state(instance).mapper + + +def object_state(instance): + """Given an object, return the :class:`.InstanceState` + associated with the object. + + Raises :class:`sqlalchemy.orm.exc.UnmappedInstanceError` + if no mapping is configured. + + Equivalent functionality is available via the :func:`.inspect` + function as:: + + inspect(instance) + + Using the inspection system will raise + :class:`sqlalchemy.exc.NoInspectionAvailable` if the instance is + not part of a mapping. + + """ + state = _inspect_mapped_object(instance) + if state is None: + raise exc.UnmappedInstanceError(instance) + else: + return state + + +@inspection._inspects(object) +def _inspect_mapped_object(instance): + try: + return instance_state(instance) + # TODO: whats the py-2/3 syntax to catch two + # different kinds of exceptions at once ? + except exc.UnmappedClassError: + return None + except exc.NO_STATE: + return None + + +def _class_to_mapper(class_or_mapper): + insp = inspection.inspect(class_or_mapper, False) + if insp is not None: + return insp.mapper + else: + raise exc.UnmappedClassError(class_or_mapper) + + +def _mapper_or_none(entity): + """Return the :class:`.Mapper` for the given class or None if the + class is not mapped. + """ + + insp = inspection.inspect(entity, False) + if insp is not None: + return insp.mapper + else: + return None + + +def _is_mapped_class(entity): + """Return True if the given object is a mapped class, + :class:`.Mapper`, or :class:`.AliasedClass`. + """ + + insp = inspection.inspect(entity, False) + return insp is not None and \ + not insp.is_clause_element and \ + ( + insp.is_mapper or insp.is_aliased_class + ) + + +def _attr_as_key(attr): + if hasattr(attr, 'key'): + return attr.key + else: + return expression._column_as_key(attr) + + +def _orm_columns(entity): + insp = inspection.inspect(entity, False) + if hasattr(insp, 'selectable') and hasattr(insp.selectable, 'c'): + return [c for c in insp.selectable.c] + else: + return [entity] + + +def _is_aliased_class(entity): + insp = inspection.inspect(entity, False) + return insp is not None and \ + getattr(insp, "is_aliased_class", False) + + +def _entity_descriptor(entity, key): + """Return a class attribute given an entity and string name. + + May return :class:`.InstrumentedAttribute` or user-defined + attribute. + + """ + insp = inspection.inspect(entity) + if insp.is_selectable: + description = entity + entity = insp.c + elif insp.is_aliased_class: + entity = insp.entity + description = entity + elif hasattr(insp, "mapper"): + description = entity = insp.mapper.class_ + else: + description = entity + + try: + return getattr(entity, key) + except AttributeError: + raise sa_exc.InvalidRequestError( + "Entity '%s' has no property '%s'" % + (description, key) + ) + +_state_mapper = util.dottedgetter('manager.mapper') + + +@inspection._inspects(type) +def _inspect_mapped_class(class_, configure=False): + try: + class_manager = manager_of_class(class_) + if not class_manager.is_mapped: + return None + mapper = class_manager.mapper + except exc.NO_STATE: + return None + else: + if configure and mapper._new_mappers: + mapper._configure_all() + return mapper + + +def class_mapper(class_, configure=True): + """Given a class, return the primary :class:`.Mapper` associated + with the key. + + Raises :exc:`.UnmappedClassError` if no mapping is configured + on the given class, or :exc:`.ArgumentError` if a non-class + object is passed. + + Equivalent functionality is available via the :func:`.inspect` + function as:: + + inspect(some_mapped_class) + + Using the inspection system will raise + :class:`sqlalchemy.exc.NoInspectionAvailable` if the class is not mapped. + + """ + mapper = _inspect_mapped_class(class_, configure=configure) + if mapper is None: + if not isinstance(class_, type): + raise sa_exc.ArgumentError( + "Class object expected, got '%r'." % (class_, )) + raise exc.UnmappedClassError(class_) + else: + return mapper + + +class InspectionAttr(object): + """A base class applied to all ORM objects that can be returned + by the :func:`.inspect` function. + + The attributes defined here allow the usage of simple boolean + checks to test basic facts about the object returned. + + While the boolean checks here are basically the same as using + the Python isinstance() function, the flags here can be used without + the need to import all of these classes, and also such that + the SQLAlchemy class system can change while leaving the flags + here intact for forwards-compatibility. + + """ + __slots__ = () + + is_selectable = False + """Return True if this object is an instance of :class:`.Selectable`.""" + + is_aliased_class = False + """True if this object is an instance of :class:`.AliasedClass`.""" + + is_instance = False + """True if this object is an instance of :class:`.InstanceState`.""" + + is_mapper = False + """True if this object is an instance of :class:`.Mapper`.""" + + is_property = False + """True if this object is an instance of :class:`.MapperProperty`.""" + + is_attribute = False + """True if this object is a Python :term:`descriptor`. + + This can refer to one of many types. Usually a + :class:`.QueryableAttribute` which handles attributes events on behalf + of a :class:`.MapperProperty`. But can also be an extension type + such as :class:`.AssociationProxy` or :class:`.hybrid_property`. + The :attr:`.InspectionAttr.extension_type` will refer to a constant + identifying the specific subtype. + + .. seealso:: + + :attr:`.Mapper.all_orm_descriptors` + + """ + + is_clause_element = False + """True if this object is an instance of :class:`.ClauseElement`.""" + + extension_type = NOT_EXTENSION + """The extension type, if any. + Defaults to :data:`.interfaces.NOT_EXTENSION` + + .. versionadded:: 0.8.0 + + .. seealso:: + + :data:`.HYBRID_METHOD` + + :data:`.HYBRID_PROPERTY` + + :data:`.ASSOCIATION_PROXY` + + """ + + +class InspectionAttrInfo(InspectionAttr): + """Adds the ``.info`` attribute to :class:`.InspectionAttr`. + + The rationale for :class:`.InspectionAttr` vs. :class:`.InspectionAttrInfo` + is that the former is compatible as a mixin for classes that specify + ``__slots__``; this is essentially an implementation artifact. + + """ + + @util.memoized_property + def info(self): + """Info dictionary associated with the object, allowing user-defined + data to be associated with this :class:`.InspectionAttr`. + + The dictionary is generated when first accessed. Alternatively, + it can be specified as a constructor argument to the + :func:`.column_property`, :func:`.relationship`, or :func:`.composite` + functions. + + .. versionadded:: 0.8 Added support for .info to all + :class:`.MapperProperty` subclasses. + + .. versionchanged:: 1.0.0 :attr:`.MapperProperty.info` is also + available on extension types via the + :attr:`.InspectionAttrInfo.info` attribute, so that it can apply + to a wider variety of ORM and extension constructs. + + .. seealso:: + + :attr:`.QueryableAttribute.info` + + :attr:`.SchemaItem.info` + + """ + return {} + + +class _MappedAttribute(object): + """Mixin for attributes which should be replaced by mapper-assigned + attributes. + + """ + __slots__ = () diff --git a/app/lib/sqlalchemy/orm/collections.py b/app/lib/sqlalchemy/orm/collections.py new file mode 100644 index 0000000..2bb53e6 --- /dev/null +++ b/app/lib/sqlalchemy/orm/collections.py @@ -0,0 +1,1552 @@ +# orm/collections.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Support for collections of mapped entities. + +The collections package supplies the machinery used to inform the ORM of +collection membership changes. An instrumentation via decoration approach is +used, allowing arbitrary types (including built-ins) to be used as entity +collections without requiring inheritance from a base class. + +Instrumentation decoration relays membership change events to the +:class:`.CollectionAttributeImpl` that is currently managing the collection. +The decorators observe function call arguments and return values, tracking +entities entering or leaving the collection. Two decorator approaches are +provided. One is a bundle of generic decorators that map function arguments +and return values to events:: + + from sqlalchemy.orm.collections import collection + class MyClass(object): + # ... + + @collection.adds(1) + def store(self, item): + self.data.append(item) + + @collection.removes_return() + def pop(self): + return self.data.pop() + + +The second approach is a bundle of targeted decorators that wrap appropriate +append and remove notifiers around the mutation methods present in the +standard Python ``list``, ``set`` and ``dict`` interfaces. These could be +specified in terms of generic decorator recipes, but are instead hand-tooled +for increased efficiency. The targeted decorators occasionally implement +adapter-like behavior, such as mapping bulk-set methods (``extend``, +``update``, ``__setslice__``, etc.) into the series of atomic mutation events +that the ORM requires. + +The targeted decorators are used internally for automatic instrumentation of +entity collection classes. Every collection class goes through a +transformation process roughly like so: + +1. If the class is a built-in, substitute a trivial sub-class +2. Is this class already instrumented? +3. Add in generic decorators +4. Sniff out the collection interface through duck-typing +5. Add targeted decoration to any undecorated interface method + +This process modifies the class at runtime, decorating methods and adding some +bookkeeping properties. This isn't possible (or desirable) for built-in +classes like ``list``, so trivial sub-classes are substituted to hold +decoration:: + + class InstrumentedList(list): + pass + +Collection classes can be specified in ``relationship(collection_class=)`` as +types or a function that returns an instance. Collection classes are +inspected and instrumented during the mapper compilation phase. The +collection_class callable will be executed once to produce a specimen +instance, and the type of that specimen will be instrumented. Functions that +return built-in types like ``lists`` will be adapted to produce instrumented +instances. + +When extending a known type like ``list``, additional decorations are not +generally not needed. Odds are, the extension method will delegate to a +method that's already instrumented. For example:: + + class QueueIsh(list): + def push(self, item): + self.append(item) + def shift(self): + return self.pop(0) + +There's no need to decorate these methods. ``append`` and ``pop`` are already +instrumented as part of the ``list`` interface. Decorating them would fire +duplicate events, which should be avoided. + +The targeted decoration tries not to rely on other methods in the underlying +collection class, but some are unavoidable. Many depend on 'read' methods +being present to properly instrument a 'write', for example, ``__setitem__`` +needs ``__getitem__``. "Bulk" methods like ``update`` and ``extend`` may also +reimplemented in terms of atomic appends and removes, so the ``extend`` +decoration will actually perform many ``append`` operations and not call the +underlying method at all. + +Tight control over bulk operation and the firing of events is also possible by +implementing the instrumentation internally in your methods. The basic +instrumentation package works under the general assumption that collection +mutation will not raise unusual exceptions. If you want to closely +orchestrate append and remove events with exception management, internal +instrumentation may be the answer. Within your method, +``collection_adapter(self)`` will retrieve an object that you can use for +explicit control over triggering append and remove events. + +The owning object and :class:`.CollectionAttributeImpl` are also reachable +through the adapter, allowing for some very sophisticated behavior. + +""" + +import inspect +import operator +import weakref + +from ..sql import expression +from .. import util, exc as sa_exc +from . import base + +from sqlalchemy.util.compat import inspect_getargspec + +__all__ = ['collection', 'collection_adapter', + 'mapped_collection', 'column_mapped_collection', + 'attribute_mapped_collection'] + +__instrumentation_mutex = util.threading.Lock() + + +class _PlainColumnGetter(object): + """Plain column getter, stores collection of Column objects + directly. + + Serializes to a :class:`._SerializableColumnGetterV2` + which has more expensive __call__() performance + and some rare caveats. + + """ + + def __init__(self, cols): + self.cols = cols + self.composite = len(cols) > 1 + + def __reduce__(self): + return _SerializableColumnGetterV2._reduce_from_cols(self.cols) + + def _cols(self, mapper): + return self.cols + + def __call__(self, value): + state = base.instance_state(value) + m = base._state_mapper(state) + + key = [ + m._get_state_attr_by_column(state, state.dict, col) + for col in self._cols(m) + ] + + if self.composite: + return tuple(key) + else: + return key[0] + + +class _SerializableColumnGetter(object): + """Column-based getter used in version 0.7.6 only. + + Remains here for pickle compatibility with 0.7.6. + + """ + + def __init__(self, colkeys): + self.colkeys = colkeys + self.composite = len(colkeys) > 1 + + def __reduce__(self): + return _SerializableColumnGetter, (self.colkeys,) + + def __call__(self, value): + state = base.instance_state(value) + m = base._state_mapper(state) + key = [m._get_state_attr_by_column( + state, state.dict, + m.mapped_table.columns[k]) + for k in self.colkeys] + if self.composite: + return tuple(key) + else: + return key[0] + + +class _SerializableColumnGetterV2(_PlainColumnGetter): + """Updated serializable getter which deals with + multi-table mapped classes. + + Two extremely unusual cases are not supported. + Mappings which have tables across multiple metadata + objects, or which are mapped to non-Table selectables + linked across inheriting mappers may fail to function + here. + + """ + + def __init__(self, colkeys): + self.colkeys = colkeys + self.composite = len(colkeys) > 1 + + def __reduce__(self): + return self.__class__, (self.colkeys,) + + @classmethod + def _reduce_from_cols(cls, cols): + def _table_key(c): + if not isinstance(c.table, expression.TableClause): + return None + else: + return c.table.key + colkeys = [(c.key, _table_key(c)) for c in cols] + return _SerializableColumnGetterV2, (colkeys,) + + def _cols(self, mapper): + cols = [] + metadata = getattr(mapper.local_table, 'metadata', None) + for (ckey, tkey) in self.colkeys: + if tkey is None or \ + metadata is None or \ + tkey not in metadata: + cols.append(mapper.local_table.c[ckey]) + else: + cols.append(metadata.tables[tkey].c[ckey]) + return cols + + +def column_mapped_collection(mapping_spec): + """A dictionary-based collection type with column-based keying. + + Returns a :class:`.MappedCollection` factory with a keying function + generated from mapping_spec, which may be a Column or a sequence + of Columns. + + The key value must be immutable for the lifetime of the object. You + can not, for example, map on foreign key values if those key values will + change during the session, i.e. from None to a database-assigned integer + after a session flush. + + """ + cols = [expression._only_column_elements(q, "mapping_spec") + for q in util.to_list(mapping_spec) + ] + keyfunc = _PlainColumnGetter(cols) + return lambda: MappedCollection(keyfunc) + + +class _SerializableAttrGetter(object): + def __init__(self, name): + self.name = name + self.getter = operator.attrgetter(name) + + def __call__(self, target): + return self.getter(target) + + def __reduce__(self): + return _SerializableAttrGetter, (self.name, ) + + +def attribute_mapped_collection(attr_name): + """A dictionary-based collection type with attribute-based keying. + + Returns a :class:`.MappedCollection` factory with a keying based on the + 'attr_name' attribute of entities in the collection, where ``attr_name`` + is the string name of the attribute. + + The key value must be immutable for the lifetime of the object. You + can not, for example, map on foreign key values if those key values will + change during the session, i.e. from None to a database-assigned integer + after a session flush. + + """ + getter = _SerializableAttrGetter(attr_name) + return lambda: MappedCollection(getter) + + +def mapped_collection(keyfunc): + """A dictionary-based collection type with arbitrary keying. + + Returns a :class:`.MappedCollection` factory with a keying function + generated from keyfunc, a callable that takes an entity and returns a + key value. + + The key value must be immutable for the lifetime of the object. You + can not, for example, map on foreign key values if those key values will + change during the session, i.e. from None to a database-assigned integer + after a session flush. + + """ + return lambda: MappedCollection(keyfunc) + + +class collection(object): + """Decorators for entity collection classes. + + The decorators fall into two groups: annotations and interception recipes. + + The annotating decorators (appender, remover, iterator, linker, converter, + internally_instrumented) indicate the method's purpose and take no + arguments. They are not written with parens:: + + @collection.appender + def append(self, append): ... + + The recipe decorators all require parens, even those that take no + arguments:: + + @collection.adds('entity') + def insert(self, position, entity): ... + + @collection.removes_return() + def popitem(self): ... + + """ + # Bundled as a class solely for ease of use: packaging, doc strings, + # importability. + + @staticmethod + def appender(fn): + """Tag the method as the collection appender. + + The appender method is called with one positional argument: the value + to append. The method will be automatically decorated with 'adds(1)' + if not already decorated:: + + @collection.appender + def add(self, append): ... + + # or, equivalently + @collection.appender + @collection.adds(1) + def add(self, append): ... + + # for mapping type, an 'append' may kick out a previous value + # that occupies that slot. consider d['a'] = 'foo'- any previous + # value in d['a'] is discarded. + @collection.appender + @collection.replaces(1) + def add(self, entity): + key = some_key_func(entity) + previous = None + if key in self: + previous = self[key] + self[key] = entity + return previous + + If the value to append is not allowed in the collection, you may + raise an exception. Something to remember is that the appender + will be called for each object mapped by a database query. If the + database contains rows that violate your collection semantics, you + will need to get creative to fix the problem, as access via the + collection will not work. + + If the appender method is internally instrumented, you must also + receive the keyword argument '_sa_initiator' and ensure its + promulgation to collection events. + + """ + fn._sa_instrument_role = 'appender' + return fn + + @staticmethod + def remover(fn): + """Tag the method as the collection remover. + + The remover method is called with one positional argument: the value + to remove. The method will be automatically decorated with + :meth:`removes_return` if not already decorated:: + + @collection.remover + def zap(self, entity): ... + + # or, equivalently + @collection.remover + @collection.removes_return() + def zap(self, ): ... + + If the value to remove is not present in the collection, you may + raise an exception or return None to ignore the error. + + If the remove method is internally instrumented, you must also + receive the keyword argument '_sa_initiator' and ensure its + promulgation to collection events. + + """ + fn._sa_instrument_role = 'remover' + return fn + + @staticmethod + def iterator(fn): + """Tag the method as the collection remover. + + The iterator method is called with no arguments. It is expected to + return an iterator over all collection members:: + + @collection.iterator + def __iter__(self): ... + + """ + fn._sa_instrument_role = 'iterator' + return fn + + @staticmethod + def internally_instrumented(fn): + """Tag the method as instrumented. + + This tag will prevent any decoration from being applied to the + method. Use this if you are orchestrating your own calls to + :func:`.collection_adapter` in one of the basic SQLAlchemy + interface methods, or to prevent an automatic ABC method + decoration from wrapping your implementation:: + + # normally an 'extend' method on a list-like class would be + # automatically intercepted and re-implemented in terms of + # SQLAlchemy events and append(). your implementation will + # never be called, unless: + @collection.internally_instrumented + def extend(self, items): ... + + """ + fn._sa_instrumented = True + return fn + + @staticmethod + def linker(fn): + """Tag the method as a "linked to attribute" event handler. + + This optional event handler will be called when the collection class + is linked to or unlinked from the InstrumentedAttribute. It is + invoked immediately after the '_sa_adapter' property is set on + the instance. A single argument is passed: the collection adapter + that has been linked, or None if unlinking. + + .. deprecated:: 1.0.0 - the :meth:`.collection.linker` handler + is superseded by the :meth:`.AttributeEvents.init_collection` + and :meth:`.AttributeEvents.dispose_collection` handlers. + + """ + fn._sa_instrument_role = 'linker' + return fn + + link = linker + """deprecated; synonym for :meth:`.collection.linker`.""" + + @staticmethod + def converter(fn): + """Tag the method as the collection converter. + + This optional method will be called when a collection is being + replaced entirely, as in:: + + myobj.acollection = [newvalue1, newvalue2] + + The converter method will receive the object being assigned and should + return an iterable of values suitable for use by the ``appender`` + method. A converter must not assign values or mutate the collection, + its sole job is to adapt the value the user provides into an iterable + of values for the ORM's use. + + The default converter implementation will use duck-typing to do the + conversion. A dict-like collection will be convert into an iterable + of dictionary values, and other types will simply be iterated:: + + @collection.converter + def convert(self, other): ... + + If the duck-typing of the object does not match the type of this + collection, a TypeError is raised. + + Supply an implementation of this method if you want to expand the + range of possible types that can be assigned in bulk or perform + validation on the values about to be assigned. + + """ + fn._sa_instrument_role = 'converter' + return fn + + @staticmethod + def adds(arg): + """Mark the method as adding an entity to the collection. + + Adds "add to collection" handling to the method. The decorator + argument indicates which method argument holds the SQLAlchemy-relevant + value. Arguments can be specified positionally (i.e. integer) or by + name:: + + @collection.adds(1) + def push(self, item): ... + + @collection.adds('entity') + def do_stuff(self, thing, entity=None): ... + + """ + def decorator(fn): + fn._sa_instrument_before = ('fire_append_event', arg) + return fn + return decorator + + @staticmethod + def replaces(arg): + """Mark the method as replacing an entity in the collection. + + Adds "add to collection" and "remove from collection" handling to + the method. The decorator argument indicates which method argument + holds the SQLAlchemy-relevant value to be added, and return value, if + any will be considered the value to remove. + + Arguments can be specified positionally (i.e. integer) or by name:: + + @collection.replaces(2) + def __setitem__(self, index, item): ... + + """ + def decorator(fn): + fn._sa_instrument_before = ('fire_append_event', arg) + fn._sa_instrument_after = 'fire_remove_event' + return fn + return decorator + + @staticmethod + def removes(arg): + """Mark the method as removing an entity in the collection. + + Adds "remove from collection" handling to the method. The decorator + argument indicates which method argument holds the SQLAlchemy-relevant + value to be removed. Arguments can be specified positionally (i.e. + integer) or by name:: + + @collection.removes(1) + def zap(self, item): ... + + For methods where the value to remove is not known at call-time, use + collection.removes_return. + + """ + def decorator(fn): + fn._sa_instrument_before = ('fire_remove_event', arg) + return fn + return decorator + + @staticmethod + def removes_return(): + """Mark the method as removing an entity in the collection. + + Adds "remove from collection" handling to the method. The return + value of the method, if any, is considered the value to remove. The + method arguments are not inspected:: + + @collection.removes_return() + def pop(self): ... + + For methods where the value to remove is known at call-time, use + collection.remove. + + """ + def decorator(fn): + fn._sa_instrument_after = 'fire_remove_event' + return fn + return decorator + + +collection_adapter = operator.attrgetter('_sa_adapter') +"""Fetch the :class:`.CollectionAdapter` for a collection.""" + + +class CollectionAdapter(object): + """Bridges between the ORM and arbitrary Python collections. + + Proxies base-level collection operations (append, remove, iterate) + to the underlying Python collection, and emits add/remove events for + entities entering or leaving the collection. + + The ORM uses :class:`.CollectionAdapter` exclusively for interaction with + entity collections. + + + """ + + __slots__ = ( + 'attr', '_key', '_data', 'owner_state', '_converter', 'invalidated') + + def __init__(self, attr, owner_state, data): + self.attr = attr + self._key = attr.key + self._data = weakref.ref(data) + self.owner_state = owner_state + data._sa_adapter = self + self._converter = data._sa_converter + self.invalidated = False + + def _warn_invalidated(self): + util.warn("This collection has been invalidated.") + + @property + def data(self): + "The entity collection being adapted." + return self._data() + + @property + def _referenced_by_owner(self): + """return True if the owner state still refers to this collection. + + This will return False within a bulk replace operation, + where this collection is the one being replaced. + + """ + return self.owner_state.dict[self._key] is self._data() + + def bulk_appender(self): + return self._data()._sa_appender + + def append_with_event(self, item, initiator=None): + """Add an entity to the collection, firing mutation events.""" + + self._data()._sa_appender(item, _sa_initiator=initiator) + + def append_without_event(self, item): + """Add or restore an entity to the collection, firing no events.""" + self._data()._sa_appender(item, _sa_initiator=False) + + def append_multiple_without_event(self, items): + """Add or restore an entity to the collection, firing no events.""" + appender = self._data()._sa_appender + for item in items: + appender(item, _sa_initiator=False) + + def bulk_remover(self): + return self._data()._sa_remover + + def remove_with_event(self, item, initiator=None): + """Remove an entity from the collection, firing mutation events.""" + self._data()._sa_remover(item, _sa_initiator=initiator) + + def remove_without_event(self, item): + """Remove an entity from the collection, firing no events.""" + self._data()._sa_remover(item, _sa_initiator=False) + + def clear_with_event(self, initiator=None): + """Empty the collection, firing a mutation event for each entity.""" + + remover = self._data()._sa_remover + for item in list(self): + remover(item, _sa_initiator=initiator) + + def clear_without_event(self): + """Empty the collection, firing no events.""" + + remover = self._data()._sa_remover + for item in list(self): + remover(item, _sa_initiator=False) + + def __iter__(self): + """Iterate over entities in the collection.""" + + return iter(self._data()._sa_iterator()) + + def __len__(self): + """Count entities in the collection.""" + return len(list(self._data()._sa_iterator())) + + def __bool__(self): + return True + + __nonzero__ = __bool__ + + def fire_append_event(self, item, initiator=None): + """Notify that a entity has entered the collection. + + Initiator is a token owned by the InstrumentedAttribute that + initiated the membership mutation, and should be left as None + unless you are passing along an initiator value from a chained + operation. + + """ + if initiator is not False: + if self.invalidated: + self._warn_invalidated() + return self.attr.fire_append_event( + self.owner_state, + self.owner_state.dict, + item, initiator) + else: + return item + + def fire_remove_event(self, item, initiator=None): + """Notify that a entity has been removed from the collection. + + Initiator is the InstrumentedAttribute that initiated the membership + mutation, and should be left as None unless you are passing along + an initiator value from a chained operation. + + """ + if initiator is not False: + if self.invalidated: + self._warn_invalidated() + self.attr.fire_remove_event( + self.owner_state, + self.owner_state.dict, + item, initiator) + + def fire_pre_remove_event(self, initiator=None): + """Notify that an entity is about to be removed from the collection. + + Only called if the entity cannot be removed after calling + fire_remove_event(). + + """ + if self.invalidated: + self._warn_invalidated() + self.attr.fire_pre_remove_event( + self.owner_state, + self.owner_state.dict, + initiator=initiator) + + def __getstate__(self): + return {'key': self._key, + 'owner_state': self.owner_state, + 'owner_cls': self.owner_state.class_, + 'data': self.data, + 'invalidated': self.invalidated} + + def __setstate__(self, d): + self._key = d['key'] + self.owner_state = d['owner_state'] + self._data = weakref.ref(d['data']) + self._converter = d['data']._sa_converter + d['data']._sa_adapter = self + self.invalidated = d['invalidated'] + self.attr = getattr(d['owner_cls'], self._key).impl + + +def bulk_replace(values, existing_adapter, new_adapter): + """Load a new collection, firing events based on prior like membership. + + Appends instances in ``values`` onto the ``new_adapter``. Events will be + fired for any instance not present in the ``existing_adapter``. Any + instances in ``existing_adapter`` not present in ``values`` will have + remove events fired upon them. + + :param values: An iterable of collection member instances + + :param existing_adapter: A :class:`.CollectionAdapter` of + instances to be replaced + + :param new_adapter: An empty :class:`.CollectionAdapter` + to load with ``values`` + + + """ + + assert isinstance(values, list) + + idset = util.IdentitySet + existing_idset = idset(existing_adapter or ()) + constants = existing_idset.intersection(values or ()) + additions = idset(values or ()).difference(constants) + removals = existing_idset.difference(constants) + + appender = new_adapter.bulk_appender() + + for member in values or (): + if member in additions: + appender(member) + elif member in constants: + appender(member, _sa_initiator=False) + + if existing_adapter: + remover = existing_adapter.bulk_remover() + for member in removals: + remover(member) + + +def prepare_instrumentation(factory): + """Prepare a callable for future use as a collection class factory. + + Given a collection class factory (either a type or no-arg callable), + return another factory that will produce compatible instances when + called. + + This function is responsible for converting collection_class=list + into the run-time behavior of collection_class=InstrumentedList. + + """ + # Convert a builtin to 'Instrumented*' + if factory in __canned_instrumentation: + factory = __canned_instrumentation[factory] + + # Create a specimen + cls = type(factory()) + + # Did factory callable return a builtin? + if cls in __canned_instrumentation: + # Wrap it so that it returns our 'Instrumented*' + factory = __converting_factory(cls, factory) + cls = factory() + + # Instrument the class if needed. + if __instrumentation_mutex.acquire(): + try: + if getattr(cls, '_sa_instrumented', None) != id(cls): + _instrument_class(cls) + finally: + __instrumentation_mutex.release() + + return factory + + +def __converting_factory(specimen_cls, original_factory): + """Return a wrapper that converts a "canned" collection like + set, dict, list into the Instrumented* version. + + """ + + instrumented_cls = __canned_instrumentation[specimen_cls] + + def wrapper(): + collection = original_factory() + return instrumented_cls(collection) + + # often flawed but better than nothing + wrapper.__name__ = "%sWrapper" % original_factory.__name__ + wrapper.__doc__ = original_factory.__doc__ + + return wrapper + + +def _instrument_class(cls): + """Modify methods in a class and install instrumentation.""" + + # In the normal call flow, a request for any of the 3 basic collection + # types is transformed into one of our trivial subclasses + # (e.g. InstrumentedList). Catch anything else that sneaks in here... + if cls.__module__ == '__builtin__': + raise sa_exc.ArgumentError( + "Can not instrument a built-in type. Use a " + "subclass, even a trivial one.") + + roles, methods = _locate_roles_and_methods(cls) + + _setup_canned_roles(cls, roles, methods) + + _assert_required_roles(cls, roles, methods) + + _set_collection_attributes(cls, roles, methods) + + +def _locate_roles_and_methods(cls): + """search for _sa_instrument_role-decorated methods in + method resolution order, assign to roles. + + """ + + roles = {} + methods = {} + + for supercls in cls.__mro__: + for name, method in vars(supercls).items(): + if not util.callable(method): + continue + + # note role declarations + if hasattr(method, '_sa_instrument_role'): + role = method._sa_instrument_role + assert role in ('appender', 'remover', 'iterator', + 'linker', 'converter') + roles.setdefault(role, name) + + # transfer instrumentation requests from decorated function + # to the combined queue + before, after = None, None + if hasattr(method, '_sa_instrument_before'): + op, argument = method._sa_instrument_before + assert op in ('fire_append_event', 'fire_remove_event') + before = op, argument + if hasattr(method, '_sa_instrument_after'): + op = method._sa_instrument_after + assert op in ('fire_append_event', 'fire_remove_event') + after = op + if before: + methods[name] = before + (after, ) + elif after: + methods[name] = None, None, after + return roles, methods + + +def _setup_canned_roles(cls, roles, methods): + """see if this class has "canned" roles based on a known + collection type (dict, set, list). Apply those roles + as needed to the "roles" dictionary, and also + prepare "decorator" methods + + """ + collection_type = util.duck_type_collection(cls) + if collection_type in __interfaces: + canned_roles, decorators = __interfaces[collection_type] + for role, name in canned_roles.items(): + roles.setdefault(role, name) + + # apply ABC auto-decoration to methods that need it + for method, decorator in decorators.items(): + fn = getattr(cls, method, None) + if (fn and method not in methods and + not hasattr(fn, '_sa_instrumented')): + setattr(cls, method, decorator(fn)) + + +def _assert_required_roles(cls, roles, methods): + """ensure all roles are present, and apply implicit instrumentation if + needed + + """ + if 'appender' not in roles or not hasattr(cls, roles['appender']): + raise sa_exc.ArgumentError( + "Type %s must elect an appender method to be " + "a collection class" % cls.__name__) + elif (roles['appender'] not in methods and + not hasattr(getattr(cls, roles['appender']), '_sa_instrumented')): + methods[roles['appender']] = ('fire_append_event', 1, None) + + if 'remover' not in roles or not hasattr(cls, roles['remover']): + raise sa_exc.ArgumentError( + "Type %s must elect a remover method to be " + "a collection class" % cls.__name__) + elif (roles['remover'] not in methods and + not hasattr(getattr(cls, roles['remover']), '_sa_instrumented')): + methods[roles['remover']] = ('fire_remove_event', 1, None) + + if 'iterator' not in roles or not hasattr(cls, roles['iterator']): + raise sa_exc.ArgumentError( + "Type %s must elect an iterator method to be " + "a collection class" % cls.__name__) + + +def _set_collection_attributes(cls, roles, methods): + """apply ad-hoc instrumentation from decorators, class-level defaults + and implicit role declarations + + """ + for method_name, (before, argument, after) in methods.items(): + setattr(cls, method_name, + _instrument_membership_mutator(getattr(cls, method_name), + before, argument, after)) + # intern the role map + for role, method_name in roles.items(): + setattr(cls, '_sa_%s' % role, getattr(cls, method_name)) + + cls._sa_adapter = None + + if not hasattr(cls, '_sa_converter'): + cls._sa_converter = None + cls._sa_instrumented = id(cls) + + +def _instrument_membership_mutator(method, before, argument, after): + """Route method args and/or return value through the collection + adapter.""" + # This isn't smart enough to handle @adds(1) for 'def fn(self, (a, b))' + if before: + fn_args = list(util.flatten_iterator(inspect_getargspec(method)[0])) + if isinstance(argument, int): + pos_arg = argument + named_arg = len(fn_args) > argument and fn_args[argument] or None + else: + if argument in fn_args: + pos_arg = fn_args.index(argument) + else: + pos_arg = None + named_arg = argument + del fn_args + + def wrapper(*args, **kw): + if before: + if pos_arg is None: + if named_arg not in kw: + raise sa_exc.ArgumentError( + "Missing argument %s" % argument) + value = kw[named_arg] + else: + if len(args) > pos_arg: + value = args[pos_arg] + elif named_arg in kw: + value = kw[named_arg] + else: + raise sa_exc.ArgumentError( + "Missing argument %s" % argument) + + initiator = kw.pop('_sa_initiator', None) + if initiator is False: + executor = None + else: + executor = args[0]._sa_adapter + + if before and executor: + getattr(executor, before)(value, initiator) + + if not after or not executor: + return method(*args, **kw) + else: + res = method(*args, **kw) + if res is not None: + getattr(executor, after)(res, initiator) + return res + + wrapper._sa_instrumented = True + if hasattr(method, "_sa_instrument_role"): + wrapper._sa_instrument_role = method._sa_instrument_role + wrapper.__name__ = method.__name__ + wrapper.__doc__ = method.__doc__ + return wrapper + + +def __set(collection, item, _sa_initiator=None): + """Run set events, may eventually be inlined into decorators.""" + + if _sa_initiator is not False: + executor = collection._sa_adapter + if executor: + item = executor.fire_append_event(item, _sa_initiator) + return item + + +def __del(collection, item, _sa_initiator=None): + """Run del events, may eventually be inlined into decorators.""" + if _sa_initiator is not False: + executor = collection._sa_adapter + if executor: + executor.fire_remove_event(item, _sa_initiator) + + +def __before_delete(collection, _sa_initiator=None): + """Special method to run 'commit existing value' methods""" + executor = collection._sa_adapter + if executor: + executor.fire_pre_remove_event(_sa_initiator) + + +def _list_decorators(): + """Tailored instrumentation wrappers for any list-like class.""" + + def _tidy(fn): + fn._sa_instrumented = True + fn.__doc__ = getattr(list, fn.__name__).__doc__ + + def append(fn): + def append(self, item, _sa_initiator=None): + item = __set(self, item, _sa_initiator) + fn(self, item) + _tidy(append) + return append + + def remove(fn): + def remove(self, value, _sa_initiator=None): + __before_delete(self, _sa_initiator) + # testlib.pragma exempt:__eq__ + fn(self, value) + __del(self, value, _sa_initiator) + _tidy(remove) + return remove + + def insert(fn): + def insert(self, index, value): + value = __set(self, value) + fn(self, index, value) + _tidy(insert) + return insert + + def __setitem__(fn): + def __setitem__(self, index, value): + if not isinstance(index, slice): + existing = self[index] + if existing is not None: + __del(self, existing) + value = __set(self, value) + fn(self, index, value) + else: + # slice assignment requires __delitem__, insert, __len__ + step = index.step or 1 + start = index.start or 0 + if start < 0: + start += len(self) + if index.stop is not None: + stop = index.stop + else: + stop = len(self) + if stop < 0: + stop += len(self) + + if step == 1: + for i in range(start, stop, step): + if len(self) > start: + del self[start] + + for i, item in enumerate(value): + self.insert(i + start, item) + else: + rng = list(range(start, stop, step)) + if len(value) != len(rng): + raise ValueError( + "attempt to assign sequence of size %s to " + "extended slice of size %s" % (len(value), + len(rng))) + for i, item in zip(rng, value): + self.__setitem__(i, item) + _tidy(__setitem__) + return __setitem__ + + def __delitem__(fn): + def __delitem__(self, index): + if not isinstance(index, slice): + item = self[index] + __del(self, item) + fn(self, index) + else: + # slice deletion requires __getslice__ and a slice-groking + # __getitem__ for stepped deletion + # note: not breaking this into atomic dels + for item in self[index]: + __del(self, item) + fn(self, index) + _tidy(__delitem__) + return __delitem__ + + if util.py2k: + def __setslice__(fn): + def __setslice__(self, start, end, values): + for value in self[start:end]: + __del(self, value) + values = [__set(self, value) for value in values] + fn(self, start, end, values) + _tidy(__setslice__) + return __setslice__ + + def __delslice__(fn): + def __delslice__(self, start, end): + for value in self[start:end]: + __del(self, value) + fn(self, start, end) + _tidy(__delslice__) + return __delslice__ + + def extend(fn): + def extend(self, iterable): + for value in iterable: + self.append(value) + _tidy(extend) + return extend + + def __iadd__(fn): + def __iadd__(self, iterable): + # list.__iadd__ takes any iterable and seems to let TypeError + # raise as-is instead of returning NotImplemented + for value in iterable: + self.append(value) + return self + _tidy(__iadd__) + return __iadd__ + + def pop(fn): + def pop(self, index=-1): + __before_delete(self) + item = fn(self, index) + __del(self, item) + return item + _tidy(pop) + return pop + + if not util.py2k: + def clear(fn): + def clear(self, index=-1): + for item in self: + __del(self, item) + fn(self) + _tidy(clear) + return clear + + # __imul__ : not wrapping this. all members of the collection are already + # present, so no need to fire appends... wrapping it with an explicit + # decorator is still possible, so events on *= can be had if they're + # desired. hard to imagine a use case for __imul__, though. + + l = locals().copy() + l.pop('_tidy') + return l + + +def _dict_decorators(): + """Tailored instrumentation wrappers for any dict-like mapping class.""" + + def _tidy(fn): + fn._sa_instrumented = True + fn.__doc__ = getattr(dict, fn.__name__).__doc__ + + Unspecified = util.symbol('Unspecified') + + def __setitem__(fn): + def __setitem__(self, key, value, _sa_initiator=None): + if key in self: + __del(self, self[key], _sa_initiator) + value = __set(self, value, _sa_initiator) + fn(self, key, value) + _tidy(__setitem__) + return __setitem__ + + def __delitem__(fn): + def __delitem__(self, key, _sa_initiator=None): + if key in self: + __del(self, self[key], _sa_initiator) + fn(self, key) + _tidy(__delitem__) + return __delitem__ + + def clear(fn): + def clear(self): + for key in self: + __del(self, self[key]) + fn(self) + _tidy(clear) + return clear + + def pop(fn): + def pop(self, key, default=Unspecified): + if key in self: + __del(self, self[key]) + if default is Unspecified: + return fn(self, key) + else: + return fn(self, key, default) + _tidy(pop) + return pop + + def popitem(fn): + def popitem(self): + __before_delete(self) + item = fn(self) + __del(self, item[1]) + return item + _tidy(popitem) + return popitem + + def setdefault(fn): + def setdefault(self, key, default=None): + if key not in self: + self.__setitem__(key, default) + return default + else: + return self.__getitem__(key) + _tidy(setdefault) + return setdefault + + def update(fn): + def update(self, __other=Unspecified, **kw): + if __other is not Unspecified: + if hasattr(__other, 'keys'): + for key in list(__other): + if (key not in self or + self[key] is not __other[key]): + self[key] = __other[key] + else: + for key, value in __other: + if key not in self or self[key] is not value: + self[key] = value + for key in kw: + if key not in self or self[key] is not kw[key]: + self[key] = kw[key] + _tidy(update) + return update + + l = locals().copy() + l.pop('_tidy') + l.pop('Unspecified') + return l + +_set_binop_bases = (set, frozenset) + + +def _set_binops_check_strict(self, obj): + """Allow only set, frozenset and self.__class__-derived + objects in binops.""" + return isinstance(obj, _set_binop_bases + (self.__class__,)) + + +def _set_binops_check_loose(self, obj): + """Allow anything set-like to participate in set binops.""" + return (isinstance(obj, _set_binop_bases + (self.__class__,)) or + util.duck_type_collection(obj) == set) + + +def _set_decorators(): + """Tailored instrumentation wrappers for any set-like class.""" + + def _tidy(fn): + fn._sa_instrumented = True + fn.__doc__ = getattr(set, fn.__name__).__doc__ + + Unspecified = util.symbol('Unspecified') + + def add(fn): + def add(self, value, _sa_initiator=None): + if value not in self: + value = __set(self, value, _sa_initiator) + # testlib.pragma exempt:__hash__ + fn(self, value) + _tidy(add) + return add + + def discard(fn): + def discard(self, value, _sa_initiator=None): + # testlib.pragma exempt:__hash__ + if value in self: + __del(self, value, _sa_initiator) + # testlib.pragma exempt:__hash__ + fn(self, value) + _tidy(discard) + return discard + + def remove(fn): + def remove(self, value, _sa_initiator=None): + # testlib.pragma exempt:__hash__ + if value in self: + __del(self, value, _sa_initiator) + # testlib.pragma exempt:__hash__ + fn(self, value) + _tidy(remove) + return remove + + def pop(fn): + def pop(self): + __before_delete(self) + item = fn(self) + __del(self, item) + return item + _tidy(pop) + return pop + + def clear(fn): + def clear(self): + for item in list(self): + self.remove(item) + _tidy(clear) + return clear + + def update(fn): + def update(self, value): + for item in value: + self.add(item) + _tidy(update) + return update + + def __ior__(fn): + def __ior__(self, value): + if not _set_binops_check_strict(self, value): + return NotImplemented + for item in value: + self.add(item) + return self + _tidy(__ior__) + return __ior__ + + def difference_update(fn): + def difference_update(self, value): + for item in value: + self.discard(item) + _tidy(difference_update) + return difference_update + + def __isub__(fn): + def __isub__(self, value): + if not _set_binops_check_strict(self, value): + return NotImplemented + for item in value: + self.discard(item) + return self + _tidy(__isub__) + return __isub__ + + def intersection_update(fn): + def intersection_update(self, other): + want, have = self.intersection(other), set(self) + remove, add = have - want, want - have + + for item in remove: + self.remove(item) + for item in add: + self.add(item) + _tidy(intersection_update) + return intersection_update + + def __iand__(fn): + def __iand__(self, other): + if not _set_binops_check_strict(self, other): + return NotImplemented + want, have = self.intersection(other), set(self) + remove, add = have - want, want - have + + for item in remove: + self.remove(item) + for item in add: + self.add(item) + return self + _tidy(__iand__) + return __iand__ + + def symmetric_difference_update(fn): + def symmetric_difference_update(self, other): + want, have = self.symmetric_difference(other), set(self) + remove, add = have - want, want - have + + for item in remove: + self.remove(item) + for item in add: + self.add(item) + _tidy(symmetric_difference_update) + return symmetric_difference_update + + def __ixor__(fn): + def __ixor__(self, other): + if not _set_binops_check_strict(self, other): + return NotImplemented + want, have = self.symmetric_difference(other), set(self) + remove, add = have - want, want - have + + for item in remove: + self.remove(item) + for item in add: + self.add(item) + return self + _tidy(__ixor__) + return __ixor__ + + l = locals().copy() + l.pop('_tidy') + l.pop('Unspecified') + return l + + +class InstrumentedList(list): + """An instrumented version of the built-in list.""" + + +class InstrumentedSet(set): + """An instrumented version of the built-in set.""" + + +class InstrumentedDict(dict): + """An instrumented version of the built-in dict.""" + + +__canned_instrumentation = { + list: InstrumentedList, + set: InstrumentedSet, + dict: InstrumentedDict, +} + +__interfaces = { + list: ( + {'appender': 'append', 'remover': 'remove', + 'iterator': '__iter__'}, _list_decorators() + ), + + set: ({'appender': 'add', + 'remover': 'remove', + 'iterator': '__iter__'}, _set_decorators() + ), + + # decorators are required for dicts and object collections. + dict: ({'iterator': 'values'}, _dict_decorators()) if util.py3k + else ({'iterator': 'itervalues'}, _dict_decorators()), +} + + +class MappedCollection(dict): + """A basic dictionary-based collection class. + + Extends dict with the minimal bag semantics that collection + classes require. ``set`` and ``remove`` are implemented in terms + of a keying function: any callable that takes an object and + returns an object for use as a dictionary key. + + """ + + def __init__(self, keyfunc): + """Create a new collection with keying provided by keyfunc. + + keyfunc may be any callable that takes an object and returns an object + for use as a dictionary key. + + The keyfunc will be called every time the ORM needs to add a member by + value-only (such as when loading instances from the database) or + remove a member. The usual cautions about dictionary keying apply- + ``keyfunc(object)`` should return the same output for the life of the + collection. Keying based on mutable properties can result in + unreachable instances "lost" in the collection. + + """ + self.keyfunc = keyfunc + + @collection.appender + @collection.internally_instrumented + def set(self, value, _sa_initiator=None): + """Add an item by value, consulting the keyfunc for the key.""" + + key = self.keyfunc(value) + self.__setitem__(key, value, _sa_initiator) + + @collection.remover + @collection.internally_instrumented + def remove(self, value, _sa_initiator=None): + """Remove an item by value, consulting the keyfunc for the key.""" + + key = self.keyfunc(value) + # Let self[key] raise if key is not in this collection + # testlib.pragma exempt:__ne__ + if self[key] != value: + raise sa_exc.InvalidRequestError( + "Can not remove '%s': collection holds '%s' for key '%s'. " + "Possible cause: is the MappedCollection key function " + "based on mutable properties or properties that only obtain " + "values after flush?" % + (value, self[key], key)) + self.__delitem__(key, _sa_initiator) + + @collection.converter + def _convert(self, dictlike): + """Validate and convert a dict-like object into values for set()ing. + + This is called behind the scenes when a MappedCollection is replaced + entirely by another collection, as in:: + + myobj.mappedcollection = {'a':obj1, 'b': obj2} # ... + + Raises a TypeError if the key in any (key, value) pair in the dictlike + object does not match the key that this collection's keyfunc would + have assigned for that value. + + """ + for incoming_key, value in util.dictlike_iteritems(dictlike): + new_key = self.keyfunc(value) + if incoming_key != new_key: + raise TypeError( + "Found incompatible key %r for value %r; this " + "collection's " + "keying function requires a key of %r for this value." % ( + incoming_key, value, new_key)) + yield value + +# ensure instrumentation is associated with +# these built-in classes; if a user-defined class +# subclasses these and uses @internally_instrumented, +# the superclass is otherwise not instrumented. +# see [ticket:2406]. +_instrument_class(MappedCollection) +_instrument_class(InstrumentedList) +_instrument_class(InstrumentedSet) diff --git a/app/lib/sqlalchemy/orm/dependency.py b/app/lib/sqlalchemy/orm/dependency.py new file mode 100644 index 0000000..a87ec56 --- /dev/null +++ b/app/lib/sqlalchemy/orm/dependency.py @@ -0,0 +1,1175 @@ +# orm/dependency.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Relationship dependencies. + +""" + +from .. import sql, util, exc as sa_exc +from . import attributes, exc, sync, unitofwork, \ + util as mapperutil +from .interfaces import ONETOMANY, MANYTOONE, MANYTOMANY + + +class DependencyProcessor(object): + def __init__(self, prop): + self.prop = prop + self.cascade = prop.cascade + self.mapper = prop.mapper + self.parent = prop.parent + self.secondary = prop.secondary + self.direction = prop.direction + self.post_update = prop.post_update + self.passive_deletes = prop.passive_deletes + self.passive_updates = prop.passive_updates + self.enable_typechecks = prop.enable_typechecks + if self.passive_deletes: + self._passive_delete_flag = attributes.PASSIVE_NO_INITIALIZE + else: + self._passive_delete_flag = attributes.PASSIVE_OFF + if self.passive_updates: + self._passive_update_flag = attributes.PASSIVE_NO_INITIALIZE + else: + self._passive_update_flag = attributes.PASSIVE_OFF + + self.key = prop.key + if not self.prop.synchronize_pairs: + raise sa_exc.ArgumentError( + "Can't build a DependencyProcessor for relationship %s. " + "No target attributes to populate between parent and " + "child are present" % + self.prop) + + @classmethod + def from_relationship(cls, prop): + return _direction_to_processor[prop.direction](prop) + + def hasparent(self, state): + """return True if the given object instance has a parent, + according to the ``InstrumentedAttribute`` handled by this + ``DependencyProcessor``. + + """ + return self.parent.class_manager.get_impl(self.key).hasparent(state) + + def per_property_preprocessors(self, uow): + """establish actions and dependencies related to a flush. + + These actions will operate on all relevant states in + the aggregate. + + """ + uow.register_preprocessor(self, True) + + def per_property_flush_actions(self, uow): + after_save = unitofwork.ProcessAll(uow, self, False, True) + before_delete = unitofwork.ProcessAll(uow, self, True, True) + + parent_saves = unitofwork.SaveUpdateAll( + uow, + self.parent.primary_base_mapper + ) + child_saves = unitofwork.SaveUpdateAll( + uow, + self.mapper.primary_base_mapper + ) + + parent_deletes = unitofwork.DeleteAll( + uow, + self.parent.primary_base_mapper + ) + child_deletes = unitofwork.DeleteAll( + uow, + self.mapper.primary_base_mapper + ) + + self.per_property_dependencies(uow, + parent_saves, + child_saves, + parent_deletes, + child_deletes, + after_save, + before_delete + ) + + def per_state_flush_actions(self, uow, states, isdelete): + """establish actions and dependencies related to a flush. + + These actions will operate on all relevant states + individually. This occurs only if there are cycles + in the 'aggregated' version of events. + + """ + + parent_base_mapper = self.parent.primary_base_mapper + child_base_mapper = self.mapper.primary_base_mapper + child_saves = unitofwork.SaveUpdateAll(uow, child_base_mapper) + child_deletes = unitofwork.DeleteAll(uow, child_base_mapper) + + # locate and disable the aggregate processors + # for this dependency + + if isdelete: + before_delete = unitofwork.ProcessAll(uow, self, True, True) + before_delete.disabled = True + else: + after_save = unitofwork.ProcessAll(uow, self, False, True) + after_save.disabled = True + + # check if the "child" side is part of the cycle + + if child_saves not in uow.cycles: + # based on the current dependencies we use, the saves/ + # deletes should always be in the 'cycles' collection + # together. if this changes, we will have to break up + # this method a bit more. + assert child_deletes not in uow.cycles + + # child side is not part of the cycle, so we will link per-state + # actions to the aggregate "saves", "deletes" actions + child_actions = [ + (child_saves, False), (child_deletes, True) + ] + child_in_cycles = False + else: + child_in_cycles = True + + # check if the "parent" side is part of the cycle + if not isdelete: + parent_saves = unitofwork.SaveUpdateAll( + uow, + self.parent.base_mapper) + parent_deletes = before_delete = None + if parent_saves in uow.cycles: + parent_in_cycles = True + else: + parent_deletes = unitofwork.DeleteAll( + uow, + self.parent.base_mapper) + parent_saves = after_save = None + if parent_deletes in uow.cycles: + parent_in_cycles = True + + # now create actions /dependencies for each state. + + for state in states: + # detect if there's anything changed or loaded + # by a preprocessor on this state/attribute. In the + # case of deletes we may try to load missing items here as well. + sum_ = state.manager[self.key].impl.get_all_pending( + state, state.dict, + self._passive_delete_flag + if isdelete + else attributes.PASSIVE_NO_INITIALIZE) + + if not sum_: + continue + + if isdelete: + before_delete = unitofwork.ProcessState(uow, + self, True, state) + if parent_in_cycles: + parent_deletes = unitofwork.DeleteState( + uow, + state, + parent_base_mapper) + else: + after_save = unitofwork.ProcessState(uow, self, False, state) + if parent_in_cycles: + parent_saves = unitofwork.SaveUpdateState( + uow, + state, + parent_base_mapper) + + if child_in_cycles: + child_actions = [] + for child_state, child in sum_: + if child_state not in uow.states: + child_action = (None, None) + else: + (deleted, listonly) = uow.states[child_state] + if deleted: + child_action = ( + unitofwork.DeleteState( + uow, child_state, + child_base_mapper), + True) + else: + child_action = ( + unitofwork.SaveUpdateState( + uow, child_state, + child_base_mapper), + False) + child_actions.append(child_action) + + # establish dependencies between our possibly per-state + # parent action and our possibly per-state child action. + for child_action, childisdelete in child_actions: + self.per_state_dependencies(uow, parent_saves, + parent_deletes, + child_action, + after_save, before_delete, + isdelete, childisdelete) + + def presort_deletes(self, uowcommit, states): + return False + + def presort_saves(self, uowcommit, states): + return False + + def process_deletes(self, uowcommit, states): + pass + + def process_saves(self, uowcommit, states): + pass + + def prop_has_changes(self, uowcommit, states, isdelete): + if not isdelete or self.passive_deletes: + passive = attributes.PASSIVE_NO_INITIALIZE + elif self.direction is MANYTOONE: + passive = attributes.PASSIVE_NO_FETCH_RELATED + else: + passive = attributes.PASSIVE_OFF + + for s in states: + # TODO: add a high speed method + # to InstanceState which returns: attribute + # has a non-None value, or had one + history = uowcommit.get_attribute_history( + s, + self.key, + passive) + if history and not history.empty(): + return True + else: + return states and \ + not self.prop._is_self_referential and \ + self.mapper in uowcommit.mappers + + def _verify_canload(self, state): + if self.prop.uselist and state is None: + raise exc.FlushError( + "Can't flush None value found in " + "collection %s" % (self.prop, )) + elif state is not None and \ + not self.mapper._canload( + state, allow_subtypes=not self.enable_typechecks): + if self.mapper._canload(state, allow_subtypes=True): + raise exc.FlushError('Attempting to flush an item of type ' + '%(x)s as a member of collection ' + '"%(y)s". Expected an object of type ' + '%(z)s or a polymorphic subclass of ' + 'this type. If %(x)s is a subclass of ' + '%(z)s, configure mapper "%(zm)s" to ' + 'load this subtype polymorphically, or ' + 'set enable_typechecks=False to allow ' + 'any subtype to be accepted for flush. ' + % { + 'x': state.class_, + 'y': self.prop, + 'z': self.mapper.class_, + 'zm': self.mapper, + }) + else: + raise exc.FlushError( + 'Attempting to flush an item of type ' + '%(x)s as a member of collection ' + '"%(y)s". Expected an object of type ' + '%(z)s or a polymorphic subclass of ' + 'this type.' % { + 'x': state.class_, + 'y': self.prop, + 'z': self.mapper.class_, + }) + + def _synchronize(self, state, child, associationrow, + clearkeys, uowcommit): + raise NotImplementedError() + + def _get_reversed_processed_set(self, uow): + if not self.prop._reverse_property: + return None + + process_key = tuple(sorted( + [self.key] + + [p.key for p in self.prop._reverse_property] + )) + return uow.memo( + ('reverse_key', process_key), + set + ) + + def _post_update(self, state, uowcommit, related, is_m2o_delete=False): + for x in related: + if not is_m2o_delete or x is not None: + uowcommit.issue_post_update( + state, + [r for l, r in self.prop.synchronize_pairs] + ) + break + + def _pks_changed(self, uowcommit, state): + raise NotImplementedError() + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, self.prop) + + +class OneToManyDP(DependencyProcessor): + + def per_property_dependencies(self, uow, parent_saves, + child_saves, + parent_deletes, + child_deletes, + after_save, + before_delete, + ): + if self.post_update: + child_post_updates = unitofwork.IssuePostUpdate( + uow, + self.mapper.primary_base_mapper, + False) + child_pre_updates = unitofwork.IssuePostUpdate( + uow, + self.mapper.primary_base_mapper, + True) + + uow.dependencies.update([ + (child_saves, after_save), + (parent_saves, after_save), + (after_save, child_post_updates), + + (before_delete, child_pre_updates), + (child_pre_updates, parent_deletes), + (child_pre_updates, child_deletes), + + ]) + else: + uow.dependencies.update([ + (parent_saves, after_save), + (after_save, child_saves), + (after_save, child_deletes), + + (child_saves, parent_deletes), + (child_deletes, parent_deletes), + + (before_delete, child_saves), + (before_delete, child_deletes), + ]) + + def per_state_dependencies(self, uow, + save_parent, + delete_parent, + child_action, + after_save, before_delete, + isdelete, childisdelete): + + if self.post_update: + + child_post_updates = unitofwork.IssuePostUpdate( + uow, + self.mapper.primary_base_mapper, + False) + child_pre_updates = unitofwork.IssuePostUpdate( + uow, + self.mapper.primary_base_mapper, + True) + + # TODO: this whole block is not covered + # by any tests + if not isdelete: + if childisdelete: + uow.dependencies.update([ + (child_action, after_save), + (after_save, child_post_updates), + ]) + else: + uow.dependencies.update([ + (save_parent, after_save), + (child_action, after_save), + (after_save, child_post_updates), + ]) + else: + if childisdelete: + uow.dependencies.update([ + (before_delete, child_pre_updates), + (child_pre_updates, delete_parent), + ]) + else: + uow.dependencies.update([ + (before_delete, child_pre_updates), + (child_pre_updates, delete_parent), + ]) + elif not isdelete: + uow.dependencies.update([ + (save_parent, after_save), + (after_save, child_action), + (save_parent, child_action) + ]) + else: + uow.dependencies.update([ + (before_delete, child_action), + (child_action, delete_parent) + ]) + + def presort_deletes(self, uowcommit, states): + # head object is being deleted, and we manage its list of + # child objects the child objects have to have their + # foreign key to the parent set to NULL + should_null_fks = not self.cascade.delete and \ + not self.passive_deletes == 'all' + + for state in states: + history = uowcommit.get_attribute_history( + state, + self.key, + self._passive_delete_flag) + if history: + for child in history.deleted: + if child is not None and self.hasparent(child) is False: + if self.cascade.delete_orphan: + uowcommit.register_object(child, isdelete=True) + else: + uowcommit.register_object(child) + + if should_null_fks: + for child in history.unchanged: + if child is not None: + uowcommit.register_object( + child, operation="delete", prop=self.prop) + + def presort_saves(self, uowcommit, states): + children_added = uowcommit.memo(('children_added', self), set) + + for state in states: + pks_changed = self._pks_changed(uowcommit, state) + + if not pks_changed or self.passive_updates: + passive = attributes.PASSIVE_NO_INITIALIZE + else: + passive = attributes.PASSIVE_OFF + + history = uowcommit.get_attribute_history( + state, + self.key, + passive) + if history: + for child in history.added: + if child is not None: + uowcommit.register_object(child, cancel_delete=True, + operation="add", + prop=self.prop) + + children_added.update(history.added) + + for child in history.deleted: + if not self.cascade.delete_orphan: + uowcommit.register_object(child, isdelete=False, + operation='delete', + prop=self.prop) + elif self.hasparent(child) is False: + uowcommit.register_object( + child, isdelete=True, + operation="delete", prop=self.prop) + for c, m, st_, dct_ in self.mapper.cascade_iterator( + 'delete', child): + uowcommit.register_object( + st_, + isdelete=True) + + if pks_changed: + if history: + for child in history.unchanged: + if child is not None: + uowcommit.register_object( + child, + False, + self.passive_updates, + operation="pk change", + prop=self.prop) + + def process_deletes(self, uowcommit, states): + # head object is being deleted, and we manage its list of + # child objects the child objects have to have their foreign + # key to the parent set to NULL this phase can be called + # safely for any cascade but is unnecessary if delete cascade + # is on. + + if self.post_update or not self.passive_deletes == 'all': + children_added = uowcommit.memo(('children_added', self), set) + + for state in states: + history = uowcommit.get_attribute_history( + state, + self.key, + self._passive_delete_flag) + if history: + for child in history.deleted: + if child is not None and \ + self.hasparent(child) is False: + self._synchronize( + state, + child, + None, True, + uowcommit, False) + if self.post_update and child: + self._post_update(child, uowcommit, [state]) + + if self.post_update or not self.cascade.delete: + for child in set(history.unchanged).\ + difference(children_added): + if child is not None: + self._synchronize( + state, + child, + None, True, + uowcommit, False) + if self.post_update and child: + self._post_update(child, + uowcommit, + [state]) + + # technically, we can even remove each child from the + # collection here too. but this would be a somewhat + # inconsistent behavior since it wouldn't happen + # if the old parent wasn't deleted but child was moved. + + def process_saves(self, uowcommit, states): + for state in states: + history = uowcommit.get_attribute_history( + state, + self.key, + attributes.PASSIVE_NO_INITIALIZE) + if history: + for child in history.added: + self._synchronize(state, child, None, + False, uowcommit, False) + if child is not None and self.post_update: + self._post_update(child, uowcommit, [state]) + + for child in history.deleted: + if not self.cascade.delete_orphan and \ + not self.hasparent(child): + self._synchronize(state, child, None, True, + uowcommit, False) + + if self._pks_changed(uowcommit, state): + for child in history.unchanged: + self._synchronize(state, child, None, + False, uowcommit, True) + + def _synchronize(self, state, child, + associationrow, clearkeys, uowcommit, + pks_changed): + source = state + dest = child + self._verify_canload(child) + if dest is None or \ + (not self.post_update and uowcommit.is_deleted(dest)): + return + if clearkeys: + sync.clear(dest, self.mapper, self.prop.synchronize_pairs) + else: + sync.populate(source, self.parent, dest, self.mapper, + self.prop.synchronize_pairs, uowcommit, + self.passive_updates and pks_changed) + + def _pks_changed(self, uowcommit, state): + return sync.source_modified( + uowcommit, + state, + self.parent, + self.prop.synchronize_pairs) + + +class ManyToOneDP(DependencyProcessor): + def __init__(self, prop): + DependencyProcessor.__init__(self, prop) + self.mapper._dependency_processors.append(DetectKeySwitch(prop)) + + def per_property_dependencies(self, uow, + parent_saves, + child_saves, + parent_deletes, + child_deletes, + after_save, + before_delete): + + if self.post_update: + parent_post_updates = unitofwork.IssuePostUpdate( + uow, + self.parent.primary_base_mapper, + False) + parent_pre_updates = unitofwork.IssuePostUpdate( + uow, + self.parent.primary_base_mapper, + True) + + uow.dependencies.update([ + (child_saves, after_save), + (parent_saves, after_save), + (after_save, parent_post_updates), + + (after_save, parent_pre_updates), + (before_delete, parent_pre_updates), + + (parent_pre_updates, child_deletes), + ]) + else: + uow.dependencies.update([ + (child_saves, after_save), + (after_save, parent_saves), + (parent_saves, child_deletes), + (parent_deletes, child_deletes) + ]) + + def per_state_dependencies(self, uow, + save_parent, + delete_parent, + child_action, + after_save, before_delete, + isdelete, childisdelete): + + if self.post_update: + + if not isdelete: + parent_post_updates = unitofwork.IssuePostUpdate( + uow, + self.parent.primary_base_mapper, + False) + if childisdelete: + uow.dependencies.update([ + (after_save, parent_post_updates), + (parent_post_updates, child_action) + ]) + else: + uow.dependencies.update([ + (save_parent, after_save), + (child_action, after_save), + + (after_save, parent_post_updates) + ]) + else: + parent_pre_updates = unitofwork.IssuePostUpdate( + uow, + self.parent.primary_base_mapper, + True) + + uow.dependencies.update([ + (before_delete, parent_pre_updates), + (parent_pre_updates, delete_parent), + (parent_pre_updates, child_action) + ]) + + elif not isdelete: + if not childisdelete: + uow.dependencies.update([ + (child_action, after_save), + (after_save, save_parent), + ]) + else: + uow.dependencies.update([ + (after_save, save_parent), + ]) + + else: + if childisdelete: + uow.dependencies.update([ + (delete_parent, child_action) + ]) + + def presort_deletes(self, uowcommit, states): + if self.cascade.delete or self.cascade.delete_orphan: + for state in states: + history = uowcommit.get_attribute_history( + state, + self.key, + self._passive_delete_flag) + if history: + if self.cascade.delete_orphan: + todelete = history.sum() + else: + todelete = history.non_deleted() + for child in todelete: + if child is None: + continue + uowcommit.register_object( + child, isdelete=True, + operation="delete", prop=self.prop) + t = self.mapper.cascade_iterator('delete', child) + for c, m, st_, dct_ in t: + uowcommit.register_object( + st_, isdelete=True) + + def presort_saves(self, uowcommit, states): + for state in states: + uowcommit.register_object(state, operation="add", prop=self.prop) + if self.cascade.delete_orphan: + history = uowcommit.get_attribute_history( + state, + self.key, + self._passive_delete_flag) + if history: + for child in history.deleted: + if self.hasparent(child) is False: + uowcommit.register_object( + child, isdelete=True, + operation="delete", prop=self.prop) + + t = self.mapper.cascade_iterator('delete', child) + for c, m, st_, dct_ in t: + uowcommit.register_object(st_, isdelete=True) + + def process_deletes(self, uowcommit, states): + if self.post_update and \ + not self.cascade.delete_orphan and \ + not self.passive_deletes == 'all': + + # post_update means we have to update our + # row to not reference the child object + # before we can DELETE the row + for state in states: + self._synchronize(state, None, None, True, uowcommit) + if state and self.post_update: + history = uowcommit.get_attribute_history( + state, + self.key, + self._passive_delete_flag) + if history: + self._post_update( + state, uowcommit, history.sum(), + is_m2o_delete=True) + + def process_saves(self, uowcommit, states): + for state in states: + history = uowcommit.get_attribute_history( + state, + self.key, + attributes.PASSIVE_NO_INITIALIZE) + if history: + if history.added: + for child in history.added: + self._synchronize(state, child, None, False, + uowcommit, "add") + if self.post_update: + self._post_update(state, uowcommit, history.sum()) + + def _synchronize(self, state, child, associationrow, + clearkeys, uowcommit, operation=None): + if state is None or \ + (not self.post_update and uowcommit.is_deleted(state)): + return + + if operation is not None and \ + child is not None and \ + not uowcommit.session._contains_state(child): + util.warn( + "Object of type %s not in session, %s " + "operation along '%s' won't proceed" % + (mapperutil.state_class_str(child), operation, self.prop)) + return + + if clearkeys or child is None: + sync.clear(state, self.parent, self.prop.synchronize_pairs) + else: + self._verify_canload(child) + sync.populate(child, self.mapper, state, + self.parent, + self.prop.synchronize_pairs, + uowcommit, + False) + + +class DetectKeySwitch(DependencyProcessor): + """For many-to-one relationships with no one-to-many backref, + searches for parents through the unit of work when a primary + key has changed and updates them. + + Theoretically, this approach could be expanded to support transparent + deletion of objects referenced via many-to-one as well, although + the current attribute system doesn't do enough bookkeeping for this + to be efficient. + + """ + + def per_property_preprocessors(self, uow): + if self.prop._reverse_property: + if self.passive_updates: + return + else: + if False in (prop.passive_updates for + prop in self.prop._reverse_property): + return + + uow.register_preprocessor(self, False) + + def per_property_flush_actions(self, uow): + parent_saves = unitofwork.SaveUpdateAll( + uow, + self.parent.base_mapper) + after_save = unitofwork.ProcessAll(uow, self, False, False) + uow.dependencies.update([ + (parent_saves, after_save) + ]) + + def per_state_flush_actions(self, uow, states, isdelete): + pass + + def presort_deletes(self, uowcommit, states): + pass + + def presort_saves(self, uow, states): + if not self.passive_updates: + # for non-passive updates, register in the preprocess stage + # so that mapper save_obj() gets a hold of changes + self._process_key_switches(states, uow) + + def prop_has_changes(self, uow, states, isdelete): + if not isdelete and self.passive_updates: + d = self._key_switchers(uow, states) + return bool(d) + + return False + + def process_deletes(self, uowcommit, states): + assert False + + def process_saves(self, uowcommit, states): + # for passive updates, register objects in the process stage + # so that we avoid ManyToOneDP's registering the object without + # the listonly flag in its own preprocess stage (results in UPDATE) + # statements being emitted + assert self.passive_updates + self._process_key_switches(states, uowcommit) + + def _key_switchers(self, uow, states): + switched, notswitched = uow.memo( + ('pk_switchers', self), + lambda: (set(), set()) + ) + + allstates = switched.union(notswitched) + for s in states: + if s not in allstates: + if self._pks_changed(uow, s): + switched.add(s) + else: + notswitched.add(s) + return switched + + def _process_key_switches(self, deplist, uowcommit): + switchers = self._key_switchers(uowcommit, deplist) + if switchers: + # if primary key values have actually changed somewhere, perform + # a linear search through the UOW in search of a parent. + for state in uowcommit.session.identity_map.all_states(): + if not issubclass(state.class_, self.parent.class_): + continue + dict_ = state.dict + related = state.get_impl(self.key).get( + state, dict_, passive=self._passive_update_flag) + if related is not attributes.PASSIVE_NO_RESULT and \ + related is not None: + related_state = attributes.instance_state(dict_[self.key]) + if related_state in switchers: + uowcommit.register_object(state, + False, + self.passive_updates) + sync.populate( + related_state, + self.mapper, state, + self.parent, self.prop.synchronize_pairs, + uowcommit, self.passive_updates) + + def _pks_changed(self, uowcommit, state): + return bool(state.key) and sync.source_modified( + uowcommit, state, self.mapper, self.prop.synchronize_pairs) + + +class ManyToManyDP(DependencyProcessor): + + def per_property_dependencies(self, uow, parent_saves, + child_saves, + parent_deletes, + child_deletes, + after_save, + before_delete + ): + + uow.dependencies.update([ + (parent_saves, after_save), + (child_saves, after_save), + (after_save, child_deletes), + + # a rowswitch on the parent from deleted to saved + # can make this one occur, as the "save" may remove + # an element from the + # "deleted" list before we have a chance to + # process its child rows + (before_delete, parent_saves), + + (before_delete, parent_deletes), + (before_delete, child_deletes), + (before_delete, child_saves), + ]) + + def per_state_dependencies(self, uow, + save_parent, + delete_parent, + child_action, + after_save, before_delete, + isdelete, childisdelete): + if not isdelete: + if childisdelete: + uow.dependencies.update([ + (save_parent, after_save), + (after_save, child_action), + ]) + else: + uow.dependencies.update([ + (save_parent, after_save), + (child_action, after_save), + ]) + else: + uow.dependencies.update([ + (before_delete, child_action), + (before_delete, delete_parent) + ]) + + def presort_deletes(self, uowcommit, states): + # TODO: no tests fail if this whole + # thing is removed !!!! + if not self.passive_deletes: + # if no passive deletes, load history on + # the collection, so that prop_has_changes() + # returns True + for state in states: + uowcommit.get_attribute_history( + state, + self.key, + self._passive_delete_flag) + + def presort_saves(self, uowcommit, states): + if not self.passive_updates: + # if no passive updates, load history on + # each collection where parent has changed PK, + # so that prop_has_changes() returns True + for state in states: + if self._pks_changed(uowcommit, state): + history = uowcommit.get_attribute_history( + state, + self.key, + attributes.PASSIVE_OFF) + + if not self.cascade.delete_orphan: + return + + # check for child items removed from the collection + # if delete_orphan check is turned on. + for state in states: + history = uowcommit.get_attribute_history( + state, + self.key, + attributes.PASSIVE_NO_INITIALIZE) + if history: + for child in history.deleted: + if self.hasparent(child) is False: + uowcommit.register_object( + child, isdelete=True, + operation="delete", prop=self.prop) + for c, m, st_, dct_ in self.mapper.cascade_iterator( + 'delete', + child): + uowcommit.register_object( + st_, isdelete=True) + + def process_deletes(self, uowcommit, states): + secondary_delete = [] + secondary_insert = [] + secondary_update = [] + + processed = self._get_reversed_processed_set(uowcommit) + tmp = set() + for state in states: + # this history should be cached already, as + # we loaded it in preprocess_deletes + history = uowcommit.get_attribute_history( + state, + self.key, + self._passive_delete_flag) + if history: + for child in history.non_added(): + if child is None or \ + (processed is not None and + (state, child) in processed): + continue + associationrow = {} + if not self._synchronize( + state, + child, + associationrow, + False, uowcommit, "delete"): + continue + secondary_delete.append(associationrow) + + tmp.update((c, state) for c in history.non_added()) + + if processed is not None: + processed.update(tmp) + + self._run_crud(uowcommit, secondary_insert, + secondary_update, secondary_delete) + + def process_saves(self, uowcommit, states): + secondary_delete = [] + secondary_insert = [] + secondary_update = [] + + processed = self._get_reversed_processed_set(uowcommit) + tmp = set() + + for state in states: + need_cascade_pks = not self.passive_updates and \ + self._pks_changed(uowcommit, state) + if need_cascade_pks: + passive = attributes.PASSIVE_OFF + else: + passive = attributes.PASSIVE_NO_INITIALIZE + history = uowcommit.get_attribute_history(state, self.key, + passive) + if history: + for child in history.added: + if (processed is not None and + (state, child) in processed): + continue + associationrow = {} + if not self._synchronize(state, + child, + associationrow, + False, uowcommit, "add"): + continue + secondary_insert.append(associationrow) + for child in history.deleted: + if (processed is not None and + (state, child) in processed): + continue + associationrow = {} + if not self._synchronize(state, + child, + associationrow, + False, uowcommit, "delete"): + continue + secondary_delete.append(associationrow) + + tmp.update((c, state) + for c in history.added + history.deleted) + + if need_cascade_pks: + + for child in history.unchanged: + associationrow = {} + sync.update(state, + self.parent, + associationrow, + "old_", + self.prop.synchronize_pairs) + sync.update(child, + self.mapper, + associationrow, + "old_", + self.prop.secondary_synchronize_pairs) + + secondary_update.append(associationrow) + + if processed is not None: + processed.update(tmp) + + self._run_crud(uowcommit, secondary_insert, + secondary_update, secondary_delete) + + def _run_crud(self, uowcommit, secondary_insert, + secondary_update, secondary_delete): + connection = uowcommit.transaction.connection(self.mapper) + + if secondary_delete: + associationrow = secondary_delete[0] + statement = self.secondary.delete(sql.and_(*[ + c == sql.bindparam(c.key, type_=c.type) + for c in self.secondary.c + if c.key in associationrow + ])) + result = connection.execute(statement, secondary_delete) + + if result.supports_sane_multi_rowcount() and \ + result.rowcount != len(secondary_delete): + raise exc.StaleDataError( + "DELETE statement on table '%s' expected to delete " + "%d row(s); Only %d were matched." % + (self.secondary.description, len(secondary_delete), + result.rowcount) + ) + + if secondary_update: + associationrow = secondary_update[0] + statement = self.secondary.update(sql.and_(*[ + c == sql.bindparam("old_" + c.key, type_=c.type) + for c in self.secondary.c + if c.key in associationrow + ])) + result = connection.execute(statement, secondary_update) + + if result.supports_sane_multi_rowcount() and \ + result.rowcount != len(secondary_update): + raise exc.StaleDataError( + "UPDATE statement on table '%s' expected to update " + "%d row(s); Only %d were matched." % + (self.secondary.description, len(secondary_update), + result.rowcount) + ) + + if secondary_insert: + statement = self.secondary.insert() + connection.execute(statement, secondary_insert) + + def _synchronize(self, state, child, associationrow, + clearkeys, uowcommit, operation): + + # this checks for None if uselist=True + self._verify_canload(child) + + # but if uselist=False we get here. If child is None, + # no association row can be generated, so return. + if child is None: + return False + + if child is not None and not uowcommit.session._contains_state(child): + if not child.deleted: + util.warn( + "Object of type %s not in session, %s " + "operation along '%s' won't proceed" % + (mapperutil.state_class_str(child), operation, self.prop)) + return False + + sync.populate_dict(state, self.parent, associationrow, + self.prop.synchronize_pairs) + sync.populate_dict(child, self.mapper, associationrow, + self.prop.secondary_synchronize_pairs) + + return True + + def _pks_changed(self, uowcommit, state): + return sync.source_modified( + uowcommit, + state, + self.parent, + self.prop.synchronize_pairs) + +_direction_to_processor = { + ONETOMANY: OneToManyDP, + MANYTOONE: ManyToOneDP, + MANYTOMANY: ManyToManyDP, +} diff --git a/app/lib/sqlalchemy/orm/deprecated_interfaces.py b/app/lib/sqlalchemy/orm/deprecated_interfaces.py new file mode 100644 index 0000000..c1bc2f9 --- /dev/null +++ b/app/lib/sqlalchemy/orm/deprecated_interfaces.py @@ -0,0 +1,487 @@ +# orm/deprecated_interfaces.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from .. import event, util +from .interfaces import EXT_CONTINUE + + +@util.langhelpers.dependency_for("sqlalchemy.orm.interfaces") +class MapperExtension(object): + """Base implementation for :class:`.Mapper` event hooks. + + .. note:: + + :class:`.MapperExtension` is deprecated. Please + refer to :func:`.event.listen` as well as + :class:`.MapperEvents`. + + New extension classes subclass :class:`.MapperExtension` and are specified + using the ``extension`` mapper() argument, which is a single + :class:`.MapperExtension` or a list of such:: + + from sqlalchemy.orm.interfaces import MapperExtension + + class MyExtension(MapperExtension): + def before_insert(self, mapper, connection, instance): + print "instance %s before insert !" % instance + + m = mapper(User, users_table, extension=MyExtension()) + + A single mapper can maintain a chain of ``MapperExtension`` + objects. When a particular mapping event occurs, the + corresponding method on each ``MapperExtension`` is invoked + serially, and each method has the ability to halt the chain + from proceeding further:: + + m = mapper(User, users_table, extension=[ext1, ext2, ext3]) + + Each ``MapperExtension`` method returns the symbol + EXT_CONTINUE by default. This symbol generally means "move + to the next ``MapperExtension`` for processing". For methods + that return objects like translated rows or new object + instances, EXT_CONTINUE means the result of the method + should be ignored. In some cases it's required for a + default mapper activity to be performed, such as adding a + new instance to a result list. + + The symbol EXT_STOP has significance within a chain + of ``MapperExtension`` objects that the chain will be stopped + when this symbol is returned. Like EXT_CONTINUE, it also + has additional significance in some cases that a default + mapper activity will not be performed. + + """ + + @classmethod + def _adapt_instrument_class(cls, self, listener): + cls._adapt_listener_methods(self, listener, ('instrument_class',)) + + @classmethod + def _adapt_listener(cls, self, listener): + cls._adapt_listener_methods( + self, listener, + ( + 'init_instance', + 'init_failed', + 'reconstruct_instance', + 'before_insert', + 'after_insert', + 'before_update', + 'after_update', + 'before_delete', + 'after_delete' + )) + + @classmethod + def _adapt_listener_methods(cls, self, listener, methods): + + for meth in methods: + me_meth = getattr(MapperExtension, meth) + ls_meth = getattr(listener, meth) + + if not util.methods_equivalent(me_meth, ls_meth): + if meth == 'reconstruct_instance': + def go(ls_meth): + def reconstruct(instance, ctx): + ls_meth(self, instance) + return reconstruct + event.listen(self.class_manager, 'load', + go(ls_meth), raw=False, propagate=True) + elif meth == 'init_instance': + def go(ls_meth): + def init_instance(instance, args, kwargs): + ls_meth(self, self.class_, + self.class_manager.original_init, + instance, args, kwargs) + return init_instance + event.listen(self.class_manager, 'init', + go(ls_meth), raw=False, propagate=True) + elif meth == 'init_failed': + def go(ls_meth): + def init_failed(instance, args, kwargs): + util.warn_exception( + ls_meth, self, self.class_, + self.class_manager.original_init, + instance, args, kwargs) + + return init_failed + event.listen(self.class_manager, 'init_failure', + go(ls_meth), raw=False, propagate=True) + else: + event.listen(self, "%s" % meth, ls_meth, + raw=False, retval=True, propagate=True) + + def instrument_class(self, mapper, class_): + """Receive a class when the mapper is first constructed, and has + applied instrumentation to the mapped class. + + The return value is only significant within the ``MapperExtension`` + chain; the parent mapper's behavior isn't modified by this method. + + """ + return EXT_CONTINUE + + def init_instance(self, mapper, class_, oldinit, instance, args, kwargs): + """Receive an instance when its constructor is called. + + This method is only called during a userland construction of + an object. It is not called when an object is loaded from the + database. + + The return value is only significant within the ``MapperExtension`` + chain; the parent mapper's behavior isn't modified by this method. + + """ + return EXT_CONTINUE + + def init_failed(self, mapper, class_, oldinit, instance, args, kwargs): + """Receive an instance when its constructor has been called, + and raised an exception. + + This method is only called during a userland construction of + an object. It is not called when an object is loaded from the + database. + + The return value is only significant within the ``MapperExtension`` + chain; the parent mapper's behavior isn't modified by this method. + + """ + return EXT_CONTINUE + + def reconstruct_instance(self, mapper, instance): + """Receive an object instance after it has been created via + ``__new__``, and after initial attribute population has + occurred. + + This typically occurs when the instance is created based on + incoming result rows, and is only called once for that + instance's lifetime. + + Note that during a result-row load, this method is called upon + the first row received for this instance. Note that some + attributes and collections may or may not be loaded or even + initialized, depending on what's present in the result rows. + + The return value is only significant within the ``MapperExtension`` + chain; the parent mapper's behavior isn't modified by this method. + + """ + return EXT_CONTINUE + + def before_insert(self, mapper, connection, instance): + """Receive an object instance before that instance is inserted + into its table. + + This is a good place to set up primary key values and such + that aren't handled otherwise. + + Column-based attributes can be modified within this method + which will result in the new value being inserted. However + *no* changes to the overall flush plan can be made, and + manipulation of the ``Session`` will not have the desired effect. + To manipulate the ``Session`` within an extension, use + ``SessionExtension``. + + The return value is only significant within the ``MapperExtension`` + chain; the parent mapper's behavior isn't modified by this method. + + """ + + return EXT_CONTINUE + + def after_insert(self, mapper, connection, instance): + """Receive an object instance after that instance is inserted. + + The return value is only significant within the ``MapperExtension`` + chain; the parent mapper's behavior isn't modified by this method. + + """ + + return EXT_CONTINUE + + def before_update(self, mapper, connection, instance): + """Receive an object instance before that instance is updated. + + Note that this method is called for all instances that are marked as + "dirty", even those which have no net changes to their column-based + attributes. An object is marked as dirty when any of its column-based + attributes have a "set attribute" operation called or when any of its + collections are modified. If, at update time, no column-based + attributes have any net changes, no UPDATE statement will be issued. + This means that an instance being sent to before_update is *not* a + guarantee that an UPDATE statement will be issued (although you can + affect the outcome here). + + To detect if the column-based attributes on the object have net + changes, and will therefore generate an UPDATE statement, use + ``object_session(instance).is_modified(instance, + include_collections=False)``. + + Column-based attributes can be modified within this method + which will result in the new value being updated. However + *no* changes to the overall flush plan can be made, and + manipulation of the ``Session`` will not have the desired effect. + To manipulate the ``Session`` within an extension, use + ``SessionExtension``. + + The return value is only significant within the ``MapperExtension`` + chain; the parent mapper's behavior isn't modified by this method. + + """ + + return EXT_CONTINUE + + def after_update(self, mapper, connection, instance): + """Receive an object instance after that instance is updated. + + The return value is only significant within the ``MapperExtension`` + chain; the parent mapper's behavior isn't modified by this method. + + """ + + return EXT_CONTINUE + + def before_delete(self, mapper, connection, instance): + """Receive an object instance before that instance is deleted. + + Note that *no* changes to the overall flush plan can be made + here; and manipulation of the ``Session`` will not have the + desired effect. To manipulate the ``Session`` within an + extension, use ``SessionExtension``. + + The return value is only significant within the ``MapperExtension`` + chain; the parent mapper's behavior isn't modified by this method. + + """ + + return EXT_CONTINUE + + def after_delete(self, mapper, connection, instance): + """Receive an object instance after that instance is deleted. + + The return value is only significant within the ``MapperExtension`` + chain; the parent mapper's behavior isn't modified by this method. + + """ + + return EXT_CONTINUE + + +@util.langhelpers.dependency_for("sqlalchemy.orm.interfaces") +class SessionExtension(object): + + """Base implementation for :class:`.Session` event hooks. + + .. note:: + + :class:`.SessionExtension` is deprecated. Please + refer to :func:`.event.listen` as well as + :class:`.SessionEvents`. + + Subclasses may be installed into a :class:`.Session` (or + :class:`.sessionmaker`) using the ``extension`` keyword + argument:: + + from sqlalchemy.orm.interfaces import SessionExtension + + class MySessionExtension(SessionExtension): + def before_commit(self, session): + print "before commit!" + + Session = sessionmaker(extension=MySessionExtension()) + + The same :class:`.SessionExtension` instance can be used + with any number of sessions. + + """ + + @classmethod + def _adapt_listener(cls, self, listener): + for meth in [ + 'before_commit', + 'after_commit', + 'after_rollback', + 'before_flush', + 'after_flush', + 'after_flush_postexec', + 'after_begin', + 'after_attach', + 'after_bulk_update', + 'after_bulk_delete', + ]: + me_meth = getattr(SessionExtension, meth) + ls_meth = getattr(listener, meth) + + if not util.methods_equivalent(me_meth, ls_meth): + event.listen(self, meth, getattr(listener, meth)) + + def before_commit(self, session): + """Execute right before commit is called. + + Note that this may not be per-flush if a longer running + transaction is ongoing.""" + + def after_commit(self, session): + """Execute after a commit has occurred. + + Note that this may not be per-flush if a longer running + transaction is ongoing.""" + + def after_rollback(self, session): + """Execute after a rollback has occurred. + + Note that this may not be per-flush if a longer running + transaction is ongoing.""" + + def before_flush(self, session, flush_context, instances): + """Execute before flush process has started. + + `instances` is an optional list of objects which were passed to + the ``flush()`` method. """ + + def after_flush(self, session, flush_context): + """Execute after flush has completed, but before commit has been + called. + + Note that the session's state is still in pre-flush, i.e. 'new', + 'dirty', and 'deleted' lists still show pre-flush state as well + as the history settings on instance attributes.""" + + def after_flush_postexec(self, session, flush_context): + """Execute after flush has completed, and after the post-exec + state occurs. + + This will be when the 'new', 'dirty', and 'deleted' lists are in + their final state. An actual commit() may or may not have + occurred, depending on whether or not the flush started its own + transaction or participated in a larger transaction. """ + + def after_begin(self, session, transaction, connection): + """Execute after a transaction is begun on a connection + + `transaction` is the SessionTransaction. This method is called + after an engine level transaction is begun on a connection. """ + + def after_attach(self, session, instance): + """Execute after an instance is attached to a session. + + This is called after an add, delete or merge. """ + + def after_bulk_update(self, session, query, query_context, result): + """Execute after a bulk update operation to the session. + + This is called after a session.query(...).update() + + `query` is the query object that this update operation was + called on. `query_context` was the query context object. + `result` is the result object returned from the bulk operation. + """ + + def after_bulk_delete(self, session, query, query_context, result): + """Execute after a bulk delete operation to the session. + + This is called after a session.query(...).delete() + + `query` is the query object that this delete operation was + called on. `query_context` was the query context object. + `result` is the result object returned from the bulk operation. + """ + + +@util.langhelpers.dependency_for("sqlalchemy.orm.interfaces") +class AttributeExtension(object): + """Base implementation for :class:`.AttributeImpl` event hooks, events + that fire upon attribute mutations in user code. + + .. note:: + + :class:`.AttributeExtension` is deprecated. Please + refer to :func:`.event.listen` as well as + :class:`.AttributeEvents`. + + :class:`.AttributeExtension` is used to listen for set, + remove, and append events on individual mapped attributes. + It is established on an individual mapped attribute using + the `extension` argument, available on + :func:`.column_property`, :func:`.relationship`, and + others:: + + from sqlalchemy.orm.interfaces import AttributeExtension + from sqlalchemy.orm import mapper, relationship, column_property + + class MyAttrExt(AttributeExtension): + def append(self, state, value, initiator): + print "append event !" + return value + + def set(self, state, value, oldvalue, initiator): + print "set event !" + return value + + mapper(SomeClass, sometable, properties={ + 'foo':column_property(sometable.c.foo, extension=MyAttrExt()), + 'bar':relationship(Bar, extension=MyAttrExt()) + }) + + Note that the :class:`.AttributeExtension` methods + :meth:`~.AttributeExtension.append` and + :meth:`~.AttributeExtension.set` need to return the + ``value`` parameter. The returned value is used as the + effective value, and allows the extension to change what is + ultimately persisted. + + AttributeExtension is assembled within the descriptors associated + with a mapped class. + + """ + + active_history = True + """indicates that the set() method would like to receive the 'old' value, + even if it means firing lazy callables. + + Note that ``active_history`` can also be set directly via + :func:`.column_property` and :func:`.relationship`. + + """ + + @classmethod + def _adapt_listener(cls, self, listener): + event.listen(self, 'append', listener.append, + active_history=listener.active_history, + raw=True, retval=True) + event.listen(self, 'remove', listener.remove, + active_history=listener.active_history, + raw=True, retval=True) + event.listen(self, 'set', listener.set, + active_history=listener.active_history, + raw=True, retval=True) + + def append(self, state, value, initiator): + """Receive a collection append event. + + The returned value will be used as the actual value to be + appended. + + """ + return value + + def remove(self, state, value, initiator): + """Receive a remove event. + + No return value is defined. + + """ + pass + + def set(self, state, value, oldvalue, initiator): + """Receive a set event. + + The returned value will be used as the actual value to be + set. + + """ + return value diff --git a/app/lib/sqlalchemy/orm/descriptor_props.py b/app/lib/sqlalchemy/orm/descriptor_props.py new file mode 100644 index 0000000..0792ff2 --- /dev/null +++ b/app/lib/sqlalchemy/orm/descriptor_props.py @@ -0,0 +1,699 @@ +# orm/descriptor_props.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Descriptor properties are more "auxiliary" properties +that exist as configurational elements, but don't participate +as actively in the load/persist ORM loop. + +""" + +from .interfaces import MapperProperty, PropComparator +from .util import _none_set +from . import attributes +from .. import util, sql, exc as sa_exc, event, schema +from ..sql import expression +from . import properties +from . import query + + +class DescriptorProperty(MapperProperty): + """:class:`.MapperProperty` which proxies access to a + user-defined descriptor.""" + + doc = None + + def instrument_class(self, mapper): + prop = self + + class _ProxyImpl(object): + accepts_scalar_loader = False + expire_missing = True + collection = False + + def __init__(self, key): + self.key = key + + if hasattr(prop, 'get_history'): + def get_history(self, state, dict_, + passive=attributes.PASSIVE_OFF): + return prop.get_history(state, dict_, passive) + + if self.descriptor is None: + desc = getattr(mapper.class_, self.key, None) + if mapper._is_userland_descriptor(desc): + self.descriptor = desc + + if self.descriptor is None: + def fset(obj, value): + setattr(obj, self.name, value) + + def fdel(obj): + delattr(obj, self.name) + + def fget(obj): + return getattr(obj, self.name) + + self.descriptor = property( + fget=fget, + fset=fset, + fdel=fdel, + ) + + proxy_attr = attributes.create_proxied_attribute( + self.descriptor)( + self.parent.class_, + self.key, + self.descriptor, + lambda: self._comparator_factory(mapper), + doc=self.doc, + original_property=self + ) + proxy_attr.impl = _ProxyImpl(self.key) + mapper.class_manager.instrument_attribute(self.key, proxy_attr) + + +@util.langhelpers.dependency_for("sqlalchemy.orm.properties") +class CompositeProperty(DescriptorProperty): + """Defines a "composite" mapped attribute, representing a collection + of columns as one attribute. + + :class:`.CompositeProperty` is constructed using the :func:`.composite` + function. + + .. seealso:: + + :ref:`mapper_composite` + + """ + + def __init__(self, class_, *attrs, **kwargs): + r"""Return a composite column-based property for use with a Mapper. + + See the mapping documentation section :ref:`mapper_composite` for a + full usage example. + + The :class:`.MapperProperty` returned by :func:`.composite` + is the :class:`.CompositeProperty`. + + :param class\_: + The "composite type" class. + + :param \*cols: + List of Column objects to be mapped. + + :param active_history=False: + When ``True``, indicates that the "previous" value for a + scalar attribute should be loaded when replaced, if not + already loaded. See the same flag on :func:`.column_property`. + + .. versionchanged:: 0.7 + This flag specifically becomes meaningful + - previously it was a placeholder. + + :param group: + A group name for this property when marked as deferred. + + :param deferred: + When True, the column property is "deferred", meaning that it does + not load immediately, and is instead loaded when the attribute is + first accessed on an instance. See also + :func:`~sqlalchemy.orm.deferred`. + + :param comparator_factory: a class which extends + :class:`.CompositeProperty.Comparator` which provides custom SQL + clause generation for comparison operations. + + :param doc: + optional string that will be applied as the doc on the + class-bound descriptor. + + :param info: Optional data dictionary which will be populated into the + :attr:`.MapperProperty.info` attribute of this object. + + .. versionadded:: 0.8 + + :param extension: + an :class:`.AttributeExtension` instance, + or list of extensions, which will be prepended to the list of + attribute listeners for the resulting descriptor placed on the + class. **Deprecated.** Please see :class:`.AttributeEvents`. + + """ + super(CompositeProperty, self).__init__() + + self.attrs = attrs + self.composite_class = class_ + self.active_history = kwargs.get('active_history', False) + self.deferred = kwargs.get('deferred', False) + self.group = kwargs.get('group', None) + self.comparator_factory = kwargs.pop('comparator_factory', + self.__class__.Comparator) + if 'info' in kwargs: + self.info = kwargs.pop('info') + + util.set_creation_order(self) + self._create_descriptor() + + def instrument_class(self, mapper): + super(CompositeProperty, self).instrument_class(mapper) + self._setup_event_handlers() + + def do_init(self): + """Initialization which occurs after the :class:`.CompositeProperty` + has been associated with its parent mapper. + + """ + self._setup_arguments_on_columns() + + def _create_descriptor(self): + """Create the Python descriptor that will serve as + the access point on instances of the mapped class. + + """ + + def fget(instance): + dict_ = attributes.instance_dict(instance) + state = attributes.instance_state(instance) + + if self.key not in dict_: + # key not present. Iterate through related + # attributes, retrieve their values. This + # ensures they all load. + values = [ + getattr(instance, key) + for key in self._attribute_keys + ] + + # current expected behavior here is that the composite is + # created on access if the object is persistent or if + # col attributes have non-None. This would be better + # if the composite were created unconditionally, + # but that would be a behavioral change. + if self.key not in dict_ and ( + state.key is not None or + not _none_set.issuperset(values) + ): + dict_[self.key] = self.composite_class(*values) + state.manager.dispatch.refresh(state, None, [self.key]) + + return dict_.get(self.key, None) + + def fset(instance, value): + dict_ = attributes.instance_dict(instance) + state = attributes.instance_state(instance) + attr = state.manager[self.key] + previous = dict_.get(self.key, attributes.NO_VALUE) + for fn in attr.dispatch.set: + value = fn(state, value, previous, attr.impl) + dict_[self.key] = value + if value is None: + for key in self._attribute_keys: + setattr(instance, key, None) + else: + for key, value in zip( + self._attribute_keys, + value.__composite_values__()): + setattr(instance, key, value) + + def fdel(instance): + state = attributes.instance_state(instance) + dict_ = attributes.instance_dict(instance) + previous = dict_.pop(self.key, attributes.NO_VALUE) + attr = state.manager[self.key] + attr.dispatch.remove(state, previous, attr.impl) + for key in self._attribute_keys: + setattr(instance, key, None) + + self.descriptor = property(fget, fset, fdel) + + @util.memoized_property + def _comparable_elements(self): + return [ + getattr(self.parent.class_, prop.key) + for prop in self.props + ] + + @util.memoized_property + def props(self): + props = [] + for attr in self.attrs: + if isinstance(attr, str): + prop = self.parent.get_property( + attr, _configure_mappers=False) + elif isinstance(attr, schema.Column): + prop = self.parent._columntoproperty[attr] + elif isinstance(attr, attributes.InstrumentedAttribute): + prop = attr.property + else: + raise sa_exc.ArgumentError( + "Composite expects Column objects or mapped " + "attributes/attribute names as arguments, got: %r" + % (attr,)) + props.append(prop) + return props + + @property + def columns(self): + return [a for a in self.attrs if isinstance(a, schema.Column)] + + def _setup_arguments_on_columns(self): + """Propagate configuration arguments made on this composite + to the target columns, for those that apply. + + """ + for prop in self.props: + prop.active_history = self.active_history + if self.deferred: + prop.deferred = self.deferred + prop.strategy_key = ( + ("deferred", True), + ("instrument", True)) + prop.group = self.group + + def _setup_event_handlers(self): + """Establish events that populate/expire the composite attribute.""" + + def load_handler(state, *args): + dict_ = state.dict + + if self.key in dict_: + return + + # if column elements aren't loaded, skip. + # __get__() will initiate a load for those + # columns + for k in self._attribute_keys: + if k not in dict_: + return + + # assert self.key not in dict_ + dict_[self.key] = self.composite_class( + *[state.dict[key] for key in + self._attribute_keys] + ) + + def expire_handler(state, keys): + if keys is None or set(self._attribute_keys).intersection(keys): + state.dict.pop(self.key, None) + + def insert_update_handler(mapper, connection, state): + """After an insert or update, some columns may be expired due + to server side defaults, or re-populated due to client side + defaults. Pop out the composite value here so that it + recreates. + + """ + + state.dict.pop(self.key, None) + + event.listen(self.parent, 'after_insert', + insert_update_handler, raw=True) + event.listen(self.parent, 'after_update', + insert_update_handler, raw=True) + event.listen(self.parent, 'load', + load_handler, raw=True, propagate=True) + event.listen(self.parent, 'refresh', + load_handler, raw=True, propagate=True) + event.listen(self.parent, 'expire', + expire_handler, raw=True, propagate=True) + + # TODO: need a deserialize hook here + + @util.memoized_property + def _attribute_keys(self): + return [ + prop.key for prop in self.props + ] + + def get_history(self, state, dict_, passive=attributes.PASSIVE_OFF): + """Provided for userland code that uses attributes.get_history().""" + + added = [] + deleted = [] + + has_history = False + for prop in self.props: + key = prop.key + hist = state.manager[key].impl.get_history(state, dict_) + if hist.has_changes(): + has_history = True + + non_deleted = hist.non_deleted() + if non_deleted: + added.extend(non_deleted) + else: + added.append(None) + if hist.deleted: + deleted.extend(hist.deleted) + else: + deleted.append(None) + + if has_history: + return attributes.History( + [self.composite_class(*added)], + (), + [self.composite_class(*deleted)] + ) + else: + return attributes.History( + (), [self.composite_class(*added)], () + ) + + def _comparator_factory(self, mapper): + return self.comparator_factory(self, mapper) + + class CompositeBundle(query.Bundle): + def __init__(self, property, expr): + self.property = property + super(CompositeProperty.CompositeBundle, self).__init__( + property.key, *expr) + + def create_row_processor(self, query, procs, labels): + def proc(row): + return self.property.composite_class( + *[proc(row) for proc in procs]) + return proc + + class Comparator(PropComparator): + """Produce boolean, comparison, and other operators for + :class:`.CompositeProperty` attributes. + + See the example in :ref:`composite_operations` for an overview + of usage , as well as the documentation for :class:`.PropComparator`. + + See also: + + :class:`.PropComparator` + + :class:`.ColumnOperators` + + :ref:`types_operators` + + :attr:`.TypeEngine.comparator_factory` + + """ + + __hash__ = None + + @property + def clauses(self): + return self.__clause_element__() + + def __clause_element__(self): + return expression.ClauseList( + group=False, *self._comparable_elements) + + def _query_clause_element(self): + return CompositeProperty.CompositeBundle( + self.prop, self.__clause_element__()) + + @util.memoized_property + def _comparable_elements(self): + if self._adapt_to_entity: + return [ + getattr( + self._adapt_to_entity.entity, + prop.key + ) for prop in self.prop._comparable_elements + ] + else: + return self.prop._comparable_elements + + def __eq__(self, other): + if other is None: + values = [None] * len(self.prop._comparable_elements) + else: + values = other.__composite_values__() + comparisons = [ + a == b + for a, b in zip(self.prop._comparable_elements, values) + ] + if self._adapt_to_entity: + comparisons = [self.adapter(x) for x in comparisons] + return sql.and_(*comparisons) + + def __ne__(self, other): + return sql.not_(self.__eq__(other)) + + def __str__(self): + return str(self.parent.class_.__name__) + "." + self.key + + +@util.langhelpers.dependency_for("sqlalchemy.orm.properties") +class ConcreteInheritedProperty(DescriptorProperty): + """A 'do nothing' :class:`.MapperProperty` that disables + an attribute on a concrete subclass that is only present + on the inherited mapper, not the concrete classes' mapper. + + Cases where this occurs include: + + * When the superclass mapper is mapped against a + "polymorphic union", which includes all attributes from + all subclasses. + * When a relationship() is configured on an inherited mapper, + but not on the subclass mapper. Concrete mappers require + that relationship() is configured explicitly on each + subclass. + + """ + + def _comparator_factory(self, mapper): + comparator_callable = None + + for m in self.parent.iterate_to_root(): + p = m._props[self.key] + if not isinstance(p, ConcreteInheritedProperty): + comparator_callable = p.comparator_factory + break + return comparator_callable + + def __init__(self): + super(ConcreteInheritedProperty, self).__init__() + def warn(): + raise AttributeError("Concrete %s does not implement " + "attribute %r at the instance level. Add " + "this property explicitly to %s." % + (self.parent, self.key, self.parent)) + + class NoninheritedConcreteProp(object): + def __set__(s, obj, value): + warn() + + def __delete__(s, obj): + warn() + + def __get__(s, obj, owner): + if obj is None: + return self.descriptor + warn() + self.descriptor = NoninheritedConcreteProp() + + +@util.langhelpers.dependency_for("sqlalchemy.orm.properties") +class SynonymProperty(DescriptorProperty): + + def __init__(self, name, map_column=None, + descriptor=None, comparator_factory=None, + doc=None, info=None): + """Denote an attribute name as a synonym to a mapped property, + in that the attribute will mirror the value and expression behavior + of another attribute. + + :param name: the name of the existing mapped property. This + can refer to the string name of any :class:`.MapperProperty` + configured on the class, including column-bound attributes + and relationships. + + :param descriptor: a Python :term:`descriptor` that will be used + as a getter (and potentially a setter) when this attribute is + accessed at the instance level. + + :param map_column: if ``True``, the :func:`.synonym` construct will + locate the existing named :class:`.MapperProperty` based on the + attribute name of this :func:`.synonym`, and assign it to a new + attribute linked to the name of this :func:`.synonym`. + That is, given a mapping like:: + + class MyClass(Base): + __tablename__ = 'my_table' + + id = Column(Integer, primary_key=True) + job_status = Column(String(50)) + + job_status = synonym("_job_status", map_column=True) + + The above class ``MyClass`` will now have the ``job_status`` + :class:`.Column` object mapped to the attribute named + ``_job_status``, and the attribute named ``job_status`` will refer + to the synonym itself. This feature is typically used in + conjunction with the ``descriptor`` argument in order to link a + user-defined descriptor as a "wrapper" for an existing column. + + :param info: Optional data dictionary which will be populated into the + :attr:`.InspectionAttr.info` attribute of this object. + + .. versionadded:: 1.0.0 + + :param comparator_factory: A subclass of :class:`.PropComparator` + that will provide custom comparison behavior at the SQL expression + level. + + .. note:: + + For the use case of providing an attribute which redefines both + Python-level and SQL-expression level behavior of an attribute, + please refer to the Hybrid attribute introduced at + :ref:`mapper_hybrids` for a more effective technique. + + .. seealso:: + + :ref:`synonyms` - examples of functionality. + + :ref:`mapper_hybrids` - Hybrids provide a better approach for + more complicated attribute-wrapping schemes than synonyms. + + """ + super(SynonymProperty, self).__init__() + + self.name = name + self.map_column = map_column + self.descriptor = descriptor + self.comparator_factory = comparator_factory + self.doc = doc or (descriptor and descriptor.__doc__) or None + if info: + self.info = info + + util.set_creation_order(self) + + # TODO: when initialized, check _proxied_property, + # emit a warning if its not a column-based property + + @util.memoized_property + def _proxied_property(self): + return getattr(self.parent.class_, self.name).property + + def _comparator_factory(self, mapper): + prop = self._proxied_property + + if self.comparator_factory: + comp = self.comparator_factory(prop, mapper) + else: + comp = prop.comparator_factory(prop, mapper) + return comp + + def set_parent(self, parent, init): + if self.map_column: + # implement the 'map_column' option. + if self.key not in parent.mapped_table.c: + raise sa_exc.ArgumentError( + "Can't compile synonym '%s': no column on table " + "'%s' named '%s'" + % (self.name, parent.mapped_table.description, self.key)) + elif parent.mapped_table.c[self.key] in \ + parent._columntoproperty and \ + parent._columntoproperty[ + parent.mapped_table.c[self.key] + ].key == self.name: + raise sa_exc.ArgumentError( + "Can't call map_column=True for synonym %r=%r, " + "a ColumnProperty already exists keyed to the name " + "%r for column %r" % + (self.key, self.name, self.name, self.key) + ) + p = properties.ColumnProperty(parent.mapped_table.c[self.key]) + parent._configure_property( + self.name, p, + init=init, + setparent=True) + p._mapped_by_synonym = self.key + + self.parent = parent + + +@util.langhelpers.dependency_for("sqlalchemy.orm.properties") +class ComparableProperty(DescriptorProperty): + """Instruments a Python property for use in query expressions.""" + + def __init__( + self, comparator_factory, descriptor=None, doc=None, info=None): + """Provides a method of applying a :class:`.PropComparator` + to any Python descriptor attribute. + + .. versionchanged:: 0.7 + :func:`.comparable_property` is superseded by + the :mod:`~sqlalchemy.ext.hybrid` extension. See the example + at :ref:`hybrid_custom_comparators`. + + Allows any Python descriptor to behave like a SQL-enabled + attribute when used at the class level in queries, allowing + redefinition of expression operator behavior. + + In the example below we redefine :meth:`.PropComparator.operate` + to wrap both sides of an expression in ``func.lower()`` to produce + case-insensitive comparison:: + + from sqlalchemy.orm import comparable_property + from sqlalchemy.orm.interfaces import PropComparator + from sqlalchemy.sql import func + from sqlalchemy import Integer, String, Column + from sqlalchemy.ext.declarative import declarative_base + + class CaseInsensitiveComparator(PropComparator): + def __clause_element__(self): + return self.prop + + def operate(self, op, other): + return op( + func.lower(self.__clause_element__()), + func.lower(other) + ) + + Base = declarative_base() + + class SearchWord(Base): + __tablename__ = 'search_word' + id = Column(Integer, primary_key=True) + word = Column(String) + word_insensitive = comparable_property(lambda prop, mapper: + CaseInsensitiveComparator( + mapper.c.word, mapper) + ) + + + A mapping like the above allows the ``word_insensitive`` attribute + to render an expression like:: + + >>> print SearchWord.word_insensitive == "Trucks" + lower(search_word.word) = lower(:lower_1) + + :param comparator_factory: + A PropComparator subclass or factory that defines operator behavior + for this property. + + :param descriptor: + Optional when used in a ``properties={}`` declaration. The Python + descriptor or property to layer comparison behavior on top of. + + The like-named descriptor will be automatically retrieved from the + mapped class if left blank in a ``properties`` declaration. + + :param info: Optional data dictionary which will be populated into the + :attr:`.InspectionAttr.info` attribute of this object. + + .. versionadded:: 1.0.0 + + """ + super(ComparableProperty, self).__init__() + self.descriptor = descriptor + self.comparator_factory = comparator_factory + self.doc = doc or (descriptor and descriptor.__doc__) or None + if info: + self.info = info + util.set_creation_order(self) + + def _comparator_factory(self, mapper): + return self.comparator_factory(self, mapper) diff --git a/app/lib/sqlalchemy/orm/dynamic.py b/app/lib/sqlalchemy/orm/dynamic.py new file mode 100644 index 0000000..9f99740 --- /dev/null +++ b/app/lib/sqlalchemy/orm/dynamic.py @@ -0,0 +1,367 @@ +# orm/dynamic.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Dynamic collection API. + +Dynamic collections act like Query() objects for read operations and support +basic add/delete mutation. + +""" + +from .. import log, util, exc +from ..sql import operators +from . import ( + attributes, object_session, util as orm_util, strategies, + object_mapper, exc as orm_exc, properties +) +from .query import Query + + +@log.class_logger +@properties.RelationshipProperty.strategy_for(lazy="dynamic") +class DynaLoader(strategies.AbstractRelationshipLoader): + def init_class_attribute(self, mapper): + self.is_class_level = True + if not self.uselist: + raise exc.InvalidRequestError( + "On relationship %s, 'dynamic' loaders cannot be used with " + "many-to-one/one-to-one relationships and/or " + "uselist=False." % self.parent_property) + strategies._register_attribute( + self.parent_property, + mapper, + useobject=True, + impl_class=DynamicAttributeImpl, + target_mapper=self.parent_property.mapper, + order_by=self.parent_property.order_by, + query_class=self.parent_property.query_class, + ) + + +class DynamicAttributeImpl(attributes.AttributeImpl): + uses_objects = True + accepts_scalar_loader = False + supports_population = False + collection = False + + def __init__(self, class_, key, typecallable, + dispatch, + target_mapper, order_by, query_class=None, **kw): + super(DynamicAttributeImpl, self).\ + __init__(class_, key, typecallable, dispatch, **kw) + self.target_mapper = target_mapper + self.order_by = order_by + if not query_class: + self.query_class = AppenderQuery + elif AppenderMixin in query_class.mro(): + self.query_class = query_class + else: + self.query_class = mixin_user_query(query_class) + + def get(self, state, dict_, passive=attributes.PASSIVE_OFF): + if not passive & attributes.SQL_OK: + return self._get_collection_history( + state, attributes.PASSIVE_NO_INITIALIZE).added_items + else: + return self.query_class(self, state) + + def get_collection(self, state, dict_, user_data=None, + passive=attributes.PASSIVE_NO_INITIALIZE): + if not passive & attributes.SQL_OK: + return self._get_collection_history(state, + passive).added_items + else: + history = self._get_collection_history(state, passive) + return history.added_plus_unchanged + + @util.memoized_property + def _append_token(self): + return attributes.Event(self, attributes.OP_APPEND) + + @util.memoized_property + def _remove_token(self): + return attributes.Event(self, attributes.OP_REMOVE) + + def fire_append_event(self, state, dict_, value, initiator, + collection_history=None): + if collection_history is None: + collection_history = self._modified_event(state, dict_) + + collection_history.add_added(value) + + for fn in self.dispatch.append: + value = fn(state, value, initiator or self._append_token) + + if self.trackparent and value is not None: + self.sethasparent(attributes.instance_state(value), state, True) + + def fire_remove_event(self, state, dict_, value, initiator, + collection_history=None): + if collection_history is None: + collection_history = self._modified_event(state, dict_) + + collection_history.add_removed(value) + + if self.trackparent and value is not None: + self.sethasparent(attributes.instance_state(value), state, False) + + for fn in self.dispatch.remove: + fn(state, value, initiator or self._remove_token) + + def _modified_event(self, state, dict_): + + if self.key not in state.committed_state: + state.committed_state[self.key] = CollectionHistory(self, state) + + state._modified_event(dict_, + self, + attributes.NEVER_SET) + + # this is a hack to allow the fixtures.ComparableEntity fixture + # to work + dict_[self.key] = True + return state.committed_state[self.key] + + def set(self, state, dict_, value, initiator=None, + passive=attributes.PASSIVE_OFF, + check_old=None, pop=False, _adapt=True): + if initiator and initiator.parent_token is self.parent_token: + return + + if pop and value is None: + return + + iterable = value + new_values = list(iterable) + if state.has_identity: + old_collection = util.IdentitySet(self.get(state, dict_)) + + collection_history = self._modified_event(state, dict_) + if not state.has_identity: + old_collection = collection_history.added_items + else: + old_collection = old_collection.union( + collection_history.added_items) + + idset = util.IdentitySet + constants = old_collection.intersection(new_values) + additions = idset(new_values).difference(constants) + removals = old_collection.difference(constants) + + for member in new_values: + if member in additions: + self.fire_append_event(state, dict_, member, None, + collection_history=collection_history) + + for member in removals: + self.fire_remove_event(state, dict_, member, None, + collection_history=collection_history) + + def delete(self, *args, **kwargs): + raise NotImplementedError() + + def set_committed_value(self, state, dict_, value): + raise NotImplementedError("Dynamic attributes don't support " + "collection population.") + + def get_history(self, state, dict_, passive=attributes.PASSIVE_OFF): + c = self._get_collection_history(state, passive) + return c.as_history() + + def get_all_pending(self, state, dict_, + passive=attributes.PASSIVE_NO_INITIALIZE): + c = self._get_collection_history( + state, passive) + return [ + (attributes.instance_state(x), x) + for x in + c.all_items + ] + + def _get_collection_history(self, state, passive=attributes.PASSIVE_OFF): + if self.key in state.committed_state: + c = state.committed_state[self.key] + else: + c = CollectionHistory(self, state) + + if state.has_identity and (passive & attributes.INIT_OK): + return CollectionHistory(self, state, apply_to=c) + else: + return c + + def append(self, state, dict_, value, initiator, + passive=attributes.PASSIVE_OFF): + if initiator is not self: + self.fire_append_event(state, dict_, value, initiator) + + def remove(self, state, dict_, value, initiator, + passive=attributes.PASSIVE_OFF): + if initiator is not self: + self.fire_remove_event(state, dict_, value, initiator) + + def pop(self, state, dict_, value, initiator, + passive=attributes.PASSIVE_OFF): + self.remove(state, dict_, value, initiator, passive=passive) + + +class AppenderMixin(object): + query_class = None + + def __init__(self, attr, state): + super(AppenderMixin, self).__init__(attr.target_mapper, None) + self.instance = instance = state.obj() + self.attr = attr + + mapper = object_mapper(instance) + prop = mapper._props[self.attr.key] + self._criterion = prop._with_parent( + instance, + alias_secondary=False) + + if self.attr.order_by: + self._order_by = self.attr.order_by + + def session(self): + sess = object_session(self.instance) + if sess is not None and self.autoflush and sess.autoflush \ + and self.instance in sess: + sess.flush() + if not orm_util.has_identity(self.instance): + return None + else: + return sess + session = property(session, lambda s, x: None) + + def __iter__(self): + sess = self.session + if sess is None: + return iter(self.attr._get_collection_history( + attributes.instance_state(self.instance), + attributes.PASSIVE_NO_INITIALIZE).added_items) + else: + return iter(self._clone(sess)) + + def __getitem__(self, index): + sess = self.session + if sess is None: + return self.attr._get_collection_history( + attributes.instance_state(self.instance), + attributes.PASSIVE_NO_INITIALIZE).indexed(index) + else: + return self._clone(sess).__getitem__(index) + + def count(self): + sess = self.session + if sess is None: + return len(self.attr._get_collection_history( + attributes.instance_state(self.instance), + attributes.PASSIVE_NO_INITIALIZE).added_items) + else: + return self._clone(sess).count() + + def _clone(self, sess=None): + # note we're returning an entirely new Query class instance + # here without any assignment capabilities; the class of this + # query is determined by the session. + instance = self.instance + if sess is None: + sess = object_session(instance) + if sess is None: + raise orm_exc.DetachedInstanceError( + "Parent instance %s is not bound to a Session, and no " + "contextual session is established; lazy load operation " + "of attribute '%s' cannot proceed" % ( + orm_util.instance_str(instance), self.attr.key)) + + if self.query_class: + query = self.query_class(self.attr.target_mapper, session=sess) + else: + query = sess.query(self.attr.target_mapper) + + query._criterion = self._criterion + query._order_by = self._order_by + + return query + + def extend(self, iterator): + for item in iterator: + self.attr.append( + attributes.instance_state(self.instance), + attributes.instance_dict(self.instance), item, None) + + def append(self, item): + self.attr.append( + attributes.instance_state(self.instance), + attributes.instance_dict(self.instance), item, None) + + def remove(self, item): + self.attr.remove( + attributes.instance_state(self.instance), + attributes.instance_dict(self.instance), item, None) + + +class AppenderQuery(AppenderMixin, Query): + """A dynamic query that supports basic collection storage operations.""" + + +def mixin_user_query(cls): + """Return a new class with AppenderQuery functionality layered over.""" + name = 'Appender' + cls.__name__ + return type(name, (AppenderMixin, cls), {'query_class': cls}) + + +class CollectionHistory(object): + """Overrides AttributeHistory to receive append/remove events directly.""" + + def __init__(self, attr, state, apply_to=None): + if apply_to: + coll = AppenderQuery(attr, state).autoflush(False) + self.unchanged_items = util.OrderedIdentitySet(coll) + self.added_items = apply_to.added_items + self.deleted_items = apply_to.deleted_items + self._reconcile_collection = True + else: + self.deleted_items = util.OrderedIdentitySet() + self.added_items = util.OrderedIdentitySet() + self.unchanged_items = util.OrderedIdentitySet() + self._reconcile_collection = False + + @property + def added_plus_unchanged(self): + return list(self.added_items.union(self.unchanged_items)) + + @property + def all_items(self): + return list(self.added_items.union( + self.unchanged_items).union(self.deleted_items)) + + def as_history(self): + if self._reconcile_collection: + added = self.added_items.difference(self.unchanged_items) + deleted = self.deleted_items.intersection(self.unchanged_items) + unchanged = self.unchanged_items.difference(deleted) + else: + added, unchanged, deleted = self.added_items,\ + self.unchanged_items,\ + self.deleted_items + return attributes.History( + list(added), + list(unchanged), + list(deleted), + ) + + def indexed(self, index): + return list(self.added_items)[index] + + def add_added(self, value): + self.added_items.add(value) + + def add_removed(self, value): + if value in self.added_items: + self.added_items.remove(value) + else: + self.deleted_items.add(value) diff --git a/app/lib/sqlalchemy/orm/evaluator.py b/app/lib/sqlalchemy/orm/evaluator.py new file mode 100644 index 0000000..95a9e9b --- /dev/null +++ b/app/lib/sqlalchemy/orm/evaluator.py @@ -0,0 +1,137 @@ +# orm/evaluator.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import operator +from ..sql import operators + + +class UnevaluatableError(Exception): + pass + +_straight_ops = set(getattr(operators, op) + for op in ('add', 'mul', 'sub', + 'div', + 'mod', 'truediv', + 'lt', 'le', 'ne', 'gt', 'ge', 'eq')) + + +_notimplemented_ops = set(getattr(operators, op) + for op in ('like_op', 'notlike_op', 'ilike_op', + 'notilike_op', 'between_op', 'in_op', + 'notin_op', 'endswith_op', 'concat_op')) + + +class EvaluatorCompiler(object): + def __init__(self, target_cls=None): + self.target_cls = target_cls + + def process(self, clause): + meth = getattr(self, "visit_%s" % clause.__visit_name__, None) + if not meth: + raise UnevaluatableError( + "Cannot evaluate %s" % type(clause).__name__) + return meth(clause) + + def visit_grouping(self, clause): + return self.process(clause.element) + + def visit_null(self, clause): + return lambda obj: None + + def visit_false(self, clause): + return lambda obj: False + + def visit_true(self, clause): + return lambda obj: True + + def visit_column(self, clause): + if 'parentmapper' in clause._annotations: + parentmapper = clause._annotations['parentmapper'] + if self.target_cls and not issubclass( + self.target_cls, parentmapper.class_): + raise UnevaluatableError( + "Can't evaluate criteria against alternate class %s" % + parentmapper.class_ + ) + key = parentmapper._columntoproperty[clause].key + else: + key = clause.key + + get_corresponding_attr = operator.attrgetter(key) + return lambda obj: get_corresponding_attr(obj) + + def visit_clauselist(self, clause): + evaluators = list(map(self.process, clause.clauses)) + if clause.operator is operators.or_: + def evaluate(obj): + has_null = False + for sub_evaluate in evaluators: + value = sub_evaluate(obj) + if value: + return True + has_null = has_null or value is None + if has_null: + return None + return False + elif clause.operator is operators.and_: + def evaluate(obj): + for sub_evaluate in evaluators: + value = sub_evaluate(obj) + if not value: + if value is None: + return None + return False + return True + else: + raise UnevaluatableError( + "Cannot evaluate clauselist with operator %s" % + clause.operator) + + return evaluate + + def visit_binary(self, clause): + eval_left, eval_right = list(map(self.process, + [clause.left, clause.right])) + operator = clause.operator + if operator is operators.is_: + def evaluate(obj): + return eval_left(obj) == eval_right(obj) + elif operator is operators.isnot: + def evaluate(obj): + return eval_left(obj) != eval_right(obj) + elif operator in _straight_ops: + def evaluate(obj): + left_val = eval_left(obj) + right_val = eval_right(obj) + if left_val is None or right_val is None: + return None + return operator(eval_left(obj), eval_right(obj)) + else: + raise UnevaluatableError( + "Cannot evaluate %s with operator %s" % + (type(clause).__name__, clause.operator)) + return evaluate + + def visit_unary(self, clause): + eval_inner = self.process(clause.element) + if clause.operator is operators.inv: + def evaluate(obj): + value = eval_inner(obj) + if value is None: + return None + return not value + return evaluate + raise UnevaluatableError( + "Cannot evaluate %s with operator %s" % + (type(clause).__name__, clause.operator)) + + def visit_bindparam(self, clause): + if clause.callable: + val = clause.callable() + else: + val = clause.value + return lambda obj: val diff --git a/app/lib/sqlalchemy/orm/events.py b/app/lib/sqlalchemy/orm/events.py new file mode 100644 index 0000000..d2ccec4 --- /dev/null +++ b/app/lib/sqlalchemy/orm/events.py @@ -0,0 +1,2187 @@ +# orm/events.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""ORM event interfaces. + +""" +from .. import event, exc, util +from .base import _mapper_or_none +import inspect +import weakref +from . import interfaces +from . import mapperlib, instrumentation +from .session import Session, sessionmaker +from .scoping import scoped_session +from .attributes import QueryableAttribute +from .query import Query +from sqlalchemy.util.compat import inspect_getargspec + +class InstrumentationEvents(event.Events): + """Events related to class instrumentation events. + + The listeners here support being established against + any new style class, that is any object that is a subclass + of 'type'. Events will then be fired off for events + against that class. If the "propagate=True" flag is passed + to event.listen(), the event will fire off for subclasses + of that class as well. + + The Python ``type`` builtin is also accepted as a target, + which when used has the effect of events being emitted + for all classes. + + Note the "propagate" flag here is defaulted to ``True``, + unlike the other class level events where it defaults + to ``False``. This means that new subclasses will also + be the subject of these events, when a listener + is established on a superclass. + + .. versionchanged:: 0.8 - events here will emit based + on comparing the incoming class to the type of class + passed to :func:`.event.listen`. Previously, the + event would fire for any class unconditionally regardless + of what class was sent for listening, despite + documentation which stated the contrary. + + """ + + _target_class_doc = "SomeBaseClass" + _dispatch_target = instrumentation.InstrumentationFactory + + @classmethod + def _accept_with(cls, target): + if isinstance(target, type): + return _InstrumentationEventsHold(target) + else: + return None + + @classmethod + def _listen(cls, event_key, propagate=True, **kw): + target, identifier, fn = \ + event_key.dispatch_target, event_key.identifier, \ + event_key._listen_fn + + def listen(target_cls, *arg): + listen_cls = target() + if propagate and issubclass(target_cls, listen_cls): + return fn(target_cls, *arg) + elif not propagate and target_cls is listen_cls: + return fn(target_cls, *arg) + + def remove(ref): + key = event.registry._EventKey( + None, identifier, listen, + instrumentation._instrumentation_factory) + getattr(instrumentation._instrumentation_factory.dispatch, + identifier).remove(key) + + target = weakref.ref(target.class_, remove) + + event_key.\ + with_dispatch_target(instrumentation._instrumentation_factory).\ + with_wrapper(listen).base_listen(**kw) + + @classmethod + def _clear(cls): + super(InstrumentationEvents, cls)._clear() + instrumentation._instrumentation_factory.dispatch._clear() + + def class_instrument(self, cls): + """Called after the given class is instrumented. + + To get at the :class:`.ClassManager`, use + :func:`.manager_of_class`. + + """ + + def class_uninstrument(self, cls): + """Called before the given class is uninstrumented. + + To get at the :class:`.ClassManager`, use + :func:`.manager_of_class`. + + """ + + def attribute_instrument(self, cls, key, inst): + """Called when an attribute is instrumented.""" + + +class _InstrumentationEventsHold(object): + """temporary marker object used to transfer from _accept_with() to + _listen() on the InstrumentationEvents class. + + """ + + def __init__(self, class_): + self.class_ = class_ + + dispatch = event.dispatcher(InstrumentationEvents) + + +class InstanceEvents(event.Events): + """Define events specific to object lifecycle. + + e.g.:: + + from sqlalchemy import event + + def my_load_listener(target, context): + print "on load!" + + event.listen(SomeClass, 'load', my_load_listener) + + Available targets include: + + * mapped classes + * unmapped superclasses of mapped or to-be-mapped classes + (using the ``propagate=True`` flag) + * :class:`.Mapper` objects + * the :class:`.Mapper` class itself and the :func:`.mapper` + function indicate listening for all mappers. + + .. versionchanged:: 0.8.0 instance events can be associated with + unmapped superclasses of mapped classes. + + Instance events are closely related to mapper events, but + are more specific to the instance and its instrumentation, + rather than its system of persistence. + + When using :class:`.InstanceEvents`, several modifiers are + available to the :func:`.event.listen` function. + + :param propagate=False: When True, the event listener should + be applied to all inheriting classes as well as the + class which is the target of this listener. + :param raw=False: When True, the "target" argument passed + to applicable event listener functions will be the + instance's :class:`.InstanceState` management + object, rather than the mapped instance itself. + + """ + + _target_class_doc = "SomeClass" + + _dispatch_target = instrumentation.ClassManager + + @classmethod + def _new_classmanager_instance(cls, class_, classmanager): + _InstanceEventsHold.populate(class_, classmanager) + + @classmethod + @util.dependencies("sqlalchemy.orm") + def _accept_with(cls, orm, target): + if isinstance(target, instrumentation.ClassManager): + return target + elif isinstance(target, mapperlib.Mapper): + return target.class_manager + elif target is orm.mapper: + return instrumentation.ClassManager + elif isinstance(target, type): + if issubclass(target, mapperlib.Mapper): + return instrumentation.ClassManager + else: + manager = instrumentation.manager_of_class(target) + if manager: + return manager + else: + return _InstanceEventsHold(target) + return None + + @classmethod + def _listen(cls, event_key, raw=False, propagate=False, **kw): + target, identifier, fn = \ + event_key.dispatch_target, event_key.identifier, \ + event_key._listen_fn + + if not raw: + def wrap(state, *arg, **kw): + return fn(state.obj(), *arg, **kw) + event_key = event_key.with_wrapper(wrap) + + event_key.base_listen(propagate=propagate, **kw) + + if propagate: + for mgr in target.subclass_managers(True): + event_key.with_dispatch_target(mgr).base_listen( + propagate=True) + + @classmethod + def _clear(cls): + super(InstanceEvents, cls)._clear() + _InstanceEventsHold._clear() + + def first_init(self, manager, cls): + """Called when the first instance of a particular mapping is called. + + This event is called when the ``__init__`` method of a class + is called the first time for that particular class. The event + invokes before ``__init__`` actually proceeds as well as before + the :meth:`.InstanceEvents.init` event is invoked. + + """ + + def init(self, target, args, kwargs): + """Receive an instance when its constructor is called. + + This method is only called during a userland construction of + an object, in conjunction with the object's constructor, e.g. + its ``__init__`` method. It is not called when an object is + loaded from the database; see the :meth:`.InstanceEvents.load` + event in order to intercept a database load. + + The event is called before the actual ``__init__`` constructor + of the object is called. The ``kwargs`` dictionary may be + modified in-place in order to affect what is passed to + ``__init__``. + + :param target: the mapped instance. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :param args: positional arguments passed to the ``__init__`` method. + This is passed as a tuple and is currently immutable. + :param kwargs: keyword arguments passed to the ``__init__`` method. + This structure *can* be altered in place. + + .. seealso:: + + :meth:`.InstanceEvents.init_failure` + + :meth:`.InstanceEvents.load` + + """ + + def init_failure(self, target, args, kwargs): + """Receive an instance when its constructor has been called, + and raised an exception. + + This method is only called during a userland construction of + an object, in conjunction with the object's constructor, e.g. + its ``__init__`` method. It is not called when an object is loaded + from the database. + + The event is invoked after an exception raised by the ``__init__`` + method is caught. After the event + is invoked, the original exception is re-raised outwards, so that + the construction of the object still raises an exception. The + actual exception and stack trace raised should be present in + ``sys.exc_info()``. + + :param target: the mapped instance. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :param args: positional arguments that were passed to the ``__init__`` + method. + :param kwargs: keyword arguments that were passed to the ``__init__`` + method. + + .. seealso:: + + :meth:`.InstanceEvents.init` + + :meth:`.InstanceEvents.load` + + """ + + def load(self, target, context): + """Receive an object instance after it has been created via + ``__new__``, and after initial attribute population has + occurred. + + This typically occurs when the instance is created based on + incoming result rows, and is only called once for that + instance's lifetime. + + Note that during a result-row load, this method is called upon + the first row received for this instance. Note that some + attributes and collections may or may not be loaded or even + initialized, depending on what's present in the result rows. + + :param target: the mapped instance. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :param context: the :class:`.QueryContext` corresponding to the + current :class:`.Query` in progress. This argument may be + ``None`` if the load does not correspond to a :class:`.Query`, + such as during :meth:`.Session.merge`. + + .. seealso:: + + :meth:`.InstanceEvents.init` + + :meth:`.InstanceEvents.refresh` + + :meth:`.SessionEvents.loaded_as_persistent` + + """ + + def refresh(self, target, context, attrs): + """Receive an object instance after one or more attributes have + been refreshed from a query. + + Contrast this to the :meth:`.InstanceEvents.load` method, which + is invoked when the object is first loaded from a query. + + :param target: the mapped instance. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :param context: the :class:`.QueryContext` corresponding to the + current :class:`.Query` in progress. + :param attrs: sequence of attribute names which + were populated, or None if all column-mapped, non-deferred + attributes were populated. + + .. seealso:: + + :meth:`.InstanceEvents.load` + + """ + + def refresh_flush(self, target, flush_context, attrs): + """Receive an object instance after one or more attributes have + been refreshed within the persistence of the object. + + This event is the same as :meth:`.InstanceEvents.refresh` except + it is invoked within the unit of work flush process, and the values + here typically come from the process of handling an INSERT or + UPDATE, such as via the RETURNING clause or from Python-side default + values. + + .. versionadded:: 1.0.5 + + :param target: the mapped instance. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :param flush_context: Internal :class:`.UOWTransaction` object + which handles the details of the flush. + :param attrs: sequence of attribute names which + were populated. + + """ + + def expire(self, target, attrs): + """Receive an object instance after its attributes or some subset + have been expired. + + 'keys' is a list of attribute names. If None, the entire + state was expired. + + :param target: the mapped instance. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :param attrs: sequence of attribute + names which were expired, or None if all attributes were + expired. + + """ + + def pickle(self, target, state_dict): + """Receive an object instance when its associated state is + being pickled. + + :param target: the mapped instance. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :param state_dict: the dictionary returned by + :class:`.InstanceState.__getstate__`, containing the state + to be pickled. + + """ + + def unpickle(self, target, state_dict): + """Receive an object instance after its associated state has + been unpickled. + + :param target: the mapped instance. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :param state_dict: the dictionary sent to + :class:`.InstanceState.__setstate__`, containing the state + dictionary which was pickled. + + """ + + +class _EventsHold(event.RefCollection): + """Hold onto listeners against unmapped, uninstrumented classes. + + Establish _listen() for that class' mapper/instrumentation when + those objects are created for that class. + + """ + + def __init__(self, class_): + self.class_ = class_ + + @classmethod + def _clear(cls): + cls.all_holds.clear() + + class HoldEvents(object): + _dispatch_target = None + + @classmethod + def _listen(cls, event_key, raw=False, propagate=False, **kw): + target, identifier, fn = \ + event_key.dispatch_target, event_key.identifier, event_key.fn + + if target.class_ in target.all_holds: + collection = target.all_holds[target.class_] + else: + collection = target.all_holds[target.class_] = {} + + event.registry._stored_in_collection(event_key, target) + collection[event_key._key] = (event_key, raw, propagate) + + if propagate: + stack = list(target.class_.__subclasses__()) + while stack: + subclass = stack.pop(0) + stack.extend(subclass.__subclasses__()) + subject = target.resolve(subclass) + if subject is not None: + # we are already going through __subclasses__() + # so leave generic propagate flag False + event_key.with_dispatch_target(subject).\ + listen(raw=raw, propagate=False, **kw) + + def remove(self, event_key): + target, identifier, fn = \ + event_key.dispatch_target, event_key.identifier, event_key.fn + + if isinstance(target, _EventsHold): + collection = target.all_holds[target.class_] + del collection[event_key._key] + + @classmethod + def populate(cls, class_, subject): + for subclass in class_.__mro__: + if subclass in cls.all_holds: + collection = cls.all_holds[subclass] + for event_key, raw, propagate in collection.values(): + if propagate or subclass is class_: + # since we can't be sure in what order different + # classes in a hierarchy are triggered with + # populate(), we rely upon _EventsHold for all event + # assignment, instead of using the generic propagate + # flag. + event_key.with_dispatch_target(subject).\ + listen(raw=raw, propagate=False) + + +class _InstanceEventsHold(_EventsHold): + all_holds = weakref.WeakKeyDictionary() + + def resolve(self, class_): + return instrumentation.manager_of_class(class_) + + class HoldInstanceEvents(_EventsHold.HoldEvents, InstanceEvents): + pass + + dispatch = event.dispatcher(HoldInstanceEvents) + + +class MapperEvents(event.Events): + """Define events specific to mappings. + + e.g.:: + + from sqlalchemy import event + + def my_before_insert_listener(mapper, connection, target): + # execute a stored procedure upon INSERT, + # apply the value to the row to be inserted + target.calculated_value = connection.scalar( + "select my_special_function(%d)" + % target.special_number) + + # associate the listener function with SomeClass, + # to execute during the "before_insert" hook + event.listen( + SomeClass, 'before_insert', my_before_insert_listener) + + Available targets include: + + * mapped classes + * unmapped superclasses of mapped or to-be-mapped classes + (using the ``propagate=True`` flag) + * :class:`.Mapper` objects + * the :class:`.Mapper` class itself and the :func:`.mapper` + function indicate listening for all mappers. + + .. versionchanged:: 0.8.0 mapper events can be associated with + unmapped superclasses of mapped classes. + + Mapper events provide hooks into critical sections of the + mapper, including those related to object instrumentation, + object loading, and object persistence. In particular, the + persistence methods :meth:`~.MapperEvents.before_insert`, + and :meth:`~.MapperEvents.before_update` are popular + places to augment the state being persisted - however, these + methods operate with several significant restrictions. The + user is encouraged to evaluate the + :meth:`.SessionEvents.before_flush` and + :meth:`.SessionEvents.after_flush` methods as more + flexible and user-friendly hooks in which to apply + additional database state during a flush. + + When using :class:`.MapperEvents`, several modifiers are + available to the :func:`.event.listen` function. + + :param propagate=False: When True, the event listener should + be applied to all inheriting mappers and/or the mappers of + inheriting classes, as well as any + mapper which is the target of this listener. + :param raw=False: When True, the "target" argument passed + to applicable event listener functions will be the + instance's :class:`.InstanceState` management + object, rather than the mapped instance itself. + :param retval=False: when True, the user-defined event function + must have a return value, the purpose of which is either to + control subsequent event propagation, or to otherwise alter + the operation in progress by the mapper. Possible return + values are: + + * ``sqlalchemy.orm.interfaces.EXT_CONTINUE`` - continue event + processing normally. + * ``sqlalchemy.orm.interfaces.EXT_STOP`` - cancel all subsequent + event handlers in the chain. + * other values - the return value specified by specific listeners. + + """ + + _target_class_doc = "SomeClass" + _dispatch_target = mapperlib.Mapper + + @classmethod + def _new_mapper_instance(cls, class_, mapper): + _MapperEventsHold.populate(class_, mapper) + + @classmethod + @util.dependencies("sqlalchemy.orm") + def _accept_with(cls, orm, target): + if target is orm.mapper: + return mapperlib.Mapper + elif isinstance(target, type): + if issubclass(target, mapperlib.Mapper): + return target + else: + mapper = _mapper_or_none(target) + if mapper is not None: + return mapper + else: + return _MapperEventsHold(target) + else: + return target + + @classmethod + def _listen( + cls, event_key, raw=False, retval=False, propagate=False, **kw): + target, identifier, fn = \ + event_key.dispatch_target, event_key.identifier, \ + event_key._listen_fn + + if identifier in ("before_configured", "after_configured") and \ + target is not mapperlib.Mapper: + util.warn( + "'before_configured' and 'after_configured' ORM events " + "only invoke with the mapper() function or Mapper class " + "as the target.") + + if not raw or not retval: + if not raw: + meth = getattr(cls, identifier) + try: + target_index = \ + inspect_getargspec(meth)[0].index('target') - 1 + except ValueError: + target_index = None + + def wrap(*arg, **kw): + if not raw and target_index is not None: + arg = list(arg) + arg[target_index] = arg[target_index].obj() + if not retval: + fn(*arg, **kw) + return interfaces.EXT_CONTINUE + else: + return fn(*arg, **kw) + event_key = event_key.with_wrapper(wrap) + + if propagate: + for mapper in target.self_and_descendants: + event_key.with_dispatch_target(mapper).base_listen( + propagate=True, **kw) + else: + event_key.base_listen(**kw) + + @classmethod + def _clear(cls): + super(MapperEvents, cls)._clear() + _MapperEventsHold._clear() + + def instrument_class(self, mapper, class_): + r"""Receive a class when the mapper is first constructed, + before instrumentation is applied to the mapped class. + + This event is the earliest phase of mapper construction. + Most attributes of the mapper are not yet initialized. + + This listener can either be applied to the :class:`.Mapper` + class overall, or to any un-mapped class which serves as a base + for classes that will be mapped (using the ``propagate=True`` flag):: + + Base = declarative_base() + + @event.listens_for(Base, "instrument_class", propagate=True) + def on_new_class(mapper, cls_): + " ... " + + :param mapper: the :class:`.Mapper` which is the target + of this event. + :param class\_: the mapped class. + + """ + + def mapper_configured(self, mapper, class_): + r"""Called when a specific mapper has completed its own configuration + within the scope of the :func:`.configure_mappers` call. + + The :meth:`.MapperEvents.mapper_configured` event is invoked + for each mapper that is encountered when the + :func:`.orm.configure_mappers` function proceeds through the current + list of not-yet-configured mappers. + :func:`.orm.configure_mappers` is typically invoked + automatically as mappings are first used, as well as each time + new mappers have been made available and new mapper use is + detected. + + When the event is called, the mapper should be in its final + state, but **not including backrefs** that may be invoked from + other mappers; they might still be pending within the + configuration operation. Bidirectional relationships that + are instead configured via the + :paramref:`.orm.relationship.back_populates` argument + *will* be fully available, since this style of relationship does not + rely upon other possibly-not-configured mappers to know that they + exist. + + For an event that is guaranteed to have **all** mappers ready + to go including backrefs that are defined only on other + mappings, use the :meth:`.MapperEvents.after_configured` + event; this event invokes only after all known mappings have been + fully configured. + + The :meth:`.MapperEvents.mapper_configured` event, unlike + :meth:`.MapperEvents.before_configured` or + :meth:`.MapperEvents.after_configured`, + is called for each mapper/class individually, and the mapper is + passed to the event itself. It also is called exactly once for + a particular mapper. The event is therefore useful for + configurational steps that benefit from being invoked just once + on a specific mapper basis, which don't require that "backref" + configurations are necessarily ready yet. + + :param mapper: the :class:`.Mapper` which is the target + of this event. + :param class\_: the mapped class. + + .. seealso:: + + :meth:`.MapperEvents.before_configured` + + :meth:`.MapperEvents.after_configured` + + """ + # TODO: need coverage for this event + + def before_configured(self): + """Called before a series of mappers have been configured. + + The :meth:`.MapperEvents.before_configured` event is invoked + each time the :func:`.orm.configure_mappers` function is + invoked, before the function has done any of its work. + :func:`.orm.configure_mappers` is typically invoked + automatically as mappings are first used, as well as each time + new mappers have been made available and new mapper use is + detected. + + This event can **only** be applied to the :class:`.Mapper` class + or :func:`.mapper` function, and not to individual mappings or + mapped classes. It is only invoked for all mappings as a whole:: + + from sqlalchemy.orm import mapper + + @event.listens_for(mapper, "before_configured") + def go(): + # ... + + Constrast this event to :meth:`.MapperEvents.after_configured`, + which is invoked after the series of mappers has been configured, + as well as :meth:`.MapperEvents.mapper_configured`, which is invoked + on a per-mapper basis as each one is configured to the extent possible. + + Theoretically this event is called once per + application, but is actually called any time new mappers + are to be affected by a :func:`.orm.configure_mappers` + call. If new mappings are constructed after existing ones have + already been used, this event will likely be called again. To ensure + that a particular event is only called once and no further, the + ``once=True`` argument (new in 0.9.4) can be applied:: + + from sqlalchemy.orm import mapper + + @event.listens_for(mapper, "before_configured", once=True) + def go(): + # ... + + + .. versionadded:: 0.9.3 + + + .. seealso:: + + :meth:`.MapperEvents.mapper_configured` + + :meth:`.MapperEvents.after_configured` + + """ + + def after_configured(self): + """Called after a series of mappers have been configured. + + The :meth:`.MapperEvents.after_configured` event is invoked + each time the :func:`.orm.configure_mappers` function is + invoked, after the function has completed its work. + :func:`.orm.configure_mappers` is typically invoked + automatically as mappings are first used, as well as each time + new mappers have been made available and new mapper use is + detected. + + Contrast this event to the :meth:`.MapperEvents.mapper_configured` + event, which is called on a per-mapper basis while the configuration + operation proceeds; unlike that event, when this event is invoked, + all cross-configurations (e.g. backrefs) will also have been made + available for any mappers that were pending. + Also constrast to :meth:`.MapperEvents.before_configured`, + which is invoked before the series of mappers has been configured. + + This event can **only** be applied to the :class:`.Mapper` class + or :func:`.mapper` function, and not to individual mappings or + mapped classes. It is only invoked for all mappings as a whole:: + + from sqlalchemy.orm import mapper + + @event.listens_for(mapper, "after_configured") + def go(): + # ... + + Theoretically this event is called once per + application, but is actually called any time new mappers + have been affected by a :func:`.orm.configure_mappers` + call. If new mappings are constructed after existing ones have + already been used, this event will likely be called again. To ensure + that a particular event is only called once and no further, the + ``once=True`` argument (new in 0.9.4) can be applied:: + + from sqlalchemy.orm import mapper + + @event.listens_for(mapper, "after_configured", once=True) + def go(): + # ... + + .. seealso:: + + :meth:`.MapperEvents.mapper_configured` + + :meth:`.MapperEvents.before_configured` + + """ + + def before_insert(self, mapper, connection, target): + """Receive an object instance before an INSERT statement + is emitted corresponding to that instance. + + This event is used to modify local, non-object related + attributes on the instance before an INSERT occurs, as well + as to emit additional SQL statements on the given + connection. + + The event is often called for a batch of objects of the + same class before their INSERT statements are emitted at + once in a later step. In the extremely rare case that + this is not desirable, the :func:`.mapper` can be + configured with ``batch=False``, which will cause + batches of instances to be broken up into individual + (and more poorly performing) event->persist->event + steps. + + .. warning:: + + Mapper-level flush events only allow **very limited operations**, + on attributes local to the row being operated upon only, + as well as allowing any SQL to be emitted on the given + :class:`.Connection`. **Please read fully** the notes + at :ref:`session_persistence_mapper` for guidelines on using + these methods; generally, the :meth:`.SessionEvents.before_flush` + method should be preferred for general on-flush changes. + + :param mapper: the :class:`.Mapper` which is the target + of this event. + :param connection: the :class:`.Connection` being used to + emit INSERT statements for this instance. This + provides a handle into the current transaction on the + target database specific to this instance. + :param target: the mapped instance being persisted. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :return: No return value is supported by this event. + + .. seealso:: + + :ref:`session_persistence_events` + + """ + + def after_insert(self, mapper, connection, target): + """Receive an object instance after an INSERT statement + is emitted corresponding to that instance. + + This event is used to modify in-Python-only + state on the instance after an INSERT occurs, as well + as to emit additional SQL statements on the given + connection. + + The event is often called for a batch of objects of the + same class after their INSERT statements have been + emitted at once in a previous step. In the extremely + rare case that this is not desirable, the + :func:`.mapper` can be configured with ``batch=False``, + which will cause batches of instances to be broken up + into individual (and more poorly performing) + event->persist->event steps. + + .. warning:: + + Mapper-level flush events only allow **very limited operations**, + on attributes local to the row being operated upon only, + as well as allowing any SQL to be emitted on the given + :class:`.Connection`. **Please read fully** the notes + at :ref:`session_persistence_mapper` for guidelines on using + these methods; generally, the :meth:`.SessionEvents.before_flush` + method should be preferred for general on-flush changes. + + :param mapper: the :class:`.Mapper` which is the target + of this event. + :param connection: the :class:`.Connection` being used to + emit INSERT statements for this instance. This + provides a handle into the current transaction on the + target database specific to this instance. + :param target: the mapped instance being persisted. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :return: No return value is supported by this event. + + .. seealso:: + + :ref:`session_persistence_events` + + """ + + def before_update(self, mapper, connection, target): + """Receive an object instance before an UPDATE statement + is emitted corresponding to that instance. + + This event is used to modify local, non-object related + attributes on the instance before an UPDATE occurs, as well + as to emit additional SQL statements on the given + connection. + + This method is called for all instances that are + marked as "dirty", *even those which have no net changes + to their column-based attributes*. An object is marked + as dirty when any of its column-based attributes have a + "set attribute" operation called or when any of its + collections are modified. If, at update time, no + column-based attributes have any net changes, no UPDATE + statement will be issued. This means that an instance + being sent to :meth:`~.MapperEvents.before_update` is + *not* a guarantee that an UPDATE statement will be + issued, although you can affect the outcome here by + modifying attributes so that a net change in value does + exist. + + To detect if the column-based attributes on the object have net + changes, and will therefore generate an UPDATE statement, use + ``object_session(instance).is_modified(instance, + include_collections=False)``. + + The event is often called for a batch of objects of the + same class before their UPDATE statements are emitted at + once in a later step. In the extremely rare case that + this is not desirable, the :func:`.mapper` can be + configured with ``batch=False``, which will cause + batches of instances to be broken up into individual + (and more poorly performing) event->persist->event + steps. + + .. warning:: + + Mapper-level flush events only allow **very limited operations**, + on attributes local to the row being operated upon only, + as well as allowing any SQL to be emitted on the given + :class:`.Connection`. **Please read fully** the notes + at :ref:`session_persistence_mapper` for guidelines on using + these methods; generally, the :meth:`.SessionEvents.before_flush` + method should be preferred for general on-flush changes. + + :param mapper: the :class:`.Mapper` which is the target + of this event. + :param connection: the :class:`.Connection` being used to + emit UPDATE statements for this instance. This + provides a handle into the current transaction on the + target database specific to this instance. + :param target: the mapped instance being persisted. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :return: No return value is supported by this event. + + .. seealso:: + + :ref:`session_persistence_events` + + """ + + def after_update(self, mapper, connection, target): + """Receive an object instance after an UPDATE statement + is emitted corresponding to that instance. + + This event is used to modify in-Python-only + state on the instance after an UPDATE occurs, as well + as to emit additional SQL statements on the given + connection. + + This method is called for all instances that are + marked as "dirty", *even those which have no net changes + to their column-based attributes*, and for which + no UPDATE statement has proceeded. An object is marked + as dirty when any of its column-based attributes have a + "set attribute" operation called or when any of its + collections are modified. If, at update time, no + column-based attributes have any net changes, no UPDATE + statement will be issued. This means that an instance + being sent to :meth:`~.MapperEvents.after_update` is + *not* a guarantee that an UPDATE statement has been + issued. + + To detect if the column-based attributes on the object have net + changes, and therefore resulted in an UPDATE statement, use + ``object_session(instance).is_modified(instance, + include_collections=False)``. + + The event is often called for a batch of objects of the + same class after their UPDATE statements have been emitted at + once in a previous step. In the extremely rare case that + this is not desirable, the :func:`.mapper` can be + configured with ``batch=False``, which will cause + batches of instances to be broken up into individual + (and more poorly performing) event->persist->event + steps. + + .. warning:: + + Mapper-level flush events only allow **very limited operations**, + on attributes local to the row being operated upon only, + as well as allowing any SQL to be emitted on the given + :class:`.Connection`. **Please read fully** the notes + at :ref:`session_persistence_mapper` for guidelines on using + these methods; generally, the :meth:`.SessionEvents.before_flush` + method should be preferred for general on-flush changes. + + :param mapper: the :class:`.Mapper` which is the target + of this event. + :param connection: the :class:`.Connection` being used to + emit UPDATE statements for this instance. This + provides a handle into the current transaction on the + target database specific to this instance. + :param target: the mapped instance being persisted. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :return: No return value is supported by this event. + + .. seealso:: + + :ref:`session_persistence_events` + + """ + + def before_delete(self, mapper, connection, target): + """Receive an object instance before a DELETE statement + is emitted corresponding to that instance. + + This event is used to emit additional SQL statements on + the given connection as well as to perform application + specific bookkeeping related to a deletion event. + + The event is often called for a batch of objects of the + same class before their DELETE statements are emitted at + once in a later step. + + .. warning:: + + Mapper-level flush events only allow **very limited operations**, + on attributes local to the row being operated upon only, + as well as allowing any SQL to be emitted on the given + :class:`.Connection`. **Please read fully** the notes + at :ref:`session_persistence_mapper` for guidelines on using + these methods; generally, the :meth:`.SessionEvents.before_flush` + method should be preferred for general on-flush changes. + + :param mapper: the :class:`.Mapper` which is the target + of this event. + :param connection: the :class:`.Connection` being used to + emit DELETE statements for this instance. This + provides a handle into the current transaction on the + target database specific to this instance. + :param target: the mapped instance being deleted. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :return: No return value is supported by this event. + + .. seealso:: + + :ref:`session_persistence_events` + + """ + + def after_delete(self, mapper, connection, target): + """Receive an object instance after a DELETE statement + has been emitted corresponding to that instance. + + This event is used to emit additional SQL statements on + the given connection as well as to perform application + specific bookkeeping related to a deletion event. + + The event is often called for a batch of objects of the + same class after their DELETE statements have been emitted at + once in a previous step. + + .. warning:: + + Mapper-level flush events only allow **very limited operations**, + on attributes local to the row being operated upon only, + as well as allowing any SQL to be emitted on the given + :class:`.Connection`. **Please read fully** the notes + at :ref:`session_persistence_mapper` for guidelines on using + these methods; generally, the :meth:`.SessionEvents.before_flush` + method should be preferred for general on-flush changes. + + :param mapper: the :class:`.Mapper` which is the target + of this event. + :param connection: the :class:`.Connection` being used to + emit DELETE statements for this instance. This + provides a handle into the current transaction on the + target database specific to this instance. + :param target: the mapped instance being deleted. If + the event is configured with ``raw=True``, this will + instead be the :class:`.InstanceState` state-management + object associated with the instance. + :return: No return value is supported by this event. + + .. seealso:: + + :ref:`session_persistence_events` + + """ + + +class _MapperEventsHold(_EventsHold): + all_holds = weakref.WeakKeyDictionary() + + def resolve(self, class_): + return _mapper_or_none(class_) + + class HoldMapperEvents(_EventsHold.HoldEvents, MapperEvents): + pass + + dispatch = event.dispatcher(HoldMapperEvents) + + +class SessionEvents(event.Events): + """Define events specific to :class:`.Session` lifecycle. + + e.g.:: + + from sqlalchemy import event + from sqlalchemy.orm import sessionmaker + + def my_before_commit(session): + print "before commit!" + + Session = sessionmaker() + + event.listen(Session, "before_commit", my_before_commit) + + The :func:`~.event.listen` function will accept + :class:`.Session` objects as well as the return result + of :class:`~.sessionmaker()` and :class:`~.scoped_session()`. + + Additionally, it accepts the :class:`.Session` class which + will apply listeners to all :class:`.Session` instances + globally. + + """ + + _target_class_doc = "SomeSessionOrFactory" + + _dispatch_target = Session + + @classmethod + def _accept_with(cls, target): + if isinstance(target, scoped_session): + + target = target.session_factory + if not isinstance(target, sessionmaker) and \ + ( + not isinstance(target, type) or + not issubclass(target, Session) + ): + raise exc.ArgumentError( + "Session event listen on a scoped_session " + "requires that its creation callable " + "is associated with the Session class.") + + if isinstance(target, sessionmaker): + return target.class_ + elif isinstance(target, type): + if issubclass(target, scoped_session): + return Session + elif issubclass(target, Session): + return target + elif isinstance(target, Session): + return target + else: + return None + + def after_transaction_create(self, session, transaction): + """Execute when a new :class:`.SessionTransaction` is created. + + This event differs from :meth:`~.SessionEvents.after_begin` + in that it occurs for each :class:`.SessionTransaction` + overall, as opposed to when transactions are begun + on individual database connections. It is also invoked + for nested transactions and subtransactions, and is always + matched by a corresponding + :meth:`~.SessionEvents.after_transaction_end` event + (assuming normal operation of the :class:`.Session`). + + :param session: the target :class:`.Session`. + :param transaction: the target :class:`.SessionTransaction`. + + To detect if this is the outermost + :class:`.SessionTransaction`, as opposed to a "subtransaction" or a + SAVEPOINT, test that the :attr:`.SessionTransaction.parent` attribute + is ``None``:: + + @event.listens_for(session, "after_transaction_create") + def after_transaction_create(session, transaction): + if transaction.parent is None: + # work with top-level transaction + + To detect if the :class:`.SessionTransaction` is a SAVEPOINT, use the + :attr:`.SessionTransaction.nested` attribute:: + + @event.listens_for(session, "after_transaction_create") + def after_transaction_create(session, transaction): + if transaction.nested: + # work with SAVEPOINT transaction + + + .. seealso:: + + :class:`.SessionTransaction` + + :meth:`~.SessionEvents.after_transaction_end` + + """ + + def after_transaction_end(self, session, transaction): + """Execute when the span of a :class:`.SessionTransaction` ends. + + This event differs from :meth:`~.SessionEvents.after_commit` + in that it corresponds to all :class:`.SessionTransaction` + objects in use, including those for nested transactions + and subtransactions, and is always matched by a corresponding + :meth:`~.SessionEvents.after_transaction_create` event. + + :param session: the target :class:`.Session`. + :param transaction: the target :class:`.SessionTransaction`. + + To detect if this is the outermost + :class:`.SessionTransaction`, as opposed to a "subtransaction" or a + SAVEPOINT, test that the :attr:`.SessionTransaction.parent` attribute + is ``None``:: + + @event.listens_for(session, "after_transaction_create") + def after_transaction_end(session, transaction): + if transaction.parent is None: + # work with top-level transaction + + To detect if the :class:`.SessionTransaction` is a SAVEPOINT, use the + :attr:`.SessionTransaction.nested` attribute:: + + @event.listens_for(session, "after_transaction_create") + def after_transaction_end(session, transaction): + if transaction.nested: + # work with SAVEPOINT transaction + + + .. seealso:: + + :class:`.SessionTransaction` + + :meth:`~.SessionEvents.after_transaction_create` + + """ + + def before_commit(self, session): + """Execute before commit is called. + + .. note:: + + The :meth:`~.SessionEvents.before_commit` hook is *not* per-flush, + that is, the :class:`.Session` can emit SQL to the database + many times within the scope of a transaction. + For interception of these events, use the + :meth:`~.SessionEvents.before_flush`, + :meth:`~.SessionEvents.after_flush`, or + :meth:`~.SessionEvents.after_flush_postexec` + events. + + :param session: The target :class:`.Session`. + + .. seealso:: + + :meth:`~.SessionEvents.after_commit` + + :meth:`~.SessionEvents.after_begin` + + :meth:`~.SessionEvents.after_transaction_create` + + :meth:`~.SessionEvents.after_transaction_end` + + """ + + def after_commit(self, session): + """Execute after a commit has occurred. + + .. note:: + + The :meth:`~.SessionEvents.after_commit` hook is *not* per-flush, + that is, the :class:`.Session` can emit SQL to the database + many times within the scope of a transaction. + For interception of these events, use the + :meth:`~.SessionEvents.before_flush`, + :meth:`~.SessionEvents.after_flush`, or + :meth:`~.SessionEvents.after_flush_postexec` + events. + + .. note:: + + The :class:`.Session` is not in an active transaction + when the :meth:`~.SessionEvents.after_commit` event is invoked, + and therefore can not emit SQL. To emit SQL corresponding to + every transaction, use the :meth:`~.SessionEvents.before_commit` + event. + + :param session: The target :class:`.Session`. + + .. seealso:: + + :meth:`~.SessionEvents.before_commit` + + :meth:`~.SessionEvents.after_begin` + + :meth:`~.SessionEvents.after_transaction_create` + + :meth:`~.SessionEvents.after_transaction_end` + + """ + + def after_rollback(self, session): + """Execute after a real DBAPI rollback has occurred. + + Note that this event only fires when the *actual* rollback against + the database occurs - it does *not* fire each time the + :meth:`.Session.rollback` method is called, if the underlying + DBAPI transaction has already been rolled back. In many + cases, the :class:`.Session` will not be in + an "active" state during this event, as the current + transaction is not valid. To acquire a :class:`.Session` + which is active after the outermost rollback has proceeded, + use the :meth:`.SessionEvents.after_soft_rollback` event, checking the + :attr:`.Session.is_active` flag. + + :param session: The target :class:`.Session`. + + """ + + def after_soft_rollback(self, session, previous_transaction): + """Execute after any rollback has occurred, including "soft" + rollbacks that don't actually emit at the DBAPI level. + + This corresponds to both nested and outer rollbacks, i.e. + the innermost rollback that calls the DBAPI's + rollback() method, as well as the enclosing rollback + calls that only pop themselves from the transaction stack. + + The given :class:`.Session` can be used to invoke SQL and + :meth:`.Session.query` operations after an outermost rollback + by first checking the :attr:`.Session.is_active` flag:: + + @event.listens_for(Session, "after_soft_rollback") + def do_something(session, previous_transaction): + if session.is_active: + session.execute("select * from some_table") + + :param session: The target :class:`.Session`. + :param previous_transaction: The :class:`.SessionTransaction` + transactional marker object which was just closed. The current + :class:`.SessionTransaction` for the given :class:`.Session` is + available via the :attr:`.Session.transaction` attribute. + + .. versionadded:: 0.7.3 + + """ + + def before_flush(self, session, flush_context, instances): + """Execute before flush process has started. + + :param session: The target :class:`.Session`. + :param flush_context: Internal :class:`.UOWTransaction` object + which handles the details of the flush. + :param instances: Usually ``None``, this is the collection of + objects which can be passed to the :meth:`.Session.flush` method + (note this usage is deprecated). + + .. seealso:: + + :meth:`~.SessionEvents.after_flush` + + :meth:`~.SessionEvents.after_flush_postexec` + + :ref:`session_persistence_events` + + """ + + def after_flush(self, session, flush_context): + """Execute after flush has completed, but before commit has been + called. + + Note that the session's state is still in pre-flush, i.e. 'new', + 'dirty', and 'deleted' lists still show pre-flush state as well + as the history settings on instance attributes. + + :param session: The target :class:`.Session`. + :param flush_context: Internal :class:`.UOWTransaction` object + which handles the details of the flush. + + .. seealso:: + + :meth:`~.SessionEvents.before_flush` + + :meth:`~.SessionEvents.after_flush_postexec` + + :ref:`session_persistence_events` + + """ + + def after_flush_postexec(self, session, flush_context): + """Execute after flush has completed, and after the post-exec + state occurs. + + This will be when the 'new', 'dirty', and 'deleted' lists are in + their final state. An actual commit() may or may not have + occurred, depending on whether or not the flush started its own + transaction or participated in a larger transaction. + + :param session: The target :class:`.Session`. + :param flush_context: Internal :class:`.UOWTransaction` object + which handles the details of the flush. + + + .. seealso:: + + :meth:`~.SessionEvents.before_flush` + + :meth:`~.SessionEvents.after_flush` + + :ref:`session_persistence_events` + + """ + + def after_begin(self, session, transaction, connection): + """Execute after a transaction is begun on a connection + + :param session: The target :class:`.Session`. + :param transaction: The :class:`.SessionTransaction`. + :param connection: The :class:`~.engine.Connection` object + which will be used for SQL statements. + + .. seealso:: + + :meth:`~.SessionEvents.before_commit` + + :meth:`~.SessionEvents.after_commit` + + :meth:`~.SessionEvents.after_transaction_create` + + :meth:`~.SessionEvents.after_transaction_end` + + """ + + def before_attach(self, session, instance): + """Execute before an instance is attached to a session. + + This is called before an add, delete or merge causes + the object to be part of the session. + + .. versionadded:: 0.8. Note that :meth:`~.SessionEvents.after_attach` + now fires off after the item is part of the session. + :meth:`.before_attach` is provided for those cases where + the item should not yet be part of the session state. + + .. seealso:: + + :meth:`~.SessionEvents.after_attach` + + :ref:`session_lifecycle_events` + + """ + + def after_attach(self, session, instance): + """Execute after an instance is attached to a session. + + This is called after an add, delete or merge. + + .. note:: + + As of 0.8, this event fires off *after* the item + has been fully associated with the session, which is + different than previous releases. For event + handlers that require the object not yet + be part of session state (such as handlers which + may autoflush while the target object is not + yet complete) consider the + new :meth:`.before_attach` event. + + .. seealso:: + + :meth:`~.SessionEvents.before_attach` + + :ref:`session_lifecycle_events` + + """ + + @event._legacy_signature("0.9", + ["session", "query", "query_context", "result"], + lambda update_context: ( + update_context.session, + update_context.query, + update_context.context, + update_context.result)) + def after_bulk_update(self, update_context): + """Execute after a bulk update operation to the session. + + This is called as a result of the :meth:`.Query.update` method. + + :param update_context: an "update context" object which contains + details about the update, including these attributes: + + * ``session`` - the :class:`.Session` involved + * ``query`` -the :class:`.Query` object that this update operation + was called upon. + * ``context`` The :class:`.QueryContext` object, corresponding + to the invocation of an ORM query. + * ``result`` the :class:`.ResultProxy` returned as a result of the + bulk UPDATE operation. + + + """ + + @event._legacy_signature("0.9", + ["session", "query", "query_context", "result"], + lambda delete_context: ( + delete_context.session, + delete_context.query, + delete_context.context, + delete_context.result)) + def after_bulk_delete(self, delete_context): + """Execute after a bulk delete operation to the session. + + This is called as a result of the :meth:`.Query.delete` method. + + :param delete_context: a "delete context" object which contains + details about the update, including these attributes: + + * ``session`` - the :class:`.Session` involved + * ``query`` -the :class:`.Query` object that this update operation + was called upon. + * ``context`` The :class:`.QueryContext` object, corresponding + to the invocation of an ORM query. + * ``result`` the :class:`.ResultProxy` returned as a result of the + bulk DELETE operation. + + + """ + + def transient_to_pending(self, session, instance): + """Intercept the "transient to pending" transition for a specific object. + + This event is a specialization of the + :meth:`.SessionEvents.after_attach` event which is only invoked + for this specific transition. It is invoked typically during the + :meth:`.Session.add` call. + + :param session: target :class:`.Session` + + :param instance: the ORM-mapped instance being operated upon. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`session_lifecycle_events` + + """ + + def pending_to_transient(self, session, instance): + """Intercept the "pending to transient" transition for a specific object. + + This less common transition occurs when an pending object that has + not been flushed is evicted from the session; this can occur + when the :meth:`.Session.rollback` method rolls back the transaction, + or when the :meth:`.Session.expunge` method is used. + + :param session: target :class:`.Session` + + :param instance: the ORM-mapped instance being operated upon. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`session_lifecycle_events` + + """ + + def persistent_to_transient(self, session, instance): + """Intercept the "persistent to transient" transition for a specific object. + + This less common transition occurs when an pending object that has + has been flushed is evicted from the session; this can occur + when the :meth:`.Session.rollback` method rolls back the transaction. + + :param session: target :class:`.Session` + + :param instance: the ORM-mapped instance being operated upon. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`session_lifecycle_events` + + """ + + def pending_to_persistent(self, session, instance): + """Intercept the "pending to persistent"" transition for a specific object. + + This event is invoked within the flush process, and is + similar to scanning the :attr:`.Session.new` collection within + the :meth:`.SessionEvents.after_flush` event. However, in this + case the object has already been moved to the persistent state + when the event is called. + + :param session: target :class:`.Session` + + :param instance: the ORM-mapped instance being operated upon. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`session_lifecycle_events` + + """ + + def detached_to_persistent(self, session, instance): + """Intercept the "detached to persistent" transition for a specific object. + + This event is a specialization of the + :meth:`.SessionEvents.after_attach` event which is only invoked + for this specific transition. It is invoked typically during the + :meth:`.Session.add` call, as well as during the + :meth:`.Session.delete` call if the object was not previously + associated with the + :class:`.Session` (note that an object marked as "deleted" remains + in the "persistent" state until the flush proceeds). + + .. note:: + + If the object becomes persistent as part of a call to + :meth:`.Session.delete`, the object is **not** yet marked as + deleted when this event is called. To detect deleted objects, + check the ``deleted`` flag sent to the + :meth:`.SessionEvents.persistent_to_detached` to event after the + flush proceeds, or check the :attr:`.Session.deleted` collection + within the :meth:`.SessionEvents.before_flush` event if deleted + objects need to be intercepted before the flush. + + :param session: target :class:`.Session` + + :param instance: the ORM-mapped instance being operated upon. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`session_lifecycle_events` + + """ + + def loaded_as_persistent(self, session, instance): + """Intercept the "loaded as persistent" transition for a specific object. + + This event is invoked within the ORM loading process, and is invoked + very similarly to the :meth:`.InstanceEvents.load` event. However, + the event here is linkable to a :class:`.Session` class or instance, + rather than to a mapper or class hierarchy, and integrates + with the other session lifecycle events smoothly. The object + is guaranteed to be present in the session's identity map when + this event is called. + + + :param session: target :class:`.Session` + + :param instance: the ORM-mapped instance being operated upon. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`session_lifecycle_events` + + """ + + def persistent_to_deleted(self, session, instance): + """Intercept the "persistent to deleted" transition for a specific object. + + This event is invoked when a persistent object's identity + is deleted from the database within a flush, however the object + still remains associated with the :class:`.Session` until the + transaction completes. + + If the transaction is rolled back, the object moves again + to the persistent state, and the + :meth:`.SessionEvents.deleted_to_persistent` event is called. + If the transaction is committed, the object becomes detached, + which will emit the :meth:`.SessionEvents.deleted_to_detached` + event. + + Note that while the :meth:`.Session.delete` method is the primary + public interface to mark an object as deleted, many objects + get deleted due to cascade rules, which are not always determined + until flush time. Therefore, there's no way to catch + every object that will be deleted until the flush has proceeded. + the :meth:`.SessionEvents.persistent_to_deleted` event is therefore + invoked at the end of a flush. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`session_lifecycle_events` + + """ + + def deleted_to_persistent(self, session, instance): + """Intercept the "deleted to persistent" transition for a specific object. + + This transition occurs only when an object that's been deleted + successfully in a flush is restored due to a call to + :meth:`.Session.rollback`. The event is not called under + any other circumstances. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`session_lifecycle_events` + + """ + + def deleted_to_detached(self, session, instance): + """Intercept the "deleted to detached" transition for a specific object. + + This event is invoked when a deleted object is evicted + from the session. The typical case when this occurs is when + the transaction for a :class:`.Session` in which the object + was deleted is committed; the object moves from the deleted + state to the detached state. + + It is also invoked for objects that were deleted in a flush + when the :meth:`.Session.expunge_all` or :meth:`.Session.close` + events are called, as well as if the object is individually + expunged from its deleted state via :meth:`.Session.expunge`. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`session_lifecycle_events` + + """ + + def persistent_to_detached(self, session, instance): + """Intercept the "persistent to detached" transition for a specific object. + + This event is invoked when a persistent object is evicted + from the session. There are many conditions that cause this + to happen, including: + + * using a method such as :meth:`.Session.expunge` + or :meth:`.Session.close` + + * Calling the :meth:`.Session.rollback` method, when the object + was part of an INSERT statement for that session's transaction + + + :param session: target :class:`.Session` + + :param instance: the ORM-mapped instance being operated upon. + + :param deleted: boolean. If True, indicates this object moved + to the detached state because it was marked as deleted and flushed. + + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`session_lifecycle_events` + + """ + + +class AttributeEvents(event.Events): + """Define events for object attributes. + + These are typically defined on the class-bound descriptor for the + target class. + + e.g.:: + + from sqlalchemy import event + + def my_append_listener(target, value, initiator): + print "received append event for target: %s" % target + + event.listen(MyClass.collection, 'append', my_append_listener) + + Listeners have the option to return a possibly modified version + of the value, when the ``retval=True`` flag is passed + to :func:`~.event.listen`:: + + def validate_phone(target, value, oldvalue, initiator): + "Strip non-numeric characters from a phone number" + + return re.sub(r'\D', '', value) + + # setup listener on UserContact.phone attribute, instructing + # it to use the return value + listen(UserContact.phone, 'set', validate_phone, retval=True) + + A validation function like the above can also raise an exception + such as :exc:`ValueError` to halt the operation. + + Several modifiers are available to the :func:`~.event.listen` function. + + :param active_history=False: When True, indicates that the + "set" event would like to receive the "old" value being + replaced unconditionally, even if this requires firing off + database loads. Note that ``active_history`` can also be + set directly via :func:`.column_property` and + :func:`.relationship`. + + :param propagate=False: When True, the listener function will + be established not just for the class attribute given, but + for attributes of the same name on all current subclasses + of that class, as well as all future subclasses of that + class, using an additional listener that listens for + instrumentation events. + :param raw=False: When True, the "target" argument to the + event will be the :class:`.InstanceState` management + object, rather than the mapped instance itself. + :param retval=False: when True, the user-defined event + listening must return the "value" argument from the + function. This gives the listening function the opportunity + to change the value that is ultimately used for a "set" + or "append" event. + + """ + + _target_class_doc = "SomeClass.some_attribute" + _dispatch_target = QueryableAttribute + + @staticmethod + def _set_dispatch(cls, dispatch_cls): + dispatch = event.Events._set_dispatch(cls, dispatch_cls) + dispatch_cls._active_history = False + return dispatch + + @classmethod + def _accept_with(cls, target): + # TODO: coverage + if isinstance(target, interfaces.MapperProperty): + return getattr(target.parent.class_, target.key) + else: + return target + + @classmethod + def _listen(cls, event_key, active_history=False, + raw=False, retval=False, + propagate=False): + + target, identifier, fn = \ + event_key.dispatch_target, event_key.identifier, \ + event_key._listen_fn + + if active_history: + target.dispatch._active_history = True + + if not raw or not retval: + def wrap(target, value, *arg): + if not raw: + target = target.obj() + if not retval: + fn(target, value, *arg) + return value + else: + return fn(target, value, *arg) + event_key = event_key.with_wrapper(wrap) + + event_key.base_listen(propagate=propagate) + + if propagate: + manager = instrumentation.manager_of_class(target.class_) + + for mgr in manager.subclass_managers(True): + event_key.with_dispatch_target( + mgr[target.key]).base_listen(propagate=True) + + def append(self, target, value, initiator): + """Receive a collection append event. + + :param target: the object instance receiving the event. + If the listener is registered with ``raw=True``, this will + be the :class:`.InstanceState` object. + :param value: the value being appended. If this listener + is registered with ``retval=True``, the listener + function must return this value, or a new value which + replaces it. + :param initiator: An instance of :class:`.attributes.Event` + representing the initiation of the event. May be modified + from its original value by backref handlers in order to control + chained event propagation. + + .. versionchanged:: 0.9.0 the ``initiator`` argument is now + passed as a :class:`.attributes.Event` object, and may be + modified by backref handlers within a chain of backref-linked + events. + + :return: if the event was registered with ``retval=True``, + the given value, or a new effective value, should be returned. + + """ + + def remove(self, target, value, initiator): + """Receive a collection remove event. + + :param target: the object instance receiving the event. + If the listener is registered with ``raw=True``, this will + be the :class:`.InstanceState` object. + :param value: the value being removed. + :param initiator: An instance of :class:`.attributes.Event` + representing the initiation of the event. May be modified + from its original value by backref handlers in order to control + chained event propagation. + + .. versionchanged:: 0.9.0 the ``initiator`` argument is now + passed as a :class:`.attributes.Event` object, and may be + modified by backref handlers within a chain of backref-linked + events. + + :return: No return value is defined for this event. + """ + + def set(self, target, value, oldvalue, initiator): + """Receive a scalar set event. + + :param target: the object instance receiving the event. + If the listener is registered with ``raw=True``, this will + be the :class:`.InstanceState` object. + :param value: the value being set. If this listener + is registered with ``retval=True``, the listener + function must return this value, or a new value which + replaces it. + :param oldvalue: the previous value being replaced. This + may also be the symbol ``NEVER_SET`` or ``NO_VALUE``. + If the listener is registered with ``active_history=True``, + the previous value of the attribute will be loaded from + the database if the existing value is currently unloaded + or expired. + :param initiator: An instance of :class:`.attributes.Event` + representing the initiation of the event. May be modified + from its original value by backref handlers in order to control + chained event propagation. + + .. versionchanged:: 0.9.0 the ``initiator`` argument is now + passed as a :class:`.attributes.Event` object, and may be + modified by backref handlers within a chain of backref-linked + events. + + :return: if the event was registered with ``retval=True``, + the given value, or a new effective value, should be returned. + + """ + + def init_scalar(self, target, value, dict_): + """Receive a scalar "init" event. + + This event is invoked when an uninitialized, unpersisted scalar + attribute is accessed. A value of ``None`` is typically returned + in this case; no changes are made to the object's state. + + The event handler can alter this behavior in two ways. + One is that a value other than ``None`` may be returned. The other + is that the value may be established as part of the object's state, + which will also have the effect that it is persisted. + + Typical use is to establish a specific default value of an attribute + upon access:: + + SOME_CONSTANT = 3.1415926 + + @event.listens_for( + MyClass.some_attribute, "init_scalar", + retval=True, propagate=True) + def _init_some_attribute(target, dict_, value): + dict_['some_attribute'] = SOME_CONSTANT + return SOME_CONSTANT + + Above, we initialize the attribute ``MyClass.some_attribute`` to the + value of ``SOME_CONSTANT``. The above code includes the following + features: + + * By setting the value ``SOME_CONSTANT`` in the given ``dict_``, + we indicate that the value is to be persisted to the database. + **The given value is only persisted to the database if we + explicitly associate it with the object**. The ``dict_`` given + is the ``__dict__`` element of the mapped object, assuming the + default attribute instrumentation system is in place. + + * By establishing the ``retval=True`` flag, the value we return + from the function will be returned by the attribute getter. + Without this flag, the event is assumed to be a passive observer + and the return value of our function is ignored. + + * The ``propagate=True`` flag is significant if the mapped class + includes inheriting subclasses, which would also make use of this + event listener. Without this flag, an inheriting subclass will + not use our event handler. + + When we establish the value in the given dictionary, the value will + be used in the INSERT statement established by the unit of work. + Normally, the default returned value of ``None`` is not established as + part of the object, to avoid the issue of mutations occurring to the + object in response to a normally passive "get" operation, and also + sidesteps the issue of whether or not the :meth:`.AttributeEvents.set` + event should be awkwardly fired off during an attribute access + operation. This does not impact the INSERT operation since the + ``None`` value matches the value of ``NULL`` that goes into the + database in any case; note that ``None`` is skipped during the INSERT + to ensure that column and SQL-level default functions can fire off. + + The attribute set event :meth:`.AttributeEvents.set` as well as the + related validation feature provided by :obj:`.orm.validates` is + **not** invoked when we apply our value to the given ``dict_``. To + have these events to invoke in response to our newly generated + value, apply the value to the given object as a normal attribute + set operation:: + + SOME_CONSTANT = 3.1415926 + + @event.listens_for( + MyClass.some_attribute, "init_scalar", + retval=True, propagate=True) + def _init_some_attribute(target, dict_, value): + # will also fire off attribute set events + target.some_attribute = SOME_CONSTANT + return SOME_CONSTANT + + When multiple listeners are set up, the generation of the value + is "chained" from one listener to the next by passing the value + returned by the previous listener that specifies ``retval=True`` + as the ``value`` argument of the next listener. + + The :meth:`.AttributeEvents.init_scalar` event may be used to + extract values from the default values and/or callables established on + mapped :class:`.Column` objects. See the "active column defaults" + example in :ref:`examples_instrumentation` for an example of this. + + .. versionadded:: 1.1 + + :param target: the object instance receiving the event. + If the listener is registered with ``raw=True``, this will + be the :class:`.InstanceState` object. + :param value: the value that is to be returned before this event + listener were invoked. This value begins as the value ``None``, + however will be the return value of the previous event handler + function if multiple listeners are present. + :param dict_: the attribute dictionary of this mapped object. + This is normally the ``__dict__`` of the object, but in all cases + represents the destination that the attribute system uses to get + at the actual value of this attribute. Placing the value in this + dictionary has the effect that the value will be used in the + INSERT statement generated by the unit of work. + + + .. seealso:: + + :ref:`examples_instrumentation` - see the + ``active_column_defaults.py`` example. + + """ + + def init_collection(self, target, collection, collection_adapter): + """Receive a 'collection init' event. + + This event is triggered for a collection-based attribute, when + the initial "empty collection" is first generated for a blank + attribute, as well as for when the collection is replaced with + a new one, such as via a set event. + + E.g., given that ``User.addresses`` is a relationship-based + collection, the event is triggered here:: + + u1 = User() + u1.addresses.append(a1) # <- new collection + + and also during replace operations:: + + u1.addresses = [a2, a3] # <- new collection + + :param target: the object instance receiving the event. + If the listener is registered with ``raw=True``, this will + be the :class:`.InstanceState` object. + :param collection: the new collection. This will always be generated + from what was specified as + :paramref:`.RelationshipProperty.collection_class`, and will always + be empty. + :param collection_adpater: the :class:`.CollectionAdapter` that will + mediate internal access to the collection. + + .. versionadded:: 1.0.0 the :meth:`.AttributeEvents.init_collection` + and :meth:`.AttributeEvents.dispose_collection` events supersede + the :class:`.collection.linker` hook. + + """ + + def dispose_collection(self, target, collection, collection_adpater): + """Receive a 'collection dispose' event. + + This event is triggered for a collection-based attribute when + a collection is replaced, that is:: + + u1.addresses.append(a1) + + u1.addresses = [a2, a3] # <- old collection is disposed + + The mechanics of the event will typically include that the given + collection is empty, even if it stored objects while being replaced. + + .. versionadded:: 1.0.0 the :meth:`.AttributeEvents.init_collection` + and :meth:`.AttributeEvents.dispose_collection` events supersede + the :class:`.collection.linker` hook. + + """ + + +class QueryEvents(event.Events): + """Represent events within the construction of a :class:`.Query` object. + + The events here are intended to be used with an as-yet-unreleased + inspection system for :class:`.Query`. Some very basic operations + are possible now, however the inspection system is intended to allow + complex query manipulations to be automated. + + .. versionadded:: 1.0.0 + + """ + + _target_class_doc = "SomeQuery" + _dispatch_target = Query + + def before_compile(self, query): + """Receive the :class:`.Query` object before it is composed into a + core :class:`.Select` object. + + This event is intended to allow changes to the query given:: + + @event.listens_for(Query, "before_compile", retval=True) + def no_deleted(query): + for desc in query.column_descriptions: + if desc['type'] is User: + entity = desc['entity'] + query = query.filter(entity.deleted == False) + return query + + The event should normally be listened with the ``retval=True`` + parameter set, so that the modified query may be returned. + + + """ + + @classmethod + def _listen( + cls, event_key, retval=False, **kw): + fn = event_key._listen_fn + + if not retval: + def wrap(*arg, **kw): + if not retval: + query = arg[0] + fn(*arg, **kw) + return query + else: + return fn(*arg, **kw) + event_key = event_key.with_wrapper(wrap) + + event_key.base_listen(**kw) diff --git a/app/lib/sqlalchemy/orm/exc.py b/app/lib/sqlalchemy/orm/exc.py new file mode 100644 index 0000000..c13bb67 --- /dev/null +++ b/app/lib/sqlalchemy/orm/exc.py @@ -0,0 +1,165 @@ +# orm/exc.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""SQLAlchemy ORM exceptions.""" +from .. import exc as sa_exc, util + +NO_STATE = (AttributeError, KeyError) +"""Exception types that may be raised by instrumentation implementations.""" + + +class StaleDataError(sa_exc.SQLAlchemyError): + """An operation encountered database state that is unaccounted for. + + Conditions which cause this to happen include: + + * A flush may have attempted to update or delete rows + and an unexpected number of rows were matched during + the UPDATE or DELETE statement. Note that when + version_id_col is used, rows in UPDATE or DELETE statements + are also matched against the current known version + identifier. + + * A mapped object with version_id_col was refreshed, + and the version number coming back from the database does + not match that of the object itself. + + * A object is detached from its parent object, however + the object was previously attached to a different parent + identity which was garbage collected, and a decision + cannot be made if the new parent was really the most + recent "parent". + + .. versionadded:: 0.7.4 + + """ + +ConcurrentModificationError = StaleDataError + + +class FlushError(sa_exc.SQLAlchemyError): + """A invalid condition was detected during flush().""" + + +class UnmappedError(sa_exc.InvalidRequestError): + """Base for exceptions that involve expected mappings not present.""" + + +class ObjectDereferencedError(sa_exc.SQLAlchemyError): + """An operation cannot complete due to an object being garbage + collected. + + """ + + +class DetachedInstanceError(sa_exc.SQLAlchemyError): + """An attempt to access unloaded attributes on a + mapped instance that is detached.""" + + +class UnmappedInstanceError(UnmappedError): + """An mapping operation was requested for an unknown instance.""" + + @util.dependencies("sqlalchemy.orm.base") + def __init__(self, base, obj, msg=None): + if not msg: + try: + base.class_mapper(type(obj)) + name = _safe_cls_name(type(obj)) + msg = ("Class %r is mapped, but this instance lacks " + "instrumentation. This occurs when the instance" + "is created before sqlalchemy.orm.mapper(%s) " + "was called." % (name, name)) + except UnmappedClassError: + msg = _default_unmapped(type(obj)) + if isinstance(obj, type): + msg += ( + '; was a class (%s) supplied where an instance was ' + 'required?' % _safe_cls_name(obj)) + UnmappedError.__init__(self, msg) + + def __reduce__(self): + return self.__class__, (None, self.args[0]) + + +class UnmappedClassError(UnmappedError): + """An mapping operation was requested for an unknown class.""" + + def __init__(self, cls, msg=None): + if not msg: + msg = _default_unmapped(cls) + UnmappedError.__init__(self, msg) + + def __reduce__(self): + return self.__class__, (None, self.args[0]) + + +class ObjectDeletedError(sa_exc.InvalidRequestError): + """A refresh operation failed to retrieve the database + row corresponding to an object's known primary key identity. + + A refresh operation proceeds when an expired attribute is + accessed on an object, or when :meth:`.Query.get` is + used to retrieve an object which is, upon retrieval, detected + as expired. A SELECT is emitted for the target row + based on primary key; if no row is returned, this + exception is raised. + + The true meaning of this exception is simply that + no row exists for the primary key identifier associated + with a persistent object. The row may have been + deleted, or in some cases the primary key updated + to a new value, outside of the ORM's management of the target + object. + + """ + @util.dependencies("sqlalchemy.orm.base") + def __init__(self, base, state, msg=None): + if not msg: + msg = "Instance '%s' has been deleted, or its "\ + "row is otherwise not present." % base.state_str(state) + + sa_exc.InvalidRequestError.__init__(self, msg) + + def __reduce__(self): + return self.__class__, (None, self.args[0]) + + +class UnmappedColumnError(sa_exc.InvalidRequestError): + """Mapping operation was requested on an unknown column.""" + + +class NoResultFound(sa_exc.InvalidRequestError): + """A database result was required but none was found.""" + + +class MultipleResultsFound(sa_exc.InvalidRequestError): + """A single database result was required but more than one were found.""" + + +def _safe_cls_name(cls): + try: + cls_name = '.'.join((cls.__module__, cls.__name__)) + except AttributeError: + cls_name = getattr(cls, '__name__', None) + if cls_name is None: + cls_name = repr(cls) + return cls_name + + +@util.dependencies("sqlalchemy.orm.base") +def _default_unmapped(base, cls): + try: + mappers = base.manager_of_class(cls).mappers + except NO_STATE: + mappers = {} + except TypeError: + mappers = {} + name = _safe_cls_name(cls) + + if not mappers: + return "Class '%s' is not mapped" % name diff --git a/app/lib/sqlalchemy/orm/identity.py b/app/lib/sqlalchemy/orm/identity.py new file mode 100644 index 0000000..ca87fa2 --- /dev/null +++ b/app/lib/sqlalchemy/orm/identity.py @@ -0,0 +1,321 @@ +# orm/identity.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import weakref +from . import attributes +from .. import util +from .. import exc as sa_exc +from . import util as orm_util + +class IdentityMap(object): + def __init__(self): + self._dict = {} + self._modified = set() + self._wr = weakref.ref(self) + + def keys(self): + return self._dict.keys() + + def replace(self, state): + raise NotImplementedError() + + def add(self, state): + raise NotImplementedError() + + def _add_unpresent(self, state, key): + """optional inlined form of add() which can assume item isn't present + in the map""" + self.add(state) + + def update(self, dict): + raise NotImplementedError("IdentityMap uses add() to insert data") + + def clear(self): + raise NotImplementedError("IdentityMap uses remove() to remove data") + + def _manage_incoming_state(self, state): + state._instance_dict = self._wr + + if state.modified: + self._modified.add(state) + + def _manage_removed_state(self, state): + del state._instance_dict + if state.modified: + self._modified.discard(state) + + def _dirty_states(self): + return self._modified + + def check_modified(self): + """return True if any InstanceStates present have been marked + as 'modified'. + + """ + return bool(self._modified) + + def has_key(self, key): + return key in self + + def popitem(self): + raise NotImplementedError("IdentityMap uses remove() to remove data") + + def pop(self, key, *args): + raise NotImplementedError("IdentityMap uses remove() to remove data") + + def setdefault(self, key, default=None): + raise NotImplementedError("IdentityMap uses add() to insert data") + + def __len__(self): + return len(self._dict) + + def copy(self): + raise NotImplementedError() + + def __setitem__(self, key, value): + raise NotImplementedError("IdentityMap uses add() to insert data") + + def __delitem__(self, key): + raise NotImplementedError("IdentityMap uses remove() to remove data") + + +class WeakInstanceDict(IdentityMap): + + def __getitem__(self, key): + state = self._dict[key] + o = state.obj() + if o is None: + raise KeyError(key) + return o + + def __contains__(self, key): + try: + if key in self._dict: + state = self._dict[key] + o = state.obj() + else: + return False + except KeyError: + return False + else: + return o is not None + + def contains_state(self, state): + return state.key in self._dict and self._dict[state.key] is state + + def replace(self, state): + if state.key in self._dict: + existing = self._dict[state.key] + if existing is not state: + self._manage_removed_state(existing) + else: + return + + self._dict[state.key] = state + self._manage_incoming_state(state) + + def add(self, state): + key = state.key + # inline of self.__contains__ + if key in self._dict: + try: + existing_state = self._dict[key] + if existing_state is not state: + o = existing_state.obj() + if o is not None: + raise sa_exc.InvalidRequestError( + "Can't attach instance " + "%s; another instance with key %s is already " + "present in this session." % ( + orm_util.state_str(state), state.key)) + else: + return False + except KeyError: + pass + self._dict[key] = state + self._manage_incoming_state(state) + return True + + def _add_unpresent(self, state, key): + # inlined form of add() called by loading.py + self._dict[key] = state + state._instance_dict = self._wr + + def get(self, key, default=None): + if key not in self._dict: + return default + state = self._dict[key] + o = state.obj() + if o is None: + return default + return o + + def items(self): + values = self.all_states() + result = [] + for state in values: + value = state.obj() + if value is not None: + result.append((state.key, value)) + return result + + def values(self): + values = self.all_states() + result = [] + for state in values: + value = state.obj() + if value is not None: + result.append(value) + + return result + + def __iter__(self): + return iter(self.keys()) + + if util.py2k: + + def iteritems(self): + return iter(self.items()) + + def itervalues(self): + return iter(self.values()) + + def all_states(self): + if util.py2k: + return self._dict.values() + else: + return list(self._dict.values()) + + def _fast_discard(self, state): + self._dict.pop(state.key, None) + + def discard(self, state): + st = self._dict.pop(state.key, None) + if st: + assert st is state + self._manage_removed_state(state) + + def safe_discard(self, state): + if state.key in self._dict: + st = self._dict[state.key] + if st is state: + self._dict.pop(state.key, None) + self._manage_removed_state(state) + + def prune(self): + return 0 + + +class StrongInstanceDict(IdentityMap): + """A 'strong-referencing' version of the identity map. + + .. deprecated 1.1:: + The strong + reference identity map is legacy. See the + recipe at :ref:`session_referencing_behavior` for + an event-based approach to maintaining strong identity + references. + + + """ + + if util.py2k: + def itervalues(self): + return self._dict.itervalues() + + def iteritems(self): + return self._dict.iteritems() + + def __iter__(self): + return iter(self.dict_) + + def __getitem__(self, key): + return self._dict[key] + + def __contains__(self, key): + return key in self._dict + + def get(self, key, default=None): + return self._dict.get(key, default) + + def values(self): + return self._dict.values() + + def items(self): + return self._dict.items() + + def all_states(self): + return [attributes.instance_state(o) for o in self.values()] + + def contains_state(self, state): + return ( + state.key in self and + attributes.instance_state(self[state.key]) is state) + + def replace(self, state): + if state.key in self._dict: + existing = self._dict[state.key] + existing = attributes.instance_state(existing) + if existing is not state: + self._manage_removed_state(existing) + else: + return + + self._dict[state.key] = state.obj() + self._manage_incoming_state(state) + + def add(self, state): + if state.key in self: + if attributes.instance_state(self._dict[state.key]) is not state: + raise sa_exc.InvalidRequestError( + "Can't attach instance " + "%s; another instance with key %s is already " + "present in this session." % ( + orm_util.state_str(state), state.key)) + return False + else: + self._dict[state.key] = state.obj() + self._manage_incoming_state(state) + return True + + def _add_unpresent(self, state, key): + # inlined form of add() called by loading.py + self._dict[key] = state.obj() + state._instance_dict = self._wr + + def _fast_discard(self, state): + self._dict.pop(state.key, None) + + def discard(self, state): + obj = self._dict.pop(state.key, None) + if obj is not None: + self._manage_removed_state(state) + st = attributes.instance_state(obj) + assert st is state + + def safe_discard(self, state): + if state.key in self._dict: + obj = self._dict[state.key] + st = attributes.instance_state(obj) + if st is state: + self._dict.pop(state.key, None) + self._manage_removed_state(state) + + def prune(self): + """prune unreferenced, non-dirty states.""" + + ref_count = len(self) + dirty = [s.obj() for s in self.all_states() if s.modified] + + # work around http://bugs.python.org/issue6149 + keepers = weakref.WeakValueDictionary() + keepers.update(self) + + self._dict.clear() + self._dict.update(keepers) + self.modified = bool(dirty) + return ref_count - len(self) diff --git a/app/lib/sqlalchemy/orm/instrumentation.py b/app/lib/sqlalchemy/orm/instrumentation.py new file mode 100644 index 0000000..4ac9b13 --- /dev/null +++ b/app/lib/sqlalchemy/orm/instrumentation.py @@ -0,0 +1,528 @@ +# orm/instrumentation.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Defines SQLAlchemy's system of class instrumentation. + +This module is usually not directly visible to user applications, but +defines a large part of the ORM's interactivity. + +instrumentation.py deals with registration of end-user classes +for state tracking. It interacts closely with state.py +and attributes.py which establish per-instance and per-class-attribute +instrumentation, respectively. + +The class instrumentation system can be customized on a per-class +or global basis using the :mod:`sqlalchemy.ext.instrumentation` +module, which provides the means to build and specify +alternate instrumentation forms. + +.. versionchanged: 0.8 + The instrumentation extension system was moved out of the + ORM and into the external :mod:`sqlalchemy.ext.instrumentation` + package. When that package is imported, it installs + itself within sqlalchemy.orm so that its more comprehensive + resolution mechanics take effect. + +""" + + +from . import exc, collections, interfaces, state +from .. import util +from . import base + + +_memoized_key_collection = util.group_expirable_memoized_property() + + +class ClassManager(dict): + """tracks state information at the class level.""" + + MANAGER_ATTR = base.DEFAULT_MANAGER_ATTR + STATE_ATTR = base.DEFAULT_STATE_ATTR + + _state_setter = staticmethod(util.attrsetter(STATE_ATTR)) + + deferred_scalar_loader = None + + original_init = object.__init__ + + factory = None + + def __init__(self, class_): + self.class_ = class_ + self.info = {} + self.new_init = None + self.local_attrs = {} + self.originals = {} + + self._bases = [mgr for mgr in [ + manager_of_class(base) + for base in self.class_.__bases__ + if isinstance(base, type) + ] if mgr is not None] + + for base in self._bases: + self.update(base) + + self.dispatch._events._new_classmanager_instance(class_, self) + # events._InstanceEventsHold.populate(class_, self) + + for basecls in class_.__mro__: + mgr = manager_of_class(basecls) + if mgr is not None: + self.dispatch._update(mgr.dispatch) + self.manage() + self._instrument_init() + + if '__del__' in class_.__dict__: + util.warn("__del__() method on class %s will " + "cause unreachable cycles and memory leaks, " + "as SQLAlchemy instrumentation often creates " + "reference cycles. Please remove this method." % + class_) + + def __hash__(self): + return id(self) + + def __eq__(self, other): + return other is self + + @property + def is_mapped(self): + return 'mapper' in self.__dict__ + + @_memoized_key_collection + def _all_key_set(self): + return frozenset(self) + + @_memoized_key_collection + def _collection_impl_keys(self): + return frozenset([ + attr.key for attr in self.values() if attr.impl.collection]) + + @_memoized_key_collection + def _scalar_loader_impls(self): + return frozenset([ + attr.impl for attr in + self.values() if attr.impl.accepts_scalar_loader]) + + @util.memoized_property + def mapper(self): + # raises unless self.mapper has been assigned + raise exc.UnmappedClassError(self.class_) + + def _all_sqla_attributes(self, exclude=None): + """return an iterator of all classbound attributes that are + implement :class:`.InspectionAttr`. + + This includes :class:`.QueryableAttribute` as well as extension + types such as :class:`.hybrid_property` and + :class:`.AssociationProxy`. + + """ + if exclude is None: + exclude = set() + for supercls in self.class_.__mro__: + for key in set(supercls.__dict__).difference(exclude): + exclude.add(key) + val = supercls.__dict__[key] + if isinstance(val, interfaces.InspectionAttr): + yield key, val + + def _attr_has_impl(self, key): + """Return True if the given attribute is fully initialized. + + i.e. has an impl. + """ + + return key in self and self[key].impl is not None + + def _subclass_manager(self, cls): + """Create a new ClassManager for a subclass of this ClassManager's + class. + + This is called automatically when attributes are instrumented so that + the attributes can be propagated to subclasses against their own + class-local manager, without the need for mappers etc. to have already + pre-configured managers for the full class hierarchy. Mappers + can post-configure the auto-generated ClassManager when needed. + + """ + manager = manager_of_class(cls) + if manager is None: + manager = _instrumentation_factory.create_manager_for_cls(cls) + return manager + + def _instrument_init(self): + # TODO: self.class_.__init__ is often the already-instrumented + # __init__ from an instrumented superclass. We still need to make + # our own wrapper, but it would + # be nice to wrap the original __init__ and not our existing wrapper + # of such, since this adds method overhead. + self.original_init = self.class_.__init__ + self.new_init = _generate_init(self.class_, self) + self.install_member('__init__', self.new_init) + + def _uninstrument_init(self): + if self.new_init: + self.uninstall_member('__init__') + self.new_init = None + + @util.memoized_property + def _state_constructor(self): + self.dispatch.first_init(self, self.class_) + return state.InstanceState + + def manage(self): + """Mark this instance as the manager for its class.""" + + setattr(self.class_, self.MANAGER_ATTR, self) + + def dispose(self): + """Dissasociate this manager from its class.""" + + delattr(self.class_, self.MANAGER_ATTR) + + @util.hybridmethod + def manager_getter(self): + return _default_manager_getter + + @util.hybridmethod + def state_getter(self): + """Return a (instance) -> InstanceState callable. + + "state getter" callables should raise either KeyError or + AttributeError if no InstanceState could be found for the + instance. + """ + + return _default_state_getter + + @util.hybridmethod + def dict_getter(self): + return _default_dict_getter + + def instrument_attribute(self, key, inst, propagated=False): + if propagated: + if key in self.local_attrs: + return # don't override local attr with inherited attr + else: + self.local_attrs[key] = inst + self.install_descriptor(key, inst) + _memoized_key_collection.expire_instance(self) + self[key] = inst + + for cls in self.class_.__subclasses__(): + manager = self._subclass_manager(cls) + manager.instrument_attribute(key, inst, True) + + def subclass_managers(self, recursive): + for cls in self.class_.__subclasses__(): + mgr = manager_of_class(cls) + if mgr is not None and mgr is not self: + yield mgr + if recursive: + for m in mgr.subclass_managers(True): + yield m + + def post_configure_attribute(self, key): + _instrumentation_factory.dispatch.\ + attribute_instrument(self.class_, key, self[key]) + + def uninstrument_attribute(self, key, propagated=False): + if key not in self: + return + if propagated: + if key in self.local_attrs: + return # don't get rid of local attr + else: + del self.local_attrs[key] + self.uninstall_descriptor(key) + _memoized_key_collection.expire_instance(self) + del self[key] + for cls in self.class_.__subclasses__(): + manager = manager_of_class(cls) + if manager: + manager.uninstrument_attribute(key, True) + + def unregister(self): + """remove all instrumentation established by this ClassManager.""" + + self._uninstrument_init() + + self.mapper = self.dispatch = None + self.info.clear() + + for key in list(self): + if key in self.local_attrs: + self.uninstrument_attribute(key) + + def install_descriptor(self, key, inst): + if key in (self.STATE_ATTR, self.MANAGER_ATTR): + raise KeyError("%r: requested attribute name conflicts with " + "instrumentation attribute of the same name." % + key) + setattr(self.class_, key, inst) + + def uninstall_descriptor(self, key): + delattr(self.class_, key) + + def install_member(self, key, implementation): + if key in (self.STATE_ATTR, self.MANAGER_ATTR): + raise KeyError("%r: requested attribute name conflicts with " + "instrumentation attribute of the same name." % + key) + self.originals.setdefault(key, getattr(self.class_, key, None)) + setattr(self.class_, key, implementation) + + def uninstall_member(self, key): + original = self.originals.pop(key, None) + if original is not None: + setattr(self.class_, key, original) + + def instrument_collection_class(self, key, collection_class): + return collections.prepare_instrumentation(collection_class) + + def initialize_collection(self, key, state, factory): + user_data = factory() + adapter = collections.CollectionAdapter( + self.get_impl(key), state, user_data) + return adapter, user_data + + def is_instrumented(self, key, search=False): + if search: + return key in self + else: + return key in self.local_attrs + + def get_impl(self, key): + return self[key].impl + + @property + def attributes(self): + return iter(self.values()) + + # InstanceState management + + def new_instance(self, state=None): + instance = self.class_.__new__(self.class_) + if state is None: + state = self._state_constructor(instance, self) + self._state_setter(instance, state) + return instance + + def setup_instance(self, instance, state=None): + if state is None: + state = self._state_constructor(instance, self) + self._state_setter(instance, state) + + def teardown_instance(self, instance): + delattr(instance, self.STATE_ATTR) + + def _serialize(self, state, state_dict): + return _SerializeManager(state, state_dict) + + def _new_state_if_none(self, instance): + """Install a default InstanceState if none is present. + + A private convenience method used by the __init__ decorator. + + """ + if hasattr(instance, self.STATE_ATTR): + return False + elif self.class_ is not instance.__class__ and \ + self.is_mapped: + # this will create a new ClassManager for the + # subclass, without a mapper. This is likely a + # user error situation but allow the object + # to be constructed, so that it is usable + # in a non-ORM context at least. + return self._subclass_manager(instance.__class__).\ + _new_state_if_none(instance) + else: + state = self._state_constructor(instance, self) + self._state_setter(instance, state) + return state + + def has_state(self, instance): + return hasattr(instance, self.STATE_ATTR) + + def has_parent(self, state, key, optimistic=False): + """TODO""" + return self.get_impl(key).hasparent(state, optimistic=optimistic) + + def __bool__(self): + """All ClassManagers are non-zero regardless of attribute state.""" + return True + + __nonzero__ = __bool__ + + def __repr__(self): + return '<%s of %r at %x>' % ( + self.__class__.__name__, self.class_, id(self)) + + +class _SerializeManager(object): + """Provide serialization of a :class:`.ClassManager`. + + The :class:`.InstanceState` uses ``__init__()`` on serialize + and ``__call__()`` on deserialize. + + """ + + def __init__(self, state, d): + self.class_ = state.class_ + manager = state.manager + manager.dispatch.pickle(state, d) + + def __call__(self, state, inst, state_dict): + state.manager = manager = manager_of_class(self.class_) + if manager is None: + raise exc.UnmappedInstanceError( + inst, + "Cannot deserialize object of type %r - " + "no mapper() has " + "been configured for this class within the current " + "Python process!" % + self.class_) + elif manager.is_mapped and not manager.mapper.configured: + manager.mapper._configure_all() + + # setup _sa_instance_state ahead of time so that + # unpickle events can access the object normally. + # see [ticket:2362] + if inst is not None: + manager.setup_instance(inst, state) + manager.dispatch.unpickle(state, state_dict) + + +class InstrumentationFactory(object): + """Factory for new ClassManager instances.""" + + def create_manager_for_cls(self, class_): + assert class_ is not None + assert manager_of_class(class_) is None + + # give a more complicated subclass + # a chance to do what it wants here + manager, factory = self._locate_extended_factory(class_) + + if factory is None: + factory = ClassManager + manager = factory(class_) + + self._check_conflicts(class_, factory) + + manager.factory = factory + + self.dispatch.class_instrument(class_) + return manager + + def _locate_extended_factory(self, class_): + """Overridden by a subclass to do an extended lookup.""" + return None, None + + def _check_conflicts(self, class_, factory): + """Overridden by a subclass to test for conflicting factories.""" + return + + def unregister(self, class_): + manager = manager_of_class(class_) + manager.unregister() + manager.dispose() + self.dispatch.class_uninstrument(class_) + if ClassManager.MANAGER_ATTR in class_.__dict__: + delattr(class_, ClassManager.MANAGER_ATTR) + +# this attribute is replaced by sqlalchemy.ext.instrumentation +# when importred. +_instrumentation_factory = InstrumentationFactory() + +# these attributes are replaced by sqlalchemy.ext.instrumentation +# when a non-standard InstrumentationManager class is first +# used to instrument a class. +instance_state = _default_state_getter = base.instance_state + +instance_dict = _default_dict_getter = base.instance_dict + +manager_of_class = _default_manager_getter = base.manager_of_class + + +def register_class(class_): + """Register class instrumentation. + + Returns the existing or newly created class manager. + + """ + + manager = manager_of_class(class_) + if manager is None: + manager = _instrumentation_factory.create_manager_for_cls(class_) + return manager + + +def unregister_class(class_): + """Unregister class instrumentation.""" + + _instrumentation_factory.unregister(class_) + + +def is_instrumented(instance, key): + """Return True if the given attribute on the given instance is + instrumented by the attributes package. + + This function may be used regardless of instrumentation + applied directly to the class, i.e. no descriptors are required. + + """ + return manager_of_class(instance.__class__).\ + is_instrumented(key, search=True) + + +def _generate_init(class_, class_manager): + """Build an __init__ decorator that triggers ClassManager events.""" + + # TODO: we should use the ClassManager's notion of the + # original '__init__' method, once ClassManager is fixed + # to always reference that. + original__init__ = class_.__init__ + assert original__init__ + + # Go through some effort here and don't change the user's __init__ + # calling signature, including the unlikely case that it has + # a return value. + # FIXME: need to juggle local names to avoid constructor argument + # clashes. + func_body = """\ +def __init__(%(apply_pos)s): + new_state = class_manager._new_state_if_none(%(self_arg)s) + if new_state: + return new_state._initialize_instance(%(apply_kw)s) + else: + return original__init__(%(apply_kw)s) +""" + func_vars = util.format_argspec_init(original__init__, grouped=False) + func_text = func_body % func_vars + + if util.py2k: + func = getattr(original__init__, 'im_func', original__init__) + func_defaults = getattr(func, 'func_defaults', None) + else: + func_defaults = getattr(original__init__, '__defaults__', None) + func_kw_defaults = getattr(original__init__, '__kwdefaults__', None) + + env = locals().copy() + exec(func_text, env) + __init__ = env['__init__'] + __init__.__doc__ = original__init__.__doc__ + + if func_defaults: + __init__.__defaults__ = func_defaults + if not util.py2k and func_kw_defaults: + __init__.__kwdefaults__ = func_kw_defaults + + return __init__ diff --git a/app/lib/sqlalchemy/orm/interfaces.py b/app/lib/sqlalchemy/orm/interfaces.py new file mode 100644 index 0000000..fbe8f50 --- /dev/null +++ b/app/lib/sqlalchemy/orm/interfaces.py @@ -0,0 +1,655 @@ +# orm/interfaces.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" + +Contains various base classes used throughout the ORM. + +Defines some key base classes prominent within the internals, +as well as the now-deprecated ORM extension classes. + +Other than the deprecated extensions, this module and the +classes within are mostly private, though some attributes +are exposed when inspecting mappings. + +""" + +from __future__ import absolute_import + +from .. import util +from ..sql import operators +from .base import (ONETOMANY, MANYTOONE, MANYTOMANY, + EXT_CONTINUE, EXT_STOP, NOT_EXTENSION) +from .base import (InspectionAttr, InspectionAttr, + InspectionAttrInfo, _MappedAttribute) +import collections +from .. import inspect +from . import path_registry + +# imported later +MapperExtension = SessionExtension = AttributeExtension = None + +__all__ = ( + 'AttributeExtension', + 'EXT_CONTINUE', + 'EXT_STOP', + 'ONETOMANY', + 'MANYTOMANY', + 'MANYTOONE', + 'NOT_EXTENSION', + 'LoaderStrategy', + 'MapperExtension', + 'MapperOption', + 'MapperProperty', + 'PropComparator', + 'SessionExtension', + 'StrategizedProperty', +) + + +class MapperProperty(_MappedAttribute, InspectionAttr, util.MemoizedSlots): + """Represent a particular class attribute mapped by :class:`.Mapper`. + + The most common occurrences of :class:`.MapperProperty` are the + mapped :class:`.Column`, which is represented in a mapping as + an instance of :class:`.ColumnProperty`, + and a reference to another class produced by :func:`.relationship`, + represented in the mapping as an instance of + :class:`.RelationshipProperty`. + + """ + + __slots__ = ( + '_configure_started', '_configure_finished', 'parent', 'key', + 'info' + ) + + cascade = frozenset() + """The set of 'cascade' attribute names. + + This collection is checked before the 'cascade_iterator' method is called. + + The collection typically only applies to a RelationshipProperty. + + """ + + is_property = True + """Part of the InspectionAttr interface; states this object is a + mapper property. + + """ + + def _memoized_attr_info(self): + """Info dictionary associated with the object, allowing user-defined + data to be associated with this :class:`.InspectionAttr`. + + The dictionary is generated when first accessed. Alternatively, + it can be specified as a constructor argument to the + :func:`.column_property`, :func:`.relationship`, or :func:`.composite` + functions. + + .. versionadded:: 0.8 Added support for .info to all + :class:`.MapperProperty` subclasses. + + .. versionchanged:: 1.0.0 :attr:`.MapperProperty.info` is also + available on extension types via the + :attr:`.InspectionAttrInfo.info` attribute, so that it can apply + to a wider variety of ORM and extension constructs. + + .. seealso:: + + :attr:`.QueryableAttribute.info` + + :attr:`.SchemaItem.info` + + """ + return {} + + def setup(self, context, entity, path, adapter, **kwargs): + """Called by Query for the purposes of constructing a SQL statement. + + Each MapperProperty associated with the target mapper processes the + statement referenced by the query context, adding columns and/or + criterion as appropriate. + + """ + + def create_row_processor(self, context, path, + mapper, result, adapter, populators): + """Produce row processing functions and append to the given + set of populators lists. + + """ + + def cascade_iterator(self, type_, state, visited_instances=None, + halt_on=None): + """Iterate through instances related to the given instance for + a particular 'cascade', starting with this MapperProperty. + + Return an iterator3-tuples (instance, mapper, state). + + Note that the 'cascade' collection on this MapperProperty is + checked first for the given type before cascade_iterator is called. + + This method typically only applies to RelationshipProperty. + + """ + + return iter(()) + + def set_parent(self, parent, init): + """Set the parent mapper that references this MapperProperty. + + This method is overridden by some subclasses to perform extra + setup when the mapper is first known. + + """ + self.parent = parent + + def instrument_class(self, mapper): + """Hook called by the Mapper to the property to initiate + instrumentation of the class attribute managed by this + MapperProperty. + + The MapperProperty here will typically call out to the + attributes module to set up an InstrumentedAttribute. + + This step is the first of two steps to set up an InstrumentedAttribute, + and is called early in the mapper setup process. + + The second step is typically the init_class_attribute step, + called from StrategizedProperty via the post_instrument_class() + hook. This step assigns additional state to the InstrumentedAttribute + (specifically the "impl") which has been determined after the + MapperProperty has determined what kind of persistence + management it needs to do (e.g. scalar, object, collection, etc). + + """ + + def __init__(self): + self._configure_started = False + self._configure_finished = False + + def init(self): + """Called after all mappers are created to assemble + relationships between mappers and perform other post-mapper-creation + initialization steps. + + """ + self._configure_started = True + self.do_init() + self._configure_finished = True + + @property + def class_attribute(self): + """Return the class-bound descriptor corresponding to this + :class:`.MapperProperty`. + + This is basically a ``getattr()`` call:: + + return getattr(self.parent.class_, self.key) + + I.e. if this :class:`.MapperProperty` were named ``addresses``, + and the class to which it is mapped is ``User``, this sequence + is possible:: + + >>> from sqlalchemy import inspect + >>> mapper = inspect(User) + >>> addresses_property = mapper.attrs.addresses + >>> addresses_property.class_attribute is User.addresses + True + >>> User.addresses.property is addresses_property + True + + + """ + + return getattr(self.parent.class_, self.key) + + def do_init(self): + """Perform subclass-specific initialization post-mapper-creation + steps. + + This is a template method called by the ``MapperProperty`` + object's init() method. + + """ + + def post_instrument_class(self, mapper): + """Perform instrumentation adjustments that need to occur + after init() has completed. + + The given Mapper is the Mapper invoking the operation, which + may not be the same Mapper as self.parent in an inheritance + scenario; however, Mapper will always at least be a sub-mapper of + self.parent. + + This method is typically used by StrategizedProperty, which delegates + it to LoaderStrategy.init_class_attribute() to perform final setup + on the class-bound InstrumentedAttribute. + + """ + + def merge(self, session, source_state, source_dict, dest_state, + dest_dict, load, _recursive, _resolve_conflict_map): + """Merge the attribute represented by this ``MapperProperty`` + from source to destination object. + + """ + + def __repr__(self): + return '<%s at 0x%x; %s>' % ( + self.__class__.__name__, + id(self), getattr(self, 'key', 'no key')) + + +class PropComparator(operators.ColumnOperators): + r"""Defines SQL operators for :class:`.MapperProperty` objects. + + SQLAlchemy allows for operators to + be redefined at both the Core and ORM level. :class:`.PropComparator` + is the base class of operator redefinition for ORM-level operations, + including those of :class:`.ColumnProperty`, + :class:`.RelationshipProperty`, and :class:`.CompositeProperty`. + + .. note:: With the advent of Hybrid properties introduced in SQLAlchemy + 0.7, as well as Core-level operator redefinition in + SQLAlchemy 0.8, the use case for user-defined :class:`.PropComparator` + instances is extremely rare. See :ref:`hybrids_toplevel` as well + as :ref:`types_operators`. + + User-defined subclasses of :class:`.PropComparator` may be created. The + built-in Python comparison and math operator methods, such as + :meth:`.operators.ColumnOperators.__eq__`, + :meth:`.operators.ColumnOperators.__lt__`, and + :meth:`.operators.ColumnOperators.__add__`, can be overridden to provide + new operator behavior. The custom :class:`.PropComparator` is passed to + the :class:`.MapperProperty` instance via the ``comparator_factory`` + argument. In each case, + the appropriate subclass of :class:`.PropComparator` should be used:: + + # definition of custom PropComparator subclasses + + from sqlalchemy.orm.properties import \ + ColumnProperty,\ + CompositeProperty,\ + RelationshipProperty + + class MyColumnComparator(ColumnProperty.Comparator): + def __eq__(self, other): + return self.__clause_element__() == other + + class MyRelationshipComparator(RelationshipProperty.Comparator): + def any(self, expression): + "define the 'any' operation" + # ... + + class MyCompositeComparator(CompositeProperty.Comparator): + def __gt__(self, other): + "redefine the 'greater than' operation" + + return sql.and_(*[a>b for a, b in + zip(self.__clause_element__().clauses, + other.__composite_values__())]) + + + # application of custom PropComparator subclasses + + from sqlalchemy.orm import column_property, relationship, composite + from sqlalchemy import Column, String + + class SomeMappedClass(Base): + some_column = column_property(Column("some_column", String), + comparator_factory=MyColumnComparator) + + some_relationship = relationship(SomeOtherClass, + comparator_factory=MyRelationshipComparator) + + some_composite = composite( + Column("a", String), Column("b", String), + comparator_factory=MyCompositeComparator + ) + + Note that for column-level operator redefinition, it's usually + simpler to define the operators at the Core level, using the + :attr:`.TypeEngine.comparator_factory` attribute. See + :ref:`types_operators` for more detail. + + See also: + + :class:`.ColumnProperty.Comparator` + + :class:`.RelationshipProperty.Comparator` + + :class:`.CompositeProperty.Comparator` + + :class:`.ColumnOperators` + + :ref:`types_operators` + + :attr:`.TypeEngine.comparator_factory` + + """ + + __slots__ = 'prop', 'property', '_parententity', '_adapt_to_entity' + + def __init__(self, prop, parentmapper, adapt_to_entity=None): + self.prop = self.property = prop + self._parententity = adapt_to_entity or parentmapper + self._adapt_to_entity = adapt_to_entity + + def __clause_element__(self): + raise NotImplementedError("%r" % self) + + def _query_clause_element(self): + return self.__clause_element__() + + def adapt_to_entity(self, adapt_to_entity): + """Return a copy of this PropComparator which will use the given + :class:`.AliasedInsp` to produce corresponding expressions. + """ + return self.__class__(self.prop, self._parententity, adapt_to_entity) + + @property + def _parentmapper(self): + """legacy; this is renamed to _parententity to be + compatible with QueryableAttribute.""" + return inspect(self._parententity).mapper + + @property + def adapter(self): + """Produce a callable that adapts column expressions + to suit an aliased version of this comparator. + + """ + if self._adapt_to_entity is None: + return None + else: + return self._adapt_to_entity._adapt_element + + @property + def info(self): + return self.property.info + + @staticmethod + def any_op(a, b, **kwargs): + return a.any(b, **kwargs) + + @staticmethod + def has_op(a, b, **kwargs): + return a.has(b, **kwargs) + + @staticmethod + def of_type_op(a, class_): + return a.of_type(class_) + + def of_type(self, class_): + r"""Redefine this object in terms of a polymorphic subclass. + + Returns a new PropComparator from which further criterion can be + evaluated. + + e.g.:: + + query.join(Company.employees.of_type(Engineer)).\ + filter(Engineer.name=='foo') + + :param \class_: a class or mapper indicating that criterion will be + against this specific subclass. + + + """ + + return self.operate(PropComparator.of_type_op, class_) + + def any(self, criterion=None, **kwargs): + r"""Return true if this collection contains any member that meets the + given criterion. + + The usual implementation of ``any()`` is + :meth:`.RelationshipProperty.Comparator.any`. + + :param criterion: an optional ClauseElement formulated against the + member class' table or attributes. + + :param \**kwargs: key/value pairs corresponding to member class + attribute names which will be compared via equality to the + corresponding values. + + """ + + return self.operate(PropComparator.any_op, criterion, **kwargs) + + def has(self, criterion=None, **kwargs): + r"""Return true if this element references a member which meets the + given criterion. + + The usual implementation of ``has()`` is + :meth:`.RelationshipProperty.Comparator.has`. + + :param criterion: an optional ClauseElement formulated against the + member class' table or attributes. + + :param \**kwargs: key/value pairs corresponding to member class + attribute names which will be compared via equality to the + corresponding values. + + """ + + return self.operate(PropComparator.has_op, criterion, **kwargs) + + +class StrategizedProperty(MapperProperty): + """A MapperProperty which uses selectable strategies to affect + loading behavior. + + There is a single strategy selected by default. Alternate + strategies can be selected at Query time through the usage of + ``StrategizedOption`` objects via the Query.options() method. + + The mechanics of StrategizedProperty are used for every Query + invocation for every mapped attribute participating in that Query, + to determine first how the attribute will be rendered in SQL + and secondly how the attribute will retrieve a value from a result + row and apply it to a mapped object. The routines here are very + performance-critical. + + """ + + __slots__ = ( + '_strategies', 'strategy', + '_wildcard_token', '_default_path_loader_key' + ) + + strategy_wildcard_key = None + + def _memoized_attr__wildcard_token(self): + return ("%s:%s" % ( + self.strategy_wildcard_key, path_registry._WILDCARD_TOKEN), ) + + def _memoized_attr__default_path_loader_key(self): + return ( + "loader", + ("%s:%s" % ( + self.strategy_wildcard_key, path_registry._DEFAULT_TOKEN), ) + ) + + def _get_context_loader(self, context, path): + load = None + + # use EntityRegistry.__getitem__()->PropRegistry here so + # that the path is stated in terms of our base + search_path = dict.__getitem__(path, self) + + # search among: exact match, "attr.*", "default" strategy + # if any. + for path_key in ( + search_path._loader_key, + search_path._wildcard_path_loader_key, + search_path._default_path_loader_key + ): + if path_key in context.attributes: + load = context.attributes[path_key] + break + + return load + + def _get_strategy(self, key): + try: + return self._strategies[key] + except KeyError: + cls = self._strategy_lookup(*key) + self._strategies[key] = self._strategies[ + cls] = strategy = cls(self, key) + return strategy + + def setup( + self, context, entity, path, adapter, **kwargs): + loader = self._get_context_loader(context, path) + if loader and loader.strategy: + strat = self._get_strategy(loader.strategy) + else: + strat = self.strategy + strat.setup_query(context, entity, path, loader, adapter, **kwargs) + + def create_row_processor( + self, context, path, mapper, + result, adapter, populators): + loader = self._get_context_loader(context, path) + if loader and loader.strategy: + strat = self._get_strategy(loader.strategy) + else: + strat = self.strategy + strat.create_row_processor( + context, path, loader, + mapper, result, adapter, populators) + + def do_init(self): + self._strategies = {} + self.strategy = self._get_strategy(self.strategy_key) + + def post_instrument_class(self, mapper): + if not self.parent.non_primary and \ + not mapper.class_manager._attr_has_impl(self.key): + self.strategy.init_class_attribute(mapper) + + _all_strategies = collections.defaultdict(dict) + + @classmethod + def strategy_for(cls, **kw): + def decorate(dec_cls): + # ensure each subclass of the strategy has its + # own _strategy_keys collection + if '_strategy_keys' not in dec_cls.__dict__: + dec_cls._strategy_keys = [] + key = tuple(sorted(kw.items())) + cls._all_strategies[cls][key] = dec_cls + dec_cls._strategy_keys.append(key) + return dec_cls + return decorate + + @classmethod + def _strategy_lookup(cls, *key): + for prop_cls in cls.__mro__: + if prop_cls in cls._all_strategies: + strategies = cls._all_strategies[prop_cls] + try: + return strategies[key] + except KeyError: + pass + raise Exception("can't locate strategy for %s %s" % (cls, key)) + + +class MapperOption(object): + """Describe a modification to a Query.""" + + propagate_to_loaders = False + """if True, indicate this option should be carried along + to "secondary" Query objects produced during lazy loads + or refresh operations. + + """ + + def process_query(self, query): + """Apply a modification to the given :class:`.Query`.""" + + def process_query_conditionally(self, query): + """same as process_query(), except that this option may not + apply to the given query. + + This is typically used during a lazy load or scalar refresh + operation to propagate options stated in the original Query to the + new Query being used for the load. It occurs for those options that + specify propagate_to_loaders=True. + + """ + + self.process_query(query) + + +class LoaderStrategy(object): + """Describe the loading behavior of a StrategizedProperty object. + + The ``LoaderStrategy`` interacts with the querying process in three + ways: + + * it controls the configuration of the ``InstrumentedAttribute`` + placed on a class to handle the behavior of the attribute. this + may involve setting up class-level callable functions to fire + off a select operation when the attribute is first accessed + (i.e. a lazy load) + + * it processes the ``QueryContext`` at statement construction time, + where it can modify the SQL statement that is being produced. + For example, simple column attributes will add their represented + column to the list of selected columns, a joined eager loader + may establish join clauses to add to the statement. + + * It produces "row processor" functions at result fetching time. + These "row processor" functions populate a particular attribute + on a particular mapped instance. + + """ + + __slots__ = 'parent_property', 'is_class_level', 'parent', 'key', \ + 'strategy_key', 'strategy_opts' + + def __init__(self, parent, strategy_key): + self.parent_property = parent + self.is_class_level = False + self.parent = self.parent_property.parent + self.key = self.parent_property.key + self.strategy_key = strategy_key + self.strategy_opts = dict(strategy_key) + + def init_class_attribute(self, mapper): + pass + + def setup_query(self, context, entity, path, loadopt, adapter, **kwargs): + """Establish column and other state for a given QueryContext. + + This method fulfills the contract specified by MapperProperty.setup(). + + StrategizedProperty delegates its setup() method + directly to this method. + + """ + + def create_row_processor(self, context, path, loadopt, mapper, + result, adapter, populators): + """Establish row processing functions for a given QueryContext. + + This method fulfills the contract specified by + MapperProperty.create_row_processor(). + + StrategizedProperty delegates its create_row_processor() method + directly to this method. + + """ + + def __str__(self): + return str(self.parent_property) diff --git a/app/lib/sqlalchemy/orm/loading.py b/app/lib/sqlalchemy/orm/loading.py new file mode 100644 index 0000000..f749cdd --- /dev/null +++ b/app/lib/sqlalchemy/orm/loading.py @@ -0,0 +1,703 @@ +# orm/loading.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""private module containing functions used to convert database +rows into object instances and associated state. + +the functions here are called primarily by Query, Mapper, +as well as some of the attribute loading strategies. + +""" +from __future__ import absolute_import + +from .. import util +from . import attributes, exc as orm_exc +from ..sql import util as sql_util +from . import strategy_options + +from .util import _none_set, state_str +from .base import _SET_DEFERRED_EXPIRED, _DEFER_FOR_STATE +from .. import exc as sa_exc +import collections + +_new_runid = util.counter() + + +def instances(query, cursor, context): + """Return an ORM result as an iterator.""" + + context.runid = _new_runid() + + filtered = query._has_mapper_entities + + single_entity = len(query._entities) == 1 and \ + query._entities[0].supports_single_entity + + if filtered: + if single_entity: + filter_fn = id + else: + def filter_fn(row): + return tuple( + id(item) + if ent.use_id_for_hash + else item + for ent, item in zip(query._entities, row) + ) + + try: + (process, labels) = \ + list(zip(*[ + query_entity.row_processor(query, + context, cursor) + for query_entity in query._entities + ])) + + if not single_entity: + keyed_tuple = util.lightweight_named_tuple('result', labels) + + while True: + context.partials = {} + + if query._yield_per: + fetch = cursor.fetchmany(query._yield_per) + if not fetch: + break + else: + fetch = cursor.fetchall() + + if single_entity: + proc = process[0] + rows = [proc(row) for row in fetch] + else: + rows = [keyed_tuple([proc(row) for proc in process]) + for row in fetch] + + if filtered: + rows = util.unique_list(rows, filter_fn) + + for row in rows: + yield row + + if not query._yield_per: + break + except Exception as err: + cursor.close() + util.raise_from_cause(err) + + +@util.dependencies("sqlalchemy.orm.query") +def merge_result(querylib, query, iterator, load=True): + """Merge a result into this :class:`.Query` object's Session.""" + + session = query.session + if load: + # flush current contents if we expect to load data + session._autoflush() + + autoflush = session.autoflush + try: + session.autoflush = False + single_entity = len(query._entities) == 1 + if single_entity: + if isinstance(query._entities[0], querylib._MapperEntity): + result = [session._merge( + attributes.instance_state(instance), + attributes.instance_dict(instance), + load=load, _recursive={}, _resolve_conflict_map={}) + for instance in iterator] + else: + result = list(iterator) + else: + mapped_entities = [i for i, e in enumerate(query._entities) + if isinstance(e, querylib._MapperEntity)] + result = [] + keys = [ent._label_name for ent in query._entities] + keyed_tuple = util.lightweight_named_tuple('result', keys) + for row in iterator: + newrow = list(row) + for i in mapped_entities: + if newrow[i] is not None: + newrow[i] = session._merge( + attributes.instance_state(newrow[i]), + attributes.instance_dict(newrow[i]), + load=load, _recursive={}, _resolve_conflict_map={}) + result.append(keyed_tuple(newrow)) + + return iter(result) + finally: + session.autoflush = autoflush + + +def get_from_identity(session, key, passive): + """Look up the given key in the given session's identity map, + check the object for expired state if found. + + """ + instance = session.identity_map.get(key) + if instance is not None: + + state = attributes.instance_state(instance) + + # expired - ensure it still exists + if state.expired: + if not passive & attributes.SQL_OK: + # TODO: no coverage here + return attributes.PASSIVE_NO_RESULT + elif not passive & attributes.RELATED_OBJECT_OK: + # this mode is used within a flush and the instance's + # expired state will be checked soon enough, if necessary + return instance + try: + state._load_expired(state, passive) + except orm_exc.ObjectDeletedError: + session._remove_newly_deleted([state]) + return None + return instance + else: + return None + + +def load_on_ident(query, key, + refresh_state=None, lockmode=None, + only_load_props=None): + """Load the given identity key from the database.""" + + if key is not None: + ident = key[1] + else: + ident = None + + if refresh_state is None: + q = query._clone() + q._get_condition() + else: + q = query._clone() + + if ident is not None: + mapper = query._mapper_zero() + + (_get_clause, _get_params) = mapper._get_clause + + # None present in ident - turn those comparisons + # into "IS NULL" + if None in ident: + nones = set([ + _get_params[col].key for col, value in + zip(mapper.primary_key, ident) if value is None + ]) + _get_clause = sql_util.adapt_criterion_to_null( + _get_clause, nones) + + _get_clause = q._adapt_clause(_get_clause, True, False) + q._criterion = _get_clause + + params = dict([ + (_get_params[primary_key].key, id_val) + for id_val, primary_key in zip(ident, mapper.primary_key) + ]) + + q._params = params + + if lockmode is not None: + version_check = True + q = q.with_lockmode(lockmode) + elif query._for_update_arg is not None: + version_check = True + q._for_update_arg = query._for_update_arg + else: + version_check = False + + q._get_options( + populate_existing=bool(refresh_state), + version_check=version_check, + only_load_props=only_load_props, + refresh_state=refresh_state) + q._order_by = None + + try: + return q.one() + except orm_exc.NoResultFound: + return None + + +def _setup_entity_query( + context, mapper, query_entity, + path, adapter, column_collection, + with_polymorphic=None, only_load_props=None, + polymorphic_discriminator=None, **kw): + + if with_polymorphic: + poly_properties = mapper._iterate_polymorphic_properties( + with_polymorphic) + else: + poly_properties = mapper._polymorphic_properties + + quick_populators = {} + + path.set( + context.attributes, + "memoized_setups", + quick_populators) + + for value in poly_properties: + if only_load_props and \ + value.key not in only_load_props: + continue + value.setup( + context, + query_entity, + path, + adapter, + only_load_props=only_load_props, + column_collection=column_collection, + memoized_populators=quick_populators, + **kw + ) + + if polymorphic_discriminator is not None and \ + polymorphic_discriminator \ + is not mapper.polymorphic_on: + + if adapter: + pd = adapter.columns[polymorphic_discriminator] + else: + pd = polymorphic_discriminator + column_collection.append(pd) + + +def _instance_processor( + mapper, context, result, path, adapter, + only_load_props=None, refresh_state=None, + polymorphic_discriminator=None, + _polymorphic_from=None): + """Produce a mapper level row processor callable + which processes rows into mapped instances.""" + + # note that this method, most of which exists in a closure + # called _instance(), resists being broken out, as + # attempts to do so tend to add significant function + # call overhead. _instance() is the most + # performance-critical section in the whole ORM. + + pk_cols = mapper.primary_key + + if adapter: + pk_cols = [adapter.columns[c] for c in pk_cols] + + identity_class = mapper._identity_class + + populators = collections.defaultdict(list) + + props = mapper._prop_set + if only_load_props is not None: + props = props.intersection( + mapper._props[k] for k in only_load_props) + + quick_populators = path.get( + context.attributes, "memoized_setups", _none_set) + + for prop in props: + if prop in quick_populators: + # this is an inlined path just for column-based attributes. + col = quick_populators[prop] + if col is _DEFER_FOR_STATE: + populators["new"].append( + (prop.key, prop._deferred_column_loader)) + elif col is _SET_DEFERRED_EXPIRED: + # note that in this path, we are no longer + # searching in the result to see if the column might + # be present in some unexpected way. + populators["expire"].append((prop.key, False)) + else: + if adapter: + col = adapter.columns[col] + getter = result._getter(col, False) + if getter: + populators["quick"].append((prop.key, getter)) + else: + # fall back to the ColumnProperty itself, which + # will iterate through all of its columns + # to see if one fits + prop.create_row_processor( + context, path, mapper, result, adapter, populators) + else: + prop.create_row_processor( + context, path, mapper, result, adapter, populators) + + propagate_options = context.propagate_options + load_path = context.query._current_path + path \ + if context.query._current_path.path else path + + session_identity_map = context.session.identity_map + + populate_existing = context.populate_existing or mapper.always_refresh + load_evt = bool(mapper.class_manager.dispatch.load) + refresh_evt = bool(mapper.class_manager.dispatch.refresh) + persistent_evt = bool(context.session.dispatch.loaded_as_persistent) + if persistent_evt: + loaded_as_persistent = context.session.dispatch.loaded_as_persistent + instance_state = attributes.instance_state + instance_dict = attributes.instance_dict + session_id = context.session.hash_key + version_check = context.version_check + runid = context.runid + + if refresh_state: + refresh_identity_key = refresh_state.key + if refresh_identity_key is None: + # super-rare condition; a refresh is being called + # on a non-instance-key instance; this is meant to only + # occur within a flush() + refresh_identity_key = \ + mapper._identity_key_from_state(refresh_state) + else: + refresh_identity_key = None + + if mapper.allow_partial_pks: + is_not_primary_key = _none_set.issuperset + else: + is_not_primary_key = _none_set.intersection + + def _instance(row): + + # determine the state that we'll be populating + if refresh_identity_key: + # fixed state that we're refreshing + state = refresh_state + instance = state.obj() + dict_ = instance_dict(instance) + isnew = state.runid != runid + currentload = True + loaded_instance = False + else: + # look at the row, see if that identity is in the + # session, or we have to create a new one + identitykey = ( + identity_class, + tuple([row[column] for column in pk_cols]) + ) + + instance = session_identity_map.get(identitykey) + + if instance is not None: + # existing instance + state = instance_state(instance) + dict_ = instance_dict(instance) + + isnew = state.runid != runid + currentload = not isnew + loaded_instance = False + + if version_check and not currentload: + _validate_version_id(mapper, state, dict_, row, adapter) + + else: + # create a new instance + + # check for non-NULL values in the primary key columns, + # else no entity is returned for the row + if is_not_primary_key(identitykey[1]): + return None + + isnew = True + currentload = True + loaded_instance = True + + instance = mapper.class_manager.new_instance() + + dict_ = instance_dict(instance) + state = instance_state(instance) + state.key = identitykey + + # attach instance to session. + state.session_id = session_id + session_identity_map._add_unpresent(state, identitykey) + + # populate. this looks at whether this state is new + # for this load or was existing, and whether or not this + # row is the first row with this identity. + if currentload or populate_existing: + # full population routines. Objects here are either + # just created, or we are doing a populate_existing + + # be conservative about setting load_path when populate_existing + # is in effect; want to maintain options from the original + # load. see test_expire->test_refresh_maintains_deferred_options + if isnew and (propagate_options or not populate_existing): + state.load_options = propagate_options + state.load_path = load_path + + _populate_full( + context, row, state, dict_, isnew, load_path, + loaded_instance, populate_existing, populators) + + if isnew: + if loaded_instance: + if load_evt: + state.manager.dispatch.load(state, context) + if persistent_evt: + loaded_as_persistent(context.session, state.obj()) + elif refresh_evt: + state.manager.dispatch.refresh( + state, context, only_load_props) + + if populate_existing or state.modified: + if refresh_state and only_load_props: + state._commit(dict_, only_load_props) + else: + state._commit_all(dict_, session_identity_map) + + else: + # partial population routines, for objects that were already + # in the Session, but a row matches them; apply eager loaders + # on existing objects, etc. + unloaded = state.unloaded + isnew = state not in context.partials + + if not isnew or unloaded or populators["eager"]: + # state is having a partial set of its attributes + # refreshed. Populate those attributes, + # and add to the "context.partials" collection. + + to_load = _populate_partial( + context, row, state, dict_, isnew, load_path, + unloaded, populators) + + if isnew: + if refresh_evt: + state.manager.dispatch.refresh( + state, context, to_load) + + state._commit(dict_, to_load) + + return instance + + if mapper.polymorphic_map and not _polymorphic_from and not refresh_state: + # if we are doing polymorphic, dispatch to a different _instance() + # method specific to the subclass mapper + _instance = _decorate_polymorphic_switch( + _instance, context, mapper, result, path, + polymorphic_discriminator, adapter) + + return _instance + + +def _populate_full( + context, row, state, dict_, isnew, load_path, + loaded_instance, populate_existing, populators): + if isnew: + # first time we are seeing a row with this identity. + state.runid = context.runid + + for key, getter in populators["quick"]: + dict_[key] = getter(row) + if populate_existing: + for key, set_callable in populators["expire"]: + dict_.pop(key, None) + if set_callable: + state.expired_attributes.add(key) + else: + for key, set_callable in populators["expire"]: + if set_callable: + state.expired_attributes.add(key) + for key, populator in populators["new"]: + populator(state, dict_, row) + for key, populator in populators["delayed"]: + populator(state, dict_, row) + elif load_path != state.load_path: + # new load path, e.g. object is present in more than one + # column position in a series of rows + state.load_path = load_path + + # if we have data, and the data isn't in the dict, OK, let's put + # it in. + for key, getter in populators["quick"]: + if key not in dict_: + dict_[key] = getter(row) + + # otherwise treat like an "already seen" row + for key, populator in populators["existing"]: + populator(state, dict_, row) + # TODO: allow "existing" populator to know this is + # a new path for the state: + # populator(state, dict_, row, new_path=True) + + else: + # have already seen rows with this identity in this same path. + for key, populator in populators["existing"]: + populator(state, dict_, row) + + # TODO: same path + # populator(state, dict_, row, new_path=False) + + +def _populate_partial( + context, row, state, dict_, isnew, load_path, + unloaded, populators): + + if not isnew: + to_load = context.partials[state] + for key, populator in populators["existing"]: + if key in to_load: + populator(state, dict_, row) + else: + to_load = unloaded + context.partials[state] = to_load + + for key, getter in populators["quick"]: + if key in to_load: + dict_[key] = getter(row) + for key, set_callable in populators["expire"]: + if key in to_load: + dict_.pop(key, None) + if set_callable: + state.expired_attributes.add(key) + for key, populator in populators["new"]: + if key in to_load: + populator(state, dict_, row) + for key, populator in populators["delayed"]: + if key in to_load: + populator(state, dict_, row) + for key, populator in populators["eager"]: + if key not in unloaded: + populator(state, dict_, row) + + return to_load + + +def _validate_version_id(mapper, state, dict_, row, adapter): + + version_id_col = mapper.version_id_col + + if version_id_col is None: + return + + if adapter: + version_id_col = adapter.columns[version_id_col] + + if mapper._get_state_attr_by_column( + state, dict_, mapper.version_id_col) != row[version_id_col]: + raise orm_exc.StaleDataError( + "Instance '%s' has version id '%s' which " + "does not match database-loaded version id '%s'." + % (state_str(state), mapper._get_state_attr_by_column( + state, dict_, mapper.version_id_col), + row[version_id_col])) + + +def _decorate_polymorphic_switch( + instance_fn, context, mapper, result, path, + polymorphic_discriminator, adapter): + if polymorphic_discriminator is not None: + polymorphic_on = polymorphic_discriminator + else: + polymorphic_on = mapper.polymorphic_on + if polymorphic_on is None: + return instance_fn + + if adapter: + polymorphic_on = adapter.columns[polymorphic_on] + + def configure_subclass_mapper(discriminator): + try: + sub_mapper = mapper.polymorphic_map[discriminator] + except KeyError: + raise AssertionError( + "No such polymorphic_identity %r is defined" % + discriminator) + else: + if sub_mapper is mapper: + return None + + return _instance_processor( + sub_mapper, context, result, + path, adapter, _polymorphic_from=mapper) + + polymorphic_instances = util.PopulateDict( + configure_subclass_mapper + ) + + def polymorphic_instance(row): + discriminator = row[polymorphic_on] + if discriminator is not None: + _instance = polymorphic_instances[discriminator] + if _instance: + return _instance(row) + return instance_fn(row) + return polymorphic_instance + + +def load_scalar_attributes(mapper, state, attribute_names): + """initiate a column-based attribute refresh operation.""" + + # assert mapper is _state_mapper(state) + session = state.session + if not session: + raise orm_exc.DetachedInstanceError( + "Instance %s is not bound to a Session; " + "attribute refresh operation cannot proceed" % + (state_str(state))) + + has_key = bool(state.key) + + result = False + + if mapper.inherits and not mapper.concrete: + # because we are using Core to produce a select() that we + # pass to the Query, we aren't calling setup() for mapped + # attributes; in 1.0 this means deferred attrs won't get loaded + # by default + statement = mapper._optimized_get_statement(state, attribute_names) + if statement is not None: + result = load_on_ident( + session.query(mapper). + options( + strategy_options.Load(mapper).undefer("*") + ).from_statement(statement), + None, + only_load_props=attribute_names, + refresh_state=state + ) + + if result is False: + if has_key: + identity_key = state.key + else: + # this codepath is rare - only valid when inside a flush, and the + # object is becoming persistent but hasn't yet been assigned + # an identity_key. + # check here to ensure we have the attrs we need. + pk_attrs = [mapper._columntoproperty[col].key + for col in mapper.primary_key] + if state.expired_attributes.intersection(pk_attrs): + raise sa_exc.InvalidRequestError( + "Instance %s cannot be refreshed - it's not " + " persistent and does not " + "contain a full primary key." % state_str(state)) + identity_key = mapper._identity_key_from_state(state) + + if (_none_set.issubset(identity_key) and + not mapper.allow_partial_pks) or \ + _none_set.issuperset(identity_key): + util.warn_limited( + "Instance %s to be refreshed doesn't " + "contain a full primary key - can't be refreshed " + "(and shouldn't be expired, either).", + state_str(state)) + return + + result = load_on_ident( + session.query(mapper), + identity_key, + refresh_state=state, + only_load_props=attribute_names) + + # if instance is pending, a refresh operation + # may not complete (even if PK attributes are assigned) + if has_key and result is None: + raise orm_exc.ObjectDeletedError(state) diff --git a/app/lib/sqlalchemy/orm/mapper.py b/app/lib/sqlalchemy/orm/mapper.py new file mode 100644 index 0000000..962486d --- /dev/null +++ b/app/lib/sqlalchemy/orm/mapper.py @@ -0,0 +1,3007 @@ +# orm/mapper.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Logic to map Python classes to and from selectables. + +Defines the :class:`~sqlalchemy.orm.mapper.Mapper` class, the central +configurational unit which associates a class with a database table. + +This is a semi-private module; the main configurational API of the ORM is +available in :class:`~sqlalchemy.orm.`. + +""" +from __future__ import absolute_import + +import types +import weakref +from itertools import chain +from collections import deque + +from .. import sql, util, log, exc as sa_exc, event, schema, inspection +from ..sql import expression, visitors, operators, util as sql_util +from . import instrumentation, attributes, exc as orm_exc, loading +from . import properties +from . import util as orm_util +from .interfaces import MapperProperty, InspectionAttr, _MappedAttribute + +from .base import _class_to_mapper, _state_mapper, class_mapper, \ + state_str, _INSTRUMENTOR +from .path_registry import PathRegistry + +import sys + + +_mapper_registry = weakref.WeakKeyDictionary() +_already_compiling = False + +_memoized_configured_property = util.group_expirable_memoized_property() + + +# a constant returned by _get_attr_by_column to indicate +# this mapper is not handling an attribute for a particular +# column +NO_ATTRIBUTE = util.symbol('NO_ATTRIBUTE') + +# lock used to synchronize the "mapper configure" step +_CONFIGURE_MUTEX = util.threading.RLock() + + +@inspection._self_inspects +@log.class_logger +class Mapper(InspectionAttr): + """Define the correlation of class attributes to database table + columns. + + The :class:`.Mapper` object is instantiated using the + :func:`~sqlalchemy.orm.mapper` function. For information + about instantiating new :class:`.Mapper` objects, see + that function's documentation. + + + When :func:`.mapper` is used + explicitly to link a user defined class with table + metadata, this is referred to as *classical mapping*. + Modern SQLAlchemy usage tends to favor the + :mod:`sqlalchemy.ext.declarative` extension for class + configuration, which + makes usage of :func:`.mapper` behind the scenes. + + Given a particular class known to be mapped by the ORM, + the :class:`.Mapper` which maintains it can be acquired + using the :func:`.inspect` function:: + + from sqlalchemy import inspect + + mapper = inspect(MyClass) + + A class which was mapped by the :mod:`sqlalchemy.ext.declarative` + extension will also have its mapper available via the ``__mapper__`` + attribute. + + + """ + + _new_mappers = False + + def __init__(self, + class_, + local_table=None, + properties=None, + primary_key=None, + non_primary=False, + inherits=None, + inherit_condition=None, + inherit_foreign_keys=None, + extension=None, + order_by=False, + always_refresh=False, + version_id_col=None, + version_id_generator=None, + polymorphic_on=None, + _polymorphic_map=None, + polymorphic_identity=None, + concrete=False, + with_polymorphic=None, + allow_partial_pks=True, + batch=True, + column_prefix=None, + include_properties=None, + exclude_properties=None, + passive_updates=True, + passive_deletes=False, + confirm_deleted_rows=True, + eager_defaults=False, + legacy_is_orphan=False, + _compiled_cache_size=100, + ): + r"""Return a new :class:`~.Mapper` object. + + This function is typically used behind the scenes + via the Declarative extension. When using Declarative, + many of the usual :func:`.mapper` arguments are handled + by the Declarative extension itself, including ``class_``, + ``local_table``, ``properties``, and ``inherits``. + Other options are passed to :func:`.mapper` using + the ``__mapper_args__`` class variable:: + + class MyClass(Base): + __tablename__ = 'my_table' + id = Column(Integer, primary_key=True) + type = Column(String(50)) + alt = Column("some_alt", Integer) + + __mapper_args__ = { + 'polymorphic_on' : type + } + + + Explicit use of :func:`.mapper` + is often referred to as *classical mapping*. The above + declarative example is equivalent in classical form to:: + + my_table = Table("my_table", metadata, + Column('id', Integer, primary_key=True), + Column('type', String(50)), + Column("some_alt", Integer) + ) + + class MyClass(object): + pass + + mapper(MyClass, my_table, + polymorphic_on=my_table.c.type, + properties={ + 'alt':my_table.c.some_alt + }) + + .. seealso:: + + :ref:`classical_mapping` - discussion of direct usage of + :func:`.mapper` + + :param class\_: The class to be mapped. When using Declarative, + this argument is automatically passed as the declared class + itself. + + :param local_table: The :class:`.Table` or other selectable + to which the class is mapped. May be ``None`` if + this mapper inherits from another mapper using single-table + inheritance. When using Declarative, this argument is + automatically passed by the extension, based on what + is configured via the ``__table__`` argument or via the + :class:`.Table` produced as a result of the ``__tablename__`` + and :class:`.Column` arguments present. + + :param always_refresh: If True, all query operations for this mapped + class will overwrite all data within object instances that already + exist within the session, erasing any in-memory changes with + whatever information was loaded from the database. Usage of this + flag is highly discouraged; as an alternative, see the method + :meth:`.Query.populate_existing`. + + :param allow_partial_pks: Defaults to True. Indicates that a + composite primary key with some NULL values should be considered as + possibly existing within the database. This affects whether a + mapper will assign an incoming row to an existing identity, as well + as if :meth:`.Session.merge` will check the database first for a + particular primary key value. A "partial primary key" can occur if + one has mapped to an OUTER JOIN, for example. + + :param batch: Defaults to ``True``, indicating that save operations + of multiple entities can be batched together for efficiency. + Setting to False indicates + that an instance will be fully saved before saving the next + instance. This is used in the extremely rare case that a + :class:`.MapperEvents` listener requires being called + in between individual row persistence operations. + + :param column_prefix: A string which will be prepended + to the mapped attribute name when :class:`.Column` + objects are automatically assigned as attributes to the + mapped class. Does not affect explicitly specified + column-based properties. + + See the section :ref:`column_prefix` for an example. + + :param concrete: If True, indicates this mapper should use concrete + table inheritance with its parent mapper. + + See the section :ref:`concrete_inheritance` for an example. + + :param confirm_deleted_rows: defaults to True; when a DELETE occurs + of one more rows based on specific primary keys, a warning is + emitted when the number of rows matched does not equal the number + of rows expected. This parameter may be set to False to handle the + case where database ON DELETE CASCADE rules may be deleting some of + those rows automatically. The warning may be changed to an + exception in a future release. + + .. versionadded:: 0.9.4 - added + :paramref:`.mapper.confirm_deleted_rows` as well as conditional + matched row checking on delete. + + :param eager_defaults: if True, the ORM will immediately fetch the + value of server-generated default values after an INSERT or UPDATE, + rather than leaving them as expired to be fetched on next access. + This can be used for event schemes where the server-generated values + are needed immediately before the flush completes. By default, + this scheme will emit an individual ``SELECT`` statement per row + inserted or updated, which note can add significant performance + overhead. However, if the + target database supports :term:`RETURNING`, the default values will + be returned inline with the INSERT or UPDATE statement, which can + greatly enhance performance for an application that needs frequent + access to just-generated server defaults. + + .. versionchanged:: 0.9.0 The ``eager_defaults`` option can now + make use of :term:`RETURNING` for backends which support it. + + :param exclude_properties: A list or set of string column names to + be excluded from mapping. + + See :ref:`include_exclude_cols` for an example. + + :param extension: A :class:`.MapperExtension` instance or + list of :class:`.MapperExtension` instances which will be applied + to all operations by this :class:`.Mapper`. **Deprecated.** + Please see :class:`.MapperEvents`. + + :param include_properties: An inclusive list or set of string column + names to map. + + See :ref:`include_exclude_cols` for an example. + + :param inherits: A mapped class or the corresponding :class:`.Mapper` + of one indicating a superclass to which this :class:`.Mapper` + should *inherit* from. The mapped class here must be a subclass + of the other mapper's class. When using Declarative, this argument + is passed automatically as a result of the natural class + hierarchy of the declared classes. + + .. seealso:: + + :ref:`inheritance_toplevel` + + :param inherit_condition: For joined table inheritance, a SQL + expression which will + define how the two tables are joined; defaults to a natural join + between the two tables. + + :param inherit_foreign_keys: When ``inherit_condition`` is used and + the columns present are missing a :class:`.ForeignKey` + configuration, this parameter can be used to specify which columns + are "foreign". In most cases can be left as ``None``. + + :param legacy_is_orphan: Boolean, defaults to ``False``. + When ``True``, specifies that "legacy" orphan consideration + is to be applied to objects mapped by this mapper, which means + that a pending (that is, not persistent) object is auto-expunged + from an owning :class:`.Session` only when it is de-associated + from *all* parents that specify a ``delete-orphan`` cascade towards + this mapper. The new default behavior is that the object is + auto-expunged when it is de-associated with *any* of its parents + that specify ``delete-orphan`` cascade. This behavior is more + consistent with that of a persistent object, and allows behavior to + be consistent in more scenarios independently of whether or not an + orphanable object has been flushed yet or not. + + See the change note and example at :ref:`legacy_is_orphan_addition` + for more detail on this change. + + .. versionadded:: 0.8 - the consideration of a pending object as + an "orphan" has been modified to more closely match the + behavior as that of persistent objects, which is that the object + is expunged from the :class:`.Session` as soon as it is + de-associated from any of its orphan-enabled parents. Previously, + the pending object would be expunged only if de-associated + from all of its orphan-enabled parents. The new flag + ``legacy_is_orphan`` is added to :func:`.orm.mapper` which + re-establishes the legacy behavior. + + :param non_primary: Specify that this :class:`.Mapper` is in addition + to the "primary" mapper, that is, the one used for persistence. + The :class:`.Mapper` created here may be used for ad-hoc + mapping of the class to an alternate selectable, for loading + only. + + :paramref:`.Mapper.non_primary` is not an often used option, but + is useful in some specific :func:`.relationship` cases. + + .. seealso:: + + :ref:`relationship_non_primary_mapper` + + :param order_by: A single :class:`.Column` or list of :class:`.Column` + objects for which selection operations should use as the default + ordering for entities. By default mappers have no pre-defined + ordering. + + .. deprecated:: 1.1 The :paramref:`.Mapper.order_by` parameter + is deprecated. Use :meth:`.Query.order_by` to determine the + ordering of a result set. + + :param passive_deletes: Indicates DELETE behavior of foreign key + columns when a joined-table inheritance entity is being deleted. + Defaults to ``False`` for a base mapper; for an inheriting mapper, + defaults to ``False`` unless the value is set to ``True`` + on the superclass mapper. + + When ``True``, it is assumed that ON DELETE CASCADE is configured + on the foreign key relationships that link this mapper's table + to its superclass table, so that when the unit of work attempts + to delete the entity, it need only emit a DELETE statement for the + superclass table, and not this table. + + When ``False``, a DELETE statement is emitted for this mapper's + table individually. If the primary key attributes local to this + table are unloaded, then a SELECT must be emitted in order to + validate these attributes; note that the primary key columns + of a joined-table subclass are not part of the "primary key" of + the object as a whole. + + Note that a value of ``True`` is **always** forced onto the + subclass mappers; that is, it's not possible for a superclass + to specify passive_deletes without this taking effect for + all subclass mappers. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`passive_deletes` - description of similar feature as + used with :func:`.relationship` + + :paramref:`.mapper.passive_updates` - supporting ON UPDATE + CASCADE for joined-table inheritance mappers + + :param passive_updates: Indicates UPDATE behavior of foreign key + columns when a primary key column changes on a joined-table + inheritance mapping. Defaults to ``True``. + + When True, it is assumed that ON UPDATE CASCADE is configured on + the foreign key in the database, and that the database will handle + propagation of an UPDATE from a source column to dependent columns + on joined-table rows. + + When False, it is assumed that the database does not enforce + referential integrity and will not be issuing its own CASCADE + operation for an update. The unit of work process will + emit an UPDATE statement for the dependent columns during a + primary key change. + + .. seealso:: + + :ref:`passive_updates` - description of a similar feature as + used with :func:`.relationship` + + :paramref:`.mapper.passive_deletes` - supporting ON DELETE + CASCADE for joined-table inheritance mappers + + :param polymorphic_on: Specifies the column, attribute, or + SQL expression used to determine the target class for an + incoming row, when inheriting classes are present. + + This value is commonly a :class:`.Column` object that's + present in the mapped :class:`.Table`:: + + class Employee(Base): + __tablename__ = 'employee' + + id = Column(Integer, primary_key=True) + discriminator = Column(String(50)) + + __mapper_args__ = { + "polymorphic_on":discriminator, + "polymorphic_identity":"employee" + } + + It may also be specified + as a SQL expression, as in this example where we + use the :func:`.case` construct to provide a conditional + approach:: + + class Employee(Base): + __tablename__ = 'employee' + + id = Column(Integer, primary_key=True) + discriminator = Column(String(50)) + + __mapper_args__ = { + "polymorphic_on":case([ + (discriminator == "EN", "engineer"), + (discriminator == "MA", "manager"), + ], else_="employee"), + "polymorphic_identity":"employee" + } + + It may also refer to any attribute + configured with :func:`.column_property`, or to the + string name of one:: + + class Employee(Base): + __tablename__ = 'employee' + + id = Column(Integer, primary_key=True) + discriminator = Column(String(50)) + employee_type = column_property( + case([ + (discriminator == "EN", "engineer"), + (discriminator == "MA", "manager"), + ], else_="employee") + ) + + __mapper_args__ = { + "polymorphic_on":employee_type, + "polymorphic_identity":"employee" + } + + .. versionchanged:: 0.7.4 + ``polymorphic_on`` may be specified as a SQL expression, + or refer to any attribute configured with + :func:`.column_property`, or to the string name of one. + + When setting ``polymorphic_on`` to reference an + attribute or expression that's not present in the + locally mapped :class:`.Table`, yet the value + of the discriminator should be persisted to the database, + the value of the + discriminator is not automatically set on new + instances; this must be handled by the user, + either through manual means or via event listeners. + A typical approach to establishing such a listener + looks like:: + + from sqlalchemy import event + from sqlalchemy.orm import object_mapper + + @event.listens_for(Employee, "init", propagate=True) + def set_identity(instance, *arg, **kw): + mapper = object_mapper(instance) + instance.discriminator = mapper.polymorphic_identity + + Where above, we assign the value of ``polymorphic_identity`` + for the mapped class to the ``discriminator`` attribute, + thus persisting the value to the ``discriminator`` column + in the database. + + .. warning:: + + Currently, **only one discriminator column may be set**, typically + on the base-most class in the hierarchy. "Cascading" polymorphic + columns are not yet supported. + + .. seealso:: + + :ref:`inheritance_toplevel` + + :param polymorphic_identity: Specifies the value which + identifies this particular class as returned by the + column expression referred to by the ``polymorphic_on`` + setting. As rows are received, the value corresponding + to the ``polymorphic_on`` column expression is compared + to this value, indicating which subclass should + be used for the newly reconstructed object. + + :param properties: A dictionary mapping the string names of object + attributes to :class:`.MapperProperty` instances, which define the + persistence behavior of that attribute. Note that :class:`.Column` + objects present in + the mapped :class:`.Table` are automatically placed into + ``ColumnProperty`` instances upon mapping, unless overridden. + When using Declarative, this argument is passed automatically, + based on all those :class:`.MapperProperty` instances declared + in the declared class body. + + :param primary_key: A list of :class:`.Column` objects which define + the primary key to be used against this mapper's selectable unit. + This is normally simply the primary key of the ``local_table``, but + can be overridden here. + + :param version_id_col: A :class:`.Column` + that will be used to keep a running version id of rows + in the table. This is used to detect concurrent updates or + the presence of stale data in a flush. The methodology is to + detect if an UPDATE statement does not match the last known + version id, a + :class:`~sqlalchemy.orm.exc.StaleDataError` exception is + thrown. + By default, the column must be of :class:`.Integer` type, + unless ``version_id_generator`` specifies an alternative version + generator. + + .. seealso:: + + :ref:`mapper_version_counter` - discussion of version counting + and rationale. + + :param version_id_generator: Define how new version ids should + be generated. Defaults to ``None``, which indicates that + a simple integer counting scheme be employed. To provide a custom + versioning scheme, provide a callable function of the form:: + + def generate_version(version): + return next_version + + Alternatively, server-side versioning functions such as triggers, + or programmatic versioning schemes outside of the version id + generator may be used, by specifying the value ``False``. + Please see :ref:`server_side_version_counter` for a discussion + of important points when using this option. + + .. versionadded:: 0.9.0 ``version_id_generator`` supports + server-side version number generation. + + .. seealso:: + + :ref:`custom_version_counter` + + :ref:`server_side_version_counter` + + + :param with_polymorphic: A tuple in the form ``(, + )`` indicating the default style of "polymorphic" + loading, that is, which tables are queried at once. is + any single or list of mappers and/or classes indicating the + inherited classes that should be loaded at once. The special value + ``'*'`` may be used to indicate all descending classes should be + loaded immediately. The second tuple argument + indicates a selectable that will be used to query for multiple + classes. + + .. seealso:: + + :ref:`with_polymorphic` - discussion of polymorphic querying + techniques. + + """ + + self.class_ = util.assert_arg_type(class_, type, 'class_') + + self.class_manager = None + + self._primary_key_argument = util.to_list(primary_key) + self.non_primary = non_primary + + if order_by is not False: + self.order_by = util.to_list(order_by) + util.warn_deprecated( + "Mapper.order_by is deprecated." + "Use Query.order_by() in order to affect the ordering of ORM " + "result sets.") + + else: + self.order_by = order_by + + self.always_refresh = always_refresh + + if isinstance(version_id_col, MapperProperty): + self.version_id_prop = version_id_col + self.version_id_col = None + else: + self.version_id_col = version_id_col + if version_id_generator is False: + self.version_id_generator = False + elif version_id_generator is None: + self.version_id_generator = lambda x: (x or 0) + 1 + else: + self.version_id_generator = version_id_generator + + self.concrete = concrete + self.single = False + self.inherits = inherits + self.local_table = local_table + self.inherit_condition = inherit_condition + self.inherit_foreign_keys = inherit_foreign_keys + self._init_properties = properties or {} + self._delete_orphans = [] + self.batch = batch + self.eager_defaults = eager_defaults + self.column_prefix = column_prefix + self.polymorphic_on = expression._clause_element_as_expr( + polymorphic_on) + self._dependency_processors = [] + self.validators = util.immutabledict() + self.passive_updates = passive_updates + self.passive_deletes = passive_deletes + self.legacy_is_orphan = legacy_is_orphan + self._clause_adapter = None + self._requires_row_aliasing = False + self._inherits_equated_pairs = None + self._memoized_values = {} + self._compiled_cache_size = _compiled_cache_size + self._reconstructor = None + self._deprecated_extensions = util.to_list(extension or []) + self.allow_partial_pks = allow_partial_pks + + if self.inherits and not self.concrete: + self.confirm_deleted_rows = False + else: + self.confirm_deleted_rows = confirm_deleted_rows + + self._set_with_polymorphic(with_polymorphic) + + if isinstance(self.local_table, expression.SelectBase): + raise sa_exc.InvalidRequestError( + "When mapping against a select() construct, map against " + "an alias() of the construct instead." + "This because several databases don't allow a " + "SELECT from a subquery that does not have an alias." + ) + + if self.with_polymorphic and \ + isinstance(self.with_polymorphic[1], + expression.SelectBase): + self.with_polymorphic = (self.with_polymorphic[0], + self.with_polymorphic[1].alias()) + + # our 'polymorphic identity', a string name that when located in a + # result set row indicates this Mapper should be used to construct + # the object instance for that row. + self.polymorphic_identity = polymorphic_identity + + # a dictionary of 'polymorphic identity' names, associating those + # names with Mappers that will be used to construct object instances + # upon a select operation. + if _polymorphic_map is None: + self.polymorphic_map = {} + else: + self.polymorphic_map = _polymorphic_map + + if include_properties is not None: + self.include_properties = util.to_set(include_properties) + else: + self.include_properties = None + if exclude_properties: + self.exclude_properties = util.to_set(exclude_properties) + else: + self.exclude_properties = None + + self.configured = False + + # prevent this mapper from being constructed + # while a configure_mappers() is occurring (and defer a + # configure_mappers() until construction succeeds) + _CONFIGURE_MUTEX.acquire() + try: + self.dispatch._events._new_mapper_instance(class_, self) + self._configure_inheritance() + self._configure_legacy_instrument_class() + self._configure_class_instrumentation() + self._configure_listeners() + self._configure_properties() + self._configure_polymorphic_setter() + self._configure_pks() + Mapper._new_mappers = True + self._log("constructed") + self._expire_memoizations() + finally: + _CONFIGURE_MUTEX.release() + + # major attributes initialized at the classlevel so that + # they can be Sphinx-documented. + + is_mapper = True + """Part of the inspection API.""" + + @property + def mapper(self): + """Part of the inspection API. + + Returns self. + + """ + return self + + @property + def entity(self): + r"""Part of the inspection API. + + Returns self.class\_. + + """ + return self.class_ + + local_table = None + """The :class:`.Selectable` which this :class:`.Mapper` manages. + + Typically is an instance of :class:`.Table` or :class:`.Alias`. + May also be ``None``. + + The "local" table is the + selectable that the :class:`.Mapper` is directly responsible for + managing from an attribute access and flush perspective. For + non-inheriting mappers, the local table is the same as the + "mapped" table. For joined-table inheritance mappers, local_table + will be the particular sub-table of the overall "join" which + this :class:`.Mapper` represents. If this mapper is a + single-table inheriting mapper, local_table will be ``None``. + + .. seealso:: + + :attr:`~.Mapper.mapped_table`. + + """ + + mapped_table = None + """The :class:`.Selectable` to which this :class:`.Mapper` is mapped. + + Typically an instance of :class:`.Table`, :class:`.Join`, or + :class:`.Alias`. + + The "mapped" table is the selectable that + the mapper selects from during queries. For non-inheriting + mappers, the mapped table is the same as the "local" table. + For joined-table inheritance mappers, mapped_table references the + full :class:`.Join` representing full rows for this particular + subclass. For single-table inheritance mappers, mapped_table + references the base table. + + .. seealso:: + + :attr:`~.Mapper.local_table`. + + """ + + inherits = None + """References the :class:`.Mapper` which this :class:`.Mapper` + inherits from, if any. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + configured = None + """Represent ``True`` if this :class:`.Mapper` has been configured. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + .. seealso:: + + :func:`.configure_mappers`. + + """ + + concrete = None + """Represent ``True`` if this :class:`.Mapper` is a concrete + inheritance mapper. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + tables = None + """An iterable containing the collection of :class:`.Table` objects + which this :class:`.Mapper` is aware of. + + If the mapper is mapped to a :class:`.Join`, or an :class:`.Alias` + representing a :class:`.Select`, the individual :class:`.Table` + objects that comprise the full construct will be represented here. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + primary_key = None + """An iterable containing the collection of :class:`.Column` objects + which comprise the 'primary key' of the mapped table, from the + perspective of this :class:`.Mapper`. + + This list is against the selectable in :attr:`~.Mapper.mapped_table`. In + the case of inheriting mappers, some columns may be managed by a + superclass mapper. For example, in the case of a :class:`.Join`, the + primary key is determined by all of the primary key columns across all + tables referenced by the :class:`.Join`. + + The list is also not necessarily the same as the primary key column + collection associated with the underlying tables; the :class:`.Mapper` + features a ``primary_key`` argument that can override what the + :class:`.Mapper` considers as primary key columns. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + class_ = None + """The Python class which this :class:`.Mapper` maps. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + class_manager = None + """The :class:`.ClassManager` which maintains event listeners + and class-bound descriptors for this :class:`.Mapper`. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + single = None + """Represent ``True`` if this :class:`.Mapper` is a single table + inheritance mapper. + + :attr:`~.Mapper.local_table` will be ``None`` if this flag is set. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + non_primary = None + """Represent ``True`` if this :class:`.Mapper` is a "non-primary" + mapper, e.g. a mapper that is used only to selet rows but not for + persistence management. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + polymorphic_on = None + """The :class:`.Column` or SQL expression specified as the + ``polymorphic_on`` argument + for this :class:`.Mapper`, within an inheritance scenario. + + This attribute is normally a :class:`.Column` instance but + may also be an expression, such as one derived from + :func:`.cast`. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + polymorphic_map = None + """A mapping of "polymorphic identity" identifiers mapped to + :class:`.Mapper` instances, within an inheritance scenario. + + The identifiers can be of any type which is comparable to the + type of column represented by :attr:`~.Mapper.polymorphic_on`. + + An inheritance chain of mappers will all reference the same + polymorphic map object. The object is used to correlate incoming + result rows to target mappers. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + polymorphic_identity = None + """Represent an identifier which is matched against the + :attr:`~.Mapper.polymorphic_on` column during result row loading. + + Used only with inheritance, this object can be of any type which is + comparable to the type of column represented by + :attr:`~.Mapper.polymorphic_on`. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + base_mapper = None + """The base-most :class:`.Mapper` in an inheritance chain. + + In a non-inheriting scenario, this attribute will always be this + :class:`.Mapper`. In an inheritance scenario, it references + the :class:`.Mapper` which is parent to all other :class:`.Mapper` + objects in the inheritance chain. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + columns = None + """A collection of :class:`.Column` or other scalar expression + objects maintained by this :class:`.Mapper`. + + The collection behaves the same as that of the ``c`` attribute on + any :class:`.Table` object, except that only those columns included in + this mapping are present, and are keyed based on the attribute name + defined in the mapping, not necessarily the ``key`` attribute of the + :class:`.Column` itself. Additionally, scalar expressions mapped + by :func:`.column_property` are also present here. + + This is a *read only* attribute determined during mapper construction. + Behavior is undefined if directly modified. + + """ + + validators = None + """An immutable dictionary of attributes which have been decorated + using the :func:`~.orm.validates` decorator. + + The dictionary contains string attribute names as keys + mapped to the actual validation method. + + """ + + c = None + """A synonym for :attr:`~.Mapper.columns`.""" + + @util.memoized_property + def _path_registry(self): + return PathRegistry.per_mapper(self) + + def _configure_inheritance(self): + """Configure settings related to inherting and/or inherited mappers + being present.""" + + # a set of all mappers which inherit from this one. + self._inheriting_mappers = util.WeakSequence() + + if self.inherits: + if isinstance(self.inherits, type): + self.inherits = class_mapper(self.inherits, configure=False) + if not issubclass(self.class_, self.inherits.class_): + raise sa_exc.ArgumentError( + "Class '%s' does not inherit from '%s'" % + (self.class_.__name__, self.inherits.class_.__name__)) + if self.non_primary != self.inherits.non_primary: + np = not self.non_primary and "primary" or "non-primary" + raise sa_exc.ArgumentError( + "Inheritance of %s mapper for class '%s' is " + "only allowed from a %s mapper" % + (np, self.class_.__name__, np)) + # inherit_condition is optional. + if self.local_table is None: + self.local_table = self.inherits.local_table + self.mapped_table = self.inherits.mapped_table + self.single = True + elif self.local_table is not self.inherits.local_table: + if self.concrete: + self.mapped_table = self.local_table + for mapper in self.iterate_to_root(): + if mapper.polymorphic_on is not None: + mapper._requires_row_aliasing = True + else: + if self.inherit_condition is None: + # figure out inherit condition from our table to the + # immediate table of the inherited mapper, not its + # full table which could pull in other stuff we don't + # want (allows test/inheritance.InheritTest4 to pass) + self.inherit_condition = sql_util.join_condition( + self.inherits.local_table, + self.local_table) + self.mapped_table = sql.join( + self.inherits.mapped_table, + self.local_table, + self.inherit_condition) + + fks = util.to_set(self.inherit_foreign_keys) + self._inherits_equated_pairs = \ + sql_util.criterion_as_pairs( + self.mapped_table.onclause, + consider_as_foreign_keys=fks) + else: + self.mapped_table = self.local_table + + if self.polymorphic_identity is not None and not self.concrete: + self._identity_class = self.inherits._identity_class + else: + self._identity_class = self.class_ + + if self.version_id_col is None: + self.version_id_col = self.inherits.version_id_col + self.version_id_generator = self.inherits.version_id_generator + elif self.inherits.version_id_col is not None and \ + self.version_id_col is not self.inherits.version_id_col: + util.warn( + "Inheriting version_id_col '%s' does not match inherited " + "version_id_col '%s' and will not automatically populate " + "the inherited versioning column. " + "version_id_col should only be specified on " + "the base-most mapper that includes versioning." % + (self.version_id_col.description, + self.inherits.version_id_col.description) + ) + + if self.order_by is False and \ + not self.concrete and \ + self.inherits.order_by is not False: + self.order_by = self.inherits.order_by + + self.polymorphic_map = self.inherits.polymorphic_map + self.batch = self.inherits.batch + self.inherits._inheriting_mappers.append(self) + self.base_mapper = self.inherits.base_mapper + self.passive_updates = self.inherits.passive_updates + self.passive_deletes = self.inherits.passive_deletes or \ + self.passive_deletes + self._all_tables = self.inherits._all_tables + + if self.polymorphic_identity is not None: + if self.polymorphic_identity in self.polymorphic_map: + util.warn( + "Reassigning polymorphic association for identity %r " + "from %r to %r: Check for duplicate use of %r as " + "value for polymorphic_identity." % + (self.polymorphic_identity, + self.polymorphic_map[self.polymorphic_identity], + self, self.polymorphic_identity) + ) + self.polymorphic_map[self.polymorphic_identity] = self + + else: + self._all_tables = set() + self.base_mapper = self + self.mapped_table = self.local_table + if self.polymorphic_identity is not None: + self.polymorphic_map[self.polymorphic_identity] = self + self._identity_class = self.class_ + + if self.mapped_table is None: + raise sa_exc.ArgumentError( + "Mapper '%s' does not have a mapped_table specified." + % self) + + def _set_with_polymorphic(self, with_polymorphic): + if with_polymorphic == '*': + self.with_polymorphic = ('*', None) + elif isinstance(with_polymorphic, (tuple, list)): + if isinstance( + with_polymorphic[0], util.string_types + (tuple, list)): + self.with_polymorphic = with_polymorphic + else: + self.with_polymorphic = (with_polymorphic, None) + elif with_polymorphic is not None: + raise sa_exc.ArgumentError("Invalid setting for with_polymorphic") + else: + self.with_polymorphic = None + + if isinstance(self.local_table, expression.SelectBase): + raise sa_exc.InvalidRequestError( + "When mapping against a select() construct, map against " + "an alias() of the construct instead." + "This because several databases don't allow a " + "SELECT from a subquery that does not have an alias." + ) + + if self.with_polymorphic and \ + isinstance(self.with_polymorphic[1], + expression.SelectBase): + self.with_polymorphic = (self.with_polymorphic[0], + self.with_polymorphic[1].alias()) + if self.configured: + self._expire_memoizations() + + def _set_concrete_base(self, mapper): + """Set the given :class:`.Mapper` as the 'inherits' for this + :class:`.Mapper`, assuming this :class:`.Mapper` is concrete + and does not already have an inherits.""" + + assert self.concrete + assert not self.inherits + assert isinstance(mapper, Mapper) + self.inherits = mapper + self.inherits.polymorphic_map.update(self.polymorphic_map) + self.polymorphic_map = self.inherits.polymorphic_map + for mapper in self.iterate_to_root(): + if mapper.polymorphic_on is not None: + mapper._requires_row_aliasing = True + self.batch = self.inherits.batch + for mp in self.self_and_descendants: + mp.base_mapper = self.inherits.base_mapper + self.inherits._inheriting_mappers.append(self) + self.passive_updates = self.inherits.passive_updates + self._all_tables = self.inherits._all_tables + for key, prop in mapper._props.items(): + if key not in self._props and \ + not self._should_exclude(key, key, local=False, + column=None): + self._adapt_inherited_property(key, prop, False) + + def _set_polymorphic_on(self, polymorphic_on): + self.polymorphic_on = polymorphic_on + self._configure_polymorphic_setter(True) + + def _configure_legacy_instrument_class(self): + + if self.inherits: + self.dispatch._update(self.inherits.dispatch) + super_extensions = set( + chain(*[m._deprecated_extensions + for m in self.inherits.iterate_to_root()])) + else: + super_extensions = set() + + for ext in self._deprecated_extensions: + if ext not in super_extensions: + ext._adapt_instrument_class(self, ext) + + def _configure_listeners(self): + if self.inherits: + super_extensions = set( + chain(*[m._deprecated_extensions + for m in self.inherits.iterate_to_root()])) + else: + super_extensions = set() + + for ext in self._deprecated_extensions: + if ext not in super_extensions: + ext._adapt_listener(self, ext) + + def _configure_class_instrumentation(self): + """If this mapper is to be a primary mapper (i.e. the + non_primary flag is not set), associate this Mapper with the + given class_ and entity name. + + Subsequent calls to ``class_mapper()`` for the class_/entity + name combination will return this mapper. Also decorate the + `__init__` method on the mapped class to include optional + auto-session attachment logic. + + """ + + manager = attributes.manager_of_class(self.class_) + + if self.non_primary: + if not manager or not manager.is_mapped: + raise sa_exc.InvalidRequestError( + "Class %s has no primary mapper configured. Configure " + "a primary mapper first before setting up a non primary " + "Mapper." % self.class_) + self.class_manager = manager + self._identity_class = manager.mapper._identity_class + _mapper_registry[self] = True + return + + if manager is not None: + assert manager.class_ is self.class_ + if manager.is_mapped: + raise sa_exc.ArgumentError( + "Class '%s' already has a primary mapper defined. " + "Use non_primary=True to " + "create a non primary Mapper. clear_mappers() will " + "remove *all* current mappers from all classes." % + self.class_) + # else: + # a ClassManager may already exist as + # ClassManager.instrument_attribute() creates + # new managers for each subclass if they don't yet exist. + + _mapper_registry[self] = True + + # note: this *must be called before instrumentation.register_class* + # to maintain the documented behavior of instrument_class + self.dispatch.instrument_class(self, self.class_) + + if manager is None: + manager = instrumentation.register_class(self.class_) + + self.class_manager = manager + + manager.mapper = self + manager.deferred_scalar_loader = util.partial( + loading.load_scalar_attributes, self) + + # The remaining members can be added by any mapper, + # e_name None or not. + if manager.info.get(_INSTRUMENTOR, False): + return + + event.listen(manager, 'first_init', _event_on_first_init, raw=True) + event.listen(manager, 'init', _event_on_init, raw=True) + + for key, method in util.iterate_attributes(self.class_): + if isinstance(method, types.FunctionType): + if hasattr(method, '__sa_reconstructor__'): + self._reconstructor = method + event.listen(manager, 'load', _event_on_load, raw=True) + elif hasattr(method, '__sa_validators__'): + validation_opts = method.__sa_validation_opts__ + for name in method.__sa_validators__: + if name in self.validators: + raise sa_exc.InvalidRequestError( + "A validation function for mapped " + "attribute %r on mapper %s already exists." % + (name, self)) + self.validators = self.validators.union( + {name: (method, validation_opts)} + ) + + manager.info[_INSTRUMENTOR] = self + + @classmethod + def _configure_all(cls): + """Class-level path to the :func:`.configure_mappers` call. + """ + configure_mappers() + + def dispose(self): + # Disable any attribute-based compilation. + self.configured = True + + if hasattr(self, '_configure_failed'): + del self._configure_failed + + if not self.non_primary and \ + self.class_manager is not None and \ + self.class_manager.is_mapped and \ + self.class_manager.mapper is self: + instrumentation.unregister_class(self.class_) + + def _configure_pks(self): + self.tables = sql_util.find_tables(self.mapped_table) + + self._pks_by_table = {} + self._cols_by_table = {} + + all_cols = util.column_set(chain(*[ + col.proxy_set for col in + self._columntoproperty])) + + pk_cols = util.column_set(c for c in all_cols if c.primary_key) + + # identify primary key columns which are also mapped by this mapper. + tables = set(self.tables + [self.mapped_table]) + self._all_tables.update(tables) + for t in tables: + if t.primary_key and pk_cols.issuperset(t.primary_key): + # ordering is important since it determines the ordering of + # mapper.primary_key (and therefore query.get()) + self._pks_by_table[t] = \ + util.ordered_column_set(t.primary_key).\ + intersection(pk_cols) + self._cols_by_table[t] = \ + util.ordered_column_set(t.c).\ + intersection(all_cols) + + # if explicit PK argument sent, add those columns to the + # primary key mappings + if self._primary_key_argument: + for k in self._primary_key_argument: + if k.table not in self._pks_by_table: + self._pks_by_table[k.table] = util.OrderedSet() + self._pks_by_table[k.table].add(k) + + # otherwise, see that we got a full PK for the mapped table + elif self.mapped_table not in self._pks_by_table or \ + len(self._pks_by_table[self.mapped_table]) == 0: + raise sa_exc.ArgumentError( + "Mapper %s could not assemble any primary " + "key columns for mapped table '%s'" % + (self, self.mapped_table.description)) + elif self.local_table not in self._pks_by_table and \ + isinstance(self.local_table, schema.Table): + util.warn("Could not assemble any primary " + "keys for locally mapped table '%s' - " + "no rows will be persisted in this Table." + % self.local_table.description) + + if self.inherits and \ + not self.concrete and \ + not self._primary_key_argument: + # if inheriting, the "primary key" for this mapper is + # that of the inheriting (unless concrete or explicit) + self.primary_key = self.inherits.primary_key + else: + # determine primary key from argument or mapped_table pks - + # reduce to the minimal set of columns + if self._primary_key_argument: + primary_key = sql_util.reduce_columns( + [self.mapped_table.corresponding_column(c) for c in + self._primary_key_argument], + ignore_nonexistent_tables=True) + else: + primary_key = sql_util.reduce_columns( + self._pks_by_table[self.mapped_table], + ignore_nonexistent_tables=True) + + if len(primary_key) == 0: + raise sa_exc.ArgumentError( + "Mapper %s could not assemble any primary " + "key columns for mapped table '%s'" % + (self, self.mapped_table.description)) + + self.primary_key = tuple(primary_key) + self._log("Identified primary key columns: %s", primary_key) + + # determine cols that aren't expressed within our tables; mark these + # as "read only" properties which are refreshed upon INSERT/UPDATE + self._readonly_props = set( + self._columntoproperty[col] + for col in self._columntoproperty + if self._columntoproperty[col] not in self._identity_key_props and + (not hasattr(col, 'table') or + col.table not in self._cols_by_table)) + + def _configure_properties(self): + # Column and other ClauseElement objects which are mapped + self.columns = self.c = util.OrderedProperties() + + # object attribute names mapped to MapperProperty objects + self._props = util.OrderedDict() + + # table columns mapped to lists of MapperProperty objects + # using a list allows a single column to be defined as + # populating multiple object attributes + self._columntoproperty = _ColumnMapping(self) + + # load custom properties + if self._init_properties: + for key, prop in self._init_properties.items(): + self._configure_property(key, prop, False) + + # pull properties from the inherited mapper if any. + if self.inherits: + for key, prop in self.inherits._props.items(): + if key not in self._props and \ + not self._should_exclude(key, key, local=False, + column=None): + self._adapt_inherited_property(key, prop, False) + + # create properties for each column in the mapped table, + # for those columns which don't already map to a property + for column in self.mapped_table.columns: + if column in self._columntoproperty: + continue + + column_key = (self.column_prefix or '') + column.key + + if self._should_exclude( + column.key, column_key, + local=self.local_table.c.contains_column(column), + column=column + ): + continue + + # adjust the "key" used for this column to that + # of the inheriting mapper + for mapper in self.iterate_to_root(): + if column in mapper._columntoproperty: + column_key = mapper._columntoproperty[column].key + + self._configure_property(column_key, + column, + init=False, + setparent=True) + + def _configure_polymorphic_setter(self, init=False): + """Configure an attribute on the mapper representing the + 'polymorphic_on' column, if applicable, and not + already generated by _configure_properties (which is typical). + + Also create a setter function which will assign this + attribute to the value of the 'polymorphic_identity' + upon instance construction, also if applicable. This + routine will run when an instance is created. + + """ + setter = False + + if self.polymorphic_on is not None: + setter = True + + if isinstance(self.polymorphic_on, util.string_types): + # polymorphic_on specified as a string - link + # it to mapped ColumnProperty + try: + self.polymorphic_on = self._props[self.polymorphic_on] + except KeyError: + raise sa_exc.ArgumentError( + "Can't determine polymorphic_on " + "value '%s' - no attribute is " + "mapped to this name." % self.polymorphic_on) + + if self.polymorphic_on in self._columntoproperty: + # polymorphic_on is a column that is already mapped + # to a ColumnProperty + prop = self._columntoproperty[self.polymorphic_on] + elif isinstance(self.polymorphic_on, MapperProperty): + # polymorphic_on is directly a MapperProperty, + # ensure it's a ColumnProperty + if not isinstance(self.polymorphic_on, + properties.ColumnProperty): + raise sa_exc.ArgumentError( + "Only direct column-mapped " + "property or SQL expression " + "can be passed for polymorphic_on") + prop = self.polymorphic_on + elif not expression._is_column(self.polymorphic_on): + # polymorphic_on is not a Column and not a ColumnProperty; + # not supported right now. + raise sa_exc.ArgumentError( + "Only direct column-mapped " + "property or SQL expression " + "can be passed for polymorphic_on" + ) + else: + # polymorphic_on is a Column or SQL expression and + # doesn't appear to be mapped. this means it can be 1. + # only present in the with_polymorphic selectable or + # 2. a totally standalone SQL expression which we'd + # hope is compatible with this mapper's mapped_table + col = self.mapped_table.corresponding_column( + self.polymorphic_on) + if col is None: + # polymorphic_on doesn't derive from any + # column/expression isn't present in the mapped + # table. we will make a "hidden" ColumnProperty + # for it. Just check that if it's directly a + # schema.Column and we have with_polymorphic, it's + # likely a user error if the schema.Column isn't + # represented somehow in either mapped_table or + # with_polymorphic. Otherwise as of 0.7.4 we + # just go with it and assume the user wants it + # that way (i.e. a CASE statement) + setter = False + instrument = False + col = self.polymorphic_on + if isinstance(col, schema.Column) and ( + self.with_polymorphic is None or + self.with_polymorphic[1]. + corresponding_column(col) is None): + raise sa_exc.InvalidRequestError( + "Could not map polymorphic_on column " + "'%s' to the mapped table - polymorphic " + "loads will not function properly" + % col.description) + else: + # column/expression that polymorphic_on derives from + # is present in our mapped table + # and is probably mapped, but polymorphic_on itself + # is not. This happens when + # the polymorphic_on is only directly present in the + # with_polymorphic selectable, as when use + # polymorphic_union. + # we'll make a separate ColumnProperty for it. + instrument = True + key = getattr(col, 'key', None) + if key: + if self._should_exclude(col.key, col.key, False, col): + raise sa_exc.InvalidRequestError( + "Cannot exclude or override the " + "discriminator column %r" % + col.key) + else: + self.polymorphic_on = col = \ + col.label("_sa_polymorphic_on") + key = col.key + + prop = properties.ColumnProperty(col, _instrument=instrument) + self._configure_property(key, prop, init=init, setparent=True) + + # the actual polymorphic_on should be the first public-facing + # column in the property + self.polymorphic_on = prop.columns[0] + polymorphic_key = prop.key + + else: + # no polymorphic_on was set. + # check inheriting mappers for one. + for mapper in self.iterate_to_root(): + # determine if polymorphic_on of the parent + # should be propagated here. If the col + # is present in our mapped table, or if our mapped + # table is the same as the parent (i.e. single table + # inheritance), we can use it + if mapper.polymorphic_on is not None: + if self.mapped_table is mapper.mapped_table: + self.polymorphic_on = mapper.polymorphic_on + else: + self.polymorphic_on = \ + self.mapped_table.corresponding_column( + mapper.polymorphic_on) + # we can use the parent mapper's _set_polymorphic_identity + # directly; it ensures the polymorphic_identity of the + # instance's mapper is used so is portable to subclasses. + if self.polymorphic_on is not None: + self._set_polymorphic_identity = \ + mapper._set_polymorphic_identity + self._validate_polymorphic_identity = \ + mapper._validate_polymorphic_identity + else: + self._set_polymorphic_identity = None + return + + if setter: + def _set_polymorphic_identity(state): + dict_ = state.dict + state.get_impl(polymorphic_key).set( + state, dict_, + state.manager.mapper.polymorphic_identity, + None) + + def _validate_polymorphic_identity(mapper, state, dict_): + if polymorphic_key in dict_ and \ + dict_[polymorphic_key] not in \ + mapper._acceptable_polymorphic_identities: + util.warn_limited( + "Flushing object %s with " + "incompatible polymorphic identity %r; the " + "object may not refresh and/or load correctly", + (state_str(state), dict_[polymorphic_key]) + ) + + self._set_polymorphic_identity = _set_polymorphic_identity + self._validate_polymorphic_identity = \ + _validate_polymorphic_identity + else: + self._set_polymorphic_identity = None + + _validate_polymorphic_identity = None + + @_memoized_configured_property + def _version_id_prop(self): + if self.version_id_col is not None: + return self._columntoproperty[self.version_id_col] + else: + return None + + @_memoized_configured_property + def _acceptable_polymorphic_identities(self): + identities = set() + + stack = deque([self]) + while stack: + item = stack.popleft() + if item.mapped_table is self.mapped_table: + identities.add(item.polymorphic_identity) + stack.extend(item._inheriting_mappers) + + return identities + + @_memoized_configured_property + def _prop_set(self): + return frozenset(self._props.values()) + + def _adapt_inherited_property(self, key, prop, init): + if not self.concrete: + self._configure_property(key, prop, init=False, setparent=False) + elif key not in self._props: + self._configure_property( + key, + properties.ConcreteInheritedProperty(), + init=init, setparent=True) + + def _configure_property(self, key, prop, init=True, setparent=True): + self._log("_configure_property(%s, %s)", key, prop.__class__.__name__) + + if not isinstance(prop, MapperProperty): + prop = self._property_from_column(key, prop) + + if isinstance(prop, properties.ColumnProperty): + col = self.mapped_table.corresponding_column(prop.columns[0]) + + # if the column is not present in the mapped table, + # test if a column has been added after the fact to the + # parent table (or their parent, etc.) [ticket:1570] + if col is None and self.inherits: + path = [self] + for m in self.inherits.iterate_to_root(): + col = m.local_table.corresponding_column(prop.columns[0]) + if col is not None: + for m2 in path: + m2.mapped_table._reset_exported() + col = self.mapped_table.corresponding_column( + prop.columns[0]) + break + path.append(m) + + # subquery expression, column not present in the mapped + # selectable. + if col is None: + col = prop.columns[0] + + # column is coming in after _readonly_props was + # initialized; check for 'readonly' + if hasattr(self, '_readonly_props') and \ + (not hasattr(col, 'table') or + col.table not in self._cols_by_table): + self._readonly_props.add(prop) + + else: + # if column is coming in after _cols_by_table was + # initialized, ensure the col is in the right set + if hasattr(self, '_cols_by_table') and \ + col.table in self._cols_by_table and \ + col not in self._cols_by_table[col.table]: + self._cols_by_table[col.table].add(col) + + # if this properties.ColumnProperty represents the "polymorphic + # discriminator" column, mark it. We'll need this when rendering + # columns in SELECT statements. + if not hasattr(prop, '_is_polymorphic_discriminator'): + prop._is_polymorphic_discriminator = \ + (col is self.polymorphic_on or + prop.columns[0] is self.polymorphic_on) + + self.columns[key] = col + for col in prop.columns + prop._orig_columns: + for col in col.proxy_set: + self._columntoproperty[col] = prop + + prop.key = key + + if setparent: + prop.set_parent(self, init) + + if key in self._props and \ + getattr(self._props[key], '_mapped_by_synonym', False): + syn = self._props[key]._mapped_by_synonym + raise sa_exc.ArgumentError( + "Can't call map_column=True for synonym %r=%r, " + "a ColumnProperty already exists keyed to the name " + "%r for column %r" % (syn, key, key, syn) + ) + + if key in self._props and \ + not isinstance(prop, properties.ColumnProperty) and \ + not isinstance( + self._props[key], + ( + properties.ColumnProperty, + properties.ConcreteInheritedProperty) + ): + util.warn("Property %s on %s being replaced with new " + "property %s; the old property will be discarded" % ( + self._props[key], + self, + prop, + )) + oldprop = self._props[key] + self._path_registry.pop(oldprop, None) + + self._props[key] = prop + + if not self.non_primary: + prop.instrument_class(self) + + for mapper in self._inheriting_mappers: + mapper._adapt_inherited_property(key, prop, init) + + if init: + prop.init() + prop.post_instrument_class(self) + + if self.configured: + self._expire_memoizations() + + def _property_from_column(self, key, prop): + """generate/update a :class:`.ColumnProprerty` given a + :class:`.Column` object. """ + + # we were passed a Column or a list of Columns; + # generate a properties.ColumnProperty + columns = util.to_list(prop) + column = columns[0] + if not expression._is_column(column): + raise sa_exc.ArgumentError( + "%s=%r is not an instance of MapperProperty or Column" + % (key, prop)) + + prop = self._props.get(key, None) + + if isinstance(prop, properties.ColumnProperty): + if ( + not self._inherits_equated_pairs or + (prop.columns[0], column) not in self._inherits_equated_pairs + ) and \ + not prop.columns[0].shares_lineage(column) and \ + prop.columns[0] is not self.version_id_col and \ + column is not self.version_id_col: + warn_only = prop.parent is not self + msg = ("Implicitly combining column %s with column " + "%s under attribute '%s'. Please configure one " + "or more attributes for these same-named columns " + "explicitly." % (prop.columns[-1], column, key)) + if warn_only: + util.warn(msg) + else: + raise sa_exc.InvalidRequestError(msg) + + # existing properties.ColumnProperty from an inheriting + # mapper. make a copy and append our column to it + prop = prop.copy() + prop.columns.insert(0, column) + self._log("inserting column to existing list " + "in properties.ColumnProperty %s" % (key)) + return prop + elif prop is None or isinstance(prop, + properties.ConcreteInheritedProperty): + mapped_column = [] + for c in columns: + mc = self.mapped_table.corresponding_column(c) + if mc is None: + mc = self.local_table.corresponding_column(c) + if mc is not None: + # if the column is in the local table but not the + # mapped table, this corresponds to adding a + # column after the fact to the local table. + # [ticket:1523] + self.mapped_table._reset_exported() + mc = self.mapped_table.corresponding_column(c) + if mc is None: + raise sa_exc.ArgumentError( + "When configuring property '%s' on %s, " + "column '%s' is not represented in the mapper's " + "table. Use the `column_property()` function to " + "force this column to be mapped as a read-only " + "attribute." % (key, self, c)) + mapped_column.append(mc) + return properties.ColumnProperty(*mapped_column) + else: + raise sa_exc.ArgumentError( + "WARNING: when configuring property '%s' on %s, " + "column '%s' conflicts with property '%r'. " + "To resolve this, map the column to the class under a " + "different name in the 'properties' dictionary. Or, " + "to remove all awareness of the column entirely " + "(including its availability as a foreign key), " + "use the 'include_properties' or 'exclude_properties' " + "mapper arguments to control specifically which table " + "columns get mapped." % + (key, self, column.key, prop)) + + def _post_configure_properties(self): + """Call the ``init()`` method on all ``MapperProperties`` + attached to this mapper. + + This is a deferred configuration step which is intended + to execute once all mappers have been constructed. + + """ + + self._log("_post_configure_properties() started") + l = [(key, prop) for key, prop in self._props.items()] + for key, prop in l: + self._log("initialize prop %s", key) + + if prop.parent is self and not prop._configure_started: + prop.init() + + if prop._configure_finished: + prop.post_instrument_class(self) + + self._log("_post_configure_properties() complete") + self.configured = True + + def add_properties(self, dict_of_properties): + """Add the given dictionary of properties to this mapper, + using `add_property`. + + """ + for key, value in dict_of_properties.items(): + self.add_property(key, value) + + def add_property(self, key, prop): + """Add an individual MapperProperty to this mapper. + + If the mapper has not been configured yet, just adds the + property to the initial properties dictionary sent to the + constructor. If this Mapper has already been configured, then + the given MapperProperty is configured immediately. + + """ + self._init_properties[key] = prop + self._configure_property(key, prop, init=self.configured) + + def _expire_memoizations(self): + for mapper in self.iterate_to_root(): + _memoized_configured_property.expire_instance(mapper) + + @property + def _log_desc(self): + return "(" + self.class_.__name__ + \ + "|" + \ + (self.local_table is not None and + self.local_table.description or + str(self.local_table)) +\ + (self.non_primary and + "|non-primary" or "") + ")" + + def _log(self, msg, *args): + self.logger.info( + "%s " + msg, *((self._log_desc,) + args) + ) + + def _log_debug(self, msg, *args): + self.logger.debug( + "%s " + msg, *((self._log_desc,) + args) + ) + + def __repr__(self): + return '' % ( + id(self), self.class_.__name__) + + def __str__(self): + return "Mapper|%s|%s%s" % ( + self.class_.__name__, + self.local_table is not None and + self.local_table.description or None, + self.non_primary and "|non-primary" or "" + ) + + def _is_orphan(self, state): + orphan_possible = False + for mapper in self.iterate_to_root(): + for (key, cls) in mapper._delete_orphans: + orphan_possible = True + + has_parent = attributes.manager_of_class(cls).has_parent( + state, key, optimistic=state.has_identity) + + if self.legacy_is_orphan and has_parent: + return False + elif not self.legacy_is_orphan and not has_parent: + return True + + if self.legacy_is_orphan: + return orphan_possible + else: + return False + + def has_property(self, key): + return key in self._props + + def get_property(self, key, _configure_mappers=True): + """return a MapperProperty associated with the given key. + """ + + if _configure_mappers and Mapper._new_mappers: + configure_mappers() + + try: + return self._props[key] + except KeyError: + raise sa_exc.InvalidRequestError( + "Mapper '%s' has no property '%s'" % (self, key)) + + def get_property_by_column(self, column): + """Given a :class:`.Column` object, return the + :class:`.MapperProperty` which maps this column.""" + + return self._columntoproperty[column] + + @property + def iterate_properties(self): + """return an iterator of all MapperProperty objects.""" + if Mapper._new_mappers: + configure_mappers() + return iter(self._props.values()) + + def _mappers_from_spec(self, spec, selectable): + """given a with_polymorphic() argument, return the set of mappers it + represents. + + Trims the list of mappers to just those represented within the given + selectable, if present. This helps some more legacy-ish mappings. + + """ + if spec == '*': + mappers = list(self.self_and_descendants) + elif spec: + mappers = set() + for m in util.to_list(spec): + m = _class_to_mapper(m) + if not m.isa(self): + raise sa_exc.InvalidRequestError( + "%r does not inherit from %r" % + (m, self)) + + if selectable is None: + mappers.update(m.iterate_to_root()) + else: + mappers.add(m) + mappers = [m for m in self.self_and_descendants if m in mappers] + else: + mappers = [] + + if selectable is not None: + tables = set(sql_util.find_tables(selectable, + include_aliases=True)) + mappers = [m for m in mappers if m.local_table in tables] + return mappers + + def _selectable_from_mappers(self, mappers, innerjoin): + """given a list of mappers (assumed to be within this mapper's + inheritance hierarchy), construct an outerjoin amongst those mapper's + mapped tables. + + """ + from_obj = self.mapped_table + for m in mappers: + if m is self: + continue + if m.concrete: + raise sa_exc.InvalidRequestError( + "'with_polymorphic()' requires 'selectable' argument " + "when concrete-inheriting mappers are used.") + elif not m.single: + if innerjoin: + from_obj = from_obj.join(m.local_table, + m.inherit_condition) + else: + from_obj = from_obj.outerjoin(m.local_table, + m.inherit_condition) + + return from_obj + + @_memoized_configured_property + def _single_table_criterion(self): + if self.single and \ + self.inherits and \ + self.polymorphic_on is not None: + return self.polymorphic_on.in_( + m.polymorphic_identity + for m in self.self_and_descendants) + else: + return None + + @_memoized_configured_property + def _with_polymorphic_mappers(self): + if Mapper._new_mappers: + configure_mappers() + if not self.with_polymorphic: + return [] + return self._mappers_from_spec(*self.with_polymorphic) + + @_memoized_configured_property + def _with_polymorphic_selectable(self): + if not self.with_polymorphic: + return self.mapped_table + + spec, selectable = self.with_polymorphic + if selectable is not None: + return selectable + else: + return self._selectable_from_mappers( + self._mappers_from_spec(spec, selectable), + False) + + with_polymorphic_mappers = _with_polymorphic_mappers + """The list of :class:`.Mapper` objects included in the + default "polymorphic" query. + + """ + + @_memoized_configured_property + def _insert_cols_evaluating_none(self): + return dict( + ( + table, + frozenset( + col.key for col in columns + if col.type.should_evaluate_none + ) + ) + for table, columns in self._cols_by_table.items() + ) + + @_memoized_configured_property + def _insert_cols_as_none(self): + return dict( + ( + table, + frozenset( + col.key for col in columns + if not col.primary_key and + not col.server_default and not col.default + and not col.type.should_evaluate_none) + ) + for table, columns in self._cols_by_table.items() + ) + + @_memoized_configured_property + def _propkey_to_col(self): + return dict( + ( + table, + dict( + (self._columntoproperty[col].key, col) + for col in columns + ) + ) + for table, columns in self._cols_by_table.items() + ) + + @_memoized_configured_property + def _pk_keys_by_table(self): + return dict( + ( + table, + frozenset([col.key for col in pks]) + ) + for table, pks in self._pks_by_table.items() + ) + + @_memoized_configured_property + def _pk_attr_keys_by_table(self): + return dict( + ( + table, + frozenset([self._columntoproperty[col].key for col in pks]) + ) + for table, pks in self._pks_by_table.items() + ) + + @_memoized_configured_property + def _server_default_cols(self): + return dict( + ( + table, + frozenset([ + col.key for col in columns + if col.server_default is not None]) + ) + for table, columns in self._cols_by_table.items() + ) + + @_memoized_configured_property + def _server_default_plus_onupdate_propkeys(self): + result = set() + + for table, columns in self._cols_by_table.items(): + for col in columns: + if ( + ( + col.server_default is not None or + col.server_onupdate is not None + ) and col in self._columntoproperty + ): + result.add(self._columntoproperty[col].key) + + return result + + @_memoized_configured_property + def _server_onupdate_default_cols(self): + return dict( + ( + table, + frozenset([ + col.key for col in columns + if col.server_onupdate is not None]) + ) + for table, columns in self._cols_by_table.items() + ) + + @property + def selectable(self): + """The :func:`.select` construct this :class:`.Mapper` selects from + by default. + + Normally, this is equivalent to :attr:`.mapped_table`, unless + the ``with_polymorphic`` feature is in use, in which case the + full "polymorphic" selectable is returned. + + """ + return self._with_polymorphic_selectable + + def _with_polymorphic_args(self, spec=None, selectable=False, + innerjoin=False): + if self.with_polymorphic: + if not spec: + spec = self.with_polymorphic[0] + if selectable is False: + selectable = self.with_polymorphic[1] + elif selectable is False: + selectable = None + mappers = self._mappers_from_spec(spec, selectable) + if selectable is not None: + return mappers, selectable + else: + return mappers, self._selectable_from_mappers(mappers, + innerjoin) + + @_memoized_configured_property + def _polymorphic_properties(self): + return list(self._iterate_polymorphic_properties( + self._with_polymorphic_mappers)) + + def _iterate_polymorphic_properties(self, mappers=None): + """Return an iterator of MapperProperty objects which will render into + a SELECT.""" + if mappers is None: + mappers = self._with_polymorphic_mappers + + if not mappers: + for c in self.iterate_properties: + yield c + else: + # in the polymorphic case, filter out discriminator columns + # from other mappers, as these are sometimes dependent on that + # mapper's polymorphic selectable (which we don't want rendered) + for c in util.unique_list( + chain(*[ + list(mapper.iterate_properties) for mapper in + [self] + mappers + ]) + ): + if getattr(c, '_is_polymorphic_discriminator', False) and \ + (self.polymorphic_on is None or + c.columns[0] is not self.polymorphic_on): + continue + yield c + + @_memoized_configured_property + def attrs(self): + """A namespace of all :class:`.MapperProperty` objects + associated this mapper. + + This is an object that provides each property based on + its key name. For instance, the mapper for a + ``User`` class which has ``User.name`` attribute would + provide ``mapper.attrs.name``, which would be the + :class:`.ColumnProperty` representing the ``name`` + column. The namespace object can also be iterated, + which would yield each :class:`.MapperProperty`. + + :class:`.Mapper` has several pre-filtered views + of this attribute which limit the types of properties + returned, inclding :attr:`.synonyms`, :attr:`.column_attrs`, + :attr:`.relationships`, and :attr:`.composites`. + + .. warning:: + + The :attr:`.Mapper.attrs` accessor namespace is an + instance of :class:`.OrderedProperties`. This is + a dictionary-like object which includes a small number of + named methods such as :meth:`.OrderedProperties.items` + and :meth:`.OrderedProperties.values`. When + accessing attributes dynamically, favor using the dict-access + scheme, e.g. ``mapper.attrs[somename]`` over + ``getattr(mapper.attrs, somename)`` to avoid name collisions. + + .. seealso:: + + :attr:`.Mapper.all_orm_descriptors` + + """ + if Mapper._new_mappers: + configure_mappers() + return util.ImmutableProperties(self._props) + + @_memoized_configured_property + def all_orm_descriptors(self): + """A namespace of all :class:`.InspectionAttr` attributes associated + with the mapped class. + + These attributes are in all cases Python :term:`descriptors` + associated with the mapped class or its superclasses. + + This namespace includes attributes that are mapped to the class + as well as attributes declared by extension modules. + It includes any Python descriptor type that inherits from + :class:`.InspectionAttr`. This includes + :class:`.QueryableAttribute`, as well as extension types such as + :class:`.hybrid_property`, :class:`.hybrid_method` and + :class:`.AssociationProxy`. + + To distinguish between mapped attributes and extension attributes, + the attribute :attr:`.InspectionAttr.extension_type` will refer + to a constant that distinguishes between different extension types. + + When dealing with a :class:`.QueryableAttribute`, the + :attr:`.QueryableAttribute.property` attribute refers to the + :class:`.MapperProperty` property, which is what you get when + referring to the collection of mapped properties via + :attr:`.Mapper.attrs`. + + .. warning:: + + The :attr:`.Mapper.all_orm_descriptors` accessor namespace is an + instance of :class:`.OrderedProperties`. This is + a dictionary-like object which includes a small number of + named methods such as :meth:`.OrderedProperties.items` + and :meth:`.OrderedProperties.values`. When + accessing attributes dynamically, favor using the dict-access + scheme, e.g. ``mapper.all_orm_descriptors[somename]`` over + ``getattr(mapper.all_orm_descriptors, somename)`` to avoid name + collisions. + + .. versionadded:: 0.8.0 + + .. seealso:: + + :attr:`.Mapper.attrs` + + """ + return util.ImmutableProperties( + dict(self.class_manager._all_sqla_attributes())) + + @_memoized_configured_property + def synonyms(self): + """Return a namespace of all :class:`.SynonymProperty` + properties maintained by this :class:`.Mapper`. + + .. seealso:: + + :attr:`.Mapper.attrs` - namespace of all :class:`.MapperProperty` + objects. + + """ + return self._filter_properties(properties.SynonymProperty) + + @_memoized_configured_property + def column_attrs(self): + """Return a namespace of all :class:`.ColumnProperty` + properties maintained by this :class:`.Mapper`. + + .. seealso:: + + :attr:`.Mapper.attrs` - namespace of all :class:`.MapperProperty` + objects. + + """ + return self._filter_properties(properties.ColumnProperty) + + @_memoized_configured_property + def relationships(self): + """A namespace of all :class:`.RelationshipProperty` properties + maintained by this :class:`.Mapper`. + + .. warning:: + + the :attr:`.Mapper.relationships` accessor namespace is an + instance of :class:`.OrderedProperties`. This is + a dictionary-like object which includes a small number of + named methods such as :meth:`.OrderedProperties.items` + and :meth:`.OrderedProperties.values`. When + accessing attributes dynamically, favor using the dict-access + scheme, e.g. ``mapper.relationships[somename]`` over + ``getattr(mapper.relationships, somename)`` to avoid name + collisions. + + .. seealso:: + + :attr:`.Mapper.attrs` - namespace of all :class:`.MapperProperty` + objects. + + """ + return self._filter_properties(properties.RelationshipProperty) + + @_memoized_configured_property + def composites(self): + """Return a namespace of all :class:`.CompositeProperty` + properties maintained by this :class:`.Mapper`. + + .. seealso:: + + :attr:`.Mapper.attrs` - namespace of all :class:`.MapperProperty` + objects. + + """ + return self._filter_properties(properties.CompositeProperty) + + def _filter_properties(self, type_): + if Mapper._new_mappers: + configure_mappers() + return util.ImmutableProperties(util.OrderedDict( + (k, v) for k, v in self._props.items() + if isinstance(v, type_) + )) + + @_memoized_configured_property + def _get_clause(self): + """create a "get clause" based on the primary key. this is used + by query.get() and many-to-one lazyloads to load this item + by primary key. + + """ + params = [(primary_key, sql.bindparam(None, type_=primary_key.type)) + for primary_key in self.primary_key] + return sql.and_(*[k == v for (k, v) in params]), \ + util.column_dict(params) + + @_memoized_configured_property + def _equivalent_columns(self): + """Create a map of all *equivalent* columns, based on + the determination of column pairs that are equated to + one another based on inherit condition. This is designed + to work with the queries that util.polymorphic_union + comes up with, which often don't include the columns from + the base table directly (including the subclass table columns + only). + + The resulting structure is a dictionary of columns mapped + to lists of equivalent columns, i.e. + + { + tablea.col1: + set([tableb.col1, tablec.col1]), + tablea.col2: + set([tabled.col2]) + } + + """ + result = util.column_dict() + + def visit_binary(binary): + if binary.operator == operators.eq: + if binary.left in result: + result[binary.left].add(binary.right) + else: + result[binary.left] = util.column_set((binary.right,)) + if binary.right in result: + result[binary.right].add(binary.left) + else: + result[binary.right] = util.column_set((binary.left,)) + for mapper in self.base_mapper.self_and_descendants: + if mapper.inherit_condition is not None: + visitors.traverse( + mapper.inherit_condition, {}, + {'binary': visit_binary}) + + return result + + def _is_userland_descriptor(self, obj): + if isinstance(obj, (_MappedAttribute, + instrumentation.ClassManager, + expression.ColumnElement)): + return False + else: + return True + + def _should_exclude(self, name, assigned_name, local, column): + """determine whether a particular property should be implicitly + present on the class. + + This occurs when properties are propagated from an inherited class, or + are applied from the columns present in the mapped table. + + """ + + # check for class-bound attributes and/or descriptors, + # either local or from an inherited class + if local: + if self.class_.__dict__.get(assigned_name, None) is not None \ + and self._is_userland_descriptor( + self.class_.__dict__[assigned_name]): + return True + else: + if getattr(self.class_, assigned_name, None) is not None \ + and self._is_userland_descriptor( + getattr(self.class_, assigned_name)): + return True + + if self.include_properties is not None and \ + name not in self.include_properties and \ + (column is None or column not in self.include_properties): + self._log("not including property %s" % (name)) + return True + + if self.exclude_properties is not None and \ + ( + name in self.exclude_properties or + (column is not None and column in self.exclude_properties) + ): + self._log("excluding property %s" % (name)) + return True + + return False + + def common_parent(self, other): + """Return true if the given mapper shares a + common inherited parent as this mapper.""" + + return self.base_mapper is other.base_mapper + + def _canload(self, state, allow_subtypes): + s = self.primary_mapper() + if self.polymorphic_on is not None or allow_subtypes: + return _state_mapper(state).isa(s) + else: + return _state_mapper(state) is s + + def isa(self, other): + """Return True if the this mapper inherits from the given mapper.""" + + m = self + while m and m is not other: + m = m.inherits + return bool(m) + + def iterate_to_root(self): + m = self + while m: + yield m + m = m.inherits + + @_memoized_configured_property + def self_and_descendants(self): + """The collection including this mapper and all descendant mappers. + + This includes not just the immediately inheriting mappers but + all their inheriting mappers as well. + + """ + descendants = [] + stack = deque([self]) + while stack: + item = stack.popleft() + descendants.append(item) + stack.extend(item._inheriting_mappers) + return util.WeakSequence(descendants) + + def polymorphic_iterator(self): + """Iterate through the collection including this mapper and + all descendant mappers. + + This includes not just the immediately inheriting mappers but + all their inheriting mappers as well. + + To iterate through an entire hierarchy, use + ``mapper.base_mapper.polymorphic_iterator()``. + + """ + return iter(self.self_and_descendants) + + def primary_mapper(self): + """Return the primary mapper corresponding to this mapper's class key + (class).""" + + return self.class_manager.mapper + + @property + def primary_base_mapper(self): + return self.class_manager.mapper.base_mapper + + def _result_has_identity_key(self, result, adapter=None): + pk_cols = self.primary_key + if adapter: + pk_cols = [adapter.columns[c] for c in pk_cols] + for col in pk_cols: + if not result._has_key(col): + return False + else: + return True + + def identity_key_from_row(self, row, adapter=None): + """Return an identity-map key for use in storing/retrieving an + item from the identity map. + + :param row: A :class:`.RowProxy` instance. The columns which are + mapped by this :class:`.Mapper` should be locatable in the row, + preferably via the :class:`.Column` object directly (as is the case + when a :func:`.select` construct is executed), or via string names of + the form ``_``. + + """ + pk_cols = self.primary_key + if adapter: + pk_cols = [adapter.columns[c] for c in pk_cols] + + return self._identity_class, \ + tuple(row[column] for column in pk_cols) + + def identity_key_from_primary_key(self, primary_key): + """Return an identity-map key for use in storing/retrieving an + item from an identity map. + + :param primary_key: A list of values indicating the identifier. + + """ + return self._identity_class, tuple(primary_key) + + def identity_key_from_instance(self, instance): + """Return the identity key for the given instance, based on + its primary key attributes. + + If the instance's state is expired, calling this method + will result in a database check to see if the object has been deleted. + If the row no longer exists, + :class:`~sqlalchemy.orm.exc.ObjectDeletedError` is raised. + + This value is typically also found on the instance state under the + attribute name `key`. + + """ + return self.identity_key_from_primary_key( + self.primary_key_from_instance(instance)) + + def _identity_key_from_state(self, state): + dict_ = state.dict + manager = state.manager + return self._identity_class, tuple([ + manager[self._columntoproperty[col].key]. + impl.get(state, dict_, attributes.PASSIVE_RETURN_NEVER_SET) + for col in self.primary_key + ]) + + def primary_key_from_instance(self, instance): + """Return the list of primary key values for the given + instance. + + If the instance's state is expired, calling this method + will result in a database check to see if the object has been deleted. + If the row no longer exists, + :class:`~sqlalchemy.orm.exc.ObjectDeletedError` is raised. + + """ + state = attributes.instance_state(instance) + return self._primary_key_from_state(state, attributes.PASSIVE_OFF) + + def _primary_key_from_state( + self, state, passive=attributes.PASSIVE_RETURN_NEVER_SET): + dict_ = state.dict + manager = state.manager + return [ + manager[prop.key]. + impl.get(state, dict_, passive) + for prop in self._identity_key_props + ] + + @_memoized_configured_property + def _identity_key_props(self): + return [self._columntoproperty[col] for col in self.primary_key] + + @_memoized_configured_property + def _all_pk_props(self): + collection = set() + for table in self.tables: + collection.update(self._pks_by_table[table]) + return collection + + @_memoized_configured_property + def _should_undefer_in_wildcard(self): + cols = set(self.primary_key) + if self.polymorphic_on is not None: + cols.add(self.polymorphic_on) + return cols + + @_memoized_configured_property + def _primary_key_propkeys(self): + return set([prop.key for prop in self._all_pk_props]) + + def _get_state_attr_by_column( + self, state, dict_, column, + passive=attributes.PASSIVE_RETURN_NEVER_SET): + prop = self._columntoproperty[column] + return state.manager[prop.key].impl.get(state, dict_, passive=passive) + + def _set_committed_state_attr_by_column(self, state, dict_, column, value): + prop = self._columntoproperty[column] + state.manager[prop.key].impl.set_committed_value(state, dict_, value) + + def _set_state_attr_by_column(self, state, dict_, column, value): + prop = self._columntoproperty[column] + state.manager[prop.key].impl.set(state, dict_, value, None) + + def _get_committed_attr_by_column(self, obj, column): + state = attributes.instance_state(obj) + dict_ = attributes.instance_dict(obj) + return self._get_committed_state_attr_by_column( + state, dict_, column, passive=attributes.PASSIVE_OFF) + + def _get_committed_state_attr_by_column( + self, state, dict_, column, + passive=attributes.PASSIVE_RETURN_NEVER_SET): + + prop = self._columntoproperty[column] + return state.manager[prop.key].impl.\ + get_committed_value(state, dict_, passive=passive) + + def _optimized_get_statement(self, state, attribute_names): + """assemble a WHERE clause which retrieves a given state by primary + key, using a minimized set of tables. + + Applies to a joined-table inheritance mapper where the + requested attribute names are only present on joined tables, + not the base table. The WHERE clause attempts to include + only those tables to minimize joins. + + """ + props = self._props + + tables = set(chain( + *[sql_util.find_tables(c, check_columns=True) + for key in attribute_names + for c in props[key].columns] + )) + + if self.base_mapper.local_table in tables: + return None + + class ColumnsNotAvailable(Exception): + pass + + def visit_binary(binary): + leftcol = binary.left + rightcol = binary.right + if leftcol is None or rightcol is None: + return + + if leftcol.table not in tables: + leftval = self._get_committed_state_attr_by_column( + state, state.dict, + leftcol, + passive=attributes.PASSIVE_NO_INITIALIZE) + if leftval in orm_util._none_set: + raise ColumnsNotAvailable() + binary.left = sql.bindparam(None, leftval, + type_=binary.right.type) + elif rightcol.table not in tables: + rightval = self._get_committed_state_attr_by_column( + state, state.dict, + rightcol, + passive=attributes.PASSIVE_NO_INITIALIZE) + if rightval in orm_util._none_set: + raise ColumnsNotAvailable() + binary.right = sql.bindparam(None, rightval, + type_=binary.right.type) + + allconds = [] + + try: + start = False + for mapper in reversed(list(self.iterate_to_root())): + if mapper.local_table in tables: + start = True + elif not isinstance(mapper.local_table, + expression.TableClause): + return None + if start and not mapper.single: + allconds.append(visitors.cloned_traverse( + mapper.inherit_condition, + {}, + {'binary': visit_binary} + ) + ) + except ColumnsNotAvailable: + return None + + cond = sql.and_(*allconds) + + cols = [] + for key in attribute_names: + cols.extend(props[key].columns) + return sql.select(cols, cond, use_labels=True) + + def cascade_iterator(self, type_, state, halt_on=None): + """Iterate each element and its mapper in an object graph, + for all relationships that meet the given cascade rule. + + :param type_: + The name of the cascade rule (i.e. ``"save-update"``, ``"delete"``, + etc.). + + .. note:: the ``"all"`` cascade is not accepted here. For a generic + object traversal function, see :ref:`faq_walk_objects`. + + :param state: + The lead InstanceState. child items will be processed per + the relationships defined for this object's mapper. + + :return: the method yields individual object instances. + + .. seealso:: + + :ref:`unitofwork_cascades` + + :ref:`faq_walk_objects` - illustrates a generic function to + traverse all objects without relying on cascades. + + """ + visited_states = set() + prp, mpp = object(), object() + + visitables = deque([(deque(self._props.values()), prp, + state, state.dict)]) + + while visitables: + iterator, item_type, parent_state, parent_dict = visitables[-1] + if not iterator: + visitables.pop() + continue + + if item_type is prp: + prop = iterator.popleft() + if type_ not in prop.cascade: + continue + queue = deque(prop.cascade_iterator( + type_, parent_state, parent_dict, + visited_states, halt_on)) + if queue: + visitables.append((queue, mpp, None, None)) + elif item_type is mpp: + instance, instance_mapper, corresponding_state, \ + corresponding_dict = iterator.popleft() + yield instance, instance_mapper, \ + corresponding_state, corresponding_dict + visitables.append((deque(instance_mapper._props.values()), + prp, corresponding_state, + corresponding_dict)) + + @_memoized_configured_property + def _compiled_cache(self): + return util.LRUCache(self._compiled_cache_size) + + @_memoized_configured_property + def _sorted_tables(self): + table_to_mapper = {} + + for mapper in self.base_mapper.self_and_descendants: + for t in mapper.tables: + table_to_mapper.setdefault(t, mapper) + + extra_dependencies = [] + for table, mapper in table_to_mapper.items(): + super_ = mapper.inherits + if super_: + extra_dependencies.extend([ + (super_table, table) + for super_table in super_.tables + ]) + + def skip(fk): + # attempt to skip dependencies that are not + # significant to the inheritance chain + # for two tables that are related by inheritance. + # while that dependency may be important, it's technically + # not what we mean to sort on here. + parent = table_to_mapper.get(fk.parent.table) + dep = table_to_mapper.get(fk.column.table) + if parent is not None and \ + dep is not None and \ + dep is not parent and \ + dep.inherit_condition is not None: + cols = set(sql_util._find_columns(dep.inherit_condition)) + if parent.inherit_condition is not None: + cols = cols.union(sql_util._find_columns( + parent.inherit_condition)) + return fk.parent not in cols and fk.column not in cols + else: + return fk.parent not in cols + return False + + sorted_ = sql_util.sort_tables(table_to_mapper, + skip_fn=skip, + extra_dependencies=extra_dependencies) + + ret = util.OrderedDict() + for t in sorted_: + ret[t] = table_to_mapper[t] + return ret + + def _memo(self, key, callable_): + if key in self._memoized_values: + return self._memoized_values[key] + else: + self._memoized_values[key] = value = callable_() + return value + + @util.memoized_property + def _table_to_equated(self): + """memoized map of tables to collections of columns to be + synchronized upwards to the base mapper.""" + + result = util.defaultdict(list) + + for table in self._sorted_tables: + cols = set(table.c) + for m in self.iterate_to_root(): + if m._inherits_equated_pairs and \ + cols.intersection( + util.reduce(set.union, + [l.proxy_set for l, r in + m._inherits_equated_pairs]) + ): + result[table].append((m, m._inherits_equated_pairs)) + + return result + + +def configure_mappers(): + """Initialize the inter-mapper relationships of all mappers that + have been constructed thus far. + + This function can be called any number of times, but in + most cases is invoked automatically, the first time mappings are used, + as well as whenever mappings are used and additional not-yet-configured + mappers have been constructed. + + Points at which this occur include when a mapped class is instantiated + into an instance, as well as when the :meth:`.Session.query` method + is used. + + The :func:`.configure_mappers` function provides several event hooks + that can be used to augment its functionality. These methods include: + + * :meth:`.MapperEvents.before_configured` - called once before + :func:`.configure_mappers` does any work; this can be used to establish + additional options, properties, or related mappings before the operation + proceeds. + + * :meth:`.MapperEvents.mapper_configured` - called as each indivudal + :class:`.Mapper` is configured within the process; will include all + mapper state except for backrefs set up by other mappers that are still + to be configured. + + * :meth:`.MapperEvents.after_configured` - called once after + :func:`.configure_mappers` is complete; at this stage, all + :class:`.Mapper` objects that are known to SQLAlchemy will be fully + configured. Note that the calling application may still have other + mappings that haven't been produced yet, such as if they are in modules + as yet unimported. + + """ + + if not Mapper._new_mappers: + return + + _CONFIGURE_MUTEX.acquire() + try: + global _already_compiling + if _already_compiling: + return + _already_compiling = True + try: + + # double-check inside mutex + if not Mapper._new_mappers: + return + + Mapper.dispatch._for_class(Mapper).before_configured() + # initialize properties on all mappers + # note that _mapper_registry is unordered, which + # may randomly conceal/reveal issues related to + # the order of mapper compilation + + for mapper in list(_mapper_registry): + if getattr(mapper, '_configure_failed', False): + e = sa_exc.InvalidRequestError( + "One or more mappers failed to initialize - " + "can't proceed with initialization of other " + "mappers. Triggering mapper: '%s'. " + "Original exception was: %s" + % (mapper, mapper._configure_failed)) + e._configure_failed = mapper._configure_failed + raise e + if not mapper.configured: + try: + mapper._post_configure_properties() + mapper._expire_memoizations() + mapper.dispatch.mapper_configured( + mapper, mapper.class_) + except Exception: + exc = sys.exc_info()[1] + if not hasattr(exc, '_configure_failed'): + mapper._configure_failed = exc + raise + + Mapper._new_mappers = False + finally: + _already_compiling = False + finally: + _CONFIGURE_MUTEX.release() + Mapper.dispatch._for_class(Mapper).after_configured() + + +def reconstructor(fn): + """Decorate a method as the 'reconstructor' hook. + + Designates a method as the "reconstructor", an ``__init__``-like + method that will be called by the ORM after the instance has been + loaded from the database or otherwise reconstituted. + + The reconstructor will be invoked with no arguments. Scalar + (non-collection) database-mapped attributes of the instance will + be available for use within the function. Eagerly-loaded + collections are generally not yet available and will usually only + contain the first element. ORM state changes made to objects at + this stage will not be recorded for the next flush() operation, so + the activity within a reconstructor should be conservative. + + """ + fn.__sa_reconstructor__ = True + return fn + + +def validates(*names, **kw): + r"""Decorate a method as a 'validator' for one or more named properties. + + Designates a method as a validator, a method which receives the + name of the attribute as well as a value to be assigned, or in the + case of a collection, the value to be added to the collection. + The function can then raise validation exceptions to halt the + process from continuing (where Python's built-in ``ValueError`` + and ``AssertionError`` exceptions are reasonable choices), or can + modify or replace the value before proceeding. The function should + otherwise return the given value. + + Note that a validator for a collection **cannot** issue a load of that + collection within the validation routine - this usage raises + an assertion to avoid recursion overflows. This is a reentrant + condition which is not supported. + + :param \*names: list of attribute names to be validated. + :param include_removes: if True, "remove" events will be + sent as well - the validation function must accept an additional + argument "is_remove" which will be a boolean. + + .. versionadded:: 0.7.7 + :param include_backrefs: defaults to ``True``; if ``False``, the + validation function will not emit if the originator is an attribute + event related via a backref. This can be used for bi-directional + :func:`.validates` usage where only one validator should emit per + attribute operation. + + .. versionadded:: 0.9.0 + + .. seealso:: + + :ref:`simple_validators` - usage examples for :func:`.validates` + + """ + include_removes = kw.pop('include_removes', False) + include_backrefs = kw.pop('include_backrefs', True) + + def wrap(fn): + fn.__sa_validators__ = names + fn.__sa_validation_opts__ = { + "include_removes": include_removes, + "include_backrefs": include_backrefs + } + return fn + return wrap + + +def _event_on_load(state, ctx): + instrumenting_mapper = state.manager.info[_INSTRUMENTOR] + if instrumenting_mapper._reconstructor: + instrumenting_mapper._reconstructor(state.obj()) + + +def _event_on_first_init(manager, cls): + """Initial mapper compilation trigger. + + instrumentation calls this one when InstanceState + is first generated, and is needed for legacy mutable + attributes to work. + """ + + instrumenting_mapper = manager.info.get(_INSTRUMENTOR) + if instrumenting_mapper: + if Mapper._new_mappers: + configure_mappers() + + +def _event_on_init(state, args, kwargs): + """Run init_instance hooks. + + This also includes mapper compilation, normally not needed + here but helps with some piecemeal configuration + scenarios (such as in the ORM tutorial). + + """ + + instrumenting_mapper = state.manager.info.get(_INSTRUMENTOR) + if instrumenting_mapper: + if Mapper._new_mappers: + configure_mappers() + if instrumenting_mapper._set_polymorphic_identity: + instrumenting_mapper._set_polymorphic_identity(state) + + +class _ColumnMapping(dict): + """Error reporting helper for mapper._columntoproperty.""" + + __slots__ = 'mapper', + + def __init__(self, mapper): + self.mapper = mapper + + def __missing__(self, column): + prop = self.mapper._props.get(column) + if prop: + raise orm_exc.UnmappedColumnError( + "Column '%s.%s' is not available, due to " + "conflicting property '%s':%r" % ( + column.table.name, column.name, column.key, prop)) + raise orm_exc.UnmappedColumnError( + "No column %s is configured on mapper %s..." % + (column, self.mapper)) diff --git a/app/lib/sqlalchemy/orm/path_registry.py b/app/lib/sqlalchemy/orm/path_registry.py new file mode 100644 index 0000000..580995a --- /dev/null +++ b/app/lib/sqlalchemy/orm/path_registry.py @@ -0,0 +1,271 @@ +# orm/path_registry.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +"""Path tracking utilities, representing mapper graph traversals. + +""" + +from .. import inspection +from .. import util +from .. import exc +from itertools import chain +from .base import class_mapper +import logging + +log = logging.getLogger(__name__) + + +def _unreduce_path(path): + return PathRegistry.deserialize(path) + + +_WILDCARD_TOKEN = "*" +_DEFAULT_TOKEN = "_sa_default" + + +class PathRegistry(object): + """Represent query load paths and registry functions. + + Basically represents structures like: + + (, "orders", , "items", ) + + These structures are generated by things like + query options (joinedload(), subqueryload(), etc.) and are + used to compose keys stored in the query._attributes dictionary + for various options. + + They are then re-composed at query compile/result row time as + the query is formed and as rows are fetched, where they again + serve to compose keys to look up options in the context.attributes + dictionary, which is copied from query._attributes. + + The path structure has a limited amount of caching, where each + "root" ultimately pulls from a fixed registry associated with + the first mapper, that also contains elements for each of its + property keys. However paths longer than two elements, which + are the exception rather than the rule, are generated on an + as-needed basis. + + """ + + is_token = False + is_root = False + + def __eq__(self, other): + return other is not None and \ + self.path == other.path + + def set(self, attributes, key, value): + log.debug("set '%s' on path '%s' to '%s'", key, self, value) + attributes[(key, self.path)] = value + + def setdefault(self, attributes, key, value): + log.debug("setdefault '%s' on path '%s' to '%s'", key, self, value) + attributes.setdefault((key, self.path), value) + + def get(self, attributes, key, value=None): + key = (key, self.path) + if key in attributes: + return attributes[key] + else: + return value + + def __len__(self): + return len(self.path) + + @property + def length(self): + return len(self.path) + + def pairs(self): + path = self.path + for i in range(0, len(path), 2): + yield path[i], path[i + 1] + + def contains_mapper(self, mapper): + for path_mapper in [ + self.path[i] for i in range(0, len(self.path), 2) + ]: + if path_mapper.is_mapper and \ + path_mapper.isa(mapper): + return True + else: + return False + + def contains(self, attributes, key): + return (key, self.path) in attributes + + def __reduce__(self): + return _unreduce_path, (self.serialize(), ) + + def serialize(self): + path = self.path + return list(zip( + [m.class_ for m in [path[i] for i in range(0, len(path), 2)]], + [path[i].key for i in range(1, len(path), 2)] + [None] + )) + + @classmethod + def deserialize(cls, path): + if path is None: + return None + + p = tuple(chain(*[(class_mapper(mcls), + class_mapper(mcls).attrs[key] + if key is not None else None) + for mcls, key in path])) + if p and p[-1] is None: + p = p[0:-1] + return cls.coerce(p) + + @classmethod + def per_mapper(cls, mapper): + return EntityRegistry( + cls.root, mapper + ) + + @classmethod + def coerce(cls, raw): + return util.reduce(lambda prev, next: prev[next], raw, cls.root) + + def token(self, token): + if token.endswith(':' + _WILDCARD_TOKEN): + return TokenRegistry(self, token) + elif token.endswith(":" + _DEFAULT_TOKEN): + return TokenRegistry(self.root, token) + else: + raise exc.ArgumentError("invalid token: %s" % token) + + def __add__(self, other): + return util.reduce( + lambda prev, next: prev[next], + other.path, self) + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self.path, ) + + +class RootRegistry(PathRegistry): + """Root registry, defers to mappers so that + paths are maintained per-root-mapper. + + """ + path = () + has_entity = False + is_aliased_class = False + is_root = True + + def __getitem__(self, entity): + return entity._path_registry + +PathRegistry.root = RootRegistry() + + +class TokenRegistry(PathRegistry): + def __init__(self, parent, token): + self.token = token + self.parent = parent + self.path = parent.path + (token,) + + has_entity = False + + is_token = True + + def generate_for_superclasses(self): + if not self.parent.is_aliased_class and not self.parent.is_root: + for ent in self.parent.mapper.iterate_to_root(): + yield TokenRegistry(self.parent.parent[ent], self.token) + else: + yield self + + def __getitem__(self, entity): + raise NotImplementedError() + + +class PropRegistry(PathRegistry): + def __init__(self, parent, prop): + # restate this path in terms of the + # given MapperProperty's parent. + insp = inspection.inspect(parent[-1]) + if not insp.is_aliased_class or insp._use_mapper_path: + parent = parent.parent[prop.parent] + elif insp.is_aliased_class and insp.with_polymorphic_mappers: + if prop.parent is not insp.mapper and \ + prop.parent in insp.with_polymorphic_mappers: + subclass_entity = parent[-1]._entity_for_mapper(prop.parent) + parent = parent.parent[subclass_entity] + + self.prop = prop + self.parent = parent + self.path = parent.path + (prop,) + + self._wildcard_path_loader_key = ( + "loader", + self.parent.path + self.prop._wildcard_token + ) + self._default_path_loader_key = self.prop._default_path_loader_key + self._loader_key = ("loader", self.path) + + def __str__(self): + return " -> ".join( + str(elem) for elem in self.path + ) + + @util.memoized_property + def has_entity(self): + return hasattr(self.prop, "mapper") + + @util.memoized_property + def entity(self): + return self.prop.mapper + + @property + def mapper(self): + return self.entity + + @property + def entity_path(self): + return self[self.entity] + + def __getitem__(self, entity): + if isinstance(entity, (int, slice)): + return self.path[entity] + else: + return EntityRegistry( + self, entity + ) + + +class EntityRegistry(PathRegistry, dict): + is_aliased_class = False + has_entity = True + + def __init__(self, parent, entity): + self.key = entity + self.parent = parent + self.is_aliased_class = entity.is_aliased_class + self.entity = entity + self.path = parent.path + (entity,) + self.entity_path = self + + @property + def mapper(self): + return inspection.inspect(self.entity).mapper + + def __bool__(self): + return True + __nonzero__ = __bool__ + + def __getitem__(self, entity): + if isinstance(entity, (int, slice)): + return self.path[entity] + else: + return dict.__getitem__(self, entity) + + def __missing__(self, key): + self[key] = item = PropRegistry(self, key) + return item diff --git a/app/lib/sqlalchemy/orm/persistence.py b/app/lib/sqlalchemy/orm/persistence.py new file mode 100644 index 0000000..ad268c1 --- /dev/null +++ b/app/lib/sqlalchemy/orm/persistence.py @@ -0,0 +1,1460 @@ +# orm/persistence.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""private module containing functions used to emit INSERT, UPDATE +and DELETE statements on behalf of a :class:`.Mapper` and its descending +mappers. + +The functions here are called only by the unit of work functions +in unitofwork.py. + +""" + +import operator +from itertools import groupby, chain +from .. import sql, util, exc as sa_exc +from . import attributes, sync, exc as orm_exc, evaluator +from .base import state_str, _attr_as_key, _entity_descriptor +from ..sql import expression +from ..sql.base import _from_objects +from . import loading + + +def _bulk_insert( + mapper, mappings, session_transaction, isstates, return_defaults, + render_nulls): + base_mapper = mapper.base_mapper + + cached_connections = _cached_connection_dict(base_mapper) + + if session_transaction.session.connection_callable: + raise NotImplementedError( + "connection_callable / per-instance sharding " + "not supported in bulk_insert()") + + if isstates: + if return_defaults: + states = [(state, state.dict) for state in mappings] + mappings = [dict_ for (state, dict_) in states] + else: + mappings = [state.dict for state in mappings] + else: + mappings = list(mappings) + + connection = session_transaction.connection(base_mapper) + for table, super_mapper in base_mapper._sorted_tables.items(): + if not mapper.isa(super_mapper): + continue + + records = ( + (None, state_dict, params, mapper, + connection, value_params, has_all_pks, has_all_defaults) + for + state, state_dict, params, mp, + conn, value_params, has_all_pks, + has_all_defaults in _collect_insert_commands(table, ( + (None, mapping, mapper, connection) + for mapping in mappings), + bulk=True, return_defaults=return_defaults, + render_nulls=render_nulls + ) + ) + _emit_insert_statements(base_mapper, None, + cached_connections, + super_mapper, table, records, + bookkeeping=return_defaults) + + if return_defaults and isstates: + identity_cls = mapper._identity_class + identity_props = [p.key for p in mapper._identity_key_props] + for state, dict_ in states: + state.key = ( + identity_cls, + tuple([dict_[key] for key in identity_props]) + ) + + +def _bulk_update(mapper, mappings, session_transaction, + isstates, update_changed_only): + base_mapper = mapper.base_mapper + + cached_connections = _cached_connection_dict(base_mapper) + + search_keys = mapper._primary_key_propkeys + if mapper._version_id_prop: + search_keys = set([mapper._version_id_prop.key]).union(search_keys) + + def _changed_dict(mapper, state): + return dict( + (k, v) + for k, v in state.dict.items() if k in state.committed_state or k + in search_keys + + ) + + if isstates: + if update_changed_only: + mappings = [_changed_dict(mapper, state) for state in mappings] + else: + mappings = [state.dict for state in mappings] + else: + mappings = list(mappings) + + if session_transaction.session.connection_callable: + raise NotImplementedError( + "connection_callable / per-instance sharding " + "not supported in bulk_update()") + + connection = session_transaction.connection(base_mapper) + + for table, super_mapper in base_mapper._sorted_tables.items(): + if not mapper.isa(super_mapper): + continue + + records = _collect_update_commands(None, table, ( + (None, mapping, mapper, connection, + (mapping[mapper._version_id_prop.key] + if mapper._version_id_prop else None)) + for mapping in mappings + ), bulk=True) + + _emit_update_statements(base_mapper, None, + cached_connections, + super_mapper, table, records, + bookkeeping=False) + + +def save_obj( + base_mapper, states, uowtransaction, single=False): + """Issue ``INSERT`` and/or ``UPDATE`` statements for a list + of objects. + + This is called within the context of a UOWTransaction during a + flush operation, given a list of states to be flushed. The + base mapper in an inheritance hierarchy handles the inserts/ + updates for all descendant mappers. + + """ + + # if batch=false, call _save_obj separately for each object + if not single and not base_mapper.batch: + for state in _sort_states(states): + save_obj(base_mapper, [state], uowtransaction, single=True) + return + + states_to_update = [] + states_to_insert = [] + cached_connections = _cached_connection_dict(base_mapper) + + for (state, dict_, mapper, connection, + has_identity, + row_switch, update_version_id) in _organize_states_for_save( + base_mapper, states, uowtransaction + ): + if has_identity or row_switch: + states_to_update.append( + (state, dict_, mapper, connection, update_version_id) + ) + else: + states_to_insert.append( + (state, dict_, mapper, connection) + ) + + for table, mapper in base_mapper._sorted_tables.items(): + if table not in mapper._pks_by_table: + continue + insert = _collect_insert_commands(table, states_to_insert) + + update = _collect_update_commands( + uowtransaction, table, states_to_update) + + _emit_update_statements(base_mapper, uowtransaction, + cached_connections, + mapper, table, update) + + _emit_insert_statements(base_mapper, uowtransaction, + cached_connections, + mapper, table, insert) + + _finalize_insert_update_commands( + base_mapper, uowtransaction, + chain( + ( + (state, state_dict, mapper, connection, False) + for state, state_dict, mapper, connection in states_to_insert + ), + ( + (state, state_dict, mapper, connection, True) + for state, state_dict, mapper, connection, + update_version_id in states_to_update + ) + ) + ) + + +def post_update(base_mapper, states, uowtransaction, post_update_cols): + """Issue UPDATE statements on behalf of a relationship() which + specifies post_update. + + """ + cached_connections = _cached_connection_dict(base_mapper) + + states_to_update = list(_organize_states_for_post_update( + base_mapper, + states, uowtransaction)) + + for table, mapper in base_mapper._sorted_tables.items(): + if table not in mapper._pks_by_table: + continue + + update = ( + (state, state_dict, sub_mapper, connection) + for + state, state_dict, sub_mapper, connection in states_to_update + if table in sub_mapper._pks_by_table + ) + + update = _collect_post_update_commands(base_mapper, uowtransaction, + table, update, + post_update_cols) + + _emit_post_update_statements(base_mapper, uowtransaction, + cached_connections, + mapper, table, update) + + +def delete_obj(base_mapper, states, uowtransaction): + """Issue ``DELETE`` statements for a list of objects. + + This is called within the context of a UOWTransaction during a + flush operation. + + """ + + cached_connections = _cached_connection_dict(base_mapper) + + states_to_delete = list(_organize_states_for_delete( + base_mapper, + states, + uowtransaction)) + + table_to_mapper = base_mapper._sorted_tables + + for table in reversed(list(table_to_mapper.keys())): + mapper = table_to_mapper[table] + if table not in mapper._pks_by_table: + continue + elif mapper.inherits and mapper.passive_deletes: + continue + + delete = _collect_delete_commands(base_mapper, uowtransaction, + table, states_to_delete) + + _emit_delete_statements(base_mapper, uowtransaction, + cached_connections, mapper, table, delete) + + for state, state_dict, mapper, connection, \ + update_version_id in states_to_delete: + mapper.dispatch.after_delete(mapper, connection, state) + + +def _organize_states_for_save(base_mapper, states, uowtransaction): + """Make an initial pass across a set of states for INSERT or + UPDATE. + + This includes splitting out into distinct lists for + each, calling before_insert/before_update, obtaining + key information for each state including its dictionary, + mapper, the connection to use for the execution per state, + and the identity flag. + + """ + + for state, dict_, mapper, connection in _connections_for_states( + base_mapper, uowtransaction, + states): + + has_identity = bool(state.key) + + instance_key = state.key or mapper._identity_key_from_state(state) + + row_switch = update_version_id = None + + # call before_XXX extensions + if not has_identity: + mapper.dispatch.before_insert(mapper, connection, state) + else: + mapper.dispatch.before_update(mapper, connection, state) + + if mapper._validate_polymorphic_identity: + mapper._validate_polymorphic_identity(mapper, state, dict_) + + # detect if we have a "pending" instance (i.e. has + # no instance_key attached to it), and another instance + # with the same identity key already exists as persistent. + # convert to an UPDATE if so. + if not has_identity and \ + instance_key in uowtransaction.session.identity_map: + instance = \ + uowtransaction.session.identity_map[instance_key] + existing = attributes.instance_state(instance) + + if not uowtransaction.was_already_deleted(existing): + if not uowtransaction.is_deleted(existing): + raise orm_exc.FlushError( + "New instance %s with identity key %s conflicts " + "with persistent instance %s" % + (state_str(state), instance_key, + state_str(existing))) + + base_mapper._log_debug( + "detected row switch for identity %s. " + "will update %s, remove %s from " + "transaction", instance_key, + state_str(state), state_str(existing)) + + # remove the "delete" flag from the existing element + uowtransaction.remove_state_actions(existing) + row_switch = existing + + if (has_identity or row_switch) and mapper.version_id_col is not None: + update_version_id = mapper._get_committed_state_attr_by_column( + row_switch if row_switch else state, + row_switch.dict if row_switch else dict_, + mapper.version_id_col) + + yield (state, dict_, mapper, connection, + has_identity, row_switch, update_version_id) + + +def _organize_states_for_post_update(base_mapper, states, + uowtransaction): + """Make an initial pass across a set of states for UPDATE + corresponding to post_update. + + This includes obtaining key information for each state + including its dictionary, mapper, the connection to use for + the execution per state. + + """ + return _connections_for_states(base_mapper, uowtransaction, states) + + +def _organize_states_for_delete(base_mapper, states, uowtransaction): + """Make an initial pass across a set of states for DELETE. + + This includes calling out before_delete and obtaining + key information for each state including its dictionary, + mapper, the connection to use for the execution per state. + + """ + for state, dict_, mapper, connection in _connections_for_states( + base_mapper, uowtransaction, + states): + + mapper.dispatch.before_delete(mapper, connection, state) + + if mapper.version_id_col is not None: + update_version_id = \ + mapper._get_committed_state_attr_by_column( + state, dict_, + mapper.version_id_col) + else: + update_version_id = None + + yield ( + state, dict_, mapper, connection, update_version_id) + + +def _collect_insert_commands( + table, states_to_insert, + bulk=False, return_defaults=False, render_nulls=False): + """Identify sets of values to use in INSERT statements for a + list of states. + + """ + for state, state_dict, mapper, connection in states_to_insert: + if table not in mapper._pks_by_table: + continue + + params = {} + value_params = {} + + propkey_to_col = mapper._propkey_to_col[table] + + eval_none = mapper._insert_cols_evaluating_none[table] + + for propkey in set(propkey_to_col).intersection(state_dict): + value = state_dict[propkey] + col = propkey_to_col[propkey] + if value is None and propkey not in eval_none and not render_nulls: + continue + elif not bulk and hasattr(value, '__clause_element__') or \ + isinstance(value, sql.ClauseElement): + value_params[col.key] = value.__clause_element__() \ + if hasattr(value, '__clause_element__') else value + else: + params[col.key] = value + + if not bulk: + # for all the columns that have no default and we don't have + # a value and where "None" is not a special value, add + # explicit None to the INSERT. This is a legacy behavior + # which might be worth removing, as it should not be necessary + # and also produces confusion, given that "missing" and None + # now have distinct meanings + for colkey in mapper._insert_cols_as_none[table].\ + difference(params).difference(value_params): + params[colkey] = None + + if not bulk or return_defaults: + has_all_pks = mapper._pk_keys_by_table[table].issubset(params) + + if mapper.base_mapper.eager_defaults: + has_all_defaults = mapper._server_default_cols[table].\ + issubset(params) + else: + has_all_defaults = True + else: + has_all_defaults = has_all_pks = True + + if mapper.version_id_generator is not False \ + and mapper.version_id_col is not None and \ + mapper.version_id_col in mapper._cols_by_table[table]: + params[mapper.version_id_col.key] = \ + mapper.version_id_generator(None) + + yield ( + state, state_dict, params, mapper, + connection, value_params, has_all_pks, + has_all_defaults) + + +def _collect_update_commands( + uowtransaction, table, states_to_update, + bulk=False): + """Identify sets of values to use in UPDATE statements for a + list of states. + + This function works intricately with the history system + to determine exactly what values should be updated + as well as how the row should be matched within an UPDATE + statement. Includes some tricky scenarios where the primary + key of an object might have been changed. + + """ + + for state, state_dict, mapper, connection, \ + update_version_id in states_to_update: + + if table not in mapper._pks_by_table: + continue + + pks = mapper._pks_by_table[table] + + value_params = {} + + propkey_to_col = mapper._propkey_to_col[table] + + if bulk: + params = dict( + (propkey_to_col[propkey].key, state_dict[propkey]) + for propkey in + set(propkey_to_col).intersection(state_dict).difference( + mapper._pk_keys_by_table[table]) + ) + has_all_defaults = True + else: + params = {} + for propkey in set(propkey_to_col).intersection( + state.committed_state): + value = state_dict[propkey] + col = propkey_to_col[propkey] + + if hasattr(value, '__clause_element__') or \ + isinstance(value, sql.ClauseElement): + value_params[col] = value.__clause_element__() \ + if hasattr(value, '__clause_element__') else value + # guard against values that generate non-__nonzero__ + # objects for __eq__() + elif state.manager[propkey].impl.is_equal( + value, state.committed_state[propkey]) is not True: + params[col.key] = value + + if mapper.base_mapper.eager_defaults: + has_all_defaults = mapper._server_onupdate_default_cols[table].\ + issubset(params) + else: + has_all_defaults = True + + if update_version_id is not None and \ + mapper.version_id_col in mapper._cols_by_table[table]: + + if not bulk and not (params or value_params): + # HACK: check for history in other tables, in case the + # history is only in a different table than the one + # where the version_id_col is. This logic was lost + # from 0.9 -> 1.0.0 and restored in 1.0.6. + for prop in mapper._columntoproperty.values(): + history = ( + state.manager[prop.key].impl.get_history( + state, state_dict, + attributes.PASSIVE_NO_INITIALIZE)) + if history.added: + break + else: + # no net change, break + continue + + col = mapper.version_id_col + params[col._label] = update_version_id + + if (bulk or col.key not in params) and \ + mapper.version_id_generator is not False: + val = mapper.version_id_generator(update_version_id) + params[col.key] = val + + elif not (params or value_params): + continue + + has_all_pks = True + if bulk: + pk_params = dict( + (propkey_to_col[propkey]._label, state_dict.get(propkey)) + for propkey in + set(propkey_to_col). + intersection(mapper._pk_attr_keys_by_table[table]) + ) + else: + pk_params = {} + for col in pks: + propkey = mapper._columntoproperty[col].key + + history = state.manager[propkey].impl.get_history( + state, state_dict, attributes.PASSIVE_OFF) + + if history.added: + if not history.deleted or \ + ("pk_cascaded", state, col) in \ + uowtransaction.attributes: + pk_params[col._label] = history.added[0] + params.pop(col.key, None) + else: + # else, use the old value to locate the row + pk_params[col._label] = history.deleted[0] + if col in value_params: + has_all_pks = False + else: + pk_params[col._label] = history.unchanged[0] + if pk_params[col._label] is None: + raise orm_exc.FlushError( + "Can't update table %s using NULL for primary " + "key value on column %s" % (table, col)) + + if params or value_params: + params.update(pk_params) + yield ( + state, state_dict, params, mapper, + connection, value_params, has_all_defaults, has_all_pks) + + +def _collect_post_update_commands(base_mapper, uowtransaction, table, + states_to_update, post_update_cols): + """Identify sets of values to use in UPDATE statements for a + list of states within a post_update operation. + + """ + + for state, state_dict, mapper, connection in states_to_update: + + # assert table in mapper._pks_by_table + + pks = mapper._pks_by_table[table] + params = {} + hasdata = False + + for col in mapper._cols_by_table[table]: + if col in pks: + params[col._label] = \ + mapper._get_state_attr_by_column( + state, + state_dict, col, passive=attributes.PASSIVE_OFF) + + elif col in post_update_cols: + prop = mapper._columntoproperty[col] + history = state.manager[prop.key].impl.get_history( + state, state_dict, + attributes.PASSIVE_NO_INITIALIZE) + if history.added: + value = history.added[0] + params[col.key] = value + hasdata = True + if hasdata: + yield params, connection + + +def _collect_delete_commands(base_mapper, uowtransaction, table, + states_to_delete): + """Identify values to use in DELETE statements for a list of + states to be deleted.""" + + for state, state_dict, mapper, connection, \ + update_version_id in states_to_delete: + + if table not in mapper._pks_by_table: + continue + + params = {} + for col in mapper._pks_by_table[table]: + params[col.key] = \ + value = \ + mapper._get_committed_state_attr_by_column( + state, state_dict, col) + if value is None: + raise orm_exc.FlushError( + "Can't delete from table %s " + "using NULL for primary " + "key value on column %s" % (table, col)) + + if update_version_id is not None and \ + mapper.version_id_col in mapper._cols_by_table[table]: + params[mapper.version_id_col.key] = update_version_id + yield params, connection + + +def _emit_update_statements(base_mapper, uowtransaction, + cached_connections, mapper, table, update, + bookkeeping=True): + """Emit UPDATE statements corresponding to value lists collected + by _collect_update_commands().""" + + needs_version_id = mapper.version_id_col is not None and \ + mapper.version_id_col in mapper._cols_by_table[table] + + def update_stmt(): + clause = sql.and_() + + for col in mapper._pks_by_table[table]: + clause.clauses.append(col == sql.bindparam(col._label, + type_=col.type)) + + if needs_version_id: + clause.clauses.append( + mapper.version_id_col == sql.bindparam( + mapper.version_id_col._label, + type_=mapper.version_id_col.type)) + + stmt = table.update(clause) + return stmt + + cached_stmt = base_mapper._memo(('update', table), update_stmt) + + for (connection, paramkeys, hasvalue, has_all_defaults, has_all_pks), \ + records in groupby( + update, + lambda rec: ( + rec[4], # connection + set(rec[2]), # set of parameter keys + bool(rec[5]), # whether or not we have "value" parameters + rec[6], # has_all_defaults + rec[7] # has all pks + ) + ): + rows = 0 + records = list(records) + + statement = cached_stmt + + # TODO: would be super-nice to not have to determine this boolean + # inside the loop here, in the 99.9999% of the time there's only + # one connection in use + assert_singlerow = connection.dialect.supports_sane_rowcount + assert_multirow = assert_singlerow and \ + connection.dialect.supports_sane_multi_rowcount + allow_multirow = has_all_defaults and not needs_version_id + + if not has_all_pks: + statement = statement.return_defaults() + elif bookkeeping and not has_all_defaults and \ + mapper.base_mapper.eager_defaults: + statement = statement.return_defaults() + elif mapper.version_id_col is not None: + statement = statement.return_defaults(mapper.version_id_col) + + if hasvalue: + for state, state_dict, params, mapper, \ + connection, value_params, \ + has_all_defaults, has_all_pks in records: + c = connection.execute( + statement.values(value_params), + params) + if bookkeeping: + _postfetch( + mapper, + uowtransaction, + table, + state, + state_dict, + c, + c.context.compiled_parameters[0], + value_params) + rows += c.rowcount + check_rowcount = True + else: + if not allow_multirow: + check_rowcount = assert_singlerow + for state, state_dict, params, mapper, \ + connection, value_params, has_all_defaults, \ + has_all_pks in records: + c = cached_connections[connection].\ + execute(statement, params) + + # TODO: why with bookkeeping=False? + if bookkeeping: + _postfetch( + mapper, + uowtransaction, + table, + state, + state_dict, + c, + c.context.compiled_parameters[0], + value_params) + rows += c.rowcount + else: + multiparams = [rec[2] for rec in records] + + check_rowcount = assert_multirow or ( + assert_singlerow and + len(multiparams) == 1 + ) + + c = cached_connections[connection].\ + execute(statement, multiparams) + + rows += c.rowcount + + for state, state_dict, params, mapper, \ + connection, value_params, \ + has_all_defaults, has_all_pks in records: + if bookkeeping: + _postfetch( + mapper, + uowtransaction, + table, + state, + state_dict, + c, + c.context.compiled_parameters[0], + value_params) + + if check_rowcount: + if rows != len(records): + raise orm_exc.StaleDataError( + "UPDATE statement on table '%s' expected to " + "update %d row(s); %d were matched." % + (table.description, len(records), rows)) + + elif needs_version_id: + util.warn("Dialect %s does not support updated rowcount " + "- versioning cannot be verified." % + c.dialect.dialect_description) + + +def _emit_insert_statements(base_mapper, uowtransaction, + cached_connections, mapper, table, insert, + bookkeeping=True): + """Emit INSERT statements corresponding to value lists collected + by _collect_insert_commands().""" + + cached_stmt = base_mapper._memo(('insert', table), table.insert) + + for (connection, pkeys, hasvalue, has_all_pks, has_all_defaults), \ + records in groupby( + insert, + lambda rec: ( + rec[4], # connection + set(rec[2]), # parameter keys + bool(rec[5]), # whether we have "value" parameters + rec[6], + rec[7])): + + statement = cached_stmt + + if not bookkeeping or \ + ( + has_all_defaults + or not base_mapper.eager_defaults + or not connection.dialect.implicit_returning + ) and has_all_pks and not hasvalue: + + records = list(records) + multiparams = [rec[2] for rec in records] + + c = cached_connections[connection].\ + execute(statement, multiparams) + + if bookkeeping: + for (state, state_dict, params, mapper_rec, + conn, value_params, has_all_pks, has_all_defaults), \ + last_inserted_params in \ + zip(records, c.context.compiled_parameters): + if state: + _postfetch( + mapper_rec, + uowtransaction, + table, + state, + state_dict, + c, + last_inserted_params, + value_params) + else: + _postfetch_bulk_save(mapper_rec, state_dict, table) + + else: + if not has_all_defaults and base_mapper.eager_defaults: + statement = statement.return_defaults() + elif mapper.version_id_col is not None: + statement = statement.return_defaults(mapper.version_id_col) + + for state, state_dict, params, mapper_rec, \ + connection, value_params, \ + has_all_pks, has_all_defaults in records: + + if value_params: + result = connection.execute( + statement.values(value_params), + params) + else: + result = cached_connections[connection].\ + execute(statement, params) + + primary_key = result.context.inserted_primary_key + + if primary_key is not None: + # set primary key attributes + for pk, col in zip(primary_key, + mapper._pks_by_table[table]): + prop = mapper_rec._columntoproperty[col] + if state_dict.get(prop.key) is None: + state_dict[prop.key] = pk + if bookkeeping: + if state: + _postfetch( + mapper_rec, + uowtransaction, + table, + state, + state_dict, + result, + result.context.compiled_parameters[0], + value_params) + else: + _postfetch_bulk_save(mapper_rec, state_dict, table) + + +def _emit_post_update_statements(base_mapper, uowtransaction, + cached_connections, mapper, table, update): + """Emit UPDATE statements corresponding to value lists collected + by _collect_post_update_commands().""" + + def update_stmt(): + clause = sql.and_() + + for col in mapper._pks_by_table[table]: + clause.clauses.append(col == sql.bindparam(col._label, + type_=col.type)) + + return table.update(clause) + + statement = base_mapper._memo(('post_update', table), update_stmt) + + # execute each UPDATE in the order according to the original + # list of states to guarantee row access order, but + # also group them into common (connection, cols) sets + # to support executemany(). + for key, grouper in groupby( + update, lambda rec: ( + rec[1], # connection + set(rec[0]) # parameter keys + ) + ): + connection = key[0] + multiparams = [params for params, conn in grouper] + cached_connections[connection].\ + execute(statement, multiparams) + + +def _emit_delete_statements(base_mapper, uowtransaction, cached_connections, + mapper, table, delete): + """Emit DELETE statements corresponding to value lists collected + by _collect_delete_commands().""" + + need_version_id = mapper.version_id_col is not None and \ + mapper.version_id_col in mapper._cols_by_table[table] + + def delete_stmt(): + clause = sql.and_() + for col in mapper._pks_by_table[table]: + clause.clauses.append( + col == sql.bindparam(col.key, type_=col.type)) + + if need_version_id: + clause.clauses.append( + mapper.version_id_col == + sql.bindparam( + mapper.version_id_col.key, + type_=mapper.version_id_col.type + ) + ) + + return table.delete(clause) + + statement = base_mapper._memo(('delete', table), delete_stmt) + for connection, recs in groupby( + delete, + lambda rec: rec[1] # connection + ): + del_objects = [params for params, connection in recs] + + connection = cached_connections[connection] + + expected = len(del_objects) + rows_matched = -1 + only_warn = False + if connection.dialect.supports_sane_multi_rowcount: + c = connection.execute(statement, del_objects) + + if not need_version_id: + only_warn = True + + rows_matched = c.rowcount + + elif need_version_id: + if connection.dialect.supports_sane_rowcount: + rows_matched = 0 + # execute deletes individually so that versioned + # rows can be verified + for params in del_objects: + c = connection.execute(statement, params) + rows_matched += c.rowcount + else: + util.warn( + "Dialect %s does not support deleted rowcount " + "- versioning cannot be verified." % + connection.dialect.dialect_description, + stacklevel=12) + connection.execute(statement, del_objects) + else: + connection.execute(statement, del_objects) + + if base_mapper.confirm_deleted_rows and \ + rows_matched > -1 and expected != rows_matched: + if only_warn: + util.warn( + "DELETE statement on table '%s' expected to " + "delete %d row(s); %d were matched. Please set " + "confirm_deleted_rows=False within the mapper " + "configuration to prevent this warning." % + (table.description, expected, rows_matched) + ) + else: + raise orm_exc.StaleDataError( + "DELETE statement on table '%s' expected to " + "delete %d row(s); %d were matched. Please set " + "confirm_deleted_rows=False within the mapper " + "configuration to prevent this warning." % + (table.description, expected, rows_matched) + ) + + +def _finalize_insert_update_commands(base_mapper, uowtransaction, states): + """finalize state on states that have been inserted or updated, + including calling after_insert/after_update events. + + """ + for state, state_dict, mapper, connection, has_identity in states: + + if mapper._readonly_props: + readonly = state.unmodified_intersection( + [p.key for p in mapper._readonly_props + if p.expire_on_flush or p.key not in state.dict] + ) + if readonly: + state._expire_attributes(state.dict, readonly) + + # if eager_defaults option is enabled, load + # all expired cols. Else if we have a version_id_col, make sure + # it isn't expired. + toload_now = [] + + if base_mapper.eager_defaults: + toload_now.extend( + state._unloaded_non_object.intersection( + mapper._server_default_plus_onupdate_propkeys) + ) + + if mapper.version_id_col is not None and \ + mapper.version_id_generator is False: + if mapper._version_id_prop.key in state.unloaded: + toload_now.extend([mapper._version_id_prop.key]) + + if toload_now: + state.key = base_mapper._identity_key_from_state(state) + loading.load_on_ident( + uowtransaction.session.query(mapper), + state.key, refresh_state=state, + only_load_props=toload_now) + + # call after_XXX extensions + if not has_identity: + mapper.dispatch.after_insert(mapper, connection, state) + else: + mapper.dispatch.after_update(mapper, connection, state) + + +def _postfetch(mapper, uowtransaction, table, + state, dict_, result, params, value_params): + """Expire attributes in need of newly persisted database state, + after an INSERT or UPDATE statement has proceeded for that + state.""" + + prefetch_cols = result.context.compiled.prefetch + postfetch_cols = result.context.compiled.postfetch + returning_cols = result.context.compiled.returning + + if mapper.version_id_col is not None and \ + mapper.version_id_col in mapper._cols_by_table[table]: + prefetch_cols = list(prefetch_cols) + [mapper.version_id_col] + + refresh_flush = bool(mapper.class_manager.dispatch.refresh_flush) + if refresh_flush: + load_evt_attrs = [] + + if returning_cols: + row = result.context.returned_defaults + if row is not None: + for col in returning_cols: + # pk cols returned from insert are handled + # distinctly, don't step on the values here + if col.primary_key and result.context.isinsert: + continue + + # note that columns can be in the "return defaults" that are + # not mapped to this mapper, typically because they are + # "excluded", which can be specified directly or also occurs + # when using declarative w/ single table inheritance + prop = mapper._columntoproperty.get(col) + if prop: + dict_[prop.key] = row[col] + if refresh_flush: + load_evt_attrs.append(prop.key) + + for c in prefetch_cols: + if c.key in params and c in mapper._columntoproperty: + dict_[mapper._columntoproperty[c].key] = params[c.key] + if refresh_flush: + load_evt_attrs.append(mapper._columntoproperty[c].key) + + if refresh_flush and load_evt_attrs: + mapper.class_manager.dispatch.refresh_flush( + state, uowtransaction, load_evt_attrs) + + if postfetch_cols: + state._expire_attributes(state.dict, + [mapper._columntoproperty[c].key + for c in postfetch_cols if c in + mapper._columntoproperty] + ) + + # synchronize newly inserted ids from one table to the next + # TODO: this still goes a little too often. would be nice to + # have definitive list of "columns that changed" here + for m, equated_pairs in mapper._table_to_equated[table]: + sync.populate(state, m, state, m, + equated_pairs, + uowtransaction, + mapper.passive_updates) + + +def _postfetch_bulk_save(mapper, dict_, table): + for m, equated_pairs in mapper._table_to_equated[table]: + sync.bulk_populate_inherit_keys(dict_, m, equated_pairs) + + +def _connections_for_states(base_mapper, uowtransaction, states): + """Return an iterator of (state, state.dict, mapper, connection). + + The states are sorted according to _sort_states, then paired + with the connection they should be using for the given + unit of work transaction. + + """ + # if session has a connection callable, + # organize individual states with the connection + # to use for update + if uowtransaction.session.connection_callable: + connection_callable = \ + uowtransaction.session.connection_callable + else: + connection = uowtransaction.transaction.connection(base_mapper) + connection_callable = None + + for state in _sort_states(states): + if connection_callable: + connection = connection_callable(base_mapper, state.obj()) + + mapper = state.manager.mapper + + yield state, state.dict, mapper, connection + + +def _cached_connection_dict(base_mapper): + # dictionary of connection->connection_with_cache_options. + return util.PopulateDict( + lambda conn: conn.execution_options( + compiled_cache=base_mapper._compiled_cache + )) + + +def _sort_states(states): + pending = set(states) + persistent = set(s for s in pending if s.key is not None) + pending.difference_update(persistent) + return sorted(pending, key=operator.attrgetter("insert_order")) + \ + sorted(persistent, key=lambda q: q.key[1]) + + +class BulkUD(object): + """Handle bulk update and deletes via a :class:`.Query`.""" + + def __init__(self, query): + self.query = query.enable_eagerloads(False) + self.mapper = self.query._bind_mapper() + self._validate_query_state() + + def _validate_query_state(self): + for attr, methname, notset, op in ( + ('_limit', 'limit()', None, operator.is_), + ('_offset', 'offset()', None, operator.is_), + ('_order_by', 'order_by()', False, operator.is_), + ('_group_by', 'group_by()', False, operator.is_), + ('_distinct', 'distinct()', False, operator.is_), + ( + '_from_obj', + 'join(), outerjoin(), select_from(), or from_self()', + (), operator.eq) + ): + if not op(getattr(self.query, attr), notset): + raise sa_exc.InvalidRequestError( + "Can't call Query.update() or Query.delete() " + "when %s has been called" % + (methname, ) + ) + + @property + def session(self): + return self.query.session + + @classmethod + def _factory(cls, lookup, synchronize_session, *arg): + try: + klass = lookup[synchronize_session] + except KeyError: + raise sa_exc.ArgumentError( + "Valid strategies for session synchronization " + "are %s" % (", ".join(sorted(repr(x) + for x in lookup)))) + else: + return klass(*arg) + + def exec_(self): + self._do_pre() + self._do_pre_synchronize() + self._do_exec() + self._do_post_synchronize() + self._do_post() + + @util.dependencies("sqlalchemy.orm.query") + def _do_pre(self, querylib): + query = self.query + self.context = querylib.QueryContext(query) + + if isinstance(query._entities[0], querylib._ColumnEntity): + # check for special case of query(table) + tables = set() + for ent in query._entities: + if not isinstance(ent, querylib._ColumnEntity): + tables.clear() + break + else: + tables.update(_from_objects(ent.column)) + + if len(tables) != 1: + raise sa_exc.InvalidRequestError( + "This operation requires only one Table or " + "entity be specified as the target." + ) + else: + self.primary_table = tables.pop() + + else: + self.primary_table = query._only_entity_zero( + "This operation requires only one Table or " + "entity be specified as the target." + ).mapper.local_table + + session = query.session + + if query._autoflush: + session._autoflush() + + def _do_pre_synchronize(self): + pass + + def _do_post_synchronize(self): + pass + + +class BulkEvaluate(BulkUD): + """BulkUD which does the 'evaluate' method of session state resolution.""" + + def _additional_evaluators(self, evaluator_compiler): + pass + + def _do_pre_synchronize(self): + query = self.query + target_cls = query._mapper_zero().class_ + + try: + evaluator_compiler = evaluator.EvaluatorCompiler(target_cls) + if query.whereclause is not None: + eval_condition = evaluator_compiler.process( + query.whereclause) + else: + def eval_condition(obj): + return True + + self._additional_evaluators(evaluator_compiler) + + except evaluator.UnevaluatableError: + raise sa_exc.InvalidRequestError( + "Could not evaluate current criteria in Python. " + "Specify 'fetch' or False for the " + "synchronize_session parameter.") + + # TODO: detect when the where clause is a trivial primary key match + self.matched_objects = [ + obj for (cls, pk), obj in + query.session.identity_map.items() + if issubclass(cls, target_cls) and + eval_condition(obj)] + + +class BulkFetch(BulkUD): + """BulkUD which does the 'fetch' method of session state resolution.""" + + def _do_pre_synchronize(self): + query = self.query + session = query.session + context = query._compile_context() + select_stmt = context.statement.with_only_columns( + self.primary_table.primary_key) + self.matched_rows = session.execute( + select_stmt, + mapper=self.mapper, + params=query._params).fetchall() + + +class BulkUpdate(BulkUD): + """BulkUD which handles UPDATEs.""" + + def __init__(self, query, values, update_kwargs): + super(BulkUpdate, self).__init__(query) + self.values = values + self.update_kwargs = update_kwargs + + @classmethod + def factory(cls, query, synchronize_session, values, update_kwargs): + return BulkUD._factory({ + "evaluate": BulkUpdateEvaluate, + "fetch": BulkUpdateFetch, + False: BulkUpdate + }, synchronize_session, query, values, update_kwargs) + + def _resolve_string_to_expr(self, key): + if self.mapper and isinstance(key, util.string_types): + attr = _entity_descriptor(self.mapper, key) + return attr.__clause_element__() + else: + return key + + def _resolve_key_to_attrname(self, key): + if self.mapper and isinstance(key, util.string_types): + attr = _entity_descriptor(self.mapper, key) + return attr.property.key + elif isinstance(key, attributes.InstrumentedAttribute): + return key.key + elif hasattr(key, '__clause_element__'): + key = key.__clause_element__() + + if self.mapper and isinstance(key, expression.ColumnElement): + try: + attr = self.mapper._columntoproperty[key] + except orm_exc.UnmappedColumnError: + return None + else: + return attr.key + else: + raise sa_exc.InvalidRequestError( + "Invalid expression type: %r" % key) + + def _do_exec(self): + + values = [ + (self._resolve_string_to_expr(k), v) + for k, v in ( + self.values.items() if hasattr(self.values, 'items') + else self.values) + ] + if not self.update_kwargs.get('preserve_parameter_order', False): + values = dict(values) + + update_stmt = sql.update(self.primary_table, + self.context.whereclause, values, + **self.update_kwargs) + + self.result = self.query.session.execute( + update_stmt, params=self.query._params, + mapper=self.mapper) + self.rowcount = self.result.rowcount + + def _do_post(self): + session = self.query.session + session.dispatch.after_bulk_update(self) + + +class BulkDelete(BulkUD): + """BulkUD which handles DELETEs.""" + + def __init__(self, query): + super(BulkDelete, self).__init__(query) + + @classmethod + def factory(cls, query, synchronize_session): + return BulkUD._factory({ + "evaluate": BulkDeleteEvaluate, + "fetch": BulkDeleteFetch, + False: BulkDelete + }, synchronize_session, query) + + def _do_exec(self): + delete_stmt = sql.delete(self.primary_table, + self.context.whereclause) + + self.result = self.query.session.execute( + delete_stmt, + params=self.query._params, + mapper=self.mapper) + self.rowcount = self.result.rowcount + + def _do_post(self): + session = self.query.session + session.dispatch.after_bulk_delete(self) + + +class BulkUpdateEvaluate(BulkEvaluate, BulkUpdate): + """BulkUD which handles UPDATEs using the "evaluate" + method of session resolution.""" + + def _additional_evaluators(self, evaluator_compiler): + self.value_evaluators = {} + values = (self.values.items() if hasattr(self.values, 'items') + else self.values) + for key, value in values: + key = self._resolve_key_to_attrname(key) + if key is not None: + self.value_evaluators[key] = evaluator_compiler.process( + expression._literal_as_binds(value)) + + def _do_post_synchronize(self): + session = self.query.session + states = set() + evaluated_keys = list(self.value_evaluators.keys()) + for obj in self.matched_objects: + state, dict_ = attributes.instance_state(obj),\ + attributes.instance_dict(obj) + + # only evaluate unmodified attributes + to_evaluate = state.unmodified.intersection( + evaluated_keys) + for key in to_evaluate: + dict_[key] = self.value_evaluators[key](obj) + + state._commit(dict_, list(to_evaluate)) + + # expire attributes with pending changes + # (there was no autoflush, so they are overwritten) + state._expire_attributes(dict_, + set(evaluated_keys). + difference(to_evaluate)) + states.add(state) + session._register_altered(states) + + +class BulkDeleteEvaluate(BulkEvaluate, BulkDelete): + """BulkUD which handles DELETEs using the "evaluate" + method of session resolution.""" + + def _do_post_synchronize(self): + self.query.session._remove_newly_deleted( + [attributes.instance_state(obj) + for obj in self.matched_objects]) + + +class BulkUpdateFetch(BulkFetch, BulkUpdate): + """BulkUD which handles UPDATEs using the "fetch" + method of session resolution.""" + + def _do_post_synchronize(self): + session = self.query.session + target_mapper = self.query._mapper_zero() + + states = set([ + attributes.instance_state(session.identity_map[identity_key]) + for identity_key in [ + target_mapper.identity_key_from_primary_key( + list(primary_key)) + for primary_key in self.matched_rows + ] + if identity_key in session.identity_map + ]) + attrib = [_attr_as_key(k) for k in self.values] + for state in states: + session._expire_state(state, attrib) + session._register_altered(states) + + +class BulkDeleteFetch(BulkFetch, BulkDelete): + """BulkUD which handles DELETEs using the "fetch" + method of session resolution.""" + + def _do_post_synchronize(self): + session = self.query.session + target_mapper = self.query._mapper_zero() + for primary_key in self.matched_rows: + # TODO: inline this and call remove_newly_deleted + # once + identity_key = target_mapper.identity_key_from_primary_key( + list(primary_key)) + if identity_key in session.identity_map: + session._remove_newly_deleted( + [attributes.instance_state( + session.identity_map[identity_key] + )] + ) diff --git a/app/lib/sqlalchemy/orm/properties.py b/app/lib/sqlalchemy/orm/properties.py new file mode 100644 index 0000000..63e7e1e --- /dev/null +++ b/app/lib/sqlalchemy/orm/properties.py @@ -0,0 +1,277 @@ +# orm/properties.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""MapperProperty implementations. + +This is a private module which defines the behavior of invidual ORM- +mapped attributes. + +""" +from __future__ import absolute_import + +from .. import util, log +from ..sql import expression +from . import attributes +from .util import _orm_full_deannotate + +from .interfaces import PropComparator, StrategizedProperty + +__all__ = ['ColumnProperty', 'CompositeProperty', 'SynonymProperty', + 'ComparableProperty', 'RelationshipProperty'] + + +@log.class_logger +class ColumnProperty(StrategizedProperty): + """Describes an object attribute that corresponds to a table column. + + Public constructor is the :func:`.orm.column_property` function. + + """ + + strategy_wildcard_key = 'column' + + __slots__ = ( + '_orig_columns', 'columns', 'group', 'deferred', + 'instrument', 'comparator_factory', 'descriptor', 'extension', + 'active_history', 'expire_on_flush', 'info', 'doc', + 'strategy_key', '_creation_order', '_is_polymorphic_discriminator', + '_mapped_by_synonym', '_deferred_column_loader') + + def __init__(self, *columns, **kwargs): + r"""Provide a column-level property for use with a Mapper. + + Column-based properties can normally be applied to the mapper's + ``properties`` dictionary using the :class:`.Column` element directly. + Use this function when the given column is not directly present within + the mapper's selectable; examples include SQL expressions, functions, + and scalar SELECT queries. + + Columns that aren't present in the mapper's selectable won't be + persisted by the mapper and are effectively "read-only" attributes. + + :param \*cols: + list of Column objects to be mapped. + + :param active_history=False: + When ``True``, indicates that the "previous" value for a + scalar attribute should be loaded when replaced, if not + already loaded. Normally, history tracking logic for + simple non-primary-key scalar values only needs to be + aware of the "new" value in order to perform a flush. This + flag is available for applications that make use of + :func:`.attributes.get_history` or :meth:`.Session.is_modified` + which also need to know + the "previous" value of the attribute. + + .. versionadded:: 0.6.6 + + :param comparator_factory: a class which extends + :class:`.ColumnProperty.Comparator` which provides custom SQL + clause generation for comparison operations. + + :param group: + a group name for this property when marked as deferred. + + :param deferred: + when True, the column property is "deferred", meaning that + it does not load immediately, and is instead loaded when the + attribute is first accessed on an instance. See also + :func:`~sqlalchemy.orm.deferred`. + + :param doc: + optional string that will be applied as the doc on the + class-bound descriptor. + + :param expire_on_flush=True: + Disable expiry on flush. A column_property() which refers + to a SQL expression (and not a single table-bound column) + is considered to be a "read only" property; populating it + has no effect on the state of data, and it can only return + database state. For this reason a column_property()'s value + is expired whenever the parent object is involved in a + flush, that is, has any kind of "dirty" state within a flush. + Setting this parameter to ``False`` will have the effect of + leaving any existing value present after the flush proceeds. + Note however that the :class:`.Session` with default expiration + settings still expires + all attributes after a :meth:`.Session.commit` call, however. + + .. versionadded:: 0.7.3 + + :param info: Optional data dictionary which will be populated into the + :attr:`.MapperProperty.info` attribute of this object. + + .. versionadded:: 0.8 + + :param extension: + an + :class:`.AttributeExtension` + instance, or list of extensions, which will be prepended + to the list of attribute listeners for the resulting + descriptor placed on the class. + **Deprecated.** Please see :class:`.AttributeEvents`. + + """ + super(ColumnProperty, self).__init__() + self._orig_columns = [expression._labeled(c) for c in columns] + self.columns = [expression._labeled(_orm_full_deannotate(c)) + for c in columns] + self.group = kwargs.pop('group', None) + self.deferred = kwargs.pop('deferred', False) + self.instrument = kwargs.pop('_instrument', True) + self.comparator_factory = kwargs.pop('comparator_factory', + self.__class__.Comparator) + self.descriptor = kwargs.pop('descriptor', None) + self.extension = kwargs.pop('extension', None) + self.active_history = kwargs.pop('active_history', False) + self.expire_on_flush = kwargs.pop('expire_on_flush', True) + + if 'info' in kwargs: + self.info = kwargs.pop('info') + + if 'doc' in kwargs: + self.doc = kwargs.pop('doc') + else: + for col in reversed(self.columns): + doc = getattr(col, 'doc', None) + if doc is not None: + self.doc = doc + break + else: + self.doc = None + + if kwargs: + raise TypeError( + "%s received unexpected keyword argument(s): %s" % ( + self.__class__.__name__, + ', '.join(sorted(kwargs.keys())))) + + util.set_creation_order(self) + + self.strategy_key = ( + ("deferred", self.deferred), + ("instrument", self.instrument) + ) + + @util.dependencies("sqlalchemy.orm.state", "sqlalchemy.orm.strategies") + def _memoized_attr__deferred_column_loader(self, state, strategies): + return state.InstanceState._instance_level_callable_processor( + self.parent.class_manager, + strategies.LoadDeferredColumns(self.key), self.key) + + @property + def expression(self): + """Return the primary column or expression for this ColumnProperty. + + """ + return self.columns[0] + + def instrument_class(self, mapper): + if not self.instrument: + return + + attributes.register_descriptor( + mapper.class_, + self.key, + comparator=self.comparator_factory(self, mapper), + parententity=mapper, + doc=self.doc + ) + + def do_init(self): + super(ColumnProperty, self).do_init() + if len(self.columns) > 1 and \ + set(self.parent.primary_key).issuperset(self.columns): + util.warn( + ("On mapper %s, primary key column '%s' is being combined " + "with distinct primary key column '%s' in attribute '%s'. " + "Use explicit properties to give each column its own mapped " + "attribute name.") % (self.parent, self.columns[1], + self.columns[0], self.key)) + + def copy(self): + return ColumnProperty( + deferred=self.deferred, + group=self.group, + active_history=self.active_history, + *self.columns) + + def _getcommitted(self, state, dict_, column, + passive=attributes.PASSIVE_OFF): + return state.get_impl(self.key).\ + get_committed_value(state, dict_, passive=passive) + + def merge(self, session, source_state, source_dict, dest_state, + dest_dict, load, _recursive, _resolve_conflict_map): + if not self.instrument: + return + elif self.key in source_dict: + value = source_dict[self.key] + + if not load: + dest_dict[self.key] = value + else: + impl = dest_state.get_impl(self.key) + impl.set(dest_state, dest_dict, value, None) + elif dest_state.has_identity and self.key not in dest_dict: + dest_state._expire_attributes( + dest_dict, [self.key], no_loader=True) + + class Comparator(util.MemoizedSlots, PropComparator): + """Produce boolean, comparison, and other operators for + :class:`.ColumnProperty` attributes. + + See the documentation for :class:`.PropComparator` for a brief + overview. + + See also: + + :class:`.PropComparator` + + :class:`.ColumnOperators` + + :ref:`types_operators` + + :attr:`.TypeEngine.comparator_factory` + + """ + + __slots__ = '__clause_element__', 'info' + + def _memoized_method___clause_element__(self): + if self.adapter: + return self.adapter(self.prop.columns[0]) + else: + # no adapter, so we aren't aliased + # assert self._parententity is self._parentmapper + return self.prop.columns[0]._annotate({ + "parententity": self._parententity, + "parentmapper": self._parententity}) + + def _memoized_attr_info(self): + ce = self.__clause_element__() + try: + return ce.info + except AttributeError: + return self.prop.info + + def _fallback_getattr(self, key): + """proxy attribute access down to the mapped column. + + this allows user-defined comparison methods to be accessed. + """ + return getattr(self.__clause_element__(), key) + + def operate(self, op, *other, **kwargs): + return op(self.__clause_element__(), *other, **kwargs) + + def reverse_operate(self, op, other, **kwargs): + col = self.__clause_element__() + return op(col._bind_param(op, other), col, **kwargs) + + def __str__(self): + return str(self.parent.class_.__name__) + "." + self.key diff --git a/app/lib/sqlalchemy/orm/query.py b/app/lib/sqlalchemy/orm/query.py new file mode 100644 index 0000000..e8bd717 --- /dev/null +++ b/app/lib/sqlalchemy/orm/query.py @@ -0,0 +1,4187 @@ +# orm/query.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""The Query class and support. + +Defines the :class:`.Query` class, the central +construct used by the ORM to construct database queries. + +The :class:`.Query` class should not be confused with the +:class:`.Select` class, which defines database +SELECT operations at the SQL (non-ORM) level. ``Query`` differs from +``Select`` in that it returns ORM-mapped objects and interacts with an +ORM session, whereas the ``Select`` construct interacts directly with the +database to return iterable result sets. + +""" + +from itertools import chain + +from . import ( + attributes, interfaces, object_mapper, persistence, + exc as orm_exc, loading +) +from .base import _entity_descriptor, _is_aliased_class, \ + _is_mapped_class, _orm_columns, _generative, InspectionAttr +from .path_registry import PathRegistry +from .util import ( + AliasedClass, ORMAdapter, join as orm_join, with_parent, aliased +) +from .. import sql, util, log, exc as sa_exc, inspect, inspection +from ..sql.expression import _interpret_as_from +from ..sql import ( + util as sql_util, + expression, visitors +) +from ..sql.base import ColumnCollection +from . import properties + +__all__ = ['Query', 'QueryContext', 'aliased'] + + +_path_registry = PathRegistry.root + + +@inspection._self_inspects +@log.class_logger +class Query(object): + """ORM-level SQL construction object. + + :class:`.Query` is the source of all SELECT statements generated by the + ORM, both those formulated by end-user query operations as well as by + high level internal operations such as related collection loading. It + features a generative interface whereby successive calls return a new + :class:`.Query` object, a copy of the former with additional + criteria and options associated with it. + + :class:`.Query` objects are normally initially generated using the + :meth:`~.Session.query` method of :class:`.Session`, and in + less common cases by instantiating the :class:`.Query` directly and + associating with a :class:`.Session` using the :meth:`.Query.with_session` + method. + + For a full walkthrough of :class:`.Query` usage, see the + :ref:`ormtutorial_toplevel`. + + """ + + _enable_eagerloads = True + _enable_assertions = True + _with_labels = False + _criterion = None + _yield_per = None + _order_by = False + _group_by = False + _having = None + _distinct = False + _prefixes = None + _suffixes = None + _offset = None + _limit = None + _for_update_arg = None + _statement = None + _correlate = frozenset() + _populate_existing = False + _invoke_all_eagers = True + _version_check = False + _autoflush = True + _only_load_props = None + _refresh_state = None + _from_obj = () + _join_entities = () + _select_from_entity = None + _mapper_adapter_map = {} + _filter_aliases = None + _from_obj_alias = None + _joinpath = _joinpoint = util.immutabledict() + _execution_options = util.immutabledict() + _params = util.immutabledict() + _attributes = util.immutabledict() + _with_options = () + _with_hints = () + _enable_single_crit = True + _orm_only_adapt = True + _orm_only_from_obj_alias = True + _current_path = _path_registry + _has_mapper_entities = False + + def __init__(self, entities, session=None): + """Construct a :class:`.Query` directly. + + E.g.:: + + q = Query([User, Address], session=some_session) + + The above is equivalent to:: + + q = some_session.query(User, Address) + + :param entities: a sequence of entities and/or SQL expressions. + + :param session: a :class:`.Session` with which the :class:`.Query` + will be associated. Optional; a :class:`.Query` can be associated + with a :class:`.Session` generatively via the + :meth:`.Query.with_session` method as well. + + .. seealso:: + + :meth:`.Session.query` + + :meth:`.Query.with_session` + + """ + self.session = session + self._polymorphic_adapters = {} + self._set_entities(entities) + + def _set_entities(self, entities, entity_wrapper=None): + if entity_wrapper is None: + entity_wrapper = _QueryEntity + self._entities = [] + self._primary_entity = None + self._has_mapper_entities = False + for ent in util.to_list(entities): + entity_wrapper(self, ent) + + self._set_entity_selectables(self._entities) + + def _set_entity_selectables(self, entities): + self._mapper_adapter_map = d = self._mapper_adapter_map.copy() + + for ent in entities: + for entity in ent.entities: + if entity not in d: + ext_info = inspect(entity) + if not ext_info.is_aliased_class and \ + ext_info.mapper.with_polymorphic: + if ext_info.mapper.mapped_table not in \ + self._polymorphic_adapters: + self._mapper_loads_polymorphically_with( + ext_info.mapper, + sql_util.ColumnAdapter( + ext_info.selectable, + ext_info.mapper._equivalent_columns + ) + ) + aliased_adapter = None + elif ext_info.is_aliased_class: + aliased_adapter = ext_info._adapter + else: + aliased_adapter = None + + d[entity] = ( + ext_info, + aliased_adapter + ) + ent.setup_entity(*d[entity]) + + def _mapper_loads_polymorphically_with(self, mapper, adapter): + for m2 in mapper._with_polymorphic_mappers or [mapper]: + self._polymorphic_adapters[m2] = adapter + for m in m2.iterate_to_root(): + self._polymorphic_adapters[m.local_table] = adapter + + def _set_select_from(self, obj, set_base_alias): + fa = [] + select_from_alias = None + + for from_obj in obj: + info = inspect(from_obj) + if hasattr(info, 'mapper') and \ + (info.is_mapper or info.is_aliased_class): + self._select_from_entity = info + if set_base_alias and not info.is_aliased_class: + raise sa_exc.ArgumentError( + "A selectable (FromClause) instance is " + "expected when the base alias is being set.") + fa.append(info.selectable) + elif not info.is_selectable: + raise sa_exc.ArgumentError( + "argument is not a mapped class, mapper, " + "aliased(), or FromClause instance.") + else: + if isinstance(from_obj, expression.SelectBase): + from_obj = from_obj.alias() + if set_base_alias: + select_from_alias = from_obj + fa.append(from_obj) + + self._from_obj = tuple(fa) + + if set_base_alias and \ + len(self._from_obj) == 1 and \ + isinstance(select_from_alias, expression.Alias): + equivs = self.__all_equivs() + self._from_obj_alias = sql_util.ColumnAdapter( + self._from_obj[0], equivs) + elif set_base_alias and \ + len(self._from_obj) == 1 and \ + hasattr(info, "mapper") and \ + info.is_aliased_class: + self._from_obj_alias = info._adapter + + def _reset_polymorphic_adapter(self, mapper): + for m2 in mapper._with_polymorphic_mappers: + self._polymorphic_adapters.pop(m2, None) + for m in m2.iterate_to_root(): + self._polymorphic_adapters.pop(m.local_table, None) + + def _adapt_polymorphic_element(self, element): + if "parententity" in element._annotations: + search = element._annotations['parententity'] + alias = self._polymorphic_adapters.get(search, None) + if alias: + return alias.adapt_clause(element) + + if isinstance(element, expression.FromClause): + search = element + elif hasattr(element, 'table'): + search = element.table + else: + return None + + alias = self._polymorphic_adapters.get(search, None) + if alias: + return alias.adapt_clause(element) + + def _adapt_col_list(self, cols): + return [ + self._adapt_clause( + expression._literal_as_label_reference(o), + True, True) + for o in cols + ] + + @_generative() + def _adapt_all_clauses(self): + self._orm_only_adapt = False + + def _adapt_clause(self, clause, as_filter, orm_only): + """Adapt incoming clauses to transformations which + have been applied within this query.""" + + adapters = [] + # do we adapt all expression elements or only those + # tagged as 'ORM' constructs ? + if not self._orm_only_adapt: + orm_only = False + + if as_filter and self._filter_aliases: + for fa in self._filter_aliases._visitor_iterator: + adapters.append( + ( + orm_only, fa.replace + ) + ) + + if self._from_obj_alias: + # for the "from obj" alias, apply extra rule to the + # 'ORM only' check, if this query were generated from a + # subquery of itself, i.e. _from_selectable(), apply adaption + # to all SQL constructs. + adapters.append( + ( + orm_only if self._orm_only_from_obj_alias else False, + self._from_obj_alias.replace + ) + ) + + if self._polymorphic_adapters: + adapters.append( + ( + orm_only, self._adapt_polymorphic_element + ) + ) + + if not adapters: + return clause + + def replace(elem): + for _orm_only, adapter in adapters: + # if 'orm only', look for ORM annotations + # in the element before adapting. + if not _orm_only or \ + '_orm_adapt' in elem._annotations or \ + "parententity" in elem._annotations: + + e = adapter(elem) + if e is not None: + return e + + return visitors.replacement_traverse( + clause, + {}, + replace + ) + + def _query_entity_zero(self): + """Return the first QueryEntity.""" + return self._entities[0] + + def _mapper_zero(self): + """return the Mapper associated with the first QueryEntity.""" + return self._entities[0].mapper + + def _entity_zero(self): + """Return the 'entity' (mapper or AliasedClass) associated + with the first QueryEntity, or alternatively the 'select from' + entity if specified.""" + + return self._select_from_entity \ + if self._select_from_entity is not None \ + else self._query_entity_zero().entity_zero + + @property + def _mapper_entities(self): + for ent in self._entities: + if isinstance(ent, _MapperEntity): + yield ent + + def _joinpoint_zero(self): + return self._joinpoint.get( + '_joinpoint_entity', + self._entity_zero() + ) + + def _bind_mapper(self): + ezero = self._entity_zero() + if ezero is not None: + insp = inspect(ezero) + if not insp.is_clause_element: + return insp.mapper + + return None + + def _only_full_mapper_zero(self, methname): + if self._entities != [self._primary_entity]: + raise sa_exc.InvalidRequestError( + "%s() can only be used against " + "a single mapped class." % methname) + return self._primary_entity.entity_zero + + def _only_entity_zero(self, rationale=None): + if len(self._entities) > 1: + raise sa_exc.InvalidRequestError( + rationale or + "This operation requires a Query " + "against a single mapper." + ) + return self._entity_zero() + + def __all_equivs(self): + equivs = {} + for ent in self._mapper_entities: + equivs.update(ent.mapper._equivalent_columns) + return equivs + + def _get_condition(self): + return self._no_criterion_condition( + "get", order_by=False, distinct=False) + + def _get_existing_condition(self): + self._no_criterion_assertion("get", order_by=False, distinct=False) + + def _no_criterion_assertion(self, meth, order_by=True, distinct=True): + if not self._enable_assertions: + return + if self._criterion is not None or \ + self._statement is not None or self._from_obj or \ + self._limit is not None or self._offset is not None or \ + self._group_by or (order_by and self._order_by) or \ + (distinct and self._distinct): + raise sa_exc.InvalidRequestError( + "Query.%s() being called on a " + "Query with existing criterion. " % meth) + + def _no_criterion_condition(self, meth, order_by=True, distinct=True): + self._no_criterion_assertion(meth, order_by, distinct) + + self._from_obj = () + self._statement = self._criterion = None + self._order_by = self._group_by = self._distinct = False + + def _no_clauseelement_condition(self, meth): + if not self._enable_assertions: + return + if self._order_by: + raise sa_exc.InvalidRequestError( + "Query.%s() being called on a " + "Query with existing criterion. " % meth) + self._no_criterion_condition(meth) + + def _no_statement_condition(self, meth): + if not self._enable_assertions: + return + if self._statement is not None: + raise sa_exc.InvalidRequestError( + ("Query.%s() being called on a Query with an existing full " + "statement - can't apply criterion.") % meth) + + def _no_limit_offset(self, meth): + if not self._enable_assertions: + return + if self._limit is not None or self._offset is not None: + raise sa_exc.InvalidRequestError( + "Query.%s() being called on a Query which already has LIMIT " + "or OFFSET applied. To modify the row-limited results of a " + " Query, call from_self() first. " + "Otherwise, call %s() before limit() or offset() " + "are applied." + % (meth, meth) + ) + + def _get_options(self, populate_existing=None, + version_check=None, + only_load_props=None, + refresh_state=None): + if populate_existing: + self._populate_existing = populate_existing + if version_check: + self._version_check = version_check + if refresh_state: + self._refresh_state = refresh_state + if only_load_props: + self._only_load_props = set(only_load_props) + return self + + def _clone(self): + cls = self.__class__ + q = cls.__new__(cls) + q.__dict__ = self.__dict__.copy() + return q + + @property + def statement(self): + """The full SELECT statement represented by this Query. + + The statement by default will not have disambiguating labels + applied to the construct unless with_labels(True) is called + first. + + """ + + stmt = self._compile_context(labels=self._with_labels).\ + statement + if self._params: + stmt = stmt.params(self._params) + + # TODO: there's no tests covering effects of + # the annotation not being there + return stmt._annotate({'no_replacement_traverse': True}) + + def subquery(self, name=None, with_labels=False, reduce_columns=False): + """return the full SELECT statement represented by + this :class:`.Query`, embedded within an :class:`.Alias`. + + Eager JOIN generation within the query is disabled. + + :param name: string name to be assigned as the alias; + this is passed through to :meth:`.FromClause.alias`. + If ``None``, a name will be deterministically generated + at compile time. + + :param with_labels: if True, :meth:`.with_labels` will be called + on the :class:`.Query` first to apply table-qualified labels + to all columns. + + :param reduce_columns: if True, :meth:`.Select.reduce_columns` will + be called on the resulting :func:`.select` construct, + to remove same-named columns where one also refers to the other + via foreign key or WHERE clause equivalence. + + .. versionchanged:: 0.8 the ``with_labels`` and ``reduce_columns`` + keyword arguments were added. + + """ + q = self.enable_eagerloads(False) + if with_labels: + q = q.with_labels() + q = q.statement + if reduce_columns: + q = q.reduce_columns() + return q.alias(name=name) + + def cte(self, name=None, recursive=False): + r"""Return the full SELECT statement represented by this + :class:`.Query` represented as a common table expression (CTE). + + Parameters and usage are the same as those of the + :meth:`.SelectBase.cte` method; see that method for + further details. + + Here is the `PostgreSQL WITH + RECURSIVE example + `_. + Note that, in this example, the ``included_parts`` cte and the + ``incl_alias`` alias of it are Core selectables, which + means the columns are accessed via the ``.c.`` attribute. The + ``parts_alias`` object is an :func:`.orm.aliased` instance of the + ``Part`` entity, so column-mapped attributes are available + directly:: + + from sqlalchemy.orm import aliased + + class Part(Base): + __tablename__ = 'part' + part = Column(String, primary_key=True) + sub_part = Column(String, primary_key=True) + quantity = Column(Integer) + + included_parts = session.query( + Part.sub_part, + Part.part, + Part.quantity).\ + filter(Part.part=="our part").\ + cte(name="included_parts", recursive=True) + + incl_alias = aliased(included_parts, name="pr") + parts_alias = aliased(Part, name="p") + included_parts = included_parts.union_all( + session.query( + parts_alias.sub_part, + parts_alias.part, + parts_alias.quantity).\ + filter(parts_alias.part==incl_alias.c.sub_part) + ) + + q = session.query( + included_parts.c.sub_part, + func.sum(included_parts.c.quantity). + label('total_quantity') + ).\ + group_by(included_parts.c.sub_part) + + .. seealso:: + + :meth:`.HasCTE.cte` + + """ + return self.enable_eagerloads(False).\ + statement.cte(name=name, recursive=recursive) + + def label(self, name): + """Return the full SELECT statement represented by this + :class:`.Query`, converted + to a scalar subquery with a label of the given name. + + Analogous to :meth:`sqlalchemy.sql.expression.SelectBase.label`. + + .. versionadded:: 0.6.5 + + """ + + return self.enable_eagerloads(False).statement.label(name) + + def as_scalar(self): + """Return the full SELECT statement represented by this + :class:`.Query`, converted to a scalar subquery. + + Analogous to :meth:`sqlalchemy.sql.expression.SelectBase.as_scalar`. + + .. versionadded:: 0.6.5 + + """ + + return self.enable_eagerloads(False).statement.as_scalar() + + @property + def selectable(self): + """Return the :class:`.Select` object emitted by this :class:`.Query`. + + Used for :func:`.inspect` compatibility, this is equivalent to:: + + query.enable_eagerloads(False).with_labels().statement + + """ + return self.__clause_element__() + + def __clause_element__(self): + return self.enable_eagerloads(False).with_labels().statement + + @_generative() + def enable_eagerloads(self, value): + """Control whether or not eager joins and subqueries are + rendered. + + When set to False, the returned Query will not render + eager joins regardless of :func:`~sqlalchemy.orm.joinedload`, + :func:`~sqlalchemy.orm.subqueryload` options + or mapper-level ``lazy='joined'``/``lazy='subquery'`` + configurations. + + This is used primarily when nesting the Query's + statement into a subquery or other + selectable, or when using :meth:`.Query.yield_per`. + + """ + self._enable_eagerloads = value + + def _no_yield_per(self, message): + raise sa_exc.InvalidRequestError( + "The yield_per Query option is currently not " + "compatible with %s eager loading. Please " + "specify lazyload('*') or query.enable_eagerloads(False) in " + "order to " + "proceed with query.yield_per()." % message) + + @_generative() + def with_labels(self): + """Apply column labels to the return value of Query.statement. + + Indicates that this Query's `statement` accessor should return + a SELECT statement that applies labels to all columns in the + form _; this is commonly used to + disambiguate columns from multiple tables which have the same + name. + + When the `Query` actually issues SQL to load rows, it always + uses column labeling. + + .. note:: The :meth:`.Query.with_labels` method *only* applies + the output of :attr:`.Query.statement`, and *not* to any of + the result-row invoking systems of :class:`.Query` itself, e.g. + :meth:`.Query.first`, :meth:`.Query.all`, etc. To execute + a query using :meth:`.Query.with_labels`, invoke the + :attr:`.Query.statement` using :meth:`.Session.execute`:: + + result = session.execute(query.with_labels().statement) + + + """ + self._with_labels = True + + @_generative() + def enable_assertions(self, value): + """Control whether assertions are generated. + + When set to False, the returned Query will + not assert its state before certain operations, + including that LIMIT/OFFSET has not been applied + when filter() is called, no criterion exists + when get() is called, and no "from_statement()" + exists when filter()/order_by()/group_by() etc. + is called. This more permissive mode is used by + custom Query subclasses to specify criterion or + other modifiers outside of the usual usage patterns. + + Care should be taken to ensure that the usage + pattern is even possible. A statement applied + by from_statement() will override any criterion + set by filter() or order_by(), for example. + + """ + self._enable_assertions = value + + @property + def whereclause(self): + """A readonly attribute which returns the current WHERE criterion for + this Query. + + This returned value is a SQL expression construct, or ``None`` if no + criterion has been established. + + """ + return self._criterion + + @_generative() + def _with_current_path(self, path): + """indicate that this query applies to objects loaded + within a certain path. + + Used by deferred loaders (see strategies.py) which transfer + query options from an originating query to a newly generated + query intended for the deferred load. + + """ + self._current_path = path + + @_generative(_no_clauseelement_condition) + def with_polymorphic(self, + cls_or_mappers, + selectable=None, + polymorphic_on=None): + """Load columns for inheriting classes. + + :meth:`.Query.with_polymorphic` applies transformations + to the "main" mapped class represented by this :class:`.Query`. + The "main" mapped class here means the :class:`.Query` + object's first argument is a full class, i.e. + ``session.query(SomeClass)``. These transformations allow additional + tables to be present in the FROM clause so that columns for a + joined-inheritance subclass are available in the query, both for the + purposes of load-time efficiency as well as the ability to use + these columns at query time. + + See the documentation section :ref:`with_polymorphic` for + details on how this method is used. + + .. versionchanged:: 0.8 + A new and more flexible function + :func:`.orm.with_polymorphic` supersedes + :meth:`.Query.with_polymorphic`, as it can apply the equivalent + functionality to any set of columns or classes in the + :class:`.Query`, not just the "zero mapper". See that + function for a description of arguments. + + """ + + if not self._primary_entity: + raise sa_exc.InvalidRequestError( + "No primary mapper set up for this Query.") + entity = self._entities[0]._clone() + self._entities = [entity] + self._entities[1:] + entity.set_with_polymorphic(self, + cls_or_mappers, + selectable=selectable, + polymorphic_on=polymorphic_on) + + @_generative() + def yield_per(self, count): + r"""Yield only ``count`` rows at a time. + + The purpose of this method is when fetching very large result sets + (> 10K rows), to batch results in sub-collections and yield them + out partially, so that the Python interpreter doesn't need to declare + very large areas of memory which is both time consuming and leads + to excessive memory use. The performance from fetching hundreds of + thousands of rows can often double when a suitable yield-per setting + (e.g. approximately 1000) is used, even with DBAPIs that buffer + rows (which are most). + + The :meth:`.Query.yield_per` method **is not compatible with most + eager loading schemes, including subqueryload and joinedload with + collections**. For this reason, it may be helpful to disable + eager loads, either unconditionally with + :meth:`.Query.enable_eagerloads`:: + + q = sess.query(Object).yield_per(100).enable_eagerloads(False) + + Or more selectively using :func:`.lazyload`; such as with + an asterisk to specify the default loader scheme:: + + q = sess.query(Object).yield_per(100).\ + options(lazyload('*'), joinedload(Object.some_related)) + + .. warning:: + + Use this method with caution; if the same instance is + present in more than one batch of rows, end-user changes + to attributes will be overwritten. + + In particular, it's usually impossible to use this setting + with eagerly loaded collections (i.e. any lazy='joined' or + 'subquery') since those collections will be cleared for a + new load when encountered in a subsequent result batch. + In the case of 'subquery' loading, the full result for all + rows is fetched which generally defeats the purpose of + :meth:`~sqlalchemy.orm.query.Query.yield_per`. + + Also note that while + :meth:`~sqlalchemy.orm.query.Query.yield_per` will set the + ``stream_results`` execution option to True, currently + this is only understood by + :mod:`~sqlalchemy.dialects.postgresql.psycopg2`, + :mod:`~sqlalchemy.dialects.mysql.mysqldb` and + :mod:`~sqlalchemy.dialects.mysql.pymysql` dialects + which will stream results using server side cursors + instead of pre-buffer all rows for this query. Other + DBAPIs **pre-buffer all rows** before making them + available. The memory use of raw database rows is much less + than that of an ORM-mapped object, but should still be taken into + consideration when benchmarking. + + .. seealso:: + + :meth:`.Query.enable_eagerloads` + + """ + self._yield_per = count + self._execution_options = self._execution_options.union( + {"stream_results": True, + "max_row_buffer": count}) + + def get(self, ident): + """Return an instance based on the given primary key identifier, + or ``None`` if not found. + + E.g.:: + + my_user = session.query(User).get(5) + + some_object = session.query(VersionedFoo).get((5, 10)) + + :meth:`~.Query.get` is special in that it provides direct + access to the identity map of the owning :class:`.Session`. + If the given primary key identifier is present + in the local identity map, the object is returned + directly from this collection and no SQL is emitted, + unless the object has been marked fully expired. + If not present, + a SELECT is performed in order to locate the object. + + :meth:`~.Query.get` also will perform a check if + the object is present in the identity map and + marked as expired - a SELECT + is emitted to refresh the object as well as to + ensure that the row is still present. + If not, :class:`~sqlalchemy.orm.exc.ObjectDeletedError` is raised. + + :meth:`~.Query.get` is only used to return a single + mapped instance, not multiple instances or + individual column constructs, and strictly + on a single primary key value. The originating + :class:`.Query` must be constructed in this way, + i.e. against a single mapped entity, + with no additional filtering criterion. Loading + options via :meth:`~.Query.options` may be applied + however, and will be used if the object is not + yet locally present. + + A lazy-loading, many-to-one attribute configured + by :func:`.relationship`, using a simple + foreign-key-to-primary-key criterion, will also use an + operation equivalent to :meth:`~.Query.get` in order to retrieve + the target value from the local identity map + before querying the database. See :doc:`/orm/loading_relationships` + for further details on relationship loading. + + :param ident: A scalar or tuple value representing + the primary key. For a composite primary key, + the order of identifiers corresponds in most cases + to that of the mapped :class:`.Table` object's + primary key columns. For a :func:`.mapper` that + was given the ``primary key`` argument during + construction, the order of identifiers corresponds + to the elements present in this collection. + + :return: The object instance, or ``None``. + + """ + return self._get_impl(ident, loading.load_on_ident) + + def _get_impl(self, ident, fallback_fn): + # convert composite types to individual args + if hasattr(ident, '__composite_values__'): + ident = ident.__composite_values__() + + ident = util.to_list(ident) + + mapper = self._only_full_mapper_zero("get") + + if len(ident) != len(mapper.primary_key): + raise sa_exc.InvalidRequestError( + "Incorrect number of values in identifier to formulate " + "primary key for query.get(); primary key columns are %s" % + ','.join("'%s'" % c for c in mapper.primary_key)) + + key = mapper.identity_key_from_primary_key(ident) + + if not self._populate_existing and \ + not mapper.always_refresh and \ + self._for_update_arg is None: + + instance = loading.get_from_identity( + self.session, key, attributes.PASSIVE_OFF) + if instance is not None: + self._get_existing_condition() + # reject calls for id in identity map but class + # mismatch. + if not issubclass(instance.__class__, mapper.class_): + return None + return instance + + return fallback_fn(self, key) + + @_generative() + def correlate(self, *args): + """Return a :class:`.Query` construct which will correlate the given + FROM clauses to that of an enclosing :class:`.Query` or + :func:`~.expression.select`. + + The method here accepts mapped classes, :func:`.aliased` constructs, + and :func:`.mapper` constructs as arguments, which are resolved into + expression constructs, in addition to appropriate expression + constructs. + + The correlation arguments are ultimately passed to + :meth:`.Select.correlate` after coercion to expression constructs. + + The correlation arguments take effect in such cases + as when :meth:`.Query.from_self` is used, or when + a subquery as returned by :meth:`.Query.subquery` is + embedded in another :func:`~.expression.select` construct. + + """ + + for s in args: + if s is None: + self._correlate = self._correlate.union([None]) + else: + self._correlate = self._correlate.union( + sql_util.surface_selectables(_interpret_as_from(s)) + ) + + @_generative() + def autoflush(self, setting): + """Return a Query with a specific 'autoflush' setting. + + Note that a Session with autoflush=False will + not autoflush, even if this flag is set to True at the + Query level. Therefore this flag is usually used only + to disable autoflush for a specific Query. + + """ + self._autoflush = setting + + @_generative() + def populate_existing(self): + """Return a :class:`.Query` that will expire and refresh all instances + as they are loaded, or reused from the current :class:`.Session`. + + :meth:`.populate_existing` does not improve behavior when + the ORM is used normally - the :class:`.Session` object's usual + behavior of maintaining a transaction and expiring all attributes + after rollback or commit handles object state automatically. + This method is not intended for general use. + + """ + self._populate_existing = True + + @_generative() + def _with_invoke_all_eagers(self, value): + """Set the 'invoke all eagers' flag which causes joined- and + subquery loaders to traverse into already-loaded related objects + and collections. + + Default is that of :attr:`.Query._invoke_all_eagers`. + + """ + self._invoke_all_eagers = value + + def with_parent(self, instance, property=None): + """Add filtering criterion that relates the given instance + to a child object or collection, using its attribute state + as well as an established :func:`.relationship()` + configuration. + + The method uses the :func:`.with_parent` function to generate + the clause, the result of which is passed to :meth:`.Query.filter`. + + Parameters are the same as :func:`.with_parent`, with the exception + that the given property can be None, in which case a search is + performed against this :class:`.Query` object's target mapper. + + """ + + if property is None: + mapper_zero = self._mapper_zero() + + mapper = object_mapper(instance) + + for prop in mapper.iterate_properties: + if isinstance(prop, properties.RelationshipProperty) and \ + prop.mapper is mapper_zero: + property = prop + break + else: + raise sa_exc.InvalidRequestError( + "Could not locate a property which relates instances " + "of class '%s' to instances of class '%s'" % + ( + self._mapper_zero().class_.__name__, + instance.__class__.__name__) + ) + + return self.filter(with_parent(instance, property)) + + @_generative() + def add_entity(self, entity, alias=None): + """add a mapped entity to the list of result columns + to be returned.""" + + if alias is not None: + entity = aliased(entity, alias) + + self._entities = list(self._entities) + m = _MapperEntity(self, entity) + self._set_entity_selectables([m]) + + @_generative() + def with_session(self, session): + """Return a :class:`.Query` that will use the given :class:`.Session`. + + While the :class:`.Query` object is normally instantiated using the + :meth:`.Session.query` method, it is legal to build the :class:`.Query` + directly without necessarily using a :class:`.Session`. Such a + :class:`.Query` object, or any :class:`.Query` already associated + with a different :class:`.Session`, can produce a new :class:`.Query` + object associated with a target session using this method:: + + from sqlalchemy.orm import Query + + query = Query([MyClass]).filter(MyClass.id == 5) + + result = query.with_session(my_session).one() + + """ + + self.session = session + + def from_self(self, *entities): + r"""return a Query that selects from this Query's + SELECT statement. + + :meth:`.Query.from_self` essentially turns the SELECT statement + into a SELECT of itself. Given a query such as:: + + q = session.query(User).filter(User.name.like('e%')) + + Given the :meth:`.Query.from_self` version:: + + q = session.query(User).filter(User.name.like('e%')).from_self() + + This query renders as: + + .. sourcecode:: sql + + SELECT anon_1.user_id AS anon_1_user_id, + anon_1.user_name AS anon_1_user_name + FROM (SELECT "user".id AS user_id, "user".name AS user_name + FROM "user" + WHERE "user".name LIKE :name_1) AS anon_1 + + There are lots of cases where :meth:`.Query.from_self` may be useful. + A simple one is where above, we may want to apply a row LIMIT to + the set of user objects we query against, and then apply additional + joins against that row-limited set:: + + q = session.query(User).filter(User.name.like('e%')).\ + limit(5).from_self().\ + join(User.addresses).filter(Address.email.like('q%')) + + The above query joins to the ``Address`` entity but only against the + first five results of the ``User`` query: + + .. sourcecode:: sql + + SELECT anon_1.user_id AS anon_1_user_id, + anon_1.user_name AS anon_1_user_name + FROM (SELECT "user".id AS user_id, "user".name AS user_name + FROM "user" + WHERE "user".name LIKE :name_1 + LIMIT :param_1) AS anon_1 + JOIN address ON anon_1.user_id = address.user_id + WHERE address.email LIKE :email_1 + + **Automatic Aliasing** + + Another key behavior of :meth:`.Query.from_self` is that it applies + **automatic aliasing** to the entities inside the subquery, when + they are referenced on the outside. Above, if we continue to + refer to the ``User`` entity without any additional aliasing applied + to it, those references wil be in terms of the subquery:: + + q = session.query(User).filter(User.name.like('e%')).\ + limit(5).from_self().\ + join(User.addresses).filter(Address.email.like('q%')).\ + order_by(User.name) + + The ORDER BY against ``User.name`` is aliased to be in terms of the + inner subquery: + + .. sourcecode:: sql + + SELECT anon_1.user_id AS anon_1_user_id, + anon_1.user_name AS anon_1_user_name + FROM (SELECT "user".id AS user_id, "user".name AS user_name + FROM "user" + WHERE "user".name LIKE :name_1 + LIMIT :param_1) AS anon_1 + JOIN address ON anon_1.user_id = address.user_id + WHERE address.email LIKE :email_1 ORDER BY anon_1.user_name + + The automatic aliasing feature only works in a **limited** way, + for simple filters and orderings. More ambitious constructions + such as referring to the entity in joins should prefer to use + explicit subquery objects, typically making use of the + :meth:`.Query.subquery` method to produce an explicit subquery object. + Always test the structure of queries by viewing the SQL to ensure + a particular structure does what's expected! + + **Changing the Entities** + + :meth:`.Query.from_self` also includes the ability to modify what + columns are being queried. In our example, we want ``User.id`` + to be queried by the inner query, so that we can join to the + ``Address`` entity on the outside, but we only wanted the outer + query to return the ``Address.email`` column:: + + q = session.query(User).filter(User.name.like('e%')).\ + limit(5).from_self(Address.email).\ + join(User.addresses).filter(Address.email.like('q%')) + + yielding: + + .. sourcecode:: sql + + SELECT address.email AS address_email + FROM (SELECT "user".id AS user_id, "user".name AS user_name + FROM "user" + WHERE "user".name LIKE :name_1 + LIMIT :param_1) AS anon_1 + JOIN address ON anon_1.user_id = address.user_id + WHERE address.email LIKE :email_1 + + **Looking out for Inner / Outer Columns** + + Keep in mind that when referring to columns that originate from + inside the subquery, we need to ensure they are present in the + columns clause of the subquery itself; this is an ordinary aspect of + SQL. For example, if we wanted to load from a joined entity inside + the subquery using :func:`.contains_eager`, we need to add those + columns. Below illustrates a join of ``Address`` to ``User``, + then a subquery, and then we'd like :func:`.contains_eager` to access + the ``User`` columns:: + + q = session.query(Address).join(Address.user).\ + filter(User.name.like('e%')) + + q = q.add_entity(User).from_self().\ + options(contains_eager(Address.user)) + + We use :meth:`.Query.add_entity` above **before** we call + :meth:`.Query.from_self` so that the ``User`` columns are present + in the inner subquery, so that they are available to the + :func:`.contains_eager` modifier we are using on the outside, + producing: + + .. sourcecode:: sql + + SELECT anon_1.address_id AS anon_1_address_id, + anon_1.address_email AS anon_1_address_email, + anon_1.address_user_id AS anon_1_address_user_id, + anon_1.user_id AS anon_1_user_id, + anon_1.user_name AS anon_1_user_name + FROM ( + SELECT address.id AS address_id, + address.email AS address_email, + address.user_id AS address_user_id, + "user".id AS user_id, + "user".name AS user_name + FROM address JOIN "user" ON "user".id = address.user_id + WHERE "user".name LIKE :name_1) AS anon_1 + + If we didn't call ``add_entity(User)``, but still asked + :func:`.contains_eager` to load the ``User`` entity, it would be + forced to add the table on the outside without the correct + join criteria - note the ``anon1, "user"`` phrase at + the end: + + .. sourcecode:: sql + + -- incorrect query + SELECT anon_1.address_id AS anon_1_address_id, + anon_1.address_email AS anon_1_address_email, + anon_1.address_user_id AS anon_1_address_user_id, + "user".id AS user_id, + "user".name AS user_name + FROM ( + SELECT address.id AS address_id, + address.email AS address_email, + address.user_id AS address_user_id + FROM address JOIN "user" ON "user".id = address.user_id + WHERE "user".name LIKE :name_1) AS anon_1, "user" + + :param \*entities: optional list of entities which will replace + those being selected. + + """ + fromclause = self.with_labels().enable_eagerloads(False).\ + statement.correlate(None) + q = self._from_selectable(fromclause) + q._enable_single_crit = False + q._select_from_entity = self._entity_zero() + if entities: + q._set_entities(entities) + return q + + @_generative() + def _set_enable_single_crit(self, val): + self._enable_single_crit = val + + @_generative() + def _from_selectable(self, fromclause): + for attr in ( + '_statement', '_criterion', + '_order_by', '_group_by', + '_limit', '_offset', + '_joinpath', '_joinpoint', + '_distinct', '_having', + '_prefixes', '_suffixes' + ): + self.__dict__.pop(attr, None) + self._set_select_from([fromclause], True) + + # this enables clause adaptation for non-ORM + # expressions. + self._orm_only_from_obj_alias = False + + old_entities = self._entities + self._entities = [] + for e in old_entities: + e.adapt_to_selectable(self, self._from_obj[0]) + + def values(self, *columns): + """Return an iterator yielding result tuples corresponding + to the given list of columns""" + + if not columns: + return iter(()) + q = self._clone() + q._set_entities(columns, entity_wrapper=_ColumnEntity) + if not q._yield_per: + q._yield_per = 10 + return iter(q) + _values = values + + def value(self, column): + """Return a scalar result corresponding to the given + column expression.""" + try: + return next(self.values(column))[0] + except StopIteration: + return None + + @_generative() + def with_entities(self, *entities): + """Return a new :class:`.Query` replacing the SELECT list with the + given entities. + + e.g.:: + + # Users, filtered on some arbitrary criterion + # and then ordered by related email address + q = session.query(User).\ + join(User.address).\ + filter(User.name.like('%ed%')).\ + order_by(Address.email) + + # given *only* User.id==5, Address.email, and 'q', what + # would the *next* User in the result be ? + subq = q.with_entities(Address.email).\ + order_by(None).\ + filter(User.id==5).\ + subquery() + q = q.join((subq, subq.c.email < Address.email)).\ + limit(1) + + .. versionadded:: 0.6.5 + + """ + self._set_entities(entities) + + @_generative() + def add_columns(self, *column): + """Add one or more column expressions to the list + of result columns to be returned.""" + + self._entities = list(self._entities) + l = len(self._entities) + for c in column: + _ColumnEntity(self, c) + # _ColumnEntity may add many entities if the + # given arg is a FROM clause + self._set_entity_selectables(self._entities[l:]) + + @util.pending_deprecation("0.7", + ":meth:`.add_column` is superseded " + "by :meth:`.add_columns`", + False) + def add_column(self, column): + """Add a column expression to the list of result columns to be + returned. + + Pending deprecation: :meth:`.add_column` will be superseded by + :meth:`.add_columns`. + + """ + return self.add_columns(column) + + def options(self, *args): + """Return a new Query object, applying the given list of + mapper options. + + Most supplied options regard changing how column- and + relationship-mapped attributes are loaded. See the sections + :ref:`deferred` and :doc:`/orm/loading_relationships` for reference + documentation. + + """ + return self._options(False, *args) + + def _conditional_options(self, *args): + return self._options(True, *args) + + @_generative() + def _options(self, conditional, *args): + # most MapperOptions write to the '_attributes' dictionary, + # so copy that as well + self._attributes = self._attributes.copy() + opts = tuple(util.flatten_iterator(args)) + self._with_options = self._with_options + opts + if conditional: + for opt in opts: + opt.process_query_conditionally(self) + else: + for opt in opts: + opt.process_query(self) + + def with_transformation(self, fn): + """Return a new :class:`.Query` object transformed by + the given function. + + E.g.:: + + def filter_something(criterion): + def transform(q): + return q.filter(criterion) + return transform + + q = q.with_transformation(filter_something(x==5)) + + This allows ad-hoc recipes to be created for :class:`.Query` + objects. See the example at :ref:`hybrid_transformers`. + + .. versionadded:: 0.7.4 + + """ + return fn(self) + + @_generative() + def with_hint(self, selectable, text, dialect_name='*'): + """Add an indexing or other executional context + hint for the given entity or selectable to + this :class:`.Query`. + + Functionality is passed straight through to + :meth:`~sqlalchemy.sql.expression.Select.with_hint`, + with the addition that ``selectable`` can be a + :class:`.Table`, :class:`.Alias`, or ORM entity / mapped class + /etc. + + .. seealso:: + + :meth:`.Query.with_statement_hint` + + """ + if selectable is not None: + selectable = inspect(selectable).selectable + + self._with_hints += ((selectable, text, dialect_name),) + + def with_statement_hint(self, text, dialect_name='*'): + """add a statement hint to this :class:`.Select`. + + This method is similar to :meth:`.Select.with_hint` except that + it does not require an individual table, and instead applies to the + statement as a whole. + + This feature calls down into :meth:`.Select.with_statement_hint`. + + .. versionadded:: 1.0.0 + + .. seealso:: + + :meth:`.Query.with_hint` + + """ + return self.with_hint(None, text, dialect_name) + + @_generative() + def execution_options(self, **kwargs): + """ Set non-SQL options which take effect during execution. + + The options are the same as those accepted by + :meth:`.Connection.execution_options`. + + Note that the ``stream_results`` execution option is enabled + automatically if the :meth:`~sqlalchemy.orm.query.Query.yield_per()` + method is used. + + """ + self._execution_options = self._execution_options.union(kwargs) + + @_generative() + def with_lockmode(self, mode): + """Return a new :class:`.Query` object with the specified "locking mode", + which essentially refers to the ``FOR UPDATE`` clause. + + .. deprecated:: 0.9.0 superseded by :meth:`.Query.with_for_update`. + + :param mode: a string representing the desired locking mode. + Valid values are: + + * ``None`` - translates to no lockmode + + * ``'update'`` - translates to ``FOR UPDATE`` + (standard SQL, supported by most dialects) + + * ``'update_nowait'`` - translates to ``FOR UPDATE NOWAIT`` + (supported by Oracle, PostgreSQL 8.1 upwards) + + * ``'read'`` - translates to ``LOCK IN SHARE MODE`` (for MySQL), + and ``FOR SHARE`` (for PostgreSQL) + + .. seealso:: + + :meth:`.Query.with_for_update` - improved API for + specifying the ``FOR UPDATE`` clause. + + """ + self._for_update_arg = LockmodeArg.parse_legacy_query(mode) + + @_generative() + def with_for_update(self, read=False, nowait=False, of=None, + skip_locked=False, key_share=False): + """return a new :class:`.Query` with the specified options for the + ``FOR UPDATE`` clause. + + The behavior of this method is identical to that of + :meth:`.SelectBase.with_for_update`. When called with no arguments, + the resulting ``SELECT`` statement will have a ``FOR UPDATE`` clause + appended. When additional arguments are specified, backend-specific + options such as ``FOR UPDATE NOWAIT`` or ``LOCK IN SHARE MODE`` + can take effect. + + E.g.:: + + q = sess.query(User).with_for_update(nowait=True, of=User) + + The above query on a PostgreSQL backend will render like:: + + SELECT users.id AS users_id FROM users FOR UPDATE OF users NOWAIT + + .. versionadded:: 0.9.0 :meth:`.Query.with_for_update` supersedes + the :meth:`.Query.with_lockmode` method. + + .. seealso:: + + :meth:`.GenerativeSelect.with_for_update` - Core level method with + full argument and behavioral description. + + """ + self._for_update_arg = LockmodeArg(read=read, nowait=nowait, of=of, + skip_locked=skip_locked, + key_share=key_share) + + @_generative() + def params(self, *args, **kwargs): + r"""add values for bind parameters which may have been + specified in filter(). + + parameters may be specified using \**kwargs, or optionally a single + dictionary as the first positional argument. The reason for both is + that \**kwargs is convenient, however some parameter dictionaries + contain unicode keys in which case \**kwargs cannot be used. + + """ + if len(args) == 1: + kwargs.update(args[0]) + elif len(args) > 0: + raise sa_exc.ArgumentError( + "params() takes zero or one positional argument, " + "which is a dictionary.") + self._params = self._params.copy() + self._params.update(kwargs) + + @_generative(_no_statement_condition, _no_limit_offset) + def filter(self, *criterion): + r"""apply the given filtering criterion to a copy + of this :class:`.Query`, using SQL expressions. + + e.g.:: + + session.query(MyClass).filter(MyClass.name == 'some name') + + Multiple criteria may be specified as comma separated; the effect + is that they will be joined together using the :func:`.and_` + function:: + + session.query(MyClass).\ + filter(MyClass.name == 'some name', MyClass.id > 5) + + The criterion is any SQL expression object applicable to the + WHERE clause of a select. String expressions are coerced + into SQL expression constructs via the :func:`.text` construct. + + .. seealso:: + + :meth:`.Query.filter_by` - filter on keyword expressions. + + """ + for criterion in list(criterion): + criterion = expression._expression_literal_as_text(criterion) + + criterion = self._adapt_clause(criterion, True, True) + + if self._criterion is not None: + self._criterion = self._criterion & criterion + else: + self._criterion = criterion + + def filter_by(self, **kwargs): + r"""apply the given filtering criterion to a copy + of this :class:`.Query`, using keyword expressions. + + e.g.:: + + session.query(MyClass).filter_by(name = 'some name') + + Multiple criteria may be specified as comma separated; the effect + is that they will be joined together using the :func:`.and_` + function:: + + session.query(MyClass).\ + filter_by(name = 'some name', id = 5) + + The keyword expressions are extracted from the primary + entity of the query, or the last entity that was the + target of a call to :meth:`.Query.join`. + + .. seealso:: + + :meth:`.Query.filter` - filter on SQL expressions. + + """ + + clauses = [_entity_descriptor(self._joinpoint_zero(), key) == value + for key, value in kwargs.items()] + return self.filter(sql.and_(*clauses)) + + @_generative(_no_statement_condition, _no_limit_offset) + def order_by(self, *criterion): + """apply one or more ORDER BY criterion to the query and return + the newly resulting ``Query`` + + All existing ORDER BY settings can be suppressed by + passing ``None`` - this will suppress any ORDER BY configured + on mappers as well. + + Alternatively, passing False will reset ORDER BY and additionally + re-allow default mapper.order_by to take place. Note mapper.order_by + is deprecated. + + """ + + if len(criterion) == 1: + if criterion[0] is False: + if '_order_by' in self.__dict__: + self._order_by = False + return + if criterion[0] is None: + self._order_by = None + return + + criterion = self._adapt_col_list(criterion) + + if self._order_by is False or self._order_by is None: + self._order_by = criterion + else: + self._order_by = self._order_by + criterion + + @_generative(_no_statement_condition, _no_limit_offset) + def group_by(self, *criterion): + """apply one or more GROUP BY criterion to the query and return + the newly resulting :class:`.Query` + + All existing GROUP BY settings can be suppressed by + passing ``None`` - this will suppress any GROUP BY configured + on mappers as well. + + .. versionadded:: 1.1 GROUP BY can be cancelled by passing None, + in the same way as ORDER BY. + + """ + + if len(criterion) == 1: + if criterion[0] is None: + self._group_by = False + return + + criterion = list(chain(*[_orm_columns(c) for c in criterion])) + criterion = self._adapt_col_list(criterion) + + if self._group_by is False: + self._group_by = criterion + else: + self._group_by = self._group_by + criterion + + @_generative(_no_statement_condition, _no_limit_offset) + def having(self, criterion): + r"""apply a HAVING criterion to the query and return the + newly resulting :class:`.Query`. + + :meth:`~.Query.having` is used in conjunction with + :meth:`~.Query.group_by`. + + HAVING criterion makes it possible to use filters on aggregate + functions like COUNT, SUM, AVG, MAX, and MIN, eg.:: + + q = session.query(User.id).\ + join(User.addresses).\ + group_by(User.id).\ + having(func.count(Address.id) > 2) + + """ + + criterion = expression._expression_literal_as_text(criterion) + + if criterion is not None and \ + not isinstance(criterion, sql.ClauseElement): + raise sa_exc.ArgumentError( + "having() argument must be of type " + "sqlalchemy.sql.ClauseElement or string") + + criterion = self._adapt_clause(criterion, True, True) + + if self._having is not None: + self._having = self._having & criterion + else: + self._having = criterion + + def _set_op(self, expr_fn, *q): + return self._from_selectable( + expr_fn(*([self] + list(q))) + )._set_enable_single_crit(False) + + def union(self, *q): + """Produce a UNION of this Query against one or more queries. + + e.g.:: + + q1 = sess.query(SomeClass).filter(SomeClass.foo=='bar') + q2 = sess.query(SomeClass).filter(SomeClass.bar=='foo') + + q3 = q1.union(q2) + + The method accepts multiple Query objects so as to control + the level of nesting. A series of ``union()`` calls such as:: + + x.union(y).union(z).all() + + will nest on each ``union()``, and produces:: + + SELECT * FROM (SELECT * FROM (SELECT * FROM X UNION + SELECT * FROM y) UNION SELECT * FROM Z) + + Whereas:: + + x.union(y, z).all() + + produces:: + + SELECT * FROM (SELECT * FROM X UNION SELECT * FROM y UNION + SELECT * FROM Z) + + Note that many database backends do not allow ORDER BY to + be rendered on a query called within UNION, EXCEPT, etc. + To disable all ORDER BY clauses including those configured + on mappers, issue ``query.order_by(None)`` - the resulting + :class:`.Query` object will not render ORDER BY within + its SELECT statement. + + """ + return self._set_op(expression.union, *q) + + def union_all(self, *q): + """Produce a UNION ALL of this Query against one or more queries. + + Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`. See + that method for usage examples. + + """ + return self._set_op(expression.union_all, *q) + + def intersect(self, *q): + """Produce an INTERSECT of this Query against one or more queries. + + Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`. See + that method for usage examples. + + """ + return self._set_op(expression.intersect, *q) + + def intersect_all(self, *q): + """Produce an INTERSECT ALL of this Query against one or more queries. + + Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`. See + that method for usage examples. + + """ + return self._set_op(expression.intersect_all, *q) + + def except_(self, *q): + """Produce an EXCEPT of this Query against one or more queries. + + Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`. See + that method for usage examples. + + """ + return self._set_op(expression.except_, *q) + + def except_all(self, *q): + """Produce an EXCEPT ALL of this Query against one or more queries. + + Works the same way as :meth:`~sqlalchemy.orm.query.Query.union`. See + that method for usage examples. + + """ + return self._set_op(expression.except_all, *q) + + def join(self, *props, **kwargs): + r"""Create a SQL JOIN against this :class:`.Query` object's criterion + and apply generatively, returning the newly resulting :class:`.Query`. + + **Simple Relationship Joins** + + Consider a mapping between two classes ``User`` and ``Address``, + with a relationship ``User.addresses`` representing a collection + of ``Address`` objects associated with each ``User``. The most + common usage of :meth:`~.Query.join` is to create a JOIN along this + relationship, using the ``User.addresses`` attribute as an indicator + for how this should occur:: + + q = session.query(User).join(User.addresses) + + Where above, the call to :meth:`~.Query.join` along ``User.addresses`` + will result in SQL equivalent to:: + + SELECT user.* FROM user JOIN address ON user.id = address.user_id + + In the above example we refer to ``User.addresses`` as passed to + :meth:`~.Query.join` as the *on clause*, that is, it indicates + how the "ON" portion of the JOIN should be constructed. For a + single-entity query such as the one above (i.e. we start by selecting + only from ``User`` and nothing else), the relationship can also be + specified by its string name:: + + q = session.query(User).join("addresses") + + :meth:`~.Query.join` can also accommodate multiple + "on clause" arguments to produce a chain of joins, such as below + where a join across four related entities is constructed:: + + q = session.query(User).join("orders", "items", "keywords") + + The above would be shorthand for three separate calls to + :meth:`~.Query.join`, each using an explicit attribute to indicate + the source entity:: + + q = session.query(User).\ + join(User.orders).\ + join(Order.items).\ + join(Item.keywords) + + **Joins to a Target Entity or Selectable** + + A second form of :meth:`~.Query.join` allows any mapped entity + or core selectable construct as a target. In this usage, + :meth:`~.Query.join` will attempt + to create a JOIN along the natural foreign key relationship between + two entities:: + + q = session.query(User).join(Address) + + The above calling form of :meth:`~.Query.join` will raise an error if + either there are no foreign keys between the two entities, or if + there are multiple foreign key linkages between them. In the + above calling form, :meth:`~.Query.join` is called upon to + create the "on clause" automatically for us. The target can + be any mapped entity or selectable, such as a :class:`.Table`:: + + q = session.query(User).join(addresses_table) + + **Joins to a Target with an ON Clause** + + The third calling form allows both the target entity as well + as the ON clause to be passed explicitly. Suppose for + example we wanted to join to ``Address`` twice, using + an alias the second time. We use :func:`~sqlalchemy.orm.aliased` + to create a distinct alias of ``Address``, and join + to it using the ``target, onclause`` form, so that the + alias can be specified explicitly as the target along with + the relationship to instruct how the ON clause should proceed:: + + a_alias = aliased(Address) + + q = session.query(User).\ + join(User.addresses).\ + join(a_alias, User.addresses).\ + filter(Address.email_address=='ed@foo.com').\ + filter(a_alias.email_address=='ed@bar.com') + + Where above, the generated SQL would be similar to:: + + SELECT user.* FROM user + JOIN address ON user.id = address.user_id + JOIN address AS address_1 ON user.id=address_1.user_id + WHERE address.email_address = :email_address_1 + AND address_1.email_address = :email_address_2 + + The two-argument calling form of :meth:`~.Query.join` + also allows us to construct arbitrary joins with SQL-oriented + "on clause" expressions, not relying upon configured relationships + at all. Any SQL expression can be passed as the ON clause + when using the two-argument form, which should refer to the target + entity in some way as well as an applicable source entity:: + + q = session.query(User).join(Address, User.id==Address.user_id) + + .. versionchanged:: 0.7 + In SQLAlchemy 0.6 and earlier, the two argument form of + :meth:`~.Query.join` requires the usage of a tuple: + ``query(User).join((Address, User.id==Address.user_id))``\ . + This calling form is accepted in 0.7 and further, though + is not necessary unless multiple join conditions are passed to + a single :meth:`~.Query.join` call, which itself is also not + generally necessary as it is now equivalent to multiple + calls (this wasn't always the case). + + **Advanced Join Targeting and Adaption** + + There is a lot of flexibility in what the "target" can be when using + :meth:`~.Query.join`. As noted previously, it also accepts + :class:`.Table` constructs and other selectables such as + :func:`.alias` and :func:`.select` constructs, with either the one + or two-argument forms:: + + addresses_q = select([Address.user_id]).\ + where(Address.email_address.endswith("@bar.com")).\ + alias() + + q = session.query(User).\ + join(addresses_q, addresses_q.c.user_id==User.id) + + :meth:`~.Query.join` also features the ability to *adapt* a + :meth:`~sqlalchemy.orm.relationship` -driven ON clause to the target + selectable. Below we construct a JOIN from ``User`` to a subquery + against ``Address``, allowing the relationship denoted by + ``User.addresses`` to *adapt* itself to the altered target:: + + address_subq = session.query(Address).\ + filter(Address.email_address == 'ed@foo.com').\ + subquery() + + q = session.query(User).join(address_subq, User.addresses) + + Producing SQL similar to:: + + SELECT user.* FROM user + JOIN ( + SELECT address.id AS id, + address.user_id AS user_id, + address.email_address AS email_address + FROM address + WHERE address.email_address = :email_address_1 + ) AS anon_1 ON user.id = anon_1.user_id + + The above form allows one to fall back onto an explicit ON + clause at any time:: + + q = session.query(User).\ + join(address_subq, User.id==address_subq.c.user_id) + + **Controlling what to Join From** + + While :meth:`~.Query.join` exclusively deals with the "right" + side of the JOIN, we can also control the "left" side, in those + cases where it's needed, using :meth:`~.Query.select_from`. + Below we construct a query against ``Address`` but can still + make usage of ``User.addresses`` as our ON clause by instructing + the :class:`.Query` to select first from the ``User`` + entity:: + + q = session.query(Address).select_from(User).\ + join(User.addresses).\ + filter(User.name == 'ed') + + Which will produce SQL similar to:: + + SELECT address.* FROM user + JOIN address ON user.id=address.user_id + WHERE user.name = :name_1 + + **Constructing Aliases Anonymously** + + :meth:`~.Query.join` can construct anonymous aliases + using the ``aliased=True`` flag. This feature is useful + when a query is being joined algorithmically, such as + when querying self-referentially to an arbitrary depth:: + + q = session.query(Node).\ + join("children", "children", aliased=True) + + When ``aliased=True`` is used, the actual "alias" construct + is not explicitly available. To work with it, methods such as + :meth:`.Query.filter` will adapt the incoming entity to + the last join point:: + + q = session.query(Node).\ + join("children", "children", aliased=True).\ + filter(Node.name == 'grandchild 1') + + When using automatic aliasing, the ``from_joinpoint=True`` + argument can allow a multi-node join to be broken into + multiple calls to :meth:`~.Query.join`, so that + each path along the way can be further filtered:: + + q = session.query(Node).\ + join("children", aliased=True).\ + filter(Node.name='child 1').\ + join("children", aliased=True, from_joinpoint=True).\ + filter(Node.name == 'grandchild 1') + + The filtering aliases above can then be reset back to the + original ``Node`` entity using :meth:`~.Query.reset_joinpoint`:: + + q = session.query(Node).\ + join("children", "children", aliased=True).\ + filter(Node.name == 'grandchild 1').\ + reset_joinpoint().\ + filter(Node.name == 'parent 1) + + For an example of ``aliased=True``, see the distribution + example :ref:`examples_xmlpersistence` which illustrates + an XPath-like query system using algorithmic joins. + + :param \*props: A collection of one or more join conditions, + each consisting of a relationship-bound attribute or string + relationship name representing an "on clause", or a single + target entity, or a tuple in the form of ``(target, onclause)``. + A special two-argument calling form of the form ``target, onclause`` + is also accepted. + :param aliased=False: If True, indicate that the JOIN target should be + anonymously aliased. Subsequent calls to :meth:`~.Query.filter` + and similar will adapt the incoming criterion to the target + alias, until :meth:`~.Query.reset_joinpoint` is called. + :param isouter=False: If True, the join used will be a left outer join, + just as if the :meth:`.Query.outerjoin` method were called. This + flag is here to maintain consistency with the same flag as accepted + by :meth:`.FromClause.join` and other Core constructs. + + + .. versionadded:: 1.0.0 + + :param full=False: render FULL OUTER JOIN; implies ``isouter``. + + .. versionadded:: 1.1 + + :param from_joinpoint=False: When using ``aliased=True``, a setting + of True here will cause the join to be from the most recent + joined target, rather than starting back from the original + FROM clauses of the query. + + .. seealso:: + + :ref:`ormtutorial_joins` in the ORM tutorial. + + :ref:`inheritance_toplevel` for details on how + :meth:`~.Query.join` is used for inheritance relationships. + + :func:`.orm.join` - a standalone ORM-level join function, + used internally by :meth:`.Query.join`, which in previous + SQLAlchemy versions was the primary ORM-level joining interface. + + """ + aliased, from_joinpoint, isouter, full = kwargs.pop('aliased', False),\ + kwargs.pop('from_joinpoint', False),\ + kwargs.pop('isouter', False),\ + kwargs.pop('full', False) + if kwargs: + raise TypeError("unknown arguments: %s" % + ', '.join(sorted(kwargs))) + return self._join(props, + outerjoin=isouter, full=full, + create_aliases=aliased, + from_joinpoint=from_joinpoint) + + def outerjoin(self, *props, **kwargs): + """Create a left outer join against this ``Query`` object's criterion + and apply generatively, returning the newly resulting ``Query``. + + Usage is the same as the ``join()`` method. + + """ + aliased, from_joinpoint, full = kwargs.pop('aliased', False), \ + kwargs.pop('from_joinpoint', False), \ + kwargs.pop('full', False) + if kwargs: + raise TypeError("unknown arguments: %s" % + ', '.join(sorted(kwargs))) + return self._join(props, + outerjoin=True, full=full, create_aliases=aliased, + from_joinpoint=from_joinpoint) + + def _update_joinpoint(self, jp): + self._joinpoint = jp + # copy backwards to the root of the _joinpath + # dict, so that no existing dict in the path is mutated + while 'prev' in jp: + f, prev = jp['prev'] + prev = prev.copy() + prev[f] = jp + jp['prev'] = (f, prev) + jp = prev + self._joinpath = jp + + @_generative(_no_statement_condition, _no_limit_offset) + def _join(self, keys, outerjoin, full, create_aliases, from_joinpoint): + """consumes arguments from join() or outerjoin(), places them into a + consistent format with which to form the actual JOIN constructs. + + """ + + if not from_joinpoint: + self._reset_joinpoint() + + if len(keys) == 2 and \ + isinstance(keys[0], (expression.FromClause, + type, AliasedClass)) and \ + isinstance(keys[1], (str, expression.ClauseElement, + interfaces.PropComparator)): + # detect 2-arg form of join and + # convert to a tuple. + keys = (keys,) + + keylist = util.to_list(keys) + for idx, arg1 in enumerate(keylist): + if isinstance(arg1, tuple): + # "tuple" form of join, multiple + # tuples are accepted as well. The simpler + # "2-arg" form is preferred. May deprecate + # the "tuple" usage. + arg1, arg2 = arg1 + else: + arg2 = None + + # determine onclause/right_entity. there + # is a little bit of legacy behavior still at work here + # which means they might be in either order. may possibly + # lock this down to (right_entity, onclause) in 0.6. + if isinstance( + arg1, (interfaces.PropComparator, util.string_types)): + right_entity, onclause = arg2, arg1 + else: + right_entity, onclause = arg1, arg2 + + left_entity = prop = None + + if isinstance(onclause, interfaces.PropComparator): + of_type = getattr(onclause, '_of_type', None) + else: + of_type = None + + if isinstance(onclause, util.string_types): + left_entity = self._joinpoint_zero() + + descriptor = _entity_descriptor(left_entity, onclause) + onclause = descriptor + + # check for q.join(Class.propname, from_joinpoint=True) + # and Class is that of the current joinpoint + elif from_joinpoint and \ + isinstance(onclause, interfaces.PropComparator): + left_entity = onclause._parententity + + info = inspect(self._joinpoint_zero()) + left_mapper, left_selectable, left_is_aliased = \ + getattr(info, 'mapper', None), \ + info.selectable, \ + getattr(info, 'is_aliased_class', None) + + if left_mapper is left_entity: + left_entity = self._joinpoint_zero() + descriptor = _entity_descriptor(left_entity, + onclause.key) + onclause = descriptor + + if isinstance(onclause, interfaces.PropComparator): + if right_entity is None: + if of_type: + right_entity = of_type + else: + right_entity = onclause.property.mapper + + left_entity = onclause._parententity + + prop = onclause.property + if not isinstance(onclause, attributes.QueryableAttribute): + onclause = prop + + if not create_aliases: + # check for this path already present. + # don't render in that case. + edge = (left_entity, right_entity, prop.key) + if edge in self._joinpoint: + # The child's prev reference might be stale -- + # it could point to a parent older than the + # current joinpoint. If this is the case, + # then we need to update it and then fix the + # tree's spine with _update_joinpoint. Copy + # and then mutate the child, which might be + # shared by a different query object. + jp = self._joinpoint[edge].copy() + jp['prev'] = (edge, self._joinpoint) + self._update_joinpoint(jp) + + if idx == len(keylist) - 1: + util.warn( + "Pathed join target %s has already " + "been joined to; skipping" % prop) + continue + + elif onclause is not None and right_entity is None: + # TODO: no coverage here + raise NotImplementedError("query.join(a==b) not supported.") + + self._join_left_to_right( + left_entity, + right_entity, onclause, + outerjoin, full, create_aliases, prop) + + def _join_left_to_right(self, left, right, + onclause, outerjoin, full, create_aliases, prop): + """append a JOIN to the query's from clause.""" + + self._polymorphic_adapters = self._polymorphic_adapters.copy() + + if left is None: + if self._from_obj: + left = self._from_obj[0] + elif self._entities: + left = self._entities[0].entity_zero_or_selectable + + if left is None: + if self._entities: + problem = "Don't know how to join from %s" % self._entities[0] + else: + problem = "No entities to join from" + + raise sa_exc.InvalidRequestError( + "%s; please use " + "select_from() to establish the left " + "entity/selectable of this join" % problem) + + if left is right and \ + not create_aliases: + raise sa_exc.InvalidRequestError( + "Can't construct a join from %s to %s, they " + "are the same entity" % + (left, right)) + + l_info = inspect(left) + r_info = inspect(right) + + overlap = False + if not create_aliases: + right_mapper = getattr(r_info, "mapper", None) + # if the target is a joined inheritance mapping, + # be more liberal about auto-aliasing. + if right_mapper and ( + right_mapper.with_polymorphic or + isinstance(right_mapper.mapped_table, expression.Join) + ): + for from_obj in self._from_obj or [l_info.selectable]: + if sql_util.selectables_overlap( + l_info.selectable, from_obj) and \ + sql_util.selectables_overlap( + from_obj, r_info.selectable): + overlap = True + break + + if (overlap or not create_aliases) and \ + l_info.selectable is r_info.selectable: + raise sa_exc.InvalidRequestError( + "Can't join table/selectable '%s' to itself" % + l_info.selectable) + + right, onclause = self._prepare_right_side( + r_info, right, onclause, + create_aliases, + prop, overlap) + + # if joining on a MapperProperty path, + # track the path to prevent redundant joins + if not create_aliases and prop: + self._update_joinpoint({ + '_joinpoint_entity': right, + 'prev': ((left, right, prop.key), self._joinpoint) + }) + else: + self._joinpoint = {'_joinpoint_entity': right} + + self._join_to_left(l_info, left, right, onclause, outerjoin, full) + + def _prepare_right_side(self, r_info, right, onclause, create_aliases, + prop, overlap): + info = r_info + + right_mapper, right_selectable, right_is_aliased = \ + getattr(info, 'mapper', None), \ + info.selectable, \ + getattr(info, 'is_aliased_class', False) + + if right_mapper: + self._join_entities += (info, ) + + if right_mapper and prop and \ + not right_mapper.common_parent(prop.mapper): + raise sa_exc.InvalidRequestError( + "Join target %s does not correspond to " + "the right side of join condition %s" % (right, onclause) + ) + + if not right_mapper and prop: + right_mapper = prop.mapper + + need_adapter = False + + if right_mapper and right is right_selectable: + if not right_selectable.is_derived_from( + right_mapper.mapped_table): + raise sa_exc.InvalidRequestError( + "Selectable '%s' is not derived from '%s'" % + (right_selectable.description, + right_mapper.mapped_table.description)) + + if isinstance(right_selectable, expression.SelectBase): + # TODO: this isn't even covered now! + right_selectable = right_selectable.alias() + need_adapter = True + + right = aliased(right_mapper, right_selectable) + + aliased_entity = right_mapper and \ + not right_is_aliased and \ + ( + right_mapper.with_polymorphic and isinstance( + right_mapper._with_polymorphic_selectable, + expression.Alias) + or + overlap # test for overlap: + # orm/inheritance/relationships.py + # SelfReferentialM2MTest + ) + + if not need_adapter and (create_aliases or aliased_entity): + right = aliased(right, flat=True) + need_adapter = True + + # if an alias() of the right side was generated here, + # apply an adapter to all subsequent filter() calls + # until reset_joinpoint() is called. + if need_adapter: + self._filter_aliases = ORMAdapter( + right, + equivalents=right_mapper and + right_mapper._equivalent_columns or {}, + chain_to=self._filter_aliases) + + # if the onclause is a ClauseElement, adapt it with any + # adapters that are in place right now + if isinstance(onclause, expression.ClauseElement): + onclause = self._adapt_clause(onclause, True, True) + + # if an alias() on the right side was generated, + # which is intended to wrap a the right side in a subquery, + # ensure that columns retrieved from this target in the result + # set are also adapted. + if aliased_entity and not create_aliases: + self._mapper_loads_polymorphically_with( + right_mapper, + ORMAdapter( + right, + equivalents=right_mapper._equivalent_columns + ) + ) + + return right, onclause + + def _join_to_left(self, l_info, left, right, onclause, outerjoin, full): + info = l_info + left_mapper = getattr(info, 'mapper', None) + left_selectable = info.selectable + + if self._from_obj: + replace_clause_index, clause = sql_util.find_join_source( + self._from_obj, + left_selectable) + if clause is not None: + try: + clause = orm_join(clause, + right, + onclause, isouter=outerjoin, full=full) + except sa_exc.ArgumentError as ae: + raise sa_exc.InvalidRequestError( + "Could not find a FROM clause to join from. " + "Tried joining to %s, but got: %s" % (right, ae)) + + self._from_obj = \ + self._from_obj[:replace_clause_index] + \ + (clause, ) + \ + self._from_obj[replace_clause_index + 1:] + return + + if left_mapper: + for ent in self._entities: + if ent.corresponds_to(left): + clause = ent.selectable + break + else: + clause = left + else: + clause = left_selectable + + assert clause is not None + try: + clause = orm_join( + clause, right, onclause, isouter=outerjoin, full=full) + except sa_exc.ArgumentError as ae: + raise sa_exc.InvalidRequestError( + "Could not find a FROM clause to join from. " + "Tried joining to %s, but got: %s" % (right, ae)) + self._from_obj = self._from_obj + (clause,) + + def _reset_joinpoint(self): + self._joinpoint = self._joinpath + self._filter_aliases = None + + @_generative(_no_statement_condition) + def reset_joinpoint(self): + """Return a new :class:`.Query`, where the "join point" has + been reset back to the base FROM entities of the query. + + This method is usually used in conjunction with the + ``aliased=True`` feature of the :meth:`~.Query.join` + method. See the example in :meth:`~.Query.join` for how + this is used. + + """ + self._reset_joinpoint() + + @_generative(_no_clauseelement_condition) + def select_from(self, *from_obj): + r"""Set the FROM clause of this :class:`.Query` explicitly. + + :meth:`.Query.select_from` is often used in conjunction with + :meth:`.Query.join` in order to control which entity is selected + from on the "left" side of the join. + + The entity or selectable object here effectively replaces the + "left edge" of any calls to :meth:`~.Query.join`, when no + joinpoint is otherwise established - usually, the default "join + point" is the leftmost entity in the :class:`~.Query` object's + list of entities to be selected. + + A typical example:: + + q = session.query(Address).select_from(User).\ + join(User.addresses).\ + filter(User.name == 'ed') + + Which produces SQL equivalent to:: + + SELECT address.* FROM user + JOIN address ON user.id=address.user_id + WHERE user.name = :name_1 + + :param \*from_obj: collection of one or more entities to apply + to the FROM clause. Entities can be mapped classes, + :class:`.AliasedClass` objects, :class:`.Mapper` objects + as well as core :class:`.FromClause` elements like subqueries. + + .. versionchanged:: 0.9 + This method no longer applies the given FROM object + to be the selectable from which matching entities + select from; the :meth:`.select_entity_from` method + now accomplishes this. See that method for a description + of this behavior. + + .. seealso:: + + :meth:`~.Query.join` + + :meth:`.Query.select_entity_from` + + """ + + self._set_select_from(from_obj, False) + + @_generative(_no_clauseelement_condition) + def select_entity_from(self, from_obj): + r"""Set the FROM clause of this :class:`.Query` to a + core selectable, applying it as a replacement FROM clause + for corresponding mapped entities. + + The :meth:`.Query.select_entity_from` method supplies an alternative + approach to the use case of applying an :func:`.aliased` construct + explicitly throughout a query. Instead of referring to the + :func:`.aliased` construct explicitly, + :meth:`.Query.select_entity_from` automatically *adapts* all occurences + of the entity to the target selectable. + + Given a case for :func:`.aliased` such as selecting ``User`` + objects from a SELECT statement:: + + select_stmt = select([User]).where(User.id == 7) + user_alias = aliased(User, select_stmt) + + q = session.query(user_alias).\ + filter(user_alias.name == 'ed') + + Above, we apply the ``user_alias`` object explicitly throughout the + query. When it's not feasible for ``user_alias`` to be referenced + explicitly in many places, :meth:`.Query.select_entity_from` may be + used at the start of the query to adapt the existing ``User`` entity:: + + q = session.query(User).\ + select_entity_from(select_stmt).\ + filter(User.name == 'ed') + + Above, the generated SQL will show that the ``User`` entity is + adapted to our statement, even in the case of the WHERE clause: + + .. sourcecode:: sql + + SELECT anon_1.id AS anon_1_id, anon_1.name AS anon_1_name + FROM (SELECT "user".id AS id, "user".name AS name + FROM "user" + WHERE "user".id = :id_1) AS anon_1 + WHERE anon_1.name = :name_1 + + The :meth:`.Query.select_entity_from` method is similar to the + :meth:`.Query.select_from` method, in that it sets the FROM clause + of the query. The difference is that it additionally applies + adaptation to the other parts of the query that refer to the + primary entity. If above we had used :meth:`.Query.select_from` + instead, the SQL generated would have been: + + .. sourcecode:: sql + + -- uses plain select_from(), not select_entity_from() + SELECT "user".id AS user_id, "user".name AS user_name + FROM "user", (SELECT "user".id AS id, "user".name AS name + FROM "user" + WHERE "user".id = :id_1) AS anon_1 + WHERE "user".name = :name_1 + + To supply textual SQL to the :meth:`.Query.select_entity_from` method, + we can make use of the :func:`.text` construct. However, the + :func:`.text` construct needs to be aligned with the columns of our + entity, which is achieved by making use of the + :meth:`.TextClause.columns` method:: + + text_stmt = text("select id, name from user").columns( + User.id, User.name) + q = session.query(User).select_entity_from(text_stmt) + + :meth:`.Query.select_entity_from` itself accepts an :func:`.aliased` + object, so that the special options of :func:`.aliased` such as + :paramref:`.aliased.adapt_on_names` may be used within the + scope of the :meth:`.Query.select_entity_from` method's adaptation + services. Suppose + a view ``user_view`` also returns rows from ``user``. If + we reflect this view into a :class:`.Table`, this view has no + relationship to the :class:`.Table` to which we are mapped, however + we can use name matching to select from it:: + + user_view = Table('user_view', metadata, + autoload_with=engine) + user_view_alias = aliased( + User, user_view, adapt_on_names=True) + q = session.query(User).\ + select_entity_from(user_view_alias).\ + order_by(User.name) + + .. versionchanged:: 1.1.7 The :meth:`.Query.select_entity_from` + method now accepts an :func:`.aliased` object as an alternative + to a :class:`.FromClause` object. + + :param from_obj: a :class:`.FromClause` object that will replace + the FROM clause of this :class:`.Query`. It also may be an instance + of :func:`.aliased`. + + + + .. seealso:: + + :meth:`.Query.select_from` + + """ + + self._set_select_from([from_obj], True) + + def __getitem__(self, item): + if isinstance(item, slice): + start, stop, step = util.decode_slice(item) + + if isinstance(stop, int) and \ + isinstance(start, int) and \ + stop - start <= 0: + return [] + + # perhaps we should execute a count() here so that we + # can still use LIMIT/OFFSET ? + elif (isinstance(start, int) and start < 0) \ + or (isinstance(stop, int) and stop < 0): + return list(self)[item] + + res = self.slice(start, stop) + if step is not None: + return list(res)[None:None:item.step] + else: + return list(res) + else: + if item == -1: + return list(self)[-1] + else: + return list(self[item:item + 1])[0] + + @_generative(_no_statement_condition) + def slice(self, start, stop): + """Computes the "slice" of the :class:`.Query` represented by + the given indices and returns the resulting :class:`.Query`. + + The start and stop indices behave like the argument to Python's + built-in :func:`range` function. This method provides an + alternative to using ``LIMIT``/``OFFSET`` to get a slice of the + query. + + For example, :: + + session.query(User).order_by(User.id).slice(1, 3) + + renders as + + .. sourcecode:: sql + + SELECT users.id AS users_id, + users.name AS users_name + FROM users ORDER BY users.id + LIMIT ? OFFSET ? + (2, 1) + + .. seealso:: + + :meth:`.Query.limit` + + :meth:`.Query.offset` + + """ + if start is not None and stop is not None: + self._offset = (self._offset or 0) + start + self._limit = stop - start + elif start is None and stop is not None: + self._limit = stop + elif start is not None and stop is None: + self._offset = (self._offset or 0) + start + + if self._offset == 0: + self._offset = None + + @_generative(_no_statement_condition) + def limit(self, limit): + """Apply a ``LIMIT`` to the query and return the newly resulting + ``Query``. + + """ + self._limit = limit + + @_generative(_no_statement_condition) + def offset(self, offset): + """Apply an ``OFFSET`` to the query and return the newly resulting + ``Query``. + + """ + self._offset = offset + + @_generative(_no_statement_condition) + def distinct(self, *criterion): + r"""Apply a ``DISTINCT`` to the query and return the newly resulting + ``Query``. + + + .. note:: + + The :meth:`.distinct` call includes logic that will automatically + add columns from the ORDER BY of the query to the columns + clause of the SELECT statement, to satisfy the common need + of the database backend that ORDER BY columns be part of the + SELECT list when DISTINCT is used. These columns *are not* + added to the list of columns actually fetched by the + :class:`.Query`, however, so would not affect results. + The columns are passed through when using the + :attr:`.Query.statement` accessor, however. + + :param \*expr: optional column expressions. When present, + the PostgreSQL dialect will render a ``DISTINCT ON (>)`` + construct. + + """ + if not criterion: + self._distinct = True + else: + criterion = self._adapt_col_list(criterion) + if isinstance(self._distinct, list): + self._distinct += criterion + else: + self._distinct = criterion + + @_generative() + def prefix_with(self, *prefixes): + r"""Apply the prefixes to the query and return the newly resulting + ``Query``. + + :param \*prefixes: optional prefixes, typically strings, + not using any commas. In particular is useful for MySQL keywords. + + e.g.:: + + query = sess.query(User.name).\ + prefix_with('HIGH_PRIORITY').\ + prefix_with('SQL_SMALL_RESULT', 'ALL') + + Would render:: + + SELECT HIGH_PRIORITY SQL_SMALL_RESULT ALL users.name AS users_name + FROM users + + .. versionadded:: 0.7.7 + + .. seealso:: + + :meth:`.HasPrefixes.prefix_with` + + """ + if self._prefixes: + self._prefixes += prefixes + else: + self._prefixes = prefixes + + @_generative() + def suffix_with(self, *suffixes): + r"""Apply the suffix to the query and return the newly resulting + ``Query``. + + :param \*suffixes: optional suffixes, typically strings, + not using any commas. + + .. versionadded:: 1.0.0 + + .. seealso:: + + :meth:`.Query.prefix_with` + + :meth:`.HasSuffixes.suffix_with` + + """ + if self._suffixes: + self._suffixes += suffixes + else: + self._suffixes = suffixes + + def all(self): + """Return the results represented by this ``Query`` as a list. + + This results in an execution of the underlying query. + + """ + return list(self) + + @_generative(_no_clauseelement_condition) + def from_statement(self, statement): + """Execute the given SELECT statement and return results. + + This method bypasses all internal statement compilation, and the + statement is executed without modification. + + The statement is typically either a :func:`~.expression.text` + or :func:`~.expression.select` construct, and should return the set + of columns + appropriate to the entity class represented by this :class:`.Query`. + + .. seealso:: + + :ref:`orm_tutorial_literal_sql` - usage examples in the + ORM tutorial + + """ + statement = expression._expression_literal_as_text(statement) + + if not isinstance(statement, + (expression.TextClause, + expression.SelectBase)): + raise sa_exc.ArgumentError( + "from_statement accepts text(), select(), " + "and union() objects only.") + + self._statement = statement + + def first(self): + """Return the first result of this ``Query`` or + None if the result doesn't contain any row. + + first() applies a limit of one within the generated SQL, so that + only one primary entity row is generated on the server side + (note this may consist of multiple result rows if join-loaded + collections are present). + + Calling :meth:`.Query.first` results in an execution of the underlying query. + + .. seealso:: + + :meth:`.Query.one` + + :meth:`.Query.one_or_none` + + """ + if self._statement is not None: + ret = list(self)[0:1] + else: + ret = list(self[0:1]) + if len(ret) > 0: + return ret[0] + else: + return None + + def one_or_none(self): + """Return at most one result or raise an exception. + + Returns ``None`` if the query selects + no rows. Raises ``sqlalchemy.orm.exc.MultipleResultsFound`` + if multiple object identities are returned, or if multiple + rows are returned for a query that returns only scalar values + as opposed to full identity-mapped entities. + + Calling :meth:`.Query.one_or_none` results in an execution of the + underlying query. + + .. versionadded:: 1.0.9 + + Added :meth:`.Query.one_or_none` + + .. seealso:: + + :meth:`.Query.first` + + :meth:`.Query.one` + + """ + ret = list(self) + + l = len(ret) + if l == 1: + return ret[0] + elif l == 0: + return None + else: + raise orm_exc.MultipleResultsFound( + "Multiple rows were found for one_or_none()") + + def one(self): + """Return exactly one result or raise an exception. + + Raises ``sqlalchemy.orm.exc.NoResultFound`` if the query selects + no rows. Raises ``sqlalchemy.orm.exc.MultipleResultsFound`` + if multiple object identities are returned, or if multiple + rows are returned for a query that returns only scalar values + as opposed to full identity-mapped entities. + + Calling :meth:`.one` results in an execution of the underlying query. + + .. seealso:: + + :meth:`.Query.first` + + :meth:`.Query.one_or_none` + + """ + try: + ret = self.one_or_none() + except orm_exc.MultipleResultsFound: + raise orm_exc.MultipleResultsFound( + "Multiple rows were found for one()") + else: + if ret is None: + raise orm_exc.NoResultFound("No row was found for one()") + return ret + + def scalar(self): + """Return the first element of the first result or None + if no rows present. If multiple rows are returned, + raises MultipleResultsFound. + + >>> session.query(Item).scalar() + + >>> session.query(Item.id).scalar() + 1 + >>> session.query(Item.id).filter(Item.id < 0).scalar() + None + >>> session.query(Item.id, Item.name).scalar() + 1 + >>> session.query(func.count(Parent.id)).scalar() + 20 + + This results in an execution of the underlying query. + + """ + try: + ret = self.one() + if not isinstance(ret, tuple): + return ret + return ret[0] + except orm_exc.NoResultFound: + return None + + def __iter__(self): + context = self._compile_context() + context.statement.use_labels = True + if self._autoflush and not self._populate_existing: + self.session._autoflush() + return self._execute_and_instances(context) + + def __str__(self): + context = self._compile_context() + try: + bind = self._get_bind_args( + context, self.session.get_bind) if self.session else None + except sa_exc.UnboundExecutionError: + bind = None + return str(context.statement.compile(bind)) + + def _connection_from_session(self, **kw): + conn = self.session.connection(**kw) + if self._execution_options: + conn = conn.execution_options(**self._execution_options) + return conn + + def _execute_and_instances(self, querycontext): + conn = self._get_bind_args( + querycontext, + self._connection_from_session, + close_with_result=True) + + result = conn.execute(querycontext.statement, self._params) + return loading.instances(querycontext.query, result, querycontext) + + def _get_bind_args(self, querycontext, fn, **kw): + return fn( + mapper=self._bind_mapper(), + clause=querycontext.statement, + **kw + ) + + @property + def column_descriptions(self): + """Return metadata about the columns which would be + returned by this :class:`.Query`. + + Format is a list of dictionaries:: + + user_alias = aliased(User, name='user2') + q = sess.query(User, User.id, user_alias) + + # this expression: + q.column_descriptions + + # would return: + [ + { + 'name':'User', + 'type':User, + 'aliased':False, + 'expr':User, + 'entity': User + }, + { + 'name':'id', + 'type':Integer(), + 'aliased':False, + 'expr':User.id, + 'entity': User + }, + { + 'name':'user2', + 'type':User, + 'aliased':True, + 'expr':user_alias, + 'entity': user_alias + } + ] + + """ + + return [ + { + 'name': ent._label_name, + 'type': ent.type, + 'aliased': getattr(insp_ent, 'is_aliased_class', False), + 'expr': ent.expr, + 'entity': + getattr(insp_ent, "entity", None) + if ent.entity_zero is not None + and not insp_ent.is_clause_element + else None + } + for ent, insp_ent in [ + ( + _ent, + (inspect(_ent.entity_zero) + if _ent.entity_zero is not None else None) + ) + for _ent in self._entities + ] + ] + + def instances(self, cursor, __context=None): + """Given a ResultProxy cursor as returned by connection.execute(), + return an ORM result as an iterator. + + e.g.:: + + result = engine.execute("select * from users") + for u in session.query(User).instances(result): + print u + """ + context = __context + if context is None: + context = QueryContext(self) + + return loading.instances(self, cursor, context) + + def merge_result(self, iterator, load=True): + """Merge a result into this :class:`.Query` object's Session. + + Given an iterator returned by a :class:`.Query` of the same structure + as this one, return an identical iterator of results, with all mapped + instances merged into the session using :meth:`.Session.merge`. This + is an optimized method which will merge all mapped instances, + preserving the structure of the result rows and unmapped columns with + less method overhead than that of calling :meth:`.Session.merge` + explicitly for each value. + + The structure of the results is determined based on the column list of + this :class:`.Query` - if these do not correspond, unchecked errors + will occur. + + The 'load' argument is the same as that of :meth:`.Session.merge`. + + For an example of how :meth:`~.Query.merge_result` is used, see + the source code for the example :ref:`examples_caching`, where + :meth:`~.Query.merge_result` is used to efficiently restore state + from a cache back into a target :class:`.Session`. + + """ + + return loading.merge_result(self, iterator, load) + + @property + def _select_args(self): + return { + 'limit': self._limit, + 'offset': self._offset, + 'distinct': self._distinct, + 'prefixes': self._prefixes, + 'suffixes': self._suffixes, + 'group_by': self._group_by or None, + 'having': self._having + } + + @property + def _should_nest_selectable(self): + kwargs = self._select_args + return (kwargs.get('limit') is not None or + kwargs.get('offset') is not None or + kwargs.get('distinct', False)) + + def exists(self): + """A convenience method that turns a query into an EXISTS subquery + of the form EXISTS (SELECT 1 FROM ... WHERE ...). + + e.g.:: + + q = session.query(User).filter(User.name == 'fred') + session.query(q.exists()) + + Producing SQL similar to:: + + SELECT EXISTS ( + SELECT 1 FROM users WHERE users.name = :name_1 + ) AS anon_1 + + The EXISTS construct is usually used in the WHERE clause:: + + session.query(User.id).filter(q.exists()).scalar() + + Note that some databases such as SQL Server don't allow an + EXISTS expression to be present in the columns clause of a + SELECT. To select a simple boolean value based on the exists + as a WHERE, use :func:`.literal`:: + + from sqlalchemy import literal + + session.query(literal(True)).filter(q.exists()).scalar() + + .. versionadded:: 0.8.1 + + """ + + # .add_columns() for the case that we are a query().select_from(X), + # so that ".statement" can be produced (#2995) but also without + # omitting the FROM clause from a query(X) (#2818); + # .with_only_columns() after we have a core select() so that + # we get just "SELECT 1" without any entities. + return sql.exists(self.add_columns('1').with_labels(). + statement.with_only_columns([1])) + + def count(self): + r"""Return a count of rows this Query would return. + + This generates the SQL for this Query as follows:: + + SELECT count(1) AS count_1 FROM ( + SELECT + ) AS anon_1 + + .. versionchanged:: 0.7 + The above scheme is newly refined as of 0.7b3. + + For fine grained control over specific columns + to count, to skip the usage of a subquery or + otherwise control of the FROM clause, + or to use other aggregate functions, + use :attr:`~sqlalchemy.sql.expression.func` + expressions in conjunction + with :meth:`~.Session.query`, i.e.:: + + from sqlalchemy import func + + # count User records, without + # using a subquery. + session.query(func.count(User.id)) + + # return count of user "id" grouped + # by "name" + session.query(func.count(User.id)).\ + group_by(User.name) + + from sqlalchemy import distinct + + # count distinct "name" values + session.query(func.count(distinct(User.name))) + + """ + col = sql.func.count(sql.literal_column('*')) + return self.from_self(col).scalar() + + def delete(self, synchronize_session='evaluate'): + r"""Perform a bulk delete query. + + Deletes rows matched by this query from the database. + + E.g.:: + + sess.query(User).filter(User.age == 25).\ + delete(synchronize_session=False) + + sess.query(User).filter(User.age == 25).\ + delete(synchronize_session='evaluate') + + .. warning:: The :meth:`.Query.delete` method is a "bulk" operation, + which bypasses ORM unit-of-work automation in favor of greater + performance. **Please read all caveats and warnings below.** + + :param synchronize_session: chooses the strategy for the removal of + matched objects from the session. Valid values are: + + ``False`` - don't synchronize the session. This option is the most + efficient and is reliable once the session is expired, which + typically occurs after a commit(), or explicitly using + expire_all(). Before the expiration, objects may still remain in + the session which were in fact deleted which can lead to confusing + results if they are accessed via get() or already loaded + collections. + + ``'fetch'`` - performs a select query before the delete to find + objects that are matched by the delete query and need to be + removed from the session. Matched objects are removed from the + session. + + ``'evaluate'`` - Evaluate the query's criteria in Python straight + on the objects in the session. If evaluation of the criteria isn't + implemented, an error is raised. + + The expression evaluator currently doesn't account for differing + string collations between the database and Python. + + :return: the count of rows matched as returned by the database's + "row count" feature. + + .. warning:: **Additional Caveats for bulk query deletes** + + * This method does **not work for joined + inheritance mappings**, since the **multiple table + deletes are not supported by SQL** as well as that the + **join condition of an inheritance mapper is not + automatically rendered**. Care must be taken in any + multiple-table delete to first accommodate via some other means + how the related table will be deleted, as well as to + explicitly include the joining + condition between those tables, even in mappings where + this is normally automatic. E.g. if a class ``Engineer`` + subclasses ``Employee``, a DELETE against the ``Employee`` + table would look like:: + + session.query(Engineer).\ + filter(Engineer.id == Employee.id).\ + filter(Employee.name == 'dilbert').\ + delete() + + However the above SQL will not delete from the Engineer table, + unless an ON DELETE CASCADE rule is established in the database + to handle it. + + Short story, **do not use this method for joined inheritance + mappings unless you have taken the additional steps to make + this feasible**. + + * The polymorphic identity WHERE criteria is **not** included + for single- or + joined- table updates - this must be added **manually** even + for single table inheritance. + + * The method does **not** offer in-Python cascading of + relationships - it is assumed that ON DELETE CASCADE/SET + NULL/etc. is configured for any foreign key references + which require it, otherwise the database may emit an + integrity violation if foreign key references are being + enforced. + + After the DELETE, dependent objects in the + :class:`.Session` which were impacted by an ON DELETE + may not contain the current state, or may have been + deleted. This issue is resolved once the + :class:`.Session` is expired, which normally occurs upon + :meth:`.Session.commit` or can be forced by using + :meth:`.Session.expire_all`. Accessing an expired + object whose row has been deleted will invoke a SELECT + to locate the row; when the row is not found, an + :class:`~sqlalchemy.orm.exc.ObjectDeletedError` is + raised. + + * The ``'fetch'`` strategy results in an additional + SELECT statement emitted and will significantly reduce + performance. + + * The ``'evaluate'`` strategy performs a scan of + all matching objects within the :class:`.Session`; if the + contents of the :class:`.Session` are expired, such as + via a proceeding :meth:`.Session.commit` call, **this will + result in SELECT queries emitted for every matching object**. + + * The :meth:`.MapperEvents.before_delete` and + :meth:`.MapperEvents.after_delete` + events **are not invoked** from this method. Instead, the + :meth:`.SessionEvents.after_bulk_delete` method is provided to + act upon a mass DELETE of entity rows. + + .. seealso:: + + :meth:`.Query.update` + + :ref:`inserts_and_updates` - Core SQL tutorial + + """ + + delete_op = persistence.BulkDelete.factory( + self, synchronize_session) + delete_op.exec_() + return delete_op.rowcount + + def update(self, values, synchronize_session='evaluate', update_args=None): + r"""Perform a bulk update query. + + Updates rows matched by this query in the database. + + E.g.:: + + sess.query(User).filter(User.age == 25).\ + update({User.age: User.age - 10}, synchronize_session=False) + + sess.query(User).filter(User.age == 25).\ + update({"age": User.age - 10}, synchronize_session='evaluate') + + + .. warning:: The :meth:`.Query.update` method is a "bulk" operation, + which bypasses ORM unit-of-work automation in favor of greater + performance. **Please read all caveats and warnings below.** + + + :param values: a dictionary with attributes names, or alternatively + mapped attributes or SQL expressions, as keys, and literal + values or sql expressions as values. If :ref:`parameter-ordered + mode ` is desired, the values can be + passed as a list of 2-tuples; + this requires that the :paramref:`~sqlalchemy.sql.expression.update.preserve_parameter_order` + flag is passed to the :paramref:`.Query.update.update_args` dictionary + as well. + + .. versionchanged:: 1.0.0 - string names in the values dictionary + are now resolved against the mapped entity; previously, these + strings were passed as literal column names with no mapper-level + translation. + + :param synchronize_session: chooses the strategy to update the + attributes on objects in the session. Valid values are: + + ``False`` - don't synchronize the session. This option is the most + efficient and is reliable once the session is expired, which + typically occurs after a commit(), or explicitly using + expire_all(). Before the expiration, updated objects may still + remain in the session with stale values on their attributes, which + can lead to confusing results. + + ``'fetch'`` - performs a select query before the update to find + objects that are matched by the update query. The updated + attributes are expired on matched objects. + + ``'evaluate'`` - Evaluate the Query's criteria in Python straight + on the objects in the session. If evaluation of the criteria isn't + implemented, an exception is raised. + + The expression evaluator currently doesn't account for differing + string collations between the database and Python. + + :param update_args: Optional dictionary, if present will be passed + to the underlying :func:`.update` construct as the ``**kw`` for + the object. May be used to pass dialect-specific arguments such + as ``mysql_limit``, as well as other special arguments such as + :paramref:`~sqlalchemy.sql.expression.update.preserve_parameter_order`. + + .. versionadded:: 1.0.0 + + :return: the count of rows matched as returned by the database's + "row count" feature. + + .. warning:: **Additional Caveats for bulk query updates** + + * The method does **not** offer in-Python cascading of + relationships - it is assumed that ON UPDATE CASCADE is + configured for any foreign key references which require + it, otherwise the database may emit an integrity + violation if foreign key references are being enforced. + + After the UPDATE, dependent objects in the + :class:`.Session` which were impacted by an ON UPDATE + CASCADE may not contain the current state; this issue is + resolved once the :class:`.Session` is expired, which + normally occurs upon :meth:`.Session.commit` or can be + forced by using :meth:`.Session.expire_all`. + + * The ``'fetch'`` strategy results in an additional + SELECT statement emitted and will significantly reduce + performance. + + * The ``'evaluate'`` strategy performs a scan of + all matching objects within the :class:`.Session`; if the + contents of the :class:`.Session` are expired, such as + via a proceeding :meth:`.Session.commit` call, **this will + result in SELECT queries emitted for every matching object**. + + * The method supports multiple table updates, as detailed + in :ref:`multi_table_updates`, and this behavior does + extend to support updates of joined-inheritance and + other multiple table mappings. However, the **join + condition of an inheritance mapper is not + automatically rendered**. Care must be taken in any + multiple-table update to explicitly include the joining + condition between those tables, even in mappings where + this is normally automatic. E.g. if a class ``Engineer`` + subclasses ``Employee``, an UPDATE of the ``Engineer`` + local table using criteria against the ``Employee`` + local table might look like:: + + session.query(Engineer).\ + filter(Engineer.id == Employee.id).\ + filter(Employee.name == 'dilbert').\ + update({"engineer_type": "programmer"}) + + * The polymorphic identity WHERE criteria is **not** included + for single- or + joined- table updates - this must be added **manually**, even + for single table inheritance. + + * The :meth:`.MapperEvents.before_update` and + :meth:`.MapperEvents.after_update` + events **are not invoked from this method**. Instead, the + :meth:`.SessionEvents.after_bulk_update` method is provided to + act upon a mass UPDATE of entity rows. + + .. seealso:: + + :meth:`.Query.delete` + + :ref:`inserts_and_updates` - Core SQL tutorial + + """ + + update_args = update_args or {} + update_op = persistence.BulkUpdate.factory( + self, synchronize_session, values, update_args) + update_op.exec_() + return update_op.rowcount + + def _compile_context(self, labels=True): + if self.dispatch.before_compile: + for fn in self.dispatch.before_compile: + new_query = fn(self) + if new_query is not None: + self = new_query + + context = QueryContext(self) + + if context.statement is not None: + return context + + context.labels = labels + + context._for_update_arg = self._for_update_arg + + for entity in self._entities: + entity.setup_context(self, context) + + for rec in context.create_eager_joins: + strategy = rec[0] + strategy(*rec[1:]) + + if context.from_clause: + # "load from explicit FROMs" mode, + # i.e. when select_from() or join() is used + context.froms = list(context.from_clause) + # else "load from discrete FROMs" mode, + # i.e. when each _MappedEntity has its own FROM + + if self._enable_single_crit: + self._adjust_for_single_inheritance(context) + + if not context.primary_columns: + if self._only_load_props: + raise sa_exc.InvalidRequestError( + "No column-based properties specified for " + "refresh operation. Use session.expire() " + "to reload collections and related items.") + else: + raise sa_exc.InvalidRequestError( + "Query contains no columns with which to " + "SELECT from.") + + if context.multi_row_eager_loaders and self._should_nest_selectable: + context.statement = self._compound_eager_statement(context) + else: + context.statement = self._simple_statement(context) + + return context + + def _compound_eager_statement(self, context): + # for eager joins present and LIMIT/OFFSET/DISTINCT, + # wrap the query inside a select, + # then append eager joins onto that + + if context.order_by: + order_by_col_expr = \ + sql_util.expand_column_list_from_order_by( + context.primary_columns, + context.order_by + ) + else: + context.order_by = None + order_by_col_expr = [] + + inner = sql.select( + context.primary_columns + order_by_col_expr, + context.whereclause, + from_obj=context.froms, + use_labels=context.labels, + # TODO: this order_by is only needed if + # LIMIT/OFFSET is present in self._select_args, + # else the application on the outside is enough + order_by=context.order_by, + **self._select_args + ) + + for hint in self._with_hints: + inner = inner.with_hint(*hint) + + if self._correlate: + inner = inner.correlate(*self._correlate) + + inner = inner.alias() + + equivs = self.__all_equivs() + + context.adapter = sql_util.ColumnAdapter(inner, equivs) + + statement = sql.select( + [inner] + context.secondary_columns, + use_labels=context.labels) + + statement._for_update_arg = context._for_update_arg + + from_clause = inner + for eager_join in context.eager_joins.values(): + # EagerLoader places a 'stop_on' attribute on the join, + # giving us a marker as to where the "splice point" of + # the join should be + from_clause = sql_util.splice_joins( + from_clause, + eager_join, eager_join.stop_on) + + statement.append_from(from_clause) + + if context.order_by: + statement.append_order_by( + *context.adapter.copy_and_process( + context.order_by + ) + ) + + statement.append_order_by(*context.eager_order_by) + return statement + + def _simple_statement(self, context): + if not context.order_by: + context.order_by = None + + if self._distinct is True and context.order_by: + context.primary_columns += \ + sql_util.expand_column_list_from_order_by( + context.primary_columns, + context.order_by + ) + context.froms += tuple(context.eager_joins.values()) + + statement = sql.select( + context.primary_columns + + context.secondary_columns, + context.whereclause, + from_obj=context.froms, + use_labels=context.labels, + order_by=context.order_by, + **self._select_args + ) + statement._for_update_arg = context._for_update_arg + + for hint in self._with_hints: + statement = statement.with_hint(*hint) + + if self._correlate: + statement = statement.correlate(*self._correlate) + + if context.eager_order_by: + statement.append_order_by(*context.eager_order_by) + return statement + + def _adjust_for_single_inheritance(self, context): + """Apply single-table-inheritance filtering. + + For all distinct single-table-inheritance mappers represented in + the columns clause of this query, add criterion to the WHERE + clause of the given QueryContext such that only the appropriate + subtypes are selected from the total results. + + """ + for (ext_info, adapter) in set(self._mapper_adapter_map.values()): + if ext_info in self._join_entities: + continue + single_crit = ext_info.mapper._single_table_criterion + if single_crit is not None: + if adapter: + single_crit = adapter.traverse(single_crit) + single_crit = self._adapt_clause(single_crit, False, False) + context.whereclause = sql.and_( + sql.True_._ifnone(context.whereclause), + single_crit) + + +from ..sql.selectable import ForUpdateArg + + +class LockmodeArg(ForUpdateArg): + @classmethod + def parse_legacy_query(self, mode): + if mode in (None, False): + return None + + if mode == "read": + read = True + nowait = False + elif mode == "update": + read = nowait = False + elif mode == "update_nowait": + nowait = True + read = False + else: + raise sa_exc.ArgumentError( + "Unknown with_lockmode argument: %r" % mode) + + return LockmodeArg(read=read, nowait=nowait) + + +class _QueryEntity(object): + """represent an entity column returned within a Query result.""" + + def __new__(cls, *args, **kwargs): + if cls is _QueryEntity: + entity = args[1] + if not isinstance(entity, util.string_types) and \ + _is_mapped_class(entity): + cls = _MapperEntity + elif isinstance(entity, Bundle): + cls = _BundleEntity + else: + cls = _ColumnEntity + return object.__new__(cls) + + def _clone(self): + q = self.__class__.__new__(self.__class__) + q.__dict__ = self.__dict__.copy() + return q + + +class _MapperEntity(_QueryEntity): + """mapper/class/AliasedClass entity""" + + def __init__(self, query, entity): + if not query._primary_entity: + query._primary_entity = self + query._entities.append(self) + query._has_mapper_entities = True + self.entities = [entity] + self.expr = entity + + supports_single_entity = True + + use_id_for_hash = True + + def setup_entity(self, ext_info, aliased_adapter): + self.mapper = ext_info.mapper + self.aliased_adapter = aliased_adapter + self.selectable = ext_info.selectable + self.is_aliased_class = ext_info.is_aliased_class + self._with_polymorphic = ext_info.with_polymorphic_mappers + self._polymorphic_discriminator = \ + ext_info.polymorphic_on + self.entity_zero = ext_info + if ext_info.is_aliased_class: + self._label_name = self.entity_zero.name + else: + self._label_name = self.mapper.class_.__name__ + self.path = self.entity_zero._path_registry + + def set_with_polymorphic(self, query, cls_or_mappers, + selectable, polymorphic_on): + """Receive an update from a call to query.with_polymorphic(). + + Note the newer style of using a free standing with_polymporphic() + construct doesn't make use of this method. + + + """ + if self.is_aliased_class: + # TODO: invalidrequest ? + raise NotImplementedError( + "Can't use with_polymorphic() against " + "an Aliased object" + ) + + if cls_or_mappers is None: + query._reset_polymorphic_adapter(self.mapper) + return + + mappers, from_obj = self.mapper._with_polymorphic_args( + cls_or_mappers, selectable) + self._with_polymorphic = mappers + self._polymorphic_discriminator = polymorphic_on + + self.selectable = from_obj + query._mapper_loads_polymorphically_with( + self.mapper, sql_util.ColumnAdapter( + from_obj, self.mapper._equivalent_columns)) + + @property + def type(self): + return self.mapper.class_ + + @property + def entity_zero_or_selectable(self): + return self.entity_zero + + def corresponds_to(self, entity): + if entity.is_aliased_class: + if self.is_aliased_class: + if entity._base_alias is self.entity_zero._base_alias: + return True + return False + elif self.is_aliased_class: + if self.entity_zero._use_mapper_path: + return entity in self._with_polymorphic + else: + return entity is self.entity_zero + + return entity.common_parent(self.entity_zero) + + def adapt_to_selectable(self, query, sel): + query._entities.append(self) + + def _get_entity_clauses(self, query, context): + + adapter = None + + if not self.is_aliased_class: + if query._polymorphic_adapters: + adapter = query._polymorphic_adapters.get(self.mapper, None) + else: + adapter = self.aliased_adapter + + if adapter: + if query._from_obj_alias: + ret = adapter.wrap(query._from_obj_alias) + else: + ret = adapter + else: + ret = query._from_obj_alias + + return ret + + def row_processor(self, query, context, result): + adapter = self._get_entity_clauses(query, context) + + if context.adapter and adapter: + adapter = adapter.wrap(context.adapter) + elif not adapter: + adapter = context.adapter + + # polymorphic mappers which have concrete tables in + # their hierarchy usually + # require row aliasing unconditionally. + if not adapter and self.mapper._requires_row_aliasing: + adapter = sql_util.ColumnAdapter( + self.selectable, + self.mapper._equivalent_columns) + + if query._primary_entity is self: + only_load_props = query._only_load_props + refresh_state = context.refresh_state + else: + only_load_props = refresh_state = None + + _instance = loading._instance_processor( + self.mapper, + context, + result, + self.path, + adapter, + only_load_props=only_load_props, + refresh_state=refresh_state, + polymorphic_discriminator=self._polymorphic_discriminator + ) + + return _instance, self._label_name + + def setup_context(self, query, context): + adapter = self._get_entity_clauses(query, context) + + # if self._adapted_selectable is None: + context.froms += (self.selectable,) + + if context.order_by is False and self.mapper.order_by: + context.order_by = self.mapper.order_by + + # apply adaptation to the mapper's order_by if needed. + if adapter: + context.order_by = adapter.adapt_list( + util.to_list( + context.order_by + ) + ) + + loading._setup_entity_query( + context, self.mapper, self, + self.path, adapter, context.primary_columns, + with_polymorphic=self._with_polymorphic, + only_load_props=query._only_load_props, + polymorphic_discriminator=self._polymorphic_discriminator) + + def __str__(self): + return str(self.mapper) + + +@inspection._self_inspects +class Bundle(InspectionAttr): + """A grouping of SQL expressions that are returned by a :class:`.Query` + under one namespace. + + The :class:`.Bundle` essentially allows nesting of the tuple-based + results returned by a column-oriented :class:`.Query` object. It also + is extensible via simple subclassing, where the primary capability + to override is that of how the set of expressions should be returned, + allowing post-processing as well as custom return types, without + involving ORM identity-mapped classes. + + .. versionadded:: 0.9.0 + + .. seealso:: + + :ref:`bundles` + + """ + + single_entity = False + """If True, queries for a single Bundle will be returned as a single + entity, rather than an element within a keyed tuple.""" + + is_clause_element = False + + is_mapper = False + + is_aliased_class = False + + def __init__(self, name, *exprs, **kw): + r"""Construct a new :class:`.Bundle`. + + e.g.:: + + bn = Bundle("mybundle", MyClass.x, MyClass.y) + + for row in session.query(bn).filter( + bn.c.x == 5).filter(bn.c.y == 4): + print(row.mybundle.x, row.mybundle.y) + + :param name: name of the bundle. + :param \*exprs: columns or SQL expressions comprising the bundle. + :param single_entity=False: if True, rows for this :class:`.Bundle` + can be returned as a "single entity" outside of any enclosing tuple + in the same manner as a mapped entity. + + """ + self.name = self._label = name + self.exprs = exprs + self.c = self.columns = ColumnCollection() + self.columns.update((getattr(col, "key", col._label), col) + for col in exprs) + self.single_entity = kw.pop('single_entity', self.single_entity) + + columns = None + """A namespace of SQL expressions referred to by this :class:`.Bundle`. + + e.g.:: + + bn = Bundle("mybundle", MyClass.x, MyClass.y) + + q = sess.query(bn).filter(bn.c.x == 5) + + Nesting of bundles is also supported:: + + b1 = Bundle("b1", + Bundle('b2', MyClass.a, MyClass.b), + Bundle('b3', MyClass.x, MyClass.y) + ) + + q = sess.query(b1).filter( + b1.c.b2.c.a == 5).filter(b1.c.b3.c.y == 9) + + .. seealso:: + + :attr:`.Bundle.c` + + """ + + c = None + """An alias for :attr:`.Bundle.columns`.""" + + def _clone(self): + cloned = self.__class__.__new__(self.__class__) + cloned.__dict__.update(self.__dict__) + return cloned + + def __clause_element__(self): + return expression.ClauseList(group=False, *self.c) + + @property + def clauses(self): + return self.__clause_element__().clauses + + def label(self, name): + """Provide a copy of this :class:`.Bundle` passing a new label.""" + + cloned = self._clone() + cloned.name = name + return cloned + + def create_row_processor(self, query, procs, labels): + """Produce the "row processing" function for this :class:`.Bundle`. + + May be overridden by subclasses. + + .. seealso:: + + :ref:`bundles` - includes an example of subclassing. + + """ + keyed_tuple = util.lightweight_named_tuple('result', labels) + + def proc(row): + return keyed_tuple([proc(row) for proc in procs]) + return proc + + +class _BundleEntity(_QueryEntity): + use_id_for_hash = False + + def __init__(self, query, bundle, setup_entities=True): + query._entities.append(self) + self.bundle = self.expr = bundle + self.type = type(bundle) + self._label_name = bundle.name + self._entities = [] + + if setup_entities: + for expr in bundle.exprs: + if isinstance(expr, Bundle): + _BundleEntity(self, expr) + else: + _ColumnEntity(self, expr, namespace=self) + + self.supports_single_entity = self.bundle.single_entity + + @property + def entities(self): + entities = [] + for ent in self._entities: + entities.extend(ent.entities) + return entities + + @property + def entity_zero(self): + for ent in self._entities: + ezero = ent.entity_zero + if ezero is not None: + return ezero + else: + return None + + def corresponds_to(self, entity): + # TODO: this seems to have no effect for + # _ColumnEntity either + return False + + @property + def entity_zero_or_selectable(self): + for ent in self._entities: + ezero = ent.entity_zero_or_selectable + if ezero is not None: + return ezero + else: + return None + + def adapt_to_selectable(self, query, sel): + c = _BundleEntity(query, self.bundle, setup_entities=False) + # c._label_name = self._label_name + # c.entity_zero = self.entity_zero + # c.entities = self.entities + + for ent in self._entities: + ent.adapt_to_selectable(c, sel) + + def setup_entity(self, ext_info, aliased_adapter): + for ent in self._entities: + ent.setup_entity(ext_info, aliased_adapter) + + def setup_context(self, query, context): + for ent in self._entities: + ent.setup_context(query, context) + + def row_processor(self, query, context, result): + procs, labels = zip( + *[ent.row_processor(query, context, result) + for ent in self._entities] + ) + + proc = self.bundle.create_row_processor(query, procs, labels) + + return proc, self._label_name + + +class _ColumnEntity(_QueryEntity): + """Column/expression based entity.""" + + def __init__(self, query, column, namespace=None): + self.expr = column + self.namespace = namespace + search_entities = True + check_column = False + + if isinstance(column, util.string_types): + column = sql.literal_column(column) + self._label_name = column.name + search_entities = False + check_column = True + _entity = None + elif isinstance(column, ( + attributes.QueryableAttribute, + interfaces.PropComparator + )): + _entity = getattr(column, '_parententity', None) + if _entity is not None: + search_entities = False + self._label_name = column.key + column = column._query_clause_element() + check_column = True + if isinstance(column, Bundle): + _BundleEntity(query, column) + return + + if not isinstance(column, sql.ColumnElement): + if hasattr(column, '_select_iterable'): + # break out an object like Table into + # individual columns + for c in column._select_iterable: + if c is column: + break + _ColumnEntity(query, c, namespace=column) + else: + return + + raise sa_exc.InvalidRequestError( + "SQL expression, column, or mapped entity " + "expected - got '%r'" % (column, ) + ) + elif not check_column: + self._label_name = getattr(column, 'key', None) + search_entities = True + + self.type = type_ = column.type + self.use_id_for_hash = not type_.hashable + + # If the Column is unnamed, give it a + # label() so that mutable column expressions + # can be located in the result even + # if the expression's identity has been changed + # due to adaption. + + if not column._label and not getattr(column, 'is_literal', False): + column = column.label(self._label_name) + + query._entities.append(self) + + self.column = column + self.froms = set() + + # look for ORM entities represented within the + # given expression. Try to count only entities + # for columns whose FROM object is in the actual list + # of FROMs for the overall expression - this helps + # subqueries which were built from ORM constructs from + # leaking out their entities into the main select construct + self.actual_froms = actual_froms = set(column._from_objects) + + if not search_entities: + self.entity_zero = _entity + if _entity: + self.entities = [_entity] + self.mapper = _entity.mapper + else: + self.entities = [] + self.mapper = None + self._from_entities = set(self.entities) + else: + all_elements = [ + elem for elem in sql_util.surface_column_elements(column) + if 'parententity' in elem._annotations + ] + + self.entities = util.unique_list([ + elem._annotations['parententity'] + for elem in all_elements + if 'parententity' in elem._annotations + ]) + + self._from_entities = set([ + elem._annotations['parententity'] + for elem in all_elements + if 'parententity' in elem._annotations + and actual_froms.intersection(elem._from_objects) + ]) + if self.entities: + self.entity_zero = self.entities[0] + self.mapper = self.entity_zero.mapper + elif self.namespace is not None: + self.entity_zero = self.namespace + self.mapper = None + else: + self.entity_zero = None + self.mapper = None + + supports_single_entity = False + + @property + def entity_zero_or_selectable(self): + if self.entity_zero is not None: + return self.entity_zero + elif self.actual_froms: + return list(self.actual_froms)[0] + else: + return None + + def adapt_to_selectable(self, query, sel): + c = _ColumnEntity(query, sel.corresponding_column(self.column)) + c._label_name = self._label_name + c.entity_zero = self.entity_zero + c.entities = self.entities + + def setup_entity(self, ext_info, aliased_adapter): + if 'selectable' not in self.__dict__: + self.selectable = ext_info.selectable + + if self.actual_froms.intersection(ext_info.selectable._from_objects): + self.froms.add(ext_info.selectable) + + def corresponds_to(self, entity): + # TODO: just returning False here, + # no tests fail + if self.entity_zero is None: + return False + elif _is_aliased_class(entity): + # TODO: polymorphic subclasses ? + return entity is self.entity_zero + else: + return not _is_aliased_class(self.entity_zero) and \ + entity.common_parent(self.entity_zero) + + def row_processor(self, query, context, result): + if ('fetch_column', self) in context.attributes: + column = context.attributes[('fetch_column', self)] + else: + column = query._adapt_clause(self.column, False, True) + + if context.adapter: + column = context.adapter.columns[column] + + getter = result._getter(column) + return getter, self._label_name + + def setup_context(self, query, context): + column = query._adapt_clause(self.column, False, True) + context.froms += tuple(self.froms) + context.primary_columns.append(column) + + context.attributes[('fetch_column', self)] = column + + def __str__(self): + return str(self.column) + + +class QueryContext(object): + __slots__ = ( + 'multi_row_eager_loaders', 'adapter', 'froms', 'for_update', + 'query', 'session', 'autoflush', 'populate_existing', + 'invoke_all_eagers', 'version_check', 'refresh_state', + 'primary_columns', 'secondary_columns', 'eager_order_by', + 'eager_joins', 'create_eager_joins', 'propagate_options', + 'attributes', 'statement', 'from_clause', 'whereclause', + 'order_by', 'labels', '_for_update_arg', 'runid', 'partials' + ) + + def __init__(self, query): + + if query._statement is not None: + if isinstance(query._statement, expression.SelectBase) and \ + not query._statement._textual and \ + not query._statement.use_labels: + self.statement = query._statement.apply_labels() + else: + self.statement = query._statement + else: + self.statement = None + self.from_clause = query._from_obj + self.whereclause = query._criterion + self.order_by = query._order_by + + self.multi_row_eager_loaders = False + self.adapter = None + self.froms = () + self.for_update = None + self.query = query + self.session = query.session + self.autoflush = query._autoflush + self.populate_existing = query._populate_existing + self.invoke_all_eagers = query._invoke_all_eagers + self.version_check = query._version_check + self.refresh_state = query._refresh_state + self.primary_columns = [] + self.secondary_columns = [] + self.eager_order_by = [] + self.eager_joins = {} + self.create_eager_joins = [] + self.propagate_options = set(o for o in query._with_options if + o.propagate_to_loaders) + self.attributes = query._attributes.copy() + + +class AliasOption(interfaces.MapperOption): + + def __init__(self, alias): + r"""Return a :class:`.MapperOption` that will indicate to the :class:`.Query` + that the main table has been aliased. + + This is a seldom-used option to suit the + very rare case that :func:`.contains_eager` + is being used in conjunction with a user-defined SELECT + statement that aliases the parent table. E.g.:: + + # define an aliased UNION called 'ulist' + ulist = users.select(users.c.user_id==7).\ + union(users.select(users.c.user_id>7)).\ + alias('ulist') + + # add on an eager load of "addresses" + statement = ulist.outerjoin(addresses).\ + select().apply_labels() + + # create query, indicating "ulist" will be an + # alias for the main table, "addresses" + # property should be eager loaded + query = session.query(User).options( + contains_alias(ulist), + contains_eager(User.addresses)) + + # then get results via the statement + results = query.from_statement(statement).all() + + :param alias: is the string name of an alias, or a + :class:`~.sql.expression.Alias` object representing + the alias. + + """ + self.alias = alias + + def process_query(self, query): + if isinstance(self.alias, util.string_types): + alias = query._mapper_zero().mapped_table.alias(self.alias) + else: + alias = self.alias + query._from_obj_alias = sql_util.ColumnAdapter(alias) diff --git a/app/lib/sqlalchemy/orm/relationships.py b/app/lib/sqlalchemy/orm/relationships.py new file mode 100644 index 0000000..1298e88 --- /dev/null +++ b/app/lib/sqlalchemy/orm/relationships.py @@ -0,0 +1,2875 @@ +# orm/relationships.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Heuristics related to join conditions as used in +:func:`.relationship`. + +Provides the :class:`.JoinCondition` object, which encapsulates +SQL annotation and aliasing behavior focused on the `primaryjoin` +and `secondaryjoin` aspects of :func:`.relationship`. + +""" +from __future__ import absolute_import +from .. import sql, util, exc as sa_exc, schema, log + +import weakref +from .util import CascadeOptions, _orm_annotate, _orm_deannotate +from . import dependency +from . import attributes +from ..sql.util import ( + ClauseAdapter, + join_condition, _shallow_annotate, visit_binary_product, + _deep_deannotate, selectables_overlap, adapt_criterion_to_null +) +from ..sql import operators, expression, visitors +from .interfaces import (MANYTOMANY, MANYTOONE, ONETOMANY, + StrategizedProperty, PropComparator) +from ..inspection import inspect +from . import mapper as mapperlib +import collections + + +def remote(expr): + """Annotate a portion of a primaryjoin expression + with a 'remote' annotation. + + See the section :ref:`relationship_custom_foreign` for a + description of use. + + .. versionadded:: 0.8 + + .. seealso:: + + :ref:`relationship_custom_foreign` + + :func:`.foreign` + + """ + return _annotate_columns(expression._clause_element_as_expr(expr), + {"remote": True}) + + +def foreign(expr): + """Annotate a portion of a primaryjoin expression + with a 'foreign' annotation. + + See the section :ref:`relationship_custom_foreign` for a + description of use. + + .. versionadded:: 0.8 + + .. seealso:: + + :ref:`relationship_custom_foreign` + + :func:`.remote` + + """ + + return _annotate_columns(expression._clause_element_as_expr(expr), + {"foreign": True}) + + +@log.class_logger +@util.langhelpers.dependency_for("sqlalchemy.orm.properties") +class RelationshipProperty(StrategizedProperty): + """Describes an object property that holds a single item or list + of items that correspond to a related database table. + + Public constructor is the :func:`.orm.relationship` function. + + See also: + + :ref:`relationship_config_toplevel` + + """ + + strategy_wildcard_key = 'relationship' + + _dependency_processor = None + + def __init__(self, argument, + secondary=None, primaryjoin=None, + secondaryjoin=None, + foreign_keys=None, + uselist=None, + order_by=False, + backref=None, + back_populates=None, + post_update=False, + cascade=False, extension=None, + viewonly=False, lazy=True, + collection_class=None, passive_deletes=False, + passive_updates=True, remote_side=None, + enable_typechecks=True, join_depth=None, + comparator_factory=None, + single_parent=False, innerjoin=False, + distinct_target_key=None, + doc=None, + active_history=False, + cascade_backrefs=True, + load_on_pending=False, + bake_queries=True, + _local_remote_pairs=None, + query_class=None, + info=None): + """Provide a relationship between two mapped classes. + + This corresponds to a parent-child or associative table relationship. + The constructed class is an instance of + :class:`.RelationshipProperty`. + + A typical :func:`.relationship`, used in a classical mapping:: + + mapper(Parent, properties={ + 'children': relationship(Child) + }) + + Some arguments accepted by :func:`.relationship` optionally accept a + callable function, which when called produces the desired value. + The callable is invoked by the parent :class:`.Mapper` at "mapper + initialization" time, which happens only when mappers are first used, + and is assumed to be after all mappings have been constructed. This + can be used to resolve order-of-declaration and other dependency + issues, such as if ``Child`` is declared below ``Parent`` in the same + file:: + + mapper(Parent, properties={ + "children":relationship(lambda: Child, + order_by=lambda: Child.id) + }) + + When using the :ref:`declarative_toplevel` extension, the Declarative + initializer allows string arguments to be passed to + :func:`.relationship`. These string arguments are converted into + callables that evaluate the string as Python code, using the + Declarative class-registry as a namespace. This allows the lookup of + related classes to be automatic via their string name, and removes the + need to import related classes at all into the local module space:: + + from sqlalchemy.ext.declarative import declarative_base + + Base = declarative_base() + + class Parent(Base): + __tablename__ = 'parent' + id = Column(Integer, primary_key=True) + children = relationship("Child", order_by="Child.id") + + .. seealso:: + + :ref:`relationship_config_toplevel` - Full introductory and + reference documentation for :func:`.relationship`. + + :ref:`orm_tutorial_relationship` - ORM tutorial introduction. + + :param argument: + a mapped class, or actual :class:`.Mapper` instance, representing + the target of the relationship. + + :paramref:`~.relationship.argument` may also be passed as a callable + function which is evaluated at mapper initialization time, and may + be passed as a Python-evaluable string when using Declarative. + + .. seealso:: + + :ref:`declarative_configuring_relationships` - further detail + on relationship configuration when using Declarative. + + :param secondary: + for a many-to-many relationship, specifies the intermediary + table, and is typically an instance of :class:`.Table`. + In less common circumstances, the argument may also be specified + as an :class:`.Alias` construct, or even a :class:`.Join` construct. + + :paramref:`~.relationship.secondary` may + also be passed as a callable function which is evaluated at + mapper initialization time. When using Declarative, it may also + be a string argument noting the name of a :class:`.Table` that is + present in the :class:`.MetaData` collection associated with the + parent-mapped :class:`.Table`. + + The :paramref:`~.relationship.secondary` keyword argument is + typically applied in the case where the intermediary :class:`.Table` + is not otherwise expressed in any direct class mapping. If the + "secondary" table is also explicitly mapped elsewhere (e.g. as in + :ref:`association_pattern`), one should consider applying the + :paramref:`~.relationship.viewonly` flag so that this + :func:`.relationship` is not used for persistence operations which + may conflict with those of the association object pattern. + + .. seealso:: + + :ref:`relationships_many_to_many` - Reference example of "many + to many". + + :ref:`orm_tutorial_many_to_many` - ORM tutorial introduction to + many-to-many relationships. + + :ref:`self_referential_many_to_many` - Specifics on using + many-to-many in a self-referential case. + + :ref:`declarative_many_to_many` - Additional options when using + Declarative. + + :ref:`association_pattern` - an alternative to + :paramref:`~.relationship.secondary` when composing association + table relationships, allowing additional attributes to be + specified on the association table. + + :ref:`composite_secondary_join` - a lesser-used pattern which + in some cases can enable complex :func:`.relationship` SQL + conditions to be used. + + .. versionadded:: 0.9.2 :paramref:`~.relationship.secondary` works + more effectively when referring to a :class:`.Join` instance. + + :param active_history=False: + When ``True``, indicates that the "previous" value for a + many-to-one reference should be loaded when replaced, if + not already loaded. Normally, history tracking logic for + simple many-to-ones only needs to be aware of the "new" + value in order to perform a flush. This flag is available + for applications that make use of + :func:`.attributes.get_history` which also need to know + the "previous" value of the attribute. + + :param backref: + indicates the string name of a property to be placed on the related + mapper's class that will handle this relationship in the other + direction. The other property will be created automatically + when the mappers are configured. Can also be passed as a + :func:`.backref` object to control the configuration of the + new relationship. + + .. seealso:: + + :ref:`relationships_backref` - Introductory documentation and + examples. + + :paramref:`~.relationship.back_populates` - alternative form + of backref specification. + + :func:`.backref` - allows control over :func:`.relationship` + configuration when using :paramref:`~.relationship.backref`. + + + :param back_populates: + Takes a string name and has the same meaning as + :paramref:`~.relationship.backref`, except the complementing + property is **not** created automatically, and instead must be + configured explicitly on the other mapper. The complementing + property should also indicate + :paramref:`~.relationship.back_populates` to this relationship to + ensure proper functioning. + + .. seealso:: + + :ref:`relationships_backref` - Introductory documentation and + examples. + + :paramref:`~.relationship.backref` - alternative form + of backref specification. + + :param bake_queries=True: + Use the :class:`.BakedQuery` cache to cache the construction of SQL + used in lazy loads, when the :func:`.bake_lazy_loaders` function has + first been called. Defaults to True and is intended to provide an + "opt out" flag per-relationship when the baked query cache system is + in use. + + .. warning:: + + This flag **only** has an effect when the application-wide + :func:`.bake_lazy_loaders` function has been called. It + defaults to True so is an "opt out" flag. + + Setting this flag to False when baked queries are otherwise in + use might be to reduce + ORM memory use for this :func:`.relationship`, or to work around + unresolved stability issues observed within the baked query + cache system. + + .. versionadded:: 1.0.0 + + .. seealso:: + + :ref:`baked_toplevel` + + :param cascade: + a comma-separated list of cascade rules which determines how + Session operations should be "cascaded" from parent to child. + This defaults to ``False``, which means the default cascade + should be used - this default cascade is ``"save-update, merge"``. + + The available cascades are ``save-update``, ``merge``, + ``expunge``, ``delete``, ``delete-orphan``, and ``refresh-expire``. + An additional option, ``all`` indicates shorthand for + ``"save-update, merge, refresh-expire, + expunge, delete"``, and is often used as in ``"all, delete-orphan"`` + to indicate that related objects should follow along with the + parent object in all cases, and be deleted when de-associated. + + .. seealso:: + + :ref:`unitofwork_cascades` - Full detail on each of the available + cascade options. + + :ref:`tutorial_delete_cascade` - Tutorial example describing + a delete cascade. + + :param cascade_backrefs=True: + a boolean value indicating if the ``save-update`` cascade should + operate along an assignment event intercepted by a backref. + When set to ``False``, the attribute managed by this relationship + will not cascade an incoming transient object into the session of a + persistent parent, if the event is received via backref. + + .. seealso:: + + :ref:`backref_cascade` - Full discussion and examples on how + the :paramref:`~.relationship.cascade_backrefs` option is used. + + :param collection_class: + a class or callable that returns a new list-holding object. will + be used in place of a plain list for storing elements. + + .. seealso:: + + :ref:`custom_collections` - Introductory documentation and + examples. + + :param comparator_factory: + a class which extends :class:`.RelationshipProperty.Comparator` + which provides custom SQL clause generation for comparison + operations. + + .. seealso:: + + :class:`.PropComparator` - some detail on redefining comparators + at this level. + + :ref:`custom_comparators` - Brief intro to this feature. + + + :param distinct_target_key=None: + Indicate if a "subquery" eager load should apply the DISTINCT + keyword to the innermost SELECT statement. When left as ``None``, + the DISTINCT keyword will be applied in those cases when the target + columns do not comprise the full primary key of the target table. + When set to ``True``, the DISTINCT keyword is applied to the + innermost SELECT unconditionally. + + It may be desirable to set this flag to False when the DISTINCT is + reducing performance of the innermost subquery beyond that of what + duplicate innermost rows may be causing. + + .. versionadded:: 0.8.3 - + :paramref:`~.relationship.distinct_target_key` allows the + subquery eager loader to apply a DISTINCT modifier to the + innermost SELECT. + + .. versionchanged:: 0.9.0 - + :paramref:`~.relationship.distinct_target_key` now defaults to + ``None``, so that the feature enables itself automatically for + those cases where the innermost query targets a non-unique + key. + + .. seealso:: + + :ref:`loading_toplevel` - includes an introduction to subquery + eager loading. + + :param doc: + docstring which will be applied to the resulting descriptor. + + :param extension: + an :class:`.AttributeExtension` instance, or list of extensions, + which will be prepended to the list of attribute listeners for + the resulting descriptor placed on the class. + + .. deprecated:: 0.7 Please see :class:`.AttributeEvents`. + + :param foreign_keys: + + a list of columns which are to be used as "foreign key" + columns, or columns which refer to the value in a remote + column, within the context of this :func:`.relationship` + object's :paramref:`~.relationship.primaryjoin` condition. + That is, if the :paramref:`~.relationship.primaryjoin` + condition of this :func:`.relationship` is ``a.id == + b.a_id``, and the values in ``b.a_id`` are required to be + present in ``a.id``, then the "foreign key" column of this + :func:`.relationship` is ``b.a_id``. + + In normal cases, the :paramref:`~.relationship.foreign_keys` + parameter is **not required.** :func:`.relationship` will + automatically determine which columns in the + :paramref:`~.relationship.primaryjoin` conditition are to be + considered "foreign key" columns based on those + :class:`.Column` objects that specify :class:`.ForeignKey`, + or are otherwise listed as referencing columns in a + :class:`.ForeignKeyConstraint` construct. + :paramref:`~.relationship.foreign_keys` is only needed when: + + 1. There is more than one way to construct a join from the local + table to the remote table, as there are multiple foreign key + references present. Setting ``foreign_keys`` will limit the + :func:`.relationship` to consider just those columns specified + here as "foreign". + + .. versionchanged:: 0.8 + A multiple-foreign key join ambiguity can be resolved by + setting the :paramref:`~.relationship.foreign_keys` + parameter alone, without the need to explicitly set + :paramref:`~.relationship.primaryjoin` as well. + + 2. The :class:`.Table` being mapped does not actually have + :class:`.ForeignKey` or :class:`.ForeignKeyConstraint` + constructs present, often because the table + was reflected from a database that does not support foreign key + reflection (MySQL MyISAM). + + 3. The :paramref:`~.relationship.primaryjoin` argument is used to + construct a non-standard join condition, which makes use of + columns or expressions that do not normally refer to their + "parent" column, such as a join condition expressed by a + complex comparison using a SQL function. + + The :func:`.relationship` construct will raise informative + error messages that suggest the use of the + :paramref:`~.relationship.foreign_keys` parameter when + presented with an ambiguous condition. In typical cases, + if :func:`.relationship` doesn't raise any exceptions, the + :paramref:`~.relationship.foreign_keys` parameter is usually + not needed. + + :paramref:`~.relationship.foreign_keys` may also be passed as a + callable function which is evaluated at mapper initialization time, + and may be passed as a Python-evaluable string when using + Declarative. + + .. seealso:: + + :ref:`relationship_foreign_keys` + + :ref:`relationship_custom_foreign` + + :func:`.foreign` - allows direct annotation of the "foreign" + columns within a :paramref:`~.relationship.primaryjoin` condition. + + .. versionadded:: 0.8 + The :func:`.foreign` annotation can also be applied + directly to the :paramref:`~.relationship.primaryjoin` + expression, which is an alternate, more specific system of + describing which columns in a particular + :paramref:`~.relationship.primaryjoin` should be considered + "foreign". + + :param info: Optional data dictionary which will be populated into the + :attr:`.MapperProperty.info` attribute of this object. + + .. versionadded:: 0.8 + + :param innerjoin=False: + when ``True``, joined eager loads will use an inner join to join + against related tables instead of an outer join. The purpose + of this option is generally one of performance, as inner joins + generally perform better than outer joins. + + This flag can be set to ``True`` when the relationship references an + object via many-to-one using local foreign keys that are not + nullable, or when the reference is one-to-one or a collection that + is guaranteed to have one or at least one entry. + + The option supports the same "nested" and "unnested" options as + that of :paramref:`.joinedload.innerjoin`. See that flag + for details on nested / unnested behaviors. + + .. seealso:: + + :paramref:`.joinedload.innerjoin` - the option as specified by + loader option, including detail on nesting behavior. + + :ref:`what_kind_of_loading` - Discussion of some details of + various loader options. + + + :param join_depth: + when non-``None``, an integer value indicating how many levels + deep "eager" loaders should join on a self-referring or cyclical + relationship. The number counts how many times the same Mapper + shall be present in the loading condition along a particular join + branch. When left at its default of ``None``, eager loaders + will stop chaining when they encounter a the same target mapper + which is already higher up in the chain. This option applies + both to joined- and subquery- eager loaders. + + .. seealso:: + + :ref:`self_referential_eager_loading` - Introductory documentation + and examples. + + :param lazy='select': specifies + how the related items should be loaded. Default value is + ``select``. Values include: + + * ``select`` - items should be loaded lazily when the property is + first accessed, using a separate SELECT statement, or identity map + fetch for simple many-to-one references. + + * ``immediate`` - items should be loaded as the parents are loaded, + using a separate SELECT statement, or identity map fetch for + simple many-to-one references. + + * ``joined`` - items should be loaded "eagerly" in the same query as + that of the parent, using a JOIN or LEFT OUTER JOIN. Whether + the join is "outer" or not is determined by the + :paramref:`~.relationship.innerjoin` parameter. + + * ``subquery`` - items should be loaded "eagerly" as the parents are + loaded, using one additional SQL statement, which issues a JOIN to + a subquery of the original statement, for each collection + requested. + + * ``noload`` - no loading should occur at any time. This is to + support "write-only" attributes, or attributes which are + populated in some manner specific to the application. + + * ``raise`` - lazy loading is disallowed; accessing + the attribute, if its value were not already loaded via eager + loading, will raise an :exc:`~sqlalchemy.exc.InvalidRequestError`. + This strategy can be used when objects are to be detached from + their attached :class:`.Session` after they are loaded. + + .. versionadded:: 1.1 + + * ``raise_on_sql`` - lazy loading that emits SQL is disallowed; + accessing the attribute, if its value were not already loaded via + eager loading, will raise an + :exc:`~sqlalchemy.exc.InvalidRequestError`, **if the lazy load + needs to emit SQL**. If the lazy load can pull the related value + from the identity map or determine that it should be None, the + value is loaded. This strategy can be used when objects will + remain associated with the attached :class:`.Session`, however + additional SELECT statements should be blocked. + + .. versionadded:: 1.1 + + * ``dynamic`` - the attribute will return a pre-configured + :class:`.Query` object for all read + operations, onto which further filtering operations can be + applied before iterating the results. See + the section :ref:`dynamic_relationship` for more details. + + * True - a synonym for 'select' + + * False - a synonym for 'joined' + + * None - a synonym for 'noload' + + .. seealso:: + + :doc:`/orm/loading_relationships` - Full documentation on relationship loader + configuration. + + :ref:`dynamic_relationship` - detail on the ``dynamic`` option. + + :ref:`collections_noload_raiseload` - notes on "noload" and "raise" + + :param load_on_pending=False: + Indicates loading behavior for transient or pending parent objects. + + When set to ``True``, causes the lazy-loader to + issue a query for a parent object that is not persistent, meaning it + has never been flushed. This may take effect for a pending object + when autoflush is disabled, or for a transient object that has been + "attached" to a :class:`.Session` but is not part of its pending + collection. + + The :paramref:`~.relationship.load_on_pending` flag does not improve + behavior when the ORM is used normally - object references should be + constructed at the object level, not at the foreign key level, so + that they are present in an ordinary way before a flush proceeds. + This flag is not not intended for general use. + + .. seealso:: + + :meth:`.Session.enable_relationship_loading` - this method + establishes "load on pending" behavior for the whole object, and + also allows loading on objects that remain transient or + detached. + + :param order_by: + indicates the ordering that should be applied when loading these + items. :paramref:`~.relationship.order_by` is expected to refer to + one of the :class:`.Column` objects to which the target class is + mapped, or the attribute itself bound to the target class which + refers to the column. + + :paramref:`~.relationship.order_by` may also be passed as a callable + function which is evaluated at mapper initialization time, and may + be passed as a Python-evaluable string when using Declarative. + + :param passive_deletes=False: + Indicates loading behavior during delete operations. + + A value of True indicates that unloaded child items should not + be loaded during a delete operation on the parent. Normally, + when a parent item is deleted, all child items are loaded so + that they can either be marked as deleted, or have their + foreign key to the parent set to NULL. Marking this flag as + True usually implies an ON DELETE rule is in + place which will handle updating/deleting child rows on the + database side. + + Additionally, setting the flag to the string value 'all' will + disable the "nulling out" of the child foreign keys, when there + is no delete or delete-orphan cascade enabled. This is + typically used when a triggering or error raise scenario is in + place on the database side. Note that the foreign key + attributes on in-session child objects will not be changed + after a flush occurs so this is a very special use-case + setting. + + .. seealso:: + + :ref:`passive_deletes` - Introductory documentation + and examples. + + :param passive_updates=True: + Indicates the persistence behavior to take when a referenced + primary key value changes in place, indicating that the referencing + foreign key columns will also need their value changed. + + When True, it is assumed that ``ON UPDATE CASCADE`` is configured on + the foreign key in the database, and that the database will + handle propagation of an UPDATE from a source column to + dependent rows. When False, the SQLAlchemy :func:`.relationship` + construct will attempt to emit its own UPDATE statements to + modify related targets. However note that SQLAlchemy **cannot** + emit an UPDATE for more than one level of cascade. Also, + setting this flag to False is not compatible in the case where + the database is in fact enforcing referential integrity, unless + those constraints are explicitly "deferred", if the target backend + supports it. + + It is highly advised that an application which is employing + mutable primary keys keeps ``passive_updates`` set to True, + and instead uses the referential integrity features of the database + itself in order to handle the change efficiently and fully. + + .. seealso:: + + :ref:`passive_updates` - Introductory documentation and + examples. + + :paramref:`.mapper.passive_updates` - a similar flag which + takes effect for joined-table inheritance mappings. + + :param post_update: + this indicates that the relationship should be handled by a + second UPDATE statement after an INSERT or before a + DELETE. Currently, it also will issue an UPDATE after the + instance was UPDATEd as well, although this technically should + be improved. This flag is used to handle saving bi-directional + dependencies between two individual rows (i.e. each row + references the other), where it would otherwise be impossible to + INSERT or DELETE both rows fully since one row exists before the + other. Use this flag when a particular mapping arrangement will + incur two rows that are dependent on each other, such as a table + that has a one-to-many relationship to a set of child rows, and + also has a column that references a single child row within that + list (i.e. both tables contain a foreign key to each other). If + a flush operation returns an error that a "cyclical + dependency" was detected, this is a cue that you might want to + use :paramref:`~.relationship.post_update` to "break" the cycle. + + .. seealso:: + + :ref:`post_update` - Introductory documentation and examples. + + :param primaryjoin: + a SQL expression that will be used as the primary + join of this child object against the parent object, or in a + many-to-many relationship the join of the primary object to the + association table. By default, this value is computed based on the + foreign key relationships of the parent and child tables (or + association table). + + :paramref:`~.relationship.primaryjoin` may also be passed as a + callable function which is evaluated at mapper initialization time, + and may be passed as a Python-evaluable string when using + Declarative. + + .. seealso:: + + :ref:`relationship_primaryjoin` + + :param remote_side: + used for self-referential relationships, indicates the column or + list of columns that form the "remote side" of the relationship. + + :paramref:`.relationship.remote_side` may also be passed as a + callable function which is evaluated at mapper initialization time, + and may be passed as a Python-evaluable string when using + Declarative. + + .. versionchanged:: 0.8 + The :func:`.remote` annotation can also be applied + directly to the ``primaryjoin`` expression, which is an + alternate, more specific system of describing which columns in a + particular ``primaryjoin`` should be considered "remote". + + .. seealso:: + + :ref:`self_referential` - in-depth explanation of how + :paramref:`~.relationship.remote_side` + is used to configure self-referential relationships. + + :func:`.remote` - an annotation function that accomplishes the + same purpose as :paramref:`~.relationship.remote_side`, typically + when a custom :paramref:`~.relationship.primaryjoin` condition + is used. + + :param query_class: + a :class:`.Query` subclass that will be used as the base of the + "appender query" returned by a "dynamic" relationship, that + is, a relationship that specifies ``lazy="dynamic"`` or was + otherwise constructed using the :func:`.orm.dynamic_loader` + function. + + .. seealso:: + + :ref:`dynamic_relationship` - Introduction to "dynamic" + relationship loaders. + + :param secondaryjoin: + a SQL expression that will be used as the join of + an association table to the child object. By default, this value is + computed based on the foreign key relationships of the association + and child tables. + + :paramref:`~.relationship.secondaryjoin` may also be passed as a + callable function which is evaluated at mapper initialization time, + and may be passed as a Python-evaluable string when using + Declarative. + + .. seealso:: + + :ref:`relationship_primaryjoin` + + :param single_parent: + when True, installs a validator which will prevent objects + from being associated with more than one parent at a time. + This is used for many-to-one or many-to-many relationships that + should be treated either as one-to-one or one-to-many. Its usage + is optional, except for :func:`.relationship` constructs which + are many-to-one or many-to-many and also + specify the ``delete-orphan`` cascade option. The + :func:`.relationship` construct itself will raise an error + instructing when this option is required. + + .. seealso:: + + :ref:`unitofwork_cascades` - includes detail on when the + :paramref:`~.relationship.single_parent` flag may be appropriate. + + :param uselist: + a boolean that indicates if this property should be loaded as a + list or a scalar. In most cases, this value is determined + automatically by :func:`.relationship` at mapper configuration + time, based on the type and direction + of the relationship - one to many forms a list, many to one + forms a scalar, many to many is a list. If a scalar is desired + where normally a list would be present, such as a bi-directional + one-to-one relationship, set :paramref:`~.relationship.uselist` to + False. + + The :paramref:`~.relationship.uselist` flag is also available on an + existing :func:`.relationship` construct as a read-only attribute, + which can be used to determine if this :func:`.relationship` deals + with collections or scalar attributes:: + + >>> User.addresses.property.uselist + True + + .. seealso:: + + :ref:`relationships_one_to_one` - Introduction to the "one to + one" relationship pattern, which is typically when the + :paramref:`~.relationship.uselist` flag is needed. + + :param viewonly=False: + when set to True, the relationship is used only for loading objects, + and not for any persistence operation. A :func:`.relationship` + which specifies :paramref:`~.relationship.viewonly` can work + with a wider range of SQL operations within the + :paramref:`~.relationship.primaryjoin` condition, including + operations that feature the use of a variety of comparison operators + as well as SQL functions such as :func:`~.sql.expression.cast`. The + :paramref:`~.relationship.viewonly` flag is also of general use when + defining any kind of :func:`~.relationship` that doesn't represent + the full set of related objects, to prevent modifications of the + collection from resulting in persistence operations. + + + """ + super(RelationshipProperty, self).__init__() + + self.uselist = uselist + self.argument = argument + self.secondary = secondary + self.primaryjoin = primaryjoin + self.secondaryjoin = secondaryjoin + self.post_update = post_update + self.direction = None + self.viewonly = viewonly + self.lazy = lazy + self.single_parent = single_parent + self._user_defined_foreign_keys = foreign_keys + self.collection_class = collection_class + self.passive_deletes = passive_deletes + self.cascade_backrefs = cascade_backrefs + self.passive_updates = passive_updates + self.remote_side = remote_side + self.enable_typechecks = enable_typechecks + self.query_class = query_class + self.innerjoin = innerjoin + self.distinct_target_key = distinct_target_key + self.doc = doc + self.active_history = active_history + self.join_depth = join_depth + self.local_remote_pairs = _local_remote_pairs + self.extension = extension + self.bake_queries = bake_queries + self.load_on_pending = load_on_pending + self.comparator_factory = comparator_factory or \ + RelationshipProperty.Comparator + self.comparator = self.comparator_factory(self, None) + util.set_creation_order(self) + + if info is not None: + self.info = info + + self.strategy_key = (("lazy", self.lazy), ) + + self._reverse_property = set() + + self.cascade = cascade if cascade is not False \ + else "save-update, merge" + + self.order_by = order_by + + self.back_populates = back_populates + + if self.back_populates: + if backref: + raise sa_exc.ArgumentError( + "backref and back_populates keyword arguments " + "are mutually exclusive") + self.backref = None + else: + self.backref = backref + + def instrument_class(self, mapper): + attributes.register_descriptor( + mapper.class_, + self.key, + comparator=self.comparator_factory(self, mapper), + parententity=mapper, + doc=self.doc, + ) + + class Comparator(PropComparator): + """Produce boolean, comparison, and other operators for + :class:`.RelationshipProperty` attributes. + + See the documentation for :class:`.PropComparator` for a brief + overview of ORM level operator definition. + + See also: + + :class:`.PropComparator` + + :class:`.ColumnProperty.Comparator` + + :class:`.ColumnOperators` + + :ref:`types_operators` + + :attr:`.TypeEngine.comparator_factory` + + """ + + _of_type = None + + def __init__( + self, prop, parentmapper, adapt_to_entity=None, of_type=None): + """Construction of :class:`.RelationshipProperty.Comparator` + is internal to the ORM's attribute mechanics. + + """ + self.prop = prop + self._parententity = parentmapper + self._adapt_to_entity = adapt_to_entity + if of_type: + self._of_type = of_type + + def adapt_to_entity(self, adapt_to_entity): + return self.__class__(self.property, self._parententity, + adapt_to_entity=adapt_to_entity, + of_type=self._of_type) + + @util.memoized_property + def mapper(self): + """The target :class:`.Mapper` referred to by this + :class:`.RelationshipProperty.Comparator`. + + This is the "target" or "remote" side of the + :func:`.relationship`. + + """ + return self.property.mapper + + @util.memoized_property + def _parententity(self): + return self.property.parent + + def _source_selectable(self): + if self._adapt_to_entity: + return self._adapt_to_entity.selectable + else: + return self.property.parent._with_polymorphic_selectable + + def __clause_element__(self): + adapt_from = self._source_selectable() + if self._of_type: + of_type = inspect(self._of_type).mapper + else: + of_type = None + + pj, sj, source, dest, \ + secondary, target_adapter = self.property._create_joins( + source_selectable=adapt_from, + source_polymorphic=True, + of_type=of_type) + if sj is not None: + return pj & sj + else: + return pj + + def of_type(self, cls): + """Produce a construct that represents a particular 'subtype' of + attribute for the parent class. + + Currently this is usable in conjunction with :meth:`.Query.join` + and :meth:`.Query.outerjoin`. + + """ + return RelationshipProperty.Comparator( + self.property, + self._parententity, + adapt_to_entity=self._adapt_to_entity, + of_type=cls) + + def in_(self, other): + """Produce an IN clause - this is not implemented + for :func:`~.orm.relationship`-based attributes at this time. + + """ + raise NotImplementedError('in_() not yet supported for ' + 'relationships. For a simple ' + 'many-to-one, use in_() against ' + 'the set of foreign key values.') + + __hash__ = None + + def __eq__(self, other): + """Implement the ``==`` operator. + + In a many-to-one context, such as:: + + MyClass.some_prop == + + this will typically produce a + clause such as:: + + mytable.related_id == + + Where ```` is the primary key of the given + object. + + The ``==`` operator provides partial functionality for non- + many-to-one comparisons: + + * Comparisons against collections are not supported. + Use :meth:`~.RelationshipProperty.Comparator.contains`. + * Compared to a scalar one-to-many, will produce a + clause that compares the target columns in the parent to + the given target. + * Compared to a scalar many-to-many, an alias + of the association table will be rendered as + well, forming a natural join that is part of the + main body of the query. This will not work for + queries that go beyond simple AND conjunctions of + comparisons, such as those which use OR. Use + explicit joins, outerjoins, or + :meth:`~.RelationshipProperty.Comparator.has` for + more comprehensive non-many-to-one scalar + membership tests. + * Comparisons against ``None`` given in a one-to-many + or many-to-many context produce a NOT EXISTS clause. + + """ + if isinstance(other, (util.NoneType, expression.Null)): + if self.property.direction in [ONETOMANY, MANYTOMANY]: + return ~self._criterion_exists() + else: + return _orm_annotate(self.property._optimized_compare( + None, adapt_source=self.adapter)) + elif self.property.uselist: + raise sa_exc.InvalidRequestError( + "Can't compare a collection to an object or collection; " + "use contains() to test for membership.") + else: + return _orm_annotate( + self.property._optimized_compare( + other, adapt_source=self.adapter)) + + def _criterion_exists(self, criterion=None, **kwargs): + if getattr(self, '_of_type', None): + info = inspect(self._of_type) + target_mapper, to_selectable, is_aliased_class = \ + info.mapper, info.selectable, info.is_aliased_class + if self.property._is_self_referential and not \ + is_aliased_class: + to_selectable = to_selectable.alias() + + single_crit = target_mapper._single_table_criterion + if single_crit is not None: + if criterion is not None: + criterion = single_crit & criterion + else: + criterion = single_crit + else: + is_aliased_class = False + to_selectable = None + + if self.adapter: + source_selectable = self._source_selectable() + else: + source_selectable = None + + pj, sj, source, dest, secondary, target_adapter = \ + self.property._create_joins( + dest_polymorphic=True, + dest_selectable=to_selectable, + source_selectable=source_selectable) + + for k in kwargs: + crit = getattr(self.property.mapper.class_, k) == kwargs[k] + if criterion is None: + criterion = crit + else: + criterion = criterion & crit + + # annotate the *local* side of the join condition, in the case + # of pj + sj this is the full primaryjoin, in the case of just + # pj its the local side of the primaryjoin. + if sj is not None: + j = _orm_annotate(pj) & sj + else: + j = _orm_annotate(pj, exclude=self.property.remote_side) + + if criterion is not None and target_adapter and not \ + is_aliased_class: + # limit this adapter to annotated only? + criterion = target_adapter.traverse(criterion) + + # only have the "joined left side" of what we + # return be subject to Query adaption. The right + # side of it is used for an exists() subquery and + # should not correlate or otherwise reach out + # to anything in the enclosing query. + if criterion is not None: + criterion = criterion._annotate( + {'no_replacement_traverse': True}) + + crit = j & sql.True_._ifnone(criterion) + + ex = sql.exists([1], crit, from_obj=dest).correlate_except(dest) + if secondary is not None: + ex = ex.correlate_except(secondary) + return ex + + def any(self, criterion=None, **kwargs): + """Produce an expression that tests a collection against + particular criterion, using EXISTS. + + An expression like:: + + session.query(MyClass).filter( + MyClass.somereference.any(SomeRelated.x==2) + ) + + + Will produce a query like:: + + SELECT * FROM my_table WHERE + EXISTS (SELECT 1 FROM related WHERE related.my_id=my_table.id + AND related.x=2) + + Because :meth:`~.RelationshipProperty.Comparator.any` uses + a correlated subquery, its performance is not nearly as + good when compared against large target tables as that of + using a join. + + :meth:`~.RelationshipProperty.Comparator.any` is particularly + useful for testing for empty collections:: + + session.query(MyClass).filter( + ~MyClass.somereference.any() + ) + + will produce:: + + SELECT * FROM my_table WHERE + NOT EXISTS (SELECT 1 FROM related WHERE + related.my_id=my_table.id) + + :meth:`~.RelationshipProperty.Comparator.any` is only + valid for collections, i.e. a :func:`.relationship` + that has ``uselist=True``. For scalar references, + use :meth:`~.RelationshipProperty.Comparator.has`. + + """ + if not self.property.uselist: + raise sa_exc.InvalidRequestError( + "'any()' not implemented for scalar " + "attributes. Use has()." + ) + + return self._criterion_exists(criterion, **kwargs) + + def has(self, criterion=None, **kwargs): + """Produce an expression that tests a scalar reference against + particular criterion, using EXISTS. + + An expression like:: + + session.query(MyClass).filter( + MyClass.somereference.has(SomeRelated.x==2) + ) + + + Will produce a query like:: + + SELECT * FROM my_table WHERE + EXISTS (SELECT 1 FROM related WHERE + related.id==my_table.related_id AND related.x=2) + + Because :meth:`~.RelationshipProperty.Comparator.has` uses + a correlated subquery, its performance is not nearly as + good when compared against large target tables as that of + using a join. + + :meth:`~.RelationshipProperty.Comparator.has` is only + valid for scalar references, i.e. a :func:`.relationship` + that has ``uselist=False``. For collection references, + use :meth:`~.RelationshipProperty.Comparator.any`. + + """ + if self.property.uselist: + raise sa_exc.InvalidRequestError( + "'has()' not implemented for collections. " + "Use any().") + return self._criterion_exists(criterion, **kwargs) + + def contains(self, other, **kwargs): + """Return a simple expression that tests a collection for + containment of a particular item. + + :meth:`~.RelationshipProperty.Comparator.contains` is + only valid for a collection, i.e. a + :func:`~.orm.relationship` that implements + one-to-many or many-to-many with ``uselist=True``. + + When used in a simple one-to-many context, an + expression like:: + + MyClass.contains(other) + + Produces a clause like:: + + mytable.id == + + Where ```` is the value of the foreign key + attribute on ``other`` which refers to the primary + key of its parent object. From this it follows that + :meth:`~.RelationshipProperty.Comparator.contains` is + very useful when used with simple one-to-many + operations. + + For many-to-many operations, the behavior of + :meth:`~.RelationshipProperty.Comparator.contains` + has more caveats. The association table will be + rendered in the statement, producing an "implicit" + join, that is, includes multiple tables in the FROM + clause which are equated in the WHERE clause:: + + query(MyClass).filter(MyClass.contains(other)) + + Produces a query like:: + + SELECT * FROM my_table, my_association_table AS + my_association_table_1 WHERE + my_table.id = my_association_table_1.parent_id + AND my_association_table_1.child_id = + + Where ```` would be the primary key of + ``other``. From the above, it is clear that + :meth:`~.RelationshipProperty.Comparator.contains` + will **not** work with many-to-many collections when + used in queries that move beyond simple AND + conjunctions, such as multiple + :meth:`~.RelationshipProperty.Comparator.contains` + expressions joined by OR. In such cases subqueries or + explicit "outer joins" will need to be used instead. + See :meth:`~.RelationshipProperty.Comparator.any` for + a less-performant alternative using EXISTS, or refer + to :meth:`.Query.outerjoin` as well as :ref:`ormtutorial_joins` + for more details on constructing outer joins. + + """ + if not self.property.uselist: + raise sa_exc.InvalidRequestError( + "'contains' not implemented for scalar " + "attributes. Use ==") + clause = self.property._optimized_compare( + other, adapt_source=self.adapter) + + if self.property.secondaryjoin is not None: + clause.negation_clause = \ + self.__negated_contains_or_equals(other) + + return clause + + def __negated_contains_or_equals(self, other): + if self.property.direction == MANYTOONE: + state = attributes.instance_state(other) + + def state_bindparam(x, state, col): + dict_ = state.dict + return sql.bindparam( + x, unique=True, + callable_=self.property._get_attr_w_warn_on_none( + col, + self.property.mapper._get_state_attr_by_column, + state, dict_, col, passive=attributes.PASSIVE_OFF + ) + ) + + def adapt(col): + if self.adapter: + return self.adapter(col) + else: + return col + + if self.property._use_get: + return sql.and_(*[ + sql.or_( + adapt(x) != state_bindparam(adapt(x), state, y), + adapt(x) == None) + for (x, y) in self.property.local_remote_pairs]) + + criterion = sql.and_(*[ + x == y for (x, y) in + zip( + self.property.mapper.primary_key, + self.property.mapper.primary_key_from_instance(other) + ) + ]) + + return ~self._criterion_exists(criterion) + + def __ne__(self, other): + """Implement the ``!=`` operator. + + In a many-to-one context, such as:: + + MyClass.some_prop != + + This will typically produce a clause such as:: + + mytable.related_id != + + Where ```` is the primary key of the + given object. + + The ``!=`` operator provides partial functionality for non- + many-to-one comparisons: + + * Comparisons against collections are not supported. + Use + :meth:`~.RelationshipProperty.Comparator.contains` + in conjunction with :func:`~.expression.not_`. + * Compared to a scalar one-to-many, will produce a + clause that compares the target columns in the parent to + the given target. + * Compared to a scalar many-to-many, an alias + of the association table will be rendered as + well, forming a natural join that is part of the + main body of the query. This will not work for + queries that go beyond simple AND conjunctions of + comparisons, such as those which use OR. Use + explicit joins, outerjoins, or + :meth:`~.RelationshipProperty.Comparator.has` in + conjunction with :func:`~.expression.not_` for + more comprehensive non-many-to-one scalar + membership tests. + * Comparisons against ``None`` given in a one-to-many + or many-to-many context produce an EXISTS clause. + + """ + if isinstance(other, (util.NoneType, expression.Null)): + if self.property.direction == MANYTOONE: + return _orm_annotate(~self.property._optimized_compare( + None, adapt_source=self.adapter)) + + else: + return self._criterion_exists() + elif self.property.uselist: + raise sa_exc.InvalidRequestError( + "Can't compare a collection" + " to an object or collection; use " + "contains() to test for membership.") + else: + return _orm_annotate(self.__negated_contains_or_equals(other)) + + @util.memoized_property + def property(self): + if mapperlib.Mapper._new_mappers: + mapperlib.Mapper._configure_all() + return self.prop + + def _with_parent(self, instance, alias_secondary=True): + assert instance is not None + return self._optimized_compare( + instance, value_is_parent=True, alias_secondary=alias_secondary) + + def _optimized_compare(self, state, value_is_parent=False, + adapt_source=None, + alias_secondary=True): + if state is not None: + state = attributes.instance_state(state) + + reverse_direction = not value_is_parent + + if state is None: + return self._lazy_none_clause( + reverse_direction, + adapt_source=adapt_source) + + if not reverse_direction: + criterion, bind_to_col = \ + self._lazy_strategy._lazywhere, \ + self._lazy_strategy._bind_to_col + else: + criterion, bind_to_col = \ + self._lazy_strategy._rev_lazywhere, \ + self._lazy_strategy._rev_bind_to_col + + if reverse_direction: + mapper = self.mapper + else: + mapper = self.parent + + dict_ = attributes.instance_dict(state.obj()) + + def visit_bindparam(bindparam): + if bindparam._identifying_key in bind_to_col: + bindparam.callable = self._get_attr_w_warn_on_none( + bind_to_col[bindparam._identifying_key], + mapper._get_state_attr_by_column, + state, dict_, + bind_to_col[bindparam._identifying_key], + passive=attributes.PASSIVE_OFF) + + if self.secondary is not None and alias_secondary: + criterion = ClauseAdapter( + self.secondary.alias()).\ + traverse(criterion) + + criterion = visitors.cloned_traverse( + criterion, {}, {'bindparam': visit_bindparam}) + + if adapt_source: + criterion = adapt_source(criterion) + return criterion + + def _get_attr_w_warn_on_none(self, column, fn, *arg, **kw): + def _go(): + value = fn(*arg, **kw) + if value is None: + util.warn( + "Got None for value of column %s; this is unsupported " + "for a relationship comparison and will not " + "currently produce an IS comparison " + "(but may in a future release)" % column) + return value + return _go + + def _lazy_none_clause(self, reverse_direction=False, adapt_source=None): + if not reverse_direction: + criterion, bind_to_col = \ + self._lazy_strategy._lazywhere, \ + self._lazy_strategy._bind_to_col + else: + criterion, bind_to_col = \ + self._lazy_strategy._rev_lazywhere, \ + self._lazy_strategy._rev_bind_to_col + + criterion = adapt_criterion_to_null(criterion, bind_to_col) + + if adapt_source: + criterion = adapt_source(criterion) + return criterion + + def __str__(self): + return str(self.parent.class_.__name__) + "." + self.key + + def merge(self, + session, + source_state, + source_dict, + dest_state, + dest_dict, + load, _recursive, _resolve_conflict_map): + + if load: + for r in self._reverse_property: + if (source_state, r) in _recursive: + return + + if "merge" not in self._cascade: + return + + if self.key not in source_dict: + return + + if self.uselist: + instances = source_state.get_impl(self.key).\ + get(source_state, source_dict) + if hasattr(instances, '_sa_adapter'): + # convert collections to adapters to get a true iterator + instances = instances._sa_adapter + + if load: + # for a full merge, pre-load the destination collection, + # so that individual _merge of each item pulls from identity + # map for those already present. + # also assumes CollectionAttrbiuteImpl behavior of loading + # "old" list in any case + dest_state.get_impl(self.key).get(dest_state, dest_dict) + + dest_list = [] + for current in instances: + current_state = attributes.instance_state(current) + current_dict = attributes.instance_dict(current) + _recursive[(current_state, self)] = True + obj = session._merge( + current_state, current_dict, + load=load, _recursive=_recursive, + _resolve_conflict_map=_resolve_conflict_map) + if obj is not None: + dest_list.append(obj) + + if not load: + coll = attributes.init_state_collection(dest_state, + dest_dict, self.key) + for c in dest_list: + coll.append_without_event(c) + else: + dest_state.get_impl(self.key).set( + dest_state, dest_dict, dest_list, + _adapt=False) + else: + current = source_dict[self.key] + if current is not None: + current_state = attributes.instance_state(current) + current_dict = attributes.instance_dict(current) + _recursive[(current_state, self)] = True + obj = session._merge( + current_state, current_dict, + load=load, _recursive=_recursive, + _resolve_conflict_map=_resolve_conflict_map) + else: + obj = None + + if not load: + dest_dict[self.key] = obj + else: + dest_state.get_impl(self.key).set(dest_state, + dest_dict, obj, None) + + def _value_as_iterable(self, state, dict_, key, + passive=attributes.PASSIVE_OFF): + """Return a list of tuples (state, obj) for the given + key. + + returns an empty list if the value is None/empty/PASSIVE_NO_RESULT + """ + + impl = state.manager[key].impl + x = impl.get(state, dict_, passive=passive) + if x is attributes.PASSIVE_NO_RESULT or x is None: + return [] + elif hasattr(impl, 'get_collection'): + return [ + (attributes.instance_state(o), o) for o in + impl.get_collection(state, dict_, x, passive=passive) + ] + else: + return [(attributes.instance_state(x), x)] + + def cascade_iterator(self, type_, state, dict_, + visited_states, halt_on=None): + # assert type_ in self._cascade + + # only actively lazy load on the 'delete' cascade + if type_ != 'delete' or self.passive_deletes: + passive = attributes.PASSIVE_NO_INITIALIZE + else: + passive = attributes.PASSIVE_OFF + + if type_ == 'save-update': + tuples = state.manager[self.key].impl.\ + get_all_pending(state, dict_) + + else: + tuples = self._value_as_iterable(state, dict_, self.key, + passive=passive) + + skip_pending = type_ == 'refresh-expire' and 'delete-orphan' \ + not in self._cascade + + for instance_state, c in tuples: + if instance_state in visited_states: + continue + + if c is None: + # would like to emit a warning here, but + # would not be consistent with collection.append(None) + # current behavior of silently skipping. + # see [ticket:2229] + continue + + instance_dict = attributes.instance_dict(c) + + if halt_on and halt_on(instance_state): + continue + + if skip_pending and not instance_state.key: + continue + + instance_mapper = instance_state.manager.mapper + + if not instance_mapper.isa(self.mapper.class_manager.mapper): + raise AssertionError("Attribute '%s' on class '%s' " + "doesn't handle objects " + "of type '%s'" % ( + self.key, + self.parent.class_, + c.__class__ + )) + + visited_states.add(instance_state) + + yield c, instance_mapper, instance_state, instance_dict + + def _add_reverse_property(self, key): + other = self.mapper.get_property(key, _configure_mappers=False) + self._reverse_property.add(other) + other._reverse_property.add(self) + + if not other.mapper.common_parent(self.parent): + raise sa_exc.ArgumentError( + 'reverse_property %r on ' + 'relationship %s references relationship %s, which ' + 'does not reference mapper %s' % + (key, self, other, self.parent)) + + if self.direction in (ONETOMANY, MANYTOONE) and self.direction \ + == other.direction: + raise sa_exc.ArgumentError( + '%s and back-reference %s are ' + 'both of the same direction %r. Did you mean to ' + 'set remote_side on the many-to-one side ?' % + (other, self, self.direction)) + + @util.memoized_property + def mapper(self): + """Return the targeted :class:`.Mapper` for this + :class:`.RelationshipProperty`. + + This is a lazy-initializing static attribute. + + """ + if util.callable(self.argument) and \ + not isinstance(self.argument, (type, mapperlib.Mapper)): + argument = self.argument() + else: + argument = self.argument + + if isinstance(argument, type): + mapper_ = mapperlib.class_mapper(argument, + configure=False) + elif isinstance(self.argument, mapperlib.Mapper): + mapper_ = argument + else: + raise sa_exc.ArgumentError( + "relationship '%s' expects " + "a class or a mapper argument (received: %s)" + % (self.key, type(argument))) + return mapper_ + + @util.memoized_property + @util.deprecated("0.7", "Use .target") + def table(self): + """Return the selectable linked to this + :class:`.RelationshipProperty` object's target + :class:`.Mapper`. + """ + return self.target + + def do_init(self): + self._check_conflicts() + self._process_dependent_arguments() + self._setup_join_conditions() + self._check_cascade_settings(self._cascade) + self._post_init() + self._generate_backref() + self._join_condition._warn_for_conflicting_sync_targets() + super(RelationshipProperty, self).do_init() + self._lazy_strategy = self._get_strategy((("lazy", "select"),)) + + def _process_dependent_arguments(self): + """Convert incoming configuration arguments to their + proper form. + + Callables are resolved, ORM annotations removed. + + """ + # accept callables for other attributes which may require + # deferred initialization. This technique is used + # by declarative "string configs" and some recipes. + for attr in ( + 'order_by', 'primaryjoin', 'secondaryjoin', + 'secondary', '_user_defined_foreign_keys', 'remote_side', + ): + attr_value = getattr(self, attr) + if util.callable(attr_value): + setattr(self, attr, attr_value()) + + # remove "annotations" which are present if mapped class + # descriptors are used to create the join expression. + for attr in 'primaryjoin', 'secondaryjoin': + val = getattr(self, attr) + if val is not None: + setattr(self, attr, _orm_deannotate( + expression._only_column_elements(val, attr)) + ) + + # ensure expressions in self.order_by, foreign_keys, + # remote_side are all columns, not strings. + if self.order_by is not False and self.order_by is not None: + self.order_by = [ + expression._only_column_elements(x, "order_by") + for x in + util.to_list(self.order_by)] + + self._user_defined_foreign_keys = \ + util.column_set( + expression._only_column_elements(x, "foreign_keys") + for x in util.to_column_set( + self._user_defined_foreign_keys + )) + + self.remote_side = \ + util.column_set( + expression._only_column_elements(x, "remote_side") + for x in + util.to_column_set(self.remote_side)) + + self.target = self.mapper.mapped_table + + def _setup_join_conditions(self): + self._join_condition = jc = JoinCondition( + parent_selectable=self.parent.mapped_table, + child_selectable=self.mapper.mapped_table, + parent_local_selectable=self.parent.local_table, + child_local_selectable=self.mapper.local_table, + primaryjoin=self.primaryjoin, + secondary=self.secondary, + secondaryjoin=self.secondaryjoin, + parent_equivalents=self.parent._equivalent_columns, + child_equivalents=self.mapper._equivalent_columns, + consider_as_foreign_keys=self._user_defined_foreign_keys, + local_remote_pairs=self.local_remote_pairs, + remote_side=self.remote_side, + self_referential=self._is_self_referential, + prop=self, + support_sync=not self.viewonly, + can_be_synced_fn=self._columns_are_mapped + ) + self.primaryjoin = jc.deannotated_primaryjoin + self.secondaryjoin = jc.deannotated_secondaryjoin + self.direction = jc.direction + self.local_remote_pairs = jc.local_remote_pairs + self.remote_side = jc.remote_columns + self.local_columns = jc.local_columns + self.synchronize_pairs = jc.synchronize_pairs + self._calculated_foreign_keys = jc.foreign_key_columns + self.secondary_synchronize_pairs = jc.secondary_synchronize_pairs + + def _check_conflicts(self): + """Test that this relationship is legal, warn about + inheritance conflicts.""" + + if self.parent.non_primary and not mapperlib.class_mapper( + self.parent.class_, + configure=False).has_property(self.key): + raise sa_exc.ArgumentError( + "Attempting to assign a new " + "relationship '%s' to a non-primary mapper on " + "class '%s'. New relationships can only be added " + "to the primary mapper, i.e. the very first mapper " + "created for class '%s' " % + (self.key, self.parent.class_.__name__, + self.parent.class_.__name__)) + + def _get_cascade(self): + """Return the current cascade setting for this + :class:`.RelationshipProperty`. + """ + return self._cascade + + def _set_cascade(self, cascade): + cascade = CascadeOptions(cascade) + if 'mapper' in self.__dict__: + self._check_cascade_settings(cascade) + self._cascade = cascade + + if self._dependency_processor: + self._dependency_processor.cascade = cascade + + cascade = property(_get_cascade, _set_cascade) + + def _check_cascade_settings(self, cascade): + if cascade.delete_orphan and not self.single_parent \ + and (self.direction is MANYTOMANY or self.direction + is MANYTOONE): + raise sa_exc.ArgumentError( + 'On %s, delete-orphan cascade is not supported ' + 'on a many-to-many or many-to-one relationship ' + 'when single_parent is not set. Set ' + 'single_parent=True on the relationship().' + % self) + if self.direction is MANYTOONE and self.passive_deletes: + util.warn("On %s, 'passive_deletes' is normally configured " + "on one-to-many, one-to-one, many-to-many " + "relationships only." + % self) + + if self.passive_deletes == 'all' and \ + ("delete" in cascade or + "delete-orphan" in cascade): + raise sa_exc.ArgumentError( + "On %s, can't set passive_deletes='all' in conjunction " + "with 'delete' or 'delete-orphan' cascade" % self) + + if cascade.delete_orphan: + self.mapper.primary_mapper()._delete_orphans.append( + (self.key, self.parent.class_) + ) + + def _columns_are_mapped(self, *cols): + """Return True if all columns in the given collection are + mapped by the tables referenced by this :class:`.Relationship`. + + """ + for c in cols: + if self.secondary is not None \ + and self.secondary.c.contains_column(c): + continue + if not self.parent.mapped_table.c.contains_column(c) and \ + not self.target.c.contains_column(c): + return False + return True + + def _generate_backref(self): + """Interpret the 'backref' instruction to create a + :func:`.relationship` complementary to this one.""" + + if self.parent.non_primary: + return + if self.backref is not None and not self.back_populates: + if isinstance(self.backref, util.string_types): + backref_key, kwargs = self.backref, {} + else: + backref_key, kwargs = self.backref + mapper = self.mapper.primary_mapper() + + if not mapper.concrete: + check = set(mapper.iterate_to_root()).\ + union(mapper.self_and_descendants) + for m in check: + if m.has_property(backref_key) and not m.concrete: + raise sa_exc.ArgumentError( + "Error creating backref " + "'%s' on relationship '%s': property of that " + "name exists on mapper '%s'" % + (backref_key, self, m)) + + # determine primaryjoin/secondaryjoin for the + # backref. Use the one we had, so that + # a custom join doesn't have to be specified in + # both directions. + if self.secondary is not None: + # for many to many, just switch primaryjoin/ + # secondaryjoin. use the annotated + # pj/sj on the _join_condition. + pj = kwargs.pop( + 'primaryjoin', + self._join_condition.secondaryjoin_minus_local) + sj = kwargs.pop( + 'secondaryjoin', + self._join_condition.primaryjoin_minus_local) + else: + pj = kwargs.pop( + 'primaryjoin', + self._join_condition.primaryjoin_reverse_remote) + sj = kwargs.pop('secondaryjoin', None) + if sj: + raise sa_exc.InvalidRequestError( + "Can't assign 'secondaryjoin' on a backref " + "against a non-secondary relationship." + ) + + foreign_keys = kwargs.pop('foreign_keys', + self._user_defined_foreign_keys) + parent = self.parent.primary_mapper() + kwargs.setdefault('viewonly', self.viewonly) + kwargs.setdefault('post_update', self.post_update) + kwargs.setdefault('passive_updates', self.passive_updates) + self.back_populates = backref_key + relationship = RelationshipProperty( + parent, self.secondary, + pj, sj, + foreign_keys=foreign_keys, + back_populates=self.key, + **kwargs) + mapper._configure_property(backref_key, relationship) + + if self.back_populates: + self._add_reverse_property(self.back_populates) + + def _post_init(self): + if self.uselist is None: + self.uselist = self.direction is not MANYTOONE + if not self.viewonly: + self._dependency_processor = \ + dependency.DependencyProcessor.from_relationship(self) + + @util.memoized_property + def _use_get(self): + """memoize the 'use_get' attribute of this RelationshipLoader's + lazyloader.""" + + strategy = self._lazy_strategy + return strategy.use_get + + @util.memoized_property + def _is_self_referential(self): + return self.mapper.common_parent(self.parent) + + def _create_joins(self, source_polymorphic=False, + source_selectable=None, dest_polymorphic=False, + dest_selectable=None, of_type=None): + if source_selectable is None: + if source_polymorphic and self.parent.with_polymorphic: + source_selectable = self.parent._with_polymorphic_selectable + + aliased = False + if dest_selectable is None: + if dest_polymorphic and self.mapper.with_polymorphic: + dest_selectable = self.mapper._with_polymorphic_selectable + aliased = True + else: + dest_selectable = self.mapper.mapped_table + + if self._is_self_referential and source_selectable is None: + dest_selectable = dest_selectable.alias() + aliased = True + else: + aliased = True + + dest_mapper = of_type or self.mapper + + single_crit = dest_mapper._single_table_criterion + aliased = aliased or (source_selectable is not None) + + primaryjoin, secondaryjoin, secondary, target_adapter, dest_selectable = \ + self._join_condition.join_targets( + source_selectable, dest_selectable, aliased, single_crit + ) + if source_selectable is None: + source_selectable = self.parent.local_table + if dest_selectable is None: + dest_selectable = self.mapper.local_table + return (primaryjoin, secondaryjoin, source_selectable, + dest_selectable, secondary, target_adapter) + + +def _annotate_columns(element, annotations): + def clone(elem): + if isinstance(elem, expression.ColumnClause): + elem = elem._annotate(annotations.copy()) + elem._copy_internals(clone=clone) + return elem + + if element is not None: + element = clone(element) + return element + + +class JoinCondition(object): + def __init__(self, + parent_selectable, + child_selectable, + parent_local_selectable, + child_local_selectable, + primaryjoin=None, + secondary=None, + secondaryjoin=None, + parent_equivalents=None, + child_equivalents=None, + consider_as_foreign_keys=None, + local_remote_pairs=None, + remote_side=None, + self_referential=False, + prop=None, + support_sync=True, + can_be_synced_fn=lambda *c: True + ): + self.parent_selectable = parent_selectable + self.parent_local_selectable = parent_local_selectable + self.child_selectable = child_selectable + self.child_local_selectable = child_local_selectable + self.parent_equivalents = parent_equivalents + self.child_equivalents = child_equivalents + self.primaryjoin = primaryjoin + self.secondaryjoin = secondaryjoin + self.secondary = secondary + self.consider_as_foreign_keys = consider_as_foreign_keys + self._local_remote_pairs = local_remote_pairs + self._remote_side = remote_side + self.prop = prop + self.self_referential = self_referential + self.support_sync = support_sync + self.can_be_synced_fn = can_be_synced_fn + self._determine_joins() + self._annotate_fks() + self._annotate_remote() + self._annotate_local() + self._setup_pairs() + self._check_foreign_cols(self.primaryjoin, True) + if self.secondaryjoin is not None: + self._check_foreign_cols(self.secondaryjoin, False) + self._determine_direction() + self._check_remote_side() + self._log_joins() + + def _log_joins(self): + if self.prop is None: + return + log = self.prop.logger + log.info('%s setup primary join %s', self.prop, + self.primaryjoin) + log.info('%s setup secondary join %s', self.prop, + self.secondaryjoin) + log.info('%s synchronize pairs [%s]', self.prop, + ','.join('(%s => %s)' % (l, r) for (l, r) in + self.synchronize_pairs)) + log.info('%s secondary synchronize pairs [%s]', self.prop, + ','.join('(%s => %s)' % (l, r) for (l, r) in + self.secondary_synchronize_pairs or [])) + log.info('%s local/remote pairs [%s]', self.prop, + ','.join('(%s / %s)' % (l, r) for (l, r) in + self.local_remote_pairs)) + log.info('%s remote columns [%s]', self.prop, + ','.join('%s' % col for col in self.remote_columns) + ) + log.info('%s local columns [%s]', self.prop, + ','.join('%s' % col for col in self.local_columns) + ) + log.info('%s relationship direction %s', self.prop, + self.direction) + + def _determine_joins(self): + """Determine the 'primaryjoin' and 'secondaryjoin' attributes, + if not passed to the constructor already. + + This is based on analysis of the foreign key relationships + between the parent and target mapped selectables. + + """ + if self.secondaryjoin is not None and self.secondary is None: + raise sa_exc.ArgumentError( + "Property %s specified with secondary " + "join condition but " + "no secondary argument" % self.prop) + + # find a join between the given mapper's mapped table and + # the given table. will try the mapper's local table first + # for more specificity, then if not found will try the more + # general mapped table, which in the case of inheritance is + # a join. + try: + consider_as_foreign_keys = self.consider_as_foreign_keys or None + if self.secondary is not None: + if self.secondaryjoin is None: + self.secondaryjoin = \ + join_condition( + self.child_selectable, + self.secondary, + a_subset=self.child_local_selectable, + consider_as_foreign_keys=consider_as_foreign_keys + ) + if self.primaryjoin is None: + self.primaryjoin = \ + join_condition( + self.parent_selectable, + self.secondary, + a_subset=self.parent_local_selectable, + consider_as_foreign_keys=consider_as_foreign_keys + ) + else: + if self.primaryjoin is None: + self.primaryjoin = \ + join_condition( + self.parent_selectable, + self.child_selectable, + a_subset=self.parent_local_selectable, + consider_as_foreign_keys=consider_as_foreign_keys + ) + except sa_exc.NoForeignKeysError: + if self.secondary is not None: + raise sa_exc.NoForeignKeysError( + "Could not determine join " + "condition between parent/child tables on " + "relationship %s - there are no foreign keys " + "linking these tables via secondary table '%s'. " + "Ensure that referencing columns are associated " + "with a ForeignKey or ForeignKeyConstraint, or " + "specify 'primaryjoin' and 'secondaryjoin' " + "expressions." % (self.prop, self.secondary)) + else: + raise sa_exc.NoForeignKeysError( + "Could not determine join " + "condition between parent/child tables on " + "relationship %s - there are no foreign keys " + "linking these tables. " + "Ensure that referencing columns are associated " + "with a ForeignKey or ForeignKeyConstraint, or " + "specify a 'primaryjoin' expression." % self.prop) + except sa_exc.AmbiguousForeignKeysError: + if self.secondary is not None: + raise sa_exc.AmbiguousForeignKeysError( + "Could not determine join " + "condition between parent/child tables on " + "relationship %s - there are multiple foreign key " + "paths linking the tables via secondary table '%s'. " + "Specify the 'foreign_keys' " + "argument, providing a list of those columns which " + "should be counted as containing a foreign key " + "reference from the secondary table to each of the " + "parent and child tables." + % (self.prop, self.secondary)) + else: + raise sa_exc.AmbiguousForeignKeysError( + "Could not determine join " + "condition between parent/child tables on " + "relationship %s - there are multiple foreign key " + "paths linking the tables. Specify the " + "'foreign_keys' argument, providing a list of those " + "columns which should be counted as containing a " + "foreign key reference to the parent table." + % self.prop) + + @property + def primaryjoin_minus_local(self): + return _deep_deannotate(self.primaryjoin, values=("local", "remote")) + + @property + def secondaryjoin_minus_local(self): + return _deep_deannotate(self.secondaryjoin, + values=("local", "remote")) + + @util.memoized_property + def primaryjoin_reverse_remote(self): + """Return the primaryjoin condition suitable for the + "reverse" direction. + + If the primaryjoin was delivered here with pre-existing + "remote" annotations, the local/remote annotations + are reversed. Otherwise, the local/remote annotations + are removed. + + """ + if self._has_remote_annotations: + def replace(element): + if "remote" in element._annotations: + v = element._annotations.copy() + del v['remote'] + v['local'] = True + return element._with_annotations(v) + elif "local" in element._annotations: + v = element._annotations.copy() + del v['local'] + v['remote'] = True + return element._with_annotations(v) + return visitors.replacement_traverse( + self.primaryjoin, {}, replace) + else: + if self._has_foreign_annotations: + # TODO: coverage + return _deep_deannotate(self.primaryjoin, + values=("local", "remote")) + else: + return _deep_deannotate(self.primaryjoin) + + def _has_annotation(self, clause, annotation): + for col in visitors.iterate(clause, {}): + if annotation in col._annotations: + return True + else: + return False + + @util.memoized_property + def _has_foreign_annotations(self): + return self._has_annotation(self.primaryjoin, "foreign") + + @util.memoized_property + def _has_remote_annotations(self): + return self._has_annotation(self.primaryjoin, "remote") + + def _annotate_fks(self): + """Annotate the primaryjoin and secondaryjoin + structures with 'foreign' annotations marking columns + considered as foreign. + + """ + if self._has_foreign_annotations: + return + + if self.consider_as_foreign_keys: + self._annotate_from_fk_list() + else: + self._annotate_present_fks() + + def _annotate_from_fk_list(self): + def check_fk(col): + if col in self.consider_as_foreign_keys: + return col._annotate({"foreign": True}) + self.primaryjoin = visitors.replacement_traverse( + self.primaryjoin, + {}, + check_fk + ) + if self.secondaryjoin is not None: + self.secondaryjoin = visitors.replacement_traverse( + self.secondaryjoin, + {}, + check_fk + ) + + def _annotate_present_fks(self): + if self.secondary is not None: + secondarycols = util.column_set(self.secondary.c) + else: + secondarycols = set() + + def is_foreign(a, b): + if isinstance(a, schema.Column) and \ + isinstance(b, schema.Column): + if a.references(b): + return a + elif b.references(a): + return b + + if secondarycols: + if a in secondarycols and b not in secondarycols: + return a + elif b in secondarycols and a not in secondarycols: + return b + + def visit_binary(binary): + if not isinstance(binary.left, sql.ColumnElement) or \ + not isinstance(binary.right, sql.ColumnElement): + return + + if "foreign" not in binary.left._annotations and \ + "foreign" not in binary.right._annotations: + col = is_foreign(binary.left, binary.right) + if col is not None: + if col.compare(binary.left): + binary.left = binary.left._annotate( + {"foreign": True}) + elif col.compare(binary.right): + binary.right = binary.right._annotate( + {"foreign": True}) + + self.primaryjoin = visitors.cloned_traverse( + self.primaryjoin, + {}, + {"binary": visit_binary} + ) + if self.secondaryjoin is not None: + self.secondaryjoin = visitors.cloned_traverse( + self.secondaryjoin, + {}, + {"binary": visit_binary} + ) + + def _refers_to_parent_table(self): + """Return True if the join condition contains column + comparisons where both columns are in both tables. + + """ + pt = self.parent_selectable + mt = self.child_selectable + result = [False] + + def visit_binary(binary): + c, f = binary.left, binary.right + if ( + isinstance(c, expression.ColumnClause) and + isinstance(f, expression.ColumnClause) and + pt.is_derived_from(c.table) and + pt.is_derived_from(f.table) and + mt.is_derived_from(c.table) and + mt.is_derived_from(f.table) + ): + result[0] = True + visitors.traverse( + self.primaryjoin, + {}, + {"binary": visit_binary} + ) + return result[0] + + def _tables_overlap(self): + """Return True if parent/child tables have some overlap.""" + + return selectables_overlap( + self.parent_selectable, self.child_selectable) + + def _annotate_remote(self): + """Annotate the primaryjoin and secondaryjoin + structures with 'remote' annotations marking columns + considered as part of the 'remote' side. + + """ + if self._has_remote_annotations: + return + + if self.secondary is not None: + self._annotate_remote_secondary() + elif self._local_remote_pairs or self._remote_side: + self._annotate_remote_from_args() + elif self._refers_to_parent_table(): + self._annotate_selfref(lambda col: "foreign" in col._annotations, False) + elif self._tables_overlap(): + self._annotate_remote_with_overlap() + else: + self._annotate_remote_distinct_selectables() + + def _annotate_remote_secondary(self): + """annotate 'remote' in primaryjoin, secondaryjoin + when 'secondary' is present. + + """ + def repl(element): + if self.secondary.c.contains_column(element): + return element._annotate({"remote": True}) + self.primaryjoin = visitors.replacement_traverse( + self.primaryjoin, {}, repl) + self.secondaryjoin = visitors.replacement_traverse( + self.secondaryjoin, {}, repl) + + def _annotate_selfref(self, fn, remote_side_given): + """annotate 'remote' in primaryjoin, secondaryjoin + when the relationship is detected as self-referential. + + """ + def visit_binary(binary): + equated = binary.left.compare(binary.right) + if isinstance(binary.left, expression.ColumnClause) and \ + isinstance(binary.right, expression.ColumnClause): + # assume one to many - FKs are "remote" + if fn(binary.left): + binary.left = binary.left._annotate({"remote": True}) + if fn(binary.right) and not equated: + binary.right = binary.right._annotate( + {"remote": True}) + elif not remote_side_given: + self._warn_non_column_elements() + + self.primaryjoin = visitors.cloned_traverse( + self.primaryjoin, {}, + {"binary": visit_binary}) + + def _annotate_remote_from_args(self): + """annotate 'remote' in primaryjoin, secondaryjoin + when the 'remote_side' or '_local_remote_pairs' + arguments are used. + + """ + if self._local_remote_pairs: + if self._remote_side: + raise sa_exc.ArgumentError( + "remote_side argument is redundant " + "against more detailed _local_remote_side " + "argument.") + + remote_side = [r for (l, r) in self._local_remote_pairs] + else: + remote_side = self._remote_side + + if self._refers_to_parent_table(): + self._annotate_selfref(lambda col: col in remote_side, True) + else: + def repl(element): + if element in remote_side: + return element._annotate({"remote": True}) + self.primaryjoin = visitors.replacement_traverse( + self.primaryjoin, {}, repl) + + def _annotate_remote_with_overlap(self): + """annotate 'remote' in primaryjoin, secondaryjoin + when the parent/child tables have some set of + tables in common, though is not a fully self-referential + relationship. + + """ + def visit_binary(binary): + binary.left, binary.right = proc_left_right(binary.left, + binary.right) + binary.right, binary.left = proc_left_right(binary.right, + binary.left) + + check_entities = self.prop is not None and \ + self.prop.mapper is not self.prop.parent + + def proc_left_right(left, right): + if isinstance(left, expression.ColumnClause) and \ + isinstance(right, expression.ColumnClause): + if self.child_selectable.c.contains_column(right) and \ + self.parent_selectable.c.contains_column(left): + right = right._annotate({"remote": True}) + elif check_entities and \ + right._annotations.get('parentmapper') is self.prop.mapper: + right = right._annotate({"remote": True}) + elif check_entities and \ + left._annotations.get('parentmapper') is self.prop.mapper: + left = left._annotate({"remote": True}) + else: + self._warn_non_column_elements() + + return left, right + + self.primaryjoin = visitors.cloned_traverse( + self.primaryjoin, {}, + {"binary": visit_binary}) + + def _annotate_remote_distinct_selectables(self): + """annotate 'remote' in primaryjoin, secondaryjoin + when the parent/child tables are entirely + separate. + + """ + def repl(element): + if self.child_selectable.c.contains_column(element) and \ + (not self.parent_local_selectable.c. + contains_column(element) or + self.child_local_selectable.c. + contains_column(element)): + return element._annotate({"remote": True}) + self.primaryjoin = visitors.replacement_traverse( + self.primaryjoin, {}, repl) + + def _warn_non_column_elements(self): + util.warn( + "Non-simple column elements in primary " + "join condition for property %s - consider using " + "remote() annotations to mark the remote side." + % self.prop + ) + + def _annotate_local(self): + """Annotate the primaryjoin and secondaryjoin + structures with 'local' annotations. + + This annotates all column elements found + simultaneously in the parent table + and the join condition that don't have a + 'remote' annotation set up from + _annotate_remote() or user-defined. + + """ + if self._has_annotation(self.primaryjoin, "local"): + return + + if self._local_remote_pairs: + local_side = util.column_set([l for (l, r) + in self._local_remote_pairs]) + else: + local_side = util.column_set(self.parent_selectable.c) + + def locals_(elem): + if "remote" not in elem._annotations and \ + elem in local_side: + return elem._annotate({"local": True}) + self.primaryjoin = visitors.replacement_traverse( + self.primaryjoin, {}, locals_ + ) + + def _check_remote_side(self): + if not self.local_remote_pairs: + raise sa_exc.ArgumentError( + 'Relationship %s could ' + 'not determine any unambiguous local/remote column ' + 'pairs based on join condition and remote_side ' + 'arguments. ' + 'Consider using the remote() annotation to ' + 'accurately mark those elements of the join ' + 'condition that are on the remote side of ' + 'the relationship.' % (self.prop, )) + + def _check_foreign_cols(self, join_condition, primary): + """Check the foreign key columns collected and emit error + messages.""" + + can_sync = False + + foreign_cols = self._gather_columns_with_annotation( + join_condition, "foreign") + + has_foreign = bool(foreign_cols) + + if primary: + can_sync = bool(self.synchronize_pairs) + else: + can_sync = bool(self.secondary_synchronize_pairs) + + if self.support_sync and can_sync or \ + (not self.support_sync and has_foreign): + return + + # from here below is just determining the best error message + # to report. Check for a join condition using any operator + # (not just ==), perhaps they need to turn on "viewonly=True". + if self.support_sync and has_foreign and not can_sync: + err = "Could not locate any simple equality expressions "\ + "involving locally mapped foreign key columns for "\ + "%s join condition "\ + "'%s' on relationship %s." % ( + primary and 'primary' or 'secondary', + join_condition, + self.prop + ) + err += \ + " Ensure that referencing columns are associated "\ + "with a ForeignKey or ForeignKeyConstraint, or are "\ + "annotated in the join condition with the foreign() "\ + "annotation. To allow comparison operators other than "\ + "'==', the relationship can be marked as viewonly=True." + + raise sa_exc.ArgumentError(err) + else: + err = "Could not locate any relevant foreign key columns "\ + "for %s join condition '%s' on relationship %s." % ( + primary and 'primary' or 'secondary', + join_condition, + self.prop + ) + err += \ + ' Ensure that referencing columns are associated '\ + 'with a ForeignKey or ForeignKeyConstraint, or are '\ + 'annotated in the join condition with the foreign() '\ + 'annotation.' + raise sa_exc.ArgumentError(err) + + def _determine_direction(self): + """Determine if this relationship is one to many, many to one, + many to many. + + """ + if self.secondaryjoin is not None: + self.direction = MANYTOMANY + else: + parentcols = util.column_set(self.parent_selectable.c) + targetcols = util.column_set(self.child_selectable.c) + + # fk collection which suggests ONETOMANY. + onetomany_fk = targetcols.intersection( + self.foreign_key_columns) + + # fk collection which suggests MANYTOONE. + + manytoone_fk = parentcols.intersection( + self.foreign_key_columns) + + if onetomany_fk and manytoone_fk: + # fks on both sides. test for overlap of local/remote + # with foreign key. + # we will gather columns directly from their annotations + # without deannotating, so that we can distinguish on a column + # that refers to itself. + + # 1. columns that are both remote and FK suggest + # onetomany. + onetomany_local = self._gather_columns_with_annotation( + self.primaryjoin, "remote", "foreign") + + # 2. columns that are FK but are not remote (e.g. local) + # suggest manytoone. + manytoone_local = set([c for c in + self._gather_columns_with_annotation( + self.primaryjoin, + "foreign") + if "remote" not in c._annotations]) + + # 3. if both collections are present, remove columns that + # refer to themselves. This is for the case of + # and_(Me.id == Me.remote_id, Me.version == Me.version) + if onetomany_local and manytoone_local: + self_equated = self.remote_columns.intersection( + self.local_columns + ) + onetomany_local = onetomany_local.difference(self_equated) + manytoone_local = manytoone_local.difference(self_equated) + + # at this point, if only one or the other collection is + # present, we know the direction, otherwise it's still + # ambiguous. + + if onetomany_local and not manytoone_local: + self.direction = ONETOMANY + elif manytoone_local and not onetomany_local: + self.direction = MANYTOONE + else: + raise sa_exc.ArgumentError( + "Can't determine relationship" + " direction for relationship '%s' - foreign " + "key columns within the join condition are present " + "in both the parent and the child's mapped tables. " + "Ensure that only those columns referring " + "to a parent column are marked as foreign, " + "either via the foreign() annotation or " + "via the foreign_keys argument." % self.prop) + elif onetomany_fk: + self.direction = ONETOMANY + elif manytoone_fk: + self.direction = MANYTOONE + else: + raise sa_exc.ArgumentError( + "Can't determine relationship " + "direction for relationship '%s' - foreign " + "key columns are present in neither the parent " + "nor the child's mapped tables" % self.prop) + + def _deannotate_pairs(self, collection): + """provide deannotation for the various lists of + pairs, so that using them in hashes doesn't incur + high-overhead __eq__() comparisons against + original columns mapped. + + """ + return [(x._deannotate(), y._deannotate()) + for x, y in collection] + + def _setup_pairs(self): + sync_pairs = [] + lrp = util.OrderedSet([]) + secondary_sync_pairs = [] + + def go(joincond, collection): + def visit_binary(binary, left, right): + if "remote" in right._annotations and \ + "remote" not in left._annotations and \ + self.can_be_synced_fn(left): + lrp.add((left, right)) + elif "remote" in left._annotations and \ + "remote" not in right._annotations and \ + self.can_be_synced_fn(right): + lrp.add((right, left)) + if binary.operator is operators.eq and \ + self.can_be_synced_fn(left, right): + if "foreign" in right._annotations: + collection.append((left, right)) + elif "foreign" in left._annotations: + collection.append((right, left)) + visit_binary_product(visit_binary, joincond) + + for joincond, collection in [ + (self.primaryjoin, sync_pairs), + (self.secondaryjoin, secondary_sync_pairs) + ]: + if joincond is None: + continue + go(joincond, collection) + + self.local_remote_pairs = self._deannotate_pairs(lrp) + self.synchronize_pairs = self._deannotate_pairs(sync_pairs) + self.secondary_synchronize_pairs = \ + self._deannotate_pairs(secondary_sync_pairs) + + _track_overlapping_sync_targets = weakref.WeakKeyDictionary() + + def _warn_for_conflicting_sync_targets(self): + if not self.support_sync: + return + + # we would like to detect if we are synchronizing any column + # pairs in conflict with another relationship that wishes to sync + # an entirely different column to the same target. This is a + # very rare edge case so we will try to minimize the memory/overhead + # impact of this check + for from_, to_ in [ + (from_, to_) for (from_, to_) in self.synchronize_pairs + ] + [ + (from_, to_) for (from_, to_) in self.secondary_synchronize_pairs + ]: + # save ourselves a ton of memory and overhead by only + # considering columns that are subject to a overlapping + # FK constraints at the core level. This condition can arise + # if multiple relationships overlap foreign() directly, but + # we're going to assume it's typically a ForeignKeyConstraint- + # level configuration that benefits from this warning. + if len(to_.foreign_keys) < 2: + continue + + if to_ not in self._track_overlapping_sync_targets: + self._track_overlapping_sync_targets[to_] = \ + weakref.WeakKeyDictionary({self.prop: from_}) + else: + other_props = [] + prop_to_from = self._track_overlapping_sync_targets[to_] + for pr, fr_ in prop_to_from.items(): + if pr.mapper in mapperlib._mapper_registry and \ + fr_ is not from_ and \ + pr not in self.prop._reverse_property: + other_props.append((pr, fr_)) + + if other_props: + util.warn( + "relationship '%s' will copy column %s to column %s, " + "which conflicts with relationship(s): %s. " + "Consider applying " + "viewonly=True to read-only relationships, or provide " + "a primaryjoin condition marking writable columns " + "with the foreign() annotation." % ( + self.prop, + from_, to_, + ", ".join( + "'%s' (copies %s to %s)" % (pr, fr_, to_) + for (pr, fr_) in other_props) + ) + ) + self._track_overlapping_sync_targets[to_][self.prop] = from_ + + @util.memoized_property + def remote_columns(self): + return self._gather_join_annotations("remote") + + @util.memoized_property + def local_columns(self): + return self._gather_join_annotations("local") + + @util.memoized_property + def foreign_key_columns(self): + return self._gather_join_annotations("foreign") + + @util.memoized_property + def deannotated_primaryjoin(self): + return _deep_deannotate(self.primaryjoin) + + @util.memoized_property + def deannotated_secondaryjoin(self): + if self.secondaryjoin is not None: + return _deep_deannotate(self.secondaryjoin) + else: + return None + + def _gather_join_annotations(self, annotation): + s = set( + self._gather_columns_with_annotation( + self.primaryjoin, annotation) + ) + if self.secondaryjoin is not None: + s.update( + self._gather_columns_with_annotation( + self.secondaryjoin, annotation) + ) + return set([x._deannotate() for x in s]) + + def _gather_columns_with_annotation(self, clause, *annotation): + annotation = set(annotation) + return set([ + col for col in visitors.iterate(clause, {}) + if annotation.issubset(col._annotations) + ]) + + def join_targets(self, source_selectable, + dest_selectable, + aliased, + single_crit=None): + """Given a source and destination selectable, create a + join between them. + + This takes into account aliasing the join clause + to reference the appropriate corresponding columns + in the target objects, as well as the extra child + criterion, equivalent column sets, etc. + + """ + + # place a barrier on the destination such that + # replacement traversals won't ever dig into it. + # its internal structure remains fixed + # regardless of context. + dest_selectable = _shallow_annotate( + dest_selectable, + {'no_replacement_traverse': True}) + + primaryjoin, secondaryjoin, secondary = self.primaryjoin, \ + self.secondaryjoin, self.secondary + + # adjust the join condition for single table inheritance, + # in the case that the join is to a subclass + # this is analogous to the + # "_adjust_for_single_table_inheritance()" method in Query. + + if single_crit is not None: + if secondaryjoin is not None: + secondaryjoin = secondaryjoin & single_crit + else: + primaryjoin = primaryjoin & single_crit + + if aliased: + if secondary is not None: + secondary = secondary.alias(flat=True) + primary_aliasizer = ClauseAdapter(secondary) + secondary_aliasizer = \ + ClauseAdapter(dest_selectable, + equivalents=self.child_equivalents).\ + chain(primary_aliasizer) + if source_selectable is not None: + primary_aliasizer = \ + ClauseAdapter(secondary).\ + chain(ClauseAdapter( + source_selectable, + equivalents=self.parent_equivalents)) + secondaryjoin = \ + secondary_aliasizer.traverse(secondaryjoin) + else: + primary_aliasizer = ClauseAdapter( + dest_selectable, + exclude_fn=_ColInAnnotations("local"), + equivalents=self.child_equivalents) + if source_selectable is not None: + primary_aliasizer.chain( + ClauseAdapter(source_selectable, + exclude_fn=_ColInAnnotations("remote"), + equivalents=self.parent_equivalents)) + secondary_aliasizer = None + + primaryjoin = primary_aliasizer.traverse(primaryjoin) + target_adapter = secondary_aliasizer or primary_aliasizer + target_adapter.exclude_fn = None + else: + target_adapter = None + return primaryjoin, secondaryjoin, secondary, \ + target_adapter, dest_selectable + + def create_lazy_clause(self, reverse_direction=False): + binds = util.column_dict() + equated_columns = util.column_dict() + + has_secondary = self.secondaryjoin is not None + + if has_secondary: + lookup = collections.defaultdict(list) + for l, r in self.local_remote_pairs: + lookup[l].append((l, r)) + equated_columns[r] = l + elif not reverse_direction: + for l, r in self.local_remote_pairs: + equated_columns[r] = l + else: + for l, r in self.local_remote_pairs: + equated_columns[l] = r + + def col_to_bind(col): + + if ( + (not reverse_direction and 'local' in col._annotations) or + reverse_direction and ( + (has_secondary and col in lookup) or + (not has_secondary and 'remote' in col._annotations) + ) + ): + if col not in binds: + binds[col] = sql.bindparam( + None, None, type_=col.type, unique=True) + return binds[col] + return None + + lazywhere = self.primaryjoin + if self.secondaryjoin is None or not reverse_direction: + lazywhere = visitors.replacement_traverse( + lazywhere, {}, col_to_bind) + + if self.secondaryjoin is not None: + secondaryjoin = self.secondaryjoin + if reverse_direction: + secondaryjoin = visitors.replacement_traverse( + secondaryjoin, {}, col_to_bind) + lazywhere = sql.and_(lazywhere, secondaryjoin) + + bind_to_col = dict((binds[col].key, col) for col in binds) + + # this is probably not necessary + lazywhere = _deep_deannotate(lazywhere) + + return lazywhere, bind_to_col, equated_columns + + +class _ColInAnnotations(object): + """Seralizable equivalent to: + + lambda c: "name" in c._annotations + """ + + def __init__(self, name): + self.name = name + + def __call__(self, c): + return self.name in c._annotations diff --git a/app/lib/sqlalchemy/orm/scoping.py b/app/lib/sqlalchemy/orm/scoping.py new file mode 100644 index 0000000..05b8813 --- /dev/null +++ b/app/lib/sqlalchemy/orm/scoping.py @@ -0,0 +1,184 @@ +# orm/scoping.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from .. import exc as sa_exc +from ..util import ScopedRegistry, ThreadLocalRegistry, warn +from . import class_mapper, exc as orm_exc +from .session import Session + + +__all__ = ['scoped_session'] + + +class scoped_session(object): + """Provides scoped management of :class:`.Session` objects. + + See :ref:`unitofwork_contextual` for a tutorial. + + """ + + session_factory = None + """The `session_factory` provided to `__init__` is stored in this + attribute and may be accessed at a later time. This can be useful when + a new non-scoped :class:`.Session` or :class:`.Connection` to the + database is needed.""" + + def __init__(self, session_factory, scopefunc=None): + """Construct a new :class:`.scoped_session`. + + :param session_factory: a factory to create new :class:`.Session` + instances. This is usually, but not necessarily, an instance + of :class:`.sessionmaker`. + :param scopefunc: optional function which defines + the current scope. If not passed, the :class:`.scoped_session` + object assumes "thread-local" scope, and will use + a Python ``threading.local()`` in order to maintain the current + :class:`.Session`. If passed, the function should return + a hashable token; this token will be used as the key in a + dictionary in order to store and retrieve the current + :class:`.Session`. + + """ + self.session_factory = session_factory + + if scopefunc: + self.registry = ScopedRegistry(session_factory, scopefunc) + else: + self.registry = ThreadLocalRegistry(session_factory) + + def __call__(self, **kw): + r"""Return the current :class:`.Session`, creating it + using the :attr:`.scoped_session.session_factory` if not present. + + :param \**kw: Keyword arguments will be passed to the + :attr:`.scoped_session.session_factory` callable, if an existing + :class:`.Session` is not present. If the :class:`.Session` is present + and keyword arguments have been passed, + :exc:`~sqlalchemy.exc.InvalidRequestError` is raised. + + """ + if kw: + scope = kw.pop('scope', False) + if scope is not None: + if self.registry.has(): + raise sa_exc.InvalidRequestError( + "Scoped session is already present; " + "no new arguments may be specified.") + else: + sess = self.session_factory(**kw) + self.registry.set(sess) + return sess + else: + return self.session_factory(**kw) + else: + return self.registry() + + def remove(self): + """Dispose of the current :class:`.Session`, if present. + + This will first call :meth:`.Session.close` method + on the current :class:`.Session`, which releases any existing + transactional/connection resources still being held; transactions + specifically are rolled back. The :class:`.Session` is then + discarded. Upon next usage within the same scope, + the :class:`.scoped_session` will produce a new + :class:`.Session` object. + + """ + + if self.registry.has(): + self.registry().close() + self.registry.clear() + + def configure(self, **kwargs): + """reconfigure the :class:`.sessionmaker` used by this + :class:`.scoped_session`. + + See :meth:`.sessionmaker.configure`. + + """ + + if self.registry.has(): + warn('At least one scoped session is already present. ' + ' configure() can not affect sessions that have ' + 'already been created.') + + self.session_factory.configure(**kwargs) + + def query_property(self, query_cls=None): + """return a class property which produces a :class:`.Query` object + against the class and the current :class:`.Session` when called. + + e.g.:: + + Session = scoped_session(sessionmaker()) + + class MyClass(object): + query = Session.query_property() + + # after mappers are defined + result = MyClass.query.filter(MyClass.name=='foo').all() + + Produces instances of the session's configured query class by + default. To override and use a custom implementation, provide + a ``query_cls`` callable. The callable will be invoked with + the class's mapper as a positional argument and a session + keyword argument. + + There is no limit to the number of query properties placed on + a class. + + """ + class query(object): + def __get__(s, instance, owner): + try: + mapper = class_mapper(owner) + if mapper: + if query_cls: + # custom query class + return query_cls(mapper, session=self.registry()) + else: + # session's configured query class + return self.registry().query(mapper) + except orm_exc.UnmappedClassError: + return None + return query() + +ScopedSession = scoped_session +"""Old name for backwards compatibility.""" + + +def instrument(name): + def do(self, *args, **kwargs): + return getattr(self.registry(), name)(*args, **kwargs) + return do + +for meth in Session.public_methods: + setattr(scoped_session, meth, instrument(meth)) + + +def makeprop(name): + def set(self, attr): + setattr(self.registry(), name, attr) + + def get(self): + return getattr(self.registry(), name) + + return property(get, set) + +for prop in ('bind', 'dirty', 'deleted', 'new', 'identity_map', + 'is_active', 'autoflush', 'no_autoflush', 'info'): + setattr(scoped_session, prop, makeprop(prop)) + + +def clslevel(name): + def do(cls, *args, **kwargs): + return getattr(Session, name)(*args, **kwargs) + return classmethod(do) + +for prop in ('close_all', 'object_session', 'identity_key'): + setattr(scoped_session, prop, clslevel(prop)) diff --git a/app/lib/sqlalchemy/orm/session.py b/app/lib/sqlalchemy/orm/session.py new file mode 100644 index 0000000..0819204 --- /dev/null +++ b/app/lib/sqlalchemy/orm/session.py @@ -0,0 +1,2970 @@ +# orm/session.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +"""Provides the Session class and related utilities.""" + + +import weakref +from .. import util, sql, engine, exc as sa_exc +from ..sql import util as sql_util, expression +from . import ( + SessionExtension, attributes, exc, query, + loading, identity +) +from ..inspection import inspect +from .base import ( + object_mapper, class_mapper, + _class_to_mapper, _state_mapper, object_state, + _none_set, state_str, instance_str +) +import itertools +from . import persistence +from .unitofwork import UOWTransaction +from . import state as statelib +import sys + +__all__ = ['Session', 'SessionTransaction', + 'SessionExtension', 'sessionmaker'] + +_sessions = weakref.WeakValueDictionary() +"""Weak-referencing dictionary of :class:`.Session` objects. +""" + + +def _state_session(state): + """Given an :class:`.InstanceState`, return the :class:`.Session` + associated, if any. + """ + if state.session_id: + try: + return _sessions[state.session_id] + except KeyError: + pass + return None + + +class _SessionClassMethods(object): + """Class-level methods for :class:`.Session`, :class:`.sessionmaker`.""" + + @classmethod + def close_all(cls): + """Close *all* sessions in memory.""" + + for sess in _sessions.values(): + sess.close() + + @classmethod + @util.dependencies("sqlalchemy.orm.util") + def identity_key(cls, orm_util, *args, **kwargs): + """Return an identity key. + + This is an alias of :func:`.util.identity_key`. + + """ + return orm_util.identity_key(*args, **kwargs) + + @classmethod + def object_session(cls, instance): + """Return the :class:`.Session` to which an object belongs. + + This is an alias of :func:`.object_session`. + + """ + + return object_session(instance) + + +ACTIVE = util.symbol('ACTIVE') +PREPARED = util.symbol('PREPARED') +COMMITTED = util.symbol('COMMITTED') +DEACTIVE = util.symbol('DEACTIVE') +CLOSED = util.symbol('CLOSED') + + +class SessionTransaction(object): + """A :class:`.Session`-level transaction. + + :class:`.SessionTransaction` is a mostly behind-the-scenes object + not normally referenced directly by application code. It coordinates + among multiple :class:`.Connection` objects, maintaining a database + transaction for each one individually, committing or rolling them + back all at once. It also provides optional two-phase commit behavior + which can augment this coordination operation. + + The :attr:`.Session.transaction` attribute of :class:`.Session` + refers to the current :class:`.SessionTransaction` object in use, if any. + The :attr:`.SessionTransaction.parent` attribute refers to the parent + :class:`.SessionTransaction` in the stack of :class:`.SessionTransaction` + objects. If this attribute is ``None``, then this is the top of the stack. + If non-``None``, then this :class:`.SessionTransaction` refers either + to a so-called "subtransaction" or a "nested" transaction. A + "subtransaction" is a scoping concept that demarcates an inner portion + of the outermost "real" transaction. A nested transaction, which + is indicated when the :attr:`.SessionTransaction.nested` + attribute is also True, indicates that this :class:`.SessionTransaction` + corresponds to a SAVEPOINT. + + **Life Cycle** + + A :class:`.SessionTransaction` is associated with a :class:`.Session` + in its default mode of ``autocommit=False`` immediately, associated + with no database connections. As the :class:`.Session` is called upon + to emit SQL on behalf of various :class:`.Engine` or :class:`.Connection` + objects, a corresponding :class:`.Connection` and associated + :class:`.Transaction` is added to a collection within the + :class:`.SessionTransaction` object, becoming one of the + connection/transaction pairs maintained by the + :class:`.SessionTransaction`. The start of a :class:`.SessionTransaction` + can be tracked using the :meth:`.SessionEvents.after_transaction_create` + event. + + The lifespan of the :class:`.SessionTransaction` ends when the + :meth:`.Session.commit`, :meth:`.Session.rollback` or + :meth:`.Session.close` methods are called. At this point, the + :class:`.SessionTransaction` removes its association with its parent + :class:`.Session`. A :class:`.Session` that is in ``autocommit=False`` + mode will create a new :class:`.SessionTransaction` to replace it + immediately, whereas a :class:`.Session` that's in ``autocommit=True`` + mode will remain without a :class:`.SessionTransaction` until the + :meth:`.Session.begin` method is called. The end of a + :class:`.SessionTransaction` can be tracked using the + :meth:`.SessionEvents.after_transaction_end` event. + + **Nesting and Subtransactions** + + Another detail of :class:`.SessionTransaction` behavior is that it is + capable of "nesting". This means that the :meth:`.Session.begin` method + can be called while an existing :class:`.SessionTransaction` is already + present, producing a new :class:`.SessionTransaction` that temporarily + replaces the parent :class:`.SessionTransaction`. When a + :class:`.SessionTransaction` is produced as nested, it assigns itself to + the :attr:`.Session.transaction` attribute, and it additionally will assign + the previous :class:`.SessionTransaction` to its :attr:`.Session.parent` + attribute. The behavior is effectively a + stack, where :attr:`.Session.transaction` refers to the current head of + the stack, and the :attr:`.SessionTransaction.parent` attribute allows + traversal up the stack until :attr:`.SessionTransaction.parent` is + ``None``, indicating the top of the stack. + + When the scope of :class:`.SessionTransaction` is ended via + :meth:`.Session.commit` or :meth:`.Session.rollback`, it restores its + parent :class:`.SessionTransaction` back onto the + :attr:`.Session.transaction` attribute. + + The purpose of this stack is to allow nesting of + :meth:`.Session.rollback` or :meth:`.Session.commit` calls in context + with various flavors of :meth:`.Session.begin`. This nesting behavior + applies to when :meth:`.Session.begin_nested` is used to emit a + SAVEPOINT transaction, and is also used to produce a so-called + "subtransaction" which allows a block of code to use a + begin/rollback/commit sequence regardless of whether or not its enclosing + code block has begun a transaction. The :meth:`.flush` method, whether + called explicitly or via autoflush, is the primary consumer of the + "subtransaction" feature, in that it wishes to guarantee that it works + within in a transaction block regardless of whether or not the + :class:`.Session` is in transactional mode when the method is called. + + Note that the flush process that occurs within the "autoflush" feature + as well as when the :meth:`.Session.flush` method is used **always** + creates a :class:`.SessionTransaction` object. This object is normally + a subtransaction, unless the :class:`.Session` is in autocommit mode + and no transaction exists at all, in which case it's the outermost + transaction. Any event-handling logic or other inspection logic + needs to take into account whether a :class:`.SessionTransaction` + is the outermost transaction, a subtransaction, or a "nested" / SAVEPOINT + transaction. + + .. seealso:: + + :meth:`.Session.rollback` + + :meth:`.Session.commit` + + :meth:`.Session.begin` + + :meth:`.Session.begin_nested` + + :attr:`.Session.is_active` + + :meth:`.SessionEvents.after_transaction_create` + + :meth:`.SessionEvents.after_transaction_end` + + :meth:`.SessionEvents.after_commit` + + :meth:`.SessionEvents.after_rollback` + + :meth:`.SessionEvents.after_soft_rollback` + + """ + + _rollback_exception = None + + def __init__(self, session, parent=None, nested=False): + self.session = session + self._connections = {} + self._parent = parent + self.nested = nested + self._state = ACTIVE + if not parent and nested: + raise sa_exc.InvalidRequestError( + "Can't start a SAVEPOINT transaction when no existing " + "transaction is in progress") + + if self.session._enable_transaction_accounting: + self._take_snapshot() + + self.session.dispatch.after_transaction_create(self.session, self) + + @property + def parent(self): + """The parent :class:`.SessionTransaction` of this + :class:`.SessionTransaction`. + + If this attribute is ``None``, indicates this + :class:`.SessionTransaction` is at the top of the stack, and + corresponds to a real "COMMIT"/"ROLLBACK" + block. If non-``None``, then this is either a "subtransaction" + or a "nested" / SAVEPOINT transaction. If the + :attr:`.SessionTransaction.nested` attribute is ``True``, then + this is a SAVEPOINT, and if ``False``, indicates this a subtransaction. + + .. versionadded:: 1.0.16 - use ._parent for previous versions + + """ + return self._parent + + nested = False + """Indicates if this is a nested, or SAVEPOINT, transaction. + + When :attr:`.SessionTransaction.nested` is True, it is expected + that :attr:`.SessionTransaction.parent` will be True as well. + + """ + + @property + def is_active(self): + return self.session is not None and self._state is ACTIVE + + def _assert_active(self, prepared_ok=False, + rollback_ok=False, + deactive_ok=False, + closed_msg="This transaction is closed"): + if self._state is COMMITTED: + raise sa_exc.InvalidRequestError( + "This session is in 'committed' state; no further " + "SQL can be emitted within this transaction." + ) + elif self._state is PREPARED: + if not prepared_ok: + raise sa_exc.InvalidRequestError( + "This session is in 'prepared' state; no further " + "SQL can be emitted within this transaction." + ) + elif self._state is DEACTIVE: + if not deactive_ok and not rollback_ok: + if self._rollback_exception: + raise sa_exc.InvalidRequestError( + "This Session's transaction has been rolled back " + "due to a previous exception during flush." + " To begin a new transaction with this Session, " + "first issue Session.rollback()." + " Original exception was: %s" + % self._rollback_exception + ) + elif not deactive_ok: + raise sa_exc.InvalidRequestError( + "This Session's transaction has been rolled back " + "by a nested rollback() call. To begin a new " + "transaction, issue Session.rollback() first." + ) + elif self._state is CLOSED: + raise sa_exc.ResourceClosedError(closed_msg) + + @property + def _is_transaction_boundary(self): + return self.nested or not self._parent + + def connection(self, bindkey, execution_options=None, **kwargs): + self._assert_active() + bind = self.session.get_bind(bindkey, **kwargs) + return self._connection_for_bind(bind, execution_options) + + def _begin(self, nested=False): + self._assert_active() + return SessionTransaction( + self.session, self, nested=nested) + + def _iterate_self_and_parents(self, upto=None): + + current = self + result = () + while current: + result += (current, ) + if current._parent is upto: + break + elif current._parent is None: + raise sa_exc.InvalidRequestError( + "Transaction %s is not on the active transaction list" % ( + upto)) + else: + current = current._parent + + return result + + def _take_snapshot(self): + if not self._is_transaction_boundary: + self._new = self._parent._new + self._deleted = self._parent._deleted + self._dirty = self._parent._dirty + self._key_switches = self._parent._key_switches + return + + if not self.session._flushing: + self.session.flush() + + self._new = weakref.WeakKeyDictionary() + self._deleted = weakref.WeakKeyDictionary() + self._dirty = weakref.WeakKeyDictionary() + self._key_switches = weakref.WeakKeyDictionary() + + def _restore_snapshot(self, dirty_only=False): + """Restore the restoration state taken before a transaction began. + + Corresponds to a rollback. + + """ + assert self._is_transaction_boundary + + self.session._expunge_states( + set(self._new).union(self.session._new), + to_transient=True) + + for s, (oldkey, newkey) in self._key_switches.items(): + self.session.identity_map.safe_discard(s) + s.key = oldkey + self.session.identity_map.replace(s) + + for s in set(self._deleted).union(self.session._deleted): + self.session._update_impl(s, revert_deletion=True) + + assert not self.session._deleted + + for s in self.session.identity_map.all_states(): + if not dirty_only or s.modified or s in self._dirty: + s._expire(s.dict, self.session.identity_map._modified) + + def _remove_snapshot(self): + """Remove the restoration state taken before a transaction began. + + Corresponds to a commit. + + """ + assert self._is_transaction_boundary + + if not self.nested and self.session.expire_on_commit: + for s in self.session.identity_map.all_states(): + s._expire(s.dict, self.session.identity_map._modified) + + statelib.InstanceState._detach_states( + list(self._deleted), self.session) + self._deleted.clear() + elif self.nested: + self._parent._new.update(self._new) + self._parent._dirty.update(self._dirty) + self._parent._deleted.update(self._deleted) + self._parent._key_switches.update(self._key_switches) + + def _connection_for_bind(self, bind, execution_options): + self._assert_active() + + if bind in self._connections: + if execution_options: + util.warn( + "Connection is already established for the " + "given bind; execution_options ignored") + return self._connections[bind][0] + + if self._parent: + conn = self._parent._connection_for_bind(bind, execution_options) + if not self.nested: + return conn + else: + if isinstance(bind, engine.Connection): + conn = bind + if conn.engine in self._connections: + raise sa_exc.InvalidRequestError( + "Session already has a Connection associated for the " + "given Connection's Engine") + else: + conn = bind.contextual_connect() + + if execution_options: + conn = conn.execution_options(**execution_options) + + if self.session.twophase and self._parent is None: + transaction = conn.begin_twophase() + elif self.nested: + transaction = conn.begin_nested() + else: + transaction = conn.begin() + + self._connections[conn] = self._connections[conn.engine] = \ + (conn, transaction, conn is not bind) + self.session.dispatch.after_begin(self.session, self, conn) + return conn + + def prepare(self): + if self._parent is not None or not self.session.twophase: + raise sa_exc.InvalidRequestError( + "'twophase' mode not enabled, or not root transaction; " + "can't prepare.") + self._prepare_impl() + + def _prepare_impl(self): + self._assert_active() + if self._parent is None or self.nested: + self.session.dispatch.before_commit(self.session) + + stx = self.session.transaction + if stx is not self: + for subtransaction in stx._iterate_self_and_parents(upto=self): + subtransaction.commit() + + if not self.session._flushing: + for _flush_guard in range(100): + if self.session._is_clean(): + break + self.session.flush() + else: + raise exc.FlushError( + "Over 100 subsequent flushes have occurred within " + "session.commit() - is an after_flush() hook " + "creating new objects?") + + if self._parent is None and self.session.twophase: + try: + for t in set(self._connections.values()): + t[1].prepare() + except: + with util.safe_reraise(): + self.rollback() + + self._state = PREPARED + + def commit(self): + self._assert_active(prepared_ok=True) + if self._state is not PREPARED: + self._prepare_impl() + + if self._parent is None or self.nested: + for t in set(self._connections.values()): + t[1].commit() + + self._state = COMMITTED + self.session.dispatch.after_commit(self.session) + + if self.session._enable_transaction_accounting: + self._remove_snapshot() + + self.close() + return self._parent + + def rollback(self, _capture_exception=False): + self._assert_active(prepared_ok=True, rollback_ok=True) + + stx = self.session.transaction + if stx is not self: + for subtransaction in stx._iterate_self_and_parents(upto=self): + subtransaction.close() + + boundary = self + rollback_err = None + if self._state in (ACTIVE, PREPARED): + for transaction in self._iterate_self_and_parents(): + if transaction._parent is None or transaction.nested: + try: + transaction._rollback_impl() + except: + rollback_err = sys.exc_info() + transaction._state = DEACTIVE + boundary = transaction + break + else: + transaction._state = DEACTIVE + + sess = self.session + + if not rollback_err and sess._enable_transaction_accounting and \ + not sess._is_clean(): + + # if items were added, deleted, or mutated + # here, we need to re-restore the snapshot + util.warn( + "Session's state has been changed on " + "a non-active transaction - this state " + "will be discarded.") + boundary._restore_snapshot(dirty_only=boundary.nested) + + self.close() + + if self._parent and _capture_exception: + self._parent._rollback_exception = sys.exc_info()[1] + + if rollback_err: + util.reraise(*rollback_err) + + sess.dispatch.after_soft_rollback(sess, self) + + return self._parent + + def _rollback_impl(self): + try: + for t in set(self._connections.values()): + t[1].rollback() + finally: + if self.session._enable_transaction_accounting: + self._restore_snapshot(dirty_only=self.nested) + + self.session.dispatch.after_rollback(self.session) + + def close(self, invalidate=False): + self.session.transaction = self._parent + if self._parent is None: + for connection, transaction, autoclose in \ + set(self._connections.values()): + if invalidate: + connection.invalidate() + if autoclose: + connection.close() + else: + transaction.close() + + self._state = CLOSED + self.session.dispatch.after_transaction_end(self.session, self) + + if self._parent is None: + if not self.session.autocommit: + self.session.begin() + self.session = None + self._connections = None + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + self._assert_active(deactive_ok=True, prepared_ok=True) + if self.session.transaction is None: + return + if type is None: + try: + self.commit() + except: + with util.safe_reraise(): + self.rollback() + else: + self.rollback() + + +class Session(_SessionClassMethods): + """Manages persistence operations for ORM-mapped objects. + + The Session's usage paradigm is described at :doc:`/orm/session`. + + + """ + + public_methods = ( + '__contains__', '__iter__', 'add', 'add_all', 'begin', 'begin_nested', + 'close', 'commit', 'connection', 'delete', 'execute', 'expire', + 'expire_all', 'expunge', 'expunge_all', 'flush', 'get_bind', + 'is_modified', 'bulk_save_objects', 'bulk_insert_mappings', + 'bulk_update_mappings', + 'merge', 'query', 'refresh', 'rollback', + 'scalar') + + def __init__(self, bind=None, autoflush=True, expire_on_commit=True, + _enable_transaction_accounting=True, + autocommit=False, twophase=False, + weak_identity_map=True, binds=None, extension=None, + info=None, + query_cls=query.Query): + r"""Construct a new Session. + + See also the :class:`.sessionmaker` function which is used to + generate a :class:`.Session`-producing callable with a given + set of arguments. + + :param autocommit: + + .. warning:: + + The autocommit flag is **not for general use**, and if it is + used, queries should only be invoked within the span of a + :meth:`.Session.begin` / :meth:`.Session.commit` pair. Executing + queries outside of a demarcated transaction is a legacy mode + of usage, and can in some cases lead to concurrent connection + checkouts. + + Defaults to ``False``. When ``True``, the + :class:`.Session` does not keep a persistent transaction running, + and will acquire connections from the engine on an as-needed basis, + returning them immediately after their use. Flushes will begin and + commit (or possibly rollback) their own transaction if no + transaction is present. When using this mode, the + :meth:`.Session.begin` method is used to explicitly start + transactions. + + .. seealso:: + + :ref:`session_autocommit` + + :param autoflush: When ``True``, all query operations will issue a + :meth:`~.Session.flush` call to this ``Session`` before proceeding. + This is a convenience feature so that :meth:`~.Session.flush` need + not be called repeatedly in order for database queries to retrieve + results. It's typical that ``autoflush`` is used in conjunction + with ``autocommit=False``. In this scenario, explicit calls to + :meth:`~.Session.flush` are rarely needed; you usually only need to + call :meth:`~.Session.commit` (which flushes) to finalize changes. + + :param bind: An optional :class:`.Engine` or :class:`.Connection` to + which this ``Session`` should be bound. When specified, all SQL + operations performed by this session will execute via this + connectable. + + :param binds: An optional dictionary which contains more granular + "bind" information than the ``bind`` parameter provides. This + dictionary can map individual :class`.Table` + instances as well as :class:`~.Mapper` instances to individual + :class:`.Engine` or :class:`.Connection` objects. Operations which + proceed relative to a particular :class:`.Mapper` will consult this + dictionary for the direct :class:`.Mapper` instance as + well as the mapper's ``mapped_table`` attribute in order to locate + a connectable to use. The full resolution is described in the + :meth:`.Session.get_bind`. + Usage looks like:: + + Session = sessionmaker(binds={ + SomeMappedClass: create_engine('postgresql://engine1'), + somemapper: create_engine('postgresql://engine2'), + some_table: create_engine('postgresql://engine3'), + }) + + Also see the :meth:`.Session.bind_mapper` + and :meth:`.Session.bind_table` methods. + + :param \class_: Specify an alternate class other than + ``sqlalchemy.orm.session.Session`` which should be used by the + returned class. This is the only argument that is local to the + :class:`.sessionmaker` function, and is not sent directly to the + constructor for ``Session``. + + :param _enable_transaction_accounting: Defaults to ``True``. A + legacy-only flag which when ``False`` disables *all* 0.5-style + object accounting on transaction boundaries, including auto-expiry + of instances on rollback and commit, maintenance of the "new" and + "deleted" lists upon rollback, and autoflush of pending changes + upon :meth:`~.Session.begin`, all of which are interdependent. + + :param expire_on_commit: Defaults to ``True``. When ``True``, all + instances will be fully expired after each :meth:`~.commit`, + so that all attribute/object access subsequent to a completed + transaction will load from the most recent database state. + + :param extension: An optional + :class:`~.SessionExtension` instance, or a list + of such instances, which will receive pre- and post- commit and + flush events, as well as a post-rollback event. **Deprecated.** + Please see :class:`.SessionEvents`. + + :param info: optional dictionary of arbitrary data to be associated + with this :class:`.Session`. Is available via the + :attr:`.Session.info` attribute. Note the dictionary is copied at + construction time so that modifications to the per- + :class:`.Session` dictionary will be local to that + :class:`.Session`. + + .. versionadded:: 0.9.0 + + :param query_cls: Class which should be used to create new Query + objects, as returned by the :meth:`~.Session.query` method. + Defaults to :class:`.Query`. + + :param twophase: When ``True``, all transactions will be started as + a "two phase" transaction, i.e. using the "two phase" semantics + of the database in use along with an XID. During a + :meth:`~.commit`, after :meth:`~.flush` has been issued for all + attached databases, the :meth:`~.TwoPhaseTransaction.prepare` + method on each database's :class:`.TwoPhaseTransaction` will be + called. This allows each database to roll back the entire + transaction, before each transaction is committed. + + :param weak_identity_map: Defaults to ``True`` - when set to + ``False``, objects placed in the :class:`.Session` will be + strongly referenced until explicitly removed or the + :class:`.Session` is closed. **Deprecated** - The strong + reference identity map is legacy. See the + recipe at :ref:`session_referencing_behavior` for + an event-based approach to maintaining strong identity + references. + + """ + + if weak_identity_map: + self._identity_cls = identity.WeakInstanceDict + else: + util.warn_deprecated( + "weak_identity_map=False is deprecated. " + "See the documentation on 'Session Referencing Behavior' " + "for an event-based approach to maintaining strong identity " + "references.") + + self._identity_cls = identity.StrongInstanceDict + self.identity_map = self._identity_cls() + + self._new = {} # InstanceState->object, strong refs object + self._deleted = {} # same + self.bind = bind + self.__binds = {} + self._flushing = False + self._warn_on_events = False + self.transaction = None + self.hash_key = _new_sessionid() + self.autoflush = autoflush + self.autocommit = autocommit + self.expire_on_commit = expire_on_commit + self._enable_transaction_accounting = _enable_transaction_accounting + self.twophase = twophase + self._query_cls = query_cls + if info: + self.info.update(info) + + if extension: + for ext in util.to_list(extension): + SessionExtension._adapt_listener(self, ext) + + if binds is not None: + for key, bind in binds.items(): + self._add_bind(key, bind) + + if not self.autocommit: + self.begin() + _sessions[self.hash_key] = self + + connection_callable = None + + transaction = None + """The current active or inactive :class:`.SessionTransaction`.""" + + @util.memoized_property + def info(self): + """A user-modifiable dictionary. + + The initial value of this dictionary can be populated using the + ``info`` argument to the :class:`.Session` constructor or + :class:`.sessionmaker` constructor or factory methods. The dictionary + here is always local to this :class:`.Session` and can be modified + independently of all other :class:`.Session` objects. + + .. versionadded:: 0.9.0 + + """ + return {} + + def begin(self, subtransactions=False, nested=False): + """Begin a transaction on this :class:`.Session`. + + If this Session is already within a transaction, either a plain + transaction or nested transaction, an error is raised, unless + ``subtransactions=True`` or ``nested=True`` is specified. + + The ``subtransactions=True`` flag indicates that this + :meth:`~.Session.begin` can create a subtransaction if a transaction + is already in progress. For documentation on subtransactions, please + see :ref:`session_subtransactions`. + + The ``nested`` flag begins a SAVEPOINT transaction and is equivalent + to calling :meth:`~.Session.begin_nested`. For documentation on + SAVEPOINT transactions, please see :ref:`session_begin_nested`. + + """ + if self.transaction is not None: + if subtransactions or nested: + self.transaction = self.transaction._begin( + nested=nested) + else: + raise sa_exc.InvalidRequestError( + "A transaction is already begun. Use " + "subtransactions=True to allow subtransactions.") + else: + self.transaction = SessionTransaction( + self, nested=nested) + return self.transaction # needed for __enter__/__exit__ hook + + def begin_nested(self): + """Begin a `nested` transaction on this Session. + + The target database(s) must support SQL SAVEPOINTs or a + SQLAlchemy-supported vendor implementation of the idea. + + For documentation on SAVEPOINT + transactions, please see :ref:`session_begin_nested`. + + """ + return self.begin(nested=True) + + def rollback(self): + """Rollback the current transaction in progress. + + If no transaction is in progress, this method is a pass-through. + + This method rolls back the current transaction or nested transaction + regardless of subtransactions being in effect. All subtransactions up + to the first real transaction are closed. Subtransactions occur when + :meth:`.begin` is called multiple times. + + .. seealso:: + + :ref:`session_rollback` + + """ + if self.transaction is None: + pass + else: + self.transaction.rollback() + + def commit(self): + """Flush pending changes and commit the current transaction. + + If no transaction is in progress, this method raises an + :exc:`~sqlalchemy.exc.InvalidRequestError`. + + By default, the :class:`.Session` also expires all database + loaded state on all ORM-managed attributes after transaction commit. + This so that subsequent operations load the most recent + data from the database. This behavior can be disabled using + the ``expire_on_commit=False`` option to :class:`.sessionmaker` or + the :class:`.Session` constructor. + + If a subtransaction is in effect (which occurs when begin() is called + multiple times), the subtransaction will be closed, and the next call + to ``commit()`` will operate on the enclosing transaction. + + When using the :class:`.Session` in its default mode of + ``autocommit=False``, a new transaction will + be begun immediately after the commit, but note that the newly begun + transaction does *not* use any connection resources until the first + SQL is actually emitted. + + .. seealso:: + + :ref:`session_committing` + + """ + if self.transaction is None: + if not self.autocommit: + self.begin() + else: + raise sa_exc.InvalidRequestError("No transaction is begun.") + + self.transaction.commit() + + def prepare(self): + """Prepare the current transaction in progress for two phase commit. + + If no transaction is in progress, this method raises an + :exc:`~sqlalchemy.exc.InvalidRequestError`. + + Only root transactions of two phase sessions can be prepared. If the + current transaction is not such, an + :exc:`~sqlalchemy.exc.InvalidRequestError` is raised. + + """ + if self.transaction is None: + if not self.autocommit: + self.begin() + else: + raise sa_exc.InvalidRequestError("No transaction is begun.") + + self.transaction.prepare() + + def connection(self, mapper=None, clause=None, + bind=None, + close_with_result=False, + execution_options=None, + **kw): + r"""Return a :class:`.Connection` object corresponding to this + :class:`.Session` object's transactional state. + + If this :class:`.Session` is configured with ``autocommit=False``, + either the :class:`.Connection` corresponding to the current + transaction is returned, or if no transaction is in progress, a new + one is begun and the :class:`.Connection` returned (note that no + transactional state is established with the DBAPI until the first + SQL statement is emitted). + + Alternatively, if this :class:`.Session` is configured with + ``autocommit=True``, an ad-hoc :class:`.Connection` is returned + using :meth:`.Engine.contextual_connect` on the underlying + :class:`.Engine`. + + Ambiguity in multi-bind or unbound :class:`.Session` objects can be + resolved through any of the optional keyword arguments. This + ultimately makes usage of the :meth:`.get_bind` method for resolution. + + :param bind: + Optional :class:`.Engine` to be used as the bind. If + this engine is already involved in an ongoing transaction, + that connection will be used. This argument takes precedence + over ``mapper``, ``clause``. + + :param mapper: + Optional :func:`.mapper` mapped class, used to identify + the appropriate bind. This argument takes precedence over + ``clause``. + + :param clause: + A :class:`.ClauseElement` (i.e. :func:`~.sql.expression.select`, + :func:`~.sql.expression.text`, + etc.) which will be used to locate a bind, if a bind + cannot otherwise be identified. + + :param close_with_result: Passed to :meth:`.Engine.connect`, + indicating the :class:`.Connection` should be considered + "single use", automatically closing when the first result set is + closed. This flag only has an effect if this :class:`.Session` is + configured with ``autocommit=True`` and does not already have a + transaction in progress. + + :param execution_options: a dictionary of execution options that will + be passed to :meth:`.Connection.execution_options`, **when the + connection is first procured only**. If the connection is already + present within the :class:`.Session`, a warning is emitted and + the arguments are ignored. + + .. versionadded:: 0.9.9 + + .. seealso:: + + :ref:`session_transaction_isolation` + + :param \**kw: + Additional keyword arguments are sent to :meth:`get_bind()`, + allowing additional arguments to be passed to custom + implementations of :meth:`get_bind`. + + """ + if bind is None: + bind = self.get_bind(mapper, clause=clause, **kw) + + return self._connection_for_bind(bind, + close_with_result=close_with_result, + execution_options=execution_options) + + def _connection_for_bind(self, engine, execution_options=None, **kw): + if self.transaction is not None: + return self.transaction._connection_for_bind( + engine, execution_options) + else: + conn = engine.contextual_connect(**kw) + if execution_options: + conn = conn.execution_options(**execution_options) + return conn + + def execute(self, clause, params=None, mapper=None, bind=None, **kw): + r"""Execute a SQL expression construct or string statement within + the current transaction. + + Returns a :class:`.ResultProxy` representing + results of the statement execution, in the same manner as that of an + :class:`.Engine` or + :class:`.Connection`. + + E.g.:: + + result = session.execute( + user_table.select().where(user_table.c.id == 5) + ) + + :meth:`~.Session.execute` accepts any executable clause construct, + such as :func:`~.sql.expression.select`, + :func:`~.sql.expression.insert`, + :func:`~.sql.expression.update`, + :func:`~.sql.expression.delete`, and + :func:`~.sql.expression.text`. Plain SQL strings can be passed + as well, which in the case of :meth:`.Session.execute` only + will be interpreted the same as if it were passed via a + :func:`~.expression.text` construct. That is, the following usage:: + + result = session.execute( + "SELECT * FROM user WHERE id=:param", + {"param":5} + ) + + is equivalent to:: + + from sqlalchemy import text + result = session.execute( + text("SELECT * FROM user WHERE id=:param"), + {"param":5} + ) + + The second positional argument to :meth:`.Session.execute` is an + optional parameter set. Similar to that of + :meth:`.Connection.execute`, whether this is passed as a single + dictionary, or a list of dictionaries, determines whether the DBAPI + cursor's ``execute()`` or ``executemany()`` is used to execute the + statement. An INSERT construct may be invoked for a single row:: + + result = session.execute( + users.insert(), {"id": 7, "name": "somename"}) + + or for multiple rows:: + + result = session.execute(users.insert(), [ + {"id": 7, "name": "somename7"}, + {"id": 8, "name": "somename8"}, + {"id": 9, "name": "somename9"} + ]) + + The statement is executed within the current transactional context of + this :class:`.Session`. The :class:`.Connection` which is used + to execute the statement can also be acquired directly by + calling the :meth:`.Session.connection` method. Both methods use + a rule-based resolution scheme in order to determine the + :class:`.Connection`, which in the average case is derived directly + from the "bind" of the :class:`.Session` itself, and in other cases + can be based on the :func:`.mapper` + and :class:`.Table` objects passed to the method; see the + documentation for :meth:`.Session.get_bind` for a full description of + this scheme. + + The :meth:`.Session.execute` method does *not* invoke autoflush. + + The :class:`.ResultProxy` returned by the :meth:`.Session.execute` + method is returned with the "close_with_result" flag set to true; + the significance of this flag is that if this :class:`.Session` is + autocommitting and does not have a transaction-dedicated + :class:`.Connection` available, a temporary :class:`.Connection` is + established for the statement execution, which is closed (meaning, + returned to the connection pool) when the :class:`.ResultProxy` has + consumed all available data. This applies *only* when the + :class:`.Session` is configured with autocommit=True and no + transaction has been started. + + :param clause: + An executable statement (i.e. an :class:`.Executable` expression + such as :func:`.expression.select`) or string SQL statement + to be executed. + + :param params: + Optional dictionary, or list of dictionaries, containing + bound parameter values. If a single dictionary, single-row + execution occurs; if a list of dictionaries, an + "executemany" will be invoked. The keys in each dictionary + must correspond to parameter names present in the statement. + + :param mapper: + Optional :func:`.mapper` or mapped class, used to identify + the appropriate bind. This argument takes precedence over + ``clause`` when locating a bind. See :meth:`.Session.get_bind` + for more details. + + :param bind: + Optional :class:`.Engine` to be used as the bind. If + this engine is already involved in an ongoing transaction, + that connection will be used. This argument takes + precedence over ``mapper`` and ``clause`` when locating + a bind. + + :param \**kw: + Additional keyword arguments are sent to :meth:`.Session.get_bind()` + to allow extensibility of "bind" schemes. + + .. seealso:: + + :ref:`sqlexpression_toplevel` - Tutorial on using Core SQL + constructs. + + :ref:`connections_toplevel` - Further information on direct + statement execution. + + :meth:`.Connection.execute` - core level statement execution + method, which is :meth:`.Session.execute` ultimately uses + in order to execute the statement. + + """ + clause = expression._literal_as_text(clause) + + if bind is None: + bind = self.get_bind(mapper, clause=clause, **kw) + + return self._connection_for_bind( + bind, close_with_result=True).execute(clause, params or {}) + + def scalar(self, clause, params=None, mapper=None, bind=None, **kw): + """Like :meth:`~.Session.execute` but return a scalar result.""" + + return self.execute( + clause, params=params, mapper=mapper, bind=bind, **kw).scalar() + + def close(self): + """Close this Session. + + This clears all items and ends any transaction in progress. + + If this session were created with ``autocommit=False``, a new + transaction is immediately begun. Note that this new transaction does + not use any connection resources until they are first needed. + + """ + self._close_impl(invalidate=False) + + def invalidate(self): + """Close this Session, using connection invalidation. + + This is a variant of :meth:`.Session.close` that will additionally + ensure that the :meth:`.Connection.invalidate` method will be called + on all :class:`.Connection` objects. This can be called when + the database is known to be in a state where the connections are + no longer safe to be used. + + E.g.:: + + try: + sess = Session() + sess.add(User()) + sess.commit() + except gevent.Timeout: + sess.invalidate() + raise + except: + sess.rollback() + raise + + This clears all items and ends any transaction in progress. + + If this session were created with ``autocommit=False``, a new + transaction is immediately begun. Note that this new transaction does + not use any connection resources until they are first needed. + + .. versionadded:: 0.9.9 + + """ + self._close_impl(invalidate=True) + + def _close_impl(self, invalidate): + self.expunge_all() + if self.transaction is not None: + for transaction in self.transaction._iterate_self_and_parents(): + transaction.close(invalidate) + + def expunge_all(self): + """Remove all object instances from this ``Session``. + + This is equivalent to calling ``expunge(obj)`` on all objects in this + ``Session``. + + """ + + all_states = self.identity_map.all_states() + list(self._new) + self.identity_map = self._identity_cls() + self._new = {} + self._deleted = {} + + statelib.InstanceState._detach_states( + all_states, self + ) + + def _add_bind(self, key, bind): + try: + insp = inspect(key) + except sa_exc.NoInspectionAvailable: + if not isinstance(key, type): + raise sa_exc.ArgumentError( + "Not an acceptable bind target: %s" % key) + else: + self.__binds[key] = bind + else: + if insp.is_selectable: + self.__binds[insp] = bind + elif insp.is_mapper: + self.__binds[insp.class_] = bind + for selectable in insp._all_tables: + self.__binds[selectable] = bind + else: + raise sa_exc.ArgumentError( + "Not an acceptable bind target: %s" % key) + + def bind_mapper(self, mapper, bind): + """Associate a :class:`.Mapper` with a "bind", e.g. a :class:`.Engine` + or :class:`.Connection`. + + The given mapper is added to a lookup used by the + :meth:`.Session.get_bind` method. + + """ + self._add_bind(mapper, bind) + + def bind_table(self, table, bind): + """Associate a :class:`.Table` with a "bind", e.g. a :class:`.Engine` + or :class:`.Connection`. + + The given mapper is added to a lookup used by the + :meth:`.Session.get_bind` method. + + """ + self._add_bind(table, bind) + + def get_bind(self, mapper=None, clause=None): + """Return a "bind" to which this :class:`.Session` is bound. + + The "bind" is usually an instance of :class:`.Engine`, + except in the case where the :class:`.Session` has been + explicitly bound directly to a :class:`.Connection`. + + For a multiply-bound or unbound :class:`.Session`, the + ``mapper`` or ``clause`` arguments are used to determine the + appropriate bind to return. + + Note that the "mapper" argument is usually present + when :meth:`.Session.get_bind` is called via an ORM + operation such as a :meth:`.Session.query`, each + individual INSERT/UPDATE/DELETE operation within a + :meth:`.Session.flush`, call, etc. + + The order of resolution is: + + 1. if mapper given and session.binds is present, + locate a bind based on mapper. + 2. if clause given and session.binds is present, + locate a bind based on :class:`.Table` objects + found in the given clause present in session.binds. + 3. if session.bind is present, return that. + 4. if clause given, attempt to return a bind + linked to the :class:`.MetaData` ultimately + associated with the clause. + 5. if mapper given, attempt to return a bind + linked to the :class:`.MetaData` ultimately + associated with the :class:`.Table` or other + selectable to which the mapper is mapped. + 6. No bind can be found, :exc:`~sqlalchemy.exc.UnboundExecutionError` + is raised. + + :param mapper: + Optional :func:`.mapper` mapped class or instance of + :class:`.Mapper`. The bind can be derived from a :class:`.Mapper` + first by consulting the "binds" map associated with this + :class:`.Session`, and secondly by consulting the :class:`.MetaData` + associated with the :class:`.Table` to which the :class:`.Mapper` + is mapped for a bind. + + :param clause: + A :class:`.ClauseElement` (i.e. :func:`~.sql.expression.select`, + :func:`~.sql.expression.text`, + etc.). If the ``mapper`` argument is not present or could not + produce a bind, the given expression construct will be searched + for a bound element, typically a :class:`.Table` associated with + bound :class:`.MetaData`. + + """ + + if mapper is clause is None: + if self.bind: + return self.bind + else: + raise sa_exc.UnboundExecutionError( + "This session is not bound to a single Engine or " + "Connection, and no context was provided to locate " + "a binding.") + + if mapper is not None: + try: + mapper = inspect(mapper) + except sa_exc.NoInspectionAvailable: + if isinstance(mapper, type): + raise exc.UnmappedClassError(mapper) + else: + raise + + if self.__binds: + if mapper: + for cls in mapper.class_.__mro__: + if cls in self.__binds: + return self.__binds[cls] + if clause is None: + clause = mapper.mapped_table + + if clause is not None: + for t in sql_util.find_tables(clause, include_crud=True): + if t in self.__binds: + return self.__binds[t] + + if self.bind: + return self.bind + + if isinstance(clause, sql.expression.ClauseElement) and clause.bind: + return clause.bind + + if mapper and mapper.mapped_table.bind: + return mapper.mapped_table.bind + + context = [] + if mapper is not None: + context.append('mapper %s' % mapper) + if clause is not None: + context.append('SQL expression') + + raise sa_exc.UnboundExecutionError( + "Could not locate a bind configured on %s or this Session" % ( + ', '.join(context))) + + def query(self, *entities, **kwargs): + """Return a new :class:`.Query` object corresponding to this + :class:`.Session`.""" + + return self._query_cls(entities, self, **kwargs) + + @property + @util.contextmanager + def no_autoflush(self): + """Return a context manager that disables autoflush. + + e.g.:: + + with session.no_autoflush: + + some_object = SomeClass() + session.add(some_object) + # won't autoflush + some_object.related_thing = session.query(SomeRelated).first() + + Operations that proceed within the ``with:`` block + will not be subject to flushes occurring upon query + access. This is useful when initializing a series + of objects which involve existing database queries, + where the uncompleted object should not yet be flushed. + + .. versionadded:: 0.7.6 + + """ + autoflush = self.autoflush + self.autoflush = False + try: + yield self + finally: + self.autoflush = autoflush + + def _autoflush(self): + if self.autoflush and not self._flushing: + try: + self.flush() + except sa_exc.StatementError as e: + # note we are reraising StatementError as opposed to + # raising FlushError with "chaining" to remain compatible + # with code that catches StatementError, IntegrityError, + # etc. + e.add_detail( + "raised as a result of Query-invoked autoflush; " + "consider using a session.no_autoflush block if this " + "flush is occurring prematurely") + util.raise_from_cause(e) + + def refresh(self, instance, attribute_names=None, lockmode=None): + """Expire and refresh the attributes on the given instance. + + A query will be issued to the database and all attributes will be + refreshed with their current database value. + + Lazy-loaded relational attributes will remain lazily loaded, so that + the instance-wide refresh operation will be followed immediately by + the lazy load of that attribute. + + Eagerly-loaded relational attributes will eagerly load within the + single refresh operation. + + Note that a highly isolated transaction will return the same values as + were previously read in that same transaction, regardless of changes + in database state outside of that transaction - usage of + :meth:`~Session.refresh` usually only makes sense if non-ORM SQL + statement were emitted in the ongoing transaction, or if autocommit + mode is turned on. + + :param attribute_names: optional. An iterable collection of + string attribute names indicating a subset of attributes to + be refreshed. + + :param lockmode: Passed to the :class:`~sqlalchemy.orm.query.Query` + as used by :meth:`~sqlalchemy.orm.query.Query.with_lockmode`. + + .. seealso:: + + :ref:`session_expire` - introductory material + + :meth:`.Session.expire` + + :meth:`.Session.expire_all` + + """ + try: + state = attributes.instance_state(instance) + except exc.NO_STATE: + raise exc.UnmappedInstanceError(instance) + + self._expire_state(state, attribute_names) + + if loading.load_on_ident( + self.query(object_mapper(instance)), + state.key, refresh_state=state, + lockmode=lockmode, + only_load_props=attribute_names) is None: + raise sa_exc.InvalidRequestError( + "Could not refresh instance '%s'" % + instance_str(instance)) + + def expire_all(self): + """Expires all persistent instances within this Session. + + When any attributes on a persistent instance is next accessed, + a query will be issued using the + :class:`.Session` object's current transactional context in order to + load all expired attributes for the given instance. Note that + a highly isolated transaction will return the same values as were + previously read in that same transaction, regardless of changes + in database state outside of that transaction. + + To expire individual objects and individual attributes + on those objects, use :meth:`Session.expire`. + + The :class:`.Session` object's default behavior is to + expire all state whenever the :meth:`Session.rollback` + or :meth:`Session.commit` methods are called, so that new + state can be loaded for the new transaction. For this reason, + calling :meth:`Session.expire_all` should not be needed when + autocommit is ``False``, assuming the transaction is isolated. + + .. seealso:: + + :ref:`session_expire` - introductory material + + :meth:`.Session.expire` + + :meth:`.Session.refresh` + + """ + for state in self.identity_map.all_states(): + state._expire(state.dict, self.identity_map._modified) + + def expire(self, instance, attribute_names=None): + """Expire the attributes on an instance. + + Marks the attributes of an instance as out of date. When an expired + attribute is next accessed, a query will be issued to the + :class:`.Session` object's current transactional context in order to + load all expired attributes for the given instance. Note that + a highly isolated transaction will return the same values as were + previously read in that same transaction, regardless of changes + in database state outside of that transaction. + + To expire all objects in the :class:`.Session` simultaneously, + use :meth:`Session.expire_all`. + + The :class:`.Session` object's default behavior is to + expire all state whenever the :meth:`Session.rollback` + or :meth:`Session.commit` methods are called, so that new + state can be loaded for the new transaction. For this reason, + calling :meth:`Session.expire` only makes sense for the specific + case that a non-ORM SQL statement was emitted in the current + transaction. + + :param instance: The instance to be refreshed. + :param attribute_names: optional list of string attribute names + indicating a subset of attributes to be expired. + + .. seealso:: + + :ref:`session_expire` - introductory material + + :meth:`.Session.expire` + + :meth:`.Session.refresh` + + """ + try: + state = attributes.instance_state(instance) + except exc.NO_STATE: + raise exc.UnmappedInstanceError(instance) + self._expire_state(state, attribute_names) + + def _expire_state(self, state, attribute_names): + self._validate_persistent(state) + if attribute_names: + state._expire_attributes(state.dict, attribute_names) + else: + # pre-fetch the full cascade since the expire is going to + # remove associations + cascaded = list(state.manager.mapper.cascade_iterator( + 'refresh-expire', state)) + self._conditional_expire(state) + for o, m, st_, dct_ in cascaded: + self._conditional_expire(st_) + + def _conditional_expire(self, state): + """Expire a state if persistent, else expunge if pending""" + + if state.key: + state._expire(state.dict, self.identity_map._modified) + elif state in self._new: + self._new.pop(state) + state._detach(self) + + @util.deprecated("0.7", "The non-weak-referencing identity map " + "feature is no longer needed.") + def prune(self): + """Remove unreferenced instances cached in the identity map. + + Note that this method is only meaningful if "weak_identity_map" is set + to False. The default weak identity map is self-pruning. + + Removes any object in this Session's identity map that is not + referenced in user code, modified, new or scheduled for deletion. + Returns the number of objects pruned. + + """ + return self.identity_map.prune() + + def expunge(self, instance): + """Remove the `instance` from this ``Session``. + + This will free all internal references to the instance. Cascading + will be applied according to the *expunge* cascade rule. + + """ + try: + state = attributes.instance_state(instance) + except exc.NO_STATE: + raise exc.UnmappedInstanceError(instance) + if state.session_id is not self.hash_key: + raise sa_exc.InvalidRequestError( + "Instance %s is not present in this Session" % + state_str(state)) + + cascaded = list(state.manager.mapper.cascade_iterator( + 'expunge', state)) + self._expunge_states( + [state] + [st_ for o, m, st_, dct_ in cascaded] + ) + + def _expunge_states(self, states, to_transient=False): + for state in states: + if state in self._new: + self._new.pop(state) + elif self.identity_map.contains_state(state): + self.identity_map.safe_discard(state) + self._deleted.pop(state, None) + elif self.transaction: + # state is "detached" from being deleted, but still present + # in the transaction snapshot + self.transaction._deleted.pop(state, None) + statelib.InstanceState._detach_states( + states, self, to_transient=to_transient) + + def _register_newly_persistent(self, states): + pending_to_persistent = self.dispatch.pending_to_persistent or None + for state in states: + mapper = _state_mapper(state) + + # prevent against last minute dereferences of the object + obj = state.obj() + if obj is not None: + + instance_key = mapper._identity_key_from_state(state) + + if _none_set.intersection(instance_key[1]) and \ + not mapper.allow_partial_pks or \ + _none_set.issuperset(instance_key[1]): + raise exc.FlushError( + "Instance %s has a NULL identity key. If this is an " + "auto-generated value, check that the database table " + "allows generation of new primary key values, and " + "that the mapped Column object is configured to " + "expect these generated values. Ensure also that " + "this flush() is not occurring at an inappropriate " + "time, such aswithin a load() event." + % state_str(state) + ) + + if state.key is None: + state.key = instance_key + elif state.key != instance_key: + # primary key switch. use safe_discard() in case another + # state has already replaced this one in the identity + # map (see test/orm/test_naturalpks.py ReversePKsTest) + self.identity_map.safe_discard(state) + if state in self.transaction._key_switches: + orig_key = self.transaction._key_switches[state][0] + else: + orig_key = state.key + self.transaction._key_switches[state] = ( + orig_key, instance_key) + state.key = instance_key + + self.identity_map.replace(state) + + statelib.InstanceState._commit_all_states( + ((state, state.dict) for state in states), + self.identity_map + ) + + self._register_altered(states) + + if pending_to_persistent is not None: + for state in states: + pending_to_persistent(self, state.obj()) + + # remove from new last, might be the last strong ref + for state in set(states).intersection(self._new): + self._new.pop(state) + + def _register_altered(self, states): + if self._enable_transaction_accounting and self.transaction: + for state in states: + if state in self._new: + self.transaction._new[state] = True + else: + self.transaction._dirty[state] = True + + def _remove_newly_deleted(self, states): + persistent_to_deleted = self.dispatch.persistent_to_deleted or None + for state in states: + if self._enable_transaction_accounting and self.transaction: + self.transaction._deleted[state] = True + + if persistent_to_deleted is not None: + # get a strong reference before we pop out of + # self._deleted + obj = state.obj() + + self.identity_map.safe_discard(state) + self._deleted.pop(state, None) + state._deleted = True + # can't call state._detach() here, because this state + # is still in the transaction snapshot and needs to be + # tracked as part of that + if persistent_to_deleted is not None: + persistent_to_deleted(self, obj) + + def add(self, instance, _warn=True): + """Place an object in the ``Session``. + + Its state will be persisted to the database on the next flush + operation. + + Repeated calls to ``add()`` will be ignored. The opposite of ``add()`` + is ``expunge()``. + + """ + if _warn and self._warn_on_events: + self._flush_warning("Session.add()") + + try: + state = attributes.instance_state(instance) + except exc.NO_STATE: + raise exc.UnmappedInstanceError(instance) + + self._save_or_update_state(state) + + def add_all(self, instances): + """Add the given collection of instances to this ``Session``.""" + + if self._warn_on_events: + self._flush_warning("Session.add_all()") + + for instance in instances: + self.add(instance, _warn=False) + + def _save_or_update_state(self, state): + self._save_or_update_impl(state) + + mapper = _state_mapper(state) + for o, m, st_, dct_ in mapper.cascade_iterator( + 'save-update', + state, + halt_on=self._contains_state): + self._save_or_update_impl(st_) + + def delete(self, instance): + """Mark an instance as deleted. + + The database delete operation occurs upon ``flush()``. + + """ + if self._warn_on_events: + self._flush_warning("Session.delete()") + + try: + state = attributes.instance_state(instance) + except exc.NO_STATE: + raise exc.UnmappedInstanceError(instance) + + self._delete_impl(state, instance, head=True) + + def _delete_impl(self, state, obj, head): + + if state.key is None: + if head: + raise sa_exc.InvalidRequestError( + "Instance '%s' is not persisted" % + state_str(state)) + else: + return + + to_attach = self._before_attach(state, obj) + + if state in self._deleted: + return + + self.identity_map.add(state) + + if to_attach: + self._after_attach(state, obj) + + if head: + # grab the cascades before adding the item to the deleted list + # so that autoflush does not delete the item + # the strong reference to the instance itself is significant here + cascade_states = list(state.manager.mapper.cascade_iterator( + 'delete', state)) + + self._deleted[state] = obj + + if head: + for o, m, st_, dct_ in cascade_states: + self._delete_impl(st_, o, False) + + def merge(self, instance, load=True): + """Copy the state of a given instance into a corresponding instance + within this :class:`.Session`. + + :meth:`.Session.merge` examines the primary key attributes of the + source instance, and attempts to reconcile it with an instance of the + same primary key in the session. If not found locally, it attempts + to load the object from the database based on primary key, and if + none can be located, creates a new instance. The state of each + attribute on the source instance is then copied to the target + instance. The resulting target instance is then returned by the + method; the original source instance is left unmodified, and + un-associated with the :class:`.Session` if not already. + + This operation cascades to associated instances if the association is + mapped with ``cascade="merge"``. + + See :ref:`unitofwork_merging` for a detailed discussion of merging. + + .. versionchanged:: 1.1 - :meth:`.Session.merge` will now reconcile + pending objects with overlapping primary keys in the same way + as persistent. See :ref:`change_3601` for discussion. + + :param instance: Instance to be merged. + :param load: Boolean, when False, :meth:`.merge` switches into + a "high performance" mode which causes it to forego emitting history + events as well as all database access. This flag is used for + cases such as transferring graphs of objects into a :class:`.Session` + from a second level cache, or to transfer just-loaded objects + into the :class:`.Session` owned by a worker thread or process + without re-querying the database. + + The ``load=False`` use case adds the caveat that the given + object has to be in a "clean" state, that is, has no pending changes + to be flushed - even if the incoming object is detached from any + :class:`.Session`. This is so that when + the merge operation populates local attributes and + cascades to related objects and + collections, the values can be "stamped" onto the + target object as is, without generating any history or attribute + events, and without the need to reconcile the incoming data with + any existing related objects or collections that might not + be loaded. The resulting objects from ``load=False`` are always + produced as "clean", so it is only appropriate that the given objects + should be "clean" as well, else this suggests a mis-use of the + method. + + + """ + + if self._warn_on_events: + self._flush_warning("Session.merge()") + + _recursive = {} + _resolve_conflict_map = {} + + if load: + # flush current contents if we expect to load data + self._autoflush() + + object_mapper(instance) # verify mapped + autoflush = self.autoflush + try: + self.autoflush = False + return self._merge( + attributes.instance_state(instance), + attributes.instance_dict(instance), + load=load, _recursive=_recursive, + _resolve_conflict_map=_resolve_conflict_map) + finally: + self.autoflush = autoflush + + def _merge(self, state, state_dict, load=True, _recursive=None, + _resolve_conflict_map=None): + mapper = _state_mapper(state) + if state in _recursive: + return _recursive[state] + + new_instance = False + key = state.key + + if key is None: + if not load: + raise sa_exc.InvalidRequestError( + "merge() with load=False option does not support " + "objects transient (i.e. unpersisted) objects. flush() " + "all changes on mapped instances before merging with " + "load=False.") + key = mapper._identity_key_from_state(state) + key_is_persistent = attributes.NEVER_SET not in key[1] + else: + key_is_persistent = True + + if key in self.identity_map: + merged = self.identity_map[key] + elif key_is_persistent and key in _resolve_conflict_map: + merged = _resolve_conflict_map[key] + + elif not load: + if state.modified: + raise sa_exc.InvalidRequestError( + "merge() with load=False option does not support " + "objects marked as 'dirty'. flush() all changes on " + "mapped instances before merging with load=False.") + merged = mapper.class_manager.new_instance() + merged_state = attributes.instance_state(merged) + merged_state.key = key + self._update_impl(merged_state) + new_instance = True + + elif key_is_persistent and ( + not _none_set.intersection(key[1]) or + (mapper.allow_partial_pks and + not _none_set.issuperset(key[1]))): + merged = self.query(mapper.class_).get(key[1]) + else: + merged = None + + if merged is None: + merged = mapper.class_manager.new_instance() + merged_state = attributes.instance_state(merged) + merged_dict = attributes.instance_dict(merged) + new_instance = True + self._save_or_update_state(merged_state) + else: + merged_state = attributes.instance_state(merged) + merged_dict = attributes.instance_dict(merged) + + _recursive[state] = merged + _resolve_conflict_map[key] = merged + + # check that we didn't just pull the exact same + # state out. + if state is not merged_state: + # version check if applicable + if mapper.version_id_col is not None: + existing_version = mapper._get_state_attr_by_column( + state, + state_dict, + mapper.version_id_col, + passive=attributes.PASSIVE_NO_INITIALIZE) + + merged_version = mapper._get_state_attr_by_column( + merged_state, + merged_dict, + mapper.version_id_col, + passive=attributes.PASSIVE_NO_INITIALIZE) + + if existing_version is not attributes.PASSIVE_NO_RESULT and \ + merged_version is not attributes.PASSIVE_NO_RESULT and \ + existing_version != merged_version: + raise exc.StaleDataError( + "Version id '%s' on merged state %s " + "does not match existing version '%s'. " + "Leave the version attribute unset when " + "merging to update the most recent version." + % ( + existing_version, + state_str(merged_state), + merged_version + )) + + merged_state.load_path = state.load_path + merged_state.load_options = state.load_options + + # since we are copying load_options, we need to copy + # the callables_ that would have been generated by those + # load_options. + # assumes that the callables we put in state.callables_ + # are not instance-specific (which they should not be) + merged_state._copy_callables(state) + + for prop in mapper.iterate_properties: + prop.merge(self, state, state_dict, + merged_state, merged_dict, + load, _recursive, _resolve_conflict_map) + + if not load: + # remove any history + merged_state._commit_all(merged_dict, self.identity_map) + + if new_instance: + merged_state.manager.dispatch.load(merged_state, None) + return merged + + def _validate_persistent(self, state): + if not self.identity_map.contains_state(state): + raise sa_exc.InvalidRequestError( + "Instance '%s' is not persistent within this Session" % + state_str(state)) + + def _save_impl(self, state): + if state.key is not None: + raise sa_exc.InvalidRequestError( + "Object '%s' already has an identity - " + "it can't be registered as pending" % state_str(state)) + + obj = state.obj() + to_attach = self._before_attach(state, obj) + if state not in self._new: + self._new[state] = obj + state.insert_order = len(self._new) + if to_attach: + self._after_attach(state, obj) + + def _update_impl(self, state, revert_deletion=False): + if state.key is None: + raise sa_exc.InvalidRequestError( + "Instance '%s' is not persisted" % + state_str(state)) + + if state._deleted: + if revert_deletion: + if not state._attached: + return + del state._deleted + else: + raise sa_exc.InvalidRequestError( + "Instance '%s' has been deleted. " + "Use the make_transient() " + "function to send this object back " + "to the transient state." % + state_str(state) + ) + + obj = state.obj() + + # check for late gc + if obj is None: + return + + to_attach = self._before_attach(state, obj) + + self._deleted.pop(state, None) + if revert_deletion: + self.identity_map.replace(state) + else: + self.identity_map.add(state) + + if to_attach: + self._after_attach(state, obj) + elif revert_deletion: + self.dispatch.deleted_to_persistent(self, obj) + + def _save_or_update_impl(self, state): + if state.key is None: + self._save_impl(state) + else: + self._update_impl(state) + + def enable_relationship_loading(self, obj): + """Associate an object with this :class:`.Session` for related + object loading. + + .. warning:: + + :meth:`.enable_relationship_loading` exists to serve special + use cases and is not recommended for general use. + + Accesses of attributes mapped with :func:`.relationship` + will attempt to load a value from the database using this + :class:`.Session` as the source of connectivity. The values + will be loaded based on foreign key values present on this + object - it follows that this functionality + generally only works for many-to-one-relationships. + + The object will be attached to this session, but will + **not** participate in any persistence operations; its state + for almost all purposes will remain either "transient" or + "detached", except for the case of relationship loading. + + Also note that backrefs will often not work as expected. + Altering a relationship-bound attribute on the target object + may not fire off a backref event, if the effective value + is what was already loaded from a foreign-key-holding value. + + The :meth:`.Session.enable_relationship_loading` method is + similar to the ``load_on_pending`` flag on :func:`.relationship`. + Unlike that flag, :meth:`.Session.enable_relationship_loading` allows + an object to remain transient while still being able to load + related items. + + To make a transient object associated with a :class:`.Session` + via :meth:`.Session.enable_relationship_loading` pending, add + it to the :class:`.Session` using :meth:`.Session.add` normally. + + :meth:`.Session.enable_relationship_loading` does not improve + behavior when the ORM is used normally - object references should be + constructed at the object level, not at the foreign key level, so + that they are present in an ordinary way before flush() + proceeds. This method is not intended for general use. + + .. versionadded:: 0.8 + + .. seealso:: + + ``load_on_pending`` at :func:`.relationship` - this flag + allows per-relationship loading of many-to-ones on items that + are pending. + + """ + state = attributes.instance_state(obj) + to_attach = self._before_attach(state, obj) + state._load_pending = True + if to_attach: + self._after_attach(state, obj) + + def _before_attach(self, state, obj): + if state.session_id == self.hash_key: + return False + + if state.session_id and state.session_id in _sessions: + raise sa_exc.InvalidRequestError( + "Object '%s' is already attached to session '%s' " + "(this is '%s')" % (state_str(state), + state.session_id, self.hash_key)) + + self.dispatch.before_attach(self, obj) + + return True + + def _after_attach(self, state, obj): + state.session_id = self.hash_key + if state.modified and state._strong_obj is None: + state._strong_obj = obj + self.dispatch.after_attach(self, obj) + + if state.key: + self.dispatch.detached_to_persistent(self, obj) + else: + self.dispatch.transient_to_pending(self, obj) + + def __contains__(self, instance): + """Return True if the instance is associated with this session. + + The instance may be pending or persistent within the Session for a + result of True. + + """ + try: + state = attributes.instance_state(instance) + except exc.NO_STATE: + raise exc.UnmappedInstanceError(instance) + return self._contains_state(state) + + def __iter__(self): + """Iterate over all pending or persistent instances within this + Session. + + """ + return iter( + list(self._new.values()) + list(self.identity_map.values())) + + def _contains_state(self, state): + return state in self._new or self.identity_map.contains_state(state) + + def flush(self, objects=None): + """Flush all the object changes to the database. + + Writes out all pending object creations, deletions and modifications + to the database as INSERTs, DELETEs, UPDATEs, etc. Operations are + automatically ordered by the Session's unit of work dependency + solver. + + Database operations will be issued in the current transactional + context and do not affect the state of the transaction, unless an + error occurs, in which case the entire transaction is rolled back. + You may flush() as often as you like within a transaction to move + changes from Python to the database's transaction buffer. + + For ``autocommit`` Sessions with no active manual transaction, flush() + will create a transaction on the fly that surrounds the entire set of + operations into the flush. + + :param objects: Optional; restricts the flush operation to operate + only on elements that are in the given collection. + + This feature is for an extremely narrow set of use cases where + particular objects may need to be operated upon before the + full flush() occurs. It is not intended for general use. + + """ + + if self._flushing: + raise sa_exc.InvalidRequestError("Session is already flushing") + + if self._is_clean(): + return + try: + self._flushing = True + self._flush(objects) + finally: + self._flushing = False + + def _flush_warning(self, method): + util.warn( + "Usage of the '%s' operation is not currently supported " + "within the execution stage of the flush process. " + "Results may not be consistent. Consider using alternative " + "event listeners or connection-level operations instead." + % method) + + def _is_clean(self): + return not self.identity_map.check_modified() and \ + not self._deleted and \ + not self._new + + def _flush(self, objects=None): + + dirty = self._dirty_states + if not dirty and not self._deleted and not self._new: + self.identity_map._modified.clear() + return + + flush_context = UOWTransaction(self) + + if self.dispatch.before_flush: + self.dispatch.before_flush(self, flush_context, objects) + # re-establish "dirty states" in case the listeners + # added + dirty = self._dirty_states + + deleted = set(self._deleted) + new = set(self._new) + + dirty = set(dirty).difference(deleted) + + # create the set of all objects we want to operate upon + if objects: + # specific list passed in + objset = set() + for o in objects: + try: + state = attributes.instance_state(o) + except exc.NO_STATE: + raise exc.UnmappedInstanceError(o) + objset.add(state) + else: + objset = None + + # store objects whose fate has been decided + processed = set() + + # put all saves/updates into the flush context. detect top-level + # orphans and throw them into deleted. + if objset: + proc = new.union(dirty).intersection(objset).difference(deleted) + else: + proc = new.union(dirty).difference(deleted) + + for state in proc: + is_orphan = ( + _state_mapper(state)._is_orphan(state) and state.has_identity) + _reg = flush_context.register_object(state, isdelete=is_orphan) + assert _reg, "Failed to add object to the flush context!" + processed.add(state) + + # put all remaining deletes into the flush context. + if objset: + proc = deleted.intersection(objset).difference(processed) + else: + proc = deleted.difference(processed) + for state in proc: + _reg = flush_context.register_object(state, isdelete=True) + assert _reg, "Failed to add object to the flush context!" + + if not flush_context.has_work: + return + + flush_context.transaction = transaction = self.begin( + subtransactions=True) + try: + self._warn_on_events = True + try: + flush_context.execute() + finally: + self._warn_on_events = False + + self.dispatch.after_flush(self, flush_context) + + flush_context.finalize_flush_changes() + + if not objects and self.identity_map._modified: + len_ = len(self.identity_map._modified) + + statelib.InstanceState._commit_all_states( + [(state, state.dict) for state in + self.identity_map._modified], + instance_dict=self.identity_map) + util.warn("Attribute history events accumulated on %d " + "previously clean instances " + "within inner-flush event handlers have been " + "reset, and will not result in database updates. " + "Consider using set_committed_value() within " + "inner-flush event handlers to avoid this warning." + % len_) + + # useful assertions: + # if not objects: + # assert not self.identity_map._modified + # else: + # assert self.identity_map._modified == \ + # self.identity_map._modified.difference(objects) + + self.dispatch.after_flush_postexec(self, flush_context) + + transaction.commit() + + except: + with util.safe_reraise(): + transaction.rollback(_capture_exception=True) + + def bulk_save_objects( + self, objects, return_defaults=False, update_changed_only=True): + """Perform a bulk save of the given list of objects. + + The bulk save feature allows mapped objects to be used as the + source of simple INSERT and UPDATE operations which can be more easily + grouped together into higher performing "executemany" + operations; the extraction of data from the objects is also performed + using a lower-latency process that ignores whether or not attributes + have actually been modified in the case of UPDATEs, and also ignores + SQL expressions. + + The objects as given are not added to the session and no additional + state is established on them, unless the ``return_defaults`` flag + is also set, in which case primary key attributes and server-side + default values will be populated. + + .. versionadded:: 1.0.0 + + .. warning:: + + The bulk save feature allows for a lower-latency INSERT/UPDATE + of rows at the expense of most other unit-of-work features. + Features such as object management, relationship handling, + and SQL clause support are **silently omitted** in favor of raw + INSERT/UPDATES of records. + + **Please read the list of caveats at** :ref:`bulk_operations` + **before using this method, and fully test and confirm the + functionality of all code developed using these systems.** + + :param objects: a list of mapped object instances. The mapped + objects are persisted as is, and are **not** associated with the + :class:`.Session` afterwards. + + For each object, whether the object is sent as an INSERT or an + UPDATE is dependent on the same rules used by the :class:`.Session` + in traditional operation; if the object has the + :attr:`.InstanceState.key` + attribute set, then the object is assumed to be "detached" and + will result in an UPDATE. Otherwise, an INSERT is used. + + In the case of an UPDATE, statements are grouped based on which + attributes have changed, and are thus to be the subject of each + SET clause. If ``update_changed_only`` is False, then all + attributes present within each object are applied to the UPDATE + statement, which may help in allowing the statements to be grouped + together into a larger executemany(), and will also reduce the + overhead of checking history on attributes. + + :param return_defaults: when True, rows that are missing values which + generate defaults, namely integer primary key defaults and sequences, + will be inserted **one at a time**, so that the primary key value + is available. In particular this will allow joined-inheritance + and other multi-table mappings to insert correctly without the need + to provide primary key values ahead of time; however, + :paramref:`.Session.bulk_save_objects.return_defaults` **greatly + reduces the performance gains** of the method overall. + + :param update_changed_only: when True, UPDATE statements are rendered + based on those attributes in each state that have logged changes. + When False, all attributes present are rendered into the SET clause + with the exception of primary key attributes. + + .. seealso:: + + :ref:`bulk_operations` + + :meth:`.Session.bulk_insert_mappings` + + :meth:`.Session.bulk_update_mappings` + + """ + for (mapper, isupdate), states in itertools.groupby( + (attributes.instance_state(obj) for obj in objects), + lambda state: (state.mapper, state.key is not None) + ): + self._bulk_save_mappings( + mapper, states, isupdate, True, + return_defaults, update_changed_only, False) + + def bulk_insert_mappings( + self, mapper, mappings, return_defaults=False, render_nulls=False): + """Perform a bulk insert of the given list of mapping dictionaries. + + The bulk insert feature allows plain Python dictionaries to be used as + the source of simple INSERT operations which can be more easily + grouped together into higher performing "executemany" + operations. Using dictionaries, there is no "history" or session + state management features in use, reducing latency when inserting + large numbers of simple rows. + + The values within the dictionaries as given are typically passed + without modification into Core :meth:`.Insert` constructs, after + organizing the values within them across the tables to which + the given mapper is mapped. + + .. versionadded:: 1.0.0 + + .. warning:: + + The bulk insert feature allows for a lower-latency INSERT + of rows at the expense of most other unit-of-work features. + Features such as object management, relationship handling, + and SQL clause support are **silently omitted** in favor of raw + INSERT of records. + + **Please read the list of caveats at** :ref:`bulk_operations` + **before using this method, and fully test and confirm the + functionality of all code developed using these systems.** + + :param mapper: a mapped class, or the actual :class:`.Mapper` object, + representing the single kind of object represented within the mapping + list. + + :param mappings: a list of dictionaries, each one containing the state + of the mapped row to be inserted, in terms of the attribute names + on the mapped class. If the mapping refers to multiple tables, + such as a joined-inheritance mapping, each dictionary must contain + all keys to be populated into all tables. + + :param return_defaults: when True, rows that are missing values which + generate defaults, namely integer primary key defaults and sequences, + will be inserted **one at a time**, so that the primary key value + is available. In particular this will allow joined-inheritance + and other multi-table mappings to insert correctly without the need + to provide primary + key values ahead of time; however, + :paramref:`.Session.bulk_insert_mappings.return_defaults` + **greatly reduces the performance gains** of the method overall. + If the rows + to be inserted only refer to a single table, then there is no + reason this flag should be set as the returned default information + is not used. + + :param render_nulls: When True, a value of ``None`` will result + in a NULL value being included in the INSERT statement, rather + than the column being omitted from the INSERT. This allows all + the rows being INSERTed to have the identical set of columns which + allows the full set of rows to be batched to the DBAPI. Normally, + each column-set that contains a different combination of NULL values + than the previous row must omit a different series of columns from + the rendered INSERT statement, which means it must be emitted as a + separate statement. By passing this flag, the full set of rows + are guaranteed to be batchable into one batch; the cost however is + that server-side defaults which are invoked by an omitted column will + be skipped, so care must be taken to ensure that these are not + necessary. + + .. warning:: + + When this flag is set, **server side default SQL values will + not be invoked** for those columns that are inserted as NULL; + the NULL value will be sent explicitly. Care must be taken + to ensure that no server-side default functions need to be + invoked for the operation as a whole. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`bulk_operations` + + :meth:`.Session.bulk_save_objects` + + :meth:`.Session.bulk_update_mappings` + + """ + self._bulk_save_mappings( + mapper, mappings, False, False, + return_defaults, False, render_nulls) + + def bulk_update_mappings(self, mapper, mappings): + """Perform a bulk update of the given list of mapping dictionaries. + + The bulk update feature allows plain Python dictionaries to be used as + the source of simple UPDATE operations which can be more easily + grouped together into higher performing "executemany" + operations. Using dictionaries, there is no "history" or session + state management features in use, reducing latency when updating + large numbers of simple rows. + + .. versionadded:: 1.0.0 + + .. warning:: + + The bulk update feature allows for a lower-latency UPDATE + of rows at the expense of most other unit-of-work features. + Features such as object management, relationship handling, + and SQL clause support are **silently omitted** in favor of raw + UPDATES of records. + + **Please read the list of caveats at** :ref:`bulk_operations` + **before using this method, and fully test and confirm the + functionality of all code developed using these systems.** + + :param mapper: a mapped class, or the actual :class:`.Mapper` object, + representing the single kind of object represented within the mapping + list. + + :param mappings: a list of dictionaries, each one containing the state + of the mapped row to be updated, in terms of the attribute names + on the mapped class. If the mapping refers to multiple tables, + such as a joined-inheritance mapping, each dictionary may contain + keys corresponding to all tables. All those keys which are present + and are not part of the primary key are applied to the SET clause + of the UPDATE statement; the primary key values, which are required, + are applied to the WHERE clause. + + + .. seealso:: + + :ref:`bulk_operations` + + :meth:`.Session.bulk_insert_mappings` + + :meth:`.Session.bulk_save_objects` + + """ + self._bulk_save_mappings( + mapper, mappings, True, False, False, False, False) + + def _bulk_save_mappings( + self, mapper, mappings, isupdate, isstates, + return_defaults, update_changed_only, render_nulls): + mapper = _class_to_mapper(mapper) + self._flushing = True + + transaction = self.begin( + subtransactions=True) + try: + if isupdate: + persistence._bulk_update( + mapper, mappings, transaction, + isstates, update_changed_only) + else: + persistence._bulk_insert( + mapper, mappings, transaction, + isstates, return_defaults, render_nulls) + transaction.commit() + + except: + with util.safe_reraise(): + transaction.rollback(_capture_exception=True) + finally: + self._flushing = False + + def is_modified(self, instance, include_collections=True, + passive=True): + r"""Return ``True`` if the given instance has locally + modified attributes. + + This method retrieves the history for each instrumented + attribute on the instance and performs a comparison of the current + value to its previously committed value, if any. + + It is in effect a more expensive and accurate + version of checking for the given instance in the + :attr:`.Session.dirty` collection; a full test for + each attribute's net "dirty" status is performed. + + E.g.:: + + return session.is_modified(someobject) + + .. versionchanged:: 0.8 + When using SQLAlchemy 0.7 and earlier, the ``passive`` + flag should **always** be explicitly set to ``True``, + else SQL loads/autoflushes may proceed which can affect + the modified state itself: + ``session.is_modified(someobject, passive=True)``\ . + In 0.8 and above, the behavior is corrected and + this flag is ignored. + + A few caveats to this method apply: + + * Instances present in the :attr:`.Session.dirty` collection may + report ``False`` when tested with this method. This is because + the object may have received change events via attribute mutation, + thus placing it in :attr:`.Session.dirty`, but ultimately the state + is the same as that loaded from the database, resulting in no net + change here. + * Scalar attributes may not have recorded the previously set + value when a new value was applied, if the attribute was not loaded, + or was expired, at the time the new value was received - in these + cases, the attribute is assumed to have a change, even if there is + ultimately no net change against its database value. SQLAlchemy in + most cases does not need the "old" value when a set event occurs, so + it skips the expense of a SQL call if the old value isn't present, + based on the assumption that an UPDATE of the scalar value is + usually needed, and in those few cases where it isn't, is less + expensive on average than issuing a defensive SELECT. + + The "old" value is fetched unconditionally upon set only if the + attribute container has the ``active_history`` flag set to ``True``. + This flag is set typically for primary key attributes and scalar + object references that are not a simple many-to-one. To set this + flag for any arbitrary mapped column, use the ``active_history`` + argument with :func:`.column_property`. + + :param instance: mapped instance to be tested for pending changes. + :param include_collections: Indicates if multivalued collections + should be included in the operation. Setting this to ``False`` is a + way to detect only local-column based properties (i.e. scalar columns + or many-to-one foreign keys) that would result in an UPDATE for this + instance upon flush. + :param passive: + + .. versionchanged:: 0.8 + Ignored for backwards compatibility. + When using SQLAlchemy 0.7 and earlier, this flag should always + be set to ``True``. + + """ + state = object_state(instance) + + if not state.modified: + return False + + dict_ = state.dict + + for attr in state.manager.attributes: + if \ + ( + not include_collections and + hasattr(attr.impl, 'get_collection') + ) or not hasattr(attr.impl, 'get_history'): + continue + + (added, unchanged, deleted) = \ + attr.impl.get_history(state, dict_, + passive=attributes.NO_CHANGE) + + if added or deleted: + return True + else: + return False + + @property + def is_active(self): + """True if this :class:`.Session` is in "transaction mode" and + is not in "partial rollback" state. + + The :class:`.Session` in its default mode of ``autocommit=False`` + is essentially always in "transaction mode", in that a + :class:`.SessionTransaction` is associated with it as soon as + it is instantiated. This :class:`.SessionTransaction` is immediately + replaced with a new one as soon as it is ended, due to a rollback, + commit, or close operation. + + "Transaction mode" does *not* indicate whether + or not actual database connection resources are in use; the + :class:`.SessionTransaction` object coordinates among zero or more + actual database transactions, and starts out with none, accumulating + individual DBAPI connections as different data sources are used + within its scope. The best way to track when a particular + :class:`.Session` has actually begun to use DBAPI resources is to + implement a listener using the :meth:`.SessionEvents.after_begin` + method, which will deliver both the :class:`.Session` as well as the + target :class:`.Connection` to a user-defined event listener. + + The "partial rollback" state refers to when an "inner" transaction, + typically used during a flush, encounters an error and emits a + rollback of the DBAPI connection. At this point, the + :class:`.Session` is in "partial rollback" and awaits for the user to + call :meth:`.Session.rollback`, in order to close out the + transaction stack. It is in this "partial rollback" period that the + :attr:`.is_active` flag returns False. After the call to + :meth:`.Session.rollback`, the :class:`.SessionTransaction` is + replaced with a new one and :attr:`.is_active` returns ``True`` again. + + When a :class:`.Session` is used in ``autocommit=True`` mode, the + :class:`.SessionTransaction` is only instantiated within the scope + of a flush call, or when :meth:`.Session.begin` is called. So + :attr:`.is_active` will always be ``False`` outside of a flush or + :meth:`.Session.begin` block in this mode, and will be ``True`` + within the :meth:`.Session.begin` block as long as it doesn't enter + "partial rollback" state. + + From all the above, it follows that the only purpose to this flag is + for application frameworks that wish to detect is a "rollback" is + necessary within a generic error handling routine, for + :class:`.Session` objects that would otherwise be in + "partial rollback" mode. In a typical integration case, this is also + not necessary as it is standard practice to emit + :meth:`.Session.rollback` unconditionally within the outermost + exception catch. + + To track the transactional state of a :class:`.Session` fully, + use event listeners, primarily the :meth:`.SessionEvents.after_begin`, + :meth:`.SessionEvents.after_commit`, + :meth:`.SessionEvents.after_rollback` and related events. + + """ + return self.transaction and self.transaction.is_active + + identity_map = None + """A mapping of object identities to objects themselves. + + Iterating through ``Session.identity_map.values()`` provides + access to the full set of persistent objects (i.e., those + that have row identity) currently in the session. + + .. seealso:: + + :func:`.identity_key` - helper function to produce the keys used + in this dictionary. + + """ + + @property + def _dirty_states(self): + """The set of all persistent states considered dirty. + + This method returns all states that were modified including + those that were possibly deleted. + + """ + return self.identity_map._dirty_states() + + @property + def dirty(self): + """The set of all persistent instances considered dirty. + + E.g.:: + + some_mapped_object in session.dirty + + Instances are considered dirty when they were modified but not + deleted. + + Note that this 'dirty' calculation is 'optimistic'; most + attribute-setting or collection modification operations will + mark an instance as 'dirty' and place it in this set, even if + there is no net change to the attribute's value. At flush + time, the value of each attribute is compared to its + previously saved value, and if there's no net change, no SQL + operation will occur (this is a more expensive operation so + it's only done at flush time). + + To check if an instance has actionable net changes to its + attributes, use the :meth:`.Session.is_modified` method. + + """ + return util.IdentitySet( + [state.obj() + for state in self._dirty_states + if state not in self._deleted]) + + @property + def deleted(self): + "The set of all instances marked as 'deleted' within this ``Session``" + + return util.IdentitySet(list(self._deleted.values())) + + @property + def new(self): + "The set of all instances marked as 'new' within this ``Session``." + + return util.IdentitySet(list(self._new.values())) + + +class sessionmaker(_SessionClassMethods): + """A configurable :class:`.Session` factory. + + The :class:`.sessionmaker` factory generates new + :class:`.Session` objects when called, creating them given + the configurational arguments established here. + + e.g.:: + + # global scope + Session = sessionmaker(autoflush=False) + + # later, in a local scope, create and use a session: + sess = Session() + + Any keyword arguments sent to the constructor itself will override the + "configured" keywords:: + + Session = sessionmaker() + + # bind an individual session to a connection + sess = Session(bind=connection) + + The class also includes a method :meth:`.configure`, which can + be used to specify additional keyword arguments to the factory, which + will take effect for subsequent :class:`.Session` objects generated. + This is usually used to associate one or more :class:`.Engine` objects + with an existing :class:`.sessionmaker` factory before it is first + used:: + + # application starts + Session = sessionmaker() + + # ... later + engine = create_engine('sqlite:///foo.db') + Session.configure(bind=engine) + + sess = Session() + + .. seealso: + + :ref:`session_getting` - introductory text on creating + sessions using :class:`.sessionmaker`. + + """ + + def __init__(self, bind=None, class_=Session, autoflush=True, + autocommit=False, + expire_on_commit=True, + info=None, **kw): + r"""Construct a new :class:`.sessionmaker`. + + All arguments here except for ``class_`` correspond to arguments + accepted by :class:`.Session` directly. See the + :meth:`.Session.__init__` docstring for more details on parameters. + + :param bind: a :class:`.Engine` or other :class:`.Connectable` with + which newly created :class:`.Session` objects will be associated. + :param class_: class to use in order to create new :class:`.Session` + objects. Defaults to :class:`.Session`. + :param autoflush: The autoflush setting to use with newly created + :class:`.Session` objects. + :param autocommit: The autocommit setting to use with newly created + :class:`.Session` objects. + :param expire_on_commit=True: the expire_on_commit setting to use + with newly created :class:`.Session` objects. + :param info: optional dictionary of information that will be available + via :attr:`.Session.info`. Note this dictionary is *updated*, not + replaced, when the ``info`` parameter is specified to the specific + :class:`.Session` construction operation. + + .. versionadded:: 0.9.0 + + :param \**kw: all other keyword arguments are passed to the + constructor of newly created :class:`.Session` objects. + + """ + kw['bind'] = bind + kw['autoflush'] = autoflush + kw['autocommit'] = autocommit + kw['expire_on_commit'] = expire_on_commit + if info is not None: + kw['info'] = info + self.kw = kw + # make our own subclass of the given class, so that + # events can be associated with it specifically. + self.class_ = type(class_.__name__, (class_,), {}) + + def __call__(self, **local_kw): + """Produce a new :class:`.Session` object using the configuration + established in this :class:`.sessionmaker`. + + In Python, the ``__call__`` method is invoked on an object when + it is "called" in the same way as a function:: + + Session = sessionmaker() + session = Session() # invokes sessionmaker.__call__() + + """ + for k, v in self.kw.items(): + if k == 'info' and 'info' in local_kw: + d = v.copy() + d.update(local_kw['info']) + local_kw['info'] = d + else: + local_kw.setdefault(k, v) + return self.class_(**local_kw) + + def configure(self, **new_kw): + """(Re)configure the arguments for this sessionmaker. + + e.g.:: + + Session = sessionmaker() + + Session.configure(bind=create_engine('sqlite://')) + """ + self.kw.update(new_kw) + + def __repr__(self): + return "%s(class_=%r,%s)" % ( + self.__class__.__name__, + self.class_.__name__, + ", ".join("%s=%r" % (k, v) for k, v in self.kw.items()) + ) + + +def make_transient(instance): + """Alter the state of the given instance so that it is :term:`transient`. + + .. note:: + + :func:`.make_transient` is a special-case function for + advanced use cases only. + + The given mapped instance is assumed to be in the :term:`persistent` or + :term:`detached` state. The function will remove its association with any + :class:`.Session` as well as its :attr:`.InstanceState.identity`. The + effect is that the object will behave as though it were newly constructed, + except retaining any attribute / collection values that were loaded at the + time of the call. The :attr:`.InstanceState.deleted` flag is also reset + if this object had been deleted as a result of using + :meth:`.Session.delete`. + + .. warning:: + + :func:`.make_transient` does **not** "unexpire" or otherwise eagerly + load ORM-mapped attributes that are not currently loaded at the time + the function is called. This includes attributes which: + + * were expired via :meth:`.Session.expire` + + * were expired as the natural effect of committing a session + transaction, e.g. :meth:`.Session.commit` + + * are normally :term:`lazy loaded` but are not currently loaded + + * are "deferred" via :ref:`deferred` and are not yet loaded + + * were not present in the query which loaded this object, such as that + which is common in joined table inheritance and other scenarios. + + After :func:`.make_transient` is called, unloaded attributes such + as those above will normally resolve to the value ``None`` when + accessed, or an empty collection for a collection-oriented attribute. + As the object is transient and un-associated with any database + identity, it will no longer retrieve these values. + + .. seealso:: + + :func:`.make_transient_to_detached` + + """ + state = attributes.instance_state(instance) + s = _state_session(state) + if s: + s._expunge_states([state]) + + # remove expired state + state.expired_attributes.clear() + + # remove deferred callables + if state.callables: + del state.callables + + if state.key: + del state.key + if state._deleted: + del state._deleted + + +def make_transient_to_detached(instance): + """Make the given transient instance :term:`detached`. + + .. note:: + + :func:`.make_transient_to_detached` is a special-case function for + advanced use cases only. + + All attribute history on the given instance + will be reset as though the instance were freshly loaded + from a query. Missing attributes will be marked as expired. + The primary key attributes of the object, which are required, will be made + into the "key" of the instance. + + The object can then be added to a session, or merged + possibly with the load=False flag, at which point it will look + as if it were loaded that way, without emitting SQL. + + This is a special use case function that differs from a normal + call to :meth:`.Session.merge` in that a given persistent state + can be manufactured without any SQL calls. + + .. versionadded:: 0.9.5 + + .. seealso:: + + :func:`.make_transient` + + """ + state = attributes.instance_state(instance) + if state.session_id or state.key: + raise sa_exc.InvalidRequestError( + "Given object must be transient") + state.key = state.mapper._identity_key_from_state(state) + if state._deleted: + del state._deleted + state._commit_all(state.dict) + state._expire_attributes(state.dict, state.unloaded) + + +def object_session(instance): + """Return the :class:`.Session` to which the given instance belongs. + + This is essentially the same as the :attr:`.InstanceState.session` + accessor. See that attribute for details. + + """ + + try: + state = attributes.instance_state(instance) + except exc.NO_STATE: + raise exc.UnmappedInstanceError(instance) + else: + return _state_session(state) + + +_new_sessionid = util.counter() diff --git a/app/lib/sqlalchemy/orm/state.py b/app/lib/sqlalchemy/orm/state.py new file mode 100644 index 0000000..0fba240 --- /dev/null +++ b/app/lib/sqlalchemy/orm/state.py @@ -0,0 +1,847 @@ +# orm/state.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Defines instrumentation of instances. + +This module is usually not directly visible to user applications, but +defines a large part of the ORM's interactivity. + +""" + +import weakref +from .. import util +from .. import inspection +from . import exc as orm_exc, interfaces +from .path_registry import PathRegistry +from .base import PASSIVE_NO_RESULT, SQL_OK, NEVER_SET, ATTR_WAS_SET, \ + NO_VALUE, PASSIVE_NO_INITIALIZE, INIT_OK, PASSIVE_OFF +from . import base + + +@inspection._self_inspects +class InstanceState(interfaces.InspectionAttr): + """tracks state information at the instance level. + + The :class:`.InstanceState` is a key object used by the + SQLAlchemy ORM in order to track the state of an object; + it is created the moment an object is instantiated, typically + as a result of :term:`instrumentation` which SQLAlchemy applies + to the ``__init__()`` method of the class. + + :class:`.InstanceState` is also a semi-public object, + available for runtime inspection as to the state of a + mapped instance, including information such as its current + status within a particular :class:`.Session` and details + about data on individual attributes. The public API + in order to acquire a :class:`.InstanceState` object + is to use the :func:`.inspect` system:: + + >>> from sqlalchemy import inspect + >>> insp = inspect(some_mapped_object) + + .. seealso:: + + :ref:`core_inspection_toplevel` + + """ + + session_id = None + key = None + runid = None + load_options = util.EMPTY_SET + load_path = () + insert_order = None + _strong_obj = None + modified = False + expired = False + _deleted = False + _load_pending = False + is_instance = True + + callables = () + """A namespace where a per-state loader callable can be associated. + + In SQLAlchemy 1.0, this is only used for lazy loaders / deferred + loaders that were set up via query option. + + Previously, callables was used also to indicate expired attributes + by storing a link to the InstanceState itself in this dictionary. + This role is now handled by the expired_attributes set. + + """ + + def __init__(self, obj, manager): + self.class_ = obj.__class__ + self.manager = manager + self.obj = weakref.ref(obj, self._cleanup) + self.committed_state = {} + self.expired_attributes = set() + + expired_attributes = None + """The set of keys which are 'expired' to be loaded by + the manager's deferred scalar loader, assuming no pending + changes. + + see also the ``unmodified`` collection which is intersected + against this set when a refresh operation occurs.""" + + @util.memoized_property + def attrs(self): + """Return a namespace representing each attribute on + the mapped object, including its current value + and history. + + The returned object is an instance of :class:`.AttributeState`. + This object allows inspection of the current data + within an attribute as well as attribute history + since the last flush. + + """ + return util.ImmutableProperties( + dict( + (key, AttributeState(self, key)) + for key in self.manager + ) + ) + + @property + def transient(self): + """Return true if the object is :term:`transient`. + + .. seealso:: + + :ref:`session_object_states` + + """ + return self.key is None and \ + not self._attached + + @property + def pending(self): + """Return true if the object is :term:`pending`. + + + .. seealso:: + + :ref:`session_object_states` + + """ + return self.key is None and \ + self._attached + + @property + def deleted(self): + """Return true if the object is :term:`deleted`. + + An object that is in the deleted state is guaranteed to + not be within the :attr:`.Session.identity_map` of its parent + :class:`.Session`; however if the session's transaction is rolled + back, the object will be restored to the persistent state and + the identity map. + + .. note:: + + The :attr:`.InstanceState.deleted` attribute refers to a specific + state of the object that occurs between the "persistent" and + "detached" states; once the object is :term:`detached`, the + :attr:`.InstanceState.deleted` attribute **no longer returns + True**; in order to detect that a state was deleted, regardless + of whether or not the object is associated with a :class:`.Session`, + use the :attr:`.InstanceState.was_deleted` accessor. + + .. versionadded: 1.1 + + .. seealso:: + + :ref:`session_object_states` + + """ + return self.key is not None and \ + self._attached and self._deleted + + @property + def was_deleted(self): + """Return True if this object is or was previously in the + "deleted" state and has not been reverted to persistent. + + This flag returns True once the object was deleted in flush. + When the object is expunged from the session either explicitly + or via transaction commit and enters the "detached" state, + this flag will continue to report True. + + .. versionadded:: 1.1 - added a local method form of + :func:`.orm.util.was_deleted`. + + .. seealso:: + + :attr:`.InstanceState.deleted` - refers to the "deleted" state + + :func:`.orm.util.was_deleted` - standalone function + + :ref:`session_object_states` + + """ + return self._deleted + + @property + def persistent(self): + """Return true if the object is :term:`persistent`. + + An object that is in the persistent state is guaranteed to + be within the :attr:`.Session.identity_map` of its parent + :class:`.Session`. + + .. versionchanged:: 1.1 The :attr:`.InstanceState.persistent` + accessor no longer returns True for an object that was + "deleted" within a flush; use the :attr:`.InstanceState.deleted` + accessor to detect this state. This allows the "persistent" + state to guarantee membership in the identity map. + + .. seealso:: + + :ref:`session_object_states` + + """ + return self.key is not None and \ + self._attached and not self._deleted + + @property + def detached(self): + """Return true if the object is :term:`detached`. + + .. seealso:: + + :ref:`session_object_states` + + """ + return self.key is not None and not self._attached + + @property + @util.dependencies("sqlalchemy.orm.session") + def _attached(self, sessionlib): + return self.session_id is not None and \ + self.session_id in sessionlib._sessions + + @property + @util.dependencies("sqlalchemy.orm.session") + def session(self, sessionlib): + """Return the owning :class:`.Session` for this instance, + or ``None`` if none available. + + Note that the result here can in some cases be *different* + from that of ``obj in session``; an object that's been deleted + will report as not ``in session``, however if the transaction is + still in progress, this attribute will still refer to that session. + Only when the transaction is completed does the object become + fully detached under normal circumstances. + + """ + return sessionlib._state_session(self) + + @property + def object(self): + """Return the mapped object represented by this + :class:`.InstanceState`.""" + return self.obj() + + @property + def identity(self): + """Return the mapped identity of the mapped object. + This is the primary key identity as persisted by the ORM + which can always be passed directly to + :meth:`.Query.get`. + + Returns ``None`` if the object has no primary key identity. + + .. note:: + An object which is :term:`transient` or :term:`pending` + does **not** have a mapped identity until it is flushed, + even if its attributes include primary key values. + + """ + if self.key is None: + return None + else: + return self.key[1] + + @property + def identity_key(self): + """Return the identity key for the mapped object. + + This is the key used to locate the object within + the :attr:`.Session.identity_map` mapping. It contains + the identity as returned by :attr:`.identity` within it. + + + """ + # TODO: just change .key to .identity_key across + # the board ? probably + return self.key + + @util.memoized_property + def parents(self): + return {} + + @util.memoized_property + def _pending_mutations(self): + return {} + + @util.memoized_property + def mapper(self): + """Return the :class:`.Mapper` used for this mapepd object.""" + return self.manager.mapper + + @property + def has_identity(self): + """Return ``True`` if this object has an identity key. + + This should always have the same value as the + expression ``state.persistent or state.detached``. + + """ + return bool(self.key) + + @classmethod + def _detach_states(self, states, session, to_transient=False): + persistent_to_detached = \ + session.dispatch.persistent_to_detached or None + deleted_to_detached = \ + session.dispatch.deleted_to_detached or None + pending_to_transient = \ + session.dispatch.pending_to_transient or None + persistent_to_transient = \ + session.dispatch.persistent_to_transient or None + + for state in states: + deleted = state._deleted + pending = state.key is None + persistent = not pending and not deleted + + state.session_id = None + + if to_transient and state.key: + del state.key + if persistent: + if to_transient: + if persistent_to_transient is not None: + obj = state.obj() + if obj is not None: + persistent_to_transient(session, obj) + elif persistent_to_detached is not None: + obj = state.obj() + if obj is not None: + persistent_to_detached(session, obj) + elif deleted and deleted_to_detached is not None: + obj = state.obj() + if obj is not None: + deleted_to_detached(session, obj) + elif pending and pending_to_transient is not None: + obj = state.obj() + if obj is not None: + pending_to_transient(session, obj) + + state._strong_obj = None + + def _detach(self, session=None): + if session: + InstanceState._detach_states([self], session) + else: + self.session_id = self._strong_obj = None + + def _dispose(self): + self._detach() + del self.obj + + def _cleanup(self, ref): + """Weakref callback cleanup. + + This callable cleans out the state when it is being garbage + collected. + + this _cleanup **assumes** that there are no strong refs to us! + Will not work otherwise! + + """ + instance_dict = self._instance_dict() + if instance_dict is not None: + instance_dict._fast_discard(self) + del self._instance_dict + + # we can't possibly be in instance_dict._modified + # b.c. this is weakref cleanup only, that set + # is strong referencing! + # assert self not in instance_dict._modified + + self.session_id = self._strong_obj = None + del self.obj + + def obj(self): + return None + + @property + def dict(self): + """Return the instance dict used by the object. + + Under normal circumstances, this is always synonymous + with the ``__dict__`` attribute of the mapped object, + unless an alternative instrumentation system has been + configured. + + In the case that the actual object has been garbage + collected, this accessor returns a blank dictionary. + + """ + o = self.obj() + if o is not None: + return base.instance_dict(o) + else: + return {} + + def _initialize_instance(*mixed, **kwargs): + self, instance, args = mixed[0], mixed[1], mixed[2:] # noqa + manager = self.manager + + manager.dispatch.init(self, args, kwargs) + + try: + return manager.original_init(*mixed[1:], **kwargs) + except: + with util.safe_reraise(): + manager.dispatch.init_failure(self, args, kwargs) + + def get_history(self, key, passive): + return self.manager[key].impl.get_history(self, self.dict, passive) + + def get_impl(self, key): + return self.manager[key].impl + + def _get_pending_mutation(self, key): + if key not in self._pending_mutations: + self._pending_mutations[key] = PendingCollection() + return self._pending_mutations[key] + + def __getstate__(self): + state_dict = {'instance': self.obj()} + state_dict.update( + (k, self.__dict__[k]) for k in ( + 'committed_state', '_pending_mutations', 'modified', + 'expired', 'callables', 'key', 'parents', 'load_options', + 'class_', 'expired_attributes' + ) if k in self.__dict__ + ) + if self.load_path: + state_dict['load_path'] = self.load_path.serialize() + + state_dict['manager'] = self.manager._serialize(self, state_dict) + + return state_dict + + def __setstate__(self, state_dict): + inst = state_dict['instance'] + if inst is not None: + self.obj = weakref.ref(inst, self._cleanup) + self.class_ = inst.__class__ + else: + # None being possible here generally new as of 0.7.4 + # due to storage of state in "parents". "class_" + # also new. + self.obj = None + self.class_ = state_dict['class_'] + + self.committed_state = state_dict.get('committed_state', {}) + self._pending_mutations = state_dict.get('_pending_mutations', {}) + self.parents = state_dict.get('parents', {}) + self.modified = state_dict.get('modified', False) + self.expired = state_dict.get('expired', False) + if 'callables' in state_dict: + self.callables = state_dict['callables'] + + try: + self.expired_attributes = state_dict['expired_attributes'] + except KeyError: + self.expired_attributes = set() + # 0.9 and earlier compat + for k in list(self.callables): + if self.callables[k] is self: + self.expired_attributes.add(k) + del self.callables[k] + + self.__dict__.update([ + (k, state_dict[k]) for k in ( + 'key', 'load_options', + ) if k in state_dict + ]) + + if 'load_path' in state_dict: + self.load_path = PathRegistry.\ + deserialize(state_dict['load_path']) + + state_dict['manager'](self, inst, state_dict) + + def _reset(self, dict_, key): + """Remove the given attribute and any + callables associated with it.""" + + old = dict_.pop(key, None) + if old is not None and self.manager[key].impl.collection: + self.manager[key].impl._invalidate_collection(old) + self.expired_attributes.discard(key) + if self.callables: + self.callables.pop(key, None) + + def _copy_callables(self, from_): + if 'callables' in from_.__dict__: + self.callables = dict(from_.callables) + + @classmethod + def _instance_level_callable_processor(cls, manager, fn, key): + impl = manager[key].impl + if impl.collection: + def _set_callable(state, dict_, row): + if 'callables' not in state.__dict__: + state.callables = {} + old = dict_.pop(key, None) + if old is not None: + impl._invalidate_collection(old) + state.callables[key] = fn + else: + def _set_callable(state, dict_, row): + if 'callables' not in state.__dict__: + state.callables = {} + state.callables[key] = fn + return _set_callable + + def _expire(self, dict_, modified_set): + self.expired = True + + if self.modified: + modified_set.discard(self) + self.committed_state.clear() + self.modified = False + + self._strong_obj = None + + if '_pending_mutations' in self.__dict__: + del self.__dict__['_pending_mutations'] + + if 'parents' in self.__dict__: + del self.__dict__['parents'] + + self.expired_attributes.update( + [impl.key for impl in self.manager._scalar_loader_impls + if impl.expire_missing or impl.key in dict_] + ) + + if self.callables: + for k in self.expired_attributes.intersection(self.callables): + del self.callables[k] + + for k in self.manager._collection_impl_keys.intersection(dict_): + collection = dict_.pop(k) + collection._sa_adapter.invalidated = True + + for key in self.manager._all_key_set.intersection(dict_): + del dict_[key] + + self.manager.dispatch.expire(self, None) + + def _expire_attributes(self, dict_, attribute_names, no_loader=False): + pending = self.__dict__.get('_pending_mutations', None) + + callables = self.callables + + for key in attribute_names: + impl = self.manager[key].impl + if impl.accepts_scalar_loader: + if no_loader and ( + impl.callable_ or + key in callables + ): + continue + + self.expired_attributes.add(key) + if callables and key in callables: + del callables[key] + old = dict_.pop(key, None) + if impl.collection and old is not None: + impl._invalidate_collection(old) + + self.committed_state.pop(key, None) + if pending: + pending.pop(key, None) + + self.manager.dispatch.expire(self, attribute_names) + + def _load_expired(self, state, passive): + """__call__ allows the InstanceState to act as a deferred + callable for loading expired attributes, which is also + serializable (picklable). + + """ + + if not passive & SQL_OK: + return PASSIVE_NO_RESULT + + toload = self.expired_attributes.\ + intersection(self.unmodified) + + self.manager.deferred_scalar_loader(self, toload) + + # if the loader failed, or this + # instance state didn't have an identity, + # the attributes still might be in the callables + # dict. ensure they are removed. + self.expired_attributes.clear() + + return ATTR_WAS_SET + + @property + def unmodified(self): + """Return the set of keys which have no uncommitted changes""" + + return set(self.manager).difference(self.committed_state) + + def unmodified_intersection(self, keys): + """Return self.unmodified.intersection(keys).""" + + return set(keys).intersection(self.manager).\ + difference(self.committed_state) + + @property + def unloaded(self): + """Return the set of keys which do not have a loaded value. + + This includes expired attributes and any other attribute that + was never populated or modified. + + """ + return set(self.manager).\ + difference(self.committed_state).\ + difference(self.dict) + + @property + def _unloaded_non_object(self): + return self.unloaded.intersection( + attr for attr in self.manager + if self.manager[attr].impl.accepts_scalar_loader + ) + + def _instance_dict(self): + return None + + def _modified_event( + self, dict_, attr, previous, collection=False, force=False): + if not attr.send_modified_events: + return + if attr.key not in self.committed_state or force: + if collection: + if previous is NEVER_SET: + if attr.key in dict_: + previous = dict_[attr.key] + + if previous not in (None, NO_VALUE, NEVER_SET): + previous = attr.copy(previous) + + self.committed_state[attr.key] = previous + + # assert self._strong_obj is None or self.modified + + if (self.session_id and self._strong_obj is None) \ + or not self.modified: + self.modified = True + instance_dict = self._instance_dict() + if instance_dict: + instance_dict._modified.add(self) + + # only create _strong_obj link if attached + # to a session + + inst = self.obj() + if self.session_id: + self._strong_obj = inst + + if inst is None: + raise orm_exc.ObjectDereferencedError( + "Can't emit change event for attribute '%s' - " + "parent object of type %s has been garbage " + "collected." + % ( + self.manager[attr.key], + base.state_class_str(self) + )) + + def _commit(self, dict_, keys): + """Commit attributes. + + This is used by a partial-attribute load operation to mark committed + those attributes which were refreshed from the database. + + Attributes marked as "expired" can potentially remain "expired" after + this step if a value was not populated in state.dict. + + """ + for key in keys: + self.committed_state.pop(key, None) + + self.expired = False + + self.expired_attributes.difference_update( + set(keys).intersection(dict_)) + + # the per-keys commit removes object-level callables, + # while that of commit_all does not. it's not clear + # if this behavior has a clear rationale, however tests do + # ensure this is what it does. + if self.callables: + for key in set(self.callables).\ + intersection(keys).\ + intersection(dict_): + del self.callables[key] + + def _commit_all(self, dict_, instance_dict=None): + """commit all attributes unconditionally. + + This is used after a flush() or a full load/refresh + to remove all pending state from the instance. + + - all attributes are marked as "committed" + - the "strong dirty reference" is removed + - the "modified" flag is set to False + - any "expired" markers for scalar attributes loaded are removed. + - lazy load callables for objects / collections *stay* + + Attributes marked as "expired" can potentially remain + "expired" after this step if a value was not populated in state.dict. + + """ + self._commit_all_states([(self, dict_)], instance_dict) + + @classmethod + def _commit_all_states(self, iter, instance_dict=None): + """Mass / highly inlined version of commit_all().""" + + for state, dict_ in iter: + state_dict = state.__dict__ + + state.committed_state.clear() + + if '_pending_mutations' in state_dict: + del state_dict['_pending_mutations'] + + state.expired_attributes.difference_update(dict_) + + if instance_dict and state.modified: + instance_dict._modified.discard(state) + + state.modified = state.expired = False + state._strong_obj = None + + +class AttributeState(object): + """Provide an inspection interface corresponding + to a particular attribute on a particular mapped object. + + The :class:`.AttributeState` object is accessed + via the :attr:`.InstanceState.attrs` collection + of a particular :class:`.InstanceState`:: + + from sqlalchemy import inspect + + insp = inspect(some_mapped_object) + attr_state = insp.attrs.some_attribute + + """ + + def __init__(self, state, key): + self.state = state + self.key = key + + @property + def loaded_value(self): + """The current value of this attribute as loaded from the database. + + If the value has not been loaded, or is otherwise not present + in the object's dictionary, returns NO_VALUE. + + """ + return self.state.dict.get(self.key, NO_VALUE) + + @property + def value(self): + """Return the value of this attribute. + + This operation is equivalent to accessing the object's + attribute directly or via ``getattr()``, and will fire + off any pending loader callables if needed. + + """ + return self.state.manager[self.key].__get__( + self.state.obj(), self.state.class_) + + @property + def history(self): + """Return the current pre-flush change history for + this attribute, via the :class:`.History` interface. + + This method will **not** emit loader callables if the value of the + attribute is unloaded. + + .. seealso:: + + :meth:`.AttributeState.load_history` - retrieve history + using loader callables if the value is not locally present. + + :func:`.attributes.get_history` - underlying function + + """ + return self.state.get_history(self.key, + PASSIVE_NO_INITIALIZE) + + def load_history(self): + """Return the current pre-flush change history for + this attribute, via the :class:`.History` interface. + + This method **will** emit loader callables if the value of the + attribute is unloaded. + + .. seealso:: + + :attr:`.AttributeState.history` + + :func:`.attributes.get_history` - underlying function + + .. versionadded:: 0.9.0 + + """ + return self.state.get_history(self.key, + PASSIVE_OFF ^ INIT_OK) + + +class PendingCollection(object): + """A writable placeholder for an unloaded collection. + + Stores items appended to and removed from a collection that has not yet + been loaded. When the collection is loaded, the changes stored in + PendingCollection are applied to it to produce the final result. + + """ + + def __init__(self): + self.deleted_items = util.IdentitySet() + self.added_items = util.OrderedIdentitySet() + + def append(self, value): + if value in self.deleted_items: + self.deleted_items.remove(value) + else: + self.added_items.add(value) + + def remove(self, value): + if value in self.added_items: + self.added_items.remove(value) + else: + self.deleted_items.add(value) diff --git a/app/lib/sqlalchemy/orm/strategies.py b/app/lib/sqlalchemy/orm/strategies.py new file mode 100644 index 0000000..c70994e --- /dev/null +++ b/app/lib/sqlalchemy/orm/strategies.py @@ -0,0 +1,1707 @@ +# orm/strategies.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""sqlalchemy.orm.interfaces.LoaderStrategy + implementations, and related MapperOptions.""" + +from .. import exc as sa_exc, inspect +from .. import util, log, event +from ..sql import util as sql_util, visitors +from .. import sql +from . import ( + attributes, interfaces, exc as orm_exc, loading, + unitofwork, util as orm_util +) +from .state import InstanceState +from .util import _none_set +from . import properties +from .interfaces import ( + LoaderStrategy, StrategizedProperty +) +from .base import _SET_DEFERRED_EXPIRED, _DEFER_FOR_STATE +from .session import _state_session +import itertools + + +def _register_attribute( + prop, mapper, useobject, + compare_function=None, + typecallable=None, + callable_=None, + proxy_property=None, + active_history=False, + impl_class=None, + **kw +): + + attribute_ext = list(util.to_list(prop.extension, default=[])) + + listen_hooks = [] + + uselist = useobject and prop.uselist + + if useobject and prop.single_parent: + listen_hooks.append(single_parent_validator) + + if prop.key in prop.parent.validators: + fn, opts = prop.parent.validators[prop.key] + listen_hooks.append( + lambda desc, prop: orm_util._validator_events( + desc, + prop.key, fn, **opts) + ) + + if useobject: + listen_hooks.append(unitofwork.track_cascade_events) + + # need to assemble backref listeners + # after the singleparentvalidator, mapper validator + if useobject: + backref = prop.back_populates + if backref: + listen_hooks.append( + lambda desc, prop: attributes.backref_listeners( + desc, + backref, + uselist + ) + ) + + # a single MapperProperty is shared down a class inheritance + # hierarchy, so we set up attribute instrumentation and backref event + # for each mapper down the hierarchy. + + # typically, "mapper" is the same as prop.parent, due to the way + # the configure_mappers() process runs, however this is not strongly + # enforced, and in the case of a second configure_mappers() run the + # mapper here might not be prop.parent; also, a subclass mapper may + # be called here before a superclass mapper. That is, can't depend + # on mappers not already being set up so we have to check each one. + + for m in mapper.self_and_descendants: + if prop is m._props.get(prop.key) and \ + not m.class_manager._attr_has_impl(prop.key): + + desc = attributes.register_attribute_impl( + m.class_, + prop.key, + parent_token=prop, + uselist=uselist, + compare_function=compare_function, + useobject=useobject, + extension=attribute_ext, + trackparent=useobject and ( + prop.single_parent or + prop.direction is interfaces.ONETOMANY), + typecallable=typecallable, + callable_=callable_, + active_history=active_history, + impl_class=impl_class, + send_modified_events=not useobject or not prop.viewonly, + doc=prop.doc, + **kw + ) + + for hook in listen_hooks: + hook(desc, prop) + + +@properties.ColumnProperty.strategy_for(instrument=False, deferred=False) +class UninstrumentedColumnLoader(LoaderStrategy): + """Represent a non-instrumented MapperProperty. + + The polymorphic_on argument of mapper() often results in this, + if the argument is against the with_polymorphic selectable. + + """ + __slots__ = 'columns', + + def __init__(self, parent, strategy_key): + super(UninstrumentedColumnLoader, self).__init__(parent, strategy_key) + self.columns = self.parent_property.columns + + def setup_query( + self, context, entity, path, loadopt, adapter, + column_collection=None, **kwargs): + for c in self.columns: + if adapter: + c = adapter.columns[c] + column_collection.append(c) + + def create_row_processor( + self, context, path, loadopt, + mapper, result, adapter, populators): + pass + + +@log.class_logger +@properties.ColumnProperty.strategy_for(instrument=True, deferred=False) +class ColumnLoader(LoaderStrategy): + """Provide loading behavior for a :class:`.ColumnProperty`.""" + + __slots__ = 'columns', 'is_composite' + + def __init__(self, parent, strategy_key): + super(ColumnLoader, self).__init__(parent, strategy_key) + self.columns = self.parent_property.columns + self.is_composite = hasattr(self.parent_property, 'composite_class') + + def setup_query( + self, context, entity, path, loadopt, + adapter, column_collection, memoized_populators, **kwargs): + + for c in self.columns: + if adapter: + c = adapter.columns[c] + column_collection.append(c) + + fetch = self.columns[0] + if adapter: + fetch = adapter.columns[fetch] + memoized_populators[self.parent_property] = fetch + + def init_class_attribute(self, mapper): + self.is_class_level = True + coltype = self.columns[0].type + # TODO: check all columns ? check for foreign key as well? + active_history = self.parent_property.active_history or \ + self.columns[0].primary_key or \ + mapper.version_id_col in set(self.columns) + + _register_attribute( + self.parent_property, mapper, useobject=False, + compare_function=coltype.compare_values, + active_history=active_history + ) + + def create_row_processor( + self, context, path, + loadopt, mapper, result, adapter, populators): + # look through list of columns represented here + # to see which, if any, is present in the row. + for col in self.columns: + if adapter: + col = adapter.columns[col] + getter = result._getter(col, False) + if getter: + populators["quick"].append((self.key, getter)) + break + else: + populators["expire"].append((self.key, True)) + + +@log.class_logger +@properties.ColumnProperty.strategy_for(deferred=True, instrument=True) +class DeferredColumnLoader(LoaderStrategy): + """Provide loading behavior for a deferred :class:`.ColumnProperty`.""" + + __slots__ = 'columns', 'group' + + def __init__(self, parent, strategy_key): + super(DeferredColumnLoader, self).__init__(parent, strategy_key) + if hasattr(self.parent_property, 'composite_class'): + raise NotImplementedError("Deferred loading for composite " + "types not implemented yet") + self.columns = self.parent_property.columns + self.group = self.parent_property.group + + def create_row_processor( + self, context, path, loadopt, + mapper, result, adapter, populators): + + # this path currently does not check the result + # for the column; this is because in most cases we are + # working just with the setup_query() directive which does + # not support this, and the behavior here should be consistent. + if not self.is_class_level: + set_deferred_for_local_state = \ + self.parent_property._deferred_column_loader + populators["new"].append((self.key, set_deferred_for_local_state)) + else: + populators["expire"].append((self.key, False)) + + def init_class_attribute(self, mapper): + self.is_class_level = True + + _register_attribute( + self.parent_property, mapper, useobject=False, + compare_function=self.columns[0].type.compare_values, + callable_=self._load_for_state, + expire_missing=False + ) + + def setup_query( + self, context, entity, path, loadopt, + adapter, column_collection, memoized_populators, + only_load_props=None, **kw): + + if ( + ( + loadopt and + 'undefer_pks' in loadopt.local_opts and + set(self.columns).intersection( + self.parent._should_undefer_in_wildcard) + ) + or + ( + loadopt and + self.group and + loadopt.local_opts.get('undefer_group_%s' % self.group, False) + ) + or + ( + only_load_props and self.key in only_load_props + ) + ): + self.parent_property._get_strategy( + (("deferred", False), ("instrument", True)) + ).setup_query( + context, entity, + path, loadopt, adapter, + column_collection, memoized_populators, **kw) + elif self.is_class_level: + memoized_populators[self.parent_property] = _SET_DEFERRED_EXPIRED + else: + memoized_populators[self.parent_property] = _DEFER_FOR_STATE + + def _load_for_state(self, state, passive): + if not state.key: + return attributes.ATTR_EMPTY + + if not passive & attributes.SQL_OK: + return attributes.PASSIVE_NO_RESULT + + localparent = state.manager.mapper + + if self.group: + toload = [ + p.key for p in + localparent.iterate_properties + if isinstance(p, StrategizedProperty) and + isinstance(p.strategy, DeferredColumnLoader) and + p.group == self.group + ] + else: + toload = [self.key] + + # narrow the keys down to just those which have no history + group = [k for k in toload if k in state.unmodified] + + session = _state_session(state) + if session is None: + raise orm_exc.DetachedInstanceError( + "Parent instance %s is not bound to a Session; " + "deferred load operation of attribute '%s' cannot proceed" % + (orm_util.state_str(state), self.key) + ) + + query = session.query(localparent) + if loading.load_on_ident( + query, state.key, + only_load_props=group, refresh_state=state) is None: + raise orm_exc.ObjectDeletedError(state) + + return attributes.ATTR_WAS_SET + + +class LoadDeferredColumns(object): + """serializable loader object used by DeferredColumnLoader""" + + def __init__(self, key): + self.key = key + + def __call__(self, state, passive=attributes.PASSIVE_OFF): + key = self.key + + localparent = state.manager.mapper + prop = localparent._props[key] + strategy = prop._strategies[DeferredColumnLoader] + return strategy._load_for_state(state, passive) + + +class AbstractRelationshipLoader(LoaderStrategy): + """LoaderStratgies which deal with related objects.""" + + __slots__ = 'mapper', 'target', 'uselist' + + def __init__(self, parent, strategy_key): + super(AbstractRelationshipLoader, self).__init__(parent, strategy_key) + self.mapper = self.parent_property.mapper + self.target = self.parent_property.target + self.uselist = self.parent_property.uselist + + +@log.class_logger +@properties.RelationshipProperty.strategy_for(lazy="noload") +@properties.RelationshipProperty.strategy_for(lazy=None) +class NoLoader(AbstractRelationshipLoader): + """Provide loading behavior for a :class:`.RelationshipProperty` + with "lazy=None". + + """ + + __slots__ = () + + def init_class_attribute(self, mapper): + self.is_class_level = True + + _register_attribute( + self.parent_property, mapper, + useobject=True, + typecallable=self.parent_property.collection_class, + ) + + def create_row_processor( + self, context, path, loadopt, mapper, + result, adapter, populators): + def invoke_no_load(state, dict_, row): + if self.uselist: + state.manager.get_impl(self.key).initialize(state, dict_) + else: + dict_[self.key] = None + populators["new"].append((self.key, invoke_no_load)) + + +@log.class_logger +@properties.RelationshipProperty.strategy_for(lazy=True) +@properties.RelationshipProperty.strategy_for(lazy="select") +@properties.RelationshipProperty.strategy_for(lazy="raise") +@properties.RelationshipProperty.strategy_for(lazy="raise_on_sql") +class LazyLoader(AbstractRelationshipLoader, util.MemoizedSlots): + """Provide loading behavior for a :class:`.RelationshipProperty` + with "lazy=True", that is loads when first accessed. + + """ + + __slots__ = ( + '_lazywhere', '_rev_lazywhere', 'use_get', '_bind_to_col', + '_equated_columns', '_rev_bind_to_col', '_rev_equated_columns', + '_simple_lazy_clause', '_raise_always', '_raise_on_sql') + + def __init__(self, parent, strategy_key): + super(LazyLoader, self).__init__(parent, strategy_key) + self._raise_always = self.strategy_opts["lazy"] == "raise" + self._raise_on_sql = self.strategy_opts["lazy"] == "raise_on_sql" + + join_condition = self.parent_property._join_condition + self._lazywhere, \ + self._bind_to_col, \ + self._equated_columns = join_condition.create_lazy_clause() + + self._rev_lazywhere, \ + self._rev_bind_to_col, \ + self._rev_equated_columns = join_condition.create_lazy_clause( + reverse_direction=True) + + self.logger.info("%s lazy loading clause %s", self, self._lazywhere) + + # determine if our "lazywhere" clause is the same as the mapper's + # get() clause. then we can just use mapper.get() + self.use_get = not self.uselist and \ + self.mapper._get_clause[0].compare( + self._lazywhere, + use_proxies=True, + equivalents=self.mapper._equivalent_columns + ) + + if self.use_get: + for col in list(self._equated_columns): + if col in self.mapper._equivalent_columns: + for c in self.mapper._equivalent_columns[col]: + self._equated_columns[c] = self._equated_columns[col] + + self.logger.info("%s will use query.get() to " + "optimize instance loads", self) + + def init_class_attribute(self, mapper): + self.is_class_level = True + + active_history = ( + self.parent_property.active_history or + self.parent_property.direction is not interfaces.MANYTOONE or + not self.use_get + ) + + # MANYTOONE currently only needs the + # "old" value for delete-orphan + # cascades. the required _SingleParentValidator + # will enable active_history + # in that case. otherwise we don't need the + # "old" value during backref operations. + _register_attribute( + self.parent_property, + mapper, + useobject=True, + callable_=self._load_for_state, + typecallable=self.parent_property.collection_class, + active_history=active_history + ) + + def _memoized_attr__simple_lazy_clause(self): + criterion, bind_to_col = ( + self._lazywhere, + self._bind_to_col + ) + + params = [] + + def visit_bindparam(bindparam): + bindparam.unique = False + if bindparam._identifying_key in bind_to_col: + params.append(( + bindparam.key, bind_to_col[bindparam._identifying_key], + None)) + elif bindparam.callable is None: + params.append((bindparam.key, None, bindparam.value)) + + criterion = visitors.cloned_traverse( + criterion, {}, {'bindparam': visit_bindparam} + ) + + return criterion, params + + def _generate_lazy_clause(self, state, passive): + criterion, param_keys = self._simple_lazy_clause + + if state is None: + return sql_util.adapt_criterion_to_null( + criterion, [key for key, ident, value in param_keys]) + + mapper = self.parent_property.parent + + o = state.obj() # strong ref + dict_ = attributes.instance_dict(o) + + if passive & attributes.INIT_OK: + passive ^= attributes.INIT_OK + + params = {} + for key, ident, value in param_keys: + if ident is not None: + if passive and passive & attributes.LOAD_AGAINST_COMMITTED: + value = mapper._get_committed_state_attr_by_column( + state, dict_, ident, passive) + else: + value = mapper._get_state_attr_by_column( + state, dict_, ident, passive) + + params[key] = value + + return criterion, params + + def _invoke_raise_load(self, state, passive, lazy): + raise sa_exc.InvalidRequestError( + "'%s' is not available due to lazy='%s'" % (self, lazy) + ) + + def _load_for_state(self, state, passive): + + if not state.key and ( + ( + not self.parent_property.load_on_pending + and not state._load_pending + ) + or not state.session_id + ): + return attributes.ATTR_EMPTY + + pending = not state.key + ident_key = None + + if ( + (not passive & attributes.SQL_OK and not self.use_get) + or + (not passive & attributes.NON_PERSISTENT_OK and pending) + ): + return attributes.PASSIVE_NO_RESULT + + if self._raise_always: + self._invoke_raise_load(state, passive, "raise") + + session = _state_session(state) + if not session: + raise orm_exc.DetachedInstanceError( + "Parent instance %s is not bound to a Session; " + "lazy load operation of attribute '%s' cannot proceed" % + (orm_util.state_str(state), self.key) + ) + + # if we have a simple primary key load, check the + # identity map without generating a Query at all + if self.use_get: + ident = self._get_ident_for_use_get( + session, + state, + passive + ) + if attributes.PASSIVE_NO_RESULT in ident: + return attributes.PASSIVE_NO_RESULT + elif attributes.NEVER_SET in ident: + return attributes.NEVER_SET + + if _none_set.issuperset(ident): + return None + + ident_key = self.mapper.identity_key_from_primary_key(ident) + instance = loading.get_from_identity(session, ident_key, passive) + if instance is not None: + return instance + elif not passive & attributes.SQL_OK or \ + not passive & attributes.RELATED_OBJECT_OK: + return attributes.PASSIVE_NO_RESULT + + return self._emit_lazyload(session, state, ident_key, passive) + + def _get_ident_for_use_get(self, session, state, passive): + instance_mapper = state.manager.mapper + + if passive & attributes.LOAD_AGAINST_COMMITTED: + get_attr = instance_mapper._get_committed_state_attr_by_column + else: + get_attr = instance_mapper._get_state_attr_by_column + + dict_ = state.dict + + return [ + get_attr( + state, + dict_, + self._equated_columns[pk], + passive=passive) + for pk in self.mapper.primary_key + ] + + @util.dependencies("sqlalchemy.orm.strategy_options") + def _emit_lazyload( + self, strategy_options, session, state, ident_key, passive): + + q = session.query(self.mapper)._adapt_all_clauses() + if self.parent_property.secondary is not None: + q = q.select_from(self.mapper, self.parent_property.secondary) + + q = q._with_invoke_all_eagers(False) + + pending = not state.key + + # don't autoflush on pending + if pending or passive & attributes.NO_AUTOFLUSH: + q = q.autoflush(False) + + if state.load_path: + q = q._with_current_path(state.load_path[self.parent_property]) + + if state.load_options: + q = q._conditional_options(*state.load_options) + + if self.use_get: + if self._raise_on_sql: + self._invoke_raise_load(state, passive, "raise_on_sql") + return loading.load_on_ident(q, ident_key) + + if self.parent_property.order_by: + q = q.order_by(*util.to_list(self.parent_property.order_by)) + + for rev in self.parent_property._reverse_property: + # reverse props that are MANYTOONE are loading *this* + # object from get(), so don't need to eager out to those. + if rev.direction is interfaces.MANYTOONE and \ + rev._use_get and \ + not isinstance(rev.strategy, LazyLoader): + q = q.options( + strategy_options.Load.for_existing_path( + q._current_path[rev.parent] + ).lazyload(rev.key) + ) + + lazy_clause, params = self._generate_lazy_clause( + state, passive=passive) + + if pending: + if util.has_intersection( + orm_util._none_set, params.values()): + return None + elif util.has_intersection(orm_util._never_set, params.values()): + return None + + if self._raise_on_sql: + self._invoke_raise_load(state, passive, "raise_on_sql") + + q = q.filter(lazy_clause).params(params) + + result = q.all() + if self.uselist: + return result + else: + l = len(result) + if l: + if l > 1: + util.warn( + "Multiple rows returned with " + "uselist=False for lazily-loaded attribute '%s' " + % self.parent_property) + + return result[0] + else: + return None + + def create_row_processor( + self, context, path, loadopt, + mapper, result, adapter, populators): + key = self.key + if not self.is_class_level: + # we are not the primary manager for this attribute + # on this class - set up a + # per-instance lazyloader, which will override the + # class-level behavior. + # this currently only happens when using a + # "lazyload" option on a "no load" + # attribute - "eager" attributes always have a + # class-level lazyloader installed. + set_lazy_callable = InstanceState._instance_level_callable_processor( + mapper.class_manager, + LoadLazyAttribute(key, self), key) + + populators["new"].append((self.key, set_lazy_callable)) + elif context.populate_existing or mapper.always_refresh: + def reset_for_lazy_callable(state, dict_, row): + # we are the primary manager for this attribute on + # this class - reset its + # per-instance attribute state, so that the class-level + # lazy loader is + # executed when next referenced on this instance. + # this is needed in + # populate_existing() types of scenarios to reset + # any existing state. + state._reset(dict_, key) + + populators["new"].append((self.key, reset_for_lazy_callable)) + + +class LoadLazyAttribute(object): + """serializable loader object used by LazyLoader""" + + def __init__(self, key, initiating_strategy): + self.key = key + self.strategy_key = initiating_strategy.strategy_key + + def __call__(self, state, passive=attributes.PASSIVE_OFF): + key = self.key + instance_mapper = state.manager.mapper + prop = instance_mapper._props[key] + strategy = prop._strategies[self.strategy_key] + + return strategy._load_for_state(state, passive) + + +@properties.RelationshipProperty.strategy_for(lazy="immediate") +class ImmediateLoader(AbstractRelationshipLoader): + __slots__ = () + + def init_class_attribute(self, mapper): + self.parent_property.\ + _get_strategy((("lazy", "select"),)).\ + init_class_attribute(mapper) + + def setup_query( + self, context, entity, + path, loadopt, adapter, column_collection=None, + parentmapper=None, **kwargs): + pass + + def create_row_processor( + self, context, path, loadopt, + mapper, result, adapter, populators): + def load_immediate(state, dict_, row): + state.get_impl(self.key).get(state, dict_) + + populators["delayed"].append((self.key, load_immediate)) + + +@log.class_logger +@properties.RelationshipProperty.strategy_for(lazy="subquery") +class SubqueryLoader(AbstractRelationshipLoader): + __slots__ = 'join_depth', + + def __init__(self, parent, strategy_key): + super(SubqueryLoader, self).__init__(parent, strategy_key) + self.join_depth = self.parent_property.join_depth + + def init_class_attribute(self, mapper): + self.parent_property.\ + _get_strategy((("lazy", "select"),)).\ + init_class_attribute(mapper) + + def setup_query( + self, context, entity, + path, loadopt, adapter, + column_collection=None, + parentmapper=None, **kwargs): + + if not context.query._enable_eagerloads: + return + elif context.query._yield_per: + context.query._no_yield_per("subquery") + + path = path[self.parent_property] + + # build up a path indicating the path from the leftmost + # entity to the thing we're subquery loading. + with_poly_info = path.get( + context.attributes, + "path_with_polymorphic", None) + if with_poly_info is not None: + effective_entity = with_poly_info.entity + else: + effective_entity = self.mapper + + subq_path = context.attributes.get( + ('subquery_path', None), + orm_util.PathRegistry.root) + + subq_path = subq_path + path + + # if not via query option, check for + # a cycle + if not path.contains(context.attributes, "loader"): + if self.join_depth: + if path.length / 2 > self.join_depth: + return + elif subq_path.contains_mapper(self.mapper): + return + + leftmost_mapper, leftmost_attr, leftmost_relationship = \ + self._get_leftmost(subq_path) + + orig_query = context.attributes.get( + ("orig_query", SubqueryLoader), + context.query) + + # generate a new Query from the original, then + # produce a subquery from it. + left_alias = self._generate_from_original_query( + orig_query, leftmost_mapper, + leftmost_attr, leftmost_relationship, + entity.entity_zero + ) + + # generate another Query that will join the + # left alias to the target relationships. + # basically doing a longhand + # "from_self()". (from_self() itself not quite industrial + # strength enough for all contingencies...but very close) + q = orig_query.session.query(effective_entity) + q._attributes = { + ("orig_query", SubqueryLoader): orig_query, + ('subquery_path', None): subq_path + } + + q = q._set_enable_single_crit(False) + to_join, local_attr, parent_alias = \ + self._prep_for_joins(left_alias, subq_path) + q = q.order_by(*local_attr) + q = q.add_columns(*local_attr) + q = self._apply_joins( + q, to_join, left_alias, + parent_alias, effective_entity) + + q = self._setup_options(q, subq_path, orig_query, effective_entity) + q = self._setup_outermost_orderby(q) + + # add new query to attributes to be picked up + # by create_row_processor + path.set(context.attributes, "subquery", q) + + def _get_leftmost(self, subq_path): + subq_path = subq_path.path + subq_mapper = orm_util._class_to_mapper(subq_path[0]) + + # determine attributes of the leftmost mapper + if self.parent.isa(subq_mapper) and \ + self.parent_property is subq_path[1]: + leftmost_mapper, leftmost_prop = \ + self.parent, self.parent_property + else: + leftmost_mapper, leftmost_prop = \ + subq_mapper, \ + subq_path[1] + + leftmost_cols = leftmost_prop.local_columns + + leftmost_attr = [ + getattr( + subq_path[0].entity, + leftmost_mapper._columntoproperty[c].key) + for c in leftmost_cols + ] + + return leftmost_mapper, leftmost_attr, leftmost_prop + + def _generate_from_original_query( + self, + orig_query, leftmost_mapper, + leftmost_attr, leftmost_relationship, orig_entity + ): + # reformat the original query + # to look only for significant columns + q = orig_query._clone().correlate(None) + + # set a real "from" if not present, as this is more + # accurate than just going off of the column expression + if not q._from_obj and orig_entity.is_mapper and \ + orig_entity.mapper.isa(leftmost_mapper): + q._set_select_from([orig_entity], False) + target_cols = q._adapt_col_list(leftmost_attr) + + # select from the identity columns of the outer. This will remove + # other columns from the query that might suggest the right entity + # which is why we try to _set_select_from above. + q._set_entities(target_cols) + + distinct_target_key = leftmost_relationship.distinct_target_key + + if distinct_target_key is True: + q._distinct = True + elif distinct_target_key is None: + # if target_cols refer to a non-primary key or only + # part of a composite primary key, set the q as distinct + for t in set(c.table for c in target_cols): + if not set(target_cols).issuperset(t.primary_key): + q._distinct = True + break + + if q._order_by is False: + q._order_by = leftmost_mapper.order_by + + # don't need ORDER BY if no limit/offset + if q._limit is None and q._offset is None: + q._order_by = None + + # the original query now becomes a subquery + # which we'll join onto. + + embed_q = q.with_labels().subquery() + left_alias = orm_util.AliasedClass( + leftmost_mapper, embed_q, + use_mapper_path=True) + return left_alias + + def _prep_for_joins(self, left_alias, subq_path): + # figure out what's being joined. a.k.a. the fun part + to_join = [] + pairs = list(subq_path.pairs()) + + for i, (mapper, prop) in enumerate(pairs): + if i > 0: + # look at the previous mapper in the chain - + # if it is as or more specific than this prop's + # mapper, use that instead. + # note we have an assumption here that + # the non-first element is always going to be a mapper, + # not an AliasedClass + + prev_mapper = pairs[i - 1][1].mapper + to_append = prev_mapper if prev_mapper.isa(mapper) else mapper + else: + to_append = mapper + + to_join.append((to_append, prop.key)) + + # determine the immediate parent class we are joining from, + # which needs to be aliased. + + if len(to_join) < 2: + # in the case of a one level eager load, this is the + # leftmost "left_alias". + parent_alias = left_alias + else: + info = inspect(to_join[-1][0]) + if info.is_aliased_class: + parent_alias = info.entity + else: + # alias a plain mapper as we may be + # joining multiple times + parent_alias = orm_util.AliasedClass( + info.entity, + use_mapper_path=True) + + local_cols = self.parent_property.local_columns + + local_attr = [ + getattr(parent_alias, self.parent._columntoproperty[c].key) + for c in local_cols + ] + return to_join, local_attr, parent_alias + + def _apply_joins( + self, q, to_join, left_alias, parent_alias, + effective_entity): + + ltj = len(to_join) + if ltj == 1: + to_join = [ + getattr(left_alias, to_join[0][1]).of_type(effective_entity) + ] + elif ltj == 2: + to_join = [ + getattr(left_alias, to_join[0][1]).of_type(parent_alias), + getattr(parent_alias, to_join[-1][1]).of_type(effective_entity) + ] + elif ltj > 2: + middle = [ + ( + orm_util.AliasedClass(item[0]) + if not inspect(item[0]).is_aliased_class + else item[0].entity, + item[1] + ) for item in to_join[1:-1] + ] + inner = [] + + while middle: + item = middle.pop(0) + attr = getattr(item[0], item[1]) + if middle: + attr = attr.of_type(middle[0][0]) + else: + attr = attr.of_type(parent_alias) + + inner.append(attr) + + to_join = [ + getattr(left_alias, to_join[0][1]).of_type(inner[0].parent) + ] + inner + [ + getattr(parent_alias, to_join[-1][1]).of_type(effective_entity) + ] + + for attr in to_join: + q = q.join(attr, from_joinpoint=True) + return q + + def _setup_options(self, q, subq_path, orig_query, effective_entity): + # propagate loader options etc. to the new query. + # these will fire relative to subq_path. + q = q._with_current_path(subq_path) + q = q._conditional_options(*orig_query._with_options) + if orig_query._populate_existing: + q._populate_existing = orig_query._populate_existing + + return q + + def _setup_outermost_orderby(self, q): + if self.parent_property.order_by: + # if there's an ORDER BY, alias it the same + # way joinedloader does, but we have to pull out + # the "eagerjoin" from the query. + # this really only picks up the "secondary" table + # right now. + eagerjoin = q._from_obj[0] + eager_order_by = \ + eagerjoin._target_adapter.\ + copy_and_process( + util.to_list( + self.parent_property.order_by + ) + ) + q = q.order_by(*eager_order_by) + return q + + class _SubqCollections(object): + """Given a :class:`.Query` used to emit the "subquery load", + provide a load interface that executes the query at the + first moment a value is needed. + + """ + _data = None + + def __init__(self, subq): + self.subq = subq + + def get(self, key, default): + if self._data is None: + self._load() + return self._data.get(key, default) + + def _load(self): + self._data = dict( + (k, [vv[0] for vv in v]) + for k, v in itertools.groupby( + self.subq, + lambda x: x[1:] + ) + ) + + def loader(self, state, dict_, row): + if self._data is None: + self._load() + + def create_row_processor( + self, context, path, loadopt, + mapper, result, adapter, populators): + if not self.parent.class_manager[self.key].impl.supports_population: + raise sa_exc.InvalidRequestError( + "'%s' does not support object " + "population - eager loading cannot be applied." % + self) + + path = path[self.parent_property] + + subq = path.get(context.attributes, 'subquery') + + if subq is None: + return + + assert subq.session is context.session, ( + "Subquery session doesn't refer to that of " + "our context. Are there broken context caching " + "schemes being used?" + ) + + local_cols = self.parent_property.local_columns + + # cache the loaded collections in the context + # so that inheriting mappers don't re-load when they + # call upon create_row_processor again + collections = path.get(context.attributes, "collections") + if collections is None: + collections = self._SubqCollections(subq) + path.set(context.attributes, 'collections', collections) + + if adapter: + local_cols = [adapter.columns[c] for c in local_cols] + + if self.uselist: + self._create_collection_loader( + context, collections, local_cols, populators) + else: + self._create_scalar_loader( + context, collections, local_cols, populators) + + def _create_collection_loader( + self, context, collections, local_cols, populators): + def load_collection_from_subq(state, dict_, row): + collection = collections.get( + tuple([row[col] for col in local_cols]), + () + ) + state.get_impl(self.key).\ + set_committed_value(state, dict_, collection) + + def load_collection_from_subq_existing_row(state, dict_, row): + if self.key not in dict_: + load_collection_from_subq(state, dict_, row) + + populators["new"].append( + (self.key, load_collection_from_subq)) + populators["existing"].append( + (self.key, load_collection_from_subq_existing_row)) + + if context.invoke_all_eagers: + populators["eager"].append((self.key, collections.loader)) + + def _create_scalar_loader( + self, context, collections, local_cols, populators): + def load_scalar_from_subq(state, dict_, row): + collection = collections.get( + tuple([row[col] for col in local_cols]), + (None,) + ) + if len(collection) > 1: + util.warn( + "Multiple rows returned with " + "uselist=False for eagerly-loaded attribute '%s' " + % self) + + scalar = collection[0] + state.get_impl(self.key).\ + set_committed_value(state, dict_, scalar) + + def load_scalar_from_subq_existing_row(state, dict_, row): + if self.key not in dict_: + load_scalar_from_subq(state, dict_, row) + + populators["new"].append( + (self.key, load_scalar_from_subq)) + populators["existing"].append( + (self.key, load_scalar_from_subq_existing_row)) + if context.invoke_all_eagers: + populators["eager"].append((self.key, collections.loader)) + + +@log.class_logger +@properties.RelationshipProperty.strategy_for(lazy="joined") +@properties.RelationshipProperty.strategy_for(lazy=False) +class JoinedLoader(AbstractRelationshipLoader): + """Provide loading behavior for a :class:`.RelationshipProperty` + using joined eager loading. + + """ + + __slots__ = 'join_depth', '_aliased_class_pool' + + def __init__(self, parent, strategy_key): + super(JoinedLoader, self).__init__(parent, strategy_key) + self.join_depth = self.parent_property.join_depth + self._aliased_class_pool = [] + + def init_class_attribute(self, mapper): + self.parent_property.\ + _get_strategy((("lazy", "select"),)).init_class_attribute(mapper) + + def setup_query( + self, context, entity, path, loadopt, adapter, + column_collection=None, parentmapper=None, + chained_from_outerjoin=False, + **kwargs): + """Add a left outer join to the statement that's being constructed.""" + + if not context.query._enable_eagerloads: + return + elif context.query._yield_per and self.uselist: + context.query._no_yield_per("joined collection") + + path = path[self.parent_property] + + with_polymorphic = None + + user_defined_adapter = self._init_user_defined_eager_proc( + loadopt, context) if loadopt else False + + if user_defined_adapter is not False: + clauses, adapter, add_to_collection = \ + self._setup_query_on_user_defined_adapter( + context, entity, path, adapter, + user_defined_adapter + ) + else: + # if not via query option, check for + # a cycle + if not path.contains(context.attributes, "loader"): + if self.join_depth: + if path.length / 2 > self.join_depth: + return + elif path.contains_mapper(self.mapper): + return + + clauses, adapter, add_to_collection, chained_from_outerjoin = \ + self._generate_row_adapter( + context, entity, path, loadopt, adapter, + column_collection, parentmapper, chained_from_outerjoin + ) + + with_poly_info = path.get( + context.attributes, + "path_with_polymorphic", + None + ) + if with_poly_info is not None: + with_polymorphic = with_poly_info.with_polymorphic_mappers + else: + with_polymorphic = None + + path = path[self.mapper] + + loading._setup_entity_query( + context, self.mapper, entity, + path, clauses, add_to_collection, + with_polymorphic=with_polymorphic, + parentmapper=self.mapper, + chained_from_outerjoin=chained_from_outerjoin) + + if with_poly_info is not None and \ + None in set(context.secondary_columns): + raise sa_exc.InvalidRequestError( + "Detected unaliased columns when generating joined " + "load. Make sure to use aliased=True or flat=True " + "when using joined loading with with_polymorphic()." + ) + + def _init_user_defined_eager_proc(self, loadopt, context): + + # check if the opt applies at all + if "eager_from_alias" not in loadopt.local_opts: + # nope + return False + + path = loadopt.path.parent + + # the option applies. check if the "user_defined_eager_row_processor" + # has been built up. + adapter = path.get( + context.attributes, + "user_defined_eager_row_processor", False) + if adapter is not False: + # just return it + return adapter + + # otherwise figure it out. + alias = loadopt.local_opts["eager_from_alias"] + + root_mapper, prop = path[-2:] + + #from .mapper import Mapper + #from .interfaces import MapperProperty + #assert isinstance(root_mapper, Mapper) + #assert isinstance(prop, MapperProperty) + + if alias is not None: + if isinstance(alias, str): + alias = prop.target.alias(alias) + adapter = sql_util.ColumnAdapter( + alias, + equivalents=prop.mapper._equivalent_columns) + else: + if path.contains(context.attributes, "path_with_polymorphic"): + with_poly_info = path.get( + context.attributes, + "path_with_polymorphic") + adapter = orm_util.ORMAdapter( + with_poly_info.entity, + equivalents=prop.mapper._equivalent_columns) + else: + adapter = context.query._polymorphic_adapters.get( + prop.mapper, None) + path.set( + context.attributes, + "user_defined_eager_row_processor", + adapter) + + return adapter + + def _setup_query_on_user_defined_adapter( + self, context, entity, + path, adapter, user_defined_adapter): + + # apply some more wrapping to the "user defined adapter" + # if we are setting up the query for SQL render. + adapter = entity._get_entity_clauses(context.query, context) + + if adapter and user_defined_adapter: + user_defined_adapter = user_defined_adapter.wrap(adapter) + path.set( + context.attributes, "user_defined_eager_row_processor", + user_defined_adapter) + elif adapter: + user_defined_adapter = adapter + path.set( + context.attributes, "user_defined_eager_row_processor", + user_defined_adapter) + + add_to_collection = context.primary_columns + return user_defined_adapter, adapter, add_to_collection + + def _gen_pooled_aliased_class(self, context): + # keep a local pool of AliasedClass objects that get re-used. + # we need one unique AliasedClass per query per appearance of our + # entity in the query. + + key = ('joinedloader_ac', self) + if key not in context.attributes: + context.attributes[key] = idx = 0 + else: + context.attributes[key] = idx = context.attributes[key] + 1 + + if idx >= len(self._aliased_class_pool): + to_adapt = orm_util.AliasedClass( + self.mapper, + flat=True, + use_mapper_path=True) + # load up the .columns collection on the Alias() before + # the object becomes shared among threads. this prevents + # races for column identities. + inspect(to_adapt).selectable.c + + self._aliased_class_pool.append(to_adapt) + + return self._aliased_class_pool[idx] + + def _generate_row_adapter( + self, + context, entity, path, loadopt, adapter, + column_collection, parentmapper, chained_from_outerjoin): + with_poly_info = path.get( + context.attributes, + "path_with_polymorphic", + None + ) + if with_poly_info: + to_adapt = with_poly_info.entity + else: + to_adapt = self._gen_pooled_aliased_class(context) + + clauses = inspect(to_adapt)._memo( + ("joinedloader_ormadapter", self), + orm_util.ORMAdapter, + to_adapt, + equivalents=self.mapper._equivalent_columns, + adapt_required=True, allow_label_resolve=False, + anonymize_labels=True + ) + + assert clauses.aliased_class is not None + + if self.parent_property.uselist: + context.multi_row_eager_loaders = True + + innerjoin = ( + loadopt.local_opts.get( + 'innerjoin', self.parent_property.innerjoin) + if loadopt is not None + else self.parent_property.innerjoin + ) + + if not innerjoin: + # if this is an outer join, all non-nested eager joins from + # this path must also be outer joins + chained_from_outerjoin = True + + context.create_eager_joins.append( + ( + self._create_eager_join, context, + entity, path, adapter, + parentmapper, clauses, innerjoin, chained_from_outerjoin + ) + ) + + add_to_collection = context.secondary_columns + path.set(context.attributes, "eager_row_processor", clauses) + + return clauses, adapter, add_to_collection, chained_from_outerjoin + + def _create_eager_join( + self, context, entity, + path, adapter, parentmapper, + clauses, innerjoin, chained_from_outerjoin): + + if parentmapper is None: + localparent = entity.mapper + else: + localparent = parentmapper + + # whether or not the Query will wrap the selectable in a subquery, + # and then attach eager load joins to that (i.e., in the case of + # LIMIT/OFFSET etc.) + should_nest_selectable = context.multi_row_eager_loaders and \ + context.query._should_nest_selectable + + entity_key = None + + if entity not in context.eager_joins and \ + not should_nest_selectable and \ + context.from_clause: + index, clause = sql_util.find_join_source( + context.from_clause, entity.selectable) + if clause is not None: + # join to an existing FROM clause on the query. + # key it to its list index in the eager_joins dict. + # Query._compile_context will adapt as needed and + # append to the FROM clause of the select(). + entity_key, default_towrap = index, clause + + if entity_key is None: + entity_key, default_towrap = entity, entity.selectable + + towrap = context.eager_joins.setdefault(entity_key, default_towrap) + + if adapter: + if getattr(adapter, 'aliased_class', None): + # joining from an adapted entity. The adapted entity + # might be a "with_polymorphic", so resolve that to our + # specific mapper's entity before looking for our attribute + # name on it. + efm = inspect(adapter.aliased_class).\ + _entity_for_mapper( + localparent + if localparent.isa(self.parent) else self.parent) + + # look for our attribute on the adapted entity, else fall back + # to our straight property + onclause = getattr( + efm.entity, self.key, + self.parent_property) + else: + onclause = getattr( + orm_util.AliasedClass( + self.parent, + adapter.selectable, + use_mapper_path=True + ), + self.key, self.parent_property + ) + + else: + onclause = self.parent_property + + assert clauses.aliased_class is not None + + attach_on_outside = ( + not chained_from_outerjoin or + not innerjoin or innerjoin == 'unnested') + + if attach_on_outside: + # this is the "classic" eager join case. + eagerjoin = orm_util._ORMJoin( + towrap, + clauses.aliased_class, + onclause, + isouter=not innerjoin or ( + chained_from_outerjoin and isinstance(towrap, sql.Join) + ), _left_memo=self.parent, _right_memo=self.mapper + ) + else: + # all other cases are innerjoin=='nested' approach + eagerjoin = self._splice_nested_inner_join( + path, towrap, clauses, onclause) + + context.eager_joins[entity_key] = eagerjoin + + # send a hint to the Query as to where it may "splice" this join + eagerjoin.stop_on = entity.selectable + + if not parentmapper: + # for parentclause that is the non-eager end of the join, + # ensure all the parent cols in the primaryjoin are actually + # in the + # columns clause (i.e. are not deferred), so that aliasing applied + # by the Query propagates those columns outward. + # This has the effect + # of "undefering" those columns. + for col in sql_util._find_columns( + self.parent_property.primaryjoin): + if localparent.mapped_table.c.contains_column(col): + if adapter: + col = adapter.columns[col] + context.primary_columns.append(col) + + if self.parent_property.order_by: + context.eager_order_by += eagerjoin._target_adapter.\ + copy_and_process( + util.to_list( + self.parent_property.order_by + ) + ) + + def _splice_nested_inner_join( + self, path, join_obj, clauses, onclause, splicing=False): + + if splicing is False: + # first call is always handed a join object + # from the outside + assert isinstance(join_obj, orm_util._ORMJoin) + elif isinstance(join_obj, sql.selectable.FromGrouping): + return self._splice_nested_inner_join( + path, join_obj.element, clauses, onclause, splicing + ) + elif not isinstance(join_obj, orm_util._ORMJoin): + if path[-2] is splicing: + return orm_util._ORMJoin( + join_obj, clauses.aliased_class, + onclause, isouter=False, + _left_memo=splicing, + _right_memo=path[-1].mapper + ) + else: + # only here if splicing == True + return None + + target_join = self._splice_nested_inner_join( + path, join_obj.right, clauses, + onclause, join_obj._right_memo) + if target_join is None: + right_splice = False + target_join = self._splice_nested_inner_join( + path, join_obj.left, clauses, + onclause, join_obj._left_memo) + if target_join is None: + # should only return None when recursively called, + # e.g. splicing==True + assert splicing is not False, \ + "assertion failed attempting to produce joined eager loads" + return None + else: + right_splice = True + + if right_splice: + # for a right splice, attempt to flatten out + # a JOIN b JOIN c JOIN .. to avoid needless + # parenthesis nesting + if not join_obj.isouter and not target_join.isouter: + eagerjoin = join_obj._splice_into_center(target_join) + else: + eagerjoin = orm_util._ORMJoin( + join_obj.left, target_join, + join_obj.onclause, isouter=join_obj.isouter, + _left_memo=join_obj._left_memo) + else: + eagerjoin = orm_util._ORMJoin( + target_join, join_obj.right, + join_obj.onclause, isouter=join_obj.isouter, + _right_memo=join_obj._right_memo) + + eagerjoin._target_adapter = target_join._target_adapter + return eagerjoin + + def _create_eager_adapter(self, context, result, adapter, path, loadopt): + user_defined_adapter = self._init_user_defined_eager_proc( + loadopt, context) if loadopt else False + + if user_defined_adapter is not False: + decorator = user_defined_adapter + # user defined eagerloads are part of the "primary" + # portion of the load. + # the adapters applied to the Query should be honored. + if context.adapter and decorator: + decorator = decorator.wrap(context.adapter) + elif context.adapter: + decorator = context.adapter + else: + decorator = path.get(context.attributes, "eager_row_processor") + if decorator is None: + return False + + if self.mapper._result_has_identity_key(result, decorator): + return decorator + else: + # no identity key - don't return a row + # processor, will cause a degrade to lazy + return False + + def create_row_processor( + self, context, path, loadopt, mapper, + result, adapter, populators): + if not self.parent.class_manager[self.key].impl.supports_population: + raise sa_exc.InvalidRequestError( + "'%s' does not support object " + "population - eager loading cannot be applied." % + self + ) + + our_path = path[self.parent_property] + + eager_adapter = self._create_eager_adapter( + context, + result, + adapter, our_path, loadopt) + + if eager_adapter is not False: + key = self.key + + _instance = loading._instance_processor( + self.mapper, + context, + result, + our_path[self.mapper], + eager_adapter) + + if not self.uselist: + self._create_scalar_loader(context, key, _instance, populators) + else: + self._create_collection_loader( + context, key, _instance, populators) + else: + self.parent_property._get_strategy((("lazy", "select"),)).\ + create_row_processor( + context, path, loadopt, + mapper, result, adapter, populators) + + def _create_collection_loader(self, context, key, _instance, populators): + def load_collection_from_joined_new_row(state, dict_, row): + collection = attributes.init_state_collection( + state, dict_, key) + result_list = util.UniqueAppender(collection, + 'append_without_event') + context.attributes[(state, key)] = result_list + inst = _instance(row) + if inst is not None: + result_list.append(inst) + + def load_collection_from_joined_existing_row(state, dict_, row): + if (state, key) in context.attributes: + result_list = context.attributes[(state, key)] + else: + # appender_key can be absent from context.attributes + # with isnew=False when self-referential eager loading + # is used; the same instance may be present in two + # distinct sets of result columns + collection = attributes.init_state_collection( + state, dict_, key) + result_list = util.UniqueAppender( + collection, + 'append_without_event') + context.attributes[(state, key)] = result_list + inst = _instance(row) + if inst is not None: + result_list.append(inst) + + def load_collection_from_joined_exec(state, dict_, row): + _instance(row) + + populators["new"].append((self.key, load_collection_from_joined_new_row)) + populators["existing"].append( + (self.key, load_collection_from_joined_existing_row)) + if context.invoke_all_eagers: + populators["eager"].append( + (self.key, load_collection_from_joined_exec)) + + def _create_scalar_loader(self, context, key, _instance, populators): + def load_scalar_from_joined_new_row(state, dict_, row): + # set a scalar object instance directly on the parent + # object, bypassing InstrumentedAttribute event handlers. + dict_[key] = _instance(row) + + def load_scalar_from_joined_existing_row(state, dict_, row): + # call _instance on the row, even though the object has + # been created, so that we further descend into properties + existing = _instance(row) + + # conflicting value already loaded, this shouldn't happen + if key in dict_: + if existing is not dict_[key]: + util.warn( + "Multiple rows returned with " + "uselist=False for eagerly-loaded attribute '%s' " + % self) + else: + # this case is when one row has multiple loads of the + # same entity (e.g. via aliasing), one has an attribute + # that the other doesn't. + dict_[key] = existing + + def load_scalar_from_joined_exec(state, dict_, row): + _instance(row) + + populators["new"].append((self.key, load_scalar_from_joined_new_row)) + populators["existing"].append( + (self.key, load_scalar_from_joined_existing_row)) + if context.invoke_all_eagers: + populators["eager"].append((self.key, load_scalar_from_joined_exec)) + + +def single_parent_validator(desc, prop): + def _do_check(state, value, oldvalue, initiator): + if value is not None and initiator.key == prop.key: + hasparent = initiator.hasparent(attributes.instance_state(value)) + if hasparent and oldvalue is not value: + raise sa_exc.InvalidRequestError( + "Instance %s is already associated with an instance " + "of %s via its %s attribute, and is only allowed a " + "single parent." % + (orm_util.instance_str(value), state.class_, prop) + ) + return value + + def append(state, value, initiator): + return _do_check(state, value, None, initiator) + + def set_(state, value, oldvalue, initiator): + return _do_check(state, value, oldvalue, initiator) + + event.listen( + desc, 'append', append, raw=True, retval=True, + active_history=True) + event.listen( + desc, 'set', set_, raw=True, retval=True, + active_history=True) diff --git a/app/lib/sqlalchemy/orm/strategy_options.py b/app/lib/sqlalchemy/orm/strategy_options.py new file mode 100644 index 0000000..bae2b73 --- /dev/null +++ b/app/lib/sqlalchemy/orm/strategy_options.py @@ -0,0 +1,1106 @@ +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" + +""" + +from .interfaces import MapperOption, PropComparator +from .. import util +from ..sql.base import _generative, Generative +from .. import exc as sa_exc, inspect +from .base import _is_aliased_class, _class_to_mapper +from . import util as orm_util +from .path_registry import PathRegistry, TokenRegistry, \ + _WILDCARD_TOKEN, _DEFAULT_TOKEN + + +class Load(Generative, MapperOption): + """Represents loader options which modify the state of a + :class:`.Query` in order to affect how various mapped attributes are + loaded. + + .. versionadded:: 0.9.0 The :meth:`.Load` system is a new foundation for + the existing system of loader options, including options such as + :func:`.orm.joinedload`, :func:`.orm.defer`, and others. In + particular, it introduces a new method-chained system that replaces the + need for dot-separated paths as well as "_all()" options such as + :func:`.orm.joinedload_all`. + + A :class:`.Load` object can be used directly or indirectly. To use one + directly, instantiate given the parent class. This style of usage is + useful when dealing with a :class:`.Query` that has multiple entities, + or when producing a loader option that can be applied generically to + any style of query:: + + myopt = Load(MyClass).joinedload("widgets") + + The above ``myopt`` can now be used with :meth:`.Query.options`:: + + session.query(MyClass).options(myopt) + + The :class:`.Load` construct is invoked indirectly whenever one makes use + of the various loader options that are present in ``sqlalchemy.orm``, + including options such as :func:`.orm.joinedload`, :func:`.orm.defer`, + :func:`.orm.subqueryload`, and all the rest. These constructs produce an + "anonymous" form of the :class:`.Load` object which tracks attributes and + options, but is not linked to a parent class until it is associated with a + parent :class:`.Query`:: + + # produce "unbound" Load object + myopt = joinedload("widgets") + + # when applied using options(), the option is "bound" to the + # class observed in the given query, e.g. MyClass + session.query(MyClass).options(myopt) + + Whether the direct or indirect style is used, the :class:`.Load` object + returned now represents a specific "path" along the entities of a + :class:`.Query`. This path can be traversed using a standard + method-chaining approach. Supposing a class hierarchy such as ``User``, + ``User.addresses -> Address``, ``User.orders -> Order`` and + ``Order.items -> Item``, we can specify a variety of loader options along + each element in the "path":: + + session.query(User).options( + joinedload("addresses"), + subqueryload("orders").joinedload("items") + ) + + Where above, the ``addresses`` collection will be joined-loaded, the + ``orders`` collection will be subquery-loaded, and within that subquery + load the ``items`` collection will be joined-loaded. + + + """ + + def __init__(self, entity): + insp = inspect(entity) + self.path = insp._path_registry + # note that this .context is shared among all descendant + # Load objects + self.context = {} + self.local_opts = {} + + @classmethod + def for_existing_path(cls, path): + load = cls.__new__(cls) + load.path = path + load.context = {} + load.local_opts = {} + return load + + def _generate(self): + cloned = super(Load, self)._generate() + cloned.local_opts = {} + return cloned + + is_opts_only = False + strategy = None + propagate_to_loaders = False + + def process_query(self, query): + self._process(query, True) + + def process_query_conditionally(self, query): + self._process(query, False) + + def _process(self, query, raiseerr): + current_path = query._current_path + if current_path: + for (token, start_path), loader in self.context.items(): + chopped_start_path = self._chop_path(start_path, current_path) + if chopped_start_path is not None: + query._attributes[(token, chopped_start_path)] = loader + else: + query._attributes.update(self.context) + + def _generate_path(self, path, attr, wildcard_key, raiseerr=True): + if raiseerr and not path.has_entity: + if isinstance(path, TokenRegistry): + raise sa_exc.ArgumentError( + "Wildcard token cannot be followed by another entity") + else: + raise sa_exc.ArgumentError( + "Attribute '%s' of entity '%s' does not " + "refer to a mapped entity" % + (path.prop.key, path.parent.entity) + ) + + if isinstance(attr, util.string_types): + default_token = attr.endswith(_DEFAULT_TOKEN) + if attr.endswith(_WILDCARD_TOKEN) or default_token: + if default_token: + self.propagate_to_loaders = False + if wildcard_key: + attr = "%s:%s" % (wildcard_key, attr) + return path.token(attr) + + try: + # use getattr on the class to work around + # synonyms, hybrids, etc. + attr = getattr(path.entity.class_, attr) + except AttributeError: + if raiseerr: + raise sa_exc.ArgumentError( + "Can't find property named '%s' on the " + "mapped entity %s in this Query. " % ( + attr, path.entity) + ) + else: + return None + else: + attr = attr.property + + path = path[attr] + else: + prop = attr.property + + if not prop.parent.common_parent(path.mapper): + if raiseerr: + raise sa_exc.ArgumentError( + "Attribute '%s' does not " + "link from element '%s'" % (attr, path.entity)) + else: + return None + + if getattr(attr, '_of_type', None): + ac = attr._of_type + ext_info = inspect(ac) + + path_element = ext_info.mapper + existing = path.entity_path[prop].get( + self.context, "path_with_polymorphic") + if not ext_info.is_aliased_class: + ac = orm_util.with_polymorphic( + ext_info.mapper.base_mapper, + ext_info.mapper, aliased=True, + _use_mapper_path=True, + _existing_alias=existing) + path.entity_path[prop].set( + self.context, "path_with_polymorphic", inspect(ac)) + path = path[prop][path_element] + else: + path = path[prop] + + if path.has_entity: + path = path.entity_path + return path + + def __str__(self): + return "Load(strategy=%r)" % (self.strategy, ) + + def _coerce_strat(self, strategy): + if strategy is not None: + strategy = tuple(sorted(strategy.items())) + return strategy + + @_generative + def set_relationship_strategy( + self, attr, strategy, propagate_to_loaders=True): + strategy = self._coerce_strat(strategy) + + self.propagate_to_loaders = propagate_to_loaders + # if the path is a wildcard, this will set propagate_to_loaders=False + self.path = self._generate_path(self.path, attr, "relationship") + self.strategy = strategy + if strategy is not None: + self._set_path_strategy() + + @_generative + def set_column_strategy(self, attrs, strategy, opts=None, opts_only=False): + strategy = self._coerce_strat(strategy) + + for attr in attrs: + path = self._generate_path(self.path, attr, "column") + cloned = self._generate() + cloned.strategy = strategy + cloned.path = path + cloned.propagate_to_loaders = True + if opts: + cloned.local_opts.update(opts) + if opts_only: + cloned.is_opts_only = True + cloned._set_path_strategy() + + def _set_for_path(self, context, path, replace=True, merge_opts=False): + if merge_opts or not replace: + existing = path.get(self.context, "loader") + + if existing: + if merge_opts: + existing.local_opts.update(self.local_opts) + else: + path.set(context, "loader", self) + else: + existing = path.get(self.context, "loader") + path.set(context, "loader", self) + if existing and existing.is_opts_only: + self.local_opts.update(existing.local_opts) + + def _set_path_strategy(self): + if self.path.has_entity: + effective_path = self.path.parent + else: + effective_path = self.path + + self._set_for_path( + self.context, effective_path, replace=True, + merge_opts=self.is_opts_only) + + def __getstate__(self): + d = self.__dict__.copy() + d["path"] = self.path.serialize() + return d + + def __setstate__(self, state): + self.__dict__.update(state) + self.path = PathRegistry.deserialize(self.path) + + def _chop_path(self, to_chop, path): + i = -1 + + for i, (c_token, p_token) in enumerate(zip(to_chop, path.path)): + if isinstance(c_token, util.string_types): + # TODO: this is approximated from the _UnboundLoad + # version and probably has issues, not fully covered. + + if i == 0 and c_token.endswith(':' + _DEFAULT_TOKEN): + return to_chop + elif c_token != 'relationship:%s' % (_WILDCARD_TOKEN,) and \ + c_token != p_token.key: + return None + + if c_token is p_token: + continue + else: + return None + return to_chop[i + 1:] + + +class _UnboundLoad(Load): + """Represent a loader option that isn't tied to a root entity. + + The loader option will produce an entity-linked :class:`.Load` + object when it is passed :meth:`.Query.options`. + + This provides compatibility with the traditional system + of freestanding options, e.g. ``joinedload('x.y.z')``. + + """ + + def __init__(self): + self.path = () + self._to_bind = set() + self.local_opts = {} + + _is_chain_link = False + + def _set_path_strategy(self): + self._to_bind.add(self) + + def _generate_path(self, path, attr, wildcard_key): + if wildcard_key and isinstance(attr, util.string_types) and \ + attr in (_WILDCARD_TOKEN, _DEFAULT_TOKEN): + if attr == _DEFAULT_TOKEN: + self.propagate_to_loaders = False + attr = "%s:%s" % (wildcard_key, attr) + + return path + (attr, ) + + def __getstate__(self): + d = self.__dict__.copy() + d['path'] = ret = [] + for token in util.to_list(self.path): + if isinstance(token, PropComparator): + ret.append((token._parentmapper.class_, token.key)) + else: + ret.append(token) + return d + + def __setstate__(self, state): + ret = [] + for key in state['path']: + if isinstance(key, tuple): + cls, propkey = key + ret.append(getattr(cls, propkey)) + else: + ret.append(key) + state['path'] = tuple(ret) + self.__dict__ = state + + def _process(self, query, raiseerr): + for val in self._to_bind: + val._bind_loader(query, query._attributes, raiseerr) + + @classmethod + def _from_keys(cls, meth, keys, chained, kw): + opt = _UnboundLoad() + + def _split_key(key): + if isinstance(key, util.string_types): + # coerce fooload('*') into "default loader strategy" + if key == _WILDCARD_TOKEN: + return (_DEFAULT_TOKEN, ) + # coerce fooload(".*") into "wildcard on default entity" + elif key.startswith("." + _WILDCARD_TOKEN): + key = key[1:] + return key.split(".") + else: + return (key,) + all_tokens = [token for key in keys for token in _split_key(key)] + + for token in all_tokens[0:-1]: + if chained: + opt = meth(opt, token, **kw) + else: + opt = opt.defaultload(token) + opt._is_chain_link = True + + opt = meth(opt, all_tokens[-1], **kw) + opt._is_chain_link = False + + return opt + + def _chop_path(self, to_chop, path): + i = -1 + for i, (c_token, (p_mapper, p_prop)) in enumerate( + zip(to_chop, path.pairs())): + if isinstance(c_token, util.string_types): + if i == 0 and c_token.endswith(':' + _DEFAULT_TOKEN): + return to_chop + elif c_token != 'relationship:%s' % ( + _WILDCARD_TOKEN,) and c_token != p_prop.key: + return None + elif isinstance(c_token, PropComparator): + if c_token.property is not p_prop: + return None + else: + i += 1 + + return to_chop[i:] + + def _bind_loader(self, query, context, raiseerr): + start_path = self.path + # _current_path implies we're in a + # secondary load with an existing path + + current_path = query._current_path + if current_path: + start_path = self._chop_path(start_path, current_path) + + if not start_path: + return None + + token = start_path[0] + + if isinstance(token, util.string_types): + entity = self._find_entity_basestring(query, token, raiseerr) + elif isinstance(token, PropComparator): + prop = token.property + entity = self._find_entity_prop_comparator( + query, + prop.key, + token._parententity, + raiseerr) + + else: + raise sa_exc.ArgumentError( + "mapper option expects " + "string key or list of attributes") + + if not entity: + return + + path_element = entity.entity_zero + + # transfer our entity-less state into a Load() object + # with a real entity path. + loader = Load(path_element) + loader.context = context + loader.strategy = self.strategy + loader.is_opts_only = self.is_opts_only + + path = loader.path + for token in start_path: + loader.path = path = loader._generate_path( + loader.path, token, None, raiseerr) + if path is None: + return + + loader.local_opts.update(self.local_opts) + + if loader.path.has_entity: + effective_path = loader.path.parent + else: + effective_path = loader.path + + # prioritize "first class" options over those + # that were "links in the chain", e.g. "x" and "y" in + # someload("x.y.z") versus someload("x") / someload("x.y") + + if effective_path.is_token: + for path in effective_path.generate_for_superclasses(): + loader._set_for_path( + context, path, + replace=not self._is_chain_link, + merge_opts=self.is_opts_only) + else: + loader._set_for_path( + context, effective_path, + replace=not self._is_chain_link, + merge_opts=self.is_opts_only) + + def _find_entity_prop_comparator(self, query, token, mapper, raiseerr): + if _is_aliased_class(mapper): + searchfor = mapper + else: + searchfor = _class_to_mapper(mapper) + for ent in query._mapper_entities: + if ent.corresponds_to(searchfor): + return ent + else: + if raiseerr: + if not list(query._mapper_entities): + raise sa_exc.ArgumentError( + "Query has only expression-based entities - " + "can't find property named '%s'." + % (token, ) + ) + else: + raise sa_exc.ArgumentError( + "Can't find property '%s' on any entity " + "specified in this Query. Note the full path " + "from root (%s) to target entity must be specified." + % (token, ",".join(str(x) for + x in query._mapper_entities)) + ) + else: + return None + + def _find_entity_basestring(self, query, token, raiseerr): + if token.endswith(':' + _WILDCARD_TOKEN): + if len(list(query._mapper_entities)) != 1: + if raiseerr: + raise sa_exc.ArgumentError( + "Wildcard loader can only be used with exactly " + "one entity. Use Load(ent) to specify " + "specific entities.") + elif token.endswith(_DEFAULT_TOKEN): + raiseerr = False + + for ent in query._mapper_entities: + # return only the first _MapperEntity when searching + # based on string prop name. Ideally object + # attributes are used to specify more exactly. + return ent + else: + if raiseerr: + raise sa_exc.ArgumentError( + "Query has only expression-based entities - " + "can't find property named '%s'." + % (token, ) + ) + else: + return None + + +class loader_option(object): + def __init__(self): + pass + + def __call__(self, fn): + self.name = name = fn.__name__ + self.fn = fn + if hasattr(Load, name): + raise TypeError("Load class already has a %s method." % (name)) + setattr(Load, name, fn) + + return self + + def _add_unbound_fn(self, fn): + self._unbound_fn = fn + fn_doc = self.fn.__doc__ + self.fn.__doc__ = """Produce a new :class:`.Load` object with the +:func:`.orm.%(name)s` option applied. + +See :func:`.orm.%(name)s` for usage examples. + +""" % {"name": self.name} + + fn.__doc__ = fn_doc + return self + + def _add_unbound_all_fn(self, fn): + self._unbound_all_fn = fn + fn.__doc__ = """Produce a standalone "all" option for :func:`.orm.%(name)s`. + +.. deprecated:: 0.9.0 + + The "_all()" style is replaced by method chaining, e.g.:: + + session.query(MyClass).options( + %(name)s("someattribute").%(name)s("anotherattribute") + ) + +""" % {"name": self.name} + return self + + +@loader_option() +def contains_eager(loadopt, attr, alias=None): + r"""Indicate that the given attribute should be eagerly loaded from + columns stated manually in the query. + + This function is part of the :class:`.Load` interface and supports + both method-chained and standalone operation. + + The option is used in conjunction with an explicit join that loads + the desired rows, i.e.:: + + sess.query(Order).\ + join(Order.user).\ + options(contains_eager(Order.user)) + + The above query would join from the ``Order`` entity to its related + ``User`` entity, and the returned ``Order`` objects would have the + ``Order.user`` attribute pre-populated. + + :func:`contains_eager` also accepts an `alias` argument, which is the + string name of an alias, an :func:`~sqlalchemy.sql.expression.alias` + construct, or an :func:`~sqlalchemy.orm.aliased` construct. Use this when + the eagerly-loaded rows are to come from an aliased table:: + + user_alias = aliased(User) + sess.query(Order).\ + join((user_alias, Order.user)).\ + options(contains_eager(Order.user, alias=user_alias)) + + .. seealso:: + + :ref:`contains_eager` + + """ + if alias is not None: + if not isinstance(alias, str): + info = inspect(alias) + alias = info.selectable + + cloned = loadopt.set_relationship_strategy( + attr, + {"lazy": "joined"}, + propagate_to_loaders=False + ) + cloned.local_opts['eager_from_alias'] = alias + return cloned + + +@contains_eager._add_unbound_fn +def contains_eager(*keys, **kw): + return _UnboundLoad()._from_keys( + _UnboundLoad.contains_eager, keys, True, kw) + + +@loader_option() +def load_only(loadopt, *attrs): + """Indicate that for a particular entity, only the given list + of column-based attribute names should be loaded; all others will be + deferred. + + This function is part of the :class:`.Load` interface and supports + both method-chained and standalone operation. + + Example - given a class ``User``, load only the ``name`` and ``fullname`` + attributes:: + + session.query(User).options(load_only("name", "fullname")) + + Example - given a relationship ``User.addresses -> Address``, specify + subquery loading for the ``User.addresses`` collection, but on each + ``Address`` object load only the ``email_address`` attribute:: + + session.query(User).options( + subqueryload("addresses").load_only("email_address") + ) + + For a :class:`.Query` that has multiple entities, the lead entity can be + specifically referred to using the :class:`.Load` constructor:: + + session.query(User, Address).join(User.addresses).options( + Load(User).load_only("name", "fullname"), + Load(Address).load_only("email_addres") + ) + + + .. versionadded:: 0.9.0 + + """ + cloned = loadopt.set_column_strategy( + attrs, + {"deferred": False, "instrument": True} + ) + cloned.set_column_strategy("*", + {"deferred": True, "instrument": True}, + {"undefer_pks": True}) + return cloned + + +@load_only._add_unbound_fn +def load_only(*attrs): + return _UnboundLoad().load_only(*attrs) + + +@loader_option() +def joinedload(loadopt, attr, innerjoin=None): + """Indicate that the given attribute should be loaded using joined + eager loading. + + This function is part of the :class:`.Load` interface and supports + both method-chained and standalone operation. + + examples:: + + # joined-load the "orders" collection on "User" + query(User).options(joinedload(User.orders)) + + # joined-load Order.items and then Item.keywords + query(Order).options(joinedload(Order.items).joinedload(Item.keywords)) + + # lazily load Order.items, but when Items are loaded, + # joined-load the keywords collection + query(Order).options(lazyload(Order.items).joinedload(Item.keywords)) + + :param innerjoin: if ``True``, indicates that the joined eager load should + use an inner join instead of the default of left outer join:: + + query(Order).options(joinedload(Order.user, innerjoin=True)) + + In order to chain multiple eager joins together where some may be + OUTER and others INNER, right-nested joins are used to link them:: + + query(A).options( + joinedload(A.bs, innerjoin=False). + joinedload(B.cs, innerjoin=True) + ) + + The above query, linking A.bs via "outer" join and B.cs via "inner" join + would render the joins as "a LEFT OUTER JOIN (b JOIN c)". When using + SQLite, this form of JOIN is translated to use full subqueries as this + syntax is otherwise not directly supported. + + The ``innerjoin`` flag can also be stated with the term ``"unnested"``. + This will prevent joins from being right-nested, and will instead + link an "innerjoin" eagerload to an "outerjoin" eagerload by bypassing + the "inner" join. Using this form as follows:: + + query(A).options( + joinedload(A.bs, innerjoin=False). + joinedload(B.cs, innerjoin="unnested") + ) + + Joins will be rendered as "a LEFT OUTER JOIN b LEFT OUTER JOIN c", so that + all of "a" is matched rather than being incorrectly limited by a "b" that + does not contain a "c". + + .. note:: The "unnested" flag does **not** affect the JOIN rendered + from a many-to-many association table, e.g. a table configured + as :paramref:`.relationship.secondary`, to the target table; for + correctness of results, these joins are always INNER and are + therefore right-nested if linked to an OUTER join. + + .. versionadded:: 0.9.4 Added support for "nesting" of eager "inner" + joins. See :ref:`feature_2976`. + + .. versionchanged:: 1.0.0 ``innerjoin=True`` now implies + ``innerjoin="nested"``, whereas in 0.9 it implied + ``innerjoin="unnested"``. In order to achieve the pre-1.0 "unnested" + inner join behavior, use the value ``innerjoin="unnested"``. + See :ref:`migration_3008`. + + .. note:: + + The joins produced by :func:`.orm.joinedload` are **anonymously + aliased**. The criteria by which the join proceeds cannot be + modified, nor can the :class:`.Query` refer to these joins in any way, + including ordering. + + To produce a specific SQL JOIN which is explicitly available, use + :meth:`.Query.join`. To combine explicit JOINs with eager loading + of collections, use :func:`.orm.contains_eager`; see + :ref:`contains_eager`. + + .. seealso:: + + :ref:`loading_toplevel` + + :ref:`contains_eager` + + :func:`.orm.subqueryload` + + :func:`.orm.lazyload` + + :paramref:`.relationship.lazy` + + :paramref:`.relationship.innerjoin` - :func:`.relationship`-level + version of the :paramref:`.joinedload.innerjoin` option. + + """ + loader = loadopt.set_relationship_strategy(attr, {"lazy": "joined"}) + if innerjoin is not None: + loader.local_opts['innerjoin'] = innerjoin + return loader + + +@joinedload._add_unbound_fn +def joinedload(*keys, **kw): + return _UnboundLoad._from_keys( + _UnboundLoad.joinedload, keys, False, kw) + + +@joinedload._add_unbound_all_fn +def joinedload_all(*keys, **kw): + return _UnboundLoad._from_keys( + _UnboundLoad.joinedload, keys, True, kw) + + +@loader_option() +def subqueryload(loadopt, attr): + """Indicate that the given attribute should be loaded using + subquery eager loading. + + This function is part of the :class:`.Load` interface and supports + both method-chained and standalone operation. + + examples:: + + # subquery-load the "orders" collection on "User" + query(User).options(subqueryload(User.orders)) + + # subquery-load Order.items and then Item.keywords + query(Order).options(subqueryload(Order.items).subqueryload(Item.keywords)) + + # lazily load Order.items, but when Items are loaded, + # subquery-load the keywords collection + query(Order).options(lazyload(Order.items).subqueryload(Item.keywords)) + + + .. seealso:: + + :ref:`loading_toplevel` + + :func:`.orm.joinedload` + + :func:`.orm.lazyload` + + :paramref:`.relationship.lazy` + + """ + return loadopt.set_relationship_strategy(attr, {"lazy": "subquery"}) + + +@subqueryload._add_unbound_fn +def subqueryload(*keys): + return _UnboundLoad._from_keys(_UnboundLoad.subqueryload, keys, False, {}) + + +@subqueryload._add_unbound_all_fn +def subqueryload_all(*keys): + return _UnboundLoad._from_keys(_UnboundLoad.subqueryload, keys, True, {}) + + +@loader_option() +def lazyload(loadopt, attr): + """Indicate that the given attribute should be loaded using "lazy" + loading. + + This function is part of the :class:`.Load` interface and supports + both method-chained and standalone operation. + + .. seealso:: + + :paramref:`.relationship.lazy` + + """ + return loadopt.set_relationship_strategy(attr, {"lazy": "select"}) + + +@lazyload._add_unbound_fn +def lazyload(*keys): + return _UnboundLoad._from_keys(_UnboundLoad.lazyload, keys, False, {}) + + +@lazyload._add_unbound_all_fn +def lazyload_all(*keys): + return _UnboundLoad._from_keys(_UnboundLoad.lazyload, keys, True, {}) + + +@loader_option() +def immediateload(loadopt, attr): + """Indicate that the given attribute should be loaded using + an immediate load with a per-attribute SELECT statement. + + This function is part of the :class:`.Load` interface and supports + both method-chained and standalone operation. + + .. seealso:: + + :ref:`loading_toplevel` + + :func:`.orm.joinedload` + + :func:`.orm.lazyload` + + :paramref:`.relationship.lazy` + + """ + loader = loadopt.set_relationship_strategy(attr, {"lazy": "immediate"}) + return loader + + +@immediateload._add_unbound_fn +def immediateload(*keys): + return _UnboundLoad._from_keys( + _UnboundLoad.immediateload, keys, False, {}) + + +@loader_option() +def noload(loadopt, attr): + """Indicate that the given relationship attribute should remain unloaded. + + This function is part of the :class:`.Load` interface and supports + both method-chained and standalone operation. + + :func:`.orm.noload` applies to :func:`.relationship` attributes; for + column-based attributes, see :func:`.orm.defer`. + + """ + + return loadopt.set_relationship_strategy(attr, {"lazy": "noload"}) + + +@noload._add_unbound_fn +def noload(*keys): + return _UnboundLoad._from_keys(_UnboundLoad.noload, keys, False, {}) + + +@loader_option() +def raiseload(loadopt, attr, sql_only=False): + """Indicate that the given relationship attribute should disallow lazy loads. + + A relationship attribute configured with :func:`.orm.raiseload` will + raise an :exc:`~sqlalchemy.exc.InvalidRequestError` upon access. The + typical way this is useful is when an application is attempting to ensure + that all relationship attributes that are accessed in a particular context + would have been already loaded via eager loading. Instead of having + to read through SQL logs to ensure lazy loads aren't occurring, this + strategy will cause them to raise immediately. + + :param sql_only: if True, raise only if the lazy load would emit SQL, + but not if it is only checking the identity map, or determining that + the related value should just be None due to missing keys. When False, + the strategy will raise for all varieties of lazyload. + + This function is part of the :class:`.Load` interface and supports + both method-chained and standalone operation. + + :func:`.orm.raiseload` applies to :func:`.relationship` attributes only. + + .. versionadded:: 1.1 + + """ + + return loadopt.set_relationship_strategy( + attr, {"lazy": "raise_on_sql" if sql_only else "raise"}) + + +@raiseload._add_unbound_fn +def raiseload(*keys, **kw): + return _UnboundLoad._from_keys(_UnboundLoad.raiseload, keys, False, kw) + + +@loader_option() +def defaultload(loadopt, attr): + """Indicate an attribute should load using its default loader style. + + This method is used to link to other loader options, such as + to set the :func:`.orm.defer` option on a class that is linked to + a relationship of the parent class being loaded, :func:`.orm.defaultload` + can be used to navigate this path without changing the loading style + of the relationship:: + + session.query(MyClass).options(defaultload("someattr").defer("some_column")) + + .. seealso:: + + :func:`.orm.defer` + + :func:`.orm.undefer` + + """ + return loadopt.set_relationship_strategy( + attr, + None + ) + + +@defaultload._add_unbound_fn +def defaultload(*keys): + return _UnboundLoad._from_keys(_UnboundLoad.defaultload, keys, False, {}) + + +@loader_option() +def defer(loadopt, key): + r"""Indicate that the given column-oriented attribute should be deferred, e.g. + not loaded until accessed. + + This function is part of the :class:`.Load` interface and supports + both method-chained and standalone operation. + + e.g.:: + + from sqlalchemy.orm import defer + + session.query(MyClass).options( + defer("attribute_one"), + defer("attribute_two")) + + session.query(MyClass).options( + defer(MyClass.attribute_one), + defer(MyClass.attribute_two)) + + To specify a deferred load of an attribute on a related class, + the path can be specified one token at a time, specifying the loading + style for each link along the chain. To leave the loading style + for a link unchanged, use :func:`.orm.defaultload`:: + + session.query(MyClass).options(defaultload("someattr").defer("some_column")) + + A :class:`.Load` object that is present on a certain path can have + :meth:`.Load.defer` called multiple times, each will operate on the same + parent entity:: + + + session.query(MyClass).options( + defaultload("someattr"). + defer("some_column"). + defer("some_other_column"). + defer("another_column") + ) + + :param key: Attribute to be deferred. + + :param \*addl_attrs: Deprecated; this option supports the old 0.8 style + of specifying a path as a series of attributes, which is now superseded + by the method-chained style. + + .. seealso:: + + :ref:`deferred` + + :func:`.orm.undefer` + + """ + return loadopt.set_column_strategy( + (key, ), + {"deferred": True, "instrument": True} + ) + + +@defer._add_unbound_fn +def defer(key, *addl_attrs): + return _UnboundLoad._from_keys( + _UnboundLoad.defer, (key, ) + addl_attrs, False, {}) + + +@loader_option() +def undefer(loadopt, key): + r"""Indicate that the given column-oriented attribute should be undeferred, + e.g. specified within the SELECT statement of the entity as a whole. + + The column being undeferred is typically set up on the mapping as a + :func:`.deferred` attribute. + + This function is part of the :class:`.Load` interface and supports + both method-chained and standalone operation. + + Examples:: + + # undefer two columns + session.query(MyClass).options(undefer("col1"), undefer("col2")) + + # undefer all columns specific to a single class using Load + * + session.query(MyClass, MyOtherClass).options( + Load(MyClass).undefer("*")) + + :param key: Attribute to be undeferred. + + :param \*addl_attrs: Deprecated; this option supports the old 0.8 style + of specifying a path as a series of attributes, which is now superseded + by the method-chained style. + + .. seealso:: + + :ref:`deferred` + + :func:`.orm.defer` + + :func:`.orm.undefer_group` + + """ + return loadopt.set_column_strategy( + (key, ), + {"deferred": False, "instrument": True} + ) + + +@undefer._add_unbound_fn +def undefer(key, *addl_attrs): + return _UnboundLoad._from_keys( + _UnboundLoad.undefer, (key, ) + addl_attrs, False, {}) + + +@loader_option() +def undefer_group(loadopt, name): + """Indicate that columns within the given deferred group name should be + undeferred. + + The columns being undeferred are set up on the mapping as + :func:`.deferred` attributes and include a "group" name. + + E.g:: + + session.query(MyClass).options(undefer_group("large_attrs")) + + To undefer a group of attributes on a related entity, the path can be + spelled out using relationship loader options, such as + :func:`.orm.defaultload`:: + + session.query(MyClass).options( + defaultload("someattr").undefer_group("large_attrs")) + + .. versionchanged:: 0.9.0 :func:`.orm.undefer_group` is now specific to a + particiular entity load path. + + .. seealso:: + + :ref:`deferred` + + :func:`.orm.defer` + + :func:`.orm.undefer` + + """ + return loadopt.set_column_strategy( + "*", + None, + {"undefer_group_%s" % name: True}, + opts_only=True + ) + + +@undefer_group._add_unbound_fn +def undefer_group(name): + return _UnboundLoad().undefer_group(name) diff --git a/app/lib/sqlalchemy/orm/sync.py b/app/lib/sqlalchemy/orm/sync.py new file mode 100644 index 0000000..880428b --- /dev/null +++ b/app/lib/sqlalchemy/orm/sync.py @@ -0,0 +1,140 @@ +# orm/sync.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""private module containing functions used for copying data +between instances based on join conditions. + +""" + +from . import exc, util as orm_util, attributes + + +def populate(source, source_mapper, dest, dest_mapper, + synchronize_pairs, uowcommit, flag_cascaded_pks): + source_dict = source.dict + dest_dict = dest.dict + + for l, r in synchronize_pairs: + try: + # inline of source_mapper._get_state_attr_by_column + prop = source_mapper._columntoproperty[l] + value = source.manager[prop.key].impl.get(source, source_dict, + attributes.PASSIVE_OFF) + except exc.UnmappedColumnError: + _raise_col_to_prop(False, source_mapper, l, dest_mapper, r) + + try: + # inline of dest_mapper._set_state_attr_by_column + prop = dest_mapper._columntoproperty[r] + dest.manager[prop.key].impl.set(dest, dest_dict, value, None) + except exc.UnmappedColumnError: + _raise_col_to_prop(True, source_mapper, l, dest_mapper, r) + + # technically the "r.primary_key" check isn't + # needed here, but we check for this condition to limit + # how often this logic is invoked for memory/performance + # reasons, since we only need this info for a primary key + # destination. + if flag_cascaded_pks and l.primary_key and \ + r.primary_key and \ + r.references(l): + uowcommit.attributes[("pk_cascaded", dest, r)] = True + + +def bulk_populate_inherit_keys( + source_dict, source_mapper, synchronize_pairs): + # a simplified version of populate() used by bulk insert mode + for l, r in synchronize_pairs: + try: + prop = source_mapper._columntoproperty[l] + value = source_dict[prop.key] + except exc.UnmappedColumnError: + _raise_col_to_prop(False, source_mapper, l, source_mapper, r) + + try: + prop = source_mapper._columntoproperty[r] + source_dict[prop.key] = value + except exc.UnmappedColumnError: + _raise_col_to_prop(True, source_mapper, l, source_mapper, r) + + +def clear(dest, dest_mapper, synchronize_pairs): + for l, r in synchronize_pairs: + if r.primary_key and \ + dest_mapper._get_state_attr_by_column( + dest, dest.dict, r) not in orm_util._none_set: + + raise AssertionError( + "Dependency rule tried to blank-out primary key " + "column '%s' on instance '%s'" % + (r, orm_util.state_str(dest)) + ) + try: + dest_mapper._set_state_attr_by_column(dest, dest.dict, r, None) + except exc.UnmappedColumnError: + _raise_col_to_prop(True, None, l, dest_mapper, r) + + +def update(source, source_mapper, dest, old_prefix, synchronize_pairs): + for l, r in synchronize_pairs: + try: + oldvalue = source_mapper._get_committed_attr_by_column( + source.obj(), l) + value = source_mapper._get_state_attr_by_column( + source, source.dict, l, passive=attributes.PASSIVE_OFF) + except exc.UnmappedColumnError: + _raise_col_to_prop(False, source_mapper, l, None, r) + dest[r.key] = value + dest[old_prefix + r.key] = oldvalue + + +def populate_dict(source, source_mapper, dict_, synchronize_pairs): + for l, r in synchronize_pairs: + try: + value = source_mapper._get_state_attr_by_column( + source, source.dict, l, passive=attributes.PASSIVE_OFF) + except exc.UnmappedColumnError: + _raise_col_to_prop(False, source_mapper, l, None, r) + + dict_[r.key] = value + + +def source_modified(uowcommit, source, source_mapper, synchronize_pairs): + """return true if the source object has changes from an old to a + new value on the given synchronize pairs + + """ + for l, r in synchronize_pairs: + try: + prop = source_mapper._columntoproperty[l] + except exc.UnmappedColumnError: + _raise_col_to_prop(False, source_mapper, l, None, r) + history = uowcommit.get_attribute_history( + source, prop.key, attributes.PASSIVE_NO_INITIALIZE) + if bool(history.deleted): + return True + else: + return False + + +def _raise_col_to_prop(isdest, source_mapper, source_column, + dest_mapper, dest_column): + if isdest: + raise exc.UnmappedColumnError( + "Can't execute sync rule for " + "destination column '%s'; mapper '%s' does not map " + "this column. Try using an explicit `foreign_keys` " + "collection which does not include this column (or use " + "a viewonly=True relation)." % (dest_column, dest_mapper)) + else: + raise exc.UnmappedColumnError( + "Can't execute sync rule for " + "source column '%s'; mapper '%s' does not map this " + "column. Try using an explicit `foreign_keys` " + "collection which does not include destination column " + "'%s' (or use a viewonly=True relation)." % + (source_column, source_mapper, dest_column)) diff --git a/app/lib/sqlalchemy/orm/unitofwork.py b/app/lib/sqlalchemy/orm/unitofwork.py new file mode 100644 index 0000000..3a39a30 --- /dev/null +++ b/app/lib/sqlalchemy/orm/unitofwork.py @@ -0,0 +1,672 @@ +# orm/unitofwork.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""The internals for the unit of work system. + +The session's flush() process passes objects to a contextual object +here, which assembles flush tasks based on mappers and their properties, +organizes them in order of dependency, and executes. + +""" + +from .. import util, event +from ..util import topological +from . import attributes, persistence, util as orm_util +from . import exc as orm_exc +import itertools + + +def track_cascade_events(descriptor, prop): + """Establish event listeners on object attributes which handle + cascade-on-set/append. + + """ + key = prop.key + + def append(state, item, initiator): + # process "save_update" cascade rules for when + # an instance is appended to the list of another instance + + if item is None: + return + + sess = state.session + if sess: + if sess._warn_on_events: + sess._flush_warning("collection append") + + prop = state.manager.mapper._props[key] + item_state = attributes.instance_state(item) + if prop._cascade.save_update and \ + (prop.cascade_backrefs or key == initiator.key) and \ + not sess._contains_state(item_state): + sess._save_or_update_state(item_state) + return item + + def remove(state, item, initiator): + if item is None: + return + + sess = state.session + if sess: + + prop = state.manager.mapper._props[key] + + if sess._warn_on_events: + sess._flush_warning( + "collection remove" + if prop.uselist + else "related attribute delete") + + # expunge pending orphans + item_state = attributes.instance_state(item) + if prop._cascade.delete_orphan and \ + item_state in sess._new and \ + prop.mapper._is_orphan(item_state): + sess.expunge(item) + + def set_(state, newvalue, oldvalue, initiator): + # process "save_update" cascade rules for when an instance + # is attached to another instance + if oldvalue is newvalue: + return newvalue + + sess = state.session + if sess: + + if sess._warn_on_events: + sess._flush_warning("related attribute set") + + prop = state.manager.mapper._props[key] + if newvalue is not None: + newvalue_state = attributes.instance_state(newvalue) + if prop._cascade.save_update and \ + (prop.cascade_backrefs or key == initiator.key) and \ + not sess._contains_state(newvalue_state): + sess._save_or_update_state(newvalue_state) + + if oldvalue is not None and \ + oldvalue is not attributes.NEVER_SET and \ + oldvalue is not attributes.PASSIVE_NO_RESULT and \ + prop._cascade.delete_orphan: + # possible to reach here with attributes.NEVER_SET ? + oldvalue_state = attributes.instance_state(oldvalue) + + if oldvalue_state in sess._new and \ + prop.mapper._is_orphan(oldvalue_state): + sess.expunge(oldvalue) + return newvalue + + event.listen(descriptor, 'append', append, raw=True, retval=True) + event.listen(descriptor, 'remove', remove, raw=True, retval=True) + event.listen(descriptor, 'set', set_, raw=True, retval=True) + + +class UOWTransaction(object): + def __init__(self, session): + self.session = session + + # dictionary used by external actors to + # store arbitrary state information. + self.attributes = {} + + # dictionary of mappers to sets of + # DependencyProcessors, which are also + # set to be part of the sorted flush actions, + # which have that mapper as a parent. + self.deps = util.defaultdict(set) + + # dictionary of mappers to sets of InstanceState + # items pending for flush which have that mapper + # as a parent. + self.mappers = util.defaultdict(set) + + # a dictionary of Preprocess objects, which gather + # additional states impacted by the flush + # and determine if a flush action is needed + self.presort_actions = {} + + # dictionary of PostSortRec objects, each + # one issues work during the flush within + # a certain ordering. + self.postsort_actions = {} + + # a set of 2-tuples, each containing two + # PostSortRec objects where the second + # is dependent on the first being executed + # first + self.dependencies = set() + + # dictionary of InstanceState-> (isdelete, listonly) + # tuples, indicating if this state is to be deleted + # or insert/updated, or just refreshed + self.states = {} + + # tracks InstanceStates which will be receiving + # a "post update" call. Keys are mappers, + # values are a set of states and a set of the + # columns which should be included in the update. + self.post_update_states = util.defaultdict(lambda: (set(), set())) + + @property + def has_work(self): + return bool(self.states) + + def was_already_deleted(self, state): + """return true if the given state is expired and was deleted + previously. + """ + if state.expired: + try: + state._load_expired(state, attributes.PASSIVE_OFF) + except orm_exc.ObjectDeletedError: + self.session._remove_newly_deleted([state]) + return True + return False + + def is_deleted(self, state): + """return true if the given state is marked as deleted + within this uowtransaction.""" + + return state in self.states and self.states[state][0] + + def memo(self, key, callable_): + if key in self.attributes: + return self.attributes[key] + else: + self.attributes[key] = ret = callable_() + return ret + + def remove_state_actions(self, state): + """remove pending actions for a state from the uowtransaction.""" + + isdelete = self.states[state][0] + + self.states[state] = (isdelete, True) + + def get_attribute_history(self, state, key, + passive=attributes.PASSIVE_NO_INITIALIZE): + """facade to attributes.get_state_history(), including + caching of results.""" + + hashkey = ("history", state, key) + + # cache the objects, not the states; the strong reference here + # prevents newly loaded objects from being dereferenced during the + # flush process + + if hashkey in self.attributes: + history, state_history, cached_passive = self.attributes[hashkey] + # if the cached lookup was "passive" and now + # we want non-passive, do a non-passive lookup and re-cache + + if not cached_passive & attributes.SQL_OK \ + and passive & attributes.SQL_OK: + impl = state.manager[key].impl + history = impl.get_history(state, state.dict, + attributes.PASSIVE_OFF | + attributes.LOAD_AGAINST_COMMITTED) + if history and impl.uses_objects: + state_history = history.as_state() + else: + state_history = history + self.attributes[hashkey] = (history, state_history, passive) + else: + impl = state.manager[key].impl + # TODO: store the history as (state, object) tuples + # so we don't have to keep converting here + history = impl.get_history(state, state.dict, passive | + attributes.LOAD_AGAINST_COMMITTED) + if history and impl.uses_objects: + state_history = history.as_state() + else: + state_history = history + self.attributes[hashkey] = (history, state_history, + passive) + + return state_history + + def has_dep(self, processor): + return (processor, True) in self.presort_actions + + def register_preprocessor(self, processor, fromparent): + key = (processor, fromparent) + if key not in self.presort_actions: + self.presort_actions[key] = Preprocess(processor, fromparent) + + def register_object(self, state, isdelete=False, + listonly=False, cancel_delete=False, + operation=None, prop=None): + if not self.session._contains_state(state): + # this condition is normal when objects are registered + # as part of a relationship cascade operation. it should + # not occur for the top-level register from Session.flush(). + if not state.deleted and operation is not None: + util.warn("Object of type %s not in session, %s operation " + "along '%s' will not proceed" % + (orm_util.state_class_str(state), operation, prop)) + return False + + if state not in self.states: + mapper = state.manager.mapper + + if mapper not in self.mappers: + self._per_mapper_flush_actions(mapper) + + self.mappers[mapper].add(state) + self.states[state] = (isdelete, listonly) + else: + if not listonly and (isdelete or cancel_delete): + self.states[state] = (isdelete, False) + return True + + def issue_post_update(self, state, post_update_cols): + mapper = state.manager.mapper.base_mapper + states, cols = self.post_update_states[mapper] + states.add(state) + cols.update(post_update_cols) + + def _per_mapper_flush_actions(self, mapper): + saves = SaveUpdateAll(self, mapper.base_mapper) + deletes = DeleteAll(self, mapper.base_mapper) + self.dependencies.add((saves, deletes)) + + for dep in mapper._dependency_processors: + dep.per_property_preprocessors(self) + + for prop in mapper.relationships: + if prop.viewonly: + continue + dep = prop._dependency_processor + dep.per_property_preprocessors(self) + + @util.memoized_property + def _mapper_for_dep(self): + """return a dynamic mapping of (Mapper, DependencyProcessor) to + True or False, indicating if the DependencyProcessor operates + on objects of that Mapper. + + The result is stored in the dictionary persistently once + calculated. + + """ + return util.PopulateDict( + lambda tup: tup[0]._props.get(tup[1].key) is tup[1].prop + ) + + def filter_states_for_dep(self, dep, states): + """Filter the given list of InstanceStates to those relevant to the + given DependencyProcessor. + + """ + mapper_for_dep = self._mapper_for_dep + return [s for s in states if mapper_for_dep[(s.manager.mapper, dep)]] + + def states_for_mapper_hierarchy(self, mapper, isdelete, listonly): + checktup = (isdelete, listonly) + for mapper in mapper.base_mapper.self_and_descendants: + for state in self.mappers[mapper]: + if self.states[state] == checktup: + yield state + + def _generate_actions(self): + """Generate the full, unsorted collection of PostSortRecs as + well as dependency pairs for this UOWTransaction. + + """ + # execute presort_actions, until all states + # have been processed. a presort_action might + # add new states to the uow. + while True: + ret = False + for action in list(self.presort_actions.values()): + if action.execute(self): + ret = True + if not ret: + break + + # see if the graph of mapper dependencies has cycles. + self.cycles = cycles = topological.find_cycles( + self.dependencies, + list(self.postsort_actions.values())) + + if cycles: + # if yes, break the per-mapper actions into + # per-state actions + convert = dict( + (rec, set(rec.per_state_flush_actions(self))) + for rec in cycles + ) + + # rewrite the existing dependencies to point to + # the per-state actions for those per-mapper actions + # that were broken up. + for edge in list(self.dependencies): + if None in edge or \ + edge[0].disabled or edge[1].disabled or \ + cycles.issuperset(edge): + self.dependencies.remove(edge) + elif edge[0] in cycles: + self.dependencies.remove(edge) + for dep in convert[edge[0]]: + self.dependencies.add((dep, edge[1])) + elif edge[1] in cycles: + self.dependencies.remove(edge) + for dep in convert[edge[1]]: + self.dependencies.add((edge[0], dep)) + + return set([a for a in self.postsort_actions.values() + if not a.disabled + ] + ).difference(cycles) + + def execute(self): + postsort_actions = self._generate_actions() + + # sort = topological.sort(self.dependencies, postsort_actions) + # print "--------------" + # print "\ndependencies:", self.dependencies + # print "\ncycles:", self.cycles + # print "\nsort:", list(sort) + # print "\nCOUNT OF POSTSORT ACTIONS", len(postsort_actions) + + # execute + if self.cycles: + for set_ in topological.sort_as_subsets( + self.dependencies, + postsort_actions): + while set_: + n = set_.pop() + n.execute_aggregate(self, set_) + else: + for rec in topological.sort( + self.dependencies, + postsort_actions): + rec.execute(self) + + def finalize_flush_changes(self): + """mark processed objects as clean / deleted after a successful + flush(). + + this method is called within the flush() method after the + execute() method has succeeded and the transaction has been committed. + + """ + if not self.states: + return + + states = set(self.states) + isdel = set( + s for (s, (isdelete, listonly)) in self.states.items() + if isdelete + ) + other = states.difference(isdel) + if isdel: + self.session._remove_newly_deleted(isdel) + if other: + self.session._register_newly_persistent(other) + + +class IterateMappersMixin(object): + def _mappers(self, uow): + if self.fromparent: + return iter( + m for m in + self.dependency_processor.parent.self_and_descendants + if uow._mapper_for_dep[(m, self.dependency_processor)] + ) + else: + return self.dependency_processor.mapper.self_and_descendants + + +class Preprocess(IterateMappersMixin): + def __init__(self, dependency_processor, fromparent): + self.dependency_processor = dependency_processor + self.fromparent = fromparent + self.processed = set() + self.setup_flush_actions = False + + def execute(self, uow): + delete_states = set() + save_states = set() + + for mapper in self._mappers(uow): + for state in uow.mappers[mapper].difference(self.processed): + (isdelete, listonly) = uow.states[state] + if not listonly: + if isdelete: + delete_states.add(state) + else: + save_states.add(state) + + if delete_states: + self.dependency_processor.presort_deletes(uow, delete_states) + self.processed.update(delete_states) + if save_states: + self.dependency_processor.presort_saves(uow, save_states) + self.processed.update(save_states) + + if (delete_states or save_states): + if not self.setup_flush_actions and ( + self.dependency_processor. + prop_has_changes(uow, delete_states, True) or + self.dependency_processor. + prop_has_changes(uow, save_states, False) + ): + self.dependency_processor.per_property_flush_actions(uow) + self.setup_flush_actions = True + return True + else: + return False + + +class PostSortRec(object): + disabled = False + + def __new__(cls, uow, *args): + key = (cls, ) + args + if key in uow.postsort_actions: + return uow.postsort_actions[key] + else: + uow.postsort_actions[key] = \ + ret = \ + object.__new__(cls) + return ret + + def execute_aggregate(self, uow, recs): + self.execute(uow) + + def __repr__(self): + return "%s(%s)" % ( + self.__class__.__name__, + ",".join(str(x) for x in self.__dict__.values()) + ) + + +class ProcessAll(IterateMappersMixin, PostSortRec): + def __init__(self, uow, dependency_processor, delete, fromparent): + self.dependency_processor = dependency_processor + self.delete = delete + self.fromparent = fromparent + uow.deps[dependency_processor.parent.base_mapper].\ + add(dependency_processor) + + def execute(self, uow): + states = self._elements(uow) + if self.delete: + self.dependency_processor.process_deletes(uow, states) + else: + self.dependency_processor.process_saves(uow, states) + + def per_state_flush_actions(self, uow): + # this is handled by SaveUpdateAll and DeleteAll, + # since a ProcessAll should unconditionally be pulled + # into per-state if either the parent/child mappers + # are part of a cycle + return iter([]) + + def __repr__(self): + return "%s(%s, delete=%s)" % ( + self.__class__.__name__, + self.dependency_processor, + self.delete + ) + + def _elements(self, uow): + for mapper in self._mappers(uow): + for state in uow.mappers[mapper]: + (isdelete, listonly) = uow.states[state] + if isdelete == self.delete and not listonly: + yield state + + +class IssuePostUpdate(PostSortRec): + def __init__(self, uow, mapper, isdelete): + self.mapper = mapper + self.isdelete = isdelete + + def execute(self, uow): + states, cols = uow.post_update_states[self.mapper] + states = [s for s in states if uow.states[s][0] == self.isdelete] + + persistence.post_update(self.mapper, states, uow, cols) + + +class SaveUpdateAll(PostSortRec): + def __init__(self, uow, mapper): + self.mapper = mapper + assert mapper is mapper.base_mapper + + def execute(self, uow): + persistence.save_obj(self.mapper, + uow.states_for_mapper_hierarchy( + self.mapper, False, False), + uow + ) + + def per_state_flush_actions(self, uow): + states = list(uow.states_for_mapper_hierarchy( + self.mapper, False, False)) + base_mapper = self.mapper.base_mapper + delete_all = DeleteAll(uow, base_mapper) + for state in states: + # keep saves before deletes - + # this ensures 'row switch' operations work + action = SaveUpdateState(uow, state, base_mapper) + uow.dependencies.add((action, delete_all)) + yield action + + for dep in uow.deps[self.mapper]: + states_for_prop = uow.filter_states_for_dep(dep, states) + dep.per_state_flush_actions(uow, states_for_prop, False) + + +class DeleteAll(PostSortRec): + def __init__(self, uow, mapper): + self.mapper = mapper + assert mapper is mapper.base_mapper + + def execute(self, uow): + persistence.delete_obj(self.mapper, + uow.states_for_mapper_hierarchy( + self.mapper, True, False), + uow + ) + + def per_state_flush_actions(self, uow): + states = list(uow.states_for_mapper_hierarchy( + self.mapper, True, False)) + base_mapper = self.mapper.base_mapper + save_all = SaveUpdateAll(uow, base_mapper) + for state in states: + # keep saves before deletes - + # this ensures 'row switch' operations work + action = DeleteState(uow, state, base_mapper) + uow.dependencies.add((save_all, action)) + yield action + + for dep in uow.deps[self.mapper]: + states_for_prop = uow.filter_states_for_dep(dep, states) + dep.per_state_flush_actions(uow, states_for_prop, True) + + +class ProcessState(PostSortRec): + def __init__(self, uow, dependency_processor, delete, state): + self.dependency_processor = dependency_processor + self.delete = delete + self.state = state + + def execute_aggregate(self, uow, recs): + cls_ = self.__class__ + dependency_processor = self.dependency_processor + delete = self.delete + our_recs = [r for r in recs + if r.__class__ is cls_ and + r.dependency_processor is dependency_processor and + r.delete is delete] + recs.difference_update(our_recs) + states = [self.state] + [r.state for r in our_recs] + if delete: + dependency_processor.process_deletes(uow, states) + else: + dependency_processor.process_saves(uow, states) + + def __repr__(self): + return "%s(%s, %s, delete=%s)" % ( + self.__class__.__name__, + self.dependency_processor, + orm_util.state_str(self.state), + self.delete + ) + + +class SaveUpdateState(PostSortRec): + def __init__(self, uow, state, mapper): + self.state = state + self.mapper = mapper + + def execute_aggregate(self, uow, recs): + cls_ = self.__class__ + mapper = self.mapper + our_recs = [r for r in recs + if r.__class__ is cls_ and + r.mapper is mapper] + recs.difference_update(our_recs) + persistence.save_obj(mapper, + [self.state] + + [r.state for r in our_recs], + uow) + + def __repr__(self): + return "%s(%s)" % ( + self.__class__.__name__, + orm_util.state_str(self.state) + ) + + +class DeleteState(PostSortRec): + def __init__(self, uow, state, mapper): + self.state = state + self.mapper = mapper + + def execute_aggregate(self, uow, recs): + cls_ = self.__class__ + mapper = self.mapper + our_recs = [r for r in recs + if r.__class__ is cls_ and + r.mapper is mapper] + recs.difference_update(our_recs) + states = [self.state] + [r.state for r in our_recs] + persistence.delete_obj(mapper, + [s for s in states if uow.states[s][0]], + uow) + + def __repr__(self): + return "%s(%s)" % ( + self.__class__.__name__, + orm_util.state_str(self.state) + ) diff --git a/app/lib/sqlalchemy/orm/util.py b/app/lib/sqlalchemy/orm/util.py new file mode 100644 index 0000000..fc0dba5 --- /dev/null +++ b/app/lib/sqlalchemy/orm/util.py @@ -0,0 +1,1058 @@ +# orm/util.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + + +from .. import sql, util, event, exc as sa_exc, inspection +from ..sql import expression, util as sql_util, operators +from .interfaces import PropComparator, MapperProperty +from . import attributes +import re + +from .base import instance_str, state_str, state_class_str, attribute_str, \ + state_attribute_str, object_mapper, object_state, _none_set, _never_set +from .base import class_mapper, _class_to_mapper +from .base import InspectionAttr +from .path_registry import PathRegistry + +all_cascades = frozenset(("delete", "delete-orphan", "all", "merge", + "expunge", "save-update", "refresh-expire", + "none")) + + +class CascadeOptions(frozenset): + """Keeps track of the options sent to relationship().cascade""" + + _add_w_all_cascades = all_cascades.difference([ + 'all', 'none', 'delete-orphan']) + _allowed_cascades = all_cascades + + __slots__ = ( + 'save_update', 'delete', 'refresh_expire', 'merge', + 'expunge', 'delete_orphan') + + def __new__(cls, value_list): + if isinstance(value_list, util.string_types) or value_list is None: + return cls.from_string(value_list) + values = set(value_list) + if values.difference(cls._allowed_cascades): + raise sa_exc.ArgumentError( + "Invalid cascade option(s): %s" % + ", ".join([repr(x) for x in + sorted(values.difference(cls._allowed_cascades))])) + + if "all" in values: + values.update(cls._add_w_all_cascades) + if "none" in values: + values.clear() + values.discard('all') + + self = frozenset.__new__(CascadeOptions, values) + self.save_update = 'save-update' in values + self.delete = 'delete' in values + self.refresh_expire = 'refresh-expire' in values + self.merge = 'merge' in values + self.expunge = 'expunge' in values + self.delete_orphan = "delete-orphan" in values + + if self.delete_orphan and not self.delete: + util.warn("The 'delete-orphan' cascade " + "option requires 'delete'.") + return self + + def __repr__(self): + return "CascadeOptions(%r)" % ( + ",".join([x for x in sorted(self)]) + ) + + @classmethod + def from_string(cls, arg): + values = [ + c for c + in re.split(r'\s*,\s*', arg or "") + if c + ] + return cls(values) + + +def _validator_events( + desc, key, validator, include_removes, include_backrefs): + """Runs a validation method on an attribute value to be set or + appended. + """ + + if not include_backrefs: + def detect_is_backref(state, initiator): + impl = state.manager[key].impl + return initiator.impl is not impl + + if include_removes: + def append(state, value, initiator): + if include_backrefs or not detect_is_backref(state, initiator): + return validator(state.obj(), key, value, False) + else: + return value + + def set_(state, value, oldvalue, initiator): + if include_backrefs or not detect_is_backref(state, initiator): + return validator(state.obj(), key, value, False) + else: + return value + + def remove(state, value, initiator): + if include_backrefs or not detect_is_backref(state, initiator): + validator(state.obj(), key, value, True) + + else: + def append(state, value, initiator): + if include_backrefs or not detect_is_backref(state, initiator): + return validator(state.obj(), key, value) + else: + return value + + def set_(state, value, oldvalue, initiator): + if include_backrefs or not detect_is_backref(state, initiator): + return validator(state.obj(), key, value) + else: + return value + + event.listen(desc, 'append', append, raw=True, retval=True) + event.listen(desc, 'set', set_, raw=True, retval=True) + if include_removes: + event.listen(desc, "remove", remove, raw=True, retval=True) + + +def polymorphic_union(table_map, typecolname, + aliasname='p_union', cast_nulls=True): + """Create a ``UNION`` statement used by a polymorphic mapper. + + See :ref:`concrete_inheritance` for an example of how + this is used. + + :param table_map: mapping of polymorphic identities to + :class:`.Table` objects. + :param typecolname: string name of a "discriminator" column, which will be + derived from the query, producing the polymorphic identity for + each row. If ``None``, no polymorphic discriminator is generated. + :param aliasname: name of the :func:`~sqlalchemy.sql.expression.alias()` + construct generated. + :param cast_nulls: if True, non-existent columns, which are represented + as labeled NULLs, will be passed into CAST. This is a legacy behavior + that is problematic on some backends such as Oracle - in which case it + can be set to False. + + """ + + colnames = util.OrderedSet() + colnamemaps = {} + types = {} + for key in table_map: + table = table_map[key] + + # mysql doesn't like selecting from a select; + # make it an alias of the select + if isinstance(table, sql.Select): + table = table.alias() + table_map[key] = table + + m = {} + for c in table.c: + colnames.add(c.key) + m[c.key] = c + types[c.key] = c.type + colnamemaps[table] = m + + def col(name, table): + try: + return colnamemaps[table][name] + except KeyError: + if cast_nulls: + return sql.cast(sql.null(), types[name]).label(name) + else: + return sql.type_coerce(sql.null(), types[name]).label(name) + + result = [] + for type, table in table_map.items(): + if typecolname is not None: + result.append( + sql.select([col(name, table) for name in colnames] + + [sql.literal_column( + sql_util._quote_ddl_expr(type)). + label(typecolname)], + from_obj=[table])) + else: + result.append(sql.select([col(name, table) for name in colnames], + from_obj=[table])) + return sql.union_all(*result).alias(aliasname) + + +def identity_key(*args, **kwargs): + """Generate "identity key" tuples, as are used as keys in the + :attr:`.Session.identity_map` dictionary. + + This function has several call styles: + + * ``identity_key(class, ident)`` + + This form receives a mapped class and a primary key scalar or + tuple as an argument. + + E.g.:: + + >>> identity_key(MyClass, (1, 2)) + (, (1, 2)) + + :param class: mapped class (must be a positional argument) + :param ident: primary key, may be a scalar or tuple argument. + + + * ``identity_key(instance=instance)`` + + This form will produce the identity key for a given instance. The + instance need not be persistent, only that its primary key attributes + are populated (else the key will contain ``None`` for those missing + values). + + E.g.:: + + >>> instance = MyClass(1, 2) + >>> identity_key(instance=instance) + (, (1, 2)) + + In this form, the given instance is ultimately run though + :meth:`.Mapper.identity_key_from_instance`, which will have the + effect of performing a database check for the corresponding row + if the object is expired. + + :param instance: object instance (must be given as a keyword arg) + + * ``identity_key(class, row=row)`` + + This form is similar to the class/tuple form, except is passed a + database result row as a :class:`.RowProxy` object. + + E.g.:: + + >>> row = engine.execute("select * from table where a=1 and b=2").\ +first() + >>> identity_key(MyClass, row=row) + (, (1, 2)) + + :param class: mapped class (must be a positional argument) + :param row: :class:`.RowProxy` row returned by a :class:`.ResultProxy` + (must be given as a keyword arg) + + """ + if args: + if len(args) == 1: + class_ = args[0] + try: + row = kwargs.pop("row") + except KeyError: + ident = kwargs.pop("ident") + elif len(args) == 2: + class_, ident = args + elif len(args) == 3: + class_, ident = args + else: + raise sa_exc.ArgumentError( + "expected up to three positional arguments, " + "got %s" % len(args)) + if kwargs: + raise sa_exc.ArgumentError("unknown keyword arguments: %s" + % ", ".join(kwargs)) + mapper = class_mapper(class_) + if "ident" in locals(): + return mapper.identity_key_from_primary_key(util.to_list(ident)) + return mapper.identity_key_from_row(row) + instance = kwargs.pop("instance") + if kwargs: + raise sa_exc.ArgumentError("unknown keyword arguments: %s" + % ", ".join(kwargs.keys)) + mapper = object_mapper(instance) + return mapper.identity_key_from_instance(instance) + + +class ORMAdapter(sql_util.ColumnAdapter): + """ColumnAdapter subclass which excludes adaptation of entities from + non-matching mappers. + + """ + + def __init__(self, entity, equivalents=None, adapt_required=False, + chain_to=None, allow_label_resolve=True, + anonymize_labels=False): + info = inspection.inspect(entity) + + self.mapper = info.mapper + selectable = info.selectable + is_aliased_class = info.is_aliased_class + if is_aliased_class: + self.aliased_class = entity + else: + self.aliased_class = None + + sql_util.ColumnAdapter.__init__( + self, selectable, equivalents, chain_to, + adapt_required=adapt_required, + allow_label_resolve=allow_label_resolve, + anonymize_labels=anonymize_labels, + include_fn=self._include_fn + ) + + def _include_fn(self, elem): + entity = elem._annotations.get('parentmapper', None) + return not entity or entity.isa(self.mapper) + + +class AliasedClass(object): + r"""Represents an "aliased" form of a mapped class for usage with Query. + + The ORM equivalent of a :func:`sqlalchemy.sql.expression.alias` + construct, this object mimics the mapped class using a + __getattr__ scheme and maintains a reference to a + real :class:`~sqlalchemy.sql.expression.Alias` object. + + Usage is via the :func:`.orm.aliased` function, or alternatively + via the :func:`.orm.with_polymorphic` function. + + Usage example:: + + # find all pairs of users with the same name + user_alias = aliased(User) + session.query(User, user_alias).\ + join((user_alias, User.id > user_alias.id)).\ + filter(User.name==user_alias.name) + + The resulting object is an instance of :class:`.AliasedClass`. + This object implements an attribute scheme which produces the + same attribute and method interface as the original mapped + class, allowing :class:`.AliasedClass` to be compatible + with any attribute technique which works on the original class, + including hybrid attributes (see :ref:`hybrids_toplevel`). + + The :class:`.AliasedClass` can be inspected for its underlying + :class:`.Mapper`, aliased selectable, and other information + using :func:`.inspect`:: + + from sqlalchemy import inspect + my_alias = aliased(MyClass) + insp = inspect(my_alias) + + The resulting inspection object is an instance of :class:`.AliasedInsp`. + + See :func:`.aliased` and :func:`.with_polymorphic` for construction + argument descriptions. + + """ + + def __init__(self, cls, alias=None, + name=None, + flat=False, + adapt_on_names=False, + # TODO: None for default here? + with_polymorphic_mappers=(), + with_polymorphic_discriminator=None, + base_alias=None, + use_mapper_path=False): + mapper = _class_to_mapper(cls) + if alias is None: + alias = mapper._with_polymorphic_selectable.alias( + name=name, flat=flat) + + self._aliased_insp = AliasedInsp( + self, + mapper, + alias, + name, + with_polymorphic_mappers + if with_polymorphic_mappers + else mapper.with_polymorphic_mappers, + with_polymorphic_discriminator + if with_polymorphic_discriminator is not None + else mapper.polymorphic_on, + base_alias, + use_mapper_path, + adapt_on_names + ) + + self.__name__ = 'AliasedClass_%s' % mapper.class_.__name__ + + def __getattr__(self, key): + try: + _aliased_insp = self.__dict__['_aliased_insp'] + except KeyError: + raise AttributeError() + else: + for base in _aliased_insp._target.__mro__: + try: + attr = object.__getattribute__(base, key) + except AttributeError: + continue + else: + break + else: + raise AttributeError(key) + + if isinstance(attr, PropComparator): + ret = attr.adapt_to_entity(_aliased_insp) + setattr(self, key, ret) + return ret + elif hasattr(attr, 'func_code'): + is_method = getattr(_aliased_insp._target, key, None) + if is_method and is_method.__self__ is not None: + return util.types.MethodType(attr.__func__, self, self) + else: + return None + elif hasattr(attr, '__get__'): + ret = attr.__get__(None, self) + if isinstance(ret, PropComparator): + return ret.adapt_to_entity(_aliased_insp) + else: + return ret + else: + return attr + + def __repr__(self): + return '' % ( + id(self), self._aliased_insp._target.__name__) + + +class AliasedInsp(InspectionAttr): + """Provide an inspection interface for an + :class:`.AliasedClass` object. + + The :class:`.AliasedInsp` object is returned + given an :class:`.AliasedClass` using the + :func:`.inspect` function:: + + from sqlalchemy import inspect + from sqlalchemy.orm import aliased + + my_alias = aliased(MyMappedClass) + insp = inspect(my_alias) + + Attributes on :class:`.AliasedInsp` + include: + + * ``entity`` - the :class:`.AliasedClass` represented. + * ``mapper`` - the :class:`.Mapper` mapping the underlying class. + * ``selectable`` - the :class:`.Alias` construct which ultimately + represents an aliased :class:`.Table` or :class:`.Select` + construct. + * ``name`` - the name of the alias. Also is used as the attribute + name when returned in a result tuple from :class:`.Query`. + * ``with_polymorphic_mappers`` - collection of :class:`.Mapper` objects + indicating all those mappers expressed in the select construct + for the :class:`.AliasedClass`. + * ``polymorphic_on`` - an alternate column or SQL expression which + will be used as the "discriminator" for a polymorphic load. + + .. seealso:: + + :ref:`inspection_toplevel` + + """ + + def __init__(self, entity, mapper, selectable, name, + with_polymorphic_mappers, polymorphic_on, + _base_alias, _use_mapper_path, adapt_on_names): + self.entity = entity + self.mapper = mapper + self.selectable = selectable + self.name = name + self.with_polymorphic_mappers = with_polymorphic_mappers + self.polymorphic_on = polymorphic_on + self._base_alias = _base_alias or self + self._use_mapper_path = _use_mapper_path + + self._adapter = sql_util.ColumnAdapter( + selectable, equivalents=mapper._equivalent_columns, + adapt_on_names=adapt_on_names, anonymize_labels=True) + + self._adapt_on_names = adapt_on_names + self._target = mapper.class_ + + for poly in self.with_polymorphic_mappers: + if poly is not mapper: + setattr(self.entity, poly.class_.__name__, + AliasedClass(poly.class_, selectable, base_alias=self, + adapt_on_names=adapt_on_names, + use_mapper_path=_use_mapper_path)) + + is_aliased_class = True + "always returns True" + + @property + def class_(self): + """Return the mapped class ultimately represented by this + :class:`.AliasedInsp`.""" + return self.mapper.class_ + + @util.memoized_property + def _path_registry(self): + if self._use_mapper_path: + return self.mapper._path_registry + else: + return PathRegistry.per_mapper(self) + + def __getstate__(self): + return { + 'entity': self.entity, + 'mapper': self.mapper, + 'alias': self.selectable, + 'name': self.name, + 'adapt_on_names': self._adapt_on_names, + 'with_polymorphic_mappers': + self.with_polymorphic_mappers, + 'with_polymorphic_discriminator': + self.polymorphic_on, + 'base_alias': self._base_alias, + 'use_mapper_path': self._use_mapper_path + } + + def __setstate__(self, state): + self.__init__( + state['entity'], + state['mapper'], + state['alias'], + state['name'], + state['with_polymorphic_mappers'], + state['with_polymorphic_discriminator'], + state['base_alias'], + state['use_mapper_path'], + state['adapt_on_names'] + ) + + def _adapt_element(self, elem): + return self._adapter.traverse(elem).\ + _annotate({ + 'parententity': self, + 'parentmapper': self.mapper} + ) + + def _entity_for_mapper(self, mapper): + self_poly = self.with_polymorphic_mappers + if mapper in self_poly: + if mapper is self.mapper: + return self + else: + return getattr( + self.entity, mapper.class_.__name__)._aliased_insp + elif mapper.isa(self.mapper): + return self + else: + assert False, "mapper %s doesn't correspond to %s" % ( + mapper, self) + + @util.memoized_property + def _memoized_values(self): + return {} + + def _memo(self, key, callable_, *args, **kw): + if key in self._memoized_values: + return self._memoized_values[key] + else: + self._memoized_values[key] = value = callable_(*args, **kw) + return value + + def __repr__(self): + if self.with_polymorphic_mappers: + with_poly = "(%s)" % ", ".join( + mp.class_.__name__ for mp in self.with_polymorphic_mappers) + else: + with_poly = "" + return '' % ( + id(self), self.class_.__name__, with_poly) + + +inspection._inspects(AliasedClass)(lambda target: target._aliased_insp) +inspection._inspects(AliasedInsp)(lambda target: target) + + +def aliased(element, alias=None, name=None, flat=False, adapt_on_names=False): + """Produce an alias of the given element, usually an :class:`.AliasedClass` + instance. + + E.g.:: + + my_alias = aliased(MyClass) + + session.query(MyClass, my_alias).filter(MyClass.id > my_alias.id) + + The :func:`.aliased` function is used to create an ad-hoc mapping + of a mapped class to a new selectable. By default, a selectable + is generated from the normally mapped selectable (typically a + :class:`.Table`) using the :meth:`.FromClause.alias` method. + However, :func:`.aliased` can also be used to link the class to + a new :func:`.select` statement. Also, the :func:`.with_polymorphic` + function is a variant of :func:`.aliased` that is intended to specify + a so-called "polymorphic selectable", that corresponds to the union + of several joined-inheritance subclasses at once. + + For convenience, the :func:`.aliased` function also accepts plain + :class:`.FromClause` constructs, such as a :class:`.Table` or + :func:`.select` construct. In those cases, the :meth:`.FromClause.alias` + method is called on the object and the new :class:`.Alias` object + returned. The returned :class:`.Alias` is not ORM-mapped in this case. + + :param element: element to be aliased. Is normally a mapped class, + but for convenience can also be a :class:`.FromClause` element. + + :param alias: Optional selectable unit to map the element to. This should + normally be a :class:`.Alias` object corresponding to the :class:`.Table` + to which the class is mapped, or to a :func:`.select` construct that + is compatible with the mapping. By default, a simple anonymous + alias of the mapped table is generated. + + :param name: optional string name to use for the alias, if not specified + by the ``alias`` parameter. The name, among other things, forms the + attribute name that will be accessible via tuples returned by a + :class:`.Query` object. + + :param flat: Boolean, will be passed through to the + :meth:`.FromClause.alias` call so that aliases of :class:`.Join` objects + don't include an enclosing SELECT. This can lead to more efficient + queries in many circumstances. A JOIN against a nested JOIN will be + rewritten as a JOIN against an aliased SELECT subquery on backends that + don't support this syntax. + + .. versionadded:: 0.9.0 + + .. seealso:: :meth:`.Join.alias` + + :param adapt_on_names: if True, more liberal "matching" will be used when + mapping the mapped columns of the ORM entity to those of the + given selectable - a name-based match will be performed if the + given selectable doesn't otherwise have a column that corresponds + to one on the entity. The use case for this is when associating + an entity with some derived selectable such as one that uses + aggregate functions:: + + class UnitPrice(Base): + __tablename__ = 'unit_price' + ... + unit_id = Column(Integer) + price = Column(Numeric) + + aggregated_unit_price = Session.query( + func.sum(UnitPrice.price).label('price') + ).group_by(UnitPrice.unit_id).subquery() + + aggregated_unit_price = aliased(UnitPrice, + alias=aggregated_unit_price, adapt_on_names=True) + + Above, functions on ``aggregated_unit_price`` which refer to + ``.price`` will return the + ``func.sum(UnitPrice.price).label('price')`` column, as it is + matched on the name "price". Ordinarily, the "price" function + wouldn't have any "column correspondence" to the actual + ``UnitPrice.price`` column as it is not a proxy of the original. + + .. versionadded:: 0.7.3 + + + """ + if isinstance(element, expression.FromClause): + if adapt_on_names: + raise sa_exc.ArgumentError( + "adapt_on_names only applies to ORM elements" + ) + return element.alias(name, flat=flat) + else: + return AliasedClass(element, alias=alias, flat=flat, + name=name, adapt_on_names=adapt_on_names) + + +def with_polymorphic(base, classes, selectable=False, + flat=False, + polymorphic_on=None, aliased=False, + innerjoin=False, _use_mapper_path=False, + _existing_alias=None): + """Produce an :class:`.AliasedClass` construct which specifies + columns for descendant mappers of the given base. + + .. versionadded:: 0.8 + :func:`.orm.with_polymorphic` is in addition to the existing + :class:`.Query` method :meth:`.Query.with_polymorphic`, + which has the same purpose but is not as flexible in its usage. + + Using this method will ensure that each descendant mapper's + tables are included in the FROM clause, and will allow filter() + criterion to be used against those tables. The resulting + instances will also have those columns already loaded so that + no "post fetch" of those columns will be required. + + See the examples at :ref:`with_polymorphic`. + + :param base: Base class to be aliased. + + :param classes: a single class or mapper, or list of + class/mappers, which inherit from the base class. + Alternatively, it may also be the string ``'*'``, in which case + all descending mapped classes will be added to the FROM clause. + + :param aliased: when True, the selectable will be wrapped in an + alias, that is ``(SELECT * FROM ) AS anon_1``. + This can be important when using the with_polymorphic() + to create the target of a JOIN on a backend that does not + support parenthesized joins, such as SQLite and older + versions of MySQL. + + :param flat: Boolean, will be passed through to the + :meth:`.FromClause.alias` call so that aliases of :class:`.Join` + objects don't include an enclosing SELECT. This can lead to more + efficient queries in many circumstances. A JOIN against a nested JOIN + will be rewritten as a JOIN against an aliased SELECT subquery on + backends that don't support this syntax. + + Setting ``flat`` to ``True`` implies the ``aliased`` flag is + also ``True``. + + .. versionadded:: 0.9.0 + + .. seealso:: :meth:`.Join.alias` + + :param selectable: a table or select() statement that will + be used in place of the generated FROM clause. This argument is + required if any of the desired classes use concrete table + inheritance, since SQLAlchemy currently cannot generate UNIONs + among tables automatically. If used, the ``selectable`` argument + must represent the full set of tables and columns mapped by every + mapped class. Otherwise, the unaccounted mapped columns will + result in their table being appended directly to the FROM clause + which will usually lead to incorrect results. + + :param polymorphic_on: a column to be used as the "discriminator" + column for the given selectable. If not given, the polymorphic_on + attribute of the base classes' mapper will be used, if any. This + is useful for mappings that don't have polymorphic loading + behavior by default. + + :param innerjoin: if True, an INNER JOIN will be used. This should + only be specified if querying for one specific subtype only + """ + primary_mapper = _class_to_mapper(base) + if _existing_alias: + assert _existing_alias.mapper is primary_mapper + classes = util.to_set(classes) + new_classes = set([ + mp.class_ for mp in + _existing_alias.with_polymorphic_mappers]) + if classes == new_classes: + return _existing_alias + else: + classes = classes.union(new_classes) + mappers, selectable = primary_mapper.\ + _with_polymorphic_args(classes, selectable, + innerjoin=innerjoin) + if aliased or flat: + selectable = selectable.alias(flat=flat) + return AliasedClass(base, + selectable, + with_polymorphic_mappers=mappers, + with_polymorphic_discriminator=polymorphic_on, + use_mapper_path=_use_mapper_path) + + +def _orm_annotate(element, exclude=None): + """Deep copy the given ClauseElement, annotating each element with the + "_orm_adapt" flag. + + Elements within the exclude collection will be cloned but not annotated. + + """ + return sql_util._deep_annotate(element, {'_orm_adapt': True}, exclude) + + +def _orm_deannotate(element): + """Remove annotations that link a column to a particular mapping. + + Note this doesn't affect "remote" and "foreign" annotations + passed by the :func:`.orm.foreign` and :func:`.orm.remote` + annotators. + + """ + + return sql_util._deep_deannotate(element, + values=("_orm_adapt", "parententity") + ) + + +def _orm_full_deannotate(element): + return sql_util._deep_deannotate(element) + + +class _ORMJoin(expression.Join): + """Extend Join to support ORM constructs as input.""" + + __visit_name__ = expression.Join.__visit_name__ + + def __init__( + self, + left, right, onclause=None, isouter=False, + full=False, _left_memo=None, _right_memo=None): + + left_info = inspection.inspect(left) + left_orm_info = getattr(left, '_joined_from_info', left_info) + + right_info = inspection.inspect(right) + adapt_to = right_info.selectable + + self._joined_from_info = right_info + + self._left_memo = _left_memo + self._right_memo = _right_memo + + if isinstance(onclause, util.string_types): + onclause = getattr(left_orm_info.entity, onclause) + + if isinstance(onclause, attributes.QueryableAttribute): + on_selectable = onclause.comparator._source_selectable() + prop = onclause.property + elif isinstance(onclause, MapperProperty): + prop = onclause + on_selectable = prop.parent.selectable + else: + prop = None + + if prop: + if sql_util.clause_is_present( + on_selectable, left_info.selectable): + adapt_from = on_selectable + else: + adapt_from = left_info.selectable + + pj, sj, source, dest, \ + secondary, target_adapter = prop._create_joins( + source_selectable=adapt_from, + dest_selectable=adapt_to, + source_polymorphic=True, + dest_polymorphic=True, + of_type=right_info.mapper) + + if sj is not None: + if isouter: + # note this is an inner join from secondary->right + right = sql.join(secondary, right, sj) + onclause = pj + else: + left = sql.join(left, secondary, pj, isouter) + onclause = sj + else: + onclause = pj + self._target_adapter = target_adapter + + expression.Join.__init__(self, left, right, onclause, isouter, full) + + if not prop and getattr(right_info, 'mapper', None) \ + and right_info.mapper.single: + # if single inheritance target and we are using a manual + # or implicit ON clause, augment it the same way we'd augment the + # WHERE. + single_crit = right_info.mapper._single_table_criterion + if single_crit is not None: + if right_info.is_aliased_class: + single_crit = right_info._adapter.traverse(single_crit) + self.onclause = self.onclause & single_crit + + def _splice_into_center(self, other): + """Splice a join into the center. + + Given join(a, b) and join(b, c), return join(a, b).join(c) + + """ + leftmost = other + while isinstance(leftmost, sql.Join): + leftmost = leftmost.left + + assert self.right is leftmost + + left = _ORMJoin( + self.left, other.left, + self.onclause, isouter=self.isouter, + _left_memo=self._left_memo, + _right_memo=other._left_memo + ) + + return _ORMJoin( + left, + other.right, + other.onclause, isouter=other.isouter, + _right_memo=other._right_memo + ) + + def join( + self, right, onclause=None, + isouter=False, full=False, join_to_left=None): + return _ORMJoin(self, right, onclause, full, isouter) + + def outerjoin( + self, right, onclause=None, + full=False, join_to_left=None): + return _ORMJoin(self, right, onclause, True, full=full) + + +def join( + left, right, onclause=None, isouter=False, + full=False, join_to_left=None): + r"""Produce an inner join between left and right clauses. + + :func:`.orm.join` is an extension to the core join interface + provided by :func:`.sql.expression.join()`, where the + left and right selectables may be not only core selectable + objects such as :class:`.Table`, but also mapped classes or + :class:`.AliasedClass` instances. The "on" clause can + be a SQL expression, or an attribute or string name + referencing a configured :func:`.relationship`. + + :func:`.orm.join` is not commonly needed in modern usage, + as its functionality is encapsulated within that of the + :meth:`.Query.join` method, which features a + significant amount of automation beyond :func:`.orm.join` + by itself. Explicit usage of :func:`.orm.join` + with :class:`.Query` involves usage of the + :meth:`.Query.select_from` method, as in:: + + from sqlalchemy.orm import join + session.query(User).\ + select_from(join(User, Address, User.addresses)).\ + filter(Address.email_address=='foo@bar.com') + + In modern SQLAlchemy the above join can be written more + succinctly as:: + + session.query(User).\ + join(User.addresses).\ + filter(Address.email_address=='foo@bar.com') + + See :meth:`.Query.join` for information on modern usage + of ORM level joins. + + .. versionchanged:: 0.8.1 - the ``join_to_left`` parameter + is no longer used, and is deprecated. + + """ + return _ORMJoin(left, right, onclause, isouter, full) + + +def outerjoin(left, right, onclause=None, full=False, join_to_left=None): + """Produce a left outer join between left and right clauses. + + This is the "outer join" version of the :func:`.orm.join` function, + featuring the same behavior except that an OUTER JOIN is generated. + See that function's documentation for other usage details. + + """ + return _ORMJoin(left, right, onclause, True, full) + + +def with_parent(instance, prop): + """Create filtering criterion that relates this query's primary entity + to the given related instance, using established :func:`.relationship()` + configuration. + + The SQL rendered is the same as that rendered when a lazy loader + would fire off from the given parent on that attribute, meaning + that the appropriate state is taken from the parent object in + Python without the need to render joins to the parent table + in the rendered statement. + + .. versionchanged:: 0.6.4 + This method accepts parent instances in all + persistence states, including transient, persistent, and detached. + Only the requisite primary key/foreign key attributes need to + be populated. Previous versions didn't work with transient + instances. + + :param instance: + An instance which has some :func:`.relationship`. + + :param property: + String property name, or class-bound attribute, which indicates + what relationship from the instance should be used to reconcile the + parent/child relationship. + + """ + if isinstance(prop, util.string_types): + mapper = object_mapper(instance) + prop = getattr(mapper.class_, prop).property + elif isinstance(prop, attributes.QueryableAttribute): + prop = prop.property + + return prop._with_parent(instance) + + +def has_identity(object): + """Return True if the given object has a database + identity. + + This typically corresponds to the object being + in either the persistent or detached state. + + .. seealso:: + + :func:`.was_deleted` + + """ + state = attributes.instance_state(object) + return state.has_identity + + +def was_deleted(object): + """Return True if the given object was deleted + within a session flush. + + This is regardless of whether or not the object is + persistent or detached. + + .. versionadded:: 0.8.0 + + .. seealso:: + + :attr:`.InstanceState.was_deleted` + + """ + + state = attributes.instance_state(object) + return state.was_deleted + + +def randomize_unitofwork(): + """Use random-ordering sets within the unit of work in order + to detect unit of work sorting issues. + + This is a utility function that can be used to help reproduce + inconsistent unit of work sorting issues. For example, + if two kinds of objects A and B are being inserted, and + B has a foreign key reference to A - the A must be inserted first. + However, if there is no relationship between A and B, the unit of work + won't know to perform this sorting, and an operation may or may not + fail, depending on how the ordering works out. Since Python sets + and dictionaries have non-deterministic ordering, such an issue may + occur on some runs and not on others, and in practice it tends to + have a great dependence on the state of the interpreter. This leads + to so-called "heisenbugs" where changing entirely irrelevant aspects + of the test program still cause the failure behavior to change. + + By calling ``randomize_unitofwork()`` when a script first runs, the + ordering of a key series of sets within the unit of work implementation + are randomized, so that the script can be minimized down to the + fundamental mapping and operation that's failing, while still reproducing + the issue on at least some runs. + + This utility is also available when running the test suite via the + ``--reversetop`` flag. + + .. versionadded:: 0.8.1 created a standalone version of the + ``--reversetop`` feature. + + """ + from sqlalchemy.orm import unitofwork, session, mapper, dependency + from sqlalchemy.util import topological + from sqlalchemy.testing.util import RandomSet + topological.set = unitofwork.set = session.set = mapper.set = \ + dependency.set = RandomSet diff --git a/app/lib/sqlalchemy/pool.py b/app/lib/sqlalchemy/pool.py new file mode 100644 index 0000000..b58fdaa --- /dev/null +++ b/app/lib/sqlalchemy/pool.py @@ -0,0 +1,1445 @@ +# sqlalchemy/pool.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + + +"""Connection pooling for DB-API connections. + +Provides a number of connection pool implementations for a variety of +usage scenarios and thread behavior requirements imposed by the +application, DB-API or database itself. + +Also provides a DB-API 2.0 connection proxying mechanism allowing +regular DB-API connect() methods to be transparently managed by a +SQLAlchemy connection pool. +""" + +import time +import traceback +import weakref + +from . import exc, log, event, interfaces, util +from .util import queue as sqla_queue +from .util import threading, memoized_property, \ + chop_traceback + +from collections import deque +proxies = {} + + +def manage(module, **params): + r"""Return a proxy for a DB-API module that automatically + pools connections. + + Given a DB-API 2.0 module and pool management parameters, returns + a proxy for the module that will automatically pool connections, + creating new connection pools for each distinct set of connection + arguments sent to the decorated module's connect() function. + + :param module: a DB-API 2.0 database module + + :param poolclass: the class used by the pool module to provide + pooling. Defaults to :class:`.QueuePool`. + + :param \**params: will be passed through to *poolclass* + + """ + try: + return proxies[module] + except KeyError: + return proxies.setdefault(module, _DBProxy(module, **params)) + + +def clear_managers(): + """Remove all current DB-API 2.0 managers. + + All pools and connections are disposed. + """ + + for manager in proxies.values(): + manager.close() + proxies.clear() + +reset_rollback = util.symbol('reset_rollback') +reset_commit = util.symbol('reset_commit') +reset_none = util.symbol('reset_none') + + +class _ConnDialect(object): + + """partial implementation of :class:`.Dialect` + which provides DBAPI connection methods. + + When a :class:`.Pool` is combined with an :class:`.Engine`, + the :class:`.Engine` replaces this with its own + :class:`.Dialect`. + + """ + + def do_rollback(self, dbapi_connection): + dbapi_connection.rollback() + + def do_commit(self, dbapi_connection): + dbapi_connection.commit() + + def do_close(self, dbapi_connection): + dbapi_connection.close() + + +class Pool(log.Identified): + + """Abstract base class for connection pools.""" + + _dialect = _ConnDialect() + + def __init__(self, + creator, recycle=-1, echo=None, + use_threadlocal=False, + logging_name=None, + reset_on_return=True, + listeners=None, + events=None, + dialect=None, + _dispatch=None): + """ + Construct a Pool. + + :param creator: a callable function that returns a DB-API + connection object. The function will be called with + parameters. + + :param recycle: If set to non -1, number of seconds between + connection recycling, which means upon checkout, if this + timeout is surpassed the connection will be closed and + replaced with a newly opened connection. Defaults to -1. + + :param logging_name: String identifier which will be used within + the "name" field of logging records generated within the + "sqlalchemy.pool" logger. Defaults to a hexstring of the object's + id. + + :param echo: If True, connections being pulled and retrieved + from the pool will be logged to the standard output, as well + as pool sizing information. Echoing can also be achieved by + enabling logging for the "sqlalchemy.pool" + namespace. Defaults to False. + + :param use_threadlocal: If set to True, repeated calls to + :meth:`connect` within the same application thread will be + guaranteed to return the same connection object, if one has + already been retrieved from the pool and has not been + returned yet. Offers a slight performance advantage at the + cost of individual transactions by default. The + :meth:`.Pool.unique_connection` method is provided to return + a consistently unique connection to bypass this behavior + when the flag is set. + + .. warning:: The :paramref:`.Pool.use_threadlocal` flag + **does not affect the behavior** of :meth:`.Engine.connect`. + :meth:`.Engine.connect` makes use of the + :meth:`.Pool.unique_connection` method which **does not use thread + local context**. To produce a :class:`.Connection` which refers + to the :meth:`.Pool.connect` method, use + :meth:`.Engine.contextual_connect`. + + Note that other SQLAlchemy connectivity systems such as + :meth:`.Engine.execute` as well as the orm + :class:`.Session` make use of + :meth:`.Engine.contextual_connect` internally, so these functions + are compatible with the :paramref:`.Pool.use_threadlocal` setting. + + .. seealso:: + + :ref:`threadlocal_strategy` - contains detail on the + "threadlocal" engine strategy, which provides a more comprehensive + approach to "threadlocal" connectivity for the specific + use case of using :class:`.Engine` and :class:`.Connection` objects + directly. + + :param reset_on_return: Determine steps to take on + connections as they are returned to the pool. + reset_on_return can have any of these values: + + * ``"rollback"`` - call rollback() on the connection, + to release locks and transaction resources. + This is the default value. The vast majority + of use cases should leave this value set. + * ``True`` - same as 'rollback', this is here for + backwards compatibility. + * ``"commit"`` - call commit() on the connection, + to release locks and transaction resources. + A commit here may be desirable for databases that + cache query plans if a commit is emitted, + such as Microsoft SQL Server. However, this + value is more dangerous than 'rollback' because + any data changes present on the transaction + are committed unconditionally. + * ``None`` - don't do anything on the connection. + This setting should only be made on a database + that has no transaction support at all, + namely MySQL MyISAM. By not doing anything, + performance can be improved. This + setting should **never be selected** for a + database that supports transactions, + as it will lead to deadlocks and stale + state. + * ``"none"`` - same as ``None`` + + .. versionadded:: 0.9.10 + + * ``False`` - same as None, this is here for + backwards compatibility. + + .. versionchanged:: 0.7.6 + :paramref:`.Pool.reset_on_return` accepts ``"rollback"`` + and ``"commit"`` arguments. + + :param events: a list of 2-tuples, each of the form + ``(callable, target)`` which will be passed to :func:`.event.listen` + upon construction. Provided here so that event listeners + can be assigned via :func:`.create_engine` before dialect-level + listeners are applied. + + :param listeners: Deprecated. A list of + :class:`~sqlalchemy.interfaces.PoolListener`-like objects or + dictionaries of callables that receive events when DB-API + connections are created, checked out and checked in to the + pool. This has been superseded by + :func:`~sqlalchemy.event.listen`. + + :param dialect: a :class:`.Dialect` that will handle the job + of calling rollback(), close(), or commit() on DBAPI connections. + If omitted, a built-in "stub" dialect is used. Applications that + make use of :func:`~.create_engine` should not use this parameter + as it is handled by the engine creation strategy. + + .. versionadded:: 1.1 - ``dialect`` is now a public parameter + to the :class:`.Pool`. + + """ + if logging_name: + self.logging_name = self._orig_logging_name = logging_name + else: + self._orig_logging_name = None + + log.instance_logger(self, echoflag=echo) + self._threadconns = threading.local() + self._creator = creator + self._recycle = recycle + self._invalidate_time = 0 + self._use_threadlocal = use_threadlocal + if reset_on_return in ('rollback', True, reset_rollback): + self._reset_on_return = reset_rollback + elif reset_on_return in ('none', None, False, reset_none): + self._reset_on_return = reset_none + elif reset_on_return in ('commit', reset_commit): + self._reset_on_return = reset_commit + else: + raise exc.ArgumentError( + "Invalid value for 'reset_on_return': %r" + % reset_on_return) + + self.echo = echo + + if _dispatch: + self.dispatch._update(_dispatch, only_propagate=False) + if dialect: + self._dialect = dialect + if events: + for fn, target in events: + event.listen(self, target, fn) + if listeners: + util.warn_deprecated( + "The 'listeners' argument to Pool (and " + "create_engine()) is deprecated. Use event.listen().") + for l in listeners: + self.add_listener(l) + + @property + def _creator(self): + return self.__dict__['_creator'] + + @_creator.setter + def _creator(self, creator): + self.__dict__['_creator'] = creator + self._invoke_creator = self._should_wrap_creator(creator) + + def _should_wrap_creator(self, creator): + """Detect if creator accepts a single argument, or is sent + as a legacy style no-arg function. + + """ + + try: + argspec = util.get_callable_argspec(self._creator, no_self=True) + except TypeError: + return lambda crec: creator() + + defaulted = argspec[3] is not None and len(argspec[3]) or 0 + positionals = len(argspec[0]) - defaulted + + # look for the exact arg signature that DefaultStrategy + # sends us + if (argspec[0], argspec[3]) == (['connection_record'], (None,)): + return creator + # or just a single positional + elif positionals == 1: + return creator + # all other cases, just wrap and assume legacy "creator" callable + # thing + else: + return lambda crec: creator() + + def _close_connection(self, connection): + self.logger.debug("Closing connection %r", connection) + + try: + self._dialect.do_close(connection) + except Exception: + self.logger.error("Exception closing connection %r", + connection, exc_info=True) + + @util.deprecated( + 2.7, "Pool.add_listener is deprecated. Use event.listen()") + def add_listener(self, listener): + """Add a :class:`.PoolListener`-like object to this pool. + + ``listener`` may be an object that implements some or all of + PoolListener, or a dictionary of callables containing implementations + of some or all of the named methods in PoolListener. + + """ + interfaces.PoolListener._adapt_listener(self, listener) + + def unique_connection(self): + """Produce a DBAPI connection that is not referenced by any + thread-local context. + + This method is equivalent to :meth:`.Pool.connect` when the + :paramref:`.Pool.use_threadlocal` flag is not set to True. + When :paramref:`.Pool.use_threadlocal` is True, the + :meth:`.Pool.unique_connection` method provides a means of bypassing + the threadlocal context. + + """ + return _ConnectionFairy._checkout(self) + + def _create_connection(self): + """Called by subclasses to create a new ConnectionRecord.""" + + return _ConnectionRecord(self) + + def _invalidate(self, connection, exception=None): + """Mark all connections established within the generation + of the given connection as invalidated. + + If this pool's last invalidate time is before when the given + connection was created, update the timestamp til now. Otherwise, + no action is performed. + + Connections with a start time prior to this pool's invalidation + time will be recycled upon next checkout. + """ + + rec = getattr(connection, "_connection_record", None) + if not rec or self._invalidate_time < rec.starttime: + self._invalidate_time = time.time() + if getattr(connection, 'is_valid', False): + connection.invalidate(exception) + + def recreate(self): + """Return a new :class:`.Pool`, of the same class as this one + and configured with identical creation arguments. + + This method is used in conjunction with :meth:`dispose` + to close out an entire :class:`.Pool` and create a new one in + its place. + + """ + + raise NotImplementedError() + + def dispose(self): + """Dispose of this pool. + + This method leaves the possibility of checked-out connections + remaining open, as it only affects connections that are + idle in the pool. + + See also the :meth:`Pool.recreate` method. + + """ + + raise NotImplementedError() + + def connect(self): + """Return a DBAPI connection from the pool. + + The connection is instrumented such that when its + ``close()`` method is called, the connection will be returned to + the pool. + + """ + if not self._use_threadlocal: + return _ConnectionFairy._checkout(self) + + try: + rec = self._threadconns.current() + except AttributeError: + pass + else: + if rec is not None: + return rec._checkout_existing() + + return _ConnectionFairy._checkout(self, self._threadconns) + + def _return_conn(self, record): + """Given a _ConnectionRecord, return it to the :class:`.Pool`. + + This method is called when an instrumented DBAPI connection + has its ``close()`` method called. + + """ + if self._use_threadlocal: + try: + del self._threadconns.current + except AttributeError: + pass + self._do_return_conn(record) + + def _do_get(self): + """Implementation for :meth:`get`, supplied by subclasses.""" + + raise NotImplementedError() + + def _do_return_conn(self, conn): + """Implementation for :meth:`return_conn`, supplied by subclasses.""" + + raise NotImplementedError() + + def status(self): + raise NotImplementedError() + + +class _ConnectionRecord(object): + + """Internal object which maintains an individual DBAPI connection + referenced by a :class:`.Pool`. + + The :class:`._ConnectionRecord` object always exists for any particular + DBAPI connection whether or not that DBAPI connection has been + "checked out". This is in contrast to the :class:`._ConnectionFairy` + which is only a public facade to the DBAPI connection while it is checked + out. + + A :class:`._ConnectionRecord` may exist for a span longer than that + of a single DBAPI connection. For example, if the + :meth:`._ConnectionRecord.invalidate` + method is called, the DBAPI connection associated with this + :class:`._ConnectionRecord` + will be discarded, but the :class:`._ConnectionRecord` may be used again, + in which case a new DBAPI connection is produced when the :class:`.Pool` + next uses this record. + + The :class:`._ConnectionRecord` is delivered along with connection + pool events, including :meth:`.PoolEvents.connect` and + :meth:`.PoolEvents.checkout`, however :class:`._ConnectionRecord` still + remains an internal object whose API and internals may change. + + .. seealso:: + + :class:`._ConnectionFairy` + + """ + + def __init__(self, pool, connect=True): + self.__pool = pool + if connect: + self.__connect(first_connect_check=True) + self.finalize_callback = deque() + + fairy_ref = None + + starttime = None + + connection = None + """A reference to the actual DBAPI connection being tracked. + + May be ``None`` if this :class:`._ConnectionRecord` has been marked + as invalidated; a new DBAPI connection may replace it if the owning + pool calls upon this :class:`._ConnectionRecord` to reconnect. + + """ + + _soft_invalidate_time = 0 + + @util.memoized_property + def info(self): + """The ``.info`` dictionary associated with the DBAPI connection. + + This dictionary is shared among the :attr:`._ConnectionFairy.info` + and :attr:`.Connection.info` accessors. + + .. note:: + + The lifespan of this dictionary is linked to the + DBAPI connection itself, meaning that it is **discarded** each time + the DBAPI connection is closed and/or invalidated. The + :attr:`._ConnectionRecord.record_info` dictionary remains + persistent throughout the lifespan of the + :class:`._ConnectionRecord` container. + + """ + return {} + + @util.memoized_property + def record_info(self): + """An "info' dictionary associated with the connection record + itself. + + Unlike the :attr:`._ConnectionRecord.info` dictionary, which is linked + to the lifespan of the DBAPI connection, this dictionary is linked + to the lifespan of the :class:`._ConnectionRecord` container itself + and will remain persisent throughout the life of the + :class:`._ConnectionRecord`. + + .. versionadded:: 1.1 + + """ + return {} + + @classmethod + def checkout(cls, pool): + rec = pool._do_get() + try: + dbapi_connection = rec.get_connection() + except: + with util.safe_reraise(): + rec.checkin() + echo = pool._should_log_debug() + fairy = _ConnectionFairy(dbapi_connection, rec, echo) + rec.fairy_ref = weakref.ref( + fairy, + lambda ref: _finalize_fairy and + _finalize_fairy( + dbapi_connection, + rec, pool, ref, echo) + ) + _refs.add(rec) + if echo: + pool.logger.debug("Connection %r checked out from pool", + dbapi_connection) + return fairy + + def checkin(self): + self.fairy_ref = None + connection = self.connection + pool = self.__pool + while self.finalize_callback: + finalizer = self.finalize_callback.pop() + finalizer(connection) + if pool.dispatch.checkin: + pool.dispatch.checkin(connection, self) + pool._return_conn(self) + + @property + def in_use(self): + return self.fairy_ref is not None + + @property + def last_connect_time(self): + return self.starttime + + def close(self): + if self.connection is not None: + self.__close() + + def invalidate(self, e=None, soft=False): + """Invalidate the DBAPI connection held by this :class:`._ConnectionRecord`. + + This method is called for all connection invalidations, including + when the :meth:`._ConnectionFairy.invalidate` or + :meth:`.Connection.invalidate` methods are called, as well as when any + so-called "automatic invalidation" condition occurs. + + :param e: an exception object indicating a reason for the invalidation. + + :param soft: if True, the connection isn't closed; instead, this + connection will be recycled on next checkout. + + .. versionadded:: 1.0.3 + + .. seealso:: + + :ref:`pool_connection_invalidation` + + """ + # already invalidated + if self.connection is None: + return + if soft: + self.__pool.dispatch.soft_invalidate(self.connection, self, e) + else: + self.__pool.dispatch.invalidate(self.connection, self, e) + if e is not None: + self.__pool.logger.info( + "%sInvalidate connection %r (reason: %s:%s)", + "Soft " if soft else "", + self.connection, e.__class__.__name__, e) + else: + self.__pool.logger.info( + "%sInvalidate connection %r", + "Soft " if soft else "", + self.connection) + if soft: + self._soft_invalidate_time = time.time() + else: + self.__close() + self.connection = None + + def get_connection(self): + recycle = False + if self.connection is None: + self.info.clear() + self.__connect() + elif self.__pool._recycle > -1 and \ + time.time() - self.starttime > self.__pool._recycle: + self.__pool.logger.info( + "Connection %r exceeded timeout; recycling", + self.connection) + recycle = True + elif self.__pool._invalidate_time > self.starttime: + self.__pool.logger.info( + "Connection %r invalidated due to pool invalidation; " + + "recycling", + self.connection + ) + recycle = True + elif self._soft_invalidate_time > self.starttime: + self.__pool.logger.info( + "Connection %r invalidated due to local soft invalidation; " + + "recycling", + self.connection + ) + recycle = True + + if recycle: + self.__close() + self.info.clear() + + self.__connect() + return self.connection + + def __close(self): + self.finalize_callback.clear() + if self.__pool.dispatch.close: + self.__pool.dispatch.close(self.connection, self) + self.__pool._close_connection(self.connection) + self.connection = None + + def __connect(self, first_connect_check=False): + pool = self.__pool + + # ensure any existing connection is removed, so that if + # creator fails, this attribute stays None + self.connection = None + try: + self.starttime = time.time() + connection = pool._invoke_creator(self) + pool.logger.debug("Created new connection %r", connection) + self.connection = connection + except Exception as e: + pool.logger.debug("Error on connect(): %s", e) + raise + else: + if first_connect_check: + pool.dispatch.first_connect.\ + for_modify(pool.dispatch).\ + exec_once(self.connection, self) + if pool.dispatch.connect: + pool.dispatch.connect(self.connection, self) + + +def _finalize_fairy(connection, connection_record, + pool, ref, echo, fairy=None): + """Cleanup for a :class:`._ConnectionFairy` whether or not it's already + been garbage collected. + + """ + _refs.discard(connection_record) + + if ref is not None and \ + connection_record.fairy_ref is not ref: + return + + if connection is not None: + if connection_record and echo: + pool.logger.debug("Connection %r being returned to pool", + connection) + + try: + fairy = fairy or _ConnectionFairy( + connection, connection_record, echo) + assert fairy.connection is connection + fairy._reset(pool) + + # Immediately close detached instances + if not connection_record: + if pool.dispatch.close_detached: + pool.dispatch.close_detached(connection) + pool._close_connection(connection) + except BaseException as e: + pool.logger.error( + "Exception during reset or similar", exc_info=True) + if connection_record: + connection_record.invalidate(e=e) + if not isinstance(e, Exception): + raise + + if connection_record: + connection_record.checkin() + + +_refs = set() + + +class _ConnectionFairy(object): + + """Proxies a DBAPI connection and provides return-on-dereference + support. + + This is an internal object used by the :class:`.Pool` implementation + to provide context management to a DBAPI connection delivered by + that :class:`.Pool`. + + The name "fairy" is inspired by the fact that the + :class:`._ConnectionFairy` object's lifespan is transitory, as it lasts + only for the length of a specific DBAPI connection being checked out from + the pool, and additionally that as a transparent proxy, it is mostly + invisible. + + .. seealso:: + + :class:`._ConnectionRecord` + + """ + + def __init__(self, dbapi_connection, connection_record, echo): + self.connection = dbapi_connection + self._connection_record = connection_record + self._echo = echo + + connection = None + """A reference to the actual DBAPI connection being tracked.""" + + _connection_record = None + """A reference to the :class:`._ConnectionRecord` object associated + with the DBAPI connection. + + This is currently an internal accessor which is subject to change. + + """ + + _reset_agent = None + """Refer to an object with a ``.commit()`` and ``.rollback()`` method; + if non-None, the "reset-on-return" feature will call upon this object + rather than directly against the dialect-level do_rollback() and + do_commit() methods. + + In practice, a :class:`.Connection` assigns a :class:`.Transaction` object + to this variable when one is in scope so that the :class:`.Transaction` + takes the job of committing or rolling back on return if + :meth:`.Connection.close` is called while the :class:`.Transaction` + still exists. + + This is essentially an "event handler" of sorts but is simplified as an + instance variable both for performance/simplicity as well as that there + can only be one "reset agent" at a time. + """ + + @classmethod + def _checkout(cls, pool, threadconns=None, fairy=None): + if not fairy: + fairy = _ConnectionRecord.checkout(pool) + + fairy._pool = pool + fairy._counter = 0 + + if threadconns is not None: + threadconns.current = weakref.ref(fairy) + + if fairy.connection is None: + raise exc.InvalidRequestError("This connection is closed") + fairy._counter += 1 + + if not pool.dispatch.checkout or fairy._counter != 1: + return fairy + + # Pool listeners can trigger a reconnection on checkout + attempts = 2 + while attempts > 0: + try: + pool.dispatch.checkout(fairy.connection, + fairy._connection_record, + fairy) + return fairy + except exc.DisconnectionError as e: + pool.logger.info( + "Disconnection detected on checkout: %s", e) + fairy._connection_record.invalidate(e) + try: + fairy.connection = \ + fairy._connection_record.get_connection() + except: + with util.safe_reraise(): + fairy._connection_record.checkin() + + attempts -= 1 + + pool.logger.info("Reconnection attempts exhausted on checkout") + fairy.invalidate() + raise exc.InvalidRequestError("This connection is closed") + + def _checkout_existing(self): + return _ConnectionFairy._checkout(self._pool, fairy=self) + + def _checkin(self): + _finalize_fairy(self.connection, self._connection_record, + self._pool, None, self._echo, fairy=self) + self.connection = None + self._connection_record = None + + _close = _checkin + + def _reset(self, pool): + if pool.dispatch.reset: + pool.dispatch.reset(self, self._connection_record) + if pool._reset_on_return is reset_rollback: + if self._echo: + pool.logger.debug("Connection %s rollback-on-return%s", + self.connection, + ", via agent" + if self._reset_agent else "") + if self._reset_agent: + self._reset_agent.rollback() + else: + pool._dialect.do_rollback(self) + elif pool._reset_on_return is reset_commit: + if self._echo: + pool.logger.debug("Connection %s commit-on-return%s", + self.connection, + ", via agent" + if self._reset_agent else "") + if self._reset_agent: + self._reset_agent.commit() + else: + pool._dialect.do_commit(self) + + @property + def _logger(self): + return self._pool.logger + + @property + def is_valid(self): + """Return True if this :class:`._ConnectionFairy` still refers + to an active DBAPI connection.""" + + return self.connection is not None + + @util.memoized_property + def info(self): + """Info dictionary associated with the underlying DBAPI connection + referred to by this :class:`.ConnectionFairy`, allowing user-defined + data to be associated with the connection. + + The data here will follow along with the DBAPI connection including + after it is returned to the connection pool and used again + in subsequent instances of :class:`._ConnectionFairy`. It is shared + with the :attr:`._ConnectionRecord.info` and :attr:`.Connection.info` + accessors. + + The dictionary associated with a particular DBAPI connection is + discarded when the connection itself is discarded. + + """ + return self._connection_record.info + + @property + def record_info(self): + """Info dictionary associated with the :class:`._ConnectionRecord + container referred to by this :class:`.ConnectionFairy`. + + Unlike the :attr:`._ConnectionFairy.info` dictionary, the lifespan + of this dictionary is persistent across connections that are + disconnected and/or invalidated within the lifespan of a + :class:`._ConnectionRecord`. + + .. versionadded:: 1.1 + + """ + if self._connection_record: + return self._connection_record.record_info + else: + return None + + def invalidate(self, e=None, soft=False): + """Mark this connection as invalidated. + + This method can be called directly, and is also called as a result + of the :meth:`.Connection.invalidate` method. When invoked, + the DBAPI connection is immediately closed and discarded from + further use by the pool. The invalidation mechanism proceeds + via the :meth:`._ConnectionRecord.invalidate` internal method. + + :param e: an exception object indicating a reason for the invalidation. + + :param soft: if True, the connection isn't closed; instead, this + connection will be recycled on next checkout. + + .. versionadded:: 1.0.3 + + .. seealso:: + + :ref:`pool_connection_invalidation` + + """ + + if self.connection is None: + util.warn("Can't invalidate an already-closed connection.") + return + if self._connection_record: + self._connection_record.invalidate(e=e, soft=soft) + if not soft: + self.connection = None + self._checkin() + + def cursor(self, *args, **kwargs): + """Return a new DBAPI cursor for the underlying connection. + + This method is a proxy for the ``connection.cursor()`` DBAPI + method. + + """ + return self.connection.cursor(*args, **kwargs) + + def __getattr__(self, key): + return getattr(self.connection, key) + + def detach(self): + """Separate this connection from its Pool. + + This means that the connection will no longer be returned to the + pool when closed, and will instead be literally closed. The + containing ConnectionRecord is separated from the DB-API connection, + and will create a new connection when next used. + + Note that any overall connection limiting constraints imposed by a + Pool implementation may be violated after a detach, as the detached + connection is removed from the pool's knowledge and control. + """ + + if self._connection_record is not None: + rec = self._connection_record + _refs.remove(rec) + rec.fairy_ref = None + rec.connection = None + # TODO: should this be _return_conn? + self._pool._do_return_conn(self._connection_record) + self.info = self.info.copy() + self._connection_record = None + + if self._pool.dispatch.detach: + self._pool.dispatch.detach(self.connection, rec) + + def close(self): + self._counter -= 1 + if self._counter == 0: + self._checkin() + + +class SingletonThreadPool(Pool): + + """A Pool that maintains one connection per thread. + + Maintains one connection per each thread, never moving a connection to a + thread other than the one which it was created in. + + .. warning:: the :class:`.SingletonThreadPool` will call ``.close()`` + on arbitrary connections that exist beyond the size setting of + ``pool_size``, e.g. if more unique **thread identities** + than what ``pool_size`` states are used. This cleanup is + non-deterministic and not sensitive to whether or not the connections + linked to those thread identities are currently in use. + + :class:`.SingletonThreadPool` may be improved in a future release, + however in its current status it is generally used only for test + scenarios using a SQLite ``:memory:`` database and is not recommended + for production use. + + + Options are the same as those of :class:`.Pool`, as well as: + + :param pool_size: The number of threads in which to maintain connections + at once. Defaults to five. + + :class:`.SingletonThreadPool` is used by the SQLite dialect + automatically when a memory-based database is used. + See :ref:`sqlite_toplevel`. + + """ + + def __init__(self, creator, pool_size=5, **kw): + kw['use_threadlocal'] = True + Pool.__init__(self, creator, **kw) + self._conn = threading.local() + self._all_conns = set() + self.size = pool_size + + def recreate(self): + self.logger.info("Pool recreating") + return self.__class__(self._creator, + pool_size=self.size, + recycle=self._recycle, + echo=self.echo, + logging_name=self._orig_logging_name, + use_threadlocal=self._use_threadlocal, + reset_on_return=self._reset_on_return, + _dispatch=self.dispatch, + dialect=self._dialect) + + def dispose(self): + """Dispose of this pool.""" + + for conn in self._all_conns: + try: + conn.close() + except Exception: + # pysqlite won't even let you close a conn from a thread + # that didn't create it + pass + + self._all_conns.clear() + + def _cleanup(self): + while len(self._all_conns) >= self.size: + c = self._all_conns.pop() + c.close() + + def status(self): + return "SingletonThreadPool id:%d size: %d" % \ + (id(self), len(self._all_conns)) + + def _do_return_conn(self, conn): + pass + + def _do_get(self): + try: + c = self._conn.current() + if c: + return c + except AttributeError: + pass + c = self._create_connection() + self._conn.current = weakref.ref(c) + if len(self._all_conns) >= self.size: + self._cleanup() + self._all_conns.add(c) + return c + + +class QueuePool(Pool): + + """A :class:`.Pool` that imposes a limit on the number of open connections. + + :class:`.QueuePool` is the default pooling implementation used for + all :class:`.Engine` objects, unless the SQLite dialect is in use. + + """ + + def __init__(self, creator, pool_size=5, max_overflow=10, timeout=30, + **kw): + r""" + Construct a QueuePool. + + :param creator: a callable function that returns a DB-API + connection object, same as that of :paramref:`.Pool.creator`. + + :param pool_size: The size of the pool to be maintained, + defaults to 5. This is the largest number of connections that + will be kept persistently in the pool. Note that the pool + begins with no connections; once this number of connections + is requested, that number of connections will remain. + ``pool_size`` can be set to 0 to indicate no size limit; to + disable pooling, use a :class:`~sqlalchemy.pool.NullPool` + instead. + + :param max_overflow: The maximum overflow size of the + pool. When the number of checked-out connections reaches the + size set in pool_size, additional connections will be + returned up to this limit. When those additional connections + are returned to the pool, they are disconnected and + discarded. It follows then that the total number of + simultaneous connections the pool will allow is pool_size + + `max_overflow`, and the total number of "sleeping" + connections the pool will allow is pool_size. `max_overflow` + can be set to -1 to indicate no overflow limit; no limit + will be placed on the total number of concurrent + connections. Defaults to 10. + + :param timeout: The number of seconds to wait before giving up + on returning a connection. Defaults to 30. + + :param \**kw: Other keyword arguments including + :paramref:`.Pool.recycle`, :paramref:`.Pool.echo`, + :paramref:`.Pool.reset_on_return` and others are passed to the + :class:`.Pool` constructor. + + """ + Pool.__init__(self, creator, **kw) + self._pool = sqla_queue.Queue(pool_size) + self._overflow = 0 - pool_size + self._max_overflow = max_overflow + self._timeout = timeout + self._overflow_lock = threading.Lock() + + def _do_return_conn(self, conn): + try: + self._pool.put(conn, False) + except sqla_queue.Full: + try: + conn.close() + finally: + self._dec_overflow() + + def _do_get(self): + use_overflow = self._max_overflow > -1 + + try: + wait = use_overflow and self._overflow >= self._max_overflow + return self._pool.get(wait, self._timeout) + except sqla_queue.Empty: + if use_overflow and self._overflow >= self._max_overflow: + if not wait: + return self._do_get() + else: + raise exc.TimeoutError( + "QueuePool limit of size %d overflow %d reached, " + "connection timed out, timeout %d" % + (self.size(), self.overflow(), self._timeout)) + + if self._inc_overflow(): + try: + return self._create_connection() + except: + with util.safe_reraise(): + self._dec_overflow() + else: + return self._do_get() + + def _inc_overflow(self): + if self._max_overflow == -1: + self._overflow += 1 + return True + with self._overflow_lock: + if self._overflow < self._max_overflow: + self._overflow += 1 + return True + else: + return False + + def _dec_overflow(self): + if self._max_overflow == -1: + self._overflow -= 1 + return True + with self._overflow_lock: + self._overflow -= 1 + return True + + def recreate(self): + self.logger.info("Pool recreating") + return self.__class__(self._creator, pool_size=self._pool.maxsize, + max_overflow=self._max_overflow, + timeout=self._timeout, + recycle=self._recycle, echo=self.echo, + logging_name=self._orig_logging_name, + use_threadlocal=self._use_threadlocal, + reset_on_return=self._reset_on_return, + _dispatch=self.dispatch, + dialect=self._dialect) + + def dispose(self): + while True: + try: + conn = self._pool.get(False) + conn.close() + except sqla_queue.Empty: + break + + self._overflow = 0 - self.size() + self.logger.info("Pool disposed. %s", self.status()) + + def status(self): + return "Pool size: %d Connections in pool: %d "\ + "Current Overflow: %d Current Checked out "\ + "connections: %d" % (self.size(), + self.checkedin(), + self.overflow(), + self.checkedout()) + + def size(self): + return self._pool.maxsize + + def checkedin(self): + return self._pool.qsize() + + def overflow(self): + return self._overflow + + def checkedout(self): + return self._pool.maxsize - self._pool.qsize() + self._overflow + + +class NullPool(Pool): + + """A Pool which does not pool connections. + + Instead it literally opens and closes the underlying DB-API connection + per each connection open/close. + + Reconnect-related functions such as ``recycle`` and connection + invalidation are not supported by this Pool implementation, since + no connections are held persistently. + + .. versionchanged:: 0.7 + :class:`.NullPool` is used by the SQlite dialect automatically + when a file-based database is used. See :ref:`sqlite_toplevel`. + + """ + + def status(self): + return "NullPool" + + def _do_return_conn(self, conn): + conn.close() + + def _do_get(self): + return self._create_connection() + + def recreate(self): + self.logger.info("Pool recreating") + + return self.__class__(self._creator, + recycle=self._recycle, + echo=self.echo, + logging_name=self._orig_logging_name, + use_threadlocal=self._use_threadlocal, + reset_on_return=self._reset_on_return, + _dispatch=self.dispatch, + dialect=self._dialect) + + def dispose(self): + pass + + +class StaticPool(Pool): + + """A Pool of exactly one connection, used for all requests. + + Reconnect-related functions such as ``recycle`` and connection + invalidation (which is also used to support auto-reconnect) are not + currently supported by this Pool implementation but may be implemented + in a future release. + + """ + + @memoized_property + def _conn(self): + return self._creator() + + @memoized_property + def connection(self): + return _ConnectionRecord(self) + + def status(self): + return "StaticPool" + + def dispose(self): + if '_conn' in self.__dict__: + self._conn.close() + self._conn = None + + def recreate(self): + self.logger.info("Pool recreating") + return self.__class__(creator=self._creator, + recycle=self._recycle, + use_threadlocal=self._use_threadlocal, + reset_on_return=self._reset_on_return, + echo=self.echo, + logging_name=self._orig_logging_name, + _dispatch=self.dispatch, + dialect=self._dialect) + + def _create_connection(self): + return self._conn + + def _do_return_conn(self, conn): + pass + + def _do_get(self): + return self.connection + + +class AssertionPool(Pool): + + """A :class:`.Pool` that allows at most one checked out connection at + any given time. + + This will raise an exception if more than one connection is checked out + at a time. Useful for debugging code that is using more connections + than desired. + + .. versionchanged:: 0.7 + :class:`.AssertionPool` also logs a traceback of where + the original connection was checked out, and reports + this in the assertion error raised. + + """ + + def __init__(self, *args, **kw): + self._conn = None + self._checked_out = False + self._store_traceback = kw.pop('store_traceback', True) + self._checkout_traceback = None + Pool.__init__(self, *args, **kw) + + def status(self): + return "AssertionPool" + + def _do_return_conn(self, conn): + if not self._checked_out: + raise AssertionError("connection is not checked out") + self._checked_out = False + assert conn is self._conn + + def dispose(self): + self._checked_out = False + if self._conn: + self._conn.close() + + def recreate(self): + self.logger.info("Pool recreating") + return self.__class__(self._creator, echo=self.echo, + logging_name=self._orig_logging_name, + _dispatch=self.dispatch, + dialect=self._dialect) + + def _do_get(self): + if self._checked_out: + if self._checkout_traceback: + suffix = ' at:\n%s' % ''.join( + chop_traceback(self._checkout_traceback)) + else: + suffix = '' + raise AssertionError("connection is already checked out" + suffix) + + if not self._conn: + self._conn = self._create_connection() + + self._checked_out = True + if self._store_traceback: + self._checkout_traceback = traceback.format_stack() + return self._conn + + +class _DBProxy(object): + + """Layers connection pooling behavior on top of a standard DB-API module. + + Proxies a DB-API 2.0 connect() call to a connection pool keyed to the + specific connect parameters. Other functions and attributes are delegated + to the underlying DB-API module. + """ + + def __init__(self, module, poolclass=QueuePool, **kw): + """Initializes a new proxy. + + module + a DB-API 2.0 module + + poolclass + a Pool class, defaulting to QueuePool + + Other parameters are sent to the Pool object's constructor. + + """ + + self.module = module + self.kw = kw + self.poolclass = poolclass + self.pools = {} + self._create_pool_mutex = threading.Lock() + + def close(self): + for key in list(self.pools): + del self.pools[key] + + def __del__(self): + self.close() + + def __getattr__(self, key): + return getattr(self.module, key) + + def get_pool(self, *args, **kw): + key = self._serialize(*args, **kw) + try: + return self.pools[key] + except KeyError: + self._create_pool_mutex.acquire() + try: + if key not in self.pools: + kw.pop('sa_pool_key', None) + pool = self.poolclass( + lambda: self.module.connect(*args, **kw), **self.kw) + self.pools[key] = pool + return pool + else: + return self.pools[key] + finally: + self._create_pool_mutex.release() + + def connect(self, *args, **kw): + """Activate a connection to the database. + + Connect to the database using this DBProxy's module and the given + connect arguments. If the arguments match an existing pool, the + connection will be returned from the pool's current thread-local + connection instance, or if there is no thread-local connection + instance it will be checked out from the set of pooled connections. + + If the pool has no available connections and allows new connections + to be created, a new database connection will be made. + + """ + + return self.get_pool(*args, **kw).connect() + + def dispose(self, *args, **kw): + """Dispose the pool referenced by the given connect arguments.""" + + key = self._serialize(*args, **kw) + try: + del self.pools[key] + except KeyError: + pass + + def _serialize(self, *args, **kw): + if "sa_pool_key" in kw: + return kw['sa_pool_key'] + + return tuple( + list(args) + + [(k, kw[k]) for k in sorted(kw)] + ) diff --git a/app/lib/sqlalchemy/processors.py b/app/lib/sqlalchemy/processors.py new file mode 100644 index 0000000..17f7ecc --- /dev/null +++ b/app/lib/sqlalchemy/processors.py @@ -0,0 +1,155 @@ +# sqlalchemy/processors.py +# Copyright (C) 2010-2017 the SQLAlchemy authors and contributors +# +# Copyright (C) 2010 Gaetan de Menten gdementen@gmail.com +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""defines generic type conversion functions, as used in bind and result +processors. + +They all share one common characteristic: None is passed through unchanged. + +""" + +import codecs +import re +import datetime +from . import util + + +def str_to_datetime_processor_factory(regexp, type_): + rmatch = regexp.match + # Even on python2.6 datetime.strptime is both slower than this code + # and it does not support microseconds. + has_named_groups = bool(regexp.groupindex) + + def process(value): + if value is None: + return None + else: + try: + m = rmatch(value) + except TypeError: + raise ValueError("Couldn't parse %s string '%r' " + "- value is not a string." % + (type_.__name__, value)) + if m is None: + raise ValueError("Couldn't parse %s string: " + "'%s'" % (type_.__name__, value)) + if has_named_groups: + groups = m.groupdict(0) + return type_(**dict(list(zip( + iter(groups.keys()), + list(map(int, iter(groups.values()))) + )))) + else: + return type_(*list(map(int, m.groups(0)))) + return process + + +def boolean_to_int(value): + if value is None: + return None + else: + return int(bool(value)) + + +def py_fallback(): + def to_unicode_processor_factory(encoding, errors=None): + decoder = codecs.getdecoder(encoding) + + def process(value): + if value is None: + return None + else: + # decoder returns a tuple: (value, len). Simply dropping the + # len part is safe: it is done that way in the normal + # 'xx'.decode(encoding) code path. + return decoder(value, errors)[0] + return process + + def to_conditional_unicode_processor_factory(encoding, errors=None): + decoder = codecs.getdecoder(encoding) + + def process(value): + if value is None: + return None + elif isinstance(value, util.text_type): + return value + else: + # decoder returns a tuple: (value, len). Simply dropping the + # len part is safe: it is done that way in the normal + # 'xx'.decode(encoding) code path. + return decoder(value, errors)[0] + return process + + def to_decimal_processor_factory(target_class, scale): + fstring = "%%.%df" % scale + + def process(value): + if value is None: + return None + else: + return target_class(fstring % value) + return process + + def to_float(value): + if value is None: + return None + else: + return float(value) + + def to_str(value): + if value is None: + return None + else: + return str(value) + + def int_to_boolean(value): + if value is None: + return None + else: + return bool(value) + + DATETIME_RE = re.compile( + r"(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)(?:\.(\d+))?") + TIME_RE = re.compile(r"(\d+):(\d+):(\d+)(?:\.(\d+))?") + DATE_RE = re.compile(r"(\d+)-(\d+)-(\d+)") + + str_to_datetime = str_to_datetime_processor_factory(DATETIME_RE, + datetime.datetime) + str_to_time = str_to_datetime_processor_factory(TIME_RE, datetime.time) + str_to_date = str_to_datetime_processor_factory(DATE_RE, datetime.date) + return locals() + +try: + from sqlalchemy.cprocessors import UnicodeResultProcessor, \ + DecimalResultProcessor, \ + to_float, to_str, int_to_boolean, \ + str_to_datetime, str_to_time, \ + str_to_date + + def to_unicode_processor_factory(encoding, errors=None): + if errors is not None: + return UnicodeResultProcessor(encoding, errors).process + else: + return UnicodeResultProcessor(encoding).process + + def to_conditional_unicode_processor_factory(encoding, errors=None): + if errors is not None: + return UnicodeResultProcessor(encoding, errors).conditional_process + else: + return UnicodeResultProcessor(encoding).conditional_process + + def to_decimal_processor_factory(target_class, scale): + # Note that the scale argument is not taken into account for integer + # values in the C implementation while it is in the Python one. + # For example, the Python implementation might return + # Decimal('5.00000') whereas the C implementation will + # return Decimal('5'). These are equivalent of course. + return DecimalResultProcessor(target_class, "%%.%df" % scale).process + +except ImportError: + globals().update(py_fallback()) diff --git a/app/lib/sqlalchemy/schema.py b/app/lib/sqlalchemy/schema.py new file mode 100644 index 0000000..9924a67 --- /dev/null +++ b/app/lib/sqlalchemy/schema.py @@ -0,0 +1,66 @@ +# schema.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Compatibility namespace for sqlalchemy.sql.schema and related. + +""" + +from .sql.base import ( + SchemaVisitor + ) + + +from .sql.schema import ( + BLANK_SCHEMA, + CheckConstraint, + Column, + ColumnDefault, + Constraint, + DefaultClause, + DefaultGenerator, + FetchedValue, + ForeignKey, + ForeignKeyConstraint, + Index, + MetaData, + PassiveDefault, + PrimaryKeyConstraint, + SchemaItem, + Sequence, + Table, + ThreadLocalMetaData, + UniqueConstraint, + _get_table_key, + ColumnCollectionConstraint, + ColumnCollectionMixin + ) + + +from .sql.naming import conv + + +from .sql.ddl import ( + DDL, + CreateTable, + DropTable, + CreateSequence, + DropSequence, + CreateIndex, + DropIndex, + CreateSchema, + DropSchema, + _DropView, + CreateColumn, + AddConstraint, + DropConstraint, + DDLBase, + DDLElement, + _CreateDropBase, + _DDLCompiles, + sort_tables, + sort_tables_and_constraints +) diff --git a/app/lib/sqlalchemy/sql/__init__.py b/app/lib/sqlalchemy/sql/__init__.py new file mode 100644 index 0000000..5eebd7d --- /dev/null +++ b/app/lib/sqlalchemy/sql/__init__.py @@ -0,0 +1,98 @@ +# sql/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from .expression import ( + Alias, + ClauseElement, + ColumnCollection, + ColumnElement, + CompoundSelect, + Delete, + FromClause, + Insert, + Join, + Select, + Selectable, + TableClause, + TableSample, + Update, + alias, + and_, + any_, + all_, + asc, + between, + bindparam, + case, + cast, + collate, + column, + delete, + desc, + distinct, + except_, + except_all, + exists, + extract, + false, + False_, + func, + funcfilter, + insert, + intersect, + intersect_all, + join, + label, + lateral, + literal, + literal_column, + modifier, + not_, + null, + or_, + outerjoin, + outparam, + over, + select, + subquery, + table, + tablesample, + text, + true, + True_, + tuple_, + type_coerce, + union, + union_all, + update, + within_group +) + +from .visitors import ClauseVisitor + + +def __go(lcls): + global __all__ + from .. import util as _sa_util + + import inspect as _inspect + + __all__ = sorted(name for name, obj in lcls.items() + if not (name.startswith('_') or _inspect.ismodule(obj))) + + from .annotation import _prepare_annotations, Annotated + from .elements import AnnotatedColumnElement, ClauseList + from .selectable import AnnotatedFromClause + _prepare_annotations(ColumnElement, AnnotatedColumnElement) + _prepare_annotations(FromClause, AnnotatedFromClause) + _prepare_annotations(ClauseList, Annotated) + + _sa_util.dependencies.resolve_all("sqlalchemy.sql") + + from . import naming + +__go(locals()) diff --git a/app/lib/sqlalchemy/sql/annotation.py b/app/lib/sqlalchemy/sql/annotation.py new file mode 100644 index 0000000..e6f6311 --- /dev/null +++ b/app/lib/sqlalchemy/sql/annotation.py @@ -0,0 +1,203 @@ +# sql/annotation.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""The :class:`.Annotated` class and related routines; creates hash-equivalent +copies of SQL constructs which contain context-specific markers and +associations. + +""" + +from .. import util +from . import operators + + +class Annotated(object): + """clones a ClauseElement and applies an 'annotations' dictionary. + + Unlike regular clones, this clone also mimics __hash__() and + __cmp__() of the original element so that it takes its place + in hashed collections. + + A reference to the original element is maintained, for the important + reason of keeping its hash value current. When GC'ed, the + hash value may be reused, causing conflicts. + + .. note:: The rationale for Annotated producing a brand new class, + rather than placing the functionality directly within ClauseElement, + is **performance**. The __hash__() method is absent on plain + ClauseElement which leads to significantly reduced function call + overhead, as the use of sets and dictionaries against ClauseElement + objects is prevalent, but most are not "annotated". + + """ + + def __new__(cls, *args): + if not args: + # clone constructor + return object.__new__(cls) + else: + element, values = args + # pull appropriate subclass from registry of annotated + # classes + try: + cls = annotated_classes[element.__class__] + except KeyError: + cls = _new_annotation_type(element.__class__, cls) + return object.__new__(cls) + + def __init__(self, element, values): + self.__dict__ = element.__dict__.copy() + self.__element = element + self._annotations = values + self._hash = hash(element) + + def _annotate(self, values): + _values = self._annotations.copy() + _values.update(values) + return self._with_annotations(_values) + + def _with_annotations(self, values): + clone = self.__class__.__new__(self.__class__) + clone.__dict__ = self.__dict__.copy() + clone._annotations = values + return clone + + def _deannotate(self, values=None, clone=True): + if values is None: + return self.__element + else: + _values = self._annotations.copy() + for v in values: + _values.pop(v, None) + return self._with_annotations(_values) + + def _compiler_dispatch(self, visitor, **kw): + return self.__element.__class__._compiler_dispatch( + self, visitor, **kw) + + @property + def _constructor(self): + return self.__element._constructor + + def _clone(self): + clone = self.__element._clone() + if clone is self.__element: + # detect immutable, don't change anything + return self + else: + # update the clone with any changes that have occurred + # to this object's __dict__. + clone.__dict__.update(self.__dict__) + return self.__class__(clone, self._annotations) + + def __hash__(self): + return self._hash + + def __eq__(self, other): + if isinstance(self.__element, operators.ColumnOperators): + return self.__element.__class__.__eq__(self, other) + else: + return hash(other) == hash(self) + + +# hard-generate Annotated subclasses. this technique +# is used instead of on-the-fly types (i.e. type.__new__()) +# so that the resulting objects are pickleable. +annotated_classes = {} + + +def _deep_annotate(element, annotations, exclude=None): + """Deep copy the given ClauseElement, annotating each element + with the given annotations dictionary. + + Elements within the exclude collection will be cloned but not annotated. + + """ + def clone(elem): + if exclude and \ + hasattr(elem, 'proxy_set') and \ + elem.proxy_set.intersection(exclude): + newelem = elem._clone() + elif annotations != elem._annotations: + newelem = elem._annotate(annotations) + else: + newelem = elem + newelem._copy_internals(clone=clone) + return newelem + + if element is not None: + element = clone(element) + return element + + +def _deep_deannotate(element, values=None): + """Deep copy the given element, removing annotations.""" + + cloned = util.column_dict() + + def clone(elem): + # if a values dict is given, + # the elem must be cloned each time it appears, + # as there may be different annotations in source + # elements that are remaining. if totally + # removing all annotations, can assume the same + # slate... + if values or elem not in cloned: + newelem = elem._deannotate(values=values, clone=True) + newelem._copy_internals(clone=clone) + if not values: + cloned[elem] = newelem + return newelem + else: + return cloned[elem] + + if element is not None: + element = clone(element) + return element + + +def _shallow_annotate(element, annotations): + """Annotate the given ClauseElement and copy its internals so that + internal objects refer to the new annotated object. + + Basically used to apply a "dont traverse" annotation to a + selectable, without digging throughout the whole + structure wasting time. + """ + element = element._annotate(annotations) + element._copy_internals() + return element + + +def _new_annotation_type(cls, base_cls): + if issubclass(cls, Annotated): + return cls + elif cls in annotated_classes: + return annotated_classes[cls] + + for super_ in cls.__mro__: + # check if an Annotated subclass more specific than + # the given base_cls is already registered, such + # as AnnotatedColumnElement. + if super_ in annotated_classes: + base_cls = annotated_classes[super_] + break + + annotated_classes[cls] = anno_cls = type( + "Annotated%s" % cls.__name__, + (base_cls, cls), {}) + globals()["Annotated%s" % cls.__name__] = anno_cls + return anno_cls + + +def _prepare_annotations(target_hierarchy, base_cls): + stack = [target_hierarchy] + while stack: + cls = stack.pop() + stack.extend(cls.__subclasses__()) + + _new_annotation_type(cls, base_cls) diff --git a/app/lib/sqlalchemy/sql/base.py b/app/lib/sqlalchemy/sql/base.py new file mode 100644 index 0000000..7a04beb --- /dev/null +++ b/app/lib/sqlalchemy/sql/base.py @@ -0,0 +1,633 @@ +# sql/base.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Foundational utilities common to many sql modules. + +""" + + +from .. import util, exc +import itertools +from .visitors import ClauseVisitor +import re +import collections + +PARSE_AUTOCOMMIT = util.symbol('PARSE_AUTOCOMMIT') +NO_ARG = util.symbol('NO_ARG') + + +class Immutable(object): + """mark a ClauseElement as 'immutable' when expressions are cloned.""" + + def unique_params(self, *optionaldict, **kwargs): + raise NotImplementedError("Immutable objects do not support copying") + + def params(self, *optionaldict, **kwargs): + raise NotImplementedError("Immutable objects do not support copying") + + def _clone(self): + return self + + +def _from_objects(*elements): + return itertools.chain(*[element._from_objects for element in elements]) + + +@util.decorator +def _generative(fn, *args, **kw): + """Mark a method as generative.""" + + self = args[0]._generate() + fn(self, *args[1:], **kw) + return self + + +class _DialectArgView(collections.MutableMapping): + """A dictionary view of dialect-level arguments in the form + _. + + """ + + def __init__(self, obj): + self.obj = obj + + def _key(self, key): + try: + dialect, value_key = key.split("_", 1) + except ValueError: + raise KeyError(key) + else: + return dialect, value_key + + def __getitem__(self, key): + dialect, value_key = self._key(key) + + try: + opt = self.obj.dialect_options[dialect] + except exc.NoSuchModuleError: + raise KeyError(key) + else: + return opt[value_key] + + def __setitem__(self, key, value): + try: + dialect, value_key = self._key(key) + except KeyError: + raise exc.ArgumentError( + "Keys must be of the form _") + else: + self.obj.dialect_options[dialect][value_key] = value + + def __delitem__(self, key): + dialect, value_key = self._key(key) + del self.obj.dialect_options[dialect][value_key] + + def __len__(self): + return sum(len(args._non_defaults) for args in + self.obj.dialect_options.values()) + + def __iter__(self): + return ( + util.safe_kwarg("%s_%s" % (dialect_name, value_name)) + for dialect_name in self.obj.dialect_options + for value_name in + self.obj.dialect_options[dialect_name]._non_defaults + ) + + +class _DialectArgDict(collections.MutableMapping): + """A dictionary view of dialect-level arguments for a specific + dialect. + + Maintains a separate collection of user-specified arguments + and dialect-specified default arguments. + + """ + + def __init__(self): + self._non_defaults = {} + self._defaults = {} + + def __len__(self): + return len(set(self._non_defaults).union(self._defaults)) + + def __iter__(self): + return iter(set(self._non_defaults).union(self._defaults)) + + def __getitem__(self, key): + if key in self._non_defaults: + return self._non_defaults[key] + else: + return self._defaults[key] + + def __setitem__(self, key, value): + self._non_defaults[key] = value + + def __delitem__(self, key): + del self._non_defaults[key] + + +class DialectKWArgs(object): + """Establish the ability for a class to have dialect-specific arguments + with defaults and constructor validation. + + The :class:`.DialectKWArgs` interacts with the + :attr:`.DefaultDialect.construct_arguments` present on a dialect. + + .. seealso:: + + :attr:`.DefaultDialect.construct_arguments` + + """ + + @classmethod + def argument_for(cls, dialect_name, argument_name, default): + """Add a new kind of dialect-specific keyword argument for this class. + + E.g.:: + + Index.argument_for("mydialect", "length", None) + + some_index = Index('a', 'b', mydialect_length=5) + + The :meth:`.DialectKWArgs.argument_for` method is a per-argument + way adding extra arguments to the + :attr:`.DefaultDialect.construct_arguments` dictionary. This + dictionary provides a list of argument names accepted by various + schema-level constructs on behalf of a dialect. + + New dialects should typically specify this dictionary all at once as a + data member of the dialect class. The use case for ad-hoc addition of + argument names is typically for end-user code that is also using + a custom compilation scheme which consumes the additional arguments. + + :param dialect_name: name of a dialect. The dialect must be + locatable, else a :class:`.NoSuchModuleError` is raised. The + dialect must also include an existing + :attr:`.DefaultDialect.construct_arguments` collection, indicating + that it participates in the keyword-argument validation and default + system, else :class:`.ArgumentError` is raised. If the dialect does + not include this collection, then any keyword argument can be + specified on behalf of this dialect already. All dialects packaged + within SQLAlchemy include this collection, however for third party + dialects, support may vary. + + :param argument_name: name of the parameter. + + :param default: default value of the parameter. + + .. versionadded:: 0.9.4 + + """ + + construct_arg_dictionary = DialectKWArgs._kw_registry[dialect_name] + if construct_arg_dictionary is None: + raise exc.ArgumentError( + "Dialect '%s' does have keyword-argument " + "validation and defaults enabled configured" % + dialect_name) + if cls not in construct_arg_dictionary: + construct_arg_dictionary[cls] = {} + construct_arg_dictionary[cls][argument_name] = default + + @util.memoized_property + def dialect_kwargs(self): + """A collection of keyword arguments specified as dialect-specific + options to this construct. + + The arguments are present here in their original ``_`` + format. Only arguments that were actually passed are included; + unlike the :attr:`.DialectKWArgs.dialect_options` collection, which + contains all options known by this dialect including defaults. + + The collection is also writable; keys are accepted of the + form ``_`` where the value will be assembled + into the list of options. + + .. versionadded:: 0.9.2 + + .. versionchanged:: 0.9.4 The :attr:`.DialectKWArgs.dialect_kwargs` + collection is now writable. + + .. seealso:: + + :attr:`.DialectKWArgs.dialect_options` - nested dictionary form + + """ + return _DialectArgView(self) + + @property + def kwargs(self): + """A synonym for :attr:`.DialectKWArgs.dialect_kwargs`.""" + return self.dialect_kwargs + + @util.dependencies("sqlalchemy.dialects") + def _kw_reg_for_dialect(dialects, dialect_name): + dialect_cls = dialects.registry.load(dialect_name) + if dialect_cls.construct_arguments is None: + return None + return dict(dialect_cls.construct_arguments) + _kw_registry = util.PopulateDict(_kw_reg_for_dialect) + + def _kw_reg_for_dialect_cls(self, dialect_name): + construct_arg_dictionary = DialectKWArgs._kw_registry[dialect_name] + d = _DialectArgDict() + + if construct_arg_dictionary is None: + d._defaults.update({"*": None}) + else: + for cls in reversed(self.__class__.__mro__): + if cls in construct_arg_dictionary: + d._defaults.update(construct_arg_dictionary[cls]) + return d + + @util.memoized_property + def dialect_options(self): + """A collection of keyword arguments specified as dialect-specific + options to this construct. + + This is a two-level nested registry, keyed to ```` + and ````. For example, the ``postgresql_where`` + argument would be locatable as:: + + arg = my_object.dialect_options['postgresql']['where'] + + .. versionadded:: 0.9.2 + + .. seealso:: + + :attr:`.DialectKWArgs.dialect_kwargs` - flat dictionary form + + """ + + return util.PopulateDict( + util.portable_instancemethod(self._kw_reg_for_dialect_cls) + ) + + def _validate_dialect_kwargs(self, kwargs): + # validate remaining kwargs that they all specify DB prefixes + + if not kwargs: + return + + for k in kwargs: + m = re.match('^(.+?)_(.+)$', k) + if not m: + raise TypeError( + "Additional arguments should be " + "named _, got '%s'" % k) + dialect_name, arg_name = m.group(1, 2) + + try: + construct_arg_dictionary = self.dialect_options[dialect_name] + except exc.NoSuchModuleError: + util.warn( + "Can't validate argument %r; can't " + "locate any SQLAlchemy dialect named %r" % + (k, dialect_name)) + self.dialect_options[dialect_name] = d = _DialectArgDict() + d._defaults.update({"*": None}) + d._non_defaults[arg_name] = kwargs[k] + else: + if "*" not in construct_arg_dictionary and \ + arg_name not in construct_arg_dictionary: + raise exc.ArgumentError( + "Argument %r is not accepted by " + "dialect %r on behalf of %r" % ( + k, + dialect_name, self.__class__ + )) + else: + construct_arg_dictionary[arg_name] = kwargs[k] + + +class Generative(object): + """Allow a ClauseElement to generate itself via the + @_generative decorator. + + """ + + def _generate(self): + s = self.__class__.__new__(self.__class__) + s.__dict__ = self.__dict__.copy() + return s + + +class Executable(Generative): + """Mark a ClauseElement as supporting execution. + + :class:`.Executable` is a superclass for all "statement" types + of objects, including :func:`select`, :func:`delete`, :func:`update`, + :func:`insert`, :func:`text`. + + """ + + supports_execution = True + _execution_options = util.immutabledict() + _bind = None + + @_generative + def execution_options(self, **kw): + """ Set non-SQL options for the statement which take effect during + execution. + + Execution options can be set on a per-statement or + per :class:`.Connection` basis. Additionally, the + :class:`.Engine` and ORM :class:`~.orm.query.Query` objects provide + access to execution options which they in turn configure upon + connections. + + The :meth:`execution_options` method is generative. A new + instance of this statement is returned that contains the options:: + + statement = select([table.c.x, table.c.y]) + statement = statement.execution_options(autocommit=True) + + Note that only a subset of possible execution options can be applied + to a statement - these include "autocommit" and "stream_results", + but not "isolation_level" or "compiled_cache". + See :meth:`.Connection.execution_options` for a full list of + possible options. + + .. seealso:: + + :meth:`.Connection.execution_options()` + + :meth:`.Query.execution_options()` + + """ + if 'isolation_level' in kw: + raise exc.ArgumentError( + "'isolation_level' execution option may only be specified " + "on Connection.execution_options(), or " + "per-engine using the isolation_level " + "argument to create_engine()." + ) + if 'compiled_cache' in kw: + raise exc.ArgumentError( + "'compiled_cache' execution option may only be specified " + "on Connection.execution_options(), not per statement." + ) + self._execution_options = self._execution_options.union(kw) + + def execute(self, *multiparams, **params): + """Compile and execute this :class:`.Executable`.""" + e = self.bind + if e is None: + label = getattr(self, 'description', self.__class__.__name__) + msg = ('This %s is not directly bound to a Connection or Engine.' + 'Use the .execute() method of a Connection or Engine ' + 'to execute this construct.' % label) + raise exc.UnboundExecutionError(msg) + return e._execute_clauseelement(self, multiparams, params) + + def scalar(self, *multiparams, **params): + """Compile and execute this :class:`.Executable`, returning the + result's scalar representation. + + """ + return self.execute(*multiparams, **params).scalar() + + @property + def bind(self): + """Returns the :class:`.Engine` or :class:`.Connection` to + which this :class:`.Executable` is bound, or None if none found. + + This is a traversal which checks locally, then + checks among the "from" clauses of associated objects + until a bound engine or connection is found. + + """ + if self._bind is not None: + return self._bind + + for f in _from_objects(self): + if f is self: + continue + engine = f.bind + if engine is not None: + return engine + else: + return None + + +class SchemaEventTarget(object): + """Base class for elements that are the targets of :class:`.DDLEvents` + events. + + This includes :class:`.SchemaItem` as well as :class:`.SchemaType`. + + """ + + def _set_parent(self, parent): + """Associate with this SchemaEvent's parent object.""" + + def _set_parent_with_dispatch(self, parent): + self.dispatch.before_parent_attach(self, parent) + self._set_parent(parent) + self.dispatch.after_parent_attach(self, parent) + + +class SchemaVisitor(ClauseVisitor): + """Define the visiting for ``SchemaItem`` objects.""" + + __traverse_options__ = {'schema_visitor': True} + + +class ColumnCollection(util.OrderedProperties): + """An ordered dictionary that stores a list of ColumnElement + instances. + + Overrides the ``__eq__()`` method to produce SQL clauses between + sets of correlated columns. + + """ + + __slots__ = '_all_columns' + + def __init__(self, *columns): + super(ColumnCollection, self).__init__() + object.__setattr__(self, '_all_columns', []) + for c in columns: + self.add(c) + + def __str__(self): + return repr([str(c) for c in self]) + + def replace(self, column): + """add the given column to this collection, removing unaliased + versions of this column as well as existing columns with the + same key. + + e.g.:: + + t = Table('sometable', metadata, Column('col1', Integer)) + t.columns.replace(Column('col1', Integer, key='columnone')) + + will remove the original 'col1' from the collection, and add + the new column under the name 'columnname'. + + Used by schema.Column to override columns during table reflection. + + """ + remove_col = None + if column.name in self and column.key != column.name: + other = self[column.name] + if other.name == other.key: + remove_col = other + del self._data[other.key] + + if column.key in self._data: + remove_col = self._data[column.key] + + self._data[column.key] = column + if remove_col is not None: + self._all_columns[:] = [column if c is remove_col + else c for c in self._all_columns] + else: + self._all_columns.append(column) + + def add(self, column): + """Add a column to this collection. + + The key attribute of the column will be used as the hash key + for this dictionary. + + """ + if not column.key: + raise exc.ArgumentError( + "Can't add unnamed column to column collection") + self[column.key] = column + + def __delitem__(self, key): + raise NotImplementedError() + + def __setattr__(self, key, object): + raise NotImplementedError() + + def __setitem__(self, key, value): + if key in self: + + # this warning is primarily to catch select() statements + # which have conflicting column names in their exported + # columns collection + + existing = self[key] + if not existing.shares_lineage(value): + util.warn('Column %r on table %r being replaced by ' + '%r, which has the same key. Consider ' + 'use_labels for select() statements.' % + (key, getattr(existing, 'table', None), value)) + + # pop out memoized proxy_set as this + # operation may very well be occurring + # in a _make_proxy operation + util.memoized_property.reset(value, "proxy_set") + + self._all_columns.append(value) + self._data[key] = value + + def clear(self): + raise NotImplementedError() + + def remove(self, column): + del self._data[column.key] + self._all_columns[:] = [ + c for c in self._all_columns if c is not column] + + def update(self, iter): + cols = list(iter) + all_col_set = set(self._all_columns) + self._all_columns.extend( + c for label, c in cols if c not in all_col_set) + self._data.update((label, c) for label, c in cols) + + def extend(self, iter): + cols = list(iter) + all_col_set = set(self._all_columns) + self._all_columns.extend(c for c in cols if c not in all_col_set) + self._data.update((c.key, c) for c in cols) + + __hash__ = None + + @util.dependencies("sqlalchemy.sql.elements") + def __eq__(self, elements, other): + l = [] + for c in getattr(other, "_all_columns", other): + for local in self._all_columns: + if c.shares_lineage(local): + l.append(c == local) + return elements.and_(*l) + + def __contains__(self, other): + if not isinstance(other, util.string_types): + raise exc.ArgumentError("__contains__ requires a string argument") + return util.OrderedProperties.__contains__(self, other) + + def __getstate__(self): + return {'_data': self._data, + '_all_columns': self._all_columns} + + def __setstate__(self, state): + object.__setattr__(self, '_data', state['_data']) + object.__setattr__(self, '_all_columns', state['_all_columns']) + + def contains_column(self, col): + return col in set(self._all_columns) + + def as_immutable(self): + return ImmutableColumnCollection(self._data, self._all_columns) + + +class ImmutableColumnCollection(util.ImmutableProperties, ColumnCollection): + def __init__(self, data, all_columns): + util.ImmutableProperties.__init__(self, data) + object.__setattr__(self, '_all_columns', all_columns) + + extend = remove = util.ImmutableProperties._immutable + + +class ColumnSet(util.ordered_column_set): + def contains_column(self, col): + return col in self + + def extend(self, cols): + for col in cols: + self.add(col) + + def __add__(self, other): + return list(self) + list(other) + + @util.dependencies("sqlalchemy.sql.elements") + def __eq__(self, elements, other): + l = [] + for c in other: + for local in self: + if c.shares_lineage(local): + l.append(c == local) + return elements.and_(*l) + + def __hash__(self): + return hash(tuple(x for x in self)) + + +def _bind_or_error(schemaitem, msg=None): + bind = schemaitem.bind + if not bind: + name = schemaitem.__class__.__name__ + label = getattr(schemaitem, 'fullname', + getattr(schemaitem, 'name', None)) + if label: + item = '%s object %r' % (name, label) + else: + item = '%s object' % name + if msg is None: + msg = "%s is not bound to an Engine or Connection. "\ + "Execution can not proceed without a database to execute "\ + "against." % item + raise exc.UnboundExecutionError(msg) + return bind diff --git a/app/lib/sqlalchemy/sql/compiler.py b/app/lib/sqlalchemy/sql/compiler.py new file mode 100644 index 0000000..bfa22c2 --- /dev/null +++ b/app/lib/sqlalchemy/sql/compiler.py @@ -0,0 +1,3034 @@ +# sql/compiler.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Base SQL and DDL compiler implementations. + +Classes provided include: + +:class:`.compiler.SQLCompiler` - renders SQL +strings + +:class:`.compiler.DDLCompiler` - renders DDL +(data definition language) strings + +:class:`.compiler.GenericTypeCompiler` - renders +type specification strings. + +To generate user-defined SQL strings, see +:doc:`/ext/compiler`. + +""" + +import contextlib +import re +from . import schema, sqltypes, operators, functions, visitors, \ + elements, selectable, crud +from .. import util, exc +import itertools + +RESERVED_WORDS = set([ + 'all', 'analyse', 'analyze', 'and', 'any', 'array', + 'as', 'asc', 'asymmetric', 'authorization', 'between', + 'binary', 'both', 'case', 'cast', 'check', 'collate', + 'column', 'constraint', 'create', 'cross', 'current_date', + 'current_role', 'current_time', 'current_timestamp', + 'current_user', 'default', 'deferrable', 'desc', + 'distinct', 'do', 'else', 'end', 'except', 'false', + 'for', 'foreign', 'freeze', 'from', 'full', 'grant', + 'group', 'having', 'ilike', 'in', 'initially', 'inner', + 'intersect', 'into', 'is', 'isnull', 'join', 'leading', + 'left', 'like', 'limit', 'localtime', 'localtimestamp', + 'natural', 'new', 'not', 'notnull', 'null', 'off', 'offset', + 'old', 'on', 'only', 'or', 'order', 'outer', 'overlaps', + 'placing', 'primary', 'references', 'right', 'select', + 'session_user', 'set', 'similar', 'some', 'symmetric', 'table', + 'then', 'to', 'trailing', 'true', 'union', 'unique', 'user', + 'using', 'verbose', 'when', 'where']) + +LEGAL_CHARACTERS = re.compile(r'^[A-Z0-9_$]+$', re.I) +ILLEGAL_INITIAL_CHARACTERS = set([str(x) for x in range(0, 10)]).union(['$']) + +BIND_PARAMS = re.compile(r'(? ', + operators.ge: ' >= ', + operators.eq: ' = ', + operators.is_distinct_from: ' IS DISTINCT FROM ', + operators.isnot_distinct_from: ' IS NOT DISTINCT FROM ', + operators.concat_op: ' || ', + operators.match_op: ' MATCH ', + operators.notmatch_op: ' NOT MATCH ', + operators.in_op: ' IN ', + operators.notin_op: ' NOT IN ', + operators.comma_op: ', ', + operators.from_: ' FROM ', + operators.as_: ' AS ', + operators.is_: ' IS ', + operators.isnot: ' IS NOT ', + operators.collate: ' COLLATE ', + + # unary + operators.exists: 'EXISTS ', + operators.distinct_op: 'DISTINCT ', + operators.inv: 'NOT ', + operators.any_op: 'ANY ', + operators.all_op: 'ALL ', + + # modifiers + operators.desc_op: ' DESC', + operators.asc_op: ' ASC', + operators.nullsfirst_op: ' NULLS FIRST', + operators.nullslast_op: ' NULLS LAST', + +} + +FUNCTIONS = { + functions.coalesce: 'coalesce%(expr)s', + functions.current_date: 'CURRENT_DATE', + functions.current_time: 'CURRENT_TIME', + functions.current_timestamp: 'CURRENT_TIMESTAMP', + functions.current_user: 'CURRENT_USER', + functions.localtime: 'LOCALTIME', + functions.localtimestamp: 'LOCALTIMESTAMP', + functions.random: 'random%(expr)s', + functions.sysdate: 'sysdate', + functions.session_user: 'SESSION_USER', + functions.user: 'USER' +} + +EXTRACT_MAP = { + 'month': 'month', + 'day': 'day', + 'year': 'year', + 'second': 'second', + 'hour': 'hour', + 'doy': 'doy', + 'minute': 'minute', + 'quarter': 'quarter', + 'dow': 'dow', + 'week': 'week', + 'epoch': 'epoch', + 'milliseconds': 'milliseconds', + 'microseconds': 'microseconds', + 'timezone_hour': 'timezone_hour', + 'timezone_minute': 'timezone_minute' +} + +COMPOUND_KEYWORDS = { + selectable.CompoundSelect.UNION: 'UNION', + selectable.CompoundSelect.UNION_ALL: 'UNION ALL', + selectable.CompoundSelect.EXCEPT: 'EXCEPT', + selectable.CompoundSelect.EXCEPT_ALL: 'EXCEPT ALL', + selectable.CompoundSelect.INTERSECT: 'INTERSECT', + selectable.CompoundSelect.INTERSECT_ALL: 'INTERSECT ALL' +} + + +class Compiled(object): + + """Represent a compiled SQL or DDL expression. + + The ``__str__`` method of the ``Compiled`` object should produce + the actual text of the statement. ``Compiled`` objects are + specific to their underlying database dialect, and also may + or may not be specific to the columns referenced within a + particular set of bind parameters. In no case should the + ``Compiled`` object be dependent on the actual values of those + bind parameters, even though it may reference those values as + defaults. + """ + + _cached_metadata = None + + execution_options = util.immutabledict() + """ + Execution options propagated from the statement. In some cases, + sub-elements of the statement can modify these. + """ + + def __init__(self, dialect, statement, bind=None, + schema_translate_map=None, + compile_kwargs=util.immutabledict()): + """Construct a new :class:`.Compiled` object. + + :param dialect: :class:`.Dialect` to compile against. + + :param statement: :class:`.ClauseElement` to be compiled. + + :param bind: Optional Engine or Connection to compile this + statement against. + + :param schema_translate_map: dictionary of schema names to be + translated when forming the resultant SQL + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`schema_translating` + + :param compile_kwargs: additional kwargs that will be + passed to the initial call to :meth:`.Compiled.process`. + + + """ + + self.dialect = dialect + self.bind = bind + self.preparer = self.dialect.identifier_preparer + if schema_translate_map: + self.preparer = self.preparer._with_schema_translate( + schema_translate_map) + + if statement is not None: + self.statement = statement + self.can_execute = statement.supports_execution + if self.can_execute: + self.execution_options = statement._execution_options + self.string = self.process(self.statement, **compile_kwargs) + + @util.deprecated("0.7", ":class:`.Compiled` objects now compile " + "within the constructor.") + def compile(self): + """Produce the internal string representation of this element. + """ + pass + + def _execute_on_connection(self, connection, multiparams, params): + if self.can_execute: + return connection._execute_compiled(self, multiparams, params) + else: + raise exc.ObjectNotExecutableError(self.statement) + + @property + def sql_compiler(self): + """Return a Compiled that is capable of processing SQL expressions. + + If this compiler is one, it would likely just return 'self'. + + """ + + raise NotImplementedError() + + def process(self, obj, **kwargs): + return obj._compiler_dispatch(self, **kwargs) + + def __str__(self): + """Return the string text of the generated SQL or DDL.""" + + return self.string or '' + + def construct_params(self, params=None): + """Return the bind params for this compiled object. + + :param params: a dict of string/object pairs whose values will + override bind values compiled in to the + statement. + """ + + raise NotImplementedError() + + @property + def params(self): + """Return the bind params for this compiled object.""" + return self.construct_params() + + def execute(self, *multiparams, **params): + """Execute this compiled object.""" + + e = self.bind + if e is None: + raise exc.UnboundExecutionError( + "This Compiled object is not bound to any Engine " + "or Connection.") + return e._execute_compiled(self, multiparams, params) + + def scalar(self, *multiparams, **params): + """Execute this compiled object and return the result's + scalar value.""" + + return self.execute(*multiparams, **params).scalar() + + +class TypeCompiler(util.with_metaclass(util.EnsureKWArgType, object)): + """Produces DDL specification for TypeEngine objects.""" + + ensure_kwarg = r'visit_\w+' + + def __init__(self, dialect): + self.dialect = dialect + + def process(self, type_, **kw): + return type_._compiler_dispatch(self, **kw) + + +class _CompileLabel(visitors.Visitable): + + """lightweight label object which acts as an expression.Label.""" + + __visit_name__ = 'label' + __slots__ = 'element', 'name' + + def __init__(self, col, name, alt_names=()): + self.element = col + self.name = name + self._alt_names = (col,) + alt_names + + @property + def proxy_set(self): + return self.element.proxy_set + + @property + def type(self): + return self.element.type + + def self_group(self, **kw): + return self + + +class SQLCompiler(Compiled): + """Default implementation of :class:`.Compiled`. + + Compiles :class:`.ClauseElement` objects into SQL strings. + + """ + + extract_map = EXTRACT_MAP + + compound_keywords = COMPOUND_KEYWORDS + + isdelete = isinsert = isupdate = False + """class-level defaults which can be set at the instance + level to define if this Compiled instance represents + INSERT/UPDATE/DELETE + """ + + isplaintext = False + + returning = None + """holds the "returning" collection of columns if + the statement is CRUD and defines returning columns + either implicitly or explicitly + """ + + returning_precedes_values = False + """set to True classwide to generate RETURNING + clauses before the VALUES or WHERE clause (i.e. MSSQL) + """ + + render_table_with_column_in_update_from = False + """set to True classwide to indicate the SET clause + in a multi-table UPDATE statement should qualify + columns with the table name (i.e. MySQL only) + """ + + ansi_bind_rules = False + """SQL 92 doesn't allow bind parameters to be used + in the columns clause of a SELECT, nor does it allow + ambiguous expressions like "? = ?". A compiler + subclass can set this flag to False if the target + driver/DB enforces this + """ + + _textual_ordered_columns = False + """tell the result object that the column names as rendered are important, + but they are also "ordered" vs. what is in the compiled object here. + """ + + _ordered_columns = True + """ + if False, means we can't be sure the list of entries + in _result_columns is actually the rendered order. Usually + True unless using an unordered TextAsFrom. + """ + + insert_prefetch = update_prefetch = () + + + def __init__(self, dialect, statement, column_keys=None, + inline=False, **kwargs): + """Construct a new :class:`.SQLCompiler` object. + + :param dialect: :class:`.Dialect` to be used + + :param statement: :class:`.ClauseElement` to be compiled + + :param column_keys: a list of column names to be compiled into an + INSERT or UPDATE statement. + + :param inline: whether to generate INSERT statements as "inline", e.g. + not formatted to return any generated defaults + + :param kwargs: additional keyword arguments to be consumed by the + superclass. + + """ + self.column_keys = column_keys + + # compile INSERT/UPDATE defaults/sequences inlined (no pre- + # execute) + self.inline = inline or getattr(statement, 'inline', False) + + # a dictionary of bind parameter keys to BindParameter + # instances. + self.binds = {} + + # a dictionary of BindParameter instances to "compiled" names + # that are actually present in the generated SQL + self.bind_names = util.column_dict() + + # stack which keeps track of nested SELECT statements + self.stack = [] + + # relates label names in the final SQL to a tuple of local + # column/label name, ColumnElement object (if any) and + # TypeEngine. ResultProxy uses this for type processing and + # column targeting + self._result_columns = [] + + # true if the paramstyle is positional + self.positional = dialect.positional + if self.positional: + self.positiontup = [] + self.bindtemplate = BIND_TEMPLATES[dialect.paramstyle] + + self.ctes = None + + self.label_length = dialect.label_length \ + or dialect.max_identifier_length + + # a map which tracks "anonymous" identifiers that are created on + # the fly here + self.anon_map = util.PopulateDict(self._process_anon) + + # a map which tracks "truncated" names based on + # dialect.label_length or dialect.max_identifier_length + self.truncated_names = {} + Compiled.__init__(self, dialect, statement, **kwargs) + + if ( + self.isinsert or self.isupdate or self.isdelete + ) and statement._returning: + self.returning = statement._returning + + if self.positional and dialect.paramstyle == 'numeric': + self._apply_numbered_params() + + @property + def prefetch(self): + return list(self.insert_prefetch + self.update_prefetch) + + @util.memoized_instancemethod + def _init_cte_state(self): + """Initialize collections related to CTEs only if + a CTE is located, to save on the overhead of + these collections otherwise. + + """ + # collect CTEs to tack on top of a SELECT + self.ctes = util.OrderedDict() + self.ctes_by_name = {} + self.ctes_recursive = False + if self.positional: + self.cte_positional = {} + + @contextlib.contextmanager + def _nested_result(self): + """special API to support the use case of 'nested result sets'""" + result_columns, ordered_columns = ( + self._result_columns, self._ordered_columns) + self._result_columns, self._ordered_columns = [], False + + try: + if self.stack: + entry = self.stack[-1] + entry['need_result_map_for_nested'] = True + else: + entry = None + yield self._result_columns, self._ordered_columns + finally: + if entry: + entry.pop('need_result_map_for_nested') + self._result_columns, self._ordered_columns = ( + result_columns, ordered_columns) + + def _apply_numbered_params(self): + poscount = itertools.count(1) + self.string = re.sub( + r'\[_POSITION\]', + lambda m: str(util.next(poscount)), + self.string) + + @util.memoized_property + def _bind_processors(self): + return dict( + (key, value) for key, value in + ((self.bind_names[bindparam], + bindparam.type._cached_bind_processor(self.dialect)) + for bindparam in self.bind_names) + if value is not None + ) + + def is_subquery(self): + return len(self.stack) > 1 + + @property + def sql_compiler(self): + return self + + def construct_params(self, params=None, _group_number=None, _check=True): + """return a dictionary of bind parameter keys and values""" + + if params: + pd = {} + for bindparam in self.bind_names: + name = self.bind_names[bindparam] + if bindparam.key in params: + pd[name] = params[bindparam.key] + elif name in params: + pd[name] = params[name] + + elif _check and bindparam.required: + if _group_number: + raise exc.InvalidRequestError( + "A value is required for bind parameter %r, " + "in parameter group %d" % + (bindparam.key, _group_number)) + else: + raise exc.InvalidRequestError( + "A value is required for bind parameter %r" + % bindparam.key) + + elif bindparam.callable: + pd[name] = bindparam.effective_value + else: + pd[name] = bindparam.value + return pd + else: + pd = {} + for bindparam in self.bind_names: + if _check and bindparam.required: + if _group_number: + raise exc.InvalidRequestError( + "A value is required for bind parameter %r, " + "in parameter group %d" % + (bindparam.key, _group_number)) + else: + raise exc.InvalidRequestError( + "A value is required for bind parameter %r" + % bindparam.key) + + if bindparam.callable: + pd[self.bind_names[bindparam]] = bindparam.effective_value + else: + pd[self.bind_names[bindparam]] = bindparam.value + return pd + + @property + def params(self): + """Return the bind param dictionary embedded into this + compiled object, for those values that are present.""" + return self.construct_params(_check=False) + + @util.dependencies("sqlalchemy.engine.result") + def _create_result_map(self, result): + """utility method used for unit tests only.""" + return result.ResultMetaData._create_result_map(self._result_columns) + + def default_from(self): + """Called when a SELECT statement has no froms, and no FROM clause is + to be appended. + + Gives Oracle a chance to tack on a ``FROM DUAL`` to the string output. + + """ + return "" + + def visit_grouping(self, grouping, asfrom=False, **kwargs): + return "(" + grouping.element._compiler_dispatch(self, **kwargs) + ")" + + def visit_label_reference( + self, element, within_columns_clause=False, **kwargs): + if self.stack and self.dialect.supports_simple_order_by_label: + selectable = self.stack[-1]['selectable'] + + with_cols, only_froms, only_cols = selectable._label_resolve_dict + if within_columns_clause: + resolve_dict = only_froms + else: + resolve_dict = only_cols + + # this can be None in the case that a _label_reference() + # were subject to a replacement operation, in which case + # the replacement of the Label element may have changed + # to something else like a ColumnClause expression. + order_by_elem = element.element._order_by_label_element + + if order_by_elem is not None and order_by_elem.name in \ + resolve_dict and \ + order_by_elem.shares_lineage( + resolve_dict[order_by_elem.name]): + kwargs['render_label_as_label'] = \ + element.element._order_by_label_element + return self.process( + element.element, within_columns_clause=within_columns_clause, + **kwargs) + + def visit_textual_label_reference( + self, element, within_columns_clause=False, **kwargs): + if not self.stack: + # compiling the element outside of the context of a SELECT + return self.process( + element._text_clause + ) + + selectable = self.stack[-1]['selectable'] + with_cols, only_froms, only_cols = selectable._label_resolve_dict + try: + if within_columns_clause: + col = only_froms[element.element] + else: + col = with_cols[element.element] + except KeyError: + # treat it like text() + util.warn_limited( + "Can't resolve label reference %r; converting to text()", + util.ellipses_string(element.element)) + return self.process( + element._text_clause + ) + else: + kwargs['render_label_as_label'] = col + return self.process( + col, within_columns_clause=within_columns_clause, **kwargs) + + def visit_label(self, label, + add_to_result_map=None, + within_label_clause=False, + within_columns_clause=False, + render_label_as_label=None, + **kw): + # only render labels within the columns clause + # or ORDER BY clause of a select. dialect-specific compilers + # can modify this behavior. + render_label_with_as = (within_columns_clause and not + within_label_clause) + render_label_only = render_label_as_label is label + + if render_label_only or render_label_with_as: + if isinstance(label.name, elements._truncated_label): + labelname = self._truncated_identifier("colident", label.name) + else: + labelname = label.name + + if render_label_with_as: + if add_to_result_map is not None: + add_to_result_map( + labelname, + label.name, + (label, labelname, ) + label._alt_names, + label.type + ) + + return label.element._compiler_dispatch( + self, within_columns_clause=True, + within_label_clause=True, **kw) + \ + OPERATORS[operators.as_] + \ + self.preparer.format_label(label, labelname) + elif render_label_only: + return self.preparer.format_label(label, labelname) + else: + return label.element._compiler_dispatch( + self, within_columns_clause=False, **kw) + + def _fallback_column_name(self, column): + raise exc.CompileError("Cannot compile Column object until " + "its 'name' is assigned.") + + def visit_column(self, column, add_to_result_map=None, + include_table=True, **kwargs): + name = orig_name = column.name + if name is None: + name = self._fallback_column_name(column) + + is_literal = column.is_literal + if not is_literal and isinstance(name, elements._truncated_label): + name = self._truncated_identifier("colident", name) + + if add_to_result_map is not None: + add_to_result_map( + name, + orig_name, + (column, name, column.key), + column.type + ) + + if is_literal: + name = self.escape_literal_column(name) + else: + name = self.preparer.quote(name) + + table = column.table + if table is None or not include_table or not table.named_with_column: + return name + else: + effective_schema = self.preparer.schema_for_object(table) + + if effective_schema: + schema_prefix = self.preparer.quote_schema( + effective_schema) + '.' + else: + schema_prefix = '' + tablename = table.name + if isinstance(tablename, elements._truncated_label): + tablename = self._truncated_identifier("alias", tablename) + + return schema_prefix + \ + self.preparer.quote(tablename) + \ + "." + name + + def escape_literal_column(self, text): + """provide escaping for the literal_column() construct.""" + + # TODO: some dialects might need different behavior here + return text.replace('%', '%%') + + def visit_fromclause(self, fromclause, **kwargs): + return fromclause.name + + def visit_index(self, index, **kwargs): + return index.name + + def visit_typeclause(self, typeclause, **kw): + kw['type_expression'] = typeclause + return self.dialect.type_compiler.process(typeclause.type, **kw) + + def post_process_text(self, text): + return text + + def visit_textclause(self, textclause, **kw): + def do_bindparam(m): + name = m.group(1) + if name in textclause._bindparams: + return self.process(textclause._bindparams[name], **kw) + else: + return self.bindparam_string(name, **kw) + + if not self.stack: + self.isplaintext = True + + # un-escape any \:params + return BIND_PARAMS_ESC.sub( + lambda m: m.group(1), + BIND_PARAMS.sub( + do_bindparam, + self.post_process_text(textclause.text)) + ) + + def visit_text_as_from(self, taf, + compound_index=None, + asfrom=False, + parens=True, **kw): + + toplevel = not self.stack + entry = self._default_stack_entry if toplevel else self.stack[-1] + + populate_result_map = toplevel or \ + ( + compound_index == 0 and entry.get( + 'need_result_map_for_compound', False) + ) or entry.get('need_result_map_for_nested', False) + + if populate_result_map: + self._ordered_columns = \ + self._textual_ordered_columns = taf.positional + for c in taf.column_args: + self.process(c, within_columns_clause=True, + add_to_result_map=self._add_to_result_map) + + text = self.process(taf.element, **kw) + if asfrom and parens: + text = "(%s)" % text + return text + + def visit_null(self, expr, **kw): + return 'NULL' + + def visit_true(self, expr, **kw): + if self.dialect.supports_native_boolean: + return 'true' + else: + return "1" + + def visit_false(self, expr, **kw): + if self.dialect.supports_native_boolean: + return 'false' + else: + return "0" + + def visit_clauselist(self, clauselist, **kw): + sep = clauselist.operator + if sep is None: + sep = " " + else: + sep = OPERATORS[clauselist.operator] + return sep.join( + s for s in + ( + c._compiler_dispatch(self, **kw) + for c in clauselist.clauses) + if s) + + def visit_case(self, clause, **kwargs): + x = "CASE " + if clause.value is not None: + x += clause.value._compiler_dispatch(self, **kwargs) + " " + for cond, result in clause.whens: + x += "WHEN " + cond._compiler_dispatch( + self, **kwargs + ) + " THEN " + result._compiler_dispatch( + self, **kwargs) + " " + if clause.else_ is not None: + x += "ELSE " + clause.else_._compiler_dispatch( + self, **kwargs + ) + " " + x += "END" + return x + + def visit_type_coerce(self, type_coerce, **kw): + return type_coerce.typed_expression._compiler_dispatch(self, **kw) + + def visit_cast(self, cast, **kwargs): + return "CAST(%s AS %s)" % \ + (cast.clause._compiler_dispatch(self, **kwargs), + cast.typeclause._compiler_dispatch(self, **kwargs)) + + def _format_frame_clause(self, range_, **kw): + return '%s AND %s' % ( + "UNBOUNDED PRECEDING" + if range_[0] is elements.RANGE_UNBOUNDED + else "CURRENT ROW" if range_[0] is elements.RANGE_CURRENT + else "%s PRECEDING" % (self.process(range_[0], **kw), ), + + "UNBOUNDED FOLLOWING" + if range_[1] is elements.RANGE_UNBOUNDED + else "CURRENT ROW" if range_[1] is elements.RANGE_CURRENT + else "%s FOLLOWING" % (self.process(range_[1], **kw), ) + ) + + def visit_over(self, over, **kwargs): + if over.range_: + range_ = "RANGE BETWEEN %s" % self._format_frame_clause( + over.range_, **kwargs) + elif over.rows: + range_ = "ROWS BETWEEN %s" % self._format_frame_clause( + over.rows, **kwargs) + else: + range_ = None + + return "%s OVER (%s)" % ( + over.element._compiler_dispatch(self, **kwargs), + ' '.join([ + '%s BY %s' % ( + word, clause._compiler_dispatch(self, **kwargs) + ) + for word, clause in ( + ('PARTITION', over.partition_by), + ('ORDER', over.order_by) + ) + if clause is not None and len(clause) + ] + ([range_] if range_ else []) + ) + ) + + def visit_withingroup(self, withingroup, **kwargs): + return "%s WITHIN GROUP (ORDER BY %s)" % ( + withingroup.element._compiler_dispatch(self, **kwargs), + withingroup.order_by._compiler_dispatch(self, **kwargs) + ) + + def visit_funcfilter(self, funcfilter, **kwargs): + return "%s FILTER (WHERE %s)" % ( + funcfilter.func._compiler_dispatch(self, **kwargs), + funcfilter.criterion._compiler_dispatch(self, **kwargs) + ) + + def visit_extract(self, extract, **kwargs): + field = self.extract_map.get(extract.field, extract.field) + return "EXTRACT(%s FROM %s)" % ( + field, extract.expr._compiler_dispatch(self, **kwargs)) + + def visit_function(self, func, add_to_result_map=None, **kwargs): + if add_to_result_map is not None: + add_to_result_map( + func.name, func.name, (), func.type + ) + + disp = getattr(self, "visit_%s_func" % func.name.lower(), None) + if disp: + return disp(func, **kwargs) + else: + name = FUNCTIONS.get(func.__class__, func.name + "%(expr)s") + return ".".join(list(func.packagenames) + [name]) % \ + {'expr': self.function_argspec(func, **kwargs)} + + def visit_next_value_func(self, next_value, **kw): + return self.visit_sequence(next_value.sequence) + + def visit_sequence(self, sequence): + raise NotImplementedError( + "Dialect '%s' does not support sequence increments." % + self.dialect.name + ) + + def function_argspec(self, func, **kwargs): + return func.clause_expr._compiler_dispatch(self, **kwargs) + + def visit_compound_select(self, cs, asfrom=False, + parens=True, compound_index=0, **kwargs): + toplevel = not self.stack + entry = self._default_stack_entry if toplevel else self.stack[-1] + need_result_map = toplevel or \ + (compound_index == 0 + and entry.get('need_result_map_for_compound', False)) + + self.stack.append( + { + 'correlate_froms': entry['correlate_froms'], + 'asfrom_froms': entry['asfrom_froms'], + 'selectable': cs, + 'need_result_map_for_compound': need_result_map + }) + + keyword = self.compound_keywords.get(cs.keyword) + + text = (" " + keyword + " ").join( + (c._compiler_dispatch(self, + asfrom=asfrom, parens=False, + compound_index=i, **kwargs) + for i, c in enumerate(cs.selects)) + ) + + group_by = cs._group_by_clause._compiler_dispatch( + self, asfrom=asfrom, **kwargs) + if group_by: + text += " GROUP BY " + group_by + + text += self.order_by_clause(cs, **kwargs) + text += (cs._limit_clause is not None + or cs._offset_clause is not None) and \ + self.limit_clause(cs, **kwargs) or "" + + if self.ctes and toplevel: + text = self._render_cte_clause() + text + + self.stack.pop(-1) + if asfrom and parens: + return "(" + text + ")" + else: + return text + + def _get_operator_dispatch(self, operator_, qualifier1, qualifier2): + attrname = "visit_%s_%s%s" % ( + operator_.__name__, qualifier1, + "_" + qualifier2 if qualifier2 else "") + return getattr(self, attrname, None) + + def visit_unary(self, unary, **kw): + if unary.operator: + if unary.modifier: + raise exc.CompileError( + "Unary expression does not support operator " + "and modifier simultaneously") + disp = self._get_operator_dispatch( + unary.operator, "unary", "operator") + if disp: + return disp(unary, unary.operator, **kw) + else: + return self._generate_generic_unary_operator( + unary, OPERATORS[unary.operator], **kw) + elif unary.modifier: + disp = self._get_operator_dispatch( + unary.modifier, "unary", "modifier") + if disp: + return disp(unary, unary.modifier, **kw) + else: + return self._generate_generic_unary_modifier( + unary, OPERATORS[unary.modifier], **kw) + else: + raise exc.CompileError( + "Unary expression has no operator or modifier") + + def visit_istrue_unary_operator(self, element, operator, **kw): + if self.dialect.supports_native_boolean: + return self.process(element.element, **kw) + else: + return "%s = 1" % self.process(element.element, **kw) + + def visit_isfalse_unary_operator(self, element, operator, **kw): + if self.dialect.supports_native_boolean: + return "NOT %s" % self.process(element.element, **kw) + else: + return "%s = 0" % self.process(element.element, **kw) + + def visit_notmatch_op_binary(self, binary, operator, **kw): + return "NOT %s" % self.visit_binary( + binary, override_operator=operators.match_op) + + def visit_binary(self, binary, override_operator=None, + eager_grouping=False, **kw): + + # don't allow "? = ?" to render + if self.ansi_bind_rules and \ + isinstance(binary.left, elements.BindParameter) and \ + isinstance(binary.right, elements.BindParameter): + kw['literal_binds'] = True + + operator_ = override_operator or binary.operator + disp = self._get_operator_dispatch(operator_, "binary", None) + if disp: + return disp(binary, operator_, **kw) + else: + try: + opstring = OPERATORS[operator_] + except KeyError: + raise exc.UnsupportedCompilationError(self, operator_) + else: + return self._generate_generic_binary(binary, opstring, **kw) + + def visit_custom_op_binary(self, element, operator, **kw): + kw['eager_grouping'] = operator.eager_grouping + return self._generate_generic_binary( + element, " " + operator.opstring + " ", **kw) + + def visit_custom_op_unary_operator(self, element, operator, **kw): + return self._generate_generic_unary_operator( + element, operator.opstring + " ", **kw) + + def visit_custom_op_unary_modifier(self, element, operator, **kw): + return self._generate_generic_unary_modifier( + element, " " + operator.opstring, **kw) + + def _generate_generic_binary( + self, binary, opstring, eager_grouping=False, **kw): + + _in_binary = kw.get('_in_binary', False) + + kw['_in_binary'] = True + text = binary.left._compiler_dispatch( + self, eager_grouping=eager_grouping, **kw) + \ + opstring + \ + binary.right._compiler_dispatch( + self, eager_grouping=eager_grouping, **kw) + + if _in_binary and eager_grouping: + text = "(%s)" % text + return text + + def _generate_generic_unary_operator(self, unary, opstring, **kw): + return opstring + unary.element._compiler_dispatch(self, **kw) + + def _generate_generic_unary_modifier(self, unary, opstring, **kw): + return unary.element._compiler_dispatch(self, **kw) + opstring + + @util.memoized_property + def _like_percent_literal(self): + return elements.literal_column("'%'", type_=sqltypes.STRINGTYPE) + + def visit_contains_op_binary(self, binary, operator, **kw): + binary = binary._clone() + percent = self._like_percent_literal + binary.right = percent.__add__(binary.right).__add__(percent) + return self.visit_like_op_binary(binary, operator, **kw) + + def visit_notcontains_op_binary(self, binary, operator, **kw): + binary = binary._clone() + percent = self._like_percent_literal + binary.right = percent.__add__(binary.right).__add__(percent) + return self.visit_notlike_op_binary(binary, operator, **kw) + + def visit_startswith_op_binary(self, binary, operator, **kw): + binary = binary._clone() + percent = self._like_percent_literal + binary.right = percent.__radd__( + binary.right + ) + return self.visit_like_op_binary(binary, operator, **kw) + + def visit_notstartswith_op_binary(self, binary, operator, **kw): + binary = binary._clone() + percent = self._like_percent_literal + binary.right = percent.__radd__( + binary.right + ) + return self.visit_notlike_op_binary(binary, operator, **kw) + + def visit_endswith_op_binary(self, binary, operator, **kw): + binary = binary._clone() + percent = self._like_percent_literal + binary.right = percent.__add__(binary.right) + return self.visit_like_op_binary(binary, operator, **kw) + + def visit_notendswith_op_binary(self, binary, operator, **kw): + binary = binary._clone() + percent = self._like_percent_literal + binary.right = percent.__add__(binary.right) + return self.visit_notlike_op_binary(binary, operator, **kw) + + def visit_like_op_binary(self, binary, operator, **kw): + escape = binary.modifiers.get("escape", None) + + # TODO: use ternary here, not "and"/ "or" + return '%s LIKE %s' % ( + binary.left._compiler_dispatch(self, **kw), + binary.right._compiler_dispatch(self, **kw)) \ + + ( + ' ESCAPE ' + + self.render_literal_value(escape, sqltypes.STRINGTYPE) + if escape else '' + ) + + def visit_notlike_op_binary(self, binary, operator, **kw): + escape = binary.modifiers.get("escape", None) + return '%s NOT LIKE %s' % ( + binary.left._compiler_dispatch(self, **kw), + binary.right._compiler_dispatch(self, **kw)) \ + + ( + ' ESCAPE ' + + self.render_literal_value(escape, sqltypes.STRINGTYPE) + if escape else '' + ) + + def visit_ilike_op_binary(self, binary, operator, **kw): + escape = binary.modifiers.get("escape", None) + return 'lower(%s) LIKE lower(%s)' % ( + binary.left._compiler_dispatch(self, **kw), + binary.right._compiler_dispatch(self, **kw)) \ + + ( + ' ESCAPE ' + + self.render_literal_value(escape, sqltypes.STRINGTYPE) + if escape else '' + ) + + def visit_notilike_op_binary(self, binary, operator, **kw): + escape = binary.modifiers.get("escape", None) + return 'lower(%s) NOT LIKE lower(%s)' % ( + binary.left._compiler_dispatch(self, **kw), + binary.right._compiler_dispatch(self, **kw)) \ + + ( + ' ESCAPE ' + + self.render_literal_value(escape, sqltypes.STRINGTYPE) + if escape else '' + ) + + def visit_between_op_binary(self, binary, operator, **kw): + symmetric = binary.modifiers.get("symmetric", False) + return self._generate_generic_binary( + binary, " BETWEEN SYMMETRIC " + if symmetric else " BETWEEN ", **kw) + + def visit_notbetween_op_binary(self, binary, operator, **kw): + symmetric = binary.modifiers.get("symmetric", False) + return self._generate_generic_binary( + binary, " NOT BETWEEN SYMMETRIC " + if symmetric else " NOT BETWEEN ", **kw) + + def visit_bindparam(self, bindparam, within_columns_clause=False, + literal_binds=False, + skip_bind_expression=False, + **kwargs): + if not skip_bind_expression and bindparam.type._has_bind_expression: + bind_expression = bindparam.type.bind_expression(bindparam) + return self.process(bind_expression, + skip_bind_expression=True) + + if literal_binds or \ + (within_columns_clause and + self.ansi_bind_rules): + if bindparam.value is None and bindparam.callable is None: + raise exc.CompileError("Bind parameter '%s' without a " + "renderable value not allowed here." + % bindparam.key) + return self.render_literal_bindparam( + bindparam, within_columns_clause=True, **kwargs) + + name = self._truncate_bindparam(bindparam) + + if name in self.binds: + existing = self.binds[name] + if existing is not bindparam: + if (existing.unique or bindparam.unique) and \ + not existing.proxy_set.intersection( + bindparam.proxy_set): + raise exc.CompileError( + "Bind parameter '%s' conflicts with " + "unique bind parameter of the same name" % + bindparam.key + ) + elif existing._is_crud or bindparam._is_crud: + raise exc.CompileError( + "bindparam() name '%s' is reserved " + "for automatic usage in the VALUES or SET " + "clause of this " + "insert/update statement. Please use a " + "name other than column name when using bindparam() " + "with insert() or update() (for example, 'b_%s')." % + (bindparam.key, bindparam.key) + ) + + self.binds[bindparam.key] = self.binds[name] = bindparam + + return self.bindparam_string(name, **kwargs) + + def render_literal_bindparam(self, bindparam, **kw): + value = bindparam.effective_value + return self.render_literal_value(value, bindparam.type) + + def render_literal_value(self, value, type_): + """Render the value of a bind parameter as a quoted literal. + + This is used for statement sections that do not accept bind parameters + on the target driver/database. + + This should be implemented by subclasses using the quoting services + of the DBAPI. + + """ + + processor = type_._cached_literal_processor(self.dialect) + if processor: + return processor(value) + else: + raise NotImplementedError( + "Don't know how to literal-quote value %r" % value) + + def _truncate_bindparam(self, bindparam): + if bindparam in self.bind_names: + return self.bind_names[bindparam] + + bind_name = bindparam.key + if isinstance(bind_name, elements._truncated_label): + bind_name = self._truncated_identifier("bindparam", bind_name) + + # add to bind_names for translation + self.bind_names[bindparam] = bind_name + + return bind_name + + def _truncated_identifier(self, ident_class, name): + if (ident_class, name) in self.truncated_names: + return self.truncated_names[(ident_class, name)] + + anonname = name.apply_map(self.anon_map) + + if len(anonname) > self.label_length - 6: + counter = self.truncated_names.get(ident_class, 1) + truncname = anonname[0:max(self.label_length - 6, 0)] + \ + "_" + hex(counter)[2:] + self.truncated_names[ident_class] = counter + 1 + else: + truncname = anonname + self.truncated_names[(ident_class, name)] = truncname + return truncname + + def _anonymize(self, name): + return name % self.anon_map + + def _process_anon(self, key): + (ident, derived) = key.split(' ', 1) + anonymous_counter = self.anon_map.get(derived, 1) + self.anon_map[derived] = anonymous_counter + 1 + return derived + "_" + str(anonymous_counter) + + def bindparam_string(self, name, positional_names=None, **kw): + if self.positional: + if positional_names is not None: + positional_names.append(name) + else: + self.positiontup.append(name) + return self.bindtemplate % {'name': name} + + def visit_cte(self, cte, asfrom=False, ashint=False, + fromhints=None, + **kwargs): + self._init_cte_state() + + if isinstance(cte.name, elements._truncated_label): + cte_name = self._truncated_identifier("alias", cte.name) + else: + cte_name = cte.name + + if cte_name in self.ctes_by_name: + existing_cte = self.ctes_by_name[cte_name] + # we've generated a same-named CTE that we are enclosed in, + # or this is the same CTE. just return the name. + if cte in existing_cte._restates or cte is existing_cte: + return self.preparer.format_alias(cte, cte_name) + elif existing_cte in cte._restates: + # we've generated a same-named CTE that is + # enclosed in us - we take precedence, so + # discard the text for the "inner". + del self.ctes[existing_cte] + else: + raise exc.CompileError( + "Multiple, unrelated CTEs found with " + "the same name: %r" % + cte_name) + + self.ctes_by_name[cte_name] = cte + + # look for embedded DML ctes and propagate autocommit + if 'autocommit' in cte.element._execution_options and \ + 'autocommit' not in self.execution_options: + self.execution_options = self.execution_options.union( + {"autocommit": cte.element._execution_options['autocommit']}) + + if cte._cte_alias is not None: + orig_cte = cte._cte_alias + if orig_cte not in self.ctes: + self.visit_cte(orig_cte, **kwargs) + cte_alias_name = cte._cte_alias.name + if isinstance(cte_alias_name, elements._truncated_label): + cte_alias_name = self._truncated_identifier( + "alias", cte_alias_name) + else: + orig_cte = cte + cte_alias_name = None + if not cte_alias_name and cte not in self.ctes: + if cte.recursive: + self.ctes_recursive = True + text = self.preparer.format_alias(cte, cte_name) + if cte.recursive: + if isinstance(cte.original, selectable.Select): + col_source = cte.original + elif isinstance(cte.original, selectable.CompoundSelect): + col_source = cte.original.selects[0] + else: + assert False + recur_cols = [c for c in + util.unique_list(col_source.inner_columns) + if c is not None] + + text += "(%s)" % (", ".join( + self.preparer.format_column(ident) + for ident in recur_cols)) + + if self.positional: + kwargs['positional_names'] = self.cte_positional[cte] = [] + + text += " AS \n" + \ + cte.original._compiler_dispatch( + self, asfrom=True, **kwargs + ) + + if cte._suffixes: + text += " " + self._generate_prefixes( + cte, cte._suffixes, **kwargs) + + self.ctes[cte] = text + + if asfrom: + if cte_alias_name: + text = self.preparer.format_alias(cte, cte_alias_name) + text += self.get_render_as_alias_suffix(cte_name) + else: + return self.preparer.format_alias(cte, cte_name) + return text + + def visit_alias(self, alias, asfrom=False, ashint=False, + iscrud=False, + fromhints=None, **kwargs): + if asfrom or ashint: + if isinstance(alias.name, elements._truncated_label): + alias_name = self._truncated_identifier("alias", alias.name) + else: + alias_name = alias.name + + if ashint: + return self.preparer.format_alias(alias, alias_name) + elif asfrom: + ret = alias.original._compiler_dispatch(self, + asfrom=True, **kwargs) + \ + self.get_render_as_alias_suffix( + self.preparer.format_alias(alias, alias_name)) + + if fromhints and alias in fromhints: + ret = self.format_from_hint_text(ret, alias, + fromhints[alias], iscrud) + + return ret + else: + return alias.original._compiler_dispatch(self, **kwargs) + + def visit_lateral(self, lateral, **kw): + kw['lateral'] = True + return "LATERAL %s" % self.visit_alias(lateral, **kw) + + def visit_tablesample(self, tablesample, asfrom=False, **kw): + text = "%s TABLESAMPLE %s" % ( + self.visit_alias(tablesample, asfrom=True, **kw), + tablesample._get_method()._compiler_dispatch(self, **kw)) + + if tablesample.seed is not None: + text += " REPEATABLE (%s)" % ( + tablesample.seed._compiler_dispatch(self, **kw)) + + return text + + def get_render_as_alias_suffix(self, alias_name_text): + return " AS " + alias_name_text + + def _add_to_result_map(self, keyname, name, objects, type_): + self._result_columns.append((keyname, name, objects, type_)) + + def _label_select_column(self, select, column, + populate_result_map, + asfrom, column_clause_args, + name=None, + within_columns_clause=True): + """produce labeled columns present in a select().""" + + if column.type._has_column_expression and \ + populate_result_map: + col_expr = column.type.column_expression(column) + add_to_result_map = lambda keyname, name, objects, type_: \ + self._add_to_result_map( + keyname, name, + (column,) + objects, type_) + else: + col_expr = column + if populate_result_map: + add_to_result_map = self._add_to_result_map + else: + add_to_result_map = None + + if not within_columns_clause: + result_expr = col_expr + elif isinstance(column, elements.Label): + if col_expr is not column: + result_expr = _CompileLabel( + col_expr, + column.name, + alt_names=(column.element,) + ) + else: + result_expr = col_expr + + elif select is not None and name: + result_expr = _CompileLabel( + col_expr, + name, + alt_names=(column._key_label,) + ) + + elif \ + asfrom and \ + isinstance(column, elements.ColumnClause) and \ + not column.is_literal and \ + column.table is not None and \ + not isinstance(column.table, selectable.Select): + result_expr = _CompileLabel(col_expr, + elements._as_truncated(column.name), + alt_names=(column.key,)) + elif ( + not isinstance(column, elements.TextClause) and + ( + not isinstance(column, elements.UnaryExpression) or + column.wraps_column_expression + ) and + ( + not hasattr(column, 'name') or + isinstance(column, functions.Function) + ) + ): + result_expr = _CompileLabel(col_expr, column.anon_label) + elif col_expr is not column: + # TODO: are we sure "column" has a .name and .key here ? + # assert isinstance(column, elements.ColumnClause) + result_expr = _CompileLabel(col_expr, + elements._as_truncated(column.name), + alt_names=(column.key,)) + else: + result_expr = col_expr + + column_clause_args.update( + within_columns_clause=within_columns_clause, + add_to_result_map=add_to_result_map + ) + return result_expr._compiler_dispatch( + self, + **column_clause_args + ) + + def format_from_hint_text(self, sqltext, table, hint, iscrud): + hinttext = self.get_from_hint_text(table, hint) + if hinttext: + sqltext += " " + hinttext + return sqltext + + def get_select_hint_text(self, byfroms): + return None + + def get_from_hint_text(self, table, text): + return None + + def get_crud_hint_text(self, table, text): + return None + + def get_statement_hint_text(self, hint_texts): + return " ".join(hint_texts) + + def _transform_select_for_nested_joins(self, select): + """Rewrite any "a JOIN (b JOIN c)" expression as + "a JOIN (select * from b JOIN c) AS anon", to support + databases that can't parse a parenthesized join correctly + (i.e. sqlite < 3.7.16). + + """ + cloned = {} + column_translate = [{}] + + def visit(element, **kw): + if element in column_translate[-1]: + return column_translate[-1][element] + + elif element in cloned: + return cloned[element] + + newelem = cloned[element] = element._clone() + + if newelem.is_selectable and newelem._is_join and \ + isinstance(newelem.right, selectable.FromGrouping): + + newelem._reset_exported() + newelem.left = visit(newelem.left, **kw) + + right = visit(newelem.right, **kw) + + selectable_ = selectable.Select( + [right.element], + use_labels=True).alias() + + for c in selectable_.c: + c._key_label = c.key + c._label = c.name + + translate_dict = dict( + zip(newelem.right.element.c, selectable_.c) + ) + + # translating from both the old and the new + # because different select() structures will lead us + # to traverse differently + translate_dict[right.element.left] = selectable_ + translate_dict[right.element.right] = selectable_ + translate_dict[newelem.right.element.left] = selectable_ + translate_dict[newelem.right.element.right] = selectable_ + + # propagate translations that we've gained + # from nested visit(newelem.right) outwards + # to the enclosing select here. this happens + # only when we have more than one level of right + # join nesting, i.e. "a JOIN (b JOIN (c JOIN d))" + for k, v in list(column_translate[-1].items()): + if v in translate_dict: + # remarkably, no current ORM tests (May 2013) + # hit this condition, only test_join_rewriting + # does. + column_translate[-1][k] = translate_dict[v] + + column_translate[-1].update(translate_dict) + + newelem.right = selectable_ + + newelem.onclause = visit(newelem.onclause, **kw) + + elif newelem._is_from_container: + # if we hit an Alias, CompoundSelect or ScalarSelect, put a + # marker in the stack. + kw['transform_clue'] = 'select_container' + newelem._copy_internals(clone=visit, **kw) + elif newelem.is_selectable and newelem._is_select: + barrier_select = kw.get('transform_clue', None) == \ + 'select_container' + # if we're still descended from an + # Alias/CompoundSelect/ScalarSelect, we're + # in a FROM clause, so start with a new translate collection + if barrier_select: + column_translate.append({}) + kw['transform_clue'] = 'inside_select' + newelem._copy_internals(clone=visit, **kw) + if barrier_select: + del column_translate[-1] + else: + newelem._copy_internals(clone=visit, **kw) + + return newelem + + return visit(select) + + def _transform_result_map_for_nested_joins( + self, select, transformed_select): + inner_col = dict((c._key_label, c) for + c in transformed_select.inner_columns) + + d = dict( + (inner_col[c._key_label], c) + for c in select.inner_columns + ) + + self._result_columns = [ + (key, name, tuple([d.get(col, col) for col in objs]), typ) + for key, name, objs, typ in self._result_columns + ] + + _default_stack_entry = util.immutabledict([ + ('correlate_froms', frozenset()), + ('asfrom_froms', frozenset()) + ]) + + def _display_froms_for_select(self, select, asfrom, lateral=False): + # utility method to help external dialects + # get the correct from list for a select. + # specifically the oracle dialect needs this feature + # right now. + toplevel = not self.stack + entry = self._default_stack_entry if toplevel else self.stack[-1] + + correlate_froms = entry['correlate_froms'] + asfrom_froms = entry['asfrom_froms'] + + if asfrom and not lateral: + froms = select._get_display_froms( + explicit_correlate_froms=correlate_froms.difference( + asfrom_froms), + implicit_correlate_froms=()) + else: + froms = select._get_display_froms( + explicit_correlate_froms=correlate_froms, + implicit_correlate_froms=asfrom_froms) + return froms + + def visit_select(self, select, asfrom=False, parens=True, + fromhints=None, + compound_index=0, + nested_join_translation=False, + select_wraps_for=None, + lateral=False, + **kwargs): + + needs_nested_translation = \ + select.use_labels and \ + not nested_join_translation and \ + not self.stack and \ + not self.dialect.supports_right_nested_joins + + if needs_nested_translation: + transformed_select = self._transform_select_for_nested_joins( + select) + text = self.visit_select( + transformed_select, asfrom=asfrom, parens=parens, + fromhints=fromhints, + compound_index=compound_index, + nested_join_translation=True, **kwargs + ) + + toplevel = not self.stack + entry = self._default_stack_entry if toplevel else self.stack[-1] + + populate_result_map = toplevel or \ + ( + compound_index == 0 and entry.get( + 'need_result_map_for_compound', False) + ) or entry.get('need_result_map_for_nested', False) + + # this was first proposed as part of #3372; however, it is not + # reached in current tests and could possibly be an assertion + # instead. + if not populate_result_map and 'add_to_result_map' in kwargs: + del kwargs['add_to_result_map'] + + if needs_nested_translation: + if populate_result_map: + self._transform_result_map_for_nested_joins( + select, transformed_select) + return text + + froms = self._setup_select_stack(select, entry, asfrom, lateral) + + column_clause_args = kwargs.copy() + column_clause_args.update({ + 'within_label_clause': False, + 'within_columns_clause': False + }) + + text = "SELECT " # we're off to a good start ! + + if select._hints: + hint_text, byfrom = self._setup_select_hints(select) + if hint_text: + text += hint_text + " " + else: + byfrom = None + + if select._prefixes: + text += self._generate_prefixes( + select, select._prefixes, **kwargs) + + text += self.get_select_precolumns(select, **kwargs) + # the actual list of columns to print in the SELECT column list. + inner_columns = [ + c for c in [ + self._label_select_column( + select, + column, + populate_result_map, asfrom, + column_clause_args, + name=name) + for name, column in select._columns_plus_names + ] + if c is not None + ] + + if populate_result_map and select_wraps_for is not None: + # if this select is a compiler-generated wrapper, + # rewrite the targeted columns in the result map + + translate = dict( + zip( + [name for (key, name) in select._columns_plus_names], + [name for (key, name) in + select_wraps_for._columns_plus_names]) + ) + + self._result_columns = [ + (key, name, tuple(translate.get(o, o) for o in obj), type_) + for key, name, obj, type_ in self._result_columns + ] + + text = self._compose_select_body( + text, select, inner_columns, froms, byfrom, kwargs) + + if select._statement_hints: + per_dialect = [ + ht for (dialect_name, ht) + in select._statement_hints + if dialect_name in ('*', self.dialect.name) + ] + if per_dialect: + text += " " + self.get_statement_hint_text(per_dialect) + + if self.ctes and toplevel: + text = self._render_cte_clause() + text + + if select._suffixes: + text += " " + self._generate_prefixes( + select, select._suffixes, **kwargs) + + self.stack.pop(-1) + + if (asfrom or lateral) and parens: + return "(" + text + ")" + else: + return text + + def _setup_select_hints(self, select): + byfrom = dict([ + (from_, hinttext % { + 'name': from_._compiler_dispatch( + self, ashint=True) + }) + for (from_, dialect), hinttext in + select._hints.items() + if dialect in ('*', self.dialect.name) + ]) + hint_text = self.get_select_hint_text(byfrom) + return hint_text, byfrom + + def _setup_select_stack(self, select, entry, asfrom, lateral): + correlate_froms = entry['correlate_froms'] + asfrom_froms = entry['asfrom_froms'] + + if asfrom and not lateral: + froms = select._get_display_froms( + explicit_correlate_froms=correlate_froms.difference( + asfrom_froms), + implicit_correlate_froms=()) + else: + froms = select._get_display_froms( + explicit_correlate_froms=correlate_froms, + implicit_correlate_froms=asfrom_froms) + + new_correlate_froms = set(selectable._from_objects(*froms)) + all_correlate_froms = new_correlate_froms.union(correlate_froms) + + new_entry = { + 'asfrom_froms': new_correlate_froms, + 'correlate_froms': all_correlate_froms, + 'selectable': select, + } + self.stack.append(new_entry) + + return froms + + def _compose_select_body( + self, text, select, inner_columns, froms, byfrom, kwargs): + text += ', '.join(inner_columns) + + if froms: + text += " \nFROM " + + if select._hints: + text += ', '.join( + [f._compiler_dispatch(self, asfrom=True, + fromhints=byfrom, **kwargs) + for f in froms]) + else: + text += ', '.join( + [f._compiler_dispatch(self, asfrom=True, **kwargs) + for f in froms]) + else: + text += self.default_from() + + if select._whereclause is not None: + t = select._whereclause._compiler_dispatch(self, **kwargs) + if t: + text += " \nWHERE " + t + + if select._group_by_clause.clauses: + group_by = select._group_by_clause._compiler_dispatch( + self, **kwargs) + if group_by: + text += " GROUP BY " + group_by + + if select._having is not None: + t = select._having._compiler_dispatch(self, **kwargs) + if t: + text += " \nHAVING " + t + + if select._order_by_clause.clauses: + text += self.order_by_clause(select, **kwargs) + + if (select._limit_clause is not None or + select._offset_clause is not None): + text += self.limit_clause(select, **kwargs) + + if select._for_update_arg is not None: + text += self.for_update_clause(select, **kwargs) + + return text + + def _generate_prefixes(self, stmt, prefixes, **kw): + clause = " ".join( + prefix._compiler_dispatch(self, **kw) + for prefix, dialect_name in prefixes + if dialect_name is None or + dialect_name == self.dialect.name + ) + if clause: + clause += " " + return clause + + def _render_cte_clause(self): + if self.positional: + self.positiontup = sum([ + self.cte_positional[cte] + for cte in self.ctes], []) + \ + self.positiontup + cte_text = self.get_cte_preamble(self.ctes_recursive) + " " + cte_text += ", \n".join( + [txt for txt in self.ctes.values()] + ) + cte_text += "\n " + return cte_text + + def get_cte_preamble(self, recursive): + if recursive: + return "WITH RECURSIVE" + else: + return "WITH" + + def get_select_precolumns(self, select, **kw): + """Called when building a ``SELECT`` statement, position is just + before column list. + + """ + return select._distinct and "DISTINCT " or "" + + def order_by_clause(self, select, **kw): + order_by = select._order_by_clause._compiler_dispatch(self, **kw) + if order_by: + return " ORDER BY " + order_by + else: + return "" + + def for_update_clause(self, select, **kw): + return " FOR UPDATE" + + def returning_clause(self, stmt, returning_cols): + raise exc.CompileError( + "RETURNING is not supported by this " + "dialect's statement compiler.") + + def limit_clause(self, select, **kw): + text = "" + if select._limit_clause is not None: + text += "\n LIMIT " + self.process(select._limit_clause, **kw) + if select._offset_clause is not None: + if select._limit_clause is None: + text += "\n LIMIT -1" + text += " OFFSET " + self.process(select._offset_clause, **kw) + return text + + def visit_table(self, table, asfrom=False, iscrud=False, ashint=False, + fromhints=None, use_schema=True, **kwargs): + if asfrom or ashint: + effective_schema = self.preparer.schema_for_object(table) + + if use_schema and effective_schema: + ret = self.preparer.quote_schema(effective_schema) + \ + "." + self.preparer.quote(table.name) + else: + ret = self.preparer.quote(table.name) + if fromhints and table in fromhints: + ret = self.format_from_hint_text(ret, table, + fromhints[table], iscrud) + return ret + else: + return "" + + def visit_join(self, join, asfrom=False, **kwargs): + if join.full: + join_type = " FULL OUTER JOIN " + elif join.isouter: + join_type = " LEFT OUTER JOIN " + else: + join_type = " JOIN " + return ( + join.left._compiler_dispatch(self, asfrom=True, **kwargs) + + join_type + + join.right._compiler_dispatch(self, asfrom=True, **kwargs) + + " ON " + + join.onclause._compiler_dispatch(self, **kwargs) + ) + + def _setup_crud_hints(self, stmt, table_text): + dialect_hints = dict([ + (table, hint_text) + for (table, dialect), hint_text in + stmt._hints.items() + if dialect in ('*', self.dialect.name) + ]) + if stmt.table in dialect_hints: + table_text = self.format_from_hint_text( + table_text, + stmt.table, + dialect_hints[stmt.table], + True + ) + return dialect_hints, table_text + + def visit_insert(self, insert_stmt, asfrom=False, **kw): + toplevel = not self.stack + + self.stack.append( + {'correlate_froms': set(), + "asfrom_froms": set(), + "selectable": insert_stmt}) + + crud_params = crud._setup_crud_params( + self, insert_stmt, crud.ISINSERT, **kw) + + if not crud_params and \ + not self.dialect.supports_default_values and \ + not self.dialect.supports_empty_insert: + raise exc.CompileError("The '%s' dialect with current database " + "version settings does not support empty " + "inserts." % + self.dialect.name) + + if insert_stmt._has_multi_parameters: + if not self.dialect.supports_multivalues_insert: + raise exc.CompileError( + "The '%s' dialect with current database " + "version settings does not support " + "in-place multirow inserts." % + self.dialect.name) + crud_params_single = crud_params[0] + else: + crud_params_single = crud_params + + preparer = self.preparer + supports_default_values = self.dialect.supports_default_values + + text = "INSERT " + + if insert_stmt._prefixes: + text += self._generate_prefixes(insert_stmt, + insert_stmt._prefixes, **kw) + + text += "INTO " + table_text = preparer.format_table(insert_stmt.table) + + if insert_stmt._hints: + dialect_hints, table_text = self._setup_crud_hints( + insert_stmt, table_text) + else: + dialect_hints = None + + text += table_text + + if crud_params_single or not supports_default_values: + text += " (%s)" % ', '.join([preparer.format_column(c[0]) + for c in crud_params_single]) + + if self.returning or insert_stmt._returning: + returning_clause = self.returning_clause( + insert_stmt, self.returning or insert_stmt._returning) + + if self.returning_precedes_values: + text += " " + returning_clause + else: + returning_clause = None + + if insert_stmt.select is not None: + text += " %s" % self.process(self._insert_from_select, **kw) + elif not crud_params and supports_default_values: + text += " DEFAULT VALUES" + elif insert_stmt._has_multi_parameters: + text += " VALUES %s" % ( + ", ".join( + "(%s)" % ( + ', '.join(c[1] for c in crud_param_set) + ) + for crud_param_set in crud_params + ) + ) + else: + text += " VALUES (%s)" % \ + ', '.join([c[1] for c in crud_params]) + + if insert_stmt._post_values_clause is not None: + post_values_clause = self.process( + insert_stmt._post_values_clause, **kw) + if post_values_clause: + text += " " + post_values_clause + + if returning_clause and not self.returning_precedes_values: + text += " " + returning_clause + + if self.ctes and toplevel: + text = self._render_cte_clause() + text + + self.stack.pop(-1) + + if asfrom: + return "(" + text + ")" + else: + return text + + def update_limit_clause(self, update_stmt): + """Provide a hook for MySQL to add LIMIT to the UPDATE""" + return None + + def update_tables_clause(self, update_stmt, from_table, + extra_froms, **kw): + """Provide a hook to override the initial table clause + in an UPDATE statement. + + MySQL overrides this. + + """ + kw['asfrom'] = True + return from_table._compiler_dispatch(self, iscrud=True, **kw) + + def update_from_clause(self, update_stmt, + from_table, extra_froms, + from_hints, + **kw): + """Provide a hook to override the generation of an + UPDATE..FROM clause. + + MySQL and MSSQL override this. + + """ + return "FROM " + ', '.join( + t._compiler_dispatch(self, asfrom=True, + fromhints=from_hints, **kw) + for t in extra_froms) + + def visit_update(self, update_stmt, asfrom=False, **kw): + toplevel = not self.stack + + self.stack.append( + {'correlate_froms': set([update_stmt.table]), + "asfrom_froms": set([update_stmt.table]), + "selectable": update_stmt}) + + extra_froms = update_stmt._extra_froms + + text = "UPDATE " + + if update_stmt._prefixes: + text += self._generate_prefixes(update_stmt, + update_stmt._prefixes, **kw) + + table_text = self.update_tables_clause(update_stmt, update_stmt.table, + extra_froms, **kw) + + crud_params = crud._setup_crud_params( + self, update_stmt, crud.ISUPDATE, **kw) + + if update_stmt._hints: + dialect_hints, table_text = self._setup_crud_hints( + update_stmt, table_text) + else: + dialect_hints = None + + text += table_text + + text += ' SET ' + include_table = extra_froms and \ + self.render_table_with_column_in_update_from + text += ', '.join( + c[0]._compiler_dispatch(self, + include_table=include_table) + + '=' + c[1] for c in crud_params + ) + + if self.returning or update_stmt._returning: + if self.returning_precedes_values: + text += " " + self.returning_clause( + update_stmt, self.returning or update_stmt._returning) + + if extra_froms: + extra_from_text = self.update_from_clause( + update_stmt, + update_stmt.table, + extra_froms, + dialect_hints, **kw) + if extra_from_text: + text += " " + extra_from_text + + if update_stmt._whereclause is not None: + t = self.process(update_stmt._whereclause, **kw) + if t: + text += " WHERE " + t + + limit_clause = self.update_limit_clause(update_stmt) + if limit_clause: + text += " " + limit_clause + + if (self.returning or update_stmt._returning) and \ + not self.returning_precedes_values: + text += " " + self.returning_clause( + update_stmt, self.returning or update_stmt._returning) + + if self.ctes and toplevel: + text = self._render_cte_clause() + text + + self.stack.pop(-1) + + if asfrom: + return "(" + text + ")" + else: + return text + + @util.memoized_property + def _key_getters_for_crud_column(self): + return crud._key_getters_for_crud_column(self, self.statement) + + def visit_delete(self, delete_stmt, asfrom=False, **kw): + toplevel = not self.stack + + self.stack.append({'correlate_froms': set([delete_stmt.table]), + "asfrom_froms": set([delete_stmt.table]), + "selectable": delete_stmt}) + + crud._setup_crud_params(self, delete_stmt, crud.ISDELETE, **kw) + + text = "DELETE " + + if delete_stmt._prefixes: + text += self._generate_prefixes(delete_stmt, + delete_stmt._prefixes, **kw) + + text += "FROM " + table_text = delete_stmt.table._compiler_dispatch( + self, asfrom=True, iscrud=True) + + if delete_stmt._hints: + dialect_hints, table_text = self._setup_crud_hints( + delete_stmt, table_text) + + text += table_text + + if delete_stmt._returning: + if self.returning_precedes_values: + text += " " + self.returning_clause( + delete_stmt, delete_stmt._returning) + + if delete_stmt._whereclause is not None: + t = delete_stmt._whereclause._compiler_dispatch(self, **kw) + if t: + text += " WHERE " + t + + if delete_stmt._returning and not self.returning_precedes_values: + text += " " + self.returning_clause( + delete_stmt, delete_stmt._returning) + + if self.ctes and toplevel: + text = self._render_cte_clause() + text + + self.stack.pop(-1) + + if asfrom: + return "(" + text + ")" + else: + return text + + def visit_savepoint(self, savepoint_stmt): + return "SAVEPOINT %s" % self.preparer.format_savepoint(savepoint_stmt) + + def visit_rollback_to_savepoint(self, savepoint_stmt): + return "ROLLBACK TO SAVEPOINT %s" % \ + self.preparer.format_savepoint(savepoint_stmt) + + def visit_release_savepoint(self, savepoint_stmt): + return "RELEASE SAVEPOINT %s" % \ + self.preparer.format_savepoint(savepoint_stmt) + + +class StrSQLCompiler(SQLCompiler): + """"a compiler subclass with a few non-standard SQL features allowed. + + Used for stringification of SQL statements when a real dialect is not + available. + + """ + + def _fallback_column_name(self, column): + return "" + + def visit_getitem_binary(self, binary, operator, **kw): + return "%s[%s]" % ( + self.process(binary.left, **kw), + self.process(binary.right, **kw) + ) + + def visit_json_getitem_op_binary(self, binary, operator, **kw): + return self.visit_getitem_binary(binary, operator, **kw) + + def visit_json_path_getitem_op_binary(self, binary, operator, **kw): + return self.visit_getitem_binary(binary, operator, **kw) + + def returning_clause(self, stmt, returning_cols): + columns = [ + self._label_select_column(None, c, True, False, {}) + for c in elements._select_iterables(returning_cols) + ] + + return 'RETURNING ' + ', '.join(columns) + + +class DDLCompiler(Compiled): + + @util.memoized_property + def sql_compiler(self): + return self.dialect.statement_compiler(self.dialect, None) + + @util.memoized_property + def type_compiler(self): + return self.dialect.type_compiler + + def construct_params(self, params=None): + return None + + def visit_ddl(self, ddl, **kwargs): + # table events can substitute table and schema name + context = ddl.context + if isinstance(ddl.target, schema.Table): + context = context.copy() + + preparer = self.preparer + path = preparer.format_table_seq(ddl.target) + if len(path) == 1: + table, sch = path[0], '' + else: + table, sch = path[-1], path[0] + + context.setdefault('table', table) + context.setdefault('schema', sch) + context.setdefault('fullname', preparer.format_table(ddl.target)) + + return self.sql_compiler.post_process_text(ddl.statement % context) + + def visit_create_schema(self, create): + schema = self.preparer.format_schema(create.element) + return "CREATE SCHEMA " + schema + + def visit_drop_schema(self, drop): + schema = self.preparer.format_schema(drop.element) + text = "DROP SCHEMA " + schema + if drop.cascade: + text += " CASCADE" + return text + + def visit_create_table(self, create): + table = create.element + preparer = self.preparer + + text = "\nCREATE " + if table._prefixes: + text += " ".join(table._prefixes) + " " + text += "TABLE " + preparer.format_table(table) + " " + + create_table_suffix = self.create_table_suffix(table) + if create_table_suffix: + text += create_table_suffix + " " + + text += "(" + + separator = "\n" + + # if only one primary key, specify it along with the column + first_pk = False + for create_column in create.columns: + column = create_column.element + try: + processed = self.process(create_column, + first_pk=column.primary_key + and not first_pk) + if processed is not None: + text += separator + separator = ", \n" + text += "\t" + processed + if column.primary_key: + first_pk = True + except exc.CompileError as ce: + util.raise_from_cause( + exc.CompileError( + util.u("(in table '%s', column '%s'): %s") % + (table.description, column.name, ce.args[0]) + )) + + const = self.create_table_constraints( + table, _include_foreign_key_constraints= # noqa + create.include_foreign_key_constraints) + if const: + text += separator + "\t" + const + + text += "\n)%s\n\n" % self.post_create_table(table) + return text + + def visit_create_column(self, create, first_pk=False): + column = create.element + + if column.system: + return None + + text = self.get_column_specification( + column, + first_pk=first_pk + ) + const = " ".join(self.process(constraint) + for constraint in column.constraints) + if const: + text += " " + const + + return text + + def create_table_constraints( + self, table, + _include_foreign_key_constraints=None): + + # On some DB order is significant: visit PK first, then the + # other constraints (engine.ReflectionTest.testbasic failed on FB2) + constraints = [] + if table.primary_key: + constraints.append(table.primary_key) + + all_fkcs = table.foreign_key_constraints + if _include_foreign_key_constraints is not None: + omit_fkcs = all_fkcs.difference(_include_foreign_key_constraints) + else: + omit_fkcs = set() + + constraints.extend([c for c in table._sorted_constraints + if c is not table.primary_key and + c not in omit_fkcs]) + + return ", \n\t".join( + p for p in + (self.process(constraint) + for constraint in constraints + if ( + constraint._create_rule is None or + constraint._create_rule(self)) + and ( + not self.dialect.supports_alter or + not getattr(constraint, 'use_alter', False) + )) if p is not None + ) + + def visit_drop_table(self, drop): + return "\nDROP TABLE " + self.preparer.format_table(drop.element) + + def visit_drop_view(self, drop): + return "\nDROP VIEW " + self.preparer.format_table(drop.element) + + def _verify_index_table(self, index): + if index.table is None: + raise exc.CompileError("Index '%s' is not associated " + "with any table." % index.name) + + def visit_create_index(self, create, include_schema=False, + include_table_schema=True): + index = create.element + self._verify_index_table(index) + preparer = self.preparer + text = "CREATE " + if index.unique: + text += "UNIQUE " + text += "INDEX %s ON %s (%s)" \ + % ( + self._prepared_index_name(index, + include_schema=include_schema), + preparer.format_table(index.table, + use_schema=include_table_schema), + ', '.join( + self.sql_compiler.process( + expr, include_table=False, literal_binds=True) for + expr in index.expressions) + ) + return text + + def visit_drop_index(self, drop): + index = drop.element + return "\nDROP INDEX " + self._prepared_index_name( + index, include_schema=True) + + def _prepared_index_name(self, index, include_schema=False): + if index.table is not None: + effective_schema = self.preparer.schema_for_object(index.table) + else: + effective_schema = None + if include_schema and effective_schema: + schema_name = self.preparer.quote_schema(effective_schema) + else: + schema_name = None + + ident = index.name + if isinstance(ident, elements._truncated_label): + max_ = self.dialect.max_index_name_length or \ + self.dialect.max_identifier_length + if len(ident) > max_: + ident = ident[0:max_ - 8] + \ + "_" + util.md5_hex(ident)[-4:] + else: + self.dialect.validate_identifier(ident) + + index_name = self.preparer.quote(ident) + + if schema_name: + index_name = schema_name + "." + index_name + return index_name + + def visit_add_constraint(self, create): + return "ALTER TABLE %s ADD %s" % ( + self.preparer.format_table(create.element.table), + self.process(create.element) + ) + + def visit_create_sequence(self, create): + text = "CREATE SEQUENCE %s" % \ + self.preparer.format_sequence(create.element) + if create.element.increment is not None: + text += " INCREMENT BY %d" % create.element.increment + if create.element.start is not None: + text += " START WITH %d" % create.element.start + if create.element.minvalue is not None: + text += " MINVALUE %d" % create.element.minvalue + if create.element.maxvalue is not None: + text += " MAXVALUE %d" % create.element.maxvalue + if create.element.nominvalue is not None: + text += " NO MINVALUE" + if create.element.nomaxvalue is not None: + text += " NO MAXVALUE" + if create.element.cycle is not None: + text += " CYCLE" + return text + + def visit_drop_sequence(self, drop): + return "DROP SEQUENCE %s" % \ + self.preparer.format_sequence(drop.element) + + def visit_drop_constraint(self, drop): + constraint = drop.element + if constraint.name is not None: + formatted_name = self.preparer.format_constraint(constraint) + else: + formatted_name = None + + if formatted_name is None: + raise exc.CompileError( + "Can't emit DROP CONSTRAINT for constraint %r; " + "it has no name" % drop.element) + return "ALTER TABLE %s DROP CONSTRAINT %s%s" % ( + self.preparer.format_table(drop.element.table), + formatted_name, + drop.cascade and " CASCADE" or "" + ) + + def get_column_specification(self, column, **kwargs): + colspec = self.preparer.format_column(column) + " " + \ + self.dialect.type_compiler.process( + column.type, type_expression=column) + default = self.get_column_default_string(column) + if default is not None: + colspec += " DEFAULT " + default + + if not column.nullable: + colspec += " NOT NULL" + return colspec + + def create_table_suffix(self, table): + return '' + + def post_create_table(self, table): + return '' + + def get_column_default_string(self, column): + if isinstance(column.server_default, schema.DefaultClause): + if isinstance(column.server_default.arg, util.string_types): + return self.sql_compiler.render_literal_value( + column.server_default.arg, sqltypes.STRINGTYPE) + else: + return self.sql_compiler.process( + column.server_default.arg, literal_binds=True) + else: + return None + + def visit_check_constraint(self, constraint): + text = "" + if constraint.name is not None: + formatted_name = self.preparer.format_constraint(constraint) + if formatted_name is not None: + text += "CONSTRAINT %s " % formatted_name + text += "CHECK (%s)" % self.sql_compiler.process(constraint.sqltext, + include_table=False, + literal_binds=True) + text += self.define_constraint_deferrability(constraint) + return text + + def visit_column_check_constraint(self, constraint): + text = "" + if constraint.name is not None: + formatted_name = self.preparer.format_constraint(constraint) + if formatted_name is not None: + text += "CONSTRAINT %s " % formatted_name + text += "CHECK (%s)" % constraint.sqltext + text += self.define_constraint_deferrability(constraint) + return text + + def visit_primary_key_constraint(self, constraint): + if len(constraint) == 0: + return '' + text = "" + if constraint.name is not None: + formatted_name = self.preparer.format_constraint(constraint) + if formatted_name is not None: + text += "CONSTRAINT %s " % formatted_name + text += "PRIMARY KEY " + text += "(%s)" % ', '.join(self.preparer.quote(c.name) + for c in (constraint.columns_autoinc_first + if constraint._implicit_generated + else constraint.columns)) + text += self.define_constraint_deferrability(constraint) + return text + + def visit_foreign_key_constraint(self, constraint): + preparer = self.preparer + text = "" + if constraint.name is not None: + formatted_name = self.preparer.format_constraint(constraint) + if formatted_name is not None: + text += "CONSTRAINT %s " % formatted_name + remote_table = list(constraint.elements)[0].column.table + text += "FOREIGN KEY(%s) REFERENCES %s (%s)" % ( + ', '.join(preparer.quote(f.parent.name) + for f in constraint.elements), + self.define_constraint_remote_table( + constraint, remote_table, preparer), + ', '.join(preparer.quote(f.column.name) + for f in constraint.elements) + ) + text += self.define_constraint_match(constraint) + text += self.define_constraint_cascades(constraint) + text += self.define_constraint_deferrability(constraint) + return text + + def define_constraint_remote_table(self, constraint, table, preparer): + """Format the remote table clause of a CREATE CONSTRAINT clause.""" + + return preparer.format_table(table) + + def visit_unique_constraint(self, constraint): + if len(constraint) == 0: + return '' + text = "" + if constraint.name is not None: + formatted_name = self.preparer.format_constraint(constraint) + text += "CONSTRAINT %s " % formatted_name + text += "UNIQUE (%s)" % ( + ', '.join(self.preparer.quote(c.name) + for c in constraint)) + text += self.define_constraint_deferrability(constraint) + return text + + def define_constraint_cascades(self, constraint): + text = "" + if constraint.ondelete is not None: + text += " ON DELETE %s" % constraint.ondelete + if constraint.onupdate is not None: + text += " ON UPDATE %s" % constraint.onupdate + return text + + def define_constraint_deferrability(self, constraint): + text = "" + if constraint.deferrable is not None: + if constraint.deferrable: + text += " DEFERRABLE" + else: + text += " NOT DEFERRABLE" + if constraint.initially is not None: + text += " INITIALLY %s" % constraint.initially + return text + + def define_constraint_match(self, constraint): + text = "" + if constraint.match is not None: + text += " MATCH %s" % constraint.match + return text + + +class GenericTypeCompiler(TypeCompiler): + + def visit_FLOAT(self, type_, **kw): + return "FLOAT" + + def visit_REAL(self, type_, **kw): + return "REAL" + + def visit_NUMERIC(self, type_, **kw): + if type_.precision is None: + return "NUMERIC" + elif type_.scale is None: + return "NUMERIC(%(precision)s)" % \ + {'precision': type_.precision} + else: + return "NUMERIC(%(precision)s, %(scale)s)" % \ + {'precision': type_.precision, + 'scale': type_.scale} + + def visit_DECIMAL(self, type_, **kw): + if type_.precision is None: + return "DECIMAL" + elif type_.scale is None: + return "DECIMAL(%(precision)s)" % \ + {'precision': type_.precision} + else: + return "DECIMAL(%(precision)s, %(scale)s)" % \ + {'precision': type_.precision, + 'scale': type_.scale} + + def visit_INTEGER(self, type_, **kw): + return "INTEGER" + + def visit_SMALLINT(self, type_, **kw): + return "SMALLINT" + + def visit_BIGINT(self, type_, **kw): + return "BIGINT" + + def visit_TIMESTAMP(self, type_, **kw): + return 'TIMESTAMP' + + def visit_DATETIME(self, type_, **kw): + return "DATETIME" + + def visit_DATE(self, type_, **kw): + return "DATE" + + def visit_TIME(self, type_, **kw): + return "TIME" + + def visit_CLOB(self, type_, **kw): + return "CLOB" + + def visit_NCLOB(self, type_, **kw): + return "NCLOB" + + def _render_string_type(self, type_, name): + + text = name + if type_.length: + text += "(%d)" % type_.length + if type_.collation: + text += ' COLLATE "%s"' % type_.collation + return text + + def visit_CHAR(self, type_, **kw): + return self._render_string_type(type_, "CHAR") + + def visit_NCHAR(self, type_, **kw): + return self._render_string_type(type_, "NCHAR") + + def visit_VARCHAR(self, type_, **kw): + return self._render_string_type(type_, "VARCHAR") + + def visit_NVARCHAR(self, type_, **kw): + return self._render_string_type(type_, "NVARCHAR") + + def visit_TEXT(self, type_, **kw): + return self._render_string_type(type_, "TEXT") + + def visit_BLOB(self, type_, **kw): + return "BLOB" + + def visit_BINARY(self, type_, **kw): + return "BINARY" + (type_.length and "(%d)" % type_.length or "") + + def visit_VARBINARY(self, type_, **kw): + return "VARBINARY" + (type_.length and "(%d)" % type_.length or "") + + def visit_BOOLEAN(self, type_, **kw): + return "BOOLEAN" + + def visit_large_binary(self, type_, **kw): + return self.visit_BLOB(type_, **kw) + + def visit_boolean(self, type_, **kw): + return self.visit_BOOLEAN(type_, **kw) + + def visit_time(self, type_, **kw): + return self.visit_TIME(type_, **kw) + + def visit_datetime(self, type_, **kw): + return self.visit_DATETIME(type_, **kw) + + def visit_date(self, type_, **kw): + return self.visit_DATE(type_, **kw) + + def visit_big_integer(self, type_, **kw): + return self.visit_BIGINT(type_, **kw) + + def visit_small_integer(self, type_, **kw): + return self.visit_SMALLINT(type_, **kw) + + def visit_integer(self, type_, **kw): + return self.visit_INTEGER(type_, **kw) + + def visit_real(self, type_, **kw): + return self.visit_REAL(type_, **kw) + + def visit_float(self, type_, **kw): + return self.visit_FLOAT(type_, **kw) + + def visit_numeric(self, type_, **kw): + return self.visit_NUMERIC(type_, **kw) + + def visit_string(self, type_, **kw): + return self.visit_VARCHAR(type_, **kw) + + def visit_unicode(self, type_, **kw): + return self.visit_VARCHAR(type_, **kw) + + def visit_text(self, type_, **kw): + return self.visit_TEXT(type_, **kw) + + def visit_unicode_text(self, type_, **kw): + return self.visit_TEXT(type_, **kw) + + def visit_enum(self, type_, **kw): + return self.visit_VARCHAR(type_, **kw) + + def visit_null(self, type_, **kw): + raise exc.CompileError("Can't generate DDL for %r; " + "did you forget to specify a " + "type on this Column?" % type_) + + def visit_type_decorator(self, type_, **kw): + return self.process(type_.type_engine(self.dialect), **kw) + + def visit_user_defined(self, type_, **kw): + return type_.get_col_spec(**kw) + + +class StrSQLTypeCompiler(GenericTypeCompiler): + def __getattr__(self, key): + if key.startswith("visit_"): + return self._visit_unknown + else: + raise AttributeError(key) + + def _visit_unknown(self, type_, **kw): + return "%s" % type_.__class__.__name__ + + +class IdentifierPreparer(object): + + """Handle quoting and case-folding of identifiers based on options.""" + + reserved_words = RESERVED_WORDS + + legal_characters = LEGAL_CHARACTERS + + illegal_initial_characters = ILLEGAL_INITIAL_CHARACTERS + + schema_for_object = schema._schema_getter(None) + + def __init__(self, dialect, initial_quote='"', + final_quote=None, escape_quote='"', omit_schema=False): + """Construct a new ``IdentifierPreparer`` object. + + initial_quote + Character that begins a delimited identifier. + + final_quote + Character that ends a delimited identifier. Defaults to + `initial_quote`. + + omit_schema + Prevent prepending schema name. Useful for databases that do + not support schemae. + """ + + self.dialect = dialect + self.initial_quote = initial_quote + self.final_quote = final_quote or self.initial_quote + self.escape_quote = escape_quote + self.escape_to_quote = self.escape_quote * 2 + self.omit_schema = omit_schema + self._strings = {} + + def _with_schema_translate(self, schema_translate_map): + prep = self.__class__.__new__(self.__class__) + prep.__dict__.update(self.__dict__) + prep.schema_for_object = schema._schema_getter(schema_translate_map) + return prep + + def _escape_identifier(self, value): + """Escape an identifier. + + Subclasses should override this to provide database-dependent + escaping behavior. + """ + + return value.replace(self.escape_quote, self.escape_to_quote) + + def _unescape_identifier(self, value): + """Canonicalize an escaped identifier. + + Subclasses should override this to provide database-dependent + unescaping behavior that reverses _escape_identifier. + """ + + return value.replace(self.escape_to_quote, self.escape_quote) + + def quote_identifier(self, value): + """Quote an identifier. + + Subclasses should override this to provide database-dependent + quoting behavior. + """ + + return self.initial_quote + \ + self._escape_identifier(value) + \ + self.final_quote + + def _requires_quotes(self, value): + """Return True if the given identifier requires quoting.""" + lc_value = value.lower() + return (lc_value in self.reserved_words + or value[0] in self.illegal_initial_characters + or not self.legal_characters.match(util.text_type(value)) + or (lc_value != value)) + + def quote_schema(self, schema, force=None): + """Conditionally quote a schema. + + Subclasses can override this to provide database-dependent + quoting behavior for schema names. + + the 'force' flag should be considered deprecated. + + """ + return self.quote(schema, force) + + def quote(self, ident, force=None): + """Conditionally quote an identifier. + + the 'force' flag should be considered deprecated. + """ + + force = getattr(ident, "quote", None) + + if force is None: + if ident in self._strings: + return self._strings[ident] + else: + if self._requires_quotes(ident): + self._strings[ident] = self.quote_identifier(ident) + else: + self._strings[ident] = ident + return self._strings[ident] + elif force: + return self.quote_identifier(ident) + else: + return ident + + def format_sequence(self, sequence, use_schema=True): + name = self.quote(sequence.name) + + effective_schema = self.schema_for_object(sequence) + + if (not self.omit_schema and use_schema and + effective_schema is not None): + name = self.quote_schema(effective_schema) + "." + name + return name + + def format_label(self, label, name=None): + return self.quote(name or label.name) + + def format_alias(self, alias, name=None): + return self.quote(name or alias.name) + + def format_savepoint(self, savepoint, name=None): + # Running the savepoint name through quoting is unnecessary + # for all known dialects. This is here to support potential + # third party use cases + ident = name or savepoint.ident + if self._requires_quotes(ident): + ident = self.quote_identifier(ident) + return ident + + @util.dependencies("sqlalchemy.sql.naming") + def format_constraint(self, naming, constraint): + if isinstance(constraint.name, elements._defer_name): + name = naming._constraint_name_for_table( + constraint, constraint.table) + if name: + return self.quote(name) + elif isinstance(constraint.name, elements._defer_none_name): + return None + return self.quote(constraint.name) + + def format_table(self, table, use_schema=True, name=None): + """Prepare a quoted table and schema name.""" + + if name is None: + name = table.name + result = self.quote(name) + + effective_schema = self.schema_for_object(table) + + if not self.omit_schema and use_schema \ + and effective_schema: + result = self.quote_schema(effective_schema) + "." + result + return result + + def format_schema(self, name, quote=None): + """Prepare a quoted schema name.""" + + return self.quote(name, quote) + + def format_column(self, column, use_table=False, + name=None, table_name=None): + """Prepare a quoted column name.""" + + if name is None: + name = column.name + if not getattr(column, 'is_literal', False): + if use_table: + return self.format_table( + column.table, use_schema=False, + name=table_name) + "." + self.quote(name) + else: + return self.quote(name) + else: + # literal textual elements get stuck into ColumnClause a lot, + # which shouldn't get quoted + + if use_table: + return self.format_table( + column.table, use_schema=False, + name=table_name) + '.' + name + else: + return name + + def format_table_seq(self, table, use_schema=True): + """Format table name and schema as a tuple.""" + + # Dialects with more levels in their fully qualified references + # ('database', 'owner', etc.) could override this and return + # a longer sequence. + + effective_schema = self.schema_for_object(table) + + if not self.omit_schema and use_schema and \ + effective_schema: + return (self.quote_schema(effective_schema), + self.format_table(table, use_schema=False)) + else: + return (self.format_table(table, use_schema=False), ) + + @util.memoized_property + def _r_identifiers(self): + initial, final, escaped_final = \ + [re.escape(s) for s in + (self.initial_quote, self.final_quote, + self._escape_identifier(self.final_quote))] + r = re.compile( + r'(?:' + r'(?:%(initial)s((?:%(escaped)s|[^%(final)s])+)%(final)s' + r'|([^\.]+))(?=\.|$))+' % + {'initial': initial, + 'final': final, + 'escaped': escaped_final}) + return r + + def unformat_identifiers(self, identifiers): + """Unpack 'schema.table.column'-like strings into components.""" + + r = self._r_identifiers + return [self._unescape_identifier(i) + for i in [a or b for a, b in r.findall(identifiers)]] diff --git a/app/lib/sqlalchemy/sql/crud.py b/app/lib/sqlalchemy/sql/crud.py new file mode 100644 index 0000000..5739c22 --- /dev/null +++ b/app/lib/sqlalchemy/sql/crud.py @@ -0,0 +1,692 @@ +# sql/crud.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Functions used by compiler.py to determine the parameters rendered +within INSERT and UPDATE statements. + +""" +from .. import util +from .. import exc +from . import dml +from . import elements +import operator + +REQUIRED = util.symbol('REQUIRED', """ +Placeholder for the value within a :class:`.BindParameter` +which is required to be present when the statement is passed +to :meth:`.Connection.execute`. + +This symbol is typically used when a :func:`.expression.insert` +or :func:`.expression.update` statement is compiled without parameter +values present. + +""") + +ISINSERT = util.symbol('ISINSERT') +ISUPDATE = util.symbol('ISUPDATE') +ISDELETE = util.symbol('ISDELETE') + + +def _setup_crud_params(compiler, stmt, local_stmt_type, **kw): + restore_isinsert = compiler.isinsert + restore_isupdate = compiler.isupdate + restore_isdelete = compiler.isdelete + + should_restore = ( + restore_isinsert or restore_isupdate or restore_isdelete + ) or len(compiler.stack) > 1 + + if local_stmt_type is ISINSERT: + compiler.isupdate = False + compiler.isinsert = True + elif local_stmt_type is ISUPDATE: + compiler.isupdate = True + compiler.isinsert = False + elif local_stmt_type is ISDELETE: + if not should_restore: + compiler.isdelete = True + else: + assert False, "ISINSERT, ISUPDATE, or ISDELETE expected" + + try: + if local_stmt_type in (ISINSERT, ISUPDATE): + return _get_crud_params(compiler, stmt, **kw) + finally: + if should_restore: + compiler.isinsert = restore_isinsert + compiler.isupdate = restore_isupdate + compiler.isdelete = restore_isdelete + + +def _get_crud_params(compiler, stmt, **kw): + """create a set of tuples representing column/string pairs for use + in an INSERT or UPDATE statement. + + Also generates the Compiled object's postfetch, prefetch, and + returning column collections, used for default handling and ultimately + populating the ResultProxy's prefetch_cols() and postfetch_cols() + collections. + + """ + + compiler.postfetch = [] + compiler.insert_prefetch = [] + compiler.update_prefetch = [] + compiler.returning = [] + + # no parameters in the statement, no parameters in the + # compiled params - return binds for all columns + if compiler.column_keys is None and stmt.parameters is None: + return [ + (c, _create_bind_param( + compiler, c, None, required=True)) + for c in stmt.table.columns + ] + + if stmt._has_multi_parameters: + stmt_parameters = stmt.parameters[0] + else: + stmt_parameters = stmt.parameters + + # getters - these are normally just column.key, + # but in the case of mysql multi-table update, the rules for + # .key must conditionally take tablename into account + _column_as_key, _getattr_col_key, _col_bind_name = \ + _key_getters_for_crud_column(compiler, stmt) + + # if we have statement parameters - set defaults in the + # compiled params + if compiler.column_keys is None: + parameters = {} + else: + parameters = dict((_column_as_key(key), REQUIRED) + for key in compiler.column_keys + if not stmt_parameters or + key not in stmt_parameters) + + # create a list of column assignment clauses as tuples + values = [] + + if stmt_parameters is not None: + _get_stmt_parameters_params( + compiler, + parameters, stmt_parameters, _column_as_key, values, kw) + + check_columns = {} + + # special logic that only occurs for multi-table UPDATE + # statements + if compiler.isupdate and stmt._extra_froms and stmt_parameters: + _get_multitable_params( + compiler, stmt, stmt_parameters, check_columns, + _col_bind_name, _getattr_col_key, values, kw) + + if compiler.isinsert and stmt.select_names: + _scan_insert_from_select_cols( + compiler, stmt, parameters, + _getattr_col_key, _column_as_key, + _col_bind_name, check_columns, values, kw) + else: + _scan_cols( + compiler, stmt, parameters, + _getattr_col_key, _column_as_key, + _col_bind_name, check_columns, values, kw) + + if parameters and stmt_parameters: + check = set(parameters).intersection( + _column_as_key(k) for k in stmt_parameters + ).difference(check_columns) + if check: + raise exc.CompileError( + "Unconsumed column names: %s" % + (", ".join("%s" % c for c in check)) + ) + + if stmt._has_multi_parameters: + values = _extend_values_for_multiparams(compiler, stmt, values, kw) + + return values + + +def _create_bind_param( + compiler, col, value, process=True, + required=False, name=None, **kw): + if name is None: + name = col.key + bindparam = elements.BindParameter( + name, value, type_=col.type, required=required) + bindparam._is_crud = True + if process: + bindparam = bindparam._compiler_dispatch(compiler, **kw) + return bindparam + + +def _key_getters_for_crud_column(compiler, stmt): + if compiler.isupdate and stmt._extra_froms: + # when extra tables are present, refer to the columns + # in those extra tables as table-qualified, including in + # dictionaries and when rendering bind param names. + # the "main" table of the statement remains unqualified, + # allowing the most compatibility with a non-multi-table + # statement. + _et = set(stmt._extra_froms) + + def _column_as_key(key): + str_key = elements._column_as_key(key) + if hasattr(key, 'table') and key.table in _et: + return (key.table.name, str_key) + else: + return str_key + + def _getattr_col_key(col): + if col.table in _et: + return (col.table.name, col.key) + else: + return col.key + + def _col_bind_name(col): + if col.table in _et: + return "%s_%s" % (col.table.name, col.key) + else: + return col.key + + else: + _column_as_key = elements._column_as_key + _getattr_col_key = _col_bind_name = operator.attrgetter("key") + + return _column_as_key, _getattr_col_key, _col_bind_name + + +def _scan_insert_from_select_cols( + compiler, stmt, parameters, _getattr_col_key, + _column_as_key, _col_bind_name, check_columns, values, kw): + + need_pks, implicit_returning, \ + implicit_return_defaults, postfetch_lastrowid = \ + _get_returning_modifiers(compiler, stmt) + + cols = [stmt.table.c[_column_as_key(name)] + for name in stmt.select_names] + + compiler._insert_from_select = stmt.select + + add_select_cols = [] + if stmt.include_insert_from_select_defaults: + col_set = set(cols) + for col in stmt.table.columns: + if col not in col_set and col.default: + cols.append(col) + + for c in cols: + col_key = _getattr_col_key(c) + if col_key in parameters and col_key not in check_columns: + parameters.pop(col_key) + values.append((c, None)) + else: + _append_param_insert_select_hasdefault( + compiler, stmt, c, add_select_cols, kw) + + if add_select_cols: + values.extend(add_select_cols) + compiler._insert_from_select = compiler._insert_from_select._generate() + compiler._insert_from_select._raw_columns = \ + tuple(compiler._insert_from_select._raw_columns) + tuple( + expr for col, expr in add_select_cols) + + +def _scan_cols( + compiler, stmt, parameters, _getattr_col_key, + _column_as_key, _col_bind_name, check_columns, values, kw): + + need_pks, implicit_returning, \ + implicit_return_defaults, postfetch_lastrowid = \ + _get_returning_modifiers(compiler, stmt) + + if stmt._parameter_ordering: + parameter_ordering = [ + _column_as_key(key) for key in stmt._parameter_ordering + ] + ordered_keys = set(parameter_ordering) + cols = [ + stmt.table.c[key] for key in parameter_ordering + ] + [ + c for c in stmt.table.c if c.key not in ordered_keys + ] + else: + cols = stmt.table.columns + + for c in cols: + col_key = _getattr_col_key(c) + + if col_key in parameters and col_key not in check_columns: + + _append_param_parameter( + compiler, stmt, c, col_key, parameters, _col_bind_name, + implicit_returning, implicit_return_defaults, values, kw) + + elif compiler.isinsert: + if c.primary_key and \ + need_pks and \ + ( + implicit_returning or + not postfetch_lastrowid or + c is not stmt.table._autoincrement_column + ): + + if implicit_returning: + _append_param_insert_pk_returning( + compiler, stmt, c, values, kw) + else: + _append_param_insert_pk(compiler, stmt, c, values, kw) + + elif c.default is not None: + + _append_param_insert_hasdefault( + compiler, stmt, c, implicit_return_defaults, + values, kw) + + elif c.server_default is not None: + if implicit_return_defaults and \ + c in implicit_return_defaults: + compiler.returning.append(c) + elif not c.primary_key: + compiler.postfetch.append(c) + elif implicit_return_defaults and \ + c in implicit_return_defaults: + compiler.returning.append(c) + elif c.primary_key and \ + c is not stmt.table._autoincrement_column and \ + not c.nullable: + _warn_pk_with_no_anticipated_value(c) + + elif compiler.isupdate: + _append_param_update( + compiler, stmt, c, implicit_return_defaults, values, kw) + + +def _append_param_parameter( + compiler, stmt, c, col_key, parameters, _col_bind_name, + implicit_returning, implicit_return_defaults, values, kw): + value = parameters.pop(col_key) + if elements._is_literal(value): + value = _create_bind_param( + compiler, c, value, required=value is REQUIRED, + name=_col_bind_name(c) + if not stmt._has_multi_parameters + else "%s_m0" % _col_bind_name(c), + **kw + ) + else: + if isinstance(value, elements.BindParameter) and \ + value.type._isnull: + value = value._clone() + value.type = c.type + + if c.primary_key and implicit_returning: + compiler.returning.append(c) + value = compiler.process(value.self_group(), **kw) + elif implicit_return_defaults and \ + c in implicit_return_defaults: + compiler.returning.append(c) + value = compiler.process(value.self_group(), **kw) + else: + compiler.postfetch.append(c) + value = compiler.process(value.self_group(), **kw) + values.append((c, value)) + + +def _append_param_insert_pk_returning(compiler, stmt, c, values, kw): + """Create a primary key expression in the INSERT statement and + possibly a RETURNING clause for it. + + If the column has a Python-side default, we will create a bound + parameter for it and "pre-execute" the Python function. If + the column has a SQL expression default, or is a sequence, + we will add it directly into the INSERT statement and add a + RETURNING element to get the new value. If the column has a + server side default or is marked as the "autoincrement" column, + we will add a RETRUNING element to get at the value. + + If all the above tests fail, that indicates a primary key column with no + noted default generation capabilities that has no parameter passed; + raise an exception. + + """ + if c.default is not None: + if c.default.is_sequence: + if compiler.dialect.supports_sequences and \ + (not c.default.optional or + not compiler.dialect.sequences_optional): + proc = compiler.process(c.default, **kw) + values.append((c, proc)) + compiler.returning.append(c) + elif c.default.is_clause_element: + values.append( + (c, compiler.process( + c.default.arg.self_group(), **kw)) + ) + compiler.returning.append(c) + else: + values.append( + (c, _create_insert_prefetch_bind_param(compiler, c)) + ) + elif c is stmt.table._autoincrement_column or c.server_default is not None: + compiler.returning.append(c) + elif not c.nullable: + # no .default, no .server_default, not autoincrement, we have + # no indication this primary key column will have any value + _warn_pk_with_no_anticipated_value(c) + + +def _create_insert_prefetch_bind_param(compiler, c, process=True, name=None): + param = _create_bind_param(compiler, c, None, process=process, name=name) + compiler.insert_prefetch.append(c) + return param + + +def _create_update_prefetch_bind_param(compiler, c, process=True, name=None): + param = _create_bind_param(compiler, c, None, process=process, name=name) + compiler.update_prefetch.append(c) + return param + + +class _multiparam_column(elements.ColumnElement): + def __init__(self, original, index): + self.key = "%s_m%d" % (original.key, index + 1) + self.original = original + self.default = original.default + self.type = original.type + + def __eq__(self, other): + return isinstance(other, _multiparam_column) and \ + other.key == self.key and \ + other.original == self.original + + +def _process_multiparam_default_bind(compiler, stmt, c, index, kw): + + if not c.default: + raise exc.CompileError( + "INSERT value for column %s is explicitly rendered as a bound" + "parameter in the VALUES clause; " + "a Python-side value or SQL expression is required" % c) + elif c.default.is_clause_element: + return compiler.process(c.default.arg.self_group(), **kw) + else: + col = _multiparam_column(c, index) + if isinstance(stmt, dml.Insert): + return _create_insert_prefetch_bind_param(compiler, col) + else: + return _create_update_prefetch_bind_param(compiler, col) + + +def _append_param_insert_pk(compiler, stmt, c, values, kw): + """Create a bound parameter in the INSERT statement to receive a + 'prefetched' default value. + + The 'prefetched' value indicates that we are to invoke a Python-side + default function or expliclt SQL expression before the INSERT statement + proceeds, so that we have a primary key value available. + + if the column has no noted default generation capabilities, it has + no value passed in either; raise an exception. + + """ + if ( + ( + # column has a Python-side default + c.default is not None and + ( + # and it won't be a Sequence + not c.default.is_sequence or + compiler.dialect.supports_sequences + ) + ) + or + ( + # column is the "autoincrement column" + c is stmt.table._autoincrement_column and + ( + # and it's either a "sequence" or a + # pre-executable "autoincrement" sequence + compiler.dialect.supports_sequences or + compiler.dialect.preexecute_autoincrement_sequences + ) + ) + ): + values.append( + (c, _create_insert_prefetch_bind_param(compiler, c)) + ) + elif c.default is None and c.server_default is None and not c.nullable: + # no .default, no .server_default, not autoincrement, we have + # no indication this primary key column will have any value + _warn_pk_with_no_anticipated_value(c) + + +def _append_param_insert_hasdefault( + compiler, stmt, c, implicit_return_defaults, values, kw): + + if c.default.is_sequence: + if compiler.dialect.supports_sequences and \ + (not c.default.optional or + not compiler.dialect.sequences_optional): + proc = compiler.process(c.default, **kw) + values.append((c, proc)) + if implicit_return_defaults and \ + c in implicit_return_defaults: + compiler.returning.append(c) + elif not c.primary_key: + compiler.postfetch.append(c) + elif c.default.is_clause_element: + proc = compiler.process(c.default.arg.self_group(), **kw) + values.append((c, proc)) + + if implicit_return_defaults and \ + c in implicit_return_defaults: + compiler.returning.append(c) + elif not c.primary_key: + # don't add primary key column to postfetch + compiler.postfetch.append(c) + else: + values.append( + (c, _create_insert_prefetch_bind_param(compiler, c)) + ) + + +def _append_param_insert_select_hasdefault( + compiler, stmt, c, values, kw): + + if c.default.is_sequence: + if compiler.dialect.supports_sequences and \ + (not c.default.optional or + not compiler.dialect.sequences_optional): + proc = c.default + values.append((c, proc.next_value())) + elif c.default.is_clause_element: + proc = c.default.arg.self_group() + values.append((c, proc)) + else: + values.append( + (c, _create_insert_prefetch_bind_param(compiler, c, process=False)) + ) + + +def _append_param_update( + compiler, stmt, c, implicit_return_defaults, values, kw): + + if c.onupdate is not None and not c.onupdate.is_sequence: + if c.onupdate.is_clause_element: + values.append( + (c, compiler.process( + c.onupdate.arg.self_group(), **kw)) + ) + if implicit_return_defaults and \ + c in implicit_return_defaults: + compiler.returning.append(c) + else: + compiler.postfetch.append(c) + else: + values.append( + (c, _create_update_prefetch_bind_param(compiler, c)) + ) + elif c.server_onupdate is not None: + if implicit_return_defaults and \ + c in implicit_return_defaults: + compiler.returning.append(c) + else: + compiler.postfetch.append(c) + elif implicit_return_defaults and \ + stmt._return_defaults is not True and \ + c in implicit_return_defaults: + compiler.returning.append(c) + + +def _get_multitable_params( + compiler, stmt, stmt_parameters, check_columns, + _col_bind_name, _getattr_col_key, values, kw): + + normalized_params = dict( + (elements._clause_element_as_expr(c), param) + for c, param in stmt_parameters.items() + ) + affected_tables = set() + for t in stmt._extra_froms: + for c in t.c: + if c in normalized_params: + affected_tables.add(t) + check_columns[_getattr_col_key(c)] = c + value = normalized_params[c] + if elements._is_literal(value): + value = _create_bind_param( + compiler, c, value, required=value is REQUIRED, + name=_col_bind_name(c)) + else: + compiler.postfetch.append(c) + value = compiler.process(value.self_group(), **kw) + values.append((c, value)) + # determine tables which are actually to be updated - process onupdate + # and server_onupdate for these + for t in affected_tables: + for c in t.c: + if c in normalized_params: + continue + elif (c.onupdate is not None and not + c.onupdate.is_sequence): + if c.onupdate.is_clause_element: + values.append( + (c, compiler.process( + c.onupdate.arg.self_group(), + **kw) + ) + ) + compiler.postfetch.append(c) + else: + values.append( + (c, _create_update_prefetch_bind_param( + compiler, c, name=_col_bind_name(c))) + ) + elif c.server_onupdate is not None: + compiler.postfetch.append(c) + + +def _extend_values_for_multiparams(compiler, stmt, values, kw): + values_0 = values + values = [values] + + values.extend( + [ + ( + c, + (_create_bind_param( + compiler, c, row[c.key], + name="%s_m%d" % (c.key, i + 1), **kw + ) if elements._is_literal(row[c.key]) + else compiler.process( + row[c.key].self_group(), **kw)) + if c.key in row else + _process_multiparam_default_bind(compiler, stmt, c, i, kw) + ) + for (c, param) in values_0 + ] + for i, row in enumerate(stmt.parameters[1:]) + ) + return values + + +def _get_stmt_parameters_params( + compiler, parameters, stmt_parameters, _column_as_key, values, kw): + for k, v in stmt_parameters.items(): + colkey = _column_as_key(k) + if colkey is not None: + parameters.setdefault(colkey, v) + else: + # a non-Column expression on the left side; + # add it to values() in an "as-is" state, + # coercing right side to bound param + if elements._is_literal(v): + v = compiler.process( + elements.BindParameter(None, v, type_=k.type), + **kw) + else: + v = compiler.process(v.self_group(), **kw) + + values.append((k, v)) + + +def _get_returning_modifiers(compiler, stmt): + need_pks = compiler.isinsert and \ + not compiler.inline and \ + not stmt._returning and \ + not stmt._has_multi_parameters + + implicit_returning = need_pks and \ + compiler.dialect.implicit_returning and \ + stmt.table.implicit_returning + + if compiler.isinsert: + implicit_return_defaults = (implicit_returning and + stmt._return_defaults) + elif compiler.isupdate: + implicit_return_defaults = (compiler.dialect.implicit_returning and + stmt.table.implicit_returning and + stmt._return_defaults) + else: + # this line is unused, currently we are always + # isinsert or isupdate + implicit_return_defaults = False # pragma: no cover + + if implicit_return_defaults: + if stmt._return_defaults is True: + implicit_return_defaults = set(stmt.table.c) + else: + implicit_return_defaults = set(stmt._return_defaults) + + postfetch_lastrowid = need_pks and compiler.dialect.postfetch_lastrowid + + return need_pks, implicit_returning, \ + implicit_return_defaults, postfetch_lastrowid + + +def _warn_pk_with_no_anticipated_value(c): + msg = ( + "Column '%s.%s' is marked as a member of the " + "primary key for table '%s', " + "but has no Python-side or server-side default generator indicated, " + "nor does it indicate 'autoincrement=True' or 'nullable=True', " + "and no explicit value is passed. " + "Primary key columns typically may not store NULL." + % + (c.table.fullname, c.name, c.table.fullname)) + if len(c.table.primary_key) > 1: + msg += ( + " Note that as of SQLAlchemy 1.1, 'autoincrement=True' must be " + "indicated explicitly for composite (e.g. multicolumn) primary " + "keys if AUTO_INCREMENT/SERIAL/IDENTITY " + "behavior is expected for one of the columns in the primary key. " + "CREATE TABLE statements are impacted by this change as well on " + "most backends.") + util.warn(msg) diff --git a/app/lib/sqlalchemy/sql/ddl.py b/app/lib/sqlalchemy/sql/ddl.py new file mode 100644 index 0000000..5463afe --- /dev/null +++ b/app/lib/sqlalchemy/sql/ddl.py @@ -0,0 +1,1100 @@ +# sql/ddl.py +# Copyright (C) 2009-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +""" +Provides the hierarchy of DDL-defining schema items as well as routines +to invoke them for a create/drop call. + +""" + +from .. import util +from .elements import ClauseElement +from .base import Executable, _generative, SchemaVisitor, _bind_or_error +from ..util import topological +from .. import event +from .. import exc + + +class _DDLCompiles(ClauseElement): + def _compiler(self, dialect, **kw): + """Return a compiler appropriate for this ClauseElement, given a + Dialect.""" + + return dialect.ddl_compiler(dialect, self, **kw) + + +class DDLElement(Executable, _DDLCompiles): + """Base class for DDL expression constructs. + + This class is the base for the general purpose :class:`.DDL` class, + as well as the various create/drop clause constructs such as + :class:`.CreateTable`, :class:`.DropTable`, :class:`.AddConstraint`, + etc. + + :class:`.DDLElement` integrates closely with SQLAlchemy events, + introduced in :ref:`event_toplevel`. An instance of one is + itself an event receiving callable:: + + event.listen( + users, + 'after_create', + AddConstraint(constraint).execute_if(dialect='postgresql') + ) + + .. seealso:: + + :class:`.DDL` + + :class:`.DDLEvents` + + :ref:`event_toplevel` + + :ref:`schema_ddl_sequences` + + """ + + _execution_options = Executable.\ + _execution_options.union({'autocommit': True}) + + target = None + on = None + dialect = None + callable_ = None + + def _execute_on_connection(self, connection, multiparams, params): + return connection._execute_ddl(self, multiparams, params) + + def execute(self, bind=None, target=None): + """Execute this DDL immediately. + + Executes the DDL statement in isolation using the supplied + :class:`.Connectable` or + :class:`.Connectable` assigned to the ``.bind`` + property, if not supplied. If the DDL has a conditional ``on`` + criteria, it will be invoked with None as the event. + + :param bind: + Optional, an ``Engine`` or ``Connection``. If not supplied, a valid + :class:`.Connectable` must be present in the + ``.bind`` property. + + :param target: + Optional, defaults to None. The target SchemaItem for the + execute call. Will be passed to the ``on`` callable if any, + and may also provide string expansion data for the + statement. See ``execute_at`` for more information. + + """ + + if bind is None: + bind = _bind_or_error(self) + + if self._should_execute(target, bind): + return bind.execute(self.against(target)) + else: + bind.engine.logger.info( + "DDL execution skipped, criteria not met.") + + @util.deprecated("0.7", "See :class:`.DDLEvents`, as well as " + ":meth:`.DDLElement.execute_if`.") + def execute_at(self, event_name, target): + """Link execution of this DDL to the DDL lifecycle of a SchemaItem. + + Links this ``DDLElement`` to a ``Table`` or ``MetaData`` instance, + executing it when that schema item is created or dropped. The DDL + statement will be executed using the same Connection and transactional + context as the Table create/drop itself. The ``.bind`` property of + this statement is ignored. + + :param event: + One of the events defined in the schema item's ``.ddl_events``; + e.g. 'before-create', 'after-create', 'before-drop' or 'after-drop' + + :param target: + The Table or MetaData instance for which this DDLElement will + be associated with. + + A DDLElement instance can be linked to any number of schema items. + + ``execute_at`` builds on the ``append_ddl_listener`` interface of + :class:`.MetaData` and :class:`.Table` objects. + + Caveat: Creating or dropping a Table in isolation will also trigger + any DDL set to ``execute_at`` that Table's MetaData. This may change + in a future release. + + """ + + def call_event(target, connection, **kw): + if self._should_execute_deprecated(event_name, + target, connection, **kw): + return connection.execute(self.against(target)) + + event.listen(target, "" + event_name.replace('-', '_'), call_event) + + @_generative + def against(self, target): + """Return a copy of this DDL against a specific schema item.""" + + self.target = target + + @_generative + def execute_if(self, dialect=None, callable_=None, state=None): + r"""Return a callable that will execute this + DDLElement conditionally. + + Used to provide a wrapper for event listening:: + + event.listen( + metadata, + 'before_create', + DDL("my_ddl").execute_if(dialect='postgresql') + ) + + :param dialect: May be a string, tuple or a callable + predicate. If a string, it will be compared to the name of the + executing database dialect:: + + DDL('something').execute_if(dialect='postgresql') + + If a tuple, specifies multiple dialect names:: + + DDL('something').execute_if(dialect=('postgresql', 'mysql')) + + :param callable_: A callable, which will be invoked with + four positional arguments as well as optional keyword + arguments: + + :ddl: + This DDL element. + + :target: + The :class:`.Table` or :class:`.MetaData` object which is the + target of this event. May be None if the DDL is executed + explicitly. + + :bind: + The :class:`.Connection` being used for DDL execution + + :tables: + Optional keyword argument - a list of Table objects which are to + be created/ dropped within a MetaData.create_all() or drop_all() + method call. + + :state: + Optional keyword argument - will be the ``state`` argument + passed to this function. + + :checkfirst: + Keyword argument, will be True if the 'checkfirst' flag was + set during the call to ``create()``, ``create_all()``, + ``drop()``, ``drop_all()``. + + If the callable returns a true value, the DDL statement will be + executed. + + :param state: any value which will be passed to the callable\_ + as the ``state`` keyword argument. + + .. seealso:: + + :class:`.DDLEvents` + + :ref:`event_toplevel` + + """ + self.dialect = dialect + self.callable_ = callable_ + self.state = state + + def _should_execute(self, target, bind, **kw): + if self.on is not None and \ + not self._should_execute_deprecated(None, target, bind, **kw): + return False + + if isinstance(self.dialect, util.string_types): + if self.dialect != bind.engine.name: + return False + elif isinstance(self.dialect, (tuple, list, set)): + if bind.engine.name not in self.dialect: + return False + if (self.callable_ is not None and + not self.callable_(self, target, bind, + state=self.state, **kw)): + return False + + return True + + def _should_execute_deprecated(self, event, target, bind, **kw): + if self.on is None: + return True + elif isinstance(self.on, util.string_types): + return self.on == bind.engine.name + elif isinstance(self.on, (tuple, list, set)): + return bind.engine.name in self.on + else: + return self.on(self, event, target, bind, **kw) + + def __call__(self, target, bind, **kw): + """Execute the DDL as a ddl_listener.""" + + if self._should_execute(target, bind, **kw): + return bind.execute(self.against(target)) + + def _check_ddl_on(self, on): + if (on is not None and + (not isinstance(on, util.string_types + (tuple, list, set)) and + not util.callable(on))): + raise exc.ArgumentError( + "Expected the name of a database dialect, a tuple " + "of names, or a callable for " + "'on' criteria, got type '%s'." % type(on).__name__) + + def bind(self): + if self._bind: + return self._bind + + def _set_bind(self, bind): + self._bind = bind + bind = property(bind, _set_bind) + + def _generate(self): + s = self.__class__.__new__(self.__class__) + s.__dict__ = self.__dict__.copy() + return s + + +class DDL(DDLElement): + """A literal DDL statement. + + Specifies literal SQL DDL to be executed by the database. DDL objects + function as DDL event listeners, and can be subscribed to those events + listed in :class:`.DDLEvents`, using either :class:`.Table` or + :class:`.MetaData` objects as targets. Basic templating support allows + a single DDL instance to handle repetitive tasks for multiple tables. + + Examples:: + + from sqlalchemy import event, DDL + + tbl = Table('users', metadata, Column('uid', Integer)) + event.listen(tbl, 'before_create', DDL('DROP TRIGGER users_trigger')) + + spow = DDL('ALTER TABLE %(table)s SET secretpowers TRUE') + event.listen(tbl, 'after_create', spow.execute_if(dialect='somedb')) + + drop_spow = DDL('ALTER TABLE users SET secretpowers FALSE') + connection.execute(drop_spow) + + When operating on Table events, the following ``statement`` + string substitions are available:: + + %(table)s - the Table name, with any required quoting applied + %(schema)s - the schema name, with any required quoting applied + %(fullname)s - the Table name including schema, quoted if needed + + The DDL's "context", if any, will be combined with the standard + substitutions noted above. Keys present in the context will override + the standard substitutions. + + """ + + __visit_name__ = "ddl" + + def __init__(self, statement, on=None, context=None, bind=None): + """Create a DDL statement. + + :param statement: + A string or unicode string to be executed. Statements will be + processed with Python's string formatting operator. See the + ``context`` argument and the ``execute_at`` method. + + A literal '%' in a statement must be escaped as '%%'. + + SQL bind parameters are not available in DDL statements. + + :param on: + .. deprecated:: 0.7 + See :meth:`.DDLElement.execute_if`. + + Optional filtering criteria. May be a string, tuple or a callable + predicate. If a string, it will be compared to the name of the + executing database dialect:: + + DDL('something', on='postgresql') + + If a tuple, specifies multiple dialect names:: + + DDL('something', on=('postgresql', 'mysql')) + + If a callable, it will be invoked with four positional arguments + as well as optional keyword arguments: + + :ddl: + This DDL element. + + :event: + The name of the event that has triggered this DDL, such as + 'after-create' Will be None if the DDL is executed explicitly. + + :target: + The ``Table`` or ``MetaData`` object which is the target of + this event. May be None if the DDL is executed explicitly. + + :connection: + The ``Connection`` being used for DDL execution + + :tables: + Optional keyword argument - a list of Table objects which are to + be created/ dropped within a MetaData.create_all() or drop_all() + method call. + + + If the callable returns a true value, the DDL statement will be + executed. + + :param context: + Optional dictionary, defaults to None. These values will be + available for use in string substitutions on the DDL statement. + + :param bind: + Optional. A :class:`.Connectable`, used by + default when ``execute()`` is invoked without a bind argument. + + + .. seealso:: + + :class:`.DDLEvents` + + :ref:`event_toplevel` + + """ + + if not isinstance(statement, util.string_types): + raise exc.ArgumentError( + "Expected a string or unicode SQL statement, got '%r'" % + statement) + + self.statement = statement + self.context = context or {} + + self._check_ddl_on(on) + self.on = on + self._bind = bind + + def __repr__(self): + return '<%s@%s; %s>' % ( + type(self).__name__, id(self), + ', '.join([repr(self.statement)] + + ['%s=%r' % (key, getattr(self, key)) + for key in ('on', 'context') + if getattr(self, key)])) + + +class _CreateDropBase(DDLElement): + """Base class for DDL constructs that represent CREATE and DROP or + equivalents. + + The common theme of _CreateDropBase is a single + ``element`` attribute which refers to the element + to be created or dropped. + + """ + + def __init__(self, element, on=None, bind=None): + self.element = element + self._check_ddl_on(on) + self.on = on + self.bind = bind + + def _create_rule_disable(self, compiler): + """Allow disable of _create_rule using a callable. + + Pass to _create_rule using + util.portable_instancemethod(self._create_rule_disable) + to retain serializability. + + """ + return False + + +class CreateSchema(_CreateDropBase): + """Represent a CREATE SCHEMA statement. + + .. versionadded:: 0.7.4 + + The argument here is the string name of the schema. + + """ + + __visit_name__ = "create_schema" + + def __init__(self, name, quote=None, **kw): + """Create a new :class:`.CreateSchema` construct.""" + + self.quote = quote + super(CreateSchema, self).__init__(name, **kw) + + +class DropSchema(_CreateDropBase): + """Represent a DROP SCHEMA statement. + + The argument here is the string name of the schema. + + .. versionadded:: 0.7.4 + + """ + + __visit_name__ = "drop_schema" + + def __init__(self, name, quote=None, cascade=False, **kw): + """Create a new :class:`.DropSchema` construct.""" + + self.quote = quote + self.cascade = cascade + super(DropSchema, self).__init__(name, **kw) + + +class CreateTable(_CreateDropBase): + """Represent a CREATE TABLE statement.""" + + __visit_name__ = "create_table" + + def __init__( + self, element, on=None, bind=None, + include_foreign_key_constraints=None): + """Create a :class:`.CreateTable` construct. + + :param element: a :class:`.Table` that's the subject + of the CREATE + :param on: See the description for 'on' in :class:`.DDL`. + :param bind: See the description for 'bind' in :class:`.DDL`. + :param include_foreign_key_constraints: optional sequence of + :class:`.ForeignKeyConstraint` objects that will be included + inline within the CREATE construct; if omitted, all foreign key + constraints that do not specify use_alter=True are included. + + .. versionadded:: 1.0.0 + + """ + super(CreateTable, self).__init__(element, on=on, bind=bind) + self.columns = [CreateColumn(column) + for column in element.columns + ] + self.include_foreign_key_constraints = include_foreign_key_constraints + + +class _DropView(_CreateDropBase): + """Semi-public 'DROP VIEW' construct. + + Used by the test suite for dialect-agnostic drops of views. + This object will eventually be part of a public "view" API. + + """ + __visit_name__ = "drop_view" + + +class CreateColumn(_DDLCompiles): + """Represent a :class:`.Column` as rendered in a CREATE TABLE statement, + via the :class:`.CreateTable` construct. + + This is provided to support custom column DDL within the generation + of CREATE TABLE statements, by using the + compiler extension documented in :ref:`sqlalchemy.ext.compiler_toplevel` + to extend :class:`.CreateColumn`. + + Typical integration is to examine the incoming :class:`.Column` + object, and to redirect compilation if a particular flag or condition + is found:: + + from sqlalchemy import schema + from sqlalchemy.ext.compiler import compiles + + @compiles(schema.CreateColumn) + def compile(element, compiler, **kw): + column = element.element + + if "special" not in column.info: + return compiler.visit_create_column(element, **kw) + + text = "%s SPECIAL DIRECTIVE %s" % ( + column.name, + compiler.type_compiler.process(column.type) + ) + default = compiler.get_column_default_string(column) + if default is not None: + text += " DEFAULT " + default + + if not column.nullable: + text += " NOT NULL" + + if column.constraints: + text += " ".join( + compiler.process(const) + for const in column.constraints) + return text + + The above construct can be applied to a :class:`.Table` as follows:: + + from sqlalchemy import Table, Metadata, Column, Integer, String + from sqlalchemy import schema + + metadata = MetaData() + + table = Table('mytable', MetaData(), + Column('x', Integer, info={"special":True}, primary_key=True), + Column('y', String(50)), + Column('z', String(20), info={"special":True}) + ) + + metadata.create_all(conn) + + Above, the directives we've added to the :attr:`.Column.info` collection + will be detected by our custom compilation scheme:: + + CREATE TABLE mytable ( + x SPECIAL DIRECTIVE INTEGER NOT NULL, + y VARCHAR(50), + z SPECIAL DIRECTIVE VARCHAR(20), + PRIMARY KEY (x) + ) + + The :class:`.CreateColumn` construct can also be used to skip certain + columns when producing a ``CREATE TABLE``. This is accomplished by + creating a compilation rule that conditionally returns ``None``. + This is essentially how to produce the same effect as using the + ``system=True`` argument on :class:`.Column`, which marks a column + as an implicitly-present "system" column. + + For example, suppose we wish to produce a :class:`.Table` which skips + rendering of the PostgreSQL ``xmin`` column against the PostgreSQL + backend, but on other backends does render it, in anticipation of a + triggered rule. A conditional compilation rule could skip this name only + on PostgreSQL:: + + from sqlalchemy.schema import CreateColumn + + @compiles(CreateColumn, "postgresql") + def skip_xmin(element, compiler, **kw): + if element.element.name == 'xmin': + return None + else: + return compiler.visit_create_column(element, **kw) + + + my_table = Table('mytable', metadata, + Column('id', Integer, primary_key=True), + Column('xmin', Integer) + ) + + Above, a :class:`.CreateTable` construct will generate a ``CREATE TABLE`` + which only includes the ``id`` column in the string; the ``xmin`` column + will be omitted, but only against the PostgreSQL backend. + + .. versionadded:: 0.8.3 The :class:`.CreateColumn` construct supports + skipping of columns by returning ``None`` from a custom compilation + rule. + + .. versionadded:: 0.8 The :class:`.CreateColumn` construct was added + to support custom column creation styles. + + """ + __visit_name__ = 'create_column' + + def __init__(self, element): + self.element = element + + +class DropTable(_CreateDropBase): + """Represent a DROP TABLE statement.""" + + __visit_name__ = "drop_table" + + +class CreateSequence(_CreateDropBase): + """Represent a CREATE SEQUENCE statement.""" + + __visit_name__ = "create_sequence" + + +class DropSequence(_CreateDropBase): + """Represent a DROP SEQUENCE statement.""" + + __visit_name__ = "drop_sequence" + + +class CreateIndex(_CreateDropBase): + """Represent a CREATE INDEX statement.""" + + __visit_name__ = "create_index" + + +class DropIndex(_CreateDropBase): + """Represent a DROP INDEX statement.""" + + __visit_name__ = "drop_index" + + +class AddConstraint(_CreateDropBase): + """Represent an ALTER TABLE ADD CONSTRAINT statement.""" + + __visit_name__ = "add_constraint" + + def __init__(self, element, *args, **kw): + super(AddConstraint, self).__init__(element, *args, **kw) + element._create_rule = util.portable_instancemethod( + self._create_rule_disable) + + +class DropConstraint(_CreateDropBase): + """Represent an ALTER TABLE DROP CONSTRAINT statement.""" + + __visit_name__ = "drop_constraint" + + def __init__(self, element, cascade=False, **kw): + self.cascade = cascade + super(DropConstraint, self).__init__(element, **kw) + element._create_rule = util.portable_instancemethod( + self._create_rule_disable) + + +class DDLBase(SchemaVisitor): + def __init__(self, connection): + self.connection = connection + + +class SchemaGenerator(DDLBase): + + def __init__(self, dialect, connection, checkfirst=False, + tables=None, **kwargs): + super(SchemaGenerator, self).__init__(connection, **kwargs) + self.checkfirst = checkfirst + self.tables = tables + self.preparer = dialect.identifier_preparer + self.dialect = dialect + self.memo = {} + + def _can_create_table(self, table): + self.dialect.validate_identifier(table.name) + effective_schema = self.connection.schema_for_object(table) + if effective_schema: + self.dialect.validate_identifier(effective_schema) + return not self.checkfirst or \ + not self.dialect.has_table(self.connection, + table.name, schema=effective_schema) + + def _can_create_sequence(self, sequence): + effective_schema = self.connection.schema_for_object(sequence) + + return self.dialect.supports_sequences and \ + ( + (not self.dialect.sequences_optional or + not sequence.optional) and + ( + not self.checkfirst or + not self.dialect.has_sequence( + self.connection, + sequence.name, + schema=effective_schema) + ) + ) + + def visit_metadata(self, metadata): + if self.tables is not None: + tables = self.tables + else: + tables = list(metadata.tables.values()) + + collection = sort_tables_and_constraints( + [t for t in tables if self._can_create_table(t)]) + + seq_coll = [s for s in metadata._sequences.values() + if s.column is None and self._can_create_sequence(s)] + + event_collection = [ + t for (t, fks) in collection if t is not None + ] + metadata.dispatch.before_create(metadata, self.connection, + tables=event_collection, + checkfirst=self.checkfirst, + _ddl_runner=self) + + for seq in seq_coll: + self.traverse_single(seq, create_ok=True) + + for table, fkcs in collection: + if table is not None: + self.traverse_single( + table, create_ok=True, + include_foreign_key_constraints=fkcs, + _is_metadata_operation=True) + else: + for fkc in fkcs: + self.traverse_single(fkc) + + metadata.dispatch.after_create(metadata, self.connection, + tables=event_collection, + checkfirst=self.checkfirst, + _ddl_runner=self) + + def visit_table( + self, table, create_ok=False, + include_foreign_key_constraints=None, + _is_metadata_operation=False): + if not create_ok and not self._can_create_table(table): + return + + table.dispatch.before_create( + table, self.connection, + checkfirst=self.checkfirst, + _ddl_runner=self, + _is_metadata_operation=_is_metadata_operation) + + for column in table.columns: + if column.default is not None: + self.traverse_single(column.default) + + if not self.dialect.supports_alter: + # e.g., don't omit any foreign key constraints + include_foreign_key_constraints = None + + self.connection.execute( + CreateTable( + table, + include_foreign_key_constraints=include_foreign_key_constraints + )) + + if hasattr(table, 'indexes'): + for index in table.indexes: + self.traverse_single(index) + + table.dispatch.after_create( + table, self.connection, + checkfirst=self.checkfirst, + _ddl_runner=self, + _is_metadata_operation=_is_metadata_operation) + + def visit_foreign_key_constraint(self, constraint): + if not self.dialect.supports_alter: + return + self.connection.execute(AddConstraint(constraint)) + + def visit_sequence(self, sequence, create_ok=False): + if not create_ok and not self._can_create_sequence(sequence): + return + self.connection.execute(CreateSequence(sequence)) + + def visit_index(self, index): + self.connection.execute(CreateIndex(index)) + + +class SchemaDropper(DDLBase): + + def __init__(self, dialect, connection, checkfirst=False, + tables=None, **kwargs): + super(SchemaDropper, self).__init__(connection, **kwargs) + self.checkfirst = checkfirst + self.tables = tables + self.preparer = dialect.identifier_preparer + self.dialect = dialect + self.memo = {} + + def visit_metadata(self, metadata): + if self.tables is not None: + tables = self.tables + else: + tables = list(metadata.tables.values()) + + try: + unsorted_tables = [t for t in tables if self._can_drop_table(t)] + collection = list(reversed( + sort_tables_and_constraints( + unsorted_tables, + filter_fn=lambda constraint: False + if not self.dialect.supports_alter + or constraint.name is None + else None + ) + )) + except exc.CircularDependencyError as err2: + if not self.dialect.supports_alter: + util.warn( + "Can't sort tables for DROP; an " + "unresolvable foreign key " + "dependency exists between tables: %s, and backend does " + "not support ALTER. To restore at least a partial sort, " + "apply use_alter=True to ForeignKey and " + "ForeignKeyConstraint " + "objects involved in the cycle to mark these as known " + "cycles that will be ignored." + % ( + ", ".join(sorted([t.fullname for t in err2.cycles])) + ) + ) + collection = [(t, ()) for t in unsorted_tables] + else: + util.raise_from_cause( + exc.CircularDependencyError( + err2.args[0], + err2.cycles, err2.edges, + msg="Can't sort tables for DROP; an " + "unresolvable foreign key " + "dependency exists between tables: %s. Please ensure " + "that the ForeignKey and ForeignKeyConstraint objects " + "involved in the cycle have " + "names so that they can be dropped using " + "DROP CONSTRAINT." + % ( + ", ".join(sorted([t.fullname for t in err2.cycles])) + ) + + ) + ) + + seq_coll = [ + s + for s in metadata._sequences.values() + if s.column is None and self._can_drop_sequence(s) + ] + + event_collection = [ + t for (t, fks) in collection if t is not None + ] + + metadata.dispatch.before_drop( + metadata, self.connection, tables=event_collection, + checkfirst=self.checkfirst, _ddl_runner=self) + + for table, fkcs in collection: + if table is not None: + self.traverse_single( + table, drop_ok=True, _is_metadata_operation=True) + else: + for fkc in fkcs: + self.traverse_single(fkc) + + for seq in seq_coll: + self.traverse_single(seq, drop_ok=True) + + metadata.dispatch.after_drop( + metadata, self.connection, tables=event_collection, + checkfirst=self.checkfirst, _ddl_runner=self) + + def _can_drop_table(self, table): + self.dialect.validate_identifier(table.name) + effective_schema = self.connection.schema_for_object(table) + if effective_schema: + self.dialect.validate_identifier(effective_schema) + return not self.checkfirst or self.dialect.has_table( + self.connection, table.name, schema=effective_schema) + + def _can_drop_sequence(self, sequence): + effective_schema = self.connection.schema_for_object(sequence) + return self.dialect.supports_sequences and \ + ((not self.dialect.sequences_optional or + not sequence.optional) and + (not self.checkfirst or + self.dialect.has_sequence( + self.connection, + sequence.name, + schema=effective_schema)) + ) + + def visit_index(self, index): + self.connection.execute(DropIndex(index)) + + def visit_table(self, table, drop_ok=False, _is_metadata_operation=False): + if not drop_ok and not self._can_drop_table(table): + return + + table.dispatch.before_drop( + table, self.connection, + checkfirst=self.checkfirst, + _ddl_runner=self, + _is_metadata_operation=_is_metadata_operation) + + for column in table.columns: + if column.default is not None: + self.traverse_single(column.default) + + self.connection.execute(DropTable(table)) + + table.dispatch.after_drop( + table, self.connection, + checkfirst=self.checkfirst, + _ddl_runner=self, + _is_metadata_operation=_is_metadata_operation) + + def visit_foreign_key_constraint(self, constraint): + if not self.dialect.supports_alter: + return + self.connection.execute(DropConstraint(constraint)) + + def visit_sequence(self, sequence, drop_ok=False): + if not drop_ok and not self._can_drop_sequence(sequence): + return + self.connection.execute(DropSequence(sequence)) + + +def sort_tables(tables, skip_fn=None, extra_dependencies=None): + """sort a collection of :class:`.Table` objects based on dependency. + + This is a dependency-ordered sort which will emit :class:`.Table` + objects such that they will follow their dependent :class:`.Table` objects. + Tables are dependent on another based on the presence of + :class:`.ForeignKeyConstraint` objects as well as explicit dependencies + added by :meth:`.Table.add_is_dependent_on`. + + .. warning:: + + The :func:`.sort_tables` function cannot by itself accommodate + automatic resolution of dependency cycles between tables, which + are usually caused by mutually dependent foreign key constraints. + To resolve these cycles, either the + :paramref:`.ForeignKeyConstraint.use_alter` parameter may be appled + to those constraints, or use the + :func:`.sql.sort_tables_and_constraints` function which will break + out foreign key constraints involved in cycles separately. + + :param tables: a sequence of :class:`.Table` objects. + + :param skip_fn: optional callable which will be passed a + :class:`.ForeignKey` object; if it returns True, this + constraint will not be considered as a dependency. Note this is + **different** from the same parameter in + :func:`.sort_tables_and_constraints`, which is + instead passed the owning :class:`.ForeignKeyConstraint` object. + + :param extra_dependencies: a sequence of 2-tuples of tables which will + also be considered as dependent on each other. + + .. seealso:: + + :func:`.sort_tables_and_constraints` + + :meth:`.MetaData.sorted_tables` - uses this function to sort + + + """ + + if skip_fn is not None: + def _skip_fn(fkc): + for fk in fkc.elements: + if skip_fn(fk): + return True + else: + return None + else: + _skip_fn = None + + return [ + t for (t, fkcs) in + sort_tables_and_constraints( + tables, filter_fn=_skip_fn, extra_dependencies=extra_dependencies) + if t is not None + ] + + +def sort_tables_and_constraints( + tables, filter_fn=None, extra_dependencies=None): + """sort a collection of :class:`.Table` / :class:`.ForeignKeyConstraint` + objects. + + This is a dependency-ordered sort which will emit tuples of + ``(Table, [ForeignKeyConstraint, ...])`` such that each + :class:`.Table` follows its dependent :class:`.Table` objects. + Remaining :class:`.ForeignKeyConstraint` objects that are separate due to + dependency rules not satisfied by the sort are emitted afterwards + as ``(None, [ForeignKeyConstraint ...])``. + + Tables are dependent on another based on the presence of + :class:`.ForeignKeyConstraint` objects, explicit dependencies + added by :meth:`.Table.add_is_dependent_on`, as well as dependencies + stated here using the :paramref:`~.sort_tables_and_constraints.skip_fn` + and/or :paramref:`~.sort_tables_and_constraints.extra_dependencies` + parameters. + + :param tables: a sequence of :class:`.Table` objects. + + :param filter_fn: optional callable which will be passed a + :class:`.ForeignKeyConstraint` object, and returns a value based on + whether this constraint should definitely be included or excluded as + an inline constraint, or neither. If it returns False, the constraint + will definitely be included as a dependency that cannot be subject + to ALTER; if True, it will **only** be included as an ALTER result at + the end. Returning None means the constraint is included in the + table-based result unless it is detected as part of a dependency cycle. + + :param extra_dependencies: a sequence of 2-tuples of tables which will + also be considered as dependent on each other. + + .. versionadded:: 1.0.0 + + .. seealso:: + + :func:`.sort_tables` + + + """ + + fixed_dependencies = set() + mutable_dependencies = set() + + if extra_dependencies is not None: + fixed_dependencies.update(extra_dependencies) + + remaining_fkcs = set() + for table in tables: + for fkc in table.foreign_key_constraints: + if fkc.use_alter is True: + remaining_fkcs.add(fkc) + continue + + if filter_fn: + filtered = filter_fn(fkc) + + if filtered is True: + remaining_fkcs.add(fkc) + continue + + dependent_on = fkc.referred_table + if dependent_on is not table: + mutable_dependencies.add((dependent_on, table)) + + fixed_dependencies.update( + (parent, table) for parent in table._extra_dependencies + ) + + try: + candidate_sort = list( + topological.sort( + fixed_dependencies.union(mutable_dependencies), tables, + deterministic_order=True + ) + ) + except exc.CircularDependencyError as err: + for edge in err.edges: + if edge in mutable_dependencies: + table = edge[1] + can_remove = [ + fkc for fkc in table.foreign_key_constraints + if filter_fn is None or filter_fn(fkc) is not False] + remaining_fkcs.update(can_remove) + for fkc in can_remove: + dependent_on = fkc.referred_table + if dependent_on is not table: + mutable_dependencies.discard((dependent_on, table)) + candidate_sort = list( + topological.sort( + fixed_dependencies.union(mutable_dependencies), tables, + deterministic_order=True + ) + ) + + return [ + (table, table.foreign_key_constraints.difference(remaining_fkcs)) + for table in candidate_sort + ] + [(None, list(remaining_fkcs))] diff --git a/app/lib/sqlalchemy/sql/default_comparator.py b/app/lib/sqlalchemy/sql/default_comparator.py new file mode 100644 index 0000000..7498bbe --- /dev/null +++ b/app/lib/sqlalchemy/sql/default_comparator.py @@ -0,0 +1,308 @@ +# sql/default_comparator.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Default implementation of SQL comparison operations. +""" + +from .. import exc, util +from . import type_api +from . import operators +from .elements import BindParameter, True_, False_, BinaryExpression, \ + Null, _const_expr, _clause_element_as_expr, \ + ClauseList, ColumnElement, TextClause, UnaryExpression, \ + collate, _is_literal, _literal_as_text, ClauseElement, and_, or_, \ + Slice, Visitable, _literal_as_binds +from .selectable import SelectBase, Alias, Selectable, ScalarSelect + + +def _boolean_compare(expr, op, obj, negate=None, reverse=False, + _python_is_types=(util.NoneType, bool), + result_type = None, + **kwargs): + + if result_type is None: + result_type = type_api.BOOLEANTYPE + + if isinstance(obj, _python_is_types + (Null, True_, False_)): + + # allow x ==/!= True/False to be treated as a literal. + # this comes out to "== / != true/false" or "1/0" if those + # constants aren't supported and works on all platforms + if op in (operators.eq, operators.ne) and \ + isinstance(obj, (bool, True_, False_)): + return BinaryExpression(expr, + _literal_as_text(obj), + op, + type_=result_type, + negate=negate, modifiers=kwargs) + elif op in (operators.is_distinct_from, operators.isnot_distinct_from): + return BinaryExpression(expr, + _literal_as_text(obj), + op, + type_=result_type, + negate=negate, modifiers=kwargs) + else: + # all other None/True/False uses IS, IS NOT + if op in (operators.eq, operators.is_): + return BinaryExpression(expr, _const_expr(obj), + operators.is_, + negate=operators.isnot) + elif op in (operators.ne, operators.isnot): + return BinaryExpression(expr, _const_expr(obj), + operators.isnot, + negate=operators.is_) + else: + raise exc.ArgumentError( + "Only '=', '!=', 'is_()', 'isnot()', " + "'is_distinct_from()', 'isnot_distinct_from()' " + "operators can be used with None/True/False") + else: + obj = _check_literal(expr, op, obj) + + if reverse: + return BinaryExpression(obj, + expr, + op, + type_=result_type, + negate=negate, modifiers=kwargs) + else: + return BinaryExpression(expr, + obj, + op, + type_=result_type, + negate=negate, modifiers=kwargs) + + +def _binary_operate(expr, op, obj, reverse=False, result_type=None, + **kw): + obj = _check_literal(expr, op, obj) + + if reverse: + left, right = obj, expr + else: + left, right = expr, obj + + if result_type is None: + op, result_type = left.comparator._adapt_expression( + op, right.comparator) + + return BinaryExpression( + left, right, op, type_=result_type, modifiers=kw) + + +def _conjunction_operate(expr, op, other, **kw): + if op is operators.and_: + return and_(expr, other) + elif op is operators.or_: + return or_(expr, other) + else: + raise NotImplementedError() + + +def _scalar(expr, op, fn, **kw): + return fn(expr) + + +def _in_impl(expr, op, seq_or_selectable, negate_op, **kw): + seq_or_selectable = _clause_element_as_expr(seq_or_selectable) + + if isinstance(seq_or_selectable, ScalarSelect): + return _boolean_compare(expr, op, seq_or_selectable, + negate=negate_op) + elif isinstance(seq_or_selectable, SelectBase): + + # TODO: if we ever want to support (x, y, z) IN (select x, + # y, z from table), we would need a multi-column version of + # as_scalar() to produce a multi- column selectable that + # does not export itself as a FROM clause + + return _boolean_compare( + expr, op, seq_or_selectable.as_scalar(), + negate=negate_op, **kw) + elif isinstance(seq_or_selectable, (Selectable, TextClause)): + return _boolean_compare(expr, op, seq_or_selectable, + negate=negate_op, **kw) + elif isinstance(seq_or_selectable, ClauseElement): + raise exc.InvalidRequestError( + 'in_() accepts' + ' either a list of expressions ' + 'or a selectable: %r' % seq_or_selectable) + + # Handle non selectable arguments as sequences + args = [] + for o in seq_or_selectable: + if not _is_literal(o): + if not isinstance(o, operators.ColumnOperators): + raise exc.InvalidRequestError( + 'in_() accepts' + ' either a list of expressions ' + 'or a selectable: %r' % o) + elif o is None: + o = Null() + else: + o = expr._bind_param(op, o) + args.append(o) + if len(args) == 0: + + # Special case handling for empty IN's, behave like + # comparison against zero row selectable. We use != to + # build the contradiction as it handles NULL values + # appropriately, i.e. "not (x IN ())" should not return NULL + # values for x. + + util.warn('The IN-predicate on "%s" was invoked with an ' + 'empty sequence. This results in a ' + 'contradiction, which nonetheless can be ' + 'expensive to evaluate. Consider alternative ' + 'strategies for improved performance.' % expr) + if op is operators.in_op: + return expr != expr + else: + return expr == expr + + return _boolean_compare(expr, op, + ClauseList(*args).self_group(against=op), + negate=negate_op) + + +def _getitem_impl(expr, op, other, **kw): + if isinstance(expr.type, type_api.INDEXABLE): + other = _check_literal(expr, op, other) + return _binary_operate(expr, op, other, **kw) + else: + _unsupported_impl(expr, op, other, **kw) + + +def _unsupported_impl(expr, op, *arg, **kw): + raise NotImplementedError("Operator '%s' is not supported on " + "this expression" % op.__name__) + + +def _inv_impl(expr, op, **kw): + """See :meth:`.ColumnOperators.__inv__`.""" + if hasattr(expr, 'negation_clause'): + return expr.negation_clause + else: + return expr._negate() + + +def _neg_impl(expr, op, **kw): + """See :meth:`.ColumnOperators.__neg__`.""" + return UnaryExpression(expr, operator=operators.neg, type_=expr.type) + + +def _match_impl(expr, op, other, **kw): + """See :meth:`.ColumnOperators.match`.""" + + return _boolean_compare( + expr, operators.match_op, + _check_literal( + expr, operators.match_op, other), + result_type=type_api.MATCHTYPE, + negate=operators.notmatch_op + if op is operators.match_op else operators.match_op, + **kw + ) + + +def _distinct_impl(expr, op, **kw): + """See :meth:`.ColumnOperators.distinct`.""" + return UnaryExpression(expr, operator=operators.distinct_op, + type_=expr.type) + + +def _between_impl(expr, op, cleft, cright, **kw): + """See :meth:`.ColumnOperators.between`.""" + return BinaryExpression( + expr, + ClauseList( + _check_literal(expr, operators.and_, cleft), + _check_literal(expr, operators.and_, cright), + operator=operators.and_, + group=False, group_contents=False), + op, + negate=operators.notbetween_op + if op is operators.between_op + else operators.between_op, + modifiers=kw) + + +def _collate_impl(expr, op, other, **kw): + return collate(expr, other) + +# a mapping of operators with the method they use, along with +# their negated operator for comparison operators +operator_lookup = { + "and_": (_conjunction_operate,), + "or_": (_conjunction_operate,), + "inv": (_inv_impl,), + "add": (_binary_operate,), + "mul": (_binary_operate,), + "sub": (_binary_operate,), + "div": (_binary_operate,), + "mod": (_binary_operate,), + "truediv": (_binary_operate,), + "custom_op": (_binary_operate,), + "json_path_getitem_op": (_binary_operate, ), + "json_getitem_op": (_binary_operate, ), + "concat_op": (_binary_operate,), + "lt": (_boolean_compare, operators.ge), + "le": (_boolean_compare, operators.gt), + "ne": (_boolean_compare, operators.eq), + "gt": (_boolean_compare, operators.le), + "ge": (_boolean_compare, operators.lt), + "eq": (_boolean_compare, operators.ne), + "is_distinct_from": (_boolean_compare, operators.isnot_distinct_from), + "isnot_distinct_from": (_boolean_compare, operators.is_distinct_from), + "like_op": (_boolean_compare, operators.notlike_op), + "ilike_op": (_boolean_compare, operators.notilike_op), + "notlike_op": (_boolean_compare, operators.like_op), + "notilike_op": (_boolean_compare, operators.ilike_op), + "contains_op": (_boolean_compare, operators.notcontains_op), + "startswith_op": (_boolean_compare, operators.notstartswith_op), + "endswith_op": (_boolean_compare, operators.notendswith_op), + "desc_op": (_scalar, UnaryExpression._create_desc), + "asc_op": (_scalar, UnaryExpression._create_asc), + "nullsfirst_op": (_scalar, UnaryExpression._create_nullsfirst), + "nullslast_op": (_scalar, UnaryExpression._create_nullslast), + "in_op": (_in_impl, operators.notin_op), + "notin_op": (_in_impl, operators.in_op), + "is_": (_boolean_compare, operators.is_), + "isnot": (_boolean_compare, operators.isnot), + "collate": (_collate_impl,), + "match_op": (_match_impl,), + "notmatch_op": (_match_impl,), + "distinct_op": (_distinct_impl,), + "between_op": (_between_impl, ), + "notbetween_op": (_between_impl, ), + "neg": (_neg_impl,), + "getitem": (_getitem_impl,), + "lshift": (_unsupported_impl,), + "rshift": (_unsupported_impl,), + "contains": (_unsupported_impl,), +} + + +def _check_literal(expr, operator, other, bindparam_type=None): + if isinstance(other, (ColumnElement, TextClause)): + if isinstance(other, BindParameter) and \ + other.type._isnull: + other = other._clone() + other.type = expr.type + return other + elif hasattr(other, '__clause_element__'): + other = other.__clause_element__() + elif isinstance(other, type_api.TypeEngine.Comparator): + other = other.expr + + if isinstance(other, (SelectBase, Alias)): + return other.as_scalar() + elif not isinstance(other, Visitable): + return expr._bind_param(operator, other, type_=bindparam_type) + else: + return other + diff --git a/app/lib/sqlalchemy/sql/dml.py b/app/lib/sqlalchemy/sql/dml.py new file mode 100644 index 0000000..767e913 --- /dev/null +++ b/app/lib/sqlalchemy/sql/dml.py @@ -0,0 +1,851 @@ +# sql/dml.py +# Copyright (C) 2009-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +""" +Provide :class:`.Insert`, :class:`.Update` and :class:`.Delete`. + +""" + +from .base import Executable, _generative, _from_objects, DialectKWArgs, \ + ColumnCollection +from .elements import ClauseElement, _literal_as_text, Null, and_, _clone, \ + _column_as_key +from .selectable import _interpret_as_from, _interpret_as_select, \ + HasPrefixes, HasCTE +from .. import util +from .. import exc + + +class UpdateBase( + HasCTE, DialectKWArgs, HasPrefixes, Executable, ClauseElement): + """Form the base for ``INSERT``, ``UPDATE``, and ``DELETE`` statements. + + """ + + __visit_name__ = 'update_base' + + _execution_options = \ + Executable._execution_options.union({'autocommit': True}) + _hints = util.immutabledict() + _parameter_ordering = None + _prefixes = () + named_with_column = False + + def _process_colparams(self, parameters): + def process_single(p): + if isinstance(p, (list, tuple)): + return dict( + (c.key, pval) + for c, pval in zip(self.table.c, p) + ) + else: + return p + + if self._preserve_parameter_order and parameters is not None: + if not isinstance(parameters, list) or \ + (parameters and not isinstance(parameters[0], tuple)): + raise ValueError( + "When preserve_parameter_order is True, " + "values() only accepts a list of 2-tuples") + self._parameter_ordering = [key for key, value in parameters] + + return dict(parameters), False + + if (isinstance(parameters, (list, tuple)) and parameters and + isinstance(parameters[0], (list, tuple, dict))): + + if not self._supports_multi_parameters: + raise exc.InvalidRequestError( + "This construct does not support " + "multiple parameter sets.") + + return [process_single(p) for p in parameters], True + else: + return process_single(parameters), False + + def params(self, *arg, **kw): + """Set the parameters for the statement. + + This method raises ``NotImplementedError`` on the base class, + and is overridden by :class:`.ValuesBase` to provide the + SET/VALUES clause of UPDATE and INSERT. + + """ + raise NotImplementedError( + "params() is not supported for INSERT/UPDATE/DELETE statements." + " To set the values for an INSERT or UPDATE statement, use" + " stmt.values(**parameters).") + + def bind(self): + """Return a 'bind' linked to this :class:`.UpdateBase` + or a :class:`.Table` associated with it. + + """ + return self._bind or self.table.bind + + def _set_bind(self, bind): + self._bind = bind + bind = property(bind, _set_bind) + + @_generative + def returning(self, *cols): + r"""Add a :term:`RETURNING` or equivalent clause to this statement. + + e.g.:: + + stmt = table.update().\ + where(table.c.data == 'value').\ + values(status='X').\ + returning(table.c.server_flag, + table.c.updated_timestamp) + + for server_flag, updated_timestamp in connection.execute(stmt): + print(server_flag, updated_timestamp) + + The given collection of column expressions should be derived from + the table that is + the target of the INSERT, UPDATE, or DELETE. While :class:`.Column` + objects are typical, the elements can also be expressions:: + + stmt = table.insert().returning( + (table.c.first_name + " " + table.c.last_name). + label('fullname')) + + Upon compilation, a RETURNING clause, or database equivalent, + will be rendered within the statement. For INSERT and UPDATE, + the values are the newly inserted/updated values. For DELETE, + the values are those of the rows which were deleted. + + Upon execution, the values of the columns to be returned are made + available via the result set and can be iterated using + :meth:`.ResultProxy.fetchone` and similar. For DBAPIs which do not + natively support returning values (i.e. cx_oracle), SQLAlchemy will + approximate this behavior at the result level so that a reasonable + amount of behavioral neutrality is provided. + + Note that not all databases/DBAPIs + support RETURNING. For those backends with no support, + an exception is raised upon compilation and/or execution. + For those who do support it, the functionality across backends + varies greatly, including restrictions on executemany() + and other statements which return multiple rows. Please + read the documentation notes for the database in use in + order to determine the availability of RETURNING. + + .. seealso:: + + :meth:`.ValuesBase.return_defaults` - an alternative method tailored + towards efficient fetching of server-side defaults and triggers + for single-row INSERTs or UPDATEs. + + + """ + self._returning = cols + + @_generative + def with_hint(self, text, selectable=None, dialect_name="*"): + """Add a table hint for a single table to this + INSERT/UPDATE/DELETE statement. + + .. note:: + + :meth:`.UpdateBase.with_hint` currently applies only to + Microsoft SQL Server. For MySQL INSERT/UPDATE/DELETE hints, use + :meth:`.UpdateBase.prefix_with`. + + The text of the hint is rendered in the appropriate + location for the database backend in use, relative + to the :class:`.Table` that is the subject of this + statement, or optionally to that of the given + :class:`.Table` passed as the ``selectable`` argument. + + The ``dialect_name`` option will limit the rendering of a particular + hint to a particular backend. Such as, to add a hint + that only takes effect for SQL Server:: + + mytable.insert().with_hint("WITH (PAGLOCK)", dialect_name="mssql") + + .. versionadded:: 0.7.6 + + :param text: Text of the hint. + :param selectable: optional :class:`.Table` that specifies + an element of the FROM clause within an UPDATE or DELETE + to be the subject of the hint - applies only to certain backends. + :param dialect_name: defaults to ``*``, if specified as the name + of a particular dialect, will apply these hints only when + that dialect is in use. + """ + if selectable is None: + selectable = self.table + + self._hints = self._hints.union( + {(selectable, dialect_name): text}) + + +class ValuesBase(UpdateBase): + """Supplies support for :meth:`.ValuesBase.values` to + INSERT and UPDATE constructs.""" + + __visit_name__ = 'values_base' + + _supports_multi_parameters = False + _has_multi_parameters = False + _preserve_parameter_order = False + select = None + _post_values_clause = None + + def __init__(self, table, values, prefixes): + self.table = _interpret_as_from(table) + self.parameters, self._has_multi_parameters = \ + self._process_colparams(values) + if prefixes: + self._setup_prefixes(prefixes) + + @_generative + def values(self, *args, **kwargs): + r"""specify a fixed VALUES clause for an INSERT statement, or the SET + clause for an UPDATE. + + Note that the :class:`.Insert` and :class:`.Update` constructs support + per-execution time formatting of the VALUES and/or SET clauses, + based on the arguments passed to :meth:`.Connection.execute`. + However, the :meth:`.ValuesBase.values` method can be used to "fix" a + particular set of parameters into the statement. + + Multiple calls to :meth:`.ValuesBase.values` will produce a new + construct, each one with the parameter list modified to include + the new parameters sent. In the typical case of a single + dictionary of parameters, the newly passed keys will replace + the same keys in the previous construct. In the case of a list-based + "multiple values" construct, each new list of values is extended + onto the existing list of values. + + :param \**kwargs: key value pairs representing the string key + of a :class:`.Column` mapped to the value to be rendered into the + VALUES or SET clause:: + + users.insert().values(name="some name") + + users.update().where(users.c.id==5).values(name="some name") + + :param \*args: As an alternative to passing key/value parameters, + a dictionary, tuple, or list of dictionaries or tuples can be passed + as a single positional argument in order to form the VALUES or + SET clause of the statement. The forms that are accepted vary + based on whether this is an :class:`.Insert` or an :class:`.Update` + construct. + + For either an :class:`.Insert` or :class:`.Update` construct, a + single dictionary can be passed, which works the same as that of + the kwargs form:: + + users.insert().values({"name": "some name"}) + + users.update().values({"name": "some new name"}) + + Also for either form but more typically for the :class:`.Insert` + construct, a tuple that contains an entry for every column in the + table is also accepted:: + + users.insert().values((5, "some name")) + + The :class:`.Insert` construct also supports being passed a list + of dictionaries or full-table-tuples, which on the server will + render the less common SQL syntax of "multiple values" - this + syntax is supported on backends such as SQLite, PostgreSQL, MySQL, + but not necessarily others:: + + users.insert().values([ + {"name": "some name"}, + {"name": "some other name"}, + {"name": "yet another name"}, + ]) + + The above form would render a multiple VALUES statement similar to:: + + INSERT INTO users (name) VALUES + (:name_1), + (:name_2), + (:name_3) + + It is essential to note that **passing multiple values is + NOT the same as using traditional executemany() form**. The above + syntax is a **special** syntax not typically used. To emit an + INSERT statement against multiple rows, the normal method is + to pass a multiple values list to the :meth:`.Connection.execute` + method, which is supported by all database backends and is generally + more efficient for a very large number of parameters. + + .. seealso:: + + :ref:`execute_multiple` - an introduction to + the traditional Core method of multiple parameter set + invocation for INSERTs and other statements. + + .. versionchanged:: 1.0.0 an INSERT that uses a multiple-VALUES + clause, even a list of length one, + implies that the :paramref:`.Insert.inline` flag is set to + True, indicating that the statement will not attempt to fetch + the "last inserted primary key" or other defaults. The + statement deals with an arbitrary number of rows, so the + :attr:`.ResultProxy.inserted_primary_key` accessor does not + apply. + + .. versionchanged:: 1.0.0 A multiple-VALUES INSERT now supports + columns with Python side default values and callables in the + same way as that of an "executemany" style of invocation; the + callable is invoked for each row. See :ref:`bug_3288` + for other details. + + The :class:`.Update` construct supports a special form which is a + list of 2-tuples, which when provided must be passed in conjunction + with the + :paramref:`~sqlalchemy.sql.expression.update.preserve_parameter_order` + parameter. + This form causes the UPDATE statement to render the SET clauses + using the order of parameters given to :meth:`.Update.values`, rather + than the ordering of columns given in the :class:`.Table`. + + .. versionadded:: 1.0.10 - added support for parameter-ordered + UPDATE statements via the + :paramref:`~sqlalchemy.sql.expression.update.preserve_parameter_order` + flag. + + .. seealso:: + + :ref:`updates_order_parameters` - full example of the + :paramref:`~sqlalchemy.sql.expression.update.preserve_parameter_order` + flag + + .. seealso:: + + :ref:`inserts_and_updates` - SQL Expression + Language Tutorial + + :func:`~.expression.insert` - produce an ``INSERT`` statement + + :func:`~.expression.update` - produce an ``UPDATE`` statement + + """ + if self.select is not None: + raise exc.InvalidRequestError( + "This construct already inserts from a SELECT") + if self._has_multi_parameters and kwargs: + raise exc.InvalidRequestError( + "This construct already has multiple parameter sets.") + + if args: + if len(args) > 1: + raise exc.ArgumentError( + "Only a single dictionary/tuple or list of " + "dictionaries/tuples is accepted positionally.") + v = args[0] + else: + v = {} + + if self.parameters is None: + self.parameters, self._has_multi_parameters = \ + self._process_colparams(v) + else: + if self._has_multi_parameters: + self.parameters = list(self.parameters) + p, self._has_multi_parameters = self._process_colparams(v) + if not self._has_multi_parameters: + raise exc.ArgumentError( + "Can't mix single-values and multiple values " + "formats in one statement") + + self.parameters.extend(p) + else: + self.parameters = self.parameters.copy() + p, self._has_multi_parameters = self._process_colparams(v) + if self._has_multi_parameters: + raise exc.ArgumentError( + "Can't mix single-values and multiple values " + "formats in one statement") + self.parameters.update(p) + + if kwargs: + if self._has_multi_parameters: + raise exc.ArgumentError( + "Can't pass kwargs and multiple parameter sets " + "simultaneously") + else: + self.parameters.update(kwargs) + + @_generative + def return_defaults(self, *cols): + """Make use of a :term:`RETURNING` clause for the purpose + of fetching server-side expressions and defaults. + + E.g.:: + + stmt = table.insert().values(data='newdata').return_defaults() + + result = connection.execute(stmt) + + server_created_at = result.returned_defaults['created_at'] + + When used against a backend that supports RETURNING, all column + values generated by SQL expression or server-side-default will be + added to any existing RETURNING clause, provided that + :meth:`.UpdateBase.returning` is not used simultaneously. The column + values will then be available on the result using the + :attr:`.ResultProxy.returned_defaults` accessor as a dictionary, + referring to values keyed to the :class:`.Column` object as well as + its ``.key``. + + This method differs from :meth:`.UpdateBase.returning` in these ways: + + 1. :meth:`.ValuesBase.return_defaults` is only intended for use with + an INSERT or an UPDATE statement that matches exactly one row. + While the RETURNING construct in the general sense supports + multiple rows for a multi-row UPDATE or DELETE statement, or for + special cases of INSERT that return multiple rows (e.g. INSERT from + SELECT, multi-valued VALUES clause), + :meth:`.ValuesBase.return_defaults` is intended only for an + "ORM-style" single-row INSERT/UPDATE statement. The row returned + by the statement is also consumed implicitly when + :meth:`.ValuesBase.return_defaults` is used. By contrast, + :meth:`.UpdateBase.returning` leaves the RETURNING result-set + intact with a collection of any number of rows. + + 2. It is compatible with the existing logic to fetch auto-generated + primary key values, also known as "implicit returning". Backends + that support RETURNING will automatically make use of RETURNING in + order to fetch the value of newly generated primary keys; while the + :meth:`.UpdateBase.returning` method circumvents this behavior, + :meth:`.ValuesBase.return_defaults` leaves it intact. + + 3. It can be called against any backend. Backends that don't support + RETURNING will skip the usage of the feature, rather than raising + an exception. The return value of + :attr:`.ResultProxy.returned_defaults` will be ``None`` + + :meth:`.ValuesBase.return_defaults` is used by the ORM to provide + an efficient implementation for the ``eager_defaults`` feature of + :func:`.mapper`. + + :param cols: optional list of column key names or :class:`.Column` + objects. If omitted, all column expressions evaluated on the server + are added to the returning list. + + .. versionadded:: 0.9.0 + + .. seealso:: + + :meth:`.UpdateBase.returning` + + :attr:`.ResultProxy.returned_defaults` + + """ + self._return_defaults = cols or True + + +class Insert(ValuesBase): + """Represent an INSERT construct. + + The :class:`.Insert` object is created using the + :func:`~.expression.insert()` function. + + .. seealso:: + + :ref:`coretutorial_insert_expressions` + + """ + __visit_name__ = 'insert' + + _supports_multi_parameters = True + + def __init__(self, + table, + values=None, + inline=False, + bind=None, + prefixes=None, + returning=None, + return_defaults=False, + **dialect_kw): + """Construct an :class:`.Insert` object. + + Similar functionality is available via the + :meth:`~.TableClause.insert` method on + :class:`~.schema.Table`. + + :param table: :class:`.TableClause` which is the subject of the + insert. + + :param values: collection of values to be inserted; see + :meth:`.Insert.values` for a description of allowed formats here. + Can be omitted entirely; a :class:`.Insert` construct will also + dynamically render the VALUES clause at execution time based on + the parameters passed to :meth:`.Connection.execute`. + + :param inline: if True, no attempt will be made to retrieve the + SQL-generated default values to be provided within the statement; + in particular, + this allows SQL expressions to be rendered 'inline' within the + statement without the need to pre-execute them beforehand; for + backends that support "returning", this turns off the "implicit + returning" feature for the statement. + + If both `values` and compile-time bind parameters are present, the + compile-time bind parameters override the information specified + within `values` on a per-key basis. + + The keys within `values` can be either + :class:`~sqlalchemy.schema.Column` objects or their string + identifiers. Each key may reference one of: + + * a literal data value (i.e. string, number, etc.); + * a Column object; + * a SELECT statement. + + If a ``SELECT`` statement is specified which references this + ``INSERT`` statement's table, the statement will be correlated + against the ``INSERT`` statement. + + .. seealso:: + + :ref:`coretutorial_insert_expressions` - SQL Expression Tutorial + + :ref:`inserts_and_updates` - SQL Expression Tutorial + + """ + ValuesBase.__init__(self, table, values, prefixes) + self._bind = bind + self.select = self.select_names = None + self.include_insert_from_select_defaults = False + self.inline = inline + self._returning = returning + self._validate_dialect_kwargs(dialect_kw) + self._return_defaults = return_defaults + + def get_children(self, **kwargs): + if self.select is not None: + return self.select, + else: + return () + + @_generative + def from_select(self, names, select, include_defaults=True): + """Return a new :class:`.Insert` construct which represents + an ``INSERT...FROM SELECT`` statement. + + e.g.:: + + sel = select([table1.c.a, table1.c.b]).where(table1.c.c > 5) + ins = table2.insert().from_select(['a', 'b'], sel) + + :param names: a sequence of string column names or :class:`.Column` + objects representing the target columns. + :param select: a :func:`.select` construct, :class:`.FromClause` + or other construct which resolves into a :class:`.FromClause`, + such as an ORM :class:`.Query` object, etc. The order of + columns returned from this FROM clause should correspond to the + order of columns sent as the ``names`` parameter; while this + is not checked before passing along to the database, the database + would normally raise an exception if these column lists don't + correspond. + :param include_defaults: if True, non-server default values and + SQL expressions as specified on :class:`.Column` objects + (as documented in :ref:`metadata_defaults_toplevel`) not + otherwise specified in the list of names will be rendered + into the INSERT and SELECT statements, so that these values are also + included in the data to be inserted. + + .. note:: A Python-side default that uses a Python callable function + will only be invoked **once** for the whole statement, and **not + per row**. + + .. versionadded:: 1.0.0 - :meth:`.Insert.from_select` now renders + Python-side and SQL expression column defaults into the + SELECT statement for columns otherwise not included in the + list of column names. + + .. versionchanged:: 1.0.0 an INSERT that uses FROM SELECT + implies that the :paramref:`.insert.inline` flag is set to + True, indicating that the statement will not attempt to fetch + the "last inserted primary key" or other defaults. The statement + deals with an arbitrary number of rows, so the + :attr:`.ResultProxy.inserted_primary_key` accessor does not apply. + + .. versionadded:: 0.8.3 + + """ + if self.parameters: + raise exc.InvalidRequestError( + "This construct already inserts value expressions") + + self.parameters, self._has_multi_parameters = \ + self._process_colparams( + dict((_column_as_key(n), Null()) for n in names)) + + self.select_names = names + self.inline = True + self.include_insert_from_select_defaults = include_defaults + self.select = _interpret_as_select(select) + + def _copy_internals(self, clone=_clone, **kw): + # TODO: coverage + self.parameters = self.parameters.copy() + if self.select is not None: + self.select = _clone(self.select) + + +class Update(ValuesBase): + """Represent an Update construct. + + The :class:`.Update` object is created using the :func:`update()` + function. + + """ + __visit_name__ = 'update' + + def __init__(self, + table, + whereclause=None, + values=None, + inline=False, + bind=None, + prefixes=None, + returning=None, + return_defaults=False, + preserve_parameter_order=False, + **dialect_kw): + r"""Construct an :class:`.Update` object. + + E.g.:: + + from sqlalchemy import update + + stmt = update(users).where(users.c.id==5).\ + values(name='user #5') + + Similar functionality is available via the + :meth:`~.TableClause.update` method on + :class:`.Table`:: + + stmt = users.update().\ + where(users.c.id==5).\ + values(name='user #5') + + :param table: A :class:`.Table` object representing the database + table to be updated. + + :param whereclause: Optional SQL expression describing the ``WHERE`` + condition of the ``UPDATE`` statement. Modern applications + may prefer to use the generative :meth:`~Update.where()` + method to specify the ``WHERE`` clause. + + The WHERE clause can refer to multiple tables. + For databases which support this, an ``UPDATE FROM`` clause will + be generated, or on MySQL, a multi-table update. The statement + will fail on databases that don't have support for multi-table + update statements. A SQL-standard method of referring to + additional tables in the WHERE clause is to use a correlated + subquery:: + + users.update().values(name='ed').where( + users.c.name==select([addresses.c.email_address]).\ + where(addresses.c.user_id==users.c.id).\ + as_scalar() + ) + + .. versionchanged:: 0.7.4 + The WHERE clause can refer to multiple tables. + + :param values: + Optional dictionary which specifies the ``SET`` conditions of the + ``UPDATE``. If left as ``None``, the ``SET`` + conditions are determined from those parameters passed to the + statement during the execution and/or compilation of the + statement. When compiled standalone without any parameters, + the ``SET`` clause generates for all columns. + + Modern applications may prefer to use the generative + :meth:`.Update.values` method to set the values of the + UPDATE statement. + + :param inline: + if True, SQL defaults present on :class:`.Column` objects via + the ``default`` keyword will be compiled 'inline' into the statement + and not pre-executed. This means that their values will not + be available in the dictionary returned from + :meth:`.ResultProxy.last_updated_params`. + + :param preserve_parameter_order: if True, the update statement is + expected to receive parameters **only** via the :meth:`.Update.values` + method, and they must be passed as a Python ``list`` of 2-tuples. + The rendered UPDATE statement will emit the SET clause for each + referenced column maintaining this order. + + .. versionadded:: 1.0.10 + + .. seealso:: + + :ref:`updates_order_parameters` - full example of the + :paramref:`~sqlalchemy.sql.expression.update.preserve_parameter_order` flag + + If both ``values`` and compile-time bind parameters are present, the + compile-time bind parameters override the information specified + within ``values`` on a per-key basis. + + The keys within ``values`` can be either :class:`.Column` + objects or their string identifiers (specifically the "key" of the + :class:`.Column`, normally but not necessarily equivalent to + its "name"). Normally, the + :class:`.Column` objects used here are expected to be + part of the target :class:`.Table` that is the table + to be updated. However when using MySQL, a multiple-table + UPDATE statement can refer to columns from any of + the tables referred to in the WHERE clause. + + The values referred to in ``values`` are typically: + + * a literal data value (i.e. string, number, etc.) + * a SQL expression, such as a related :class:`.Column`, + a scalar-returning :func:`.select` construct, + etc. + + When combining :func:`.select` constructs within the values + clause of an :func:`.update` construct, + the subquery represented by the :func:`.select` should be + *correlated* to the parent table, that is, providing criterion + which links the table inside the subquery to the outer table + being updated:: + + users.update().values( + name=select([addresses.c.email_address]).\ + where(addresses.c.user_id==users.c.id).\ + as_scalar() + ) + + .. seealso:: + + :ref:`inserts_and_updates` - SQL Expression + Language Tutorial + + + """ + self._preserve_parameter_order = preserve_parameter_order + ValuesBase.__init__(self, table, values, prefixes) + self._bind = bind + self._returning = returning + if whereclause is not None: + self._whereclause = _literal_as_text(whereclause) + else: + self._whereclause = None + self.inline = inline + self._validate_dialect_kwargs(dialect_kw) + self._return_defaults = return_defaults + + def get_children(self, **kwargs): + if self._whereclause is not None: + return self._whereclause, + else: + return () + + def _copy_internals(self, clone=_clone, **kw): + # TODO: coverage + self._whereclause = clone(self._whereclause, **kw) + self.parameters = self.parameters.copy() + + @_generative + def where(self, whereclause): + """return a new update() construct with the given expression added to + its WHERE clause, joined to the existing clause via AND, if any. + + """ + if self._whereclause is not None: + self._whereclause = and_(self._whereclause, + _literal_as_text(whereclause)) + else: + self._whereclause = _literal_as_text(whereclause) + + @property + def _extra_froms(self): + # TODO: this could be made memoized + # if the memoization is reset on each generative call. + froms = [] + seen = set([self.table]) + + if self._whereclause is not None: + for item in _from_objects(self._whereclause): + if not seen.intersection(item._cloned_set): + froms.append(item) + seen.update(item._cloned_set) + + return froms + + +class Delete(UpdateBase): + """Represent a DELETE construct. + + The :class:`.Delete` object is created using the :func:`delete()` + function. + + """ + + __visit_name__ = 'delete' + + def __init__(self, + table, + whereclause=None, + bind=None, + returning=None, + prefixes=None, + **dialect_kw): + """Construct :class:`.Delete` object. + + Similar functionality is available via the + :meth:`~.TableClause.delete` method on + :class:`~.schema.Table`. + + :param table: The table to delete rows from. + + :param whereclause: A :class:`.ClauseElement` describing the ``WHERE`` + condition of the ``DELETE`` statement. Note that the + :meth:`~Delete.where()` generative method may be used instead. + + .. seealso:: + + :ref:`deletes` - SQL Expression Tutorial + + """ + self._bind = bind + self.table = _interpret_as_from(table) + self._returning = returning + + if prefixes: + self._setup_prefixes(prefixes) + + if whereclause is not None: + self._whereclause = _literal_as_text(whereclause) + else: + self._whereclause = None + + self._validate_dialect_kwargs(dialect_kw) + + def get_children(self, **kwargs): + if self._whereclause is not None: + return self._whereclause, + else: + return () + + @_generative + def where(self, whereclause): + """Add the given WHERE clause to a newly returned delete construct.""" + + if self._whereclause is not None: + self._whereclause = and_(self._whereclause, + _literal_as_text(whereclause)) + else: + self._whereclause = _literal_as_text(whereclause) + + def _copy_internals(self, clone=_clone, **kw): + # TODO: coverage + self._whereclause = clone(self._whereclause, **kw) diff --git a/app/lib/sqlalchemy/sql/elements.py b/app/lib/sqlalchemy/sql/elements.py new file mode 100644 index 0000000..a450efa --- /dev/null +++ b/app/lib/sqlalchemy/sql/elements.py @@ -0,0 +1,4403 @@ +# sql/elements.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Core SQL expression elements, including :class:`.ClauseElement`, +:class:`.ColumnElement`, and derived classes. + +""" + +from __future__ import unicode_literals + +from .. import util, exc, inspection +from . import type_api +from . import operators +from .visitors import Visitable, cloned_traverse, traverse +from .annotation import Annotated +import itertools +from .base import Executable, PARSE_AUTOCOMMIT, Immutable, NO_ARG +from .base import _generative +import numbers + +import re +import operator + + +def _clone(element, **kw): + return element._clone() + + +def collate(expression, collation): + """Return the clause ``expression COLLATE collation``. + + e.g.:: + + collate(mycolumn, 'utf8_bin') + + produces:: + + mycolumn COLLATE utf8_bin + + """ + + expr = _literal_as_binds(expression) + return BinaryExpression( + expr, + _literal_as_text(collation), + operators.collate, type_=expr.type) + + +def between(expr, lower_bound, upper_bound, symmetric=False): + """Produce a ``BETWEEN`` predicate clause. + + E.g.:: + + from sqlalchemy import between + stmt = select([users_table]).where(between(users_table.c.id, 5, 7)) + + Would produce SQL resembling:: + + SELECT id, name FROM user WHERE id BETWEEN :id_1 AND :id_2 + + The :func:`.between` function is a standalone version of the + :meth:`.ColumnElement.between` method available on all + SQL expressions, as in:: + + stmt = select([users_table]).where(users_table.c.id.between(5, 7)) + + All arguments passed to :func:`.between`, including the left side + column expression, are coerced from Python scalar values if a + the value is not a :class:`.ColumnElement` subclass. For example, + three fixed values can be compared as in:: + + print(between(5, 3, 7)) + + Which would produce:: + + :param_1 BETWEEN :param_2 AND :param_3 + + :param expr: a column expression, typically a :class:`.ColumnElement` + instance or alternatively a Python scalar expression to be coerced + into a column expression, serving as the left side of the ``BETWEEN`` + expression. + + :param lower_bound: a column or Python scalar expression serving as the + lower bound of the right side of the ``BETWEEN`` expression. + + :param upper_bound: a column or Python scalar expression serving as the + upper bound of the right side of the ``BETWEEN`` expression. + + :param symmetric: if True, will render " BETWEEN SYMMETRIC ". Note + that not all databases support this syntax. + + .. versionadded:: 0.9.5 + + .. seealso:: + + :meth:`.ColumnElement.between` + + """ + expr = _literal_as_binds(expr) + return expr.between(lower_bound, upper_bound, symmetric=symmetric) + + +def literal(value, type_=None): + r"""Return a literal clause, bound to a bind parameter. + + Literal clauses are created automatically when non- + :class:`.ClauseElement` objects (such as strings, ints, dates, etc.) are + used in a comparison operation with a :class:`.ColumnElement` subclass, + such as a :class:`~sqlalchemy.schema.Column` object. Use this function + to force the generation of a literal clause, which will be created as a + :class:`BindParameter` with a bound value. + + :param value: the value to be bound. Can be any Python object supported by + the underlying DB-API, or is translatable via the given type argument. + + :param type\_: an optional :class:`~sqlalchemy.types.TypeEngine` which + will provide bind-parameter translation for this literal. + + """ + return BindParameter(None, value, type_=type_, unique=True) + + + + +def outparam(key, type_=None): + """Create an 'OUT' parameter for usage in functions (stored procedures), + for databases which support them. + + The ``outparam`` can be used like a regular function parameter. + The "output" value will be available from the + :class:`~sqlalchemy.engine.ResultProxy` object via its ``out_parameters`` + attribute, which returns a dictionary containing the values. + + """ + return BindParameter( + key, None, type_=type_, unique=False, isoutparam=True) + + +def not_(clause): + """Return a negation of the given clause, i.e. ``NOT(clause)``. + + The ``~`` operator is also overloaded on all + :class:`.ColumnElement` subclasses to produce the + same result. + + """ + return operators.inv(_literal_as_binds(clause)) + + +@inspection._self_inspects +class ClauseElement(Visitable): + """Base class for elements of a programmatically constructed SQL + expression. + + """ + __visit_name__ = 'clause' + + _annotations = {} + supports_execution = False + _from_objects = [] + bind = None + _is_clone_of = None + is_selectable = False + is_clause_element = True + + description = None + _order_by_label_element = None + _is_from_container = False + + def _clone(self): + """Create a shallow copy of this ClauseElement. + + This method may be used by a generative API. Its also used as + part of the "deep" copy afforded by a traversal that combines + the _copy_internals() method. + + """ + c = self.__class__.__new__(self.__class__) + c.__dict__ = self.__dict__.copy() + ClauseElement._cloned_set._reset(c) + ColumnElement.comparator._reset(c) + + # this is a marker that helps to "equate" clauses to each other + # when a Select returns its list of FROM clauses. the cloning + # process leaves around a lot of remnants of the previous clause + # typically in the form of column expressions still attached to the + # old table. + c._is_clone_of = self + + return c + + @property + def _constructor(self): + """return the 'constructor' for this ClauseElement. + + This is for the purposes for creating a new object of + this type. Usually, its just the element's __class__. + However, the "Annotated" version of the object overrides + to return the class of its proxied element. + + """ + return self.__class__ + + @util.memoized_property + def _cloned_set(self): + """Return the set consisting all cloned ancestors of this + ClauseElement. + + Includes this ClauseElement. This accessor tends to be used for + FromClause objects to identify 'equivalent' FROM clauses, regardless + of transformative operations. + + """ + s = util.column_set() + f = self + while f is not None: + s.add(f) + f = f._is_clone_of + return s + + def __getstate__(self): + d = self.__dict__.copy() + d.pop('_is_clone_of', None) + return d + + def _annotate(self, values): + """return a copy of this ClauseElement with annotations + updated by the given dictionary. + + """ + return Annotated(self, values) + + def _with_annotations(self, values): + """return a copy of this ClauseElement with annotations + replaced by the given dictionary. + + """ + return Annotated(self, values) + + def _deannotate(self, values=None, clone=False): + """return a copy of this :class:`.ClauseElement` with annotations + removed. + + :param values: optional tuple of individual values + to remove. + + """ + if clone: + # clone is used when we are also copying + # the expression for a deep deannotation + return self._clone() + else: + # if no clone, since we have no annotations we return + # self + return self + + def _execute_on_connection(self, connection, multiparams, params): + if self.supports_execution: + return connection._execute_clauseelement(self, multiparams, params) + else: + raise exc.ObjectNotExecutableError(self) + + def unique_params(self, *optionaldict, **kwargs): + """Return a copy with :func:`bindparam()` elements replaced. + + Same functionality as ``params()``, except adds `unique=True` + to affected bind parameters so that multiple statements can be + used. + + """ + return self._params(True, optionaldict, kwargs) + + def params(self, *optionaldict, **kwargs): + """Return a copy with :func:`bindparam()` elements replaced. + + Returns a copy of this ClauseElement with :func:`bindparam()` + elements replaced with values taken from the given dictionary:: + + >>> clause = column('x') + bindparam('foo') + >>> print clause.compile().params + {'foo':None} + >>> print clause.params({'foo':7}).compile().params + {'foo':7} + + """ + return self._params(False, optionaldict, kwargs) + + def _params(self, unique, optionaldict, kwargs): + if len(optionaldict) == 1: + kwargs.update(optionaldict[0]) + elif len(optionaldict) > 1: + raise exc.ArgumentError( + "params() takes zero or one positional dictionary argument") + + def visit_bindparam(bind): + if bind.key in kwargs: + bind.value = kwargs[bind.key] + bind.required = False + if unique: + bind._convert_to_unique() + return cloned_traverse(self, {}, {'bindparam': visit_bindparam}) + + def compare(self, other, **kw): + r"""Compare this ClauseElement to the given ClauseElement. + + Subclasses should override the default behavior, which is a + straight identity comparison. + + \**kw are arguments consumed by subclass compare() methods and + may be used to modify the criteria for comparison. + (see :class:`.ColumnElement`) + + """ + return self is other + + def _copy_internals(self, clone=_clone, **kw): + """Reassign internal elements to be clones of themselves. + + Called during a copy-and-traverse operation on newly + shallow-copied elements to create a deep copy. + + The given clone function should be used, which may be applying + additional transformations to the element (i.e. replacement + traversal, cloned traversal, annotations). + + """ + pass + + def get_children(self, **kwargs): + r"""Return immediate child elements of this :class:`.ClauseElement`. + + This is used for visit traversal. + + \**kwargs may contain flags that change the collection that is + returned, for example to return a subset of items in order to + cut down on larger traversals, or to return child items from a + different context (such as schema-level collections instead of + clause-level). + + """ + return [] + + def self_group(self, against=None): + """Apply a 'grouping' to this :class:`.ClauseElement`. + + This method is overridden by subclasses to return a + "grouping" construct, i.e. parenthesis. In particular + it's used by "binary" expressions to provide a grouping + around themselves when placed into a larger expression, + as well as by :func:`.select` constructs when placed into + the FROM clause of another :func:`.select`. (Note that + subqueries should be normally created using the + :meth:`.Select.alias` method, as many platforms require + nested SELECT statements to be named). + + As expressions are composed together, the application of + :meth:`self_group` is automatic - end-user code should never + need to use this method directly. Note that SQLAlchemy's + clause constructs take operator precedence into account - + so parenthesis might not be needed, for example, in + an expression like ``x OR (y AND z)`` - AND takes precedence + over OR. + + The base :meth:`self_group` method of :class:`.ClauseElement` + just returns self. + """ + return self + + @util.dependencies("sqlalchemy.engine.default") + def compile(self, default, bind=None, dialect=None, **kw): + """Compile this SQL expression. + + The return value is a :class:`~.Compiled` object. + Calling ``str()`` or ``unicode()`` on the returned value will yield a + string representation of the result. The + :class:`~.Compiled` object also can return a + dictionary of bind parameter names and values + using the ``params`` accessor. + + :param bind: An ``Engine`` or ``Connection`` from which a + ``Compiled`` will be acquired. This argument takes precedence over + this :class:`.ClauseElement`'s bound engine, if any. + + :param column_keys: Used for INSERT and UPDATE statements, a list of + column names which should be present in the VALUES clause of the + compiled statement. If ``None``, all columns from the target table + object are rendered. + + :param dialect: A ``Dialect`` instance from which a ``Compiled`` + will be acquired. This argument takes precedence over the `bind` + argument as well as this :class:`.ClauseElement`'s bound engine, + if any. + + :param inline: Used for INSERT statements, for a dialect which does + not support inline retrieval of newly generated primary key + columns, will force the expression used to create the new primary + key value to be rendered inline within the INSERT statement's + VALUES clause. This typically refers to Sequence execution but may + also refer to any server-side default generation function + associated with a primary key `Column`. + + :param compile_kwargs: optional dictionary of additional parameters + that will be passed through to the compiler within all "visit" + methods. This allows any custom flag to be passed through to + a custom compilation construct, for example. It is also used + for the case of passing the ``literal_binds`` flag through:: + + from sqlalchemy.sql import table, column, select + + t = table('t', column('x')) + + s = select([t]).where(t.c.x == 5) + + print s.compile(compile_kwargs={"literal_binds": True}) + + .. versionadded:: 0.9.0 + + .. seealso:: + + :ref:`faq_sql_expression_string` + + """ + + if not dialect: + if bind: + dialect = bind.dialect + elif self.bind: + dialect = self.bind.dialect + bind = self.bind + else: + dialect = default.StrCompileDialect() + return self._compiler(dialect, bind=bind, **kw) + + def _compiler(self, dialect, **kw): + """Return a compiler appropriate for this ClauseElement, given a + Dialect.""" + + return dialect.statement_compiler(dialect, self, **kw) + + def __str__(self): + if util.py3k: + return str(self.compile()) + else: + return unicode(self.compile()).encode('ascii', 'backslashreplace') + + def __and__(self, other): + """'and' at the ClauseElement level. + + .. deprecated:: 0.9.5 - conjunctions are intended to be + at the :class:`.ColumnElement`. level + + """ + return and_(self, other) + + def __or__(self, other): + """'or' at the ClauseElement level. + + .. deprecated:: 0.9.5 - conjunctions are intended to be + at the :class:`.ColumnElement`. level + + """ + return or_(self, other) + + def __invert__(self): + if hasattr(self, 'negation_clause'): + return self.negation_clause + else: + return self._negate() + + def _negate(self): + return UnaryExpression( + self.self_group(against=operators.inv), + operator=operators.inv, + negate=None) + + def __bool__(self): + raise TypeError("Boolean value of this clause is not defined") + + __nonzero__ = __bool__ + + def __repr__(self): + friendly = self.description + if friendly is None: + return object.__repr__(self) + else: + return '<%s.%s at 0x%x; %s>' % ( + self.__module__, self.__class__.__name__, id(self), friendly) + + +class ColumnElement(operators.ColumnOperators, ClauseElement): + """Represent a column-oriented SQL expression suitable for usage in the + "columns" clause, WHERE clause etc. of a statement. + + While the most familiar kind of :class:`.ColumnElement` is the + :class:`.Column` object, :class:`.ColumnElement` serves as the basis + for any unit that may be present in a SQL expression, including + the expressions themselves, SQL functions, bound parameters, + literal expressions, keywords such as ``NULL``, etc. + :class:`.ColumnElement` is the ultimate base class for all such elements. + + A wide variety of SQLAlchemy Core functions work at the SQL expression + level, and are intended to accept instances of :class:`.ColumnElement` as + arguments. These functions will typically document that they accept a + "SQL expression" as an argument. What this means in terms of SQLAlchemy + usually refers to an input which is either already in the form of a + :class:`.ColumnElement` object, or a value which can be **coerced** into + one. The coercion rules followed by most, but not all, SQLAlchemy Core + functions with regards to SQL expressions are as follows: + + * a literal Python value, such as a string, integer or floating + point value, boolean, datetime, ``Decimal`` object, or virtually + any other Python object, will be coerced into a "literal bound + value". This generally means that a :func:`.bindparam` will be + produced featuring the given value embedded into the construct; the + resulting :class:`.BindParameter` object is an instance of + :class:`.ColumnElement`. The Python value will ultimately be sent + to the DBAPI at execution time as a paramterized argument to the + ``execute()`` or ``executemany()`` methods, after SQLAlchemy + type-specific converters (e.g. those provided by any associated + :class:`.TypeEngine` objects) are applied to the value. + + * any special object value, typically ORM-level constructs, which + feature a method called ``__clause_element__()``. The Core + expression system looks for this method when an object of otherwise + unknown type is passed to a function that is looking to coerce the + argument into a :class:`.ColumnElement` expression. The + ``__clause_element__()`` method, if present, should return a + :class:`.ColumnElement` instance. The primary use of + ``__clause_element__()`` within SQLAlchemy is that of class-bound + attributes on ORM-mapped classes; a ``User`` class which contains a + mapped attribute named ``.name`` will have a method + ``User.name.__clause_element__()`` which when invoked returns the + :class:`.Column` called ``name`` associated with the mapped table. + + * The Python ``None`` value is typically interpreted as ``NULL``, + which in SQLAlchemy Core produces an instance of :func:`.null`. + + A :class:`.ColumnElement` provides the ability to generate new + :class:`.ColumnElement` + objects using Python expressions. This means that Python operators + such as ``==``, ``!=`` and ``<`` are overloaded to mimic SQL operations, + and allow the instantiation of further :class:`.ColumnElement` instances + which are composed from other, more fundamental :class:`.ColumnElement` + objects. For example, two :class:`.ColumnClause` objects can be added + together with the addition operator ``+`` to produce + a :class:`.BinaryExpression`. + Both :class:`.ColumnClause` and :class:`.BinaryExpression` are subclasses + of :class:`.ColumnElement`:: + + >>> from sqlalchemy.sql import column + >>> column('a') + column('b') + + >>> print column('a') + column('b') + a + b + + .. seealso:: + + :class:`.Column` + + :func:`.expression.column` + + """ + + __visit_name__ = 'column' + primary_key = False + foreign_keys = [] + + _label = None + """The named label that can be used to target + this column in a result set. + + This label is almost always the label used when + rendering AS AS "; typically columns that don't have + any parent table and are named the same as what the label would be + in any case. + + """ + + _resolve_label = None + """The name that should be used to identify this ColumnElement in a + select() object when "label resolution" logic is used; this refers + to using a string name in an expression like order_by() or group_by() + that wishes to target a labeled expression in the columns clause. + + The name is distinct from that of .name or ._label to account for the case + where anonymizing logic may be used to change the name that's actually + rendered at compile time; this attribute should hold onto the original + name that was user-assigned when producing a .label() construct. + + """ + + _allow_label_resolve = True + """A flag that can be flipped to prevent a column from being resolvable + by string label name.""" + + _alt_names = () + + def self_group(self, against=None): + if (against in (operators.and_, operators.or_, operators._asbool) and + self.type._type_affinity + is type_api.BOOLEANTYPE._type_affinity): + return AsBoolean(self, operators.istrue, operators.isfalse) + elif (against in (operators.any_op, operators.all_op)): + return Grouping(self) + else: + return self + + def _negate(self): + if self.type._type_affinity is type_api.BOOLEANTYPE._type_affinity: + # TODO: see the note in AsBoolean that it seems to assume + # the element is the True_() / False_() constant, so this + # is too broad + return AsBoolean(self, operators.isfalse, operators.istrue) + else: + return super(ColumnElement, self)._negate() + + @util.memoized_property + def type(self): + return type_api.NULLTYPE + + @util.memoized_property + def comparator(self): + try: + comparator_factory = self.type.comparator_factory + except AttributeError: + raise TypeError( + "Object %r associated with '.type' attribute " + "is not a TypeEngine class or object" % self.type) + else: + return comparator_factory(self) + + def __getattr__(self, key): + try: + return getattr(self.comparator, key) + except AttributeError: + raise AttributeError( + 'Neither %r object nor %r object has an attribute %r' % ( + type(self).__name__, + type(self.comparator).__name__, + key) + ) + + def operate(self, op, *other, **kwargs): + return op(self.comparator, *other, **kwargs) + + def reverse_operate(self, op, other, **kwargs): + return op(other, self.comparator, **kwargs) + + def _bind_param(self, operator, obj, type_=None): + return BindParameter(None, obj, + _compared_to_operator=operator, + type_=type_, + _compared_to_type=self.type, unique=True) + + @property + def expression(self): + """Return a column expression. + + Part of the inspection interface; returns self. + + """ + return self + + @property + def _select_iterable(self): + return (self, ) + + @util.memoized_property + def base_columns(self): + return util.column_set(c for c in self.proxy_set + if not hasattr(c, '_proxies')) + + @util.memoized_property + def proxy_set(self): + s = util.column_set([self]) + if hasattr(self, '_proxies'): + for c in self._proxies: + s.update(c.proxy_set) + return s + + def shares_lineage(self, othercolumn): + """Return True if the given :class:`.ColumnElement` + has a common ancestor to this :class:`.ColumnElement`.""" + + return bool(self.proxy_set.intersection(othercolumn.proxy_set)) + + def _compare_name_for_result(self, other): + """Return True if the given column element compares to this one + when targeting within a result row.""" + + return hasattr(other, 'name') and hasattr(self, 'name') and \ + other.name == self.name + + def _make_proxy( + self, selectable, name=None, name_is_truncatable=False, **kw): + """Create a new :class:`.ColumnElement` representing this + :class:`.ColumnElement` as it appears in the select list of a + descending selectable. + + """ + if name is None: + name = self.anon_label + if self.key: + key = self.key + else: + try: + key = str(self) + except exc.UnsupportedCompilationError: + key = self.anon_label + + else: + key = name + co = ColumnClause( + _as_truncated(name) if name_is_truncatable else name, + type_=getattr(self, 'type', None), + _selectable=selectable + ) + co._proxies = [self] + if selectable._is_clone_of is not None: + co._is_clone_of = \ + selectable._is_clone_of.columns.get(key) + selectable._columns[key] = co + return co + + def compare(self, other, use_proxies=False, equivalents=None, **kw): + """Compare this ColumnElement to another. + + Special arguments understood: + + :param use_proxies: when True, consider two columns that + share a common base column as equivalent (i.e. shares_lineage()) + + :param equivalents: a dictionary of columns as keys mapped to sets + of columns. If the given "other" column is present in this + dictionary, if any of the columns in the corresponding set() pass + the comparison test, the result is True. This is used to expand the + comparison to other columns that may be known to be equivalent to + this one via foreign key or other criterion. + + """ + to_compare = (other, ) + if equivalents and other in equivalents: + to_compare = equivalents[other].union(to_compare) + + for oth in to_compare: + if use_proxies and self.shares_lineage(oth): + return True + elif hash(oth) == hash(self): + return True + else: + return False + + def cast(self, type_): + """Produce a type cast, i.e. ``CAST( AS )``. + + This is a shortcut to the :func:`~.expression.cast` function. + + .. versionadded:: 1.0.7 + + """ + return Cast(self, type_) + + def label(self, name): + """Produce a column label, i.e. `` AS ``. + + This is a shortcut to the :func:`~.expression.label` function. + + if 'name' is None, an anonymous label name will be generated. + + """ + return Label(name, self, self.type) + + @util.memoized_property + def anon_label(self): + """provides a constant 'anonymous label' for this ColumnElement. + + This is a label() expression which will be named at compile time. + The same label() is returned each time anon_label is called so + that expressions can reference anon_label multiple times, producing + the same label name at compile time. + + the compiler uses this function automatically at compile time + for expressions that are known to be 'unnamed' like binary + expressions and function calls. + + """ + while self._is_clone_of is not None: + self = self._is_clone_of + + return _anonymous_label( + '%%(%d %s)s' % (id(self), getattr(self, 'name', 'anon')) + ) + + +class BindParameter(ColumnElement): + r"""Represent a "bound expression". + + :class:`.BindParameter` is invoked explicitly using the + :func:`.bindparam` function, as in:: + + from sqlalchemy import bindparam + + stmt = select([users_table]).\ + where(users_table.c.name == bindparam('username')) + + Detailed discussion of how :class:`.BindParameter` is used is + at :func:`.bindparam`. + + .. seealso:: + + :func:`.bindparam` + + """ + + __visit_name__ = 'bindparam' + + _is_crud = False + + def __init__(self, key, value=NO_ARG, type_=None, + unique=False, required=NO_ARG, + quote=None, callable_=None, + isoutparam=False, + _compared_to_operator=None, + _compared_to_type=None): + r"""Produce a "bound expression". + + The return value is an instance of :class:`.BindParameter`; this + is a :class:`.ColumnElement` subclass which represents a so-called + "placeholder" value in a SQL expression, the value of which is + supplied at the point at which the statement in executed against a + database connection. + + In SQLAlchemy, the :func:`.bindparam` construct has + the ability to carry along the actual value that will be ultimately + used at expression time. In this way, it serves not just as + a "placeholder" for eventual population, but also as a means of + representing so-called "unsafe" values which should not be rendered + directly in a SQL statement, but rather should be passed along + to the :term:`DBAPI` as values which need to be correctly escaped + and potentially handled for type-safety. + + When using :func:`.bindparam` explicitly, the use case is typically + one of traditional deferment of parameters; the :func:`.bindparam` + construct accepts a name which can then be referred to at execution + time:: + + from sqlalchemy import bindparam + + stmt = select([users_table]).\ + where(users_table.c.name == bindparam('username')) + + The above statement, when rendered, will produce SQL similar to:: + + SELECT id, name FROM user WHERE name = :username + + In order to populate the value of ``:username`` above, the value + would typically be applied at execution time to a method + like :meth:`.Connection.execute`:: + + result = connection.execute(stmt, username='wendy') + + Explicit use of :func:`.bindparam` is also common when producing + UPDATE or DELETE statements that are to be invoked multiple times, + where the WHERE criterion of the statement is to change on each + invocation, such as:: + + stmt = (users_table.update(). + where(user_table.c.name == bindparam('username')). + values(fullname=bindparam('fullname')) + ) + + connection.execute( + stmt, [{"username": "wendy", "fullname": "Wendy Smith"}, + {"username": "jack", "fullname": "Jack Jones"}, + ] + ) + + SQLAlchemy's Core expression system makes wide use of + :func:`.bindparam` in an implicit sense. It is typical that Python + literal values passed to virtually all SQL expression functions are + coerced into fixed :func:`.bindparam` constructs. For example, given + a comparison operation such as:: + + expr = users_table.c.name == 'Wendy' + + The above expression will produce a :class:`.BinaryExpression` + construct, where the left side is the :class:`.Column` object + representing the ``name`` column, and the right side is a + :class:`.BindParameter` representing the literal value:: + + print(repr(expr.right)) + BindParameter('%(4327771088 name)s', 'Wendy', type_=String()) + + The expression above will render SQL such as:: + + user.name = :name_1 + + Where the ``:name_1`` parameter name is an anonymous name. The + actual string ``Wendy`` is not in the rendered string, but is carried + along where it is later used within statement execution. If we + invoke a statement like the following:: + + stmt = select([users_table]).where(users_table.c.name == 'Wendy') + result = connection.execute(stmt) + + We would see SQL logging output as:: + + SELECT "user".id, "user".name + FROM "user" + WHERE "user".name = %(name_1)s + {'name_1': 'Wendy'} + + Above, we see that ``Wendy`` is passed as a parameter to the database, + while the placeholder ``:name_1`` is rendered in the appropriate form + for the target database, in this case the PostgreSQL database. + + Similarly, :func:`.bindparam` is invoked automatically + when working with :term:`CRUD` statements as far as the "VALUES" + portion is concerned. The :func:`.insert` construct produces an + ``INSERT`` expression which will, at statement execution time, + generate bound placeholders based on the arguments passed, as in:: + + stmt = users_table.insert() + result = connection.execute(stmt, name='Wendy') + + The above will produce SQL output as:: + + INSERT INTO "user" (name) VALUES (%(name)s) + {'name': 'Wendy'} + + The :class:`.Insert` construct, at compilation/execution time, + rendered a single :func:`.bindparam` mirroring the column + name ``name`` as a result of the single ``name`` parameter + we passed to the :meth:`.Connection.execute` method. + + :param key: + the key (e.g. the name) for this bind param. + Will be used in the generated + SQL statement for dialects that use named parameters. This + value may be modified when part of a compilation operation, + if other :class:`BindParameter` objects exist with the same + key, or if its length is too long and truncation is + required. + + :param value: + Initial value for this bind param. Will be used at statement + execution time as the value for this parameter passed to the + DBAPI, if no other value is indicated to the statement execution + method for this particular parameter name. Defaults to ``None``. + + :param callable\_: + A callable function that takes the place of "value". The function + will be called at statement execution time to determine the + ultimate value. Used for scenarios where the actual bind + value cannot be determined at the point at which the clause + construct is created, but embedded bind values are still desirable. + + :param type\_: + A :class:`.TypeEngine` class or instance representing an optional + datatype for this :func:`.bindparam`. If not passed, a type + may be determined automatically for the bind, based on the given + value; for example, trivial Python types such as ``str``, + ``int``, ``bool`` + may result in the :class:`.String`, :class:`.Integer` or + :class:`.Boolean` types being autoamtically selected. + + The type of a :func:`.bindparam` is significant especially in that + the type will apply pre-processing to the value before it is + passed to the database. For example, a :func:`.bindparam` which + refers to a datetime value, and is specified as holding the + :class:`.DateTime` type, may apply conversion needed to the + value (such as stringification on SQLite) before passing the value + to the database. + + :param unique: + if True, the key name of this :class:`.BindParameter` will be + modified if another :class:`.BindParameter` of the same name + already has been located within the containing + expression. This flag is used generally by the internals + when producing so-called "anonymous" bound expressions, it + isn't generally applicable to explicitly-named :func:`.bindparam` + constructs. + + :param required: + If ``True``, a value is required at execution time. If not passed, + it defaults to ``True`` if neither :paramref:`.bindparam.value` + or :paramref:`.bindparam.callable` were passed. If either of these + parameters are present, then :paramref:`.bindparam.required` + defaults to ``False``. + + .. versionchanged:: 0.8 If the ``required`` flag is not specified, + it will be set automatically to ``True`` or ``False`` depending + on whether or not the ``value`` or ``callable`` parameters + were specified. + + :param quote: + True if this parameter name requires quoting and is not + currently known as a SQLAlchemy reserved word; this currently + only applies to the Oracle backend, where bound names must + sometimes be quoted. + + :param isoutparam: + if True, the parameter should be treated like a stored procedure + "OUT" parameter. This applies to backends such as Oracle which + support OUT parameters. + + .. seealso:: + + :ref:`coretutorial_bind_param` + + :ref:`coretutorial_insert_expressions` + + :func:`.outparam` + + """ + if isinstance(key, ColumnClause): + type_ = key.type + key = key.key + if required is NO_ARG: + required = (value is NO_ARG and callable_ is None) + if value is NO_ARG: + value = None + + if quote is not None: + key = quoted_name(key, quote) + + if unique: + self.key = _anonymous_label('%%(%d %s)s' % (id(self), key + or 'param')) + else: + self.key = key or _anonymous_label('%%(%d param)s' + % id(self)) + + # identifying key that won't change across + # clones, used to identify the bind's logical + # identity + self._identifying_key = self.key + + # key that was passed in the first place, used to + # generate new keys + self._orig_key = key or 'param' + + self.unique = unique + self.value = value + self.callable = callable_ + self.isoutparam = isoutparam + self.required = required + if type_ is None: + if _compared_to_type is not None: + self.type = \ + _compared_to_type.coerce_compared_value( + _compared_to_operator, value) + else: + self.type = type_api._resolve_value_to_type(value) + elif isinstance(type_, type): + self.type = type_() + else: + self.type = type_ + + def _with_value(self, value): + """Return a copy of this :class:`.BindParameter` with the given value + set. + """ + cloned = self._clone() + cloned.value = value + cloned.callable = None + cloned.required = False + if cloned.type is type_api.NULLTYPE: + cloned.type = type_api._resolve_value_to_type(value) + return cloned + + @property + def effective_value(self): + """Return the value of this bound parameter, + taking into account if the ``callable`` parameter + was set. + + The ``callable`` value will be evaluated + and returned if present, else ``value``. + + """ + if self.callable: + return self.callable() + else: + return self.value + + def _clone(self): + c = ClauseElement._clone(self) + if self.unique: + c.key = _anonymous_label('%%(%d %s)s' % (id(c), c._orig_key + or 'param')) + return c + + def _convert_to_unique(self): + if not self.unique: + self.unique = True + self.key = _anonymous_label( + '%%(%d %s)s' % (id(self), self._orig_key or 'param')) + + def compare(self, other, **kw): + """Compare this :class:`BindParameter` to the given + clause.""" + + return isinstance(other, BindParameter) \ + and self.type._compare_type_affinity(other.type) \ + and self.value == other.value \ + and self.callable == other.callable + + def __getstate__(self): + """execute a deferred value for serialization purposes.""" + + d = self.__dict__.copy() + v = self.value + if self.callable: + v = self.callable() + d['callable'] = None + d['value'] = v + return d + + def __repr__(self): + return 'BindParameter(%r, %r, type_=%r)' % (self.key, + self.value, self.type) + + +class TypeClause(ClauseElement): + """Handle a type keyword in a SQL statement. + + Used by the ``Case`` statement. + + """ + + __visit_name__ = 'typeclause' + + def __init__(self, type): + self.type = type + + +class TextClause(Executable, ClauseElement): + """Represent a literal SQL text fragment. + + E.g.:: + + from sqlalchemy import text + + t = text("SELECT * FROM users") + result = connection.execute(t) + + + The :class:`.Text` construct is produced using the :func:`.text` + function; see that function for full documentation. + + .. seealso:: + + :func:`.text` + + """ + + __visit_name__ = 'textclause' + + _bind_params_regex = re.compile(r'(?`` + to specify bind parameters; they will be compiled to their + engine-specific format. + + :param autocommit: + Deprecated. Use .execution_options(autocommit=) + to set the autocommit option. + + :param bind: + an optional connection or engine to be used for this text query. + + :param bindparams: + Deprecated. A list of :func:`.bindparam` instances used to + provide information about parameters embedded in the statement. + This argument now invokes the :meth:`.TextClause.bindparams` + method on the construct before returning it. E.g.:: + + stmt = text("SELECT * FROM table WHERE id=:id", + bindparams=[bindparam('id', value=5, type_=Integer)]) + + Is equivalent to:: + + stmt = text("SELECT * FROM table WHERE id=:id").\ + bindparams(bindparam('id', value=5, type_=Integer)) + + .. deprecated:: 0.9.0 the :meth:`.TextClause.bindparams` method + supersedes the ``bindparams`` argument to :func:`.text`. + + :param typemap: + Deprecated. A dictionary mapping the names of columns + represented in the columns clause of a ``SELECT`` statement + to type objects, + which will be used to perform post-processing on columns within + the result set. This parameter now invokes the + :meth:`.TextClause.columns` method, which returns a + :class:`.TextAsFrom` construct that gains a ``.c`` collection and + can be embedded in other expressions. E.g.:: + + stmt = text("SELECT * FROM table", + typemap={'id': Integer, 'name': String}, + ) + + Is equivalent to:: + + stmt = text("SELECT * FROM table").columns(id=Integer, + name=String) + + Or alternatively:: + + from sqlalchemy.sql import column + stmt = text("SELECT * FROM table").columns( + column('id', Integer), + column('name', String) + ) + + .. deprecated:: 0.9.0 the :meth:`.TextClause.columns` method + supersedes the ``typemap`` argument to :func:`.text`. + + .. seealso:: + + :ref:`sqlexpression_text` - in the Core tutorial + + :ref:`orm_tutorial_literal_sql` - in the ORM tutorial + + """ + stmt = TextClause(text, bind=bind) + if bindparams: + stmt = stmt.bindparams(*bindparams) + if typemap: + stmt = stmt.columns(**typemap) + if autocommit is not None: + util.warn_deprecated('autocommit on text() is deprecated. ' + 'Use .execution_options(autocommit=True)') + stmt = stmt.execution_options(autocommit=autocommit) + + return stmt + + @_generative + def bindparams(self, *binds, **names_to_values): + """Establish the values and/or types of bound parameters within + this :class:`.TextClause` construct. + + Given a text construct such as:: + + from sqlalchemy import text + stmt = text("SELECT id, name FROM user WHERE name=:name " + "AND timestamp=:timestamp") + + the :meth:`.TextClause.bindparams` method can be used to establish + the initial value of ``:name`` and ``:timestamp``, + using simple keyword arguments:: + + stmt = stmt.bindparams(name='jack', + timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5)) + + Where above, new :class:`.BindParameter` objects + will be generated with the names ``name`` and ``timestamp``, and + values of ``jack`` and ``datetime.datetime(2012, 10, 8, 15, 12, 5)``, + respectively. The types will be + inferred from the values given, in this case :class:`.String` and + :class:`.DateTime`. + + When specific typing behavior is needed, the positional ``*binds`` + argument can be used in which to specify :func:`.bindparam` constructs + directly. These constructs must include at least the ``key`` + argument, then an optional value and type:: + + from sqlalchemy import bindparam + stmt = stmt.bindparams( + bindparam('name', value='jack', type_=String), + bindparam('timestamp', type_=DateTime) + ) + + Above, we specified the type of :class:`.DateTime` for the + ``timestamp`` bind, and the type of :class:`.String` for the ``name`` + bind. In the case of ``name`` we also set the default value of + ``"jack"``. + + Additional bound parameters can be supplied at statement execution + time, e.g.:: + + result = connection.execute(stmt, + timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5)) + + The :meth:`.TextClause.bindparams` method can be called repeatedly, + where it will re-use existing :class:`.BindParameter` objects to add + new information. For example, we can call + :meth:`.TextClause.bindparams` first with typing information, and a + second time with value information, and it will be combined:: + + stmt = text("SELECT id, name FROM user WHERE name=:name " + "AND timestamp=:timestamp") + stmt = stmt.bindparams( + bindparam('name', type_=String), + bindparam('timestamp', type_=DateTime) + ) + stmt = stmt.bindparams( + name='jack', + timestamp=datetime.datetime(2012, 10, 8, 15, 12, 5) + ) + + + .. versionadded:: 0.9.0 The :meth:`.TextClause.bindparams` method + supersedes the argument ``bindparams`` passed to + :func:`~.expression.text`. + + + """ + self._bindparams = new_params = self._bindparams.copy() + + for bind in binds: + try: + existing = new_params[bind.key] + except KeyError: + raise exc.ArgumentError( + "This text() construct doesn't define a " + "bound parameter named %r" % bind.key) + else: + new_params[existing.key] = bind + + for key, value in names_to_values.items(): + try: + existing = new_params[key] + except KeyError: + raise exc.ArgumentError( + "This text() construct doesn't define a " + "bound parameter named %r" % key) + else: + new_params[key] = existing._with_value(value) + + @util.dependencies('sqlalchemy.sql.selectable') + def columns(self, selectable, *cols, **types): + """Turn this :class:`.TextClause` object into a :class:`.TextAsFrom` + object that can be embedded into another statement. + + This function essentially bridges the gap between an entirely + textual SELECT statement and the SQL expression language concept + of a "selectable":: + + from sqlalchemy.sql import column, text + + stmt = text("SELECT id, name FROM some_table") + stmt = stmt.columns(column('id'), column('name')).alias('st') + + stmt = select([mytable]).\ + select_from( + mytable.join(stmt, mytable.c.name == stmt.c.name) + ).where(stmt.c.id > 5) + + Above, we pass a series of :func:`.column` elements to the + :meth:`.TextClause.columns` method positionally. These :func:`.column` + elements now become first class elements upon the :attr:`.TextAsFrom.c` + column collection, just like any other selectable. + + The column expressions we pass to :meth:`.TextClause.columns` may + also be typed; when we do so, these :class:`.TypeEngine` objects become + the effective return type of the column, so that SQLAlchemy's + result-set-processing systems may be used on the return values. + This is often needed for types such as date or boolean types, as well + as for unicode processing on some dialect configurations:: + + stmt = text("SELECT id, name, timestamp FROM some_table") + stmt = stmt.columns( + column('id', Integer), + column('name', Unicode), + column('timestamp', DateTime) + ) + + for id, name, timestamp in connection.execute(stmt): + print(id, name, timestamp) + + As a shortcut to the above syntax, keyword arguments referring to + types alone may be used, if only type conversion is needed:: + + stmt = text("SELECT id, name, timestamp FROM some_table") + stmt = stmt.columns( + id=Integer, + name=Unicode, + timestamp=DateTime + ) + + for id, name, timestamp in connection.execute(stmt): + print(id, name, timestamp) + + The positional form of :meth:`.TextClause.columns` also provides + the unique feature of **positional column targeting**, which is + particularly useful when using the ORM with complex textual queries. + If we specify the columns from our model to :meth:`.TextClause.columns`, + the result set will match to those columns positionally, meaning the + name or origin of the column in the textual SQL doesn't matter:: + + stmt = text("SELECT users.id, addresses.id, users.id, " + "users.name, addresses.email_address AS email " + "FROM users JOIN addresses ON users.id=addresses.user_id " + "WHERE users.id = 1").columns( + User.id, + Address.id, + Address.user_id, + User.name, + Address.email_address + ) + + query = session.query(User).from_statement(stmt).options( + contains_eager(User.addresses)) + + .. versionadded:: 1.1 the :meth:`.TextClause.columns` method now + offers positional column targeting in the result set when + the column expressions are passed purely positionally. + + The :meth:`.TextClause.columns` method provides a direct + route to calling :meth:`.FromClause.alias` as well as + :meth:`.SelectBase.cte` against a textual SELECT statement:: + + stmt = stmt.columns(id=Integer, name=String).cte('st') + + stmt = select([sometable]).where(sometable.c.id == stmt.c.id) + + .. versionadded:: 0.9.0 :func:`.text` can now be converted into a + fully featured "selectable" construct using the + :meth:`.TextClause.columns` method. This method supersedes the + ``typemap`` argument to :func:`.text`. + + + """ + + positional_input_cols = [ + ColumnClause(col.key, types.pop(col.key)) + if col.key in types + else col + for col in cols + ] + keyed_input_cols = [ + ColumnClause(key, type_) for key, type_ in types.items()] + + return selectable.TextAsFrom( + self, + positional_input_cols + keyed_input_cols, + positional=bool(positional_input_cols) and not keyed_input_cols) + + @property + def type(self): + return type_api.NULLTYPE + + @property + def comparator(self): + return self.type.comparator_factory(self) + + def self_group(self, against=None): + if against is operators.in_op: + return Grouping(self) + else: + return self + + def _copy_internals(self, clone=_clone, **kw): + self._bindparams = dict((b.key, clone(b, **kw)) + for b in self._bindparams.values()) + + def get_children(self, **kwargs): + return list(self._bindparams.values()) + + def compare(self, other): + return isinstance(other, TextClause) and other.text == self.text + + +class Null(ColumnElement): + """Represent the NULL keyword in a SQL statement. + + :class:`.Null` is accessed as a constant via the + :func:`.null` function. + + """ + + __visit_name__ = 'null' + + @util.memoized_property + def type(self): + return type_api.NULLTYPE + + @classmethod + def _instance(cls): + """Return a constant :class:`.Null` construct.""" + + return Null() + + def compare(self, other): + return isinstance(other, Null) + + +class False_(ColumnElement): + """Represent the ``false`` keyword, or equivalent, in a SQL statement. + + :class:`.False_` is accessed as a constant via the + :func:`.false` function. + + """ + + __visit_name__ = 'false' + + @util.memoized_property + def type(self): + return type_api.BOOLEANTYPE + + def _negate(self): + return True_() + + @classmethod + def _instance(cls): + """Return a :class:`.False_` construct. + + E.g.:: + + >>> from sqlalchemy import false + >>> print select([t.c.x]).where(false()) + SELECT x FROM t WHERE false + + A backend which does not support true/false constants will render as + an expression against 1 or 0:: + + >>> print select([t.c.x]).where(false()) + SELECT x FROM t WHERE 0 = 1 + + The :func:`.true` and :func:`.false` constants also feature + "short circuit" operation within an :func:`.and_` or :func:`.or_` + conjunction:: + + >>> print select([t.c.x]).where(or_(t.c.x > 5, true())) + SELECT x FROM t WHERE true + + >>> print select([t.c.x]).where(and_(t.c.x > 5, false())) + SELECT x FROM t WHERE false + + .. versionchanged:: 0.9 :func:`.true` and :func:`.false` feature + better integrated behavior within conjunctions and on dialects + that don't support true/false constants. + + .. seealso:: + + :func:`.true` + + """ + + return False_() + + def compare(self, other): + return isinstance(other, False_) + + +class True_(ColumnElement): + """Represent the ``true`` keyword, or equivalent, in a SQL statement. + + :class:`.True_` is accessed as a constant via the + :func:`.true` function. + + """ + + __visit_name__ = 'true' + + @util.memoized_property + def type(self): + return type_api.BOOLEANTYPE + + def _negate(self): + return False_() + + @classmethod + def _ifnone(cls, other): + if other is None: + return cls._instance() + else: + return other + + @classmethod + def _instance(cls): + """Return a constant :class:`.True_` construct. + + E.g.:: + + >>> from sqlalchemy import true + >>> print select([t.c.x]).where(true()) + SELECT x FROM t WHERE true + + A backend which does not support true/false constants will render as + an expression against 1 or 0:: + + >>> print select([t.c.x]).where(true()) + SELECT x FROM t WHERE 1 = 1 + + The :func:`.true` and :func:`.false` constants also feature + "short circuit" operation within an :func:`.and_` or :func:`.or_` + conjunction:: + + >>> print select([t.c.x]).where(or_(t.c.x > 5, true())) + SELECT x FROM t WHERE true + + >>> print select([t.c.x]).where(and_(t.c.x > 5, false())) + SELECT x FROM t WHERE false + + .. versionchanged:: 0.9 :func:`.true` and :func:`.false` feature + better integrated behavior within conjunctions and on dialects + that don't support true/false constants. + + .. seealso:: + + :func:`.false` + + """ + + return True_() + + def compare(self, other): + return isinstance(other, True_) + + +class ClauseList(ClauseElement): + """Describe a list of clauses, separated by an operator. + + By default, is comma-separated, such as a column listing. + + """ + __visit_name__ = 'clauselist' + + def __init__(self, *clauses, **kwargs): + self.operator = kwargs.pop('operator', operators.comma_op) + self.group = kwargs.pop('group', True) + self.group_contents = kwargs.pop('group_contents', True) + text_converter = kwargs.pop( + '_literal_as_text', + _expression_literal_as_text) + if self.group_contents: + self.clauses = [ + text_converter(clause).self_group(against=self.operator) + for clause in clauses] + else: + self.clauses = [ + text_converter(clause) + for clause in clauses] + + def __iter__(self): + return iter(self.clauses) + + def __len__(self): + return len(self.clauses) + + @property + def _select_iterable(self): + return iter(self) + + def append(self, clause): + if self.group_contents: + self.clauses.append(_literal_as_text(clause). + self_group(against=self.operator)) + else: + self.clauses.append(_literal_as_text(clause)) + + def _copy_internals(self, clone=_clone, **kw): + self.clauses = [clone(clause, **kw) for clause in self.clauses] + + def get_children(self, **kwargs): + return self.clauses + + @property + def _from_objects(self): + return list(itertools.chain(*[c._from_objects for c in self.clauses])) + + def self_group(self, against=None): + if self.group and operators.is_precedent(self.operator, against): + return Grouping(self) + else: + return self + + def compare(self, other, **kw): + """Compare this :class:`.ClauseList` to the given :class:`.ClauseList`, + including a comparison of all the clause items. + + """ + if not isinstance(other, ClauseList) and len(self.clauses) == 1: + return self.clauses[0].compare(other, **kw) + elif isinstance(other, ClauseList) and \ + len(self.clauses) == len(other.clauses) and \ + self.operator is other.operator: + + if self.operator in (operators.and_, operators.or_): + completed = set() + for clause in self.clauses: + for other_clause in set(other.clauses).difference(completed): + if clause.compare(other_clause, **kw): + completed.add(other_clause) + break + return len(completed) == len(other.clauses) + else: + for i in range(0, len(self.clauses)): + if not self.clauses[i].compare(other.clauses[i], **kw): + return False + else: + return True + else: + return False + + +class BooleanClauseList(ClauseList, ColumnElement): + __visit_name__ = 'clauselist' + + def __init__(self, *arg, **kw): + raise NotImplementedError( + "BooleanClauseList has a private constructor") + + @classmethod + def _construct(cls, operator, continue_on, skip_on, *clauses, **kw): + convert_clauses = [] + + clauses = [ + _expression_literal_as_text(clause) + for clause in + util.coerce_generator_arg(clauses) + ] + for clause in clauses: + + if isinstance(clause, continue_on): + continue + elif isinstance(clause, skip_on): + return clause.self_group(against=operators._asbool) + + convert_clauses.append(clause) + + if len(convert_clauses) == 1: + return convert_clauses[0].self_group(against=operators._asbool) + elif not convert_clauses and clauses: + return clauses[0].self_group(against=operators._asbool) + + convert_clauses = [c.self_group(against=operator) + for c in convert_clauses] + + self = cls.__new__(cls) + self.clauses = convert_clauses + self.group = True + self.operator = operator + self.group_contents = True + self.type = type_api.BOOLEANTYPE + return self + + @classmethod + def and_(cls, *clauses): + """Produce a conjunction of expressions joined by ``AND``. + + E.g.:: + + from sqlalchemy import and_ + + stmt = select([users_table]).where( + and_( + users_table.c.name == 'wendy', + users_table.c.enrolled == True + ) + ) + + The :func:`.and_` conjunction is also available using the + Python ``&`` operator (though note that compound expressions + need to be parenthesized in order to function with Python + operator precedence behavior):: + + stmt = select([users_table]).where( + (users_table.c.name == 'wendy') & + (users_table.c.enrolled == True) + ) + + The :func:`.and_` operation is also implicit in some cases; + the :meth:`.Select.where` method for example can be invoked multiple + times against a statement, which will have the effect of each + clause being combined using :func:`.and_`:: + + stmt = select([users_table]).\ + where(users_table.c.name == 'wendy').\ + where(users_table.c.enrolled == True) + + .. seealso:: + + :func:`.or_` + + """ + return cls._construct(operators.and_, True_, False_, *clauses) + + @classmethod + def or_(cls, *clauses): + """Produce a conjunction of expressions joined by ``OR``. + + E.g.:: + + from sqlalchemy import or_ + + stmt = select([users_table]).where( + or_( + users_table.c.name == 'wendy', + users_table.c.name == 'jack' + ) + ) + + The :func:`.or_` conjunction is also available using the + Python ``|`` operator (though note that compound expressions + need to be parenthesized in order to function with Python + operator precedence behavior):: + + stmt = select([users_table]).where( + (users_table.c.name == 'wendy') | + (users_table.c.name == 'jack') + ) + + .. seealso:: + + :func:`.and_` + + """ + return cls._construct(operators.or_, False_, True_, *clauses) + + @property + def _select_iterable(self): + return (self, ) + + def self_group(self, against=None): + if not self.clauses: + return self + else: + return super(BooleanClauseList, self).self_group(against=against) + + def _negate(self): + return ClauseList._negate(self) + + +and_ = BooleanClauseList.and_ +or_ = BooleanClauseList.or_ + + +class Tuple(ClauseList, ColumnElement): + """Represent a SQL tuple.""" + + def __init__(self, *clauses, **kw): + """Return a :class:`.Tuple`. + + Main usage is to produce a composite IN construct:: + + from sqlalchemy import tuple_ + + tuple_(table.c.col1, table.c.col2).in_( + [(1, 2), (5, 12), (10, 19)] + ) + + .. warning:: + + The composite IN construct is not supported by all backends, + and is currently known to work on PostgreSQL and MySQL, + but not SQLite. Unsupported backends will raise + a subclass of :class:`~sqlalchemy.exc.DBAPIError` when such + an expression is invoked. + + """ + + clauses = [_literal_as_binds(c) for c in clauses] + self._type_tuple = [arg.type for arg in clauses] + self.type = kw.pop('type_', self._type_tuple[0] + if self._type_tuple else type_api.NULLTYPE) + + super(Tuple, self).__init__(*clauses, **kw) + + @property + def _select_iterable(self): + return (self, ) + + def _bind_param(self, operator, obj, type_=None): + return Tuple(*[ + BindParameter(None, o, _compared_to_operator=operator, + _compared_to_type=compared_to_type, unique=True, + type_=type_) + for o, compared_to_type in zip(obj, self._type_tuple) + ]).self_group() + + +class Case(ColumnElement): + """Represent a ``CASE`` expression. + + :class:`.Case` is produced using the :func:`.case` factory function, + as in:: + + from sqlalchemy import case + + stmt = select([users_table]).\ + where( + case( + [ + (users_table.c.name == 'wendy', 'W'), + (users_table.c.name == 'jack', 'J') + ], + else_='E' + ) + ) + + Details on :class:`.Case` usage is at :func:`.case`. + + .. seealso:: + + :func:`.case` + + """ + + __visit_name__ = 'case' + + def __init__(self, whens, value=None, else_=None): + r"""Produce a ``CASE`` expression. + + The ``CASE`` construct in SQL is a conditional object that + acts somewhat analogously to an "if/then" construct in other + languages. It returns an instance of :class:`.Case`. + + :func:`.case` in its usual form is passed a list of "when" + constructs, that is, a list of conditions and results as tuples:: + + from sqlalchemy import case + + stmt = select([users_table]).\ + where( + case( + [ + (users_table.c.name == 'wendy', 'W'), + (users_table.c.name == 'jack', 'J') + ], + else_='E' + ) + ) + + The above statement will produce SQL resembling:: + + SELECT id, name FROM user + WHERE CASE + WHEN (name = :name_1) THEN :param_1 + WHEN (name = :name_2) THEN :param_2 + ELSE :param_3 + END + + When simple equality expressions of several values against a single + parent column are needed, :func:`.case` also has a "shorthand" format + used via the + :paramref:`.case.value` parameter, which is passed a column + expression to be compared. In this form, the :paramref:`.case.whens` + parameter is passed as a dictionary containing expressions to be + compared against keyed to result expressions. The statement below is + equivalent to the preceding statement:: + + stmt = select([users_table]).\ + where( + case( + {"wendy": "W", "jack": "J"}, + value=users_table.c.name, + else_='E' + ) + ) + + The values which are accepted as result values in + :paramref:`.case.whens` as well as with :paramref:`.case.else_` are + coerced from Python literals into :func:`.bindparam` constructs. + SQL expressions, e.g. :class:`.ColumnElement` constructs, are accepted + as well. To coerce a literal string expression into a constant + expression rendered inline, use the :func:`.literal_column` construct, + as in:: + + from sqlalchemy import case, literal_column + + case( + [ + ( + orderline.c.qty > 100, + literal_column("'greaterthan100'") + ), + ( + orderline.c.qty > 10, + literal_column("'greaterthan10'") + ) + ], + else_=literal_column("'lessthan10'") + ) + + The above will render the given constants without using bound + parameters for the result values (but still for the comparison + values), as in:: + + CASE + WHEN (orderline.qty > :qty_1) THEN 'greaterthan100' + WHEN (orderline.qty > :qty_2) THEN 'greaterthan10' + ELSE 'lessthan10' + END + + :param whens: The criteria to be compared against, + :paramref:`.case.whens` accepts two different forms, based on + whether or not :paramref:`.case.value` is used. + + In the first form, it accepts a list of 2-tuples; each 2-tuple + consists of ``(, )``, where the SQL + expression is a boolean expression and "value" is a resulting value, + e.g.:: + + case([ + (users_table.c.name == 'wendy', 'W'), + (users_table.c.name == 'jack', 'J') + ]) + + In the second form, it accepts a Python dictionary of comparison + values mapped to a resulting value; this form requires + :paramref:`.case.value` to be present, and values will be compared + using the ``==`` operator, e.g.:: + + case( + {"wendy": "W", "jack": "J"}, + value=users_table.c.name + ) + + :param value: An optional SQL expression which will be used as a + fixed "comparison point" for candidate values within a dictionary + passed to :paramref:`.case.whens`. + + :param else\_: An optional SQL expression which will be the evaluated + result of the ``CASE`` construct if all expressions within + :paramref:`.case.whens` evaluate to false. When omitted, most + databases will produce a result of NULL if none of the "when" + expressions evaluate to true. + + + """ + + try: + whens = util.dictlike_iteritems(whens) + except TypeError: + pass + + if value is not None: + whenlist = [ + (_literal_as_binds(c).self_group(), + _literal_as_binds(r)) for (c, r) in whens + ] + else: + whenlist = [ + (_no_literals(c).self_group(), + _literal_as_binds(r)) for (c, r) in whens + ] + + if whenlist: + type_ = list(whenlist[-1])[-1].type + else: + type_ = None + + if value is None: + self.value = None + else: + self.value = _literal_as_binds(value) + + self.type = type_ + self.whens = whenlist + if else_ is not None: + self.else_ = _literal_as_binds(else_) + else: + self.else_ = None + + def _copy_internals(self, clone=_clone, **kw): + if self.value is not None: + self.value = clone(self.value, **kw) + self.whens = [(clone(x, **kw), clone(y, **kw)) + for x, y in self.whens] + if self.else_ is not None: + self.else_ = clone(self.else_, **kw) + + def get_children(self, **kwargs): + if self.value is not None: + yield self.value + for x, y in self.whens: + yield x + yield y + if self.else_ is not None: + yield self.else_ + + @property + def _from_objects(self): + return list(itertools.chain(*[x._from_objects for x in + self.get_children()])) + + +def literal_column(text, type_=None): + r"""Produce a :class:`.ColumnClause` object that has the + :paramref:`.column.is_literal` flag set to True. + + :func:`.literal_column` is similar to :func:`.column`, except that + it is more often used as a "standalone" column expression that renders + exactly as stated; while :func:`.column` stores a string name that + will be assumed to be part of a table and may be quoted as such, + :func:`.literal_column` can be that, or any other arbitrary column-oriented + expression. + + :param text: the text of the expression; can be any SQL expression. + Quoting rules will not be applied. To specify a column-name expression + which should be subject to quoting rules, use the :func:`column` + function. + + :param type\_: an optional :class:`~sqlalchemy.types.TypeEngine` + object which will + provide result-set translation and additional expression semantics for + this column. If left as None the type will be NullType. + + .. seealso:: + + :func:`.column` + + :func:`.text` + + :ref:`sqlexpression_literal_column` + + """ + return ColumnClause(text, type_=type_, is_literal=True) + + +class Cast(ColumnElement): + """Represent a ``CAST`` expression. + + :class:`.Cast` is produced using the :func:`.cast` factory function, + as in:: + + from sqlalchemy import cast, Numeric + + stmt = select([ + cast(product_table.c.unit_price, Numeric(10, 4)) + ]) + + Details on :class:`.Cast` usage is at :func:`.cast`. + + .. seealso:: + + :func:`.cast` + + """ + + __visit_name__ = 'cast' + + def __init__(self, expression, type_): + """Produce a ``CAST`` expression. + + :func:`.cast` returns an instance of :class:`.Cast`. + + E.g.:: + + from sqlalchemy import cast, Numeric + + stmt = select([ + cast(product_table.c.unit_price, Numeric(10, 4)) + ]) + + The above statement will produce SQL resembling:: + + SELECT CAST(unit_price AS NUMERIC(10, 4)) FROM product + + The :func:`.cast` function performs two distinct functions when + used. The first is that it renders the ``CAST`` expression within + the resulting SQL string. The second is that it associates the given + type (e.g. :class:`.TypeEngine` class or instance) with the column + expression on the Python side, which means the expression will take + on the expression operator behavior associated with that type, + as well as the bound-value handling and result-row-handling behavior + of the type. + + .. versionchanged:: 0.9.0 :func:`.cast` now applies the given type + to the expression such that it takes effect on the bound-value, + e.g. the Python-to-database direction, in addition to the + result handling, e.g. database-to-Python, direction. + + An alternative to :func:`.cast` is the :func:`.type_coerce` function. + This function performs the second task of associating an expression + with a specific type, but does not render the ``CAST`` expression + in SQL. + + :param expression: A SQL expression, such as a :class:`.ColumnElement` + expression or a Python string which will be coerced into a bound + literal value. + + :param type_: A :class:`.TypeEngine` class or instance indicating + the type to which the ``CAST`` should apply. + + .. seealso:: + + :func:`.type_coerce` - Python-side type coercion without emitting + CAST. + + """ + self.type = type_api.to_instance(type_) + self.clause = _literal_as_binds(expression, type_=self.type) + self.typeclause = TypeClause(self.type) + + def _copy_internals(self, clone=_clone, **kw): + self.clause = clone(self.clause, **kw) + self.typeclause = clone(self.typeclause, **kw) + + def get_children(self, **kwargs): + return self.clause, self.typeclause + + @property + def _from_objects(self): + return self.clause._from_objects + + +class TypeCoerce(ColumnElement): + """Represent a Python-side type-coercion wrapper. + + :class:`.TypeCoerce` supplies the :func:`.expression.type_coerce` + function; see that function for usage details. + + .. versionchanged:: 1.1 The :func:`.type_coerce` function now produces + a persistent :class:`.TypeCoerce` wrapper object rather than + translating the given object in place. + + .. seealso:: + + :func:`.expression.type_coerce` + + """ + + __visit_name__ = 'type_coerce' + + def __init__(self, expression, type_): + """Associate a SQL expression with a particular type, without rendering + ``CAST``. + + E.g.:: + + from sqlalchemy import type_coerce + + stmt = select([ + type_coerce(log_table.date_string, StringDateTime()) + ]) + + The above construct will produce a :class:`.TypeCoerce` object, which + renders SQL that labels the expression, but otherwise does not + modify its value on the SQL side:: + + SELECT date_string AS anon_1 FROM log + + When result rows are fetched, the ``StringDateTime`` type + will be applied to result rows on behalf of the ``date_string`` column. + The rationale for the "anon_1" label is so that the type-coerced + column remains separate in the list of result columns vs. other + type-coerced or direct values of the target column. In order to + provide a named label for the expression, use + :meth:`.ColumnElement.label`:: + + stmt = select([ + type_coerce( + log_table.date_string, StringDateTime()).label('date') + ]) + + + A type that features bound-value handling will also have that behavior + take effect when literal values or :func:`.bindparam` constructs are + passed to :func:`.type_coerce` as targets. + For example, if a type implements the + :meth:`.TypeEngine.bind_expression` + method or :meth:`.TypeEngine.bind_processor` method or equivalent, + these functions will take effect at statement compilation/execution + time when a literal value is passed, as in:: + + # bound-value handling of MyStringType will be applied to the + # literal value "some string" + stmt = select([type_coerce("some string", MyStringType)]) + + :func:`.type_coerce` is similar to the :func:`.cast` function, + except that it does not render the ``CAST`` expression in the resulting + statement. + + :param expression: A SQL expression, such as a :class:`.ColumnElement` + expression or a Python string which will be coerced into a bound + literal value. + + :param type_: A :class:`.TypeEngine` class or instance indicating + the type to which the expression is coerced. + + .. seealso:: + + :func:`.cast` + + """ + self.type = type_api.to_instance(type_) + self.clause = _literal_as_binds(expression, type_=self.type) + + def _copy_internals(self, clone=_clone, **kw): + self.clause = clone(self.clause, **kw) + self.__dict__.pop('typed_expression', None) + + def get_children(self, **kwargs): + return self.clause, + + @property + def _from_objects(self): + return self.clause._from_objects + + @util.memoized_property + def typed_expression(self): + if isinstance(self.clause, BindParameter): + bp = self.clause._clone() + bp.type = self.type + return bp + else: + return self.clause + + +class Extract(ColumnElement): + """Represent a SQL EXTRACT clause, ``extract(field FROM expr)``.""" + + __visit_name__ = 'extract' + + def __init__(self, field, expr, **kwargs): + """Return a :class:`.Extract` construct. + + This is typically available as :func:`.extract` + as well as ``func.extract`` from the + :data:`.func` namespace. + + """ + self.type = type_api.INTEGERTYPE + self.field = field + self.expr = _literal_as_binds(expr, None) + + def _copy_internals(self, clone=_clone, **kw): + self.expr = clone(self.expr, **kw) + + def get_children(self, **kwargs): + return self.expr, + + @property + def _from_objects(self): + return self.expr._from_objects + + +class _label_reference(ColumnElement): + """Wrap a column expression as it appears in a 'reference' context. + + This expression is any that inclues an _order_by_label_element, + which is a Label, or a DESC / ASC construct wrapping a Label. + + The production of _label_reference() should occur when an expression + is added to this context; this includes the ORDER BY or GROUP BY of a + SELECT statement, as well as a few other places, such as the ORDER BY + within an OVER clause. + + """ + __visit_name__ = 'label_reference' + + def __init__(self, element): + self.element = element + + def _copy_internals(self, clone=_clone, **kw): + self.element = clone(self.element, **kw) + + @property + def _from_objects(self): + return () + + +class _textual_label_reference(ColumnElement): + __visit_name__ = 'textual_label_reference' + + def __init__(self, element): + self.element = element + + @util.memoized_property + def _text_clause(self): + return TextClause._create_text(self.element) + + +class UnaryExpression(ColumnElement): + """Define a 'unary' expression. + + A unary expression has a single column expression + and an operator. The operator can be placed on the left + (where it is called the 'operator') or right (where it is called the + 'modifier') of the column expression. + + :class:`.UnaryExpression` is the basis for several unary operators + including those used by :func:`.desc`, :func:`.asc`, :func:`.distinct`, + :func:`.nullsfirst` and :func:`.nullslast`. + + """ + __visit_name__ = 'unary' + + def __init__(self, element, operator=None, modifier=None, + type_=None, negate=None, wraps_column_expression=False): + self.operator = operator + self.modifier = modifier + self.element = element.self_group( + against=self.operator or self.modifier) + self.type = type_api.to_instance(type_) + self.negate = negate + self.wraps_column_expression = wraps_column_expression + + @classmethod + def _create_nullsfirst(cls, column): + """Produce the ``NULLS FIRST`` modifier for an ``ORDER BY`` expression. + + :func:`.nullsfirst` is intended to modify the expression produced + by :func:`.asc` or :func:`.desc`, and indicates how NULL values + should be handled when they are encountered during ordering:: + + + from sqlalchemy import desc, nullsfirst + + stmt = select([users_table]).\ + order_by(nullsfirst(desc(users_table.c.name))) + + The SQL expression from the above would resemble:: + + SELECT id, name FROM user ORDER BY name DESC NULLS FIRST + + Like :func:`.asc` and :func:`.desc`, :func:`.nullsfirst` is typically + invoked from the column expression itself using + :meth:`.ColumnElement.nullsfirst`, rather than as its standalone + function version, as in:: + + stmt = (select([users_table]). + order_by(users_table.c.name.desc().nullsfirst()) + ) + + .. seealso:: + + :func:`.asc` + + :func:`.desc` + + :func:`.nullslast` + + :meth:`.Select.order_by` + + """ + return UnaryExpression( + _literal_as_label_reference(column), + modifier=operators.nullsfirst_op, + wraps_column_expression=False) + + @classmethod + def _create_nullslast(cls, column): + """Produce the ``NULLS LAST`` modifier for an ``ORDER BY`` expression. + + :func:`.nullslast` is intended to modify the expression produced + by :func:`.asc` or :func:`.desc`, and indicates how NULL values + should be handled when they are encountered during ordering:: + + + from sqlalchemy import desc, nullslast + + stmt = select([users_table]).\ + order_by(nullslast(desc(users_table.c.name))) + + The SQL expression from the above would resemble:: + + SELECT id, name FROM user ORDER BY name DESC NULLS LAST + + Like :func:`.asc` and :func:`.desc`, :func:`.nullslast` is typically + invoked from the column expression itself using + :meth:`.ColumnElement.nullslast`, rather than as its standalone + function version, as in:: + + stmt = select([users_table]).\ + order_by(users_table.c.name.desc().nullslast()) + + .. seealso:: + + :func:`.asc` + + :func:`.desc` + + :func:`.nullsfirst` + + :meth:`.Select.order_by` + + """ + return UnaryExpression( + _literal_as_label_reference(column), + modifier=operators.nullslast_op, + wraps_column_expression=False) + + @classmethod + def _create_desc(cls, column): + """Produce a descending ``ORDER BY`` clause element. + + e.g.:: + + from sqlalchemy import desc + + stmt = select([users_table]).order_by(desc(users_table.c.name)) + + will produce SQL as:: + + SELECT id, name FROM user ORDER BY name DESC + + The :func:`.desc` function is a standalone version of the + :meth:`.ColumnElement.desc` method available on all SQL expressions, + e.g.:: + + + stmt = select([users_table]).order_by(users_table.c.name.desc()) + + :param column: A :class:`.ColumnElement` (e.g. scalar SQL expression) + with which to apply the :func:`.desc` operation. + + .. seealso:: + + :func:`.asc` + + :func:`.nullsfirst` + + :func:`.nullslast` + + :meth:`.Select.order_by` + + """ + return UnaryExpression( + _literal_as_label_reference(column), + modifier=operators.desc_op, + wraps_column_expression=False) + + @classmethod + def _create_asc(cls, column): + """Produce an ascending ``ORDER BY`` clause element. + + e.g.:: + + from sqlalchemy import asc + stmt = select([users_table]).order_by(asc(users_table.c.name)) + + will produce SQL as:: + + SELECT id, name FROM user ORDER BY name ASC + + The :func:`.asc` function is a standalone version of the + :meth:`.ColumnElement.asc` method available on all SQL expressions, + e.g.:: + + + stmt = select([users_table]).order_by(users_table.c.name.asc()) + + :param column: A :class:`.ColumnElement` (e.g. scalar SQL expression) + with which to apply the :func:`.asc` operation. + + .. seealso:: + + :func:`.desc` + + :func:`.nullsfirst` + + :func:`.nullslast` + + :meth:`.Select.order_by` + + """ + return UnaryExpression( + _literal_as_label_reference(column), + modifier=operators.asc_op, + wraps_column_expression=False) + + @classmethod + def _create_distinct(cls, expr): + """Produce an column-expression-level unary ``DISTINCT`` clause. + + This applies the ``DISTINCT`` keyword to an individual column + expression, and is typically contained within an aggregate function, + as in:: + + from sqlalchemy import distinct, func + stmt = select([func.count(distinct(users_table.c.name))]) + + The above would produce an expression resembling:: + + SELECT COUNT(DISTINCT name) FROM user + + The :func:`.distinct` function is also available as a column-level + method, e.g. :meth:`.ColumnElement.distinct`, as in:: + + stmt = select([func.count(users_table.c.name.distinct())]) + + The :func:`.distinct` operator is different from the + :meth:`.Select.distinct` method of :class:`.Select`, + which produces a ``SELECT`` statement + with ``DISTINCT`` applied to the result set as a whole, + e.g. a ``SELECT DISTINCT`` expression. See that method for further + information. + + .. seealso:: + + :meth:`.ColumnElement.distinct` + + :meth:`.Select.distinct` + + :data:`.func` + + """ + expr = _literal_as_binds(expr) + return UnaryExpression( + expr, operator=operators.distinct_op, + type_=expr.type, wraps_column_expression=False) + + @property + def _order_by_label_element(self): + if self.modifier in (operators.desc_op, operators.asc_op): + return self.element._order_by_label_element + else: + return None + + @property + def _from_objects(self): + return self.element._from_objects + + def _copy_internals(self, clone=_clone, **kw): + self.element = clone(self.element, **kw) + + def get_children(self, **kwargs): + return self.element, + + def compare(self, other, **kw): + """Compare this :class:`UnaryExpression` against the given + :class:`.ClauseElement`.""" + + return ( + isinstance(other, UnaryExpression) and + self.operator == other.operator and + self.modifier == other.modifier and + self.element.compare(other.element, **kw) + ) + + def _negate(self): + if self.negate is not None: + return UnaryExpression( + self.element, + operator=self.negate, + negate=self.operator, + modifier=self.modifier, + type_=self.type, + wraps_column_expression=self.wraps_column_expression) + elif self.type._type_affinity is type_api.BOOLEANTYPE._type_affinity: + return UnaryExpression( + self.self_group(against=operators.inv), + operator=operators.inv, + type_=type_api.BOOLEANTYPE, + wraps_column_expression=self.wraps_column_expression, + negate=None) + else: + return ClauseElement._negate(self) + + def self_group(self, against=None): + if self.operator and operators.is_precedent(self.operator, against): + return Grouping(self) + else: + return self + + +class CollectionAggregate(UnaryExpression): + """Forms the basis for right-hand collection operator modifiers + ANY and ALL. + + The ANY and ALL keywords are available in different ways on different + backends. On PostgreSQL, they only work for an ARRAY type. On + MySQL, they only work for subqueries. + + """ + @classmethod + def _create_any(cls, expr): + """Produce an ANY expression. + + This may apply to an array type for some dialects (e.g. postgresql), + or to a subquery for others (e.g. mysql). e.g.:: + + # postgresql '5 = ANY (somearray)' + expr = 5 == any_(mytable.c.somearray) + + # mysql '5 = ANY (SELECT value FROM table)' + expr = 5 == any_(select([table.c.value])) + + .. versionadded:: 1.1 + + .. seealso:: + + :func:`.expression.all_` + + """ + + expr = _literal_as_binds(expr) + + if expr.is_selectable and hasattr(expr, 'as_scalar'): + expr = expr.as_scalar() + expr = expr.self_group() + return CollectionAggregate( + expr, operator=operators.any_op, + type_=type_api.NULLTYPE, wraps_column_expression=False) + + @classmethod + def _create_all(cls, expr): + """Produce an ALL expression. + + This may apply to an array type for some dialects (e.g. postgresql), + or to a subquery for others (e.g. mysql). e.g.:: + + # postgresql '5 = ALL (somearray)' + expr = 5 == all_(mytable.c.somearray) + + # mysql '5 = ALL (SELECT value FROM table)' + expr = 5 == all_(select([table.c.value])) + + .. versionadded:: 1.1 + + .. seealso:: + + :func:`.expression.any_` + + """ + + expr = _literal_as_binds(expr) + if expr.is_selectable and hasattr(expr, 'as_scalar'): + expr = expr.as_scalar() + expr = expr.self_group() + return CollectionAggregate( + expr, operator=operators.all_op, + type_=type_api.NULLTYPE, wraps_column_expression=False) + + # operate and reverse_operate are hardwired to + # dispatch onto the type comparator directly, so that we can + # ensure "reversed" behavior. + def operate(self, op, *other, **kwargs): + if not operators.is_comparison(op): + raise exc.ArgumentError( + "Only comparison operators may be used with ANY/ALL") + kwargs['reverse'] = True + return self.comparator.operate(operators.mirror(op), *other, **kwargs) + + def reverse_operate(self, op, other, **kwargs): + # comparison operators should never call reverse_operate + assert not operators.is_comparison(op) + raise exc.ArgumentError( + "Only comparison operators may be used with ANY/ALL") + + +class AsBoolean(UnaryExpression): + + def __init__(self, element, operator, negate): + self.element = element + self.type = type_api.BOOLEANTYPE + self.operator = operator + self.negate = negate + self.modifier = None + self.wraps_column_expression = True + + def self_group(self, against=None): + return self + + def _negate(self): + # TODO: this assumes the element is the True_() or False_() + # object, but this assumption isn't enforced and + # ColumnElement._negate() can send any number of expressions here + return self.element._negate() + + +class BinaryExpression(ColumnElement): + """Represent an expression that is ``LEFT RIGHT``. + + A :class:`.BinaryExpression` is generated automatically + whenever two column expressions are used in a Python binary expression:: + + >>> from sqlalchemy.sql import column + >>> column('a') + column('b') + + >>> print column('a') + column('b') + a + b + + """ + + __visit_name__ = 'binary' + + def __init__(self, left, right, operator, type_=None, + negate=None, modifiers=None): + # allow compatibility with libraries that + # refer to BinaryExpression directly and pass strings + if isinstance(operator, util.string_types): + operator = operators.custom_op(operator) + self._orig = (left, right) + self.left = left.self_group(against=operator) + self.right = right.self_group(against=operator) + self.operator = operator + self.type = type_api.to_instance(type_) + self.negate = negate + + if modifiers is None: + self.modifiers = {} + else: + self.modifiers = modifiers + + def __bool__(self): + if self.operator in (operator.eq, operator.ne): + return self.operator(hash(self._orig[0]), hash(self._orig[1])) + else: + raise TypeError("Boolean value of this clause is not defined") + + __nonzero__ = __bool__ + + @property + def is_comparison(self): + return operators.is_comparison(self.operator) + + @property + def _from_objects(self): + return self.left._from_objects + self.right._from_objects + + def _copy_internals(self, clone=_clone, **kw): + self.left = clone(self.left, **kw) + self.right = clone(self.right, **kw) + + def get_children(self, **kwargs): + return self.left, self.right + + def compare(self, other, **kw): + """Compare this :class:`BinaryExpression` against the + given :class:`BinaryExpression`.""" + + return ( + isinstance(other, BinaryExpression) and + self.operator == other.operator and + ( + self.left.compare(other.left, **kw) and + self.right.compare(other.right, **kw) or + ( + operators.is_commutative(self.operator) and + self.left.compare(other.right, **kw) and + self.right.compare(other.left, **kw) + ) + ) + ) + + def self_group(self, against=None): + if operators.is_precedent(self.operator, against): + return Grouping(self) + else: + return self + + def _negate(self): + if self.negate is not None: + return BinaryExpression( + self.left, + self.right, + self.negate, + negate=self.operator, + type_=self.type, + modifiers=self.modifiers) + else: + return super(BinaryExpression, self)._negate() + + +class Slice(ColumnElement): + """Represent SQL for a Python array-slice object. + + This is not a specific SQL construct at this level, but + may be interpreted by specific dialects, e.g. PostgreSQL. + + """ + __visit_name__ = 'slice' + + def __init__(self, start, stop, step): + self.start = start + self.stop = stop + self.step = step + self.type = type_api.NULLTYPE + + def self_group(self, against=None): + assert against is operator.getitem + return self + + +class IndexExpression(BinaryExpression): + """Represent the class of expressions that are like an "index" operation. + """ + pass + + +class Grouping(ColumnElement): + """Represent a grouping within a column expression""" + + __visit_name__ = 'grouping' + + def __init__(self, element): + self.element = element + self.type = getattr(element, 'type', type_api.NULLTYPE) + + def self_group(self, against=None): + return self + + @property + def _key_label(self): + return self._label + + @property + def _label(self): + return getattr(self.element, '_label', None) or self.anon_label + + def _copy_internals(self, clone=_clone, **kw): + self.element = clone(self.element, **kw) + + def get_children(self, **kwargs): + return self.element, + + @property + def _from_objects(self): + return self.element._from_objects + + def __getattr__(self, attr): + return getattr(self.element, attr) + + def __getstate__(self): + return {'element': self.element, 'type': self.type} + + def __setstate__(self, state): + self.element = state['element'] + self.type = state['type'] + + def compare(self, other, **kw): + return isinstance(other, Grouping) and \ + self.element.compare(other.element) + + +RANGE_UNBOUNDED = util.symbol("RANGE_UNBOUNDED") +RANGE_CURRENT = util.symbol("RANGE_CURRENT") + + +class Over(ColumnElement): + """Represent an OVER clause. + + This is a special operator against a so-called + "window" function, as well as any aggregate function, + which produces results relative to the result set + itself. It's supported only by certain database + backends. + + """ + __visit_name__ = 'over' + + order_by = None + partition_by = None + + def __init__( + self, element, partition_by=None, + order_by=None, range_=None, rows=None): + """Produce an :class:`.Over` object against a function. + + Used against aggregate or so-called "window" functions, + for database backends that support window functions. + + :func:`~.expression.over` is usually called using + the :meth:`.FunctionElement.over` method, e.g.:: + + func.row_number().over(order_by=mytable.c.some_column) + + Would produce:: + + ROW_NUMBER() OVER(ORDER BY some_column) + + Ranges are also possible using the :paramref:`.expression.over.range_` + and :paramref:`.expression.over.rows` parameters. These + mutually-exclusive parameters each accept a 2-tuple, which contains + a combination of integers and None:: + + func.row_number().over(order_by=my_table.c.some_column, range_=(None, 0)) + + The above would produce:: + + ROW_NUMBER() OVER(ORDER BY some_column RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) + + A value of None indicates "unbounded", a + value of zero indicates "current row", and negative / positive + integers indicate "preceding" and "following": + + * RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING:: + + func.row_number().over(order_by='x', range_=(-5, 10)) + + * ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:: + + func.row_number().over(order_by='x', rows=(None, 0)) + + * RANGE BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING:: + + func.row_number().over(order_by='x', range_=(-2, None)) + + .. versionadded:: 1.1 support for RANGE / ROWS within a window + + + :param element: a :class:`.FunctionElement`, :class:`.WithinGroup`, + or other compatible construct. + :param partition_by: a column element or string, or a list + of such, that will be used as the PARTITION BY clause + of the OVER construct. + :param order_by: a column element or string, or a list + of such, that will be used as the ORDER BY clause + of the OVER construct. + :param range_: optional range clause for the window. This is a + tuple value which can contain integer values or None, and will + render a RANGE BETWEEN PRECEDING / FOLLOWING clause + + .. versionadded:: 1.1 + + :param rows: optional rows clause for the window. This is a tuple + value which can contain integer values or None, and will render + a ROWS BETWEEN PRECEDING / FOLLOWING clause. + + .. versionadded:: 1.1 + + This function is also available from the :data:`~.expression.func` + construct itself via the :meth:`.FunctionElement.over` method. + + .. seealso:: + + :data:`.expression.func` + + :func:`.expression.within_group` + + """ + self.element = element + if order_by is not None: + self.order_by = ClauseList( + *util.to_list(order_by), + _literal_as_text=_literal_as_label_reference) + if partition_by is not None: + self.partition_by = ClauseList( + *util.to_list(partition_by), + _literal_as_text=_literal_as_label_reference) + + if range_: + self.range_ = self._interpret_range(range_) + if rows: + raise exc.ArgumentError( + "'range_' and 'rows' are mutually exclusive") + else: + self.rows = None + elif rows: + self.rows = self._interpret_range(rows) + self.range_ = None + else: + self.rows = self.range_ = None + + def _interpret_range(self, range_): + if not isinstance(range_, tuple) or len(range_) != 2: + raise exc.ArgumentError("2-tuple expected for range/rows") + + if range_[0] is None: + preceding = RANGE_UNBOUNDED + else: + try: + preceding = int(range_[0]) + except ValueError: + raise exc.ArgumentError( + "Integer or None expected for preceding value") + else: + if preceding > 0: + raise exc.ArgumentError( + "Preceding value must be a " + "negative integer, zero, or None") + elif preceding < 0: + preceding = literal(abs(preceding)) + else: + preceding = RANGE_CURRENT + + if range_[1] is None: + following = RANGE_UNBOUNDED + else: + try: + following = int(range_[1]) + except ValueError: + raise exc.ArgumentError( + "Integer or None expected for following value") + else: + if following < 0: + raise exc.ArgumentError( + "Following value must be a positive " + "integer, zero, or None") + elif following > 0: + following = literal(following) + else: + following = RANGE_CURRENT + + return preceding, following + + @property + def func(self): + """the element referred to by this :class:`.Over` + clause. + + .. deprecated:: 1.1 the ``func`` element has been renamed to + ``.element``. The two attributes are synonymous though + ``.func`` is read-only. + + """ + return self.element + + @util.memoized_property + def type(self): + return self.element.type + + def get_children(self, **kwargs): + return [c for c in + (self.element, self.partition_by, self.order_by) + if c is not None] + + def _copy_internals(self, clone=_clone, **kw): + self.element = clone(self.element, **kw) + if self.partition_by is not None: + self.partition_by = clone(self.partition_by, **kw) + if self.order_by is not None: + self.order_by = clone(self.order_by, **kw) + + @property + def _from_objects(self): + return list(itertools.chain( + *[c._from_objects for c in + (self.element, self.partition_by, self.order_by) + if c is not None] + )) + + +class WithinGroup(ColumnElement): + """Represent a WITHIN GROUP (ORDER BY) clause. + + This is a special operator against so-called + so-called "ordered set aggregate" and "hypothetical + set aggregate" functions, including ``percentile_cont()``, + ``rank()``, ``dense_rank()``, etc. + + It's supported only by certain database backends, such as PostgreSQL, + Oracle and MS SQL Server. + + The :class:`.WithinGroup` consturct extracts its type from the + method :meth:`.FunctionElement.within_group_type`. If this returns + ``None``, the function's ``.type`` is used. + + """ + __visit_name__ = 'withingroup' + + order_by = None + + def __init__(self, element, *order_by): + r"""Produce a :class:`.WithinGroup` object against a function. + + Used against so-called "ordered set aggregate" and "hypothetical + set aggregate" functions, including :class:`.percentile_cont`, + :class:`.rank`, :class:`.dense_rank`, etc. + + :func:`~.expression.within_group` is usually called using + the :meth:`.FunctionElement.within_group` method, e.g.:: + + from sqlalchemy import within_group + stmt = select([ + department.c.id, + func.percentile_cont(0.5).within_group( + department.c.salary.desc() + ) + ]) + + The above statement would produce SQL similar to + ``SELECT department.id, percentile_cont(0.5) + WITHIN GROUP (ORDER BY department.salary DESC)``. + + :param element: a :class:`.FunctionElement` construct, typically + generated by :data:`~.expression.func`. + :param \*order_by: one or more column elements that will be used + as the ORDER BY clause of the WITHIN GROUP construct. + + .. versionadded:: 1.1 + + .. seealso:: + + :data:`.expression.func` + + :func:`.expression.over` + + """ + self.element = element + if order_by is not None: + self.order_by = ClauseList( + *util.to_list(order_by), + _literal_as_text=_literal_as_label_reference) + + def over(self, partition_by=None, order_by=None): + """Produce an OVER clause against this :class:`.WithinGroup` + construct. + + This function has the same signature as that of + :meth:`.FunctionElement.over`. + + """ + return Over(self, partition_by=partition_by, order_by=order_by) + + @util.memoized_property + def type(self): + wgt = self.element.within_group_type(self) + if wgt is not None: + return wgt + else: + return self.element.type + + def get_children(self, **kwargs): + return [c for c in + (self.func, self.order_by) + if c is not None] + + def _copy_internals(self, clone=_clone, **kw): + self.element = clone(self.element, **kw) + if self.order_by is not None: + self.order_by = clone(self.order_by, **kw) + + @property + def _from_objects(self): + return list(itertools.chain( + *[c._from_objects for c in + (self.element, self.order_by) + if c is not None] + )) + + +class FunctionFilter(ColumnElement): + """Represent a function FILTER clause. + + This is a special operator against aggregate and window functions, + which controls which rows are passed to it. + It's supported only by certain database backends. + + Invocation of :class:`.FunctionFilter` is via + :meth:`.FunctionElement.filter`:: + + func.count(1).filter(True) + + .. versionadded:: 1.0.0 + + .. seealso:: + + :meth:`.FunctionElement.filter` + + """ + __visit_name__ = 'funcfilter' + + criterion = None + + def __init__(self, func, *criterion): + """Produce a :class:`.FunctionFilter` object against a function. + + Used against aggregate and window functions, + for database backends that support the "FILTER" clause. + + E.g.:: + + from sqlalchemy import funcfilter + funcfilter(func.count(1), MyClass.name == 'some name') + + Would produce "COUNT(1) FILTER (WHERE myclass.name = 'some name')". + + This function is also available from the :data:`~.expression.func` + construct itself via the :meth:`.FunctionElement.filter` method. + + .. versionadded:: 1.0.0 + + .. seealso:: + + :meth:`.FunctionElement.filter` + + + """ + self.func = func + self.filter(*criterion) + + def filter(self, *criterion): + """Produce an additional FILTER against the function. + + This method adds additional criteria to the initial criteria + set up by :meth:`.FunctionElement.filter`. + + Multiple criteria are joined together at SQL render time + via ``AND``. + + + """ + + for criterion in list(criterion): + criterion = _expression_literal_as_text(criterion) + + if self.criterion is not None: + self.criterion = self.criterion & criterion + else: + self.criterion = criterion + + return self + + def over(self, partition_by=None, order_by=None): + """Produce an OVER clause against this filtered function. + + Used against aggregate or so-called "window" functions, + for database backends that support window functions. + + The expression:: + + func.rank().filter(MyClass.y > 5).over(order_by='x') + + is shorthand for:: + + from sqlalchemy import over, funcfilter + over(funcfilter(func.rank(), MyClass.y > 5), order_by='x') + + See :func:`~.expression.over` for a full description. + + """ + return Over(self, partition_by=partition_by, order_by=order_by) + + @util.memoized_property + def type(self): + return self.func.type + + def get_children(self, **kwargs): + return [c for c in + (self.func, self.criterion) + if c is not None] + + def _copy_internals(self, clone=_clone, **kw): + self.func = clone(self.func, **kw) + if self.criterion is not None: + self.criterion = clone(self.criterion, **kw) + + @property + def _from_objects(self): + return list(itertools.chain( + *[c._from_objects for c in (self.func, self.criterion) + if c is not None] + )) + + +class Label(ColumnElement): + """Represents a column label (AS). + + Represent a label, as typically applied to any column-level + element using the ``AS`` sql keyword. + + """ + + __visit_name__ = 'label' + + def __init__(self, name, element, type_=None): + """Return a :class:`Label` object for the + given :class:`.ColumnElement`. + + A label changes the name of an element in the columns clause of a + ``SELECT`` statement, typically via the ``AS`` SQL keyword. + + This functionality is more conveniently available via the + :meth:`.ColumnElement.label` method on :class:`.ColumnElement`. + + :param name: label name + + :param obj: a :class:`.ColumnElement`. + + """ + + if isinstance(element, Label): + self._resolve_label = element._label + + while isinstance(element, Label): + element = element.element + + if name: + self.name = name + self._resolve_label = self.name + else: + self.name = _anonymous_label( + '%%(%d %s)s' % (id(self), getattr(element, 'name', 'anon')) + ) + + self.key = self._label = self._key_label = self.name + self._element = element + self._type = type_ + self._proxies = [element] + + def __reduce__(self): + return self.__class__, (self.name, self._element, self._type) + + @util.memoized_property + def _allow_label_resolve(self): + return self.element._allow_label_resolve + + @property + def _order_by_label_element(self): + return self + + @util.memoized_property + def type(self): + return type_api.to_instance( + self._type or getattr(self._element, 'type', None) + ) + + @util.memoized_property + def element(self): + return self._element.self_group(against=operators.as_) + + def self_group(self, against=None): + sub_element = self._element.self_group(against=against) + if sub_element is not self._element: + return Label(self.name, + sub_element, + type_=self._type) + else: + return self + + @property + def primary_key(self): + return self.element.primary_key + + @property + def foreign_keys(self): + return self.element.foreign_keys + + def get_children(self, **kwargs): + return self.element, + + def _copy_internals(self, clone=_clone, anonymize_labels=False, **kw): + self._element = clone(self._element, **kw) + self.__dict__.pop('element', None) + self.__dict__.pop('_allow_label_resolve', None) + if anonymize_labels: + self.name = self._resolve_label = _anonymous_label( + '%%(%d %s)s' % ( + id(self), getattr(self.element, 'name', 'anon')) + ) + self.key = self._label = self._key_label = self.name + + @property + def _from_objects(self): + return self.element._from_objects + + def _make_proxy(self, selectable, name=None, **kw): + e = self.element._make_proxy(selectable, + name=name if name else self.name) + e._proxies.append(self) + if self._type is not None: + e.type = self._type + return e + + +class ColumnClause(Immutable, ColumnElement): + """Represents a column expression from any textual string. + + The :class:`.ColumnClause`, a lightweight analogue to the + :class:`.Column` class, is typically invoked using the + :func:`.column` function, as in:: + + from sqlalchemy import column + + id, name = column("id"), column("name") + stmt = select([id, name]).select_from("user") + + The above statement would produce SQL like:: + + SELECT id, name FROM user + + :class:`.ColumnClause` is the immediate superclass of the schema-specific + :class:`.Column` object. While the :class:`.Column` class has all the + same capabilities as :class:`.ColumnClause`, the :class:`.ColumnClause` + class is usable by itself in those cases where behavioral requirements + are limited to simple SQL expression generation. The object has none of + the associations with schema-level metadata or with execution-time + behavior that :class:`.Column` does, so in that sense is a "lightweight" + version of :class:`.Column`. + + Full details on :class:`.ColumnClause` usage is at :func:`.column`. + + .. seealso:: + + :func:`.column` + + :class:`.Column` + + """ + __visit_name__ = 'column' + + onupdate = default = server_default = server_onupdate = None + + _memoized_property = util.group_expirable_memoized_property() + + def __init__(self, text, type_=None, is_literal=False, _selectable=None): + """Produce a :class:`.ColumnClause` object. + + The :class:`.ColumnClause` is a lightweight analogue to the + :class:`.Column` class. The :func:`.column` function can + be invoked with just a name alone, as in:: + + from sqlalchemy import column + + id, name = column("id"), column("name") + stmt = select([id, name]).select_from("user") + + The above statement would produce SQL like:: + + SELECT id, name FROM user + + Once constructed, :func:`.column` may be used like any other SQL + expression element such as within :func:`.select` constructs:: + + from sqlalchemy.sql import column + + id, name = column("id"), column("name") + stmt = select([id, name]).select_from("user") + + The text handled by :func:`.column` is assumed to be handled + like the name of a database column; if the string contains mixed case, + special characters, or matches a known reserved word on the target + backend, the column expression will render using the quoting + behavior determined by the backend. To produce a textual SQL + expression that is rendered exactly without any quoting, + use :func:`.literal_column` instead, or pass ``True`` as the + value of :paramref:`.column.is_literal`. Additionally, full SQL + statements are best handled using the :func:`.text` construct. + + :func:`.column` can be used in a table-like + fashion by combining it with the :func:`.table` function + (which is the lightweight analogue to :class:`.Table`) to produce + a working table construct with minimal boilerplate:: + + from sqlalchemy import table, column, select + + user = table("user", + column("id"), + column("name"), + column("description"), + ) + + stmt = select([user.c.description]).where(user.c.name == 'wendy') + + A :func:`.column` / :func:`.table` construct like that illustrated + above can be created in an + ad-hoc fashion and is not associated with any + :class:`.schema.MetaData`, DDL, or events, unlike its + :class:`.Table` counterpart. + + .. versionchanged:: 1.0.0 :func:`.expression.column` can now + be imported from the plain ``sqlalchemy`` namespace like any + other SQL element. + + :param text: the text of the element. + + :param type: :class:`.types.TypeEngine` object which can associate + this :class:`.ColumnClause` with a type. + + :param is_literal: if True, the :class:`.ColumnClause` is assumed to + be an exact expression that will be delivered to the output with no + quoting rules applied regardless of case sensitive settings. the + :func:`.literal_column()` function essentially invokes + :func:`.column` while passing ``is_literal=True``. + + .. seealso:: + + :class:`.Column` + + :func:`.literal_column` + + :func:`.table` + + :func:`.text` + + :ref:`sqlexpression_literal_column` + + """ + + self.key = self.name = text + self.table = _selectable + self.type = type_api.to_instance(type_) + self.is_literal = is_literal + + def _compare_name_for_result(self, other): + if self.is_literal or \ + self.table is None or self.table._textual or \ + not hasattr(other, 'proxy_set') or ( + isinstance(other, ColumnClause) and + (other.is_literal or + other.table is None or + other.table._textual) + ): + return (hasattr(other, 'name') and self.name == other.name) or \ + (hasattr(other, '_label') and self._label == other._label) + else: + return other.proxy_set.intersection(self.proxy_set) + + def _get_table(self): + return self.__dict__['table'] + + def _set_table(self, table): + self._memoized_property.expire_instance(self) + self.__dict__['table'] = table + table = property(_get_table, _set_table) + + @_memoized_property + def _from_objects(self): + t = self.table + if t is not None: + return [t] + else: + return [] + + @util.memoized_property + def description(self): + if util.py3k: + return self.name + else: + return self.name.encode('ascii', 'backslashreplace') + + @_memoized_property + def _key_label(self): + if self.key != self.name: + return self._gen_label(self.key) + else: + return self._label + + @_memoized_property + def _label(self): + return self._gen_label(self.name) + + @_memoized_property + def _render_label_in_columns_clause(self): + return self.table is not None + + def _gen_label(self, name): + t = self.table + + if self.is_literal: + return None + + elif t is not None and t.named_with_column: + if getattr(t, 'schema', None): + label = t.schema.replace('.', '_') + "_" + \ + t.name + "_" + name + else: + label = t.name + "_" + name + + # propagate name quoting rules for labels. + if getattr(name, "quote", None) is not None: + if isinstance(label, quoted_name): + label.quote = name.quote + else: + label = quoted_name(label, name.quote) + elif getattr(t.name, "quote", None) is not None: + # can't get this situation to occur, so let's + # assert false on it for now + assert not isinstance(label, quoted_name) + label = quoted_name(label, t.name.quote) + + # ensure the label name doesn't conflict with that + # of an existing column + if label in t.c: + _label = label + counter = 1 + while _label in t.c: + _label = label + "_" + str(counter) + counter += 1 + label = _label + + return _as_truncated(label) + + else: + return name + + def _bind_param(self, operator, obj, type_=None): + return BindParameter(self.key, obj, + _compared_to_operator=operator, + _compared_to_type=self.type, + type_=type_, + unique=True) + + def _make_proxy(self, selectable, name=None, attach=True, + name_is_truncatable=False, **kw): + # propagate the "is_literal" flag only if we are keeping our name, + # otherwise its considered to be a label + is_literal = self.is_literal and (name is None or name == self.name) + c = self._constructor( + _as_truncated(name or self.name) if + name_is_truncatable else + (name or self.name), + type_=self.type, + _selectable=selectable, + is_literal=is_literal + ) + if name is None: + c.key = self.key + c._proxies = [self] + if selectable._is_clone_of is not None: + c._is_clone_of = \ + selectable._is_clone_of.columns.get(c.key) + + if attach: + selectable._columns[c.key] = c + return c + + +class _IdentifiedClause(Executable, ClauseElement): + + __visit_name__ = 'identified' + _execution_options = \ + Executable._execution_options.union({'autocommit': False}) + + def __init__(self, ident): + self.ident = ident + + +class SavepointClause(_IdentifiedClause): + __visit_name__ = 'savepoint' + + +class RollbackToSavepointClause(_IdentifiedClause): + __visit_name__ = 'rollback_to_savepoint' + + +class ReleaseSavepointClause(_IdentifiedClause): + __visit_name__ = 'release_savepoint' + + +class quoted_name(util.MemoizedSlots, util.text_type): + """Represent a SQL identifier combined with quoting preferences. + + :class:`.quoted_name` is a Python unicode/str subclass which + represents a particular identifier name along with a + ``quote`` flag. This ``quote`` flag, when set to + ``True`` or ``False``, overrides automatic quoting behavior + for this identifier in order to either unconditionally quote + or to not quote the name. If left at its default of ``None``, + quoting behavior is applied to the identifier on a per-backend basis + based on an examination of the token itself. + + A :class:`.quoted_name` object with ``quote=True`` is also + prevented from being modified in the case of a so-called + "name normalize" option. Certain database backends, such as + Oracle, Firebird, and DB2 "normalize" case-insensitive names + as uppercase. The SQLAlchemy dialects for these backends + convert from SQLAlchemy's lower-case-means-insensitive convention + to the upper-case-means-insensitive conventions of those backends. + The ``quote=True`` flag here will prevent this conversion from occurring + to support an identifier that's quoted as all lower case against + such a backend. + + The :class:`.quoted_name` object is normally created automatically + when specifying the name for key schema constructs such as + :class:`.Table`, :class:`.Column`, and others. The class can also be + passed explicitly as the name to any function that receives a name which + can be quoted. Such as to use the :meth:`.Engine.has_table` method with + an unconditionally quoted name:: + + from sqlaclchemy import create_engine + from sqlalchemy.sql.elements import quoted_name + + engine = create_engine("oracle+cx_oracle://some_dsn") + engine.has_table(quoted_name("some_table", True)) + + The above logic will run the "has table" logic against the Oracle backend, + passing the name exactly as ``"some_table"`` without converting to + upper case. + + .. versionadded:: 0.9.0 + + """ + + __slots__ = 'quote', 'lower', 'upper' + + def __new__(cls, value, quote): + if value is None: + return None + # experimental - don't bother with quoted_name + # if quote flag is None. doesn't seem to make any dent + # in performance however + # elif not sprcls and quote is None: + # return value + elif isinstance(value, cls) and ( + quote is None or value.quote == quote + ): + return value + self = super(quoted_name, cls).__new__(cls, value) + self.quote = quote + return self + + def __reduce__(self): + return quoted_name, (util.text_type(self), self.quote) + + def _memoized_method_lower(self): + if self.quote: + return self + else: + return util.text_type(self).lower() + + def _memoized_method_upper(self): + if self.quote: + return self + else: + return util.text_type(self).upper() + + def __repr__(self): + backslashed = self.encode('ascii', 'backslashreplace') + if not util.py2k: + backslashed = backslashed.decode('ascii') + return "'%s'" % backslashed + + +class _truncated_label(quoted_name): + """A unicode subclass used to identify symbolic " + "names that may require truncation.""" + + __slots__ = () + + def __new__(cls, value, quote=None): + quote = getattr(value, "quote", quote) + # return super(_truncated_label, cls).__new__(cls, value, quote, True) + return super(_truncated_label, cls).__new__(cls, value, quote) + + def __reduce__(self): + return self.__class__, (util.text_type(self), self.quote) + + def apply_map(self, map_): + return self + + +class conv(_truncated_label): + """Mark a string indicating that a name has already been converted + by a naming convention. + + This is a string subclass that indicates a name that should not be + subject to any further naming conventions. + + E.g. when we create a :class:`.Constraint` using a naming convention + as follows:: + + m = MetaData(naming_convention={ + "ck": "ck_%(table_name)s_%(constraint_name)s" + }) + t = Table('t', m, Column('x', Integer), + CheckConstraint('x > 5', name='x5')) + + The name of the above constraint will be rendered as ``"ck_t_x5"``. + That is, the existing name ``x5`` is used in the naming convention as the + ``constraint_name`` token. + + In some situations, such as in migration scripts, we may be rendering + the above :class:`.CheckConstraint` with a name that's already been + converted. In order to make sure the name isn't double-modified, the + new name is applied using the :func:`.schema.conv` marker. We can + use this explicitly as follows:: + + + m = MetaData(naming_convention={ + "ck": "ck_%(table_name)s_%(constraint_name)s" + }) + t = Table('t', m, Column('x', Integer), + CheckConstraint('x > 5', name=conv('ck_t_x5'))) + + Where above, the :func:`.schema.conv` marker indicates that the constraint + name here is final, and the name will render as ``"ck_t_x5"`` and not + ``"ck_t_ck_t_x5"`` + + .. versionadded:: 0.9.4 + + .. seealso:: + + :ref:`constraint_naming_conventions` + + """ + __slots__ = () + + +class _defer_name(_truncated_label): + """mark a name as 'deferred' for the purposes of automated name + generation. + + """ + __slots__ = () + + def __new__(cls, value): + if value is None: + return _NONE_NAME + elif isinstance(value, conv): + return value + else: + return super(_defer_name, cls).__new__(cls, value) + + def __reduce__(self): + return self.__class__, (util.text_type(self), ) + + +class _defer_none_name(_defer_name): + """indicate a 'deferred' name that was ultimately the value None.""" + __slots__ = () + +_NONE_NAME = _defer_none_name("_unnamed_") + +# for backwards compatibility in case +# someone is re-implementing the +# _truncated_identifier() sequence in a custom +# compiler +_generated_label = _truncated_label + + +class _anonymous_label(_truncated_label): + """A unicode subclass used to identify anonymously + generated names.""" + + __slots__ = () + + def __add__(self, other): + return _anonymous_label( + quoted_name( + util.text_type.__add__(self, util.text_type(other)), + self.quote) + ) + + def __radd__(self, other): + return _anonymous_label( + quoted_name( + util.text_type.__add__(util.text_type(other), self), + self.quote) + ) + + def apply_map(self, map_): + if self.quote is not None: + # preserve quoting only if necessary + return quoted_name(self % map_, self.quote) + else: + # else skip the constructor call + return self % map_ + + +def _as_truncated(value): + """coerce the given value to :class:`._truncated_label`. + + Existing :class:`._truncated_label` and + :class:`._anonymous_label` objects are passed + unchanged. + """ + + if isinstance(value, _truncated_label): + return value + else: + return _truncated_label(value) + + +def _string_or_unprintable(element): + if isinstance(element, util.string_types): + return element + else: + try: + return str(element) + except Exception: + return "unprintable element %r" % element + + +def _expand_cloned(elements): + """expand the given set of ClauseElements to be the set of all 'cloned' + predecessors. + + """ + return itertools.chain(*[x._cloned_set for x in elements]) + + +def _select_iterables(elements): + """expand tables into individual columns in the + given list of column expressions. + + """ + return itertools.chain(*[c._select_iterable for c in elements]) + + +def _cloned_intersection(a, b): + """return the intersection of sets a and b, counting + any overlap between 'cloned' predecessors. + + The returned set is in terms of the entities present within 'a'. + + """ + all_overlap = set(_expand_cloned(a)).intersection(_expand_cloned(b)) + return set(elem for elem in a + if all_overlap.intersection(elem._cloned_set)) + + +def _cloned_difference(a, b): + all_overlap = set(_expand_cloned(a)).intersection(_expand_cloned(b)) + return set(elem for elem in a + if not all_overlap.intersection(elem._cloned_set)) + + +@util.dependencies("sqlalchemy.sql.functions") +def _labeled(functions, element): + if not hasattr(element, 'name') or \ + isinstance(element, functions.FunctionElement): + return element.label(None) + else: + return element + + +def _is_column(col): + """True if ``col`` is an instance of :class:`.ColumnElement`.""" + + return isinstance(col, ColumnElement) + + +def _find_columns(clause): + """locate Column objects within the given expression.""" + + cols = util.column_set() + traverse(clause, {}, {'column': cols.add}) + return cols + + +# there is some inconsistency here between the usage of +# inspect() vs. checking for Visitable and __clause_element__. +# Ideally all functions here would derive from inspect(), +# however the inspect() versions add significant callcount +# overhead for critical functions like _interpret_as_column_or_from(). +# Generally, the column-based functions are more performance critical +# and are fine just checking for __clause_element__(). It is only +# _interpret_as_from() where we'd like to be able to receive ORM entities +# that have no defined namespace, hence inspect() is needed there. + + +def _column_as_key(element): + if isinstance(element, util.string_types): + return element + if hasattr(element, '__clause_element__'): + element = element.__clause_element__() + try: + return element.key + except AttributeError: + return None + + +def _clause_element_as_expr(element): + if hasattr(element, '__clause_element__'): + return element.__clause_element__() + else: + return element + + +def _literal_as_label_reference(element): + if isinstance(element, util.string_types): + return _textual_label_reference(element) + + elif hasattr(element, '__clause_element__'): + element = element.__clause_element__() + + return _literal_as_text(element) + + +def _literal_and_labels_as_label_reference(element): + if isinstance(element, util.string_types): + return _textual_label_reference(element) + + elif hasattr(element, '__clause_element__'): + element = element.__clause_element__() + + if isinstance(element, ColumnElement) and \ + element._order_by_label_element is not None: + return _label_reference(element) + else: + return _literal_as_text(element) + + +def _expression_literal_as_text(element): + return _literal_as_text(element, warn=True) + + +def _literal_as_text(element, warn=False): + if isinstance(element, Visitable): + return element + elif hasattr(element, '__clause_element__'): + return element.__clause_element__() + elif isinstance(element, util.string_types): + if warn: + util.warn_limited( + "Textual SQL expression %(expr)r should be " + "explicitly declared as text(%(expr)r)", + {"expr": util.ellipses_string(element)}) + + return TextClause(util.text_type(element)) + elif isinstance(element, (util.NoneType, bool)): + return _const_expr(element) + else: + raise exc.ArgumentError( + "SQL expression object or string expected, got object of type %r " + "instead" % type(element) + ) + + +def _no_literals(element): + if hasattr(element, '__clause_element__'): + return element.__clause_element__() + elif not isinstance(element, Visitable): + raise exc.ArgumentError("Ambiguous literal: %r. Use the 'text()' " + "function to indicate a SQL expression " + "literal, or 'literal()' to indicate a " + "bound value." % element) + else: + return element + + +def _is_literal(element): + return not isinstance(element, Visitable) and \ + not hasattr(element, '__clause_element__') + + +def _only_column_elements_or_none(element, name): + if element is None: + return None + else: + return _only_column_elements(element, name) + + +def _only_column_elements(element, name): + if hasattr(element, '__clause_element__'): + element = element.__clause_element__() + if not isinstance(element, ColumnElement): + raise exc.ArgumentError( + "Column-based expression object expected for argument " + "'%s'; got: '%s', type %s" % (name, element, type(element))) + return element + + +def _literal_as_binds(element, name=None, type_=None): + if hasattr(element, '__clause_element__'): + return element.__clause_element__() + elif not isinstance(element, Visitable): + if element is None: + return Null() + else: + return BindParameter(name, element, type_=type_, unique=True) + else: + return element + +_guess_straight_column = re.compile(r'^\w\S*$', re.I) + + +def _interpret_as_column_or_from(element): + if isinstance(element, Visitable): + return element + elif hasattr(element, '__clause_element__'): + return element.__clause_element__() + + insp = inspection.inspect(element, raiseerr=False) + if insp is None: + if isinstance(element, (util.NoneType, bool)): + return _const_expr(element) + elif hasattr(insp, "selectable"): + return insp.selectable + + # be forgiving as this is an extremely common + # and known expression + if element == "*": + guess_is_literal = True + elif isinstance(element, (numbers.Number)): + return ColumnClause(str(element), is_literal=True) + else: + element = str(element) + # give into temptation, as this fact we are guessing about + # is not one we've previously ever needed our users tell us; + # but let them know we are not happy about it + guess_is_literal = not _guess_straight_column.match(element) + util.warn_limited( + "Textual column expression %(column)r should be " + "explicitly declared with text(%(column)r), " + "or use %(literal_column)s(%(column)r) " + "for more specificity", + { + "column": util.ellipses_string(element), + "literal_column": "literal_column" + if guess_is_literal else "column" + }) + return ColumnClause( + element, + is_literal=guess_is_literal) + + +def _const_expr(element): + if isinstance(element, (Null, False_, True_)): + return element + elif element is None: + return Null() + elif element is False: + return False_() + elif element is True: + return True_() + else: + raise exc.ArgumentError( + "Expected None, False, or True" + ) + + +def _type_from_args(args): + for a in args: + if not a.type._isnull: + return a.type + else: + return type_api.NULLTYPE + + +def _corresponding_column_or_error(fromclause, column, + require_embedded=False): + c = fromclause.corresponding_column(column, + require_embedded=require_embedded) + if c is None: + raise exc.InvalidRequestError( + "Given column '%s', attached to table '%s', " + "failed to locate a corresponding column from table '%s'" + % + (column, + getattr(column, 'table', None), + fromclause.description) + ) + return c + + +class AnnotatedColumnElement(Annotated): + def __init__(self, element, values): + Annotated.__init__(self, element, values) + ColumnElement.comparator._reset(self) + for attr in ('name', 'key', 'table'): + if self.__dict__.get(attr, False) is None: + self.__dict__.pop(attr) + + def _with_annotations(self, values): + clone = super(AnnotatedColumnElement, self)._with_annotations(values) + ColumnElement.comparator._reset(clone) + return clone + + @util.memoized_property + def name(self): + """pull 'name' from parent, if not present""" + return self._Annotated__element.name + + @util.memoized_property + def table(self): + """pull 'table' from parent, if not present""" + return self._Annotated__element.table + + @util.memoized_property + def key(self): + """pull 'key' from parent, if not present""" + return self._Annotated__element.key + + @util.memoized_property + def info(self): + return self._Annotated__element.info + + @util.memoized_property + def anon_label(self): + return self._Annotated__element.anon_label diff --git a/app/lib/sqlalchemy/sql/expression.py b/app/lib/sqlalchemy/sql/expression.py new file mode 100644 index 0000000..172bf4b --- /dev/null +++ b/app/lib/sqlalchemy/sql/expression.py @@ -0,0 +1,144 @@ +# sql/expression.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Defines the public namespace for SQL expression constructs. + +Prior to version 0.9, this module contained all of "elements", "dml", +"default_comparator" and "selectable". The module was broken up +and most "factory" functions were moved to be grouped with their associated +class. + +""" + +__all__ = [ + 'Alias', 'any_', 'all_', 'ClauseElement', 'ColumnCollection', 'ColumnElement', + 'CompoundSelect', 'Delete', 'FromClause', 'Insert', 'Join', 'Lateral', + 'Select', + 'Selectable', 'TableClause', 'Update', 'alias', 'and_', 'asc', 'between', + 'bindparam', 'case', 'cast', 'column', 'delete', 'desc', 'distinct', + 'except_', 'except_all', 'exists', 'extract', 'func', 'modifier', + 'collate', 'insert', 'intersect', 'intersect_all', 'join', 'label', + 'lateral', 'literal', 'literal_column', 'not_', 'null', 'nullsfirst', + 'nullslast', + 'or_', 'outparam', 'outerjoin', 'over', 'select', 'subquery', + 'table', 'text', + 'tuple_', 'type_coerce', 'union', 'union_all', 'update', 'within_group', + 'TableSample', 'tablesample'] + + +from .visitors import Visitable +from .functions import func, modifier, FunctionElement, Function +from ..util.langhelpers import public_factory +from .elements import ClauseElement, ColumnElement,\ + BindParameter, CollectionAggregate, UnaryExpression, BooleanClauseList, \ + Label, Cast, Case, ColumnClause, TextClause, Over, Null, \ + True_, False_, BinaryExpression, Tuple, TypeClause, Extract, \ + Grouping, WithinGroup, not_, \ + collate, literal_column, between,\ + literal, outparam, TypeCoerce, ClauseList, FunctionFilter + +from .elements import SavepointClause, RollbackToSavepointClause, \ + ReleaseSavepointClause + +from .base import ColumnCollection, Generative, Executable, \ + PARSE_AUTOCOMMIT + +from .selectable import Alias, Join, Select, Selectable, TableClause, \ + CompoundSelect, CTE, FromClause, FromGrouping, Lateral, SelectBase, \ + alias, GenerativeSelect, subquery, HasCTE, HasPrefixes, HasSuffixes, \ + lateral, Exists, ScalarSelect, TextAsFrom, TableSample, tablesample + + +from .dml import Insert, Update, Delete, UpdateBase, ValuesBase + +# factory functions - these pull class-bound constructors and classmethods +# from SQL elements and selectables into public functions. This allows +# the functions to be available in the sqlalchemy.sql.* namespace and +# to be auto-cross-documenting from the function to the class itself. + +all_ = public_factory(CollectionAggregate._create_all, ".expression.all_") +any_ = public_factory(CollectionAggregate._create_any, ".expression.any_") +and_ = public_factory(BooleanClauseList.and_, ".expression.and_") +or_ = public_factory(BooleanClauseList.or_, ".expression.or_") +bindparam = public_factory(BindParameter, ".expression.bindparam") +select = public_factory(Select, ".expression.select") +text = public_factory(TextClause._create_text, ".expression.text") +table = public_factory(TableClause, ".expression.table") +column = public_factory(ColumnClause, ".expression.column") +over = public_factory(Over, ".expression.over") +within_group = public_factory(WithinGroup, ".expression.within_group") +label = public_factory(Label, ".expression.label") +case = public_factory(Case, ".expression.case") +cast = public_factory(Cast, ".expression.cast") +extract = public_factory(Extract, ".expression.extract") +tuple_ = public_factory(Tuple, ".expression.tuple_") +except_ = public_factory(CompoundSelect._create_except, ".expression.except_") +except_all = public_factory( + CompoundSelect._create_except_all, ".expression.except_all") +intersect = public_factory( + CompoundSelect._create_intersect, ".expression.intersect") +intersect_all = public_factory( + CompoundSelect._create_intersect_all, ".expression.intersect_all") +union = public_factory(CompoundSelect._create_union, ".expression.union") +union_all = public_factory( + CompoundSelect._create_union_all, ".expression.union_all") +exists = public_factory(Exists, ".expression.exists") +nullsfirst = public_factory( + UnaryExpression._create_nullsfirst, ".expression.nullsfirst") +nullslast = public_factory( + UnaryExpression._create_nullslast, ".expression.nullslast") +asc = public_factory(UnaryExpression._create_asc, ".expression.asc") +desc = public_factory(UnaryExpression._create_desc, ".expression.desc") +distinct = public_factory( + UnaryExpression._create_distinct, ".expression.distinct") +type_coerce = public_factory(TypeCoerce, ".expression.type_coerce") +true = public_factory(True_._instance, ".expression.true") +false = public_factory(False_._instance, ".expression.false") +null = public_factory(Null._instance, ".expression.null") +join = public_factory(Join._create_join, ".expression.join") +outerjoin = public_factory(Join._create_outerjoin, ".expression.outerjoin") +insert = public_factory(Insert, ".expression.insert") +update = public_factory(Update, ".expression.update") +delete = public_factory(Delete, ".expression.delete") +funcfilter = public_factory( + FunctionFilter, ".expression.funcfilter") + + +# internal functions still being called from tests and the ORM, +# these might be better off in some other namespace +from .base import _from_objects +from .elements import _literal_as_text, _clause_element_as_expr,\ + _is_column, _labeled, _only_column_elements, _string_or_unprintable, \ + _truncated_label, _clone, _cloned_difference, _cloned_intersection,\ + _column_as_key, _literal_as_binds, _select_iterables, \ + _corresponding_column_or_error, _literal_as_label_reference, \ + _expression_literal_as_text +from .selectable import _interpret_as_from + + +# old names for compatibility +_Executable = Executable +_BindParamClause = BindParameter +_Label = Label +_SelectBase = SelectBase +_BinaryExpression = BinaryExpression +_Cast = Cast +_Null = Null +_False = False_ +_True = True_ +_TextClause = TextClause +_UnaryExpression = UnaryExpression +_Case = Case +_Tuple = Tuple +_Over = Over +_Generative = Generative +_TypeClause = TypeClause +_Extract = Extract +_Exists = Exists +_Grouping = Grouping +_FromGrouping = FromGrouping +_ScalarSelect = ScalarSelect diff --git a/app/lib/sqlalchemy/sql/functions.py b/app/lib/sqlalchemy/sql/functions.py new file mode 100644 index 0000000..08f1d32 --- /dev/null +++ b/app/lib/sqlalchemy/sql/functions.py @@ -0,0 +1,813 @@ +# sql/functions.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""SQL function API, factories, and built-in functions. + +""" +from . import sqltypes, schema +from .base import Executable, ColumnCollection +from .elements import ClauseList, Cast, Extract, _literal_as_binds, \ + literal_column, _type_from_args, ColumnElement, _clone,\ + Over, BindParameter, FunctionFilter, Grouping, WithinGroup +from .selectable import FromClause, Select, Alias +from . import util as sqlutil +from . import operators +from .visitors import VisitableType +from .. import util +from . import annotation + +_registry = util.defaultdict(dict) + + +def register_function(identifier, fn, package="_default"): + """Associate a callable with a particular func. name. + + This is normally called by _GenericMeta, but is also + available by itself so that a non-Function construct + can be associated with the :data:`.func` accessor (i.e. + CAST, EXTRACT). + + """ + reg = _registry[package] + reg[identifier] = fn + + +class FunctionElement(Executable, ColumnElement, FromClause): + """Base for SQL function-oriented constructs. + + .. seealso:: + + :class:`.Function` - named SQL function. + + :data:`.func` - namespace which produces registered or ad-hoc + :class:`.Function` instances. + + :class:`.GenericFunction` - allows creation of registered function + types. + + """ + + packagenames = () + + def __init__(self, *clauses, **kwargs): + """Construct a :class:`.FunctionElement`. + """ + args = [_literal_as_binds(c, self.name) for c in clauses] + self.clause_expr = ClauseList( + operator=operators.comma_op, + group_contents=True, *args).\ + self_group() + + def _execute_on_connection(self, connection, multiparams, params): + return connection._execute_function(self, multiparams, params) + + @property + def columns(self): + """The set of columns exported by this :class:`.FunctionElement`. + + Function objects currently have no result column names built in; + this method returns a single-element column collection with + an anonymously named column. + + An interim approach to providing named columns for a function + as a FROM clause is to build a :func:`.select` with the + desired columns:: + + from sqlalchemy.sql import column + + stmt = select([column('x'), column('y')]).\ + select_from(func.myfunction()) + + + """ + return ColumnCollection(self.label(None)) + + @util.memoized_property + def clauses(self): + """Return the underlying :class:`.ClauseList` which contains + the arguments for this :class:`.FunctionElement`. + + """ + return self.clause_expr.element + + def over(self, partition_by=None, order_by=None, rows=None, range_=None): + """Produce an OVER clause against this function. + + Used against aggregate or so-called "window" functions, + for database backends that support window functions. + + The expression:: + + func.row_number().over(order_by='x') + + is shorthand for:: + + from sqlalchemy import over + over(func.row_number(), order_by='x') + + See :func:`~.expression.over` for a full description. + + .. versionadded:: 0.7 + + """ + return Over( + self, + partition_by=partition_by, + order_by=order_by, + rows=rows, + range_=range_ + ) + + def within_group(self, *order_by): + """Produce a WITHIN GROUP (ORDER BY expr) clause against this function. + + Used against so-called "ordered set aggregate" and "hypothetical + set aggregate" functions, including :class:`.percentile_cont`, + :class:`.rank`, :class:`.dense_rank`, etc. + + See :func:`~.expression.within_group` for a full description. + + .. versionadded:: 1.1 + + + """ + return WithinGroup(self, *order_by) + + def filter(self, *criterion): + """Produce a FILTER clause against this function. + + Used against aggregate and window functions, + for database backends that support the "FILTER" clause. + + The expression:: + + func.count(1).filter(True) + + is shorthand for:: + + from sqlalchemy import funcfilter + funcfilter(func.count(1), True) + + .. versionadded:: 1.0.0 + + .. seealso:: + + :class:`.FunctionFilter` + + :func:`.funcfilter` + + + """ + if not criterion: + return self + return FunctionFilter(self, *criterion) + + @property + def _from_objects(self): + return self.clauses._from_objects + + def get_children(self, **kwargs): + return self.clause_expr, + + def _copy_internals(self, clone=_clone, **kw): + self.clause_expr = clone(self.clause_expr, **kw) + self._reset_exported() + FunctionElement.clauses._reset(self) + + def within_group_type(self, within_group): + """For types that define their return type as based on the criteria + within a WITHIN GROUP (ORDER BY) expression, called by the + :class:`.WithinGroup` construct. + + Returns None by default, in which case the function's normal ``.type`` + is used. + + """ + + return None + + def alias(self, name=None, flat=False): + r"""Produce a :class:`.Alias` construct against this + :class:`.FunctionElement`. + + This construct wraps the function in a named alias which + is suitable for the FROM clause, in the style accepted for example + by PostgreSQL. + + e.g.:: + + from sqlalchemy.sql import column + + stmt = select([column('data_view')]).\ + select_from(SomeTable).\ + select_from(func.unnest(SomeTable.data).alias('data_view') + ) + + Would produce: + + .. sourcecode:: sql + + SELECT data_view + FROM sometable, unnest(sometable.data) AS data_view + + .. versionadded:: 0.9.8 The :meth:`.FunctionElement.alias` method + is now supported. Previously, this method's behavior was + undefined and did not behave consistently across versions. + + """ + + return Alias(self, name) + + def select(self): + """Produce a :func:`~.expression.select` construct + against this :class:`.FunctionElement`. + + This is shorthand for:: + + s = select([function_element]) + + """ + s = Select([self]) + if self._execution_options: + s = s.execution_options(**self._execution_options) + return s + + def scalar(self): + """Execute this :class:`.FunctionElement` against an embedded + 'bind' and return a scalar value. + + This first calls :meth:`~.FunctionElement.select` to + produce a SELECT construct. + + Note that :class:`.FunctionElement` can be passed to + the :meth:`.Connectable.scalar` method of :class:`.Connection` + or :class:`.Engine`. + + """ + return self.select().execute().scalar() + + def execute(self): + """Execute this :class:`.FunctionElement` against an embedded + 'bind'. + + This first calls :meth:`~.FunctionElement.select` to + produce a SELECT construct. + + Note that :class:`.FunctionElement` can be passed to + the :meth:`.Connectable.execute` method of :class:`.Connection` + or :class:`.Engine`. + + """ + return self.select().execute() + + def _bind_param(self, operator, obj, type_=None): + return BindParameter(None, obj, _compared_to_operator=operator, + _compared_to_type=self.type, unique=True, + type_=type_) + + def self_group(self, against=None): + # for the moment, we are parenthesizing all array-returning + # expressions against getitem. This may need to be made + # more portable if in the future we support other DBs + # besides postgresql. + if against is operators.getitem and \ + isinstance(self.type, sqltypes.ARRAY): + return Grouping(self) + else: + return super(FunctionElement, self).self_group(against=against) + + +class _FunctionGenerator(object): + """Generate :class:`.Function` objects based on getattr calls.""" + + def __init__(self, **opts): + self.__names = [] + self.opts = opts + + def __getattr__(self, name): + # passthru __ attributes; fixes pydoc + if name.startswith('__'): + try: + return self.__dict__[name] + except KeyError: + raise AttributeError(name) + + elif name.endswith('_'): + name = name[0:-1] + f = _FunctionGenerator(**self.opts) + f.__names = list(self.__names) + [name] + return f + + def __call__(self, *c, **kwargs): + o = self.opts.copy() + o.update(kwargs) + + tokens = len(self.__names) + + if tokens == 2: + package, fname = self.__names + elif tokens == 1: + package, fname = "_default", self.__names[0] + else: + package = None + + if package is not None: + func = _registry[package].get(fname) + if func is not None: + return func(*c, **o) + + return Function(self.__names[-1], + packagenames=self.__names[0:-1], *c, **o) + + +func = _FunctionGenerator() +"""Generate SQL function expressions. + + :data:`.func` is a special object instance which generates SQL + functions based on name-based attributes, e.g.:: + + >>> print(func.count(1)) + count(:param_1) + + The element is a column-oriented SQL element like any other, and is + used in that way:: + + >>> print(select([func.count(table.c.id)])) + SELECT count(sometable.id) FROM sometable + + Any name can be given to :data:`.func`. If the function name is unknown to + SQLAlchemy, it will be rendered exactly as is. For common SQL functions + which SQLAlchemy is aware of, the name may be interpreted as a *generic + function* which will be compiled appropriately to the target database:: + + >>> print(func.current_timestamp()) + CURRENT_TIMESTAMP + + To call functions which are present in dot-separated packages, + specify them in the same manner:: + + >>> print(func.stats.yield_curve(5, 10)) + stats.yield_curve(:yield_curve_1, :yield_curve_2) + + SQLAlchemy can be made aware of the return type of functions to enable + type-specific lexical and result-based behavior. For example, to ensure + that a string-based function returns a Unicode value and is similarly + treated as a string in expressions, specify + :class:`~sqlalchemy.types.Unicode` as the type: + + >>> print(func.my_string(u'hi', type_=Unicode) + ' ' + + ... func.my_string(u'there', type_=Unicode)) + my_string(:my_string_1) || :my_string_2 || my_string(:my_string_3) + + The object returned by a :data:`.func` call is usually an instance of + :class:`.Function`. + This object meets the "column" interface, including comparison and labeling + functions. The object can also be passed the :meth:`~.Connectable.execute` + method of a :class:`.Connection` or :class:`.Engine`, where it will be + wrapped inside of a SELECT statement first:: + + print(connection.execute(func.current_timestamp()).scalar()) + + In a few exception cases, the :data:`.func` accessor + will redirect a name to a built-in expression such as :func:`.cast` + or :func:`.extract`, as these names have well-known meaning + but are not exactly the same as "functions" from a SQLAlchemy + perspective. + + .. versionadded:: 0.8 :data:`.func` can return non-function expression + constructs for common quasi-functional names like :func:`.cast` + and :func:`.extract`. + + Functions which are interpreted as "generic" functions know how to + calculate their return type automatically. For a listing of known generic + functions, see :ref:`generic_functions`. + + .. note:: + + The :data:`.func` construct has only limited support for calling + standalone "stored procedures", especially those with special + parameterization concerns. + + See the section :ref:`stored_procedures` for details on how to use + the DBAPI-level ``callproc()`` method for fully traditional stored + procedures. + +""" + +modifier = _FunctionGenerator(group=False) + + +class Function(FunctionElement): + """Describe a named SQL function. + + See the superclass :class:`.FunctionElement` for a description + of public methods. + + .. seealso:: + + :data:`.func` - namespace which produces registered or ad-hoc + :class:`.Function` instances. + + :class:`.GenericFunction` - allows creation of registered function + types. + + """ + + __visit_name__ = 'function' + + def __init__(self, name, *clauses, **kw): + """Construct a :class:`.Function`. + + The :data:`.func` construct is normally used to construct + new :class:`.Function` instances. + + """ + self.packagenames = kw.pop('packagenames', None) or [] + self.name = name + self._bind = kw.get('bind', None) + self.type = sqltypes.to_instance(kw.get('type_', None)) + + FunctionElement.__init__(self, *clauses, **kw) + + def _bind_param(self, operator, obj, type_=None): + return BindParameter(self.name, obj, + _compared_to_operator=operator, + _compared_to_type=self.type, + type_=type_, + unique=True) + + +class _GenericMeta(VisitableType): + def __init__(cls, clsname, bases, clsdict): + if annotation.Annotated not in cls.__mro__: + cls.name = name = clsdict.get('name', clsname) + cls.identifier = identifier = clsdict.get('identifier', name) + package = clsdict.pop('package', '_default') + # legacy + if '__return_type__' in clsdict: + cls.type = clsdict['__return_type__'] + register_function(identifier, cls, package) + super(_GenericMeta, cls).__init__(clsname, bases, clsdict) + + +class GenericFunction(util.with_metaclass(_GenericMeta, Function)): + """Define a 'generic' function. + + A generic function is a pre-established :class:`.Function` + class that is instantiated automatically when called + by name from the :data:`.func` attribute. Note that + calling any name from :data:`.func` has the effect that + a new :class:`.Function` instance is created automatically, + given that name. The primary use case for defining + a :class:`.GenericFunction` class is so that a function + of a particular name may be given a fixed return type. + It can also include custom argument parsing schemes as well + as additional methods. + + Subclasses of :class:`.GenericFunction` are automatically + registered under the name of the class. For + example, a user-defined function ``as_utc()`` would + be available immediately:: + + from sqlalchemy.sql.functions import GenericFunction + from sqlalchemy.types import DateTime + + class as_utc(GenericFunction): + type = DateTime + + print select([func.as_utc()]) + + User-defined generic functions can be organized into + packages by specifying the "package" attribute when defining + :class:`.GenericFunction`. Third party libraries + containing many functions may want to use this in order + to avoid name conflicts with other systems. For example, + if our ``as_utc()`` function were part of a package + "time":: + + class as_utc(GenericFunction): + type = DateTime + package = "time" + + The above function would be available from :data:`.func` + using the package name ``time``:: + + print select([func.time.as_utc()]) + + A final option is to allow the function to be accessed + from one name in :data:`.func` but to render as a different name. + The ``identifier`` attribute will override the name used to + access the function as loaded from :data:`.func`, but will retain + the usage of ``name`` as the rendered name:: + + class GeoBuffer(GenericFunction): + type = Geometry + package = "geo" + name = "ST_Buffer" + identifier = "buffer" + + The above function will render as follows:: + + >>> print func.geo.buffer() + ST_Buffer() + + .. versionadded:: 0.8 :class:`.GenericFunction` now supports + automatic registration of new functions as well as package + and custom naming support. + + .. versionchanged:: 0.8 The attribute name ``type`` is used + to specify the function's return type at the class level. + Previously, the name ``__return_type__`` was used. This + name is still recognized for backwards-compatibility. + + """ + + coerce_arguments = True + + def __init__(self, *args, **kwargs): + parsed_args = kwargs.pop('_parsed_args', None) + if parsed_args is None: + parsed_args = [_literal_as_binds(c, self.name) for c in args] + self.packagenames = [] + self._bind = kwargs.get('bind', None) + self.clause_expr = ClauseList( + operator=operators.comma_op, + group_contents=True, *parsed_args).self_group() + self.type = sqltypes.to_instance( + kwargs.pop("type_", None) or getattr(self, 'type', None)) + +register_function("cast", Cast) +register_function("extract", Extract) + + +class next_value(GenericFunction): + """Represent the 'next value', given a :class:`.Sequence` + as its single argument. + + Compiles into the appropriate function on each backend, + or will raise NotImplementedError if used on a backend + that does not provide support for sequences. + + """ + type = sqltypes.Integer() + name = "next_value" + + def __init__(self, seq, **kw): + assert isinstance(seq, schema.Sequence), \ + "next_value() accepts a Sequence object as input." + self._bind = kw.get('bind', None) + self.sequence = seq + + @property + def _from_objects(self): + return [] + + +class AnsiFunction(GenericFunction): + def __init__(self, **kwargs): + GenericFunction.__init__(self, **kwargs) + + +class ReturnTypeFromArgs(GenericFunction): + """Define a function whose return type is the same as its arguments.""" + + def __init__(self, *args, **kwargs): + args = [_literal_as_binds(c, self.name) for c in args] + kwargs.setdefault('type_', _type_from_args(args)) + kwargs['_parsed_args'] = args + super(ReturnTypeFromArgs, self).__init__(*args, **kwargs) + + +class coalesce(ReturnTypeFromArgs): + pass + + +class max(ReturnTypeFromArgs): + pass + + +class min(ReturnTypeFromArgs): + pass + + +class sum(ReturnTypeFromArgs): + pass + + +class now(GenericFunction): + type = sqltypes.DateTime + + +class concat(GenericFunction): + type = sqltypes.String + + +class char_length(GenericFunction): + type = sqltypes.Integer + + def __init__(self, arg, **kwargs): + GenericFunction.__init__(self, arg, **kwargs) + + +class random(GenericFunction): + pass + + +class count(GenericFunction): + r"""The ANSI COUNT aggregate function. With no arguments, + emits COUNT \*. + + """ + type = sqltypes.Integer + + def __init__(self, expression=None, **kwargs): + if expression is None: + expression = literal_column('*') + super(count, self).__init__(expression, **kwargs) + + +class current_date(AnsiFunction): + type = sqltypes.Date + + +class current_time(AnsiFunction): + type = sqltypes.Time + + +class current_timestamp(AnsiFunction): + type = sqltypes.DateTime + + +class current_user(AnsiFunction): + type = sqltypes.String + + +class localtime(AnsiFunction): + type = sqltypes.DateTime + + +class localtimestamp(AnsiFunction): + type = sqltypes.DateTime + + +class session_user(AnsiFunction): + type = sqltypes.String + + +class sysdate(AnsiFunction): + type = sqltypes.DateTime + + +class user(AnsiFunction): + type = sqltypes.String + + +class array_agg(GenericFunction): + """support for the ARRAY_AGG function. + + The ``func.array_agg(expr)`` construct returns an expression of + type :class:`.types.ARRAY`. + + e.g.:: + + stmt = select([func.array_agg(table.c.values)[2:5]]) + + .. versionadded:: 1.1 + + .. seealso:: + + :func:`.postgresql.array_agg` - PostgreSQL-specific version that + returns :class:`.postgresql.ARRAY`, which has PG-specific operators added. + + """ + + type = sqltypes.ARRAY + + def __init__(self, *args, **kwargs): + args = [_literal_as_binds(c) for c in args] + kwargs.setdefault('type_', self.type(_type_from_args(args))) + kwargs['_parsed_args'] = args + super(array_agg, self).__init__(*args, **kwargs) + + +class OrderedSetAgg(GenericFunction): + """Define a function where the return type is based on the sort + expression type as defined by the expression passed to the + :meth:`.FunctionElement.within_group` method.""" + + array_for_multi_clause = False + + def within_group_type(self, within_group): + func_clauses = self.clause_expr.element + order_by = sqlutil.unwrap_order_by(within_group.order_by) + if self.array_for_multi_clause and len(func_clauses.clauses) > 1: + return sqltypes.ARRAY(order_by[0].type) + else: + return order_by[0].type + + +class mode(OrderedSetAgg): + """implement the ``mode`` ordered-set aggregate function. + + This function must be used with the :meth:`.FunctionElement.within_group` + modifier to supply a sort expression to operate upon. + + The return type of this function is the same as the sort expression. + + .. versionadded:: 1.1 + + """ + + +class percentile_cont(OrderedSetAgg): + """implement the ``percentile_cont`` ordered-set aggregate function. + + This function must be used with the :meth:`.FunctionElement.within_group` + modifier to supply a sort expression to operate upon. + + The return type of this function is the same as the sort expression, + or if the arguments are an array, an :class:`.types.ARRAY` of the sort + expression's type. + + .. versionadded:: 1.1 + + """ + + array_for_multi_clause = True + + +class percentile_disc(OrderedSetAgg): + """implement the ``percentile_disc`` ordered-set aggregate function. + + This function must be used with the :meth:`.FunctionElement.within_group` + modifier to supply a sort expression to operate upon. + + The return type of this function is the same as the sort expression, + or if the arguments are an array, an :class:`.types.ARRAY` of the sort + expression's type. + + .. versionadded:: 1.1 + + """ + + array_for_multi_clause = True + + +class rank(GenericFunction): + """Implement the ``rank`` hypothetical-set aggregate function. + + This function must be used with the :meth:`.FunctionElement.within_group` + modifier to supply a sort expression to operate upon. + + The return type of this function is :class:`.Integer`. + + .. versionadded:: 1.1 + + """ + type = sqltypes.Integer() + + +class dense_rank(GenericFunction): + """Implement the ``dense_rank`` hypothetical-set aggregate function. + + This function must be used with the :meth:`.FunctionElement.within_group` + modifier to supply a sort expression to operate upon. + + The return type of this function is :class:`.Integer`. + + .. versionadded:: 1.1 + + """ + type = sqltypes.Integer() + + +class percent_rank(GenericFunction): + """Implement the ``percent_rank`` hypothetical-set aggregate function. + + This function must be used with the :meth:`.FunctionElement.within_group` + modifier to supply a sort expression to operate upon. + + The return type of this function is :class:`.Numeric`. + + .. versionadded:: 1.1 + + """ + type = sqltypes.Numeric() + + +class cume_dist(GenericFunction): + """Implement the ``cume_dist`` hypothetical-set aggregate function. + + This function must be used with the :meth:`.FunctionElement.within_group` + modifier to supply a sort expression to operate upon. + + The return type of this function is :class:`.Numeric`. + + .. versionadded:: 1.1 + + """ + type = sqltypes.Numeric() diff --git a/app/lib/sqlalchemy/sql/naming.py b/app/lib/sqlalchemy/sql/naming.py new file mode 100644 index 0000000..d93c916 --- /dev/null +++ b/app/lib/sqlalchemy/sql/naming.py @@ -0,0 +1,146 @@ +# sqlalchemy/naming.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Establish constraint and index naming conventions. + + +""" + +from .schema import Constraint, ForeignKeyConstraint, PrimaryKeyConstraint, \ + UniqueConstraint, CheckConstraint, Index, Table, Column +from .. import event, events +from .. import exc +from .elements import _truncated_label, _defer_name, _defer_none_name, conv +import re + + +class ConventionDict(object): + + def __init__(self, const, table, convention): + self.const = const + self._is_fk = isinstance(const, ForeignKeyConstraint) + self.table = table + self.convention = convention + self._const_name = const.name + + def _key_table_name(self): + return self.table.name + + def _column_X(self, idx): + if self._is_fk: + fk = self.const.elements[idx] + return fk.parent + else: + return list(self.const.columns)[idx] + + def _key_constraint_name(self): + if isinstance(self._const_name, (type(None), _defer_none_name)): + raise exc.InvalidRequestError( + "Naming convention including " + "%(constraint_name)s token requires that " + "constraint is explicitly named." + ) + if not isinstance(self._const_name, conv): + self.const.name = None + return self._const_name + + def _key_column_X_name(self, idx): + return self._column_X(idx).name + + def _key_column_X_label(self, idx): + return self._column_X(idx)._label + + def _key_referred_table_name(self): + fk = self.const.elements[0] + refs = fk.target_fullname.split(".") + if len(refs) == 3: + refschema, reftable, refcol = refs + else: + reftable, refcol = refs + return reftable + + def _key_referred_column_X_name(self, idx): + fk = self.const.elements[idx] + refs = fk.target_fullname.split(".") + if len(refs) == 3: + refschema, reftable, refcol = refs + else: + reftable, refcol = refs + return refcol + + def __getitem__(self, key): + if key in self.convention: + return self.convention[key](self.const, self.table) + elif hasattr(self, '_key_%s' % key): + return getattr(self, '_key_%s' % key)() + else: + col_template = re.match(r".*_?column_(\d+)_.+", key) + if col_template: + idx = col_template.group(1) + attr = "_key_" + key.replace(idx, "X") + idx = int(idx) + if hasattr(self, attr): + return getattr(self, attr)(idx) + raise KeyError(key) + +_prefix_dict = { + Index: "ix", + PrimaryKeyConstraint: "pk", + CheckConstraint: "ck", + UniqueConstraint: "uq", + ForeignKeyConstraint: "fk" +} + + +def _get_convention(dict_, key): + + for super_ in key.__mro__: + if super_ in _prefix_dict and _prefix_dict[super_] in dict_: + return dict_[_prefix_dict[super_]] + elif super_ in dict_: + return dict_[super_] + else: + return None + + +def _constraint_name_for_table(const, table): + metadata = table.metadata + convention = _get_convention(metadata.naming_convention, type(const)) + + if isinstance(const.name, conv): + return const.name + elif convention is not None and \ + not isinstance(const.name, conv) and \ + ( + const.name is None or + "constraint_name" in convention or + isinstance(const.name, _defer_name)): + return conv( + convention % ConventionDict(const, table, + metadata.naming_convention) + ) + elif isinstance(convention, _defer_none_name): + return None + + +@event.listens_for(Constraint, "after_parent_attach") +@event.listens_for(Index, "after_parent_attach") +def _constraint_name(const, table): + if isinstance(table, Column): + # for column-attached constraint, set another event + # to link the column attached to the table as this constraint + # associated with the table. + event.listen(table, "after_parent_attach", + lambda col, table: _constraint_name(const, table) + ) + elif isinstance(table, Table): + if isinstance(const.name, (conv, _defer_name)): + return + + newname = _constraint_name_for_table(const, table) + if newname is not None: + const.name = newname diff --git a/app/lib/sqlalchemy/sql/operators.py b/app/lib/sqlalchemy/sql/operators.py new file mode 100644 index 0000000..d883392 --- /dev/null +++ b/app/lib/sqlalchemy/sql/operators.py @@ -0,0 +1,1014 @@ +# sql/operators.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Defines operators used in SQL expressions.""" + +from .. import util + +from operator import ( + and_, or_, inv, add, mul, sub, mod, truediv, lt, le, ne, gt, ge, eq, neg, + getitem, lshift, rshift, contains +) + +if util.py2k: + from operator import div +else: + div = truediv + + +class Operators(object): + """Base of comparison and logical operators. + + Implements base methods + :meth:`~sqlalchemy.sql.operators.Operators.operate` and + :meth:`~sqlalchemy.sql.operators.Operators.reverse_operate`, as well as + :meth:`~sqlalchemy.sql.operators.Operators.__and__`, + :meth:`~sqlalchemy.sql.operators.Operators.__or__`, + :meth:`~sqlalchemy.sql.operators.Operators.__invert__`. + + Usually is used via its most common subclass + :class:`.ColumnOperators`. + + """ + __slots__ = () + + def __and__(self, other): + """Implement the ``&`` operator. + + When used with SQL expressions, results in an + AND operation, equivalent to + :func:`~.expression.and_`, that is:: + + a & b + + is equivalent to:: + + from sqlalchemy import and_ + and_(a, b) + + Care should be taken when using ``&`` regarding + operator precedence; the ``&`` operator has the highest precedence. + The operands should be enclosed in parenthesis if they contain + further sub expressions:: + + (a == 2) & (b == 4) + + """ + return self.operate(and_, other) + + def __or__(self, other): + """Implement the ``|`` operator. + + When used with SQL expressions, results in an + OR operation, equivalent to + :func:`~.expression.or_`, that is:: + + a | b + + is equivalent to:: + + from sqlalchemy import or_ + or_(a, b) + + Care should be taken when using ``|`` regarding + operator precedence; the ``|`` operator has the highest precedence. + The operands should be enclosed in parenthesis if they contain + further sub expressions:: + + (a == 2) | (b == 4) + + """ + return self.operate(or_, other) + + def __invert__(self): + """Implement the ``~`` operator. + + When used with SQL expressions, results in a + NOT operation, equivalent to + :func:`~.expression.not_`, that is:: + + ~a + + is equivalent to:: + + from sqlalchemy import not_ + not_(a) + + """ + return self.operate(inv) + + def op(self, opstring, precedence=0, is_comparison=False): + """produce a generic operator function. + + e.g.:: + + somecolumn.op("*")(5) + + produces:: + + somecolumn * 5 + + This function can also be used to make bitwise operators explicit. For + example:: + + somecolumn.op('&')(0xff) + + is a bitwise AND of the value in ``somecolumn``. + + :param operator: a string which will be output as the infix operator + between this element and the expression passed to the + generated function. + + :param precedence: precedence to apply to the operator, when + parenthesizing expressions. A lower number will cause the expression + to be parenthesized when applied against another operator with + higher precedence. The default value of ``0`` is lower than all + operators except for the comma (``,``) and ``AS`` operators. + A value of 100 will be higher or equal to all operators, and -100 + will be lower than or equal to all operators. + + .. versionadded:: 0.8 - added the 'precedence' argument. + + :param is_comparison: if True, the operator will be considered as a + "comparison" operator, that is which evaluates to a boolean + true/false value, like ``==``, ``>``, etc. This flag should be set + so that ORM relationships can establish that the operator is a + comparison operator when used in a custom join condition. + + .. versionadded:: 0.9.2 - added the + :paramref:`.Operators.op.is_comparison` flag. + + .. seealso:: + + :ref:`types_operators` + + :ref:`relationship_custom_operator` + + """ + operator = custom_op(opstring, precedence, is_comparison) + + def against(other): + return operator(self, other) + return against + + def operate(self, op, *other, **kwargs): + r"""Operate on an argument. + + This is the lowest level of operation, raises + :class:`NotImplementedError` by default. + + Overriding this on a subclass can allow common + behavior to be applied to all operations. + For example, overriding :class:`.ColumnOperators` + to apply ``func.lower()`` to the left and right + side:: + + class MyComparator(ColumnOperators): + def operate(self, op, other): + return op(func.lower(self), func.lower(other)) + + :param op: Operator callable. + :param \*other: the 'other' side of the operation. Will + be a single scalar for most operations. + :param \**kwargs: modifiers. These may be passed by special + operators such as :meth:`ColumnOperators.contains`. + + + """ + raise NotImplementedError(str(op)) + + def reverse_operate(self, op, other, **kwargs): + """Reverse operate on an argument. + + Usage is the same as :meth:`operate`. + + """ + raise NotImplementedError(str(op)) + + +class custom_op(object): + """Represent a 'custom' operator. + + :class:`.custom_op` is normally instantitated when the + :meth:`.ColumnOperators.op` method is used to create a + custom operator callable. The class can also be used directly + when programmatically constructing expressions. E.g. + to represent the "factorial" operation:: + + from sqlalchemy.sql import UnaryExpression + from sqlalchemy.sql import operators + from sqlalchemy import Numeric + + unary = UnaryExpression(table.c.somecolumn, + modifier=operators.custom_op("!"), + type_=Numeric) + + """ + __name__ = 'custom_op' + + def __init__( + self, opstring, precedence=0, is_comparison=False, + natural_self_precedent=False, eager_grouping=False): + self.opstring = opstring + self.precedence = precedence + self.is_comparison = is_comparison + self.natural_self_precedent = natural_self_precedent + self.eager_grouping = eager_grouping + + def __eq__(self, other): + return isinstance(other, custom_op) and \ + other.opstring == self.opstring + + def __hash__(self): + return id(self) + + def __call__(self, left, right, **kw): + return left.operate(self, right, **kw) + + +class ColumnOperators(Operators): + """Defines boolean, comparison, and other operators for + :class:`.ColumnElement` expressions. + + By default, all methods call down to + :meth:`.operate` or :meth:`.reverse_operate`, + passing in the appropriate operator function from the + Python builtin ``operator`` module or + a SQLAlchemy-specific operator function from + :mod:`sqlalchemy.expression.operators`. For example + the ``__eq__`` function:: + + def __eq__(self, other): + return self.operate(operators.eq, other) + + Where ``operators.eq`` is essentially:: + + def eq(a, b): + return a == b + + The core column expression unit :class:`.ColumnElement` + overrides :meth:`.Operators.operate` and others + to return further :class:`.ColumnElement` constructs, + so that the ``==`` operation above is replaced by a clause + construct. + + See also: + + :ref:`types_operators` + + :attr:`.TypeEngine.comparator_factory` + + :class:`.ColumnOperators` + + :class:`.PropComparator` + + """ + + __slots__ = () + + timetuple = None + """Hack, allows datetime objects to be compared on the LHS.""" + + def __lt__(self, other): + """Implement the ``<`` operator. + + In a column context, produces the clause ``a < b``. + + """ + return self.operate(lt, other) + + def __le__(self, other): + """Implement the ``<=`` operator. + + In a column context, produces the clause ``a <= b``. + + """ + return self.operate(le, other) + + __hash__ = Operators.__hash__ + + def __eq__(self, other): + """Implement the ``==`` operator. + + In a column context, produces the clause ``a = b``. + If the target is ``None``, produces ``a IS NULL``. + + """ + return self.operate(eq, other) + + def __ne__(self, other): + """Implement the ``!=`` operator. + + In a column context, produces the clause ``a != b``. + If the target is ``None``, produces ``a IS NOT NULL``. + + """ + return self.operate(ne, other) + + def is_distinct_from(self, other): + """Implement the ``IS DISTINCT FROM`` operator. + + Renders "a IS DISTINCT FROM b" on most platforms; + on some such as SQLite may render "a IS NOT b". + + .. versionadded:: 1.1 + + """ + return self.operate(is_distinct_from, other) + + def isnot_distinct_from(self, other): + """Implement the ``IS NOT DISTINCT FROM`` operator. + + Renders "a IS NOT DISTINCT FROM b" on most platforms; + on some such as SQLite may render "a IS b". + + .. versionadded:: 1.1 + + """ + return self.operate(isnot_distinct_from, other) + + def __gt__(self, other): + """Implement the ``>`` operator. + + In a column context, produces the clause ``a > b``. + + """ + return self.operate(gt, other) + + def __ge__(self, other): + """Implement the ``>=`` operator. + + In a column context, produces the clause ``a >= b``. + + """ + return self.operate(ge, other) + + def __neg__(self): + """Implement the ``-`` operator. + + In a column context, produces the clause ``-a``. + + """ + return self.operate(neg) + + def __contains__(self, other): + return self.operate(contains, other) + + def __getitem__(self, index): + """Implement the [] operator. + + This can be used by some database-specific types + such as PostgreSQL ARRAY and HSTORE. + + """ + return self.operate(getitem, index) + + def __lshift__(self, other): + """implement the << operator. + + Not used by SQLAlchemy core, this is provided + for custom operator systems which want to use + << as an extension point. + """ + return self.operate(lshift, other) + + def __rshift__(self, other): + """implement the >> operator. + + Not used by SQLAlchemy core, this is provided + for custom operator systems which want to use + >> as an extension point. + """ + return self.operate(rshift, other) + + def concat(self, other): + """Implement the 'concat' operator. + + In a column context, produces the clause ``a || b``, + or uses the ``concat()`` operator on MySQL. + + """ + return self.operate(concat_op, other) + + def like(self, other, escape=None): + r"""Implement the ``like`` operator. + + In a column context, produces the expression:: + + a LIKE other + + E.g.:: + + stmt = select([sometable]).\ + where(sometable.c.column.like("%foobar%")) + + :param other: expression to be compared + :param escape: optional escape character, renders the ``ESCAPE`` + keyword, e.g.:: + + somecolumn.like("foo/%bar", escape="/") + + .. seealso:: + + :meth:`.ColumnOperators.ilike` + + """ + return self.operate(like_op, other, escape=escape) + + def ilike(self, other, escape=None): + r"""Implement the ``ilike`` operator, e.g. case insensitive LIKE. + + In a column context, produces an expression either of the form:: + + lower(a) LIKE lower(other) + + Or on backends that support the ILIKE operator:: + + a ILIKE other + + E.g.:: + + stmt = select([sometable]).\ + where(sometable.c.column.ilike("%foobar%")) + + :param other: expression to be compared + :param escape: optional escape character, renders the ``ESCAPE`` + keyword, e.g.:: + + somecolumn.ilike("foo/%bar", escape="/") + + .. seealso:: + + :meth:`.ColumnOperators.like` + + """ + return self.operate(ilike_op, other, escape=escape) + + def in_(self, other): + """Implement the ``in`` operator. + + In a column context, produces the clause ``a IN other``. + "other" may be a tuple/list of column expressions, + or a :func:`~.expression.select` construct. + + """ + return self.operate(in_op, other) + + def notin_(self, other): + """implement the ``NOT IN`` operator. + + This is equivalent to using negation with + :meth:`.ColumnOperators.in_`, i.e. ``~x.in_(y)``. + + .. versionadded:: 0.8 + + .. seealso:: + + :meth:`.ColumnOperators.in_` + + """ + return self.operate(notin_op, other) + + def notlike(self, other, escape=None): + """implement the ``NOT LIKE`` operator. + + This is equivalent to using negation with + :meth:`.ColumnOperators.like`, i.e. ``~x.like(y)``. + + .. versionadded:: 0.8 + + .. seealso:: + + :meth:`.ColumnOperators.like` + + """ + return self.operate(notlike_op, other, escape=escape) + + def notilike(self, other, escape=None): + """implement the ``NOT ILIKE`` operator. + + This is equivalent to using negation with + :meth:`.ColumnOperators.ilike`, i.e. ``~x.ilike(y)``. + + .. versionadded:: 0.8 + + .. seealso:: + + :meth:`.ColumnOperators.ilike` + + """ + return self.operate(notilike_op, other, escape=escape) + + def is_(self, other): + """Implement the ``IS`` operator. + + Normally, ``IS`` is generated automatically when comparing to a + value of ``None``, which resolves to ``NULL``. However, explicit + usage of ``IS`` may be desirable if comparing to boolean values + on certain platforms. + + .. versionadded:: 0.7.9 + + .. seealso:: :meth:`.ColumnOperators.isnot` + + """ + return self.operate(is_, other) + + def isnot(self, other): + """Implement the ``IS NOT`` operator. + + Normally, ``IS NOT`` is generated automatically when comparing to a + value of ``None``, which resolves to ``NULL``. However, explicit + usage of ``IS NOT`` may be desirable if comparing to boolean values + on certain platforms. + + .. versionadded:: 0.7.9 + + .. seealso:: :meth:`.ColumnOperators.is_` + + """ + return self.operate(isnot, other) + + def startswith(self, other, **kwargs): + """Implement the ``startwith`` operator. + + In a column context, produces the clause ``LIKE '%'`` + + """ + return self.operate(startswith_op, other, **kwargs) + + def endswith(self, other, **kwargs): + """Implement the 'endswith' operator. + + In a column context, produces the clause ``LIKE '%'`` + + """ + return self.operate(endswith_op, other, **kwargs) + + def contains(self, other, **kwargs): + """Implement the 'contains' operator. + + In a column context, produces the clause ``LIKE '%%'`` + + """ + return self.operate(contains_op, other, **kwargs) + + def match(self, other, **kwargs): + """Implements a database-specific 'match' operator. + + :meth:`~.ColumnOperators.match` attempts to resolve to + a MATCH-like function or operator provided by the backend. + Examples include: + + * PostgreSQL - renders ``x @@ to_tsquery(y)`` + * MySQL - renders ``MATCH (x) AGAINST (y IN BOOLEAN MODE)`` + * Oracle - renders ``CONTAINS(x, y)`` + * other backends may provide special implementations. + * Backends without any special implementation will emit + the operator as "MATCH". This is compatible with SQlite, for + example. + + """ + return self.operate(match_op, other, **kwargs) + + def desc(self): + """Produce a :func:`~.expression.desc` clause against the + parent object.""" + return self.operate(desc_op) + + def asc(self): + """Produce a :func:`~.expression.asc` clause against the + parent object.""" + return self.operate(asc_op) + + def nullsfirst(self): + """Produce a :func:`~.expression.nullsfirst` clause against the + parent object.""" + return self.operate(nullsfirst_op) + + def nullslast(self): + """Produce a :func:`~.expression.nullslast` clause against the + parent object.""" + return self.operate(nullslast_op) + + def collate(self, collation): + """Produce a :func:`~.expression.collate` clause against + the parent object, given the collation string.""" + return self.operate(collate, collation) + + def __radd__(self, other): + """Implement the ``+`` operator in reverse. + + See :meth:`.ColumnOperators.__add__`. + + """ + return self.reverse_operate(add, other) + + def __rsub__(self, other): + """Implement the ``-`` operator in reverse. + + See :meth:`.ColumnOperators.__sub__`. + + """ + return self.reverse_operate(sub, other) + + def __rmul__(self, other): + """Implement the ``*`` operator in reverse. + + See :meth:`.ColumnOperators.__mul__`. + + """ + return self.reverse_operate(mul, other) + + def __rdiv__(self, other): + """Implement the ``/`` operator in reverse. + + See :meth:`.ColumnOperators.__div__`. + + """ + return self.reverse_operate(div, other) + + def __rmod__(self, other): + """Implement the ``%`` operator in reverse. + + See :meth:`.ColumnOperators.__mod__`. + + """ + return self.reverse_operate(mod, other) + + def between(self, cleft, cright, symmetric=False): + """Produce a :func:`~.expression.between` clause against + the parent object, given the lower and upper range. + + """ + return self.operate(between_op, cleft, cright, symmetric=symmetric) + + def distinct(self): + """Produce a :func:`~.expression.distinct` clause against the + parent object. + + """ + return self.operate(distinct_op) + + def any_(self): + """Produce a :func:`~.expression.any_` clause against the + parent object. + + .. versionadded:: 1.1 + + """ + return self.operate(any_op) + + def all_(self): + """Produce a :func:`~.expression.all_` clause against the + parent object. + + .. versionadded:: 1.1 + + """ + return self.operate(all_op) + + def __add__(self, other): + """Implement the ``+`` operator. + + In a column context, produces the clause ``a + b`` + if the parent object has non-string affinity. + If the parent object has a string affinity, + produces the concatenation operator, ``a || b`` - + see :meth:`.ColumnOperators.concat`. + + """ + return self.operate(add, other) + + def __sub__(self, other): + """Implement the ``-`` operator. + + In a column context, produces the clause ``a - b``. + + """ + return self.operate(sub, other) + + def __mul__(self, other): + """Implement the ``*`` operator. + + In a column context, produces the clause ``a * b``. + + """ + return self.operate(mul, other) + + def __div__(self, other): + """Implement the ``/`` operator. + + In a column context, produces the clause ``a / b``. + + """ + return self.operate(div, other) + + def __mod__(self, other): + """Implement the ``%`` operator. + + In a column context, produces the clause ``a % b``. + + """ + return self.operate(mod, other) + + def __truediv__(self, other): + """Implement the ``//`` operator. + + In a column context, produces the clause ``a / b``. + + """ + return self.operate(truediv, other) + + def __rtruediv__(self, other): + """Implement the ``//`` operator in reverse. + + See :meth:`.ColumnOperators.__truediv__`. + + """ + return self.reverse_operate(truediv, other) + + +def from_(): + raise NotImplementedError() + + +def as_(): + raise NotImplementedError() + + +def exists(): + raise NotImplementedError() + + +def istrue(a): + raise NotImplementedError() + + +def isfalse(a): + raise NotImplementedError() + + +def is_distinct_from(a, b): + return a.is_distinct_from(b) + + +def isnot_distinct_from(a, b): + return a.isnot_distinct_from(b) + + +def is_(a, b): + return a.is_(b) + + +def isnot(a, b): + return a.isnot(b) + + +def collate(a, b): + return a.collate(b) + + +def op(a, opstring, b): + return a.op(opstring)(b) + + +def like_op(a, b, escape=None): + return a.like(b, escape=escape) + + +def notlike_op(a, b, escape=None): + return a.notlike(b, escape=escape) + + +def ilike_op(a, b, escape=None): + return a.ilike(b, escape=escape) + + +def notilike_op(a, b, escape=None): + return a.notilike(b, escape=escape) + + +def between_op(a, b, c, symmetric=False): + return a.between(b, c, symmetric=symmetric) + + +def notbetween_op(a, b, c, symmetric=False): + return a.notbetween(b, c, symmetric=symmetric) + + +def in_op(a, b): + return a.in_(b) + + +def notin_op(a, b): + return a.notin_(b) + + +def distinct_op(a): + return a.distinct() + + +def any_op(a): + return a.any_() + + +def all_op(a): + return a.all_() + + +def startswith_op(a, b, escape=None): + return a.startswith(b, escape=escape) + + +def notstartswith_op(a, b, escape=None): + return ~a.startswith(b, escape=escape) + + +def endswith_op(a, b, escape=None): + return a.endswith(b, escape=escape) + + +def notendswith_op(a, b, escape=None): + return ~a.endswith(b, escape=escape) + + +def contains_op(a, b, escape=None): + return a.contains(b, escape=escape) + + +def notcontains_op(a, b, escape=None): + return ~a.contains(b, escape=escape) + + +def match_op(a, b, **kw): + return a.match(b, **kw) + + +def notmatch_op(a, b, **kw): + return a.notmatch(b, **kw) + + +def comma_op(a, b): + raise NotImplementedError() + + +def concat_op(a, b): + return a.concat(b) + + +def desc_op(a): + return a.desc() + + +def asc_op(a): + return a.asc() + + +def nullsfirst_op(a): + return a.nullsfirst() + + +def nullslast_op(a): + return a.nullslast() + + +def json_getitem_op(a, b): + raise NotImplementedError() + + +def json_path_getitem_op(a, b): + raise NotImplementedError() + + +_commutative = set([eq, ne, add, mul]) + +_comparison = set([eq, ne, lt, gt, ge, le, between_op, like_op]) + + +def is_comparison(op): + return op in _comparison or \ + isinstance(op, custom_op) and op.is_comparison + + +def is_commutative(op): + return op in _commutative + + +def is_ordering_modifier(op): + return op in (asc_op, desc_op, + nullsfirst_op, nullslast_op) + + +def is_natural_self_precedent(op): + return op in _natural_self_precedent or \ + isinstance(op, custom_op) and op.natural_self_precedent + +_mirror = { + gt: lt, + ge: le, + lt: gt, + le: ge +} + + +def mirror(op): + """rotate a comparison operator 180 degrees. + + Note this is not the same as negation. + + """ + return _mirror.get(op, op) + + +_associative = _commutative.union([concat_op, and_, or_]).difference([eq, ne]) + +_natural_self_precedent = _associative.union([ + getitem, json_getitem_op, json_path_getitem_op]) +"""Operators where if we have (a op b) op c, we don't want to +parenthesize (a op b). + +""" + + +_asbool = util.symbol('_asbool', canonical=-10) +_smallest = util.symbol('_smallest', canonical=-100) +_largest = util.symbol('_largest', canonical=100) + +_PRECEDENCE = { + from_: 15, + any_op: 15, + all_op: 15, + getitem: 15, + json_getitem_op: 15, + json_path_getitem_op: 15, + + mul: 8, + truediv: 8, + div: 8, + mod: 8, + neg: 8, + add: 7, + sub: 7, + + concat_op: 6, + match_op: 6, + notmatch_op: 6, + + ilike_op: 6, + notilike_op: 6, + like_op: 6, + notlike_op: 6, + in_op: 6, + notin_op: 6, + + is_: 6, + isnot: 6, + + eq: 5, + ne: 5, + is_distinct_from: 5, + isnot_distinct_from: 5, + gt: 5, + lt: 5, + ge: 5, + le: 5, + + between_op: 5, + notbetween_op: 5, + distinct_op: 5, + inv: 5, + istrue: 5, + isfalse: 5, + and_: 3, + or_: 2, + comma_op: -1, + + desc_op: 3, + asc_op: 3, + collate: 4, + + as_: -1, + exists: 0, + + _asbool: -10, + _smallest: _smallest, + _largest: _largest +} + + +def is_precedent(operator, against): + if operator is against and is_natural_self_precedent(operator): + return False + else: + return (_PRECEDENCE.get(operator, + getattr(operator, 'precedence', _smallest)) <= + _PRECEDENCE.get(against, + getattr(against, 'precedence', _largest))) diff --git a/app/lib/sqlalchemy/sql/schema.py b/app/lib/sqlalchemy/sql/schema.py new file mode 100644 index 0000000..6699614 --- /dev/null +++ b/app/lib/sqlalchemy/sql/schema.py @@ -0,0 +1,4027 @@ +# sql/schema.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""The schema module provides the building blocks for database metadata. + +Each element within this module describes a database entity which can be +created and dropped, or is otherwise part of such an entity. Examples include +tables, columns, sequences, and indexes. + +All entities are subclasses of :class:`~sqlalchemy.schema.SchemaItem`, and as +defined in this module they are intended to be agnostic of any vendor-specific +constructs. + +A collection of entities are grouped into a unit called +:class:`~sqlalchemy.schema.MetaData`. MetaData serves as a logical grouping of +schema elements, and can also be associated with an actual database connection +such that operations involving the contained elements can contact the database +as needed. + +Two of the elements here also build upon their "syntactic" counterparts, which +are defined in :class:`~sqlalchemy.sql.expression.`, specifically +:class:`~sqlalchemy.schema.Table` and :class:`~sqlalchemy.schema.Column`. +Since these objects are part of the SQL expression language, they are usable +as components in SQL expressions. + +""" +from __future__ import absolute_import + +from .. import exc, util, event, inspection +from .base import SchemaEventTarget, DialectKWArgs +import operator +from . import visitors +from . import type_api +from .base import _bind_or_error, ColumnCollection +from .elements import ClauseElement, ColumnClause, \ + _as_truncated, TextClause, _literal_as_text,\ + ColumnElement, quoted_name +from .selectable import TableClause +import collections +import sqlalchemy +from . import ddl + +RETAIN_SCHEMA = util.symbol('retain_schema') + +BLANK_SCHEMA = util.symbol( + 'blank_schema', + """Symbol indicating that a :class:`.Table` or :class:`.Sequence` + should have 'None' for its schema, even if the parent + :class:`.MetaData` has specified a schema. + + .. versionadded:: 1.0.14 + + """ +) + + +def _get_table_key(name, schema): + if schema is None: + return name + else: + return schema + "." + name + + +@inspection._self_inspects +class SchemaItem(SchemaEventTarget, visitors.Visitable): + """Base class for items that define a database schema.""" + + __visit_name__ = 'schema_item' + + def _init_items(self, *args): + """Initialize the list of child items for this SchemaItem.""" + + for item in args: + if item is not None: + item._set_parent_with_dispatch(self) + + def get_children(self, **kwargs): + """used to allow SchemaVisitor access""" + return [] + + def __repr__(self): + return util.generic_repr(self, omit_kwarg=['info']) + + @property + @util.deprecated('0.9', 'Use ``.name.quote``') + def quote(self): + """Return the value of the ``quote`` flag passed + to this schema object, for those schema items which + have a ``name`` field. + + """ + + return self.name.quote + + @util.memoized_property + def info(self): + """Info dictionary associated with the object, allowing user-defined + data to be associated with this :class:`.SchemaItem`. + + The dictionary is automatically generated when first accessed. + It can also be specified in the constructor of some objects, + such as :class:`.Table` and :class:`.Column`. + + """ + return {} + + def _schema_item_copy(self, schema_item): + if 'info' in self.__dict__: + schema_item.info = self.info.copy() + schema_item.dispatch._update(self.dispatch) + return schema_item + + def _translate_schema(self, effective_schema, map_): + return map_.get(effective_schema, effective_schema) + + +class Table(DialectKWArgs, SchemaItem, TableClause): + r"""Represent a table in a database. + + e.g.:: + + mytable = Table("mytable", metadata, + Column('mytable_id', Integer, primary_key=True), + Column('value', String(50)) + ) + + The :class:`.Table` object constructs a unique instance of itself based + on its name and optional schema name within the given + :class:`.MetaData` object. Calling the :class:`.Table` + constructor with the same name and same :class:`.MetaData` argument + a second time will return the *same* :class:`.Table` object - in this way + the :class:`.Table` constructor acts as a registry function. + + .. seealso:: + + :ref:`metadata_describing` - Introduction to database metadata + + Constructor arguments are as follows: + + :param name: The name of this table as represented in the database. + + The table name, along with the value of the ``schema`` parameter, + forms a key which uniquely identifies this :class:`.Table` within + the owning :class:`.MetaData` collection. + Additional calls to :class:`.Table` with the same name, metadata, + and schema name will return the same :class:`.Table` object. + + Names which contain no upper case characters + will be treated as case insensitive names, and will not be quoted + unless they are a reserved word or contain special characters. + A name with any number of upper case characters is considered + to be case sensitive, and will be sent as quoted. + + To enable unconditional quoting for the table name, specify the flag + ``quote=True`` to the constructor, or use the :class:`.quoted_name` + construct to specify the name. + + :param metadata: a :class:`.MetaData` object which will contain this + table. The metadata is used as a point of association of this table + with other tables which are referenced via foreign key. It also + may be used to associate this table with a particular + :class:`.Connectable`. + + :param \*args: Additional positional arguments are used primarily + to add the list of :class:`.Column` objects contained within this + table. Similar to the style of a CREATE TABLE statement, other + :class:`.SchemaItem` constructs may be added here, including + :class:`.PrimaryKeyConstraint`, and :class:`.ForeignKeyConstraint`. + + :param autoload: Defaults to False, unless :paramref:`.Table.autoload_with` + is set in which case it defaults to True; :class:`.Column` objects + for this table should be reflected from the database, possibly + augmenting or replacing existing :class:`.Column` objects that were + explicitly specified. + + .. versionchanged:: 1.0.0 setting the :paramref:`.Table.autoload_with` + parameter implies that :paramref:`.Table.autoload` will default + to True. + + .. seealso:: + + :ref:`metadata_reflection_toplevel` + + :param autoload_replace: Defaults to ``True``; when using + :paramref:`.Table.autoload` + in conjunction with :paramref:`.Table.extend_existing`, indicates + that :class:`.Column` objects present in the already-existing + :class:`.Table` object should be replaced with columns of the same + name retrieved from the autoload process. When ``False``, columns + already present under existing names will be omitted from the + reflection process. + + Note that this setting does not impact :class:`.Column` objects + specified programmatically within the call to :class:`.Table` that + also is autoloading; those :class:`.Column` objects will always + replace existing columns of the same name when + :paramref:`.Table.extend_existing` is ``True``. + + .. versionadded:: 0.7.5 + + .. seealso:: + + :paramref:`.Table.autoload` + + :paramref:`.Table.extend_existing` + + :param autoload_with: An :class:`.Engine` or :class:`.Connection` object + with which this :class:`.Table` object will be reflected; when + set to a non-None value, it implies that :paramref:`.Table.autoload` + is ``True``. If left unset, but :paramref:`.Table.autoload` is + explicitly set to ``True``, an autoload operation will attempt to + proceed by locating an :class:`.Engine` or :class:`.Connection` bound + to the underlying :class:`.MetaData` object. + + .. seealso:: + + :paramref:`.Table.autoload` + + :param extend_existing: When ``True``, indicates that if this + :class:`.Table` is already present in the given :class:`.MetaData`, + apply further arguments within the constructor to the existing + :class:`.Table`. + + If :paramref:`.Table.extend_existing` or + :paramref:`.Table.keep_existing` are not set, and the given name + of the new :class:`.Table` refers to a :class:`.Table` that is + already present in the target :class:`.MetaData` collection, and + this :class:`.Table` specifies additional columns or other constructs + or flags that modify the table's state, an + error is raised. The purpose of these two mutually-exclusive flags + is to specify what action should be taken when a :class:`.Table` + is specified that matches an existing :class:`.Table`, yet specifies + additional constructs. + + :paramref:`.Table.extend_existing` will also work in conjunction + with :paramref:`.Table.autoload` to run a new reflection + operation against the database, even if a :class:`.Table` + of the same name is already present in the target + :class:`.MetaData`; newly reflected :class:`.Column` objects + and other options will be added into the state of the + :class:`.Table`, potentially overwriting existing columns + and options of the same name. + + .. versionchanged:: 0.7.4 :paramref:`.Table.extend_existing` will + invoke a new reflection operation when combined with + :paramref:`.Table.autoload` set to True. + + As is always the case with :paramref:`.Table.autoload`, + :class:`.Column` objects can be specified in the same :class:`.Table` + constructor, which will take precedence. Below, the existing + table ``mytable`` will be augmented with :class:`.Column` objects + both reflected from the database, as well as the given :class:`.Column` + named "y":: + + Table("mytable", metadata, + Column('y', Integer), + extend_existing=True, + autoload=True, + autoload_with=engine + ) + + .. seealso:: + + :paramref:`.Table.autoload` + + :paramref:`.Table.autoload_replace` + + :paramref:`.Table.keep_existing` + + + :param implicit_returning: True by default - indicates that + RETURNING can be used by default to fetch newly inserted primary key + values, for backends which support this. Note that + create_engine() also provides an implicit_returning flag. + + :param include_columns: A list of strings indicating a subset of + columns to be loaded via the ``autoload`` operation; table columns who + aren't present in this list will not be represented on the resulting + ``Table`` object. Defaults to ``None`` which indicates all columns + should be reflected. + + :param info: Optional data dictionary which will be populated into the + :attr:`.SchemaItem.info` attribute of this object. + + :param keep_existing: When ``True``, indicates that if this Table + is already present in the given :class:`.MetaData`, ignore + further arguments within the constructor to the existing + :class:`.Table`, and return the :class:`.Table` object as + originally created. This is to allow a function that wishes + to define a new :class:`.Table` on first call, but on + subsequent calls will return the same :class:`.Table`, + without any of the declarations (particularly constraints) + being applied a second time. + + If :paramref:`.Table.extend_existing` or + :paramref:`.Table.keep_existing` are not set, and the given name + of the new :class:`.Table` refers to a :class:`.Table` that is + already present in the target :class:`.MetaData` collection, and + this :class:`.Table` specifies additional columns or other constructs + or flags that modify the table's state, an + error is raised. The purpose of these two mutually-exclusive flags + is to specify what action should be taken when a :class:`.Table` + is specified that matches an existing :class:`.Table`, yet specifies + additional constructs. + + .. seealso:: + + :paramref:`.Table.extend_existing` + + :param listeners: A list of tuples of the form ``(, )`` + which will be passed to :func:`.event.listen` upon construction. + This alternate hook to :func:`.event.listen` allows the establishment + of a listener function specific to this :class:`.Table` before + the "autoload" process begins. Particularly useful for + the :meth:`.DDLEvents.column_reflect` event:: + + def listen_for_reflect(table, column_info): + "handle the column reflection event" + # ... + + t = Table( + 'sometable', + autoload=True, + listeners=[ + ('column_reflect', listen_for_reflect) + ]) + + :param mustexist: When ``True``, indicates that this Table must already + be present in the given :class:`.MetaData` collection, else + an exception is raised. + + :param prefixes: + A list of strings to insert after CREATE in the CREATE TABLE + statement. They will be separated by spaces. + + :param quote: Force quoting of this table's name on or off, corresponding + to ``True`` or ``False``. When left at its default of ``None``, + the column identifier will be quoted according to whether the name is + case sensitive (identifiers with at least one upper case character are + treated as case sensitive), or if it's a reserved word. This flag + is only needed to force quoting of a reserved word which is not known + by the SQLAlchemy dialect. + + :param quote_schema: same as 'quote' but applies to the schema identifier. + + :param schema: The schema name for this table, which is required if + the table resides in a schema other than the default selected schema + for the engine's database connection. Defaults to ``None``. + + If the owning :class:`.MetaData` of this :class:`.Table` specifies + its own :paramref:`.MetaData.schema` parameter, then that schema + name will be applied to this :class:`.Table` if the schema parameter + here is set to ``None``. To set a blank schema name on a :class:`.Table` + that would otherwise use the schema set on the owning :class:`.MetaData`, + specify the special symbol :attr:`.BLANK_SCHEMA`. + + .. versionadded:: 1.0.14 Added the :attr:`.BLANK_SCHEMA` symbol to + allow a :class:`.Table` to have a blank schema name even when the + parent :class:`.MetaData` specifies :paramref:`.MetaData.schema`. + + The quoting rules for the schema name are the same as those for the + ``name`` parameter, in that quoting is applied for reserved words or + case-sensitive names; to enable unconditional quoting for the + schema name, specify the flag + ``quote_schema=True`` to the constructor, or use the + :class:`.quoted_name` construct to specify the name. + + :param useexisting: Deprecated. Use :paramref:`.Table.extend_existing`. + + :param \**kw: Additional keyword arguments not mentioned above are + dialect specific, and passed in the form ``_``. + See the documentation regarding an individual dialect at + :ref:`dialect_toplevel` for detail on documented arguments. + + """ + + __visit_name__ = 'table' + + def __new__(cls, *args, **kw): + if not args: + # python3k pickle seems to call this + return object.__new__(cls) + + try: + name, metadata, args = args[0], args[1], args[2:] + except IndexError: + raise TypeError("Table() takes at least two arguments") + + schema = kw.get('schema', None) + if schema is None: + schema = metadata.schema + elif schema is BLANK_SCHEMA: + schema = None + keep_existing = kw.pop('keep_existing', False) + extend_existing = kw.pop('extend_existing', False) + if 'useexisting' in kw: + msg = "useexisting is deprecated. Use extend_existing." + util.warn_deprecated(msg) + if extend_existing: + msg = "useexisting is synonymous with extend_existing." + raise exc.ArgumentError(msg) + extend_existing = kw.pop('useexisting', False) + + if keep_existing and extend_existing: + msg = "keep_existing and extend_existing are mutually exclusive." + raise exc.ArgumentError(msg) + + mustexist = kw.pop('mustexist', False) + key = _get_table_key(name, schema) + if key in metadata.tables: + if not keep_existing and not extend_existing and bool(args): + raise exc.InvalidRequestError( + "Table '%s' is already defined for this MetaData " + "instance. Specify 'extend_existing=True' " + "to redefine " + "options and columns on an " + "existing Table object." % key) + table = metadata.tables[key] + if extend_existing: + table._init_existing(*args, **kw) + return table + else: + if mustexist: + raise exc.InvalidRequestError( + "Table '%s' not defined" % (key)) + table = object.__new__(cls) + table.dispatch.before_parent_attach(table, metadata) + metadata._add_table(name, schema, table) + try: + table._init(name, metadata, *args, **kw) + table.dispatch.after_parent_attach(table, metadata) + return table + except: + with util.safe_reraise(): + metadata._remove_table(name, schema) + + @property + @util.deprecated('0.9', 'Use ``table.schema.quote``') + def quote_schema(self): + """Return the value of the ``quote_schema`` flag passed + to this :class:`.Table`. + """ + + return self.schema.quote + + def __init__(self, *args, **kw): + """Constructor for :class:`~.schema.Table`. + + This method is a no-op. See the top-level + documentation for :class:`~.schema.Table` + for constructor arguments. + + """ + # __init__ is overridden to prevent __new__ from + # calling the superclass constructor. + + def _init(self, name, metadata, *args, **kwargs): + super(Table, self).__init__( + quoted_name(name, kwargs.pop('quote', None))) + self.metadata = metadata + + self.schema = kwargs.pop('schema', None) + if self.schema is None: + self.schema = metadata.schema + elif self.schema is BLANK_SCHEMA: + self.schema = None + else: + quote_schema = kwargs.pop('quote_schema', None) + self.schema = quoted_name(self.schema, quote_schema) + + self.indexes = set() + self.constraints = set() + self._columns = ColumnCollection() + PrimaryKeyConstraint(_implicit_generated=True).\ + _set_parent_with_dispatch(self) + self.foreign_keys = set() + self._extra_dependencies = set() + if self.schema is not None: + self.fullname = "%s.%s" % (self.schema, self.name) + else: + self.fullname = self.name + + autoload_with = kwargs.pop('autoload_with', None) + autoload = kwargs.pop('autoload', autoload_with is not None) + # this argument is only used with _init_existing() + kwargs.pop('autoload_replace', True) + _extend_on = kwargs.pop("_extend_on", None) + + include_columns = kwargs.pop('include_columns', None) + + self.implicit_returning = kwargs.pop('implicit_returning', True) + + if 'info' in kwargs: + self.info = kwargs.pop('info') + if 'listeners' in kwargs: + listeners = kwargs.pop('listeners') + for evt, fn in listeners: + event.listen(self, evt, fn) + + self._prefixes = kwargs.pop('prefixes', []) + + self._extra_kwargs(**kwargs) + + # load column definitions from the database if 'autoload' is defined + # we do it after the table is in the singleton dictionary to support + # circular foreign keys + if autoload: + self._autoload( + metadata, autoload_with, + include_columns, _extend_on=_extend_on) + + # initialize all the column, etc. objects. done after reflection to + # allow user-overrides + self._init_items(*args) + + def _autoload(self, metadata, autoload_with, include_columns, + exclude_columns=(), _extend_on=None): + + if autoload_with: + autoload_with.run_callable( + autoload_with.dialect.reflecttable, + self, include_columns, exclude_columns, + _extend_on=_extend_on + ) + else: + bind = _bind_or_error( + metadata, + msg="No engine is bound to this Table's MetaData. " + "Pass an engine to the Table via " + "autoload_with=, " + "or associate the MetaData with an engine via " + "metadata.bind=") + bind.run_callable( + bind.dialect.reflecttable, + self, include_columns, exclude_columns, + _extend_on=_extend_on + ) + + @property + def _sorted_constraints(self): + """Return the set of constraints as a list, sorted by creation + order. + + """ + return sorted(self.constraints, key=lambda c: c._creation_order) + + @property + def foreign_key_constraints(self): + """:class:`.ForeignKeyConstraint` objects referred to by this + :class:`.Table`. + + This list is produced from the collection of :class:`.ForeignKey` + objects currently associated. + + .. versionadded:: 1.0.0 + + """ + return set(fkc.constraint for fkc in self.foreign_keys) + + def _init_existing(self, *args, **kwargs): + autoload_with = kwargs.pop('autoload_with', None) + autoload = kwargs.pop('autoload', autoload_with is not None) + autoload_replace = kwargs.pop('autoload_replace', True) + schema = kwargs.pop('schema', None) + _extend_on = kwargs.pop('_extend_on', None) + + if schema and schema != self.schema: + raise exc.ArgumentError( + "Can't change schema of existing table from '%s' to '%s'", + (self.schema, schema)) + + include_columns = kwargs.pop('include_columns', None) + + if include_columns is not None: + for c in self.c: + if c.name not in include_columns: + self._columns.remove(c) + + for key in ('quote', 'quote_schema'): + if key in kwargs: + raise exc.ArgumentError( + "Can't redefine 'quote' or 'quote_schema' arguments") + + if 'info' in kwargs: + self.info = kwargs.pop('info') + + if autoload: + if not autoload_replace: + # don't replace columns already present. + # we'd like to do this for constraints also however we don't + # have simple de-duping for unnamed constraints. + exclude_columns = [c.name for c in self.c] + else: + exclude_columns = () + self._autoload( + self.metadata, autoload_with, + include_columns, exclude_columns, _extend_on=_extend_on) + + self._extra_kwargs(**kwargs) + self._init_items(*args) + + def _extra_kwargs(self, **kwargs): + self._validate_dialect_kwargs(kwargs) + + def _init_collections(self): + pass + + def _reset_exported(self): + pass + + @property + def _autoincrement_column(self): + return self.primary_key._autoincrement_column + + @property + def key(self): + """Return the 'key' for this :class:`.Table`. + + This value is used as the dictionary key within the + :attr:`.MetaData.tables` collection. It is typically the same + as that of :attr:`.Table.name` for a table with no + :attr:`.Table.schema` set; otherwise it is typically of the form + ``schemaname.tablename``. + + """ + return _get_table_key(self.name, self.schema) + + def __repr__(self): + return "Table(%s)" % ', '.join( + [repr(self.name)] + [repr(self.metadata)] + + [repr(x) for x in self.columns] + + ["%s=%s" % (k, repr(getattr(self, k))) for k in ['schema']]) + + def __str__(self): + return _get_table_key(self.description, self.schema) + + @property + def bind(self): + """Return the connectable associated with this Table.""" + + return self.metadata and self.metadata.bind or None + + def add_is_dependent_on(self, table): + """Add a 'dependency' for this Table. + + This is another Table object which must be created + first before this one can, or dropped after this one. + + Usually, dependencies between tables are determined via + ForeignKey objects. However, for other situations that + create dependencies outside of foreign keys (rules, inheriting), + this method can manually establish such a link. + + """ + self._extra_dependencies.add(table) + + def append_column(self, column): + """Append a :class:`~.schema.Column` to this :class:`~.schema.Table`. + + The "key" of the newly added :class:`~.schema.Column`, i.e. the + value of its ``.key`` attribute, will then be available + in the ``.c`` collection of this :class:`~.schema.Table`, and the + column definition will be included in any CREATE TABLE, SELECT, + UPDATE, etc. statements generated from this :class:`~.schema.Table` + construct. + + Note that this does **not** change the definition of the table + as it exists within any underlying database, assuming that + table has already been created in the database. Relational + databases support the addition of columns to existing tables + using the SQL ALTER command, which would need to be + emitted for an already-existing table that doesn't contain + the newly added column. + + """ + + column._set_parent_with_dispatch(self) + + def append_constraint(self, constraint): + """Append a :class:`~.schema.Constraint` to this + :class:`~.schema.Table`. + + This has the effect of the constraint being included in any + future CREATE TABLE statement, assuming specific DDL creation + events have not been associated with the given + :class:`~.schema.Constraint` object. + + Note that this does **not** produce the constraint within the + relational database automatically, for a table that already exists + in the database. To add a constraint to an + existing relational database table, the SQL ALTER command must + be used. SQLAlchemy also provides the + :class:`.AddConstraint` construct which can produce this SQL when + invoked as an executable clause. + + """ + + constraint._set_parent_with_dispatch(self) + + def append_ddl_listener(self, event_name, listener): + """Append a DDL event listener to this ``Table``. + + .. deprecated:: 0.7 + See :class:`.DDLEvents`. + + """ + + def adapt_listener(target, connection, **kw): + listener(event_name, target, connection) + + event.listen(self, "" + event_name.replace('-', '_'), adapt_listener) + + def _set_parent(self, metadata): + metadata._add_table(self.name, self.schema, self) + self.metadata = metadata + + def get_children(self, column_collections=True, + schema_visitor=False, **kw): + if not schema_visitor: + return TableClause.get_children( + self, column_collections=column_collections, **kw) + else: + if column_collections: + return list(self.columns) + else: + return [] + + def exists(self, bind=None): + """Return True if this table exists.""" + + if bind is None: + bind = _bind_or_error(self) + + return bind.run_callable(bind.dialect.has_table, + self.name, schema=self.schema) + + def create(self, bind=None, checkfirst=False): + """Issue a ``CREATE`` statement for this + :class:`.Table`, using the given :class:`.Connectable` + for connectivity. + + .. seealso:: + + :meth:`.MetaData.create_all`. + + """ + + if bind is None: + bind = _bind_or_error(self) + bind._run_visitor(ddl.SchemaGenerator, + self, + checkfirst=checkfirst) + + def drop(self, bind=None, checkfirst=False): + """Issue a ``DROP`` statement for this + :class:`.Table`, using the given :class:`.Connectable` + for connectivity. + + .. seealso:: + + :meth:`.MetaData.drop_all`. + + """ + if bind is None: + bind = _bind_or_error(self) + bind._run_visitor(ddl.SchemaDropper, + self, + checkfirst=checkfirst) + + def tometadata(self, metadata, schema=RETAIN_SCHEMA, + referred_schema_fn=None, name=None): + """Return a copy of this :class:`.Table` associated with a different + :class:`.MetaData`. + + E.g.:: + + m1 = MetaData() + + user = Table('user', m1, Column('id', Integer, priamry_key=True)) + + m2 = MetaData() + user_copy = user.tometadata(m2) + + :param metadata: Target :class:`.MetaData` object, into which the + new :class:`.Table` object will be created. + + :param schema: optional string name indicating the target schema. + Defaults to the special symbol :attr:`.RETAIN_SCHEMA` which indicates + that no change to the schema name should be made in the new + :class:`.Table`. If set to a string name, the new :class:`.Table` + will have this new name as the ``.schema``. If set to ``None``, the + schema will be set to that of the schema set on the target + :class:`.MetaData`, which is typically ``None`` as well, unless + set explicitly:: + + m2 = MetaData(schema='newschema') + + # user_copy_one will have "newschema" as the schema name + user_copy_one = user.tometadata(m2, schema=None) + + m3 = MetaData() # schema defaults to None + + # user_copy_two will have None as the schema name + user_copy_two = user.tometadata(m3, schema=None) + + :param referred_schema_fn: optional callable which can be supplied + in order to provide for the schema name that should be assigned + to the referenced table of a :class:`.ForeignKeyConstraint`. + The callable accepts this parent :class:`.Table`, the + target schema that we are changing to, the + :class:`.ForeignKeyConstraint` object, and the existing + "target schema" of that constraint. The function should return the + string schema name that should be applied. + E.g.:: + + def referred_schema_fn(table, to_schema, + constraint, referred_schema): + if referred_schema == 'base_tables': + return referred_schema + else: + return to_schema + + new_table = table.tometadata(m2, schema="alt_schema", + referred_schema_fn=referred_schema_fn) + + .. versionadded:: 0.9.2 + + :param name: optional string name indicating the target table name. + If not specified or None, the table name is retained. This allows + a :class:`.Table` to be copied to the same :class:`.MetaData` target + with a new name. + + .. versionadded:: 1.0.0 + + """ + if name is None: + name = self.name + if schema is RETAIN_SCHEMA: + schema = self.schema + elif schema is None: + schema = metadata.schema + key = _get_table_key(name, schema) + if key in metadata.tables: + util.warn("Table '%s' already exists within the given " + "MetaData - not copying." % self.description) + return metadata.tables[key] + + args = [] + for c in self.columns: + args.append(c.copy(schema=schema)) + table = Table( + name, metadata, schema=schema, + *args, **self.kwargs + ) + for c in self.constraints: + if isinstance(c, ForeignKeyConstraint): + referred_schema = c._referred_schema + if referred_schema_fn: + fk_constraint_schema = referred_schema_fn( + self, schema, c, referred_schema) + else: + fk_constraint_schema = ( + schema if referred_schema == self.schema else None) + table.append_constraint( + c.copy(schema=fk_constraint_schema, target_table=table)) + elif not c._type_bound: + # skip unique constraints that would be generated + # by the 'unique' flag on Column + if isinstance(c, UniqueConstraint) and \ + len(c.columns) == 1 and \ + list(c.columns)[0].unique: + continue + + table.append_constraint( + c.copy(schema=schema, target_table=table)) + for index in self.indexes: + # skip indexes that would be generated + # by the 'index' flag on Column + if len(index.columns) == 1 and \ + list(index.columns)[0].index: + continue + Index(index.name, + unique=index.unique, + *[table.c[col] for col in index.columns.keys()], + **index.kwargs) + return self._schema_item_copy(table) + + +class Column(SchemaItem, ColumnClause): + """Represents a column in a database table.""" + + __visit_name__ = 'column' + + def __init__(self, *args, **kwargs): + r""" + Construct a new ``Column`` object. + + :param name: The name of this column as represented in the database. + This argument may be the first positional argument, or specified + via keyword. + + Names which contain no upper case characters + will be treated as case insensitive names, and will not be quoted + unless they are a reserved word. Names with any number of upper + case characters will be quoted and sent exactly. Note that this + behavior applies even for databases which standardize upper + case names as case insensitive such as Oracle. + + The name field may be omitted at construction time and applied + later, at any time before the Column is associated with a + :class:`.Table`. This is to support convenient + usage within the :mod:`~sqlalchemy.ext.declarative` extension. + + :param type\_: The column's type, indicated using an instance which + subclasses :class:`~sqlalchemy.types.TypeEngine`. If no arguments + are required for the type, the class of the type can be sent + as well, e.g.:: + + # use a type with arguments + Column('data', String(50)) + + # use no arguments + Column('level', Integer) + + The ``type`` argument may be the second positional argument + or specified by keyword. + + If the ``type`` is ``None`` or is omitted, it will first default to + the special type :class:`.NullType`. If and when this + :class:`.Column` is made to refer to another column using + :class:`.ForeignKey` and/or :class:`.ForeignKeyConstraint`, the type + of the remote-referenced column will be copied to this column as + well, at the moment that the foreign key is resolved against that + remote :class:`.Column` object. + + .. versionchanged:: 0.9.0 + Support for propagation of type to a :class:`.Column` from its + :class:`.ForeignKey` object has been improved and should be + more reliable and timely. + + :param \*args: Additional positional arguments include various + :class:`.SchemaItem` derived constructs which will be applied + as options to the column. These include instances of + :class:`.Constraint`, :class:`.ForeignKey`, :class:`.ColumnDefault`, + and :class:`.Sequence`. In some cases an equivalent keyword + argument is available such as ``server_default``, ``default`` + and ``unique``. + + :param autoincrement: Set up "auto increment" semantics for an integer + primary key column. The default value is the string ``"auto"`` + which indicates that a single-column primary key that is of + an INTEGER type with no stated client-side or python-side defaults + should receive auto increment semantics automatically; + all other varieties of primary key columns will not. This + includes that :term:`DDL` such as PostgreSQL SERIAL or MySQL + AUTO_INCREMENT will be emitted for this column during a table + create, as well as that the column is assumed to generate new + integer primary key values when an INSERT statement invokes which + will be retrieved by the dialect. + + The flag may be set to ``True`` to indicate that a column which + is part of a composite (e.g. multi-column) primary key should + have autoincrement semantics, though note that only one column + within a primary key may have this setting. It can also + be set to ``True`` to indicate autoincrement semantics on a + column that has a client-side or server-side default configured, + however note that not all dialects can accommodate all styles + of default as an "autoincrement". It can also be + set to ``False`` on a single-column primary key that has a + datatype of INTEGER in order to disable auto increment semantics + for that column. + + .. versionchanged:: 1.1 The autoincrement flag now defaults to + ``"auto"`` which indicates autoincrement semantics by default + for single-column integer primary keys only; for composite + (multi-column) primary keys, autoincrement is never implicitly + enabled; as always, ``autoincrement=True`` will allow for + at most one of those columns to be an "autoincrement" column. + ``autoincrement=True`` may also be set on a :class:`.Column` + that has an explicit client-side or server-side default, + subject to limitations of the backend database and dialect. + + + The setting *only* has an effect for columns which are: + + * Integer derived (i.e. INT, SMALLINT, BIGINT). + + * Part of the primary key + + * Not referring to another column via :class:`.ForeignKey`, unless + the value is specified as ``'ignore_fk'``:: + + # turn on autoincrement for this column despite + # the ForeignKey() + Column('id', ForeignKey('other.id'), + primary_key=True, autoincrement='ignore_fk') + + It is typically not desirable to have "autoincrement" enabled + on a column that refers to another via foreign key, as such a column + is required to refer to a value that originates from elsewhere. + + The setting has these two effects on columns that meet the + above criteria: + + * DDL issued for the column will include database-specific + keywords intended to signify this column as an + "autoincrement" column, such as AUTO INCREMENT on MySQL, + SERIAL on PostgreSQL, and IDENTITY on MS-SQL. It does + *not* issue AUTOINCREMENT for SQLite since this is a + special SQLite flag that is not required for autoincrementing + behavior. + + .. seealso:: + + :ref:`sqlite_autoincrement` + + * The column will be considered to be available using an + "autoincrement" method specific to the backend database, such + as calling upon ``cursor.lastrowid``, using RETURNING in an + INSERT statement to get at a sequence-generated value, or using + special functions such as "SELECT scope_identity()". + These methods are highly specific to the DBAPIs and databases in + use and vary greatly, so care should be taken when associating + ``autoincrement=True`` with a custom default generation function. + + + :param default: A scalar, Python callable, or + :class:`.ColumnElement` expression representing the + *default value* for this column, which will be invoked upon insert + if this column is otherwise not specified in the VALUES clause of + the insert. This is a shortcut to using :class:`.ColumnDefault` as + a positional argument; see that class for full detail on the + structure of the argument. + + Contrast this argument to :paramref:`.Column.server_default` + which creates a default generator on the database side. + + .. seealso:: + + :ref:`metadata_defaults_toplevel` + + :param doc: optional String that can be used by the ORM or similar + to document attributes. This attribute does not render SQL + comments (a future attribute 'comment' will achieve that). + + :param key: An optional string identifier which will identify this + ``Column`` object on the :class:`.Table`. When a key is provided, + this is the only identifier referencing the ``Column`` within the + application, including ORM attribute mapping; the ``name`` field + is used only when rendering SQL. + + :param index: When ``True``, indicates that the column is indexed. + This is a shortcut for using a :class:`.Index` construct on the + table. To specify indexes with explicit names or indexes that + contain multiple columns, use the :class:`.Index` construct + instead. + + :param info: Optional data dictionary which will be populated into the + :attr:`.SchemaItem.info` attribute of this object. + + :param nullable: When set to ``False``, will cause the "NOT NULL" + phrase to be added when generating DDL for the column. When + ``True``, will normally generate nothing (in SQL this defaults to + "NULL"), except in some very specific backend-specific edge cases + where "NULL" may render explicitly. Defaults to ``True`` unless + :paramref:`~.Column.primary_key` is also ``True``, in which case it + defaults to ``False``. This parameter is only used when issuing + CREATE TABLE statements. + + :param onupdate: A scalar, Python callable, or + :class:`~sqlalchemy.sql.expression.ClauseElement` representing a + default value to be applied to the column within UPDATE + statements, which wil be invoked upon update if this column is not + present in the SET clause of the update. This is a shortcut to + using :class:`.ColumnDefault` as a positional argument with + ``for_update=True``. + + .. seealso:: + + :ref:`metadata_defaults` - complete discussion of onupdate + + :param primary_key: If ``True``, marks this column as a primary key + column. Multiple columns can have this flag set to specify + composite primary keys. As an alternative, the primary key of a + :class:`.Table` can be specified via an explicit + :class:`.PrimaryKeyConstraint` object. + + :param server_default: A :class:`.FetchedValue` instance, str, Unicode + or :func:`~sqlalchemy.sql.expression.text` construct representing + the DDL DEFAULT value for the column. + + String types will be emitted as-is, surrounded by single quotes:: + + Column('x', Text, server_default="val") + + x TEXT DEFAULT 'val' + + A :func:`~sqlalchemy.sql.expression.text` expression will be + rendered as-is, without quotes:: + + Column('y', DateTime, server_default=text('NOW()')) + + y DATETIME DEFAULT NOW() + + Strings and text() will be converted into a + :class:`.DefaultClause` object upon initialization. + + Use :class:`.FetchedValue` to indicate that an already-existing + column will generate a default value on the database side which + will be available to SQLAlchemy for post-fetch after inserts. This + construct does not specify any DDL and the implementation is left + to the database, such as via a trigger. + + .. seealso:: + + :ref:`server_defaults` - complete discussion of server side + defaults + + :param server_onupdate: A :class:`.FetchedValue` instance + representing a database-side default generation function, + such as a trigger. This + indicates to SQLAlchemy that a newly generated value will be + available after updates. This construct does not actually + implement any kind of generation function within the database, + which instead must be specified separately. + + .. seealso:: + + :ref:`triggered_columns` + + :param quote: Force quoting of this column's name on or off, + corresponding to ``True`` or ``False``. When left at its default + of ``None``, the column identifier will be quoted according to + whether the name is case sensitive (identifiers with at least one + upper case character are treated as case sensitive), or if it's a + reserved word. This flag is only needed to force quoting of a + reserved word which is not known by the SQLAlchemy dialect. + + :param unique: When ``True``, indicates that this column contains a + unique constraint, or if ``index`` is ``True`` as well, indicates + that the :class:`.Index` should be created with the unique flag. + To specify multiple columns in the constraint/index or to specify + an explicit name, use the :class:`.UniqueConstraint` or + :class:`.Index` constructs explicitly. + + :param system: When ``True``, indicates this is a "system" column, + that is a column which is automatically made available by the + database, and should not be included in the columns list for a + ``CREATE TABLE`` statement. + + For more elaborate scenarios where columns should be + conditionally rendered differently on different backends, + consider custom compilation rules for :class:`.CreateColumn`. + + .. versionadded:: 0.8.3 Added the ``system=True`` parameter to + :class:`.Column`. + + """ + + name = kwargs.pop('name', None) + type_ = kwargs.pop('type_', None) + args = list(args) + if args: + if isinstance(args[0], util.string_types): + if name is not None: + raise exc.ArgumentError( + "May not pass name positionally and as a keyword.") + name = args.pop(0) + if args: + coltype = args[0] + + if hasattr(coltype, "_sqla_type"): + if type_ is not None: + raise exc.ArgumentError( + "May not pass type_ positionally and as a keyword.") + type_ = args.pop(0) + + if name is not None: + name = quoted_name(name, kwargs.pop('quote', None)) + elif "quote" in kwargs: + raise exc.ArgumentError("Explicit 'name' is required when " + "sending 'quote' argument") + + super(Column, self).__init__(name, type_) + self.key = kwargs.pop('key', name) + self.primary_key = kwargs.pop('primary_key', False) + self.nullable = kwargs.pop('nullable', not self.primary_key) + self.default = kwargs.pop('default', None) + self.server_default = kwargs.pop('server_default', None) + self.server_onupdate = kwargs.pop('server_onupdate', None) + + # these default to None because .index and .unique is *not* + # an informational flag about Column - there can still be an + # Index or UniqueConstraint referring to this Column. + self.index = kwargs.pop('index', None) + self.unique = kwargs.pop('unique', None) + + self.system = kwargs.pop('system', False) + self.doc = kwargs.pop('doc', None) + self.onupdate = kwargs.pop('onupdate', None) + self.autoincrement = kwargs.pop('autoincrement', "auto") + self.constraints = set() + self.foreign_keys = set() + + # check if this Column is proxying another column + if '_proxies' in kwargs: + self._proxies = kwargs.pop('_proxies') + # otherwise, add DDL-related events + elif isinstance(self.type, SchemaEventTarget): + self.type._set_parent_with_dispatch(self) + + if self.default is not None: + if isinstance(self.default, (ColumnDefault, Sequence)): + args.append(self.default) + else: + if getattr(self.type, '_warn_on_bytestring', False): + if isinstance(self.default, util.binary_type): + util.warn( + "Unicode column '%s' has non-unicode " + "default value %r specified." % ( + self.key, + self.default + )) + args.append(ColumnDefault(self.default)) + + if self.server_default is not None: + if isinstance(self.server_default, FetchedValue): + args.append(self.server_default._as_for_update(False)) + else: + args.append(DefaultClause(self.server_default)) + + if self.onupdate is not None: + if isinstance(self.onupdate, (ColumnDefault, Sequence)): + args.append(self.onupdate) + else: + args.append(ColumnDefault(self.onupdate, for_update=True)) + + if self.server_onupdate is not None: + if isinstance(self.server_onupdate, FetchedValue): + args.append(self.server_onupdate._as_for_update(True)) + else: + args.append(DefaultClause(self.server_onupdate, + for_update=True)) + self._init_items(*args) + + util.set_creation_order(self) + + if 'info' in kwargs: + self.info = kwargs.pop('info') + + if kwargs: + raise exc.ArgumentError( + "Unknown arguments passed to Column: " + repr(list(kwargs))) + +# @property +# def quote(self): +# return getattr(self.name, "quote", None) + + def __str__(self): + if self.name is None: + return "(no name)" + elif self.table is not None: + if self.table.named_with_column: + return (self.table.description + "." + self.description) + else: + return self.description + else: + return self.description + + def references(self, column): + """Return True if this Column references the given column via foreign + key.""" + + for fk in self.foreign_keys: + if fk.column.proxy_set.intersection(column.proxy_set): + return True + else: + return False + + def append_foreign_key(self, fk): + fk._set_parent_with_dispatch(self) + + def __repr__(self): + kwarg = [] + if self.key != self.name: + kwarg.append('key') + if self.primary_key: + kwarg.append('primary_key') + if not self.nullable: + kwarg.append('nullable') + if self.onupdate: + kwarg.append('onupdate') + if self.default: + kwarg.append('default') + if self.server_default: + kwarg.append('server_default') + return "Column(%s)" % ', '.join( + [repr(self.name)] + [repr(self.type)] + + [repr(x) for x in self.foreign_keys if x is not None] + + [repr(x) for x in self.constraints] + + [(self.table is not None and "table=<%s>" % + self.table.description or "table=None")] + + ["%s=%s" % (k, repr(getattr(self, k))) for k in kwarg]) + + def _set_parent(self, table): + if not self.name: + raise exc.ArgumentError( + "Column must be constructed with a non-blank name or " + "assign a non-blank .name before adding to a Table.") + if self.key is None: + self.key = self.name + + existing = getattr(self, 'table', None) + if existing is not None and existing is not table: + raise exc.ArgumentError( + "Column object '%s' already assigned to Table '%s'" % ( + self.key, + existing.description + )) + + if self.key in table._columns: + col = table._columns.get(self.key) + if col is not self: + for fk in col.foreign_keys: + table.foreign_keys.remove(fk) + if fk.constraint in table.constraints: + # this might have been removed + # already, if it's a composite constraint + # and more than one col being replaced + table.constraints.remove(fk.constraint) + + table._columns.replace(self) + + if self.primary_key: + table.primary_key._replace(self) + elif self.key in table.primary_key: + raise exc.ArgumentError( + "Trying to redefine primary-key column '%s' as a " + "non-primary-key column on table '%s'" % ( + self.key, table.fullname)) + + self.table = table + + if self.index: + if isinstance(self.index, util.string_types): + raise exc.ArgumentError( + "The 'index' keyword argument on Column is boolean only. " + "To create indexes with a specific name, create an " + "explicit Index object external to the Table.") + Index(None, self, unique=bool(self.unique)) + elif self.unique: + if isinstance(self.unique, util.string_types): + raise exc.ArgumentError( + "The 'unique' keyword argument on Column is boolean " + "only. To create unique constraints or indexes with a " + "specific name, append an explicit UniqueConstraint to " + "the Table's list of elements, or create an explicit " + "Index object external to the Table.") + table.append_constraint(UniqueConstraint(self.key)) + + self._setup_on_memoized_fks(lambda fk: fk._set_remote_table(table)) + + def _setup_on_memoized_fks(self, fn): + fk_keys = [ + ((self.table.key, self.key), False), + ((self.table.key, self.name), True), + ] + for fk_key, link_to_name in fk_keys: + if fk_key in self.table.metadata._fk_memos: + for fk in self.table.metadata._fk_memos[fk_key]: + if fk.link_to_name is link_to_name: + fn(fk) + + def _on_table_attach(self, fn): + if self.table is not None: + fn(self, self.table) + else: + event.listen(self, 'after_parent_attach', fn) + + def copy(self, **kw): + """Create a copy of this ``Column``, unitialized. + + This is used in ``Table.tometadata``. + + """ + + # Constraint objects plus non-constraint-bound ForeignKey objects + args = \ + [c.copy(**kw) for c in self.constraints if not c._type_bound] + \ + [c.copy(**kw) for c in self.foreign_keys if not c.constraint] + + type_ = self.type + if isinstance(type_, SchemaEventTarget): + type_ = type_.copy(**kw) + + c = self._constructor( + name=self.name, + type_=type_, + key=self.key, + primary_key=self.primary_key, + nullable=self.nullable, + unique=self.unique, + system=self.system, + # quote=self.quote, + index=self.index, + autoincrement=self.autoincrement, + default=self.default, + server_default=self.server_default, + onupdate=self.onupdate, + server_onupdate=self.server_onupdate, + doc=self.doc, + *args + ) + return self._schema_item_copy(c) + + def _make_proxy(self, selectable, name=None, key=None, + name_is_truncatable=False, **kw): + """Create a *proxy* for this column. + + This is a copy of this ``Column`` referenced by a different parent + (such as an alias or select statement). The column should + be used only in select scenarios, as its full DDL/default + information is not transferred. + + """ + fk = [ForeignKey(f.column, _constraint=f.constraint) + for f in self.foreign_keys] + if name is None and self.name is None: + raise exc.InvalidRequestError( + "Cannot initialize a sub-selectable" + " with this Column object until its 'name' has " + "been assigned.") + try: + c = self._constructor( + _as_truncated(name or self.name) if + name_is_truncatable else (name or self.name), + self.type, + key=key if key else name if name else self.key, + primary_key=self.primary_key, + nullable=self.nullable, + _proxies=[self], *fk) + except TypeError: + util.raise_from_cause( + TypeError( + "Could not create a copy of this %r object. " + "Ensure the class includes a _constructor() " + "attribute or method which accepts the " + "standard Column constructor arguments, or " + "references the Column class itself." % self.__class__) + ) + + c.table = selectable + selectable._columns.add(c) + if selectable._is_clone_of is not None: + c._is_clone_of = selectable._is_clone_of.columns[c.key] + if self.primary_key: + selectable.primary_key.add(c) + c.dispatch.after_parent_attach(c, selectable) + return c + + def get_children(self, schema_visitor=False, **kwargs): + if schema_visitor: + return [x for x in (self.default, self.onupdate) + if x is not None] + \ + list(self.foreign_keys) + list(self.constraints) + else: + return ColumnClause.get_children(self, **kwargs) + + +class ForeignKey(DialectKWArgs, SchemaItem): + """Defines a dependency between two columns. + + ``ForeignKey`` is specified as an argument to a :class:`.Column` object, + e.g.:: + + t = Table("remote_table", metadata, + Column("remote_id", ForeignKey("main_table.id")) + ) + + Note that ``ForeignKey`` is only a marker object that defines + a dependency between two columns. The actual constraint + is in all cases represented by the :class:`.ForeignKeyConstraint` + object. This object will be generated automatically when + a ``ForeignKey`` is associated with a :class:`.Column` which + in turn is associated with a :class:`.Table`. Conversely, + when :class:`.ForeignKeyConstraint` is applied to a :class:`.Table`, + ``ForeignKey`` markers are automatically generated to be + present on each associated :class:`.Column`, which are also + associated with the constraint object. + + Note that you cannot define a "composite" foreign key constraint, + that is a constraint between a grouping of multiple parent/child + columns, using ``ForeignKey`` objects. To define this grouping, + the :class:`.ForeignKeyConstraint` object must be used, and applied + to the :class:`.Table`. The associated ``ForeignKey`` objects + are created automatically. + + The ``ForeignKey`` objects associated with an individual + :class:`.Column` object are available in the `foreign_keys` collection + of that column. + + Further examples of foreign key configuration are in + :ref:`metadata_foreignkeys`. + + """ + + __visit_name__ = 'foreign_key' + + def __init__(self, column, _constraint=None, use_alter=False, name=None, + onupdate=None, ondelete=None, deferrable=None, + initially=None, link_to_name=False, match=None, + info=None, + **dialect_kw): + r""" + Construct a column-level FOREIGN KEY. + + The :class:`.ForeignKey` object when constructed generates a + :class:`.ForeignKeyConstraint` which is associated with the parent + :class:`.Table` object's collection of constraints. + + :param column: A single target column for the key relationship. A + :class:`.Column` object or a column name as a string: + ``tablename.columnkey`` or ``schema.tablename.columnkey``. + ``columnkey`` is the ``key`` which has been assigned to the column + (defaults to the column name itself), unless ``link_to_name`` is + ``True`` in which case the rendered name of the column is used. + + .. versionadded:: 0.7.4 + Note that if the schema name is not included, and the + underlying :class:`.MetaData` has a "schema", that value will + be used. + + :param name: Optional string. An in-database name for the key if + `constraint` is not provided. + + :param onupdate: Optional string. If set, emit ON UPDATE when + issuing DDL for this constraint. Typical values include CASCADE, + DELETE and RESTRICT. + + :param ondelete: Optional string. If set, emit ON DELETE when + issuing DDL for this constraint. Typical values include CASCADE, + DELETE and RESTRICT. + + :param deferrable: Optional bool. If set, emit DEFERRABLE or NOT + DEFERRABLE when issuing DDL for this constraint. + + :param initially: Optional string. If set, emit INITIALLY when + issuing DDL for this constraint. + + :param link_to_name: if True, the string name given in ``column`` is + the rendered name of the referenced column, not its locally + assigned ``key``. + + :param use_alter: passed to the underlying + :class:`.ForeignKeyConstraint` to indicate the constraint should + be generated/dropped externally from the CREATE TABLE/ DROP TABLE + statement. See :paramref:`.ForeignKeyConstraint.use_alter` + for further description. + + .. seealso:: + + :paramref:`.ForeignKeyConstraint.use_alter` + + :ref:`use_alter` + + :param match: Optional string. If set, emit MATCH when issuing + DDL for this constraint. Typical values include SIMPLE, PARTIAL + and FULL. + + :param info: Optional data dictionary which will be populated into the + :attr:`.SchemaItem.info` attribute of this object. + + .. versionadded:: 1.0.0 + + :param \**dialect_kw: Additional keyword arguments are dialect + specific, and passed in the form ``_``. The + arguments are ultimately handled by a corresponding + :class:`.ForeignKeyConstraint`. See the documentation regarding + an individual dialect at :ref:`dialect_toplevel` for detail on + documented arguments. + + .. versionadded:: 0.9.2 + + """ + + self._colspec = column + if isinstance(self._colspec, util.string_types): + self._table_column = None + else: + if hasattr(self._colspec, '__clause_element__'): + self._table_column = self._colspec.__clause_element__() + else: + self._table_column = self._colspec + + if not isinstance(self._table_column, ColumnClause): + raise exc.ArgumentError( + "String, Column, or Column-bound argument " + "expected, got %r" % self._table_column) + elif not isinstance( + self._table_column.table, (util.NoneType, TableClause)): + raise exc.ArgumentError( + "ForeignKey received Column not bound " + "to a Table, got: %r" % self._table_column.table + ) + + # the linked ForeignKeyConstraint. + # ForeignKey will create this when parent Column + # is attached to a Table, *or* ForeignKeyConstraint + # object passes itself in when creating ForeignKey + # markers. + self.constraint = _constraint + self.parent = None + self.use_alter = use_alter + self.name = name + self.onupdate = onupdate + self.ondelete = ondelete + self.deferrable = deferrable + self.initially = initially + self.link_to_name = link_to_name + self.match = match + if info: + self.info = info + self._unvalidated_dialect_kw = dialect_kw + + def __repr__(self): + return "ForeignKey(%r)" % self._get_colspec() + + def copy(self, schema=None): + """Produce a copy of this :class:`.ForeignKey` object. + + The new :class:`.ForeignKey` will not be bound + to any :class:`.Column`. + + This method is usually used by the internal + copy procedures of :class:`.Column`, :class:`.Table`, + and :class:`.MetaData`. + + :param schema: The returned :class:`.ForeignKey` will + reference the original table and column name, qualified + by the given string schema name. + + """ + + fk = ForeignKey( + self._get_colspec(schema=schema), + use_alter=self.use_alter, + name=self.name, + onupdate=self.onupdate, + ondelete=self.ondelete, + deferrable=self.deferrable, + initially=self.initially, + link_to_name=self.link_to_name, + match=self.match, + **self._unvalidated_dialect_kw + ) + return self._schema_item_copy(fk) + + def _get_colspec(self, schema=None, table_name=None): + """Return a string based 'column specification' for this + :class:`.ForeignKey`. + + This is usually the equivalent of the string-based "tablename.colname" + argument first passed to the object's constructor. + + """ + if schema: + _schema, tname, colname = self._column_tokens + if table_name is not None: + tname = table_name + return "%s.%s.%s" % (schema, tname, colname) + elif table_name: + schema, tname, colname = self._column_tokens + if schema: + return "%s.%s.%s" % (schema, table_name, colname) + else: + return "%s.%s" % (table_name, colname) + elif self._table_column is not None: + return "%s.%s" % ( + self._table_column.table.fullname, self._table_column.key) + else: + return self._colspec + + @property + def _referred_schema(self): + return self._column_tokens[0] + + def _table_key(self): + if self._table_column is not None: + if self._table_column.table is None: + return None + else: + return self._table_column.table.key + else: + schema, tname, colname = self._column_tokens + return _get_table_key(tname, schema) + + target_fullname = property(_get_colspec) + + def references(self, table): + """Return True if the given :class:`.Table` is referenced by this + :class:`.ForeignKey`.""" + + return table.corresponding_column(self.column) is not None + + def get_referent(self, table): + """Return the :class:`.Column` in the given :class:`.Table` + referenced by this :class:`.ForeignKey`. + + Returns None if this :class:`.ForeignKey` does not reference the given + :class:`.Table`. + + """ + + return table.corresponding_column(self.column) + + @util.memoized_property + def _column_tokens(self): + """parse a string-based _colspec into its component parts.""" + + m = self._get_colspec().split('.') + if m is None: + raise exc.ArgumentError( + "Invalid foreign key column specification: %s" % + self._colspec) + if (len(m) == 1): + tname = m.pop() + colname = None + else: + colname = m.pop() + tname = m.pop() + + # A FK between column 'bar' and table 'foo' can be + # specified as 'foo', 'foo.bar', 'dbo.foo.bar', + # 'otherdb.dbo.foo.bar'. Once we have the column name and + # the table name, treat everything else as the schema + # name. Some databases (e.g. Sybase) support + # inter-database foreign keys. See tickets#1341 and -- + # indirectly related -- Ticket #594. This assumes that '.' + # will never appear *within* any component of the FK. + + if (len(m) > 0): + schema = '.'.join(m) + else: + schema = None + return schema, tname, colname + + def _resolve_col_tokens(self): + if self.parent is None: + raise exc.InvalidRequestError( + "this ForeignKey object does not yet have a " + "parent Column associated with it.") + + elif self.parent.table is None: + raise exc.InvalidRequestError( + "this ForeignKey's parent column is not yet associated " + "with a Table.") + + parenttable = self.parent.table + + # assertion, can be commented out. + # basically Column._make_proxy() sends the actual + # target Column to the ForeignKey object, so the + # string resolution here is never called. + for c in self.parent.base_columns: + if isinstance(c, Column): + assert c.table is parenttable + break + else: + assert False + ###################### + + schema, tname, colname = self._column_tokens + + if schema is None and parenttable.metadata.schema is not None: + schema = parenttable.metadata.schema + + tablekey = _get_table_key(tname, schema) + return parenttable, tablekey, colname + + def _link_to_col_by_colstring(self, parenttable, table, colname): + if not hasattr(self.constraint, '_referred_table'): + self.constraint._referred_table = table + else: + assert self.constraint._referred_table is table + + _column = None + if colname is None: + # colname is None in the case that ForeignKey argument + # was specified as table name only, in which case we + # match the column name to the same column on the + # parent. + key = self.parent + _column = table.c.get(self.parent.key, None) + elif self.link_to_name: + key = colname + for c in table.c: + if c.name == colname: + _column = c + else: + key = colname + _column = table.c.get(colname, None) + + if _column is None: + raise exc.NoReferencedColumnError( + "Could not initialize target column " + "for ForeignKey '%s' on table '%s': " + "table '%s' has no column named '%s'" % + (self._colspec, parenttable.name, table.name, key), + table.name, key) + + self._set_target_column(_column) + + def _set_target_column(self, column): + # propagate TypeEngine to parent if it didn't have one + if self.parent.type._isnull: + self.parent.type = column.type + + # super-edgy case, if other FKs point to our column, + # they'd get the type propagated out also. + if isinstance(self.parent.table, Table): + + def set_type(fk): + if fk.parent.type._isnull: + fk.parent.type = column.type + self.parent._setup_on_memoized_fks(set_type) + + self.column = column + + @util.memoized_property + def column(self): + """Return the target :class:`.Column` referenced by this + :class:`.ForeignKey`. + + If no target column has been established, an exception + is raised. + + .. versionchanged:: 0.9.0 + Foreign key target column resolution now occurs as soon as both + the ForeignKey object and the remote Column to which it refers + are both associated with the same MetaData object. + + """ + + if isinstance(self._colspec, util.string_types): + + parenttable, tablekey, colname = self._resolve_col_tokens() + + if tablekey not in parenttable.metadata: + raise exc.NoReferencedTableError( + "Foreign key associated with column '%s' could not find " + "table '%s' with which to generate a " + "foreign key to target column '%s'" % + (self.parent, tablekey, colname), + tablekey) + elif parenttable.key not in parenttable.metadata: + raise exc.InvalidRequestError( + "Table %s is no longer associated with its " + "parent MetaData" % parenttable) + else: + raise exc.NoReferencedColumnError( + "Could not initialize target column for " + "ForeignKey '%s' on table '%s': " + "table '%s' has no column named '%s'" % ( + self._colspec, parenttable.name, tablekey, colname), + tablekey, colname) + elif hasattr(self._colspec, '__clause_element__'): + _column = self._colspec.__clause_element__() + return _column + else: + _column = self._colspec + return _column + + def _set_parent(self, column): + if self.parent is not None and self.parent is not column: + raise exc.InvalidRequestError( + "This ForeignKey already has a parent !") + self.parent = column + self.parent.foreign_keys.add(self) + self.parent._on_table_attach(self._set_table) + + def _set_remote_table(self, table): + parenttable, tablekey, colname = self._resolve_col_tokens() + self._link_to_col_by_colstring(parenttable, table, colname) + self.constraint._validate_dest_table(table) + + def _remove_from_metadata(self, metadata): + parenttable, table_key, colname = self._resolve_col_tokens() + fk_key = (table_key, colname) + + if self in metadata._fk_memos[fk_key]: + # TODO: no test coverage for self not in memos + metadata._fk_memos[fk_key].remove(self) + + def _set_table(self, column, table): + # standalone ForeignKey - create ForeignKeyConstraint + # on the hosting Table when attached to the Table. + if self.constraint is None and isinstance(table, Table): + self.constraint = ForeignKeyConstraint( + [], [], use_alter=self.use_alter, name=self.name, + onupdate=self.onupdate, ondelete=self.ondelete, + deferrable=self.deferrable, initially=self.initially, + match=self.match, + **self._unvalidated_dialect_kw + ) + self.constraint._append_element(column, self) + self.constraint._set_parent_with_dispatch(table) + table.foreign_keys.add(self) + + # set up remote ".column" attribute, or a note to pick it + # up when the other Table/Column shows up + if isinstance(self._colspec, util.string_types): + parenttable, table_key, colname = self._resolve_col_tokens() + fk_key = (table_key, colname) + if table_key in parenttable.metadata.tables: + table = parenttable.metadata.tables[table_key] + try: + self._link_to_col_by_colstring( + parenttable, table, colname) + except exc.NoReferencedColumnError: + # this is OK, we'll try later + pass + parenttable.metadata._fk_memos[fk_key].append(self) + elif hasattr(self._colspec, '__clause_element__'): + _column = self._colspec.__clause_element__() + self._set_target_column(_column) + else: + _column = self._colspec + self._set_target_column(_column) + + +class _NotAColumnExpr(object): + def _not_a_column_expr(self): + raise exc.InvalidRequestError( + "This %s cannot be used directly " + "as a column expression." % self.__class__.__name__) + + __clause_element__ = self_group = lambda self: self._not_a_column_expr() + _from_objects = property(lambda self: self._not_a_column_expr()) + + +class DefaultGenerator(_NotAColumnExpr, SchemaItem): + """Base class for column *default* values.""" + + __visit_name__ = 'default_generator' + + is_sequence = False + is_server_default = False + column = None + + def __init__(self, for_update=False): + self.for_update = for_update + + def _set_parent(self, column): + self.column = column + if self.for_update: + self.column.onupdate = self + else: + self.column.default = self + + def execute(self, bind=None, **kwargs): + if bind is None: + bind = _bind_or_error(self) + return bind._execute_default(self, **kwargs) + + def _execute_on_connection(self, connection, multiparams, params): + return connection._execute_default(self, multiparams, params) + + @property + def bind(self): + """Return the connectable associated with this default.""" + if getattr(self, 'column', None) is not None: + return self.column.table.bind + else: + return None + + +class ColumnDefault(DefaultGenerator): + """A plain default value on a column. + + This could correspond to a constant, a callable function, + or a SQL clause. + + :class:`.ColumnDefault` is generated automatically + whenever the ``default``, ``onupdate`` arguments of + :class:`.Column` are used. A :class:`.ColumnDefault` + can be passed positionally as well. + + For example, the following:: + + Column('foo', Integer, default=50) + + Is equivalent to:: + + Column('foo', Integer, ColumnDefault(50)) + + + """ + + def __init__(self, arg, **kwargs): + """"Construct a new :class:`.ColumnDefault`. + + + :param arg: argument representing the default value. + May be one of the following: + + * a plain non-callable Python value, such as a + string, integer, boolean, or other simple type. + The default value will be used as is each time. + * a SQL expression, that is one which derives from + :class:`.ColumnElement`. The SQL expression will + be rendered into the INSERT or UPDATE statement, + or in the case of a primary key column when + RETURNING is not used may be + pre-executed before an INSERT within a SELECT. + * A Python callable. The function will be invoked for each + new row subject to an INSERT or UPDATE. + The callable must accept exactly + zero or one positional arguments. The one-argument form + will receive an instance of the :class:`.ExecutionContext`, + which provides contextual information as to the current + :class:`.Connection` in use as well as the current + statement and parameters. + + """ + super(ColumnDefault, self).__init__(**kwargs) + if isinstance(arg, FetchedValue): + raise exc.ArgumentError( + "ColumnDefault may not be a server-side default type.") + if util.callable(arg): + arg = self._maybe_wrap_callable(arg) + self.arg = arg + + @util.memoized_property + def is_callable(self): + return util.callable(self.arg) + + @util.memoized_property + def is_clause_element(self): + return isinstance(self.arg, ClauseElement) + + @util.memoized_property + def is_scalar(self): + return not self.is_callable and \ + not self.is_clause_element and \ + not self.is_sequence + + def _maybe_wrap_callable(self, fn): + """Wrap callables that don't accept a context. + + This is to allow easy compatibility with default callables + that aren't specific to accepting of a context. + + """ + try: + argspec = util.get_callable_argspec(fn, no_self=True) + except TypeError: + return util.wrap_callable(lambda ctx: fn(), fn) + + defaulted = argspec[3] is not None and len(argspec[3]) or 0 + positionals = len(argspec[0]) - defaulted + + if positionals == 0: + return util.wrap_callable(lambda ctx: fn(), fn) + + elif positionals == 1: + return fn + else: + raise exc.ArgumentError( + "ColumnDefault Python function takes zero or one " + "positional arguments") + + def _visit_name(self): + if self.for_update: + return "column_onupdate" + else: + return "column_default" + __visit_name__ = property(_visit_name) + + def __repr__(self): + return "ColumnDefault(%r)" % self.arg + + +class Sequence(DefaultGenerator): + """Represents a named database sequence. + + The :class:`.Sequence` object represents the name and configurational + parameters of a database sequence. It also represents + a construct that can be "executed" by a SQLAlchemy :class:`.Engine` + or :class:`.Connection`, rendering the appropriate "next value" function + for the target database and returning a result. + + The :class:`.Sequence` is typically associated with a primary key column:: + + some_table = Table( + 'some_table', metadata, + Column('id', Integer, Sequence('some_table_seq'), + primary_key=True) + ) + + When CREATE TABLE is emitted for the above :class:`.Table`, if the + target platform supports sequences, a CREATE SEQUENCE statement will + be emitted as well. For platforms that don't support sequences, + the :class:`.Sequence` construct is ignored. + + .. seealso:: + + :class:`.CreateSequence` + + :class:`.DropSequence` + + """ + + __visit_name__ = 'sequence' + + is_sequence = True + + def __init__(self, name, start=None, increment=None, minvalue=None, + maxvalue=None, nominvalue=None, nomaxvalue=None, cycle=None, + schema=None, optional=False, quote=None, metadata=None, + quote_schema=None, + for_update=False): + """Construct a :class:`.Sequence` object. + + :param name: The name of the sequence. + :param start: the starting index of the sequence. This value is + used when the CREATE SEQUENCE command is emitted to the database + as the value of the "START WITH" clause. If ``None``, the + clause is omitted, which on most platforms indicates a starting + value of 1. + :param increment: the increment value of the sequence. This + value is used when the CREATE SEQUENCE command is emitted to + the database as the value of the "INCREMENT BY" clause. If ``None``, + the clause is omitted, which on most platforms indicates an + increment of 1. + :param minvalue: the minimum value of the sequence. This + value is used when the CREATE SEQUENCE command is emitted to + the database as the value of the "MINVALUE" clause. If ``None``, + the clause is omitted, which on most platforms indicates a + minvalue of 1 and -2^63-1 for ascending and descending sequences, + respectively. + + .. versionadded:: 1.0.7 + + :param maxvalue: the maximum value of the sequence. This + value is used when the CREATE SEQUENCE command is emitted to + the database as the value of the "MAXVALUE" clause. If ``None``, + the clause is omitted, which on most platforms indicates a + maxvalue of 2^63-1 and -1 for ascending and descending sequences, + respectively. + + .. versionadded:: 1.0.7 + + :param nominvalue: no minimum value of the sequence. This + value is used when the CREATE SEQUENCE command is emitted to + the database as the value of the "NO MINVALUE" clause. If ``None``, + the clause is omitted, which on most platforms indicates a + minvalue of 1 and -2^63-1 for ascending and descending sequences, + respectively. + + .. versionadded:: 1.0.7 + + :param nomaxvalue: no maximum value of the sequence. This + value is used when the CREATE SEQUENCE command is emitted to + the database as the value of the "NO MAXVALUE" clause. If ``None``, + the clause is omitted, which on most platforms indicates a + maxvalue of 2^63-1 and -1 for ascending and descending sequences, + respectively. + + .. versionadded:: 1.0.7 + + :param cycle: allows the sequence to wrap around when the maxvalue + or minvalue has been reached by an ascending or descending sequence + respectively. This value is used when the CREATE SEQUENCE command + is emitted to the database as the "CYCLE" clause. If the limit is + reached, the next number generated will be the minvalue or maxvalue, + respectively. If cycle=False (the default) any calls to nextval + after the sequence has reached its maximum value will return an + error. + + .. versionadded:: 1.0.7 + + :param schema: Optional schema name for the sequence, if located + in a schema other than the default. The rules for selecting the + schema name when a :class:`.MetaData` is also present are the same + as that of :paramref:`.Table.schema`. + + :param optional: boolean value, when ``True``, indicates that this + :class:`.Sequence` object only needs to be explicitly generated + on backends that don't provide another way to generate primary + key identifiers. Currently, it essentially means, "don't create + this sequence on the PostgreSQL backend, where the SERIAL keyword + creates a sequence for us automatically". + :param quote: boolean value, when ``True`` or ``False``, explicitly + forces quoting of the schema name on or off. When left at its + default of ``None``, normal quoting rules based on casing and + reserved words take place. + :param quote_schema: set the quoting preferences for the ``schema`` + name. + :param metadata: optional :class:`.MetaData` object which will be + associated with this :class:`.Sequence`. A :class:`.Sequence` + that is associated with a :class:`.MetaData` gains access to the + ``bind`` of that :class:`.MetaData`, meaning the + :meth:`.Sequence.create` and :meth:`.Sequence.drop` methods will + make usage of that engine automatically. + + .. versionchanged:: 0.7 + Additionally, the appropriate CREATE SEQUENCE/ + DROP SEQUENCE DDL commands will be emitted corresponding to this + :class:`.Sequence` when :meth:`.MetaData.create_all` and + :meth:`.MetaData.drop_all` are invoked. + + Note that when a :class:`.Sequence` is applied to a :class:`.Column`, + the :class:`.Sequence` is automatically associated with the + :class:`.MetaData` object of that column's parent :class:`.Table`, + when that association is made. The :class:`.Sequence` will then + be subject to automatic CREATE SEQUENCE/DROP SEQUENCE corresponding + to when the :class:`.Table` object itself is created or dropped, + rather than that of the :class:`.MetaData` object overall. + :param for_update: Indicates this :class:`.Sequence`, when associated + with a :class:`.Column`, should be invoked for UPDATE statements + on that column's table, rather than for INSERT statements, when + no value is otherwise present for that column in the statement. + + """ + super(Sequence, self).__init__(for_update=for_update) + self.name = quoted_name(name, quote) + self.start = start + self.increment = increment + self.minvalue = minvalue + self.maxvalue = maxvalue + self.nominvalue = nominvalue + self.nomaxvalue = nomaxvalue + self.cycle = cycle + self.optional = optional + if schema is BLANK_SCHEMA: + self.schema = schema = None + elif metadata is not None and schema is None and metadata.schema: + self.schema = schema = metadata.schema + else: + self.schema = quoted_name(schema, quote_schema) + self.metadata = metadata + self._key = _get_table_key(name, schema) + if metadata: + self._set_metadata(metadata) + + @util.memoized_property + def is_callable(self): + return False + + @util.memoized_property + def is_clause_element(self): + return False + + @util.dependencies("sqlalchemy.sql.functions.func") + def next_value(self, func): + """Return a :class:`.next_value` function element + which will render the appropriate increment function + for this :class:`.Sequence` within any SQL expression. + + """ + return func.next_value(self, bind=self.bind) + + def _set_parent(self, column): + super(Sequence, self)._set_parent(column) + column._on_table_attach(self._set_table) + + def _set_table(self, column, table): + self._set_metadata(table.metadata) + + def _set_metadata(self, metadata): + self.metadata = metadata + self.metadata._sequences[self._key] = self + + @property + def bind(self): + if self.metadata: + return self.metadata.bind + else: + return None + + def create(self, bind=None, checkfirst=True): + """Creates this sequence in the database.""" + + if bind is None: + bind = _bind_or_error(self) + bind._run_visitor(ddl.SchemaGenerator, + self, + checkfirst=checkfirst) + + def drop(self, bind=None, checkfirst=True): + """Drops this sequence from the database.""" + + if bind is None: + bind = _bind_or_error(self) + bind._run_visitor(ddl.SchemaDropper, + self, + checkfirst=checkfirst) + + def _not_a_column_expr(self): + raise exc.InvalidRequestError( + "This %s cannot be used directly " + "as a column expression. Use func.next_value(sequence) " + "to produce a 'next value' function that's usable " + "as a column element." + % self.__class__.__name__) + + +@inspection._self_inspects +class FetchedValue(_NotAColumnExpr, SchemaEventTarget): + """A marker for a transparent database-side default. + + Use :class:`.FetchedValue` when the database is configured + to provide some automatic default for a column. + + E.g.:: + + Column('foo', Integer, FetchedValue()) + + Would indicate that some trigger or default generator + will create a new value for the ``foo`` column during an + INSERT. + + .. seealso:: + + :ref:`triggered_columns` + + """ + is_server_default = True + reflected = False + has_argument = False + + def __init__(self, for_update=False): + self.for_update = for_update + + def _as_for_update(self, for_update): + if for_update == self.for_update: + return self + else: + return self._clone(for_update) + + def _clone(self, for_update): + n = self.__class__.__new__(self.__class__) + n.__dict__.update(self.__dict__) + n.__dict__.pop('column', None) + n.for_update = for_update + return n + + def _set_parent(self, column): + self.column = column + if self.for_update: + self.column.server_onupdate = self + else: + self.column.server_default = self + + def __repr__(self): + return util.generic_repr(self) + + +class DefaultClause(FetchedValue): + """A DDL-specified DEFAULT column value. + + :class:`.DefaultClause` is a :class:`.FetchedValue` + that also generates a "DEFAULT" clause when + "CREATE TABLE" is emitted. + + :class:`.DefaultClause` is generated automatically + whenever the ``server_default``, ``server_onupdate`` arguments of + :class:`.Column` are used. A :class:`.DefaultClause` + can be passed positionally as well. + + For example, the following:: + + Column('foo', Integer, server_default="50") + + Is equivalent to:: + + Column('foo', Integer, DefaultClause("50")) + + """ + + has_argument = True + + def __init__(self, arg, for_update=False, _reflected=False): + util.assert_arg_type(arg, (util.string_types[0], + ClauseElement, + TextClause), 'arg') + super(DefaultClause, self).__init__(for_update) + self.arg = arg + self.reflected = _reflected + + def __repr__(self): + return "DefaultClause(%r, for_update=%r)" % \ + (self.arg, self.for_update) + + +class PassiveDefault(DefaultClause): + """A DDL-specified DEFAULT column value. + + .. deprecated:: 0.6 + :class:`.PassiveDefault` is deprecated. + Use :class:`.DefaultClause`. + """ + @util.deprecated("0.6", + ":class:`.PassiveDefault` is deprecated. " + "Use :class:`.DefaultClause`.", + False) + def __init__(self, *arg, **kw): + DefaultClause.__init__(self, *arg, **kw) + + +class Constraint(DialectKWArgs, SchemaItem): + """A table-level SQL constraint.""" + + __visit_name__ = 'constraint' + + def __init__(self, name=None, deferrable=None, initially=None, + _create_rule=None, info=None, _type_bound=False, + **dialect_kw): + r"""Create a SQL constraint. + + :param name: + Optional, the in-database name of this ``Constraint``. + + :param deferrable: + Optional bool. If set, emit DEFERRABLE or NOT DEFERRABLE when + issuing DDL for this constraint. + + :param initially: + Optional string. If set, emit INITIALLY when issuing DDL + for this constraint. + + :param info: Optional data dictionary which will be populated into the + :attr:`.SchemaItem.info` attribute of this object. + + .. versionadded:: 1.0.0 + + :param _create_rule: + a callable which is passed the DDLCompiler object during + compilation. Returns True or False to signal inline generation of + this Constraint. + + The AddConstraint and DropConstraint DDL constructs provide + DDLElement's more comprehensive "conditional DDL" approach that is + passed a database connection when DDL is being issued. _create_rule + is instead called during any CREATE TABLE compilation, where there + may not be any transaction/connection in progress. However, it + allows conditional compilation of the constraint even for backends + which do not support addition of constraints through ALTER TABLE, + which currently includes SQLite. + + _create_rule is used by some types to create constraints. + Currently, its call signature is subject to change at any time. + + :param \**dialect_kw: Additional keyword arguments are dialect + specific, and passed in the form ``_``. See + the documentation regarding an individual dialect at + :ref:`dialect_toplevel` for detail on documented arguments. + + """ + + self.name = name + self.deferrable = deferrable + self.initially = initially + if info: + self.info = info + self._create_rule = _create_rule + self._type_bound = _type_bound + util.set_creation_order(self) + self._validate_dialect_kwargs(dialect_kw) + + @property + def table(self): + try: + if isinstance(self.parent, Table): + return self.parent + except AttributeError: + pass + raise exc.InvalidRequestError( + "This constraint is not bound to a table. Did you " + "mean to call table.append_constraint(constraint) ?") + + def _set_parent(self, parent): + self.parent = parent + parent.constraints.add(self) + + def copy(self, **kw): + raise NotImplementedError() + + +def _to_schema_column(element): + if hasattr(element, '__clause_element__'): + element = element.__clause_element__() + if not isinstance(element, Column): + raise exc.ArgumentError("schema.Column object expected") + return element + + +def _to_schema_column_or_string(element): + if hasattr(element, '__clause_element__'): + element = element.__clause_element__() + if not isinstance(element, util.string_types + (ColumnElement, )): + msg = "Element %r is not a string name or column element" + raise exc.ArgumentError(msg % element) + return element + + +class ColumnCollectionMixin(object): + + columns = None + """A :class:`.ColumnCollection` of :class:`.Column` objects. + + This collection represents the columns which are referred to by + this object. + + """ + + _allow_multiple_tables = False + + def __init__(self, *columns, **kw): + _autoattach = kw.pop('_autoattach', True) + self.columns = ColumnCollection() + self._pending_colargs = [_to_schema_column_or_string(c) + for c in columns] + if _autoattach and self._pending_colargs: + self._check_attach() + + @classmethod + def _extract_col_expression_collection(cls, expressions): + for expr in expressions: + strname = None + column = None + if hasattr(expr, '__clause_element__'): + expr = expr.__clause_element__() + + if not isinstance(expr, (ColumnElement, TextClause)): + # this assumes a string + strname = expr + else: + cols = [] + visitors.traverse(expr, {}, {'column': cols.append}) + if cols: + column = cols[0] + add_element = column if column is not None else strname + yield expr, column, strname, add_element + + def _check_attach(self, evt=False): + col_objs = [ + c for c in self._pending_colargs + if isinstance(c, Column) + ] + + cols_w_table = [ + c for c in col_objs if isinstance(c.table, Table) + ] + + cols_wo_table = set(col_objs).difference(cols_w_table) + + if cols_wo_table: + # feature #3341 - place event listeners for Column objects + # such that when all those cols are attached, we autoattach. + assert not evt, "Should not reach here on event call" + + # issue #3411 - don't do the per-column auto-attach if some of the + # columns are specified as strings. + has_string_cols = set(self._pending_colargs).difference(col_objs) + if not has_string_cols: + def _col_attached(column, table): + # this isinstance() corresponds with the + # isinstance() above; only want to count Table-bound + # columns + if isinstance(table, Table): + cols_wo_table.discard(column) + if not cols_wo_table: + self._check_attach(evt=True) + self._cols_wo_table = cols_wo_table + for col in cols_wo_table: + col._on_table_attach(_col_attached) + return + + columns = cols_w_table + + tables = set([c.table for c in columns]) + if len(tables) == 1: + self._set_parent_with_dispatch(tables.pop()) + elif len(tables) > 1 and not self._allow_multiple_tables: + table = columns[0].table + others = [c for c in columns[1:] if c.table is not table] + if others: + raise exc.ArgumentError( + "Column(s) %s are not part of table '%s'." % + (", ".join("'%s'" % c for c in others), + table.description) + ) + + def _set_parent(self, table): + for col in self._pending_colargs: + if isinstance(col, util.string_types): + col = table.c[col] + self.columns.add(col) + + +class ColumnCollectionConstraint(ColumnCollectionMixin, Constraint): + """A constraint that proxies a ColumnCollection.""" + + def __init__(self, *columns, **kw): + r""" + :param \*columns: + A sequence of column names or Column objects. + + :param name: + Optional, the in-database name of this constraint. + + :param deferrable: + Optional bool. If set, emit DEFERRABLE or NOT DEFERRABLE when + issuing DDL for this constraint. + + :param initially: + Optional string. If set, emit INITIALLY when issuing DDL + for this constraint. + + :param \**kw: other keyword arguments including dialect-specific + arguments are propagated to the :class:`.Constraint` superclass. + + """ + _autoattach = kw.pop('_autoattach', True) + Constraint.__init__(self, **kw) + ColumnCollectionMixin.__init__(self, *columns, _autoattach=_autoattach) + + columns = None + """A :class:`.ColumnCollection` representing the set of columns + for this constraint. + + """ + + def _set_parent(self, table): + Constraint._set_parent(self, table) + ColumnCollectionMixin._set_parent(self, table) + + def __contains__(self, x): + return x in self.columns + + def copy(self, **kw): + c = self.__class__(name=self.name, deferrable=self.deferrable, + initially=self.initially, *self.columns.keys()) + return self._schema_item_copy(c) + + def contains_column(self, col): + """Return True if this constraint contains the given column. + + Note that this object also contains an attribute ``.columns`` + which is a :class:`.ColumnCollection` of :class:`.Column` objects. + + """ + + return self.columns.contains_column(col) + + def __iter__(self): + # inlining of + # return iter(self.columns) + # ColumnCollection->OrderedProperties->OrderedDict + ordered_dict = self.columns._data + return (ordered_dict[key] for key in ordered_dict._list) + + def __len__(self): + return len(self.columns._data) + + +class CheckConstraint(ColumnCollectionConstraint): + """A table- or column-level CHECK constraint. + + Can be included in the definition of a Table or Column. + """ + + _allow_multiple_tables = True + + def __init__(self, sqltext, name=None, deferrable=None, + initially=None, table=None, info=None, _create_rule=None, + _autoattach=True, _type_bound=False): + r"""Construct a CHECK constraint. + + :param sqltext: + A string containing the constraint definition, which will be used + verbatim, or a SQL expression construct. If given as a string, + the object is converted to a :class:`.Text` object. If the textual + string includes a colon character, escape this using a backslash:: + + CheckConstraint(r"foo ~ E'a(?\:b|c)d") + + :param name: + Optional, the in-database name of the constraint. + + :param deferrable: + Optional bool. If set, emit DEFERRABLE or NOT DEFERRABLE when + issuing DDL for this constraint. + + :param initially: + Optional string. If set, emit INITIALLY when issuing DDL + for this constraint. + + :param info: Optional data dictionary which will be populated into the + :attr:`.SchemaItem.info` attribute of this object. + + .. versionadded:: 1.0.0 + + """ + + self.sqltext = _literal_as_text(sqltext, warn=False) + + columns = [] + visitors.traverse(self.sqltext, {}, {'column': columns.append}) + + super(CheckConstraint, self).\ + __init__( + name=name, deferrable=deferrable, + initially=initially, _create_rule=_create_rule, info=info, + _type_bound=_type_bound, _autoattach=_autoattach, + *columns) + if table is not None: + self._set_parent_with_dispatch(table) + + def __visit_name__(self): + if isinstance(self.parent, Table): + return "check_constraint" + else: + return "column_check_constraint" + __visit_name__ = property(__visit_name__) + + def copy(self, target_table=None, **kw): + if target_table is not None: + def replace(col): + if self.table.c.contains_column(col): + return target_table.c[col.key] + else: + return None + sqltext = visitors.replacement_traverse(self.sqltext, {}, replace) + else: + sqltext = self.sqltext + c = CheckConstraint(sqltext, + name=self.name, + initially=self.initially, + deferrable=self.deferrable, + _create_rule=self._create_rule, + table=target_table, + _autoattach=False, + _type_bound=self._type_bound) + return self._schema_item_copy(c) + + +class ForeignKeyConstraint(ColumnCollectionConstraint): + """A table-level FOREIGN KEY constraint. + + Defines a single column or composite FOREIGN KEY ... REFERENCES + constraint. For a no-frills, single column foreign key, adding a + :class:`.ForeignKey` to the definition of a :class:`.Column` is a + shorthand equivalent for an unnamed, single column + :class:`.ForeignKeyConstraint`. + + Examples of foreign key configuration are in :ref:`metadata_foreignkeys`. + + """ + __visit_name__ = 'foreign_key_constraint' + + def __init__(self, columns, refcolumns, name=None, onupdate=None, + ondelete=None, deferrable=None, initially=None, + use_alter=False, link_to_name=False, match=None, + table=None, info=None, **dialect_kw): + r"""Construct a composite-capable FOREIGN KEY. + + :param columns: A sequence of local column names. The named columns + must be defined and present in the parent Table. The names should + match the ``key`` given to each column (defaults to the name) unless + ``link_to_name`` is True. + + :param refcolumns: A sequence of foreign column names or Column + objects. The columns must all be located within the same Table. + + :param name: Optional, the in-database name of the key. + + :param onupdate: Optional string. If set, emit ON UPDATE when + issuing DDL for this constraint. Typical values include CASCADE, + DELETE and RESTRICT. + + :param ondelete: Optional string. If set, emit ON DELETE when + issuing DDL for this constraint. Typical values include CASCADE, + DELETE and RESTRICT. + + :param deferrable: Optional bool. If set, emit DEFERRABLE or NOT + DEFERRABLE when issuing DDL for this constraint. + + :param initially: Optional string. If set, emit INITIALLY when + issuing DDL for this constraint. + + :param link_to_name: if True, the string name given in ``column`` is + the rendered name of the referenced column, not its locally assigned + ``key``. + + :param use_alter: If True, do not emit the DDL for this constraint as + part of the CREATE TABLE definition. Instead, generate it via an + ALTER TABLE statement issued after the full collection of tables + have been created, and drop it via an ALTER TABLE statement before + the full collection of tables are dropped. + + The use of :paramref:`.ForeignKeyConstraint.use_alter` is + particularly geared towards the case where two or more tables + are established within a mutually-dependent foreign key constraint + relationship; however, the :meth:`.MetaData.create_all` and + :meth:`.MetaData.drop_all` methods will perform this resolution + automatically, so the flag is normally not needed. + + .. versionchanged:: 1.0.0 Automatic resolution of foreign key + cycles has been added, removing the need to use the + :paramref:`.ForeignKeyConstraint.use_alter` in typical use + cases. + + .. seealso:: + + :ref:`use_alter` + + :param match: Optional string. If set, emit MATCH when issuing + DDL for this constraint. Typical values include SIMPLE, PARTIAL + and FULL. + + :param info: Optional data dictionary which will be populated into the + :attr:`.SchemaItem.info` attribute of this object. + + .. versionadded:: 1.0.0 + + :param \**dialect_kw: Additional keyword arguments are dialect + specific, and passed in the form ``_``. See + the documentation regarding an individual dialect at + :ref:`dialect_toplevel` for detail on documented arguments. + + .. versionadded:: 0.9.2 + + """ + + Constraint.__init__( + self, name=name, deferrable=deferrable, initially=initially, + info=info, **dialect_kw) + self.onupdate = onupdate + self.ondelete = ondelete + self.link_to_name = link_to_name + self.use_alter = use_alter + self.match = match + + # standalone ForeignKeyConstraint - create + # associated ForeignKey objects which will be applied to hosted + # Column objects (in col.foreign_keys), either now or when attached + # to the Table for string-specified names + self.elements = [ + ForeignKey( + refcol, + _constraint=self, + name=self.name, + onupdate=self.onupdate, + ondelete=self.ondelete, + use_alter=self.use_alter, + link_to_name=self.link_to_name, + match=self.match, + deferrable=self.deferrable, + initially=self.initially, + **self.dialect_kwargs + ) for refcol in refcolumns + ] + + ColumnCollectionMixin.__init__(self, *columns) + if table is not None: + if hasattr(self, "parent"): + assert table is self.parent + self._set_parent_with_dispatch(table) + + def _append_element(self, column, fk): + self.columns.add(column) + self.elements.append(fk) + + columns = None + """A :class:`.ColumnCollection` representing the set of columns + for this constraint. + + """ + + elements = None + """A sequence of :class:`.ForeignKey` objects. + + Each :class:`.ForeignKey` represents a single referring column/referred + column pair. + + This collection is intended to be read-only. + + """ + + @property + def _elements(self): + # legacy - provide a dictionary view of (column_key, fk) + return util.OrderedDict( + zip(self.column_keys, self.elements) + ) + + @property + def _referred_schema(self): + for elem in self.elements: + return elem._referred_schema + else: + return None + + @property + def referred_table(self): + """The :class:`.Table` object to which this + :class:`.ForeignKeyConstraint` references. + + This is a dynamically calculated attribute which may not be available + if the constraint and/or parent table is not yet associated with + a metadata collection that contains the referred table. + + .. versionadded:: 1.0.0 + + """ + return self.elements[0].column.table + + def _validate_dest_table(self, table): + table_keys = set([elem._table_key() + for elem in self.elements]) + if None not in table_keys and len(table_keys) > 1: + elem0, elem1 = sorted(table_keys)[0:2] + raise exc.ArgumentError( + 'ForeignKeyConstraint on %s(%s) refers to ' + 'multiple remote tables: %s and %s' % ( + table.fullname, + self._col_description, + elem0, + elem1 + )) + + @property + def column_keys(self): + """Return a list of string keys representing the local + columns in this :class:`.ForeignKeyConstraint`. + + This list is either the original string arguments sent + to the constructor of the :class:`.ForeignKeyConstraint`, + or if the constraint has been initialized with :class:`.Column` + objects, is the string .key of each element. + + .. versionadded:: 1.0.0 + + """ + if hasattr(self, "parent"): + return self.columns.keys() + else: + return [ + col.key if isinstance(col, ColumnElement) + else str(col) for col in self._pending_colargs + ] + + @property + def _col_description(self): + return ", ".join(self.column_keys) + + def _set_parent(self, table): + Constraint._set_parent(self, table) + + try: + ColumnCollectionConstraint._set_parent(self, table) + except KeyError as ke: + raise exc.ArgumentError( + "Can't create ForeignKeyConstraint " + "on table '%s': no column " + "named '%s' is present." % (table.description, ke.args[0])) + + for col, fk in zip(self.columns, self.elements): + if not hasattr(fk, 'parent') or \ + fk.parent is not col: + fk._set_parent_with_dispatch(col) + + self._validate_dest_table(table) + + def copy(self, schema=None, target_table=None, **kw): + fkc = ForeignKeyConstraint( + [x.parent.key for x in self.elements], + [x._get_colspec( + schema=schema, + table_name=target_table.name + if target_table is not None + and x._table_key() == x.parent.table.key + else None) + for x in self.elements], + name=self.name, + onupdate=self.onupdate, + ondelete=self.ondelete, + use_alter=self.use_alter, + deferrable=self.deferrable, + initially=self.initially, + link_to_name=self.link_to_name, + match=self.match + ) + for self_fk, other_fk in zip( + self.elements, + fkc.elements): + self_fk._schema_item_copy(other_fk) + return self._schema_item_copy(fkc) + + +class PrimaryKeyConstraint(ColumnCollectionConstraint): + """A table-level PRIMARY KEY constraint. + + The :class:`.PrimaryKeyConstraint` object is present automatically + on any :class:`.Table` object; it is assigned a set of + :class:`.Column` objects corresponding to those marked with + the :paramref:`.Column.primary_key` flag:: + + >>> my_table = Table('mytable', metadata, + ... Column('id', Integer, primary_key=True), + ... Column('version_id', Integer, primary_key=True), + ... Column('data', String(50)) + ... ) + >>> my_table.primary_key + PrimaryKeyConstraint( + Column('id', Integer(), table=, + primary_key=True, nullable=False), + Column('version_id', Integer(), table=, + primary_key=True, nullable=False) + ) + + The primary key of a :class:`.Table` can also be specified by using + a :class:`.PrimaryKeyConstraint` object explicitly; in this mode of usage, + the "name" of the constraint can also be specified, as well as other + options which may be recognized by dialects:: + + my_table = Table('mytable', metadata, + Column('id', Integer), + Column('version_id', Integer), + Column('data', String(50)), + PrimaryKeyConstraint('id', 'version_id', + name='mytable_pk') + ) + + The two styles of column-specification should generally not be mixed. + An warning is emitted if the columns present in the + :class:`.PrimaryKeyConstraint` + don't match the columns that were marked as ``primary_key=True``, if both + are present; in this case, the columns are taken strictly from the + :class:`.PrimaryKeyConstraint` declaration, and those columns otherwise + marked as ``primary_key=True`` are ignored. This behavior is intended to + be backwards compatible with previous behavior. + + .. versionchanged:: 0.9.2 Using a mixture of columns within a + :class:`.PrimaryKeyConstraint` in addition to columns marked as + ``primary_key=True`` now emits a warning if the lists don't match. + The ultimate behavior of ignoring those columns marked with the flag + only is currently maintained for backwards compatibility; this warning + may raise an exception in a future release. + + For the use case where specific options are to be specified on the + :class:`.PrimaryKeyConstraint`, but the usual style of using + ``primary_key=True`` flags is still desirable, an empty + :class:`.PrimaryKeyConstraint` may be specified, which will take on the + primary key column collection from the :class:`.Table` based on the + flags:: + + my_table = Table('mytable', metadata, + Column('id', Integer, primary_key=True), + Column('version_id', Integer, primary_key=True), + Column('data', String(50)), + PrimaryKeyConstraint(name='mytable_pk', + mssql_clustered=True) + ) + + .. versionadded:: 0.9.2 an empty :class:`.PrimaryKeyConstraint` may now + be specified for the purposes of establishing keyword arguments with + the constraint, independently of the specification of "primary key" + columns within the :class:`.Table` itself; columns marked as + ``primary_key=True`` will be gathered into the empty constraint's + column collection. + + """ + + __visit_name__ = 'primary_key_constraint' + + def __init__(self, *columns, **kw): + self._implicit_generated = kw.pop('_implicit_generated', False) + super(PrimaryKeyConstraint, self).__init__(*columns, **kw) + + def _set_parent(self, table): + super(PrimaryKeyConstraint, self)._set_parent(table) + + if table.primary_key is not self: + table.constraints.discard(table.primary_key) + table.primary_key = self + table.constraints.add(self) + + table_pks = [c for c in table.c if c.primary_key] + if self.columns and table_pks and \ + set(table_pks) != set(self.columns.values()): + util.warn( + "Table '%s' specifies columns %s as primary_key=True, " + "not matching locally specified columns %s; setting the " + "current primary key columns to %s. This warning " + "may become an exception in a future release" % + ( + table.name, + ", ".join("'%s'" % c.name for c in table_pks), + ", ".join("'%s'" % c.name for c in self.columns), + ", ".join("'%s'" % c.name for c in self.columns) + ) + ) + table_pks[:] = [] + + for c in self.columns: + c.primary_key = True + c.nullable = False + self.columns.extend(table_pks) + + def _reload(self, columns): + """repopulate this :class:`.PrimaryKeyConstraint` given + a set of columns. + + Existing columns in the table that are marked as primary_key=True + are maintained. + + Also fires a new event. + + This is basically like putting a whole new + :class:`.PrimaryKeyConstraint` object on the parent + :class:`.Table` object without actually replacing the object. + + The ordering of the given list of columns is also maintained; these + columns will be appended to the list of columns after any which + are already present. + + """ + + # set the primary key flag on new columns. + # note any existing PK cols on the table also have their + # flag still set. + for col in columns: + col.primary_key = True + + self.columns.extend(columns) + + PrimaryKeyConstraint._autoincrement_column._reset(self) + self._set_parent_with_dispatch(self.table) + + def _replace(self, col): + PrimaryKeyConstraint._autoincrement_column._reset(self) + self.columns.replace(col) + + @property + def columns_autoinc_first(self): + autoinc = self._autoincrement_column + + if autoinc is not None: + return [autoinc] + [c for c in self.columns if c is not autoinc] + else: + return list(self.columns) + + @util.memoized_property + def _autoincrement_column(self): + + def _validate_autoinc(col, autoinc_true): + if col.type._type_affinity is None or not issubclass( + col.type._type_affinity, + type_api.INTEGERTYPE._type_affinity): + if autoinc_true: + raise exc.ArgumentError( + "Column type %s on column '%s' is not " + "compatible with autoincrement=True" % ( + col.type, + col + )) + else: + return False + elif not isinstance(col.default, (type(None), Sequence)) and \ + not autoinc_true: + return False + elif col.server_default is not None and not autoinc_true: + return False + elif ( + col.foreign_keys and col.autoincrement + not in (True, 'ignore_fk')): + return False + return True + + if len(self.columns) == 1: + col = list(self.columns)[0] + + if col.autoincrement is True: + _validate_autoinc(col, True) + return col + elif ( + col.autoincrement in ('auto', 'ignore_fk') and + _validate_autoinc(col, False) + ): + return col + + else: + autoinc = None + for col in self.columns: + if col.autoincrement is True: + _validate_autoinc(col, True) + if autoinc is not None: + raise exc.ArgumentError( + "Only one Column may be marked " + "autoincrement=True, found both %s and %s." % + (col.name, autoinc.name) + ) + else: + autoinc = col + + return autoinc + + +class UniqueConstraint(ColumnCollectionConstraint): + """A table-level UNIQUE constraint. + + Defines a single column or composite UNIQUE constraint. For a no-frills, + single column constraint, adding ``unique=True`` to the ``Column`` + definition is a shorthand equivalent for an unnamed, single column + UniqueConstraint. + """ + + __visit_name__ = 'unique_constraint' + + +class Index(DialectKWArgs, ColumnCollectionMixin, SchemaItem): + """A table-level INDEX. + + Defines a composite (one or more column) INDEX. + + E.g.:: + + sometable = Table("sometable", metadata, + Column("name", String(50)), + Column("address", String(100)) + ) + + Index("some_index", sometable.c.name) + + For a no-frills, single column index, adding + :class:`.Column` also supports ``index=True``:: + + sometable = Table("sometable", metadata, + Column("name", String(50), index=True) + ) + + For a composite index, multiple columns can be specified:: + + Index("some_index", sometable.c.name, sometable.c.address) + + Functional indexes are supported as well, typically by using the + :data:`.func` construct in conjunction with table-bound + :class:`.Column` objects:: + + Index("some_index", func.lower(sometable.c.name)) + + .. versionadded:: 0.8 support for functional and expression-based indexes. + + An :class:`.Index` can also be manually associated with a :class:`.Table`, + either through inline declaration or using + :meth:`.Table.append_constraint`. When this approach is used, the names + of the indexed columns can be specified as strings:: + + Table("sometable", metadata, + Column("name", String(50)), + Column("address", String(100)), + Index("some_index", "name", "address") + ) + + To support functional or expression-based indexes in this form, the + :func:`.text` construct may be used:: + + from sqlalchemy import text + + Table("sometable", metadata, + Column("name", String(50)), + Column("address", String(100)), + Index("some_index", text("lower(name)")) + ) + + .. versionadded:: 0.9.5 the :func:`.text` construct may be used to + specify :class:`.Index` expressions, provided the :class:`.Index` + is explicitly associated with the :class:`.Table`. + + + .. seealso:: + + :ref:`schema_indexes` - General information on :class:`.Index`. + + :ref:`postgresql_indexes` - PostgreSQL-specific options available for + the :class:`.Index` construct. + + :ref:`mysql_indexes` - MySQL-specific options available for the + :class:`.Index` construct. + + :ref:`mssql_indexes` - MSSQL-specific options available for the + :class:`.Index` construct. + + """ + + __visit_name__ = 'index' + + def __init__(self, name, *expressions, **kw): + r"""Construct an index object. + + :param name: + The name of the index + + :param \*expressions: + Column expressions to include in the index. The expressions + are normally instances of :class:`.Column`, but may also + be arbitrary SQL expressions which ultimately refer to a + :class:`.Column`. + + :param unique=False: + Keyword only argument; if True, create a unique index. + + :param quote=None: + Keyword only argument; whether to apply quoting to the name of + the index. Works in the same manner as that of + :paramref:`.Column.quote`. + + :param info=None: Optional data dictionary which will be populated + into the :attr:`.SchemaItem.info` attribute of this object. + + .. versionadded:: 1.0.0 + + :param \**kw: Additional keyword arguments not mentioned above are + dialect specific, and passed in the form + ``_``. See the documentation regarding an + individual dialect at :ref:`dialect_toplevel` for detail on + documented arguments. + + """ + self.table = None + + columns = [] + processed_expressions = [] + for expr, column, strname, add_element in self.\ + _extract_col_expression_collection(expressions): + if add_element is not None: + columns.append(add_element) + processed_expressions.append(expr) + + self.expressions = processed_expressions + self.name = quoted_name(name, kw.pop("quote", None)) + self.unique = kw.pop('unique', False) + if 'info' in kw: + self.info = kw.pop('info') + self._validate_dialect_kwargs(kw) + + # will call _set_parent() if table-bound column + # objects are present + ColumnCollectionMixin.__init__(self, *columns) + + def _set_parent(self, table): + ColumnCollectionMixin._set_parent(self, table) + + if self.table is not None and table is not self.table: + raise exc.ArgumentError( + "Index '%s' is against table '%s', and " + "cannot be associated with table '%s'." % ( + self.name, + self.table.description, + table.description + ) + ) + self.table = table + table.indexes.add(self) + + self.expressions = [ + expr if isinstance(expr, ClauseElement) + else colexpr + for expr, colexpr in util.zip_longest(self.expressions, + self.columns) + ] + + @property + def bind(self): + """Return the connectable associated with this Index.""" + + return self.table.bind + + def create(self, bind=None): + """Issue a ``CREATE`` statement for this + :class:`.Index`, using the given :class:`.Connectable` + for connectivity. + + .. seealso:: + + :meth:`.MetaData.create_all`. + + """ + if bind is None: + bind = _bind_or_error(self) + bind._run_visitor(ddl.SchemaGenerator, self) + return self + + def drop(self, bind=None): + """Issue a ``DROP`` statement for this + :class:`.Index`, using the given :class:`.Connectable` + for connectivity. + + .. seealso:: + + :meth:`.MetaData.drop_all`. + + """ + if bind is None: + bind = _bind_or_error(self) + bind._run_visitor(ddl.SchemaDropper, self) + + def __repr__(self): + return 'Index(%s)' % ( + ", ".join( + [repr(self.name)] + + [repr(e) for e in self.expressions] + + (self.unique and ["unique=True"] or []) + )) + + +DEFAULT_NAMING_CONVENTION = util.immutabledict({ + "ix": 'ix_%(column_0_label)s' +}) + + +class MetaData(SchemaItem): + """A collection of :class:`.Table` objects and their associated schema + constructs. + + Holds a collection of :class:`.Table` objects as well as + an optional binding to an :class:`.Engine` or + :class:`.Connection`. If bound, the :class:`.Table` objects + in the collection and their columns may participate in implicit SQL + execution. + + The :class:`.Table` objects themselves are stored in the + :attr:`.MetaData.tables` dictionary. + + :class:`.MetaData` is a thread-safe object for read operations. + Construction of new tables within a single :class:`.MetaData` object, + either explicitly or via reflection, may not be completely thread-safe. + + .. seealso:: + + :ref:`metadata_describing` - Introduction to database metadata + + """ + + __visit_name__ = 'metadata' + + def __init__(self, bind=None, reflect=False, schema=None, + quote_schema=None, + naming_convention=DEFAULT_NAMING_CONVENTION, + info=None + ): + """Create a new MetaData object. + + :param bind: + An Engine or Connection to bind to. May also be a string or URL + instance, these are passed to create_engine() and this MetaData will + be bound to the resulting engine. + + :param reflect: + Optional, automatically load all tables from the bound database. + Defaults to False. ``bind`` is required when this option is set. + + .. deprecated:: 0.8 + Please use the :meth:`.MetaData.reflect` method. + + :param schema: + The default schema to use for the :class:`.Table`, + :class:`.Sequence`, and potentially other objects associated with + this :class:`.MetaData`. Defaults to ``None``. + + When this value is set, any :class:`.Table` or :class:`.Sequence` + which specifies ``None`` for the schema parameter will instead + have this schema name defined. To build a :class:`.Table` + or :class:`.Sequence` that still has ``None`` for the schema + even when this parameter is present, use the :attr:`.BLANK_SCHEMA` + symbol. + + .. seealso:: + + :paramref:`.Table.schema` + + :paramref:`.Sequence.schema` + + :param quote_schema: + Sets the ``quote_schema`` flag for those :class:`.Table`, + :class:`.Sequence`, and other objects which make usage of the + local ``schema`` name. + + :param info: Optional data dictionary which will be populated into the + :attr:`.SchemaItem.info` attribute of this object. + + .. versionadded:: 1.0.0 + + :param naming_convention: a dictionary referring to values which + will establish default naming conventions for :class:`.Constraint` + and :class:`.Index` objects, for those objects which are not given + a name explicitly. + + The keys of this dictionary may be: + + * a constraint or Index class, e.g. the :class:`.UniqueConstraint`, + :class:`.ForeignKeyConstraint` class, the :class:`.Index` class + + * a string mnemonic for one of the known constraint classes; + ``"fk"``, ``"pk"``, ``"ix"``, ``"ck"``, ``"uq"`` for foreign key, + primary key, index, check, and unique constraint, respectively. + + * the string name of a user-defined "token" that can be used + to define new naming tokens. + + The values associated with each "constraint class" or "constraint + mnemonic" key are string naming templates, such as + ``"uq_%(table_name)s_%(column_0_name)s"``, + which describe how the name should be composed. The values + associated with user-defined "token" keys should be callables of the + form ``fn(constraint, table)``, which accepts the constraint/index + object and :class:`.Table` as arguments, returning a string + result. + + The built-in names are as follows, some of which may only be + available for certain types of constraint: + + * ``%(table_name)s`` - the name of the :class:`.Table` object + associated with the constraint. + + * ``%(referred_table_name)s`` - the name of the :class:`.Table` + object associated with the referencing target of a + :class:`.ForeignKeyConstraint`. + + * ``%(column_0_name)s`` - the name of the :class:`.Column` at + index position "0" within the constraint. + + * ``%(column_0_label)s`` - the label of the :class:`.Column` at + index position "0", e.g. :attr:`.Column.label` + + * ``%(column_0_key)s`` - the key of the :class:`.Column` at + index position "0", e.g. :attr:`.Column.key` + + * ``%(referred_column_0_name)s`` - the name of a :class:`.Column` + at index position "0" referenced by a + :class:`.ForeignKeyConstraint`. + + * ``%(constraint_name)s`` - a special key that refers to the + existing name given to the constraint. When this key is + present, the :class:`.Constraint` object's existing name will be + replaced with one that is composed from template string that + uses this token. When this token is present, it is required that + the :class:`.Constraint` is given an explicit name ahead of time. + + * user-defined: any additional token may be implemented by passing + it along with a ``fn(constraint, table)`` callable to the + naming_convention dictionary. + + .. versionadded:: 0.9.2 + + .. seealso:: + + :ref:`constraint_naming_conventions` - for detailed usage + examples. + + """ + self.tables = util.immutabledict() + self.schema = quoted_name(schema, quote_schema) + self.naming_convention = naming_convention + if info: + self.info = info + self._schemas = set() + self._sequences = {} + self._fk_memos = collections.defaultdict(list) + + self.bind = bind + if reflect: + util.warn_deprecated("reflect=True is deprecate; please " + "use the reflect() method.") + if not bind: + raise exc.ArgumentError( + "A bind must be supplied in conjunction " + "with reflect=True") + self.reflect() + + tables = None + """A dictionary of :class:`.Table` objects keyed to their name or "table key". + + The exact key is that determined by the :attr:`.Table.key` attribute; + for a table with no :attr:`.Table.schema` attribute, this is the same + as :attr:`.Table.name`. For a table with a schema, it is typically of the + form ``schemaname.tablename``. + + .. seealso:: + + :attr:`.MetaData.sorted_tables` + + """ + + def __repr__(self): + return 'MetaData(bind=%r)' % self.bind + + def __contains__(self, table_or_key): + if not isinstance(table_or_key, util.string_types): + table_or_key = table_or_key.key + return table_or_key in self.tables + + def _add_table(self, name, schema, table): + key = _get_table_key(name, schema) + dict.__setitem__(self.tables, key, table) + if schema: + self._schemas.add(schema) + + def _remove_table(self, name, schema): + key = _get_table_key(name, schema) + removed = dict.pop(self.tables, key, None) + if removed is not None: + for fk in removed.foreign_keys: + fk._remove_from_metadata(self) + if self._schemas: + self._schemas = set([t.schema + for t in self.tables.values() + if t.schema is not None]) + + def __getstate__(self): + return {'tables': self.tables, + 'schema': self.schema, + 'schemas': self._schemas, + 'sequences': self._sequences, + 'fk_memos': self._fk_memos, + 'naming_convention': self.naming_convention + } + + def __setstate__(self, state): + self.tables = state['tables'] + self.schema = state['schema'] + self.naming_convention = state['naming_convention'] + self._bind = None + self._sequences = state['sequences'] + self._schemas = state['schemas'] + self._fk_memos = state['fk_memos'] + + def is_bound(self): + """True if this MetaData is bound to an Engine or Connection.""" + + return self._bind is not None + + def bind(self): + """An :class:`.Engine` or :class:`.Connection` to which this + :class:`.MetaData` is bound. + + Typically, a :class:`.Engine` is assigned to this attribute + so that "implicit execution" may be used, or alternatively + as a means of providing engine binding information to an + ORM :class:`.Session` object:: + + engine = create_engine("someurl://") + metadata.bind = engine + + .. seealso:: + + :ref:`dbengine_implicit` - background on "bound metadata" + + """ + return self._bind + + @util.dependencies("sqlalchemy.engine.url") + def _bind_to(self, url, bind): + """Bind this MetaData to an Engine, Connection, string or URL.""" + + if isinstance(bind, util.string_types + (url.URL, )): + self._bind = sqlalchemy.create_engine(bind) + else: + self._bind = bind + bind = property(bind, _bind_to) + + def clear(self): + """Clear all Table objects from this MetaData.""" + + dict.clear(self.tables) + self._schemas.clear() + self._fk_memos.clear() + + def remove(self, table): + """Remove the given Table object from this MetaData.""" + + self._remove_table(table.name, table.schema) + + @property + def sorted_tables(self): + """Returns a list of :class:`.Table` objects sorted in order of + foreign key dependency. + + The sorting will place :class:`.Table` objects that have dependencies + first, before the dependencies themselves, representing the + order in which they can be created. To get the order in which + the tables would be dropped, use the ``reversed()`` Python built-in. + + .. warning:: + + The :attr:`.sorted_tables` accessor cannot by itself accommodate + automatic resolution of dependency cycles between tables, which + are usually caused by mutually dependent foreign key constraints. + To resolve these cycles, either the + :paramref:`.ForeignKeyConstraint.use_alter` parameter may be appled + to those constraints, or use the + :func:`.schema.sort_tables_and_constraints` function which will break + out foreign key constraints involved in cycles separately. + + .. seealso:: + + :func:`.schema.sort_tables` + + :func:`.schema.sort_tables_and_constraints` + + :attr:`.MetaData.tables` + + :meth:`.Inspector.get_table_names` + + :meth:`.Inspector.get_sorted_table_and_fkc_names` + + + """ + return ddl.sort_tables(sorted(self.tables.values(), key=lambda t: t.key)) + + def reflect(self, bind=None, schema=None, views=False, only=None, + extend_existing=False, + autoload_replace=True, + **dialect_kwargs): + r"""Load all available table definitions from the database. + + Automatically creates ``Table`` entries in this ``MetaData`` for any + table available in the database but not yet present in the + ``MetaData``. May be called multiple times to pick up tables recently + added to the database, however no special action is taken if a table + in this ``MetaData`` no longer exists in the database. + + :param bind: + A :class:`.Connectable` used to access the database; if None, uses + the existing bind on this ``MetaData``, if any. + + :param schema: + Optional, query and reflect tables from an alterate schema. + If None, the schema associated with this :class:`.MetaData` + is used, if any. + + :param views: + If True, also reflect views. + + :param only: + Optional. Load only a sub-set of available named tables. May be + specified as a sequence of names or a callable. + + If a sequence of names is provided, only those tables will be + reflected. An error is raised if a table is requested but not + available. Named tables already present in this ``MetaData`` are + ignored. + + If a callable is provided, it will be used as a boolean predicate to + filter the list of potential table names. The callable is called + with a table name and this ``MetaData`` instance as positional + arguments and should return a true value for any table to reflect. + + :param extend_existing: Passed along to each :class:`.Table` as + :paramref:`.Table.extend_existing`. + + .. versionadded:: 0.9.1 + + :param autoload_replace: Passed along to each :class:`.Table` as + :paramref:`.Table.autoload_replace`. + + .. versionadded:: 0.9.1 + + :param \**dialect_kwargs: Additional keyword arguments not mentioned + above are dialect specific, and passed in the form + ``_``. See the documentation regarding an + individual dialect at :ref:`dialect_toplevel` for detail on + documented arguments. + + .. versionadded:: 0.9.2 - Added + :paramref:`.MetaData.reflect.**dialect_kwargs` to support + dialect-level reflection options for all :class:`.Table` + objects reflected. + + """ + if bind is None: + bind = _bind_or_error(self) + + with bind.connect() as conn: + + reflect_opts = { + 'autoload': True, + 'autoload_with': conn, + 'extend_existing': extend_existing, + 'autoload_replace': autoload_replace, + '_extend_on': set() + } + + reflect_opts.update(dialect_kwargs) + + if schema is None: + schema = self.schema + + if schema is not None: + reflect_opts['schema'] = schema + + available = util.OrderedSet( + bind.engine.table_names(schema, connection=conn)) + if views: + available.update( + bind.dialect.get_view_names(conn, schema) + ) + + if schema is not None: + available_w_schema = util.OrderedSet(["%s.%s" % (schema, name) + for name in available]) + else: + available_w_schema = available + + current = set(self.tables) + + if only is None: + load = [name for name, schname in + zip(available, available_w_schema) + if extend_existing or schname not in current] + elif util.callable(only): + load = [name for name, schname in + zip(available, available_w_schema) + if (extend_existing or schname not in current) + and only(name, self)] + else: + missing = [name for name in only if name not in available] + if missing: + s = schema and (" schema '%s'" % schema) or '' + raise exc.InvalidRequestError( + 'Could not reflect: requested table(s) not available ' + 'in %r%s: (%s)' % + (bind.engine, s, ', '.join(missing))) + load = [name for name in only if extend_existing or + name not in current] + + for name in load: + Table(name, self, **reflect_opts) + + def append_ddl_listener(self, event_name, listener): + """Append a DDL event listener to this ``MetaData``. + + .. deprecated:: 0.7 + See :class:`.DDLEvents`. + + """ + def adapt_listener(target, connection, **kw): + tables = kw['tables'] + listener(event, target, connection, tables=tables) + + event.listen(self, "" + event_name.replace('-', '_'), adapt_listener) + + def create_all(self, bind=None, tables=None, checkfirst=True): + """Create all tables stored in this metadata. + + Conditional by default, will not attempt to recreate tables already + present in the target database. + + :param bind: + A :class:`.Connectable` used to access the + database; if None, uses the existing bind on this ``MetaData``, if + any. + + :param tables: + Optional list of ``Table`` objects, which is a subset of the total + tables in the ``MetaData`` (others are ignored). + + :param checkfirst: + Defaults to True, don't issue CREATEs for tables already present + in the target database. + + """ + if bind is None: + bind = _bind_or_error(self) + bind._run_visitor(ddl.SchemaGenerator, + self, + checkfirst=checkfirst, + tables=tables) + + def drop_all(self, bind=None, tables=None, checkfirst=True): + """Drop all tables stored in this metadata. + + Conditional by default, will not attempt to drop tables not present in + the target database. + + :param bind: + A :class:`.Connectable` used to access the + database; if None, uses the existing bind on this ``MetaData``, if + any. + + :param tables: + Optional list of ``Table`` objects, which is a subset of the + total tables in the ``MetaData`` (others are ignored). + + :param checkfirst: + Defaults to True, only issue DROPs for tables confirmed to be + present in the target database. + + """ + if bind is None: + bind = _bind_or_error(self) + bind._run_visitor(ddl.SchemaDropper, + self, + checkfirst=checkfirst, + tables=tables) + + +class ThreadLocalMetaData(MetaData): + """A MetaData variant that presents a different ``bind`` in every thread. + + Makes the ``bind`` property of the MetaData a thread-local value, allowing + this collection of tables to be bound to different ``Engine`` + implementations or connections in each thread. + + The ThreadLocalMetaData starts off bound to None in each thread. Binds + must be made explicitly by assigning to the ``bind`` property or using + ``connect()``. You can also re-bind dynamically multiple times per + thread, just like a regular ``MetaData``. + + """ + + __visit_name__ = 'metadata' + + def __init__(self): + """Construct a ThreadLocalMetaData.""" + + self.context = util.threading.local() + self.__engines = {} + super(ThreadLocalMetaData, self).__init__() + + def bind(self): + """The bound Engine or Connection for this thread. + + This property may be assigned an Engine or Connection, or assigned a + string or URL to automatically create a basic Engine for this bind + with ``create_engine()``.""" + + return getattr(self.context, '_engine', None) + + @util.dependencies("sqlalchemy.engine.url") + def _bind_to(self, url, bind): + """Bind to a Connectable in the caller's thread.""" + + if isinstance(bind, util.string_types + (url.URL, )): + try: + self.context._engine = self.__engines[bind] + except KeyError: + e = sqlalchemy.create_engine(bind) + self.__engines[bind] = e + self.context._engine = e + else: + # TODO: this is squirrely. we shouldn't have to hold onto engines + # in a case like this + if bind not in self.__engines: + self.__engines[bind] = bind + self.context._engine = bind + + bind = property(bind, _bind_to) + + def is_bound(self): + """True if there is a bind for this thread.""" + return (hasattr(self.context, '_engine') and + self.context._engine is not None) + + def dispose(self): + """Dispose all bound engines, in all thread contexts.""" + + for e in self.__engines.values(): + if hasattr(e, 'dispose'): + e.dispose() + + +class _SchemaTranslateMap(object): + """Provide translation of schema names based on a mapping. + + Also provides helpers for producing cache keys and optimized + access when no mapping is present. + + Used by the :paramref:`.Connection.execution_options.schema_translate_map` + feature. + + .. versionadded:: 1.1 + + + """ + __slots__ = 'map_', '__call__', 'hash_key', 'is_default' + + _default_schema_getter = operator.attrgetter("schema") + + def __init__(self, map_): + self.map_ = map_ + if map_ is not None: + def schema_for_object(obj): + effective_schema = self._default_schema_getter(obj) + effective_schema = obj._translate_schema( + effective_schema, map_) + return effective_schema + self.__call__ = schema_for_object + self.hash_key = ";".join( + "%s=%s" % (k, map_[k]) + for k in sorted(map_, key=str) + ) + self.is_default = False + else: + self.hash_key = 0 + self.__call__ = self._default_schema_getter + self.is_default = True + + @classmethod + def _schema_getter(cls, map_): + if map_ is None: + return _default_schema_map + elif isinstance(map_, _SchemaTranslateMap): + return map_ + else: + return _SchemaTranslateMap(map_) + +_default_schema_map = _SchemaTranslateMap(None) +_schema_getter = _SchemaTranslateMap._schema_getter + diff --git a/app/lib/sqlalchemy/sql/selectable.py b/app/lib/sqlalchemy/sql/selectable.py new file mode 100644 index 0000000..b69d667 --- /dev/null +++ b/app/lib/sqlalchemy/sql/selectable.py @@ -0,0 +1,3716 @@ +# sql/selectable.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""The :class:`.FromClause` class of SQL expression elements, representing +SQL tables and derived rowsets. + +""" + +from .elements import ClauseElement, TextClause, ClauseList, \ + and_, Grouping, UnaryExpression, literal_column, BindParameter +from .elements import _clone, \ + _literal_as_text, _interpret_as_column_or_from, _expand_cloned,\ + _select_iterables, _anonymous_label, _clause_element_as_expr,\ + _cloned_intersection, _cloned_difference, True_, \ + _literal_as_label_reference, _literal_and_labels_as_label_reference +from .base import Immutable, Executable, _generative, \ + ColumnCollection, ColumnSet, _from_objects, Generative +from . import type_api +from .. import inspection +from .. import util +from .. import exc +from operator import attrgetter +from . import operators +import operator +import collections +from .annotation import Annotated +import itertools +from sqlalchemy.sql.visitors import Visitable + + +def _interpret_as_from(element): + insp = inspection.inspect(element, raiseerr=False) + if insp is None: + if isinstance(element, util.string_types): + util.warn_limited( + "Textual SQL FROM expression %(expr)r should be " + "explicitly declared as text(%(expr)r), " + "or use table(%(expr)r) for more specificity", + {"expr": util.ellipses_string(element)}) + + return TextClause(util.text_type(element)) + try: + return insp.selectable + except AttributeError: + raise exc.ArgumentError("FROM expression expected") + + +def _interpret_as_select(element): + element = _interpret_as_from(element) + if isinstance(element, Alias): + element = element.original + if not isinstance(element, SelectBase): + element = element.select() + return element + + +class _OffsetLimitParam(BindParameter): + @property + def _limit_offset_value(self): + return self.effective_value + + +def _offset_or_limit_clause(element, name=None, type_=None): + """Convert the given value to an "offset or limit" clause. + + This handles incoming integers and converts to an expression; if + an expression is already given, it is passed through. + + """ + if element is None: + return None + elif hasattr(element, '__clause_element__'): + return element.__clause_element__() + elif isinstance(element, Visitable): + return element + else: + value = util.asint(element) + return _OffsetLimitParam(name, value, type_=type_, unique=True) + + +def _offset_or_limit_clause_asint(clause, attrname): + """Convert the "offset or limit" clause of a select construct to an + integer. + + This is only possible if the value is stored as a simple bound parameter. + Otherwise, a compilation error is raised. + + """ + if clause is None: + return None + try: + value = clause._limit_offset_value + except AttributeError: + raise exc.CompileError( + "This SELECT structure does not use a simple " + "integer value for %s" % attrname) + else: + return util.asint(value) + + +def subquery(alias, *args, **kwargs): + r"""Return an :class:`.Alias` object derived + from a :class:`.Select`. + + name + alias name + + \*args, \**kwargs + + all other arguments are delivered to the + :func:`select` function. + + """ + return Select(*args, **kwargs).alias(alias) + + +def alias(selectable, name=None, flat=False): + """Return an :class:`.Alias` object. + + An :class:`.Alias` represents any :class:`.FromClause` + with an alternate name assigned within SQL, typically using the ``AS`` + clause when generated, e.g. ``SELECT * FROM table AS aliasname``. + + Similar functionality is available via the + :meth:`~.FromClause.alias` method + available on all :class:`.FromClause` subclasses. + + When an :class:`.Alias` is created from a :class:`.Table` object, + this has the effect of the table being rendered + as ``tablename AS aliasname`` in a SELECT statement. + + For :func:`.select` objects, the effect is that of creating a named + subquery, i.e. ``(select ...) AS aliasname``. + + The ``name`` parameter is optional, and provides the name + to use in the rendered SQL. If blank, an "anonymous" name + will be deterministically generated at compile time. + Deterministic means the name is guaranteed to be unique against + other constructs used in the same statement, and will also be the + same name for each successive compilation of the same statement + object. + + :param selectable: any :class:`.FromClause` subclass, + such as a table, select statement, etc. + + :param name: string name to be assigned as the alias. + If ``None``, a name will be deterministically generated + at compile time. + + :param flat: Will be passed through to if the given selectable + is an instance of :class:`.Join` - see :meth:`.Join.alias` + for details. + + .. versionadded:: 0.9.0 + + """ + return _interpret_as_from(selectable).alias(name=name, flat=flat) + + +def lateral(selectable, name=None): + """Return a :class:`.Lateral` object. + + :class:`.Lateral` is an :class:`.Alias` subclass that represents + a subquery with the LATERAL keyword applied to it. + + The special behavior of a LATERAL subquery is that it appears in the + FROM clause of an enclosing SELECT, but may correlate to other + FROM clauses of that SELECT. It is a special case of subquery + only supported by a small number of backends, currently more recent + PostgreSQL versions. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`lateral_selects` - overview of usage. + + """ + return _interpret_as_from(selectable).lateral(name=name) + + +def tablesample(selectable, sampling, name=None, seed=None): + """Return a :class:`.TableSample` object. + + :class:`.TableSample` is an :class:`.Alias` subclass that represents + a table with the TABLESAMPLE clause applied to it. + :func:`~.expression.tablesample` + is also available from the :class:`.FromClause` class via the + :meth:`.FromClause.tablesample` method. + + The TABLESAMPLE clause allows selecting a randomly selected approximate + percentage of rows from a table. It supports multiple sampling methods, + most commonly BERNOULLI and SYSTEM. + + e.g.:: + + from sqlalchemy import func + + selectable = people.tablesample( + func.bernoulli(1), + name='alias', + seed=func.random()) + stmt = select([selectable.c.people_id]) + + Assuming ``people`` with a column ``people_id``, the above + statement would render as:: + + SELECT alias.people_id FROM + people AS alias TABLESAMPLE bernoulli(:bernoulli_1) + REPEATABLE (random()) + + .. versionadded:: 1.1 + + :param sampling: a ``float`` percentage between 0 and 100 or + :class:`.functions.Function`. + + :param name: optional alias name + + :param seed: any real-valued SQL expression. When specified, the + REPEATABLE sub-clause is also rendered. + + """ + return _interpret_as_from(selectable).tablesample( + sampling, name=name, seed=seed) + + +class Selectable(ClauseElement): + """mark a class as being selectable""" + __visit_name__ = 'selectable' + + is_selectable = True + + @property + def selectable(self): + return self + + +class HasPrefixes(object): + _prefixes = () + + @_generative + def prefix_with(self, *expr, **kw): + r"""Add one or more expressions following the statement keyword, i.e. + SELECT, INSERT, UPDATE, or DELETE. Generative. + + This is used to support backend-specific prefix keywords such as those + provided by MySQL. + + E.g.:: + + stmt = table.insert().prefix_with("LOW_PRIORITY", dialect="mysql") + + Multiple prefixes can be specified by multiple calls + to :meth:`.prefix_with`. + + :param \*expr: textual or :class:`.ClauseElement` construct which + will be rendered following the INSERT, UPDATE, or DELETE + keyword. + :param \**kw: A single keyword 'dialect' is accepted. This is an + optional string dialect name which will + limit rendering of this prefix to only that dialect. + + """ + dialect = kw.pop('dialect', None) + if kw: + raise exc.ArgumentError("Unsupported argument(s): %s" % + ",".join(kw)) + self._setup_prefixes(expr, dialect) + + def _setup_prefixes(self, prefixes, dialect=None): + self._prefixes = self._prefixes + tuple( + [(_literal_as_text(p, warn=False), dialect) for p in prefixes]) + + +class HasSuffixes(object): + _suffixes = () + + @_generative + def suffix_with(self, *expr, **kw): + r"""Add one or more expressions following the statement as a whole. + + This is used to support backend-specific suffix keywords on + certain constructs. + + E.g.:: + + stmt = select([col1, col2]).cte().suffix_with( + "cycle empno set y_cycle to 1 default 0", dialect="oracle") + + Multiple suffixes can be specified by multiple calls + to :meth:`.suffix_with`. + + :param \*expr: textual or :class:`.ClauseElement` construct which + will be rendered following the target clause. + :param \**kw: A single keyword 'dialect' is accepted. This is an + optional string dialect name which will + limit rendering of this suffix to only that dialect. + + """ + dialect = kw.pop('dialect', None) + if kw: + raise exc.ArgumentError("Unsupported argument(s): %s" % + ",".join(kw)) + self._setup_suffixes(expr, dialect) + + def _setup_suffixes(self, suffixes, dialect=None): + self._suffixes = self._suffixes + tuple( + [(_literal_as_text(p, warn=False), dialect) for p in suffixes]) + + +class FromClause(Selectable): + """Represent an element that can be used within the ``FROM`` + clause of a ``SELECT`` statement. + + The most common forms of :class:`.FromClause` are the + :class:`.Table` and the :func:`.select` constructs. Key + features common to all :class:`.FromClause` objects include: + + * a :attr:`.c` collection, which provides per-name access to a collection + of :class:`.ColumnElement` objects. + * a :attr:`.primary_key` attribute, which is a collection of all those + :class:`.ColumnElement` objects that indicate the ``primary_key`` flag. + * Methods to generate various derivations of a "from" clause, including + :meth:`.FromClause.alias`, :meth:`.FromClause.join`, + :meth:`.FromClause.select`. + + + """ + __visit_name__ = 'fromclause' + named_with_column = False + _hide_froms = [] + + _is_join = False + _is_select = False + _is_from_container = False + + _textual = False + """a marker that allows us to easily distinguish a :class:`.TextAsFrom` + or similar object from other kinds of :class:`.FromClause` objects.""" + + schema = None + """Define the 'schema' attribute for this :class:`.FromClause`. + + This is typically ``None`` for most objects except that of + :class:`.Table`, where it is taken as the value of the + :paramref:`.Table.schema` argument. + + """ + + def _translate_schema(self, effective_schema, map_): + return effective_schema + + _memoized_property = util.group_expirable_memoized_property(["_columns"]) + + @util.deprecated( + '1.1', + message="``FromClause.count()`` is deprecated. Counting " + "rows requires that the correct column expression and " + "accommodations for joins, DISTINCT, etc. must be made, " + "otherwise results may not be what's expected. " + "Please use an appropriate ``func.count()`` expression " + "directly.") + @util.dependencies("sqlalchemy.sql.functions") + def count(self, functions, whereclause=None, **params): + """return a SELECT COUNT generated against this + :class:`.FromClause`. + + The function generates COUNT against the + first column in the primary key of the table, or against + the first column in the table overall. Explicit use of + ``func.count()`` should be preferred:: + + row_count = conn.scalar( + select([func.count('*')]).select_from(table) + ) + + + .. seealso:: + + :data:`.func` + + """ + + if self.primary_key: + col = list(self.primary_key)[0] + else: + col = list(self.columns)[0] + return Select( + [functions.func.count(col).label('tbl_row_count')], + whereclause, + from_obj=[self], + **params) + + def select(self, whereclause=None, **params): + """return a SELECT of this :class:`.FromClause`. + + .. seealso:: + + :func:`~.sql.expression.select` - general purpose + method which allows for arbitrary column lists. + + """ + + return Select([self], whereclause, **params) + + def join(self, right, onclause=None, isouter=False, full=False): + """Return a :class:`.Join` from this :class:`.FromClause` + to another :class:`FromClause`. + + E.g.:: + + from sqlalchemy import join + + j = user_table.join(address_table, + user_table.c.id == address_table.c.user_id) + stmt = select([user_table]).select_from(j) + + would emit SQL along the lines of:: + + SELECT user.id, user.name FROM user + JOIN address ON user.id = address.user_id + + :param right: the right side of the join; this is any + :class:`.FromClause` object such as a :class:`.Table` object, and + may also be a selectable-compatible object such as an ORM-mapped + class. + + :param onclause: a SQL expression representing the ON clause of the + join. If left at ``None``, :meth:`.FromClause.join` will attempt to + join the two tables based on a foreign key relationship. + + :param isouter: if True, render a LEFT OUTER JOIN, instead of JOIN. + + :param full: if True, render a FULL OUTER JOIN, instead of LEFT OUTER + JOIN. Implies :paramref:`.FromClause.join.isouter`. + + .. versionadded:: 1.1 + + .. seealso:: + + :func:`.join` - standalone function + + :class:`.Join` - the type of object produced + + """ + + return Join(self, right, onclause, isouter, full) + + def outerjoin(self, right, onclause=None, full=False): + """Return a :class:`.Join` from this :class:`.FromClause` + to another :class:`FromClause`, with the "isouter" flag set to + True. + + E.g.:: + + from sqlalchemy import outerjoin + + j = user_table.outerjoin(address_table, + user_table.c.id == address_table.c.user_id) + + The above is equivalent to:: + + j = user_table.join( + address_table, + user_table.c.id == address_table.c.user_id, + isouter=True) + + :param right: the right side of the join; this is any + :class:`.FromClause` object such as a :class:`.Table` object, and + may also be a selectable-compatible object such as an ORM-mapped + class. + + :param onclause: a SQL expression representing the ON clause of the + join. If left at ``None``, :meth:`.FromClause.join` will attempt to + join the two tables based on a foreign key relationship. + + :param full: if True, render a FULL OUTER JOIN, instead of + LEFT OUTER JOIN. + + .. versionadded:: 1.1 + + .. seealso:: + + :meth:`.FromClause.join` + + :class:`.Join` + + """ + + return Join(self, right, onclause, True, full) + + def alias(self, name=None, flat=False): + """return an alias of this :class:`.FromClause`. + + This is shorthand for calling:: + + from sqlalchemy import alias + a = alias(self, name=name) + + See :func:`~.expression.alias` for details. + + """ + + return Alias(self, name) + + def lateral(self, name=None): + """Return a LATERAL alias of this :class:`.FromClause`. + + The return value is the :class:`.Lateral` construct also + provided by the top-level :func:`~.expression.lateral` function. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`lateral_selects` - overview of usage. + + """ + return Lateral(self, name) + + def tablesample(self, sampling, name=None, seed=None): + """Return a TABLESAMPLE alias of this :class:`.FromClause`. + + The return value is the :class:`.TableSample` construct also + provided by the top-level :func:`~.expression.tablesample` function. + + .. versionadded:: 1.1 + + .. seealso:: + + :func:`~.expression.tablesample` - usage guidelines and parameters + + """ + return TableSample(self, sampling, name, seed) + + def is_derived_from(self, fromclause): + """Return True if this FromClause is 'derived' from the given + FromClause. + + An example would be an Alias of a Table is derived from that Table. + + """ + # this is essentially an "identity" check in the base class. + # Other constructs override this to traverse through + # contained elements. + return fromclause in self._cloned_set + + def _is_lexical_equivalent(self, other): + """Return True if this FromClause and the other represent + the same lexical identity. + + This tests if either one is a copy of the other, or + if they are the same via annotation identity. + + """ + return self._cloned_set.intersection(other._cloned_set) + + @util.dependencies("sqlalchemy.sql.util") + def replace_selectable(self, sqlutil, old, alias): + """replace all occurrences of FromClause 'old' with the given Alias + object, returning a copy of this :class:`.FromClause`. + + """ + + return sqlutil.ClauseAdapter(alias).traverse(self) + + def correspond_on_equivalents(self, column, equivalents): + """Return corresponding_column for the given column, or if None + search for a match in the given dictionary. + + """ + col = self.corresponding_column(column, require_embedded=True) + if col is None and col in equivalents: + for equiv in equivalents[col]: + nc = self.corresponding_column(equiv, require_embedded=True) + if nc: + return nc + return col + + def corresponding_column(self, column, require_embedded=False): + """Given a :class:`.ColumnElement`, return the exported + :class:`.ColumnElement` object from this :class:`.Selectable` + which corresponds to that original + :class:`~sqlalchemy.schema.Column` via a common ancestor + column. + + :param column: the target :class:`.ColumnElement` to be matched + + :param require_embedded: only return corresponding columns for + the given :class:`.ColumnElement`, if the given + :class:`.ColumnElement` is actually present within a sub-element + of this :class:`.FromClause`. Normally the column will match if + it merely shares a common ancestor with one of the exported + columns of this :class:`.FromClause`. + + """ + + def embedded(expanded_proxy_set, target_set): + for t in target_set.difference(expanded_proxy_set): + if not set(_expand_cloned([t]) + ).intersection(expanded_proxy_set): + return False + return True + + # don't dig around if the column is locally present + if self.c.contains_column(column): + return column + col, intersect = None, None + target_set = column.proxy_set + cols = self.c._all_columns + for c in cols: + expanded_proxy_set = set(_expand_cloned(c.proxy_set)) + i = target_set.intersection(expanded_proxy_set) + if i and (not require_embedded + or embedded(expanded_proxy_set, target_set)): + if col is None: + + # no corresponding column yet, pick this one. + + col, intersect = c, i + elif len(i) > len(intersect): + + # 'c' has a larger field of correspondence than + # 'col'. i.e. selectable.c.a1_x->a1.c.x->table.c.x + # matches a1.c.x->table.c.x better than + # selectable.c.x->table.c.x does. + + col, intersect = c, i + elif i == intersect: + + # they have the same field of correspondence. see + # which proxy_set has fewer columns in it, which + # indicates a closer relationship with the root + # column. Also take into account the "weight" + # attribute which CompoundSelect() uses to give + # higher precedence to columns based on vertical + # position in the compound statement, and discard + # columns that have no reference to the target + # column (also occurs with CompoundSelect) + + col_distance = util.reduce( + operator.add, + [sc._annotations.get('weight', 1) for sc in + col.proxy_set if sc.shares_lineage(column)]) + c_distance = util.reduce( + operator.add, + [sc._annotations.get('weight', 1) for sc in + c.proxy_set if sc.shares_lineage(column)]) + if c_distance < col_distance: + col, intersect = c, i + return col + + @property + def description(self): + """a brief description of this FromClause. + + Used primarily for error message formatting. + + """ + return getattr(self, 'name', self.__class__.__name__ + " object") + + def _reset_exported(self): + """delete memoized collections when a FromClause is cloned.""" + + self._memoized_property.expire_instance(self) + + @_memoized_property + def columns(self): + """A named-based collection of :class:`.ColumnElement` objects + maintained by this :class:`.FromClause`. + + The :attr:`.columns`, or :attr:`.c` collection, is the gateway + to the construction of SQL expressions using table-bound or + other selectable-bound columns:: + + select([mytable]).where(mytable.c.somecolumn == 5) + + """ + + if '_columns' not in self.__dict__: + self._init_collections() + self._populate_column_collection() + return self._columns.as_immutable() + + @_memoized_property + def primary_key(self): + """Return the collection of Column objects which comprise the + primary key of this FromClause.""" + + self._init_collections() + self._populate_column_collection() + return self.primary_key + + @_memoized_property + def foreign_keys(self): + """Return the collection of ForeignKey objects which this + FromClause references.""" + + self._init_collections() + self._populate_column_collection() + return self.foreign_keys + + c = property(attrgetter('columns'), + doc="An alias for the :attr:`.columns` attribute.") + _select_iterable = property(attrgetter('columns')) + + def _init_collections(self): + assert '_columns' not in self.__dict__ + assert 'primary_key' not in self.__dict__ + assert 'foreign_keys' not in self.__dict__ + + self._columns = ColumnCollection() + self.primary_key = ColumnSet() + self.foreign_keys = set() + + @property + def _cols_populated(self): + return '_columns' in self.__dict__ + + def _populate_column_collection(self): + """Called on subclasses to establish the .c collection. + + Each implementation has a different way of establishing + this collection. + + """ + + def _refresh_for_new_column(self, column): + """Given a column added to the .c collection of an underlying + selectable, produce the local version of that column, assuming this + selectable ultimately should proxy this column. + + this is used to "ping" a derived selectable to add a new column + to its .c. collection when a Column has been added to one of the + Table objects it ultimtely derives from. + + If the given selectable hasn't populated its .c. collection yet, + it should at least pass on the message to the contained selectables, + but it will return None. + + This method is currently used by Declarative to allow Table + columns to be added to a partially constructed inheritance + mapping that may have already produced joins. The method + isn't public right now, as the full span of implications + and/or caveats aren't yet clear. + + It's also possible that this functionality could be invoked by + default via an event, which would require that + selectables maintain a weak referencing collection of all + derivations. + + """ + if not self._cols_populated: + return None + elif (column.key in self.columns and + self.columns[column.key] is column): + return column + else: + return None + + +class Join(FromClause): + """represent a ``JOIN`` construct between two :class:`.FromClause` + elements. + + The public constructor function for :class:`.Join` is the module-level + :func:`.join()` function, as well as the :meth:`.FromClause.join` method + of any :class:`.FromClause` (e.g. such as :class:`.Table`). + + .. seealso:: + + :func:`.join` + + :meth:`.FromClause.join` + + """ + __visit_name__ = 'join' + + _is_join = True + + def __init__(self, left, right, onclause=None, isouter=False, full=False): + """Construct a new :class:`.Join`. + + The usual entrypoint here is the :func:`~.expression.join` + function or the :meth:`.FromClause.join` method of any + :class:`.FromClause` object. + + """ + self.left = _interpret_as_from(left) + self.right = _interpret_as_from(right).self_group() + + if onclause is None: + self.onclause = self._match_primaries(self.left, self.right) + else: + self.onclause = onclause + + self.isouter = isouter + self.full = full + + @classmethod + def _create_outerjoin(cls, left, right, onclause=None, full=False): + """Return an ``OUTER JOIN`` clause element. + + The returned object is an instance of :class:`.Join`. + + Similar functionality is also available via the + :meth:`~.FromClause.outerjoin()` method on any + :class:`.FromClause`. + + :param left: The left side of the join. + + :param right: The right side of the join. + + :param onclause: Optional criterion for the ``ON`` clause, is + derived from foreign key relationships established between + left and right otherwise. + + To chain joins together, use the :meth:`.FromClause.join` or + :meth:`.FromClause.outerjoin` methods on the resulting + :class:`.Join` object. + + """ + return cls(left, right, onclause, isouter=True, full=full) + + @classmethod + def _create_join(cls, left, right, onclause=None, isouter=False, + full=False): + """Produce a :class:`.Join` object, given two :class:`.FromClause` + expressions. + + E.g.:: + + j = join(user_table, address_table, + user_table.c.id == address_table.c.user_id) + stmt = select([user_table]).select_from(j) + + would emit SQL along the lines of:: + + SELECT user.id, user.name FROM user + JOIN address ON user.id = address.user_id + + Similar functionality is available given any + :class:`.FromClause` object (e.g. such as a :class:`.Table`) using + the :meth:`.FromClause.join` method. + + :param left: The left side of the join. + + :param right: the right side of the join; this is any + :class:`.FromClause` object such as a :class:`.Table` object, and + may also be a selectable-compatible object such as an ORM-mapped + class. + + :param onclause: a SQL expression representing the ON clause of the + join. If left at ``None``, :meth:`.FromClause.join` will attempt to + join the two tables based on a foreign key relationship. + + :param isouter: if True, render a LEFT OUTER JOIN, instead of JOIN. + + :param full: if True, render a FULL OUTER JOIN, instead of JOIN. + + .. versionadded:: 1.1 + + .. seealso:: + + :meth:`.FromClause.join` - method form, based on a given left side + + :class:`.Join` - the type of object produced + + """ + + return cls(left, right, onclause, isouter, full) + + @property + def description(self): + return "Join object on %s(%d) and %s(%d)" % ( + self.left.description, + id(self.left), + self.right.description, + id(self.right)) + + def is_derived_from(self, fromclause): + return fromclause is self or \ + self.left.is_derived_from(fromclause) or \ + self.right.is_derived_from(fromclause) + + def self_group(self, against=None): + return FromGrouping(self) + + @util.dependencies("sqlalchemy.sql.util") + def _populate_column_collection(self, sqlutil): + columns = [c for c in self.left.columns] + \ + [c for c in self.right.columns] + + self.primary_key.extend(sqlutil.reduce_columns( + (c for c in columns if c.primary_key), self.onclause)) + self._columns.update((col._label, col) for col in columns) + self.foreign_keys.update(itertools.chain( + *[col.foreign_keys for col in columns])) + + def _refresh_for_new_column(self, column): + col = self.left._refresh_for_new_column(column) + if col is None: + col = self.right._refresh_for_new_column(column) + if col is not None: + if self._cols_populated: + self._columns[col._label] = col + self.foreign_keys.update(col.foreign_keys) + if col.primary_key: + self.primary_key.add(col) + return col + return None + + def _copy_internals(self, clone=_clone, **kw): + self._reset_exported() + self.left = clone(self.left, **kw) + self.right = clone(self.right, **kw) + self.onclause = clone(self.onclause, **kw) + + def get_children(self, **kwargs): + return self.left, self.right, self.onclause + + def _match_primaries(self, left, right): + if isinstance(left, Join): + left_right = left.right + else: + left_right = None + return self._join_condition(left, right, a_subset=left_right) + + @classmethod + def _join_condition(cls, a, b, ignore_nonexistent_tables=False, + a_subset=None, + consider_as_foreign_keys=None): + """create a join condition between two tables or selectables. + + e.g.:: + + join_condition(tablea, tableb) + + would produce an expression along the lines of:: + + tablea.c.id==tableb.c.tablea_id + + The join is determined based on the foreign key relationships + between the two selectables. If there are multiple ways + to join, or no way to join, an error is raised. + + :param ignore_nonexistent_tables: Deprecated - this + flag is no longer used. Only resolution errors regarding + the two given tables are propagated. + + :param a_subset: An optional expression that is a sub-component + of ``a``. An attempt will be made to join to just this sub-component + first before looking at the full ``a`` construct, and if found + will be successful even if there are other ways to join to ``a``. + This allows the "right side" of a join to be passed thereby + providing a "natural join". + + """ + constraints = cls._joincond_scan_left_right( + a, a_subset, b, consider_as_foreign_keys) + + if len(constraints) > 1: + cls._joincond_trim_constraints( + a, b, constraints, consider_as_foreign_keys) + + if len(constraints) == 0: + if isinstance(b, FromGrouping): + hint = " Perhaps you meant to convert the right side to a "\ + "subquery using alias()?" + else: + hint = "" + raise exc.NoForeignKeysError( + "Can't find any foreign key relationships " + "between '%s' and '%s'.%s" % + (a.description, b.description, hint)) + + crit = [(x == y) for x, y in list(constraints.values())[0]] + if len(crit) == 1: + return (crit[0]) + else: + return and_(*crit) + + @classmethod + def _joincond_scan_left_right( + cls, a, a_subset, b, consider_as_foreign_keys): + constraints = collections.defaultdict(list) + + for left in (a_subset, a): + if left is None: + continue + for fk in sorted( + b.foreign_keys, + key=lambda fk: fk.parent._creation_order): + if consider_as_foreign_keys is not None and \ + fk.parent not in consider_as_foreign_keys: + continue + try: + col = fk.get_referent(left) + except exc.NoReferenceError as nrte: + if nrte.table_name == left.name: + raise + else: + continue + + if col is not None: + constraints[fk.constraint].append((col, fk.parent)) + if left is not b: + for fk in sorted( + left.foreign_keys, + key=lambda fk: fk.parent._creation_order): + if consider_as_foreign_keys is not None and \ + fk.parent not in consider_as_foreign_keys: + continue + try: + col = fk.get_referent(b) + except exc.NoReferenceError as nrte: + if nrte.table_name == b.name: + raise + else: + continue + + if col is not None: + constraints[fk.constraint].append((col, fk.parent)) + if constraints: + break + return constraints + + @classmethod + def _joincond_trim_constraints( + cls, a, b, constraints, consider_as_foreign_keys): + # more than one constraint matched. narrow down the list + # to include just those FKCs that match exactly to + # "consider_as_foreign_keys". + if consider_as_foreign_keys: + for const in list(constraints): + if set(f.parent for f in const.elements) != set( + consider_as_foreign_keys): + del constraints[const] + + # if still multiple constraints, but + # they all refer to the exact same end result, use it. + if len(constraints) > 1: + dedupe = set(tuple(crit) for crit in constraints.values()) + if len(dedupe) == 1: + key = list(constraints)[0] + constraints = {key: constraints[key]} + + if len(constraints) != 1: + raise exc.AmbiguousForeignKeysError( + "Can't determine join between '%s' and '%s'; " + "tables have more than one foreign key " + "constraint relationship between them. " + "Please specify the 'onclause' of this " + "join explicitly." % (a.description, b.description)) + + def select(self, whereclause=None, **kwargs): + r"""Create a :class:`.Select` from this :class:`.Join`. + + The equivalent long-hand form, given a :class:`.Join` object + ``j``, is:: + + from sqlalchemy import select + j = select([j.left, j.right], **kw).\ + where(whereclause).\ + select_from(j) + + :param whereclause: the WHERE criterion that will be sent to + the :func:`select()` function + + :param \**kwargs: all other kwargs are sent to the + underlying :func:`select()` function. + + """ + collist = [self.left, self.right] + + return Select(collist, whereclause, from_obj=[self], **kwargs) + + @property + def bind(self): + return self.left.bind or self.right.bind + + @util.dependencies("sqlalchemy.sql.util") + def alias(self, sqlutil, name=None, flat=False): + r"""return an alias of this :class:`.Join`. + + The default behavior here is to first produce a SELECT + construct from this :class:`.Join`, then to produce an + :class:`.Alias` from that. So given a join of the form:: + + j = table_a.join(table_b, table_a.c.id == table_b.c.a_id) + + The JOIN by itself would look like:: + + table_a JOIN table_b ON table_a.id = table_b.a_id + + Whereas the alias of the above, ``j.alias()``, would in a + SELECT context look like:: + + (SELECT table_a.id AS table_a_id, table_b.id AS table_b_id, + table_b.a_id AS table_b_a_id + FROM table_a + JOIN table_b ON table_a.id = table_b.a_id) AS anon_1 + + The equivalent long-hand form, given a :class:`.Join` object + ``j``, is:: + + from sqlalchemy import select, alias + j = alias( + select([j.left, j.right]).\ + select_from(j).\ + with_labels(True).\ + correlate(False), + name=name + ) + + The selectable produced by :meth:`.Join.alias` features the same + columns as that of the two individual selectables presented under + a single name - the individual columns are "auto-labeled", meaning + the ``.c.`` collection of the resulting :class:`.Alias` represents + the names of the individual columns using a + ``_`` scheme:: + + j.c.table_a_id + j.c.table_b_a_id + + :meth:`.Join.alias` also features an alternate + option for aliasing joins which produces no enclosing SELECT and + does not normally apply labels to the column names. The + ``flat=True`` option will call :meth:`.FromClause.alias` + against the left and right sides individually. + Using this option, no new ``SELECT`` is produced; + we instead, from a construct as below:: + + j = table_a.join(table_b, table_a.c.id == table_b.c.a_id) + j = j.alias(flat=True) + + we get a result like this:: + + table_a AS table_a_1 JOIN table_b AS table_b_1 ON + table_a_1.id = table_b_1.a_id + + The ``flat=True`` argument is also propagated to the contained + selectables, so that a composite join such as:: + + j = table_a.join( + table_b.join(table_c, + table_b.c.id == table_c.c.b_id), + table_b.c.a_id == table_a.c.id + ).alias(flat=True) + + Will produce an expression like:: + + table_a AS table_a_1 JOIN ( + table_b AS table_b_1 JOIN table_c AS table_c_1 + ON table_b_1.id = table_c_1.b_id + ) ON table_a_1.id = table_b_1.a_id + + The standalone :func:`~.expression.alias` function as well as the + base :meth:`.FromClause.alias` method also support the ``flat=True`` + argument as a no-op, so that the argument can be passed to the + ``alias()`` method of any selectable. + + .. versionadded:: 0.9.0 Added the ``flat=True`` option to create + "aliases" of joins without enclosing inside of a SELECT + subquery. + + :param name: name given to the alias. + + :param flat: if True, produce an alias of the left and right + sides of this :class:`.Join` and return the join of those + two selectables. This produces join expression that does not + include an enclosing SELECT. + + .. versionadded:: 0.9.0 + + .. seealso:: + + :func:`~.expression.alias` + + """ + if flat: + assert name is None, "Can't send name argument with flat" + left_a, right_a = self.left.alias(flat=True), \ + self.right.alias(flat=True) + adapter = sqlutil.ClauseAdapter(left_a).\ + chain(sqlutil.ClauseAdapter(right_a)) + + return left_a.join(right_a, adapter.traverse(self.onclause), + isouter=self.isouter, full=self.full) + else: + return self.select(use_labels=True, correlate=False).alias(name) + + @property + def _hide_froms(self): + return itertools.chain(*[_from_objects(x.left, x.right) + for x in self._cloned_set]) + + @property + def _from_objects(self): + return [self] + \ + self.onclause._from_objects + \ + self.left._from_objects + \ + self.right._from_objects + + +class Alias(FromClause): + """Represents an table or selectable alias (AS). + + Represents an alias, as typically applied to any table or + sub-select within a SQL statement using the ``AS`` keyword (or + without the keyword on certain databases such as Oracle). + + This object is constructed from the :func:`~.expression.alias` module + level function as well as the :meth:`.FromClause.alias` method available + on all :class:`.FromClause` subclasses. + + """ + + __visit_name__ = 'alias' + named_with_column = True + + _is_from_container = True + + def __init__(self, selectable, name=None): + baseselectable = selectable + while isinstance(baseselectable, Alias): + baseselectable = baseselectable.element + self.original = baseselectable + self.supports_execution = baseselectable.supports_execution + if self.supports_execution: + self._execution_options = baseselectable._execution_options + self.element = selectable + if name is None: + if self.original.named_with_column: + name = getattr(self.original, 'name', None) + name = _anonymous_label('%%(%d %s)s' % (id(self), name + or 'anon')) + self.name = name + + def self_group(self, target=None): + if isinstance(target, CompoundSelect) and \ + isinstance(self.original, Select) and \ + self.original._needs_parens_for_grouping(): + return FromGrouping(self) + + return super(Alias, self).self_group(target) + + @property + def description(self): + if util.py3k: + return self.name + else: + return self.name.encode('ascii', 'backslashreplace') + + def as_scalar(self): + try: + return self.element.as_scalar() + except AttributeError: + raise AttributeError("Element %s does not support " + "'as_scalar()'" % self.element) + + def is_derived_from(self, fromclause): + if fromclause in self._cloned_set: + return True + return self.element.is_derived_from(fromclause) + + def _populate_column_collection(self): + for col in self.element.columns._all_columns: + col._make_proxy(self) + + def _refresh_for_new_column(self, column): + col = self.element._refresh_for_new_column(column) + if col is not None: + if not self._cols_populated: + return None + else: + return col._make_proxy(self) + else: + return None + + def _copy_internals(self, clone=_clone, **kw): + # don't apply anything to an aliased Table + # for now. May want to drive this from + # the given **kw. + if isinstance(self.element, TableClause): + return + self._reset_exported() + self.element = clone(self.element, **kw) + baseselectable = self.element + while isinstance(baseselectable, Alias): + baseselectable = baseselectable.element + self.original = baseselectable + + def get_children(self, column_collections=True, **kw): + if column_collections: + for c in self.c: + yield c + yield self.element + + @property + def _from_objects(self): + return [self] + + @property + def bind(self): + return self.element.bind + + +class Lateral(Alias): + """Represent a LATERAL subquery. + + This object is constructed from the :func:`~.expression.lateral` module + level function as well as the :meth:`.FromClause.lateral` method available + on all :class:`.FromClause` subclasses. + + While LATERAL is part of the SQL standard, curently only more recent + PostgreSQL versions provide support for this keyword. + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`lateral_selects` - overview of usage. + + """ + + __visit_name__ = 'lateral' + + +class TableSample(Alias): + """Represent a TABLESAMPLE clause. + + This object is constructed from the :func:`~.expression.tablesample` module + level function as well as the :meth:`.FromClause.tablesample` method available + on all :class:`.FromClause` subclasses. + + .. versionadded:: 1.1 + + .. seealso:: + + :func:`~.expression.tablesample` + + """ + + __visit_name__ = 'tablesample' + + def __init__(self, selectable, sampling, + name=None, + seed=None): + self.sampling = sampling + self.seed = seed + super(TableSample, self).__init__(selectable, name=name) + + @util.dependencies("sqlalchemy.sql.functions") + def _get_method(self, functions): + if isinstance(self.sampling, functions.Function): + return self.sampling + else: + return functions.func.system(self.sampling) + + +class CTE(Generative, HasSuffixes, Alias): + """Represent a Common Table Expression. + + The :class:`.CTE` object is obtained using the + :meth:`.SelectBase.cte` method from any selectable. + See that method for complete examples. + + .. versionadded:: 0.7.6 + + """ + __visit_name__ = 'cte' + + def __init__(self, selectable, + name=None, + recursive=False, + _cte_alias=None, + _restates=frozenset(), + _suffixes=None): + self.recursive = recursive + self._cte_alias = _cte_alias + self._restates = _restates + if _suffixes: + self._suffixes = _suffixes + super(CTE, self).__init__(selectable, name=name) + + def _copy_internals(self, clone=_clone, **kw): + super(CTE, self)._copy_internals(clone, **kw) + if self._cte_alias is not None: + self._cte_alias = self + self._restates = frozenset([ + clone(elem, **kw) for elem in self._restates + ]) + + @util.dependencies("sqlalchemy.sql.dml") + def _populate_column_collection(self, dml): + if isinstance(self.element, dml.UpdateBase): + for col in self.element._returning: + col._make_proxy(self) + else: + for col in self.element.columns._all_columns: + col._make_proxy(self) + + def alias(self, name=None, flat=False): + return CTE( + self.original, + name=name, + recursive=self.recursive, + _cte_alias=self, + _suffixes=self._suffixes + ) + + def union(self, other): + return CTE( + self.original.union(other), + name=self.name, + recursive=self.recursive, + _restates=self._restates.union([self]), + _suffixes=self._suffixes + ) + + def union_all(self, other): + return CTE( + self.original.union_all(other), + name=self.name, + recursive=self.recursive, + _restates=self._restates.union([self]), + _suffixes=self._suffixes + ) + + +class HasCTE(object): + """Mixin that declares a class to include CTE support. + + .. versionadded:: 1.1 + + """ + + def cte(self, name=None, recursive=False): + r"""Return a new :class:`.CTE`, or Common Table Expression instance. + + Common table expressions are a SQL standard whereby SELECT + statements can draw upon secondary statements specified along + with the primary statement, using a clause called "WITH". + Special semantics regarding UNION can also be employed to + allow "recursive" queries, where a SELECT statement can draw + upon the set of rows that have previously been selected. + + CTEs can also be applied to DML constructs UPDATE, INSERT + and DELETE on some databases, both as a source of CTE rows + when combined with RETURNING, as well as a consumer of + CTE rows. + + SQLAlchemy detects :class:`.CTE` objects, which are treated + similarly to :class:`.Alias` objects, as special elements + to be delivered to the FROM clause of the statement as well + as to a WITH clause at the top of the statement. + + .. versionchanged:: 1.1 Added support for UPDATE/INSERT/DELETE as + CTE, CTEs added to UPDATE/INSERT/DELETE. + + :param name: name given to the common table expression. Like + :meth:`._FromClause.alias`, the name can be left as ``None`` + in which case an anonymous symbol will be used at query + compile time. + :param recursive: if ``True``, will render ``WITH RECURSIVE``. + A recursive common table expression is intended to be used in + conjunction with UNION ALL in order to derive rows + from those already selected. + + The following examples include two from PostgreSQL's documentation at + http://www.postgresql.org/docs/current/static/queries-with.html, + as well as additional examples. + + Example 1, non recursive:: + + from sqlalchemy import (Table, Column, String, Integer, + MetaData, select, func) + + metadata = MetaData() + + orders = Table('orders', metadata, + Column('region', String), + Column('amount', Integer), + Column('product', String), + Column('quantity', Integer) + ) + + regional_sales = select([ + orders.c.region, + func.sum(orders.c.amount).label('total_sales') + ]).group_by(orders.c.region).cte("regional_sales") + + + top_regions = select([regional_sales.c.region]).\ + where( + regional_sales.c.total_sales > + select([ + func.sum(regional_sales.c.total_sales)/10 + ]) + ).cte("top_regions") + + statement = select([ + orders.c.region, + orders.c.product, + func.sum(orders.c.quantity).label("product_units"), + func.sum(orders.c.amount).label("product_sales") + ]).where(orders.c.region.in_( + select([top_regions.c.region]) + )).group_by(orders.c.region, orders.c.product) + + result = conn.execute(statement).fetchall() + + Example 2, WITH RECURSIVE:: + + from sqlalchemy import (Table, Column, String, Integer, + MetaData, select, func) + + metadata = MetaData() + + parts = Table('parts', metadata, + Column('part', String), + Column('sub_part', String), + Column('quantity', Integer), + ) + + included_parts = select([ + parts.c.sub_part, + parts.c.part, + parts.c.quantity]).\ + where(parts.c.part=='our part').\ + cte(recursive=True) + + + incl_alias = included_parts.alias() + parts_alias = parts.alias() + included_parts = included_parts.union_all( + select([ + parts_alias.c.sub_part, + parts_alias.c.part, + parts_alias.c.quantity + ]). + where(parts_alias.c.part==incl_alias.c.sub_part) + ) + + statement = select([ + included_parts.c.sub_part, + func.sum(included_parts.c.quantity). + label('total_quantity') + ]).\ + group_by(included_parts.c.sub_part) + + result = conn.execute(statement).fetchall() + + Example 3, an upsert using UPDATE and INSERT with CTEs:: + + from datetime import date + from sqlalchemy import (MetaData, Table, Column, Integer, + Date, select, literal, and_, exists) + + metadata = MetaData() + + visitors = Table('visitors', metadata, + Column('product_id', Integer, primary_key=True), + Column('date', Date, primary_key=True), + Column('count', Integer), + ) + + # add 5 visitors for the product_id == 1 + product_id = 1 + day = date.today() + count = 5 + + update_cte = ( + visitors.update() + .where(and_(visitors.c.product_id == product_id, + visitors.c.date == day)) + .values(count=visitors.c.count + count) + .returning(literal(1)) + .cte('update_cte') + ) + + upsert = visitors.insert().from_select( + [visitors.c.product_id, visitors.c.date, visitors.c.count], + select([literal(product_id), literal(day), literal(count)]) + .where(~exists(update_cte.select())) + ) + + connection.execute(upsert) + + .. seealso:: + + :meth:`.orm.query.Query.cte` - ORM version of + :meth:`.HasCTE.cte`. + + """ + return CTE(self, name=name, recursive=recursive) + + +class FromGrouping(FromClause): + """Represent a grouping of a FROM clause""" + __visit_name__ = 'grouping' + + def __init__(self, element): + self.element = element + + def _init_collections(self): + pass + + @property + def columns(self): + return self.element.columns + + @property + def primary_key(self): + return self.element.primary_key + + @property + def foreign_keys(self): + return self.element.foreign_keys + + def is_derived_from(self, element): + return self.element.is_derived_from(element) + + def alias(self, **kw): + return FromGrouping(self.element.alias(**kw)) + + @property + def _hide_froms(self): + return self.element._hide_froms + + def get_children(self, **kwargs): + return self.element, + + def _copy_internals(self, clone=_clone, **kw): + self.element = clone(self.element, **kw) + + @property + def _from_objects(self): + return self.element._from_objects + + def __getattr__(self, attr): + return getattr(self.element, attr) + + def __getstate__(self): + return {'element': self.element} + + def __setstate__(self, state): + self.element = state['element'] + + +class TableClause(Immutable, FromClause): + """Represents a minimal "table" construct. + + This is a lightweight table object that has only a name and a + collection of columns, which are typically produced + by the :func:`.expression.column` function:: + + from sqlalchemy import table, column + + user = table("user", + column("id"), + column("name"), + column("description"), + ) + + The :class:`.TableClause` construct serves as the base for + the more commonly used :class:`~.schema.Table` object, providing + the usual set of :class:`~.expression.FromClause` services including + the ``.c.`` collection and statement generation methods. + + It does **not** provide all the additional schema-level services + of :class:`~.schema.Table`, including constraints, references to other + tables, or support for :class:`.MetaData`-level services. It's useful + on its own as an ad-hoc construct used to generate quick SQL + statements when a more fully fledged :class:`~.schema.Table` + is not on hand. + + """ + + __visit_name__ = 'table' + + named_with_column = True + + implicit_returning = False + """:class:`.TableClause` doesn't support having a primary key or column + -level defaults, so implicit returning doesn't apply.""" + + _autoincrement_column = None + """No PK or default support so no autoincrement column.""" + + def __init__(self, name, *columns): + """Produce a new :class:`.TableClause`. + + The object returned is an instance of :class:`.TableClause`, which + represents the "syntactical" portion of the schema-level + :class:`~.schema.Table` object. + It may be used to construct lightweight table constructs. + + .. versionchanged:: 1.0.0 :func:`.expression.table` can now + be imported from the plain ``sqlalchemy`` namespace like any + other SQL element. + + :param name: Name of the table. + + :param columns: A collection of :func:`.expression.column` constructs. + + """ + + super(TableClause, self).__init__() + self.name = self.fullname = name + self._columns = ColumnCollection() + self.primary_key = ColumnSet() + self.foreign_keys = set() + for c in columns: + self.append_column(c) + + def _init_collections(self): + pass + + @util.memoized_property + def description(self): + if util.py3k: + return self.name + else: + return self.name.encode('ascii', 'backslashreplace') + + def append_column(self, c): + self._columns[c.key] = c + c.table = self + + def get_children(self, column_collections=True, **kwargs): + if column_collections: + return [c for c in self.c] + else: + return [] + + @util.dependencies("sqlalchemy.sql.dml") + def insert(self, dml, values=None, inline=False, **kwargs): + """Generate an :func:`.insert` construct against this + :class:`.TableClause`. + + E.g.:: + + table.insert().values(name='foo') + + See :func:`.insert` for argument and usage information. + + """ + + return dml.Insert(self, values=values, inline=inline, **kwargs) + + @util.dependencies("sqlalchemy.sql.dml") + def update( + self, dml, whereclause=None, values=None, inline=False, **kwargs): + """Generate an :func:`.update` construct against this + :class:`.TableClause`. + + E.g.:: + + table.update().where(table.c.id==7).values(name='foo') + + See :func:`.update` for argument and usage information. + + """ + + return dml.Update(self, whereclause=whereclause, + values=values, inline=inline, **kwargs) + + @util.dependencies("sqlalchemy.sql.dml") + def delete(self, dml, whereclause=None, **kwargs): + """Generate a :func:`.delete` construct against this + :class:`.TableClause`. + + E.g.:: + + table.delete().where(table.c.id==7) + + See :func:`.delete` for argument and usage information. + + """ + + return dml.Delete(self, whereclause, **kwargs) + + @property + def _from_objects(self): + return [self] + + +class ForUpdateArg(ClauseElement): + + @classmethod + def parse_legacy_select(self, arg): + """Parse the for_update argument of :func:`.select`. + + :param mode: Defines the lockmode to use. + + ``None`` - translates to no lockmode + + ``'update'`` - translates to ``FOR UPDATE`` + (standard SQL, supported by most dialects) + + ``'nowait'`` - translates to ``FOR UPDATE NOWAIT`` + (supported by Oracle, PostgreSQL 8.1 upwards) + + ``'read'`` - translates to ``LOCK IN SHARE MODE`` (for MySQL), + and ``FOR SHARE`` (for PostgreSQL) + + ``'read_nowait'`` - translates to ``FOR SHARE NOWAIT`` + (supported by PostgreSQL). ``FOR SHARE`` and + ``FOR SHARE NOWAIT`` (PostgreSQL). + + """ + if arg in (None, False): + return None + + nowait = read = False + if arg == 'nowait': + nowait = True + elif arg == 'read': + read = True + elif arg == 'read_nowait': + read = nowait = True + elif arg is not True: + raise exc.ArgumentError("Unknown for_update argument: %r" % arg) + + return ForUpdateArg(read=read, nowait=nowait) + + @property + def legacy_for_update_value(self): + if self.read and not self.nowait: + return "read" + elif self.read and self.nowait: + return "read_nowait" + elif self.nowait: + return "nowait" + else: + return True + + def _copy_internals(self, clone=_clone, **kw): + if self.of is not None: + self.of = [clone(col, **kw) for col in self.of] + + def __init__( + self, nowait=False, read=False, of=None, + skip_locked=False, key_share=False): + """Represents arguments specified to :meth:`.Select.for_update`. + + .. versionadded:: 0.9.0 + + """ + + self.nowait = nowait + self.read = read + self.skip_locked = skip_locked + self.key_share = key_share + if of is not None: + self.of = [_interpret_as_column_or_from(elem) + for elem in util.to_list(of)] + else: + self.of = None + + +class SelectBase(HasCTE, Executable, FromClause): + """Base class for SELECT statements. + + + This includes :class:`.Select`, :class:`.CompoundSelect` and + :class:`.TextAsFrom`. + + + """ + + def as_scalar(self): + """return a 'scalar' representation of this selectable, which can be + used as a column expression. + + Typically, a select statement which has only one column in its columns + clause is eligible to be used as a scalar expression. + + The returned object is an instance of + :class:`ScalarSelect`. + + """ + return ScalarSelect(self) + + def label(self, name): + """return a 'scalar' representation of this selectable, embedded as a + subquery with a label. + + .. seealso:: + + :meth:`~.SelectBase.as_scalar`. + + """ + return self.as_scalar().label(name) + + @_generative + @util.deprecated('0.6', + message="``autocommit()`` is deprecated. Use " + ":meth:`.Executable.execution_options` with the " + "'autocommit' flag.") + def autocommit(self): + """return a new selectable with the 'autocommit' flag set to + True. + """ + + self._execution_options = \ + self._execution_options.union({'autocommit': True}) + + def _generate(self): + """Override the default _generate() method to also clear out + exported collections.""" + + s = self.__class__.__new__(self.__class__) + s.__dict__ = self.__dict__.copy() + s._reset_exported() + return s + + @property + def _from_objects(self): + return [self] + + +class GenerativeSelect(SelectBase): + """Base class for SELECT statements where additional elements can be + added. + + This serves as the base for :class:`.Select` and :class:`.CompoundSelect` + where elements such as ORDER BY, GROUP BY can be added and column + rendering can be controlled. Compare to :class:`.TextAsFrom`, which, + while it subclasses :class:`.SelectBase` and is also a SELECT construct, + represents a fixed textual string which cannot be altered at this level, + only wrapped as a subquery. + + .. versionadded:: 0.9.0 :class:`.GenerativeSelect` was added to + provide functionality specific to :class:`.Select` and + :class:`.CompoundSelect` while allowing :class:`.SelectBase` to be + used for other SELECT-like objects, e.g. :class:`.TextAsFrom`. + + """ + _order_by_clause = ClauseList() + _group_by_clause = ClauseList() + _limit_clause = None + _offset_clause = None + _for_update_arg = None + + def __init__(self, + use_labels=False, + for_update=False, + limit=None, + offset=None, + order_by=None, + group_by=None, + bind=None, + autocommit=None): + self.use_labels = use_labels + + if for_update is not False: + self._for_update_arg = (ForUpdateArg. + parse_legacy_select(for_update)) + + if autocommit is not None: + util.warn_deprecated('autocommit on select() is ' + 'deprecated. Use .execution_options(a' + 'utocommit=True)') + self._execution_options = \ + self._execution_options.union( + {'autocommit': autocommit}) + if limit is not None: + self._limit_clause = _offset_or_limit_clause(limit) + if offset is not None: + self._offset_clause = _offset_or_limit_clause(offset) + self._bind = bind + + if order_by is not None: + self._order_by_clause = ClauseList( + *util.to_list(order_by), + _literal_as_text=_literal_and_labels_as_label_reference) + if group_by is not None: + self._group_by_clause = ClauseList( + *util.to_list(group_by), + _literal_as_text=_literal_as_label_reference) + + @property + def for_update(self): + """Provide legacy dialect support for the ``for_update`` attribute. + """ + if self._for_update_arg is not None: + return self._for_update_arg.legacy_for_update_value + else: + return None + + @for_update.setter + def for_update(self, value): + self._for_update_arg = ForUpdateArg.parse_legacy_select(value) + + @_generative + def with_for_update(self, nowait=False, read=False, of=None, + skip_locked=False, key_share=False): + """Specify a ``FOR UPDATE`` clause for this :class:`.GenerativeSelect`. + + E.g.:: + + stmt = select([table]).with_for_update(nowait=True) + + On a database like PostgreSQL or Oracle, the above would render a + statement like:: + + SELECT table.a, table.b FROM table FOR UPDATE NOWAIT + + on other backends, the ``nowait`` option is ignored and instead + would produce:: + + SELECT table.a, table.b FROM table FOR UPDATE + + When called with no arguments, the statement will render with + the suffix ``FOR UPDATE``. Additional arguments can then be + provided which allow for common database-specific + variants. + + :param nowait: boolean; will render ``FOR UPDATE NOWAIT`` on Oracle + and PostgreSQL dialects. + + :param read: boolean; will render ``LOCK IN SHARE MODE`` on MySQL, + ``FOR SHARE`` on PostgreSQL. On PostgreSQL, when combined with + ``nowait``, will render ``FOR SHARE NOWAIT``. + + :param of: SQL expression or list of SQL expression elements + (typically :class:`.Column` objects or a compatible expression) which + will render into a ``FOR UPDATE OF`` clause; supported by PostgreSQL + and Oracle. May render as a table or as a column depending on + backend. + + :param skip_locked: boolean, will render ``FOR UPDATE SKIP LOCKED`` + on Oracle and PostgreSQL dialects or ``FOR SHARE SKIP LOCKED`` if + ``read=True`` is also specified. + + .. versionadded:: 1.1.0 + + :param key_share: boolean, will render ``FOR NO KEY UPDATE``, + or if combined with ``read=True`` will render ``FOR KEY SHARE``, + on the PostgreSQL dialect. + + .. versionadded:: 1.1.0 + + """ + self._for_update_arg = ForUpdateArg(nowait=nowait, read=read, of=of, + skip_locked=skip_locked, + key_share=key_share) + + @_generative + def apply_labels(self): + """return a new selectable with the 'use_labels' flag set to True. + + This will result in column expressions being generated using labels + against their table name, such as "SELECT somecolumn AS + tablename_somecolumn". This allows selectables which contain multiple + FROM clauses to produce a unique set of column names regardless of + name conflicts among the individual FROM clauses. + + """ + self.use_labels = True + + @property + def _limit(self): + """Get an integer value for the limit. This should only be used + by code that cannot support a limit as a BindParameter or + other custom clause as it will throw an exception if the limit + isn't currently set to an integer. + + """ + return _offset_or_limit_clause_asint(self._limit_clause, "limit") + + @property + def _simple_int_limit(self): + """True if the LIMIT clause is a simple integer, False + if it is not present or is a SQL expression. + """ + return isinstance(self._limit_clause, _OffsetLimitParam) + + @property + def _simple_int_offset(self): + """True if the OFFSET clause is a simple integer, False + if it is not present or is a SQL expression. + """ + return isinstance(self._offset_clause, _OffsetLimitParam) + + @property + def _offset(self): + """Get an integer value for the offset. This should only be used + by code that cannot support an offset as a BindParameter or + other custom clause as it will throw an exception if the + offset isn't currently set to an integer. + + """ + return _offset_or_limit_clause_asint(self._offset_clause, "offset") + + @_generative + def limit(self, limit): + """return a new selectable with the given LIMIT criterion + applied. + + This is a numerical value which usually renders as a ``LIMIT`` + expression in the resulting select. Backends that don't + support ``LIMIT`` will attempt to provide similar + functionality. + + .. versionchanged:: 1.0.0 - :meth:`.Select.limit` can now + accept arbitrary SQL expressions as well as integer values. + + :param limit: an integer LIMIT parameter, or a SQL expression + that provides an integer result. + + """ + + self._limit_clause = _offset_or_limit_clause(limit) + + @_generative + def offset(self, offset): + """return a new selectable with the given OFFSET criterion + applied. + + + This is a numeric value which usually renders as an ``OFFSET`` + expression in the resulting select. Backends that don't + support ``OFFSET`` will attempt to provide similar + functionality. + + + .. versionchanged:: 1.0.0 - :meth:`.Select.offset` can now + accept arbitrary SQL expressions as well as integer values. + + :param offset: an integer OFFSET parameter, or a SQL expression + that provides an integer result. + + """ + + self._offset_clause = _offset_or_limit_clause(offset) + + @_generative + def order_by(self, *clauses): + """return a new selectable with the given list of ORDER BY + criterion applied. + + The criterion will be appended to any pre-existing ORDER BY + criterion. + + """ + + self.append_order_by(*clauses) + + @_generative + def group_by(self, *clauses): + """return a new selectable with the given list of GROUP BY + criterion applied. + + The criterion will be appended to any pre-existing GROUP BY + criterion. + + """ + + self.append_group_by(*clauses) + + def append_order_by(self, *clauses): + """Append the given ORDER BY criterion applied to this selectable. + + The criterion will be appended to any pre-existing ORDER BY criterion. + + This is an **in-place** mutation method; the + :meth:`~.GenerativeSelect.order_by` method is preferred, as it + provides standard :term:`method chaining`. + + """ + if len(clauses) == 1 and clauses[0] is None: + self._order_by_clause = ClauseList() + else: + if getattr(self, '_order_by_clause', None) is not None: + clauses = list(self._order_by_clause) + list(clauses) + self._order_by_clause = ClauseList( + *clauses, + _literal_as_text=_literal_and_labels_as_label_reference) + + def append_group_by(self, *clauses): + """Append the given GROUP BY criterion applied to this selectable. + + The criterion will be appended to any pre-existing GROUP BY criterion. + + This is an **in-place** mutation method; the + :meth:`~.GenerativeSelect.group_by` method is preferred, as it + provides standard :term:`method chaining`. + + """ + if len(clauses) == 1 and clauses[0] is None: + self._group_by_clause = ClauseList() + else: + if getattr(self, '_group_by_clause', None) is not None: + clauses = list(self._group_by_clause) + list(clauses) + self._group_by_clause = ClauseList( + *clauses, _literal_as_text=_literal_as_label_reference) + + @property + def _label_resolve_dict(self): + raise NotImplementedError() + + def _copy_internals(self, clone=_clone, **kw): + if self._limit_clause is not None: + self._limit_clause = clone(self._limit_clause, **kw) + if self._offset_clause is not None: + self._offset_clause = clone(self._offset_clause, **kw) + + +class CompoundSelect(GenerativeSelect): + """Forms the basis of ``UNION``, ``UNION ALL``, and other + SELECT-based set operations. + + + .. seealso:: + + :func:`.union` + + :func:`.union_all` + + :func:`.intersect` + + :func:`.intersect_all` + + :func:`.except` + + :func:`.except_all` + + """ + + __visit_name__ = 'compound_select' + + UNION = util.symbol('UNION') + UNION_ALL = util.symbol('UNION ALL') + EXCEPT = util.symbol('EXCEPT') + EXCEPT_ALL = util.symbol('EXCEPT ALL') + INTERSECT = util.symbol('INTERSECT') + INTERSECT_ALL = util.symbol('INTERSECT ALL') + + _is_from_container = True + + def __init__(self, keyword, *selects, **kwargs): + self._auto_correlate = kwargs.pop('correlate', False) + self.keyword = keyword + self.selects = [] + + numcols = None + + # some DBs do not like ORDER BY in the inner queries of a UNION, etc. + for n, s in enumerate(selects): + s = _clause_element_as_expr(s) + + if not numcols: + numcols = len(s.c._all_columns) + elif len(s.c._all_columns) != numcols: + raise exc.ArgumentError( + 'All selectables passed to ' + 'CompoundSelect must have identical numbers of ' + 'columns; select #%d has %d columns, select ' + '#%d has %d' % + (1, len(self.selects[0].c._all_columns), + n + 1, len(s.c._all_columns)) + ) + + self.selects.append(s.self_group(self)) + + GenerativeSelect.__init__(self, **kwargs) + + @property + def _label_resolve_dict(self): + d = dict( + (c.key, c) for c in self.c + ) + return d, d, d + + @classmethod + def _create_union(cls, *selects, **kwargs): + r"""Return a ``UNION`` of multiple selectables. + + The returned object is an instance of + :class:`.CompoundSelect`. + + A similar :func:`union()` method is available on all + :class:`.FromClause` subclasses. + + \*selects + a list of :class:`.Select` instances. + + \**kwargs + available keyword arguments are the same as those of + :func:`select`. + + """ + return CompoundSelect(CompoundSelect.UNION, *selects, **kwargs) + + @classmethod + def _create_union_all(cls, *selects, **kwargs): + r"""Return a ``UNION ALL`` of multiple selectables. + + The returned object is an instance of + :class:`.CompoundSelect`. + + A similar :func:`union_all()` method is available on all + :class:`.FromClause` subclasses. + + \*selects + a list of :class:`.Select` instances. + + \**kwargs + available keyword arguments are the same as those of + :func:`select`. + + """ + return CompoundSelect(CompoundSelect.UNION_ALL, *selects, **kwargs) + + @classmethod + def _create_except(cls, *selects, **kwargs): + r"""Return an ``EXCEPT`` of multiple selectables. + + The returned object is an instance of + :class:`.CompoundSelect`. + + \*selects + a list of :class:`.Select` instances. + + \**kwargs + available keyword arguments are the same as those of + :func:`select`. + + """ + return CompoundSelect(CompoundSelect.EXCEPT, *selects, **kwargs) + + @classmethod + def _create_except_all(cls, *selects, **kwargs): + r"""Return an ``EXCEPT ALL`` of multiple selectables. + + The returned object is an instance of + :class:`.CompoundSelect`. + + \*selects + a list of :class:`.Select` instances. + + \**kwargs + available keyword arguments are the same as those of + :func:`select`. + + """ + return CompoundSelect(CompoundSelect.EXCEPT_ALL, *selects, **kwargs) + + @classmethod + def _create_intersect(cls, *selects, **kwargs): + r"""Return an ``INTERSECT`` of multiple selectables. + + The returned object is an instance of + :class:`.CompoundSelect`. + + \*selects + a list of :class:`.Select` instances. + + \**kwargs + available keyword arguments are the same as those of + :func:`select`. + + """ + return CompoundSelect(CompoundSelect.INTERSECT, *selects, **kwargs) + + @classmethod + def _create_intersect_all(cls, *selects, **kwargs): + r"""Return an ``INTERSECT ALL`` of multiple selectables. + + The returned object is an instance of + :class:`.CompoundSelect`. + + \*selects + a list of :class:`.Select` instances. + + \**kwargs + available keyword arguments are the same as those of + :func:`select`. + + """ + return CompoundSelect( + CompoundSelect.INTERSECT_ALL, *selects, **kwargs) + + def _scalar_type(self): + return self.selects[0]._scalar_type() + + def self_group(self, against=None): + return FromGrouping(self) + + def is_derived_from(self, fromclause): + for s in self.selects: + if s.is_derived_from(fromclause): + return True + return False + + def _populate_column_collection(self): + for cols in zip(*[s.c._all_columns for s in self.selects]): + + # this is a slightly hacky thing - the union exports a + # column that resembles just that of the *first* selectable. + # to get at a "composite" column, particularly foreign keys, + # you have to dig through the proxies collection which we + # generate below. We may want to improve upon this, such as + # perhaps _make_proxy can accept a list of other columns + # that are "shared" - schema.column can then copy all the + # ForeignKeys in. this would allow the union() to have all + # those fks too. + + proxy = cols[0]._make_proxy( + self, name=cols[0]._label if self.use_labels else None, + key=cols[0]._key_label if self.use_labels else None) + + # hand-construct the "_proxies" collection to include all + # derived columns place a 'weight' annotation corresponding + # to how low in the list of select()s the column occurs, so + # that the corresponding_column() operation can resolve + # conflicts + + proxy._proxies = [ + c._annotate({'weight': i + 1}) for (i, c) in enumerate(cols)] + + def _refresh_for_new_column(self, column): + for s in self.selects: + s._refresh_for_new_column(column) + + if not self._cols_populated: + return None + + raise NotImplementedError("CompoundSelect constructs don't support " + "addition of columns to underlying " + "selectables") + + def _copy_internals(self, clone=_clone, **kw): + super(CompoundSelect, self)._copy_internals(clone, **kw) + self._reset_exported() + self.selects = [clone(s, **kw) for s in self.selects] + if hasattr(self, '_col_map'): + del self._col_map + for attr in ( + '_order_by_clause', '_group_by_clause', '_for_update_arg'): + if getattr(self, attr) is not None: + setattr(self, attr, clone(getattr(self, attr), **kw)) + + def get_children(self, column_collections=True, **kwargs): + return (column_collections and list(self.c) or []) \ + + [self._order_by_clause, self._group_by_clause] \ + + list(self.selects) + + def bind(self): + if self._bind: + return self._bind + for s in self.selects: + e = s.bind + if e: + return e + else: + return None + + def _set_bind(self, bind): + self._bind = bind + bind = property(bind, _set_bind) + + +class Select(HasPrefixes, HasSuffixes, GenerativeSelect): + """Represents a ``SELECT`` statement. + + """ + + __visit_name__ = 'select' + + _prefixes = () + _suffixes = () + _hints = util.immutabledict() + _statement_hints = () + _distinct = False + _from_cloned = None + _correlate = () + _correlate_except = None + _memoized_property = SelectBase._memoized_property + _is_select = True + + def __init__(self, + columns=None, + whereclause=None, + from_obj=None, + distinct=False, + having=None, + correlate=True, + prefixes=None, + suffixes=None, + **kwargs): + """Construct a new :class:`.Select`. + + Similar functionality is also available via the + :meth:`.FromClause.select` method on any :class:`.FromClause`. + + All arguments which accept :class:`.ClauseElement` arguments also + accept string arguments, which will be converted as appropriate into + either :func:`text()` or :func:`literal_column()` constructs. + + .. seealso:: + + :ref:`coretutorial_selecting` - Core Tutorial description of + :func:`.select`. + + :param columns: + A list of :class:`.ColumnElement` or :class:`.FromClause` + objects which will form the columns clause of the resulting + statement. For those objects that are instances of + :class:`.FromClause` (typically :class:`.Table` or :class:`.Alias` + objects), the :attr:`.FromClause.c` collection is extracted + to form a collection of :class:`.ColumnElement` objects. + + This parameter will also accept :class:`.Text` constructs as + given, as well as ORM-mapped classes. + + .. note:: + + The :paramref:`.select.columns` parameter is not available + in the method form of :func:`.select`, e.g. + :meth:`.FromClause.select`. + + .. seealso:: + + :meth:`.Select.column` + + :meth:`.Select.with_only_columns` + + :param whereclause: + A :class:`.ClauseElement` expression which will be used to form the + ``WHERE`` clause. It is typically preferable to add WHERE + criterion to an existing :class:`.Select` using method chaining + with :meth:`.Select.where`. + + .. seealso:: + + :meth:`.Select.where` + + :param from_obj: + A list of :class:`.ClauseElement` objects which will be added to the + ``FROM`` clause of the resulting statement. This is equivalent + to calling :meth:`.Select.select_from` using method chaining on + an existing :class:`.Select` object. + + .. seealso:: + + :meth:`.Select.select_from` - full description of explicit + FROM clause specification. + + :param autocommit: + Deprecated. Use ``.execution_options(autocommit=)`` + to set the autocommit option. + + .. seealso:: + + :meth:`.Executable.execution_options` + + :param bind=None: + an :class:`~.Engine` or :class:`~.Connection` instance + to which the + resulting :class:`.Select` object will be bound. The + :class:`.Select` object will otherwise automatically bind to + whatever :class:`~.base.Connectable` instances can be located within + its contained :class:`.ClauseElement` members. + + :param correlate=True: + indicates that this :class:`.Select` object should have its + contained :class:`.FromClause` elements "correlated" to an enclosing + :class:`.Select` object. It is typically preferable to specify + correlations on an existing :class:`.Select` construct using + :meth:`.Select.correlate`. + + .. seealso:: + + :meth:`.Select.correlate` - full description of correlation. + + :param distinct=False: + when ``True``, applies a ``DISTINCT`` qualifier to the columns + clause of the resulting statement. + + The boolean argument may also be a column expression or list + of column expressions - this is a special calling form which + is understood by the PostgreSQL dialect to render the + ``DISTINCT ON ()`` syntax. + + ``distinct`` is also available on an existing :class:`.Select` + object via the :meth:`~.Select.distinct` method. + + .. seealso:: + + :meth:`.Select.distinct` + + :param for_update=False: + when ``True``, applies ``FOR UPDATE`` to the end of the + resulting statement. + + .. deprecated:: 0.9.0 - use + :meth:`.Select.with_for_update` to specify the + structure of the ``FOR UPDATE`` clause. + + ``for_update`` accepts various string values interpreted by + specific backends, including: + + * ``"read"`` - on MySQL, translates to ``LOCK IN SHARE MODE``; + on PostgreSQL, translates to ``FOR SHARE``. + * ``"nowait"`` - on PostgreSQL and Oracle, translates to + ``FOR UPDATE NOWAIT``. + * ``"read_nowait"`` - on PostgreSQL, translates to + ``FOR SHARE NOWAIT``. + + .. seealso:: + + :meth:`.Select.with_for_update` - improved API for + specifying the ``FOR UPDATE`` clause. + + :param group_by: + a list of :class:`.ClauseElement` objects which will comprise the + ``GROUP BY`` clause of the resulting select. This parameter + is typically specified more naturally using the + :meth:`.Select.group_by` method on an existing :class:`.Select`. + + .. seealso:: + + :meth:`.Select.group_by` + + :param having: + a :class:`.ClauseElement` that will comprise the ``HAVING`` clause + of the resulting select when ``GROUP BY`` is used. This parameter + is typically specified more naturally using the + :meth:`.Select.having` method on an existing :class:`.Select`. + + .. seealso:: + + :meth:`.Select.having` + + :param limit=None: + a numerical value which usually renders as a ``LIMIT`` + expression in the resulting select. Backends that don't + support ``LIMIT`` will attempt to provide similar + functionality. This parameter is typically specified more naturally + using the :meth:`.Select.limit` method on an existing + :class:`.Select`. + + .. seealso:: + + :meth:`.Select.limit` + + :param offset=None: + a numeric value which usually renders as an ``OFFSET`` + expression in the resulting select. Backends that don't + support ``OFFSET`` will attempt to provide similar + functionality. This parameter is typically specified more naturally + using the :meth:`.Select.offset` method on an existing + :class:`.Select`. + + .. seealso:: + + :meth:`.Select.offset` + + :param order_by: + a scalar or list of :class:`.ClauseElement` objects which will + comprise the ``ORDER BY`` clause of the resulting select. + This parameter is typically specified more naturally using the + :meth:`.Select.order_by` method on an existing :class:`.Select`. + + .. seealso:: + + :meth:`.Select.order_by` + + :param use_labels=False: + when ``True``, the statement will be generated using labels + for each column in the columns clause, which qualify each + column with its parent table's (or aliases) name so that name + conflicts between columns in different tables don't occur. + The format of the label is _. The "c" + collection of the resulting :class:`.Select` object will use these + names as well for targeting column members. + + This parameter can also be specified on an existing + :class:`.Select` object using the :meth:`.Select.apply_labels` + method. + + .. seealso:: + + :meth:`.Select.apply_labels` + + """ + self._auto_correlate = correlate + if distinct is not False: + if distinct is True: + self._distinct = True + else: + self._distinct = [ + _literal_as_text(e) + for e in util.to_list(distinct) + ] + + if from_obj is not None: + self._from_obj = util.OrderedSet( + _interpret_as_from(f) + for f in util.to_list(from_obj)) + else: + self._from_obj = util.OrderedSet() + + try: + cols_present = bool(columns) + except TypeError: + raise exc.ArgumentError("columns argument to select() must " + "be a Python list or other iterable") + + if cols_present: + self._raw_columns = [] + for c in columns: + c = _interpret_as_column_or_from(c) + if isinstance(c, ScalarSelect): + c = c.self_group(against=operators.comma_op) + self._raw_columns.append(c) + else: + self._raw_columns = [] + + if whereclause is not None: + self._whereclause = _literal_as_text( + whereclause).self_group(against=operators._asbool) + else: + self._whereclause = None + + if having is not None: + self._having = _literal_as_text( + having).self_group(against=operators._asbool) + else: + self._having = None + + if prefixes: + self._setup_prefixes(prefixes) + + if suffixes: + self._setup_suffixes(suffixes) + + GenerativeSelect.__init__(self, **kwargs) + + @property + def _froms(self): + # would love to cache this, + # but there's just enough edge cases, particularly now that + # declarative encourages construction of SQL expressions + # without tables present, to just regen this each time. + froms = [] + seen = set() + translate = self._from_cloned + + for item in itertools.chain( + _from_objects(*self._raw_columns), + _from_objects(self._whereclause) + if self._whereclause is not None else (), + self._from_obj + ): + if item is self: + raise exc.InvalidRequestError( + "select() construct refers to itself as a FROM") + if translate and item in translate: + item = translate[item] + if not seen.intersection(item._cloned_set): + froms.append(item) + seen.update(item._cloned_set) + + return froms + + def _get_display_froms(self, explicit_correlate_froms=None, + implicit_correlate_froms=None): + """Return the full list of 'from' clauses to be displayed. + + Takes into account a set of existing froms which may be + rendered in the FROM clause of enclosing selects; this Select + may want to leave those absent if it is automatically + correlating. + + """ + froms = self._froms + + toremove = set(itertools.chain(*[ + _expand_cloned(f._hide_froms) + for f in froms])) + if toremove: + # if we're maintaining clones of froms, + # add the copies out to the toremove list. only include + # clones that are lexical equivalents. + if self._from_cloned: + toremove.update( + self._from_cloned[f] for f in + toremove.intersection(self._from_cloned) + if self._from_cloned[f]._is_lexical_equivalent(f) + ) + # filter out to FROM clauses not in the list, + # using a list to maintain ordering + froms = [f for f in froms if f not in toremove] + + if self._correlate: + to_correlate = self._correlate + if to_correlate: + froms = [ + f for f in froms if f not in + _cloned_intersection( + _cloned_intersection( + froms, explicit_correlate_froms or ()), + to_correlate + ) + ] + + if self._correlate_except is not None: + + froms = [ + f for f in froms if f not in + _cloned_difference( + _cloned_intersection( + froms, explicit_correlate_froms or ()), + self._correlate_except + ) + ] + + if self._auto_correlate and \ + implicit_correlate_froms and \ + len(froms) > 1: + + froms = [ + f for f in froms if f not in + _cloned_intersection(froms, implicit_correlate_froms) + ] + + if not len(froms): + raise exc.InvalidRequestError("Select statement '%s" + "' returned no FROM clauses " + "due to auto-correlation; " + "specify correlate() " + "to control correlation " + "manually." % self) + + return froms + + def _scalar_type(self): + elem = self._raw_columns[0] + cols = list(elem._select_iterable) + return cols[0].type + + @property + def froms(self): + """Return the displayed list of FromClause elements.""" + + return self._get_display_froms() + + def with_statement_hint(self, text, dialect_name='*'): + """add a statement hint to this :class:`.Select`. + + This method is similar to :meth:`.Select.with_hint` except that + it does not require an individual table, and instead applies to the + statement as a whole. + + Hints here are specific to the backend database and may include + directives such as isolation levels, file directives, fetch directives, + etc. + + .. versionadded:: 1.0.0 + + .. seealso:: + + :meth:`.Select.with_hint` + + """ + return self.with_hint(None, text, dialect_name) + + @_generative + def with_hint(self, selectable, text, dialect_name='*'): + r"""Add an indexing or other executional context hint for the given + selectable to this :class:`.Select`. + + The text of the hint is rendered in the appropriate + location for the database backend in use, relative + to the given :class:`.Table` or :class:`.Alias` passed as the + ``selectable`` argument. The dialect implementation + typically uses Python string substitution syntax + with the token ``%(name)s`` to render the name of + the table or alias. E.g. when using Oracle, the + following:: + + select([mytable]).\ + with_hint(mytable, "index(%(name)s ix_mytable)") + + Would render SQL as:: + + select /*+ index(mytable ix_mytable) */ ... from mytable + + The ``dialect_name`` option will limit the rendering of a particular + hint to a particular backend. Such as, to add hints for both Oracle + and Sybase simultaneously:: + + select([mytable]).\ + with_hint(mytable, "index(%(name)s ix_mytable)", 'oracle').\ + with_hint(mytable, "WITH INDEX ix_mytable", 'sybase') + + .. seealso:: + + :meth:`.Select.with_statement_hint` + + """ + if selectable is None: + self._statement_hints += ((dialect_name, text), ) + else: + self._hints = self._hints.union( + {(selectable, dialect_name): text}) + + @property + def type(self): + raise exc.InvalidRequestError("Select objects don't have a type. " + "Call as_scalar() on this Select " + "object to return a 'scalar' version " + "of this Select.") + + @_memoized_property.method + def locate_all_froms(self): + """return a Set of all FromClause elements referenced by this Select. + + This set is a superset of that returned by the ``froms`` property, + which is specifically for those FromClause elements that would + actually be rendered. + + """ + froms = self._froms + return froms + list(_from_objects(*froms)) + + @property + def inner_columns(self): + """an iterator of all ColumnElement expressions which would + be rendered into the columns clause of the resulting SELECT statement. + + """ + return _select_iterables(self._raw_columns) + + @_memoized_property + def _label_resolve_dict(self): + with_cols = dict( + (c._resolve_label or c._label or c.key, c) + for c in _select_iterables(self._raw_columns) + if c._allow_label_resolve) + only_froms = dict( + (c.key, c) for c in + _select_iterables(self.froms) if c._allow_label_resolve) + only_cols = with_cols.copy() + for key, value in only_froms.items(): + with_cols.setdefault(key, value) + + return with_cols, only_froms, only_cols + + def is_derived_from(self, fromclause): + if self in fromclause._cloned_set: + return True + + for f in self.locate_all_froms(): + if f.is_derived_from(fromclause): + return True + return False + + def _copy_internals(self, clone=_clone, **kw): + super(Select, self)._copy_internals(clone, **kw) + + # Select() object has been cloned and probably adapted by the + # given clone function. Apply the cloning function to internal + # objects + + # 1. keep a dictionary of the froms we've cloned, and what + # they've become. This is consulted later when we derive + # additional froms from "whereclause" and the columns clause, + # which may still reference the uncloned parent table. + # as of 0.7.4 we also put the current version of _froms, which + # gets cleared on each generation. previously we were "baking" + # _froms into self._from_obj. + self._from_cloned = from_cloned = dict( + (f, clone(f, **kw)) for f in self._from_obj.union(self._froms)) + + # 3. update persistent _from_obj with the cloned versions. + self._from_obj = util.OrderedSet(from_cloned[f] for f in + self._from_obj) + + # the _correlate collection is done separately, what can happen + # here is the same item is _correlate as in _from_obj but the + # _correlate version has an annotation on it - (specifically + # RelationshipProperty.Comparator._criterion_exists() does + # this). Also keep _correlate liberally open with its previous + # contents, as this set is used for matching, not rendering. + self._correlate = set(clone(f) for f in + self._correlate).union(self._correlate) + + # 4. clone other things. The difficulty here is that Column + # objects are not actually cloned, and refer to their original + # .table, resulting in the wrong "from" parent after a clone + # operation. Hence _from_cloned and _from_obj supersede what is + # present here. + self._raw_columns = [clone(c, **kw) for c in self._raw_columns] + for attr in '_whereclause', '_having', '_order_by_clause', \ + '_group_by_clause', '_for_update_arg': + if getattr(self, attr) is not None: + setattr(self, attr, clone(getattr(self, attr), **kw)) + + # erase exported column list, _froms collection, + # etc. + self._reset_exported() + + def get_children(self, column_collections=True, **kwargs): + """return child elements as per the ClauseElement specification.""" + + return (column_collections and list(self.columns) or []) + \ + self._raw_columns + list(self._froms) + \ + [x for x in + (self._whereclause, self._having, + self._order_by_clause, self._group_by_clause) + if x is not None] + + @_generative + def column(self, column): + """return a new select() construct with the given column expression + added to its columns clause. + + """ + self.append_column(column) + + @util.dependencies("sqlalchemy.sql.util") + def reduce_columns(self, sqlutil, only_synonyms=True): + """Return a new :func`.select` construct with redundantly + named, equivalently-valued columns removed from the columns clause. + + "Redundant" here means two columns where one refers to the + other either based on foreign key, or via a simple equality + comparison in the WHERE clause of the statement. The primary purpose + of this method is to automatically construct a select statement + with all uniquely-named columns, without the need to use + table-qualified labels as :meth:`.apply_labels` does. + + When columns are omitted based on foreign key, the referred-to + column is the one that's kept. When columns are omitted based on + WHERE eqivalence, the first column in the columns clause is the + one that's kept. + + :param only_synonyms: when True, limit the removal of columns + to those which have the same name as the equivalent. Otherwise, + all columns that are equivalent to another are removed. + + .. versionadded:: 0.8 + + """ + return self.with_only_columns( + sqlutil.reduce_columns( + self.inner_columns, + only_synonyms=only_synonyms, + *(self._whereclause, ) + tuple(self._from_obj) + ) + ) + + @_generative + def with_only_columns(self, columns): + r"""Return a new :func:`.select` construct with its columns + clause replaced with the given columns. + + .. versionchanged:: 0.7.3 + Due to a bug fix, this method has a slight + behavioral change as of version 0.7.3. + Prior to version 0.7.3, the FROM clause of + a :func:`.select` was calculated upfront and as new columns + were added; in 0.7.3 and later it's calculated + at compile time, fixing an issue regarding late binding + of columns to parent tables. This changes the behavior of + :meth:`.Select.with_only_columns` in that FROM clauses no + longer represented in the new list are dropped, + but this behavior is more consistent in + that the FROM clauses are consistently derived from the + current columns clause. The original intent of this method + is to allow trimming of the existing columns list to be fewer + columns than originally present; the use case of replacing + the columns list with an entirely different one hadn't + been anticipated until 0.7.3 was released; the usage + guidelines below illustrate how this should be done. + + This method is exactly equivalent to as if the original + :func:`.select` had been called with the given columns + clause. I.e. a statement:: + + s = select([table1.c.a, table1.c.b]) + s = s.with_only_columns([table1.c.b]) + + should be exactly equivalent to:: + + s = select([table1.c.b]) + + This means that FROM clauses which are only derived + from the column list will be discarded if the new column + list no longer contains that FROM:: + + >>> table1 = table('t1', column('a'), column('b')) + >>> table2 = table('t2', column('a'), column('b')) + >>> s1 = select([table1.c.a, table2.c.b]) + >>> print s1 + SELECT t1.a, t2.b FROM t1, t2 + >>> s2 = s1.with_only_columns([table2.c.b]) + >>> print s2 + SELECT t2.b FROM t1 + + The preferred way to maintain a specific FROM clause + in the construct, assuming it won't be represented anywhere + else (i.e. not in the WHERE clause, etc.) is to set it using + :meth:`.Select.select_from`:: + + >>> s1 = select([table1.c.a, table2.c.b]).\ + ... select_from(table1.join(table2, + ... table1.c.a==table2.c.a)) + >>> s2 = s1.with_only_columns([table2.c.b]) + >>> print s2 + SELECT t2.b FROM t1 JOIN t2 ON t1.a=t2.a + + Care should also be taken to use the correct + set of column objects passed to :meth:`.Select.with_only_columns`. + Since the method is essentially equivalent to calling the + :func:`.select` construct in the first place with the given + columns, the columns passed to :meth:`.Select.with_only_columns` + should usually be a subset of those which were passed + to the :func:`.select` construct, not those which are available + from the ``.c`` collection of that :func:`.select`. That + is:: + + s = select([table1.c.a, table1.c.b]).select_from(table1) + s = s.with_only_columns([table1.c.b]) + + and **not**:: + + # usually incorrect + s = s.with_only_columns([s.c.b]) + + The latter would produce the SQL:: + + SELECT b + FROM (SELECT t1.a AS a, t1.b AS b + FROM t1), t1 + + Since the :func:`.select` construct is essentially being + asked to select both from ``table1`` as well as itself. + + """ + self._reset_exported() + rc = [] + for c in columns: + c = _interpret_as_column_or_from(c) + if isinstance(c, ScalarSelect): + c = c.self_group(against=operators.comma_op) + rc.append(c) + self._raw_columns = rc + + @_generative + def where(self, whereclause): + """return a new select() construct with the given expression added to + its WHERE clause, joined to the existing clause via AND, if any. + + """ + + self.append_whereclause(whereclause) + + @_generative + def having(self, having): + """return a new select() construct with the given expression added to + its HAVING clause, joined to the existing clause via AND, if any. + + """ + self.append_having(having) + + @_generative + def distinct(self, *expr): + r"""Return a new select() construct which will apply DISTINCT to its + columns clause. + + :param \*expr: optional column expressions. When present, + the PostgreSQL dialect will render a ``DISTINCT ON (>)`` + construct. + + """ + if expr: + expr = [_literal_as_label_reference(e) for e in expr] + if isinstance(self._distinct, list): + self._distinct = self._distinct + expr + else: + self._distinct = expr + else: + self._distinct = True + + @_generative + def select_from(self, fromclause): + r"""return a new :func:`.select` construct with the + given FROM expression + merged into its list of FROM objects. + + E.g.:: + + table1 = table('t1', column('a')) + table2 = table('t2', column('b')) + s = select([table1.c.a]).\ + select_from( + table1.join(table2, table1.c.a==table2.c.b) + ) + + The "from" list is a unique set on the identity of each element, + so adding an already present :class:`.Table` or other selectable + will have no effect. Passing a :class:`.Join` that refers + to an already present :class:`.Table` or other selectable will have + the effect of concealing the presence of that selectable as + an individual element in the rendered FROM list, instead + rendering it into a JOIN clause. + + While the typical purpose of :meth:`.Select.select_from` is to + replace the default, derived FROM clause with a join, it can + also be called with individual table elements, multiple times + if desired, in the case that the FROM clause cannot be fully + derived from the columns clause:: + + select([func.count('*')]).select_from(table1) + + """ + self.append_from(fromclause) + + @_generative + def correlate(self, *fromclauses): + r"""return a new :class:`.Select` which will correlate the given FROM + clauses to that of an enclosing :class:`.Select`. + + Calling this method turns off the :class:`.Select` object's + default behavior of "auto-correlation". Normally, FROM elements + which appear in a :class:`.Select` that encloses this one via + its :term:`WHERE clause`, ORDER BY, HAVING or + :term:`columns clause` will be omitted from this :class:`.Select` + object's :term:`FROM clause`. + Setting an explicit correlation collection using the + :meth:`.Select.correlate` method provides a fixed list of FROM objects + that can potentially take place in this process. + + When :meth:`.Select.correlate` is used to apply specific FROM clauses + for correlation, the FROM elements become candidates for + correlation regardless of how deeply nested this :class:`.Select` + object is, relative to an enclosing :class:`.Select` which refers to + the same FROM object. This is in contrast to the behavior of + "auto-correlation" which only correlates to an immediate enclosing + :class:`.Select`. Multi-level correlation ensures that the link + between enclosed and enclosing :class:`.Select` is always via + at least one WHERE/ORDER BY/HAVING/columns clause in order for + correlation to take place. + + If ``None`` is passed, the :class:`.Select` object will correlate + none of its FROM entries, and all will render unconditionally + in the local FROM clause. + + :param \*fromclauses: a list of one or more :class:`.FromClause` + constructs, or other compatible constructs (i.e. ORM-mapped + classes) to become part of the correlate collection. + + .. versionchanged:: 0.8.0 ORM-mapped classes are accepted by + :meth:`.Select.correlate`. + + .. versionchanged:: 0.8.0 The :meth:`.Select.correlate` method no + longer unconditionally removes entries from the FROM clause; + instead, the candidate FROM entries must also be matched by a FROM + entry located in an enclosing :class:`.Select`, which ultimately + encloses this one as present in the WHERE clause, ORDER BY clause, + HAVING clause, or columns clause of an enclosing :meth:`.Select`. + + .. versionchanged:: 0.8.2 explicit correlation takes place + via any level of nesting of :class:`.Select` objects; in previous + 0.8 versions, correlation would only occur relative to the + immediate enclosing :class:`.Select` construct. + + .. seealso:: + + :meth:`.Select.correlate_except` + + :ref:`correlated_subqueries` + + """ + self._auto_correlate = False + if fromclauses and fromclauses[0] is None: + self._correlate = () + else: + self._correlate = set(self._correlate).union( + _interpret_as_from(f) for f in fromclauses) + + @_generative + def correlate_except(self, *fromclauses): + r"""return a new :class:`.Select` which will omit the given FROM + clauses from the auto-correlation process. + + Calling :meth:`.Select.correlate_except` turns off the + :class:`.Select` object's default behavior of + "auto-correlation" for the given FROM elements. An element + specified here will unconditionally appear in the FROM list, while + all other FROM elements remain subject to normal auto-correlation + behaviors. + + .. versionchanged:: 0.8.2 The :meth:`.Select.correlate_except` + method was improved to fully prevent FROM clauses specified here + from being omitted from the immediate FROM clause of this + :class:`.Select`. + + If ``None`` is passed, the :class:`.Select` object will correlate + all of its FROM entries. + + .. versionchanged:: 0.8.2 calling ``correlate_except(None)`` will + correctly auto-correlate all FROM clauses. + + :param \*fromclauses: a list of one or more :class:`.FromClause` + constructs, or other compatible constructs (i.e. ORM-mapped + classes) to become part of the correlate-exception collection. + + .. seealso:: + + :meth:`.Select.correlate` + + :ref:`correlated_subqueries` + + """ + + self._auto_correlate = False + if fromclauses and fromclauses[0] is None: + self._correlate_except = () + else: + self._correlate_except = set(self._correlate_except or ()).union( + _interpret_as_from(f) for f in fromclauses) + + def append_correlation(self, fromclause): + """append the given correlation expression to this select() + construct. + + This is an **in-place** mutation method; the + :meth:`~.Select.correlate` method is preferred, as it provides + standard :term:`method chaining`. + + """ + + self._auto_correlate = False + self._correlate = set(self._correlate).union( + _interpret_as_from(f) for f in fromclause) + + def append_column(self, column): + """append the given column expression to the columns clause of this + select() construct. + + This is an **in-place** mutation method; the + :meth:`~.Select.column` method is preferred, as it provides standard + :term:`method chaining`. + + """ + self._reset_exported() + column = _interpret_as_column_or_from(column) + + if isinstance(column, ScalarSelect): + column = column.self_group(against=operators.comma_op) + + self._raw_columns = self._raw_columns + [column] + + def append_prefix(self, clause): + """append the given columns clause prefix expression to this select() + construct. + + This is an **in-place** mutation method; the + :meth:`~.Select.prefix_with` method is preferred, as it provides + standard :term:`method chaining`. + + """ + clause = _literal_as_text(clause) + self._prefixes = self._prefixes + (clause,) + + def append_whereclause(self, whereclause): + """append the given expression to this select() construct's WHERE + criterion. + + The expression will be joined to existing WHERE criterion via AND. + + This is an **in-place** mutation method; the + :meth:`~.Select.where` method is preferred, as it provides standard + :term:`method chaining`. + + """ + + self._reset_exported() + self._whereclause = and_( + True_._ifnone(self._whereclause), whereclause) + + def append_having(self, having): + """append the given expression to this select() construct's HAVING + criterion. + + The expression will be joined to existing HAVING criterion via AND. + + This is an **in-place** mutation method; the + :meth:`~.Select.having` method is preferred, as it provides standard + :term:`method chaining`. + + """ + self._reset_exported() + self._having = and_(True_._ifnone(self._having), having) + + def append_from(self, fromclause): + """append the given FromClause expression to this select() construct's + FROM clause. + + This is an **in-place** mutation method; the + :meth:`~.Select.select_from` method is preferred, as it provides + standard :term:`method chaining`. + + """ + self._reset_exported() + fromclause = _interpret_as_from(fromclause) + self._from_obj = self._from_obj.union([fromclause]) + + @_memoized_property + def _columns_plus_names(self): + if self.use_labels: + names = set() + + def name_for_col(c): + if c._label is None or not c._render_label_in_columns_clause: + return (None, c) + + name = c._label + if name in names: + name = c.anon_label + else: + names.add(name) + return name, c + + return [ + name_for_col(c) + for c in util.unique_list( + _select_iterables(self._raw_columns)) + ] + else: + return [ + (None, c) + for c in util.unique_list( + _select_iterables(self._raw_columns)) + ] + + def _populate_column_collection(self): + for name, c in self._columns_plus_names: + if not hasattr(c, '_make_proxy'): + continue + if name is None: + key = None + elif self.use_labels: + key = c._key_label + if key is not None and key in self.c: + key = c.anon_label + else: + key = None + + c._make_proxy(self, key=key, + name=name, + name_is_truncatable=True) + + def _refresh_for_new_column(self, column): + for fromclause in self._froms: + col = fromclause._refresh_for_new_column(column) + if col is not None: + if col in self.inner_columns and self._cols_populated: + our_label = col._key_label if self.use_labels else col.key + if our_label not in self.c: + return col._make_proxy( + self, + name=col._label if self.use_labels else None, + key=col._key_label if self.use_labels else None, + name_is_truncatable=True) + return None + return None + + def _needs_parens_for_grouping(self): + return ( + self._limit_clause is not None or + self._offset_clause is not None or + bool(self._order_by_clause.clauses) + ) + + def self_group(self, against=None): + """return a 'grouping' construct as per the ClauseElement + specification. + + This produces an element that can be embedded in an expression. Note + that this method is called automatically as needed when constructing + expressions and should not require explicit use. + + """ + if isinstance(against, CompoundSelect) and \ + not self._needs_parens_for_grouping(): + return self + return FromGrouping(self) + + def union(self, other, **kwargs): + """return a SQL UNION of this select() construct against the given + selectable.""" + + return CompoundSelect._create_union(self, other, **kwargs) + + def union_all(self, other, **kwargs): + """return a SQL UNION ALL of this select() construct against the given + selectable. + + """ + return CompoundSelect._create_union_all(self, other, **kwargs) + + def except_(self, other, **kwargs): + """return a SQL EXCEPT of this select() construct against the given + selectable.""" + + return CompoundSelect._create_except(self, other, **kwargs) + + def except_all(self, other, **kwargs): + """return a SQL EXCEPT ALL of this select() construct against the + given selectable. + + """ + return CompoundSelect._create_except_all(self, other, **kwargs) + + def intersect(self, other, **kwargs): + """return a SQL INTERSECT of this select() construct against the given + selectable. + + """ + return CompoundSelect._create_intersect(self, other, **kwargs) + + def intersect_all(self, other, **kwargs): + """return a SQL INTERSECT ALL of this select() construct against the + given selectable. + + """ + return CompoundSelect._create_intersect_all(self, other, **kwargs) + + def bind(self): + if self._bind: + return self._bind + froms = self._froms + if not froms: + for c in self._raw_columns: + e = c.bind + if e: + self._bind = e + return e + else: + e = list(froms)[0].bind + if e: + self._bind = e + return e + + return None + + def _set_bind(self, bind): + self._bind = bind + bind = property(bind, _set_bind) + + +class ScalarSelect(Generative, Grouping): + _from_objects = [] + _is_from_container = True + + def __init__(self, element): + self.element = element + self.type = element._scalar_type() + + @property + def columns(self): + raise exc.InvalidRequestError('Scalar Select expression has no ' + 'columns; use this object directly ' + 'within a column-level expression.') + c = columns + + @_generative + def where(self, crit): + """Apply a WHERE clause to the SELECT statement referred to + by this :class:`.ScalarSelect`. + + """ + self.element = self.element.where(crit) + + def self_group(self, **kwargs): + return self + + +class Exists(UnaryExpression): + """Represent an ``EXISTS`` clause. + + """ + __visit_name__ = UnaryExpression.__visit_name__ + _from_objects = [] + + def __init__(self, *args, **kwargs): + """Construct a new :class:`.Exists` against an existing + :class:`.Select` object. + + Calling styles are of the following forms:: + + # use on an existing select() + s = select([table.c.col1]).where(table.c.col2==5) + s = exists(s) + + # construct a select() at once + exists(['*'], **select_arguments).where(criterion) + + # columns argument is optional, generates "EXISTS (SELECT *)" + # by default. + exists().where(table.c.col2==5) + + """ + if args and isinstance(args[0], (SelectBase, ScalarSelect)): + s = args[0] + else: + if not args: + args = ([literal_column('*')],) + s = Select(*args, **kwargs).as_scalar().self_group() + + UnaryExpression.__init__(self, s, operator=operators.exists, + type_=type_api.BOOLEANTYPE, + wraps_column_expression=True) + + def select(self, whereclause=None, **params): + return Select([self], whereclause, **params) + + def correlate(self, *fromclause): + e = self._clone() + e.element = self.element.correlate(*fromclause).self_group() + return e + + def correlate_except(self, *fromclause): + e = self._clone() + e.element = self.element.correlate_except(*fromclause).self_group() + return e + + def select_from(self, clause): + """return a new :class:`.Exists` construct, applying the given + expression to the :meth:`.Select.select_from` method of the select + statement contained. + + """ + e = self._clone() + e.element = self.element.select_from(clause).self_group() + return e + + def where(self, clause): + """return a new exists() construct with the given expression added to + its WHERE clause, joined to the existing clause via AND, if any. + + """ + e = self._clone() + e.element = self.element.where(clause).self_group() + return e + + +class TextAsFrom(SelectBase): + """Wrap a :class:`.TextClause` construct within a :class:`.SelectBase` + interface. + + This allows the :class:`.TextClause` object to gain a ``.c`` collection + and other FROM-like capabilities such as :meth:`.FromClause.alias`, + :meth:`.SelectBase.cte`, etc. + + The :class:`.TextAsFrom` construct is produced via the + :meth:`.TextClause.columns` method - see that method for details. + + .. versionadded:: 0.9.0 + + .. seealso:: + + :func:`.text` + + :meth:`.TextClause.columns` + + """ + __visit_name__ = "text_as_from" + + _textual = True + + def __init__(self, text, columns, positional=False): + self.element = text + self.column_args = columns + self.positional = positional + + @property + def _bind(self): + return self.element._bind + + @_generative + def bindparams(self, *binds, **bind_as_values): + self.element = self.element.bindparams(*binds, **bind_as_values) + + def _populate_column_collection(self): + for c in self.column_args: + c._make_proxy(self) + + def _copy_internals(self, clone=_clone, **kw): + self._reset_exported() + self.element = clone(self.element, **kw) + + def _scalar_type(self): + return self.column_args[0].type + + +class AnnotatedFromClause(Annotated): + def __init__(self, element, values): + # force FromClause to generate their internal + # collections into __dict__ + element.c + Annotated.__init__(self, element, values) diff --git a/app/lib/sqlalchemy/sql/sqltypes.py b/app/lib/sqlalchemy/sql/sqltypes.py new file mode 100644 index 0000000..8a114ec --- /dev/null +++ b/app/lib/sqlalchemy/sql/sqltypes.py @@ -0,0 +1,2619 @@ +# sql/sqltypes.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""SQL specific types. + +""" + +import datetime as dt +import codecs +import collections +import json + +from . import elements +from .type_api import TypeEngine, TypeDecorator, to_instance, Variant +from .elements import quoted_name, TypeCoerce as type_coerce, _defer_name, \ + Slice, _literal_as_binds +from .. import exc, util, processors +from .base import _bind_or_error, SchemaEventTarget +from . import operators +from .. import inspection +from .. import event +from ..util import pickle +from ..util import compat +import decimal + +if util.jython: + import array + + +class _DateAffinity(object): + + """Mixin date/time specific expression adaptations. + + Rules are implemented within Date,Time,Interval,DateTime, Numeric, + Integer. Based on http://www.postgresql.org/docs/current/static + /functions-datetime.html. + + """ + + @property + def _expression_adaptations(self): + raise NotImplementedError() + + class Comparator(TypeEngine.Comparator): + _blank_dict = util.immutabledict() + + def _adapt_expression(self, op, other_comparator): + othertype = other_comparator.type._type_affinity + return ( + op, to_instance( + self.type._expression_adaptations. + get(op, self._blank_dict). + get(othertype, NULLTYPE)) + ) + comparator_factory = Comparator + + +class Concatenable(object): + + """A mixin that marks a type as supporting 'concatenation', + typically strings.""" + + class Comparator(TypeEngine.Comparator): + + def _adapt_expression(self, op, other_comparator): + if (op is operators.add and + isinstance( + other_comparator, + (Concatenable.Comparator, NullType.Comparator) + )): + return operators.concat_op, self.expr.type + else: + return super(Concatenable.Comparator, self)._adapt_expression( + op, other_comparator) + + comparator_factory = Comparator + + +class Indexable(object): + """A mixin that marks a type as supporting indexing operations, + such as array or JSON structures. + + + .. versionadded:: 1.1.0 + + + """ + + class Comparator(TypeEngine.Comparator): + + def _setup_getitem(self, index): + raise NotImplementedError() + + def __getitem__(self, index): + adjusted_op, adjusted_right_expr, result_type = \ + self._setup_getitem(index) + return self.operate( + adjusted_op, + adjusted_right_expr, + result_type=result_type + ) + + comparator_factory = Comparator + + +class String(Concatenable, TypeEngine): + + """The base for all string and character types. + + In SQL, corresponds to VARCHAR. Can also take Python unicode objects + and encode to the database's encoding in bind params (and the reverse for + result sets.) + + The `length` field is usually required when the `String` type is + used within a CREATE TABLE statement, as VARCHAR requires a length + on most databases. + + """ + + __visit_name__ = 'string' + + def __init__(self, length=None, collation=None, + convert_unicode=False, + unicode_error=None, + _warn_on_bytestring=False + ): + """ + Create a string-holding type. + + :param length: optional, a length for the column for use in + DDL and CAST expressions. May be safely omitted if no ``CREATE + TABLE`` will be issued. Certain databases may require a + ``length`` for use in DDL, and will raise an exception when + the ``CREATE TABLE`` DDL is issued if a ``VARCHAR`` + with no length is included. Whether the value is + interpreted as bytes or characters is database specific. + + :param collation: Optional, a column-level collation for + use in DDL and CAST expressions. Renders using the + COLLATE keyword supported by SQLite, MySQL, and PostgreSQL. + E.g.:: + + >>> from sqlalchemy import cast, select, String + >>> print select([cast('some string', String(collation='utf8'))]) + SELECT CAST(:param_1 AS VARCHAR COLLATE utf8) AS anon_1 + + .. versionadded:: 0.8 Added support for COLLATE to all + string types. + + :param convert_unicode: When set to ``True``, the + :class:`.String` type will assume that + input is to be passed as Python ``unicode`` objects, + and results returned as Python ``unicode`` objects. + If the DBAPI in use does not support Python unicode + (which is fewer and fewer these days), SQLAlchemy + will encode/decode the value, using the + value of the ``encoding`` parameter passed to + :func:`.create_engine` as the encoding. + + When using a DBAPI that natively supports Python + unicode objects, this flag generally does not + need to be set. For columns that are explicitly + intended to store non-ASCII data, the :class:`.Unicode` + or :class:`.UnicodeText` + types should be used regardless, which feature + the same behavior of ``convert_unicode`` but + also indicate an underlying column type that + directly supports unicode, such as ``NVARCHAR``. + + For the extremely rare case that Python ``unicode`` + is to be encoded/decoded by SQLAlchemy on a backend + that does natively support Python ``unicode``, + the value ``force`` can be passed here which will + cause SQLAlchemy's encode/decode services to be + used unconditionally. + + :param unicode_error: Optional, a method to use to handle Unicode + conversion errors. Behaves like the ``errors`` keyword argument to + the standard library's ``string.decode()`` functions. This flag + requires that ``convert_unicode`` is set to ``force`` - otherwise, + SQLAlchemy is not guaranteed to handle the task of unicode + conversion. Note that this flag adds significant performance + overhead to row-fetching operations for backends that already + return unicode objects natively (which most DBAPIs do). This + flag should only be used as a last resort for reading + strings from a column with varied or corrupted encodings. + + """ + if unicode_error is not None and convert_unicode != 'force': + raise exc.ArgumentError("convert_unicode must be 'force' " + "when unicode_error is set.") + + self.length = length + self.collation = collation + self.convert_unicode = convert_unicode + self.unicode_error = unicode_error + self._warn_on_bytestring = _warn_on_bytestring + + def literal_processor(self, dialect): + def process(value): + value = value.replace("'", "''") + return "'%s'" % value + return process + + def bind_processor(self, dialect): + if self.convert_unicode or dialect.convert_unicode: + if dialect.supports_unicode_binds and \ + self.convert_unicode != 'force': + if self._warn_on_bytestring: + def process(value): + if isinstance(value, util.binary_type): + util.warn_limited( + "Unicode type received non-unicode " + "bind param value %r.", + (util.ellipses_string(value),)) + return value + return process + else: + return None + else: + encoder = codecs.getencoder(dialect.encoding) + warn_on_bytestring = self._warn_on_bytestring + + def process(value): + if isinstance(value, util.text_type): + return encoder(value, self.unicode_error)[0] + elif warn_on_bytestring and value is not None: + util.warn_limited( + "Unicode type received non-unicode bind " + "param value %r.", + (util.ellipses_string(value),)) + return value + return process + else: + return None + + def result_processor(self, dialect, coltype): + wants_unicode = self.convert_unicode or dialect.convert_unicode + needs_convert = wants_unicode and \ + (dialect.returns_unicode_strings is not True or + self.convert_unicode in ('force', 'force_nocheck')) + needs_isinstance = ( + needs_convert and + dialect.returns_unicode_strings and + self.convert_unicode != 'force_nocheck' + ) + if needs_convert: + if needs_isinstance: + return processors.to_conditional_unicode_processor_factory( + dialect.encoding, self.unicode_error) + else: + return processors.to_unicode_processor_factory( + dialect.encoding, self.unicode_error) + else: + return None + + @property + def python_type(self): + if self.convert_unicode: + return util.text_type + else: + return str + + def get_dbapi_type(self, dbapi): + return dbapi.STRING + + +class Text(String): + + """A variably sized string type. + + In SQL, usually corresponds to CLOB or TEXT. Can also take Python + unicode objects and encode to the database's encoding in bind + params (and the reverse for result sets.) In general, TEXT objects + do not have a length; while some databases will accept a length + argument here, it will be rejected by others. + + """ + __visit_name__ = 'text' + + +class Unicode(String): + + """A variable length Unicode string type. + + The :class:`.Unicode` type is a :class:`.String` subclass + that assumes input and output as Python ``unicode`` data, + and in that regard is equivalent to the usage of the + ``convert_unicode`` flag with the :class:`.String` type. + However, unlike plain :class:`.String`, it also implies an + underlying column type that is explicitly supporting of non-ASCII + data, such as ``NVARCHAR`` on Oracle and SQL Server. + This can impact the output of ``CREATE TABLE`` statements + and ``CAST`` functions at the dialect level, and can + also affect the handling of bound parameters in some + specific DBAPI scenarios. + + The encoding used by the :class:`.Unicode` type is usually + determined by the DBAPI itself; most modern DBAPIs + feature support for Python ``unicode`` objects as bound + values and result set values, and the encoding should + be configured as detailed in the notes for the target + DBAPI in the :ref:`dialect_toplevel` section. + + For those DBAPIs which do not support, or are not configured + to accommodate Python ``unicode`` objects + directly, SQLAlchemy does the encoding and decoding + outside of the DBAPI. The encoding in this scenario + is determined by the ``encoding`` flag passed to + :func:`.create_engine`. + + When using the :class:`.Unicode` type, it is only appropriate + to pass Python ``unicode`` objects, and not plain ``str``. + If a plain ``str`` is passed under Python 2, a warning + is emitted. If you notice your application emitting these warnings but + you're not sure of the source of them, the Python + ``warnings`` filter, documented at + http://docs.python.org/library/warnings.html, + can be used to turn these warnings into exceptions + which will illustrate a stack trace:: + + import warnings + warnings.simplefilter('error') + + For an application that wishes to pass plain bytestrings + and Python ``unicode`` objects to the ``Unicode`` type + equally, the bytestrings must first be decoded into + unicode. The recipe at :ref:`coerce_to_unicode` illustrates + how this is done. + + See also: + + :class:`.UnicodeText` - unlengthed textual counterpart + to :class:`.Unicode`. + + """ + + __visit_name__ = 'unicode' + + def __init__(self, length=None, **kwargs): + """ + Create a :class:`.Unicode` object. + + Parameters are the same as that of :class:`.String`, + with the exception that ``convert_unicode`` + defaults to ``True``. + + """ + kwargs.setdefault('convert_unicode', True) + kwargs.setdefault('_warn_on_bytestring', True) + super(Unicode, self).__init__(length=length, **kwargs) + + +class UnicodeText(Text): + + """An unbounded-length Unicode string type. + + See :class:`.Unicode` for details on the unicode + behavior of this object. + + Like :class:`.Unicode`, usage the :class:`.UnicodeText` type implies a + unicode-capable type being used on the backend, such as + ``NCLOB``, ``NTEXT``. + + """ + + __visit_name__ = 'unicode_text' + + def __init__(self, length=None, **kwargs): + """ + Create a Unicode-converting Text type. + + Parameters are the same as that of :class:`.Text`, + with the exception that ``convert_unicode`` + defaults to ``True``. + + """ + kwargs.setdefault('convert_unicode', True) + kwargs.setdefault('_warn_on_bytestring', True) + super(UnicodeText, self).__init__(length=length, **kwargs) + + +class Integer(_DateAffinity, TypeEngine): + + """A type for ``int`` integers.""" + + __visit_name__ = 'integer' + + def get_dbapi_type(self, dbapi): + return dbapi.NUMBER + + @property + def python_type(self): + return int + + def literal_processor(self, dialect): + def process(value): + return str(value) + return process + + @util.memoized_property + def _expression_adaptations(self): + # TODO: need a dictionary object that will + # handle operators generically here, this is incomplete + return { + operators.add: { + Date: Date, + Integer: self.__class__, + Numeric: Numeric, + }, + operators.mul: { + Interval: Interval, + Integer: self.__class__, + Numeric: Numeric, + }, + operators.div: { + Integer: self.__class__, + Numeric: Numeric, + }, + operators.truediv: { + Integer: self.__class__, + Numeric: Numeric, + }, + operators.sub: { + Integer: self.__class__, + Numeric: Numeric, + }, + } + + +class SmallInteger(Integer): + + """A type for smaller ``int`` integers. + + Typically generates a ``SMALLINT`` in DDL, and otherwise acts like + a normal :class:`.Integer` on the Python side. + + """ + + __visit_name__ = 'small_integer' + + +class BigInteger(Integer): + + """A type for bigger ``int`` integers. + + Typically generates a ``BIGINT`` in DDL, and otherwise acts like + a normal :class:`.Integer` on the Python side. + + """ + + __visit_name__ = 'big_integer' + + +class Numeric(_DateAffinity, TypeEngine): + + """A type for fixed precision numbers, such as ``NUMERIC`` or ``DECIMAL``. + + This type returns Python ``decimal.Decimal`` objects by default, unless + the :paramref:`.Numeric.asdecimal` flag is set to False, in which case + they are coerced to Python ``float`` objects. + + .. note:: + + The :class:`.Numeric` type is designed to receive data from a database + type that is explicitly known to be a decimal type + (e.g. ``DECIMAL``, ``NUMERIC``, others) and not a floating point + type (e.g. ``FLOAT``, ``REAL``, others). + If the database column on the server is in fact a floating-point type + type, such as ``FLOAT`` or ``REAL``, use the :class:`.Float` + type or a subclass, otherwise numeric coercion between + ``float``/``Decimal`` may or may not function as expected. + + .. note:: + + The Python ``decimal.Decimal`` class is generally slow + performing; cPython 3.3 has now switched to use the `cdecimal + `_ library natively. For + older Python versions, the ``cdecimal`` library can be patched + into any application where it will replace the ``decimal`` + library fully, however this needs to be applied globally and + before any other modules have been imported, as follows:: + + import sys + import cdecimal + sys.modules["decimal"] = cdecimal + + Note that the ``cdecimal`` and ``decimal`` libraries are **not + compatible with each other**, so patching ``cdecimal`` at the + global level is the only way it can be used effectively with + various DBAPIs that hardcode to import the ``decimal`` library. + + """ + + __visit_name__ = 'numeric' + + _default_decimal_return_scale = 10 + + def __init__(self, precision=None, scale=None, + decimal_return_scale=None, asdecimal=True): + """ + Construct a Numeric. + + :param precision: the numeric precision for use in DDL ``CREATE + TABLE``. + + :param scale: the numeric scale for use in DDL ``CREATE TABLE``. + + :param asdecimal: default True. Return whether or not + values should be sent as Python Decimal objects, or + as floats. Different DBAPIs send one or the other based on + datatypes - the Numeric type will ensure that return values + are one or the other across DBAPIs consistently. + + :param decimal_return_scale: Default scale to use when converting + from floats to Python decimals. Floating point values will typically + be much longer due to decimal inaccuracy, and most floating point + database types don't have a notion of "scale", so by default the + float type looks for the first ten decimal places when converting. + Specfiying this value will override that length. Types which + do include an explicit ".scale" value, such as the base + :class:`.Numeric` as well as the MySQL float types, will use the + value of ".scale" as the default for decimal_return_scale, if not + otherwise specified. + + .. versionadded:: 0.9.0 + + When using the ``Numeric`` type, care should be taken to ensure + that the asdecimal setting is apppropriate for the DBAPI in use - + when Numeric applies a conversion from Decimal->float or float-> + Decimal, this conversion incurs an additional performance overhead + for all result columns received. + + DBAPIs that return Decimal natively (e.g. psycopg2) will have + better accuracy and higher performance with a setting of ``True``, + as the native translation to Decimal reduces the amount of floating- + point issues at play, and the Numeric type itself doesn't need + to apply any further conversions. However, another DBAPI which + returns floats natively *will* incur an additional conversion + overhead, and is still subject to floating point data loss - in + which case ``asdecimal=False`` will at least remove the extra + conversion overhead. + + """ + self.precision = precision + self.scale = scale + self.decimal_return_scale = decimal_return_scale + self.asdecimal = asdecimal + + @property + def _effective_decimal_return_scale(self): + if self.decimal_return_scale is not None: + return self.decimal_return_scale + elif getattr(self, "scale", None) is not None: + return self.scale + else: + return self._default_decimal_return_scale + + def get_dbapi_type(self, dbapi): + return dbapi.NUMBER + + def literal_processor(self, dialect): + def process(value): + return str(value) + return process + + @property + def python_type(self): + if self.asdecimal: + return decimal.Decimal + else: + return float + + def bind_processor(self, dialect): + if dialect.supports_native_decimal: + return None + else: + return processors.to_float + + def result_processor(self, dialect, coltype): + if self.asdecimal: + if dialect.supports_native_decimal: + # we're a "numeric", DBAPI will give us Decimal directly + return None + else: + util.warn('Dialect %s+%s does *not* support Decimal ' + 'objects natively, and SQLAlchemy must ' + 'convert from floating point - rounding ' + 'errors and other issues may occur. Please ' + 'consider storing Decimal numbers as strings ' + 'or integers on this platform for lossless ' + 'storage.' % (dialect.name, dialect.driver)) + + # we're a "numeric", DBAPI returns floats, convert. + return processors.to_decimal_processor_factory( + decimal.Decimal, + self.scale if self.scale is not None + else self._default_decimal_return_scale) + else: + if dialect.supports_native_decimal: + return processors.to_float + else: + return None + + @util.memoized_property + def _expression_adaptations(self): + return { + operators.mul: { + Interval: Interval, + Numeric: self.__class__, + Integer: self.__class__, + }, + operators.div: { + Numeric: self.__class__, + Integer: self.__class__, + }, + operators.truediv: { + Numeric: self.__class__, + Integer: self.__class__, + }, + operators.add: { + Numeric: self.__class__, + Integer: self.__class__, + }, + operators.sub: { + Numeric: self.__class__, + Integer: self.__class__, + } + } + + +class Float(Numeric): + + """Type representing floating point types, such as ``FLOAT`` or ``REAL``. + + This type returns Python ``float`` objects by default, unless the + :paramref:`.Float.asdecimal` flag is set to True, in which case they + are coerced to ``decimal.Decimal`` objects. + + .. note:: + + The :class:`.Float` type is designed to receive data from a database + type that is explicitly known to be a floating point type + (e.g. ``FLOAT``, ``REAL``, others) + and not a decimal type (e.g. ``DECIMAL``, ``NUMERIC``, others). + If the database column on the server is in fact a Numeric + type, such as ``DECIMAL`` or ``NUMERIC``, use the :class:`.Numeric` + type or a subclass, otherwise numeric coercion between + ``float``/``Decimal`` may or may not function as expected. + + """ + + __visit_name__ = 'float' + + scale = None + + def __init__(self, precision=None, asdecimal=False, + decimal_return_scale=None, **kwargs): + r""" + Construct a Float. + + :param precision: the numeric precision for use in DDL ``CREATE + TABLE``. + + :param asdecimal: the same flag as that of :class:`.Numeric`, but + defaults to ``False``. Note that setting this flag to ``True`` + results in floating point conversion. + + :param decimal_return_scale: Default scale to use when converting + from floats to Python decimals. Floating point values will typically + be much longer due to decimal inaccuracy, and most floating point + database types don't have a notion of "scale", so by default the + float type looks for the first ten decimal places when converting. + Specfiying this value will override that length. Note that the + MySQL float types, which do include "scale", will use "scale" + as the default for decimal_return_scale, if not otherwise specified. + + .. versionadded:: 0.9.0 + + :param \**kwargs: deprecated. Additional arguments here are ignored + by the default :class:`.Float` type. For database specific + floats that support additional arguments, see that dialect's + documentation for details, such as + :class:`sqlalchemy.dialects.mysql.FLOAT`. + + """ + self.precision = precision + self.asdecimal = asdecimal + self.decimal_return_scale = decimal_return_scale + if kwargs: + util.warn_deprecated("Additional keyword arguments " + "passed to Float ignored.") + + def result_processor(self, dialect, coltype): + if self.asdecimal: + return processors.to_decimal_processor_factory( + decimal.Decimal, + self._effective_decimal_return_scale) + else: + return None + + @util.memoized_property + def _expression_adaptations(self): + return { + operators.mul: { + Interval: Interval, + Numeric: self.__class__, + }, + operators.div: { + Numeric: self.__class__, + }, + operators.truediv: { + Numeric: self.__class__, + }, + operators.add: { + Numeric: self.__class__, + }, + operators.sub: { + Numeric: self.__class__, + } + } + + +class DateTime(_DateAffinity, TypeEngine): + + """A type for ``datetime.datetime()`` objects. + + Date and time types return objects from the Python ``datetime`` + module. Most DBAPIs have built in support for the datetime + module, with the noted exception of SQLite. In the case of + SQLite, date and time types are stored as strings which are then + converted back to datetime objects when rows are returned. + + For the time representation within the datetime type, some + backends include additional options, such as timezone support and + fractional seconds support. For fractional seconds, use the + dialect-specific datatype, such as :class:`.mysql.TIME`. For + timezone support, use at least the :class:`~.types.TIMESTAMP` datatype, + if not the dialect-specific datatype object. + + """ + + __visit_name__ = 'datetime' + + def __init__(self, timezone=False): + """Construct a new :class:`.DateTime`. + + :param timezone: boolean. Indicates that the datetime type should + enable timezone support, if available on the + **base date/time-holding type only**. It is recommended + to make use of the :class:`~.types.TIMESTAMP` datatype directly when + using this flag, as some databases include separate generic + date/time-holding types distinct from the timezone-capable + TIMESTAMP datatype, such as Oracle. + + + """ + self.timezone = timezone + + def get_dbapi_type(self, dbapi): + return dbapi.DATETIME + + @property + def python_type(self): + return dt.datetime + + @util.memoized_property + def _expression_adaptations(self): + return { + operators.add: { + Interval: self.__class__, + }, + operators.sub: { + Interval: self.__class__, + DateTime: Interval, + }, + } + + +class Date(_DateAffinity, TypeEngine): + + """A type for ``datetime.date()`` objects.""" + + __visit_name__ = 'date' + + def get_dbapi_type(self, dbapi): + return dbapi.DATETIME + + @property + def python_type(self): + return dt.date + + @util.memoized_property + def _expression_adaptations(self): + return { + operators.add: { + Integer: self.__class__, + Interval: DateTime, + Time: DateTime, + }, + operators.sub: { + # date - integer = date + Integer: self.__class__, + + # date - date = integer. + Date: Integer, + + Interval: DateTime, + + # date - datetime = interval, + # this one is not in the PG docs + # but works + DateTime: Interval, + }, + } + + +class Time(_DateAffinity, TypeEngine): + + """A type for ``datetime.time()`` objects.""" + + __visit_name__ = 'time' + + def __init__(self, timezone=False): + self.timezone = timezone + + def get_dbapi_type(self, dbapi): + return dbapi.DATETIME + + @property + def python_type(self): + return dt.time + + @util.memoized_property + def _expression_adaptations(self): + return { + operators.add: { + Date: DateTime, + Interval: self.__class__ + }, + operators.sub: { + Time: Interval, + Interval: self.__class__, + }, + } + + +class _Binary(TypeEngine): + + """Define base behavior for binary types.""" + + def __init__(self, length=None): + self.length = length + + def literal_processor(self, dialect): + def process(value): + value = value.decode(dialect.encoding).replace("'", "''") + return "'%s'" % value + return process + + @property + def python_type(self): + return util.binary_type + + # Python 3 - sqlite3 doesn't need the `Binary` conversion + # here, though pg8000 does to indicate "bytea" + def bind_processor(self, dialect): + if dialect.dbapi is None: + return None + + DBAPIBinary = dialect.dbapi.Binary + + def process(value): + if value is not None: + return DBAPIBinary(value) + else: + return None + return process + + # Python 3 has native bytes() type + # both sqlite3 and pg8000 seem to return it, + # psycopg2 as of 2.5 returns 'memoryview' + if util.py2k: + def result_processor(self, dialect, coltype): + if util.jython: + def process(value): + if value is not None: + if isinstance(value, array.array): + return value.tostring() + return str(value) + else: + return None + else: + process = processors.to_str + return process + else: + def result_processor(self, dialect, coltype): + def process(value): + if value is not None: + value = bytes(value) + return value + return process + + def coerce_compared_value(self, op, value): + """See :meth:`.TypeEngine.coerce_compared_value` for a description.""" + + if isinstance(value, util.string_types): + return self + else: + return super(_Binary, self).coerce_compared_value(op, value) + + def get_dbapi_type(self, dbapi): + return dbapi.BINARY + + +class LargeBinary(_Binary): + + """A type for large binary byte data. + + The :class:`.LargeBinary` type corresponds to a large and/or unlengthed + binary type for the target platform, such as BLOB on MySQL and BYTEA for + PostgreSQL. It also handles the necessary conversions for the DBAPI. + + """ + + __visit_name__ = 'large_binary' + + def __init__(self, length=None): + """ + Construct a LargeBinary type. + + :param length: optional, a length for the column for use in + DDL statements, for those binary types that accept a length, + such as the MySQL BLOB type. + + """ + _Binary.__init__(self, length=length) + + +class Binary(LargeBinary): + + """Deprecated. Renamed to LargeBinary.""" + + def __init__(self, *arg, **kw): + util.warn_deprecated('The Binary type has been renamed to ' + 'LargeBinary.') + LargeBinary.__init__(self, *arg, **kw) + + +class SchemaType(SchemaEventTarget): + + """Mark a type as possibly requiring schema-level DDL for usage. + + Supports types that must be explicitly created/dropped (i.e. PG ENUM type) + as well as types that are complimented by table or schema level + constraints, triggers, and other rules. + + :class:`.SchemaType` classes can also be targets for the + :meth:`.DDLEvents.before_parent_attach` and + :meth:`.DDLEvents.after_parent_attach` events, where the events fire off + surrounding the association of the type object with a parent + :class:`.Column`. + + .. seealso:: + + :class:`.Enum` + + :class:`.Boolean` + + + """ + + def __init__(self, name=None, schema=None, metadata=None, + inherit_schema=False, quote=None, _create_events=True): + if name is not None: + self.name = quoted_name(name, quote) + else: + self.name = None + self.schema = schema + self.metadata = metadata + self.inherit_schema = inherit_schema + self._create_events = _create_events + + if _create_events and self.metadata: + event.listen( + self.metadata, + "before_create", + util.portable_instancemethod(self._on_metadata_create) + ) + event.listen( + self.metadata, + "after_drop", + util.portable_instancemethod(self._on_metadata_drop) + ) + + def _translate_schema(self, effective_schema, map_): + return map_.get(effective_schema, effective_schema) + + def _set_parent(self, column): + column._on_table_attach(util.portable_instancemethod(self._set_table)) + + def _variant_mapping_for_set_table(self, column): + if isinstance(column.type, Variant): + variant_mapping = column.type.mapping.copy() + variant_mapping['_default'] = column.type.impl + else: + variant_mapping = None + return variant_mapping + + def _set_table(self, column, table): + if self.inherit_schema: + self.schema = table.schema + + if not self._create_events: + return + + variant_mapping = self._variant_mapping_for_set_table(column) + + event.listen( + table, + "before_create", + util.portable_instancemethod( + self._on_table_create, + {"variant_mapping": variant_mapping}) + ) + event.listen( + table, + "after_drop", + util.portable_instancemethod( + self._on_table_drop, + {"variant_mapping": variant_mapping}) + ) + if self.metadata is None: + # TODO: what's the difference between self.metadata + # and table.metadata here ? + event.listen( + table.metadata, + "before_create", + util.portable_instancemethod( + self._on_metadata_create, + {"variant_mapping": variant_mapping}) + ) + event.listen( + table.metadata, + "after_drop", + util.portable_instancemethod( + self._on_metadata_drop, + {"variant_mapping": variant_mapping}) + ) + + def copy(self, **kw): + return self.adapt(self.__class__, _create_events=True) + + def adapt(self, impltype, **kw): + schema = kw.pop('schema', self.schema) + metadata = kw.pop('metadata', self.metadata) + _create_events = kw.pop('_create_events', False) + + return impltype(name=self.name, + schema=schema, + inherit_schema=self.inherit_schema, + metadata=metadata, + _create_events=_create_events, + **kw) + + @property + def bind(self): + return self.metadata and self.metadata.bind or None + + def create(self, bind=None, checkfirst=False): + """Issue CREATE ddl for this type, if applicable.""" + + if bind is None: + bind = _bind_or_error(self) + t = self.dialect_impl(bind.dialect) + if t.__class__ is not self.__class__ and isinstance(t, SchemaType): + t.create(bind=bind, checkfirst=checkfirst) + + def drop(self, bind=None, checkfirst=False): + """Issue DROP ddl for this type, if applicable.""" + + if bind is None: + bind = _bind_or_error(self) + t = self.dialect_impl(bind.dialect) + if t.__class__ is not self.__class__ and isinstance(t, SchemaType): + t.drop(bind=bind, checkfirst=checkfirst) + + def _on_table_create(self, target, bind, **kw): + if not self._is_impl_for_variant(bind.dialect, kw): + return + + t = self.dialect_impl(bind.dialect) + if t.__class__ is not self.__class__ and isinstance(t, SchemaType): + t._on_table_create(target, bind, **kw) + + def _on_table_drop(self, target, bind, **kw): + if not self._is_impl_for_variant(bind.dialect, kw): + return + + t = self.dialect_impl(bind.dialect) + if t.__class__ is not self.__class__ and isinstance(t, SchemaType): + t._on_table_drop(target, bind, **kw) + + def _on_metadata_create(self, target, bind, **kw): + if not self._is_impl_for_variant(bind.dialect, kw): + return + + t = self.dialect_impl(bind.dialect) + if t.__class__ is not self.__class__ and isinstance(t, SchemaType): + t._on_metadata_create(target, bind, **kw) + + def _on_metadata_drop(self, target, bind, **kw): + if not self._is_impl_for_variant(bind.dialect, kw): + return + + t = self.dialect_impl(bind.dialect) + if t.__class__ is not self.__class__ and isinstance(t, SchemaType): + t._on_metadata_drop(target, bind, **kw) + + def _is_impl_for_variant(self, dialect, kw): + variant_mapping = kw.pop('variant_mapping', None) + if variant_mapping is None: + return True + + if dialect.name in variant_mapping and \ + variant_mapping[dialect.name] is self: + return True + elif dialect.name not in variant_mapping: + return variant_mapping['_default'] is self + + +class Enum(String, SchemaType): + + """Generic Enum Type. + + The :class:`.Enum` type provides a set of possible string values + which the column is constrained towards. + + The :class:`.Enum` type will make use of the backend's native "ENUM" + type if one is available; otherwise, it uses a VARCHAR datatype and + produces a CHECK constraint. Use of the backend-native enum type + can be disabled using the :paramref:`.Enum.native_enum` flag, and + the production of the CHECK constraint is configurable using the + :paramref:`.Enum.create_constraint` flag. + + The :class:`.Enum` type also provides in-Python validation of string + values during both read and write operations. When reading a value + from the database in a result set, the string value is always checked + against the list of possible values and a ``LookupError`` is raised + if no match is found. When passing a value to the database as a + plain string within a SQL statement, if the + :paramref:`.Enum.validate_strings` parameter is + set to True, a ``LookupError`` is raised for any string value that's + not located in the given list of possible values; note that this + impacts usage of LIKE expressions with enumerated values (an unusual + use case). + + .. versionchanged:: 1.1 the :class:`.Enum` type now provides in-Python + validation of input values as well as on data being returned by + the database. + + The source of enumerated values may be a list of string values, or + alternatively a PEP-435-compliant enumerated class. For the purposes + of the :class:`.Enum` datatype, this class need only provide a + ``__members__`` method. + + When using an enumerated class, the enumerated objects are used + both for input and output, rather than strings as is the case with + a plain-string enumerated type:: + + import enum + class MyEnum(enum.Enum): + one = 1 + two = 2 + three = 3 + + + t = Table( + 'data', MetaData(), + Column('value', Enum(MyEnum)) + ) + + connection.execute(t.insert(), {"value": MyEnum.two}) + assert connection.scalar(t.select()) is MyEnum.two + + Above, the string names of each element, e.g. "one", "two", "three", + are persisted to the database; the values of the Python Enum, here + indicated as integers, are **not** used; the value of each enum can + therefore be any kind of Python object whether or not it is persistable. + + .. versionadded:: 1.1 - support for PEP-435-style enumerated + classes. + + + .. seealso:: + + :class:`~.postgresql.ENUM` - PostgreSQL-specific type, + which has additional functionality. + + """ + + __visit_name__ = 'enum' + + def __init__(self, *enums, **kw): + r"""Construct an enum. + + Keyword arguments which don't apply to a specific backend are ignored + by that backend. + + :param \*enums: either exactly one PEP-435 compliant enumerated type + or one or more string or unicode enumeration labels. If unicode + labels are present, the `convert_unicode` flag is auto-enabled. + + .. versionadded:: 1.1 a PEP-435 style enumerated class may be + passed. + + :param convert_unicode: Enable unicode-aware bind parameter and + result-set processing for this Enum's data. This is set + automatically based on the presence of unicode label strings. + + :param create_constraint: defaults to True. When creating a non-native + enumerated type, also build a CHECK constraint on the database + against the valid values. + + .. versionadded:: 1.1 - added :paramref:`.Enum.create_constraint` + which provides the option to disable the production of the + CHECK constraint for a non-native enumerated type. + + :param metadata: Associate this type directly with a ``MetaData`` + object. For types that exist on the target database as an + independent schema construct (PostgreSQL), this type will be + created and dropped within ``create_all()`` and ``drop_all()`` + operations. If the type is not associated with any ``MetaData`` + object, it will associate itself with each ``Table`` in which it is + used, and will be created when any of those individual tables are + created, after a check is performed for its existence. The type is + only dropped when ``drop_all()`` is called for that ``Table`` + object's metadata, however. + + :param name: The name of this type. This is required for PostgreSQL + and any future supported database which requires an explicitly + named type, or an explicitly named constraint in order to generate + the type and/or a table that uses it. If a PEP-435 enumerated + class was used, its name (converted to lower case) is used by + default. + + :param native_enum: Use the database's native ENUM type when + available. Defaults to True. When False, uses VARCHAR + check + constraint for all backends. + + :param schema: Schema name of this type. For types that exist on the + target database as an independent schema construct (PostgreSQL), + this parameter specifies the named schema in which the type is + present. + + .. note:: + + The ``schema`` of the :class:`.Enum` type does not + by default make use of the ``schema`` established on the + owning :class:`.Table`. If this behavior is desired, + set the ``inherit_schema`` flag to ``True``. + + :param quote: Set explicit quoting preferences for the type's name. + + :param inherit_schema: When ``True``, the "schema" from the owning + :class:`.Table` will be copied to the "schema" attribute of this + :class:`.Enum`, replacing whatever value was passed for the + ``schema`` attribute. This also takes effect when using the + :meth:`.Table.tometadata` operation. + + :param validate_strings: when True, string values that are being + passed to the database in a SQL statement will be checked + for validity against the list of enumerated values. Unrecognized + values will result in a ``LookupError`` being raised. + + .. versionadded:: 1.1.0b2 + + """ + + values, objects = self._parse_into_values(enums, kw) + self._setup_for_values(values, objects, kw) + + self.native_enum = kw.pop('native_enum', True) + convert_unicode = kw.pop('convert_unicode', None) + self.create_constraint = kw.pop('create_constraint', True) + self.validate_strings = kw.pop('validate_strings', False) + + if convert_unicode is None: + for e in self.enums: + if isinstance(e, util.text_type): + convert_unicode = True + break + else: + convert_unicode = False + + if self.enums: + length = max(len(x) for x in self.enums) + else: + length = 0 + self._valid_lookup[None] = self._object_lookup[None] = None + + String.__init__(self, + length=length, + convert_unicode=convert_unicode, + ) + SchemaType.__init__(self, **kw) + + def _parse_into_values(self, enums, kw): + if len(enums) == 1 and hasattr(enums[0], '__members__'): + self.enum_class = enums[0] + values = list(self.enum_class.__members__) + objects = [self.enum_class.__members__[k] for k in values] + kw.setdefault('name', self.enum_class.__name__.lower()) + + return values, objects + else: + self.enum_class = None + return enums, enums + + def _setup_for_values(self, values, objects, kw): + self.enums = list(values) + + self._valid_lookup = dict( + zip(objects, values) + ) + self._object_lookup = dict( + (value, key) for key, value in self._valid_lookup.items() + ) + self._valid_lookup.update( + [(value, value) for value in self._valid_lookup.values()] + ) + + def _db_value_for_elem(self, elem): + try: + return self._valid_lookup[elem] + except KeyError: + # for unknown string values, we return as is. While we can + # validate these if we wanted, that does not allow for lesser-used + # end-user use cases, such as using a LIKE comparison with an enum, + # or for an application that wishes to apply string tests to an + # ENUM (see [ticket:3725]). While we can decide to differentiate + # here between an INSERT statement and a criteria used in a SELECT, + # for now we're staying conservative w/ behavioral changes (perhaps + # someone has a trigger that handles strings on INSERT) + if not self.validate_strings and \ + isinstance(elem, compat.string_types): + return elem + else: + raise LookupError( + '"%s" is not among the defined enum values' % elem) + + class Comparator(String.Comparator): + + def _adapt_expression(self, op, other_comparator): + op, typ = super(Enum.Comparator, self)._adapt_expression( + op, other_comparator) + if op is operators.concat_op: + typ = String( + self.type.length, + convert_unicode=self.type.convert_unicode) + return op, typ + + comparator_factory = Comparator + + def _object_value_for_elem(self, elem): + try: + return self._object_lookup[elem] + except KeyError: + raise LookupError( + '"%s" is not among the defined enum values' % elem) + + def __repr__(self): + return util.generic_repr(self, + additional_kw=[('native_enum', True)], + to_inspect=[Enum, SchemaType], + ) + + def _should_create_constraint(self, compiler, **kw): + if not self._is_impl_for_variant(compiler.dialect, kw): + return False + return not self.native_enum or \ + not compiler.dialect.supports_native_enum + + @util.dependencies("sqlalchemy.sql.schema") + def _set_table(self, schema, column, table): + if self.native_enum: + SchemaType._set_table(self, column, table) + + if not self.create_constraint: + return + + variant_mapping = self._variant_mapping_for_set_table(column) + + e = schema.CheckConstraint( + type_coerce(column, self).in_(self.enums), + name=_defer_name(self.name), + _create_rule=util.portable_instancemethod( + self._should_create_constraint, + {"variant_mapping": variant_mapping}), + _type_bound=True + ) + assert e.table is table + + def copy(self, **kw): + return SchemaType.copy(self, **kw) + + def adapt(self, impltype, **kw): + schema = kw.pop('schema', self.schema) + metadata = kw.pop('metadata', self.metadata) + _create_events = kw.pop('_create_events', False) + if issubclass(impltype, Enum): + if self.enum_class is not None: + args = [self.enum_class] + else: + args = self.enums + return impltype(name=self.name, + schema=schema, + metadata=metadata, + convert_unicode=self.convert_unicode, + native_enum=self.native_enum, + inherit_schema=self.inherit_schema, + validate_strings=self.validate_strings, + _create_events=_create_events, + *args, + **kw) + else: + # TODO: why would we be here? + return super(Enum, self).adapt(impltype, **kw) + + def literal_processor(self, dialect): + parent_processor = super(Enum, self).literal_processor(dialect) + + def process(value): + value = self._db_value_for_elem(value) + if parent_processor: + value = parent_processor(value) + return value + return process + + def bind_processor(self, dialect): + def process(value): + value = self._db_value_for_elem(value) + if parent_processor: + value = parent_processor(value) + return value + + parent_processor = super(Enum, self).bind_processor(dialect) + return process + + def result_processor(self, dialect, coltype): + parent_processor = super(Enum, self).result_processor( + dialect, coltype) + + def process(value): + if parent_processor: + value = parent_processor(value) + + value = self._object_value_for_elem(value) + return value + + return process + + @property + def python_type(self): + if self.enum_class: + return self.enum_class + else: + return super(Enum, self).python_type + + +class PickleType(TypeDecorator): + """Holds Python objects, which are serialized using pickle. + + PickleType builds upon the Binary type to apply Python's + ``pickle.dumps()`` to incoming objects, and ``pickle.loads()`` on + the way out, allowing any pickleable Python object to be stored as + a serialized binary field. + + To allow ORM change events to propagate for elements associated + with :class:`.PickleType`, see :ref:`mutable_toplevel`. + + """ + + impl = LargeBinary + + def __init__(self, protocol=pickle.HIGHEST_PROTOCOL, + pickler=None, comparator=None): + """ + Construct a PickleType. + + :param protocol: defaults to ``pickle.HIGHEST_PROTOCOL``. + + :param pickler: defaults to cPickle.pickle or pickle.pickle if + cPickle is not available. May be any object with + pickle-compatible ``dumps` and ``loads`` methods. + + :param comparator: a 2-arg callable predicate used + to compare values of this type. If left as ``None``, + the Python "equals" operator is used to compare values. + + """ + self.protocol = protocol + self.pickler = pickler or pickle + self.comparator = comparator + super(PickleType, self).__init__() + + def __reduce__(self): + return PickleType, (self.protocol, + None, + self.comparator) + + def bind_processor(self, dialect): + impl_processor = self.impl.bind_processor(dialect) + dumps = self.pickler.dumps + protocol = self.protocol + if impl_processor: + def process(value): + if value is not None: + value = dumps(value, protocol) + return impl_processor(value) + else: + def process(value): + if value is not None: + value = dumps(value, protocol) + return value + return process + + def result_processor(self, dialect, coltype): + impl_processor = self.impl.result_processor(dialect, coltype) + loads = self.pickler.loads + if impl_processor: + def process(value): + value = impl_processor(value) + if value is None: + return None + return loads(value) + else: + def process(value): + if value is None: + return None + return loads(value) + return process + + def compare_values(self, x, y): + if self.comparator: + return self.comparator(x, y) + else: + return x == y + + +class Boolean(TypeEngine, SchemaType): + + """A bool datatype. + + Boolean typically uses BOOLEAN or SMALLINT on the DDL side, and on + the Python side deals in ``True`` or ``False``. + + """ + + __visit_name__ = 'boolean' + + def __init__( + self, create_constraint=True, name=None, _create_events=True): + """Construct a Boolean. + + :param create_constraint: defaults to True. If the boolean + is generated as an int/smallint, also create a CHECK constraint + on the table that ensures 1 or 0 as a value. + + :param name: if a CHECK constraint is generated, specify + the name of the constraint. + + """ + self.create_constraint = create_constraint + self.name = name + self._create_events = _create_events + + def _should_create_constraint(self, compiler, **kw): + if not self._is_impl_for_variant(compiler.dialect, kw): + return False + return not compiler.dialect.supports_native_boolean + + @util.dependencies("sqlalchemy.sql.schema") + def _set_table(self, schema, column, table): + if not self.create_constraint: + return + + variant_mapping = self._variant_mapping_for_set_table(column) + + e = schema.CheckConstraint( + type_coerce(column, self).in_([0, 1]), + name=_defer_name(self.name), + _create_rule=util.portable_instancemethod( + self._should_create_constraint, + {"variant_mapping": variant_mapping}), + _type_bound=True + ) + assert e.table is table + + @property + def python_type(self): + return bool + + def literal_processor(self, dialect): + if dialect.supports_native_boolean: + def process(value): + return "true" if value else "false" + else: + def process(value): + return str(1 if value else 0) + return process + + def bind_processor(self, dialect): + if dialect.supports_native_boolean: + return None + else: + return processors.boolean_to_int + + def result_processor(self, dialect, coltype): + if dialect.supports_native_boolean: + return None + else: + return processors.int_to_boolean + + +class Interval(_DateAffinity, TypeDecorator): + + """A type for ``datetime.timedelta()`` objects. + + The Interval type deals with ``datetime.timedelta`` objects. In + PostgreSQL, the native ``INTERVAL`` type is used; for others, the + value is stored as a date which is relative to the "epoch" + (Jan. 1, 1970). + + Note that the ``Interval`` type does not currently provide date arithmetic + operations on platforms which do not support interval types natively. Such + operations usually require transformation of both sides of the expression + (such as, conversion of both sides into integer epoch values first) which + currently is a manual procedure (such as via + :attr:`~sqlalchemy.sql.expression.func`). + + """ + + impl = DateTime + epoch = dt.datetime.utcfromtimestamp(0) + + def __init__(self, native=True, + second_precision=None, + day_precision=None): + """Construct an Interval object. + + :param native: when True, use the actual + INTERVAL type provided by the database, if + supported (currently PostgreSQL, Oracle). + Otherwise, represent the interval data as + an epoch value regardless. + + :param second_precision: For native interval types + which support a "fractional seconds precision" parameter, + i.e. Oracle and PostgreSQL + + :param day_precision: for native interval types which + support a "day precision" parameter, i.e. Oracle. + + """ + super(Interval, self).__init__() + self.native = native + self.second_precision = second_precision + self.day_precision = day_precision + + def adapt(self, cls, **kw): + if self.native and hasattr(cls, '_adapt_from_generic_interval'): + return cls._adapt_from_generic_interval(self, **kw) + else: + return self.__class__( + native=self.native, + second_precision=self.second_precision, + day_precision=self.day_precision, + **kw) + + @property + def python_type(self): + return dt.timedelta + + def bind_processor(self, dialect): + impl_processor = self.impl.bind_processor(dialect) + epoch = self.epoch + if impl_processor: + def process(value): + if value is not None: + value = epoch + value + return impl_processor(value) + else: + def process(value): + if value is not None: + value = epoch + value + return value + return process + + def result_processor(self, dialect, coltype): + impl_processor = self.impl.result_processor(dialect, coltype) + epoch = self.epoch + if impl_processor: + def process(value): + value = impl_processor(value) + if value is None: + return None + return value - epoch + else: + def process(value): + if value is None: + return None + return value - epoch + return process + + @util.memoized_property + def _expression_adaptations(self): + return { + operators.add: { + Date: DateTime, + Interval: self.__class__, + DateTime: DateTime, + Time: Time, + }, + operators.sub: { + Interval: self.__class__ + }, + operators.mul: { + Numeric: self.__class__ + }, + operators.truediv: { + Numeric: self.__class__ + }, + operators.div: { + Numeric: self.__class__ + } + } + + @property + def _type_affinity(self): + return Interval + + def coerce_compared_value(self, op, value): + """See :meth:`.TypeEngine.coerce_compared_value` for a description.""" + + return self.impl.coerce_compared_value(op, value) + + +class JSON(Indexable, TypeEngine): + """Represent a SQL JSON type. + + .. note:: :class:`.types.JSON` is provided as a facade for vendor-specific + JSON types. Since it supports JSON SQL operations, it only + works on backends that have an actual JSON type, currently + PostgreSQL as well as certain versions of MySQL. + + :class:`.types.JSON` is part of the Core in support of the growing + popularity of native JSON datatypes. + + The :class:`.types.JSON` type stores arbitrary JSON format data, e.g.:: + + data_table = Table('data_table', metadata, + Column('id', Integer, primary_key=True), + Column('data', JSON) + ) + + with engine.connect() as conn: + conn.execute( + data_table.insert(), + data = {"key1": "value1", "key2": "value2"} + ) + + The base :class:`.types.JSON` provides these two operations: + + * Keyed index operations:: + + data_table.c.data['some key'] + + * Integer index operations:: + + data_table.c.data[3] + + * Path index operations:: + + data_table.c.data[('key_1', 'key_2', 5, ..., 'key_n')] + + Additional operations are available from the dialect-specific versions + of :class:`.types.JSON`, such as :class:`.postgresql.JSON` and + :class:`.postgresql.JSONB`, each of which offer more operators than + just the basic type. + + Index operations return an expression object whose type defaults to + :class:`.JSON` by default, so that further JSON-oriented instructions + may be called upon the result type. Note that there are backend-specific + idiosyncracies here, including that the Postgresql database does not generally + compare a "json" to a "json" structure without type casts. These idiosyncracies + can be accommodated in a backend-neutral way by by making explicit use + of the :func:`.cast` and :func:`.type_coerce` constructs. + Comparison of specific index elements of a :class:`.JSON` object + to other objects work best if the **left hand side is CAST to a string** + and the **right hand side is rendered as a json string**; a future SQLAlchemy + feature such as a generic "astext" modifier may simplify this at some point: + + * **Compare an element of a JSON structure to a string**:: + + from sqlalchemy import cast, type_coerce + from sqlalchemy import String, JSON + + cast( + data_table.c.data['some_key'], String + ) == '"some_value"' + + cast( + data_table.c.data['some_key'], String + ) == type_coerce("some_value", JSON) + + * **Compare an element of a JSON structure to an integer**:: + + from sqlalchemy import cast, type_coerce + from sqlalchemy import String, JSON + + cast(data_table.c.data['some_key'], String) == '55' + + cast( + data_table.c.data['some_key'], String + ) == type_coerce(55, JSON) + + * **Compare an element of a JSON structure to some other JSON structure** - note + that Python dictionaries are typically not ordered so care should be taken + here to assert that the JSON structures are identical:: + + from sqlalchemy import cast, type_coerce + from sqlalchemy import String, JSON + import json + + cast( + data_table.c.data['some_key'], String + ) == json.dumps({"foo": "bar"}) + + cast( + data_table.c.data['some_key'], String + ) == type_coerce({"foo": "bar"}, JSON) + + The :class:`.JSON` type, when used with the SQLAlchemy ORM, does not + detect in-place mutations to the structure. In order to detect these, the + :mod:`sqlalchemy.ext.mutable` extension must be used. This extension will + allow "in-place" changes to the datastructure to produce events which + will be detected by the unit of work. See the example at :class:`.HSTORE` + for a simple example involving a dictionary. + + When working with NULL values, the :class:`.JSON` type recommends the + use of two specific constants in order to differentiate between a column + that evaluates to SQL NULL, e.g. no value, vs. the JSON-encoded string + of ``"null"``. To insert or select against a value that is SQL NULL, + use the constant :func:`.null`:: + + from sqlalchemy import null + conn.execute(table.insert(), json_value=null()) + + To insert or select against a value that is JSON ``"null"``, use the + constant :attr:`.JSON.NULL`:: + + conn.execute(table.insert(), json_value=JSON.NULL) + + The :class:`.JSON` type supports a flag + :paramref:`.JSON.none_as_null` which when set to True will result + in the Python constant ``None`` evaluating to the value of SQL + NULL, and when set to False results in the Python constant + ``None`` evaluating to the value of JSON ``"null"``. The Python + value ``None`` may be used in conjunction with either + :attr:`.JSON.NULL` and :func:`.null` in order to indicate NULL + values, but care must be taken as to the value of the + :paramref:`.JSON.none_as_null` in these cases. + + .. seealso:: + + :class:`.postgresql.JSON` + + :class:`.postgresql.JSONB` + + :class:`.mysql.JSON` + + .. versionadded:: 1.1 + + + """ + __visit_name__ = 'JSON' + + hashable = False + NULL = util.symbol('JSON_NULL') + """Describe the json value of NULL. + + This value is used to force the JSON value of ``"null"`` to be + used as the value. A value of Python ``None`` will be recognized + either as SQL NULL or JSON ``"null"``, based on the setting + of the :paramref:`.JSON.none_as_null` flag; the :attr:`.JSON.NULL` + constant can be used to always resolve to JSON ``"null"`` regardless + of this setting. This is in contrast to the :func:`.sql.null` construct, + which always resolves to SQL NULL. E.g.:: + + from sqlalchemy import null + from sqlalchemy.dialects.postgresql import JSON + + obj1 = MyObject(json_value=null()) # will *always* insert SQL NULL + obj2 = MyObject(json_value=JSON.NULL) # will *always* insert JSON string "null" + + session.add_all([obj1, obj2]) + session.commit() + + """ + + def __init__(self, none_as_null=False): + """Construct a :class:`.types.JSON` type. + + :param none_as_null=False: if True, persist the value ``None`` as a + SQL NULL value, not the JSON encoding of ``null``. Note that + when this flag is False, the :func:`.null` construct can still + be used to persist a NULL value:: + + from sqlalchemy import null + conn.execute(table.insert(), data=null()) + + .. note:: + + :paramref:`.JSON.none_as_null` does **not** apply to the + values passed to :paramref:`.Column.default` and + :paramref:`.Column.server_default`; a value of ``None`` passed for + these parameters means "no default present". + + .. seealso:: + + :attr:`.types.JSON.NULL` + + """ + self.none_as_null = none_as_null + + class JSONElementType(TypeEngine): + """common function for index / path elements in a JSON expression.""" + + _integer = Integer() + _string = String() + + def string_bind_processor(self, dialect): + return self._string._cached_bind_processor(dialect) + + def string_literal_processor(self, dialect): + return self._string._cached_literal_processor(dialect) + + def bind_processor(self, dialect): + int_processor = self._integer._cached_bind_processor(dialect) + string_processor = self.string_bind_processor(dialect) + + def process(value): + if int_processor and isinstance(value, int): + value = int_processor(value) + elif string_processor and isinstance(value, util.string_types): + value = string_processor(value) + return value + + return process + + def literal_processor(self, dialect): + int_processor = self._integer._cached_literal_processor(dialect) + string_processor = self.string_literal_processor(dialect) + + def process(value): + if int_processor and isinstance(value, int): + value = int_processor(value) + elif string_processor and isinstance(value, util.string_types): + value = string_processor(value) + return value + + return process + + class JSONIndexType(JSONElementType): + """Placeholder for the datatype of a JSON index value. + + This allows execution-time processing of JSON index values + for special syntaxes. + + """ + + class JSONPathType(JSONElementType): + """Placeholder type for JSON path operations. + + This allows execution-time processing of a path-based + index value into a specific SQL syntax. + + """ + + class Comparator(Indexable.Comparator, Concatenable.Comparator): + """Define comparison operations for :class:`.types.JSON`.""" + + @util.dependencies('sqlalchemy.sql.default_comparator') + def _setup_getitem(self, default_comparator, index): + if not isinstance(index, util.string_types) and \ + isinstance(index, collections.Sequence): + index = default_comparator._check_literal( + self.expr, operators.json_path_getitem_op, + index, bindparam_type=JSON.JSONPathType + ) + + operator = operators.json_path_getitem_op + else: + index = default_comparator._check_literal( + self.expr, operators.json_getitem_op, + index, bindparam_type=JSON.JSONIndexType + ) + operator = operators.json_getitem_op + + return operator, index, self.type + + comparator_factory = Comparator + + @property + def python_type(self): + return dict + + @property + def should_evaluate_none(self): + return not self.none_as_null + + @util.memoized_property + def _str_impl(self): + return String(convert_unicode=True) + + def bind_processor(self, dialect): + string_process = self._str_impl.bind_processor(dialect) + + json_serializer = dialect._json_serializer or json.dumps + + def process(value): + if value is self.NULL: + value = None + elif isinstance(value, elements.Null) or ( + value is None and self.none_as_null + ): + return None + + serialized = json_serializer(value) + if string_process: + serialized = string_process(serialized) + return serialized + + return process + + def result_processor(self, dialect, coltype): + string_process = self._str_impl.result_processor(dialect, coltype) + json_deserializer = dialect._json_deserializer or json.loads + + def process(value): + if value is None: + return None + if string_process: + value = string_process(value) + return json_deserializer(value) + return process + + +class ARRAY(Indexable, Concatenable, TypeEngine): + """Represent a SQL Array type. + + .. note:: This type serves as the basis for all ARRAY operations. + However, currently **only the PostgreSQL backend has support + for SQL arrays in SQLAlchemy**. It is recommended to use the + :class:`.postgresql.ARRAY` type directly when using ARRAY types + with PostgreSQL, as it provides additional operators specific + to that backend. + + :class:`.types.ARRAY` is part of the Core in support of various SQL standard + functions such as :class:`.array_agg` which explicitly involve arrays; + however, with the exception of the PostgreSQL backend and possibly + some third-party dialects, no other SQLAlchemy built-in dialect has + support for this type. + + An :class:`.types.ARRAY` type is constructed given the "type" + of element:: + + mytable = Table("mytable", metadata, + Column("data", ARRAY(Integer)) + ) + + The above type represents an N-dimensional array, + meaning a supporting backend such as PostgreSQL will interpret values + with any number of dimensions automatically. To produce an INSERT + construct that passes in a 1-dimensional array of integers:: + + connection.execute( + mytable.insert(), + data=[1,2,3] + ) + + The :class:`.types.ARRAY` type can be constructed given a fixed number + of dimensions:: + + mytable = Table("mytable", metadata, + Column("data", ARRAY(Integer, dimensions=2)) + ) + + Sending a number of dimensions is optional, but recommended if the + datatype is to represent arrays of more than one dimension. This number + is used: + + * When emitting the type declaration itself to the database, e.g. + ``INTEGER[][]`` + + * When translating Python values to database values, and vice versa, e.g. + an ARRAY of :class:`.Unicode` objects uses this number to efficiently + access the string values inside of array structures without resorting + to per-row type inspection + + * When used with the Python ``getitem`` accessor, the number of dimensions + serves to define the kind of type that the ``[]`` operator should + return, e.g. for an ARRAY of INTEGER with two dimensions:: + + >>> expr = table.c.column[5] # returns ARRAY(Integer, dimensions=1) + >>> expr = expr[6] # returns Integer + + For 1-dimensional arrays, an :class:`.types.ARRAY` instance with no + dimension parameter will generally assume single-dimensional behaviors. + + SQL expressions of type :class:`.types.ARRAY` have support for "index" and + "slice" behavior. The Python ``[]`` operator works normally here, given + integer indexes or slices. Arrays default to 1-based indexing. + The operator produces binary expression + constructs which will produce the appropriate SQL, both for + SELECT statements:: + + select([mytable.c.data[5], mytable.c.data[2:7]]) + + as well as UPDATE statements when the :meth:`.Update.values` method + is used:: + + mytable.update().values({ + mytable.c.data[5]: 7, + mytable.c.data[2:7]: [1, 2, 3] + }) + + The :class:`.types.ARRAY` type also provides for the operators + :meth:`.types.ARRAY.Comparator.any` and :meth:`.types.ARRAY.Comparator.all`. + The PostgreSQL-specific version of :class:`.types.ARRAY` also provides additional + operators. + + .. versionadded:: 1.1.0 + + .. seealso:: + + :class:`.postgresql.ARRAY` + + """ + __visit_name__ = 'ARRAY' + + zero_indexes = False + """if True, Python zero-based indexes should be interpreted as one-based + on the SQL expression side.""" + + class Comparator(Indexable.Comparator, Concatenable.Comparator): + + """Define comparison operations for :class:`.types.ARRAY`. + + More operators are available on the dialect-specific form + of this type. See :class:`.postgresql.ARRAY.Comparator`. + + """ + + def _setup_getitem(self, index): + if isinstance(index, slice): + return_type = self.type + if self.type.zero_indexes: + index = slice( + index.start + 1, + index.stop + 1, + index.step + ) + index = Slice( + _literal_as_binds( + index.start, name=self.expr.key, + type_=type_api.INTEGERTYPE), + _literal_as_binds( + index.stop, name=self.expr.key, + type_=type_api.INTEGERTYPE), + _literal_as_binds( + index.step, name=self.expr.key, + type_=type_api.INTEGERTYPE) + ) + else: + if self.type.zero_indexes: + index += 1 + if self.type.dimensions is None or self.type.dimensions == 1: + return_type = self.type.item_type + else: + adapt_kw = {'dimensions': self.type.dimensions - 1} + return_type = self.type.adapt( + self.type.__class__, **adapt_kw) + + return operators.getitem, index, return_type + + @util.dependencies("sqlalchemy.sql.elements") + def any(self, elements, other, operator=None): + """Return ``other operator ANY (array)`` clause. + + Argument places are switched, because ANY requires array + expression to be on the right hand-side. + + E.g.:: + + from sqlalchemy.sql import operators + + conn.execute( + select([table.c.data]).where( + table.c.data.any(7, operator=operators.lt) + ) + ) + + :param other: expression to be compared + :param operator: an operator object from the + :mod:`sqlalchemy.sql.operators` + package, defaults to :func:`.operators.eq`. + + .. seealso:: + + :func:`.sql.expression.any_` + + :meth:`.types.ARRAY.Comparator.all` + + """ + operator = operator if operator else operators.eq + return operator( + elements._literal_as_binds(other), + elements.CollectionAggregate._create_any(self.expr) + ) + + @util.dependencies("sqlalchemy.sql.elements") + def all(self, elements, other, operator=None): + """Return ``other operator ALL (array)`` clause. + + Argument places are switched, because ALL requires array + expression to be on the right hand-side. + + E.g.:: + + from sqlalchemy.sql import operators + + conn.execute( + select([table.c.data]).where( + table.c.data.all(7, operator=operators.lt) + ) + ) + + :param other: expression to be compared + :param operator: an operator object from the + :mod:`sqlalchemy.sql.operators` + package, defaults to :func:`.operators.eq`. + + .. seealso:: + + :func:`.sql.expression.all_` + + :meth:`.types.ARRAY.Comparator.any` + + """ + operator = operator if operator else operators.eq + return operator( + elements._literal_as_binds(other), + elements.CollectionAggregate._create_all(self.expr) + ) + + comparator_factory = Comparator + + def __init__(self, item_type, as_tuple=False, dimensions=None, + zero_indexes=False): + """Construct an :class:`.types.ARRAY`. + + E.g.:: + + Column('myarray', ARRAY(Integer)) + + Arguments are: + + :param item_type: The data type of items of this array. Note that + dimensionality is irrelevant here, so multi-dimensional arrays like + ``INTEGER[][]``, are constructed as ``ARRAY(Integer)``, not as + ``ARRAY(ARRAY(Integer))`` or such. + + :param as_tuple=False: Specify whether return results + should be converted to tuples from lists. This parameter is + not generally needed as a Python list corresponds well + to a SQL array. + + :param dimensions: if non-None, the ARRAY will assume a fixed + number of dimensions. This impacts how the array is declared + on the database, how it goes about interpreting Python and + result values, as well as how expression behavior in conjunction + with the "getitem" operator works. See the description at + :class:`.types.ARRAY` for additional detail. + + :param zero_indexes=False: when True, index values will be converted + between Python zero-based and SQL one-based indexes, e.g. + a value of one will be added to all index values before passing + to the database. + + """ + if isinstance(item_type, ARRAY): + raise ValueError("Do not nest ARRAY types; ARRAY(basetype) " + "handles multi-dimensional arrays of basetype") + if isinstance(item_type, type): + item_type = item_type() + self.item_type = item_type + self.as_tuple = as_tuple + self.dimensions = dimensions + self.zero_indexes = zero_indexes + + @property + def hashable(self): + return self.as_tuple + + @property + def python_type(self): + return list + + def compare_values(self, x, y): + return x == y + + +class REAL(Float): + + """The SQL REAL type.""" + + __visit_name__ = 'REAL' + + +class FLOAT(Float): + + """The SQL FLOAT type.""" + + __visit_name__ = 'FLOAT' + + +class NUMERIC(Numeric): + + """The SQL NUMERIC type.""" + + __visit_name__ = 'NUMERIC' + + +class DECIMAL(Numeric): + + """The SQL DECIMAL type.""" + + __visit_name__ = 'DECIMAL' + + +class INTEGER(Integer): + + """The SQL INT or INTEGER type.""" + + __visit_name__ = 'INTEGER' +INT = INTEGER + + +class SMALLINT(SmallInteger): + + """The SQL SMALLINT type.""" + + __visit_name__ = 'SMALLINT' + + +class BIGINT(BigInteger): + + """The SQL BIGINT type.""" + + __visit_name__ = 'BIGINT' + + +class TIMESTAMP(DateTime): + + """The SQL TIMESTAMP type. + + :class:`~.types.TIMESTAMP` datatypes have support for timezone + storage on some backends, such as PostgreSQL and Oracle. Use the + :paramref:`~types.TIMESTAMP.timezone` argument in order to enable + "TIMESTAMP WITH TIMEZONE" for these backends. + + """ + + __visit_name__ = 'TIMESTAMP' + + def __init__(self, timezone=False): + """Construct a new :class:`.TIMESTAMP`. + + :param timezone: boolean. Indicates that the TIMESTAMP type should + enable timezone support, if available on the target database. + On a per-dialect basis is similar to "TIMESTAMP WITH TIMEZONE". + If the target database does not support timezones, this flag is + ignored. + + + """ + super(TIMESTAMP, self).__init__(timezone=timezone) + + def get_dbapi_type(self, dbapi): + return dbapi.TIMESTAMP + + +class DATETIME(DateTime): + + """The SQL DATETIME type.""" + + __visit_name__ = 'DATETIME' + + +class DATE(Date): + + """The SQL DATE type.""" + + __visit_name__ = 'DATE' + + +class TIME(Time): + + """The SQL TIME type.""" + + __visit_name__ = 'TIME' + + +class TEXT(Text): + + """The SQL TEXT type.""" + + __visit_name__ = 'TEXT' + + +class CLOB(Text): + + """The CLOB type. + + This type is found in Oracle and Informix. + """ + + __visit_name__ = 'CLOB' + + +class VARCHAR(String): + + """The SQL VARCHAR type.""" + + __visit_name__ = 'VARCHAR' + + +class NVARCHAR(Unicode): + + """The SQL NVARCHAR type.""" + + __visit_name__ = 'NVARCHAR' + + +class CHAR(String): + + """The SQL CHAR type.""" + + __visit_name__ = 'CHAR' + + +class NCHAR(Unicode): + + """The SQL NCHAR type.""" + + __visit_name__ = 'NCHAR' + + +class BLOB(LargeBinary): + + """The SQL BLOB type.""" + + __visit_name__ = 'BLOB' + + +class BINARY(_Binary): + + """The SQL BINARY type.""" + + __visit_name__ = 'BINARY' + + +class VARBINARY(_Binary): + + """The SQL VARBINARY type.""" + + __visit_name__ = 'VARBINARY' + + +class BOOLEAN(Boolean): + + """The SQL BOOLEAN type.""" + + __visit_name__ = 'BOOLEAN' + + +class NullType(TypeEngine): + + """An unknown type. + + :class:`.NullType` is used as a default type for those cases where + a type cannot be determined, including: + + * During table reflection, when the type of a column is not recognized + by the :class:`.Dialect` + * When constructing SQL expressions using plain Python objects of + unknown types (e.g. ``somecolumn == my_special_object``) + * When a new :class:`.Column` is created, and the given type is passed + as ``None`` or is not passed at all. + + The :class:`.NullType` can be used within SQL expression invocation + without issue, it just has no behavior either at the expression + construction level or at the bind-parameter/result processing level. + :class:`.NullType` will result in a :exc:`.CompileError` if the compiler + is asked to render the type itself, such as if it is used in a + :func:`.cast` operation or within a schema creation operation such as that + invoked by :meth:`.MetaData.create_all` or the :class:`.CreateTable` + construct. + + """ + __visit_name__ = 'null' + + _isnull = True + + hashable = False + + def literal_processor(self, dialect): + def process(value): + return "NULL" + return process + + class Comparator(TypeEngine.Comparator): + + def _adapt_expression(self, op, other_comparator): + if isinstance(other_comparator, NullType.Comparator) or \ + not operators.is_commutative(op): + return op, self.expr.type + else: + return other_comparator._adapt_expression(op, self) + comparator_factory = Comparator + + +class MatchType(Boolean): + """Refers to the return type of the MATCH operator. + + As the :meth:`.ColumnOperators.match` is probably the most open-ended + operator in generic SQLAlchemy Core, we can't assume the return type + at SQL evaluation time, as MySQL returns a floating point, not a boolean, + and other backends might do something different. So this type + acts as a placeholder, currently subclassing :class:`.Boolean`. + The type allows dialects to inject result-processing functionality + if needed, and on MySQL will return floating-point values. + + .. versionadded:: 1.0.0 + + """ + +NULLTYPE = NullType() +BOOLEANTYPE = Boolean() +STRINGTYPE = String() +INTEGERTYPE = Integer() +MATCHTYPE = MatchType() + +_type_map = { + int: Integer(), + float: Numeric(), + bool: BOOLEANTYPE, + decimal.Decimal: Numeric(), + dt.date: Date(), + dt.datetime: DateTime(), + dt.time: Time(), + dt.timedelta: Interval(), + util.NoneType: NULLTYPE +} + +if util.py3k: + _type_map[bytes] = LargeBinary() + _type_map[str] = Unicode() +else: + _type_map[unicode] = Unicode() + _type_map[str] = String() + +_type_map_get = _type_map.get + + +def _resolve_value_to_type(value): + _result_type = _type_map_get(type(value), False) + if _result_type is False: + # use inspect() to detect SQLAlchemy built-in + # objects. + insp = inspection.inspect(value, False) + if ( + insp is not None and + # foil mock.Mock() and other impostors by ensuring + # the inspection target itself self-inspects + insp.__class__ in inspection._registrars + ): + raise exc.ArgumentError( + "Object %r is not legal as a SQL literal value" % value) + return NULLTYPE + else: + return _result_type + +# back-assign to type_api +from . import type_api +type_api.BOOLEANTYPE = BOOLEANTYPE +type_api.STRINGTYPE = STRINGTYPE +type_api.INTEGERTYPE = INTEGERTYPE +type_api.NULLTYPE = NULLTYPE +type_api.MATCHTYPE = MATCHTYPE +type_api.INDEXABLE = Indexable +type_api._resolve_value_to_type = _resolve_value_to_type +TypeEngine.Comparator.BOOLEANTYPE = BOOLEANTYPE diff --git a/app/lib/sqlalchemy/sql/type_api.py b/app/lib/sqlalchemy/sql/type_api.py new file mode 100644 index 0000000..4b561a7 --- /dev/null +++ b/app/lib/sqlalchemy/sql/type_api.py @@ -0,0 +1,1307 @@ +# sql/types_api.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Base types API. + +""" + + +from .. import exc, util +from . import operators +from .visitors import Visitable, VisitableType +from .base import SchemaEventTarget + +# these are back-assigned by sqltypes. +BOOLEANTYPE = None +INTEGERTYPE = None +NULLTYPE = None +STRINGTYPE = None +MATCHTYPE = None +INDEXABLE = None +_resolve_value_to_type = None + + +class TypeEngine(Visitable): + """The ultimate base class for all SQL datatypes. + + Common subclasses of :class:`.TypeEngine` include + :class:`.String`, :class:`.Integer`, and :class:`.Boolean`. + + For an overview of the SQLAlchemy typing system, see + :ref:`types_toplevel`. + + .. seealso:: + + :ref:`types_toplevel` + + """ + + _sqla_type = True + _isnull = False + + class Comparator(operators.ColumnOperators): + """Base class for custom comparison operations defined at the + type level. See :attr:`.TypeEngine.comparator_factory`. + + + """ + __slots__ = 'expr', 'type' + + default_comparator = None + + def __init__(self, expr): + self.expr = expr + self.type = expr.type + + @util.dependencies('sqlalchemy.sql.default_comparator') + def operate(self, default_comparator, op, *other, **kwargs): + o = default_comparator.operator_lookup[op.__name__] + return o[0](self.expr, op, *(other + o[1:]), **kwargs) + + @util.dependencies('sqlalchemy.sql.default_comparator') + def reverse_operate(self, default_comparator, op, other, **kwargs): + o = default_comparator.operator_lookup[op.__name__] + return o[0](self.expr, op, other, + reverse=True, *o[1:], **kwargs) + + def _adapt_expression(self, op, other_comparator): + """evaluate the return type of , + and apply any adaptations to the given operator. + + This method determines the type of a resulting binary expression + given two source types and an operator. For example, two + :class:`.Column` objects, both of the type :class:`.Integer`, will + produce a :class:`.BinaryExpression` that also has the type + :class:`.Integer` when compared via the addition (``+``) operator. + However, using the addition operator with an :class:`.Integer` + and a :class:`.Date` object will produce a :class:`.Date`, assuming + "days delta" behavior by the database (in reality, most databases + other than PostgreSQL don't accept this particular operation). + + The method returns a tuple of the form , . + The resulting operator and type will be those applied to the + resulting :class:`.BinaryExpression` as the final operator and the + right-hand side of the expression. + + Note that only a subset of operators make usage of + :meth:`._adapt_expression`, + including math operators and user-defined operators, but not + boolean comparison or special SQL keywords like MATCH or BETWEEN. + + """ + return op, self.type + + def __reduce__(self): + return _reconstitute_comparator, (self.expr, ) + + hashable = True + """Flag, if False, means values from this type aren't hashable. + + Used by the ORM when uniquing result lists. + + """ + + comparator_factory = Comparator + """A :class:`.TypeEngine.Comparator` class which will apply + to operations performed by owning :class:`.ColumnElement` objects. + + The :attr:`.comparator_factory` attribute is a hook consulted by + the core expression system when column and SQL expression operations + are performed. When a :class:`.TypeEngine.Comparator` class is + associated with this attribute, it allows custom re-definition of + all existing operators, as well as definition of new operators. + Existing operators include those provided by Python operator overloading + such as :meth:`.operators.ColumnOperators.__add__` and + :meth:`.operators.ColumnOperators.__eq__`, + those provided as standard + attributes of :class:`.operators.ColumnOperators` such as + :meth:`.operators.ColumnOperators.like` + and :meth:`.operators.ColumnOperators.in_`. + + Rudimentary usage of this hook is allowed through simple subclassing + of existing types, or alternatively by using :class:`.TypeDecorator`. + See the documentation section :ref:`types_operators` for examples. + + .. versionadded:: 0.8 The expression system was enhanced to support + customization of operators on a per-type level. + + """ + + should_evaluate_none = False + """If True, the Python constant ``None`` is considered to be handled + explicitly by this type. + + The ORM uses this flag to indicate that a positive value of ``None`` + is passed to the column in an INSERT statement, rather than omitting + the column from the INSERT statement which has the effect of firing + off column-level defaults. It also allows types which have special + behavior for Python None, such as a JSON type, to indicate that + they'd like to handle the None value explicitly. + + To set this flag on an existing type, use the + :meth:`.TypeEngine.evaluates_none` method. + + .. seealso:: + + :meth:`.TypeEngine.evaluates_none` + + .. versionadded:: 1.1 + + + """ + + def evaluates_none(self): + """Return a copy of this type which has the :attr:`.should_evaluate_none` + flag set to True. + + E.g.:: + + Table( + 'some_table', metadata, + Column( + String(50).evaluates_none(), + nullable=True, + server_default='no value') + ) + + The ORM uses this flag to indicate that a positive value of ``None`` + is passed to the column in an INSERT statement, rather than omitting + the column from the INSERT statement which has the effect of firing + off column-level defaults. It also allows for types which have + special behavior associated with the Python None value to indicate + that the value doesn't necessarily translate into SQL NULL; a + prime example of this is a JSON type which may wish to persist the + JSON value ``'null'``. + + In all cases, the actual NULL SQL value can be always be + persisted in any column by using + the :obj:`~.expression.null` SQL construct in an INSERT statement + or associated with an ORM-mapped attribute. + + .. note:: + + The "evaulates none" flag does **not** apply to a value + of ``None`` passed to :paramref:`.Column.default` or + :paramref:`.Column.server_default`; in these cases, ``None`` + still means "no default". + + .. versionadded:: 1.1 + + .. seealso:: + + :ref:`session_forcing_null` - in the ORM documentation + + :paramref:`.postgresql.JSON.none_as_null` - PostgreSQL JSON + interaction with this flag. + + :attr:`.TypeEngine.should_evaluate_none` - class-level flag + + """ + typ = self.copy() + typ.should_evaluate_none = True + return typ + + def copy(self, **kw): + return self.adapt(self.__class__) + + def compare_against_backend(self, dialect, conn_type): + """Compare this type against the given backend type. + + This function is currently not implemented for SQLAlchemy + types, and for all built in types will return ``None``. However, + it can be implemented by a user-defined type + where it can be consumed by schema comparison tools such as + Alembic autogenerate. + + A future release of SQLAlchemy will potentially impement this method + for builtin types as well. + + The function should return True if this type is equivalent to the + given type; the type is typically reflected from the database + so should be database specific. The dialect in use is also + passed. It can also return False to assert that the type is + not equivalent. + + :param dialect: a :class:`.Dialect` that is involved in the comparison. + + :param conn_type: the type object reflected from the backend. + + .. versionadded:: 1.0.3 + + """ + return None + + def copy_value(self, value): + return value + + def literal_processor(self, dialect): + """Return a conversion function for processing literal values that are + to be rendered directly without using binds. + + This function is used when the compiler makes use of the + "literal_binds" flag, typically used in DDL generation as well + as in certain scenarios where backends don't accept bound parameters. + + .. versionadded:: 0.9.0 + + """ + return None + + def bind_processor(self, dialect): + """Return a conversion function for processing bind values. + + Returns a callable which will receive a bind parameter value + as the sole positional argument and will return a value to + send to the DB-API. + + If processing is not necessary, the method should return ``None``. + + :param dialect: Dialect instance in use. + + """ + return None + + def result_processor(self, dialect, coltype): + """Return a conversion function for processing result row values. + + Returns a callable which will receive a result row column + value as the sole positional argument and will return a value + to return to the user. + + If processing is not necessary, the method should return ``None``. + + :param dialect: Dialect instance in use. + + :param coltype: DBAPI coltype argument received in cursor.description. + + """ + return None + + def column_expression(self, colexpr): + """Given a SELECT column expression, return a wrapping SQL expression. + + This is typically a SQL function that wraps a column expression + as rendered in the columns clause of a SELECT statement. + It is used for special data types that require + columns to be wrapped in some special database function in order + to coerce the value before being sent back to the application. + It is the SQL analogue of the :meth:`.TypeEngine.result_processor` + method. + + The method is evaluated at statement compile time, as opposed + to statement construction time. + + See also: + + :ref:`types_sql_value_processing` + + """ + + return None + + @util.memoized_property + def _has_column_expression(self): + """memoized boolean, check if column_expression is implemented. + + Allows the method to be skipped for the vast majority of expression + types that don't use this feature. + + """ + + return self.__class__.column_expression.__code__ \ + is not TypeEngine.column_expression.__code__ + + def bind_expression(self, bindvalue): + """"Given a bind value (i.e. a :class:`.BindParameter` instance), + return a SQL expression in its place. + + This is typically a SQL function that wraps the existing bound + parameter within the statement. It is used for special data types + that require literals being wrapped in some special database function + in order to coerce an application-level value into a database-specific + format. It is the SQL analogue of the + :meth:`.TypeEngine.bind_processor` method. + + The method is evaluated at statement compile time, as opposed + to statement construction time. + + Note that this method, when implemented, should always return + the exact same structure, without any conditional logic, as it + may be used in an executemany() call against an arbitrary number + of bound parameter sets. + + See also: + + :ref:`types_sql_value_processing` + + """ + return None + + @util.memoized_property + def _has_bind_expression(self): + """memoized boolean, check if bind_expression is implemented. + + Allows the method to be skipped for the vast majority of expression + types that don't use this feature. + + """ + + return self.__class__.bind_expression.__code__ \ + is not TypeEngine.bind_expression.__code__ + + def compare_values(self, x, y): + """Compare two values for equality.""" + + return x == y + + def get_dbapi_type(self, dbapi): + """Return the corresponding type object from the underlying DB-API, if + any. + + This can be useful for calling ``setinputsizes()``, for example. + + """ + return None + + @property + def python_type(self): + """Return the Python type object expected to be returned + by instances of this type, if known. + + Basically, for those types which enforce a return type, + or are known across the board to do such for all common + DBAPIs (like ``int`` for example), will return that type. + + If a return type is not defined, raises + ``NotImplementedError``. + + Note that any type also accommodates NULL in SQL which + means you can also get back ``None`` from any type + in practice. + + """ + raise NotImplementedError() + + def with_variant(self, type_, dialect_name): + """Produce a new type object that will utilize the given + type when applied to the dialect of the given name. + + e.g.:: + + from sqlalchemy.types import String + from sqlalchemy.dialects import mysql + + s = String() + + s = s.with_variant(mysql.VARCHAR(collation='foo'), 'mysql') + + The construction of :meth:`.TypeEngine.with_variant` is always + from the "fallback" type to that which is dialect specific. + The returned type is an instance of :class:`.Variant`, which + itself provides a :meth:`.Variant.with_variant` + that can be called repeatedly. + + :param type_: a :class:`.TypeEngine` that will be selected + as a variant from the originating type, when a dialect + of the given name is in use. + :param dialect_name: base name of the dialect which uses + this type. (i.e. ``'postgresql'``, ``'mysql'``, etc.) + + .. versionadded:: 0.7.2 + + """ + return Variant(self, {dialect_name: to_instance(type_)}) + + @util.memoized_property + def _type_affinity(self): + """Return a rudimental 'affinity' value expressing the general class + of type.""" + + typ = None + for t in self.__class__.__mro__: + if t in (TypeEngine, UserDefinedType): + return typ + elif issubclass(t, (TypeEngine, UserDefinedType)): + typ = t + else: + return self.__class__ + + def dialect_impl(self, dialect): + """Return a dialect-specific implementation for this + :class:`.TypeEngine`. + + """ + try: + return dialect._type_memos[self]['impl'] + except KeyError: + return self._dialect_info(dialect)['impl'] + + def _cached_literal_processor(self, dialect): + """Return a dialect-specific literal processor for this type.""" + try: + return dialect._type_memos[self]['literal'] + except KeyError: + d = self._dialect_info(dialect) + d['literal'] = lp = d['impl'].literal_processor(dialect) + return lp + + def _cached_bind_processor(self, dialect): + """Return a dialect-specific bind processor for this type.""" + + try: + return dialect._type_memos[self]['bind'] + except KeyError: + d = self._dialect_info(dialect) + d['bind'] = bp = d['impl'].bind_processor(dialect) + return bp + + def _cached_result_processor(self, dialect, coltype): + """Return a dialect-specific result processor for this type.""" + + try: + return dialect._type_memos[self][coltype] + except KeyError: + d = self._dialect_info(dialect) + # key assumption: DBAPI type codes are + # constants. Else this dictionary would + # grow unbounded. + d[coltype] = rp = d['impl'].result_processor(dialect, coltype) + return rp + + def _dialect_info(self, dialect): + """Return a dialect-specific registry which + caches a dialect-specific implementation, bind processing + function, and one or more result processing functions.""" + + if self in dialect._type_memos: + return dialect._type_memos[self] + else: + impl = self._gen_dialect_impl(dialect) + if impl is self: + impl = self.adapt(type(self)) + # this can't be self, else we create a cycle + assert impl is not self + dialect._type_memos[self] = d = {'impl': impl} + return d + + def _gen_dialect_impl(self, dialect): + return dialect.type_descriptor(self) + + def adapt(self, cls, **kw): + """Produce an "adapted" form of this type, given an "impl" class + to work with. + + This method is used internally to associate generic + types with "implementation" types that are specific to a particular + dialect. + """ + return util.constructor_copy(self, cls, **kw) + + def coerce_compared_value(self, op, value): + """Suggest a type for a 'coerced' Python value in an expression. + + Given an operator and value, gives the type a chance + to return a type which the value should be coerced into. + + The default behavior here is conservative; if the right-hand + side is already coerced into a SQL type based on its + Python type, it is usually left alone. + + End-user functionality extension here should generally be via + :class:`.TypeDecorator`, which provides more liberal behavior in that + it defaults to coercing the other side of the expression into this + type, thus applying special Python conversions above and beyond those + needed by the DBAPI to both ides. It also provides the public method + :meth:`.TypeDecorator.coerce_compared_value` which is intended for + end-user customization of this behavior. + + """ + _coerced_type = _resolve_value_to_type(value) + if _coerced_type is NULLTYPE or _coerced_type._type_affinity \ + is self._type_affinity: + return self + else: + return _coerced_type + + def _compare_type_affinity(self, other): + return self._type_affinity is other._type_affinity + + def compile(self, dialect=None): + """Produce a string-compiled form of this :class:`.TypeEngine`. + + When called with no arguments, uses a "default" dialect + to produce a string result. + + :param dialect: a :class:`.Dialect` instance. + + """ + # arg, return value is inconsistent with + # ClauseElement.compile()....this is a mistake. + + if not dialect: + dialect = self._default_dialect() + + return dialect.type_compiler.process(self) + + @util.dependencies("sqlalchemy.engine.default") + def _default_dialect(self, default): + if self.__class__.__module__.startswith("sqlalchemy.dialects"): + tokens = self.__class__.__module__.split(".")[0:3] + mod = ".".join(tokens) + return getattr(__import__(mod).dialects, tokens[-1]).dialect() + else: + return default.DefaultDialect() + + def __str__(self): + if util.py2k: + return unicode(self.compile()).\ + encode('ascii', 'backslashreplace') + else: + return str(self.compile()) + + def __repr__(self): + return util.generic_repr(self) + + +class VisitableCheckKWArg(util.EnsureKWArgType, VisitableType): + pass + + +class UserDefinedType(util.with_metaclass(VisitableCheckKWArg, TypeEngine)): + """Base for user defined types. + + This should be the base of new types. Note that + for most cases, :class:`.TypeDecorator` is probably + more appropriate:: + + import sqlalchemy.types as types + + class MyType(types.UserDefinedType): + def __init__(self, precision = 8): + self.precision = precision + + def get_col_spec(self, **kw): + return "MYTYPE(%s)" % self.precision + + def bind_processor(self, dialect): + def process(value): + return value + return process + + def result_processor(self, dialect, coltype): + def process(value): + return value + return process + + Once the type is made, it's immediately usable:: + + table = Table('foo', meta, + Column('id', Integer, primary_key=True), + Column('data', MyType(16)) + ) + + The ``get_col_spec()`` method will in most cases receive a keyword + argument ``type_expression`` which refers to the owning expression + of the type as being compiled, such as a :class:`.Column` or + :func:`.cast` construct. This keyword is only sent if the method + accepts keyword arguments (e.g. ``**kw``) in its argument signature; + introspection is used to check for this in order to support legacy + forms of this function. + + .. versionadded:: 1.0.0 the owning expression is passed to + the ``get_col_spec()`` method via the keyword argument + ``type_expression``, if it receives ``**kw`` in its signature. + + """ + __visit_name__ = "user_defined" + + ensure_kwarg = 'get_col_spec' + + class Comparator(TypeEngine.Comparator): + __slots__ = () + + def _adapt_expression(self, op, other_comparator): + if hasattr(self.type, 'adapt_operator'): + util.warn_deprecated( + "UserDefinedType.adapt_operator is deprecated. Create " + "a UserDefinedType.Comparator subclass instead which " + "generates the desired expression constructs, given a " + "particular operator." + ) + return self.type.adapt_operator(op), self.type + else: + return op, self.type + + comparator_factory = Comparator + + def coerce_compared_value(self, op, value): + """Suggest a type for a 'coerced' Python value in an expression. + + Default behavior for :class:`.UserDefinedType` is the + same as that of :class:`.TypeDecorator`; by default it returns + ``self``, assuming the compared value should be coerced into + the same type as this one. See + :meth:`.TypeDecorator.coerce_compared_value` for more detail. + + .. versionchanged:: 0.8 :meth:`.UserDefinedType.coerce_compared_value` + now returns ``self`` by default, rather than falling onto the + more fundamental behavior of + :meth:`.TypeEngine.coerce_compared_value`. + + """ + + return self + + +class TypeDecorator(SchemaEventTarget, TypeEngine): + """Allows the creation of types which add additional functionality + to an existing type. + + This method is preferred to direct subclassing of SQLAlchemy's + built-in types as it ensures that all required functionality of + the underlying type is kept in place. + + Typical usage:: + + import sqlalchemy.types as types + + class MyType(types.TypeDecorator): + '''Prefixes Unicode values with "PREFIX:" on the way in and + strips it off on the way out. + ''' + + impl = types.Unicode + + def process_bind_param(self, value, dialect): + return "PREFIX:" + value + + def process_result_value(self, value, dialect): + return value[7:] + + def copy(self, **kw): + return MyType(self.impl.length) + + The class-level "impl" attribute is required, and can reference any + TypeEngine class. Alternatively, the load_dialect_impl() method + can be used to provide different type classes based on the dialect + given; in this case, the "impl" variable can reference + ``TypeEngine`` as a placeholder. + + Types that receive a Python type that isn't similar to the ultimate type + used may want to define the :meth:`TypeDecorator.coerce_compared_value` + method. This is used to give the expression system a hint when coercing + Python objects into bind parameters within expressions. Consider this + expression:: + + mytable.c.somecol + datetime.date(2009, 5, 15) + + Above, if "somecol" is an ``Integer`` variant, it makes sense that + we're doing date arithmetic, where above is usually interpreted + by databases as adding a number of days to the given date. + The expression system does the right thing by not attempting to + coerce the "date()" value into an integer-oriented bind parameter. + + However, in the case of ``TypeDecorator``, we are usually changing an + incoming Python type to something new - ``TypeDecorator`` by default will + "coerce" the non-typed side to be the same type as itself. Such as below, + we define an "epoch" type that stores a date value as an integer:: + + class MyEpochType(types.TypeDecorator): + impl = types.Integer + + epoch = datetime.date(1970, 1, 1) + + def process_bind_param(self, value, dialect): + return (value - self.epoch).days + + def process_result_value(self, value, dialect): + return self.epoch + timedelta(days=value) + + Our expression of ``somecol + date`` with the above type will coerce the + "date" on the right side to also be treated as ``MyEpochType``. + + This behavior can be overridden via the + :meth:`~TypeDecorator.coerce_compared_value` method, which returns a type + that should be used for the value of the expression. Below we set it such + that an integer value will be treated as an ``Integer``, and any other + value is assumed to be a date and will be treated as a ``MyEpochType``:: + + def coerce_compared_value(self, op, value): + if isinstance(value, int): + return Integer() + else: + return self + + .. warning:: + + Note that the **behavior of coerce_compared_value is not inherited + by default from that of the base type**. + If the :class:`.TypeDecorator` is augmenting a + type that requires special logic for certain types of operators, + this method **must** be overridden. A key example is when decorating + the :class:`.postgresql.JSON` and :class:`.postgresql.JSONB` types; + the default rules of :meth:`.TypeEngine.coerce_compared_value` should + be used in order to deal with operators like index operations:: + + class MyJsonType(TypeDecorator): + impl = postgresql.JSON + + def coerce_compared_value(self, op, value): + return self.impl.coerce_compared_value(op, value) + + Without the above step, index operations such as ``mycol['foo']`` + will cause the index value ``'foo'`` to be JSON encoded. + + """ + + __visit_name__ = "type_decorator" + + def __init__(self, *args, **kwargs): + """Construct a :class:`.TypeDecorator`. + + Arguments sent here are passed to the constructor + of the class assigned to the ``impl`` class level attribute, + assuming the ``impl`` is a callable, and the resulting + object is assigned to the ``self.impl`` instance attribute + (thus overriding the class attribute of the same name). + + If the class level ``impl`` is not a callable (the unusual case), + it will be assigned to the same instance attribute 'as-is', + ignoring those arguments passed to the constructor. + + Subclasses can override this to customize the generation + of ``self.impl`` entirely. + + """ + + if not hasattr(self.__class__, 'impl'): + raise AssertionError("TypeDecorator implementations " + "require a class-level variable " + "'impl' which refers to the class of " + "type being decorated") + self.impl = to_instance(self.__class__.impl, *args, **kwargs) + + coerce_to_is_types = (util.NoneType, ) + """Specify those Python types which should be coerced at the expression + level to "IS " when compared using ``==`` (and same for + ``IS NOT`` in conjunction with ``!=``. + + For most SQLAlchemy types, this includes ``NoneType``, as well as + ``bool``. + + :class:`.TypeDecorator` modifies this list to only include ``NoneType``, + as typedecorator implementations that deal with boolean types are common. + + Custom :class:`.TypeDecorator` classes can override this attribute to + return an empty tuple, in which case no values will be coerced to + constants. + + .. versionadded:: 0.8.2 + Added :attr:`.TypeDecorator.coerce_to_is_types` to allow for easier + control of ``__eq__()`` ``__ne__()`` operations. + + """ + + class Comparator(TypeEngine.Comparator): + __slots__ = () + + def operate(self, op, *other, **kwargs): + kwargs['_python_is_types'] = self.expr.type.coerce_to_is_types + return super(TypeDecorator.Comparator, self).operate( + op, *other, **kwargs) + + def reverse_operate(self, op, other, **kwargs): + kwargs['_python_is_types'] = self.expr.type.coerce_to_is_types + return super(TypeDecorator.Comparator, self).reverse_operate( + op, other, **kwargs) + + @property + def comparator_factory(self): + if TypeDecorator.Comparator in self.impl.comparator_factory.__mro__: + return self.impl.comparator_factory + else: + return type("TDComparator", + (TypeDecorator.Comparator, + self.impl.comparator_factory), + {}) + + def _gen_dialect_impl(self, dialect): + """ + #todo + """ + adapted = dialect.type_descriptor(self) + if adapted is not self: + return adapted + + # otherwise adapt the impl type, link + # to a copy of this TypeDecorator and return + # that. + typedesc = self.load_dialect_impl(dialect).dialect_impl(dialect) + tt = self.copy() + if not isinstance(tt, self.__class__): + raise AssertionError('Type object %s does not properly ' + 'implement the copy() method, it must ' + 'return an object of type %s' % + (self, self.__class__)) + tt.impl = typedesc + return tt + + @property + def _type_affinity(self): + """ + #todo + """ + return self.impl._type_affinity + + def _set_parent(self, column): + """Support SchemaEventTarget""" + + super(TypeDecorator, self)._set_parent(column) + + if isinstance(self.impl, SchemaEventTarget): + self.impl._set_parent(column) + + def _set_parent_with_dispatch(self, parent): + """Support SchemaEventTarget""" + + super(TypeDecorator, self)._set_parent_with_dispatch(parent) + + if isinstance(self.impl, SchemaEventTarget): + self.impl._set_parent_with_dispatch(parent) + + def type_engine(self, dialect): + """Return a dialect-specific :class:`.TypeEngine` instance + for this :class:`.TypeDecorator`. + + In most cases this returns a dialect-adapted form of + the :class:`.TypeEngine` type represented by ``self.impl``. + Makes usage of :meth:`dialect_impl` but also traverses + into wrapped :class:`.TypeDecorator` instances. + Behavior can be customized here by overriding + :meth:`load_dialect_impl`. + + """ + adapted = dialect.type_descriptor(self) + if not isinstance(adapted, type(self)): + return adapted + elif isinstance(self.impl, TypeDecorator): + return self.impl.type_engine(dialect) + else: + return self.load_dialect_impl(dialect) + + def load_dialect_impl(self, dialect): + """Return a :class:`.TypeEngine` object corresponding to a dialect. + + This is an end-user override hook that can be used to provide + differing types depending on the given dialect. It is used + by the :class:`.TypeDecorator` implementation of :meth:`type_engine` + to help determine what type should ultimately be returned + for a given :class:`.TypeDecorator`. + + By default returns ``self.impl``. + + """ + return self.impl + + def __getattr__(self, key): + """Proxy all other undefined accessors to the underlying + implementation.""" + return getattr(self.impl, key) + + def process_literal_param(self, value, dialect): + """Receive a literal parameter value to be rendered inline within + a statement. + + This method is used when the compiler renders a + literal value without using binds, typically within DDL + such as in the "server default" of a column or an expression + within a CHECK constraint. + + The returned string will be rendered into the output string. + + .. versionadded:: 0.9.0 + + """ + raise NotImplementedError() + + def process_bind_param(self, value, dialect): + """Receive a bound parameter value to be converted. + + Subclasses override this method to return the + value that should be passed along to the underlying + :class:`.TypeEngine` object, and from there to the + DBAPI ``execute()`` method. + + The operation could be anything desired to perform custom + behavior, such as transforming or serializing data. + This could also be used as a hook for validating logic. + + This operation should be designed with the reverse operation + in mind, which would be the process_result_value method of + this class. + + :param value: Data to operate upon, of any type expected by + this method in the subclass. Can be ``None``. + :param dialect: the :class:`.Dialect` in use. + + """ + + raise NotImplementedError() + + def process_result_value(self, value, dialect): + """Receive a result-row column value to be converted. + + Subclasses should implement this method to operate on data + fetched from the database. + + Subclasses override this method to return the + value that should be passed back to the application, + given a value that is already processed by + the underlying :class:`.TypeEngine` object, originally + from the DBAPI cursor method ``fetchone()`` or similar. + + The operation could be anything desired to perform custom + behavior, such as transforming or serializing data. + This could also be used as a hook for validating logic. + + :param value: Data to operate upon, of any type expected by + this method in the subclass. Can be ``None``. + :param dialect: the :class:`.Dialect` in use. + + This operation should be designed to be reversible by + the "process_bind_param" method of this class. + + """ + + raise NotImplementedError() + + @util.memoized_property + def _has_bind_processor(self): + """memoized boolean, check if process_bind_param is implemented. + + Allows the base process_bind_param to raise + NotImplementedError without needing to test an expensive + exception throw. + + """ + + return self.__class__.process_bind_param.__code__ \ + is not TypeDecorator.process_bind_param.__code__ + + @util.memoized_property + def _has_literal_processor(self): + """memoized boolean, check if process_literal_param is implemented. + + + """ + + return self.__class__.process_literal_param.__code__ \ + is not TypeDecorator.process_literal_param.__code__ + + def literal_processor(self, dialect): + """Provide a literal processing function for the given + :class:`.Dialect`. + + Subclasses here will typically override + :meth:`.TypeDecorator.process_literal_param` instead of this method + directly. + + By default, this method makes use of + :meth:`.TypeDecorator.process_bind_param` if that method is + implemented, where :meth:`.TypeDecorator.process_literal_param` is + not. The rationale here is that :class:`.TypeDecorator` typically + deals with Python conversions of data that are above the layer of + database presentation. With the value converted by + :meth:`.TypeDecorator.process_bind_param`, the underlying type will + then handle whether it needs to be presented to the DBAPI as a bound + parameter or to the database as an inline SQL value. + + .. versionadded:: 0.9.0 + + """ + if self._has_literal_processor: + process_param = self.process_literal_param + elif self._has_bind_processor: + # the bind processor should normally be OK + # for TypeDecorator since it isn't doing DB-level + # handling, the handling here won't be different for bound vs. + # literals. + process_param = self.process_bind_param + else: + process_param = None + + if process_param: + impl_processor = self.impl.literal_processor(dialect) + if impl_processor: + def process(value): + return impl_processor(process_param(value, dialect)) + else: + def process(value): + return process_param(value, dialect) + + return process + else: + return self.impl.literal_processor(dialect) + + def bind_processor(self, dialect): + """Provide a bound value processing function for the + given :class:`.Dialect`. + + This is the method that fulfills the :class:`.TypeEngine` + contract for bound value conversion. :class:`.TypeDecorator` + will wrap a user-defined implementation of + :meth:`process_bind_param` here. + + User-defined code can override this method directly, + though its likely best to use :meth:`process_bind_param` so that + the processing provided by ``self.impl`` is maintained. + + :param dialect: Dialect instance in use. + + This method is the reverse counterpart to the + :meth:`result_processor` method of this class. + + """ + if self._has_bind_processor: + process_param = self.process_bind_param + impl_processor = self.impl.bind_processor(dialect) + if impl_processor: + def process(value): + return impl_processor(process_param(value, dialect)) + + else: + def process(value): + return process_param(value, dialect) + + return process + else: + return self.impl.bind_processor(dialect) + + @util.memoized_property + def _has_result_processor(self): + """memoized boolean, check if process_result_value is implemented. + + Allows the base process_result_value to raise + NotImplementedError without needing to test an expensive + exception throw. + + """ + return self.__class__.process_result_value.__code__ \ + is not TypeDecorator.process_result_value.__code__ + + def result_processor(self, dialect, coltype): + """Provide a result value processing function for the given + :class:`.Dialect`. + + This is the method that fulfills the :class:`.TypeEngine` + contract for result value conversion. :class:`.TypeDecorator` + will wrap a user-defined implementation of + :meth:`process_result_value` here. + + User-defined code can override this method directly, + though its likely best to use :meth:`process_result_value` so that + the processing provided by ``self.impl`` is maintained. + + :param dialect: Dialect instance in use. + :param coltype: A SQLAlchemy data type + + This method is the reverse counterpart to the + :meth:`bind_processor` method of this class. + + """ + if self._has_result_processor: + process_value = self.process_result_value + impl_processor = self.impl.result_processor(dialect, + coltype) + if impl_processor: + def process(value): + return process_value(impl_processor(value), dialect) + + else: + def process(value): + return process_value(value, dialect) + + return process + else: + return self.impl.result_processor(dialect, coltype) + + def coerce_compared_value(self, op, value): + """Suggest a type for a 'coerced' Python value in an expression. + + By default, returns self. This method is called by + the expression system when an object using this type is + on the left or right side of an expression against a plain Python + object which does not yet have a SQLAlchemy type assigned:: + + expr = table.c.somecolumn + 35 + + Where above, if ``somecolumn`` uses this type, this method will + be called with the value ``operator.add`` + and ``35``. The return value is whatever SQLAlchemy type should + be used for ``35`` for this particular operation. + + """ + return self + + def copy(self, **kw): + """Produce a copy of this :class:`.TypeDecorator` instance. + + This is a shallow copy and is provided to fulfill part of + the :class:`.TypeEngine` contract. It usually does not + need to be overridden unless the user-defined :class:`.TypeDecorator` + has local state that should be deep-copied. + + """ + + instance = self.__class__.__new__(self.__class__) + instance.__dict__.update(self.__dict__) + return instance + + def get_dbapi_type(self, dbapi): + """Return the DBAPI type object represented by this + :class:`.TypeDecorator`. + + By default this calls upon :meth:`.TypeEngine.get_dbapi_type` of the + underlying "impl". + """ + return self.impl.get_dbapi_type(dbapi) + + def compare_values(self, x, y): + """Given two values, compare them for equality. + + By default this calls upon :meth:`.TypeEngine.compare_values` + of the underlying "impl", which in turn usually + uses the Python equals operator ``==``. + + This function is used by the ORM to compare + an original-loaded value with an intercepted + "changed" value, to determine if a net change + has occurred. + + """ + return self.impl.compare_values(x, y) + + def __repr__(self): + return util.generic_repr(self, to_inspect=self.impl) + + +class Variant(TypeDecorator): + """A wrapping type that selects among a variety of + implementations based on dialect in use. + + The :class:`.Variant` type is typically constructed + using the :meth:`.TypeEngine.with_variant` method. + + .. versionadded:: 0.7.2 + + .. seealso:: :meth:`.TypeEngine.with_variant` for an example of use. + + """ + + def __init__(self, base, mapping): + """Construct a new :class:`.Variant`. + + :param base: the base 'fallback' type + :param mapping: dictionary of string dialect names to + :class:`.TypeEngine` instances. + + """ + self.impl = base + self.mapping = mapping + + def coerce_compared_value(self, operator, value): + result = self.impl.coerce_compared_value(operator, value) + if result is self.impl: + return self + else: + return result + + def load_dialect_impl(self, dialect): + if dialect.name in self.mapping: + return self.mapping[dialect.name] + else: + return self.impl + + def _set_parent(self, column): + """Support SchemaEventTarget""" + + if isinstance(self.impl, SchemaEventTarget): + self.impl._set_parent(column) + for impl in self.mapping.values(): + if isinstance(impl, SchemaEventTarget): + impl._set_parent(column) + + def _set_parent_with_dispatch(self, parent): + """Support SchemaEventTarget""" + + if isinstance(self.impl, SchemaEventTarget): + self.impl._set_parent_with_dispatch(parent) + for impl in self.mapping.values(): + if isinstance(impl, SchemaEventTarget): + impl._set_parent_with_dispatch(parent) + + def with_variant(self, type_, dialect_name): + """Return a new :class:`.Variant` which adds the given + type + dialect name to the mapping, in addition to the + mapping present in this :class:`.Variant`. + + :param type_: a :class:`.TypeEngine` that will be selected + as a variant from the originating type, when a dialect + of the given name is in use. + :param dialect_name: base name of the dialect which uses + this type. (i.e. ``'postgresql'``, ``'mysql'``, etc.) + + """ + + if dialect_name in self.mapping: + raise exc.ArgumentError( + "Dialect '%s' is already present in " + "the mapping for this Variant" % dialect_name) + mapping = self.mapping.copy() + mapping[dialect_name] = type_ + return Variant(self.impl, mapping) + + @property + def comparator_factory(self): + """express comparison behavior in terms of the base type""" + return self.impl.comparator_factory + + +def _reconstitute_comparator(expression): + return expression.comparator + + +def to_instance(typeobj, *arg, **kw): + if typeobj is None: + return NULLTYPE + + if util.callable(typeobj): + return typeobj(*arg, **kw) + else: + return typeobj + + +def adapt_type(typeobj, colspecs): + if isinstance(typeobj, type): + typeobj = typeobj() + for t in typeobj.__class__.__mro__[0:-1]: + try: + impltype = colspecs[t] + break + except KeyError: + pass + else: + # couldn't adapt - so just return the type itself + # (it may be a user-defined type) + return typeobj + # if we adapted the given generic type to a database-specific type, + # but it turns out the originally given "generic" type + # is actually a subclass of our resulting type, then we were already + # given a more specific type than that required; so use that. + if (issubclass(typeobj.__class__, impltype)): + return typeobj + return typeobj.adapt(impltype) diff --git a/app/lib/sqlalchemy/sql/util.py b/app/lib/sqlalchemy/sql/util.py new file mode 100644 index 0000000..281d5f6 --- /dev/null +++ b/app/lib/sqlalchemy/sql/util.py @@ -0,0 +1,762 @@ +# sql/util.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""High level utilities which build upon other modules here. + +""" + +from .. import exc, util +from .base import _from_objects, ColumnSet +from . import operators, visitors +from itertools import chain +from collections import deque + +from .elements import BindParameter, ColumnClause, ColumnElement, \ + Null, UnaryExpression, literal_column, Label, _label_reference, \ + _textual_label_reference +from .selectable import ScalarSelect, Join, FromClause, FromGrouping +from .schema import Column + +join_condition = util.langhelpers.public_factory( + Join._join_condition, + ".sql.util.join_condition") + +# names that are still being imported from the outside +from .annotation import _shallow_annotate, _deep_annotate, _deep_deannotate +from .elements import _find_columns +from .ddl import sort_tables + + +def find_join_source(clauses, join_to): + """Given a list of FROM clauses and a selectable, + return the first index and element from the list of + clauses which can be joined against the selectable. returns + None, None if no match is found. + + e.g.:: + + clause1 = table1.join(table2) + clause2 = table4.join(table5) + + join_to = table2.join(table3) + + find_join_source([clause1, clause2], join_to) == clause1 + + """ + + selectables = list(_from_objects(join_to)) + for i, f in enumerate(clauses): + for s in selectables: + if f.is_derived_from(s): + return i, f + else: + return None, None + + +def visit_binary_product(fn, expr): + """Produce a traversal of the given expression, delivering + column comparisons to the given function. + + The function is of the form:: + + def my_fn(binary, left, right) + + For each binary expression located which has a + comparison operator, the product of "left" and + "right" will be delivered to that function, + in terms of that binary. + + Hence an expression like:: + + and_( + (a + b) == q + func.sum(e + f), + j == r + ) + + would have the traversal:: + + a q + a e + a f + b q + b e + b f + j r + + That is, every combination of "left" and + "right" that doesn't further contain + a binary comparison is passed as pairs. + + """ + stack = [] + + def visit(element): + if isinstance(element, ScalarSelect): + # we don't want to dig into correlated subqueries, + # those are just column elements by themselves + yield element + elif element.__visit_name__ == 'binary' and \ + operators.is_comparison(element.operator): + stack.insert(0, element) + for l in visit(element.left): + for r in visit(element.right): + fn(stack[0], l, r) + stack.pop(0) + for elem in element.get_children(): + visit(elem) + else: + if isinstance(element, ColumnClause): + yield element + for elem in element.get_children(): + for e in visit(elem): + yield e + list(visit(expr)) + + +def find_tables(clause, check_columns=False, + include_aliases=False, include_joins=False, + include_selects=False, include_crud=False): + """locate Table objects within the given expression.""" + + tables = [] + _visitors = {} + + if include_selects: + _visitors['select'] = _visitors['compound_select'] = tables.append + + if include_joins: + _visitors['join'] = tables.append + + if include_aliases: + _visitors['alias'] = tables.append + + if include_crud: + _visitors['insert'] = _visitors['update'] = \ + _visitors['delete'] = lambda ent: tables.append(ent.table) + + if check_columns: + def visit_column(column): + tables.append(column.table) + _visitors['column'] = visit_column + + _visitors['table'] = tables.append + + visitors.traverse(clause, {'column_collections': False}, _visitors) + return tables + + +def unwrap_order_by(clause): + """Break up an 'order by' expression into individual column-expressions, + without DESC/ASC/NULLS FIRST/NULLS LAST""" + + cols = util.column_set() + result = [] + stack = deque([clause]) + while stack: + t = stack.popleft() + if isinstance(t, ColumnElement) and \ + ( + not isinstance(t, UnaryExpression) or + not operators.is_ordering_modifier(t.modifier) + ): + if isinstance(t, _label_reference): + t = t.element + if isinstance(t, (_textual_label_reference)): + continue + if t not in cols: + cols.add(t) + result.append(t) + else: + for c in t.get_children(): + stack.append(c) + return result + + +def unwrap_label_reference(element): + def replace(elem): + if isinstance(elem, (_label_reference, _textual_label_reference)): + return elem.element + + return visitors.replacement_traverse( + element, {}, replace + ) + + +def expand_column_list_from_order_by(collist, order_by): + """Given the columns clause and ORDER BY of a selectable, + return a list of column expressions that can be added to the collist + corresponding to the ORDER BY, without repeating those already + in the collist. + + """ + cols_already_present = set([ + col.element if col._order_by_label_element is not None + else col for col in collist + ]) + + return [ + col for col in + chain(*[ + unwrap_order_by(o) + for o in order_by + ]) + if col not in cols_already_present + ] + + +def clause_is_present(clause, search): + """Given a target clause and a second to search within, return True + if the target is plainly present in the search without any + subqueries or aliases involved. + + Basically descends through Joins. + + """ + + for elem in surface_selectables(search): + if clause == elem: # use == here so that Annotated's compare + return True + else: + return False + + +def surface_selectables(clause): + stack = [clause] + while stack: + elem = stack.pop() + yield elem + if isinstance(elem, Join): + stack.extend((elem.left, elem.right)) + elif isinstance(elem, FromGrouping): + stack.append(elem.element) + + +def surface_column_elements(clause): + """traverse and yield only outer-exposed column elements, such as would + be addressable in the WHERE clause of a SELECT if this element were + in the columns clause.""" + + stack = deque([clause]) + while stack: + elem = stack.popleft() + yield elem + for sub in elem.get_children(): + if isinstance(sub, FromGrouping): + continue + stack.append(sub) + + +def selectables_overlap(left, right): + """Return True if left/right have some overlapping selectable""" + + return bool( + set(surface_selectables(left)).intersection( + surface_selectables(right) + ) + ) + + +def bind_values(clause): + """Return an ordered list of "bound" values in the given clause. + + E.g.:: + + >>> expr = and_( + ... table.c.foo==5, table.c.foo==7 + ... ) + >>> bind_values(expr) + [5, 7] + """ + + v = [] + + def visit_bindparam(bind): + v.append(bind.effective_value) + + visitors.traverse(clause, {}, {'bindparam': visit_bindparam}) + return v + + +def _quote_ddl_expr(element): + if isinstance(element, util.string_types): + element = element.replace("'", "''") + return "'%s'" % element + else: + return repr(element) + + +class _repr_base(object): + _LIST = 0 + _TUPLE = 1 + _DICT = 2 + + __slots__ = 'max_chars', + + def trunc(self, value): + rep = repr(value) + lenrep = len(rep) + if lenrep > self.max_chars: + segment_length = self.max_chars // 2 + rep = ( + rep[0:segment_length] + + (" ... (%d characters truncated) ... " + % (lenrep - self.max_chars)) + + rep[-segment_length:] + ) + return rep + + +class _repr_row(_repr_base): + """Provide a string view of a row.""" + + __slots__ = 'row', + + def __init__(self, row, max_chars=300): + self.row = row + self.max_chars = max_chars + + def __repr__(self): + trunc = self.trunc + return "(%s%s)" % ( + ", ".join(trunc(value) for value in self.row), + "," if len(self.row) == 1 else "" + ) + + +class _repr_params(_repr_base): + """Provide a string view of bound parameters. + + Truncates display to a given numnber of 'multi' parameter sets, + as well as long values to a given number of characters. + + """ + + __slots__ = 'params', 'batches', + + def __init__(self, params, batches, max_chars=300): + self.params = params + self.batches = batches + self.max_chars = max_chars + + def __repr__(self): + if isinstance(self.params, list): + typ = self._LIST + ismulti = self.params and isinstance( + self.params[0], (list, dict, tuple)) + elif isinstance(self.params, tuple): + typ = self._TUPLE + ismulti = self.params and isinstance( + self.params[0], (list, dict, tuple)) + elif isinstance(self.params, dict): + typ = self._DICT + ismulti = False + else: + return self.trunc(self.params) + + if ismulti and len(self.params) > self.batches: + msg = " ... displaying %i of %i total bound parameter sets ... " + return ' '.join(( + self._repr_multi(self.params[:self.batches - 2], typ)[0:-1], + msg % (self.batches, len(self.params)), + self._repr_multi(self.params[-2:], typ)[1:] + )) + elif ismulti: + return self._repr_multi(self.params, typ) + else: + return self._repr_params(self.params, typ) + + def _repr_multi(self, multi_params, typ): + if multi_params: + if isinstance(multi_params[0], list): + elem_type = self._LIST + elif isinstance(multi_params[0], tuple): + elem_type = self._TUPLE + elif isinstance(multi_params[0], dict): + elem_type = self._DICT + else: + assert False, \ + "Unknown parameter type %s" % (type(multi_params[0])) + + elements = ", ".join( + self._repr_params(params, elem_type) + for params in multi_params) + else: + elements = "" + + if typ == self._LIST: + return "[%s]" % elements + else: + return "(%s)" % elements + + def _repr_params(self, params, typ): + trunc = self.trunc + if typ is self._DICT: + return "{%s}" % ( + ", ".join( + "%r: %s" % (key, trunc(value)) + for key, value in params.items() + ) + ) + elif typ is self._TUPLE: + return "(%s%s)" % ( + ", ".join(trunc(value) for value in params), + "," if len(params) == 1 else "" + + ) + else: + return "[%s]" % ( + ", ".join(trunc(value) for value in params) + ) + + +def adapt_criterion_to_null(crit, nulls): + """given criterion containing bind params, convert selected elements + to IS NULL. + + """ + + def visit_binary(binary): + if isinstance(binary.left, BindParameter) \ + and binary.left._identifying_key in nulls: + # reverse order if the NULL is on the left side + binary.left = binary.right + binary.right = Null() + binary.operator = operators.is_ + binary.negate = operators.isnot + elif isinstance(binary.right, BindParameter) \ + and binary.right._identifying_key in nulls: + binary.right = Null() + binary.operator = operators.is_ + binary.negate = operators.isnot + + return visitors.cloned_traverse(crit, {}, {'binary': visit_binary}) + + +def splice_joins(left, right, stop_on=None): + if left is None: + return right + + stack = [(right, None)] + + adapter = ClauseAdapter(left) + ret = None + while stack: + (right, prevright) = stack.pop() + if isinstance(right, Join) and right is not stop_on: + right = right._clone() + right._reset_exported() + right.onclause = adapter.traverse(right.onclause) + stack.append((right.left, right)) + else: + right = adapter.traverse(right) + if prevright is not None: + prevright.left = right + if ret is None: + ret = right + + return ret + + +def reduce_columns(columns, *clauses, **kw): + r"""given a list of columns, return a 'reduced' set based on natural + equivalents. + + the set is reduced to the smallest list of columns which have no natural + equivalent present in the list. A "natural equivalent" means that two + columns will ultimately represent the same value because they are related + by a foreign key. + + \*clauses is an optional list of join clauses which will be traversed + to further identify columns that are "equivalent". + + \**kw may specify 'ignore_nonexistent_tables' to ignore foreign keys + whose tables are not yet configured, or columns that aren't yet present. + + This function is primarily used to determine the most minimal "primary + key" from a selectable, by reducing the set of primary key columns present + in the selectable to just those that are not repeated. + + """ + ignore_nonexistent_tables = kw.pop('ignore_nonexistent_tables', False) + only_synonyms = kw.pop('only_synonyms', False) + + columns = util.ordered_column_set(columns) + + omit = util.column_set() + for col in columns: + for fk in chain(*[c.foreign_keys for c in col.proxy_set]): + for c in columns: + if c is col: + continue + try: + fk_col = fk.column + except exc.NoReferencedColumnError: + # TODO: add specific coverage here + # to test/sql/test_selectable ReduceTest + if ignore_nonexistent_tables: + continue + else: + raise + except exc.NoReferencedTableError: + # TODO: add specific coverage here + # to test/sql/test_selectable ReduceTest + if ignore_nonexistent_tables: + continue + else: + raise + if fk_col.shares_lineage(c) and \ + (not only_synonyms or + c.name == col.name): + omit.add(col) + break + + if clauses: + def visit_binary(binary): + if binary.operator == operators.eq: + cols = util.column_set( + chain(*[c.proxy_set for c in columns.difference(omit)])) + if binary.left in cols and binary.right in cols: + for c in reversed(columns): + if c.shares_lineage(binary.right) and \ + (not only_synonyms or + c.name == binary.left.name): + omit.add(c) + break + for clause in clauses: + if clause is not None: + visitors.traverse(clause, {}, {'binary': visit_binary}) + + return ColumnSet(columns.difference(omit)) + + +def criterion_as_pairs(expression, consider_as_foreign_keys=None, + consider_as_referenced_keys=None, any_operator=False): + """traverse an expression and locate binary criterion pairs.""" + + if consider_as_foreign_keys and consider_as_referenced_keys: + raise exc.ArgumentError("Can only specify one of " + "'consider_as_foreign_keys' or " + "'consider_as_referenced_keys'") + + def col_is(a, b): + # return a is b + return a.compare(b) + + def visit_binary(binary): + if not any_operator and binary.operator is not operators.eq: + return + if not isinstance(binary.left, ColumnElement) or \ + not isinstance(binary.right, ColumnElement): + return + + if consider_as_foreign_keys: + if binary.left in consider_as_foreign_keys and \ + (col_is(binary.right, binary.left) or + binary.right not in consider_as_foreign_keys): + pairs.append((binary.right, binary.left)) + elif binary.right in consider_as_foreign_keys and \ + (col_is(binary.left, binary.right) or + binary.left not in consider_as_foreign_keys): + pairs.append((binary.left, binary.right)) + elif consider_as_referenced_keys: + if binary.left in consider_as_referenced_keys and \ + (col_is(binary.right, binary.left) or + binary.right not in consider_as_referenced_keys): + pairs.append((binary.left, binary.right)) + elif binary.right in consider_as_referenced_keys and \ + (col_is(binary.left, binary.right) or + binary.left not in consider_as_referenced_keys): + pairs.append((binary.right, binary.left)) + else: + if isinstance(binary.left, Column) and \ + isinstance(binary.right, Column): + if binary.left.references(binary.right): + pairs.append((binary.right, binary.left)) + elif binary.right.references(binary.left): + pairs.append((binary.left, binary.right)) + pairs = [] + visitors.traverse(expression, {}, {'binary': visit_binary}) + return pairs + + +class ClauseAdapter(visitors.ReplacingCloningVisitor): + """Clones and modifies clauses based on column correspondence. + + E.g.:: + + table1 = Table('sometable', metadata, + Column('col1', Integer), + Column('col2', Integer) + ) + table2 = Table('someothertable', metadata, + Column('col1', Integer), + Column('col2', Integer) + ) + + condition = table1.c.col1 == table2.c.col1 + + make an alias of table1:: + + s = table1.alias('foo') + + calling ``ClauseAdapter(s).traverse(condition)`` converts + condition to read:: + + s.c.col1 == table2.c.col1 + + """ + + def __init__(self, selectable, equivalents=None, + include_fn=None, exclude_fn=None, + adapt_on_names=False, anonymize_labels=False): + self.__traverse_options__ = { + 'stop_on': [selectable], + 'anonymize_labels': anonymize_labels} + self.selectable = selectable + self.include_fn = include_fn + self.exclude_fn = exclude_fn + self.equivalents = util.column_dict(equivalents or {}) + self.adapt_on_names = adapt_on_names + + def _corresponding_column(self, col, require_embedded, + _seen=util.EMPTY_SET): + newcol = self.selectable.corresponding_column( + col, + require_embedded=require_embedded) + if newcol is None and col in self.equivalents and col not in _seen: + for equiv in self.equivalents[col]: + newcol = self._corresponding_column( + equiv, require_embedded=require_embedded, + _seen=_seen.union([col])) + if newcol is not None: + return newcol + if self.adapt_on_names and newcol is None: + newcol = self.selectable.c.get(col.name) + return newcol + + def replace(self, col): + if isinstance(col, FromClause) and \ + self.selectable.is_derived_from(col): + return self.selectable + elif not isinstance(col, ColumnElement): + return None + elif self.include_fn and not self.include_fn(col): + return None + elif self.exclude_fn and self.exclude_fn(col): + return None + else: + return self._corresponding_column(col, True) + + +class ColumnAdapter(ClauseAdapter): + """Extends ClauseAdapter with extra utility functions. + + Key aspects of ColumnAdapter include: + + * Expressions that are adapted are stored in a persistent + .columns collection; so that an expression E adapted into + an expression E1, will return the same object E1 when adapted + a second time. This is important in particular for things like + Label objects that are anonymized, so that the ColumnAdapter can + be used to present a consistent "adapted" view of things. + + * Exclusion of items from the persistent collection based on + include/exclude rules, but also independent of hash identity. + This because "annotated" items all have the same hash identity as their + parent. + + * "wrapping" capability is added, so that the replacement of an expression + E can proceed through a series of adapters. This differs from the + visitor's "chaining" feature in that the resulting object is passed + through all replacing functions unconditionally, rather than stopping + at the first one that returns non-None. + + * An adapt_required option, used by eager loading to indicate that + We don't trust a result row column that is not translated. + This is to prevent a column from being interpreted as that + of the child row in a self-referential scenario, see + inheritance/test_basic.py->EagerTargetingTest.test_adapt_stringency + + """ + + def __init__(self, selectable, equivalents=None, + chain_to=None, adapt_required=False, + include_fn=None, exclude_fn=None, + adapt_on_names=False, + allow_label_resolve=True, + anonymize_labels=False): + ClauseAdapter.__init__(self, selectable, equivalents, + include_fn=include_fn, exclude_fn=exclude_fn, + adapt_on_names=adapt_on_names, + anonymize_labels=anonymize_labels) + + if chain_to: + self.chain(chain_to) + self.columns = util.populate_column_dict(self._locate_col) + if self.include_fn or self.exclude_fn: + self.columns = self._IncludeExcludeMapping(self, self.columns) + self.adapt_required = adapt_required + self.allow_label_resolve = allow_label_resolve + self._wrap = None + + class _IncludeExcludeMapping(object): + def __init__(self, parent, columns): + self.parent = parent + self.columns = columns + + def __getitem__(self, key): + if ( + self.parent.include_fn and not self.parent.include_fn(key) + ) or ( + self.parent.exclude_fn and self.parent.exclude_fn(key) + ): + if self.parent._wrap: + return self.parent._wrap.columns[key] + else: + return key + return self.columns[key] + + def wrap(self, adapter): + ac = self.__class__.__new__(self.__class__) + ac.__dict__.update(self.__dict__) + ac._wrap = adapter + ac.columns = util.populate_column_dict(ac._locate_col) + if ac.include_fn or ac.exclude_fn: + ac.columns = self._IncludeExcludeMapping(ac, ac.columns) + + return ac + + def traverse(self, obj): + return self.columns[obj] + + adapt_clause = traverse + adapt_list = ClauseAdapter.copy_and_process + + def _locate_col(self, col): + + c = ClauseAdapter.traverse(self, col) + + if self._wrap: + c2 = self._wrap._locate_col(c) + if c2 is not None: + c = c2 + + if self.adapt_required and c is col: + return None + + c._allow_label_resolve = self.allow_label_resolve + + return c + + def __getstate__(self): + d = self.__dict__.copy() + del d['columns'] + return d + + def __setstate__(self, state): + self.__dict__.update(state) + self.columns = util.PopulateDict(self._locate_col) diff --git a/app/lib/sqlalchemy/sql/visitors.py b/app/lib/sqlalchemy/sql/visitors.py new file mode 100644 index 0000000..7f09518 --- /dev/null +++ b/app/lib/sqlalchemy/sql/visitors.py @@ -0,0 +1,328 @@ +# sql/visitors.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Visitor/traversal interface and library functions. + +SQLAlchemy schema and expression constructs rely on a Python-centric +version of the classic "visitor" pattern as the primary way in which +they apply functionality. The most common use of this pattern +is statement compilation, where individual expression classes match +up to rendering methods that produce a string result. Beyond this, +the visitor system is also used to inspect expressions for various +information and patterns, as well as for usage in +some kinds of expression transformation. Other kinds of transformation +use a non-visitor traversal system. + +For many examples of how the visit system is used, see the +sqlalchemy.sql.util and the sqlalchemy.sql.compiler modules. +For an introduction to clause adaption, see +http://techspot.zzzeek.org/2008/01/23/expression-transformations/ + +""" + +from collections import deque +from .. import util +import operator +from .. import exc + +__all__ = ['VisitableType', 'Visitable', 'ClauseVisitor', + 'CloningVisitor', 'ReplacingCloningVisitor', 'iterate', + 'iterate_depthfirst', 'traverse_using', 'traverse', + 'traverse_depthfirst', + 'cloned_traverse', 'replacement_traverse'] + + +class VisitableType(type): + """Metaclass which assigns a `_compiler_dispatch` method to classes + having a `__visit_name__` attribute. + + The _compiler_dispatch attribute becomes an instance method which + looks approximately like the following:: + + def _compiler_dispatch (self, visitor, **kw): + '''Look for an attribute named "visit_" + self.__visit_name__ + on the visitor, and call it with the same kw params.''' + visit_attr = 'visit_%s' % self.__visit_name__ + return getattr(visitor, visit_attr)(self, **kw) + + Classes having no __visit_name__ attribute will remain unaffected. + """ + + def __init__(cls, clsname, bases, clsdict): + if clsname != 'Visitable' and \ + hasattr(cls, '__visit_name__'): + _generate_dispatch(cls) + + super(VisitableType, cls).__init__(clsname, bases, clsdict) + + +def _generate_dispatch(cls): + """Return an optimized visit dispatch function for the cls + for use by the compiler. + """ + if '__visit_name__' in cls.__dict__: + visit_name = cls.__visit_name__ + if isinstance(visit_name, str): + # There is an optimization opportunity here because the + # the string name of the class's __visit_name__ is known at + # this early stage (import time) so it can be pre-constructed. + getter = operator.attrgetter("visit_%s" % visit_name) + + def _compiler_dispatch(self, visitor, **kw): + try: + meth = getter(visitor) + except AttributeError: + raise exc.UnsupportedCompilationError(visitor, cls) + else: + return meth(self, **kw) + else: + # The optimization opportunity is lost for this case because the + # __visit_name__ is not yet a string. As a result, the visit + # string has to be recalculated with each compilation. + def _compiler_dispatch(self, visitor, **kw): + visit_attr = 'visit_%s' % self.__visit_name__ + try: + meth = getattr(visitor, visit_attr) + except AttributeError: + raise exc.UnsupportedCompilationError(visitor, cls) + else: + return meth(self, **kw) + + _compiler_dispatch.__doc__ = \ + """Look for an attribute named "visit_" + self.__visit_name__ + on the visitor, and call it with the same kw params. + """ + cls._compiler_dispatch = _compiler_dispatch + + +class Visitable(util.with_metaclass(VisitableType, object)): + """Base class for visitable objects, applies the + ``VisitableType`` metaclass. + + """ + + +class ClauseVisitor(object): + """Base class for visitor objects which can traverse using + the traverse() function. + + """ + + __traverse_options__ = {} + + def traverse_single(self, obj, **kw): + for v in self._visitor_iterator: + meth = getattr(v, "visit_%s" % obj.__visit_name__, None) + if meth: + return meth(obj, **kw) + + def iterate(self, obj): + """traverse the given expression structure, returning an iterator + of all elements. + + """ + return iterate(obj, self.__traverse_options__) + + def traverse(self, obj): + """traverse and visit the given expression structure.""" + + return traverse(obj, self.__traverse_options__, self._visitor_dict) + + @util.memoized_property + def _visitor_dict(self): + visitors = {} + + for name in dir(self): + if name.startswith('visit_'): + visitors[name[6:]] = getattr(self, name) + return visitors + + @property + def _visitor_iterator(self): + """iterate through this visitor and each 'chained' visitor.""" + + v = self + while v: + yield v + v = getattr(v, '_next', None) + + def chain(self, visitor): + """'chain' an additional ClauseVisitor onto this ClauseVisitor. + + the chained visitor will receive all visit events after this one. + + """ + tail = list(self._visitor_iterator)[-1] + tail._next = visitor + return self + + +class CloningVisitor(ClauseVisitor): + """Base class for visitor objects which can traverse using + the cloned_traverse() function. + + """ + + def copy_and_process(self, list_): + """Apply cloned traversal to the given list of elements, and return + the new list. + + """ + return [self.traverse(x) for x in list_] + + def traverse(self, obj): + """traverse and visit the given expression structure.""" + + return cloned_traverse( + obj, self.__traverse_options__, self._visitor_dict) + + +class ReplacingCloningVisitor(CloningVisitor): + """Base class for visitor objects which can traverse using + the replacement_traverse() function. + + """ + + def replace(self, elem): + """receive pre-copied elements during a cloning traversal. + + If the method returns a new element, the element is used + instead of creating a simple copy of the element. Traversal + will halt on the newly returned element if it is re-encountered. + """ + return None + + def traverse(self, obj): + """traverse and visit the given expression structure.""" + + def replace(elem): + for v in self._visitor_iterator: + e = v.replace(elem) + if e is not None: + return e + return replacement_traverse(obj, self.__traverse_options__, replace) + + +def iterate(obj, opts): + """traverse the given expression structure, returning an iterator. + + traversal is configured to be breadth-first. + + """ + # fasttrack for atomic elements like columns + children = obj.get_children(**opts) + if not children: + return [obj] + + traversal = deque() + stack = deque([obj]) + while stack: + t = stack.popleft() + traversal.append(t) + for c in t.get_children(**opts): + stack.append(c) + return iter(traversal) + + +def iterate_depthfirst(obj, opts): + """traverse the given expression structure, returning an iterator. + + traversal is configured to be depth-first. + + """ + # fasttrack for atomic elements like columns + children = obj.get_children(**opts) + if not children: + return [obj] + + stack = deque([obj]) + traversal = deque() + while stack: + t = stack.pop() + traversal.appendleft(t) + for c in t.get_children(**opts): + stack.append(c) + return iter(traversal) + + +def traverse_using(iterator, obj, visitors): + """visit the given expression structure using the given iterator of + objects. + + """ + for target in iterator: + meth = visitors.get(target.__visit_name__, None) + if meth: + meth(target) + return obj + + +def traverse(obj, opts, visitors): + """traverse and visit the given expression structure using the default + iterator. + + """ + return traverse_using(iterate(obj, opts), obj, visitors) + + +def traverse_depthfirst(obj, opts, visitors): + """traverse and visit the given expression structure using the + depth-first iterator. + + """ + return traverse_using(iterate_depthfirst(obj, opts), obj, visitors) + + +def cloned_traverse(obj, opts, visitors): + """clone the given expression structure, allowing + modifications by visitors.""" + + cloned = {} + stop_on = set(opts.get('stop_on', [])) + + def clone(elem): + if elem in stop_on: + return elem + else: + if id(elem) not in cloned: + cloned[id(elem)] = newelem = elem._clone() + newelem._copy_internals(clone=clone) + meth = visitors.get(newelem.__visit_name__, None) + if meth: + meth(newelem) + return cloned[id(elem)] + + if obj is not None: + obj = clone(obj) + return obj + + +def replacement_traverse(obj, opts, replace): + """clone the given expression structure, allowing element + replacement by a given replacement function.""" + + cloned = {} + stop_on = set([id(x) for x in opts.get('stop_on', [])]) + + def clone(elem, **kw): + if id(elem) in stop_on or \ + 'no_replacement_traverse' in elem._annotations: + return elem + else: + newelem = replace(elem) + if newelem is not None: + stop_on.add(id(newelem)) + return newelem + else: + if elem not in cloned: + cloned[elem] = newelem = elem._clone() + newelem._copy_internals(clone=clone, **kw) + return cloned[elem] + + if obj is not None: + obj = clone(obj, **opts) + return obj diff --git a/app/lib/sqlalchemy/testing/__init__.py b/app/lib/sqlalchemy/testing/__init__.py new file mode 100644 index 0000000..ff00fbf --- /dev/null +++ b/app/lib/sqlalchemy/testing/__init__.py @@ -0,0 +1,36 @@ +# testing/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + + +from .warnings import assert_warnings + +from . import config + +from .exclusions import db_spec, _is_excluded, fails_if, skip_if, future,\ + fails_on, fails_on_everything_except, skip, only_on, exclude, \ + against as _against, _server_version, only_if, fails + + +def against(*queries): + return _against(config._current, *queries) + +from .assertions import emits_warning, emits_warning_on, uses_deprecated, \ + eq_, ne_, le_, is_, is_not_, startswith_, assert_raises, \ + assert_raises_message, AssertsCompiledSQL, ComparesTables, \ + AssertsExecutionResults, expect_deprecated, expect_warnings, \ + in_, not_in_, eq_ignore_whitespace, eq_regex, is_true, is_false + +from .util import run_as_contextmanager, rowset, fail, \ + provide_metadata, adict, force_drop_names, \ + teardown_events + +crashes = skip + +from .config import db +from .config import requirements as requires + +from . import mock diff --git a/app/lib/sqlalchemy/testing/assertions.py b/app/lib/sqlalchemy/testing/assertions.py new file mode 100644 index 0000000..3ee3893 --- /dev/null +++ b/app/lib/sqlalchemy/testing/assertions.py @@ -0,0 +1,520 @@ +# testing/assertions.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from __future__ import absolute_import + +from . import util as testutil +from sqlalchemy import pool, orm, util +from sqlalchemy.engine import default, url +from sqlalchemy.util import decorator, compat +from sqlalchemy import types as sqltypes, schema, exc as sa_exc +import warnings +import re +from .exclusions import db_spec +from . import assertsql +from . import config +from .util import fail +import contextlib +from . import mock + + +def expect_warnings(*messages, **kw): + """Context manager which expects one or more warnings. + + With no arguments, squelches all SAWarnings emitted via + sqlalchemy.util.warn and sqlalchemy.util.warn_limited. Otherwise + pass string expressions that will match selected warnings via regex; + all non-matching warnings are sent through. + + The expect version **asserts** that the warnings were in fact seen. + + Note that the test suite sets SAWarning warnings to raise exceptions. + + """ + return _expect_warnings(sa_exc.SAWarning, messages, **kw) + + +@contextlib.contextmanager +def expect_warnings_on(db, *messages, **kw): + """Context manager which expects one or more warnings on specific + dialects. + + The expect version **asserts** that the warnings were in fact seen. + + """ + spec = db_spec(db) + + if isinstance(db, util.string_types) and not spec(config._current): + yield + else: + with expect_warnings(*messages, **kw): + yield + + +def emits_warning(*messages): + """Decorator form of expect_warnings(). + + Note that emits_warning does **not** assert that the warnings + were in fact seen. + + """ + + @decorator + def decorate(fn, *args, **kw): + with expect_warnings(assert_=False, *messages): + return fn(*args, **kw) + + return decorate + + +def expect_deprecated(*messages, **kw): + return _expect_warnings(sa_exc.SADeprecationWarning, messages, **kw) + + +def emits_warning_on(db, *messages): + """Mark a test as emitting a warning on a specific dialect. + + With no arguments, squelches all SAWarning failures. Or pass one or more + strings; these will be matched to the root of the warning description by + warnings.filterwarnings(). + + Note that emits_warning_on does **not** assert that the warnings + were in fact seen. + + """ + @decorator + def decorate(fn, *args, **kw): + with expect_warnings_on(db, assert_=False, *messages): + return fn(*args, **kw) + + return decorate + + +def uses_deprecated(*messages): + """Mark a test as immune from fatal deprecation warnings. + + With no arguments, squelches all SADeprecationWarning failures. + Or pass one or more strings; these will be matched to the root + of the warning description by warnings.filterwarnings(). + + As a special case, you may pass a function name prefixed with // + and it will be re-written as needed to match the standard warning + verbiage emitted by the sqlalchemy.util.deprecated decorator. + + Note that uses_deprecated does **not** assert that the warnings + were in fact seen. + + """ + + @decorator + def decorate(fn, *args, **kw): + with expect_deprecated(*messages, assert_=False): + return fn(*args, **kw) + return decorate + + +@contextlib.contextmanager +def _expect_warnings(exc_cls, messages, regex=True, assert_=True, + py2konly=False): + + if regex: + filters = [re.compile(msg, re.I | re.S) for msg in messages] + else: + filters = messages + + seen = set(filters) + + real_warn = warnings.warn + + def our_warn(msg, exception, *arg, **kw): + if not issubclass(exception, exc_cls): + return real_warn(msg, exception, *arg, **kw) + + if not filters: + return + + for filter_ in filters: + if (regex and filter_.match(msg)) or \ + (not regex and filter_ == msg): + seen.discard(filter_) + break + else: + real_warn(msg, exception, *arg, **kw) + + with mock.patch("warnings.warn", our_warn): + yield + + if assert_ and (not py2konly or not compat.py3k): + assert not seen, "Warnings were not seen: %s" % \ + ", ".join("%r" % (s.pattern if regex else s) for s in seen) + + +def global_cleanup_assertions(): + """Check things that have to be finalized at the end of a test suite. + + Hardcoded at the moment, a modular system can be built here + to support things like PG prepared transactions, tables all + dropped, etc. + + """ + _assert_no_stray_pool_connections() + +_STRAY_CONNECTION_FAILURES = 0 + + +def _assert_no_stray_pool_connections(): + global _STRAY_CONNECTION_FAILURES + + # lazy gc on cPython means "do nothing." pool connections + # shouldn't be in cycles, should go away. + testutil.lazy_gc() + + # however, once in awhile, on an EC2 machine usually, + # there's a ref in there. usually just one. + if pool._refs: + + # OK, let's be somewhat forgiving. + _STRAY_CONNECTION_FAILURES += 1 + + print("Encountered a stray connection in test cleanup: %s" + % str(pool._refs)) + # then do a real GC sweep. We shouldn't even be here + # so a single sweep should really be doing it, otherwise + # there's probably a real unreachable cycle somewhere. + testutil.gc_collect() + + # if we've already had two of these occurrences, or + # after a hard gc sweep we still have pool._refs?! + # now we have to raise. + if pool._refs: + err = str(pool._refs) + + # but clean out the pool refs collection directly, + # reset the counter, + # so the error doesn't at least keep happening. + pool._refs.clear() + _STRAY_CONNECTION_FAILURES = 0 + warnings.warn( + "Stray connection refused to leave " + "after gc.collect(): %s" % err) + elif _STRAY_CONNECTION_FAILURES > 10: + assert False, "Encountered more than 10 stray connections" + _STRAY_CONNECTION_FAILURES = 0 + + +def eq_regex(a, b, msg=None): + assert re.match(b, a), msg or "%r !~ %r" % (a, b) + + +def eq_(a, b, msg=None): + """Assert a == b, with repr messaging on failure.""" + assert a == b, msg or "%r != %r" % (a, b) + + +def ne_(a, b, msg=None): + """Assert a != b, with repr messaging on failure.""" + assert a != b, msg or "%r == %r" % (a, b) + + +def le_(a, b, msg=None): + """Assert a <= b, with repr messaging on failure.""" + assert a <= b, msg or "%r != %r" % (a, b) + + +def is_true(a, msg=None): + is_(a, True, msg=msg) + + +def is_false(a, msg=None): + is_(a, False, msg=msg) + + +def is_(a, b, msg=None): + """Assert a is b, with repr messaging on failure.""" + assert a is b, msg or "%r is not %r" % (a, b) + + +def is_not_(a, b, msg=None): + """Assert a is not b, with repr messaging on failure.""" + assert a is not b, msg or "%r is %r" % (a, b) + + +def in_(a, b, msg=None): + """Assert a in b, with repr messaging on failure.""" + assert a in b, msg or "%r not in %r" % (a, b) + + +def not_in_(a, b, msg=None): + """Assert a in not b, with repr messaging on failure.""" + assert a not in b, msg or "%r is in %r" % (a, b) + + +def startswith_(a, fragment, msg=None): + """Assert a.startswith(fragment), with repr messaging on failure.""" + assert a.startswith(fragment), msg or "%r does not start with %r" % ( + a, fragment) + + +def eq_ignore_whitespace(a, b, msg=None): + a = re.sub(r'^\s+?|\n', "", a) + a = re.sub(r' {2,}', " ", a) + b = re.sub(r'^\s+?|\n', "", b) + b = re.sub(r' {2,}', " ", b) + + assert a == b, msg or "%r != %r" % (a, b) + + +def assert_raises(except_cls, callable_, *args, **kw): + try: + callable_(*args, **kw) + success = False + except except_cls: + success = True + + # assert outside the block so it works for AssertionError too ! + assert success, "Callable did not raise an exception" + + +def assert_raises_message(except_cls, msg, callable_, *args, **kwargs): + try: + callable_(*args, **kwargs) + assert False, "Callable did not raise an exception" + except except_cls as e: + assert re.search( + msg, util.text_type(e), re.UNICODE), "%r !~ %s" % (msg, e) + print(util.text_type(e).encode('utf-8')) + + +class AssertsCompiledSQL(object): + def assert_compile(self, clause, result, params=None, + checkparams=None, dialect=None, + checkpositional=None, + check_prefetch=None, + use_default_dialect=False, + allow_dialect_select=False, + literal_binds=False, + schema_translate_map=None): + if use_default_dialect: + dialect = default.DefaultDialect() + elif allow_dialect_select: + dialect = None + else: + if dialect is None: + dialect = getattr(self, '__dialect__', None) + + if dialect is None: + dialect = config.db.dialect + elif dialect == 'default': + dialect = default.DefaultDialect() + elif dialect == 'default_enhanced': + dialect = default.StrCompileDialect() + elif isinstance(dialect, util.string_types): + dialect = url.URL(dialect).get_dialect()() + + kw = {} + compile_kwargs = {} + + if schema_translate_map: + kw['schema_translate_map'] = schema_translate_map + + if params is not None: + kw['column_keys'] = list(params) + + if literal_binds: + compile_kwargs['literal_binds'] = True + + if isinstance(clause, orm.Query): + context = clause._compile_context() + context.statement.use_labels = True + clause = context.statement + + if compile_kwargs: + kw['compile_kwargs'] = compile_kwargs + + c = clause.compile(dialect=dialect, **kw) + + param_str = repr(getattr(c, 'params', {})) + + if util.py3k: + param_str = param_str.encode('utf-8').decode('ascii', 'ignore') + print( + ("\nSQL String:\n" + + util.text_type(c) + + param_str).encode('utf-8')) + else: + print( + "\nSQL String:\n" + + util.text_type(c).encode('utf-8') + + param_str) + + cc = re.sub(r'[\n\t]', '', util.text_type(c)) + + eq_(cc, result, "%r != %r on dialect %r" % (cc, result, dialect)) + + if checkparams is not None: + eq_(c.construct_params(params), checkparams) + if checkpositional is not None: + p = c.construct_params(params) + eq_(tuple([p[x] for x in c.positiontup]), checkpositional) + if check_prefetch is not None: + eq_(c.prefetch, check_prefetch) + + +class ComparesTables(object): + + def assert_tables_equal(self, table, reflected_table, strict_types=False): + assert len(table.c) == len(reflected_table.c) + for c, reflected_c in zip(table.c, reflected_table.c): + eq_(c.name, reflected_c.name) + assert reflected_c is reflected_table.c[c.name] + eq_(c.primary_key, reflected_c.primary_key) + eq_(c.nullable, reflected_c.nullable) + + if strict_types: + msg = "Type '%s' doesn't correspond to type '%s'" + assert isinstance(reflected_c.type, type(c.type)), \ + msg % (reflected_c.type, c.type) + else: + self.assert_types_base(reflected_c, c) + + if isinstance(c.type, sqltypes.String): + eq_(c.type.length, reflected_c.type.length) + + eq_( + set([f.column.name for f in c.foreign_keys]), + set([f.column.name for f in reflected_c.foreign_keys]) + ) + if c.server_default: + assert isinstance(reflected_c.server_default, + schema.FetchedValue) + + assert len(table.primary_key) == len(reflected_table.primary_key) + for c in table.primary_key: + assert reflected_table.primary_key.columns[c.name] is not None + + def assert_types_base(self, c1, c2): + assert c1.type._compare_type_affinity(c2.type),\ + "On column %r, type '%s' doesn't correspond to type '%s'" % \ + (c1.name, c1.type, c2.type) + + +class AssertsExecutionResults(object): + def assert_result(self, result, class_, *objects): + result = list(result) + print(repr(result)) + self.assert_list(result, class_, objects) + + def assert_list(self, result, class_, list): + self.assert_(len(result) == len(list), + "result list is not the same size as test list, " + + "for class " + class_.__name__) + for i in range(0, len(list)): + self.assert_row(class_, result[i], list[i]) + + def assert_row(self, class_, rowobj, desc): + self.assert_(rowobj.__class__ is class_, + "item class is not " + repr(class_)) + for key, value in desc.items(): + if isinstance(value, tuple): + if isinstance(value[1], list): + self.assert_list(getattr(rowobj, key), value[0], value[1]) + else: + self.assert_row(value[0], getattr(rowobj, key), value[1]) + else: + self.assert_(getattr(rowobj, key) == value, + "attribute %s value %s does not match %s" % ( + key, getattr(rowobj, key), value)) + + def assert_unordered_result(self, result, cls, *expected): + """As assert_result, but the order of objects is not considered. + + The algorithm is very expensive but not a big deal for the small + numbers of rows that the test suite manipulates. + """ + + class immutabledict(dict): + def __hash__(self): + return id(self) + + found = util.IdentitySet(result) + expected = set([immutabledict(e) for e in expected]) + + for wrong in util.itertools_filterfalse(lambda o: + isinstance(o, cls), found): + fail('Unexpected type "%s", expected "%s"' % ( + type(wrong).__name__, cls.__name__)) + + if len(found) != len(expected): + fail('Unexpected object count "%s", expected "%s"' % ( + len(found), len(expected))) + + NOVALUE = object() + + def _compare_item(obj, spec): + for key, value in spec.items(): + if isinstance(value, tuple): + try: + self.assert_unordered_result( + getattr(obj, key), value[0], *value[1]) + except AssertionError: + return False + else: + if getattr(obj, key, NOVALUE) != value: + return False + return True + + for expected_item in expected: + for found_item in found: + if _compare_item(found_item, expected_item): + found.remove(found_item) + break + else: + fail( + "Expected %s instance with attributes %s not found." % ( + cls.__name__, repr(expected_item))) + return True + + def sql_execution_asserter(self, db=None): + if db is None: + from . import db as db + + return assertsql.assert_engine(db) + + def assert_sql_execution(self, db, callable_, *rules): + with self.sql_execution_asserter(db) as asserter: + callable_() + asserter.assert_(*rules) + + def assert_sql(self, db, callable_, rules): + + newrules = [] + for rule in rules: + if isinstance(rule, dict): + newrule = assertsql.AllOf(*[ + assertsql.CompiledSQL(k, v) for k, v in rule.items() + ]) + else: + newrule = assertsql.CompiledSQL(*rule) + newrules.append(newrule) + + self.assert_sql_execution(db, callable_, *newrules) + + def assert_sql_count(self, db, callable_, count): + self.assert_sql_execution( + db, callable_, assertsql.CountStatements(count)) + + @contextlib.contextmanager + def assert_execution(self, *rules): + assertsql.asserter.add_rules(rules) + try: + yield + assertsql.asserter.statement_complete() + finally: + assertsql.asserter.clear_rules() + + def assert_statement_count(self, count): + return self.assert_execution(assertsql.CountStatements(count)) diff --git a/app/lib/sqlalchemy/testing/assertsql.py b/app/lib/sqlalchemy/testing/assertsql.py new file mode 100644 index 0000000..e39b631 --- /dev/null +++ b/app/lib/sqlalchemy/testing/assertsql.py @@ -0,0 +1,377 @@ +# testing/assertsql.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from ..engine.default import DefaultDialect +from .. import util +import re +import collections +import contextlib +from .. import event +from sqlalchemy.schema import _DDLCompiles +from sqlalchemy.engine.util import _distill_params +from sqlalchemy.engine import url + + +class AssertRule(object): + + is_consumed = False + errormessage = None + consume_statement = True + + def process_statement(self, execute_observed): + pass + + def no_more_statements(self): + assert False, 'All statements are complete, but pending '\ + 'assertion rules remain' + + +class SQLMatchRule(AssertRule): + pass + + +class CursorSQL(SQLMatchRule): + consume_statement = False + + def __init__(self, statement, params=None): + self.statement = statement + self.params = params + + def process_statement(self, execute_observed): + stmt = execute_observed.statements[0] + if self.statement != stmt.statement or ( + self.params is not None and self.params != stmt.parameters): + self.errormessage = \ + "Testing for exact SQL %s parameters %s received %s %s" % ( + self.statement, self.params, + stmt.statement, stmt.parameters + ) + else: + execute_observed.statements.pop(0) + self.is_consumed = True + if not execute_observed.statements: + self.consume_statement = True + + +class CompiledSQL(SQLMatchRule): + + def __init__(self, statement, params=None, dialect='default'): + self.statement = statement + self.params = params + self.dialect = dialect + + def _compare_sql(self, execute_observed, received_statement): + stmt = re.sub(r'[\n\t]', '', self.statement) + return received_statement == stmt + + def _compile_dialect(self, execute_observed): + if self.dialect == 'default': + return DefaultDialect() + else: + # ugh + if self.dialect == 'postgresql': + params = {'implicit_returning': True} + else: + params = {} + return url.URL(self.dialect).get_dialect()(**params) + + def _received_statement(self, execute_observed): + """reconstruct the statement and params in terms + of a target dialect, which for CompiledSQL is just DefaultDialect.""" + + context = execute_observed.context + compare_dialect = self._compile_dialect(execute_observed) + if isinstance(context.compiled.statement, _DDLCompiles): + compiled = \ + context.compiled.statement.compile( + dialect=compare_dialect, + schema_translate_map=context. + execution_options.get('schema_translate_map')) + else: + compiled = ( + context.compiled.statement.compile( + dialect=compare_dialect, + column_keys=context.compiled.column_keys, + inline=context.compiled.inline, + schema_translate_map=context. + execution_options.get('schema_translate_map')) + ) + _received_statement = re.sub(r'[\n\t]', '', util.text_type(compiled)) + parameters = execute_observed.parameters + + if not parameters: + _received_parameters = [compiled.construct_params()] + else: + _received_parameters = [ + compiled.construct_params(m) for m in parameters] + + return _received_statement, _received_parameters + + def process_statement(self, execute_observed): + context = execute_observed.context + + _received_statement, _received_parameters = \ + self._received_statement(execute_observed) + params = self._all_params(context) + + equivalent = self._compare_sql(execute_observed, _received_statement) + + if equivalent: + if params is not None: + all_params = list(params) + all_received = list(_received_parameters) + while all_params and all_received: + param = dict(all_params.pop(0)) + + for idx, received in enumerate(list(all_received)): + # do a positive compare only + for param_key in param: + # a key in param did not match current + # 'received' + if param_key not in received or \ + received[param_key] != param[param_key]: + break + else: + # all keys in param matched 'received'; + # onto next param + del all_received[idx] + break + else: + # param did not match any entry + # in all_received + equivalent = False + break + if all_params or all_received: + equivalent = False + + if equivalent: + self.is_consumed = True + self.errormessage = None + else: + self.errormessage = self._failure_message(params) % { + 'received_statement': _received_statement, + 'received_parameters': _received_parameters + } + + def _all_params(self, context): + if self.params: + if util.callable(self.params): + params = self.params(context) + else: + params = self.params + if not isinstance(params, list): + params = [params] + return params + else: + return None + + def _failure_message(self, expected_params): + return ( + 'Testing for compiled statement %r partial params %r, ' + 'received %%(received_statement)r with params ' + '%%(received_parameters)r' % ( + self.statement.replace('%', '%%'), expected_params + ) + ) + + +class RegexSQL(CompiledSQL): + def __init__(self, regex, params=None): + SQLMatchRule.__init__(self) + self.regex = re.compile(regex) + self.orig_regex = regex + self.params = params + self.dialect = 'default' + + def _failure_message(self, expected_params): + return ( + 'Testing for compiled statement ~%r partial params %r, ' + 'received %%(received_statement)r with params ' + '%%(received_parameters)r' % ( + self.orig_regex, expected_params + ) + ) + + def _compare_sql(self, execute_observed, received_statement): + return bool(self.regex.match(received_statement)) + + +class DialectSQL(CompiledSQL): + def _compile_dialect(self, execute_observed): + return execute_observed.context.dialect + + def _compare_no_space(self, real_stmt, received_stmt): + stmt = re.sub(r'[\n\t]', '', real_stmt) + return received_stmt == stmt + + def _received_statement(self, execute_observed): + received_stmt, received_params = super(DialectSQL, self).\ + _received_statement(execute_observed) + + # TODO: why do we need this part? + for real_stmt in execute_observed.statements: + if self._compare_no_space(real_stmt.statement, received_stmt): + break + else: + raise AssertionError( + "Can't locate compiled statement %r in list of " + "statements actually invoked" % received_stmt) + + return received_stmt, execute_observed.context.compiled_parameters + + def _compare_sql(self, execute_observed, received_statement): + stmt = re.sub(r'[\n\t]', '', self.statement) + # convert our comparison statement to have the + # paramstyle of the received + paramstyle = execute_observed.context.dialect.paramstyle + if paramstyle == 'pyformat': + stmt = re.sub( + r':([\w_]+)', r"%(\1)s", stmt) + else: + # positional params + repl = None + if paramstyle == 'qmark': + repl = "?" + elif paramstyle == 'format': + repl = r"%s" + elif paramstyle == 'numeric': + repl = None + stmt = re.sub(r':([\w_]+)', repl, stmt) + + return received_statement == stmt + + +class CountStatements(AssertRule): + + def __init__(self, count): + self.count = count + self._statement_count = 0 + + def process_statement(self, execute_observed): + self._statement_count += 1 + + def no_more_statements(self): + if self.count != self._statement_count: + assert False, 'desired statement count %d does not match %d' \ + % (self.count, self._statement_count) + + +class AllOf(AssertRule): + + def __init__(self, *rules): + self.rules = set(rules) + + def process_statement(self, execute_observed): + for rule in list(self.rules): + rule.errormessage = None + rule.process_statement(execute_observed) + if rule.is_consumed: + self.rules.discard(rule) + if not self.rules: + self.is_consumed = True + break + elif not rule.errormessage: + # rule is not done yet + self.errormessage = None + break + else: + self.errormessage = list(self.rules)[0].errormessage + + +class Or(AllOf): + + def process_statement(self, execute_observed): + for rule in self.rules: + rule.process_statement(execute_observed) + if rule.is_consumed: + self.is_consumed = True + break + else: + self.errormessage = list(self.rules)[0].errormessage + + +class SQLExecuteObserved(object): + def __init__(self, context, clauseelement, multiparams, params): + self.context = context + self.clauseelement = clauseelement + self.parameters = _distill_params(multiparams, params) + self.statements = [] + + +class SQLCursorExecuteObserved( + collections.namedtuple( + "SQLCursorExecuteObserved", + ["statement", "parameters", "context", "executemany"]) +): + pass + + +class SQLAsserter(object): + def __init__(self): + self.accumulated = [] + + def _close(self): + self._final = self.accumulated + del self.accumulated + + def assert_(self, *rules): + rules = list(rules) + observed = list(self._final) + + while observed and rules: + rule = rules[0] + rule.process_statement(observed[0]) + if rule.is_consumed: + rules.pop(0) + elif rule.errormessage: + assert False, rule.errormessage + + if rule.consume_statement: + observed.pop(0) + + if not observed and rules: + rules[0].no_more_statements() + elif not rules and observed: + assert False, "Additional SQL statements remain" + + +@contextlib.contextmanager +def assert_engine(engine): + asserter = SQLAsserter() + + orig = [] + + @event.listens_for(engine, "before_execute") + def connection_execute(conn, clauseelement, multiparams, params): + # grab the original statement + params before any cursor + # execution + orig[:] = clauseelement, multiparams, params + + @event.listens_for(engine, "after_cursor_execute") + def cursor_execute(conn, cursor, statement, parameters, + context, executemany): + if not context: + return + # then grab real cursor statements and associate them all + # around a single context + if asserter.accumulated and \ + asserter.accumulated[-1].context is context: + obs = asserter.accumulated[-1] + else: + obs = SQLExecuteObserved(context, orig[0], orig[1], orig[2]) + asserter.accumulated.append(obs) + obs.statements.append( + SQLCursorExecuteObserved( + statement, parameters, context, executemany) + ) + + try: + yield asserter + finally: + event.remove(engine, "after_cursor_execute", cursor_execute) + event.remove(engine, "before_execute", connection_execute) + asserter._close() diff --git a/app/lib/sqlalchemy/testing/config.py b/app/lib/sqlalchemy/testing/config.py new file mode 100644 index 0000000..64be3ac --- /dev/null +++ b/app/lib/sqlalchemy/testing/config.py @@ -0,0 +1,97 @@ +# testing/config.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import collections + +requirements = None +db = None +db_url = None +db_opts = None +file_config = None +test_schema = None +test_schema_2 = None +_current = None + +try: + from unittest import SkipTest as _skip_test_exception +except ImportError: + _skip_test_exception = None + + +class Config(object): + def __init__(self, db, db_opts, options, file_config): + self.db = db + self.db_opts = db_opts + self.options = options + self.file_config = file_config + self.test_schema = "test_schema" + self.test_schema_2 = "test_schema_2" + + _stack = collections.deque() + _configs = {} + + @classmethod + def register(cls, db, db_opts, options, file_config): + """add a config as one of the global configs. + + If there are no configs set up yet, this config also + gets set as the "_current". + """ + cfg = Config(db, db_opts, options, file_config) + + cls._configs[cfg.db.name] = cfg + cls._configs[(cfg.db.name, cfg.db.dialect)] = cfg + cls._configs[cfg.db] = cfg + return cfg + + @classmethod + def set_as_current(cls, config, namespace): + global db, _current, db_url, test_schema, test_schema_2, db_opts + _current = config + db_url = config.db.url + db_opts = config.db_opts + test_schema = config.test_schema + test_schema_2 = config.test_schema_2 + namespace.db = db = config.db + + @classmethod + def push_engine(cls, db, namespace): + assert _current, "Can't push without a default Config set up" + cls.push( + Config( + db, _current.db_opts, _current.options, _current.file_config), + namespace + ) + + @classmethod + def push(cls, config, namespace): + cls._stack.append(_current) + cls.set_as_current(config, namespace) + + @classmethod + def reset(cls, namespace): + if cls._stack: + cls.set_as_current(cls._stack[0], namespace) + cls._stack.clear() + + @classmethod + def all_configs(cls): + for cfg in set(cls._configs.values()): + yield cfg + + @classmethod + def all_dbs(cls): + for cfg in cls.all_configs(): + yield cfg.db + + def skip_test(self, msg): + skip_test(msg) + + +def skip_test(msg): + raise _skip_test_exception(msg) + diff --git a/app/lib/sqlalchemy/testing/engines.py b/app/lib/sqlalchemy/testing/engines.py new file mode 100644 index 0000000..dacd5a7 --- /dev/null +++ b/app/lib/sqlalchemy/testing/engines.py @@ -0,0 +1,349 @@ +# testing/engines.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from __future__ import absolute_import + +import weakref +from . import config +from .util import decorator +from .. import event, pool +import re +import warnings + + +class ConnectionKiller(object): + + def __init__(self): + self.proxy_refs = weakref.WeakKeyDictionary() + self.testing_engines = weakref.WeakKeyDictionary() + self.conns = set() + + def add_engine(self, engine): + self.testing_engines[engine] = True + + def connect(self, dbapi_conn, con_record): + self.conns.add((dbapi_conn, con_record)) + + def checkout(self, dbapi_con, con_record, con_proxy): + self.proxy_refs[con_proxy] = True + + def invalidate(self, dbapi_con, con_record, exception): + self.conns.discard((dbapi_con, con_record)) + + def _safe(self, fn): + try: + fn() + except Exception as e: + warnings.warn( + "testing_reaper couldn't " + "rollback/close connection: %s" % e) + + def rollback_all(self): + for rec in list(self.proxy_refs): + if rec is not None and rec.is_valid: + self._safe(rec.rollback) + + def close_all(self): + for rec in list(self.proxy_refs): + if rec is not None and rec.is_valid: + self._safe(rec._close) + + def _after_test_ctx(self): + # this can cause a deadlock with pg8000 - pg8000 acquires + # prepared statement lock inside of rollback() - if async gc + # is collecting in finalize_fairy, deadlock. + # not sure if this should be if pypy/jython only. + # note that firebird/fdb definitely needs this though + for conn, rec in list(self.conns): + self._safe(conn.rollback) + + def _stop_test_ctx(self): + if config.options.low_connections: + self._stop_test_ctx_minimal() + else: + self._stop_test_ctx_aggressive() + + def _stop_test_ctx_minimal(self): + self.close_all() + + self.conns = set() + + for rec in list(self.testing_engines): + if rec is not config.db: + rec.dispose() + + def _stop_test_ctx_aggressive(self): + self.close_all() + for conn, rec in list(self.conns): + self._safe(conn.close) + rec.connection = None + + self.conns = set() + for rec in list(self.testing_engines): + rec.dispose() + + def assert_all_closed(self): + for rec in self.proxy_refs: + if rec.is_valid: + assert False + +testing_reaper = ConnectionKiller() + + +def drop_all_tables(metadata, bind): + testing_reaper.close_all() + if hasattr(bind, 'close'): + bind.close() + + if not config.db.dialect.supports_alter: + from . import assertions + with assertions.expect_warnings( + "Can't sort tables", assert_=False): + metadata.drop_all(bind) + else: + metadata.drop_all(bind) + + +@decorator +def assert_conns_closed(fn, *args, **kw): + try: + fn(*args, **kw) + finally: + testing_reaper.assert_all_closed() + + +@decorator +def rollback_open_connections(fn, *args, **kw): + """Decorator that rolls back all open connections after fn execution.""" + + try: + fn(*args, **kw) + finally: + testing_reaper.rollback_all() + + +@decorator +def close_first(fn, *args, **kw): + """Decorator that closes all connections before fn execution.""" + + testing_reaper.close_all() + fn(*args, **kw) + + +@decorator +def close_open_connections(fn, *args, **kw): + """Decorator that closes all connections after fn execution.""" + try: + fn(*args, **kw) + finally: + testing_reaper.close_all() + + +def all_dialects(exclude=None): + import sqlalchemy.databases as d + for name in d.__all__: + # TEMPORARY + if exclude and name in exclude: + continue + mod = getattr(d, name, None) + if not mod: + mod = getattr(__import__( + 'sqlalchemy.databases.%s' % name).databases, name) + yield mod.dialect() + + +class ReconnectFixture(object): + + def __init__(self, dbapi): + self.dbapi = dbapi + self.connections = [] + + def __getattr__(self, key): + return getattr(self.dbapi, key) + + def connect(self, *args, **kwargs): + conn = self.dbapi.connect(*args, **kwargs) + self.connections.append(conn) + return conn + + def _safe(self, fn): + try: + fn() + except Exception as e: + warnings.warn( + "ReconnectFixture couldn't " + "close connection: %s" % e) + + def shutdown(self): + # TODO: this doesn't cover all cases + # as nicely as we'd like, namely MySQLdb. + # would need to implement R. Brewer's + # proxy server idea to get better + # coverage. + for c in list(self.connections): + self._safe(c.close) + self.connections = [] + + +def reconnecting_engine(url=None, options=None): + url = url or config.db.url + dbapi = config.db.dialect.dbapi + if not options: + options = {} + options['module'] = ReconnectFixture(dbapi) + engine = testing_engine(url, options) + _dispose = engine.dispose + + def dispose(): + engine.dialect.dbapi.shutdown() + _dispose() + + engine.test_shutdown = engine.dialect.dbapi.shutdown + engine.dispose = dispose + return engine + + +def testing_engine(url=None, options=None): + """Produce an engine configured by --options with optional overrides.""" + + from sqlalchemy import create_engine + from sqlalchemy.engine.url import make_url + + if not options: + use_reaper = True + else: + use_reaper = options.pop('use_reaper', True) + + url = url or config.db.url + + url = make_url(url) + if options is None: + if config.db is None or url.drivername == config.db.url.drivername: + options = config.db_opts + else: + options = {} + elif config.db is not None and url.drivername == config.db.url.drivername: + default_opt = config.db_opts.copy() + default_opt.update(options) + + engine = create_engine(url, **options) + engine._has_events = True # enable event blocks, helps with profiling + + if isinstance(engine.pool, pool.QueuePool): + engine.pool._timeout = 0 + engine.pool._max_overflow = 0 + if use_reaper: + event.listen(engine.pool, 'connect', testing_reaper.connect) + event.listen(engine.pool, 'checkout', testing_reaper.checkout) + event.listen(engine.pool, 'invalidate', testing_reaper.invalidate) + testing_reaper.add_engine(engine) + + return engine + + +def mock_engine(dialect_name=None): + """Provides a mocking engine based on the current testing.db. + + This is normally used to test DDL generation flow as emitted + by an Engine. + + It should not be used in other cases, as assert_compile() and + assert_sql_execution() are much better choices with fewer + moving parts. + + """ + + from sqlalchemy import create_engine + + if not dialect_name: + dialect_name = config.db.name + + buffer = [] + + def executor(sql, *a, **kw): + buffer.append(sql) + + def assert_sql(stmts): + recv = [re.sub(r'[\n\t]', '', str(s)) for s in buffer] + assert recv == stmts, recv + + def print_sql(): + d = engine.dialect + return "\n".join( + str(s.compile(dialect=d)) + for s in engine.mock + ) + + engine = create_engine(dialect_name + '://', + strategy='mock', executor=executor) + assert not hasattr(engine, 'mock') + engine.mock = buffer + engine.assert_sql = assert_sql + engine.print_sql = print_sql + return engine + + +class DBAPIProxyCursor(object): + """Proxy a DBAPI cursor. + + Tests can provide subclasses of this to intercept + DBAPI-level cursor operations. + + """ + + def __init__(self, engine, conn, *args, **kwargs): + self.engine = engine + self.connection = conn + self.cursor = conn.cursor(*args, **kwargs) + + def execute(self, stmt, parameters=None, **kw): + if parameters: + return self.cursor.execute(stmt, parameters, **kw) + else: + return self.cursor.execute(stmt, **kw) + + def executemany(self, stmt, params, **kw): + return self.cursor.executemany(stmt, params, **kw) + + def __getattr__(self, key): + return getattr(self.cursor, key) + + +class DBAPIProxyConnection(object): + """Proxy a DBAPI connection. + + Tests can provide subclasses of this to intercept + DBAPI-level connection operations. + + """ + + def __init__(self, engine, cursor_cls): + self.conn = self._sqla_unwrap = engine.pool._creator() + self.engine = engine + self.cursor_cls = cursor_cls + + def cursor(self, *args, **kwargs): + return self.cursor_cls(self.engine, self.conn, *args, **kwargs) + + def close(self): + self.conn.close() + + def __getattr__(self, key): + return getattr(self.conn, key) + + +def proxying_engine(conn_cls=DBAPIProxyConnection, + cursor_cls=DBAPIProxyCursor): + """Produce an engine that provides proxy hooks for + common methods. + + """ + def mock_conn(): + return conn_cls(config.db, cursor_cls) + return testing_engine(options={'creator': mock_conn}) + + diff --git a/app/lib/sqlalchemy/testing/entities.py b/app/lib/sqlalchemy/testing/entities.py new file mode 100644 index 0000000..ebd9fb5 --- /dev/null +++ b/app/lib/sqlalchemy/testing/entities.py @@ -0,0 +1,101 @@ +# testing/entities.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +import sqlalchemy as sa +from sqlalchemy import exc as sa_exc + +_repr_stack = set() + + +class BasicEntity(object): + + def __init__(self, **kw): + for key, value in kw.items(): + setattr(self, key, value) + + def __repr__(self): + if id(self) in _repr_stack: + return object.__repr__(self) + _repr_stack.add(id(self)) + try: + return "%s(%s)" % ( + (self.__class__.__name__), + ', '.join(["%s=%r" % (key, getattr(self, key)) + for key in sorted(self.__dict__.keys()) + if not key.startswith('_')])) + finally: + _repr_stack.remove(id(self)) + +_recursion_stack = set() + + +class ComparableEntity(BasicEntity): + + def __hash__(self): + return hash(self.__class__) + + def __ne__(self, other): + return not self.__eq__(other) + + def __eq__(self, other): + """'Deep, sparse compare. + + Deeply compare two entities, following the non-None attributes of the + non-persisted object, if possible. + + """ + if other is self: + return True + elif not self.__class__ == other.__class__: + return False + + if id(self) in _recursion_stack: + return True + _recursion_stack.add(id(self)) + + try: + # pick the entity that's not SA persisted as the source + try: + self_key = sa.orm.attributes.instance_state(self).key + except sa.orm.exc.NO_STATE: + self_key = None + + if other is None: + a = self + b = other + elif self_key is not None: + a = other + b = self + else: + a = self + b = other + + for attr in list(a.__dict__): + if attr.startswith('_'): + continue + value = getattr(a, attr) + + try: + # handle lazy loader errors + battr = getattr(b, attr) + except (AttributeError, sa_exc.UnboundExecutionError): + return False + + if hasattr(value, '__iter__'): + if hasattr(value, '__getitem__') and not hasattr( + value, 'keys'): + if list(value) != list(battr): + return False + else: + if set(value) != set(battr): + return False + else: + if value is not None and value != battr: + return False + return True + finally: + _recursion_stack.remove(id(self)) diff --git a/app/lib/sqlalchemy/testing/exclusions.py b/app/lib/sqlalchemy/testing/exclusions.py new file mode 100644 index 0000000..074b985 --- /dev/null +++ b/app/lib/sqlalchemy/testing/exclusions.py @@ -0,0 +1,443 @@ +# testing/exclusions.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + + +import operator +from ..util import decorator +from . import config +from .. import util +import inspect +import contextlib +from sqlalchemy.util.compat import inspect_getargspec + + +def skip_if(predicate, reason=None): + rule = compound() + pred = _as_predicate(predicate, reason) + rule.skips.add(pred) + return rule + + +def fails_if(predicate, reason=None): + rule = compound() + pred = _as_predicate(predicate, reason) + rule.fails.add(pred) + return rule + + +class compound(object): + def __init__(self): + self.fails = set() + self.skips = set() + self.tags = set() + + def __add__(self, other): + return self.add(other) + + def add(self, *others): + copy = compound() + copy.fails.update(self.fails) + copy.skips.update(self.skips) + copy.tags.update(self.tags) + for other in others: + copy.fails.update(other.fails) + copy.skips.update(other.skips) + copy.tags.update(other.tags) + return copy + + def not_(self): + copy = compound() + copy.fails.update(NotPredicate(fail) for fail in self.fails) + copy.skips.update(NotPredicate(skip) for skip in self.skips) + copy.tags.update(self.tags) + return copy + + @property + def enabled(self): + return self.enabled_for_config(config._current) + + def enabled_for_config(self, config): + for predicate in self.skips.union(self.fails): + if predicate(config): + return False + else: + return True + + def matching_config_reasons(self, config): + return [ + predicate._as_string(config) for predicate + in self.skips.union(self.fails) + if predicate(config) + ] + + def include_test(self, include_tags, exclude_tags): + return bool( + not self.tags.intersection(exclude_tags) and + (not include_tags or self.tags.intersection(include_tags)) + ) + + def _extend(self, other): + self.skips.update(other.skips) + self.fails.update(other.fails) + self.tags.update(other.tags) + + def __call__(self, fn): + if hasattr(fn, '_sa_exclusion_extend'): + fn._sa_exclusion_extend._extend(self) + return fn + + @decorator + def decorate(fn, *args, **kw): + return self._do(config._current, fn, *args, **kw) + decorated = decorate(fn) + decorated._sa_exclusion_extend = self + return decorated + + @contextlib.contextmanager + def fail_if(self): + all_fails = compound() + all_fails.fails.update(self.skips.union(self.fails)) + + try: + yield + except Exception as ex: + all_fails._expect_failure(config._current, ex) + else: + all_fails._expect_success(config._current) + + def _do(self, cfg, fn, *args, **kw): + for skip in self.skips: + if skip(cfg): + msg = "'%s' : %s" % ( + fn.__name__, + skip._as_string(cfg) + ) + config.skip_test(msg) + + try: + return_value = fn(*args, **kw) + except Exception as ex: + self._expect_failure(cfg, ex, name=fn.__name__) + else: + self._expect_success(cfg, name=fn.__name__) + return return_value + + def _expect_failure(self, config, ex, name='block'): + for fail in self.fails: + if fail(config): + print(("%s failed as expected (%s): %s " % ( + name, fail._as_string(config), str(ex)))) + break + else: + util.raise_from_cause(ex) + + def _expect_success(self, config, name='block'): + if not self.fails: + return + for fail in self.fails: + if not fail(config): + break + else: + raise AssertionError( + "Unexpected success for '%s' (%s)" % + ( + name, + " and ".join( + fail._as_string(config) + for fail in self.fails + ) + ) + ) + + +def requires_tag(tagname): + return tags([tagname]) + + +def tags(tagnames): + comp = compound() + comp.tags.update(tagnames) + return comp + + +def only_if(predicate, reason=None): + predicate = _as_predicate(predicate) + return skip_if(NotPredicate(predicate), reason) + + +def succeeds_if(predicate, reason=None): + predicate = _as_predicate(predicate) + return fails_if(NotPredicate(predicate), reason) + + +class Predicate(object): + @classmethod + def as_predicate(cls, predicate, description=None): + if isinstance(predicate, compound): + return cls.as_predicate(predicate.enabled_for_config, description) + elif isinstance(predicate, Predicate): + if description and predicate.description is None: + predicate.description = description + return predicate + elif isinstance(predicate, (list, set)): + return OrPredicate( + [cls.as_predicate(pred) for pred in predicate], + description) + elif isinstance(predicate, tuple): + return SpecPredicate(*predicate) + elif isinstance(predicate, util.string_types): + tokens = predicate.split(" ", 2) + op = spec = None + db = tokens.pop(0) + if tokens: + op = tokens.pop(0) + if tokens: + spec = tuple(int(d) for d in tokens.pop(0).split(".")) + return SpecPredicate(db, op, spec, description=description) + elif util.callable(predicate): + return LambdaPredicate(predicate, description) + else: + assert False, "unknown predicate type: %s" % predicate + + def _format_description(self, config, negate=False): + bool_ = self(config) + if negate: + bool_ = not negate + return self.description % { + "driver": config.db.url.get_driver_name() + if config else "", + "database": config.db.url.get_backend_name() + if config else "", + "doesnt_support": "doesn't support" if bool_ else "does support", + "does_support": "does support" if bool_ else "doesn't support" + } + + def _as_string(self, config=None, negate=False): + raise NotImplementedError() + + +class BooleanPredicate(Predicate): + def __init__(self, value, description=None): + self.value = value + self.description = description or "boolean %s" % value + + def __call__(self, config): + return self.value + + def _as_string(self, config, negate=False): + return self._format_description(config, negate=negate) + + +class SpecPredicate(Predicate): + def __init__(self, db, op=None, spec=None, description=None): + self.db = db + self.op = op + self.spec = spec + self.description = description + + _ops = { + '<': operator.lt, + '>': operator.gt, + '==': operator.eq, + '!=': operator.ne, + '<=': operator.le, + '>=': operator.ge, + 'in': operator.contains, + 'between': lambda val, pair: val >= pair[0] and val <= pair[1], + } + + def __call__(self, config): + engine = config.db + + if "+" in self.db: + dialect, driver = self.db.split('+') + else: + dialect, driver = self.db, None + + if dialect and engine.name != dialect: + return False + if driver is not None and engine.driver != driver: + return False + + if self.op is not None: + assert driver is None, "DBAPI version specs not supported yet" + + version = _server_version(engine) + oper = hasattr(self.op, '__call__') and self.op \ + or self._ops[self.op] + return oper(version, self.spec) + else: + return True + + def _as_string(self, config, negate=False): + if self.description is not None: + return self._format_description(config) + elif self.op is None: + if negate: + return "not %s" % self.db + else: + return "%s" % self.db + else: + if negate: + return "not %s %s %s" % ( + self.db, + self.op, + self.spec + ) + else: + return "%s %s %s" % ( + self.db, + self.op, + self.spec + ) + + +class LambdaPredicate(Predicate): + def __init__(self, lambda_, description=None, args=None, kw=None): + spec = inspect_getargspec(lambda_) + if not spec[0]: + self.lambda_ = lambda db: lambda_() + else: + self.lambda_ = lambda_ + self.args = args or () + self.kw = kw or {} + if description: + self.description = description + elif lambda_.__doc__: + self.description = lambda_.__doc__ + else: + self.description = "custom function" + + def __call__(self, config): + return self.lambda_(config) + + def _as_string(self, config, negate=False): + return self._format_description(config) + + +class NotPredicate(Predicate): + def __init__(self, predicate, description=None): + self.predicate = predicate + self.description = description + + def __call__(self, config): + return not self.predicate(config) + + def _as_string(self, config, negate=False): + if self.description: + return self._format_description(config, not negate) + else: + return self.predicate._as_string(config, not negate) + + +class OrPredicate(Predicate): + def __init__(self, predicates, description=None): + self.predicates = predicates + self.description = description + + def __call__(self, config): + for pred in self.predicates: + if pred(config): + return True + return False + + def _eval_str(self, config, negate=False): + if negate: + conjunction = " and " + else: + conjunction = " or " + return conjunction.join(p._as_string(config, negate=negate) + for p in self.predicates) + + def _negation_str(self, config): + if self.description is not None: + return "Not " + self._format_description(config) + else: + return self._eval_str(config, negate=True) + + def _as_string(self, config, negate=False): + if negate: + return self._negation_str(config) + else: + if self.description is not None: + return self._format_description(config) + else: + return self._eval_str(config) + + +_as_predicate = Predicate.as_predicate + + +def _is_excluded(db, op, spec): + return SpecPredicate(db, op, spec)(config._current) + + +def _server_version(engine): + """Return a server_version_info tuple.""" + + # force metadata to be retrieved + conn = engine.connect() + version = getattr(engine.dialect, 'server_version_info', ()) + conn.close() + return version + + +def db_spec(*dbs): + return OrPredicate( + [Predicate.as_predicate(db) for db in dbs] + ) + + +def open(): + return skip_if(BooleanPredicate(False, "mark as execute")) + + +def closed(): + return skip_if(BooleanPredicate(True, "marked as skip")) + + +def fails(reason=None): + return fails_if(BooleanPredicate(True, reason or "expected to fail")) + + +@decorator +def future(fn, *arg): + return fails_if(LambdaPredicate(fn), "Future feature") + + +def fails_on(db, reason=None): + return fails_if(Predicate.as_predicate(db), reason) + + +def fails_on_everything_except(*dbs): + return succeeds_if( + OrPredicate([ + Predicate.as_predicate(db) for db in dbs + ]) + ) + + +def skip(db, reason=None): + return skip_if(Predicate.as_predicate(db), reason) + + +def only_on(dbs, reason=None): + return only_if( + OrPredicate([Predicate.as_predicate(db) for db in util.to_list(dbs)]) + ) + + +def exclude(db, op, spec, reason=None): + return skip_if(SpecPredicate(db, op, spec), reason) + + +def against(config, *queries): + assert queries, "no queries sent!" + return OrPredicate([ + Predicate.as_predicate(query) + for query in queries + ])(config) diff --git a/app/lib/sqlalchemy/testing/fixtures.py b/app/lib/sqlalchemy/testing/fixtures.py new file mode 100644 index 0000000..8cd6e9f --- /dev/null +++ b/app/lib/sqlalchemy/testing/fixtures.py @@ -0,0 +1,386 @@ +# testing/fixtures.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from . import config +from . import assertions, schema +from .util import adict +from .. import util +from .engines import drop_all_tables +from .entities import BasicEntity, ComparableEntity +import sys +import sqlalchemy as sa +from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta + +# whether or not we use unittest changes things dramatically, +# as far as how py.test collection works. + + +class TestBase(object): + # A sequence of database names to always run, regardless of the + # constraints below. + __whitelist__ = () + + # A sequence of requirement names matching testing.requires decorators + __requires__ = () + + # A sequence of dialect names to exclude from the test class. + __unsupported_on__ = () + + # If present, test class is only runnable for the *single* specified + # dialect. If you need multiple, use __unsupported_on__ and invert. + __only_on__ = None + + # A sequence of no-arg callables. If any are True, the entire testcase is + # skipped. + __skip_if__ = None + + def assert_(self, val, msg=None): + assert val, msg + + # apparently a handful of tests are doing this....OK + def setup(self): + if hasattr(self, "setUp"): + self.setUp() + + def teardown(self): + if hasattr(self, "tearDown"): + self.tearDown() + + +class TablesTest(TestBase): + + # 'once', None + run_setup_bind = 'once' + + # 'once', 'each', None + run_define_tables = 'once' + + # 'once', 'each', None + run_create_tables = 'once' + + # 'once', 'each', None + run_inserts = 'each' + + # 'each', None + run_deletes = 'each' + + # 'once', None + run_dispose_bind = None + + bind = None + metadata = None + tables = None + other = None + + @classmethod + def setup_class(cls): + cls._init_class() + + cls._setup_once_tables() + + cls._setup_once_inserts() + + @classmethod + def _init_class(cls): + if cls.run_define_tables == 'each': + if cls.run_create_tables == 'once': + cls.run_create_tables = 'each' + assert cls.run_inserts in ('each', None) + + cls.other = adict() + cls.tables = adict() + + cls.bind = cls.setup_bind() + cls.metadata = sa.MetaData() + cls.metadata.bind = cls.bind + + @classmethod + def _setup_once_inserts(cls): + if cls.run_inserts == 'once': + cls._load_fixtures() + cls.insert_data() + + @classmethod + def _setup_once_tables(cls): + if cls.run_define_tables == 'once': + cls.define_tables(cls.metadata) + if cls.run_create_tables == 'once': + cls.metadata.create_all(cls.bind) + cls.tables.update(cls.metadata.tables) + + def _setup_each_tables(self): + if self.run_define_tables == 'each': + self.tables.clear() + if self.run_create_tables == 'each': + drop_all_tables(self.metadata, self.bind) + self.metadata.clear() + self.define_tables(self.metadata) + if self.run_create_tables == 'each': + self.metadata.create_all(self.bind) + self.tables.update(self.metadata.tables) + elif self.run_create_tables == 'each': + drop_all_tables(self.metadata, self.bind) + self.metadata.create_all(self.bind) + + def _setup_each_inserts(self): + if self.run_inserts == 'each': + self._load_fixtures() + self.insert_data() + + def _teardown_each_tables(self): + # no need to run deletes if tables are recreated on setup + if self.run_define_tables != 'each' and self.run_deletes == 'each': + with self.bind.connect() as conn: + for table in reversed(self.metadata.sorted_tables): + try: + conn.execute(table.delete()) + except sa.exc.DBAPIError as ex: + util.print_( + ("Error emptying table %s: %r" % (table, ex)), + file=sys.stderr) + + def setup(self): + self._setup_each_tables() + self._setup_each_inserts() + + def teardown(self): + self._teardown_each_tables() + + @classmethod + def _teardown_once_metadata_bind(cls): + if cls.run_create_tables: + drop_all_tables(cls.metadata, cls.bind) + + if cls.run_dispose_bind == 'once': + cls.dispose_bind(cls.bind) + + cls.metadata.bind = None + + if cls.run_setup_bind is not None: + cls.bind = None + + @classmethod + def teardown_class(cls): + cls._teardown_once_metadata_bind() + + @classmethod + def setup_bind(cls): + return config.db + + @classmethod + def dispose_bind(cls, bind): + if hasattr(bind, 'dispose'): + bind.dispose() + elif hasattr(bind, 'close'): + bind.close() + + @classmethod + def define_tables(cls, metadata): + pass + + @classmethod + def fixtures(cls): + return {} + + @classmethod + def insert_data(cls): + pass + + def sql_count_(self, count, fn): + self.assert_sql_count(self.bind, fn, count) + + def sql_eq_(self, callable_, statements): + self.assert_sql(self.bind, callable_, statements) + + @classmethod + def _load_fixtures(cls): + """Insert rows as represented by the fixtures() method.""" + headers, rows = {}, {} + for table, data in cls.fixtures().items(): + if len(data) < 2: + continue + if isinstance(table, util.string_types): + table = cls.tables[table] + headers[table] = data[0] + rows[table] = data[1:] + for table in cls.metadata.sorted_tables: + if table not in headers: + continue + cls.bind.execute( + table.insert(), + [dict(zip(headers[table], column_values)) + for column_values in rows[table]]) + +from sqlalchemy import event + + +class RemovesEvents(object): + @util.memoized_property + def _event_fns(self): + return set() + + def event_listen(self, target, name, fn): + self._event_fns.add((target, name, fn)) + event.listen(target, name, fn) + + def teardown(self): + for key in self._event_fns: + event.remove(*key) + super_ = super(RemovesEvents, self) + if hasattr(super_, "teardown"): + super_.teardown() + + +class _ORMTest(object): + + @classmethod + def teardown_class(cls): + sa.orm.session.Session.close_all() + sa.orm.clear_mappers() + + +class ORMTest(_ORMTest, TestBase): + pass + + +class MappedTest(_ORMTest, TablesTest, assertions.AssertsExecutionResults): + # 'once', 'each', None + run_setup_classes = 'once' + + # 'once', 'each', None + run_setup_mappers = 'each' + + classes = None + + @classmethod + def setup_class(cls): + cls._init_class() + + if cls.classes is None: + cls.classes = adict() + + cls._setup_once_tables() + cls._setup_once_classes() + cls._setup_once_mappers() + cls._setup_once_inserts() + + @classmethod + def teardown_class(cls): + cls._teardown_once_class() + cls._teardown_once_metadata_bind() + + def setup(self): + self._setup_each_tables() + self._setup_each_classes() + self._setup_each_mappers() + self._setup_each_inserts() + + def teardown(self): + sa.orm.session.Session.close_all() + self._teardown_each_mappers() + self._teardown_each_classes() + self._teardown_each_tables() + + @classmethod + def _teardown_once_class(cls): + cls.classes.clear() + _ORMTest.teardown_class() + + @classmethod + def _setup_once_classes(cls): + if cls.run_setup_classes == 'once': + cls._with_register_classes(cls.setup_classes) + + @classmethod + def _setup_once_mappers(cls): + if cls.run_setup_mappers == 'once': + cls._with_register_classes(cls.setup_mappers) + + def _setup_each_mappers(self): + if self.run_setup_mappers == 'each': + self._with_register_classes(self.setup_mappers) + + def _setup_each_classes(self): + if self.run_setup_classes == 'each': + self._with_register_classes(self.setup_classes) + + @classmethod + def _with_register_classes(cls, fn): + """Run a setup method, framing the operation with a Base class + that will catch new subclasses to be established within + the "classes" registry. + + """ + cls_registry = cls.classes + + class FindFixture(type): + def __init__(cls, classname, bases, dict_): + cls_registry[classname] = cls + return type.__init__(cls, classname, bases, dict_) + + class _Base(util.with_metaclass(FindFixture, object)): + pass + + class Basic(BasicEntity, _Base): + pass + + class Comparable(ComparableEntity, _Base): + pass + + cls.Basic = Basic + cls.Comparable = Comparable + fn() + + def _teardown_each_mappers(self): + # some tests create mappers in the test bodies + # and will define setup_mappers as None - + # clear mappers in any case + if self.run_setup_mappers != 'once': + sa.orm.clear_mappers() + + def _teardown_each_classes(self): + if self.run_setup_classes != 'once': + self.classes.clear() + + @classmethod + def setup_classes(cls): + pass + + @classmethod + def setup_mappers(cls): + pass + + +class DeclarativeMappedTest(MappedTest): + run_setup_classes = 'once' + run_setup_mappers = 'once' + + @classmethod + def _setup_once_tables(cls): + pass + + @classmethod + def _with_register_classes(cls, fn): + cls_registry = cls.classes + + class FindFixtureDeclarative(DeclarativeMeta): + def __init__(cls, classname, bases, dict_): + cls_registry[classname] = cls + return DeclarativeMeta.__init__( + cls, classname, bases, dict_) + + class DeclarativeBasic(object): + __table_cls__ = schema.Table + + _DeclBase = declarative_base(metadata=cls.metadata, + metaclass=FindFixtureDeclarative, + cls=DeclarativeBasic) + cls.DeclarativeBasic = _DeclBase + fn() + + if cls.metadata.tables and cls.run_create_tables: + cls.metadata.create_all(config.db) diff --git a/app/lib/sqlalchemy/testing/mock.py b/app/lib/sqlalchemy/testing/mock.py new file mode 100644 index 0000000..05291ec --- /dev/null +++ b/app/lib/sqlalchemy/testing/mock.py @@ -0,0 +1,21 @@ +# testing/mock.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Import stub for mock library. +""" +from __future__ import absolute_import +from ..util import py33 + +if py33: + from unittest.mock import MagicMock, Mock, call, patch, ANY +else: + try: + from mock import MagicMock, Mock, call, patch, ANY + except ImportError: + raise ImportError( + "SQLAlchemy's test suite requires the " + "'mock' library as of 0.8.2.") diff --git a/app/lib/sqlalchemy/testing/pickleable.py b/app/lib/sqlalchemy/testing/pickleable.py new file mode 100644 index 0000000..c3ba828 --- /dev/null +++ b/app/lib/sqlalchemy/testing/pickleable.py @@ -0,0 +1,143 @@ +# testing/pickleable.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Classes used in pickling tests, need to be at the module level for +unpickling. +""" + +from . import fixtures + + +class User(fixtures.ComparableEntity): + pass + + +class Order(fixtures.ComparableEntity): + pass + + +class Dingaling(fixtures.ComparableEntity): + pass + + +class EmailUser(User): + pass + + +class Address(fixtures.ComparableEntity): + pass + + +# TODO: these are kind of arbitrary.... +class Child1(fixtures.ComparableEntity): + pass + + +class Child2(fixtures.ComparableEntity): + pass + + +class Parent(fixtures.ComparableEntity): + pass + + +class Screen(object): + + def __init__(self, obj, parent=None): + self.obj = obj + self.parent = parent + + +class Foo(object): + + def __init__(self, moredata): + self.data = 'im data' + self.stuff = 'im stuff' + self.moredata = moredata + + __hash__ = object.__hash__ + + def __eq__(self, other): + return other.data == self.data and \ + other.stuff == self.stuff and \ + other.moredata == self.moredata + + +class Bar(object): + + def __init__(self, x, y): + self.x = x + self.y = y + + __hash__ = object.__hash__ + + def __eq__(self, other): + return other.__class__ is self.__class__ and \ + other.x == self.x and \ + other.y == self.y + + def __str__(self): + return "Bar(%d, %d)" % (self.x, self.y) + + +class OldSchool: + + def __init__(self, x, y): + self.x = x + self.y = y + + def __eq__(self, other): + return other.__class__ is self.__class__ and \ + other.x == self.x and \ + other.y == self.y + + +class OldSchoolWithoutCompare: + + def __init__(self, x, y): + self.x = x + self.y = y + + +class BarWithoutCompare(object): + + def __init__(self, x, y): + self.x = x + self.y = y + + def __str__(self): + return "Bar(%d, %d)" % (self.x, self.y) + + +class NotComparable(object): + + def __init__(self, data): + self.data = data + + def __hash__(self): + return id(self) + + def __eq__(self, other): + return NotImplemented + + def __ne__(self, other): + return NotImplemented + + +class BrokenComparable(object): + + def __init__(self, data): + self.data = data + + def __hash__(self): + return id(self) + + def __eq__(self, other): + raise NotImplementedError + + def __ne__(self, other): + raise NotImplementedError diff --git a/src/application/views/__init__.py b/app/lib/sqlalchemy/testing/plugin/__init__.py similarity index 100% rename from src/application/views/__init__.py rename to app/lib/sqlalchemy/testing/plugin/__init__.py diff --git a/app/lib/sqlalchemy/testing/plugin/bootstrap.py b/app/lib/sqlalchemy/testing/plugin/bootstrap.py new file mode 100644 index 0000000..497fcb7 --- /dev/null +++ b/app/lib/sqlalchemy/testing/plugin/bootstrap.py @@ -0,0 +1,44 @@ +""" +Bootstrapper for nose/pytest plugins. + +The entire rationale for this system is to get the modules in plugin/ +imported without importing all of the supporting library, so that we can +set up things for testing before coverage starts. + +The rationale for all of plugin/ being *in* the supporting library in the +first place is so that the testing and plugin suite is available to other +libraries, mainly external SQLAlchemy and Alembic dialects, to make use +of the same test environment and standard suites available to +SQLAlchemy/Alembic themselves without the need to ship/install a separate +package outside of SQLAlchemy. + +NOTE: copied/adapted from SQLAlchemy master for backwards compatibility; +this should be removable when Alembic targets SQLAlchemy 1.0.0. + +""" + +import os +import sys + +bootstrap_file = locals()['bootstrap_file'] +to_bootstrap = locals()['to_bootstrap'] + + +def load_file_as_module(name): + path = os.path.join(os.path.dirname(bootstrap_file), "%s.py" % name) + if sys.version_info >= (3, 3): + from importlib import machinery + mod = machinery.SourceFileLoader(name, path).load_module() + else: + import imp + mod = imp.load_source(name, path) + return mod + +if to_bootstrap == "pytest": + sys.modules["sqla_plugin_base"] = load_file_as_module("plugin_base") + sys.modules["sqla_pytestplugin"] = load_file_as_module("pytestplugin") +elif to_bootstrap == "nose": + sys.modules["sqla_plugin_base"] = load_file_as_module("plugin_base") + sys.modules["sqla_noseplugin"] = load_file_as_module("noseplugin") +else: + raise Exception("unknown bootstrap: %s" % to_bootstrap) # noqa diff --git a/app/lib/sqlalchemy/testing/plugin/noseplugin.py b/app/lib/sqlalchemy/testing/plugin/noseplugin.py new file mode 100644 index 0000000..2cf95d8 --- /dev/null +++ b/app/lib/sqlalchemy/testing/plugin/noseplugin.py @@ -0,0 +1,107 @@ +# plugin/noseplugin.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Enhance nose with extra options and behaviors for running SQLAlchemy tests. + +Must be run via ./sqla_nose.py so that it is imported in the expected +way (e.g. as a package-less import). + +""" + +try: + # installed by bootstrap.py + import sqla_plugin_base as plugin_base +except ImportError: + # assume we're a package, use traditional import + from . import plugin_base + + +import os +import sys + +from nose.plugins import Plugin +import nose +fixtures = None + +py3k = sys.version_info >= (3, 0) + + +class NoseSQLAlchemy(Plugin): + enabled = True + + name = 'sqla_testing' + score = 100 + + def options(self, parser, env=os.environ): + Plugin.options(self, parser, env) + opt = parser.add_option + + def make_option(name, **kw): + callback_ = kw.pop("callback", None) + if callback_: + def wrap_(option, opt_str, value, parser): + callback_(opt_str, value, parser) + kw["callback"] = wrap_ + opt(name, **kw) + + plugin_base.setup_options(make_option) + plugin_base.read_config() + + def configure(self, options, conf): + super(NoseSQLAlchemy, self).configure(options, conf) + plugin_base.pre_begin(options) + + plugin_base.set_coverage_flag(options.enable_plugin_coverage) + + plugin_base.set_skip_test(nose.SkipTest) + + def begin(self): + global fixtures + from sqlalchemy.testing import fixtures # noqa + + plugin_base.post_begin() + + def describeTest(self, test): + return "" + + def wantFunction(self, fn): + return False + + def wantMethod(self, fn): + if py3k: + if not hasattr(fn.__self__, 'cls'): + return False + cls = fn.__self__.cls + else: + cls = fn.im_class + return plugin_base.want_method(cls, fn) + + def wantClass(self, cls): + return plugin_base.want_class(cls) + + def beforeTest(self, test): + if not hasattr(test.test, 'cls'): + return + plugin_base.before_test( + test, + test.test.cls.__module__, + test.test.cls, test.test.method.__name__) + + def afterTest(self, test): + plugin_base.after_test(test) + + def startContext(self, ctx): + if not isinstance(ctx, type) \ + or not issubclass(ctx, fixtures.TestBase): + return + plugin_base.start_test_class(ctx) + + def stopContext(self, ctx): + if not isinstance(ctx, type) \ + or not issubclass(ctx, fixtures.TestBase): + return + plugin_base.stop_test_class(ctx) diff --git a/app/lib/sqlalchemy/testing/plugin/plugin_base.py b/app/lib/sqlalchemy/testing/plugin/plugin_base.py new file mode 100644 index 0000000..996cf45 --- /dev/null +++ b/app/lib/sqlalchemy/testing/plugin/plugin_base.py @@ -0,0 +1,565 @@ +# plugin/plugin_base.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Testing extensions. + +this module is designed to work as a testing-framework-agnostic library, +so that we can continue to support nose and also begin adding new +functionality via py.test. + +""" + +from __future__ import absolute_import + +import sys +import re + +py3k = sys.version_info >= (3, 0) + +if py3k: + import configparser +else: + import ConfigParser as configparser + +# late imports +fixtures = None +engines = None +exclusions = None +warnings = None +profiling = None +assertions = None +requirements = None +config = None +testing = None +util = None +file_config = None + + +logging = None +include_tags = set() +exclude_tags = set() +options = None + + +def setup_options(make_option): + make_option("--log-info", action="callback", type="string", callback=_log, + help="turn on info logging for (multiple OK)") + make_option("--log-debug", action="callback", + type="string", callback=_log, + help="turn on debug logging for (multiple OK)") + make_option("--db", action="append", type="string", dest="db", + help="Use prefab database uri. Multiple OK, " + "first one is run by default.") + make_option('--dbs', action='callback', callback=_list_dbs, + help="List available prefab dbs") + make_option("--dburi", action="append", type="string", dest="dburi", + help="Database uri. Multiple OK, " + "first one is run by default.") + make_option("--dropfirst", action="store_true", dest="dropfirst", + help="Drop all tables in the target database first") + make_option("--backend-only", action="store_true", dest="backend_only", + help="Run only tests marked with __backend__") + make_option("--low-connections", action="store_true", + dest="low_connections", + help="Use a low number of distinct connections - " + "i.e. for Oracle TNS") + make_option("--write-idents", type="string", dest="write_idents", + help="write out generated follower idents to , " + "when -n is used") + make_option("--reversetop", action="store_true", + dest="reversetop", default=False, + help="Use a random-ordering set implementation in the ORM " + "(helps reveal dependency issues)") + make_option("--requirements", action="callback", type="string", + callback=_requirements_opt, + help="requirements class for testing, overrides setup.cfg") + make_option("--with-cdecimal", action="store_true", + dest="cdecimal", default=False, + help="Monkeypatch the cdecimal library into Python 'decimal' " + "for all tests") + make_option("--include-tag", action="callback", callback=_include_tag, + type="string", + help="Include tests with tag ") + make_option("--exclude-tag", action="callback", callback=_exclude_tag, + type="string", + help="Exclude tests with tag ") + make_option("--write-profiles", action="store_true", + dest="write_profiles", default=False, + help="Write/update failing profiling data.") + make_option("--force-write-profiles", action="store_true", + dest="force_write_profiles", default=False, + help="Unconditionally write/update profiling data.") + + +def configure_follower(follower_ident): + """Configure required state for a follower. + + This invokes in the parent process and typically includes + database creation. + + """ + from sqlalchemy.testing import provision + provision.FOLLOWER_IDENT = follower_ident + + +def memoize_important_follower_config(dict_): + """Store important configuration we will need to send to a follower. + + This invokes in the parent process after normal config is set up. + + This is necessary as py.test seems to not be using forking, so we + start with nothing in memory, *but* it isn't running our argparse + callables, so we have to just copy all of that over. + + """ + dict_['memoized_config'] = { + 'include_tags': include_tags, + 'exclude_tags': exclude_tags + } + + +def restore_important_follower_config(dict_): + """Restore important configuration needed by a follower. + + This invokes in the follower process. + + """ + global include_tags, exclude_tags + include_tags.update(dict_['memoized_config']['include_tags']) + exclude_tags.update(dict_['memoized_config']['exclude_tags']) + + +def read_config(): + global file_config + file_config = configparser.ConfigParser() + file_config.read(['setup.cfg', 'test.cfg']) + + +def pre_begin(opt): + """things to set up early, before coverage might be setup.""" + global options + options = opt + for fn in pre_configure: + fn(options, file_config) + + +def set_coverage_flag(value): + options.has_coverage = value + +_skip_test_exception = None + + +def set_skip_test(exc): + global _skip_test_exception + _skip_test_exception = exc + + +def post_begin(): + """things to set up later, once we know coverage is running.""" + # Lazy setup of other options (post coverage) + for fn in post_configure: + fn(options, file_config) + + # late imports, has to happen after config as well + # as nose plugins like coverage + global util, fixtures, engines, exclusions, \ + assertions, warnings, profiling,\ + config, testing + from sqlalchemy import testing # noqa + from sqlalchemy.testing import fixtures, engines, exclusions # noqa + from sqlalchemy.testing import assertions, warnings, profiling # noqa + from sqlalchemy.testing import config # noqa + from sqlalchemy import util # noqa + warnings.setup_filters() + + + +def _log(opt_str, value, parser): + global logging + if not logging: + import logging + logging.basicConfig() + + if opt_str.endswith('-info'): + logging.getLogger(value).setLevel(logging.INFO) + elif opt_str.endswith('-debug'): + logging.getLogger(value).setLevel(logging.DEBUG) + + +def _list_dbs(*args): + print("Available --db options (use --dburi to override)") + for macro in sorted(file_config.options('db')): + print("%20s\t%s" % (macro, file_config.get('db', macro))) + sys.exit(0) + + +def _requirements_opt(opt_str, value, parser): + _setup_requirements(value) + + +def _exclude_tag(opt_str, value, parser): + exclude_tags.add(value.replace('-', '_')) + + +def _include_tag(opt_str, value, parser): + include_tags.add(value.replace('-', '_')) + +pre_configure = [] +post_configure = [] + + +def pre(fn): + pre_configure.append(fn) + return fn + + +def post(fn): + post_configure.append(fn) + return fn + + +@pre +def _setup_options(opt, file_config): + global options + options = opt + + +@pre +def _monkeypatch_cdecimal(options, file_config): + if options.cdecimal: + import cdecimal + sys.modules['decimal'] = cdecimal + + +@post +def _init_skiptest(options, file_config): + from sqlalchemy.testing import config + + config._skip_test_exception = _skip_test_exception + + +@post +def _engine_uri(options, file_config): + from sqlalchemy.testing import config + from sqlalchemy import testing + from sqlalchemy.testing import provision + + if options.dburi: + db_urls = list(options.dburi) + else: + db_urls = [] + + if options.db: + for db_token in options.db: + for db in re.split(r'[,\s]+', db_token): + if db not in file_config.options('db'): + raise RuntimeError( + "Unknown URI specifier '%s'. " + "Specify --dbs for known uris." + % db) + else: + db_urls.append(file_config.get('db', db)) + + if not db_urls: + db_urls.append(file_config.get('db', 'default')) + + config._current = None + for db_url in db_urls: + cfg = provision.setup_config( + db_url, options, file_config, provision.FOLLOWER_IDENT) + + if not config._current: + cfg.set_as_current(cfg, testing) + + +@post +def _requirements(options, file_config): + + requirement_cls = file_config.get('sqla_testing', "requirement_cls") + _setup_requirements(requirement_cls) + + +def _setup_requirements(argument): + from sqlalchemy.testing import config + from sqlalchemy import testing + + if config.requirements is not None: + return + + modname, clsname = argument.split(":") + + # importlib.import_module() only introduced in 2.7, a little + # late + mod = __import__(modname) + for component in modname.split(".")[1:]: + mod = getattr(mod, component) + req_cls = getattr(mod, clsname) + + config.requirements = testing.requires = req_cls() + + +@post +def _prep_testing_database(options, file_config): + from sqlalchemy.testing import config, util + from sqlalchemy.testing.exclusions import against + from sqlalchemy import schema, inspect + + if options.dropfirst: + for cfg in config.Config.all_configs(): + e = cfg.db + inspector = inspect(e) + try: + view_names = inspector.get_view_names() + except NotImplementedError: + pass + else: + for vname in view_names: + e.execute(schema._DropView( + schema.Table(vname, schema.MetaData()) + )) + + if config.requirements.schemas.enabled_for_config(cfg): + try: + view_names = inspector.get_view_names( + schema="test_schema") + except NotImplementedError: + pass + else: + for vname in view_names: + e.execute(schema._DropView( + schema.Table(vname, schema.MetaData(), + schema="test_schema") + )) + + util.drop_all_tables(e, inspector) + + if config.requirements.schemas.enabled_for_config(cfg): + util.drop_all_tables(e, inspector, schema=cfg.test_schema) + + if against(cfg, "postgresql"): + from sqlalchemy.dialects import postgresql + for enum in inspector.get_enums("*"): + e.execute(postgresql.DropEnumType( + postgresql.ENUM( + name=enum['name'], + schema=enum['schema']))) + + +@post +def _reverse_topological(options, file_config): + if options.reversetop: + from sqlalchemy.orm.util import randomize_unitofwork + randomize_unitofwork() + + +@post +def _post_setup_options(opt, file_config): + from sqlalchemy.testing import config + config.options = options + config.file_config = file_config + + +@post +def _setup_profiling(options, file_config): + from sqlalchemy.testing import profiling + profiling._profile_stats = profiling.ProfileStatsFile( + file_config.get('sqla_testing', 'profile_file')) + + +def want_class(cls): + if not issubclass(cls, fixtures.TestBase): + return False + elif cls.__name__.startswith('_'): + return False + elif config.options.backend_only and not getattr(cls, '__backend__', + False): + return False + else: + return True + + +def want_method(cls, fn): + if not fn.__name__.startswith("test_"): + return False + elif fn.__module__ is None: + return False + elif include_tags: + return ( + hasattr(cls, '__tags__') and + exclusions.tags(cls.__tags__).include_test( + include_tags, exclude_tags) + ) or ( + hasattr(fn, '_sa_exclusion_extend') and + fn._sa_exclusion_extend.include_test( + include_tags, exclude_tags) + ) + elif exclude_tags and hasattr(cls, '__tags__'): + return exclusions.tags(cls.__tags__).include_test( + include_tags, exclude_tags) + elif exclude_tags and hasattr(fn, '_sa_exclusion_extend'): + return fn._sa_exclusion_extend.include_test(include_tags, exclude_tags) + else: + return True + + +def generate_sub_tests(cls, module): + if getattr(cls, '__backend__', False): + for cfg in _possible_configs_for_cls(cls): + name = "%s_%s_%s" % (cls.__name__, cfg.db.name, cfg.db.driver) + subcls = type( + name, + (cls, ), + { + "__only_on__": ("%s+%s" % (cfg.db.name, cfg.db.driver)), + } + ) + setattr(module, name, subcls) + yield subcls + else: + yield cls + + +def start_test_class(cls): + _do_skips(cls) + _setup_engine(cls) + + +def stop_test_class(cls): + #from sqlalchemy import inspect + #assert not inspect(testing.db).get_table_names() + engines.testing_reaper._stop_test_ctx() + try: + if not options.low_connections: + assertions.global_cleanup_assertions() + finally: + _restore_engine() + + +def _restore_engine(): + config._current.reset(testing) + + +def final_process_cleanup(): + engines.testing_reaper._stop_test_ctx_aggressive() + assertions.global_cleanup_assertions() + _restore_engine() + + +def _setup_engine(cls): + if getattr(cls, '__engine_options__', None): + eng = engines.testing_engine(options=cls.__engine_options__) + config._current.push_engine(eng, testing) + + +def before_test(test, test_module_name, test_class, test_name): + + # like a nose id, e.g.: + # "test.aaa_profiling.test_compiler.CompileTest.test_update_whereclause" + name = test_class.__name__ + + suffix = "_%s_%s" % (config.db.name, config.db.driver) + if name.endswith(suffix): + name = name[0:-(len(suffix))] + + id_ = "%s.%s.%s" % (test_module_name, name, test_name) + + profiling._current_test = id_ + + +def after_test(test): + engines.testing_reaper._after_test_ctx() + + +def _possible_configs_for_cls(cls, reasons=None): + all_configs = set(config.Config.all_configs()) + + if cls.__unsupported_on__: + spec = exclusions.db_spec(*cls.__unsupported_on__) + for config_obj in list(all_configs): + if spec(config_obj): + all_configs.remove(config_obj) + + if getattr(cls, '__only_on__', None): + spec = exclusions.db_spec(*util.to_list(cls.__only_on__)) + for config_obj in list(all_configs): + if not spec(config_obj): + all_configs.remove(config_obj) + + if hasattr(cls, '__requires__'): + requirements = config.requirements + for config_obj in list(all_configs): + for requirement in cls.__requires__: + check = getattr(requirements, requirement) + + skip_reasons = check.matching_config_reasons(config_obj) + if skip_reasons: + all_configs.remove(config_obj) + if reasons is not None: + reasons.extend(skip_reasons) + break + + if hasattr(cls, '__prefer_requires__'): + non_preferred = set() + requirements = config.requirements + for config_obj in list(all_configs): + for requirement in cls.__prefer_requires__: + check = getattr(requirements, requirement) + + if not check.enabled_for_config(config_obj): + non_preferred.add(config_obj) + if all_configs.difference(non_preferred): + all_configs.difference_update(non_preferred) + + return all_configs + + +def _do_skips(cls): + reasons = [] + all_configs = _possible_configs_for_cls(cls, reasons) + + if getattr(cls, '__skip_if__', False): + for c in getattr(cls, '__skip_if__'): + if c(): + config.skip_test("'%s' skipped by %s" % ( + cls.__name__, c.__name__) + ) + + if not all_configs: + if getattr(cls, '__backend__', False): + msg = "'%s' unsupported for implementation '%s'" % ( + cls.__name__, cls.__only_on__) + else: + msg = "'%s' unsupported on any DB implementation %s%s" % ( + cls.__name__, + ", ".join( + "'%s(%s)+%s'" % ( + config_obj.db.name, + ".".join( + str(dig) for dig in + config_obj.db.dialect.server_version_info), + config_obj.db.driver + ) + for config_obj in config.Config.all_configs() + ), + ", ".join(reasons) + ) + config.skip_test(msg) + elif hasattr(cls, '__prefer_backends__'): + non_preferred = set() + spec = exclusions.db_spec(*util.to_list(cls.__prefer_backends__)) + for config_obj in all_configs: + if not spec(config_obj): + non_preferred.add(config_obj) + if all_configs.difference(non_preferred): + all_configs.difference_update(non_preferred) + + if config._current not in all_configs: + _setup_config(all_configs.pop(), cls) + + +def _setup_config(config_obj, ctx): + config._current.push(config_obj, testing) diff --git a/app/lib/sqlalchemy/testing/plugin/pytestplugin.py b/app/lib/sqlalchemy/testing/plugin/pytestplugin.py new file mode 100644 index 0000000..d7da738 --- /dev/null +++ b/app/lib/sqlalchemy/testing/plugin/pytestplugin.py @@ -0,0 +1,194 @@ +try: + # installed by bootstrap.py + import sqla_plugin_base as plugin_base +except ImportError: + # assume we're a package, use traditional import + from . import plugin_base + +import pytest +import argparse +import inspect +import collections +import os + +try: + import xdist # noqa + has_xdist = True +except ImportError: + has_xdist = False + + +def pytest_addoption(parser): + group = parser.getgroup("sqlalchemy") + + def make_option(name, **kw): + callback_ = kw.pop("callback", None) + if callback_: + class CallableAction(argparse.Action): + def __call__(self, parser, namespace, + values, option_string=None): + callback_(option_string, values, parser) + kw["action"] = CallableAction + + group.addoption(name, **kw) + + plugin_base.setup_options(make_option) + plugin_base.read_config() + + +def pytest_configure(config): + if hasattr(config, "slaveinput"): + plugin_base.restore_important_follower_config(config.slaveinput) + plugin_base.configure_follower( + config.slaveinput["follower_ident"] + ) + + if config.option.write_idents: + with open(config.option.write_idents, "a") as file_: + file_.write(config.slaveinput["follower_ident"] + "\n") + else: + if config.option.write_idents and \ + os.path.exists(config.option.write_idents): + os.remove(config.option.write_idents) + + plugin_base.pre_begin(config.option) + + plugin_base.set_coverage_flag(bool(getattr(config.option, + "cov_source", False))) + + plugin_base.set_skip_test(pytest.skip.Exception) + + +def pytest_sessionstart(session): + plugin_base.post_begin() + + +def pytest_sessionfinish(session): + plugin_base.final_process_cleanup() + + +if has_xdist: + import uuid + + def pytest_configure_node(node): + # the master for each node fills slaveinput dictionary + # which pytest-xdist will transfer to the subprocess + + plugin_base.memoize_important_follower_config(node.slaveinput) + + node.slaveinput["follower_ident"] = "test_%s" % uuid.uuid4().hex[0:12] + from sqlalchemy.testing import provision + provision.create_follower_db(node.slaveinput["follower_ident"]) + + def pytest_testnodedown(node, error): + from sqlalchemy.testing import provision + provision.drop_follower_db(node.slaveinput["follower_ident"]) + + +def pytest_collection_modifyitems(session, config, items): + # look for all those classes that specify __backend__ and + # expand them out into per-database test cases. + + # this is much easier to do within pytest_pycollect_makeitem, however + # pytest is iterating through cls.__dict__ as makeitem is + # called which causes a "dictionary changed size" error on py3k. + # I'd submit a pullreq for them to turn it into a list first, but + # it's to suit the rather odd use case here which is that we are adding + # new classes to a module on the fly. + + rebuilt_items = collections.defaultdict(list) + items[:] = [ + item for item in + items if isinstance(item.parent, pytest.Instance) + and not item.parent.parent.name.startswith("_")] + test_classes = set(item.parent for item in items) + for test_class in test_classes: + for sub_cls in plugin_base.generate_sub_tests( + test_class.cls, test_class.parent.module): + if sub_cls is not test_class.cls: + list_ = rebuilt_items[test_class.cls] + + for inst in pytest.Class( + sub_cls.__name__, + parent=test_class.parent.parent).collect(): + list_.extend(inst.collect()) + + newitems = [] + for item in items: + if item.parent.cls in rebuilt_items: + newitems.extend(rebuilt_items[item.parent.cls]) + rebuilt_items[item.parent.cls][:] = [] + else: + newitems.append(item) + + # seems like the functions attached to a test class aren't sorted already? + # is that true and why's that? (when using unittest, they're sorted) + items[:] = sorted(newitems, key=lambda item: ( + item.parent.parent.parent.name, + item.parent.parent.name, + item.name + )) + + +def pytest_pycollect_makeitem(collector, name, obj): + if inspect.isclass(obj) and plugin_base.want_class(obj): + return pytest.Class(name, parent=collector) + elif inspect.isfunction(obj) and \ + isinstance(collector, pytest.Instance) and \ + plugin_base.want_method(collector.cls, obj): + return pytest.Function(name, parent=collector) + else: + return [] + +_current_class = None + + +def pytest_runtest_setup(item): + # here we seem to get called only based on what we collected + # in pytest_collection_modifyitems. So to do class-based stuff + # we have to tear that out. + global _current_class + + if not isinstance(item, pytest.Function): + return + + # ... so we're doing a little dance here to figure it out... + if _current_class is None: + class_setup(item.parent.parent) + _current_class = item.parent.parent + + # this is needed for the class-level, to ensure that the + # teardown runs after the class is completed with its own + # class-level teardown... + def finalize(): + global _current_class + class_teardown(item.parent.parent) + _current_class = None + item.parent.parent.addfinalizer(finalize) + + test_setup(item) + + +def pytest_runtest_teardown(item): + # ...but this works better as the hook here rather than + # using a finalizer, as the finalizer seems to get in the way + # of the test reporting failures correctly (you get a bunch of + # py.test assertion stuff instead) + test_teardown(item) + + +def test_setup(item): + plugin_base.before_test(item, item.parent.module.__name__, + item.parent.cls, item.name) + + +def test_teardown(item): + plugin_base.after_test(item) + + +def class_setup(item): + plugin_base.start_test_class(item.cls) + + +def class_teardown(item): + plugin_base.stop_test_class(item.cls) diff --git a/app/lib/sqlalchemy/testing/profiling.py b/app/lib/sqlalchemy/testing/profiling.py new file mode 100644 index 0000000..62cdaef --- /dev/null +++ b/app/lib/sqlalchemy/testing/profiling.py @@ -0,0 +1,265 @@ +# testing/profiling.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Profiling support for unit and performance tests. + +These are special purpose profiling methods which operate +in a more fine-grained way than nose's profiling plugin. + +""" + +import os +import sys +from .util import gc_collect +from . import config +import pstats +import collections +import contextlib + +try: + import cProfile +except ImportError: + cProfile = None +from ..util import jython, pypy, win32, update_wrapper + +_current_test = None + +# ProfileStatsFile instance, set up in plugin_base +_profile_stats = None + + +class ProfileStatsFile(object): + """"Store per-platform/fn profiling results in a file. + + We're still targeting Py2.5, 2.4 on 0.7 with no dependencies, + so no json lib :( need to roll something silly + + """ + + def __init__(self, filename): + self.force_write = ( + config.options is not None and + config.options.force_write_profiles + ) + self.write = self.force_write or ( + config.options is not None and + config.options.write_profiles + ) + self.fname = os.path.abspath(filename) + self.short_fname = os.path.split(self.fname)[-1] + self.data = collections.defaultdict( + lambda: collections.defaultdict(dict)) + self._read() + if self.write: + # rewrite for the case where features changed, + # etc. + self._write() + + @property + def platform_key(self): + + dbapi_key = config.db.name + "_" + config.db.driver + + # keep it at 2.7, 3.1, 3.2, etc. for now. + py_version = '.'.join([str(v) for v in sys.version_info[0:2]]) + + platform_tokens = [py_version] + platform_tokens.append(dbapi_key) + if jython: + platform_tokens.append("jython") + if pypy: + platform_tokens.append("pypy") + if win32: + platform_tokens.append("win") + platform_tokens.append( + "nativeunicode" + if config.db.dialect.convert_unicode + else "dbapiunicode" + ) + _has_cext = config.requirements._has_cextensions() + platform_tokens.append(_has_cext and "cextensions" or "nocextensions") + return "_".join(platform_tokens) + + def has_stats(self): + test_key = _current_test + return ( + test_key in self.data and + self.platform_key in self.data[test_key] + ) + + def result(self, callcount): + test_key = _current_test + per_fn = self.data[test_key] + per_platform = per_fn[self.platform_key] + + if 'counts' not in per_platform: + per_platform['counts'] = counts = [] + else: + counts = per_platform['counts'] + + if 'current_count' not in per_platform: + per_platform['current_count'] = current_count = 0 + else: + current_count = per_platform['current_count'] + + has_count = len(counts) > current_count + + if not has_count: + counts.append(callcount) + if self.write: + self._write() + result = None + else: + result = per_platform['lineno'], counts[current_count] + per_platform['current_count'] += 1 + return result + + def replace(self, callcount): + test_key = _current_test + per_fn = self.data[test_key] + per_platform = per_fn[self.platform_key] + counts = per_platform['counts'] + current_count = per_platform['current_count'] + if current_count < len(counts): + counts[current_count - 1] = callcount + else: + counts[-1] = callcount + if self.write: + self._write() + + def _header(self): + return ( + "# %s\n" + "# This file is written out on a per-environment basis.\n" + "# For each test in aaa_profiling, the corresponding " + "function and \n" + "# environment is located within this file. " + "If it doesn't exist,\n" + "# the test is skipped.\n" + "# If a callcount does exist, it is compared " + "to what we received. \n" + "# assertions are raised if the counts do not match.\n" + "# \n" + "# To add a new callcount test, apply the function_call_count \n" + "# decorator and re-run the tests using the --write-profiles \n" + "# option - this file will be rewritten including the new count.\n" + "# \n" + ) % (self.fname) + + def _read(self): + try: + profile_f = open(self.fname) + except IOError: + return + for lineno, line in enumerate(profile_f): + line = line.strip() + if not line or line.startswith("#"): + continue + + test_key, platform_key, counts = line.split() + per_fn = self.data[test_key] + per_platform = per_fn[platform_key] + c = [int(count) for count in counts.split(",")] + per_platform['counts'] = c + per_platform['lineno'] = lineno + 1 + per_platform['current_count'] = 0 + profile_f.close() + + def _write(self): + print(("Writing profile file %s" % self.fname)) + profile_f = open(self.fname, "w") + profile_f.write(self._header()) + for test_key in sorted(self.data): + + per_fn = self.data[test_key] + profile_f.write("\n# TEST: %s\n\n" % test_key) + for platform_key in sorted(per_fn): + per_platform = per_fn[platform_key] + c = ",".join(str(count) for count in per_platform['counts']) + profile_f.write("%s %s %s\n" % (test_key, platform_key, c)) + profile_f.close() + + +def function_call_count(variance=0.05): + """Assert a target for a test case's function call count. + + The main purpose of this assertion is to detect changes in + callcounts for various functions - the actual number is not as important. + Callcounts are stored in a file keyed to Python version and OS platform + information. This file is generated automatically for new tests, + and versioned so that unexpected changes in callcounts will be detected. + + """ + + def decorate(fn): + def wrap(*args, **kw): + with count_functions(variance=variance): + return fn(*args, **kw) + return update_wrapper(wrap, fn) + return decorate + + +@contextlib.contextmanager +def count_functions(variance=0.05): + if cProfile is None: + raise SkipTest("cProfile is not installed") + + if not _profile_stats.has_stats() and not _profile_stats.write: + config.skip_test( + "No profiling stats available on this " + "platform for this function. Run tests with " + "--write-profiles to add statistics to %s for " + "this platform." % _profile_stats.short_fname) + + gc_collect() + + pr = cProfile.Profile() + pr.enable() + #began = time.time() + yield + #ended = time.time() + pr.disable() + + #s = compat.StringIO() + stats = pstats.Stats(pr, stream=sys.stdout) + + #timespent = ended - began + callcount = stats.total_calls + + expected = _profile_stats.result(callcount) + + if expected is None: + expected_count = None + else: + line_no, expected_count = expected + + print(("Pstats calls: %d Expected %s" % ( + callcount, + expected_count + ) + )) + stats.sort_stats("cumulative") + stats.print_stats() + + if expected_count: + deviance = int(callcount * variance) + failed = abs(callcount - expected_count) > deviance + + if failed or _profile_stats.force_write: + if _profile_stats.write: + _profile_stats.replace(callcount) + else: + raise AssertionError( + "Adjusted function call count %s not within %s%% " + "of expected %s, platform %s. Rerun with " + "--write-profiles to " + "regenerate this callcount." + % ( + callcount, (variance * 100), + expected_count, _profile_stats.platform_key)) + + diff --git a/app/lib/sqlalchemy/testing/provision.py b/app/lib/sqlalchemy/testing/provision.py new file mode 100644 index 0000000..7e44544 --- /dev/null +++ b/app/lib/sqlalchemy/testing/provision.py @@ -0,0 +1,318 @@ +from sqlalchemy.engine import url as sa_url +from sqlalchemy import text +from sqlalchemy import exc +from sqlalchemy.util import compat +from . import config, engines +import os +import time +import logging +log = logging.getLogger(__name__) + +FOLLOWER_IDENT = None + + +class register(object): + def __init__(self): + self.fns = {} + + @classmethod + def init(cls, fn): + return register().for_db("*")(fn) + + def for_db(self, dbname): + def decorate(fn): + self.fns[dbname] = fn + return self + return decorate + + def __call__(self, cfg, *arg): + if isinstance(cfg, compat.string_types): + url = sa_url.make_url(cfg) + elif isinstance(cfg, sa_url.URL): + url = cfg + else: + url = cfg.db.url + backend = url.get_backend_name() + if backend in self.fns: + return self.fns[backend](cfg, *arg) + else: + return self.fns['*'](cfg, *arg) + + +def create_follower_db(follower_ident): + for cfg in _configs_for_db_operation(): + _create_db(cfg, cfg.db, follower_ident) + + +def configure_follower(follower_ident): + for cfg in config.Config.all_configs(): + _configure_follower(cfg, follower_ident) + + +def setup_config(db_url, options, file_config, follower_ident): + if follower_ident: + db_url = _follower_url_from_main(db_url, follower_ident) + db_opts = {} + _update_db_opts(db_url, db_opts) + eng = engines.testing_engine(db_url, db_opts) + _post_configure_engine(db_url, eng, follower_ident) + eng.connect().close() + cfg = config.Config.register(eng, db_opts, options, file_config) + if follower_ident: + _configure_follower(cfg, follower_ident) + return cfg + + +def drop_follower_db(follower_ident): + for cfg in _configs_for_db_operation(): + _drop_db(cfg, cfg.db, follower_ident) + + +def _configs_for_db_operation(): + hosts = set() + + for cfg in config.Config.all_configs(): + cfg.db.dispose() + + for cfg in config.Config.all_configs(): + url = cfg.db.url + backend = url.get_backend_name() + host_conf = ( + backend, + url.username, url.host, url.database) + + if host_conf not in hosts: + yield cfg + hosts.add(host_conf) + + for cfg in config.Config.all_configs(): + cfg.db.dispose() + + +@register.init +def _create_db(cfg, eng, ident): + raise NotImplementedError("no DB creation routine for cfg: %s" % eng.url) + + +@register.init +def _drop_db(cfg, eng, ident): + raise NotImplementedError("no DB drop routine for cfg: %s" % eng.url) + + +@register.init +def _update_db_opts(db_url, db_opts): + pass + + +@register.init +def _configure_follower(cfg, ident): + pass + + +@register.init +def _post_configure_engine(url, engine, follower_ident): + pass + + +@register.init +def _follower_url_from_main(url, ident): + url = sa_url.make_url(url) + url.database = ident + return url + + +@_update_db_opts.for_db("mssql") +def _mssql_update_db_opts(db_url, db_opts): + db_opts['legacy_schema_aliasing'] = False + + + +@_follower_url_from_main.for_db("sqlite") +def _sqlite_follower_url_from_main(url, ident): + url = sa_url.make_url(url) + if not url.database or url.database == ':memory:': + return url + else: + return sa_url.make_url("sqlite:///%s.db" % ident) + + +@_post_configure_engine.for_db("sqlite") +def _sqlite_post_configure_engine(url, engine, follower_ident): + from sqlalchemy import event + + @event.listens_for(engine, "connect") + def connect(dbapi_connection, connection_record): + # use file DBs in all cases, memory acts kind of strangely + # as an attached + if not follower_ident: + dbapi_connection.execute( + 'ATTACH DATABASE "test_schema.db" AS test_schema') + else: + dbapi_connection.execute( + 'ATTACH DATABASE "%s_test_schema.db" AS test_schema' + % follower_ident) + + +@_create_db.for_db("postgresql") +def _pg_create_db(cfg, eng, ident): + with eng.connect().execution_options( + isolation_level="AUTOCOMMIT") as conn: + try: + _pg_drop_db(cfg, conn, ident) + except Exception: + pass + currentdb = conn.scalar("select current_database()") + for attempt in range(3): + try: + conn.execute( + "CREATE DATABASE %s TEMPLATE %s" % (ident, currentdb)) + except exc.OperationalError as err: + if attempt != 2 and "accessed by other users" in str(err): + time.sleep(.2) + continue + else: + raise + else: + break + + +@_create_db.for_db("mysql") +def _mysql_create_db(cfg, eng, ident): + with eng.connect() as conn: + try: + _mysql_drop_db(cfg, conn, ident) + except Exception: + pass + conn.execute("CREATE DATABASE %s" % ident) + conn.execute("CREATE DATABASE %s_test_schema" % ident) + conn.execute("CREATE DATABASE %s_test_schema_2" % ident) + + +@_configure_follower.for_db("mysql") +def _mysql_configure_follower(config, ident): + config.test_schema = "%s_test_schema" % ident + config.test_schema_2 = "%s_test_schema_2" % ident + + +@_create_db.for_db("sqlite") +def _sqlite_create_db(cfg, eng, ident): + pass + + +@_drop_db.for_db("postgresql") +def _pg_drop_db(cfg, eng, ident): + with eng.connect().execution_options( + isolation_level="AUTOCOMMIT") as conn: + conn.execute( + text( + "select pg_terminate_backend(pid) from pg_stat_activity " + "where usename=current_user and pid != pg_backend_pid() " + "and datname=:dname" + ), dname=ident) + conn.execute("DROP DATABASE %s" % ident) + + +@_drop_db.for_db("sqlite") +def _sqlite_drop_db(cfg, eng, ident): + if ident: + os.remove("%s_test_schema.db" % ident) + else: + os.remove("%s.db" % ident) + + +@_drop_db.for_db("mysql") +def _mysql_drop_db(cfg, eng, ident): + with eng.connect() as conn: + conn.execute("DROP DATABASE %s_test_schema" % ident) + conn.execute("DROP DATABASE %s_test_schema_2" % ident) + conn.execute("DROP DATABASE %s" % ident) + + +@_create_db.for_db("oracle") +def _oracle_create_db(cfg, eng, ident): + # NOTE: make sure you've run "ALTER DATABASE default tablespace users" or + # similar, so that the default tablespace is not "system"; reflection will + # fail otherwise + with eng.connect() as conn: + conn.execute("create user %s identified by xe" % ident) + conn.execute("create user %s_ts1 identified by xe" % ident) + conn.execute("create user %s_ts2 identified by xe" % ident) + conn.execute("grant dba to %s" % (ident, )) + conn.execute("grant unlimited tablespace to %s" % ident) + conn.execute("grant unlimited tablespace to %s_ts1" % ident) + conn.execute("grant unlimited tablespace to %s_ts2" % ident) + +@_configure_follower.for_db("oracle") +def _oracle_configure_follower(config, ident): + config.test_schema = "%s_ts1" % ident + config.test_schema_2 = "%s_ts2" % ident + + +def _ora_drop_ignore(conn, dbname): + try: + conn.execute("drop user %s cascade" % dbname) + log.info("Reaped db: %s", dbname) + return True + except exc.DatabaseError as err: + log.warning("couldn't drop db: %s", err) + return False + + +@_drop_db.for_db("oracle") +def _oracle_drop_db(cfg, eng, ident): + with eng.connect() as conn: + # cx_Oracle seems to occasionally leak open connections when a large + # suite it run, even if we confirm we have zero references to + # connection objects. + # while there is a "kill session" command in Oracle, + # it unfortunately does not release the connection sufficiently. + _ora_drop_ignore(conn, ident) + _ora_drop_ignore(conn, "%s_ts1" % ident) + _ora_drop_ignore(conn, "%s_ts2" % ident) + + +@_update_db_opts.for_db("oracle") +def _oracle_update_db_opts(db_url, db_opts): + db_opts['_retry_on_12516'] = True + + +def reap_oracle_dbs(eng, idents_file): + log.info("Reaping Oracle dbs...") + with eng.connect() as conn: + with open(idents_file) as file_: + idents = set(line.strip() for line in file_) + + log.info("identifiers in file: %s", ", ".join(idents)) + + to_reap = conn.execute( + "select u.username from all_users u where username " + "like 'TEST_%' and not exists (select username " + "from v$session where username=u.username)") + all_names = set([username.lower() for (username, ) in to_reap]) + to_drop = set() + for name in all_names: + if name.endswith("_ts1") or name.endswith("_ts2"): + continue + elif name in idents: + to_drop.add(name) + if "%s_ts1" % name in all_names: + to_drop.add("%s_ts1" % name) + if "%s_ts2" % name in all_names: + to_drop.add("%s_ts2" % name) + + dropped = total = 0 + for total, username in enumerate(to_drop, 1): + if _ora_drop_ignore(conn, username): + dropped += 1 + log.info( + "Dropped %d out of %d stale databases detected", dropped, total) + + +@_follower_url_from_main.for_db("oracle") +def _oracle_follower_url_from_main(url, ident): + url = sa_url.make_url(url) + url.username = ident + url.password = 'xe' + return url + + diff --git a/app/lib/sqlalchemy/testing/replay_fixture.py b/app/lib/sqlalchemy/testing/replay_fixture.py new file mode 100644 index 0000000..b50f52e --- /dev/null +++ b/app/lib/sqlalchemy/testing/replay_fixture.py @@ -0,0 +1,172 @@ +from . import fixtures +from . import profiling +from .. import util +import types +from collections import deque +import contextlib +from . import config +from sqlalchemy import MetaData +from sqlalchemy import create_engine +from sqlalchemy.orm import Session + + +class ReplayFixtureTest(fixtures.TestBase): + + @contextlib.contextmanager + def _dummy_ctx(self, *arg, **kw): + yield + + def test_invocation(self): + + dbapi_session = ReplayableSession() + creator = config.db.pool._creator + recorder = lambda: dbapi_session.recorder(creator()) + engine = create_engine( + config.db.url, creator=recorder, + use_native_hstore=False) + self.metadata = MetaData(engine) + self.engine = engine + self.session = Session(engine) + + self.setup_engine() + try: + self._run_steps(ctx=self._dummy_ctx) + finally: + self.teardown_engine() + engine.dispose() + + player = lambda: dbapi_session.player() + engine = create_engine( + config.db.url, creator=player, + use_native_hstore=False) + + self.metadata = MetaData(engine) + self.engine = engine + self.session = Session(engine) + + self.setup_engine() + try: + self._run_steps(ctx=profiling.count_functions) + finally: + self.session.close() + engine.dispose() + + def setup_engine(self): + pass + + def teardown_engine(self): + pass + + def _run_steps(self, ctx): + raise NotImplementedError() + + +class ReplayableSession(object): + """A simple record/playback tool. + + This is *not* a mock testing class. It only records a session for later + playback and makes no assertions on call consistency whatsoever. It's + unlikely to be suitable for anything other than DB-API recording. + + """ + + Callable = object() + NoAttribute = object() + + if util.py2k: + Natives = set([getattr(types, t) + for t in dir(types) if not t.startswith('_')]).\ + difference([getattr(types, t) + for t in ('FunctionType', 'BuiltinFunctionType', + 'MethodType', 'BuiltinMethodType', + 'LambdaType', 'UnboundMethodType',)]) + else: + Natives = set([getattr(types, t) + for t in dir(types) if not t.startswith('_')]).\ + union([type(t) if not isinstance(t, type) + else t for t in __builtins__.values()]).\ + difference([getattr(types, t) + for t in ('FunctionType', 'BuiltinFunctionType', + 'MethodType', 'BuiltinMethodType', + 'LambdaType', )]) + + def __init__(self): + self.buffer = deque() + + def recorder(self, base): + return self.Recorder(self.buffer, base) + + def player(self): + return self.Player(self.buffer) + + class Recorder(object): + def __init__(self, buffer, subject): + self._buffer = buffer + self._subject = subject + + def __call__(self, *args, **kw): + subject, buffer = [object.__getattribute__(self, x) + for x in ('_subject', '_buffer')] + + result = subject(*args, **kw) + if type(result) not in ReplayableSession.Natives: + buffer.append(ReplayableSession.Callable) + return type(self)(buffer, result) + else: + buffer.append(result) + return result + + @property + def _sqla_unwrap(self): + return self._subject + + def __getattribute__(self, key): + try: + return object.__getattribute__(self, key) + except AttributeError: + pass + + subject, buffer = [object.__getattribute__(self, x) + for x in ('_subject', '_buffer')] + try: + result = type(subject).__getattribute__(subject, key) + except AttributeError: + buffer.append(ReplayableSession.NoAttribute) + raise + else: + if type(result) not in ReplayableSession.Natives: + buffer.append(ReplayableSession.Callable) + return type(self)(buffer, result) + else: + buffer.append(result) + return result + + class Player(object): + def __init__(self, buffer): + self._buffer = buffer + + def __call__(self, *args, **kw): + buffer = object.__getattribute__(self, '_buffer') + result = buffer.popleft() + if result is ReplayableSession.Callable: + return self + else: + return result + + @property + def _sqla_unwrap(self): + return None + + def __getattribute__(self, key): + try: + return object.__getattribute__(self, key) + except AttributeError: + pass + buffer = object.__getattribute__(self, '_buffer') + result = buffer.popleft() + if result is ReplayableSession.Callable: + return self + elif result is ReplayableSession.NoAttribute: + raise AttributeError(key) + else: + return result diff --git a/app/lib/sqlalchemy/testing/requirements.py b/app/lib/sqlalchemy/testing/requirements.py new file mode 100644 index 0000000..e4491ca --- /dev/null +++ b/app/lib/sqlalchemy/testing/requirements.py @@ -0,0 +1,800 @@ +# testing/requirements.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Global database feature support policy. + +Provides decorators to mark tests requiring specific feature support from the +target database. + +External dialect test suites should subclass SuiteRequirements +to provide specific inclusion/exclusions. + +""" + +import sys + +from . import exclusions +from .. import util + + +class Requirements(object): + pass + + +class SuiteRequirements(Requirements): + + @property + def create_table(self): + """target platform can emit basic CreateTable DDL.""" + + return exclusions.open() + + @property + def drop_table(self): + """target platform can emit basic DropTable DDL.""" + + return exclusions.open() + + @property + def foreign_keys(self): + """Target database must support foreign keys.""" + + return exclusions.open() + + @property + def on_update_cascade(self): + """"target database must support ON UPDATE..CASCADE behavior in + foreign keys.""" + + return exclusions.open() + + @property + def non_updating_cascade(self): + """target database must *not* support ON UPDATE..CASCADE behavior in + foreign keys.""" + return exclusions.closed() + + @property + def deferrable_fks(self): + return exclusions.closed() + + @property + def on_update_or_deferrable_fks(self): + # TODO: exclusions should be composable, + # somehow only_if([x, y]) isn't working here, negation/conjunctions + # getting confused. + return exclusions.only_if( + lambda: self.on_update_cascade.enabled or + self.deferrable_fks.enabled + ) + + @property + def self_referential_foreign_keys(self): + """Target database must support self-referential foreign keys.""" + + return exclusions.open() + + @property + def foreign_key_ddl(self): + """Target database must support the DDL phrases for FOREIGN KEY.""" + + return exclusions.open() + + @property + def named_constraints(self): + """target database must support names for constraints.""" + + return exclusions.open() + + @property + def subqueries(self): + """Target database must support subqueries.""" + + return exclusions.open() + + @property + def offset(self): + """target database can render OFFSET, or an equivalent, in a + SELECT. + """ + + return exclusions.open() + + @property + def bound_limit_offset(self): + """target database can render LIMIT and/or OFFSET using a bound + parameter + """ + + return exclusions.open() + + @property + def parens_in_union_contained_select_w_limit_offset(self): + """Target database must support parenthesized SELECT in UNION + when LIMIT/OFFSET is specifically present. + + E.g. (SELECT ...) UNION (SELECT ..) + + This is known to fail on SQLite. + + """ + return exclusions.open() + + @property + def parens_in_union_contained_select_wo_limit_offset(self): + """Target database must support parenthesized SELECT in UNION + when OFFSET/LIMIT is specifically not present. + + E.g. (SELECT ... LIMIT ..) UNION (SELECT .. OFFSET ..) + + This is known to fail on SQLite. It also fails on Oracle + because without LIMIT/OFFSET, there is currently no step that + creates an additional subquery. + + """ + return exclusions.open() + + @property + def boolean_col_expressions(self): + """Target database must support boolean expressions as columns""" + + return exclusions.closed() + + @property + def nullsordering(self): + """Target backends that support nulls ordering.""" + + return exclusions.closed() + + @property + def standalone_binds(self): + """target database/driver supports bound parameters as column expressions + without being in the context of a typed column. + + """ + return exclusions.closed() + + @property + def intersect(self): + """Target database must support INTERSECT or equivalent.""" + return exclusions.closed() + + @property + def except_(self): + """Target database must support EXCEPT or equivalent (i.e. MINUS).""" + return exclusions.closed() + + @property + def window_functions(self): + """Target database must support window functions.""" + return exclusions.closed() + + @property + def autoincrement_insert(self): + """target platform generates new surrogate integer primary key values + when insert() is executed, excluding the pk column.""" + + return exclusions.open() + + @property + def fetch_rows_post_commit(self): + """target platform will allow cursor.fetchone() to proceed after a + COMMIT. + + Typically this refers to an INSERT statement with RETURNING which + is invoked within "autocommit". If the row can be returned + after the autocommit, then this rule can be open. + + """ + + return exclusions.open() + + @property + def empty_inserts(self): + """target platform supports INSERT with no values, i.e. + INSERT DEFAULT VALUES or equivalent.""" + + return exclusions.only_if( + lambda config: config.db.dialect.supports_empty_insert or + config.db.dialect.supports_default_values, + "empty inserts not supported" + ) + + @property + def insert_from_select(self): + """target platform supports INSERT from a SELECT.""" + + return exclusions.open() + + @property + def returning(self): + """target platform supports RETURNING.""" + + return exclusions.only_if( + lambda config: config.db.dialect.implicit_returning, + "%(database)s %(does_support)s 'returning'" + ) + + @property + def duplicate_names_in_cursor_description(self): + """target platform supports a SELECT statement that has + the same name repeated more than once in the columns list.""" + + return exclusions.open() + + @property + def denormalized_names(self): + """Target database must have 'denormalized', i.e. + UPPERCASE as case insensitive names.""" + + return exclusions.skip_if( + lambda config: not config.db.dialect.requires_name_normalize, + "Backend does not require denormalized names." + ) + + @property + def multivalues_inserts(self): + """target database must support multiple VALUES clauses in an + INSERT statement.""" + + return exclusions.skip_if( + lambda config: not config.db.dialect.supports_multivalues_insert, + "Backend does not support multirow inserts." + ) + + @property + def implements_get_lastrowid(self): + """"target dialect implements the executioncontext.get_lastrowid() + method without reliance on RETURNING. + + """ + return exclusions.open() + + @property + def emulated_lastrowid(self): + """"target dialect retrieves cursor.lastrowid, or fetches + from a database-side function after an insert() construct executes, + within the get_lastrowid() method. + + Only dialects that "pre-execute", or need RETURNING to get last + inserted id, would return closed/fail/skip for this. + + """ + return exclusions.closed() + + @property + def dbapi_lastrowid(self): + """"target platform includes a 'lastrowid' accessor on the DBAPI + cursor object. + + """ + return exclusions.closed() + + @property + def views(self): + """Target database must support VIEWs.""" + + return exclusions.closed() + + @property + def schemas(self): + """Target database must support external schemas, and have one + named 'test_schema'.""" + + return exclusions.closed() + + @property + def server_side_cursors(self): + """Target dialect must support server side cursors.""" + + return exclusions.only_if([ + lambda config: config.db.dialect.supports_server_side_cursors + ], "no server side cursors support") + + @property + def sequences(self): + """Target database must support SEQUENCEs.""" + + return exclusions.only_if([ + lambda config: config.db.dialect.supports_sequences + ], "no sequence support") + + @property + def sequences_optional(self): + """Target database supports sequences, but also optionally + as a means of generating new PK values.""" + + return exclusions.only_if([ + lambda config: config.db.dialect.supports_sequences and + config.db.dialect.sequences_optional + ], "no sequence support, or sequences not optional") + + @property + def reflects_pk_names(self): + return exclusions.closed() + + @property + def table_reflection(self): + return exclusions.open() + + @property + def view_column_reflection(self): + """target database must support retrieval of the columns in a view, + similarly to how a table is inspected. + + This does not include the full CREATE VIEW definition. + + """ + return self.views + + @property + def view_reflection(self): + """target database must support inspection of the full CREATE VIEW definition. + """ + return self.views + + @property + def schema_reflection(self): + return self.schemas + + @property + def primary_key_constraint_reflection(self): + return exclusions.open() + + @property + def foreign_key_constraint_reflection(self): + return exclusions.open() + + @property + def foreign_key_constraint_option_reflection(self): + return exclusions.closed() + + @property + def temp_table_reflection(self): + return exclusions.open() + + @property + def temp_table_names(self): + """target dialect supports listing of temporary table names""" + return exclusions.closed() + + @property + def temporary_tables(self): + """target database supports temporary tables""" + return exclusions.open() + + @property + def temporary_views(self): + """target database supports temporary views""" + return exclusions.closed() + + @property + def index_reflection(self): + return exclusions.open() + + @property + def unique_constraint_reflection(self): + """target dialect supports reflection of unique constraints""" + return exclusions.open() + + @property + def duplicate_key_raises_integrity_error(self): + """target dialect raises IntegrityError when reporting an INSERT + with a primary key violation. (hint: it should) + + """ + return exclusions.open() + + @property + def unbounded_varchar(self): + """Target database must support VARCHAR with no length""" + + return exclusions.open() + + @property + def unicode_data(self): + """Target database/dialect must support Python unicode objects with + non-ASCII characters represented, delivered as bound parameters + as well as in result rows. + + """ + return exclusions.open() + + @property + def unicode_ddl(self): + """Target driver must support some degree of non-ascii symbol + names. + """ + return exclusions.closed() + + @property + def datetime_literals(self): + """target dialect supports rendering of a date, time, or datetime as a + literal string, e.g. via the TypeEngine.literal_processor() method. + + """ + + return exclusions.closed() + + @property + def datetime(self): + """target dialect supports representation of Python + datetime.datetime() objects.""" + + return exclusions.open() + + @property + def datetime_microseconds(self): + """target dialect supports representation of Python + datetime.datetime() with microsecond objects.""" + + return exclusions.open() + + @property + def datetime_historic(self): + """target dialect supports representation of Python + datetime.datetime() objects with historic (pre 1970) values.""" + + return exclusions.closed() + + @property + def date(self): + """target dialect supports representation of Python + datetime.date() objects.""" + + return exclusions.open() + + @property + def date_coerces_from_datetime(self): + """target dialect accepts a datetime object as the target + of a date column.""" + + return exclusions.open() + + @property + def date_historic(self): + """target dialect supports representation of Python + datetime.datetime() objects with historic (pre 1970) values.""" + + return exclusions.closed() + + @property + def time(self): + """target dialect supports representation of Python + datetime.time() objects.""" + + return exclusions.open() + + @property + def time_microseconds(self): + """target dialect supports representation of Python + datetime.time() with microsecond objects.""" + + return exclusions.open() + + @property + def binary_comparisons(self): + """target database/driver can allow BLOB/BINARY fields to be compared + against a bound parameter value. + """ + + return exclusions.open() + + @property + def binary_literals(self): + """target backend supports simple binary literals, e.g. an + expression like:: + + SELECT CAST('foo' AS BINARY) + + Where ``BINARY`` is the type emitted from :class:`.LargeBinary`, + e.g. it could be ``BLOB`` or similar. + + Basically fails on Oracle. + + """ + + return exclusions.open() + + @property + def json_type(self): + """target platform implements a native JSON type.""" + + return exclusions.closed() + + @property + def json_array_indexes(self): + """"target platform supports numeric array indexes + within a JSON structure""" + + return self.json_type + + @property + def precision_numerics_general(self): + """target backend has general support for moderately high-precision + numerics.""" + return exclusions.open() + + @property + def precision_numerics_enotation_small(self): + """target backend supports Decimal() objects using E notation + to represent very small values.""" + return exclusions.closed() + + @property + def precision_numerics_enotation_large(self): + """target backend supports Decimal() objects using E notation + to represent very large values.""" + return exclusions.closed() + + @property + def precision_numerics_many_significant_digits(self): + """target backend supports values with many digits on both sides, + such as 319438950232418390.273596, 87673.594069654243 + + """ + return exclusions.closed() + + @property + def precision_numerics_retains_significant_digits(self): + """A precision numeric type will return empty significant digits, + i.e. a value such as 10.000 will come back in Decimal form with + the .000 maintained.""" + + return exclusions.closed() + + @property + def precision_generic_float_type(self): + """target backend will return native floating point numbers with at + least seven decimal places when using the generic Float type. + + """ + return exclusions.open() + + @property + def floats_to_four_decimals(self): + """target backend can return a floating-point number with four + significant digits (such as 15.7563) accurately + (i.e. without FP inaccuracies, such as 15.75629997253418). + + """ + return exclusions.open() + + @property + def fetch_null_from_numeric(self): + """target backend doesn't crash when you try to select a NUMERIC + value that has a value of NULL. + + Added to support Pyodbc bug #351. + """ + + return exclusions.open() + + @property + def text_type(self): + """Target database must support an unbounded Text() " + "type such as TEXT or CLOB""" + + return exclusions.open() + + @property + def empty_strings_varchar(self): + """target database can persist/return an empty string with a + varchar. + + """ + return exclusions.open() + + @property + def empty_strings_text(self): + """target database can persist/return an empty string with an + unbounded text.""" + + return exclusions.open() + + @property + def selectone(self): + """target driver must support the literal statement 'select 1'""" + return exclusions.open() + + @property + def savepoints(self): + """Target database must support savepoints.""" + + return exclusions.closed() + + @property + def two_phase_transactions(self): + """Target database must support two-phase transactions.""" + + return exclusions.closed() + + @property + def update_from(self): + """Target must support UPDATE..FROM syntax""" + return exclusions.closed() + + @property + def update_where_target_in_subquery(self): + """Target must support UPDATE where the same table is present in a + subquery in the WHERE clause. + + This is an ANSI-standard syntax that apparently MySQL can't handle, + such as: + + UPDATE documents SET flag=1 WHERE documents.title IN + (SELECT max(documents.title) AS title + FROM documents GROUP BY documents.user_id + ) + """ + return exclusions.open() + + @property + def mod_operator_as_percent_sign(self): + """target database must use a plain percent '%' as the 'modulus' + operator.""" + return exclusions.closed() + + @property + def percent_schema_names(self): + """target backend supports weird identifiers with percent signs + in them, e.g. 'some % column'. + + this is a very weird use case but often has problems because of + DBAPIs that use python formatting. It's not a critical use + case either. + + """ + return exclusions.closed() + + @property + def order_by_label_with_expression(self): + """target backend supports ORDER BY a column label within an + expression. + + Basically this:: + + select data as foo from test order by foo || 'bar' + + Lots of databases including PostgreSQL don't support this, + so this is off by default. + + """ + return exclusions.closed() + + @property + def unicode_connections(self): + """Target driver must support non-ASCII characters being passed at + all. + """ + return exclusions.open() + + @property + def graceful_disconnects(self): + """Target driver must raise a DBAPI-level exception, such as + InterfaceError, when the underlying connection has been closed + and the execute() method is called. + """ + return exclusions.open() + + @property + def skip_mysql_on_windows(self): + """Catchall for a large variety of MySQL on Windows failures""" + return exclusions.open() + + @property + def ad_hoc_engines(self): + """Test environment must allow ad-hoc engine/connection creation. + + DBs that scale poorly for many connections, even when closed, i.e. + Oracle, may use the "--low-connections" option which flags this + requirement as not present. + + """ + return exclusions.skip_if( + lambda config: config.options.low_connections) + + @property + def timing_intensive(self): + return exclusions.requires_tag("timing_intensive") + + @property + def memory_intensive(self): + return exclusions.requires_tag("memory_intensive") + + @property + def threading_with_mock(self): + """Mark tests that use threading and mock at the same time - stability + issues have been observed with coverage + python 3.3 + + """ + return exclusions.skip_if( + lambda config: util.py3k and config.options.has_coverage, + "Stability issues with coverage + py3k" + ) + + @property + def python2(self): + return exclusions.skip_if( + lambda: sys.version_info >= (3,), + "Python version 2.xx is required." + ) + + @property + def python3(self): + return exclusions.skip_if( + lambda: sys.version_info < (3,), + "Python version 3.xx is required." + ) + + @property + def cpython(self): + return exclusions.only_if( + lambda: util.cpython, + "cPython interpreter needed" + ) + + @property + def non_broken_pickle(self): + from sqlalchemy.util import pickle + return exclusions.only_if( + lambda: not util.pypy and pickle.__name__ == 'cPickle' + or sys.version_info >= (3, 2), + "Needs cPickle+cPython or newer Python 3 pickle" + ) + + @property + def predictable_gc(self): + """target platform must remove all cycles unconditionally when + gc.collect() is called, as well as clean out unreferenced subclasses. + + """ + return self.cpython + + @property + def no_coverage(self): + """Test should be skipped if coverage is enabled. + + This is to block tests that exercise libraries that seem to be + sensitive to coverage, such as PostgreSQL notice logging. + + """ + return exclusions.skip_if( + lambda config: config.options.has_coverage, + "Issues observed when coverage is enabled" + ) + + def _has_mysql_on_windows(self, config): + return False + + def _has_mysql_fully_case_sensitive(self, config): + return False + + @property + def sqlite(self): + return exclusions.skip_if(lambda: not self._has_sqlite()) + + @property + def cextensions(self): + return exclusions.skip_if( + lambda: not self._has_cextensions(), "C extensions not installed" + ) + + def _has_sqlite(self): + from sqlalchemy import create_engine + try: + create_engine('sqlite://') + return True + except ImportError: + return False + + def _has_cextensions(self): + try: + from sqlalchemy import cresultproxy, cprocessors + return True + except ImportError: + return False diff --git a/app/lib/sqlalchemy/testing/runner.py b/app/lib/sqlalchemy/testing/runner.py new file mode 100644 index 0000000..75019d7 --- /dev/null +++ b/app/lib/sqlalchemy/testing/runner.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +# testing/runner.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php +""" +Nose test runner module. + +This script is a front-end to "nosetests" which +installs SQLAlchemy's testing plugin into the local environment. + +The script is intended to be used by third-party dialects and extensions +that run within SQLAlchemy's testing framework. The runner can +be invoked via:: + + python -m sqlalchemy.testing.runner + +The script is then essentially the same as the "nosetests" script, including +all of the usual Nose options. The test environment requires that a +setup.cfg is locally present including various required options. + +Note that when using this runner, Nose's "coverage" plugin will not be +able to provide coverage for SQLAlchemy itself, since SQLAlchemy is +imported into sys.modules before coverage is started. The special +script sqla_nose.py is provided as a top-level script which loads the +plugin in a special (somewhat hacky) way so that coverage against +SQLAlchemy itself is possible. + +""" + +from .plugin.noseplugin import NoseSQLAlchemy + +import nose + + +def main(): + nose.main(addplugins=[NoseSQLAlchemy()]) + + +def setup_py_test(): + """Runner to use for the 'test_suite' entry of your setup.py. + + Prevents any name clash shenanigans from the command line + argument "test" that the "setup.py test" command sends + to nose. + + """ + nose.main(addplugins=[NoseSQLAlchemy()], argv=['runner']) diff --git a/app/lib/sqlalchemy/testing/schema.py b/app/lib/sqlalchemy/testing/schema.py new file mode 100644 index 0000000..018a291 --- /dev/null +++ b/app/lib/sqlalchemy/testing/schema.py @@ -0,0 +1,101 @@ +# testing/schema.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from . import exclusions +from .. import schema, event +from . import config + +__all__ = 'Table', 'Column', + +table_options = {} + + +def Table(*args, **kw): + """A schema.Table wrapper/hook for dialect-specific tweaks.""" + + test_opts = dict([(k, kw.pop(k)) for k in list(kw) + if k.startswith('test_')]) + + kw.update(table_options) + + if exclusions.against(config._current, 'mysql'): + if 'mysql_engine' not in kw and 'mysql_type' not in kw: + if 'test_needs_fk' in test_opts or 'test_needs_acid' in test_opts: + kw['mysql_engine'] = 'InnoDB' + else: + kw['mysql_engine'] = 'MyISAM' + + # Apply some default cascading rules for self-referential foreign keys. + # MySQL InnoDB has some issues around seleting self-refs too. + if exclusions.against(config._current, 'firebird'): + table_name = args[0] + unpack = (config.db.dialect. + identifier_preparer.unformat_identifiers) + + # Only going after ForeignKeys in Columns. May need to + # expand to ForeignKeyConstraint too. + fks = [fk + for col in args if isinstance(col, schema.Column) + for fk in col.foreign_keys] + + for fk in fks: + # root around in raw spec + ref = fk._colspec + if isinstance(ref, schema.Column): + name = ref.table.name + else: + # take just the table name: on FB there cannot be + # a schema, so the first element is always the + # table name, possibly followed by the field name + name = unpack(ref)[0] + if name == table_name: + if fk.ondelete is None: + fk.ondelete = 'CASCADE' + if fk.onupdate is None: + fk.onupdate = 'CASCADE' + + return schema.Table(*args, **kw) + + +def Column(*args, **kw): + """A schema.Column wrapper/hook for dialect-specific tweaks.""" + + test_opts = dict([(k, kw.pop(k)) for k in list(kw) + if k.startswith('test_')]) + + if not config.requirements.foreign_key_ddl.enabled_for_config(config): + args = [arg for arg in args if not isinstance(arg, schema.ForeignKey)] + + col = schema.Column(*args, **kw) + if test_opts.get('test_needs_autoincrement', False) and \ + kw.get('primary_key', False): + + if col.default is None and col.server_default is None: + col.autoincrement = True + + # allow any test suite to pick up on this + col.info['test_needs_autoincrement'] = True + + # hardcoded rule for firebird, oracle; this should + # be moved out + if exclusions.against(config._current, 'firebird', 'oracle'): + def add_seq(c, tbl): + c._init_items( + schema.Sequence(_truncate_name( + config.db.dialect, tbl.name + '_' + c.name + '_seq'), + optional=True) + ) + event.listen(col, 'after_parent_attach', add_seq, propagate=True) + return col + + +def _truncate_name(dialect, name): + if len(name) > dialect.max_identifier_length: + return name[0:max(dialect.max_identifier_length - 6, 0)] + \ + "_" + hex(hash(name) % 64)[2:] + else: + return name diff --git a/app/lib/sqlalchemy/testing/suite/__init__.py b/app/lib/sqlalchemy/testing/suite/__init__.py new file mode 100644 index 0000000..9eeffd4 --- /dev/null +++ b/app/lib/sqlalchemy/testing/suite/__init__.py @@ -0,0 +1,10 @@ + +from sqlalchemy.testing.suite.test_dialect import * +from sqlalchemy.testing.suite.test_ddl import * +from sqlalchemy.testing.suite.test_insert import * +from sqlalchemy.testing.suite.test_sequence import * +from sqlalchemy.testing.suite.test_select import * +from sqlalchemy.testing.suite.test_results import * +from sqlalchemy.testing.suite.test_update_delete import * +from sqlalchemy.testing.suite.test_reflection import * +from sqlalchemy.testing.suite.test_types import * diff --git a/app/lib/sqlalchemy/testing/suite/test_ddl.py b/app/lib/sqlalchemy/testing/suite/test_ddl.py new file mode 100644 index 0000000..1d8010c --- /dev/null +++ b/app/lib/sqlalchemy/testing/suite/test_ddl.py @@ -0,0 +1,65 @@ + + +from .. import fixtures, config, util +from ..config import requirements +from ..assertions import eq_ + +from sqlalchemy import Table, Column, Integer, String + + +class TableDDLTest(fixtures.TestBase): + __backend__ = True + + def _simple_fixture(self): + return Table('test_table', self.metadata, + Column('id', Integer, primary_key=True, + autoincrement=False), + Column('data', String(50)) + ) + + def _underscore_fixture(self): + return Table('_test_table', self.metadata, + Column('id', Integer, primary_key=True, + autoincrement=False), + Column('_data', String(50)) + ) + + def _simple_roundtrip(self, table): + with config.db.begin() as conn: + conn.execute(table.insert().values((1, 'some data'))) + result = conn.execute(table.select()) + eq_( + result.first(), + (1, 'some data') + ) + + @requirements.create_table + @util.provide_metadata + def test_create_table(self): + table = self._simple_fixture() + table.create( + config.db, checkfirst=False + ) + self._simple_roundtrip(table) + + @requirements.drop_table + @util.provide_metadata + def test_drop_table(self): + table = self._simple_fixture() + table.create( + config.db, checkfirst=False + ) + table.drop( + config.db, checkfirst=False + ) + + @requirements.create_table + @util.provide_metadata + def test_underscore_names(self): + table = self._underscore_fixture() + table.create( + config.db, checkfirst=False + ) + self._simple_roundtrip(table) + +__all__ = ('TableDDLTest', ) diff --git a/app/lib/sqlalchemy/testing/suite/test_dialect.py b/app/lib/sqlalchemy/testing/suite/test_dialect.py new file mode 100644 index 0000000..00884a2 --- /dev/null +++ b/app/lib/sqlalchemy/testing/suite/test_dialect.py @@ -0,0 +1,41 @@ +from .. import fixtures, config +from ..config import requirements +from sqlalchemy import exc +from sqlalchemy import Integer, String +from .. import assert_raises +from ..schema import Table, Column + + +class ExceptionTest(fixtures.TablesTest): + """Test basic exception wrapping. + + DBAPIs vary a lot in exception behavior so to actually anticipate + specific exceptions from real round trips, we need to be conservative. + + """ + run_deletes = 'each' + + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table('manual_pk', metadata, + Column('id', Integer, primary_key=True, autoincrement=False), + Column('data', String(50)) + ) + + @requirements.duplicate_key_raises_integrity_error + def test_integrity_error(self): + + with config.db.begin() as conn: + conn.execute( + self.tables.manual_pk.insert(), + {'id': 1, 'data': 'd1'} + ) + + assert_raises( + exc.IntegrityError, + conn.execute, + self.tables.manual_pk.insert(), + {'id': 1, 'data': 'd1'} + ) diff --git a/app/lib/sqlalchemy/testing/suite/test_insert.py b/app/lib/sqlalchemy/testing/suite/test_insert.py new file mode 100644 index 0000000..c0b6b18 --- /dev/null +++ b/app/lib/sqlalchemy/testing/suite/test_insert.py @@ -0,0 +1,319 @@ +from .. import fixtures, config +from ..config import requirements +from .. import exclusions +from ..assertions import eq_ +from .. import engines + +from sqlalchemy import Integer, String, select, literal_column, literal + +from ..schema import Table, Column + + +class LastrowidTest(fixtures.TablesTest): + run_deletes = 'each' + + __backend__ = True + + __requires__ = 'implements_get_lastrowid', 'autoincrement_insert' + + __engine_options__ = {"implicit_returning": False} + + @classmethod + def define_tables(cls, metadata): + Table('autoinc_pk', metadata, + Column('id', Integer, primary_key=True, + test_needs_autoincrement=True), + Column('data', String(50)) + ) + + Table('manual_pk', metadata, + Column('id', Integer, primary_key=True, autoincrement=False), + Column('data', String(50)) + ) + + def _assert_round_trip(self, table, conn): + row = conn.execute(table.select()).first() + eq_( + row, + (config.db.dialect.default_sequence_base, "some data") + ) + + def test_autoincrement_on_insert(self): + + config.db.execute( + self.tables.autoinc_pk.insert(), + data="some data" + ) + self._assert_round_trip(self.tables.autoinc_pk, config.db) + + def test_last_inserted_id(self): + + r = config.db.execute( + self.tables.autoinc_pk.insert(), + data="some data" + ) + pk = config.db.scalar(select([self.tables.autoinc_pk.c.id])) + eq_( + r.inserted_primary_key, + [pk] + ) + + # failed on pypy1.9 but seems to be OK on pypy 2.1 + # @exclusions.fails_if(lambda: util.pypy, + # "lastrowid not maintained after " + # "connection close") + @requirements.dbapi_lastrowid + def test_native_lastrowid_autoinc(self): + r = config.db.execute( + self.tables.autoinc_pk.insert(), + data="some data" + ) + lastrowid = r.lastrowid + pk = config.db.scalar(select([self.tables.autoinc_pk.c.id])) + eq_( + lastrowid, pk + ) + + +class InsertBehaviorTest(fixtures.TablesTest): + run_deletes = 'each' + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table('autoinc_pk', metadata, + Column('id', Integer, primary_key=True, + test_needs_autoincrement=True), + Column('data', String(50)) + ) + Table('manual_pk', metadata, + Column('id', Integer, primary_key=True, autoincrement=False), + Column('data', String(50)) + ) + Table('includes_defaults', metadata, + Column('id', Integer, primary_key=True, + test_needs_autoincrement=True), + Column('data', String(50)), + Column('x', Integer, default=5), + Column('y', Integer, + default=literal_column("2", type_=Integer) + literal(2))) + + def test_autoclose_on_insert(self): + if requirements.returning.enabled: + engine = engines.testing_engine( + options={'implicit_returning': False}) + else: + engine = config.db + + r = engine.execute( + self.tables.autoinc_pk.insert(), + data="some data" + ) + assert r._soft_closed + assert not r.closed + assert r.is_insert + assert not r.returns_rows + + @requirements.returning + def test_autoclose_on_insert_implicit_returning(self): + r = config.db.execute( + self.tables.autoinc_pk.insert(), + data="some data" + ) + assert r._soft_closed + assert not r.closed + assert r.is_insert + assert not r.returns_rows + + @requirements.empty_inserts + def test_empty_insert(self): + r = config.db.execute( + self.tables.autoinc_pk.insert(), + ) + assert r._soft_closed + assert not r.closed + + r = config.db.execute( + self.tables.autoinc_pk.select(). + where(self.tables.autoinc_pk.c.id != None) + ) + + assert len(r.fetchall()) + + @requirements.insert_from_select + def test_insert_from_select_autoinc(self): + src_table = self.tables.manual_pk + dest_table = self.tables.autoinc_pk + config.db.execute( + src_table.insert(), + [ + dict(id=1, data="data1"), + dict(id=2, data="data2"), + dict(id=3, data="data3"), + ] + ) + + result = config.db.execute( + dest_table.insert(). + from_select( + ("data",), + select([src_table.c.data]). + where(src_table.c.data.in_(["data2", "data3"])) + ) + ) + + eq_(result.inserted_primary_key, [None]) + + result = config.db.execute( + select([dest_table.c.data]).order_by(dest_table.c.data) + ) + eq_(result.fetchall(), [("data2", ), ("data3", )]) + + @requirements.insert_from_select + def test_insert_from_select_autoinc_no_rows(self): + src_table = self.tables.manual_pk + dest_table = self.tables.autoinc_pk + + result = config.db.execute( + dest_table.insert(). + from_select( + ("data",), + select([src_table.c.data]). + where(src_table.c.data.in_(["data2", "data3"])) + ) + ) + eq_(result.inserted_primary_key, [None]) + + result = config.db.execute( + select([dest_table.c.data]).order_by(dest_table.c.data) + ) + + eq_(result.fetchall(), []) + + @requirements.insert_from_select + def test_insert_from_select(self): + table = self.tables.manual_pk + config.db.execute( + table.insert(), + [ + dict(id=1, data="data1"), + dict(id=2, data="data2"), + dict(id=3, data="data3"), + ] + ) + + config.db.execute( + table.insert(inline=True). + from_select(("id", "data",), + select([table.c.id + 5, table.c.data]). + where(table.c.data.in_(["data2", "data3"])) + ), + ) + + eq_( + config.db.execute( + select([table.c.data]).order_by(table.c.data) + ).fetchall(), + [("data1", ), ("data2", ), ("data2", ), + ("data3", ), ("data3", )] + ) + + @requirements.insert_from_select + def test_insert_from_select_with_defaults(self): + table = self.tables.includes_defaults + config.db.execute( + table.insert(), + [ + dict(id=1, data="data1"), + dict(id=2, data="data2"), + dict(id=3, data="data3"), + ] + ) + + config.db.execute( + table.insert(inline=True). + from_select(("id", "data",), + select([table.c.id + 5, table.c.data]). + where(table.c.data.in_(["data2", "data3"])) + ), + ) + + eq_( + config.db.execute( + select([table]).order_by(table.c.data, table.c.id) + ).fetchall(), + [(1, 'data1', 5, 4), (2, 'data2', 5, 4), + (7, 'data2', 5, 4), (3, 'data3', 5, 4), (8, 'data3', 5, 4)] + ) + + +class ReturningTest(fixtures.TablesTest): + run_create_tables = 'each' + __requires__ = 'returning', 'autoincrement_insert' + __backend__ = True + + __engine_options__ = {"implicit_returning": True} + + def _assert_round_trip(self, table, conn): + row = conn.execute(table.select()).first() + eq_( + row, + (config.db.dialect.default_sequence_base, "some data") + ) + + @classmethod + def define_tables(cls, metadata): + Table('autoinc_pk', metadata, + Column('id', Integer, primary_key=True, + test_needs_autoincrement=True), + Column('data', String(50)) + ) + + @requirements.fetch_rows_post_commit + def test_explicit_returning_pk_autocommit(self): + engine = config.db + table = self.tables.autoinc_pk + r = engine.execute( + table.insert().returning( + table.c.id), + data="some data" + ) + pk = r.first()[0] + fetched_pk = config.db.scalar(select([table.c.id])) + eq_(fetched_pk, pk) + + def test_explicit_returning_pk_no_autocommit(self): + engine = config.db + table = self.tables.autoinc_pk + with engine.begin() as conn: + r = conn.execute( + table.insert().returning( + table.c.id), + data="some data" + ) + pk = r.first()[0] + fetched_pk = config.db.scalar(select([table.c.id])) + eq_(fetched_pk, pk) + + def test_autoincrement_on_insert_implcit_returning(self): + + config.db.execute( + self.tables.autoinc_pk.insert(), + data="some data" + ) + self._assert_round_trip(self.tables.autoinc_pk, config.db) + + def test_last_inserted_id_implicit_returning(self): + + r = config.db.execute( + self.tables.autoinc_pk.insert(), + data="some data" + ) + pk = config.db.scalar(select([self.tables.autoinc_pk.c.id])) + eq_( + r.inserted_primary_key, + [pk] + ) + + +__all__ = ('LastrowidTest', 'InsertBehaviorTest', 'ReturningTest') diff --git a/app/lib/sqlalchemy/testing/suite/test_reflection.py b/app/lib/sqlalchemy/testing/suite/test_reflection.py new file mode 100644 index 0000000..ed6a33b --- /dev/null +++ b/app/lib/sqlalchemy/testing/suite/test_reflection.py @@ -0,0 +1,746 @@ + + +import sqlalchemy as sa +from sqlalchemy import exc as sa_exc +from sqlalchemy import types as sql_types +from sqlalchemy import inspect +from sqlalchemy import MetaData, Integer, String +from sqlalchemy.engine.reflection import Inspector +from sqlalchemy.testing import engines, fixtures +from sqlalchemy.testing.schema import Table, Column +from sqlalchemy.testing import eq_, assert_raises_message +from sqlalchemy import testing +from .. import config +import operator +from sqlalchemy.schema import DDL, Index +from sqlalchemy import event +from sqlalchemy.sql.elements import quoted_name +from sqlalchemy import ForeignKey + +metadata, users = None, None + + +class HasTableTest(fixtures.TablesTest): + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table('test_table', metadata, + Column('id', Integer, primary_key=True), + Column('data', String(50)) + ) + + def test_has_table(self): + with config.db.begin() as conn: + assert config.db.dialect.has_table(conn, "test_table") + assert not config.db.dialect.has_table(conn, "nonexistent_table") + + +class ComponentReflectionTest(fixtures.TablesTest): + run_inserts = run_deletes = None + + __backend__ = True + + @classmethod + def setup_bind(cls): + if config.requirements.independent_connections.enabled: + from sqlalchemy import pool + return engines.testing_engine( + options=dict(poolclass=pool.StaticPool)) + else: + return config.db + + @classmethod + def define_tables(cls, metadata): + cls.define_reflected_tables(metadata, None) + if testing.requires.schemas.enabled: + cls.define_reflected_tables(metadata, testing.config.test_schema) + + @classmethod + def define_reflected_tables(cls, metadata, schema): + if schema: + schema_prefix = schema + "." + else: + schema_prefix = "" + + if testing.requires.self_referential_foreign_keys.enabled: + users = Table('users', metadata, + Column('user_id', sa.INT, primary_key=True), + Column('test1', sa.CHAR(5), nullable=False), + Column('test2', sa.Float(5), nullable=False), + Column('parent_user_id', sa.Integer, + sa.ForeignKey('%susers.user_id' % + schema_prefix)), + schema=schema, + test_needs_fk=True, + ) + else: + users = Table('users', metadata, + Column('user_id', sa.INT, primary_key=True), + Column('test1', sa.CHAR(5), nullable=False), + Column('test2', sa.Float(5), nullable=False), + schema=schema, + test_needs_fk=True, + ) + + Table("dingalings", metadata, + Column('dingaling_id', sa.Integer, primary_key=True), + Column('address_id', sa.Integer, + sa.ForeignKey('%semail_addresses.address_id' % + schema_prefix)), + Column('data', sa.String(30)), + schema=schema, + test_needs_fk=True, + ) + Table('email_addresses', metadata, + Column('address_id', sa.Integer), + Column('remote_user_id', sa.Integer, + sa.ForeignKey(users.c.user_id)), + Column('email_address', sa.String(20)), + sa.PrimaryKeyConstraint('address_id', name='email_ad_pk'), + schema=schema, + test_needs_fk=True, + ) + + if testing.requires.index_reflection.enabled: + cls.define_index(metadata, users) + if testing.requires.view_column_reflection.enabled: + cls.define_views(metadata, schema) + if not schema and testing.requires.temp_table_reflection.enabled: + cls.define_temp_tables(metadata) + + @classmethod + def define_temp_tables(cls, metadata): + # cheat a bit, we should fix this with some dialect-level + # temp table fixture + if testing.against("oracle"): + kw = { + 'prefixes': ["GLOBAL TEMPORARY"], + 'oracle_on_commit': 'PRESERVE ROWS' + } + else: + kw = { + 'prefixes': ["TEMPORARY"], + } + + user_tmp = Table( + "user_tmp", metadata, + Column("id", sa.INT, primary_key=True), + Column('name', sa.VARCHAR(50)), + Column('foo', sa.INT), + sa.UniqueConstraint('name', name='user_tmp_uq'), + sa.Index("user_tmp_ix", "foo"), + **kw + ) + if testing.requires.view_reflection.enabled and \ + testing.requires.temporary_views.enabled: + event.listen( + user_tmp, "after_create", + DDL("create temporary view user_tmp_v as " + "select * from user_tmp") + ) + event.listen( + user_tmp, "before_drop", + DDL("drop view user_tmp_v") + ) + + @classmethod + def define_index(cls, metadata, users): + Index("users_t_idx", users.c.test1, users.c.test2) + Index("users_all_idx", users.c.user_id, users.c.test2, users.c.test1) + + @classmethod + def define_views(cls, metadata, schema): + for table_name in ('users', 'email_addresses'): + fullname = table_name + if schema: + fullname = "%s.%s" % (schema, table_name) + view_name = fullname + '_v' + query = "CREATE VIEW %s AS SELECT * FROM %s" % ( + view_name, fullname) + + event.listen( + metadata, + "after_create", + DDL(query) + ) + event.listen( + metadata, + "before_drop", + DDL("DROP VIEW %s" % view_name) + ) + + @testing.requires.schema_reflection + def test_get_schema_names(self): + insp = inspect(testing.db) + + self.assert_(testing.config.test_schema in insp.get_schema_names()) + + @testing.requires.schema_reflection + def test_dialect_initialize(self): + engine = engines.testing_engine() + assert not hasattr(engine.dialect, 'default_schema_name') + inspect(engine) + assert hasattr(engine.dialect, 'default_schema_name') + + @testing.requires.schema_reflection + def test_get_default_schema_name(self): + insp = inspect(testing.db) + eq_(insp.default_schema_name, testing.db.dialect.default_schema_name) + + @testing.provide_metadata + def _test_get_table_names(self, schema=None, table_type='table', + order_by=None): + meta = self.metadata + users, addresses, dingalings = self.tables.users, \ + self.tables.email_addresses, self.tables.dingalings + insp = inspect(meta.bind) + + if table_type == 'view': + table_names = insp.get_view_names(schema) + table_names.sort() + answer = ['email_addresses_v', 'users_v'] + eq_(sorted(table_names), answer) + else: + table_names = insp.get_table_names(schema, + order_by=order_by) + if order_by == 'foreign_key': + answer = ['users', 'email_addresses', 'dingalings'] + eq_(table_names, answer) + else: + answer = ['dingalings', 'email_addresses', 'users'] + eq_(sorted(table_names), answer) + + @testing.requires.temp_table_names + def test_get_temp_table_names(self): + insp = inspect(self.bind) + temp_table_names = insp.get_temp_table_names() + eq_(sorted(temp_table_names), ['user_tmp']) + + @testing.requires.view_reflection + @testing.requires.temp_table_names + @testing.requires.temporary_views + def test_get_temp_view_names(self): + insp = inspect(self.bind) + temp_table_names = insp.get_temp_view_names() + eq_(sorted(temp_table_names), ['user_tmp_v']) + + @testing.requires.table_reflection + def test_get_table_names(self): + self._test_get_table_names() + + @testing.requires.table_reflection + @testing.requires.foreign_key_constraint_reflection + def test_get_table_names_fks(self): + self._test_get_table_names(order_by='foreign_key') + + @testing.requires.table_reflection + @testing.requires.schemas + def test_get_table_names_with_schema(self): + self._test_get_table_names(testing.config.test_schema) + + @testing.requires.view_column_reflection + def test_get_view_names(self): + self._test_get_table_names(table_type='view') + + @testing.requires.view_column_reflection + @testing.requires.schemas + def test_get_view_names_with_schema(self): + self._test_get_table_names( + testing.config.test_schema, table_type='view') + + @testing.requires.table_reflection + @testing.requires.view_column_reflection + def test_get_tables_and_views(self): + self._test_get_table_names() + self._test_get_table_names(table_type='view') + + def _test_get_columns(self, schema=None, table_type='table'): + meta = MetaData(testing.db) + users, addresses, dingalings = self.tables.users, \ + self.tables.email_addresses, self.tables.dingalings + table_names = ['users', 'email_addresses'] + if table_type == 'view': + table_names = ['users_v', 'email_addresses_v'] + insp = inspect(meta.bind) + for table_name, table in zip(table_names, (users, + addresses)): + schema_name = schema + cols = insp.get_columns(table_name, schema=schema_name) + self.assert_(len(cols) > 0, len(cols)) + + # should be in order + + for i, col in enumerate(table.columns): + eq_(col.name, cols[i]['name']) + ctype = cols[i]['type'].__class__ + ctype_def = col.type + if isinstance(ctype_def, sa.types.TypeEngine): + ctype_def = ctype_def.__class__ + + # Oracle returns Date for DateTime. + + if testing.against('oracle') and ctype_def \ + in (sql_types.Date, sql_types.DateTime): + ctype_def = sql_types.Date + + # assert that the desired type and return type share + # a base within one of the generic types. + + self.assert_(len(set(ctype.__mro__). + intersection(ctype_def.__mro__). + intersection([ + sql_types.Integer, + sql_types.Numeric, + sql_types.DateTime, + sql_types.Date, + sql_types.Time, + sql_types.String, + sql_types._Binary, + ])) > 0, '%s(%s), %s(%s)' % + (col.name, col.type, cols[i]['name'], ctype)) + + if not col.primary_key: + assert cols[i]['default'] is None + + @testing.requires.table_reflection + def test_get_columns(self): + self._test_get_columns() + + @testing.provide_metadata + def _type_round_trip(self, *types): + t = Table('t', self.metadata, + *[ + Column('t%d' % i, type_) + for i, type_ in enumerate(types) + ] + ) + t.create() + + return [ + c['type'] for c in + inspect(self.metadata.bind).get_columns('t') + ] + + @testing.requires.table_reflection + def test_numeric_reflection(self): + for typ in self._type_round_trip( + sql_types.Numeric(18, 5), + ): + assert isinstance(typ, sql_types.Numeric) + eq_(typ.precision, 18) + eq_(typ.scale, 5) + + @testing.requires.table_reflection + def test_varchar_reflection(self): + typ = self._type_round_trip(sql_types.String(52))[0] + assert isinstance(typ, sql_types.String) + eq_(typ.length, 52) + + @testing.requires.table_reflection + @testing.provide_metadata + def test_nullable_reflection(self): + t = Table('t', self.metadata, + Column('a', Integer, nullable=True), + Column('b', Integer, nullable=False)) + t.create() + eq_( + dict( + (col['name'], col['nullable']) + for col in inspect(self.metadata.bind).get_columns('t') + ), + {"a": True, "b": False} + ) + + @testing.requires.table_reflection + @testing.requires.schemas + def test_get_columns_with_schema(self): + self._test_get_columns(schema=testing.config.test_schema) + + @testing.requires.temp_table_reflection + def test_get_temp_table_columns(self): + meta = MetaData(self.bind) + user_tmp = self.tables.user_tmp + insp = inspect(meta.bind) + cols = insp.get_columns('user_tmp') + self.assert_(len(cols) > 0, len(cols)) + + for i, col in enumerate(user_tmp.columns): + eq_(col.name, cols[i]['name']) + + @testing.requires.temp_table_reflection + @testing.requires.view_column_reflection + @testing.requires.temporary_views + def test_get_temp_view_columns(self): + insp = inspect(self.bind) + cols = insp.get_columns('user_tmp_v') + eq_( + [col['name'] for col in cols], + ['id', 'name', 'foo'] + ) + + @testing.requires.view_column_reflection + def test_get_view_columns(self): + self._test_get_columns(table_type='view') + + @testing.requires.view_column_reflection + @testing.requires.schemas + def test_get_view_columns_with_schema(self): + self._test_get_columns( + schema=testing.config.test_schema, table_type='view') + + @testing.provide_metadata + def _test_get_pk_constraint(self, schema=None): + meta = self.metadata + users, addresses = self.tables.users, self.tables.email_addresses + insp = inspect(meta.bind) + + users_cons = insp.get_pk_constraint(users.name, schema=schema) + users_pkeys = users_cons['constrained_columns'] + eq_(users_pkeys, ['user_id']) + + addr_cons = insp.get_pk_constraint(addresses.name, schema=schema) + addr_pkeys = addr_cons['constrained_columns'] + eq_(addr_pkeys, ['address_id']) + + with testing.requires.reflects_pk_names.fail_if(): + eq_(addr_cons['name'], 'email_ad_pk') + + @testing.requires.primary_key_constraint_reflection + def test_get_pk_constraint(self): + self._test_get_pk_constraint() + + @testing.requires.table_reflection + @testing.requires.primary_key_constraint_reflection + @testing.requires.schemas + def test_get_pk_constraint_with_schema(self): + self._test_get_pk_constraint(schema=testing.config.test_schema) + + @testing.requires.table_reflection + @testing.provide_metadata + def test_deprecated_get_primary_keys(self): + meta = self.metadata + users = self.tables.users + insp = Inspector(meta.bind) + assert_raises_message( + sa_exc.SADeprecationWarning, + "Call to deprecated method get_primary_keys." + " Use get_pk_constraint instead.", + insp.get_primary_keys, users.name + ) + + @testing.provide_metadata + def _test_get_foreign_keys(self, schema=None): + meta = self.metadata + users, addresses, dingalings = self.tables.users, \ + self.tables.email_addresses, self.tables.dingalings + insp = inspect(meta.bind) + expected_schema = schema + # users + + if testing.requires.self_referential_foreign_keys.enabled: + users_fkeys = insp.get_foreign_keys(users.name, + schema=schema) + fkey1 = users_fkeys[0] + + with testing.requires.named_constraints.fail_if(): + self.assert_(fkey1['name'] is not None) + + eq_(fkey1['referred_schema'], expected_schema) + eq_(fkey1['referred_table'], users.name) + eq_(fkey1['referred_columns'], ['user_id', ]) + if testing.requires.self_referential_foreign_keys.enabled: + eq_(fkey1['constrained_columns'], ['parent_user_id']) + + # addresses + addr_fkeys = insp.get_foreign_keys(addresses.name, + schema=schema) + fkey1 = addr_fkeys[0] + + with testing.requires.named_constraints.fail_if(): + self.assert_(fkey1['name'] is not None) + + eq_(fkey1['referred_schema'], expected_schema) + eq_(fkey1['referred_table'], users.name) + eq_(fkey1['referred_columns'], ['user_id', ]) + eq_(fkey1['constrained_columns'], ['remote_user_id']) + + @testing.requires.foreign_key_constraint_reflection + def test_get_foreign_keys(self): + self._test_get_foreign_keys() + + @testing.requires.foreign_key_constraint_reflection + @testing.requires.schemas + def test_get_foreign_keys_with_schema(self): + self._test_get_foreign_keys(schema=testing.config.test_schema) + + @testing.requires.foreign_key_constraint_option_reflection + @testing.provide_metadata + def test_get_foreign_key_options(self): + meta = self.metadata + + Table( + 'x', meta, + Column('id', Integer, primary_key=True), + test_needs_fk=True + ) + + Table('table', meta, + Column('id', Integer, primary_key=True), + Column('x_id', Integer, sa.ForeignKey('x.id', name='xid')), + Column('test', String(10)), + test_needs_fk=True) + + Table('user', meta, + Column('id', Integer, primary_key=True), + Column('name', String(50), nullable=False), + Column('tid', Integer), + sa.ForeignKeyConstraint( + ['tid'], ['table.id'], + name='myfk', + onupdate="SET NULL", ondelete="CASCADE"), + test_needs_fk=True) + + meta.create_all() + + insp = inspect(meta.bind) + + # test 'options' is always present for a backend + # that can reflect these, since alembic looks for this + opts = insp.get_foreign_keys('table')[0]['options'] + + eq_( + dict( + (k, opts[k]) + for k in opts if opts[k] + ), + {} + ) + + opts = insp.get_foreign_keys('user')[0]['options'] + eq_( + dict( + (k, opts[k]) + for k in opts if opts[k] + ), + {'onupdate': 'SET NULL', 'ondelete': 'CASCADE'} + ) + + @testing.provide_metadata + def _test_get_indexes(self, schema=None): + meta = self.metadata + users, addresses, dingalings = self.tables.users, \ + self.tables.email_addresses, self.tables.dingalings + # The database may decide to create indexes for foreign keys, etc. + # so there may be more indexes than expected. + insp = inspect(meta.bind) + indexes = insp.get_indexes('users', schema=schema) + expected_indexes = [ + {'unique': False, + 'column_names': ['test1', 'test2'], + 'name': 'users_t_idx'}, + {'unique': False, + 'column_names': ['user_id', 'test2', 'test1'], + 'name': 'users_all_idx'} + ] + index_names = [d['name'] for d in indexes] + for e_index in expected_indexes: + assert e_index['name'] in index_names + index = indexes[index_names.index(e_index['name'])] + for key in e_index: + eq_(e_index[key], index[key]) + + @testing.requires.index_reflection + def test_get_indexes(self): + self._test_get_indexes() + + @testing.requires.index_reflection + @testing.requires.schemas + def test_get_indexes_with_schema(self): + self._test_get_indexes(schema=testing.config.test_schema) + + @testing.requires.unique_constraint_reflection + def test_get_unique_constraints(self): + self._test_get_unique_constraints() + + @testing.requires.temp_table_reflection + @testing.requires.unique_constraint_reflection + def test_get_temp_table_unique_constraints(self): + insp = inspect(self.bind) + reflected = insp.get_unique_constraints('user_tmp') + for refl in reflected: + # Different dialects handle duplicate index and constraints + # differently, so ignore this flag + refl.pop('duplicates_index', None) + eq_(reflected, [{'column_names': ['name'], 'name': 'user_tmp_uq'}]) + + @testing.requires.temp_table_reflection + def test_get_temp_table_indexes(self): + insp = inspect(self.bind) + indexes = insp.get_indexes('user_tmp') + for ind in indexes: + ind.pop('dialect_options', None) + eq_( + # TODO: we need to add better filtering for indexes/uq constraints + # that are doubled up + [idx for idx in indexes if idx['name'] == 'user_tmp_ix'], + [{'unique': False, 'column_names': ['foo'], 'name': 'user_tmp_ix'}] + ) + + @testing.requires.unique_constraint_reflection + @testing.requires.schemas + def test_get_unique_constraints_with_schema(self): + self._test_get_unique_constraints(schema=testing.config.test_schema) + + @testing.provide_metadata + def _test_get_unique_constraints(self, schema=None): + # SQLite dialect needs to parse the names of the constraints + # separately from what it gets from PRAGMA index_list(), and + # then matches them up. so same set of column_names in two + # constraints will confuse it. Perhaps we should no longer + # bother with index_list() here since we have the whole + # CREATE TABLE? + uniques = sorted( + [ + {'name': 'unique_a', 'column_names': ['a']}, + {'name': 'unique_a_b_c', 'column_names': ['a', 'b', 'c']}, + {'name': 'unique_c_a_b', 'column_names': ['c', 'a', 'b']}, + {'name': 'unique_asc_key', 'column_names': ['asc', 'key']}, + {'name': 'i.have.dots', 'column_names': ['b']}, + {'name': 'i have spaces', 'column_names': ['c']}, + ], + key=operator.itemgetter('name') + ) + orig_meta = self.metadata + table = Table( + 'testtbl', orig_meta, + Column('a', sa.String(20)), + Column('b', sa.String(30)), + Column('c', sa.Integer), + # reserved identifiers + Column('asc', sa.String(30)), + Column('key', sa.String(30)), + schema=schema + ) + for uc in uniques: + table.append_constraint( + sa.UniqueConstraint(*uc['column_names'], name=uc['name']) + ) + orig_meta.create_all() + + inspector = inspect(orig_meta.bind) + reflected = sorted( + inspector.get_unique_constraints('testtbl', schema=schema), + key=operator.itemgetter('name') + ) + + for orig, refl in zip(uniques, reflected): + # Different dialects handle duplicate index and constraints + # differently, so ignore this flag + refl.pop('duplicates_index', None) + eq_(orig, refl) + + @testing.provide_metadata + def _test_get_view_definition(self, schema=None): + meta = self.metadata + users, addresses, dingalings = self.tables.users, \ + self.tables.email_addresses, self.tables.dingalings + view_name1 = 'users_v' + view_name2 = 'email_addresses_v' + insp = inspect(meta.bind) + v1 = insp.get_view_definition(view_name1, schema=schema) + self.assert_(v1) + v2 = insp.get_view_definition(view_name2, schema=schema) + self.assert_(v2) + + @testing.requires.view_reflection + def test_get_view_definition(self): + self._test_get_view_definition() + + @testing.requires.view_reflection + @testing.requires.schemas + def test_get_view_definition_with_schema(self): + self._test_get_view_definition(schema=testing.config.test_schema) + + @testing.only_on("postgresql", "PG specific feature") + @testing.provide_metadata + def _test_get_table_oid(self, table_name, schema=None): + meta = self.metadata + users, addresses, dingalings = self.tables.users, \ + self.tables.email_addresses, self.tables.dingalings + insp = inspect(meta.bind) + oid = insp.get_table_oid(table_name, schema) + self.assert_(isinstance(oid, int)) + + def test_get_table_oid(self): + self._test_get_table_oid('users') + + @testing.requires.schemas + def test_get_table_oid_with_schema(self): + self._test_get_table_oid('users', schema=testing.config.test_schema) + + @testing.requires.table_reflection + @testing.provide_metadata + def test_autoincrement_col(self): + """test that 'autoincrement' is reflected according to sqla's policy. + + Don't mark this test as unsupported for any backend ! + + (technically it fails with MySQL InnoDB since "id" comes before "id2") + + A backend is better off not returning "autoincrement" at all, + instead of potentially returning "False" for an auto-incrementing + primary key column. + + """ + + meta = self.metadata + insp = inspect(meta.bind) + + for tname, cname in [ + ('users', 'user_id'), + ('email_addresses', 'address_id'), + ('dingalings', 'dingaling_id'), + ]: + cols = insp.get_columns(tname) + id_ = dict((c['name'], c) for c in cols)[cname] + assert id_.get('autoincrement', True) + + +class NormalizedNameTest(fixtures.TablesTest): + __requires__ = 'denormalized_names', + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table( + quoted_name('t1', quote=True), metadata, + Column('id', Integer, primary_key=True), + ) + Table( + quoted_name('t2', quote=True), metadata, + Column('id', Integer, primary_key=True), + Column('t1id', ForeignKey('t1.id')) + ) + + def test_reflect_lowercase_forced_tables(self): + + m2 = MetaData(testing.db) + t2_ref = Table(quoted_name('t2', quote=True), m2, autoload=True) + t1_ref = m2.tables['t1'] + assert t2_ref.c.t1id.references(t1_ref.c.id) + + m3 = MetaData(testing.db) + m3.reflect(only=lambda name, m: name.lower() in ('t1', 't2')) + assert m3.tables['t2'].c.t1id.references(m3.tables['t1'].c.id) + + def test_get_table_names(self): + tablenames = [ + t for t in inspect(testing.db).get_table_names() + if t.lower() in ("t1", "t2")] + + eq_(tablenames[0].upper(), tablenames[0].lower()) + eq_(tablenames[1].upper(), tablenames[1].lower()) + + +__all__ = ('ComponentReflectionTest', 'HasTableTest', 'NormalizedNameTest') diff --git a/app/lib/sqlalchemy/testing/suite/test_results.py b/app/lib/sqlalchemy/testing/suite/test_results.py new file mode 100644 index 0000000..98ddc7e --- /dev/null +++ b/app/lib/sqlalchemy/testing/suite/test_results.py @@ -0,0 +1,367 @@ +from .. import fixtures, config +from ..config import requirements +from .. import exclusions +from ..assertions import eq_ +from .. import engines +from ... import testing + +from sqlalchemy import Integer, String, select, util, sql, DateTime, text, func +import datetime +from ..schema import Table, Column + + +class RowFetchTest(fixtures.TablesTest): + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table('plain_pk', metadata, + Column('id', Integer, primary_key=True), + Column('data', String(50)) + ) + Table('has_dates', metadata, + Column('id', Integer, primary_key=True), + Column('today', DateTime) + ) + + @classmethod + def insert_data(cls): + config.db.execute( + cls.tables.plain_pk.insert(), + [ + {"id": 1, "data": "d1"}, + {"id": 2, "data": "d2"}, + {"id": 3, "data": "d3"}, + ] + ) + + config.db.execute( + cls.tables.has_dates.insert(), + [ + {"id": 1, "today": datetime.datetime(2006, 5, 12, 12, 0, 0)} + ] + ) + + def test_via_string(self): + row = config.db.execute( + self.tables.plain_pk.select(). + order_by(self.tables.plain_pk.c.id) + ).first() + + eq_( + row['id'], 1 + ) + eq_( + row['data'], "d1" + ) + + def test_via_int(self): + row = config.db.execute( + self.tables.plain_pk.select(). + order_by(self.tables.plain_pk.c.id) + ).first() + + eq_( + row[0], 1 + ) + eq_( + row[1], "d1" + ) + + def test_via_col_object(self): + row = config.db.execute( + self.tables.plain_pk.select(). + order_by(self.tables.plain_pk.c.id) + ).first() + + eq_( + row[self.tables.plain_pk.c.id], 1 + ) + eq_( + row[self.tables.plain_pk.c.data], "d1" + ) + + @requirements.duplicate_names_in_cursor_description + def test_row_with_dupe_names(self): + result = config.db.execute( + select([self.tables.plain_pk.c.data, + self.tables.plain_pk.c.data.label('data')]). + order_by(self.tables.plain_pk.c.id) + ) + row = result.first() + eq_(result.keys(), ['data', 'data']) + eq_(row, ('d1', 'd1')) + + def test_row_w_scalar_select(self): + """test that a scalar select as a column is returned as such + and that type conversion works OK. + + (this is half a SQLAlchemy Core test and half to catch database + backends that may have unusual behavior with scalar selects.) + + """ + datetable = self.tables.has_dates + s = select([datetable.alias('x').c.today]).as_scalar() + s2 = select([datetable.c.id, s.label('somelabel')]) + row = config.db.execute(s2).first() + + eq_(row['somelabel'], datetime.datetime(2006, 5, 12, 12, 0, 0)) + + +class PercentSchemaNamesTest(fixtures.TablesTest): + """tests using percent signs, spaces in table and column names. + + This is a very fringe use case, doesn't work for MySQL + or PostgreSQL. the requirement, "percent_schema_names", + is marked "skip" by default. + + """ + + __requires__ = ('percent_schema_names', ) + + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + cls.tables.percent_table = Table('percent%table', metadata, + Column("percent%", Integer), + Column( + "spaces % more spaces", Integer), + ) + cls.tables.lightweight_percent_table = sql.table( + 'percent%table', sql.column("percent%"), + sql.column("spaces % more spaces") + ) + + def test_single_roundtrip(self): + percent_table = self.tables.percent_table + for params in [ + {'percent%': 5, 'spaces % more spaces': 12}, + {'percent%': 7, 'spaces % more spaces': 11}, + {'percent%': 9, 'spaces % more spaces': 10}, + {'percent%': 11, 'spaces % more spaces': 9} + ]: + config.db.execute(percent_table.insert(), params) + self._assert_table() + + def test_executemany_roundtrip(self): + percent_table = self.tables.percent_table + config.db.execute( + percent_table.insert(), + {'percent%': 5, 'spaces % more spaces': 12} + ) + config.db.execute( + percent_table.insert(), + [{'percent%': 7, 'spaces % more spaces': 11}, + {'percent%': 9, 'spaces % more spaces': 10}, + {'percent%': 11, 'spaces % more spaces': 9}] + ) + self._assert_table() + + def _assert_table(self): + percent_table = self.tables.percent_table + lightweight_percent_table = self.tables.lightweight_percent_table + + for table in ( + percent_table, + percent_table.alias(), + lightweight_percent_table, + lightweight_percent_table.alias()): + eq_( + list( + config.db.execute( + table.select().order_by(table.c['percent%']) + ) + ), + [ + (5, 12), + (7, 11), + (9, 10), + (11, 9) + ] + ) + + eq_( + list( + config.db.execute( + table.select(). + where(table.c['spaces % more spaces'].in_([9, 10])). + order_by(table.c['percent%']), + ) + ), + [ + (9, 10), + (11, 9) + ] + ) + + row = config.db.execute(table.select(). + order_by(table.c['percent%'])).first() + eq_(row['percent%'], 5) + eq_(row['spaces % more spaces'], 12) + + eq_(row[table.c['percent%']], 5) + eq_(row[table.c['spaces % more spaces']], 12) + + config.db.execute( + percent_table.update().values( + {percent_table.c['spaces % more spaces']: 15} + ) + ) + + eq_( + list( + config.db.execute( + percent_table. + select(). + order_by(percent_table.c['percent%']) + ) + ), + [(5, 15), (7, 15), (9, 15), (11, 15)] + ) + + +class ServerSideCursorsTest(fixtures.TestBase, testing.AssertsExecutionResults): + + __requires__ = ('server_side_cursors', ) + + __backend__ = True + + def _is_server_side(self, cursor): + if self.engine.url.drivername == 'postgresql': + return cursor.name + elif self.engine.url.drivername == 'mysql': + sscursor = __import__('MySQLdb.cursors').cursors.SSCursor + return isinstance(cursor, sscursor) + elif self.engine.url.drivername == 'mysql+pymysql': + sscursor = __import__('pymysql.cursors').cursors.SSCursor + return isinstance(cursor, sscursor) + else: + return False + + def _fixture(self, server_side_cursors): + self.engine = engines.testing_engine( + options={'server_side_cursors': server_side_cursors} + ) + return self.engine + + def tearDown(self): + engines.testing_reaper.close_all() + self.engine.dispose() + + def test_global_string(self): + engine = self._fixture(True) + result = engine.execute('select 1') + assert self._is_server_side(result.cursor) + + def test_global_text(self): + engine = self._fixture(True) + result = engine.execute(text('select 1')) + assert self._is_server_side(result.cursor) + + def test_global_expr(self): + engine = self._fixture(True) + result = engine.execute(select([1])) + assert self._is_server_side(result.cursor) + + def test_global_off_explicit(self): + engine = self._fixture(False) + result = engine.execute(text('select 1')) + + # It should be off globally ... + + assert not self._is_server_side(result.cursor) + + def test_stmt_option(self): + engine = self._fixture(False) + + s = select([1]).execution_options(stream_results=True) + result = engine.execute(s) + + # ... but enabled for this one. + + assert self._is_server_side(result.cursor) + + def test_conn_option(self): + engine = self._fixture(False) + + # and this one + result = \ + engine.connect().execution_options(stream_results=True).\ + execute('select 1' + ) + assert self._is_server_side(result.cursor) + + def test_stmt_enabled_conn_option_disabled(self): + engine = self._fixture(False) + + s = select([1]).execution_options(stream_results=True) + + # not this one + result = \ + engine.connect().execution_options(stream_results=False).\ + execute(s) + assert not self._is_server_side(result.cursor) + + def test_stmt_option_disabled(self): + engine = self._fixture(True) + s = select([1]).execution_options(stream_results=False) + result = engine.execute(s) + assert not self._is_server_side(result.cursor) + + def test_aliases_and_ss(self): + engine = self._fixture(False) + s1 = select([1]).execution_options(stream_results=True).alias() + result = engine.execute(s1) + assert self._is_server_side(result.cursor) + + # s1's options shouldn't affect s2 when s2 is used as a + # from_obj. + s2 = select([1], from_obj=s1) + result = engine.execute(s2) + assert not self._is_server_side(result.cursor) + + def test_for_update_expr(self): + engine = self._fixture(True) + s1 = select([1], for_update=True) + result = engine.execute(s1) + assert self._is_server_side(result.cursor) + + def test_for_update_string(self): + engine = self._fixture(True) + result = engine.execute('SELECT 1 FOR UPDATE') + assert self._is_server_side(result.cursor) + + def test_text_no_ss(self): + engine = self._fixture(False) + s = text('select 42') + result = engine.execute(s) + assert not self._is_server_side(result.cursor) + + def test_text_ss_option(self): + engine = self._fixture(False) + s = text('select 42').execution_options(stream_results=True) + result = engine.execute(s) + assert self._is_server_side(result.cursor) + + @testing.provide_metadata + def test_roundtrip(self): + md = self.metadata + + engine = self._fixture(True) + test_table = Table('test_table', md, + Column('id', Integer, primary_key=True), + Column('data', String(50))) + test_table.create(checkfirst=True) + test_table.insert().execute(data='data1') + test_table.insert().execute(data='data2') + eq_(test_table.select().execute().fetchall(), [(1, 'data1' + ), (2, 'data2')]) + test_table.update().where( + test_table.c.id == 2).values( + data=test_table.c.data + + ' updated').execute() + eq_(test_table.select().execute().fetchall(), + [(1, 'data1'), (2, 'data2 updated')]) + test_table.delete().execute() + eq_(select([func.count('*')]).select_from(test_table).scalar(), 0) diff --git a/app/lib/sqlalchemy/testing/suite/test_select.py b/app/lib/sqlalchemy/testing/suite/test_select.py new file mode 100644 index 0000000..e7de356 --- /dev/null +++ b/app/lib/sqlalchemy/testing/suite/test_select.py @@ -0,0 +1,312 @@ +from .. import fixtures, config +from ..assertions import eq_ + +from sqlalchemy import util +from sqlalchemy import Integer, String, select, func, bindparam, union +from sqlalchemy import testing + +from ..schema import Table, Column + + +class OrderByLabelTest(fixtures.TablesTest): + """Test the dialect sends appropriate ORDER BY expressions when + labels are used. + + This essentially exercises the "supports_simple_order_by_label" + setting. + + """ + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table("some_table", metadata, + Column('id', Integer, primary_key=True), + Column('x', Integer), + Column('y', Integer), + Column('q', String(50)), + Column('p', String(50)) + ) + + @classmethod + def insert_data(cls): + config.db.execute( + cls.tables.some_table.insert(), + [ + {"id": 1, "x": 1, "y": 2, "q": "q1", "p": "p3"}, + {"id": 2, "x": 2, "y": 3, "q": "q2", "p": "p2"}, + {"id": 3, "x": 3, "y": 4, "q": "q3", "p": "p1"}, + ] + ) + + def _assert_result(self, select, result): + eq_( + config.db.execute(select).fetchall(), + result + ) + + def test_plain(self): + table = self.tables.some_table + lx = table.c.x.label('lx') + self._assert_result( + select([lx]).order_by(lx), + [(1, ), (2, ), (3, )] + ) + + def test_composed_int(self): + table = self.tables.some_table + lx = (table.c.x + table.c.y).label('lx') + self._assert_result( + select([lx]).order_by(lx), + [(3, ), (5, ), (7, )] + ) + + def test_composed_multiple(self): + table = self.tables.some_table + lx = (table.c.x + table.c.y).label('lx') + ly = (func.lower(table.c.q) + table.c.p).label('ly') + self._assert_result( + select([lx, ly]).order_by(lx, ly.desc()), + [(3, util.u('q1p3')), (5, util.u('q2p2')), (7, util.u('q3p1'))] + ) + + def test_plain_desc(self): + table = self.tables.some_table + lx = table.c.x.label('lx') + self._assert_result( + select([lx]).order_by(lx.desc()), + [(3, ), (2, ), (1, )] + ) + + def test_composed_int_desc(self): + table = self.tables.some_table + lx = (table.c.x + table.c.y).label('lx') + self._assert_result( + select([lx]).order_by(lx.desc()), + [(7, ), (5, ), (3, )] + ) + + def test_group_by_composed(self): + table = self.tables.some_table + expr = (table.c.x + table.c.y).label('lx') + stmt = select([func.count(table.c.id), expr]).group_by(expr).order_by(expr) + self._assert_result( + stmt, + [(1, 3), (1, 5), (1, 7)] + ) + + +class LimitOffsetTest(fixtures.TablesTest): + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table("some_table", metadata, + Column('id', Integer, primary_key=True), + Column('x', Integer), + Column('y', Integer)) + + @classmethod + def insert_data(cls): + config.db.execute( + cls.tables.some_table.insert(), + [ + {"id": 1, "x": 1, "y": 2}, + {"id": 2, "x": 2, "y": 3}, + {"id": 3, "x": 3, "y": 4}, + {"id": 4, "x": 4, "y": 5}, + ] + ) + + def _assert_result(self, select, result, params=()): + eq_( + config.db.execute(select, params).fetchall(), + result + ) + + def test_simple_limit(self): + table = self.tables.some_table + self._assert_result( + select([table]).order_by(table.c.id).limit(2), + [(1, 1, 2), (2, 2, 3)] + ) + + @testing.requires.offset + def test_simple_offset(self): + table = self.tables.some_table + self._assert_result( + select([table]).order_by(table.c.id).offset(2), + [(3, 3, 4), (4, 4, 5)] + ) + + @testing.requires.offset + def test_simple_limit_offset(self): + table = self.tables.some_table + self._assert_result( + select([table]).order_by(table.c.id).limit(2).offset(1), + [(2, 2, 3), (3, 3, 4)] + ) + + @testing.requires.offset + def test_limit_offset_nobinds(self): + """test that 'literal binds' mode works - no bound params.""" + + table = self.tables.some_table + stmt = select([table]).order_by(table.c.id).limit(2).offset(1) + sql = stmt.compile( + dialect=config.db.dialect, + compile_kwargs={"literal_binds": True}) + sql = str(sql) + + self._assert_result( + sql, + [(2, 2, 3), (3, 3, 4)] + ) + + @testing.requires.bound_limit_offset + def test_bound_limit(self): + table = self.tables.some_table + self._assert_result( + select([table]).order_by(table.c.id).limit(bindparam('l')), + [(1, 1, 2), (2, 2, 3)], + params={"l": 2} + ) + + @testing.requires.bound_limit_offset + def test_bound_offset(self): + table = self.tables.some_table + self._assert_result( + select([table]).order_by(table.c.id).offset(bindparam('o')), + [(3, 3, 4), (4, 4, 5)], + params={"o": 2} + ) + + @testing.requires.bound_limit_offset + def test_bound_limit_offset(self): + table = self.tables.some_table + self._assert_result( + select([table]).order_by(table.c.id). + limit(bindparam("l")).offset(bindparam("o")), + [(2, 2, 3), (3, 3, 4)], + params={"l": 2, "o": 1} + ) + + +class CompoundSelectTest(fixtures.TablesTest): + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table("some_table", metadata, + Column('id', Integer, primary_key=True), + Column('x', Integer), + Column('y', Integer)) + + @classmethod + def insert_data(cls): + config.db.execute( + cls.tables.some_table.insert(), + [ + {"id": 1, "x": 1, "y": 2}, + {"id": 2, "x": 2, "y": 3}, + {"id": 3, "x": 3, "y": 4}, + {"id": 4, "x": 4, "y": 5}, + ] + ) + + def _assert_result(self, select, result, params=()): + eq_( + config.db.execute(select, params).fetchall(), + result + ) + + def test_plain_union(self): + table = self.tables.some_table + s1 = select([table]).where(table.c.id == 2) + s2 = select([table]).where(table.c.id == 3) + + u1 = union(s1, s2) + self._assert_result( + u1.order_by(u1.c.id), + [(2, 2, 3), (3, 3, 4)] + ) + + def test_select_from_plain_union(self): + table = self.tables.some_table + s1 = select([table]).where(table.c.id == 2) + s2 = select([table]).where(table.c.id == 3) + + u1 = union(s1, s2).alias().select() + self._assert_result( + u1.order_by(u1.c.id), + [(2, 2, 3), (3, 3, 4)] + ) + + @testing.requires.parens_in_union_contained_select_w_limit_offset + def test_limit_offset_selectable_in_unions(self): + table = self.tables.some_table + s1 = select([table]).where(table.c.id == 2).\ + limit(1).order_by(table.c.id) + s2 = select([table]).where(table.c.id == 3).\ + limit(1).order_by(table.c.id) + + u1 = union(s1, s2).limit(2) + self._assert_result( + u1.order_by(u1.c.id), + [(2, 2, 3), (3, 3, 4)] + ) + + @testing.requires.parens_in_union_contained_select_wo_limit_offset + def test_order_by_selectable_in_unions(self): + table = self.tables.some_table + s1 = select([table]).where(table.c.id == 2).\ + order_by(table.c.id) + s2 = select([table]).where(table.c.id == 3).\ + order_by(table.c.id) + + u1 = union(s1, s2).limit(2) + self._assert_result( + u1.order_by(u1.c.id), + [(2, 2, 3), (3, 3, 4)] + ) + + def test_distinct_selectable_in_unions(self): + table = self.tables.some_table + s1 = select([table]).where(table.c.id == 2).\ + distinct() + s2 = select([table]).where(table.c.id == 3).\ + distinct() + + u1 = union(s1, s2).limit(2) + self._assert_result( + u1.order_by(u1.c.id), + [(2, 2, 3), (3, 3, 4)] + ) + + @testing.requires.parens_in_union_contained_select_w_limit_offset + def test_limit_offset_in_unions_from_alias(self): + table = self.tables.some_table + s1 = select([table]).where(table.c.id == 2).\ + limit(1).order_by(table.c.id) + s2 = select([table]).where(table.c.id == 3).\ + limit(1).order_by(table.c.id) + + # this necessarily has double parens + u1 = union(s1, s2).alias() + self._assert_result( + u1.select().limit(2).order_by(u1.c.id), + [(2, 2, 3), (3, 3, 4)] + ) + + def test_limit_offset_aliased_selectable_in_unions(self): + table = self.tables.some_table + s1 = select([table]).where(table.c.id == 2).\ + limit(1).order_by(table.c.id).alias().select() + s2 = select([table]).where(table.c.id == 3).\ + limit(1).order_by(table.c.id).alias().select() + + u1 = union(s1, s2).limit(2) + self._assert_result( + u1.order_by(u1.c.id), + [(2, 2, 3), (3, 3, 4)] + ) diff --git a/app/lib/sqlalchemy/testing/suite/test_sequence.py b/app/lib/sqlalchemy/testing/suite/test_sequence.py new file mode 100644 index 0000000..b2d52f2 --- /dev/null +++ b/app/lib/sqlalchemy/testing/suite/test_sequence.py @@ -0,0 +1,126 @@ +from .. import fixtures, config +from ..config import requirements +from ..assertions import eq_ +from ... import testing + +from ... import Integer, String, Sequence, schema + +from ..schema import Table, Column + + +class SequenceTest(fixtures.TablesTest): + __requires__ = ('sequences',) + __backend__ = True + + run_create_tables = 'each' + + @classmethod + def define_tables(cls, metadata): + Table('seq_pk', metadata, + Column('id', Integer, Sequence('tab_id_seq'), primary_key=True), + Column('data', String(50)) + ) + + Table('seq_opt_pk', metadata, + Column('id', Integer, Sequence('tab_id_seq', optional=True), + primary_key=True), + Column('data', String(50)) + ) + + def test_insert_roundtrip(self): + config.db.execute( + self.tables.seq_pk.insert(), + data="some data" + ) + self._assert_round_trip(self.tables.seq_pk, config.db) + + def test_insert_lastrowid(self): + r = config.db.execute( + self.tables.seq_pk.insert(), + data="some data" + ) + eq_( + r.inserted_primary_key, + [1] + ) + + def test_nextval_direct(self): + r = config.db.execute( + self.tables.seq_pk.c.id.default + ) + eq_( + r, 1 + ) + + @requirements.sequences_optional + def test_optional_seq(self): + r = config.db.execute( + self.tables.seq_opt_pk.insert(), + data="some data" + ) + eq_( + r.inserted_primary_key, + [1] + ) + + def _assert_round_trip(self, table, conn): + row = conn.execute(table.select()).first() + eq_( + row, + (1, "some data") + ) + + +class HasSequenceTest(fixtures.TestBase): + __requires__ = 'sequences', + __backend__ = True + + def test_has_sequence(self): + s1 = Sequence('user_id_seq') + testing.db.execute(schema.CreateSequence(s1)) + try: + eq_(testing.db.dialect.has_sequence(testing.db, + 'user_id_seq'), True) + finally: + testing.db.execute(schema.DropSequence(s1)) + + @testing.requires.schemas + def test_has_sequence_schema(self): + s1 = Sequence('user_id_seq', schema=config.test_schema) + testing.db.execute(schema.CreateSequence(s1)) + try: + eq_(testing.db.dialect.has_sequence( + testing.db, 'user_id_seq', schema=config.test_schema), True) + finally: + testing.db.execute(schema.DropSequence(s1)) + + def test_has_sequence_neg(self): + eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq'), + False) + + @testing.requires.schemas + def test_has_sequence_schemas_neg(self): + eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq', + schema=config.test_schema), + False) + + @testing.requires.schemas + def test_has_sequence_default_not_in_remote(self): + s1 = Sequence('user_id_seq') + testing.db.execute(schema.CreateSequence(s1)) + try: + eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq', + schema=config.test_schema), + False) + finally: + testing.db.execute(schema.DropSequence(s1)) + + @testing.requires.schemas + def test_has_sequence_remote_not_in_default(self): + s1 = Sequence('user_id_seq', schema=config.test_schema) + testing.db.execute(schema.CreateSequence(s1)) + try: + eq_(testing.db.dialect.has_sequence(testing.db, 'user_id_seq'), + False) + finally: + testing.db.execute(schema.DropSequence(s1)) diff --git a/app/lib/sqlalchemy/testing/suite/test_types.py b/app/lib/sqlalchemy/testing/suite/test_types.py new file mode 100644 index 0000000..dbbe031 --- /dev/null +++ b/app/lib/sqlalchemy/testing/suite/test_types.py @@ -0,0 +1,898 @@ +# coding: utf-8 + +from .. import fixtures, config +from ..assertions import eq_ +from ..config import requirements +from sqlalchemy import Integer, Unicode, UnicodeText, select +from sqlalchemy import Date, DateTime, Time, MetaData, String, \ + Text, Numeric, Float, literal, Boolean, cast, null, JSON, and_, type_coerce +from ..schema import Table, Column +from ... import testing +import decimal +import datetime +from ...util import u +from ... import util + + +class _LiteralRoundTripFixture(object): + @testing.provide_metadata + def _literal_round_trip(self, type_, input_, output, filter_=None): + """test literal rendering """ + + # for literal, we test the literal render in an INSERT + # into a typed column. we can then SELECT it back as its + # official type; ideally we'd be able to use CAST here + # but MySQL in particular can't CAST fully + t = Table('t', self.metadata, Column('x', type_)) + t.create() + + for value in input_: + ins = t.insert().values(x=literal(value)).compile( + dialect=testing.db.dialect, + compile_kwargs=dict(literal_binds=True) + ) + testing.db.execute(ins) + + for row in t.select().execute(): + value = row[0] + if filter_ is not None: + value = filter_(value) + assert value in output + + +class _UnicodeFixture(_LiteralRoundTripFixture): + __requires__ = 'unicode_data', + + data = u("Alors vous imaginez ma surprise, au lever du jour, " + "quand une drôle de petite voix m’a réveillé. Elle " + "disait: « S’il vous plaît… dessine-moi un mouton! »") + + @classmethod + def define_tables(cls, metadata): + Table('unicode_table', metadata, + Column('id', Integer, primary_key=True, + test_needs_autoincrement=True), + Column('unicode_data', cls.datatype), + ) + + def test_round_trip(self): + unicode_table = self.tables.unicode_table + + config.db.execute( + unicode_table.insert(), + { + 'unicode_data': self.data, + } + ) + + row = config.db.execute( + select([ + unicode_table.c.unicode_data, + ]) + ).first() + + eq_( + row, + (self.data, ) + ) + assert isinstance(row[0], util.text_type) + + def test_round_trip_executemany(self): + unicode_table = self.tables.unicode_table + + config.db.execute( + unicode_table.insert(), + [ + { + 'unicode_data': self.data, + } + for i in range(3) + ] + ) + + rows = config.db.execute( + select([ + unicode_table.c.unicode_data, + ]) + ).fetchall() + eq_( + rows, + [(self.data, ) for i in range(3)] + ) + for row in rows: + assert isinstance(row[0], util.text_type) + + def _test_empty_strings(self): + unicode_table = self.tables.unicode_table + + config.db.execute( + unicode_table.insert(), + {"unicode_data": u('')} + ) + row = config.db.execute( + select([unicode_table.c.unicode_data]) + ).first() + eq_(row, (u(''),)) + + def test_literal(self): + self._literal_round_trip(self.datatype, [self.data], [self.data]) + + +class UnicodeVarcharTest(_UnicodeFixture, fixtures.TablesTest): + __requires__ = 'unicode_data', + __backend__ = True + + datatype = Unicode(255) + + @requirements.empty_strings_varchar + def test_empty_strings_varchar(self): + self._test_empty_strings() + + +class UnicodeTextTest(_UnicodeFixture, fixtures.TablesTest): + __requires__ = 'unicode_data', 'text_type' + __backend__ = True + + datatype = UnicodeText() + + @requirements.empty_strings_text + def test_empty_strings_text(self): + self._test_empty_strings() + + +class TextTest(_LiteralRoundTripFixture, fixtures.TablesTest): + __requires__ = 'text_type', + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table('text_table', metadata, + Column('id', Integer, primary_key=True, + test_needs_autoincrement=True), + Column('text_data', Text), + ) + + def test_text_roundtrip(self): + text_table = self.tables.text_table + + config.db.execute( + text_table.insert(), + {"text_data": 'some text'} + ) + row = config.db.execute( + select([text_table.c.text_data]) + ).first() + eq_(row, ('some text',)) + + def test_text_empty_strings(self): + text_table = self.tables.text_table + + config.db.execute( + text_table.insert(), + {"text_data": ''} + ) + row = config.db.execute( + select([text_table.c.text_data]) + ).first() + eq_(row, ('',)) + + def test_literal(self): + self._literal_round_trip(Text, ["some text"], ["some text"]) + + def test_literal_quoting(self): + data = '''some 'text' hey "hi there" that's text''' + self._literal_round_trip(Text, [data], [data]) + + def test_literal_backslashes(self): + data = r'backslash one \ backslash two \\ end' + self._literal_round_trip(Text, [data], [data]) + + +class StringTest(_LiteralRoundTripFixture, fixtures.TestBase): + __backend__ = True + + @requirements.unbounded_varchar + def test_nolength_string(self): + metadata = MetaData() + foo = Table('foo', metadata, + Column('one', String) + ) + + foo.create(config.db) + foo.drop(config.db) + + def test_literal(self): + self._literal_round_trip(String(40), ["some text"], ["some text"]) + + def test_literal_quoting(self): + data = '''some 'text' hey "hi there" that's text''' + self._literal_round_trip(String(40), [data], [data]) + + def test_literal_backslashes(self): + data = r'backslash one \ backslash two \\ end' + self._literal_round_trip(String(40), [data], [data]) + + +class _DateFixture(_LiteralRoundTripFixture): + compare = None + + @classmethod + def define_tables(cls, metadata): + Table('date_table', metadata, + Column('id', Integer, primary_key=True, + test_needs_autoincrement=True), + Column('date_data', cls.datatype), + ) + + def test_round_trip(self): + date_table = self.tables.date_table + + config.db.execute( + date_table.insert(), + {'date_data': self.data} + ) + + row = config.db.execute( + select([ + date_table.c.date_data, + ]) + ).first() + + compare = self.compare or self.data + eq_(row, + (compare, )) + assert isinstance(row[0], type(compare)) + + def test_null(self): + date_table = self.tables.date_table + + config.db.execute( + date_table.insert(), + {'date_data': None} + ) + + row = config.db.execute( + select([ + date_table.c.date_data, + ]) + ).first() + eq_(row, (None,)) + + @testing.requires.datetime_literals + def test_literal(self): + compare = self.compare or self.data + self._literal_round_trip(self.datatype, [self.data], [compare]) + + +class DateTimeTest(_DateFixture, fixtures.TablesTest): + __requires__ = 'datetime', + __backend__ = True + datatype = DateTime + data = datetime.datetime(2012, 10, 15, 12, 57, 18) + + +class DateTimeMicrosecondsTest(_DateFixture, fixtures.TablesTest): + __requires__ = 'datetime_microseconds', + __backend__ = True + datatype = DateTime + data = datetime.datetime(2012, 10, 15, 12, 57, 18, 396) + + +class TimeTest(_DateFixture, fixtures.TablesTest): + __requires__ = 'time', + __backend__ = True + datatype = Time + data = datetime.time(12, 57, 18) + + +class TimeMicrosecondsTest(_DateFixture, fixtures.TablesTest): + __requires__ = 'time_microseconds', + __backend__ = True + datatype = Time + data = datetime.time(12, 57, 18, 396) + + +class DateTest(_DateFixture, fixtures.TablesTest): + __requires__ = 'date', + __backend__ = True + datatype = Date + data = datetime.date(2012, 10, 15) + + +class DateTimeCoercedToDateTimeTest(_DateFixture, fixtures.TablesTest): + __requires__ = 'date', 'date_coerces_from_datetime' + __backend__ = True + datatype = Date + data = datetime.datetime(2012, 10, 15, 12, 57, 18) + compare = datetime.date(2012, 10, 15) + + +class DateTimeHistoricTest(_DateFixture, fixtures.TablesTest): + __requires__ = 'datetime_historic', + __backend__ = True + datatype = DateTime + data = datetime.datetime(1850, 11, 10, 11, 52, 35) + + +class DateHistoricTest(_DateFixture, fixtures.TablesTest): + __requires__ = 'date_historic', + __backend__ = True + datatype = Date + data = datetime.date(1727, 4, 1) + + +class IntegerTest(_LiteralRoundTripFixture, fixtures.TestBase): + __backend__ = True + + def test_literal(self): + self._literal_round_trip(Integer, [5], [5]) + + +class NumericTest(_LiteralRoundTripFixture, fixtures.TestBase): + __backend__ = True + + @testing.emits_warning(r".*does \*not\* support Decimal objects natively") + @testing.provide_metadata + def _do_test(self, type_, input_, output, + filter_=None, check_scale=False): + metadata = self.metadata + t = Table('t', metadata, Column('x', type_)) + t.create() + t.insert().execute([{'x': x} for x in input_]) + + result = set([row[0] for row in t.select().execute()]) + output = set(output) + if filter_: + result = set(filter_(x) for x in result) + output = set(filter_(x) for x in output) + eq_(result, output) + if check_scale: + eq_( + [str(x) for x in result], + [str(x) for x in output], + ) + + @testing.emits_warning(r".*does \*not\* support Decimal objects natively") + def test_render_literal_numeric(self): + self._literal_round_trip( + Numeric(precision=8, scale=4), + [15.7563, decimal.Decimal("15.7563")], + [decimal.Decimal("15.7563")], + ) + + @testing.emits_warning(r".*does \*not\* support Decimal objects natively") + def test_render_literal_numeric_asfloat(self): + self._literal_round_trip( + Numeric(precision=8, scale=4, asdecimal=False), + [15.7563, decimal.Decimal("15.7563")], + [15.7563], + ) + + def test_render_literal_float(self): + self._literal_round_trip( + Float(4), + [15.7563, decimal.Decimal("15.7563")], + [15.7563, ], + filter_=lambda n: n is not None and round(n, 5) or None + ) + + @testing.requires.precision_generic_float_type + def test_float_custom_scale(self): + self._do_test( + Float(None, decimal_return_scale=7, asdecimal=True), + [15.7563827, decimal.Decimal("15.7563827")], + [decimal.Decimal("15.7563827"), ], + check_scale=True + ) + + def test_numeric_as_decimal(self): + self._do_test( + Numeric(precision=8, scale=4), + [15.7563, decimal.Decimal("15.7563")], + [decimal.Decimal("15.7563")], + ) + + def test_numeric_as_float(self): + self._do_test( + Numeric(precision=8, scale=4, asdecimal=False), + [15.7563, decimal.Decimal("15.7563")], + [15.7563], + ) + + @testing.requires.fetch_null_from_numeric + def test_numeric_null_as_decimal(self): + self._do_test( + Numeric(precision=8, scale=4), + [None], + [None], + ) + + @testing.requires.fetch_null_from_numeric + def test_numeric_null_as_float(self): + self._do_test( + Numeric(precision=8, scale=4, asdecimal=False), + [None], + [None], + ) + + @testing.requires.floats_to_four_decimals + def test_float_as_decimal(self): + self._do_test( + Float(precision=8, asdecimal=True), + [15.7563, decimal.Decimal("15.7563"), None], + [decimal.Decimal("15.7563"), None], + ) + + def test_float_as_float(self): + self._do_test( + Float(precision=8), + [15.7563, decimal.Decimal("15.7563")], + [15.7563], + filter_=lambda n: n is not None and round(n, 5) or None + ) + + @testing.requires.precision_numerics_general + def test_precision_decimal(self): + numbers = set([ + decimal.Decimal("54.234246451650"), + decimal.Decimal("0.004354"), + decimal.Decimal("900.0"), + ]) + + self._do_test( + Numeric(precision=18, scale=12), + numbers, + numbers, + ) + + @testing.requires.precision_numerics_enotation_large + def test_enotation_decimal(self): + """test exceedingly small decimals. + + Decimal reports values with E notation when the exponent + is greater than 6. + + """ + + numbers = set([ + decimal.Decimal('1E-2'), + decimal.Decimal('1E-3'), + decimal.Decimal('1E-4'), + decimal.Decimal('1E-5'), + decimal.Decimal('1E-6'), + decimal.Decimal('1E-7'), + decimal.Decimal('1E-8'), + decimal.Decimal("0.01000005940696"), + decimal.Decimal("0.00000005940696"), + decimal.Decimal("0.00000000000696"), + decimal.Decimal("0.70000000000696"), + decimal.Decimal("696E-12"), + ]) + self._do_test( + Numeric(precision=18, scale=14), + numbers, + numbers + ) + + @testing.requires.precision_numerics_enotation_large + def test_enotation_decimal_large(self): + """test exceedingly large decimals. + + """ + + numbers = set([ + decimal.Decimal('4E+8'), + decimal.Decimal("5748E+15"), + decimal.Decimal('1.521E+15'), + decimal.Decimal('00000000000000.1E+12'), + ]) + self._do_test( + Numeric(precision=25, scale=2), + numbers, + numbers + ) + + @testing.requires.precision_numerics_many_significant_digits + def test_many_significant_digits(self): + numbers = set([ + decimal.Decimal("31943874831932418390.01"), + decimal.Decimal("319438950232418390.273596"), + decimal.Decimal("87673.594069654243"), + ]) + self._do_test( + Numeric(precision=38, scale=12), + numbers, + numbers + ) + + @testing.requires.precision_numerics_retains_significant_digits + def test_numeric_no_decimal(self): + numbers = set([ + decimal.Decimal("1.000") + ]) + self._do_test( + Numeric(precision=5, scale=3), + numbers, + numbers, + check_scale=True + ) + + +class BooleanTest(_LiteralRoundTripFixture, fixtures.TablesTest): + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table('boolean_table', metadata, + Column('id', Integer, primary_key=True, autoincrement=False), + Column('value', Boolean), + Column('unconstrained_value', Boolean(create_constraint=False)), + ) + + def test_render_literal_bool(self): + self._literal_round_trip( + Boolean(), + [True, False], + [True, False] + ) + + def test_round_trip(self): + boolean_table = self.tables.boolean_table + + config.db.execute( + boolean_table.insert(), + { + 'id': 1, + 'value': True, + 'unconstrained_value': False + } + ) + + row = config.db.execute( + select([ + boolean_table.c.value, + boolean_table.c.unconstrained_value + ]) + ).first() + + eq_( + row, + (True, False) + ) + assert isinstance(row[0], bool) + + def test_null(self): + boolean_table = self.tables.boolean_table + + config.db.execute( + boolean_table.insert(), + { + 'id': 1, + 'value': None, + 'unconstrained_value': None + } + ) + + row = config.db.execute( + select([ + boolean_table.c.value, + boolean_table.c.unconstrained_value + ]) + ).first() + + eq_( + row, + (None, None) + ) + + +class JSONTest(_LiteralRoundTripFixture, fixtures.TablesTest): + __requires__ = 'json_type', + __backend__ = True + + datatype = JSON + + data1 = { + "key1": "value1", + "key2": "value2" + } + + data2 = { + "Key 'One'": "value1", + "key two": "value2", + "key three": "value ' three '" + } + + data3 = { + "key1": [1, 2, 3], + "key2": ["one", "two", "three"], + "key3": [{"four": "five"}, {"six": "seven"}] + } + + data4 = ["one", "two", "three"] + + data5 = { + "nested": { + "elem1": [ + {"a": "b", "c": "d"}, + {"e": "f", "g": "h"} + ], + "elem2": { + "elem3": {"elem4": "elem5"} + } + } + } + + data6 = { + "a": 5, + "b": "some value", + "c": {"foo": "bar"} + } + + @classmethod + def define_tables(cls, metadata): + Table('data_table', metadata, + Column('id', Integer, primary_key=True), + Column('name', String(30), nullable=False), + Column('data', cls.datatype), + Column('nulldata', cls.datatype(none_as_null=True)) + ) + + def test_round_trip_data1(self): + self._test_round_trip(self.data1) + + def _test_round_trip(self, data_element): + data_table = self.tables.data_table + + config.db.execute( + data_table.insert(), + {'name': 'row1', 'data': data_element} + ) + + row = config.db.execute( + select([ + data_table.c.data, + ]) + ).first() + + eq_(row, (data_element, )) + + def test_round_trip_none_as_sql_null(self): + col = self.tables.data_table.c['nulldata'] + + with config.db.connect() as conn: + conn.execute( + self.tables.data_table.insert(), + {"name": "r1", "data": None} + ) + + eq_( + conn.scalar( + select([self.tables.data_table.c.name]). + where(col.is_(null())) + ), + "r1" + ) + + eq_( + conn.scalar( + select([col]) + ), + None + ) + + def test_round_trip_json_null_as_json_null(self): + col = self.tables.data_table.c['data'] + + with config.db.connect() as conn: + conn.execute( + self.tables.data_table.insert(), + {"name": "r1", "data": JSON.NULL} + ) + + eq_( + conn.scalar( + select([self.tables.data_table.c.name]). + where(cast(col, String) == 'null') + ), + "r1" + ) + + eq_( + conn.scalar( + select([col]) + ), + None + ) + + def test_round_trip_none_as_json_null(self): + col = self.tables.data_table.c['data'] + + with config.db.connect() as conn: + conn.execute( + self.tables.data_table.insert(), + {"name": "r1", "data": None} + ) + + eq_( + conn.scalar( + select([self.tables.data_table.c.name]). + where(cast(col, String) == 'null') + ), + "r1" + ) + + eq_( + conn.scalar( + select([col]) + ), + None + ) + + def _criteria_fixture(self): + config.db.execute( + self.tables.data_table.insert(), + [{"name": "r1", "data": self.data1}, + {"name": "r2", "data": self.data2}, + {"name": "r3", "data": self.data3}, + {"name": "r4", "data": self.data4}, + {"name": "r5", "data": self.data5}, + {"name": "r6", "data": self.data6}] + ) + + def _test_index_criteria(self, crit, expected, test_literal=True): + self._criteria_fixture() + with config.db.connect() as conn: + stmt = select([self.tables.data_table.c.name]).where(crit) + + eq_( + conn.scalar(stmt), + expected + ) + + if test_literal: + literal_sql = str(stmt.compile( + config.db, compile_kwargs={"literal_binds": True})) + + eq_(conn.scalar(literal_sql), expected) + + def test_crit_spaces_in_key(self): + name = self.tables.data_table.c.name + col = self.tables.data_table.c['data'] + + # limit the rows here to avoid PG error + # "cannot extract field from a non-object", which is + # fixed in 9.4 but may exist in 9.3 + self._test_index_criteria( + and_( + name.in_(["r1", "r2", "r3"]), + cast(col["key two"], String) == '"value2"' + ), + "r2" + ) + + @config.requirements.json_array_indexes + def test_crit_simple_int(self): + name = self.tables.data_table.c.name + col = self.tables.data_table.c['data'] + + # limit the rows here to avoid PG error + # "cannot extract array element from a non-array", which is + # fixed in 9.4 but may exist in 9.3 + self._test_index_criteria( + and_(name == 'r4', cast(col[1], String) == '"two"'), + "r4" + ) + + def test_crit_mixed_path(self): + col = self.tables.data_table.c['data'] + self._test_index_criteria( + cast(col[("key3", 1, "six")], String) == '"seven"', + "r3" + ) + + def test_crit_string_path(self): + col = self.tables.data_table.c['data'] + self._test_index_criteria( + cast(col[("nested", "elem2", "elem3", "elem4")], String) + == '"elem5"', + "r5" + ) + + def test_crit_against_string_basic(self): + name = self.tables.data_table.c.name + col = self.tables.data_table.c['data'] + + self._test_index_criteria( + and_(name == 'r6', cast(col["b"], String) == '"some value"'), + "r6" + ) + + def test_crit_against_string_coerce_type(self): + name = self.tables.data_table.c.name + col = self.tables.data_table.c['data'] + + self._test_index_criteria( + and_(name == 'r6', + cast(col["b"], String) == type_coerce("some value", JSON)), + "r6", + test_literal=False + ) + + def test_crit_against_int_basic(self): + name = self.tables.data_table.c.name + col = self.tables.data_table.c['data'] + + self._test_index_criteria( + and_(name == 'r6', cast(col["a"], String) == '5'), + "r6" + ) + + def test_crit_against_int_coerce_type(self): + name = self.tables.data_table.c.name + col = self.tables.data_table.c['data'] + + self._test_index_criteria( + and_(name == 'r6', cast(col["a"], String) == type_coerce(5, JSON)), + "r6", + test_literal=False + ) + + def test_unicode_round_trip(self): + s = select([ + cast( + { + util.u('réveillé'): util.u('réveillé'), + "data": {"k1": util.u('drôle')} + }, + self.datatype + ) + ]) + eq_( + config.db.scalar(s), + { + util.u('réveillé'): util.u('réveillé'), + "data": {"k1": util.u('drôle')} + }, + ) + + def test_eval_none_flag_orm(self): + from sqlalchemy.ext.declarative import declarative_base + from sqlalchemy.orm import Session + + Base = declarative_base() + + class Data(Base): + __table__ = self.tables.data_table + + s = Session(testing.db) + + d1 = Data(name='d1', data=None, nulldata=None) + s.add(d1) + s.commit() + + s.bulk_insert_mappings( + Data, [{"name": "d2", "data": None, "nulldata": None}] + ) + eq_( + s.query( + cast(self.tables.data_table.c.data, String(convert_unicode="force")), + cast(self.tables.data_table.c.nulldata, String) + ).filter(self.tables.data_table.c.name == 'd1').first(), + ("null", None) + ) + eq_( + s.query( + cast(self.tables.data_table.c.data, String(convert_unicode="force")), + cast(self.tables.data_table.c.nulldata, String) + ).filter(self.tables.data_table.c.name == 'd2').first(), + ("null", None) + ) + + +__all__ = ('UnicodeVarcharTest', 'UnicodeTextTest', 'JSONTest', + 'DateTest', 'DateTimeTest', 'TextTest', + 'NumericTest', 'IntegerTest', + 'DateTimeHistoricTest', 'DateTimeCoercedToDateTimeTest', + 'TimeMicrosecondsTest', 'TimeTest', 'DateTimeMicrosecondsTest', + 'DateHistoricTest', 'StringTest', 'BooleanTest') diff --git a/app/lib/sqlalchemy/testing/suite/test_update_delete.py b/app/lib/sqlalchemy/testing/suite/test_update_delete.py new file mode 100644 index 0000000..e4c61e7 --- /dev/null +++ b/app/lib/sqlalchemy/testing/suite/test_update_delete.py @@ -0,0 +1,63 @@ +from .. import fixtures, config +from ..assertions import eq_ + +from sqlalchemy import Integer, String +from ..schema import Table, Column + + +class SimpleUpdateDeleteTest(fixtures.TablesTest): + run_deletes = 'each' + __backend__ = True + + @classmethod + def define_tables(cls, metadata): + Table('plain_pk', metadata, + Column('id', Integer, primary_key=True), + Column('data', String(50)) + ) + + @classmethod + def insert_data(cls): + config.db.execute( + cls.tables.plain_pk.insert(), + [ + {"id": 1, "data": "d1"}, + {"id": 2, "data": "d2"}, + {"id": 3, "data": "d3"}, + ] + ) + + def test_update(self): + t = self.tables.plain_pk + r = config.db.execute( + t.update().where(t.c.id == 2), + data="d2_new" + ) + assert not r.is_insert + assert not r.returns_rows + + eq_( + config.db.execute(t.select().order_by(t.c.id)).fetchall(), + [ + (1, "d1"), + (2, "d2_new"), + (3, "d3") + ] + ) + + def test_delete(self): + t = self.tables.plain_pk + r = config.db.execute( + t.delete().where(t.c.id == 2) + ) + assert not r.is_insert + assert not r.returns_rows + eq_( + config.db.execute(t.select().order_by(t.c.id)).fetchall(), + [ + (1, "d1"), + (3, "d3") + ] + ) + +__all__ = ('SimpleUpdateDeleteTest', ) diff --git a/app/lib/sqlalchemy/testing/util.py b/app/lib/sqlalchemy/testing/util.py new file mode 100644 index 0000000..8f91f31 --- /dev/null +++ b/app/lib/sqlalchemy/testing/util.py @@ -0,0 +1,280 @@ +# testing/util.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from ..util import jython, pypy, defaultdict, decorator, py2k +import decimal +import gc +import time +import random +import sys +import types + +if jython: + def jython_gc_collect(*args): + """aggressive gc.collect for tests.""" + gc.collect() + time.sleep(0.1) + gc.collect() + gc.collect() + return 0 + + # "lazy" gc, for VM's that don't GC on refcount == 0 + gc_collect = lazy_gc = jython_gc_collect +elif pypy: + def pypy_gc_collect(*args): + gc.collect() + gc.collect() + gc_collect = lazy_gc = pypy_gc_collect +else: + # assume CPython - straight gc.collect, lazy_gc() is a pass + gc_collect = gc.collect + + def lazy_gc(): + pass + + +def picklers(): + picklers = set() + if py2k: + try: + import cPickle + picklers.add(cPickle) + except ImportError: + pass + + import pickle + picklers.add(pickle) + + # yes, this thing needs this much testing + for pickle_ in picklers: + for protocol in -1, 0, 1, 2: + yield pickle_.loads, lambda d: pickle_.dumps(d, protocol) + + +def round_decimal(value, prec): + if isinstance(value, float): + return round(value, prec) + + # can also use shift() here but that is 2.6 only + return (value * decimal.Decimal("1" + "0" * prec) + ).to_integral(decimal.ROUND_FLOOR) / \ + pow(10, prec) + + +class RandomSet(set): + def __iter__(self): + l = list(set.__iter__(self)) + random.shuffle(l) + return iter(l) + + def pop(self): + index = random.randint(0, len(self) - 1) + item = list(set.__iter__(self))[index] + self.remove(item) + return item + + def union(self, other): + return RandomSet(set.union(self, other)) + + def difference(self, other): + return RandomSet(set.difference(self, other)) + + def intersection(self, other): + return RandomSet(set.intersection(self, other)) + + def copy(self): + return RandomSet(self) + + +def conforms_partial_ordering(tuples, sorted_elements): + """True if the given sorting conforms to the given partial ordering.""" + + deps = defaultdict(set) + for parent, child in tuples: + deps[parent].add(child) + for i, node in enumerate(sorted_elements): + for n in sorted_elements[i:]: + if node in deps[n]: + return False + else: + return True + + +def all_partial_orderings(tuples, elements): + edges = defaultdict(set) + for parent, child in tuples: + edges[child].add(parent) + + def _all_orderings(elements): + + if len(elements) == 1: + yield list(elements) + else: + for elem in elements: + subset = set(elements).difference([elem]) + if not subset.intersection(edges[elem]): + for sub_ordering in _all_orderings(subset): + yield [elem] + sub_ordering + + return iter(_all_orderings(elements)) + + +def function_named(fn, name): + """Return a function with a given __name__. + + Will assign to __name__ and return the original function if possible on + the Python implementation, otherwise a new function will be constructed. + + This function should be phased out as much as possible + in favor of @decorator. Tests that "generate" many named tests + should be modernized. + + """ + try: + fn.__name__ = name + except TypeError: + fn = types.FunctionType(fn.__code__, fn.__globals__, name, + fn.__defaults__, fn.__closure__) + return fn + + +def run_as_contextmanager(ctx, fn, *arg, **kw): + """Run the given function under the given contextmanager, + simulating the behavior of 'with' to support older + Python versions. + + This is not necessary anymore as we have placed 2.6 + as minimum Python version, however some tests are still using + this structure. + + """ + + obj = ctx.__enter__() + try: + result = fn(obj, *arg, **kw) + ctx.__exit__(None, None, None) + return result + except: + exc_info = sys.exc_info() + raise_ = ctx.__exit__(*exc_info) + if raise_ is None: + raise + else: + return raise_ + + +def rowset(results): + """Converts the results of sql execution into a plain set of column tuples. + + Useful for asserting the results of an unordered query. + """ + + return set([tuple(row) for row in results]) + + +def fail(msg): + assert False, msg + + +@decorator +def provide_metadata(fn, *args, **kw): + """Provide bound MetaData for a single test, dropping afterwards.""" + + from . import config + from . import engines + from sqlalchemy import schema + + metadata = schema.MetaData(config.db) + self = args[0] + prev_meta = getattr(self, 'metadata', None) + self.metadata = metadata + try: + return fn(*args, **kw) + finally: + engines.drop_all_tables(metadata, config.db) + self.metadata = prev_meta + + +def force_drop_names(*names): + """Force the given table names to be dropped after test complete, + isolating for foreign key cycles + + """ + from . import config + from sqlalchemy import inspect + + @decorator + def go(fn, *args, **kw): + + try: + return fn(*args, **kw) + finally: + drop_all_tables( + config.db, inspect(config.db), include_names=names) + return go + + +class adict(dict): + """Dict keys available as attributes. Shadows.""" + + def __getattribute__(self, key): + try: + return self[key] + except KeyError: + return dict.__getattribute__(self, key) + + def __call__(self, *keys): + return tuple([self[key] for key in keys]) + + get_all = __call__ + + +def drop_all_tables(engine, inspector, schema=None, include_names=None): + from sqlalchemy import Column, Table, Integer, MetaData, \ + ForeignKeyConstraint + from sqlalchemy.schema import DropTable, DropConstraint + + if include_names is not None: + include_names = set(include_names) + + with engine.connect() as conn: + for tname, fkcs in reversed( + inspector.get_sorted_table_and_fkc_names(schema=schema)): + if tname: + if include_names is not None and tname not in include_names: + continue + conn.execute(DropTable( + Table(tname, MetaData(), schema=schema) + )) + elif fkcs: + if not engine.dialect.supports_alter: + continue + for tname, fkc in fkcs: + if include_names is not None and \ + tname not in include_names: + continue + tb = Table( + tname, MetaData(), + Column('x', Integer), + Column('y', Integer), + schema=schema + ) + conn.execute(DropConstraint( + ForeignKeyConstraint( + [tb.c.x], [tb.c.y], name=fkc) + )) + + +def teardown_events(event_cls): + @decorator + def decorate(fn, *arg, **kw): + try: + return fn(*arg, **kw) + finally: + event_cls._clear() + return decorate + diff --git a/app/lib/sqlalchemy/testing/warnings.py b/app/lib/sqlalchemy/testing/warnings.py new file mode 100644 index 0000000..3d1c098 --- /dev/null +++ b/app/lib/sqlalchemy/testing/warnings.py @@ -0,0 +1,41 @@ +# testing/warnings.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from __future__ import absolute_import + +import warnings +from .. import exc as sa_exc +from . import assertions + + +def setup_filters(): + """Set global warning behavior for the test suite.""" + + warnings.filterwarnings('ignore', + category=sa_exc.SAPendingDeprecationWarning) + warnings.filterwarnings('error', category=sa_exc.SADeprecationWarning) + warnings.filterwarnings('error', category=sa_exc.SAWarning) + + # some selected deprecations... + warnings.filterwarnings('error', category=DeprecationWarning) + warnings.filterwarnings( + "ignore", category=DeprecationWarning, message=".*StopIteration") + warnings.filterwarnings( + "ignore", category=DeprecationWarning, message=".*inspect.getargspec") + + +def assert_warnings(fn, warning_msgs, regex=False): + """Assert that each of the given warnings are emitted by fn. + + Deprecated. Please use assertions.expect_warnings(). + + """ + + with assertions._expect_warnings( + sa_exc.SAWarning, warning_msgs, regex=regex): + return fn() + diff --git a/app/lib/sqlalchemy/types.py b/app/lib/sqlalchemy/types.py new file mode 100644 index 0000000..ea07b91 --- /dev/null +++ b/app/lib/sqlalchemy/types.py @@ -0,0 +1,81 @@ +# types.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Compatibility namespace for sqlalchemy.sql.types. + +""" + +__all__ = ['TypeEngine', 'TypeDecorator', 'UserDefinedType', + 'INT', 'CHAR', 'VARCHAR', 'NCHAR', 'NVARCHAR', 'TEXT', 'Text', + 'FLOAT', 'NUMERIC', 'REAL', 'DECIMAL', 'TIMESTAMP', 'DATETIME', + 'CLOB', 'BLOB', 'BINARY', 'VARBINARY', 'BOOLEAN', 'BIGINT', + 'SMALLINT', 'INTEGER', 'DATE', 'TIME', 'String', 'Integer', + 'SmallInteger', 'BigInteger', 'Numeric', 'Float', 'DateTime', + 'Date', 'Time', 'LargeBinary', 'Binary', 'Boolean', 'Unicode', + 'Concatenable', 'UnicodeText', 'PickleType', 'Interval', 'Enum', + 'Indexable', 'ARRAY', 'JSON'] + +from .sql.type_api import ( + adapt_type, + TypeEngine, + TypeDecorator, + Variant, + to_instance, + UserDefinedType +) +from .sql.sqltypes import ( + ARRAY, + BIGINT, + BINARY, + BLOB, + BOOLEAN, + BigInteger, + Binary, + _Binary, + Boolean, + CHAR, + CLOB, + Concatenable, + DATE, + DATETIME, + DECIMAL, + Date, + DateTime, + Enum, + FLOAT, + Float, + Indexable, + INT, + INTEGER, + Integer, + Interval, + JSON, + LargeBinary, + MatchType, + NCHAR, + NVARCHAR, + NullType, + NULLTYPE, + NUMERIC, + Numeric, + PickleType, + REAL, + SchemaType, + SMALLINT, + SmallInteger, + String, + STRINGTYPE, + TEXT, + TIME, + TIMESTAMP, + Text, + Time, + Unicode, + UnicodeText, + VARBINARY, + VARCHAR, + ) diff --git a/app/lib/sqlalchemy/util/__init__.py b/app/lib/sqlalchemy/util/__init__.py new file mode 100644 index 0000000..ea1d925 --- /dev/null +++ b/app/lib/sqlalchemy/util/__init__.py @@ -0,0 +1,49 @@ +# util/__init__.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +from .compat import callable, cmp, reduce, \ + threading, py3k, py33, py36, py2k, jython, pypy, cpython, win32, \ + pickle, dottedgetter, parse_qsl, namedtuple, next, reraise, \ + raise_from_cause, text_type, safe_kwarg, string_types, int_types, \ + binary_type, nested, \ + quote_plus, with_metaclass, print_, itertools_filterfalse, u, ue, b,\ + unquote_plus, unquote, b64decode, b64encode, byte_buffer, itertools_filter,\ + iterbytes, StringIO, inspect_getargspec, zip_longest + +from ._collections import KeyedTuple, ImmutableContainer, immutabledict, \ + Properties, OrderedProperties, ImmutableProperties, OrderedDict, \ + OrderedSet, IdentitySet, OrderedIdentitySet, column_set, \ + column_dict, ordered_column_set, populate_column_dict, unique_list, \ + UniqueAppender, PopulateDict, EMPTY_SET, to_list, to_set, \ + to_column_set, update_copy, flatten_iterator, has_intersection, \ + LRUCache, ScopedRegistry, ThreadLocalRegistry, WeakSequence, \ + coerce_generator_arg, lightweight_named_tuple + +from .langhelpers import iterate_attributes, class_hierarchy, \ + portable_instancemethod, unbound_method_to_callable, \ + getargspec_init, format_argspec_init, format_argspec_plus, \ + get_func_kwargs, get_cls_kwargs, decorator, as_interface, \ + memoized_property, memoized_instancemethod, md5_hex, \ + group_expirable_memoized_property, dependencies, decode_slice, \ + monkeypatch_proxied_specials, asbool, bool_or_str, coerce_kw_type,\ + duck_type_collection, assert_arg_type, symbol, dictlike_iteritems,\ + classproperty, set_creation_order, warn_exception, warn, NoneType,\ + constructor_copy, methods_equivalent, chop_traceback, asint,\ + generic_repr, counter, PluginLoader, hybridproperty, hybridmethod, \ + safe_reraise,\ + get_callable_argspec, only_once, attrsetter, ellipses_string, \ + warn_limited, map_bits, MemoizedSlots, EnsureKWArgType, wrap_callable + +from .deprecations import warn_deprecated, warn_pending_deprecation, \ + deprecated, pending_deprecation, inject_docstring_text + +# things that used to be not always available, +# but are now as of current support Python versions +from collections import defaultdict +from functools import partial +from functools import update_wrapper +from contextlib import contextmanager diff --git a/app/lib/sqlalchemy/util/_collections.py b/app/lib/sqlalchemy/util/_collections.py new file mode 100644 index 0000000..e3e1d71 --- /dev/null +++ b/app/lib/sqlalchemy/util/_collections.py @@ -0,0 +1,1045 @@ +# util/_collections.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Collection classes and helpers.""" + +from __future__ import absolute_import +import weakref +import operator +from .compat import threading, itertools_filterfalse, string_types, \ + binary_types +from . import py2k +import types +import collections + +EMPTY_SET = frozenset() + + +class AbstractKeyedTuple(tuple): + __slots__ = () + + def keys(self): + """Return a list of string key names for this :class:`.KeyedTuple`. + + .. seealso:: + + :attr:`.KeyedTuple._fields` + + """ + + return list(self._fields) + + +class KeyedTuple(AbstractKeyedTuple): + """``tuple`` subclass that adds labeled names. + + E.g.:: + + >>> k = KeyedTuple([1, 2, 3], labels=["one", "two", "three"]) + >>> k.one + 1 + >>> k.two + 2 + + Result rows returned by :class:`.Query` that contain multiple + ORM entities and/or column expressions make use of this + class to return rows. + + The :class:`.KeyedTuple` exhibits similar behavior to the + ``collections.namedtuple()`` construct provided in the Python + standard library, however is architected very differently. + Unlike ``collections.namedtuple()``, :class:`.KeyedTuple` is + does not rely on creation of custom subtypes in order to represent + a new series of keys, instead each :class:`.KeyedTuple` instance + receives its list of keys in place. The subtype approach + of ``collections.namedtuple()`` introduces significant complexity + and performance overhead, which is not necessary for the + :class:`.Query` object's use case. + + .. versionchanged:: 0.8 + Compatibility methods with ``collections.namedtuple()`` have been + added including :attr:`.KeyedTuple._fields` and + :meth:`.KeyedTuple._asdict`. + + .. seealso:: + + :ref:`ormtutorial_querying` + + """ + + def __new__(cls, vals, labels=None): + t = tuple.__new__(cls, vals) + if labels: + t.__dict__.update(zip(labels, vals)) + else: + labels = [] + t.__dict__['_labels'] = labels + return t + + @property + def _fields(self): + """Return a tuple of string key names for this :class:`.KeyedTuple`. + + This method provides compatibility with ``collections.namedtuple()``. + + .. versionadded:: 0.8 + + .. seealso:: + + :meth:`.KeyedTuple.keys` + + """ + return tuple([l for l in self._labels if l is not None]) + + def __setattr__(self, key, value): + raise AttributeError("Can't set attribute: %s" % key) + + def _asdict(self): + """Return the contents of this :class:`.KeyedTuple` as a dictionary. + + This method provides compatibility with ``collections.namedtuple()``, + with the exception that the dictionary returned is **not** ordered. + + .. versionadded:: 0.8 + + """ + return dict((key, self.__dict__[key]) for key in self.keys()) + + +class _LW(AbstractKeyedTuple): + __slots__ = () + + def __new__(cls, vals): + return tuple.__new__(cls, vals) + + def __reduce__(self): + # for pickling, degrade down to the regular + # KeyedTuple, thus avoiding anonymous class pickling + # difficulties + return KeyedTuple, (list(self), self._real_fields) + + def _asdict(self): + """Return the contents of this :class:`.KeyedTuple` as a dictionary.""" + + d = dict(zip(self._real_fields, self)) + d.pop(None, None) + return d + + +class ImmutableContainer(object): + def _immutable(self, *arg, **kw): + raise TypeError("%s object is immutable" % self.__class__.__name__) + + __delitem__ = __setitem__ = __setattr__ = _immutable + + +class immutabledict(ImmutableContainer, dict): + + clear = pop = popitem = setdefault = \ + update = ImmutableContainer._immutable + + def __new__(cls, *args): + new = dict.__new__(cls) + dict.__init__(new, *args) + return new + + def __init__(self, *args): + pass + + def __reduce__(self): + return immutabledict, (dict(self), ) + + def union(self, d): + if not d: + return self + elif not self: + if isinstance(d, immutabledict): + return d + else: + return immutabledict(d) + else: + d2 = immutabledict(self) + dict.update(d2, d) + return d2 + + def __repr__(self): + return "immutabledict(%s)" % dict.__repr__(self) + + +class Properties(object): + """Provide a __getattr__/__setattr__ interface over a dict.""" + + __slots__ = '_data', + + def __init__(self, data): + object.__setattr__(self, '_data', data) + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(list(self._data.values())) + + def __add__(self, other): + return list(self) + list(other) + + def __setitem__(self, key, object): + self._data[key] = object + + def __getitem__(self, key): + return self._data[key] + + def __delitem__(self, key): + del self._data[key] + + def __setattr__(self, key, obj): + self._data[key] = obj + + def __getstate__(self): + return {'_data': self._data} + + def __setstate__(self, state): + object.__setattr__(self, '_data', state['_data']) + + def __getattr__(self, key): + try: + return self._data[key] + except KeyError: + raise AttributeError(key) + + def __contains__(self, key): + return key in self._data + + def as_immutable(self): + """Return an immutable proxy for this :class:`.Properties`.""" + + return ImmutableProperties(self._data) + + def update(self, value): + self._data.update(value) + + def get(self, key, default=None): + if key in self: + return self[key] + else: + return default + + def keys(self): + return list(self._data) + + def values(self): + return list(self._data.values()) + + def items(self): + return list(self._data.items()) + + def has_key(self, key): + return key in self._data + + def clear(self): + self._data.clear() + + +class OrderedProperties(Properties): + """Provide a __getattr__/__setattr__ interface with an OrderedDict + as backing store.""" + + __slots__ = () + + def __init__(self): + Properties.__init__(self, OrderedDict()) + + +class ImmutableProperties(ImmutableContainer, Properties): + """Provide immutable dict/object attribute to an underlying dictionary.""" + + __slots__ = () + + +class OrderedDict(dict): + """A dict that returns keys/values/items in the order they were added.""" + + __slots__ = '_list', + + def __reduce__(self): + return OrderedDict, (self.items(),) + + def __init__(self, ____sequence=None, **kwargs): + self._list = [] + if ____sequence is None: + if kwargs: + self.update(**kwargs) + else: + self.update(____sequence, **kwargs) + + def clear(self): + self._list = [] + dict.clear(self) + + def copy(self): + return self.__copy__() + + def __copy__(self): + return OrderedDict(self) + + def sort(self, *arg, **kw): + self._list.sort(*arg, **kw) + + def update(self, ____sequence=None, **kwargs): + if ____sequence is not None: + if hasattr(____sequence, 'keys'): + for key in ____sequence.keys(): + self.__setitem__(key, ____sequence[key]) + else: + for key, value in ____sequence: + self[key] = value + if kwargs: + self.update(kwargs) + + def setdefault(self, key, value): + if key not in self: + self.__setitem__(key, value) + return value + else: + return self.__getitem__(key) + + def __iter__(self): + return iter(self._list) + + def keys(self): + return list(self) + + def values(self): + return [self[key] for key in self._list] + + def items(self): + return [(key, self[key]) for key in self._list] + + if py2k: + def itervalues(self): + return iter(self.values()) + + def iterkeys(self): + return iter(self) + + def iteritems(self): + return iter(self.items()) + + def __setitem__(self, key, object): + if key not in self: + try: + self._list.append(key) + except AttributeError: + # work around Python pickle loads() with + # dict subclass (seems to ignore __setstate__?) + self._list = [key] + dict.__setitem__(self, key, object) + + def __delitem__(self, key): + dict.__delitem__(self, key) + self._list.remove(key) + + def pop(self, key, *default): + present = key in self + value = dict.pop(self, key, *default) + if present: + self._list.remove(key) + return value + + def popitem(self): + item = dict.popitem(self) + self._list.remove(item[0]) + return item + + +class OrderedSet(set): + def __init__(self, d=None): + set.__init__(self) + self._list = [] + if d is not None: + self._list = unique_list(d) + set.update(self, self._list) + else: + self._list = [] + + def add(self, element): + if element not in self: + self._list.append(element) + set.add(self, element) + + def remove(self, element): + set.remove(self, element) + self._list.remove(element) + + def insert(self, pos, element): + if element not in self: + self._list.insert(pos, element) + set.add(self, element) + + def discard(self, element): + if element in self: + self._list.remove(element) + set.remove(self, element) + + def clear(self): + set.clear(self) + self._list = [] + + def __getitem__(self, key): + return self._list[key] + + def __iter__(self): + return iter(self._list) + + def __add__(self, other): + return self.union(other) + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, self._list) + + __str__ = __repr__ + + def update(self, iterable): + for e in iterable: + if e not in self: + self._list.append(e) + set.add(self, e) + return self + + __ior__ = update + + def union(self, other): + result = self.__class__(self) + result.update(other) + return result + + __or__ = union + + def intersection(self, other): + other = set(other) + return self.__class__(a for a in self if a in other) + + __and__ = intersection + + def symmetric_difference(self, other): + other = set(other) + result = self.__class__(a for a in self if a not in other) + result.update(a for a in other if a not in self) + return result + + __xor__ = symmetric_difference + + def difference(self, other): + other = set(other) + return self.__class__(a for a in self if a not in other) + + __sub__ = difference + + def intersection_update(self, other): + other = set(other) + set.intersection_update(self, other) + self._list = [a for a in self._list if a in other] + return self + + __iand__ = intersection_update + + def symmetric_difference_update(self, other): + set.symmetric_difference_update(self, other) + self._list = [a for a in self._list if a in self] + self._list += [a for a in other._list if a in self] + return self + + __ixor__ = symmetric_difference_update + + def difference_update(self, other): + set.difference_update(self, other) + self._list = [a for a in self._list if a in self] + return self + + __isub__ = difference_update + + +class IdentitySet(object): + """A set that considers only object id() for uniqueness. + + This strategy has edge cases for builtin types- it's possible to have + two 'foo' strings in one of these sets, for example. Use sparingly. + + """ + + _working_set = set + + def __init__(self, iterable=None): + self._members = dict() + if iterable: + for o in iterable: + self.add(o) + + def add(self, value): + self._members[id(value)] = value + + def __contains__(self, value): + return id(value) in self._members + + def remove(self, value): + del self._members[id(value)] + + def discard(self, value): + try: + self.remove(value) + except KeyError: + pass + + def pop(self): + try: + pair = self._members.popitem() + return pair[1] + except KeyError: + raise KeyError('pop from an empty set') + + def clear(self): + self._members.clear() + + def __cmp__(self, other): + raise TypeError('cannot compare sets using cmp()') + + def __eq__(self, other): + if isinstance(other, IdentitySet): + return self._members == other._members + else: + return False + + def __ne__(self, other): + if isinstance(other, IdentitySet): + return self._members != other._members + else: + return True + + def issubset(self, iterable): + other = type(self)(iterable) + + if len(self) > len(other): + return False + for m in itertools_filterfalse(other._members.__contains__, + iter(self._members.keys())): + return False + return True + + def __le__(self, other): + if not isinstance(other, IdentitySet): + return NotImplemented + return self.issubset(other) + + def __lt__(self, other): + if not isinstance(other, IdentitySet): + return NotImplemented + return len(self) < len(other) and self.issubset(other) + + def issuperset(self, iterable): + other = type(self)(iterable) + + if len(self) < len(other): + return False + + for m in itertools_filterfalse(self._members.__contains__, + iter(other._members.keys())): + return False + return True + + def __ge__(self, other): + if not isinstance(other, IdentitySet): + return NotImplemented + return self.issuperset(other) + + def __gt__(self, other): + if not isinstance(other, IdentitySet): + return NotImplemented + return len(self) > len(other) and self.issuperset(other) + + def union(self, iterable): + result = type(self)() + # testlib.pragma exempt:__hash__ + members = self._member_id_tuples() + other = _iter_id(iterable) + result._members.update(self._working_set(members).union(other)) + return result + + def __or__(self, other): + if not isinstance(other, IdentitySet): + return NotImplemented + return self.union(other) + + def update(self, iterable): + self._members = self.union(iterable)._members + + def __ior__(self, other): + if not isinstance(other, IdentitySet): + return NotImplemented + self.update(other) + return self + + def difference(self, iterable): + result = type(self)() + # testlib.pragma exempt:__hash__ + members = self._member_id_tuples() + other = _iter_id(iterable) + result._members.update(self._working_set(members).difference(other)) + return result + + def __sub__(self, other): + if not isinstance(other, IdentitySet): + return NotImplemented + return self.difference(other) + + def difference_update(self, iterable): + self._members = self.difference(iterable)._members + + def __isub__(self, other): + if not isinstance(other, IdentitySet): + return NotImplemented + self.difference_update(other) + return self + + def intersection(self, iterable): + result = type(self)() + # testlib.pragma exempt:__hash__ + members = self._member_id_tuples() + other = _iter_id(iterable) + result._members.update(self._working_set(members).intersection(other)) + return result + + def __and__(self, other): + if not isinstance(other, IdentitySet): + return NotImplemented + return self.intersection(other) + + def intersection_update(self, iterable): + self._members = self.intersection(iterable)._members + + def __iand__(self, other): + if not isinstance(other, IdentitySet): + return NotImplemented + self.intersection_update(other) + return self + + def symmetric_difference(self, iterable): + result = type(self)() + # testlib.pragma exempt:__hash__ + members = self._member_id_tuples() + other = _iter_id(iterable) + result._members.update( + self._working_set(members).symmetric_difference(other)) + return result + + def _member_id_tuples(self): + return ((id(v), v) for v in self._members.values()) + + def __xor__(self, other): + if not isinstance(other, IdentitySet): + return NotImplemented + return self.symmetric_difference(other) + + def symmetric_difference_update(self, iterable): + self._members = self.symmetric_difference(iterable)._members + + def __ixor__(self, other): + if not isinstance(other, IdentitySet): + return NotImplemented + self.symmetric_difference(other) + return self + + def copy(self): + return type(self)(iter(self._members.values())) + + __copy__ = copy + + def __len__(self): + return len(self._members) + + def __iter__(self): + return iter(self._members.values()) + + def __hash__(self): + raise TypeError('set objects are unhashable') + + def __repr__(self): + return '%s(%r)' % (type(self).__name__, list(self._members.values())) + + +class WeakSequence(object): + def __init__(self, __elements=()): + self._storage = [ + weakref.ref(element, self._remove) for element in __elements + ] + + def append(self, item): + self._storage.append(weakref.ref(item, self._remove)) + + def _remove(self, ref): + self._storage.remove(ref) + + def __len__(self): + return len(self._storage) + + def __iter__(self): + return (obj for obj in + (ref() for ref in self._storage) if obj is not None) + + def __getitem__(self, index): + try: + obj = self._storage[index] + except KeyError: + raise IndexError("Index %s out of range" % index) + else: + return obj() + + +class OrderedIdentitySet(IdentitySet): + class _working_set(OrderedSet): + # a testing pragma: exempt the OIDS working set from the test suite's + # "never call the user's __hash__" assertions. this is a big hammer, + # but it's safe here: IDS operates on (id, instance) tuples in the + # working set. + __sa_hash_exempt__ = True + + def __init__(self, iterable=None): + IdentitySet.__init__(self) + self._members = OrderedDict() + if iterable: + for o in iterable: + self.add(o) + + +class PopulateDict(dict): + """A dict which populates missing values via a creation function. + + Note the creation function takes a key, unlike + collections.defaultdict. + + """ + + def __init__(self, creator): + self.creator = creator + + def __missing__(self, key): + self[key] = val = self.creator(key) + return val + +# Define collections that are capable of storing +# ColumnElement objects as hashable keys/elements. +# At this point, these are mostly historical, things +# used to be more complicated. +column_set = set +column_dict = dict +ordered_column_set = OrderedSet +populate_column_dict = PopulateDict + + +_getters = PopulateDict(operator.itemgetter) + +_property_getters = PopulateDict( + lambda idx: property(operator.itemgetter(idx))) + + +def unique_list(seq, hashfunc=None): + seen = set() + seen_add = seen.add + if not hashfunc: + return [x for x in seq + if x not in seen + and not seen_add(x)] + else: + return [x for x in seq + if hashfunc(x) not in seen + and not seen_add(hashfunc(x))] + + +class UniqueAppender(object): + """Appends items to a collection ensuring uniqueness. + + Additional appends() of the same object are ignored. Membership is + determined by identity (``is a``) not equality (``==``). + """ + + def __init__(self, data, via=None): + self.data = data + self._unique = {} + if via: + self._data_appender = getattr(data, via) + elif hasattr(data, 'append'): + self._data_appender = data.append + elif hasattr(data, 'add'): + self._data_appender = data.add + + def append(self, item): + id_ = id(item) + if id_ not in self._unique: + self._data_appender(item) + self._unique[id_] = True + + def __iter__(self): + return iter(self.data) + + +def coerce_generator_arg(arg): + if len(arg) == 1 and isinstance(arg[0], types.GeneratorType): + return list(arg[0]) + else: + return arg + + +def to_list(x, default=None): + if x is None: + return default + if not isinstance(x, collections.Iterable) or \ + isinstance(x, string_types + binary_types): + return [x] + elif isinstance(x, list): + return x + else: + return list(x) + + +def has_intersection(set_, iterable): + """return True if any items of set_ are present in iterable. + + Goes through special effort to ensure __hash__ is not called + on items in iterable that don't support it. + + """ + # TODO: optimize, write in C, etc. + return bool( + set_.intersection([i for i in iterable if i.__hash__]) + ) + + +def to_set(x): + if x is None: + return set() + if not isinstance(x, set): + return set(to_list(x)) + else: + return x + + +def to_column_set(x): + if x is None: + return column_set() + if not isinstance(x, column_set): + return column_set(to_list(x)) + else: + return x + + +def update_copy(d, _new=None, **kw): + """Copy the given dict and update with the given values.""" + + d = d.copy() + if _new: + d.update(_new) + d.update(**kw) + return d + + +def flatten_iterator(x): + """Given an iterator of which further sub-elements may also be + iterators, flatten the sub-elements into a single iterator. + + """ + for elem in x: + if not isinstance(elem, str) and hasattr(elem, '__iter__'): + for y in flatten_iterator(elem): + yield y + else: + yield elem + + +class LRUCache(dict): + """Dictionary with 'squishy' removal of least + recently used items. + + Note that either get() or [] should be used here, but + generally its not safe to do an "in" check first as the dictionary + can change subsequent to that call. + + """ + + def __init__(self, capacity=100, threshold=.5): + self.capacity = capacity + self.threshold = threshold + self._counter = 0 + self._mutex = threading.Lock() + + def _inc_counter(self): + self._counter += 1 + return self._counter + + def get(self, key, default=None): + item = dict.get(self, key, default) + if item is not default: + item[2] = self._inc_counter() + return item[1] + else: + return default + + def __getitem__(self, key): + item = dict.__getitem__(self, key) + item[2] = self._inc_counter() + return item[1] + + def values(self): + return [i[1] for i in dict.values(self)] + + def setdefault(self, key, value): + if key in self: + return self[key] + else: + self[key] = value + return value + + def __setitem__(self, key, value): + item = dict.get(self, key) + if item is None: + item = [key, value, self._inc_counter()] + dict.__setitem__(self, key, item) + else: + item[1] = value + self._manage_size() + + def _manage_size(self): + if not self._mutex.acquire(False): + return + try: + while len(self) > self.capacity + self.capacity * self.threshold: + by_counter = sorted(dict.values(self), + key=operator.itemgetter(2), + reverse=True) + for item in by_counter[self.capacity:]: + try: + del self[item[0]] + except KeyError: + # deleted elsewhere; skip + continue + finally: + self._mutex.release() + + +_lw_tuples = LRUCache(100) + + +def lightweight_named_tuple(name, fields): + hash_ = (name, ) + tuple(fields) + tp_cls = _lw_tuples.get(hash_) + if tp_cls: + return tp_cls + + tp_cls = type( + name, (_LW,), + dict([ + (field, _property_getters[idx]) + for idx, field in enumerate(fields) if field is not None + ] + [('__slots__', ())]) + ) + + tp_cls._real_fields = fields + tp_cls._fields = tuple([f for f in fields if f is not None]) + + _lw_tuples[hash_] = tp_cls + return tp_cls + + +class ScopedRegistry(object): + """A Registry that can store one or multiple instances of a single + class on the basis of a "scope" function. + + The object implements ``__call__`` as the "getter", so by + calling ``myregistry()`` the contained object is returned + for the current scope. + + :param createfunc: + a callable that returns a new object to be placed in the registry + + :param scopefunc: + a callable that will return a key to store/retrieve an object. + """ + + def __init__(self, createfunc, scopefunc): + """Construct a new :class:`.ScopedRegistry`. + + :param createfunc: A creation function that will generate + a new value for the current scope, if none is present. + + :param scopefunc: A function that returns a hashable + token representing the current scope (such as, current + thread identifier). + + """ + self.createfunc = createfunc + self.scopefunc = scopefunc + self.registry = {} + + def __call__(self): + key = self.scopefunc() + try: + return self.registry[key] + except KeyError: + return self.registry.setdefault(key, self.createfunc()) + + def has(self): + """Return True if an object is present in the current scope.""" + + return self.scopefunc() in self.registry + + def set(self, obj): + """Set the value for the current scope.""" + + self.registry[self.scopefunc()] = obj + + def clear(self): + """Clear the current scope, if any.""" + + try: + del self.registry[self.scopefunc()] + except KeyError: + pass + + +class ThreadLocalRegistry(ScopedRegistry): + """A :class:`.ScopedRegistry` that uses a ``threading.local()`` + variable for storage. + + """ + + def __init__(self, createfunc): + self.createfunc = createfunc + self.registry = threading.local() + + def __call__(self): + try: + return self.registry.value + except AttributeError: + val = self.registry.value = self.createfunc() + return val + + def has(self): + return hasattr(self.registry, "value") + + def set(self, obj): + self.registry.value = obj + + def clear(self): + try: + del self.registry.value + except AttributeError: + pass + + +def _iter_id(iterable): + """Generator: ((id(o), o) for o in iterable).""" + + for item in iterable: + yield id(item), item diff --git a/app/lib/sqlalchemy/util/compat.py b/app/lib/sqlalchemy/util/compat.py new file mode 100644 index 0000000..5c615b0 --- /dev/null +++ b/app/lib/sqlalchemy/util/compat.py @@ -0,0 +1,269 @@ +# util/compat.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Handle Python version/platform incompatibilities.""" + +import sys +from contextlib import contextmanager + +try: + import threading +except ImportError: + import dummy_threading as threading + +py36 = sys.version_info >= (3, 6) +py33 = sys.version_info >= (3, 3) +py32 = sys.version_info >= (3, 2) +py3k = sys.version_info >= (3, 0) +py2k = sys.version_info < (3, 0) +py265 = sys.version_info >= (2, 6, 5) +jython = sys.platform.startswith('java') +pypy = hasattr(sys, 'pypy_version_info') +win32 = sys.platform.startswith('win') +cpython = not pypy and not jython # TODO: something better for this ? + +import collections +next = next + +if py3k: + import pickle +else: + try: + import cPickle as pickle + except ImportError: + import pickle + +# work around http://bugs.python.org/issue2646 +if py265: + safe_kwarg = lambda arg: arg +else: + safe_kwarg = str + +ArgSpec = collections.namedtuple("ArgSpec", + ["args", "varargs", "keywords", "defaults"]) + +if py3k: + import builtins + + from inspect import getfullargspec as inspect_getfullargspec + from urllib.parse import (quote_plus, unquote_plus, + parse_qsl, quote, unquote) + import configparser + from io import StringIO + + from io import BytesIO as byte_buffer + + def inspect_getargspec(func): + return ArgSpec( + *inspect_getfullargspec(func)[0:4] + ) + + string_types = str, + binary_types = bytes, + binary_type = bytes + text_type = str + int_types = int, + iterbytes = iter + + def u(s): + return s + + def ue(s): + return s + + def b(s): + return s.encode("latin-1") + + if py32: + callable = callable + else: + def callable(fn): + return hasattr(fn, '__call__') + + def cmp(a, b): + return (a > b) - (a < b) + + from functools import reduce + + print_ = getattr(builtins, "print") + + import_ = getattr(builtins, '__import__') + + import itertools + itertools_filterfalse = itertools.filterfalse + itertools_filter = filter + itertools_imap = map + from itertools import zip_longest + + import base64 + + def b64encode(x): + return base64.b64encode(x).decode('ascii') + + def b64decode(x): + return base64.b64decode(x.encode('ascii')) + +else: + from inspect import getargspec as inspect_getfullargspec + inspect_getargspec = inspect_getfullargspec + from urllib import quote_plus, unquote_plus, quote, unquote + from urlparse import parse_qsl + import ConfigParser as configparser + from StringIO import StringIO + from cStringIO import StringIO as byte_buffer + + string_types = basestring, + binary_types = bytes, + binary_type = str + text_type = unicode + int_types = int, long + + def iterbytes(buf): + return (ord(byte) for byte in buf) + + def u(s): + # this differs from what six does, which doesn't support non-ASCII + # strings - we only use u() with + # literal source strings, and all our source files with non-ascii + # in them (all are tests) are utf-8 encoded. + return unicode(s, "utf-8") + + def ue(s): + return unicode(s, "unicode_escape") + + def b(s): + return s + + def import_(*args): + if len(args) == 4: + args = args[0:3] + ([str(arg) for arg in args[3]],) + return __import__(*args) + + callable = callable + cmp = cmp + reduce = reduce + + import base64 + b64encode = base64.b64encode + b64decode = base64.b64decode + + def print_(*args, **kwargs): + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + for arg in enumerate(args): + if not isinstance(arg, basestring): + arg = str(arg) + fp.write(arg) + + import itertools + itertools_filterfalse = itertools.ifilterfalse + itertools_filter = itertools.ifilter + itertools_imap = itertools.imap + from itertools import izip_longest as zip_longest + + +import time +if win32 or jython: + time_func = time.clock +else: + time_func = time.time + +from collections import namedtuple +from operator import attrgetter as dottedgetter + + +if py3k: + def reraise(tp, value, tb=None, cause=None): + if cause is not None: + assert cause is not value, "Same cause emitted" + value.__cause__ = cause + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + # not as nice as that of Py3K, but at least preserves + # the code line where the issue occurred + exec("def reraise(tp, value, tb=None, cause=None):\n" + " if cause is not None:\n" + " assert cause is not value, 'Same cause emitted'\n" + " raise tp, value, tb\n") + + +def raise_from_cause(exception, exc_info=None): + if exc_info is None: + exc_info = sys.exc_info() + exc_type, exc_value, exc_tb = exc_info + cause = exc_value if exc_value is not exception else None + reraise(type(exception), exception, tb=exc_tb, cause=cause) + +if py3k: + exec_ = getattr(builtins, 'exec') +else: + def exec_(func_text, globals_, lcl=None): + if lcl is None: + exec('exec func_text in globals_') + else: + exec('exec func_text in globals_, lcl') + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass. + + Drops the middle class upon creation. + + Source: http://lucumr.pocoo.org/2013/5/21/porting-to-python-3-redux/ + + """ + + class metaclass(meta): + __call__ = type.__call__ + __init__ = type.__init__ + + def __new__(cls, name, this_bases, d): + if this_bases is None: + return type.__new__(cls, name, (), d) + return meta(name, bases, d) + return metaclass('temporary_class', None, {}) + + + + +@contextmanager +def nested(*managers): + """Implement contextlib.nested, mostly for unit tests. + + As tests still need to run on py2.6 we can't use multiple-with yet. + + Function is removed in py3k but also emits deprecation warning in 2.7 + so just roll it here for everyone. + + """ + + exits = [] + vars = [] + exc = (None, None, None) + try: + for mgr in managers: + exit = mgr.__exit__ + enter = mgr.__enter__ + vars.append(enter()) + exits.append(exit) + yield vars + except: + exc = sys.exc_info() + finally: + while exits: + exit = exits.pop() + try: + if exit(*exc): + exc = (None, None, None) + except: + exc = sys.exc_info() + if exc != (None, None, None): + reraise(exc[0], exc[1], exc[2]) diff --git a/app/lib/sqlalchemy/util/deprecations.py b/app/lib/sqlalchemy/util/deprecations.py new file mode 100644 index 0000000..4da3d45 --- /dev/null +++ b/app/lib/sqlalchemy/util/deprecations.py @@ -0,0 +1,146 @@ +# util/deprecations.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Helpers related to deprecation of functions, methods, classes, other +functionality.""" + +from .. import exc +import warnings +import re +from .langhelpers import decorator + + +def warn_deprecated(msg, stacklevel=3): + warnings.warn(msg, exc.SADeprecationWarning, stacklevel=stacklevel) + + +def warn_pending_deprecation(msg, stacklevel=3): + warnings.warn(msg, exc.SAPendingDeprecationWarning, stacklevel=stacklevel) + + +def deprecated(version, message=None, add_deprecation_to_docstring=True): + """Decorates a function and issues a deprecation warning on use. + + :param message: + If provided, issue message in the warning. A sensible default + is used if not provided. + + :param add_deprecation_to_docstring: + Default True. If False, the wrapped function's __doc__ is left + as-is. If True, the 'message' is prepended to the docs if + provided, or sensible default if message is omitted. + + """ + + if add_deprecation_to_docstring: + header = ".. deprecated:: %s %s" % \ + (version, (message or '')) + else: + header = None + + if message is None: + message = "Call to deprecated function %(func)s" + + def decorate(fn): + return _decorate_with_warning( + fn, exc.SADeprecationWarning, + message % dict(func=fn.__name__), header) + return decorate + + +def pending_deprecation(version, message=None, + add_deprecation_to_docstring=True): + """Decorates a function and issues a pending deprecation warning on use. + + :param version: + An approximate future version at which point the pending deprecation + will become deprecated. Not used in messaging. + + :param message: + If provided, issue message in the warning. A sensible default + is used if not provided. + + :param add_deprecation_to_docstring: + Default True. If False, the wrapped function's __doc__ is left + as-is. If True, the 'message' is prepended to the docs if + provided, or sensible default if message is omitted. + """ + + if add_deprecation_to_docstring: + header = ".. deprecated:: %s (pending) %s" % \ + (version, (message or '')) + else: + header = None + + if message is None: + message = "Call to deprecated function %(func)s" + + def decorate(fn): + return _decorate_with_warning( + fn, exc.SAPendingDeprecationWarning, + message % dict(func=fn.__name__), header) + return decorate + + +def _sanitize_restructured_text(text): + def repl(m): + type_, name = m.group(1, 2) + if type_ in ("func", "meth"): + name += "()" + return name + return re.sub(r'\:(\w+)\:`~?\.?(.+?)`', repl, text) + + +def _decorate_with_warning(func, wtype, message, docstring_header=None): + """Wrap a function with a warnings.warn and augmented docstring.""" + + message = _sanitize_restructured_text(message) + + @decorator + def warned(fn, *args, **kwargs): + warnings.warn(message, wtype, stacklevel=3) + return fn(*args, **kwargs) + + doc = func.__doc__ is not None and func.__doc__ or '' + if docstring_header is not None: + docstring_header %= dict(func=func.__name__) + + doc = inject_docstring_text(doc, docstring_header, 1) + + decorated = warned(func) + decorated.__doc__ = doc + return decorated + +import textwrap + + +def _dedent_docstring(text): + split_text = text.split("\n", 1) + if len(split_text) == 1: + return text + else: + firstline, remaining = split_text + if not firstline.startswith(" "): + return firstline + "\n" + textwrap.dedent(remaining) + else: + return textwrap.dedent(text) + + +def inject_docstring_text(doctext, injecttext, pos): + doctext = _dedent_docstring(doctext or "") + lines = doctext.split('\n') + injectlines = textwrap.dedent(injecttext).split("\n") + if injectlines[0]: + injectlines.insert(0, "") + + blanks = [num for num, line in enumerate(lines) if not line.strip()] + blanks.insert(0, 0) + + inject_pos = blanks[min(pos, len(blanks) - 1)] + + lines = lines[0:inject_pos] + injectlines + lines[inject_pos:] + return "\n".join(lines) diff --git a/app/lib/sqlalchemy/util/langhelpers.py b/app/lib/sqlalchemy/util/langhelpers.py new file mode 100644 index 0000000..66a06c5 --- /dev/null +++ b/app/lib/sqlalchemy/util/langhelpers.py @@ -0,0 +1,1419 @@ +# util/langhelpers.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Routines to help with the creation, loading and introspection of +modules, classes, hierarchies, attributes, functions, and methods. + +""" +import itertools +import inspect +import operator +import re +import sys +import types +import warnings +from functools import update_wrapper +from .. import exc +import hashlib +from . import compat +from . import _collections + + +def md5_hex(x): + if compat.py3k: + x = x.encode('utf-8') + m = hashlib.md5() + m.update(x) + return m.hexdigest() + + +class safe_reraise(object): + """Reraise an exception after invoking some + handler code. + + Stores the existing exception info before + invoking so that it is maintained across a potential + coroutine context switch. + + e.g.:: + + try: + sess.commit() + except: + with safe_reraise(): + sess.rollback() + + """ + + __slots__ = ('warn_only', '_exc_info') + + def __init__(self, warn_only=False): + self.warn_only = warn_only + + def __enter__(self): + self._exc_info = sys.exc_info() + + def __exit__(self, type_, value, traceback): + # see #2703 for notes + if type_ is None: + exc_type, exc_value, exc_tb = self._exc_info + self._exc_info = None # remove potential circular references + if not self.warn_only: + compat.reraise(exc_type, exc_value, exc_tb) + else: + if not compat.py3k and self._exc_info and self._exc_info[1]: + # emulate Py3K's behavior of telling us when an exception + # occurs in an exception handler. + warn( + "An exception has occurred during handling of a " + "previous exception. The previous exception " + "is:\n %s %s\n" % (self._exc_info[0], self._exc_info[1])) + self._exc_info = None # remove potential circular references + compat.reraise(type_, value, traceback) + + +def decode_slice(slc): + """decode a slice object as sent to __getitem__. + + takes into account the 2.5 __index__() method, basically. + + """ + ret = [] + for x in slc.start, slc.stop, slc.step: + if hasattr(x, '__index__'): + x = x.__index__() + ret.append(x) + return tuple(ret) + + +def _unique_symbols(used, *bases): + used = set(used) + for base in bases: + pool = itertools.chain((base,), + compat.itertools_imap(lambda i: base + str(i), + range(1000))) + for sym in pool: + if sym not in used: + used.add(sym) + yield sym + break + else: + raise NameError("exhausted namespace for symbol base %s" % base) + + +def map_bits(fn, n): + """Call the given function given each nonzero bit from n.""" + + while n: + b = n & (~n + 1) + yield fn(b) + n ^= b + + +def decorator(target): + """A signature-matching decorator factory.""" + + def decorate(fn): + if not inspect.isfunction(fn): + raise Exception("not a decoratable function") + spec = compat.inspect_getfullargspec(fn) + names = tuple(spec[0]) + spec[1:3] + (fn.__name__,) + targ_name, fn_name = _unique_symbols(names, 'target', 'fn') + + metadata = dict(target=targ_name, fn=fn_name) + metadata.update(format_argspec_plus(spec, grouped=False)) + metadata['name'] = fn.__name__ + code = """\ +def %(name)s(%(args)s): + return %(target)s(%(fn)s, %(apply_kw)s) +""" % metadata + decorated = _exec_code_in_env(code, + {targ_name: target, fn_name: fn}, + fn.__name__) + decorated.__defaults__ = getattr(fn, 'im_func', fn).__defaults__ + decorated.__wrapped__ = fn + return update_wrapper(decorated, fn) + return update_wrapper(decorate, target) + + +def _exec_code_in_env(code, env, fn_name): + exec(code, env) + return env[fn_name] + + +def public_factory(target, location): + """Produce a wrapping function for the given cls or classmethod. + + Rationale here is so that the __init__ method of the + class can serve as documentation for the function. + + """ + if isinstance(target, type): + fn = target.__init__ + callable_ = target + doc = "Construct a new :class:`.%s` object. \n\n"\ + "This constructor is mirrored as a public API function; "\ + "see :func:`~%s` "\ + "for a full usage and argument description." % ( + target.__name__, location, ) + else: + fn = callable_ = target + doc = "This function is mirrored; see :func:`~%s` "\ + "for a description of arguments." % location + + location_name = location.split(".")[-1] + spec = compat.inspect_getfullargspec(fn) + del spec[0][0] + metadata = format_argspec_plus(spec, grouped=False) + metadata['name'] = location_name + code = """\ +def %(name)s(%(args)s): + return cls(%(apply_kw)s) +""" % metadata + env = {'cls': callable_, 'symbol': symbol} + exec(code, env) + decorated = env[location_name] + decorated.__doc__ = fn.__doc__ + decorated.__module__ = "sqlalchemy" + location.rsplit(".", 1)[0] + if compat.py2k or hasattr(fn, '__func__'): + fn.__func__.__doc__ = doc + else: + fn.__doc__ = doc + return decorated + + +class PluginLoader(object): + + def __init__(self, group, auto_fn=None): + self.group = group + self.impls = {} + self.auto_fn = auto_fn + + def load(self, name): + if name in self.impls: + return self.impls[name]() + + if self.auto_fn: + loader = self.auto_fn(name) + if loader: + self.impls[name] = loader + return loader() + + try: + import pkg_resources + except ImportError: + pass + else: + for impl in pkg_resources.iter_entry_points( + self.group, name): + self.impls[name] = impl.load + return impl.load() + + raise exc.NoSuchModuleError( + "Can't load plugin: %s:%s" % + (self.group, name)) + + def register(self, name, modulepath, objname): + def load(): + mod = compat.import_(modulepath) + for token in modulepath.split(".")[1:]: + mod = getattr(mod, token) + return getattr(mod, objname) + self.impls[name] = load + + +def get_cls_kwargs(cls, _set=None): + r"""Return the full set of inherited kwargs for the given `cls`. + + Probes a class's __init__ method, collecting all named arguments. If the + __init__ defines a \**kwargs catch-all, then the constructor is presumed + to pass along unrecognized keywords to its base classes, and the + collection process is repeated recursively on each of the bases. + + Uses a subset of inspect.getargspec() to cut down on method overhead. + No anonymous tuple arguments please ! + + """ + toplevel = _set is None + if toplevel: + _set = set() + + ctr = cls.__dict__.get('__init__', False) + + has_init = ctr and isinstance(ctr, types.FunctionType) and \ + isinstance(ctr.__code__, types.CodeType) + + if has_init: + names, has_kw = inspect_func_args(ctr) + _set.update(names) + + if not has_kw and not toplevel: + return None + + if not has_init or has_kw: + for c in cls.__bases__: + if get_cls_kwargs(c, _set) is None: + break + + _set.discard('self') + return _set + + +try: + # TODO: who doesn't have this constant? + from inspect import CO_VARKEYWORDS + + def inspect_func_args(fn): + co = fn.__code__ + nargs = co.co_argcount + names = co.co_varnames + args = list(names[:nargs]) + has_kw = bool(co.co_flags & CO_VARKEYWORDS) + return args, has_kw + +except ImportError: + def inspect_func_args(fn): + names, _, has_kw, _ = inspect.getargspec(fn) + return names, bool(has_kw) + + +def get_func_kwargs(func): + """Return the set of legal kwargs for the given `func`. + + Uses getargspec so is safe to call for methods, functions, + etc. + + """ + + return compat.inspect_getargspec(func)[0] + + +def get_callable_argspec(fn, no_self=False, _is_init=False): + """Return the argument signature for any callable. + + All pure-Python callables are accepted, including + functions, methods, classes, objects with __call__; + builtins and other edge cases like functools.partial() objects + raise a TypeError. + + """ + if inspect.isbuiltin(fn): + raise TypeError("Can't inspect builtin: %s" % fn) + elif inspect.isfunction(fn): + if _is_init and no_self: + spec = compat.inspect_getargspec(fn) + return compat.ArgSpec(spec.args[1:], spec.varargs, + spec.keywords, spec.defaults) + else: + return compat.inspect_getargspec(fn) + elif inspect.ismethod(fn): + if no_self and (_is_init or fn.__self__): + spec = compat.inspect_getargspec(fn.__func__) + return compat.ArgSpec(spec.args[1:], spec.varargs, + spec.keywords, spec.defaults) + else: + return compat.inspect_getargspec(fn.__func__) + elif inspect.isclass(fn): + return get_callable_argspec( + fn.__init__, no_self=no_self, _is_init=True) + elif hasattr(fn, '__func__'): + return compat.inspect_getargspec(fn.__func__) + elif hasattr(fn, '__call__'): + if inspect.ismethod(fn.__call__): + return get_callable_argspec(fn.__call__, no_self=no_self) + else: + raise TypeError("Can't inspect callable: %s" % fn) + else: + raise TypeError("Can't inspect callable: %s" % fn) + + +def format_argspec_plus(fn, grouped=True): + """Returns a dictionary of formatted, introspected function arguments. + + A enhanced variant of inspect.formatargspec to support code generation. + + fn + An inspectable callable or tuple of inspect getargspec() results. + grouped + Defaults to True; include (parens, around, argument) lists + + Returns: + + args + Full inspect.formatargspec for fn + self_arg + The name of the first positional argument, varargs[0], or None + if the function defines no positional arguments. + apply_pos + args, re-written in calling rather than receiving syntax. Arguments are + passed positionally. + apply_kw + Like apply_pos, except keyword-ish args are passed as keywords. + + Example:: + + >>> format_argspec_plus(lambda self, a, b, c=3, **d: 123) + {'args': '(self, a, b, c=3, **d)', + 'self_arg': 'self', + 'apply_kw': '(self, a, b, c=c, **d)', + 'apply_pos': '(self, a, b, c, **d)'} + + """ + if compat.callable(fn): + spec = compat.inspect_getfullargspec(fn) + else: + # we accept an existing argspec... + spec = fn + args = inspect.formatargspec(*spec) + if spec[0]: + self_arg = spec[0][0] + elif spec[1]: + self_arg = '%s[0]' % spec[1] + else: + self_arg = None + + if compat.py3k: + apply_pos = inspect.formatargspec(spec[0], spec[1], + spec[2], None, spec[4]) + num_defaults = 0 + if spec[3]: + num_defaults += len(spec[3]) + if spec[4]: + num_defaults += len(spec[4]) + name_args = spec[0] + spec[4] + else: + apply_pos = inspect.formatargspec(spec[0], spec[1], spec[2]) + num_defaults = 0 + if spec[3]: + num_defaults += len(spec[3]) + name_args = spec[0] + + if num_defaults: + defaulted_vals = name_args[0 - num_defaults:] + else: + defaulted_vals = () + + apply_kw = inspect.formatargspec(name_args, spec[1], spec[2], + defaulted_vals, + formatvalue=lambda x: '=' + x) + if grouped: + return dict(args=args, self_arg=self_arg, + apply_pos=apply_pos, apply_kw=apply_kw) + else: + return dict(args=args[1:-1], self_arg=self_arg, + apply_pos=apply_pos[1:-1], apply_kw=apply_kw[1:-1]) + + +def format_argspec_init(method, grouped=True): + """format_argspec_plus with considerations for typical __init__ methods + + Wraps format_argspec_plus with error handling strategies for typical + __init__ cases:: + + object.__init__ -> (self) + other unreflectable (usually C) -> (self, *args, **kwargs) + + """ + if method is object.__init__: + args = grouped and '(self)' or 'self' + else: + try: + return format_argspec_plus(method, grouped=grouped) + except TypeError: + args = (grouped and '(self, *args, **kwargs)' + or 'self, *args, **kwargs') + return dict(self_arg='self', args=args, apply_pos=args, apply_kw=args) + + +def getargspec_init(method): + """inspect.getargspec with considerations for typical __init__ methods + + Wraps inspect.getargspec with error handling for typical __init__ cases:: + + object.__init__ -> (self) + other unreflectable (usually C) -> (self, *args, **kwargs) + + """ + try: + return compat.inspect_getargspec(method) + except TypeError: + if method is object.__init__: + return (['self'], None, None, None) + else: + return (['self'], 'args', 'kwargs', None) + + +def unbound_method_to_callable(func_or_cls): + """Adjust the incoming callable such that a 'self' argument is not + required. + + """ + + if isinstance(func_or_cls, types.MethodType) and not func_or_cls.__self__: + return func_or_cls.__func__ + else: + return func_or_cls + + +def generic_repr(obj, additional_kw=(), to_inspect=None, omit_kwarg=()): + """Produce a __repr__() based on direct association of the __init__() + specification vs. same-named attributes present. + + """ + if to_inspect is None: + to_inspect = [obj] + else: + to_inspect = _collections.to_list(to_inspect) + + missing = object() + + pos_args = [] + kw_args = _collections.OrderedDict() + vargs = None + for i, insp in enumerate(to_inspect): + try: + (_args, _vargs, vkw, defaults) = \ + compat.inspect_getargspec(insp.__init__) + except TypeError: + continue + else: + default_len = defaults and len(defaults) or 0 + if i == 0: + if _vargs: + vargs = _vargs + if default_len: + pos_args.extend(_args[1:-default_len]) + else: + pos_args.extend(_args[1:]) + else: + kw_args.update([ + (arg, missing) for arg in _args[1:-default_len] + ]) + + if default_len: + kw_args.update([ + (arg, default) + for arg, default + in zip(_args[-default_len:], defaults) + ]) + output = [] + + output.extend(repr(getattr(obj, arg, None)) for arg in pos_args) + + if vargs is not None and hasattr(obj, vargs): + output.extend([repr(val) for val in getattr(obj, vargs)]) + + for arg, defval in kw_args.items(): + if arg in omit_kwarg: + continue + try: + val = getattr(obj, arg, missing) + if val is not missing and val != defval: + output.append('%s=%r' % (arg, val)) + except Exception: + pass + + if additional_kw: + for arg, defval in additional_kw: + try: + val = getattr(obj, arg, missing) + if val is not missing and val != defval: + output.append('%s=%r' % (arg, val)) + except Exception: + pass + + return "%s(%s)" % (obj.__class__.__name__, ", ".join(output)) + + +class portable_instancemethod(object): + """Turn an instancemethod into a (parent, name) pair + to produce a serializable callable. + + """ + + __slots__ = 'target', 'name', 'kwargs', '__weakref__' + + def __getstate__(self): + return {'target': self.target, 'name': self.name, + 'kwargs': self.kwargs} + + def __setstate__(self, state): + self.target = state['target'] + self.name = state['name'] + self.kwargs = state.get('kwargs', ()) + + def __init__(self, meth, kwargs=()): + self.target = meth.__self__ + self.name = meth.__name__ + self.kwargs = kwargs + + def __call__(self, *arg, **kw): + kw.update(self.kwargs) + return getattr(self.target, self.name)(*arg, **kw) + + +def class_hierarchy(cls): + """Return an unordered sequence of all classes related to cls. + + Traverses diamond hierarchies. + + Fibs slightly: subclasses of builtin types are not returned. Thus + class_hierarchy(class A(object)) returns (A, object), not A plus every + class systemwide that derives from object. + + Old-style classes are discarded and hierarchies rooted on them + will not be descended. + + """ + if compat.py2k: + if isinstance(cls, types.ClassType): + return list() + + hier = set([cls]) + process = list(cls.__mro__) + while process: + c = process.pop() + if compat.py2k: + if isinstance(c, types.ClassType): + continue + bases = (_ for _ in c.__bases__ + if _ not in hier and not isinstance(_, types.ClassType)) + else: + bases = (_ for _ in c.__bases__ if _ not in hier) + + for b in bases: + process.append(b) + hier.add(b) + + if compat.py3k: + if c.__module__ == 'builtins' or not hasattr(c, '__subclasses__'): + continue + else: + if c.__module__ == '__builtin__' or not hasattr( + c, '__subclasses__'): + continue + + for s in [_ for _ in c.__subclasses__() if _ not in hier]: + process.append(s) + hier.add(s) + return list(hier) + + +def iterate_attributes(cls): + """iterate all the keys and attributes associated + with a class, without using getattr(). + + Does not use getattr() so that class-sensitive + descriptors (i.e. property.__get__()) are not called. + + """ + keys = dir(cls) + for key in keys: + for c in cls.__mro__: + if key in c.__dict__: + yield (key, c.__dict__[key]) + break + + +def monkeypatch_proxied_specials(into_cls, from_cls, skip=None, only=None, + name='self.proxy', from_instance=None): + """Automates delegation of __specials__ for a proxying type.""" + + if only: + dunders = only + else: + if skip is None: + skip = ('__slots__', '__del__', '__getattribute__', + '__metaclass__', '__getstate__', '__setstate__') + dunders = [m for m in dir(from_cls) + if (m.startswith('__') and m.endswith('__') and + not hasattr(into_cls, m) and m not in skip)] + + for method in dunders: + try: + fn = getattr(from_cls, method) + if not hasattr(fn, '__call__'): + continue + fn = getattr(fn, 'im_func', fn) + except AttributeError: + continue + try: + spec = compat.inspect_getargspec(fn) + fn_args = inspect.formatargspec(spec[0]) + d_args = inspect.formatargspec(spec[0][1:]) + except TypeError: + fn_args = '(self, *args, **kw)' + d_args = '(*args, **kw)' + + py = ("def %(method)s%(fn_args)s: " + "return %(name)s.%(method)s%(d_args)s" % locals()) + + env = from_instance is not None and {name: from_instance} or {} + compat.exec_(py, env) + try: + env[method].__defaults__ = fn.__defaults__ + except AttributeError: + pass + setattr(into_cls, method, env[method]) + + +def methods_equivalent(meth1, meth2): + """Return True if the two methods are the same implementation.""" + + return getattr(meth1, '__func__', meth1) is getattr( + meth2, '__func__', meth2) + + +def as_interface(obj, cls=None, methods=None, required=None): + """Ensure basic interface compliance for an instance or dict of callables. + + Checks that ``obj`` implements public methods of ``cls`` or has members + listed in ``methods``. If ``required`` is not supplied, implementing at + least one interface method is sufficient. Methods present on ``obj`` that + are not in the interface are ignored. + + If ``obj`` is a dict and ``dict`` does not meet the interface + requirements, the keys of the dictionary are inspected. Keys present in + ``obj`` that are not in the interface will raise TypeErrors. + + Raises TypeError if ``obj`` does not meet the interface criteria. + + In all passing cases, an object with callable members is returned. In the + simple case, ``obj`` is returned as-is; if dict processing kicks in then + an anonymous class is returned. + + obj + A type, instance, or dictionary of callables. + cls + Optional, a type. All public methods of cls are considered the + interface. An ``obj`` instance of cls will always pass, ignoring + ``required``.. + methods + Optional, a sequence of method names to consider as the interface. + required + Optional, a sequence of mandatory implementations. If omitted, an + ``obj`` that provides at least one interface method is considered + sufficient. As a convenience, required may be a type, in which case + all public methods of the type are required. + + """ + if not cls and not methods: + raise TypeError('a class or collection of method names are required') + + if isinstance(cls, type) and isinstance(obj, cls): + return obj + + interface = set(methods or [m for m in dir(cls) if not m.startswith('_')]) + implemented = set(dir(obj)) + + complies = operator.ge + if isinstance(required, type): + required = interface + elif not required: + required = set() + complies = operator.gt + else: + required = set(required) + + if complies(implemented.intersection(interface), required): + return obj + + # No dict duck typing here. + if not isinstance(obj, dict): + qualifier = complies is operator.gt and 'any of' or 'all of' + raise TypeError("%r does not implement %s: %s" % ( + obj, qualifier, ', '.join(interface))) + + class AnonymousInterface(object): + """A callable-holding shell.""" + + if cls: + AnonymousInterface.__name__ = 'Anonymous' + cls.__name__ + found = set() + + for method, impl in dictlike_iteritems(obj): + if method not in interface: + raise TypeError("%r: unknown in this interface" % method) + if not compat.callable(impl): + raise TypeError("%r=%r is not callable" % (method, impl)) + setattr(AnonymousInterface, method, staticmethod(impl)) + found.add(method) + + if complies(found, required): + return AnonymousInterface + + raise TypeError("dictionary does not contain required keys %s" % + ', '.join(required - found)) + + +class memoized_property(object): + """A read-only @property that is only evaluated once.""" + + def __init__(self, fget, doc=None): + self.fget = fget + self.__doc__ = doc or fget.__doc__ + self.__name__ = fget.__name__ + + def __get__(self, obj, cls): + if obj is None: + return self + obj.__dict__[self.__name__] = result = self.fget(obj) + return result + + def _reset(self, obj): + memoized_property.reset(obj, self.__name__) + + @classmethod + def reset(cls, obj, name): + obj.__dict__.pop(name, None) + + +def memoized_instancemethod(fn): + """Decorate a method memoize its return value. + + Best applied to no-arg methods: memoization is not sensitive to + argument values, and will always return the same value even when + called with different arguments. + + """ + + def oneshot(self, *args, **kw): + result = fn(self, *args, **kw) + memo = lambda *a, **kw: result + memo.__name__ = fn.__name__ + memo.__doc__ = fn.__doc__ + self.__dict__[fn.__name__] = memo + return result + return update_wrapper(oneshot, fn) + + +class group_expirable_memoized_property(object): + """A family of @memoized_properties that can be expired in tandem.""" + + def __init__(self, attributes=()): + self.attributes = [] + if attributes: + self.attributes.extend(attributes) + + def expire_instance(self, instance): + """Expire all memoized properties for *instance*.""" + stash = instance.__dict__ + for attribute in self.attributes: + stash.pop(attribute, None) + + def __call__(self, fn): + self.attributes.append(fn.__name__) + return memoized_property(fn) + + def method(self, fn): + self.attributes.append(fn.__name__) + return memoized_instancemethod(fn) + + +class MemoizedSlots(object): + """Apply memoized items to an object using a __getattr__ scheme. + + This allows the functionality of memoized_property and + memoized_instancemethod to be available to a class using __slots__. + + """ + + __slots__ = () + + def _fallback_getattr(self, key): + raise AttributeError(key) + + def __getattr__(self, key): + if key.startswith('_memoized'): + raise AttributeError(key) + elif hasattr(self, '_memoized_attr_%s' % key): + value = getattr(self, '_memoized_attr_%s' % key)() + setattr(self, key, value) + return value + elif hasattr(self, '_memoized_method_%s' % key): + fn = getattr(self, '_memoized_method_%s' % key) + + def oneshot(*args, **kw): + result = fn(*args, **kw) + memo = lambda *a, **kw: result + memo.__name__ = fn.__name__ + memo.__doc__ = fn.__doc__ + setattr(self, key, memo) + return result + oneshot.__doc__ = fn.__doc__ + return oneshot + else: + return self._fallback_getattr(key) + + +def dependency_for(modulename): + def decorate(obj): + # TODO: would be nice to improve on this import silliness, + # unfortunately importlib doesn't work that great either + tokens = modulename.split(".") + mod = compat.import_( + ".".join(tokens[0:-1]), globals(), locals(), tokens[-1]) + mod = getattr(mod, tokens[-1]) + setattr(mod, obj.__name__, obj) + return obj + return decorate + + +class dependencies(object): + """Apply imported dependencies as arguments to a function. + + E.g.:: + + @util.dependencies( + "sqlalchemy.sql.widget", + "sqlalchemy.engine.default" + ); + def some_func(self, widget, default, arg1, arg2, **kw): + # ... + + Rationale is so that the impact of a dependency cycle can be + associated directly with the few functions that cause the cycle, + and not pollute the module-level namespace. + + """ + + def __init__(self, *deps): + self.import_deps = [] + for dep in deps: + tokens = dep.split(".") + self.import_deps.append( + dependencies._importlater( + ".".join(tokens[0:-1]), + tokens[-1] + ) + ) + + def __call__(self, fn): + import_deps = self.import_deps + spec = compat.inspect_getfullargspec(fn) + + spec_zero = list(spec[0]) + hasself = spec_zero[0] in ('self', 'cls') + + for i in range(len(import_deps)): + spec[0][i + (1 if hasself else 0)] = "import_deps[%r]" % i + + inner_spec = format_argspec_plus(spec, grouped=False) + + for impname in import_deps: + del spec_zero[1 if hasself else 0] + spec[0][:] = spec_zero + + outer_spec = format_argspec_plus(spec, grouped=False) + + code = 'lambda %(args)s: fn(%(apply_kw)s)' % { + "args": outer_spec['args'], + "apply_kw": inner_spec['apply_kw'] + } + + decorated = eval(code, locals()) + decorated.__defaults__ = getattr(fn, 'im_func', fn).__defaults__ + return update_wrapper(decorated, fn) + + @classmethod + def resolve_all(cls, path): + for m in list(dependencies._unresolved): + if m._full_path.startswith(path): + m._resolve() + + _unresolved = set() + _by_key = {} + + class _importlater(object): + _unresolved = set() + + _by_key = {} + + def __new__(cls, path, addtl): + key = path + "." + addtl + if key in dependencies._by_key: + return dependencies._by_key[key] + else: + dependencies._by_key[key] = imp = object.__new__(cls) + return imp + + def __init__(self, path, addtl): + self._il_path = path + self._il_addtl = addtl + dependencies._unresolved.add(self) + + @property + def _full_path(self): + return self._il_path + "." + self._il_addtl + + @memoized_property + def module(self): + if self in dependencies._unresolved: + raise ImportError( + "importlater.resolve_all() hasn't " + "been called (this is %s %s)" + % (self._il_path, self._il_addtl)) + + return getattr(self._initial_import, self._il_addtl) + + def _resolve(self): + dependencies._unresolved.discard(self) + self._initial_import = compat.import_( + self._il_path, globals(), locals(), + [self._il_addtl]) + + def __getattr__(self, key): + if key == 'module': + raise ImportError("Could not resolve module %s" + % self._full_path) + try: + attr = getattr(self.module, key) + except AttributeError: + raise AttributeError( + "Module %s has no attribute '%s'" % + (self._full_path, key) + ) + self.__dict__[key] = attr + return attr + + +# from paste.deploy.converters +def asbool(obj): + if isinstance(obj, compat.string_types): + obj = obj.strip().lower() + if obj in ['true', 'yes', 'on', 'y', 't', '1']: + return True + elif obj in ['false', 'no', 'off', 'n', 'f', '0']: + return False + else: + raise ValueError("String is not true/false: %r" % obj) + return bool(obj) + + +def bool_or_str(*text): + """Return a callable that will evaluate a string as + boolean, or one of a set of "alternate" string values. + + """ + def bool_or_value(obj): + if obj in text: + return obj + else: + return asbool(obj) + return bool_or_value + + +def asint(value): + """Coerce to integer.""" + + if value is None: + return value + return int(value) + + +def coerce_kw_type(kw, key, type_, flexi_bool=True): + r"""If 'key' is present in dict 'kw', coerce its value to type 'type\_' if + necessary. If 'flexi_bool' is True, the string '0' is considered false + when coercing to boolean. + """ + + if key in kw and not isinstance(kw[key], type_) and kw[key] is not None: + if type_ is bool and flexi_bool: + kw[key] = asbool(kw[key]) + else: + kw[key] = type_(kw[key]) + + +def constructor_copy(obj, cls, *args, **kw): + """Instantiate cls using the __dict__ of obj as constructor arguments. + + Uses inspect to match the named arguments of ``cls``. + + """ + + names = get_cls_kwargs(cls) + kw.update( + (k, obj.__dict__[k]) for k in names.difference(kw) + if k in obj.__dict__) + return cls(*args, **kw) + + +def counter(): + """Return a threadsafe counter function.""" + + lock = compat.threading.Lock() + counter = itertools.count(1) + + # avoid the 2to3 "next" transformation... + def _next(): + lock.acquire() + try: + return next(counter) + finally: + lock.release() + + return _next + + +def duck_type_collection(specimen, default=None): + """Given an instance or class, guess if it is or is acting as one of + the basic collection types: list, set and dict. If the __emulates__ + property is present, return that preferentially. + """ + + if hasattr(specimen, '__emulates__'): + # canonicalize set vs sets.Set to a standard: the builtin set + if (specimen.__emulates__ is not None and + issubclass(specimen.__emulates__, set)): + return set + else: + return specimen.__emulates__ + + isa = isinstance(specimen, type) and issubclass or isinstance + if isa(specimen, list): + return list + elif isa(specimen, set): + return set + elif isa(specimen, dict): + return dict + + if hasattr(specimen, 'append'): + return list + elif hasattr(specimen, 'add'): + return set + elif hasattr(specimen, 'set'): + return dict + else: + return default + + +def assert_arg_type(arg, argtype, name): + if isinstance(arg, argtype): + return arg + else: + if isinstance(argtype, tuple): + raise exc.ArgumentError( + "Argument '%s' is expected to be one of type %s, got '%s'" % + (name, ' or '.join("'%s'" % a for a in argtype), type(arg))) + else: + raise exc.ArgumentError( + "Argument '%s' is expected to be of type '%s', got '%s'" % + (name, argtype, type(arg))) + + +def dictlike_iteritems(dictlike): + """Return a (key, value) iterator for almost any dict-like object.""" + + if compat.py3k: + if hasattr(dictlike, 'items'): + return list(dictlike.items()) + else: + if hasattr(dictlike, 'iteritems'): + return dictlike.iteritems() + elif hasattr(dictlike, 'items'): + return iter(dictlike.items()) + + getter = getattr(dictlike, '__getitem__', getattr(dictlike, 'get', None)) + if getter is None: + raise TypeError( + "Object '%r' is not dict-like" % dictlike) + + if hasattr(dictlike, 'iterkeys'): + def iterator(): + for key in dictlike.iterkeys(): + yield key, getter(key) + return iterator() + elif hasattr(dictlike, 'keys'): + return iter((key, getter(key)) for key in dictlike.keys()) + else: + raise TypeError( + "Object '%r' is not dict-like" % dictlike) + + +class classproperty(property): + """A decorator that behaves like @property except that operates + on classes rather than instances. + + The decorator is currently special when using the declarative + module, but note that the + :class:`~.sqlalchemy.ext.declarative.declared_attr` + decorator should be used for this purpose with declarative. + + """ + + def __init__(self, fget, *arg, **kw): + super(classproperty, self).__init__(fget, *arg, **kw) + self.__doc__ = fget.__doc__ + + def __get__(desc, self, cls): + return desc.fget(cls) + + +class hybridproperty(object): + def __init__(self, func): + self.func = func + + def __get__(self, instance, owner): + if instance is None: + clsval = self.func(owner) + clsval.__doc__ = self.func.__doc__ + return clsval + else: + return self.func(instance) + + +class hybridmethod(object): + """Decorate a function as cls- or instance- level.""" + + def __init__(self, func): + self.func = func + + def __get__(self, instance, owner): + if instance is None: + return self.func.__get__(owner, owner.__class__) + else: + return self.func.__get__(instance, owner) + + +class _symbol(int): + def __new__(self, name, doc=None, canonical=None): + """Construct a new named symbol.""" + assert isinstance(name, compat.string_types) + if canonical is None: + canonical = hash(name) + v = int.__new__(_symbol, canonical) + v.name = name + if doc: + v.__doc__ = doc + return v + + def __reduce__(self): + return symbol, (self.name, "x", int(self)) + + def __str__(self): + return repr(self) + + def __repr__(self): + return "symbol(%r)" % self.name + +_symbol.__name__ = 'symbol' + + +class symbol(object): + """A constant symbol. + + >>> symbol('foo') is symbol('foo') + True + >>> symbol('foo') + + + A slight refinement of the MAGICCOOKIE=object() pattern. The primary + advantage of symbol() is its repr(). They are also singletons. + + Repeated calls of symbol('name') will all return the same instance. + + The optional ``doc`` argument assigns to ``__doc__``. This + is strictly so that Sphinx autoattr picks up the docstring we want + (it doesn't appear to pick up the in-module docstring if the datamember + is in a different module - autoattribute also blows up completely). + If Sphinx fixes/improves this then we would no longer need + ``doc`` here. + + """ + symbols = {} + _lock = compat.threading.Lock() + + def __new__(cls, name, doc=None, canonical=None): + cls._lock.acquire() + try: + sym = cls.symbols.get(name) + if sym is None: + cls.symbols[name] = sym = _symbol(name, doc, canonical) + return sym + finally: + symbol._lock.release() + + +_creation_order = 1 + + +def set_creation_order(instance): + """Assign a '_creation_order' sequence to the given instance. + + This allows multiple instances to be sorted in order of creation + (typically within a single thread; the counter is not particularly + threadsafe). + + """ + global _creation_order + instance._creation_order = _creation_order + _creation_order += 1 + + +def warn_exception(func, *args, **kwargs): + """executes the given function, catches all exceptions and converts to + a warning. + + """ + try: + return func(*args, **kwargs) + except Exception: + warn("%s('%s') ignored" % sys.exc_info()[0:2]) + + +def ellipses_string(value, len_=25): + try: + if len(value) > len_: + return "%s..." % value[0:len_] + else: + return value + except TypeError: + return value + + +class _hash_limit_string(compat.text_type): + """A string subclass that can only be hashed on a maximum amount + of unique values. + + This is used for warnings so that we can send out parameterized warnings + without the __warningregistry__ of the module, or the non-overridable + "once" registry within warnings.py, overloading memory, + + + """ + def __new__(cls, value, num, args): + interpolated = (value % args) + \ + (" (this warning may be suppressed after %d occurrences)" % num) + self = super(_hash_limit_string, cls).__new__(cls, interpolated) + self._hash = hash("%s_%d" % (value, hash(interpolated) % num)) + return self + + def __hash__(self): + return self._hash + + def __eq__(self, other): + return hash(self) == hash(other) + + +def warn(msg): + """Issue a warning. + + If msg is a string, :class:`.exc.SAWarning` is used as + the category. + + """ + warnings.warn(msg, exc.SAWarning, stacklevel=2) + + +def warn_limited(msg, args): + """Issue a warning with a paramterized string, limiting the number + of registrations. + + """ + if args: + msg = _hash_limit_string(msg, 10, args) + warnings.warn(msg, exc.SAWarning, stacklevel=2) + + +def only_once(fn): + """Decorate the given function to be a no-op after it is called exactly + once.""" + + once = [fn] + + def go(*arg, **kw): + if once: + once_fn = once.pop() + return once_fn(*arg, **kw) + + return go + + +_SQLA_RE = re.compile(r'sqlalchemy/([a-z_]+/){0,2}[a-z_]+\.py') +_UNITTEST_RE = re.compile(r'unit(?:2|test2?/)') + + +def chop_traceback(tb, exclude_prefix=_UNITTEST_RE, exclude_suffix=_SQLA_RE): + """Chop extraneous lines off beginning and end of a traceback. + + :param tb: + a list of traceback lines as returned by ``traceback.format_stack()`` + + :param exclude_prefix: + a regular expression object matching lines to skip at beginning of + ``tb`` + + :param exclude_suffix: + a regular expression object matching lines to skip at end of ``tb`` + """ + start = 0 + end = len(tb) - 1 + while start <= end and exclude_prefix.search(tb[start]): + start += 1 + while start <= end and exclude_suffix.search(tb[end]): + end -= 1 + return tb[start:end + 1] + +NoneType = type(None) + + +def attrsetter(attrname): + code = \ + "def set(obj, value):"\ + " obj.%s = value" % attrname + env = locals().copy() + exec(code, env) + return env['set'] + + +class EnsureKWArgType(type): + """Apply translation of functions to accept **kw arguments if they + don't already. + + """ + def __init__(cls, clsname, bases, clsdict): + fn_reg = cls.ensure_kwarg + if fn_reg: + for key in clsdict: + m = re.match(fn_reg, key) + if m: + fn = clsdict[key] + spec = compat.inspect_getargspec(fn) + if not spec.keywords: + clsdict[key] = wrapped = cls._wrap_w_kw(fn) + setattr(cls, key, wrapped) + super(EnsureKWArgType, cls).__init__(clsname, bases, clsdict) + + def _wrap_w_kw(self, fn): + + def wrap(*arg, **kw): + return fn(*arg) + return update_wrapper(wrap, fn) + + +def wrap_callable(wrapper, fn): + """Augment functools.update_wrapper() to work with objects with + a ``__call__()`` method. + + :param fn: + object with __call__ method + + """ + if hasattr(fn, '__name__'): + return update_wrapper(wrapper, fn) + else: + _f = wrapper + _f.__name__ = fn.__class__.__name__ + if hasattr(fn, '__module__'): + _f.__module__ = fn.__module__ + + if hasattr(fn.__call__, '__doc__') and fn.__call__.__doc__: + _f.__doc__ = fn.__call__.__doc__ + elif fn.__doc__: + _f.__doc__ = fn.__doc__ + + return _f diff --git a/app/lib/sqlalchemy/util/queue.py b/app/lib/sqlalchemy/util/queue.py new file mode 100644 index 0000000..fc13f2b --- /dev/null +++ b/app/lib/sqlalchemy/util/queue.py @@ -0,0 +1,199 @@ +# util/queue.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""An adaptation of Py2.3/2.4's Queue module which supports reentrant +behavior, using RLock instead of Lock for its mutex object. The +Queue object is used exclusively by the sqlalchemy.pool.QueuePool +class. + +This is to support the connection pool's usage of weakref callbacks to return +connections to the underlying Queue, which can in extremely +rare cases be invoked within the ``get()`` method of the Queue itself, +producing a ``put()`` inside the ``get()`` and therefore a reentrant +condition. + +""" + +from collections import deque +from time import time as _time +from .compat import threading + + +__all__ = ['Empty', 'Full', 'Queue'] + + +class Empty(Exception): + "Exception raised by Queue.get(block=0)/get_nowait()." + + pass + + +class Full(Exception): + "Exception raised by Queue.put(block=0)/put_nowait()." + + pass + + +class Queue: + def __init__(self, maxsize=0): + """Initialize a queue object with a given maximum size. + + If `maxsize` is <= 0, the queue size is infinite. + """ + + self._init(maxsize) + # mutex must be held whenever the queue is mutating. All methods + # that acquire mutex must release it before returning. mutex + # is shared between the two conditions, so acquiring and + # releasing the conditions also acquires and releases mutex. + self.mutex = threading.RLock() + # Notify not_empty whenever an item is added to the queue; a + # thread waiting to get is notified then. + self.not_empty = threading.Condition(self.mutex) + # Notify not_full whenever an item is removed from the queue; + # a thread waiting to put is notified then. + self.not_full = threading.Condition(self.mutex) + + def qsize(self): + """Return the approximate size of the queue (not reliable!).""" + + self.mutex.acquire() + n = self._qsize() + self.mutex.release() + return n + + def empty(self): + """Return True if the queue is empty, False otherwise (not + reliable!).""" + + self.mutex.acquire() + n = self._empty() + self.mutex.release() + return n + + def full(self): + """Return True if the queue is full, False otherwise (not + reliable!).""" + + self.mutex.acquire() + n = self._full() + self.mutex.release() + return n + + def put(self, item, block=True, timeout=None): + """Put an item into the queue. + + If optional args `block` is True and `timeout` is None (the + default), block if necessary until a free slot is + available. If `timeout` is a positive number, it blocks at + most `timeout` seconds and raises the ``Full`` exception if no + free slot was available within that time. Otherwise (`block` + is false), put an item on the queue if a free slot is + immediately available, else raise the ``Full`` exception + (`timeout` is ignored in that case). + """ + + self.not_full.acquire() + try: + if not block: + if self._full(): + raise Full + elif timeout is None: + while self._full(): + self.not_full.wait() + else: + if timeout < 0: + raise ValueError("'timeout' must be a positive number") + endtime = _time() + timeout + while self._full(): + remaining = endtime - _time() + if remaining <= 0.0: + raise Full + self.not_full.wait(remaining) + self._put(item) + self.not_empty.notify() + finally: + self.not_full.release() + + def put_nowait(self, item): + """Put an item into the queue without blocking. + + Only enqueue the item if a free slot is immediately available. + Otherwise raise the ``Full`` exception. + """ + return self.put(item, False) + + def get(self, block=True, timeout=None): + """Remove and return an item from the queue. + + If optional args `block` is True and `timeout` is None (the + default), block if necessary until an item is available. If + `timeout` is a positive number, it blocks at most `timeout` + seconds and raises the ``Empty`` exception if no item was + available within that time. Otherwise (`block` is false), + return an item if one is immediately available, else raise the + ``Empty`` exception (`timeout` is ignored in that case). + """ + self.not_empty.acquire() + try: + if not block: + if self._empty(): + raise Empty + elif timeout is None: + while self._empty(): + self.not_empty.wait() + else: + if timeout < 0: + raise ValueError("'timeout' must be a positive number") + endtime = _time() + timeout + while self._empty(): + remaining = endtime - _time() + if remaining <= 0.0: + raise Empty + self.not_empty.wait(remaining) + item = self._get() + self.not_full.notify() + return item + finally: + self.not_empty.release() + + def get_nowait(self): + """Remove and return an item from the queue without blocking. + + Only get an item if one is immediately available. Otherwise + raise the ``Empty`` exception. + """ + + return self.get(False) + + # Override these methods to implement other queue organizations + # (e.g. stack or priority queue). + # These will only be called with appropriate locks held + + # Initialize the queue representation + def _init(self, maxsize): + self.maxsize = maxsize + self.queue = deque() + + def _qsize(self): + return len(self.queue) + + # Check whether the queue is empty + def _empty(self): + return not self.queue + + # Check whether the queue is full + def _full(self): + return self.maxsize > 0 and len(self.queue) == self.maxsize + + # Put a new item in the queue + def _put(self, item): + self.queue.append(item) + + # Get an item from the queue + def _get(self): + return self.queue.popleft() diff --git a/app/lib/sqlalchemy/util/topological.py b/app/lib/sqlalchemy/util/topological.py new file mode 100644 index 0000000..18476fc --- /dev/null +++ b/app/lib/sqlalchemy/util/topological.py @@ -0,0 +1,100 @@ +# util/topological.py +# Copyright (C) 2005-2017 the SQLAlchemy authors and contributors +# +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +"""Topological sorting algorithms.""" + +from ..exc import CircularDependencyError +from .. import util + +__all__ = ['sort', 'sort_as_subsets', 'find_cycles'] + + +def sort_as_subsets(tuples, allitems, deterministic_order=False): + + edges = util.defaultdict(set) + for parent, child in tuples: + edges[child].add(parent) + + Set = util.OrderedSet if deterministic_order else set + + todo = Set(allitems) + + while todo: + output = Set() + for node in todo: + if todo.isdisjoint(edges[node]): + output.add(node) + + if not output: + raise CircularDependencyError( + "Circular dependency detected.", + find_cycles(tuples, allitems), + _gen_edges(edges) + ) + + todo.difference_update(output) + yield output + + +def sort(tuples, allitems, deterministic_order=False): + """sort the given list of items by dependency. + + 'tuples' is a list of tuples representing a partial ordering. + 'deterministic_order' keeps items within a dependency tier in list order. + """ + + for set_ in sort_as_subsets(tuples, allitems, deterministic_order): + for s in set_: + yield s + + +def find_cycles(tuples, allitems): + # adapted from: + # http://neopythonic.blogspot.com/2009/01/detecting-cycles-in-directed-graph.html + + edges = util.defaultdict(set) + for parent, child in tuples: + edges[parent].add(child) + nodes_to_test = set(edges) + + output = set() + + # we'd like to find all nodes that are + # involved in cycles, so we do the full + # pass through the whole thing for each + # node in the original list. + + # we can go just through parent edge nodes. + # if a node is only a child and never a parent, + # by definition it can't be part of a cycle. same + # if it's not in the edges at all. + for node in nodes_to_test: + stack = [node] + todo = nodes_to_test.difference(stack) + while stack: + top = stack[-1] + for node in edges[top]: + if node in stack: + cyc = stack[stack.index(node):] + todo.difference_update(cyc) + output.update(cyc) + + if node in todo: + stack.append(node) + todo.remove(node) + break + else: + node = stack.pop() + return output + + +def _gen_edges(edges): + return set([ + (right, left) + for left in edges + for right in edges[left] + ]) diff --git a/app/lib/virtualenv-15.1.0.dist-info/DESCRIPTION.rst b/app/lib/virtualenv-15.1.0.dist-info/DESCRIPTION.rst new file mode 100644 index 0000000..ad8ff24 --- /dev/null +++ b/app/lib/virtualenv-15.1.0.dist-info/DESCRIPTION.rst @@ -0,0 +1,66 @@ +Virtualenv +========== + +`Mailing list `_ | +`Issues `_ | +`Github `_ | +`PyPI `_ | +User IRC: #pypa +Dev IRC: #pypa-dev + +Introduction +------------ + +``virtualenv`` is a tool to create isolated Python environments. + +The basic problem being addressed is one of dependencies and versions, +and indirectly permissions. Imagine you have an application that +needs version 1 of LibFoo, but another application requires version +2. How can you use both these applications? If you install +everything into ``/usr/lib/python2.7/site-packages`` (or whatever your +platform's standard location is), it's easy to end up in a situation +where you unintentionally upgrade an application that shouldn't be +upgraded. + +Or more generally, what if you want to install an application *and +leave it be*? If an application works, any change in its libraries or +the versions of those libraries can break the application. + +Also, what if you can't install packages into the global +``site-packages`` directory? For instance, on a shared host. + +In all these cases, ``virtualenv`` can help you. It creates an +environment that has its own installation directories, that doesn't +share libraries with other virtualenv environments (and optionally +doesn't access the globally installed libraries either). + +.. comment: + +Release History +=============== + +15.1.0 (2016-11-15) +------------------- + +* Support Python 3.6. + +* Upgrade setuptools to 28.0.0. + +* Upgrade pip to 9.0.1. + +* Don't install pre-release versions of pip, setuptools, or wheel from PyPI. + + +15.0.3 (2016-08-05) +------------------- + +* Test for given python path actually being an executable *file*, #939 + +* Only search for copy actual existing Tcl/Tk directories (PR #937) + +* Generically search for correct Tcl/Tk version (PR #926, PR #933) + +* Upgrade setuptools to 22.0.5 + +`Full Changelog `_. + diff --git a/app/lib/virtualenv-15.1.0.dist-info/METADATA b/app/lib/virtualenv-15.1.0.dist-info/METADATA new file mode 100644 index 0000000..2484167 --- /dev/null +++ b/app/lib/virtualenv-15.1.0.dist-info/METADATA @@ -0,0 +1,87 @@ +Metadata-Version: 2.0 +Name: virtualenv +Version: 15.1.0 +Summary: Virtual Python Environment builder +Home-page: https://virtualenv.pypa.io/ +Author: Jannis Leidel, Carl Meyer and Brian Rosner +Author-email: python-virtualenv@groups.google.com +License: MIT +Keywords: setuptools deployment installation distutils +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +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 :: 3.5 + +Virtualenv +========== + +`Mailing list `_ | +`Issues `_ | +`Github `_ | +`PyPI `_ | +User IRC: #pypa +Dev IRC: #pypa-dev + +Introduction +------------ + +``virtualenv`` is a tool to create isolated Python environments. + +The basic problem being addressed is one of dependencies and versions, +and indirectly permissions. Imagine you have an application that +needs version 1 of LibFoo, but another application requires version +2. How can you use both these applications? If you install +everything into ``/usr/lib/python2.7/site-packages`` (or whatever your +platform's standard location is), it's easy to end up in a situation +where you unintentionally upgrade an application that shouldn't be +upgraded. + +Or more generally, what if you want to install an application *and +leave it be*? If an application works, any change in its libraries or +the versions of those libraries can break the application. + +Also, what if you can't install packages into the global +``site-packages`` directory? For instance, on a shared host. + +In all these cases, ``virtualenv`` can help you. It creates an +environment that has its own installation directories, that doesn't +share libraries with other virtualenv environments (and optionally +doesn't access the globally installed libraries either). + +.. comment: + +Release History +=============== + +15.1.0 (2016-11-15) +------------------- + +* Support Python 3.6. + +* Upgrade setuptools to 28.0.0. + +* Upgrade pip to 9.0.1. + +* Don't install pre-release versions of pip, setuptools, or wheel from PyPI. + + +15.0.3 (2016-08-05) +------------------- + +* Test for given python path actually being an executable *file*, #939 + +* Only search for copy actual existing Tcl/Tk directories (PR #937) + +* Generically search for correct Tcl/Tk version (PR #926, PR #933) + +* Upgrade setuptools to 22.0.5 + +`Full Changelog `_. + diff --git a/app/lib/virtualenv-15.1.0.dist-info/RECORD b/app/lib/virtualenv-15.1.0.dist-info/RECORD new file mode 100644 index 0000000..67af4b7 --- /dev/null +++ b/app/lib/virtualenv-15.1.0.dist-info/RECORD @@ -0,0 +1,16 @@ +virtualenv.py,sha256=RLUdapOdsMdI08LNZpNQKHs0_Og2HlW7Eg5l2loaqwI,99021 +virtualenv-15.1.0.dist-info/DESCRIPTION.rst,sha256=dZqgZ9h9pM5HRQ2_sT6pGEfkRNJHGEganV-rqxllSaQ,2037 +virtualenv-15.1.0.dist-info/METADATA,sha256=voSnmgASVBxq3aLdXwfYx5aqt02HQS8c_BlNo55G8nY,2860 +virtualenv-15.1.0.dist-info/RECORD,, +virtualenv-15.1.0.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110 +virtualenv-15.1.0.dist-info/entry_points.txt,sha256=9dyCcxYzN9Qg_2rMGt3qrWqQcGmFoUr4bGIlTxHJaZY,48 +virtualenv-15.1.0.dist-info/metadata.json,sha256=Qh5IZHl-kW5tlAb93-8umlpXCEfxwhQ5cqrLNKrHcdk,1151 +virtualenv-15.1.0.dist-info/top_level.txt,sha256=S3o2o0EDuQgoAzL5fq3yJvmfaSzlnF8tVfqgTLxqj1k,30 +virtualenv_support/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +virtualenv_support/argparse-1.4.0-py2.py3-none-any.whl,sha256=wxZH7baf09RlqEfqMVfTe-0flfGXYLEaR6qRwEtmYxQ,23000 +virtualenv_support/pip-9.0.1-py2.py3-none-any.whl,sha256=aQt2LAqEYMMDwInV0L4DT7FaXqK3W99WX0BCH1Qv77A,1254803 +virtualenv_support/setuptools-28.8.0-py2.py3-none-any.whl,sha256=LlnQaseY784pxWfuDgaHUU78pSmmZbjzZM9JfNENIbI,472830 +virtualenv_support/wheel-0.29.0-py2.py3-none-any.whl,sha256=6oAz_JkFgE5lL3VHTTNBCgdATBp43TyUmmaGO9EFDr0,66878 +/var/folders/z7/wt4t05zs4q743qnrmn9c0wt80000gn/T/tmpndp9fnzu/bin/virtualenv,sha256=o8vBD1L202vfGMfDZPzzJlnmF6vG7CxkcN1Dhtr_kMw,257 +virtualenv_support/__pycache__/__init__.cpython-34.pyc,, +__pycache__/virtualenv.cpython-34.pyc,, diff --git a/app/lib/virtualenv-15.1.0.dist-info/WHEEL b/app/lib/virtualenv-15.1.0.dist-info/WHEEL new file mode 100644 index 0000000..8b6dd1b --- /dev/null +++ b/app/lib/virtualenv-15.1.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.29.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/app/lib/virtualenv-15.1.0.dist-info/entry_points.txt b/app/lib/virtualenv-15.1.0.dist-info/entry_points.txt new file mode 100644 index 0000000..60fab42 --- /dev/null +++ b/app/lib/virtualenv-15.1.0.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +virtualenv = virtualenv:main + diff --git a/app/lib/virtualenv-15.1.0.dist-info/metadata.json b/app/lib/virtualenv-15.1.0.dist-info/metadata.json new file mode 100644 index 0000000..aa8c602 --- /dev/null +++ b/app/lib/virtualenv-15.1.0.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "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 :: 3.5"], "extensions": {"python.commands": {"wrap_console": {"virtualenv": "virtualenv:main"}}, "python.details": {"contacts": [{"email": "python-virtualenv@groups.google.com", "name": "Jannis Leidel, Carl Meyer and Brian Rosner", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://virtualenv.pypa.io/"}}, "python.exports": {"console_scripts": {"virtualenv": "virtualenv:main"}}}, "generator": "bdist_wheel (0.29.0)", "keywords": ["setuptools", "deployment", "installation", "distutils"], "license": "MIT", "metadata_version": "2.0", "name": "virtualenv", "summary": "Virtual Python Environment builder", "test_requires": [{"requires": ["mock", "pytest"]}], "version": "15.1.0"} \ No newline at end of file diff --git a/app/lib/virtualenv-15.1.0.dist-info/top_level.txt b/app/lib/virtualenv-15.1.0.dist-info/top_level.txt new file mode 100644 index 0000000..5b49e4c --- /dev/null +++ b/app/lib/virtualenv-15.1.0.dist-info/top_level.txt @@ -0,0 +1,2 @@ +virtualenv +virtualenv_support diff --git a/app/lib/virtualenv.py b/app/lib/virtualenv.py new file mode 100644 index 0000000..42cd1f4 --- /dev/null +++ b/app/lib/virtualenv.py @@ -0,0 +1,2332 @@ +#!/usr/bin/env python +"""Create a "virtual" Python installation""" + +import os +import sys + +# If we are running in a new interpreter to create a virtualenv, +# we do NOT want paths from our existing location interfering with anything, +# So we remove this file's directory from sys.path - most likely to be +# the previous interpreter's site-packages. Solves #705, #763, #779 +if os.environ.get('VIRTUALENV_INTERPRETER_RUNNING'): + for path in sys.path[:]: + if os.path.realpath(os.path.dirname(__file__)) == os.path.realpath(path): + sys.path.remove(path) + +import base64 +import codecs +import optparse +import re +import shutil +import logging +import zlib +import errno +import glob +import distutils.sysconfig +import struct +import subprocess +import pkgutil +import tempfile +import textwrap +from distutils.util import strtobool +from os.path import join + +try: + import ConfigParser +except ImportError: + import configparser as ConfigParser + +__version__ = "15.1.0" +virtualenv_version = __version__ # legacy + +if sys.version_info < (2, 6): + print('ERROR: %s' % sys.exc_info()[1]) + print('ERROR: this script requires Python 2.6 or greater.') + sys.exit(101) + +try: + basestring +except NameError: + basestring = str + +py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1]) + +is_jython = sys.platform.startswith('java') +is_pypy = hasattr(sys, 'pypy_version_info') +is_win = (sys.platform == 'win32') +is_cygwin = (sys.platform == 'cygwin') +is_darwin = (sys.platform == 'darwin') +abiflags = getattr(sys, 'abiflags', '') + +user_dir = os.path.expanduser('~') +if is_win: + default_storage_dir = os.path.join(user_dir, 'virtualenv') +else: + default_storage_dir = os.path.join(user_dir, '.virtualenv') +default_config_file = os.path.join(default_storage_dir, 'virtualenv.ini') + +if is_pypy: + expected_exe = 'pypy' +elif is_jython: + expected_exe = 'jython' +else: + expected_exe = 'python' + +# Return a mapping of version -> Python executable +# Only provided for Windows, where the information in the registry is used +if not is_win: + def get_installed_pythons(): + return {} +else: + try: + import winreg + except ImportError: + import _winreg as winreg + + def get_installed_pythons(): + try: + python_core = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, + "Software\\Python\\PythonCore") + except WindowsError: + # No registered Python installations + return {} + i = 0 + versions = [] + while True: + try: + versions.append(winreg.EnumKey(python_core, i)) + i = i + 1 + except WindowsError: + break + exes = dict() + for ver in versions: + try: + path = winreg.QueryValue(python_core, "%s\\InstallPath" % ver) + except WindowsError: + continue + exes[ver] = join(path, "python.exe") + + winreg.CloseKey(python_core) + + # Add the major versions + # Sort the keys, then repeatedly update the major version entry + # Last executable (i.e., highest version) wins with this approach + for ver in sorted(exes): + exes[ver[0]] = exes[ver] + + return exes + +REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath', + 'fnmatch', 'locale', 'encodings', 'codecs', + 'stat', 'UserDict', 'readline', 'copy_reg', 'types', + 're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile', + 'zlib'] + +REQUIRED_FILES = ['lib-dynload', 'config'] + +majver, minver = sys.version_info[:2] +if majver == 2: + if minver >= 6: + REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc']) + if minver >= 7: + REQUIRED_MODULES.extend(['_weakrefset']) +elif majver == 3: + # Some extra modules are needed for Python 3, but different ones + # for different versions. + REQUIRED_MODULES.extend([ + '_abcoll', 'warnings', 'linecache', 'abc', 'io', '_weakrefset', + 'copyreg', 'tempfile', 'random', '__future__', 'collections', + 'keyword', 'tarfile', 'shutil', 'struct', 'copy', 'tokenize', + 'token', 'functools', 'heapq', 'bisect', 'weakref', 'reprlib' + ]) + if minver >= 2: + REQUIRED_FILES[-1] = 'config-%s' % majver + if minver >= 3: + import sysconfig + platdir = sysconfig.get_config_var('PLATDIR') + REQUIRED_FILES.append(platdir) + REQUIRED_MODULES.extend([ + 'base64', '_dummy_thread', 'hashlib', 'hmac', + 'imp', 'importlib', 'rlcompleter' + ]) + if minver >= 4: + REQUIRED_MODULES.extend([ + 'operator', + '_collections_abc', + '_bootlocale', + ]) + if minver >= 6: + REQUIRED_MODULES.extend(['enum']) + +if is_pypy: + # these are needed to correctly display the exceptions that may happen + # during the bootstrap + REQUIRED_MODULES.extend(['traceback', 'linecache']) + + if majver == 3: + # _functools is needed to import locale during stdio initialization and + # needs to be copied on PyPy because it's not built in + REQUIRED_MODULES.append('_functools') + + +class Logger(object): + + """ + Logging object for use in command-line script. Allows ranges of + levels, to avoid some redundancy of displayed information. + """ + + DEBUG = logging.DEBUG + INFO = logging.INFO + NOTIFY = (logging.INFO+logging.WARN)/2 + WARN = WARNING = logging.WARN + ERROR = logging.ERROR + FATAL = logging.FATAL + + LEVELS = [DEBUG, INFO, NOTIFY, WARN, ERROR, FATAL] + + def __init__(self, consumers): + self.consumers = consumers + self.indent = 0 + self.in_progress = None + self.in_progress_hanging = False + + def debug(self, msg, *args, **kw): + self.log(self.DEBUG, msg, *args, **kw) + + def info(self, msg, *args, **kw): + self.log(self.INFO, msg, *args, **kw) + + def notify(self, msg, *args, **kw): + self.log(self.NOTIFY, msg, *args, **kw) + + def warn(self, msg, *args, **kw): + self.log(self.WARN, msg, *args, **kw) + + def error(self, msg, *args, **kw): + self.log(self.ERROR, msg, *args, **kw) + + def fatal(self, msg, *args, **kw): + self.log(self.FATAL, msg, *args, **kw) + + def log(self, level, msg, *args, **kw): + if args: + if kw: + raise TypeError( + "You may give positional or keyword arguments, not both") + args = args or kw + rendered = None + for consumer_level, consumer in self.consumers: + if self.level_matches(level, consumer_level): + if (self.in_progress_hanging + and consumer in (sys.stdout, sys.stderr)): + self.in_progress_hanging = False + sys.stdout.write('\n') + sys.stdout.flush() + if rendered is None: + if args: + rendered = msg % args + else: + rendered = msg + rendered = ' '*self.indent + rendered + if hasattr(consumer, 'write'): + consumer.write(rendered+'\n') + else: + consumer(rendered) + + def start_progress(self, msg): + assert not self.in_progress, ( + "Tried to start_progress(%r) while in_progress %r" + % (msg, self.in_progress)) + if self.level_matches(self.NOTIFY, self._stdout_level()): + sys.stdout.write(msg) + sys.stdout.flush() + self.in_progress_hanging = True + else: + self.in_progress_hanging = False + self.in_progress = msg + + def end_progress(self, msg='done.'): + assert self.in_progress, ( + "Tried to end_progress without start_progress") + if self.stdout_level_matches(self.NOTIFY): + if not self.in_progress_hanging: + # Some message has been printed out since start_progress + sys.stdout.write('...' + self.in_progress + msg + '\n') + sys.stdout.flush() + else: + sys.stdout.write(msg + '\n') + sys.stdout.flush() + self.in_progress = None + self.in_progress_hanging = False + + def show_progress(self): + """If we are in a progress scope, and no log messages have been + shown, write out another '.'""" + if self.in_progress_hanging: + sys.stdout.write('.') + sys.stdout.flush() + + def stdout_level_matches(self, level): + """Returns true if a message at this level will go to stdout""" + return self.level_matches(level, self._stdout_level()) + + def _stdout_level(self): + """Returns the level that stdout runs at""" + for level, consumer in self.consumers: + if consumer is sys.stdout: + return level + return self.FATAL + + def level_matches(self, level, consumer_level): + """ + >>> l = Logger([]) + >>> l.level_matches(3, 4) + False + >>> l.level_matches(3, 2) + True + >>> l.level_matches(slice(None, 3), 3) + False + >>> l.level_matches(slice(None, 3), 2) + True + >>> l.level_matches(slice(1, 3), 1) + True + >>> l.level_matches(slice(2, 3), 1) + False + """ + if isinstance(level, slice): + start, stop = level.start, level.stop + if start is not None and start > consumer_level: + return False + if stop is not None and stop <= consumer_level: + return False + return True + else: + return level >= consumer_level + + @classmethod + def level_for_integer(cls, level): + levels = cls.LEVELS + if level < 0: + return levels[0] + if level >= len(levels): + return levels[-1] + return levels[level] + +# create a silent logger just to prevent this from being undefined +# will be overridden with requested verbosity main() is called. +logger = Logger([(Logger.LEVELS[-1], sys.stdout)]) + +def mkdir(path): + if not os.path.exists(path): + logger.info('Creating %s', path) + os.makedirs(path) + else: + logger.info('Directory %s already exists', path) + +def copyfileordir(src, dest, symlink=True): + if os.path.isdir(src): + shutil.copytree(src, dest, symlink) + else: + shutil.copy2(src, dest) + +def copyfile(src, dest, symlink=True): + if not os.path.exists(src): + # Some bad symlink in the src + logger.warn('Cannot find file %s (bad symlink)', src) + return + if os.path.exists(dest): + logger.debug('File %s already exists', dest) + return + if not os.path.exists(os.path.dirname(dest)): + logger.info('Creating parent directories for %s', os.path.dirname(dest)) + os.makedirs(os.path.dirname(dest)) + if not os.path.islink(src): + srcpath = os.path.abspath(src) + else: + srcpath = os.readlink(src) + if symlink and hasattr(os, 'symlink') and not is_win: + logger.info('Symlinking %s', dest) + try: + os.symlink(srcpath, dest) + except (OSError, NotImplementedError): + logger.info('Symlinking failed, copying to %s', dest) + copyfileordir(src, dest, symlink) + else: + logger.info('Copying to %s', dest) + copyfileordir(src, dest, symlink) + +def writefile(dest, content, overwrite=True): + if not os.path.exists(dest): + logger.info('Writing %s', dest) + with open(dest, 'wb') as f: + f.write(content.encode('utf-8')) + return + else: + with open(dest, 'rb') as f: + c = f.read() + if c != content.encode("utf-8"): + if not overwrite: + logger.notify('File %s exists with different content; not overwriting', dest) + return + logger.notify('Overwriting %s with new content', dest) + with open(dest, 'wb') as f: + f.write(content.encode('utf-8')) + else: + logger.info('Content %s already in place', dest) + +def rmtree(dir): + if os.path.exists(dir): + logger.notify('Deleting tree %s', dir) + shutil.rmtree(dir) + else: + logger.info('Do not need to delete %s; already gone', dir) + +def make_exe(fn): + if hasattr(os, 'chmod'): + oldmode = os.stat(fn).st_mode & 0xFFF # 0o7777 + newmode = (oldmode | 0x16D) & 0xFFF # 0o555, 0o7777 + os.chmod(fn, newmode) + logger.info('Changed mode of %s to %s', fn, oct(newmode)) + +def _find_file(filename, dirs): + for dir in reversed(dirs): + files = glob.glob(os.path.join(dir, filename)) + if files and os.path.isfile(files[0]): + return True, files[0] + return False, filename + +def file_search_dirs(): + here = os.path.dirname(os.path.abspath(__file__)) + dirs = [here, join(here, 'virtualenv_support')] + if os.path.splitext(os.path.dirname(__file__))[0] != 'virtualenv': + # Probably some boot script; just in case virtualenv is installed... + try: + import virtualenv + except ImportError: + pass + else: + dirs.append(os.path.join( + os.path.dirname(virtualenv.__file__), 'virtualenv_support')) + return [d for d in dirs if os.path.isdir(d)] + + +class UpdatingDefaultsHelpFormatter(optparse.IndentedHelpFormatter): + """ + Custom help formatter for use in ConfigOptionParser that updates + the defaults before expanding them, allowing them to show up correctly + in the help listing + """ + def expand_default(self, option): + if self.parser is not None: + self.parser.update_defaults(self.parser.defaults) + return optparse.IndentedHelpFormatter.expand_default(self, option) + + +class ConfigOptionParser(optparse.OptionParser): + """ + Custom option parser which updates its defaults by checking the + configuration files and environmental variables + """ + def __init__(self, *args, **kwargs): + self.config = ConfigParser.RawConfigParser() + self.files = self.get_config_files() + self.config.read(self.files) + optparse.OptionParser.__init__(self, *args, **kwargs) + + def get_config_files(self): + config_file = os.environ.get('VIRTUALENV_CONFIG_FILE', False) + if config_file and os.path.exists(config_file): + return [config_file] + return [default_config_file] + + def update_defaults(self, defaults): + """ + Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists). + """ + # Then go and look for the other sources of configuration: + config = {} + # 1. config files + config.update(dict(self.get_config_section('virtualenv'))) + # 2. environmental variables + config.update(dict(self.get_environ_vars())) + # Then set the options with those values + for key, val in config.items(): + key = key.replace('_', '-') + if not key.startswith('--'): + key = '--%s' % key # only prefer long opts + option = self.get_option(key) + if option is not None: + # ignore empty values + if not val: + continue + # handle multiline configs + if option.action == 'append': + val = val.split() + else: + option.nargs = 1 + if option.action == 'store_false': + val = not strtobool(val) + elif option.action in ('store_true', 'count'): + val = strtobool(val) + try: + val = option.convert_value(key, val) + except optparse.OptionValueError: + e = sys.exc_info()[1] + print("An error occurred during configuration: %s" % e) + sys.exit(3) + defaults[option.dest] = val + return defaults + + def get_config_section(self, name): + """ + Get a section of a configuration + """ + if self.config.has_section(name): + return self.config.items(name) + return [] + + def get_environ_vars(self, prefix='VIRTUALENV_'): + """ + Returns a generator with all environmental vars with prefix VIRTUALENV + """ + for key, val in os.environ.items(): + if key.startswith(prefix): + yield (key.replace(prefix, '').lower(), val) + + def get_default_values(self): + """ + Overridding to make updating the defaults after instantiation of + the option parser possible, update_defaults() does the dirty work. + """ + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + defaults = self.update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + default = defaults.get(option.dest) + if isinstance(default, basestring): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + +def main(): + parser = ConfigOptionParser( + version=virtualenv_version, + usage="%prog [OPTIONS] DEST_DIR", + formatter=UpdatingDefaultsHelpFormatter()) + + parser.add_option( + '-v', '--verbose', + action='count', + dest='verbose', + default=0, + help="Increase verbosity.") + + parser.add_option( + '-q', '--quiet', + action='count', + dest='quiet', + default=0, + help='Decrease verbosity.') + + parser.add_option( + '-p', '--python', + dest='python', + metavar='PYTHON_EXE', + help='The Python interpreter to use, e.g., --python=python2.5 will use the python2.5 ' + 'interpreter to create the new environment. The default is the interpreter that ' + 'virtualenv was installed with (%s)' % sys.executable) + + parser.add_option( + '--clear', + dest='clear', + action='store_true', + help="Clear out the non-root install and start from scratch.") + + parser.set_defaults(system_site_packages=False) + parser.add_option( + '--no-site-packages', + dest='system_site_packages', + action='store_false', + help="DEPRECATED. Retained only for backward compatibility. " + "Not having access to global site-packages is now the default behavior.") + + parser.add_option( + '--system-site-packages', + dest='system_site_packages', + action='store_true', + help="Give the virtual environment access to the global site-packages.") + + parser.add_option( + '--always-copy', + dest='symlink', + action='store_false', + default=True, + help="Always copy files rather than symlinking.") + + parser.add_option( + '--unzip-setuptools', + dest='unzip_setuptools', + action='store_true', + help="Unzip Setuptools when installing it.") + + parser.add_option( + '--relocatable', + dest='relocatable', + action='store_true', + help='Make an EXISTING virtualenv environment relocatable. ' + 'This fixes up scripts and makes all .pth files relative.') + + parser.add_option( + '--no-setuptools', + dest='no_setuptools', + action='store_true', + help='Do not install setuptools in the new virtualenv.') + + parser.add_option( + '--no-pip', + dest='no_pip', + action='store_true', + help='Do not install pip in the new virtualenv.') + + parser.add_option( + '--no-wheel', + dest='no_wheel', + action='store_true', + help='Do not install wheel in the new virtualenv.') + + default_search_dirs = file_search_dirs() + parser.add_option( + '--extra-search-dir', + dest="search_dirs", + action="append", + metavar='DIR', + default=default_search_dirs, + help="Directory to look for setuptools/pip distributions in. " + "This option can be used multiple times.") + + parser.add_option( + "--download", + dest="download", + default=True, + action="store_true", + help="Download preinstalled packages from PyPI.", + ) + + parser.add_option( + "--no-download", + '--never-download', + dest="download", + action="store_false", + help="Do not download preinstalled packages from PyPI.", + ) + + parser.add_option( + '--prompt', + dest='prompt', + help='Provides an alternative prompt prefix for this environment.') + + parser.add_option( + '--setuptools', + dest='setuptools', + action='store_true', + help="DEPRECATED. Retained only for backward compatibility. This option has no effect.") + + parser.add_option( + '--distribute', + dest='distribute', + action='store_true', + help="DEPRECATED. Retained only for backward compatibility. This option has no effect.") + + if 'extend_parser' in globals(): + extend_parser(parser) + + options, args = parser.parse_args() + + global logger + + if 'adjust_options' in globals(): + adjust_options(options, args) + + verbosity = options.verbose - options.quiet + logger = Logger([(Logger.level_for_integer(2 - verbosity), sys.stdout)]) + + if options.python and not os.environ.get('VIRTUALENV_INTERPRETER_RUNNING'): + env = os.environ.copy() + interpreter = resolve_interpreter(options.python) + if interpreter == sys.executable: + logger.warn('Already using interpreter %s' % interpreter) + else: + logger.notify('Running virtualenv with interpreter %s' % interpreter) + env['VIRTUALENV_INTERPRETER_RUNNING'] = 'true' + file = __file__ + if file.endswith('.pyc'): + file = file[:-1] + popen = subprocess.Popen([interpreter, file] + sys.argv[1:], env=env) + raise SystemExit(popen.wait()) + + if not args: + print('You must provide a DEST_DIR') + parser.print_help() + sys.exit(2) + if len(args) > 1: + print('There must be only one argument: DEST_DIR (you gave %s)' % ( + ' '.join(args))) + parser.print_help() + sys.exit(2) + + home_dir = args[0] + + if os.path.exists(home_dir) and os.path.isfile(home_dir): + logger.fatal('ERROR: File already exists and is not a directory.') + logger.fatal('Please provide a different path or delete the file.') + sys.exit(3) + + if os.environ.get('WORKING_ENV'): + logger.fatal('ERROR: you cannot run virtualenv while in a workingenv') + logger.fatal('Please deactivate your workingenv, then re-run this script') + sys.exit(3) + + if 'PYTHONHOME' in os.environ: + logger.warn('PYTHONHOME is set. You *must* activate the virtualenv before using it') + del os.environ['PYTHONHOME'] + + if options.relocatable: + make_environment_relocatable(home_dir) + return + + create_environment(home_dir, + site_packages=options.system_site_packages, + clear=options.clear, + unzip_setuptools=options.unzip_setuptools, + prompt=options.prompt, + search_dirs=options.search_dirs, + download=options.download, + no_setuptools=options.no_setuptools, + no_pip=options.no_pip, + no_wheel=options.no_wheel, + symlink=options.symlink) + if 'after_install' in globals(): + after_install(options, home_dir) + +def call_subprocess(cmd, show_stdout=True, + filter_stdout=None, cwd=None, + raise_on_returncode=True, extra_env=None, + remove_from_env=None, stdin=None): + cmd_parts = [] + for part in cmd: + if len(part) > 45: + part = part[:20]+"..."+part[-20:] + if ' ' in part or '\n' in part or '"' in part or "'" in part: + part = '"%s"' % part.replace('"', '\\"') + if hasattr(part, 'decode'): + try: + part = part.decode(sys.getdefaultencoding()) + except UnicodeDecodeError: + part = part.decode(sys.getfilesystemencoding()) + cmd_parts.append(part) + cmd_desc = ' '.join(cmd_parts) + if show_stdout: + stdout = None + else: + stdout = subprocess.PIPE + logger.debug("Running command %s" % cmd_desc) + if extra_env or remove_from_env: + env = os.environ.copy() + if extra_env: + env.update(extra_env) + if remove_from_env: + for varname in remove_from_env: + env.pop(varname, None) + else: + env = None + try: + proc = subprocess.Popen( + cmd, stderr=subprocess.STDOUT, + stdin=None if stdin is None else subprocess.PIPE, + stdout=stdout, + cwd=cwd, env=env) + except Exception: + e = sys.exc_info()[1] + logger.fatal( + "Error %s while executing command %s" % (e, cmd_desc)) + raise + all_output = [] + if stdout is not None: + if stdin is not None: + proc.stdin.write(stdin) + proc.stdin.close() + + stdout = proc.stdout + encoding = sys.getdefaultencoding() + fs_encoding = sys.getfilesystemencoding() + while 1: + line = stdout.readline() + try: + line = line.decode(encoding) + except UnicodeDecodeError: + line = line.decode(fs_encoding) + if not line: + break + line = line.rstrip() + all_output.append(line) + if filter_stdout: + level = filter_stdout(line) + if isinstance(level, tuple): + level, line = level + logger.log(level, line) + if not logger.stdout_level_matches(level): + logger.show_progress() + else: + logger.info(line) + else: + proc.communicate(stdin) + proc.wait() + if proc.returncode: + if raise_on_returncode: + if all_output: + logger.notify('Complete output from command %s:' % cmd_desc) + logger.notify('\n'.join(all_output) + '\n----------------------------------------') + raise OSError( + "Command %s failed with error code %s" + % (cmd_desc, proc.returncode)) + else: + logger.warn( + "Command %s had error code %s" + % (cmd_desc, proc.returncode)) + +def filter_install_output(line): + if line.strip().startswith('running'): + return Logger.INFO + return Logger.DEBUG + +def find_wheels(projects, search_dirs): + """Find wheels from which we can import PROJECTS. + + Scan through SEARCH_DIRS for a wheel for each PROJECT in turn. Return + a list of the first wheel found for each PROJECT + """ + + wheels = [] + + # Look through SEARCH_DIRS for the first suitable wheel. Don't bother + # about version checking here, as this is simply to get something we can + # then use to install the correct version. + for project in projects: + for dirname in search_dirs: + # This relies on only having "universal" wheels available. + # The pattern could be tightened to require -py2.py3-none-any.whl. + files = glob.glob(os.path.join(dirname, project + '-*.whl')) + if files: + wheels.append(os.path.abspath(files[0])) + break + else: + # We're out of luck, so quit with a suitable error + logger.fatal('Cannot find a wheel for %s' % (project,)) + + return wheels + +def install_wheel(project_names, py_executable, search_dirs=None, + download=False): + if search_dirs is None: + search_dirs = file_search_dirs() + + wheels = find_wheels(['setuptools', 'pip'], search_dirs) + pythonpath = os.pathsep.join(wheels) + + # PIP_FIND_LINKS uses space as the path separator and thus cannot have paths + # with spaces in them. Convert any of those to local file:// URL form. + try: + from urlparse import urljoin + from urllib import pathname2url + except ImportError: + from urllib.parse import urljoin + from urllib.request import pathname2url + def space_path2url(p): + if ' ' not in p: + return p + return urljoin('file:', pathname2url(os.path.abspath(p))) + findlinks = ' '.join(space_path2url(d) for d in search_dirs) + + SCRIPT = textwrap.dedent(""" + import sys + import pkgutil + import tempfile + import os + + import pip + + cert_data = pkgutil.get_data("pip._vendor.requests", "cacert.pem") + if cert_data is not None: + cert_file = tempfile.NamedTemporaryFile(delete=False) + cert_file.write(cert_data) + cert_file.close() + else: + cert_file = None + + try: + args = ["install", "--ignore-installed"] + if cert_file is not None: + args += ["--cert", cert_file.name] + args += sys.argv[1:] + + sys.exit(pip.main(args)) + finally: + if cert_file is not None: + os.remove(cert_file.name) + """).encode("utf8") + + cmd = [py_executable, '-'] + project_names + logger.start_progress('Installing %s...' % (', '.join(project_names))) + logger.indent += 2 + + env = { + "PYTHONPATH": pythonpath, + "JYTHONPATH": pythonpath, # for Jython < 3.x + "PIP_FIND_LINKS": findlinks, + "PIP_USE_WHEEL": "1", + "PIP_ONLY_BINARY": ":all:", + "PIP_USER": "0", + } + + if not download: + env["PIP_NO_INDEX"] = "1" + + try: + call_subprocess(cmd, show_stdout=False, extra_env=env, stdin=SCRIPT) + finally: + logger.indent -= 2 + logger.end_progress() + + +def create_environment(home_dir, site_packages=False, clear=False, + unzip_setuptools=False, + prompt=None, search_dirs=None, download=False, + no_setuptools=False, no_pip=False, no_wheel=False, + symlink=True): + """ + Creates a new environment in ``home_dir``. + + If ``site_packages`` is true, then the global ``site-packages/`` + directory will be on the path. + + If ``clear`` is true (default False) then the environment will + first be cleared. + """ + home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir) + + py_executable = os.path.abspath(install_python( + home_dir, lib_dir, inc_dir, bin_dir, + site_packages=site_packages, clear=clear, symlink=symlink)) + + install_distutils(home_dir) + + to_install = [] + + if not no_setuptools: + to_install.append('setuptools') + + if not no_pip: + to_install.append('pip') + + if not no_wheel: + to_install.append('wheel') + + if to_install: + install_wheel( + to_install, + py_executable, + search_dirs, + download=download, + ) + + install_activate(home_dir, bin_dir, prompt) + + install_python_config(home_dir, bin_dir, prompt) + +def is_executable_file(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + +def path_locations(home_dir): + """Return the path locations for the environment (where libraries are, + where scripts go, etc)""" + home_dir = os.path.abspath(home_dir) + # XXX: We'd use distutils.sysconfig.get_python_inc/lib but its + # prefix arg is broken: http://bugs.python.org/issue3386 + if is_win: + # Windows has lots of problems with executables with spaces in + # the name; this function will remove them (using the ~1 + # format): + mkdir(home_dir) + if ' ' in home_dir: + import ctypes + GetShortPathName = ctypes.windll.kernel32.GetShortPathNameW + size = max(len(home_dir)+1, 256) + buf = ctypes.create_unicode_buffer(size) + try: + u = unicode + except NameError: + u = str + ret = GetShortPathName(u(home_dir), buf, size) + if not ret: + print('Error: the path "%s" has a space in it' % home_dir) + print('We could not determine the short pathname for it.') + print('Exiting.') + sys.exit(3) + home_dir = str(buf.value) + lib_dir = join(home_dir, 'Lib') + inc_dir = join(home_dir, 'Include') + bin_dir = join(home_dir, 'Scripts') + if is_jython: + lib_dir = join(home_dir, 'Lib') + inc_dir = join(home_dir, 'Include') + bin_dir = join(home_dir, 'bin') + elif is_pypy: + lib_dir = home_dir + inc_dir = join(home_dir, 'include') + bin_dir = join(home_dir, 'bin') + elif not is_win: + lib_dir = join(home_dir, 'lib', py_version) + inc_dir = join(home_dir, 'include', py_version + abiflags) + bin_dir = join(home_dir, 'bin') + return home_dir, lib_dir, inc_dir, bin_dir + + +def change_prefix(filename, dst_prefix): + prefixes = [sys.prefix] + + if is_darwin: + prefixes.extend(( + os.path.join("/Library/Python", sys.version[:3], "site-packages"), + os.path.join(sys.prefix, "Extras", "lib", "python"), + os.path.join("~", "Library", "Python", sys.version[:3], "site-packages"), + # Python 2.6 no-frameworks + os.path.join("~", ".local", "lib","python", sys.version[:3], "site-packages"), + # System Python 2.7 on OSX Mountain Lion + os.path.join("~", "Library", "Python", sys.version[:3], "lib", "python", "site-packages"))) + + if hasattr(sys, 'real_prefix'): + prefixes.append(sys.real_prefix) + if hasattr(sys, 'base_prefix'): + prefixes.append(sys.base_prefix) + prefixes = list(map(os.path.expanduser, prefixes)) + prefixes = list(map(os.path.abspath, prefixes)) + # Check longer prefixes first so we don't split in the middle of a filename + prefixes = sorted(prefixes, key=len, reverse=True) + filename = os.path.abspath(filename) + # On Windows, make sure drive letter is uppercase + if is_win and filename[0] in 'abcdefghijklmnopqrstuvwxyz': + filename = filename[0].upper() + filename[1:] + for i, prefix in enumerate(prefixes): + if is_win and prefix[0] in 'abcdefghijklmnopqrstuvwxyz': + prefixes[i] = prefix[0].upper() + prefix[1:] + for src_prefix in prefixes: + if filename.startswith(src_prefix): + _, relpath = filename.split(src_prefix, 1) + if src_prefix != os.sep: # sys.prefix == "/" + assert relpath[0] == os.sep + relpath = relpath[1:] + return join(dst_prefix, relpath) + assert False, "Filename %s does not start with any of these prefixes: %s" % \ + (filename, prefixes) + +def copy_required_modules(dst_prefix, symlink): + import imp + + for modname in REQUIRED_MODULES: + if modname in sys.builtin_module_names: + logger.info("Ignoring built-in bootstrap module: %s" % modname) + continue + try: + f, filename, _ = imp.find_module(modname) + except ImportError: + logger.info("Cannot import bootstrap module: %s" % modname) + else: + if f is not None: + f.close() + # special-case custom readline.so on OS X, but not for pypy: + if modname == 'readline' and sys.platform == 'darwin' and not ( + is_pypy or filename.endswith(join('lib-dynload', 'readline.so'))): + dst_filename = join(dst_prefix, 'lib', 'python%s' % sys.version[:3], 'readline.so') + elif modname == 'readline' and sys.platform == 'win32': + # special-case for Windows, where readline is not a + # standard module, though it may have been installed in + # site-packages by a third-party package + pass + else: + dst_filename = change_prefix(filename, dst_prefix) + copyfile(filename, dst_filename, symlink) + if filename.endswith('.pyc'): + pyfile = filename[:-1] + if os.path.exists(pyfile): + copyfile(pyfile, dst_filename[:-1], symlink) + +def copy_tcltk(src, dest, symlink): + """ copy tcl/tk libraries on Windows (issue #93) """ + for libversion in '8.5', '8.6': + for libname in 'tcl', 'tk': + srcdir = join(src, 'tcl', libname + libversion) + destdir = join(dest, 'tcl', libname + libversion) + # Only copy the dirs from the above combinations that exist + if os.path.exists(srcdir) and not os.path.exists(destdir): + copyfileordir(srcdir, destdir, symlink) + + +def subst_path(prefix_path, prefix, home_dir): + prefix_path = os.path.normpath(prefix_path) + prefix = os.path.normpath(prefix) + home_dir = os.path.normpath(home_dir) + if not prefix_path.startswith(prefix): + logger.warn('Path not in prefix %r %r', prefix_path, prefix) + return + return prefix_path.replace(prefix, home_dir, 1) + + +def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear, symlink=True): + """Install just the base environment, no distutils patches etc""" + if sys.executable.startswith(bin_dir): + print('Please use the *system* python to run this script') + return + + if clear: + rmtree(lib_dir) + ## FIXME: why not delete it? + ## Maybe it should delete everything with #!/path/to/venv/python in it + logger.notify('Not deleting %s', bin_dir) + + if hasattr(sys, 'real_prefix'): + logger.notify('Using real prefix %r' % sys.real_prefix) + prefix = sys.real_prefix + elif hasattr(sys, 'base_prefix'): + logger.notify('Using base prefix %r' % sys.base_prefix) + prefix = sys.base_prefix + else: + prefix = sys.prefix + mkdir(lib_dir) + fix_lib64(lib_dir, symlink) + stdlib_dirs = [os.path.dirname(os.__file__)] + if is_win: + stdlib_dirs.append(join(os.path.dirname(stdlib_dirs[0]), 'DLLs')) + elif is_darwin: + stdlib_dirs.append(join(stdlib_dirs[0], 'site-packages')) + if hasattr(os, 'symlink'): + logger.info('Symlinking Python bootstrap modules') + else: + logger.info('Copying Python bootstrap modules') + logger.indent += 2 + try: + # copy required files... + for stdlib_dir in stdlib_dirs: + if not os.path.isdir(stdlib_dir): + continue + for fn in os.listdir(stdlib_dir): + bn = os.path.splitext(fn)[0] + if fn != 'site-packages' and bn in REQUIRED_FILES: + copyfile(join(stdlib_dir, fn), join(lib_dir, fn), symlink) + # ...and modules + copy_required_modules(home_dir, symlink) + finally: + logger.indent -= 2 + # ...copy tcl/tk + if is_win: + copy_tcltk(prefix, home_dir, symlink) + mkdir(join(lib_dir, 'site-packages')) + import site + site_filename = site.__file__ + if site_filename.endswith('.pyc') or site_filename.endswith('.pyo'): + site_filename = site_filename[:-1] + elif site_filename.endswith('$py.class'): + site_filename = site_filename.replace('$py.class', '.py') + site_filename_dst = change_prefix(site_filename, home_dir) + site_dir = os.path.dirname(site_filename_dst) + writefile(site_filename_dst, SITE_PY) + writefile(join(site_dir, 'orig-prefix.txt'), prefix) + site_packages_filename = join(site_dir, 'no-global-site-packages.txt') + if not site_packages: + writefile(site_packages_filename, '') + + if is_pypy or is_win: + stdinc_dir = join(prefix, 'include') + else: + stdinc_dir = join(prefix, 'include', py_version + abiflags) + if os.path.exists(stdinc_dir): + copyfile(stdinc_dir, inc_dir, symlink) + else: + logger.debug('No include dir %s' % stdinc_dir) + + platinc_dir = distutils.sysconfig.get_python_inc(plat_specific=1) + if platinc_dir != stdinc_dir: + platinc_dest = distutils.sysconfig.get_python_inc( + plat_specific=1, prefix=home_dir) + if platinc_dir == platinc_dest: + # Do platinc_dest manually due to a CPython bug; + # not http://bugs.python.org/issue3386 but a close cousin + platinc_dest = subst_path(platinc_dir, prefix, home_dir) + if platinc_dest: + # PyPy's stdinc_dir and prefix are relative to the original binary + # (traversing virtualenvs), whereas the platinc_dir is relative to + # the inner virtualenv and ignores the prefix argument. + # This seems more evolved than designed. + copyfile(platinc_dir, platinc_dest, symlink) + + # pypy never uses exec_prefix, just ignore it + if sys.exec_prefix != prefix and not is_pypy: + if is_win: + exec_dir = join(sys.exec_prefix, 'lib') + elif is_jython: + exec_dir = join(sys.exec_prefix, 'Lib') + else: + exec_dir = join(sys.exec_prefix, 'lib', py_version) + for fn in os.listdir(exec_dir): + copyfile(join(exec_dir, fn), join(lib_dir, fn), symlink) + + if is_jython: + # Jython has either jython-dev.jar and javalib/ dir, or just + # jython.jar + for name in 'jython-dev.jar', 'javalib', 'jython.jar': + src = join(prefix, name) + if os.path.exists(src): + copyfile(src, join(home_dir, name), symlink) + # XXX: registry should always exist after Jython 2.5rc1 + src = join(prefix, 'registry') + if os.path.exists(src): + copyfile(src, join(home_dir, 'registry'), symlink=False) + copyfile(join(prefix, 'cachedir'), join(home_dir, 'cachedir'), + symlink=False) + + mkdir(bin_dir) + py_executable = join(bin_dir, os.path.basename(sys.executable)) + if 'Python.framework' in prefix: + # OS X framework builds cause validation to break + # https://github.com/pypa/virtualenv/issues/322 + if os.environ.get('__PYVENV_LAUNCHER__'): + del os.environ["__PYVENV_LAUNCHER__"] + if re.search(r'/Python(?:-32|-64)*$', py_executable): + # The name of the python executable is not quite what + # we want, rename it. + py_executable = os.path.join( + os.path.dirname(py_executable), 'python') + + logger.notify('New %s executable in %s', expected_exe, py_executable) + pcbuild_dir = os.path.dirname(sys.executable) + pyd_pth = os.path.join(lib_dir, 'site-packages', 'virtualenv_builddir_pyd.pth') + if is_win and os.path.exists(os.path.join(pcbuild_dir, 'build.bat')): + logger.notify('Detected python running from build directory %s', pcbuild_dir) + logger.notify('Writing .pth file linking to build directory for *.pyd files') + writefile(pyd_pth, pcbuild_dir) + else: + pcbuild_dir = None + if os.path.exists(pyd_pth): + logger.info('Deleting %s (not Windows env or not build directory python)' % pyd_pth) + os.unlink(pyd_pth) + + if sys.executable != py_executable: + ## FIXME: could I just hard link? + executable = sys.executable + shutil.copyfile(executable, py_executable) + make_exe(py_executable) + if is_win or is_cygwin: + pythonw = os.path.join(os.path.dirname(sys.executable), 'pythonw.exe') + if os.path.exists(pythonw): + logger.info('Also created pythonw.exe') + shutil.copyfile(pythonw, os.path.join(os.path.dirname(py_executable), 'pythonw.exe')) + python_d = os.path.join(os.path.dirname(sys.executable), 'python_d.exe') + python_d_dest = os.path.join(os.path.dirname(py_executable), 'python_d.exe') + if os.path.exists(python_d): + logger.info('Also created python_d.exe') + shutil.copyfile(python_d, python_d_dest) + elif os.path.exists(python_d_dest): + logger.info('Removed python_d.exe as it is no longer at the source') + os.unlink(python_d_dest) + # we need to copy the DLL to enforce that windows will load the correct one. + # may not exist if we are cygwin. + py_executable_dll = 'python%s%s.dll' % ( + sys.version_info[0], sys.version_info[1]) + py_executable_dll_d = 'python%s%s_d.dll' % ( + sys.version_info[0], sys.version_info[1]) + pythondll = os.path.join(os.path.dirname(sys.executable), py_executable_dll) + pythondll_d = os.path.join(os.path.dirname(sys.executable), py_executable_dll_d) + pythondll_d_dest = os.path.join(os.path.dirname(py_executable), py_executable_dll_d) + if os.path.exists(pythondll): + logger.info('Also created %s' % py_executable_dll) + shutil.copyfile(pythondll, os.path.join(os.path.dirname(py_executable), py_executable_dll)) + if os.path.exists(pythondll_d): + logger.info('Also created %s' % py_executable_dll_d) + shutil.copyfile(pythondll_d, pythondll_d_dest) + elif os.path.exists(pythondll_d_dest): + logger.info('Removed %s as the source does not exist' % pythondll_d_dest) + os.unlink(pythondll_d_dest) + if is_pypy: + # make a symlink python --> pypy-c + python_executable = os.path.join(os.path.dirname(py_executable), 'python') + if sys.platform in ('win32', 'cygwin'): + python_executable += '.exe' + logger.info('Also created executable %s' % python_executable) + copyfile(py_executable, python_executable, symlink) + + if is_win: + for name in ['libexpat.dll', 'libpypy.dll', 'libpypy-c.dll', + 'libeay32.dll', 'ssleay32.dll', 'sqlite3.dll', + 'tcl85.dll', 'tk85.dll']: + src = join(prefix, name) + if os.path.exists(src): + copyfile(src, join(bin_dir, name), symlink) + + for d in sys.path: + if d.endswith('lib_pypy'): + break + else: + logger.fatal('Could not find lib_pypy in sys.path') + raise SystemExit(3) + logger.info('Copying lib_pypy') + copyfile(d, os.path.join(home_dir, 'lib_pypy'), symlink) + + if os.path.splitext(os.path.basename(py_executable))[0] != expected_exe: + secondary_exe = os.path.join(os.path.dirname(py_executable), + expected_exe) + py_executable_ext = os.path.splitext(py_executable)[1] + if py_executable_ext.lower() == '.exe': + # python2.4 gives an extension of '.4' :P + secondary_exe += py_executable_ext + if os.path.exists(secondary_exe): + logger.warn('Not overwriting existing %s script %s (you must use %s)' + % (expected_exe, secondary_exe, py_executable)) + else: + logger.notify('Also creating executable in %s' % secondary_exe) + shutil.copyfile(sys.executable, secondary_exe) + make_exe(secondary_exe) + + if '.framework' in prefix: + if 'Python.framework' in prefix: + logger.debug('MacOSX Python framework detected') + # Make sure we use the embedded interpreter inside + # the framework, even if sys.executable points to + # the stub executable in ${sys.prefix}/bin + # See http://groups.google.com/group/python-virtualenv/ + # browse_thread/thread/17cab2f85da75951 + original_python = os.path.join( + prefix, 'Resources/Python.app/Contents/MacOS/Python') + if 'EPD' in prefix: + logger.debug('EPD framework detected') + original_python = os.path.join(prefix, 'bin/python') + shutil.copy(original_python, py_executable) + + # Copy the framework's dylib into the virtual + # environment + virtual_lib = os.path.join(home_dir, '.Python') + + if os.path.exists(virtual_lib): + os.unlink(virtual_lib) + copyfile( + os.path.join(prefix, 'Python'), + virtual_lib, + symlink) + + # And then change the install_name of the copied python executable + try: + mach_o_change(py_executable, + os.path.join(prefix, 'Python'), + '@executable_path/../.Python') + except: + e = sys.exc_info()[1] + logger.warn("Could not call mach_o_change: %s. " + "Trying to call install_name_tool instead." % e) + try: + call_subprocess( + ["install_name_tool", "-change", + os.path.join(prefix, 'Python'), + '@executable_path/../.Python', + py_executable]) + except: + logger.fatal("Could not call install_name_tool -- you must " + "have Apple's development tools installed") + raise + + if not is_win: + # Ensure that 'python', 'pythonX' and 'pythonX.Y' all exist + py_exe_version_major = 'python%s' % sys.version_info[0] + py_exe_version_major_minor = 'python%s.%s' % ( + sys.version_info[0], sys.version_info[1]) + py_exe_no_version = 'python' + required_symlinks = [ py_exe_no_version, py_exe_version_major, + py_exe_version_major_minor ] + + py_executable_base = os.path.basename(py_executable) + + if py_executable_base in required_symlinks: + # Don't try to symlink to yourself. + required_symlinks.remove(py_executable_base) + + for pth in required_symlinks: + full_pth = join(bin_dir, pth) + if os.path.exists(full_pth): + os.unlink(full_pth) + if symlink: + os.symlink(py_executable_base, full_pth) + else: + copyfile(py_executable, full_pth, symlink) + + cmd = [py_executable, '-c', 'import sys;out=sys.stdout;' + 'getattr(out, "buffer", out).write(sys.prefix.encode("utf-8"))'] + logger.info('Testing executable with %s %s "%s"' % tuple(cmd)) + try: + proc = subprocess.Popen(cmd, + stdout=subprocess.PIPE) + proc_stdout, proc_stderr = proc.communicate() + except OSError: + e = sys.exc_info()[1] + if e.errno == errno.EACCES: + logger.fatal('ERROR: The executable %s could not be run: %s' % (py_executable, e)) + sys.exit(100) + else: + raise e + + proc_stdout = proc_stdout.strip().decode("utf-8") + proc_stdout = os.path.normcase(os.path.abspath(proc_stdout)) + norm_home_dir = os.path.normcase(os.path.abspath(home_dir)) + if hasattr(norm_home_dir, 'decode'): + norm_home_dir = norm_home_dir.decode(sys.getfilesystemencoding()) + if proc_stdout != norm_home_dir: + logger.fatal( + 'ERROR: The executable %s is not functioning' % py_executable) + logger.fatal( + 'ERROR: It thinks sys.prefix is %r (should be %r)' + % (proc_stdout, norm_home_dir)) + logger.fatal( + 'ERROR: virtualenv is not compatible with this system or executable') + if is_win: + logger.fatal( + 'Note: some Windows users have reported this error when they ' + 'installed Python for "Only this user" or have multiple ' + 'versions of Python installed. Copying the appropriate ' + 'PythonXX.dll to the virtualenv Scripts/ directory may fix ' + 'this problem.') + sys.exit(100) + else: + logger.info('Got sys.prefix result: %r' % proc_stdout) + + pydistutils = os.path.expanduser('~/.pydistutils.cfg') + if os.path.exists(pydistutils): + logger.notify('Please make sure you remove any previous custom paths from ' + 'your %s file.' % pydistutils) + ## FIXME: really this should be calculated earlier + + fix_local_scheme(home_dir, symlink) + + if site_packages: + if os.path.exists(site_packages_filename): + logger.info('Deleting %s' % site_packages_filename) + os.unlink(site_packages_filename) + + return py_executable + + +def install_activate(home_dir, bin_dir, prompt=None): + if is_win or is_jython and os._name == 'nt': + files = { + 'activate.bat': ACTIVATE_BAT, + 'deactivate.bat': DEACTIVATE_BAT, + 'activate.ps1': ACTIVATE_PS, + } + + # MSYS needs paths of the form /c/path/to/file + drive, tail = os.path.splitdrive(home_dir.replace(os.sep, '/')) + home_dir_msys = (drive and "/%s%s" or "%s%s") % (drive[:1], tail) + + # Run-time conditional enables (basic) Cygwin compatibility + home_dir_sh = ("""$(if [ "$OSTYPE" "==" "cygwin" ]; then cygpath -u '%s'; else echo '%s'; fi;)""" % + (home_dir, home_dir_msys)) + files['activate'] = ACTIVATE_SH.replace('__VIRTUAL_ENV__', home_dir_sh) + + else: + files = {'activate': ACTIVATE_SH} + + # suppling activate.fish in addition to, not instead of, the + # bash script support. + files['activate.fish'] = ACTIVATE_FISH + + # same for csh/tcsh support... + files['activate.csh'] = ACTIVATE_CSH + + files['activate_this.py'] = ACTIVATE_THIS + + install_files(home_dir, bin_dir, prompt, files) + +def install_files(home_dir, bin_dir, prompt, files): + if hasattr(home_dir, 'decode'): + home_dir = home_dir.decode(sys.getfilesystemencoding()) + vname = os.path.basename(home_dir) + for name, content in files.items(): + content = content.replace('__VIRTUAL_PROMPT__', prompt or '') + content = content.replace('__VIRTUAL_WINPROMPT__', prompt or '(%s)' % vname) + content = content.replace('__VIRTUAL_ENV__', home_dir) + content = content.replace('__VIRTUAL_NAME__', vname) + content = content.replace('__BIN_NAME__', os.path.basename(bin_dir)) + writefile(os.path.join(bin_dir, name), content) + +def install_python_config(home_dir, bin_dir, prompt=None): + if sys.platform == 'win32' or is_jython and os._name == 'nt': + files = {} + else: + files = {'python-config': PYTHON_CONFIG} + install_files(home_dir, bin_dir, prompt, files) + for name, content in files.items(): + make_exe(os.path.join(bin_dir, name)) + +def install_distutils(home_dir): + distutils_path = change_prefix(distutils.__path__[0], home_dir) + mkdir(distutils_path) + ## FIXME: maybe this prefix setting should only be put in place if + ## there's a local distutils.cfg with a prefix setting? + home_dir = os.path.abspath(home_dir) + ## FIXME: this is breaking things, removing for now: + #distutils_cfg = DISTUTILS_CFG + "\n[install]\nprefix=%s\n" % home_dir + writefile(os.path.join(distutils_path, '__init__.py'), DISTUTILS_INIT) + writefile(os.path.join(distutils_path, 'distutils.cfg'), DISTUTILS_CFG, overwrite=False) + +def fix_local_scheme(home_dir, symlink=True): + """ + Platforms that use the "posix_local" install scheme (like Ubuntu with + Python 2.7) need to be given an additional "local" location, sigh. + """ + try: + import sysconfig + except ImportError: + pass + else: + if sysconfig._get_default_scheme() == 'posix_local': + local_path = os.path.join(home_dir, 'local') + if not os.path.exists(local_path): + os.mkdir(local_path) + for subdir_name in os.listdir(home_dir): + if subdir_name == 'local': + continue + copyfile(os.path.abspath(os.path.join(home_dir, subdir_name)), \ + os.path.join(local_path, subdir_name), symlink) + +def fix_lib64(lib_dir, symlink=True): + """ + Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y + instead of lib/pythonX.Y. If this is such a platform we'll just create a + symlink so lib64 points to lib + """ + # PyPy's library path scheme is not affected by this. + # Return early or we will die on the following assert. + if is_pypy: + logger.debug('PyPy detected, skipping lib64 symlinking') + return + # Check we have a lib64 library path + if not [p for p in distutils.sysconfig.get_config_vars().values() + if isinstance(p, basestring) and 'lib64' in p]: + return + + logger.debug('This system uses lib64; symlinking lib64 to lib') + + assert os.path.basename(lib_dir) == 'python%s' % sys.version[:3], ( + "Unexpected python lib dir: %r" % lib_dir) + lib_parent = os.path.dirname(lib_dir) + top_level = os.path.dirname(lib_parent) + lib_dir = os.path.join(top_level, 'lib') + lib64_link = os.path.join(top_level, 'lib64') + assert os.path.basename(lib_parent) == 'lib', ( + "Unexpected parent dir: %r" % lib_parent) + if os.path.lexists(lib64_link): + return + if symlink: + os.symlink('lib', lib64_link) + else: + copyfile('lib', lib64_link) + +def resolve_interpreter(exe): + """ + If the executable given isn't an absolute path, search $PATH for the interpreter + """ + # If the "executable" is a version number, get the installed executable for + # that version + orig_exe = exe + python_versions = get_installed_pythons() + if exe in python_versions: + exe = python_versions[exe] + + if os.path.abspath(exe) != exe: + paths = os.environ.get('PATH', '').split(os.pathsep) + for path in paths: + if os.path.exists(join(path, exe)): + exe = join(path, exe) + break + if not os.path.exists(exe): + logger.fatal('The path %s (from --python=%s) does not exist' % (exe, orig_exe)) + raise SystemExit(3) + if not is_executable(exe): + logger.fatal('The path %s (from --python=%s) is not an executable file' % (exe, orig_exe)) + raise SystemExit(3) + return exe + +def is_executable(exe): + """Checks a file is executable""" + return os.path.isfile(exe) and os.access(exe, os.X_OK) + +############################################################ +## Relocating the environment: + +def make_environment_relocatable(home_dir): + """ + Makes the already-existing environment use relative paths, and takes out + the #!-based environment selection in scripts. + """ + home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir) + activate_this = os.path.join(bin_dir, 'activate_this.py') + if not os.path.exists(activate_this): + logger.fatal( + 'The environment doesn\'t have a file %s -- please re-run virtualenv ' + 'on this environment to update it' % activate_this) + fixup_scripts(home_dir, bin_dir) + fixup_pth_and_egg_link(home_dir) + ## FIXME: need to fix up distutils.cfg + +OK_ABS_SCRIPTS = ['python', 'python%s' % sys.version[:3], + 'activate', 'activate.bat', 'activate_this.py', + 'activate.fish', 'activate.csh'] + +def fixup_scripts(home_dir, bin_dir): + if is_win: + new_shebang_args = ( + '%s /c' % os.path.normcase(os.environ.get('COMSPEC', 'cmd.exe')), + '', '.exe') + else: + new_shebang_args = ('/usr/bin/env', sys.version[:3], '') + + # This is what we expect at the top of scripts: + shebang = '#!%s' % os.path.normcase(os.path.join( + os.path.abspath(bin_dir), 'python%s' % new_shebang_args[2])) + # This is what we'll put: + new_shebang = '#!%s python%s%s' % new_shebang_args + + for filename in os.listdir(bin_dir): + filename = os.path.join(bin_dir, filename) + if not os.path.isfile(filename): + # ignore subdirs, e.g. .svn ones. + continue + lines = None + with open(filename, 'rb') as f: + try: + lines = f.read().decode('utf-8').splitlines() + except UnicodeDecodeError: + # This is probably a binary program instead + # of a script, so just ignore it. + continue + if not lines: + logger.warn('Script %s is an empty file' % filename) + continue + + old_shebang = lines[0].strip() + old_shebang = old_shebang[0:2] + os.path.normcase(old_shebang[2:]) + + if not old_shebang.startswith(shebang): + if os.path.basename(filename) in OK_ABS_SCRIPTS: + logger.debug('Cannot make script %s relative' % filename) + elif lines[0].strip() == new_shebang: + logger.info('Script %s has already been made relative' % filename) + else: + logger.warn('Script %s cannot be made relative (it\'s not a normal script that starts with %s)' + % (filename, shebang)) + continue + logger.notify('Making script %s relative' % filename) + script = relative_script([new_shebang] + lines[1:]) + with open(filename, 'wb') as f: + f.write('\n'.join(script).encode('utf-8')) + + +def relative_script(lines): + "Return a script that'll work in a relocatable environment." + activate = "import os; activate_this=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'activate_this.py'); exec(compile(open(activate_this).read(), activate_this, 'exec'), dict(__file__=activate_this)); del os, activate_this" + # Find the last future statement in the script. If we insert the activation + # line before a future statement, Python will raise a SyntaxError. + activate_at = None + for idx, line in reversed(list(enumerate(lines))): + if line.split()[:3] == ['from', '__future__', 'import']: + activate_at = idx + 1 + break + if activate_at is None: + # Activate after the shebang. + activate_at = 1 + return lines[:activate_at] + ['', activate, ''] + lines[activate_at:] + +def fixup_pth_and_egg_link(home_dir, sys_path=None): + """Makes .pth and .egg-link files use relative paths""" + home_dir = os.path.normcase(os.path.abspath(home_dir)) + if sys_path is None: + sys_path = sys.path + for path in sys_path: + if not path: + path = '.' + if not os.path.isdir(path): + continue + path = os.path.normcase(os.path.abspath(path)) + if not path.startswith(home_dir): + logger.debug('Skipping system (non-environment) directory %s' % path) + continue + for filename in os.listdir(path): + filename = os.path.join(path, filename) + if filename.endswith('.pth'): + if not os.access(filename, os.W_OK): + logger.warn('Cannot write .pth file %s, skipping' % filename) + else: + fixup_pth_file(filename) + if filename.endswith('.egg-link'): + if not os.access(filename, os.W_OK): + logger.warn('Cannot write .egg-link file %s, skipping' % filename) + else: + fixup_egg_link(filename) + +def fixup_pth_file(filename): + lines = [] + prev_lines = [] + with open(filename) as f: + prev_lines = f.readlines() + for line in prev_lines: + line = line.strip() + if (not line or line.startswith('#') or line.startswith('import ') + or os.path.abspath(line) != line): + lines.append(line) + else: + new_value = make_relative_path(filename, line) + if line != new_value: + logger.debug('Rewriting path %s as %s (in %s)' % (line, new_value, filename)) + lines.append(new_value) + if lines == prev_lines: + logger.info('No changes to .pth file %s' % filename) + return + logger.notify('Making paths in .pth file %s relative' % filename) + with open(filename, 'w') as f: + f.write('\n'.join(lines) + '\n') + +def fixup_egg_link(filename): + with open(filename) as f: + link = f.readline().strip() + if os.path.abspath(link) != link: + logger.debug('Link in %s already relative' % filename) + return + new_link = make_relative_path(filename, link) + logger.notify('Rewriting link %s in %s as %s' % (link, filename, new_link)) + with open(filename, 'w') as f: + f.write(new_link) + +def make_relative_path(source, dest, dest_is_directory=True): + """ + Make a filename relative, where the filename is dest, and it is + being referred to from the filename source. + + >>> make_relative_path('/usr/share/something/a-file.pth', + ... '/usr/share/another-place/src/Directory') + '../another-place/src/Directory' + >>> make_relative_path('/usr/share/something/a-file.pth', + ... '/home/user/src/Directory') + '../../../home/user/src/Directory' + >>> make_relative_path('/usr/share/a-file.pth', '/usr/share/') + './' + """ + source = os.path.dirname(source) + if not dest_is_directory: + dest_filename = os.path.basename(dest) + dest = os.path.dirname(dest) + dest = os.path.normpath(os.path.abspath(dest)) + source = os.path.normpath(os.path.abspath(source)) + dest_parts = dest.strip(os.path.sep).split(os.path.sep) + source_parts = source.strip(os.path.sep).split(os.path.sep) + while dest_parts and source_parts and dest_parts[0] == source_parts[0]: + dest_parts.pop(0) + source_parts.pop(0) + full_parts = ['..']*len(source_parts) + dest_parts + if not dest_is_directory: + full_parts.append(dest_filename) + if not full_parts: + # Special case for the current directory (otherwise it'd be '') + return './' + return os.path.sep.join(full_parts) + + + +############################################################ +## Bootstrap script creation: + +def create_bootstrap_script(extra_text, python_version=''): + """ + Creates a bootstrap script, which is like this script but with + extend_parser, adjust_options, and after_install hooks. + + This returns a string that (written to disk of course) can be used + as a bootstrap script with your own customizations. The script + will be the standard virtualenv.py script, with your extra text + added (your extra text should be Python code). + + If you include these functions, they will be called: + + ``extend_parser(optparse_parser)``: + You can add or remove options from the parser here. + + ``adjust_options(options, args)``: + You can change options here, or change the args (if you accept + different kinds of arguments, be sure you modify ``args`` so it is + only ``[DEST_DIR]``). + + ``after_install(options, home_dir)``: + + After everything is installed, this function is called. This + is probably the function you are most likely to use. An + example would be:: + + def after_install(options, home_dir): + subprocess.call([join(home_dir, 'bin', 'easy_install'), + 'MyPackage']) + subprocess.call([join(home_dir, 'bin', 'my-package-script'), + 'setup', home_dir]) + + This example immediately installs a package, and runs a setup + script from that package. + + If you provide something like ``python_version='2.5'`` then the + script will start with ``#!/usr/bin/env python2.5`` instead of + ``#!/usr/bin/env python``. You can use this when the script must + be run with a particular Python version. + """ + filename = __file__ + if filename.endswith('.pyc'): + filename = filename[:-1] + with codecs.open(filename, 'r', encoding='utf-8') as f: + content = f.read() + py_exe = 'python%s' % python_version + content = (('#!/usr/bin/env %s\n' % py_exe) + + '## WARNING: This file is generated\n' + + content) + return content.replace('##EXT' 'END##', extra_text) + +##EXTEND## + +def convert(s): + b = base64.b64decode(s.encode('ascii')) + return zlib.decompress(b).decode('utf-8') + +##file site.py +SITE_PY = convert(""" +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 +AVijEPwfucjncQ== +""") + +##file activate.sh +ACTIVATE_SH = convert(""" +eJytVd9v2kAMfs9fYQLq2m4MscdNVKMqEkgtVIQxbeuUHolpTgsXdHehpT/+9/mSEBJS2MOaB0ji +z77P9menDpOAK5jzEGERKw0zhFihD/dcB2CrKJYewoyLFvM0XzGNNpzOZbSAGVPBqVWHdRSDx4SI +NMhYANfgc4meDteW5ePGC45P4MkCumKhUENzDsu1H3lw1vJx1RJxGMKns6O2lWDqINGgotAHFCsu +I7FAoWHFJGezEFWGqsEvaD5C42naHb93X+A3+elYCgVaxgh8DmQAys9HL2SS0mIaWBgm7mTN/O3G +kzu6vHCng/HkW/fSve5O+hTOpnhfQAcoEry5jKVjNypoO0fgwzKSOgHm79KUK06Jfc7/RebHpD8a +9kdXvT2UcnuFWG6p0stNB0mWUUQ1q3uiGRVEMfXHR03dTuQATPjwqIIPcB9wL4CArRAY/ZHJixYL +Y9YBtcAoLQtFevOoI9QaHcEdMSAB0d08kuZhyUiSmav6CPCdVBnFOjNrLu6yMCWgKRA0TInBC5i4 +QwX3JG/mm581GKnSsSSxJTFHf9MAKr8w5T/vOv1mUurn5/zlT6fvTntjZzAaNl9rQ5JkU5KIc0GX +inagwU57T2eddqWlTrvaS6d9sImZeUMkhWysveF0m37NcGub9Dpgi0j4qGiOzATjDr06OBjOYQOo +7RBoGtNm9Denv1i0LVI7lxJDXLHSSBeWRflsyyqw7diuW3h0XdvK6lBMyaoMG1UyHdTsoYBuue75 +YOgOu1c91/2cwYpznPPeDoQpGL2xSm09NKp7BsvQ2hnT3aMs07lUnskpxewvBk73/LLnXo9HV9eT +ijB3hWBO2ygoiWg/bKuZxqCCQq0DD3vkWIVvI2KosIw+vqW1gIItEG5KJb+xb09g65ktwYKgTc51 +uGJ/EFQs0ayEWLCQM5V9N4g+1+8UbXOJzF8bqhKtIqIwicWvzNFROZJlpfD8A7Vc044R0FxkcezG +VzsV75usvTdYef+57v5n1b225qhXfwEmxHEs +""") + +##file activate.fish +ACTIVATE_FISH = convert(""" +eJyFVVFv2zYQftevuMoOnBS1gr0WGIZ08RADSRw4boBhGGhGOsUcKFIjKbUu9uN7lC2JsrXWDzZM +fnf38e6+uwlsdsJCLiRCUVkHrwiVxYy+hHqDbQKvQl3z1ImaO0xyYXdbeP9FuJ1QwMFUSnmcP4dL +2DlXfry+9v/sDqVMUl3AFVi0Vmj1PokmcKtBaecNQTjIhMHUyX0SRXmlKIpWkGEbDuYZzBZfCVcL +4youUdVQ6AyBqwwMusoocBrcDsmpKbgEQgijVYHKJbMI6DMhoEUHWmbhLdTcCP4q0TYokYNDev5c +QTxlq/tb9rJcbz7f3LOnm81d3GD8x3uav30FfwrnwCEOYRyAKot+FvXPzd3q8W71sBiJ3d2dMugu +fsxjCPsBmz+Wz3fsab16eNqw1ctivV7eBnwm8EzeuQIsSrcHqVMqwHbqq8/aarKSO+oYKhKXUn9p +SmWw0DVBdQ7bBlwaTR62bc+1tpaYb5PhUyScu48CRgvDLQbtMrMnMQ6dY5022JDRRrwJxWUfJwwP +ge0YIAVGfcUC1M8s8MxitFZjmR9W64hui7p4fBlWMZ5y81b/9cvfMbz7FWZKq4yOTeW1hbNBEWU+ +b+/ejXMu95lOx696uXb8Go4T+Kw8R2EMSqx5KLkkCkQ+ZBZFbZsHL4OYseAvY3EPO5MYTBuhDZQa +TwPza8Y+LR/Z483Dgjwd4R3f7bTXx9Znkw6T6PAL83/hRD3jNAKFjuEx9NJkq5t+fabLvdvRwbw4 +nEFTzwO6U+q34cvY7fL55tP94tg58XEA/q7LfdPsaUXFoEIMJdHF5iSW0+48CnDQ82G7n3XzAD6q +Bmo5XuOA0NQ67ir7AXJtQhtLKO7XhC0l39PGOBsHPvzBuHUSjoOnA0ldozGC9gZ5rek3+y3ALHO/ +kT7AP379lQZLSnFDLtwWihfYxw4nZd+ZR7myfkI2ZTRCuRxmF/bCzkbhcElvYamW9PbDGrvqPKC0 ++D/uLi/sFcxGjOHylYagZzzsjjhw206RQwrWIwOxS2dnk+40xOjX8bTPegz/gdWVSXuaowNuOLda +wYyNuRPSTcd/B48Ppeg= +""") + +##file activate.csh +ACTIVATE_CSH = convert(""" +eJx1U2FP2zAQ/e5f8TAV3Soo+0zXbYUiDQkKQgVp2ibjJNfFUuIg22nVf885SVFLO3+I7Lt3fr6X +d8eY58ZjYQpCWfuAhFB7yrAyIYf0Ve1SQmLsuU6DWepAw9TnEoOFq0rwdjAUx/hV1Ui1tVWAqy1M +QGYcpaFYx+yVI67LkKwx1UuTEaYGl4X2Bl+zJpAlP/6V2hTDtCq/DYXQhdEeGW040Q/Eb+t9V/e3 +U/V88zh/mtyqh8n8J47G+IKTE3gKZJdoYrK3h5MRU1tGYS83gqNc+3yEgyyP93cP820evHLvr2H8 +kaYB/peoyY7aVHzpJnE9e+6I5Z+ji4GMTNJWNuOQq6MA1N25p8pW9HWdVWlfsNpPDbdxjgpaahuw +1M7opCA/FFu1uwxC7L8KUqmto1KyQe3rx0I0Eovdf7BVe67U5c1MzSZ310pddGheZoFPWyytRkzU +aCA/I+RkBXhFXr5aWV0SxjhUI6jwdAj8kmhPzX7nTfJFkM3MImp2VdVFFq1vLHSU5szYQK4Ri+Jd +xlW2JBtOGcyYVW7SnB3v6RS91g3gKapZ0oWxbHVteYIIq3iv7QeuSrUj6KSqQ+yqsxDj1ivNQxKF +YON10Q+NH/ARS95i5Tuqq2Vxfvc23f/FO6zrtXXmJr+ZtMY9/A15ZXFWtmch2rEQ4g1ryVHH +""") + +##file activate.bat +ACTIVATE_BAT = convert(""" +eJx9Ul9LhEAQfxf8DoOclI/dYyFkaCmcq4gZQTBUrincuZFbff12T133TM+nnd35/Zvxlr7XDFhV +mUZHOVhFlOWP3g4DUriIWoVomYZpNBWUtGpaWgImO191pFkSpzlcmgaI70jVX7n2Qp8tuByg+46O +CMHbMq64T+nmlJt082D1T44muCDk2prgEHF4mdI9RaS/QwSt3zSyIAaftRccvqVTBziD1x/WlPD5 +xd729NDBb8Nr4DU9QNMKsJeH9pkhPedhQsIkDuCDCa6A+NF9IevVFAohkqizdHetg/tkWvPoftWJ +MCqnOxv7/x7Np6yv9P2Ker5dmX8yNyCkkWnbZy3N5LarczlqL8htx2EM9rQ/2H5BvIsIEi8OEG8U ++g8CsNTr +""") + +##file deactivate.bat +DEACTIVATE_BAT = convert(""" +eJyFkN0KgkAUhO8F32EQpHqFQEjQUPAPMaErqVxzId3IrV6/XST/UDx3c86c4WMO5FYysKJQFVVp +CEfqxsnJ9DI7SA25i20fFqs3HO+GYLsDZ7h8GM3xfLHrg1QNvpSX4CWpQGvokZk4uqrQAjXjyElB +a5IjCz0r+2dHcehHCe5MZNmB5R7TdqMqECMptHZh6DN/utb7Zs6Cej8OXYE5J04YOKFvD4GkHuJ0 +pilSd1jG6n87tDZ+BUwUOepI6CGSkFMYWf0ihvT33Qj1A+tCkSI= +""") + +##file activate.ps1 +ACTIVATE_PS = convert(""" +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 +rKQDxR6N/rffXv+lROXet/9Q+l9I4D1U +""") + +##file distutils-init.py +DISTUTILS_INIT = convert(""" +eJytV1uL4zYUfvevOE0ottuMW9q3gVDa3aUMXXbLMlDKMBiNrSTqOJKRlMxkf33PkXyRbGe7Dw2E +UXTu37lpxLFV2oIyifAncxmOL0xLIfcG+gv80x9VW6maw7o/CANSWWBwFtqeWMPlGY6qPjV8A0bB +C4eKSTgZ5LRgFeyErMEeOBhbN+Ipgeizhjtnhkn7DdyjuNLPoCS0l/ayQTG0djwZC08cLXozeMss +aG5EzQ0IScpnWtHSTXuxByV/QCmxE7y+eS0uxWeoheaVVfqSJHiU7Mhhi6gULbOHorshkrEnKxpT +0n3A8Y8SMpuwZx6aoix3ouFlmW8gHRSkeSJ2g7hU+kiHLDaQw3bmRDaTGfTnty7gPm0FHbIBg9U9 +oh1kZzAFLaue2R6htPCtAda2nGlDSUJ4PZBgCJBGVcwKTAMz/vJiLD+Oin5Z5QlvDPdulC6EsiyE +NFzb7McNTKJzbJqzphx92VKRFY1idenzmq3K0emRcbWBD0ryqc4NZGmKOOOX9Pz5x+/l27tP797c +f/z0d+4NruGNai8uAM0bfsYaw8itFk8ny41jsfpyO+BWlpqfhcG4yxLdi/0tQqoT4a8Vby382mt8 +p7XSo7aWGdPBc+b6utaBmCQ7rQKQoWtAuthQCiold2KfJIPTT8xwg9blPumc+YDZC/wYGdAyHpJk +vUbHbHWAp5No6pK/WhhLEWrFjUwtPEv1Agf8YmnsuXUQYkeZoHm8ogP16gt2uHoxcEMdf2C6pmbw +hUMsWGhanboh4IzzmsIpWs134jVPqD/c74bZHdY69UKKSn/+KfVhxLgUlToemayLMYQOqfEC61bh +cbhwaqoGUzIyZRFHPmau5juaWqwRn3mpWmoEA5nhzS5gog/5jbcFQqOZvmBasZtwYlG93k5GEiyw +buHhMWLjDarEGpMGB2LFs5nIJkhp/nUmZneFaRth++lieJtHepIvKgx6PJqIlD9X2j6pG1i9x3pZ +5bHuCPFiirGHeO7McvoXkz786GaKVzC9DSpnOxJdc4xm6NSVq7lNEnKdVlnpu9BNYoKX2Iq3wvgh +gGEUM66kK6j4NiyoneuPLSwaCWDxczgaolEWpiMyDVDb7dNuLAbriL8ig8mmeju31oNvQdpnvEPC +1vAXbWacGRVrGt/uXN/gU0CDDwgooKRrHfTBb1/s9lYZ8ZqOBU0yLvpuP6+K9hLFsvIjeNhBi0KL +MlOuWRn3FRwx5oHXjl0YImUx0+gLzjGchrgzca026ETmYJzPD+IpuKzNi8AFn048Thd63OdD86M6 +84zE8yQm0VqXdbbgvub2pKVnS76icBGdeTHHXTKspUmr4NYo/furFLKiMdQzFjHJNcdAnMhltBJK +0/IKX3DVFqvPJ2dLE7bDBkH0l/PJ29074+F0CsGYOxsb7U3myTUncYfXqnLLfa6sJybX4g+hmcjO +kMRBfA1JellfRRKJcyRpxdS4rIl6FdmQCWjo/o9Qz7yKffoP4JHjOvABcRn4CZIT2RH4jnxmfpVG +qgLaAvQBNfuO6X0/Ux02nb4FKx3vgP+XnkX0QW9pLy/NsXgdN24dD3LxO2Nwil7Zlc1dqtP3d7/h +kzp1/+7hGBuY4pk0XD/0Ao/oTe/XGrfyM773aB7iUhgkpy+dwAMalxMP0DrBcsVw/6p25+/hobP9 +GBknrWExDhLJ1bwt1NcCNblaFbMKCyvmX0PeRaQ= +""") + +##file distutils.cfg +DISTUTILS_CFG = convert(""" +eJxNj00KwkAMhfc9xYNuxe4Ft57AjYiUtDO1wXSmNJnK3N5pdSEEAu8nH6lxHVlRhtDHMPATA4uH +xJ4EFmGbvfJiicSHFRzUSISMY6hq3GLCRLnIvSTnEefN0FIjw5tF0Hkk9Q5dRunBsVoyFi24aaLg +9FDOlL0FPGluf4QjcInLlxd6f6rqkgPu/5nHLg0cXCscXoozRrP51DRT3j9QNl99AP53T2Q= +""") + +##file activate_this.py +ACTIVATE_THIS = convert(""" +eJyNU01v2zAMvetXEB4K21jnDOstQA4dMGCHbeihlyEIDMWmE62yJEiKE//7kXKdpEWLzYBt8evx +kRSzLPs6wiEoswM8YdMpjUXcq1Dz6RZa1cSiTkJdr86GsoTRHuCotBayiWqQEYGtMCgfD1KjGYBe +5a3p0cRKiEe2NtLAFikftnDco0ko/SFEVgEZ8aRCZDIPY9xbA8pE9M4jfW/B2CjiHq9zbJVZuOQq +siwTIvpxKYCembPAU4Muwi/Z4zfvrZ/MXipKeB8C+qisSZYiWfjJfs+0/MFMdWn1hJcO5U7G/SLa +xVx8zU6VG/PXLXvfsyyzUqjeWR8hjGE+2iCE1W1tQ82hsCJN9dzKaoexyB/uH79TnjwvxcW0ntSb +yZ8jq1Z5Q1UXsyy3gf9nbjTEj7NzQMfCJa/YSmrQ+2D/BqfiOi6sclrGzvoeVivIj8rcfcmnIQRF +7XCyeZI7DFe5/lhlCs5PRf5QW66VXT/NrlQ46oD/D6InkOmi3IQcbhKxAX2g4a+Xd5s3UtCtG2py +m8eg6WYWqR6SL5OjKMGfSrYt/6kxxQtOpeAgj1LXBNmpE2ElmCSIy5H0zFd8gJ924HWijWhb2hRC +6wNEm1QdDZtuSZcEprIUBo/XRNcbQe1OUbQ/r3hPTaPJJDNtFLu8KHV5XoNr3Eo6h6YtOKw8e8yw +VF5PnJ+ts3a9/Mz38RpG/AUSzYUW +""") + +##file python-config +PYTHON_CONFIG = convert(""" +eJyNVV1P2zAUfc+v8ODBiSABxlulTipbO6p1LWqBgVhlhcZpPYUkctzSivHfd6+dpGloGH2Ja/ue +e+65Hz78xNhtf3x90xmw7vCWsRPGLvpDNuz87MKfdKMWSWxZ4ilNpCLZJiuWc66SVFUOZkkcirll +rfxIBAzOMtImDzSVPBRrekwoX/OZu/0r4lm0DHiG60g86u8sjPw5rCyy86NRkB8QuuBRSqfAKESn +3orLTCQxE3GYkC9tYp8fk89OSwNsmXgizrhUtnumeSgeo5GbLUMk49Rv+2nK48Cm/qMwfp333J2/ +dVcAGE0CIQHBsgIeEr4Wij0LtWDLzJ9ze5YEvH2WI6CHTAVcSu9ZCsXtgxu81CIvp6/k4eXsdfo7 +PvDCRD75yi41QitfzlcPp1OI7i/1/iQitqnr0iMgQ+A6wa+IKwwdxyk9IiXNAzgquTFU8NIxAVjM +osm1Zz526e+shQ4hKRVci69nPC3Kw4NQEmkQ65E7OodxorSvxjvpBjQHDmWFIQ1mlmzlS5vedseT +/mgIEsMJ7Lxz2bLAF9M5xeLEhdbHxpWOw0GdkJApMVBRF1y+a0z3c9WZPAXGFcFrJgCIB+024uad +0CrzmEoRa3Ub4swNIHPGf7QDV+2uj2OiFWsChgCwjKqN6rp5izpbH6Wc1O1TclQTP/XVwi6anTr1 +1sbubjZLI1+VptPSdCfwnFBrB1jvebrTA9uUhU2/9gad7xPqeFkaQcnnLbCViZK8d7R1kxzFrIJV +8EaLYmKYpvGVkig+3C5HCXbM1jGCGekiM2pRCVPyRyXYdPf6kcbWEQ36F5V4Gq9N7icNNw+JHwRE +LTgxRXACpvnQv/PuT0xCCAywY/K4hE6Now2qDwaSE5FB+1agsoUveYDepS83qFcF1NufvULD3fTl +g6Hgf7WBt6lzMeiyyWVn3P1WVbwaczHmTzE9A5SyItTVgFYyvs/L/fXlaNgbw8v3azT+0eikVlWD +/vBHbzQumP23uBCjsYdrL9OWARwxs/nuLOzeXbPJTa/Xv6sUmQir5pC1YRLz3eA+CD8Z0XpcW8v9 +MZWF36ryyXXf3yBIz6nzqz8Muyz0m5Qj7OexfYo/Ph3LqvkHUg7AuA== +""") + +MH_MAGIC = 0xfeedface +MH_CIGAM = 0xcefaedfe +MH_MAGIC_64 = 0xfeedfacf +MH_CIGAM_64 = 0xcffaedfe +FAT_MAGIC = 0xcafebabe +BIG_ENDIAN = '>' +LITTLE_ENDIAN = '<' +LC_LOAD_DYLIB = 0xc +maxint = majver == 3 and getattr(sys, 'maxsize') or getattr(sys, 'maxint') + + +class fileview(object): + """ + A proxy for file-like objects that exposes a given view of a file. + Modified from macholib. + """ + + def __init__(self, fileobj, start=0, size=maxint): + if isinstance(fileobj, fileview): + self._fileobj = fileobj._fileobj + else: + self._fileobj = fileobj + self._start = start + self._end = start + size + self._pos = 0 + + def __repr__(self): + return '' % ( + self._start, self._end, self._fileobj) + + def tell(self): + return self._pos + + def _checkwindow(self, seekto, op): + if not (self._start <= seekto <= self._end): + raise IOError("%s to offset %d is outside window [%d, %d]" % ( + op, seekto, self._start, self._end)) + + def seek(self, offset, whence=0): + seekto = offset + if whence == os.SEEK_SET: + seekto += self._start + elif whence == os.SEEK_CUR: + seekto += self._start + self._pos + elif whence == os.SEEK_END: + seekto += self._end + else: + raise IOError("Invalid whence argument to seek: %r" % (whence,)) + self._checkwindow(seekto, 'seek') + self._fileobj.seek(seekto) + self._pos = seekto - self._start + + def write(self, bytes): + here = self._start + self._pos + self._checkwindow(here, 'write') + self._checkwindow(here + len(bytes), 'write') + self._fileobj.seek(here, os.SEEK_SET) + self._fileobj.write(bytes) + self._pos += len(bytes) + + def read(self, size=maxint): + assert size >= 0 + here = self._start + self._pos + self._checkwindow(here, 'read') + size = min(size, self._end - here) + self._fileobj.seek(here, os.SEEK_SET) + bytes = self._fileobj.read(size) + self._pos += len(bytes) + return bytes + + +def read_data(file, endian, num=1): + """ + Read a given number of 32-bits unsigned integers from the given file + with the given endianness. + """ + res = struct.unpack(endian + 'L' * num, file.read(num * 4)) + if len(res) == 1: + return res[0] + return res + + +def mach_o_change(path, what, value): + """ + Replace a given name (what) in any LC_LOAD_DYLIB command found in + the given binary with a new name (value), provided it's shorter. + """ + + def do_macho(file, bits, endian): + # Read Mach-O header (the magic number is assumed read by the caller) + cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags = read_data(file, endian, 6) + # 64-bits header has one more field. + if bits == 64: + read_data(file, endian) + # The header is followed by ncmds commands + for n in range(ncmds): + where = file.tell() + # Read command header + cmd, cmdsize = read_data(file, endian, 2) + if cmd == LC_LOAD_DYLIB: + # The first data field in LC_LOAD_DYLIB commands is the + # offset of the name, starting from the beginning of the + # command. + name_offset = read_data(file, endian) + file.seek(where + name_offset, os.SEEK_SET) + # Read the NUL terminated string + load = file.read(cmdsize - name_offset).decode() + load = load[:load.index('\0')] + # If the string is what is being replaced, overwrite it. + if load == what: + file.seek(where + name_offset, os.SEEK_SET) + file.write(value.encode() + '\0'.encode()) + # Seek to the next command + file.seek(where + cmdsize, os.SEEK_SET) + + def do_file(file, offset=0, size=maxint): + file = fileview(file, offset, size) + # Read magic number + magic = read_data(file, BIG_ENDIAN) + if magic == FAT_MAGIC: + # Fat binaries contain nfat_arch Mach-O binaries + nfat_arch = read_data(file, BIG_ENDIAN) + for n in range(nfat_arch): + # Read arch header + cputype, cpusubtype, offset, size, align = read_data(file, BIG_ENDIAN, 5) + do_file(file, offset, size) + elif magic == MH_MAGIC: + do_macho(file, 32, BIG_ENDIAN) + elif magic == MH_CIGAM: + do_macho(file, 32, LITTLE_ENDIAN) + elif magic == MH_MAGIC_64: + do_macho(file, 64, BIG_ENDIAN) + elif magic == MH_CIGAM_64: + do_macho(file, 64, LITTLE_ENDIAN) + + assert(len(what) >= len(value)) + + with open(path, 'r+b') as f: + do_file(f) + + +if __name__ == '__main__': + main() + +# TODO: +# Copy python.exe.manifest +# Monkeypatch distutils.sysconfig diff --git a/src/application/views/admin/__init__.py b/app/lib/virtualenv_support/__init__.py similarity index 100% rename from src/application/views/admin/__init__.py rename to app/lib/virtualenv_support/__init__.py diff --git a/app/lib/virtualenv_support/argparse-1.4.0-py2.py3-none-any.whl b/app/lib/virtualenv_support/argparse-1.4.0-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..dfef51d4483025c5a535e553266234d372480439 GIT binary patch literal 23000 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 LX8T3!ufP8R(i0Iz literal 0 HcmV?d00001 diff --git a/app/lib/virtualenv_support/pip-9.0.1-py2.py3-none-any.whl b/app/lib/virtualenv_support/pip-9.0.1-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..4b8ecc69db7e37fc6dd7b6dd8f690508f42866a1 GIT binary patch literal 1254803 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%0Dd)@cVq%dN0`L%VT6RH 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 z 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 z z6r1_~Jm2f!?ges z{{VM^zvKLu`kqCQOY}jYLs{=f`+>F&{gERb;O)kZ8~F<_yddORslx!!t*p&s+=O?? zjG{lFHuE(X7nlD8cRT)${i5R-#&K+OyD|Z+TD3~V2VDpc+JG-)3vDN8QE;d6>8pQH z-fzJlxKRBP@=yJDkuv|f9WBb5r=q_@*}x6upy=dKW@w9`OMngvv;cR?UUGM<)74i=JQ4dHS*ZhsR3;Z3|KdGItum6As z^qm;Lp#6g!pg%(22_9q43Era|l=WSd1K!c*qpd|dMso_G*C3kzZrla_klowKd1LbK z*cQQGS+@Y6K_g_H*;FHr=8<`z*mxv4Qs*BDfsQ+eDvp>fAzD# z<#srL)(&oNZW@}~O{F?rjrNSjoWD?eTTboLWonm>)A;-q8rx2$F)+Si@FnO>&e&(5H5`Y87PMANSe?+^E zz6fnK# zuK|w#f%BwGlHN4_oTT?v_76D9BlJViGaAVJvaU>aM4v+Q*JK*!COGcHK>1?~3|!Fv zY+jZj*1)hHj5T>Bf56yFlHL>gHX)D4BwZVHJdj7|sG#eFo^a%T5p|D}Kl*W+?`O`M zHEXh?zFQg3!o=A6?b#7xEfMRvSVwfsAG%lQj}z<3qfyq;K-UKy6XelntJFRy`D6U! zs4K0ne+Mpj*30^d)zhT)*s3d+_?(~W;sAL}s3(tMvd+|BmdAQ}I*~uklaiM$TbAI6 z2l9rT!^8u98`e~zU%;C1#^~V@76ve*R=f z-79dwx(RrJ2kYz5HT_%G_d(Bu^-#zobWG4~6w3OgnG+;#@fk%cS;yvZ5crya01M@C0oScu{5hhVOeiPUs1+KD}OEUti-;C!lAt%6hVV z83#N<9x30^1ShZ8t^dmW4D}FWen&lvqwWrT`Ximuk?rpY9Sd}IMTEm_S=Z?B+|vFb zf2-A+{L)J=B|tZX@i_2M=GDr+LEr&ipgn>g9_Vl1eyp}mG$fA>vesbxk1_VlnKLuz z&Yhb9K0Ni*Q=;8NyNkXL?LTAz{D3SXZ%3WekLQl^AI^P6b)ud;ria^gWw*;8eG1k& zu%-(hV}3<-(Y}^mUl*p74a(xvC2_p+{84`8yRT~H(OfH!FU}r`>>KR=DSc-p|Ad5u zvteOjV%-(G>9n*oK7amvF~0*&N?V|`l_($Z=Bn*D|NP}C{G-Bfu@^v*$5&?b$c;+UcGt^r+P2uf#~a@mw|4H##wySs8NFM#@3qamyOboD|;&` zdF*?>{RjTUf82VB4lwA*Mi zf#mo3iew=!Xyva-*~t z*q8X;d+*^$%zN%2Z;?OpMEg@%SU4H!VND)=KH41U7RHPjBXrED7YK_7JW$qnF<(2VfmlP+n#^@H7v(93G_!fIXR+jz+P2lT@mF4UW0D5$w!VHdG$}`E%HY`)Ygdh zzac!7G4Q+ZzROpvSRvMm(KceuNzp0(#k@uS$VcgaAxofF8H1zlDSAoZ02zah1M5$l zHf>V&3I5f*?eyQt8YtQsw0$V&_3PI|{(c}{lrU-i%AfddSJfz<)E{y0P$AZZ}NORy#Ki|>~|3a`4Z4>Gda8z_4JXKRC(Iu)f5lt@a}_nsm6j1+(6wSt4%{LC$oKWx(PE5qmF8eCR!M1KE{?eu z=6;y>Vcw~wc_+p&7*hdnv|D&EhrxL9{b#3&G#sCb8`7E%))6pg1OHG?=!29!sGFaR z65}n5_b}GOSQBGi%s1XzULw-KoMQmtf$|$Ua-`66qYVQe&g^`dZ!8EA^GS@|F>c4a z0duEWrv4(2_|u%PBfh-&;)`NDh&>|EtD!6*FZIXbhsxHAasR9d_Axhz-2nbkzaZKz z=;W|}KW;xv(el~VqYJ+$?ZQL-Xnb9$FCv&1||L{pL`<5YRY~bwA&bSp*+x@I^qI5`f^A4M|h?Dl|4yF3;iVW zM}LHQ0@6miOnra8V|=vJz#Hj+7tj@fCiK}@PeNSGv(b0&+_|$(Ts*Uzz7_6Cz+7Zt zw*e(gQyDzq?!=lhmC93`_JkAHoNxlCc*A*X&J5>j;^Y9Fw&ucc3Mbxh)|x9*tEJWn zC#|{3Aywj>wI*^%l{jUsDKjMJ=9)6br_WI3Wu#~3hIF>%Wa@G!OfqF8=l04-n~;;0 zo0V$rH6bfQmzFnEE-8uBG<|>uJoMXuqcc$E7 zYW`9@ikWMgV97}{&ye5ACC4e zeul<{$Aw2mMi1&gVuWn@=l$<{M<;xS>Y1Cmg}RNpqq>{gM{QKcsVAskQEyj&sjg8s z@qN(uXWyZIQ~aLwd&6&|-$B2Ven0zp_;>RU@gL`J@}KL!-2Ws0ulz6gU-kD0@CxW1 z5Eu{^@JPU;0Z9Q<1M&lk0(Jyk2yhJ?8<-yWbl}dw&jODImIt~8-5)eGXj;&dLHmPl z21RRVg1-CW%g-D|q{bO&@_ z>rU&g=zh^P(TC}y^;!C9`o;R^_1pDnhAhJz!*_-@AzmTfLzoy~h%3U>pR2!D7x-5B zKI2#DpB`{Npjn_-penFeU~phm;3I)!0!@M0ftv!i1nvsFFQ_Ewsi0?rUJQCU=(V7? zgEj$sfr0<-~r17?Ua`d7g70m}nk4tO`H^JyGXe_&ivt$~E(u&2 z$by;$c?3Nl^eXXVd(fVsi$OmI{T9SDEj4X4_iH+79@YeD44Ozyj3z-dT9c;9)y&Wo zYSwB#)|}C(wB59E+63)rZH{)ncD?rD;Mm~A;HQG04?Yw8eQ-^%ldhT0LwB#PgRYD2 zA)T*Is|%r0AEbL!m!wP4P1a@V%(@x6d|i?5Y2E9(cXXR{TXZ{hdv%9(U+KQpUDo}i zyRKt;mA;!kRG+M$q|er$(O=O2sQ+EBGITXOYzQ|zYk0x1*-&b@V5l(sWLO%qBIKQr z&qB_ITnrf*njShk^wZF9iKotC&BHvy9t;~AmK0_VTMOPA85=?3(@Jeno77X)o77v? zyVU`HWBiW#pYR_WkQ(rKz>@);f?|RaG#MHfZGiTp;4H$mm)@X%Utg+!*09nL7BY)+ z`#MA&wk&L0*r#Dv!kD-~;sY`Q)OxCI&#PZnA5foHJNtI?P4J!M`<(AbzT146-(7ya z{QCRN@O#;BzyFW^zxsCwm=dr(fRpTY3XBPy8Mr1eKd3n9l%_&crO{~nX=iKaY4>W6 zYENmeXn)gwtlO_UqWea7N_Sotr%%x5=wHx(um4%!#PE#L8YlFZVZ^?CZ4`W5=!`d{_T z;A(I;v^01c+8VqJ9So_4bVIhmY{)ZQG6aPbQ;Bv8Js;X8Y<}39unl290_SYT){!w& z{gL{R+UPgL&+50-?-jrGejoYm@VoBk?BCMAtA8K=zW%BHEBwEpR&01cPQd1XhXbPn zKMC9y_-){oz~(`1g4zf9QW>WPWd&J+W(O4p{VV9BpmRZ2gSu*bG)FbpHO^Xht(W!z zZEtOm)<7jOP)K{KHcR`MHlIr6U)mMgW7?m!ErVO>@6q3{|62c;VX5I0L+21($T+l9 z1=5`&dFm`*<{#mo<-gcJH}EvI9v7)}uV}7P9yc@*REyHIbG19P724Us-v$@xR_PY& zKhn1`6ofn)`f%8&u&H71g&hXniy1SJk*Qv#-lOj4`-bmlz88Jn{T}wqr4}L8f2#jI z0fhmYpw85Kjnz!ly{Z4+@KDI`km(`g!f>!}9>v}7d(iiY@7KO3d{6s+N3n1Cw({%f z7wMPp_b+N!_W3>FALT#R|1tm9{Ezyd_P;CO{s8ZQlz?dg?*)8K?Q6@x(7=9yMS*!i zvx4RZy-TfUQ%!5lcIdqF=|}5R^ywsjGxbIK1xV+RG+#{#ofPUG)+1~{*rc#|Ve7(nhV2Qnf#+u= zy}P^GTiruFKs`xqRxegBSAVEJsy;>(dHHI6BPss^-&I7*8LHnZKcn9`zXHDne(SKS zx{|TBxT{?4rS1{flj>1Gpf=DDXbg-D91u7#FfM2qwYvv`4h0>hp6Dd?MdztEx=j61 z6;WS9ZLzDyo!VnhOvD0%`=*%n&p~R)PJqhyro&M`9SlbW()OXJ2iW#H#eWs^?7WO7h=Q>#1!^wV;DmrS;bKAgN!fU8ns}yGMIjTdl3pvS8O>_h4;^ zIy4~E7&;i z{?3_6(t^1A{r&#^@u9hQX3o6MoH=vOnKN^X?^q=m1wk;upRNl+oxuNjg#Z1o7ygD# zST{`gcl!1V>I{MH7u>SwCl!t*S~huHJxpOh}b@_wl8b9{nu-_xnW)`K_SmWb;TCJLD;8G_INf!BFl z$wlyEGi_MR_T_ zGn@c!gqz_x_FQoHFMb#RFF|5%<6|K#{vO>~bXF%=1QO=q_Cjdz}s%yc)7Z zvOhiy+{8Au4fA(E5r4Z9iU`#QFOft0l8N*JH(c>@qfEo^*>ePr6mQO(ut-UQd9;py?x6(`_&Q z2#Ssr=lNV;2EzB}(JY{MiEIniLt3vU2;y&|blHHe%LHH|UT2D{oo*V5$SKaFZ;#+F zfzmE1vhfsvg>*@jPx)N+WDk95B=!NbEq59uvPY^j0XqC-JH2{1d&;DZQdV{cc60)? zqZ8{Gi3uu97P(aS=bo00{jsM2kLzIqn#fjqK{l@yssx_cAAwfJ0=K7Sfo0kzBIL#Ylq0yXjKF<dpCm^{@ zDljS;#kmI{vf{XAEGAzt9N&ojiOhF;{A81#+?nqu74Z7F>?dDHcT0Ck3#9oA8n>NA zTOOHwB9lJd_SH71Se+yQUFIQ|-DqHQ30l$;AX{a!2XahR?{hkUN-x?j2&4muJWIEo zhJ0#os_5O11XjZ7YYxzt2kA>aJT=rBJdb3T0riAh6^pA~x2=RMbyz$=O>KRSR$bhW!$b=wo$u#>({Y3(Y3&q*MIIqT9{U@M!ty3G$j zKqkYhmOJMlSTK!EFD=E@3MgJ5gHhYjuj^ICT|(Z_;u6K^why*4ntumCNelf80K3|e zMJxdpv4}=t=~&yX>pCE7$s#s!zhN2XA-d@Aky0bJU-QiOLFTpJ0kCdsIV3dZ7`U>4dBwOoSGf733@C$c+P9npnG2R_je-?Jh*t zPGIG(Zf~T_g8Vl<5V^GVAm_e|QnV2g*)7(#(9~>38pHhR<`hY+^$BGF`$Zsf<%UZQ z!Umj@u2w(!*h@C+wv(+`S>Y>?LfV3v0Q7r!mDNKja^zX(oD`gj;VW)!GUw+QggNwW z?Bx#V^^DliIecFqj+$y>G(CVs>h7o*U0IN=h?NByN`|aQWp_*YH<}TM9P)>7#79FB znE67;?5VjLht!kXA0Um;jkU4Ug5V`P!;76$;{?ADT1s{>R-BEMm-b@jL%q6Q7FL#f za9(-J3KXYD0VYxmtY$Yooyic9Ap;`H3W7rL>oRqPFo|`bk8*bY8Wf<3am;Pw8L}}$ z0&!nro(ou>@8WraL-V|Ft~>xd^&lc+yKdVFgSvhq<20Sf*?&}4u*9NVQdUr6QKpEs zvSpnGdF&ikPH-e-J@Pd!*a4?SxBUt-YfWTFaR|%&@@tN=Z+mpzuWquG6)X^flYm){ zcd`a%9pnw%4e2;;P5??_y-$J^9OOm3%RmaQa4OS)MzWl|5nD4@XU4P4+He+$o%~lu zf}}PfNtvA3%g=Bmk3g9=%FA5PgVe#BdU-s~4{@$~zuKz9O7178B6Cv8j=wFF({j(Q zKt#e=2>V%B)>{L{Xd-6dtQZLTBl9h3Kwk8qna#Z{8mGcukN6y5iS7fA6#$~i4*)CA z3q-OfQp7tj>BD=QNxR5STYc4t?m z8ie3*IU2Q=^+a_&m~x^~j<#B3+eMi5gR;hLIM<=rJQ?bA_+aFjWaD!kk;rBl^^Ux0Z>S(?uz^s^qOdy+H&&seP z_x}JOFAGkjS0{@_ED4-(Iq3Tky=s-KUYh{oln)pbmkEBxM3`Pg>`5lXG~)tSf{Wck zSikacS%sBu+cwW!6xIBs9>hwS?1g>=ZFK8cpl_@yY^S%uJ89IMQe7phl!>FOv%1WhuDHoEE?<8?x1k?g`2WRic{ z%m!T<16>=}g0-~hwtM4|AQI_q@shVC^U_*ab#TpFzlrhYwMf^o^K&r3-_IM5?;M^M zI#{WIW!gP~t(NrZ(fqkT9^Mgu-kZZ0WvnrFB^D^Vw^Urp1P~_IvT@%l6W09{Y+Iv6 zb{{A|a<+`h!Exnc8K9KWfQu0_$pkb*&RvO|v7tG)4aqC3g*Q(J7EJakAnRw(f_Hky zWHxav*!in4BIIN=@l+EN{pZ4iJ^{#qs_uaBG)SeNOv1FB3mHh^RCs8^&eZ|6P;*0d zD5_?E4sY~`lT{|d`s-?yV5aM~Ef9}=I;*ctHuC}r^NGUbaS+sCo{&$xq>qgWeFCXf zEgUu4AQ;4I160*)PQd^qdTS>4i~@0MpBUQBC@oudLt z5{6(2&gf+*w|BmaUz=m?$phkssHC9P@4+I>#KS z@RDP4IDoS6mSWOZjEmE8Ied$A3D!5Z7zWH%9O@2UNV`TRSEm&t6HP<{awG}pt_85T zzVBr0KBOzdK!;FUbbrsc0e8zI7s={?u2=)4$<>ZJ;Npw8@(F;i3<2z2`kbG9>KETW z&@;=P#e_&rN%fK&om#5277blqXzoH8W_xuBB*&qob-=iuRPG9tF17eV-O3!X2E~29 z`x~z~<2xVO5pcJP&m3Zs7f21ea1C5UPl00Ny=bXLB259n^&&Z!%7!#dTjE8rKVa;V zb6aA6Vc8(vN1}c=EnnmVv^by}?n94cN~FO@j!Qkqv~-zl_LA@XJzd`1<5~v3x)1rp zS;wJx*&SW_FbWy>K$X6Dbs%^njbDKjB37eVq4w&^1E7TF(%2(9lGslAVlIy^Va>uB zbfHwk5F+c_{dyCKMGPY-YnY!+)F zL9C66wOc1e6Ab2ub-g&Z0j6T7FAq=RVj8>x^~dgjy66lS1Rl2tfzr+uCbiT8>`@}y zkoVG}tAU+$h3c2JlezYu1`B`(Gjb~|q$xH5S9*6KVon3TLyqP?VC`-&D$@axerQd! z*Q|av!B0%}@&m0U-Cm2OQnAUT$f{*j=4S*`^v$wfFT0K9$6%t5Bb#Gw(5&kAWyk0# zYoe90I{=m44Y2mUE$|iw(_BYlFGC>raceO-Tui<-K5p?x2h5WC)r8r^)K&bzkrJuf zYlhmECwh@WS6n3s?xx@*te@!Eg5vk8Qh=G>l$_evp7I*XBX6p)sI zeo7egVyr99AFVil60+J}ptpo@ZllM<&@bXGQd_!$u5yzV6`#HYuXnZ+o6C}=(5Yt2wQX#yb<>A(i}oq?5o!;)B8G>o_Y($GF7L+v*xX0<;h z_#Zkx4RGWojpSqGX5S#9Iv8I|L-l|o>g>9Cjp|N4K3_)C^1+Jq08T)$zidIsY}RIW zOLkSchGt#KI!SuzjC|hRfoV*3c=&3hnn%r0j0U3f?5W5*Gw8A&b(W-V?-(Yi4S zfoA`4U8iG4B|w|vpgka$ti{bG8cBlw3qd~t9cUHxPGcy}SUV0Ay3y)qyP}Tm3%oTA zlz^H-_WlznjaE;O!!p5i3&7H!6~v>^4oPbvit$@|MGhcrcp_v(1DbZ7k_k-)EQ*f)+@b43XQY8-7>e z;J@g^eN(w=6OIJep-}&CEacYO*v(9EWh4Q^Rl|lW`=(43>q#v$+)YQTEmU2CmPS}4 z7Baga?SDlOxL&TpN+l?g+zdiKGaP{ADs!a-WmtTh3XJPi1}_KJ!2m98UR1iFI9Dru z4a(9c%B0%K8W1+OWa8dLJgC+Kdoj<$C}RExKEmb+SQx;s;_wcLZ8mqO8-#R|P~U9s zO6N)fWZ3W>Zzl+V=C$$nB_MyV0m0k65Q^bLQdWqIo^E?&4a2~mI@G@Jfq+_gO$J+u zINY^`m{9W`8keCerjP$<4Z|=t77)z#tM0V;!w=Z~;R*-tU7ex#6_ZCT#pH4#nf&C@ z{Nmi6V)9vl9Fj?Fb(t7C0)_ZXe8~>I6^53~H3dqG8A_*O#8kg= zPk?O34IXaCoCA2GzXos+dVuJ0UnQJ=^*k%t?tnkcI_(=e~k4c&};?XnMxKnXK6++i6P!(vfq7m z#XMPWl%rpmWa9x+1VVRLc>%{-#pS-x5yk9v=PH-ui~E67%2d@Y1jisPE{n`Gylar4 z?XnjzTWoBW^tMFP%ipWx!V=q&xf2lk06Z&(ZpZNX6*1p)0w^J_Gn$oLgRmZVmVoo5 zvDIBOyBozoqg>j;Y>r{`O#ng{yBR4@9>@0^osl`9)@=>vT!D!<@Q(7tA~)}{fBFCrWLAUj5EQM&;KuzpZ*YCyp$ zKt>w;DAQ)b?|@=14z&kUn^S;6=zb7gpme|98r%ToF-ef|kx8)fRu-0|A{CkGdv0cb zxOc39GnXS>N!?jyMlBhe>fT#^Eg)$dPDXdf(jTF{vhI!7*}seB++A|dAvt=|2nw4V zja?TB47bvSKtkfW2kc_J>d0)iq}?g&lfU~XDEx^!K2iHdt{4GiLN7Zz$Mwk^jsN6( z77^RpW7vc(tbU23cgFJHO&qo>rpR3zXV!p@|+jnR=UMnBcG3I?>$PM+FPznQhS#wqv@ro$;Eq}nHgA%fZRSX7=c!@B{Cpo zc4?LmfHw;2jub3UB5hDu8ER*Z5F2V2tH0$|aJ6sllaDGtm2!8A)w{5&Sf(;dZ&j{U zV|L|2HI|`_QTt56XMK<-^mhSuzBYBIHTGA`zV2vR3^|ggyV)a#kn5;BJ+YMxszX~2 z(J8@4)Pn=+*QeB-DdM_s(zGQ|Q1D(TM9S2)QZ;sqa-$j>rc8$_FUGn@t9_|rXe`iT zPqR=D{P-%UWtdg~nrblDM_R;n-NUq84CS!UH^a1?IAj(;ikc{{JD62rmdMAN2_mwv z`|-YqOi-*374D5Vt4xEK29o^`jG$C!Wc=_$dZ36&>Y-mU^|LW`C~%qTE)+vcc}lVX z+pDYqGvA4%sjL7tni0C}2$q{Tt%XYgiZ@XCe( znDvaNcne%&=rA*^1yHTu2I4VrZ`>rr%~L^od!x)!kSMd6@5>>KY52Q7hc z5GvXX4=emlN<8L3Tgjy(#UTw8+E;+ZSCwHx>M&FgF^OJwz; z+&m9w^SVEaxVr!IA8Y{52Uhl51R+^{bmC!F*E3j`>g*RZClv4~PwmCLy6u5~pcN(O zKGvM^{V0B;Q%O!$DeDy~yC9ca*{(bn&}Wa23xt)-pQUk#`VSap_T%iAfVVad>MQer zcgT@9omMo^RUPg!Ga;t~T{>`cHPmTBgD9w8Almooz>_1W58dZn!o+X|^whfFV2wLQ z@uh5u9PwG@NU@b~HKRbM+kW{L_T;aqfuqC+%N$xuspa?F@_2Q86B<@b50<(R#m78+ zD?!f{2u#Hii_uUJa5_N1Yxy0_tMM`kS+Kp~5HC3qTFpk5g`kT|fM66k?5osm$KFJt zjP&ZZ18;IYLe_2D-ejX=4e7xwwOw*A^xqh{GI&4P<&AhO?hGYYulF0<)ZRXkyb^$ zkg<*_-+iDw&#Z5hUyz75YT~${7pAdc4W`2?xbrAyfb~}H%Yo@>L(>11NFT}4lXmeh zQU_svk%S4`>6TQaGuzUm@hz)BWR4XE%nePF!YN6k^||&Rs}6U-cow_ri_!N1kP$#R zlh*u}N!yqf&k0$)NJyx|0G92z*JAZIM;+#0kI^h~m{o(oy!1X@-1b0KGao=FtY{u3yK@|w5>b9e=32~U6!7t8j6p>3om^6QU1Qm@| z;A$;E{(r`7XW?ib6SYeBZsZ<6g>NwRXf%B@OAsPAz43G~+KT;b+(4&;hm z%sJ@B)l9DMN-@M!u^rhl42H80@rTAAhvC7}N%mfh(I>C`J2I!U_TiIa6j|g3CdanI?m8Df)!>2OL4UZBKLsWe2G)T`PpJ%wMF5S;qT4TN8G?kx@-31&!PwfX#t>ysoEt0 zvJuy#02B!d^55`X0Lb77FIj^kNb}S9i&)UiUUVA3!~&AN;eD8@yKucD=J(*;*y7%` z;$pdU3!6<(v#zW6wO9nb0apT&{VV`!AJPq|SBFhbXjvMx>=6)LK0ry(eIS@kp2xb# zPD%erGn1|Ga34^HVUyFL$zsT^qX!6Uuls-)N{65~%vu>c&Acm_&lfDIXA5jVPHzcJ zt~m2KsH>6e7X>r|P5CQl+*Wj>YeS<|UEK99t_E%c=B!VC=C6F61llIq?HVpMx{|Hi zehcwxc0EMsOd}Ng`9A5{E&~zshIKd-st`}=JyxMv8qZwfs#@R|-bsjLi@MG=AzS^yJu z70+?#q^|#v|AB7X{R#|C_Sc8dIIr9O_-c}o$skdzYk?U+f0vtxR9qx`{UPQh0(8n? zw?gbFS3B)uvd0q`r_Q$MVWXBt|NWV+yY}IJ_Fb8sWPVLZb zE*6G#z?f|cPn^XP_hX54+CEP4XYQGvx#xxJv4*U$r(;}wPlw(TUxNqvPbBB@DBF@y zqCe#OGdTCo$Tyeg3;e&$*Z8#{e2~G=o2lE1|IB-dxj;D6&SW@4{>db|7I#m|3M`7z z1wwqOJY6=nxazA4*nUaYI=)|WlU@8x{fWkHfl_HYXb%C>9xz5FvDP!vC)SpvULOev zb|2`a=aZYV0`B(m3?f;K4FMQ8QPQKZ9#8eTx0Zj7HIV3#HXtqoBnqm>y&H9OWu!l4 zzEsM@;@qg8d%x8nQ$nvO;&Ddlgq}9F(-2=Om~0b>n4f!{>n&}dvkYTqMXTC7s{9z% z_X5hr#9MDk@LKCxHZ#x(<}lI1{Pll?ggdbZVn`qTGuo89`BW6EzcHXRYNVrP;gmIq z)xmg#c@~o#v(>`iLlKZL9}=o`loiD4I;NLi`feX6(eIBmqNHQq{RR`Y(Z_bdOujQN zhDI7N?b3A!$Q=L6!dJf6&n)D+?N=|MSI~0jL8#|qDB)fxfu9Q)Ka+6<+n`p*`bHNW zgJlr`4!}s_KC#+6{gGK1vBSq2F&c`H)-o$pB;b1=M#i7JS>Dwv=fd3CLp!|ZF4v0X zLiTO1W7Bq{#xR+I2BiR=l3+0-cnmO3TgmI#AFIQ_l#AmM2oh+}JGW>tMzEsR|s9X6gK#Ju6@p;yw!&AWh znZ#Uo#aU4(vaQ)iXE4Db*a?4aVP6Lb#Yk1%iYrvV>;k>GW0^%JzP1{>X2nw%AX5Lq zz*lV(Y1W1nEa;d~Gk=OMzSI~g8bAx!93T)ta|IB|<9TrcS@1)CF5E9D<_Fz|owF%M zLF+KnGwOpj+{zz=&di~`Y*=DnanVSuZe=g+Vl~Pwes|j=#kBGpq|uoMkTJe00tR76 zE6}0<-#eSiO+sW3w+hvu+fwg9a523ea;fcI^r3`i31Pd9er=^zB~a zh!@s)j>6nfSd({xE?|jc(TOT(r^k=5a)T~PkDwOe&@KwqKRUH3jX~wm_9HlE=vSp> z(#=Pb19SOLx>NR)-lC z7g^QM24Jxb&$g2yJEW`Q z#u;#5j&8VB5PFL2Xvq|-BPiQ~C_2}g`v8#L34AAo*J7Kbw0 z)lPOWUn5&Fa*SSGtUk)rz1h~4z*cGu+NceT6`)HOfRfF08mroUS`2LlNO28r&U4R{ z#e)`S#}L1FP#2mcG+?&}pQPav=+s^WI^ZfMcZWyFq=pOdvq9Feef9-#l2N1*b+wRr zQVd-Y=(m@1!G@SqP$(`avMA%2Q&bHD%RU9M!E_qE0>O$bnAFWmNC}Qq8B9u3k=>xB ziPn@8;**AfM48Xg?t`(cEDdJIpBw9ftL>aVVU4b z@uv%adV_6Um03<9b_=%;|9|Ac9Y`i2obM@zl2iB>F*b!`e`jng&W87&#cBOjpsDEB zJ(Aw+>p;e=r4>a?PT;=@c8%N_SWJ=~&j)twM|M1dvt#^4$tLV;(?-TQv*8r7HC?#? z6A{)lgl&J>&l8bti@>(aW`yUL4g4SY_F4AS#Nia5>&W*w_p$GD?){u|A4+iU9SP38 zInKG~&?cJX-0MpcoO{_&&b=hbY;TTp?j>{;jdO0a9nq&Ka_(3qv$IjgydN$Z%Dk5i zW!{73;dXqPH@x`nfuY>{3SM^b3VJc+-1}nS-WLJjG|s+9&>`$Ql_tmj*9VjAdk*q~ zbDV?uo7R?Wl5ZEV65)<@X|fY{#5X8%y8Vo z7x(EH_=*JvlxY~~z+HHU* zPeAfrS!8iOHT|ieSzPz9J-g~j=3p2c2enxg8?>rt7IVgAUfQBJ8pd{t`i&NGjR8;n zg+*;7>X~Y%Rjs$C&$6pOwg_?Tp6Tn3+Z0yZub4M?h{HOYz$J2NR3aVCzD_hegcp2? z12~43e+}A=9?qx!uM-PkY;!7*st!b2^D4Z#&0lvzv(y*ZX|JvT=>=7-_8m~wqPkiA zdcth-Y@cH$NcInOm#p+&Zdnbw&tibB>c{!~$Y?4;$xs3PDlx9HyHgQa2XSZo+Eg4$ zF?1E%=xJAWc~>sJJRfu)R1Z>)NNuMjapQJx&4UZ|R%Imc%uLeQ)3(~6tX97m2$192 z!g%D+77y(lsq&_0MtXf$lsFPpM{DB9EkQ z(Iw+2{>ZHcUu0pAx5k^7?yEkc+?xP^0t%o2AX*Y3Dqn& zF{e^@oA}JnOiVNU=pQiQjh{p5y;ux(x>BsZ61RaXPp630&!(VXhmtK-UYik2s|@5> zOq#j!zC266zjTwI>@OzY_>E1#mML>28;55N-bY)Vw9+R`A1hWPCzP()q-56^Wxdg_ zZ;owatF4d9dP~4fD@OYxJ_GtVr{W=8?TG-PF`TW?v))9{fTx#W*W!L;`sR2aYk$Fg z9dujh=j^SlV8y4(JuCq(sRpeI+&C%hNTt-@QMWiOE58 zlQBcf1%i>{`qUPk-U?DNCPJxyhf)<0XT14Ec!jc{PXYIXRD3E6rhztLXq6t0uM{mE zalyLpC13b*zph-d&>)6(rLaRuVl^5AWqoV6u@Xc>y)pJKRLnf+G*LZidU7O@x#u@qV3tbl)1m#O{P38=7W3>T8c>0Y#^f^-f#mMNk>aie{s@J<4pv=+++1Q~i zI1?RisHz6&T0NPveE3RZ0w);jy}Up@X$*cZ_8KfHw?i8N`04p1j-k?adL^v%#P?-@ zJUBot;j`W2P`#tHmKAQv)%ynm1&*@@?!injSrTu`T-=&u|Sw9Wd+t?IwYH7ZwYLBDE6Q4(`E;!O;p~o zq&RVojWCiNrrRjt?lR8<01zk__<@E>-Z+~`-K=+I1@k%-4=lfvR{A;;bs?#)^z9uI zEJ)<7xh3x!Er3*PP38}p%fchHt6`|*<_25~fB_omN)OOh2Cw~-*FhG*nnr0^iMXcM znS3w_kpgtRP<#pner@78={k#}l%tT7HVhz=L9zQg#o`B@<>FQt-u?ke^nOYjwcB;u ze^%leYX*M(!GXj|M0c}S^l^$wr%~W}FlZtNwD*8M_CiwZlGAAB*2dB|4zM+*dNAwo z16%@8HeRmZjQ)&sa(61LMzlf}l+lgqUa*T$FN z&0V#nMG>Xr2 z*Z8CRQDmbn`xEPzew z(&x@+=ZD9#bSU`YL9kQ*Ns47jiOex%1CQ+?Gb!wvWNT$o}mjF-f+1Q-lho|O*1aX&@69F zc@Ze1n=ymhP$EaJ@8QMZrt@Z!y&4kAyakH$Ua|TL#!1j=92ejzXzVR@tVe+)5Lsj@ zHhxuL7Xxp|htBk|Uw-SlOVoBb9M+gz+IQp2hVrx`yA+a%WDXoVz4=I{nr z-aD=Gj7H~W3~6xM_Z!7~Q@GLi?Ur?pLQfb!8Dg29$fG zZl7RK?!bp7ILuG7oVxAi8fGo_$)!g@?f5rjWnL9B*{psQw>umuk&Tx`{lw%1M$AM3 z^ysSbS#;ZPp5bE2Pmm}1vh-$H&GCK)cmMKgANd+MxJ(M~X6>8q*730WboYRgQ5kSs zDq|t!;}Ne@Z}Pe=RXrVbc98D&5Qd?zYmqZsTT|pq2jN zlcc!{X6DUavXdS9VqN<1X|%~89ANe75Z_dXKBfcLd?Da?~F^4Q%qtRS*RllMEUYu)1%6N!l5c^Z^_D@>b3Ozv=ech<-Gws+L>+f?P$Wh6>iS1Twexhi$gZU^W8w~GLPI}I z(!^03&OCEFZqPph_+|#b2;mBB?vMFam>EaefoJw$nMPNwt@I|mMW%&556l5|!$HT1 zbM4bI&mAv`xw>6?gxj^QeUiFU#}lOPoD2JbSR-gP2$X&S+^h!%=6ZE{r=Tpl zo{a45o?%y&yP#IBjqUTA_h357>SSlhToQW5oJX%h=R0?^GD&ZO>Yds+U+7416o8~C zRyu|!!h)|e7Z_suH7jG}=TPiO^jd0+EzuJvnVMn5uvF1Iz-e&~yEO{!zYF6|CpcRe za4cicb`_s8eLw|yxA57b+z#!%kb-)RVwkEMg6W>>ILZi(-_ z{?BbfN zEocjv(c~Rt0qs!9f}T#?!xz((GcI(%w%ZePD?aN%I)WM1{xK)v*FR3qs470A?sw-D zLoF2x&=roHkeT2y`C5ol55kPnOMuIM3o|O8&8VxP?q5MmS7B_oHy>tHCPX!}^OxE% zdVR8dpb1DAb_+YCH;&#EZ@@)K0J`R*A;ul%dx-Og(=ZYQ(6KTRUM$LZnfR^r+7EQS zs?^@o&wLUN;vSW;r-WFy( z(J~NG#BYKaIn3}9+daVOV@rj7G9HpCi2fg$h3Q7B9(c4k! zb}UV=bPI|rq$?Lyx+ezHVIkDT-_(;{P?G6CZeeRb>fi8RYnu+>@UqfaT^~Gg)(wc~ z_SIGkb8zIK5#1NCM%3;?(;0fujKksnHzZCk#KY9cvTw$QM&=t0tcHV;SqA2jBbT<& zW;5T#4x6vs#f3aTK+aF#9os(#bB~;efx^fVgL0W%`c2{}9etKLyQg8E3MNv2gqNIs zJ(n@7*(l7(rA?scLqWk>D0Jj5<|Rf~uSaQRvS}A1w+n@4^Htw*m$>A80cUxWpY1rF zv5Q@Eko{B}FooNBaY1xXjS0+&?7y7n4?x)qi^(xR>6O&`aRz-3TtjL$@U7-{B`pw6 zLFvzR1jlVSjN1{*^t4kZMg+>P-TY6ks?E7{=^_VHIj*_3w0w2cI}F3 z!}V6IKeZ`sJ~R=V4C}v!JD0_JCs?|)0HAX$kpP;7JBL??wvLc4^ys0!exEK zjPY)2ndnOi2^hz40PE`Q%zcK{BgDaDBO#9M%J@~M6ChLn*Fk@_Msb%JPWls1aMJHT zpQ$P%|C8`pLAJW5$()K?9=a{CoXw1n*lEJTM|QC3iI^3FMi2(ssa|$d1b6U=U(QH3 zpff}%&V1ak$A1%K_pyrka%liJ75nsxo8-vIW3qc!IW%|+HK!!~K=K0-Q`ca*?1HX% zsXso=uPpRHQ`T=sMzqyc?+xd?0q>e|aK}R7+st?Wm;HK=ZVNw-%H)^4TCw^yEEs>Rc?GTY#4_2RW^7!NAz#g8LXpwN?>aDwNu zH3N;=io{A_*)bctLdVrQSY-=ZaSsa32T&Ll1;= zWrJYL&DKCI1QNuwBjb-iXA{V%di!HjJKkIwc-S{;#us>R~%Ao4bU??@ciZ}BJ)zq@1J znHy+Thfz6l>C$_Z5;-Q5PnvxcZwvHBeryP@=_qZn7vAs8WC` zk4R|9^k_yO=_17oz2RWJw1MeIF{^SZ{!GH3G58~@eV$;o&)r4#h`(vjhD&6ZmL-vo zv^3DiwG^_4G_4hILv`M!Nl}U238c)F-1SO9A?|Z37Z>7v`^x!+xW}nnQi%3kWon_2 z3Xfs#sFD+NqQ!@NrHzo@M_aF!DZP*Tf7rUu)?#PE#oMG%mojRld7xPky4xoD7Ok#~ zNL8Y@1(Kj=9%YocE;d#Y*L`DEx0s+Q5RbhQ*L|H;kt$`z;b7SZxN%wryjzttcpnc5 zRGx*`rJ>2>0=lp@f#a)MQRTr=rn&G+gxCwr9mePJ65l476whg9@)GfFLsdHuH#P#1 zVk(i3y_}Q35X42#*U6k|LIlNMHngN^Qq&y{7O|ZYPj#140A(Z!g-&!&IA?*_A>CFq zq|o3saw%RoJ8LgVs@&<(($R!wf>(=7=5>-x z>M6pN4QqP7BT-X)y9ny@W%OcoSgp5axdr6b%yTv-zfxM+?38PKZDI&jAYZjEhW`qr zCRKl@1WBfkY{u=me;tN_^tB+C#?Y0`po8Wkv{DQW*?CmgW9ZyOGUdp;-MkHD;T5~- z+D_)PIJ!(-v3qRLDwob{L3lrR2iOFqqnJW(J(ss1L7b5kr5%2-3_bZBn!lDNL-+hR8z3 zO_sQ$V(4*0e2)=NQ2E?nJz|yAQ>I5Qg~q*9Jj&hGrV@F6kD1 z03`fj=#_z(23*`Qg{v&v638i>lJFnv`y)@)3h@@mWzci+>GRMs1-%!a8DOpDoqBXK>y%i1f=9C4_f3vl zV6Tng?UH~DY_+t($ZGJHZi2jWa@7YOU`~vv`N+d-7Mb1s#mZ zk3ILq30N$SIQwZvViH5o;W|;>1ubNfE6(UA9%lS3!Hbe?2$)jO1ms0{)E~Pmkv+Pt zZb=*;SL(L$4>K+!ZGwfjbex|wGE*2d0BvB{fEktd*)0PwkcX}V0xHLY=Ge0>tY>|R zp6!ssrVP>?yR?rPXp*kr%RzeoT>~nd2^)Zi$)qSqEyuh2bbi&8oj%z(xHM)q;?l^B z(5g7(Mk-~my4<-;05!2E`Xsv@4aw~{nDPPM3OE(d`Z~O13%hS~50h@`CwMh;2P9kp zne$*N!$a6|sR+1ch>qCmKjc1^=wC@p4UBOTkw!h-JER;vGetf2Q(aG5&pdbY^CbBa ziL$#BeWWb_;sxNG(FmUW^AZ@dc0VZX`q}=i=g><)Bk{BQ1yRr?o0ws03sb9GgJbDE z4atqYZ=%p~+=-065!bpuW1D7vvWwpEG0IOMq4^3*M+UExb9=o& zb6AR-j*rFrA06y}eZ2qNR*3x% zD!|V;9c<(WZ!*?0j8O=7n}`1!)+}XY{IUZZtS?eTPN8puoX$@=^sWBhE#QOxv@k4k z?k@4EKXSvUrTm`mXqs{rx>aYcG-UuLYS8PgJDQ@1WdtHrno<@vAf~#bCMBCknOKYo z-D{&UbMPkqVg$V#(q)#&Tx`40`xa4e0glA{YoQKS0iyf_Mwan^iS`ZgzjX*g#SAPk zKyJyfK#>kPEOiFZ?Ur~mx-hnv`Qb`k0rbJ$4V6uZ;R(v2<*kydPNHXD`FnK^Q||#K!ahI`RfcAj67Lb_n{d7-z>g2gXfB4_}P$ z#CVGFykU9^#&!jmm+$NTDvCAut9qG}p^A;Rnz#`jD2HAZ!`Zv_#l`RygmB@X*$6d^_H{ta$4XB!f3EJJGy& z9B<#2MEksknuW|%7H#~VZ*kRBma-QseN>KQ_pmd>QRP9IsENkkqvi|2`7$BA^{vV% zwE%Buc=AKhVYz~0qF&u3v}K)WR0z({TY`KFD- z%MkSe(x9BXlNxy390Ly?e}x6H82UATFJXrZ&A<5v+nrLzs%sGq*sfz9))oYyYY{l| zc*#bNX!AS-FPPP(oF@~J-SCNhG1Ffnocbi78)UN^Ekjb4vXo{A-UqUgxe%P;A`rXn z6~^_Gcc$S;Ntl0nfD8|~+m&f}l!0uamz_q_bGtIZ4}rH%qx5|Zeh(sIUiA*z`q~sT zy@qMpjYIAOh@YdL7iIRc#A%OVwV=`2Wwovz=dv=4Udhs5z@V1PPi8;%K5kk^*g1Te z*vPwh-kTqD=KyT)0`yo*WVVAYdU?o!_jB+2IONFf<7E=tXkb*e)r(g}(+{_!#JW$8 ztguRv*{L8hGvjIZ*B5Amq7oPJ8#u464%^j@QQ2dz3zskqomw6iPT>o z37GKXMuvYn=;zxQL8PoqtF8}zNM>fS>znWh;u5^2lgtENXDh#@GqfZn?z_srH{_sI zGP^&@BLEn=HH+QkAMq{0oBd^O_h6TaH@aHUPDt;Vc@FRpeje}491^<;F`jAiOeFPr zO9C8H&iyzLc?nx0M{dXod5c;k(GKKCcA!~FU` zG1D_FFEPK!LNK0eU4f!_4U_AJ%$Y0xlsqz@^cQ0D)q{6%;9Xtq^b~r0PCng;s#yO( zaB{Qxn?}ChsM~7p6@<#=Ks?Iap>n?FQ~OT`&ucbsNS z#ADLd^Fp#PDNp?~D}+sD5BH0)$E~{jgJ$NwKgDMY`;5eK>et!z7`=Fo8@C7W98qjk z3Okbh*LU#?4KmUEWV7@>R#=eFUHBy9Hox&Op6*lo%;m8vou0P!~Anx<|zgu*kk zyx}s7W(?m2tM?OD;B;$oSphc3>^22CqZ^>Zp}GNn0_>x+JGQz7iT;)c0kJt=;Q9XO z=cWy4^1U(Qz1Zp}EmFQ+xjg@NgK~+uW;m!Z26x-iF)+b@lq0P)O2*xi#elKJ#%=Dl zM-HQIkUu84)34TBijAN8a}NjC1Kz5RV%M;x$|UuuNg1sk%~mq?ox!o|dDqtSuC3=? zTaR4}QR^vu{t;&#*-1B^!i~yKcae!-F|gKwN7Wtdf~XGk zFaUbFm#sd}^Lg4L)iIEljswlO@w0KDNd1@3 zConx(Ewtembb=$-qE{$Q2fA-I>mMfFDH3b#CH5{P^~`We5%~DSAGre@C1!{)k>?Z*H^bIcdt$Z{i#kLVE>-* z!`jdORe@k#j298sTLQ){a!)xTzvudN{%-^}>S9dVoOV}^LltUDRR zDh9Db4x9hD0Sj4nM?C#Po?ennf10J2B+}D(x;>fx5KGTbq#wKk6~YckxPJo|>?Z>F zE`@>XHfsXz1AGaa^8rZ1k7Z2Tz%O?(PuajO_q=ce-&4Og;69)%U|CEoZ+14rLYHp) z_V)PK@4A)g?6yq(V|-l9Y?BfbWKs0WXBI;#a?^Ln6ZGBa4$|#)dJMr-aorJ{26UYL zm-n%@oyrxu?T@z$@v9`-k{?Ya*)?&15xQ+f9KgaZ>f)bgy8V4bLTNn3>LuHY+2I5R z!d)BDNdx$z_$y}pnv>j%yfc2!l+V>3U>ZXXHY02@z!H#x<~1_{#SqAfK=h|?C5{rT zcGYWdCG`|M*4&227KX|Er#yeAur%q$Dfzi9yE%{kgCY{hTijCUy()R`kzRIIhitpDx7Z{^%5-s7UT z4Eh)UFwO&S4tA*HjlmB6UodM;G(&3u#5Kpi<+{wF_N6?Lt@as%qloz(SZ=fnhZPZ8Hd zHH)~hm5$iRwseA~bfcD{CqH@>YJVbdF5S&f`uwDeeBxOd^jo|bvir$hc#FIdPhNe`C(m)lS!(-GkA=va&b$Gp z7`E|yjfOp!Pz+nR>IZ^3`{ofWy^G{Xait%o0qFx)d>;r5_*n+_T?pI;L7#~E@OKL> z08CTI>!{|o%VFQ2QU1S#imxZf@x|Ae3hd2a@B*5be5>LzI0}LL($HkIL+>uKdjgT{ zprY$y=&x)6+e+1~>|1RM@rEOJlQI=gTTcp<)&pQbK{uurN$q6YM8yx(mlPYTTk+7D zhF?hnkc$8Wh9LjR;6<4Ge9S#YE^Rw&+syczC_Ab)BfnC)gqFOPZ1z{H&)sZ^G{u~0 z=;PInml7|+S<~!YIZ-0Vy?{3l{>VOPLU`UgzUnW<>Mz+D=>>JtdiDt!(Dx9%p>DBe zeJVeo(mB0k>3M!};(XMX3n~ zVIioM7O{FJ?p2Z&A1-pGX>41z`dJHqUJ-wuh{x}bKVOVLt5f+lt`nOAEl_*!6Ms>` z?iqO~1-B|Cu{xjKX;UOtnUz33){X# z1+wVP`HWwT82eoKUP*&Fl?#1h?Tx+ct+aAhFNDxa zC)D@=ctL$EAKD0U%P>x=gqf*s_h5oVPK0zZe0~Z`_M$cso6nGazxb@th%Y~WqFwF% z2|o|5_CCZfBv*SM=0;YvcZpJ}_Ew11X~>{@gYgSjdzXo!MkuK6LTu9%URO>_Inb%;v(uk+#v6RZD#pHA%F z>`-9wyjn{MU!A~U48Por2;v{4fr%Ah9#P&94W=P|WL2aWbMnzHV*`YxjD%m0l2$B! zFsoM^4MPPFD~n4lE`@iKkId?2;cQsf9<}&;Ilc*8k72$O!1*LgGH|Brd3ED4LAS*np6@ zrIiNAA`}9_jAFTLduy=;I97Z+_PWve%~`R5YmK^^PFxtY zS33ixORbPty)B6Td)1E`>U~ zwVhuKRkguB&@p8lbsoVYZyda$5GWJzMDAh_7b$EdqS{90 zTp1c{EUwA#283-L>r$4~o~v;&nvxO1V!+1%e|Lz;=(dO=v*_E*I7&e5lnSE}6rph@LWTg_^0uhizrhETHsvxKB=oV4sL}@os1!?z<65 zUZQQI=zqFx0R7Lz84?%g+E<7MxvI2aM5et3b)B&KSI!lia}EboW=VswGL;NVJw#JA za+tks!9BV#(%VVH7EYDuAx91o?t@+KzZohAz&(ZfGeBx?y8u!ndmSLPs!+s6<{OHd z0a6Ety+G)b5+TPX!^T6RgL2+!z)9f5jSz4xN1QZhT6##_nI-wSw7b^t3zeXq7>c?F z?f9FkR4Nx^7gWK;zILNYwxFo)=rOP<#pJjQAuw0wlBLXlJ38&M`PO3yQ+bC7a2{Bh zD<^2lbTr9^6ABzP!lmJt1=qaJo~$z9W~?&*0+EWDQXy+)kc?=wndpBHs(J+%Lu}pY ze}7vW`X6d2t`X}qhxL`;OM_SCX=%_^ehdRK-KX-nbn>X&e@SvJAOEJ~-!%M-wK%@j zsF5B0(-hG8!P71kY$h2a!|kgp@2zp)s5z~Xz7 zcFvWqY@9DVC33dPuV7=rE61*?PR`}h-I-Pw^p_{qyi?=f!5SNkC61lpd~+!7+PxW9 zUx!rCh+=DrHli?gz|LrkI6R>n+LPpeS+Jmwg9_!bKK8E8=9GE2aOam#x{5seNjW>b z16MgXF2p*%vX*%-d=0a~7rjk|-*m+Xrufz&KJG3)&9u~J2*>H^iIE;Pk;g7a7F_la z-|*<{%}GxeX8=8Bsxce%Mq3MN7~d5q*}aJ?Am4Rv^^r5|2gTZtcl+1y<*8Q%1^2A%T>}J|BmzI+X9nlhrhwFY8MZ@5G@m1fD>>&wl$9|sxcH{ zRfz|lBroE?v}nht7&KW(^Dm0?z!u*cLvaz7`22>H7o77otSZOAiZWRKckvNyg{g3U zyLe{9(o?(GlGvU}^3;$Lq4}qfm$)LYDjEac0e(W1!=kCx4cQg#xyOo=XqW$8bU|qR zMO0iXw82+xL3~4K93%{C=b__05mMZtCO2v#fV_T1Y^x)6U^-SB5@oX`w$2YZfn90h z#v#5-eQ>hSs*Y|k6y2vOr$eSXISO7N%m~Txuy-+R^0W*&omN=un^p=s4XbvGGfPP7VsQ>X0k_~I#KpDFE(37u zEd{sFD%|IRjilYwNivQ@X^0x>ywG0@LRlhXL5gFSDP#|gQ1g0MeoKP6)RS7DvR4SR zeMHQcrV_Iumc;T)(>}9Lyjaqj-ZQrHoRF+-7JPDC`JIPyt&);F{uTKhwh(-hjzmI(OpoX2QDo++|R>t7!_)y!87N zcC$zd<1RN%VPD;q6ynyJ%2ql>7nZ6`;*K4$K94JaHHrq-r^uhAO{Z-k#H&`Rtc%aD zqkMDsy4Psb=A4lIVtF3*cnYpz-64))dNgF`kQ2vi&5r#V#kBa*0NPC5ZdC{M-1A%PBKWG$twBc@YkC|_VU2y@)&79Pa7%b5tkQjuF~_s?{GNO zNmv6-j*F6DY6oawZ&>1q3n;*2QiY0T=i9-#Yv-Yc#UP%mE6pjnh$*JxQIR=xrvG?5L6)1WQYmWKURh^^^Sh zEfNkV&h5GD`)Sdh{XVI&pnoY<`xbhNT^%&`JtD6lbk_71=VH+)QQQ(=iGahYEnRq{ zwJft|Pd;9sf1TA~zIM4+5yZjS-qxM8l?D_i) zoAy>kT9e0PX6th4cs-SQZ%QYvbWl~GHTfnz&SVoOdFIo|)+eo$bafvOMDoMo-kXj% z5BJu#xKPzBm@7Bl=U^T^Uv3!}IN22(^W&Eehcy~OQI)HHXK-`FN%Rw7+|r2s7e*~U{dP!?B#eb;ARKvOrPLhQ5e zAr413Y$QTF&EcuFVm7*3%|^?+J^pUkXrLi!g|mXmChZYXv~d+?M=1`fGZmiGEeth9 z{4_rV$0`s3#UC3UDvx#Sd%L-u*b5dKJ`bEUN=77Ay|p!Yu{h-}qB^&?IeeDRW^@P# zAYmvPCN|5(Rja{%CC1Rspa-;51+TyqTD^yusopI$M~Q=}411aP$-`$Y6#@;1)r$un z7%4xF#6?3@FVHy4GUPyI0d=DF_7FMWeqJ`zBzGG>CLKKzn*gXoytNmm4_#Y-+`bbK z8-EU6xfdztPo~uL+SGN<&A1T=vY!^Q!|q+^$K4jAes3+xut}{&88%@p>Y;!8T2z!= ziyBV)gxg|NXR*|{#{;WTfmn@dyJa+%m4(0f_N2IG(V=TtkZNo_%6L(%M~S->9o`G? z(MFHQJl)o#@~x#)3aDzV5X(_N#gbDzF4m?YhHFjAs@9}3u|DN|{yCDxW%p}qQk&(P z)V=q+hMD^NwZ)xvLP*!R3F&lSP-iJX-F??$*c5DXoUk~~TO0>5H-;siG)wXKhN5o1 zVqK@a@CYxv`Brn;9o?`R8e3{9z~QO2&BY;-d(uoHyQuKz29hH2;S}j+*chv?xMGQC zht+dG#z#|dANxjsooPp<7d|^mr`oGG6#a+<9S1DfX&s|hb>f;!SgY*ME4V^Ii-LXR zYEN;zLTXD25gW0?aDQtLtd0!zR4YA)w3VI-I4NbC-=-W6wko&QqAs2QuMvWlEP`dp|HjapI6TBIo&md zTNx-eJT{9i+^df*h5S$%4A+*5LPd&*?3Z_)VLLOIWxxNZnS|Yp1tZc)t5%u~+rur6 zZ^Z-{Zr|(t%Tl>$RP~9R-E`DeCZG{IyIU;ycv}3v8cuy(w4=*rxo%YJ%G*-(m7!>o zTsWfg$CAnOA~meuEXUDR=J4wbMFAXV+_$9WcZDOCWG0sdBlxR8I!f2GAf@Mc@$>g4?vB?E!d1I*(pr=j20qD-Wb1Juaeu$e{ z<&{=yIc6=Jam?blRJj2AjVvW1d5dS&mRStnkYgxScnHf-#~js|Q^dlPX*=epF^I8N zKB+B4VU|!tirBGm-OXTmZZLuOHy(< z3XQ=wkY*{%Fj|UE&zqlCSUv$Km-n2G}n{k)Y|Hq4n3UDs0W;q%>Cz zhur$-R>Oky+KU`fC&c>I*xIU2)YcFP6mHGplE;emtFg6p0o@m|zSC3kViD_f!$qv- zroz)_X~Z=CGVTn_k!x5-n_j~*HoAu8Y0?(4-isAYd0FvMxr${Kt5{Sb=HjnO{x6Et z=$f0uLkvZpXwUh(B>Co&kjmevI@nvKnIkIgqfG+0%15XSBWg|Cu_k30UyIaC5qx2v zx>c+RTV1PIhNARKa%2Bl4Ck#?o@NK9=7BV`j`OjSrOM4@*mg-SXO;87FT%v4%L=)c z6<1<*995SDlfJXp>UhsA4%|IP<4d)a)zPBXsXn_G1NJo{fhjA*I+dsaf&y(Z>va+6 zUiUzvU5X5k5Gz{WX)9X!CxtMfUGkP~AzH;sT=Yk!sk0e2hp4JQz4E+t^su!NpBo9s zvivW^vQ~4fWC>@pJnqicGv5+&)*Nz{VrYw5j{Ray>O6S=+4=Sz{ft@6xvB_n>^Zgt-yjP1`)LkQ(j8Hig zOIt`o+N*GR*`C7MXj^KpvH|j|^uZNqrr~hqMaAhbYg%F3(>L zm5-9=W^~z<8+F%9Va;$^@!9_7Y?l?S(`K~3W!A5xOM(uqu2EVh>Lk*JBJ5Q#i=93w zI60+Ds;0Ks?CklQD1^!*_!iJqc&V?QG$GMg3W7z=L;XcBg6o|em&wH{E?yApQk(Xu zbt!A*Nih#9)}^eK?+R3rUO$s;9Np4WOH|l0LLBruds3`O;aFwYN)@H6tyC2-sn3`q zcG+$$tnFbNyd^{ySdT6JrJ=15?}#0;kfu_i`l<;?x@s)_*HuM=|31__7asDc8e%S; zQUWY9-B+o;l$1%OA^@U9GK9~v)1fAcgrO!1t+2QjT%)mGGt%08?4!)#Q-p>Yw?p`X3Wa)$Ss`(sy4$Rf^FWbHW4)!QagEinx9YVfzDIJLqJipuirz8q(98sv`4-Z&AGhCILFfE^!hk0>1Va~5tP>xIwQ_yL;*X0#Z)yWy4QgSYFpj6S(U!F4Eet7 z4jhGgp-`N(;^WvWnnZFrUW8+5IgO0wJ|NVOo`pQpQ09O-oP0LM(Wx2}3F3Ag@ljKZ z!>d|5zWSu05SO9VMCo;gVw`7CcrP(yq$D{X2@8jA*0OOLbGrAJhozaz(sfWEgR4Aw zlw#7@LfJc}AUqHJrk_lj#{9zmIoV0IC5jMe^j`9^mJW$6^WL_Sv2h`U=;r4f1KxH% z>lk1?TNUg0l8VtQno4?yb9Ag{g=6223U9M#g*erx3TMSlLt0q>r1+Ix#nIAV8;WtR zJl|J|n?~gs<}v%7PrM1G2^VeQ#7Ao~zOk^b6qh|8EA+;RpT=m1|1o^BEEuyRufyI* zOs0nJjco2)nCMT{qI{Z2q3XjO-*`hsB4tb+Vxdm2h<13D?=|c7I>%Ax?Uzta1~aLc z-yrZ7KQO4*5;4EiV1i3bsmTKa8#&Wf%x(ubKU?IQ)qYaUY8y&$4r#=w1uLj(Ex@6G zq>9M%Y_nFlakZH% z#TJ-{)Qer}<`SKA?!vlF-JT2Gcc~wU3)yd4%A!iVbkV%LNbTwV9t-s?OIkT^T&V5n z-b0P&!N%@tI;E~_^2J2>m$Rt(y%Vv0oD*T5ZY?}tF*k}d=x>&47f{M0S;dKkv7|@` z9`37s$6?PN?!Aw~$zx8Bi&nuFVlBK-G3TFf*-kFbmlxFCO4;yia%b5BF?8U8tAoWE zG(*W=>RI)H)24YWk{+Fe2M$7fr}6Vs)LGd?;kQFL&Stzx=lIDv`%`G2^6dC{a`V7V zdCsYyq7^5nQC7#N){v8Eo0enBga=|;)U+K79A#7WB##!{kr@>Xik+Z%kn_}h*QG>9 z=i_X#CXe5gCtbgdQ6^>jnHU>Xm>s*KBdD5uU@^q)Bj=kwlk@ui*3}Y|g&nItc0M#8 z*LQi_{hW8r*Usm%79Qm|NBxNNL4oR&>!B6zAtcdtKGKIueagHU;(Wpn@SWQyl1M`l zZivJAsObBcQ;@>K7n7ZZ>#9N7{^%*24V!ugNo;O&fx!h72?dmqE5 zDFJ0;wx{9CV{tT1!Gc;QR8eip-mqzBRgPg(T!8q{JT2m2UN7-AwzEsR=!BaYHdz9y zMj?dNQHbG!VWXG6s-I(ATWgucC};7-!AP-XmH;_&^E8NAdx~iDqW@QB3J#>p)s90A zAGhz<3cm}8Ep6K~7Udo{*&-A(>`$#@8!{GY4Mk=Ij_tTb*zKpg4dK&0Qikr)6=ANyUx^iMC+Yz&y*KgI$xKDAm=)1Fgl->hG6Hz z(h%w_69zwLv2=)Z&X)$OGfx`gop(yZG-r}DBs!-_L%MUkG=w|HN<)rwlr-c!!)Cf} zws!_ga|z6yq#4&jI0K}4HOyW!T^HXwYmZD_~wN%}$t?NprQ(m!-KDW}7rahMeirjB62`)1_G)dJ!+p zI3mMomS!BN;S5izI}D>=Qr#&QMrp>E2hO(Aj4sltPjVfG;k=mWIt0U6EzQ^^;XEzP z*mmzcDa{2iAChLwh&s!qc?HZHq4ZF@v zX~u?EXQDJ8gL$$vuYuVr&6p2xj+EvKm_w!633E?ru7){CnrmV9mu5^fI+--5QGzY=_i8PB3fR9OYFwDE98Mj9}H%oIk%&$r_uC;cqk!I|sajuePTyO0xk>+VI z&zI&zm~*5#9p)5i#^yKYG-=LlOc@u?ZEmWUivq+{s}SCd4JQ>CMAMjhWHr?_366^~W^NNec~dhJ$g=>mM; z``8_r`q*PFwdfr)5{K|O$4?eVZRr$7>PcU-1fZ_@!RnueOs1 z=6At}(Wy3})=+^(Z?2XnOB;&I7v3SSJdZy68)+XNx#P!`#r6-dEIH(@)Wx?F&Gd5{aGY zWC=mDJfmA&|Mqcbxo{sVR?qCLn~l8a9}OUmSR98*MHXi(?(T|7@@j39q-is-vlQ3b zZg9lqKn^iE8}XCjelIaeYe`4%?22!~*UDlO*Zi)y?Godx@`basyWVRA;nQf`GAtlE zV*lKs8qvO17o!C2choA{p`BvzjjQVRd200EE>t|w-%_K0R{+LZSj5Y6$EMWg+IaA7 z7wprcI3pdF9IV=k!@!S-i)m@_gCV(?#>clPRV~zZfpkF*v62V+QhXXYl#Q!iJREu2 zy`3N5Mu?P+uX8v^4p;(+(_4oec9u*L>JsVKB%BTs&a%`1ZT8LWZeKON$-yz*VoVnw z?ZEbPXJj#@R@8H|kh&*&mNU6GFWyY?BC*MwJkc48VL6%CiJ5CL!yQc4H6q?V$A?01 z+C^hj8tkR3!Cs=$mT>oQPPF6pfM`cvP_*N#gobr25_K%JK^+@*yH>}T!=8>^*p+d( zlj(eMjlCIF7e|iQ*%>*+eySlIPY4O5ih?>axg+XGg{mVsAada>SK%*;ji{JAjp{{D zSG^e2l!!#sxI`or#s0cWJPzFI5)Xr$c!*>FDPT#QW4Ac*KhCq<`4A>O#fRjg&Nz;U z6Y-VAtm_~)5C+ELtZJ&2INjnX4?NcaH(k{egcH-`>E3Y+<-TIlA1U`lSGh-;aHCzV z6Jr(>ILedCakVPXK z=+)S9FV+1-%2*r}k8MSExvdC&oJY4-R8C99So(m?v#>djmiGwG33M*YsvGJDWr>-L z6su!Oq!=p{E|EKoOc*Q}im?@%)b;Q!oQb_Eb7F9$Kx;HwEyVB~$D8vB+*xN`ch2kRc>z(Ijb6%Fvoe=ulY<$|Wpw>{7+F&0M)ky}SgZ za6vFpJVac7@v-fhQqQU!?8fW4WLctg?J%k?o^ zB@XxeE?jPjb@tazXBERY;o)d8@-Fb_+-1AJ^HH()rA1%q!fE7)kzG|U8C~rq#)6gF z$bLYQ@h`(BvzSm1uQ#6_q)n`u9bZ@-2d$1%&XF`MbW94OZlh-B5_@~6Ez>p2H7>{~ zcjiISuGtxBYvH^l({*`w#SmVzQ)g>mdau4_XMmwdh#9tFetFqi>RCD|$PpDpeuWi3 z7Vh^bjZznF4|L8-2F2y1&78Egblxg$q&l6n`w=HCABw@HI9%n-2b`ac61S+y^M)NE zxIHc8t^n$hJSY=KRL?>urL8aieqnpFV-LkY{=T@KYHHy@BcV_^5^`{v+jlqh8_Ht}1X6GiqBmkh<*u%*MWX}4>Vrpfuh(CFkH(TxrHV)$)Q0+X@ z$F=w!wIgGHz=@<)g|NC_hkq-pVZYUIfI2{#dz14SK-w+~sjd(}YgbuZLZuT?gx^p6@_ zab7!BqwfY{zWD%l5J#G&O1Yyg7GS(*riqr{s@>t%VnUj1*swG5++|xc9yqWK(+(6C z$FrA_ev4}v)YJ*kFa-hikgtcdF0Ng5^=B{ zRX*yzT|R~XL?=XDli2m+T$<4!OsI^VD8}mW33ZQ6KB3OBjin3Ga2$8&of}p*>f2(? zR5a5kS~GSfP74y5O+Vy-^J013{7$#F(30679L=c5s7d(gQ!p#g67&=Yfq-5W#C5f|w^{#9cn zi#R{bYNTum7lbm~5K>rj3KxVioT=`smZM_Jyff#x&Q!;$lsr@2*E##EMv79hZE3?i z>NuX=sFzsro7}Y5@L5fklUNID@8-|`^Zf6Aj0T;60~Cx@@HPe06}(5m61ZDmYTXn-xq{(5B!D z1z%Her-C0USgoK}Yn6|JeH9#|;GGKIqu>JyKC9q*1-B`l6%CFkHd03QkmTx`OEn-lO1s3O=mh zIt4c?cu2uh3Vy5LMFsr>6+Y_uFrdD@si(XjE{b97*Bd2_FOu;61PL2HlMhSxHT@g+ zZ|r&Z8{CugQ zxb&wmCc?@_A!oB3f<}6?>A#(*1)gyt$5=9fODV!FO{6(ngiR-k^2n4#|MNsDGl_rm z$R&l+$R*z_Hj8Xo6av)G5h>KA1^*1;lSJ_{*gYy-Ho5x}H?;H-E`|Ol3;$G=r;&2A zi}c}dq?-dpieVG7ktMh_i)b}c4mlJzS(UF$J(HlMRx2s#Guw@$ z?y~2e-=N=-uPe(v)s62_l+I*TKDjO*$?0stJ=E2IhkP{TTd0c;4JVC%jZu)&1V08- zd!eOc7bQGXarJ84055>2dzxB$H~h)+oGU23dcA8bzhQqOKS*uLpUiKlE5963Vn}xm zh0mo}c9BM7HA$UnR@z%Bd!(|rR`%*jX>X(KE0jG* z*^SEHUfGX1rM-i)Cn|eKExm7~y_1%|vUgGTY0BPJ%kOJxH){DQdpBhdJuU6|8b6eM zo|fNN(teMIpR!+6_WjDvm3^JE$BDY1EA$fR8z_rgL?5TMdQmKdenu+k`Wj^{nPyT< zNQuP4*R9+Jh#!rwsH~CtED>_H(l=xZNbfEo0dwj9jUrydTr93y-c6(*UoW*0E`I&z zk&p3;U$ER5UF%a%0(5mhk8AwZNx*;g_j~l?*Oq?nHg~^kCRx#4-+rz1*3sS21@}PIJq3%G z6c!cV_qUSLrH*A~%kN*Y@_`3eJ@oJ+s~>&r@h6^q>ghGlJp0_*=U;en-AgaO^6KAT z`^Wm%-*|JwTN^iR-tzW4TmQLjd-;x?yLRu{yKn!2gYOnKUywB{gkUdd8i1WzNpZ&bd1`&t{)9H-Fwew@;sOM?zxL{`bybuyE1; zH2we6`Tv*sZyFP2wv4^W8XYq(Hty!}@e?Lanmpx}snc$~P4d5K|Nj;I$9j&RTYczE zb}u*k!wu|ZWY@ddmp8EA-@v}2fqi8I`vVQ^4>quG@ThNptAQQMh|qD%>GgMWx6*F} zX+Y3{^2AJ`d{We}AHy7x{25&?^VE+C_kqHFpmHG{n%wZ16vSf|qcSf7Wq zmcq^yb5?cws7wd5ICZX)9u0pDUky(UFAX0J51HRQ7am&vTE1F7NGD0m803oaV;vr2 z1@?7rm`OsYyawT>iV;wjm{D@~nM|SG-QvWUuP($Sfv3AYNzf(p)$-HQ*V5C{(c+U_ zSx3yCJtEH~P$~5EGse+lgkc^%lK*i7Q&I*>OFW5-Nr{X(H92+m%v6^^+?+k9o_&0> zEgRNJsW~>y!(^Xj&m&}G?3p6H7<-l|cvDVp2Ff5VDL2_w&Z#qV?Mb;VhQ%ah2`lA` zypTT9Mw&gSTp?TFmCp2#+rEqcv&nKZ#+XoseM2MV|e^DA3eJv zG<0gb52>3*(Ol^h(-Y~T0cuV@J$eeke3)LZ$Bl1&a$P1JC;k?pspO z*4vwMC@wChhB`E~Aiki4LI?K=kDppV@hOw|cB{w%a z*O-xIj7_p^oEWXJn?P7;V|c?3~mrV`_eCvfY+6GgE6Jr)0qb|1=T^V^Wqe zDTe~4P#n}A5|jZA!sVtWr5Mw4vu9HbnM@CDvH|rfdnV!G5=Z0R_SD>Y8CkQ8X#$Ze z{PR+6HaBmUXGn$@xlQ}m(UDAq*iwx-vUVBmc|fC2 zue?4D_%@4;mn&(eGEF1yygy`n9&245AksoUzjPwl zg|UNLTwf37JGfb>&QHhu2w`1YU)DCvz}gNDsBT%|f6TXBpW~C*EMC{lgEgDz5#Or4 zFKfTskF~cEOli*Ahv`}SiGjzo^bd7s>sPtP2+J` z!eHuhsekT%L_(dv2lLmpVmhNgGp4j+#>oN9Nc=PAcB<}B5p?Xj^0qm;PX3awlZmfk zWS&^Z+g1kRJ@LXoyf93x!)Nax#=aiRSoTqgPx}GQS?849taI2d)>*fWwJi6~@goI5 zPfBEkH+WAxNFn}DZce-)^TYt5ndp2xn2+vpk*4bn)U!Yvy(vB{ka!X}xK(+pE8Se> z;zvzHG`*1;Z@hHOYfK$a4v^pBaA^i?)y|i-OKHj4g|%SqCbp?=RZ%CC2$M8|u^;KZ zLn}kKveD#r*htEc-uWub6qxCKLW|SJi{#yhwHa)1#rb3u;dWzPoQ`Ckc%xe!$e+9H z4GyembF5XlhSzPQNwJA!Y*Q0-K0>;|L3)oJk+6M#Kh`m20_!+Ao^=cx&pPU2m@HLU zF8Cl(C-Nkjr?P23*(LMkI;4#{(@sykYR=kCCP?(O8{8&GtJk`YzO17yfbuX<`Yl<< z2Sn=ex*%T`MD;yrvL6cyBlAR=tFBXX*6G>6>NXXvjv2~ZoKQL>AF5P+6J2%g zcE&!x-7Ou|`@yQ-+x&?K#0SEc=&#oJj&d6_gR%SQ^;5FmoXk(t8=>s2S~X*>C|;|< z_4DI*kdBnV*exoYuCqVuOuX()yzWfA?o7PyJh**DyJN&}QP2FSp81M;CfftOkU3dK zR5sL(w4dxlI5vZ9ls8p3@1p_S`HZ@{sq5*>dWN-UJ%8>{9aM4Mv9{%{b6O<^#7nvM zWxl!1TyeY60Lx78QZ25?y9MP<{F$uylS}wY-i35xe0#vJqWLkOa_=0kM9+ASP^4*ve~_MJm|o&{5b--`aNC^r zp?<7uSPJW^yN%WFK_o5vJ+3Z)uRl!v$HR5<*M68E>lJplXD?lvXJhFZJ6=7#-=1Qu z&(m({bM)fqM1=Tfw)K}T}On&&Xj-D>rP`!i!f~({GwMoN z`z1dt3FSl2q8Ex!HW7R+d~ zlTKnIorE;luv|(zi^2Cp{aA2a3UWz5P_DNN3;Lx6pa9Dsfl4c}cmmOFTmYg~4UJu`J|MrP{GNwbLz z_M+zm%m_6~Nrq>fJ=2ykW}Yo|a`x1Wl+>v7q+IrpqR17FG}^n6_9R=1mH2}>D7}Z8 z?-UbZjKzAWc~etLO0K}>M$g#nq!h&^N+AOLbR$!yl*_(jW;Jz`suG{bqB67dG}}1K z#G5U#+RU6qH_4Vuf6-HMI7RGKQ+%}W=u$_!j7R?OVy+ns%Ff8LQBEIuSW}a7P9>%cYW;JTC_^mo<(aZ1!A8lPxvh#(Kd`Mz!R#pP2=Gh|0~d5xX-drHbfO zGM=%iNpn)KaIf-+&LXFz%#3>)dYZCQCgo&gMP=Iw&mSmVcRrsWzGtS|u1L`2E)m4# z+jL_y^N6jtBxTxD+3m1R(rmZFCW@*6d~=hucin2&-0UpOQAuf|#=_{WRlCXAuDZy+5cRu};Or$?o8wb+1vy#C5;4m9 zG2}csBl#|c>AovlA!1a4kmGrIw$#~});8q{TFAu8y(VR*rslBwRqcnzRF*GNi3j&s z7R;t7(lc&ED&sA2F#D6_Qki9>h_)zcRx0~M@|>iGv_n~wWUZ&rZ@AfsO%!4kc<9!$ z%%GCA=cOb2G4`}HDkN&-MT!$sWdSE4h9xUye3~q!2_AK8HVDVqK+o8yI6^_Njkq>M zN`%UHD*ON8(e`5we)jYJkA^UIc!u#r+WTDFR>&f)^81yB_IkTg0@&|9$Vd0Pq3VbC z_}x(ddH(bK=egR0I)|fBwEE$FEp;J!neS<2Lt<3@bNwNrRWuGuAr~-^KUM?RPM7Gc1AL>#{+w^ za}}=5RQLjg^I`>;DE~s`U!>B(nZj5ue@fY(QTVJ?`Ms#zH!1v%DF2U?e~^#lg~l^? zzBep~t37{p_&*x|-<|#+jsO4agM*~p?Hknht$!8#zyAE*{#%a*kEeRH_-lTYe0cUJ z_5Fl;3aA&=7x=U08_s|P6-+l@PE7(&(qk^3j3{o&aLA`=Z!Rqr8Rw($sg8LQR ztzfx=TNT`_;06WPEBLB{>l9q8;2H&=P;j+^D-$TfydD_1lz_%Keyv`xPu#aI=Ez6S3f z325?>{>CPs|27o=txwat|D=D@y9fVg@%}5H|KDYx!SjDyB-Zp-^D`b^VmPvvG@ryJ z^Okf|{x5tk;WN)mxcKP`@kwdq!U6%;QTQFtoqEpLMEZ*_OBku(Th|!gq~JyhfArbY z&vsyEo^?KZd(-JJd`6fi&;WJ9sXI;?S;DD1PYu2@{Cg)qBOQPZS}0>4Q+iRkf|r#( zy;kXa1JtXv&((t^d_U^1fs54ht4jA|)SrVIt_}Nw%SvBmYr}2_-nIJ7depoKDctgY;rD2N3K}?`CfbL-64qGR@TlZ|=pIKcyK@a2>s$kUQXQ zy-Bxfu4B^)en>APJWmpw*hk_#nc&;>hLL$IL0mvGjm*;s-g&*`A@=ic>`OW}xnrNi zTm48MBXfB_ajub|1#n+~86Njeg$$7H{Rqxb=0gNu8iY21%8Q`q5UM9+_9r+sjC4}u zORzLdrn8LT1$y;fI(Cs@hoO@86oN%VWf;J<$_)7JP?;ASMq?U!jTASOpq1WWGRG5~ zKyN=XClX8=hJ6Z@CP62?VPpo(zCrS>gkV-U#V7Y1f*Zmm-vB?N*GBFq3H}x?aR?qx zJdeP7fsWY-z8IlofZ)F(WSCC~t{h2YBMP&MV9+R;Cg8|XGCW}Rjigs2UxGi~sAQGk z4WpI(5F8Upv=C3s1aFU&=}#xPDpIBicu1K6JxtQPg5Ys_r&C-uhRVoHvP9-Yg3p;1 zKM9^!=8FU$w#c}v2`(HJG(2f>RSn z9>{$f!TS?r_!R_?CrBLLC-|K*18z-{@&h<@rc5WCV0yBYXTTd$Wt|NtI3SI}fIkF# z&LX~%8So=|!+{&YJJK05qg^8Sl`@|un2{mPnFO!9lggCLK?KY1rg}nVK-^031esS6 z+?y-QXg|Tv@?>5W1oLgG+zI;FC5_l;)61@8n_#*!7ZBW#PrL&T^GJT~mHbR3xanRQ zcQe8M^NA0ji{RGziYEkLT}bV)UMFDMBBGhh=>%)(T|;32XD^|8NA5WUZ!V%SJelJO z<`+pE0AE+;V{k8~@hOD?EchGIOJ+dt5=9HakCgdWf(fOnohP`aRHg&?wQ_e79F8lq zD4mf6kJG!3aC@KNa}SZMko#JK!ylIAJCb16N2pIHcO$`qrx@!*;QCO0eEMz0XM*;3NN*wc6$C${ zw}Q+S1dnW|wwTPv2#ze5eH`G}9n#%Ou=Q@@Gnv~Ge3{-L=l}$L_flDq*`MH2dgIBw z3~)c`p=1V3*{}K$g8!s9huq5vjz35=A`HR5)4L4r1asacddOTr@TNn=TQVmS3_MIU zk~xUrBziZHc{0H{hb4{pMgiX%JVEUS;19|Sh<*BNi7r6w#fLj!q%s5Eq0E5ul^O66 zWyZen0H8o$zfH;vcvzXSzx!up2E@K(m;r|k(POFdAt8LW2>+0-5b4Y*G*V)S#Qaj*XXAdrt z`lV(+_7d3x>g@S%Q+TgBd&M@L__kWJTes`jZEpEdnKL83kpfHiFX*p)1`HU$Zo26v zHg)P$>iaU7-ENl!RZu{G1#I=|)$GL=Uu0XhY+>c)4E=v0%ggGs*oT z?3DgR^2bAA7RmIbJ@c#xf9TNBz0%>VNdI%>FYS~+=Z>R?fEu|0zl%rDeNMI-_zV1( zTwHqS;-MO(0sG~N)1xWC#Y{?{?A}`sw7vd`Lq~~(H1J1%^6!h={3yqOxP(l9sd#X! z*h5Dt#4@l;fAOWq28GK2!d`p$=-TeD9ui^klKXe2k-V0oi#1Ea|HyNb57k~gT2L;+ zALabglIMWo)#PS z3c-ZCV(uQ#`CAEmVQHW3w@*o6i}-Wf-cv7rLRe^MC>u3u6f>DjEIK+`@NU9{3G9|z zZeh3HdMleTV+LE8GM3GnHH+PO=bdc!?Aa_gH&?VD3l=P3&)7$^SMC|b-dq^L3TIi^ zvb&<#s%#T`JU5cPvv>sidqFgNZ1GICX>|_Ud;d6g?76#G@HWo+?c{9GUd~4E=4|Le z&PE>LZ2Do&qTc6h+$qi`e9l=Oy;HvA?DlUsORnH-=69SeUc8ue}dwlc8lMe;zv^a+bF(`;xDK8 zFH!uR6#qEIKS}XFqxfG@{7Q=dBgL31}i&7m>g3L3ktU(VRkm#9zMMV0VG zE5=U_V*JwyjGw-n@o!f$Ui~`bHE!|SQvB`|Ka}Fr_s^C6#opxuXe@nM=6Y>6f!7QWTj z7byM)iocWMAEo%8Q2Z*l_fTNHN5@5)VoXuy zD2flf2J{OFxiO&*$(Xnp?HSuKs9nN<0WyW2-Mblk+=Td)eoRdC=$M4gZQ2KsKLrR@ z0eUA;{Lv;vj*3a>*rrW;=`V2X+1*G;M!V8a2yEM?&A3q_K!^y?&4~C>X84-m-?mNX zaSFBAzQ}>%CyX}5-5e8RiAm^y1lk9+Yj>T$zkjD#IFyu8{i*hiHnYj ziL=CYtrvj&`}7s*kBKwKSmMlaW4m++Q~}_BeQ^I+Cex1+S!i5K7>NLie{NAVTDz@t^QdFb|3Z3Ne&Mhp}VZv}r>DT>c5enk7UIv`_{&lYf`7V+9JGT>eo8 zZ$o&?P)m$Cj<`Iwt01EDSS22#N0>~5Jq_NWqZ8s1;-W1IOV^1<(NSSzq6T{Dd~a4B z;8nEQEk_&j8O?lJ=$ECe?k<3jE`vH;S&k}sL>>@F|5uX{2>90^lQ~}d_q**=m?TE z#@y4Fk2Rpx@Hi9kG1|==>6?W&x!*7(Dk8eRx0D}B-%NrSZ5cYEfwx=w#F}W+hz8y) zrv4Mxz?<{(MYV>4(G{dfl>asQ+@eO_Ms>LYHoAd6cXd5Q)8{5moGA2>g{e2WbdMMF zZ)7DI7PdM!ifve8Ve21T$ZptAIt8_J){i*55%rnoh zwQJW3UE$3)-xT`b+i$-ubcGMfUu2JyzOkNkh26V%vm-~22;JcHm!GpQzx1 zRaLR?zWa{-{L_y@H~8(h-`J%~m)Od)oV`x=;}_i8*@4}tqq~7RI;xi|lBuJcM;+b$ z)X}}bTJa5R5Z}fo@cry={vKP&KVh%)Gt_@qyTzvtF`h>BIn>#%=tuE~QT#}XA4BnP zr}%eM{J&BBCn^3L6#oFluj}Xjqo@2wPx-&9r)cLocj(YTEQPlh2S0ZR>NRlSK-}rr z!PucgP={`Py9Tsu*@fh+efQvAz54VT*ebwqeG9U8=+>i89}3$lpzFYpfg!9@_rAdc zJNpi7MFCp2Xwjupw_d>m{d|MFCwTMhd;4E+ zFm&*0)}e1_KfNy;1_pEu^wIfrABd-Ob8n=7U64l`vibG!ZQeYD>Q}d39X&gdFGcB0 zcFI4bQ`mPpj z;T!6EzWo0C@6QnY{MTQ9{gK9{r$71Rlh^m{+vm{fbRi>0jvT0H3R3A{3qAPoNBD=b zM#tQ`ckkXk2!dBFuQ6`W?YG}PdKf)q?)cG1AKg#mXuf^>cK*#b-*D;66AhgD*-xELXC=}4#fcLqp4zcv$D%P~#tdPyobbs&J0`dE0~eI5uX

    \s*$/g,ra={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"
    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
    (`*5>A+H^B~> z(bf;B&3w_*)APTAy9ypS{8Rs3q>aC>MvFG*sjc6kY~Y4+(AMNoW@wABmVh-V&;r~kk3ZASTor%! z`5$d8b+s~qeh>WzcC5?cg=_)t-Md$`yWj!pE94#cqaKhvuKf#f7x=r+e^NW)n*RX} z=sTgmp#6g!pg%(22_9q23Era|wE10>1MFz?(bl3JqcMe8*C3kzYTO0>klm}vc~kQ4 z-WI`Mo3{X;K_g_H<1^s62IV%+iI_{8h}%`fu6zK6f$xK&<2oy+#Qb1yO< zetGoVxfP6!u9lEYe=+n_P^TdKi=eJS`fm9aC|Lei;J-*gE}>3APX&DxG$`0r!O;pX zQjkli1FZkuj*yEE4w zZ!iW_sb9F#cz3-s_nbNR-1GY1xhv!SrPAiJ44Y+V#N1ypJbFsse;OB}?wSyJR~(Fu zS}>TxSAHqPv+oFT<(A^*Zai?WkI$Yx`)e|{tC4eh9D62X&X1(MeP7z8e@eS_RmSHL z8QYf07?@`m7Re)B#v3^`yUS82Uhm-=$%RzQ`*fWeNgnhYaf!=JRlSN*T~(#)CeBQGs=W6R!S^y0ll*$B)Z=zp}Bh zvCNBi>v)z|V(Sx4PpMiW^<3(RUix6K;K$!e(#ISZqXFv!V?rP2|H82knm+N57b{K1 z-{FPU?cx(=ol}n;yE!br_u*6?(8t0geav<-)5WenCgF67zRZ&X2M-=B^zs31^qf~3 zcpEiU@C9nZr+->KBW5`Ku@JSAm(1TgSQ~Q!ywgjcxT2w

    o@{ZDn5U6&|RYAPXAx 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

    +3M24ZU#4*L5E@Z@4nSW@98m(8A|i?L*pN37Zi7 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

    q^~X+%wU=F&VYr(po&T;E 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�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 z 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ν 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∈>n)eLB$?*yd1_}A0)FI=p+q>N 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%0AA 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%0AHiMG3) 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�o8(`R}CM?dh+jq`B6NA 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 z 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

    ","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:k.htmlSerialize?[0,"",""]:[1,"X

    "]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m(" - - - - - - - - - - - - diff --git a/src/lib/flask_debugtoolbar/templates/panels/timer.html b/src/lib/flask_debugtoolbar/templates/panels/timer.html deleted file mode 100644 index 8b69e67..0000000 --- a/src/lib/flask_debugtoolbar/templates/panels/timer.html +++ /dev/null @@ -1,21 +0,0 @@ -
    - - - - - - - - - - - - {% for key, value in rows %} - - - - - {% endfor %} - -
    ResourceValue
    {{ key|escape }}{{ value|escape }}
    - diff --git a/src/lib/flask_debugtoolbar/templates/redirect.html b/src/lib/flask_debugtoolbar/templates/redirect.html deleted file mode 100644 index 6f49fe5..0000000 --- a/src/lib/flask_debugtoolbar/templates/redirect.html +++ /dev/null @@ -1,15 +0,0 @@ - - - Redirect intercepted - - -

    Redirect ({{ redirect_code }})

    -

    Location: {{ redirect_to }}

    -

    - The Flask Debug Toolbar has intercepted a redirect to the above URL for - debug viewing purposes. You can click the above link to continue with the - redirect as normal. If you'd like to disable this feature, you can set the - config variable DEBUG_TB_INTERCEPT_REDIRECTS to False. -

    - - diff --git a/src/lib/flask_debugtoolbar/toolbar.py b/src/lib/flask_debugtoolbar/toolbar.py deleted file mode 100644 index 9544b46..0000000 --- a/src/lib/flask_debugtoolbar/toolbar.py +++ /dev/null @@ -1,76 +0,0 @@ -import urllib - -from flask import url_for, current_app - - - -class DebugToolbar(object): - - # default config settings - config = { - 'DEBUG_TB_INTERCEPT_REDIRECTS': True, - 'DEBUG_TB_PANELS': ( - 'flask_debugtoolbar.panels.versions.VersionDebugPanel', - 'flask_debugtoolbar.panels.timer.TimerDebugPanel', - 'flask_debugtoolbar.panels.headers.HeaderDebugPanel', - 'flask_debugtoolbar.panels.request_vars.RequestVarsDebugPanel', - 'flask_debugtoolbar.panels.template.TemplateDebugPanel', - 'flask_debugtoolbar.panels.sqlalchemy.SQLAlchemyDebugPanel', - 'flask_debugtoolbar.panels.logger.LoggingPanel', - 'flask_debugtoolbar.panels.profiler.ProfilerDebugPanel', - ) - } - - panel_classes = [] - - def __init__(self, request, jinja_env): - self.jinja_env = jinja_env - self.request = request - self.panels = [] - - self.template_context = { - 'static_path': url_for('_debug_toolbar.static', filename='') - } - - self.create_panels() - - @classmethod - def load_panels(cls, app): - cls.config.update(app.config) - - for panel_path in cls.config['DEBUG_TB_PANELS']: - dot = panel_path.rindex('.') - panel_module, panel_classname = panel_path[:dot], panel_path[dot+1:] - - try: - mod = __import__(panel_module, {}, {}, ['']) - except ImportError, e: - app.logger.warning('Disabled %s due to ImportError: %s', panel_classname, e) - continue - panel_class = getattr(mod, panel_classname) - cls.panel_classes.append(panel_class) - - def create_panels(self): - """ - Populate debug panels - """ - activated = self.request.cookies.get('fldt_active', '') - activated = urllib.unquote(activated).split(';') - - for panel_class in self.panel_classes: - panel_instance = panel_class( - context=self.template_context, - jinja_env=self.jinja_env) - - if panel_instance.dom_id() in activated: - panel_instance.is_active = True - self.panels.append(panel_instance) - - def render_toolbar(self): - context = self.template_context.copy() - context.update({'panels': self.panels}) - - template = self.jinja_env.get_template('base.html') - return template.render(**context) - - diff --git a/src/lib/flask_debugtoolbar/utils.py b/src/lib/flask_debugtoolbar/utils.py deleted file mode 100644 index 3f42c6a..0000000 --- a/src/lib/flask_debugtoolbar/utils.py +++ /dev/null @@ -1,56 +0,0 @@ -import os.path -import sys - -try: - from pygments import highlight - from pygments.formatters import HtmlFormatter - from pygments.lexers import SqlLexer - from pygments.styles import get_style_by_name - PYGMENT_STYLE = get_style_by_name('colorful') - HAVE_PYGMENTS = True -except ImportError: - HAVE_PYGMENTS = False - - -from flask import current_app - -def format_fname(value): - # If the value is not an absolute path, the it is a builtin or - # a relative file (thus a project file). - if not os.path.isabs(value): - if value.startswith(('{', '<')): - return value - if value.startswith('.' + os.path.sep): - return value - return '.' + os.path.sep + value - - # If the file is absolute and within the project root handle it as - # a project file - if value.startswith(current_app.root_path): - return "." + value[len(current_app.root_path):] - - # Loop through sys.path to find the longest match and return - # the relative path from there. - paths = sys.path - prefix = None - prefix_len = 0 - for path in sys.path: - new_prefix = os.path.commonprefix([path, value]) - if len(new_prefix) > prefix_len: - prefix = new_prefix - prefix_len = len(prefix) - - if not prefix.endswith(os.path.sep): - prefix_len -= 1 - path = value[prefix_len:] - return '<%s>' % path - -def format_sql(query, args): - if not HAVE_PYGMENTS: - return query - - return highlight( - query, - SqlLexer(encoding='utf-8'), - HtmlFormatter(encoding='utf-8', noclasses=True, style=PYGMENT_STYLE)) - diff --git a/src/lib/flaskext/__init__.py b/src/lib/flaskext/__init__.py deleted file mode 100644 index de40ea7..0000000 --- a/src/lib/flaskext/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__import__('pkg_resources').declare_namespace(__name__) diff --git a/src/lib/flaskext/wtf/__init__.py b/src/lib/flaskext/wtf/__init__.py deleted file mode 100644 index 7fb2ece..0000000 --- a/src/lib/flaskext/wtf/__init__.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- -""" - flaskext.wtf - ~~~~~~~~~~~~ - - Flask-WTF extension - - :copyright: (c) 2010 by Dan Jacob. - :license: BSD, see LICENSE for more details. -""" - -try: - import sqlalchemy - _is_sqlalchemy = True -except ImportError: - _is_sqlalchemy = False - -from wtforms import fields, widgets, validators -from wtforms.fields import * -from wtforms.validators import * -from wtforms.widgets import * -from wtforms import ValidationError - -from flaskext.wtf import html5 -from flaskext.wtf.form import Form -from flaskext.wtf import recaptcha - -from flaskext.wtf.recaptcha.fields import RecaptchaField -from flaskext.wtf.recaptcha.widgets import RecaptchaWidget -from flaskext.wtf.recaptcha.validators import Recaptcha - -fields.RecaptchaField = RecaptchaField -widgets.RecaptchaWidget = RecaptchaWidget -validators.Recaptcha = Recaptcha - -from flaskext.wtf.file import FileField -from flaskext.wtf.file import FileAllowed, FileRequired, file_allowed, \ - file_required - -fields.FileField = FileField - -validators.file_allowed = file_allowed -validators.file_required = file_required -validators.FileAllowed = FileAllowed -validators.FileRequired = FileRequired - - -__all__ = ['Form', 'ValidationError', - 'fields', 'validators', 'widgets', 'html5'] - -__all__ += validators.__all__ -__all__ += fields.__all__ if hasattr(fields, '__all__') else fields.core.__all__ -__all__ += widgets.__all__ if hasattr(widgets, '__all__') else widgets.core.__all__ -__all__ += recaptcha.__all__ - -if _is_sqlalchemy: - from wtforms.ext.sqlalchemy.fields import QuerySelectField, \ - QuerySelectMultipleField - - __all__ += ['QuerySelectField', - 'QuerySelectMultipleField'] - - for field in (QuerySelectField, - QuerySelectMultipleField): - - setattr(fields, field.__name__, field) - diff --git a/src/lib/flaskext/wtf/file.py b/src/lib/flaskext/wtf/file.py deleted file mode 100644 index 8c1910a..0000000 --- a/src/lib/flaskext/wtf/file.py +++ /dev/null @@ -1,72 +0,0 @@ -from werkzeug import FileStorage -from wtforms import FileField as _FileField -from wtforms import ValidationError - -class FileField(_FileField): - """ - Werkzeug-aware subclass of **wtforms.FileField** - - Provides a `has_file()` method to check if its data is a FileStorage - instance with an actual file. - """ - @property - def file(self): - """ - :deprecated: synonym for **data** - """ - return self.data - - def has_file(self): - '''Return True iff self.data is a FileStorage with file data''' - if not isinstance(self.data, FileStorage): - return False - # filename == None => the field was present but no file was entered - # filename == '' is for a werkzeug hack: - # large file uploads will get stored in a temporary file on disk and - # show up as an extra FileStorage with name '' - return self.data.filename not in [None, '', ''] - - -class FileRequired(object): - """ - Validates that field has a file. - - `message` : error message - - You can also use the synonym **file_required**. - """ - - def __init__(self, message=None): - self.message=message - - def __call__(self, form, field): - if not field.has_file(): - raise ValidationError, self.message - -file_required = FileRequired - - -class FileAllowed(object): - """ - Validates that the uploaded file is allowed by the given - Flask-Uploads UploadSet. - - `upload_set` : instance of **flaskext.uploads.UploadSet** - - `message` : error message - - You can also use the synonym **file_allowed**. - """ - - def __init__(self, upload_set, message=None): - self.upload_set = upload_set - self.message = message - - def __call__(self, form, field): - if not field.has_file(): - return - if not self.upload_set.file_allowed(field.data, field.data.filename): - raise ValidationError, self.message - -file_allowed = FileAllowed - diff --git a/src/lib/flaskext/wtf/form.py b/src/lib/flaskext/wtf/form.py deleted file mode 100644 index 239ffa0..0000000 --- a/src/lib/flaskext/wtf/form.py +++ /dev/null @@ -1,120 +0,0 @@ -from jinja2 import Markup -from flask import request, session, current_app -from wtforms.fields import HiddenField -from wtforms.ext.csrf.session import SessionSecureForm - -class _Auto(): - '''Placeholder for unspecified variables that should be set to defaults. - - Used when None is a valid option and should not be replaced by a default. - ''' - pass - -class Form(SessionSecureForm): - - """ - Flask-specific subclass of WTForms **SessionSecureForm** class. - - Flask-specific behaviors: - If formdata is not specified, this will use flask.request.form. Explicitly - pass formdata = None to prevent this. - - csrf_context - a session or dict-like object to use when making CSRF tokens. - Default: flask.session. - - secret_key - a secret key for building CSRF tokens. If this isn't specified, - the form will take the first of these that is defined: - * the SECRET_KEY attribute on this class - * the value of flask.current_app.config["SECRET_KEY"] - * the session's secret_key - If none of these are set, raise an exception. - - csrf_enabled - whether to use CSRF protection. If False, all csrf behavior - is suppressed. Default: check app.config for CSRF_ENABLED, else True - - """ - def __init__(self, formdata=_Auto, obj=None, prefix='', csrf_context=None, - secret_key=None, csrf_enabled=None, *args, **kwargs): - - if csrf_enabled is None: - csrf_enabled = current_app.config.get('CSRF_ENABLED', True) - self.csrf_enabled = csrf_enabled - - if formdata is _Auto: - if self.is_submitted: - formdata = request.form - if request.files: - formdata = formdata.copy() - formdata.update(request.files) - else: - formdata = None - if self.csrf_enabled: - if csrf_context is None: - csrf_context = session - if secret_key is None: - # It wasn't passed in, check if the class has a SECRET_KEY set - secret_key = getattr(self, "SECRET_KEY", None) - if secret_key is None: - # It wasn't on the class, check the application config - secret_key = current_app.config.get("SECRET_KEY") - if secret_key is None and session: - # It's not there either! Is there a session secret key if we can - secret_key = session.secret_key - if secret_key is None: - # It wasn't anywhere. This is an error. - raise Exception('Must provide secret_key to use csrf.') - - self.SECRET_KEY = secret_key - else: - csrf_context = {} - self.SECRET_KEY = "" - super(Form, self).__init__(formdata, obj, prefix, csrf_context=csrf_context, *args, **kwargs) - - def generate_csrf_token(self, csrf_context=None): - if not self.csrf_enabled: - return None - return super(Form, self).generate_csrf_token(csrf_context) - - def validate_csrf_token(self, field): - if not self.csrf_enabled: - return - super(Form, self).validate_csrf_token(field) - - def is_submitted(self): - """ - Checks if form has been submitted. The default case is if the HTTP - method is **PUT** or **POST**. - """ - - return request and request.method in ("PUT", "POST") - - def hidden_tag(self, *fields): - """ - Wraps hidden fields in a hidden DIV tag, in order to keep XHTML - compliance. - - .. versionadded:: 0.3 - - :param fields: list of hidden field names. If not provided will render - all hidden fields, including the CSRF field. - """ - - if not fields: - fields = [f for f in self if isinstance(f, HiddenField)] - - rv = [u'
    '] - for field in fields: - if isinstance(field, basestring): - field = getattr(self, field) - rv.append(unicode(field)) - rv.append(u"
    ") - - return Markup(u"".join(rv)) - - def validate_on_submit(self): - """ - Checks if form has been submitted and if so runs validate. This is - a shortcut, equivalent to ``form.is_submitted() and form.validate()`` - """ - return self.is_submitted() and self.validate() - diff --git a/src/lib/flaskext/wtf/html5.py b/src/lib/flaskext/wtf/html5.py deleted file mode 100644 index 4ffd8b7..0000000 --- a/src/lib/flaskext/wtf/html5.py +++ /dev/null @@ -1,125 +0,0 @@ -from wtforms import TextField -from wtforms import IntegerField as _IntegerField -from wtforms import DecimalField as _DecimalField -from wtforms import DateField as _DateField -from wtforms.widgets import Input - -class DateInput(Input): - """ - Creates `` widget - """ - input_type = "date" - - -class NumberInput(Input): - """ - Creates `` widget - """ - input_type="number" - - -class RangeInput(Input): - """ - Creates `` widget - """ - input_type="range" - - -class URLInput(Input): - """ - Creates `` widget - """ - input_type = "url" - - -class EmailInput(Input): - """ - Creates `` widget - """ - - input_type = "email" - - -class SearchInput(Input): - """ - Creates `` widget - """ - - input_type = "search" - -class TelInput(Input): - """ - Creates `` widget - """ - - input_type = "tel" - - -class SearchField(TextField): - """ - **TextField** using **SearchInput** by default - """ - widget = SearchInput() - - -class DateField(_DateField): - """ - **DateField** using **DateInput** by default - """ - - widget = DateInput() - - -class URLField(TextField): - """ - **TextField** using **URLInput** by default - """ - - widget = URLInput() - - -class EmailField(TextField): - """ - **TextField** using **EmailInput** by default - """ - - widget = EmailInput() - -class TelField(TextField): - """ - **TextField** using **TelInput** by default - """ - - widget = TelInput() - - -class IntegerField(_IntegerField): - """ - **IntegerField** using **NumberInput** by default - """ - - widget = NumberInput() - - -class DecimalField(_DecimalField): - """ - **DecimalField** using **NumberInput** by default - """ - - widget = NumberInput() - - -class IntegerRangeField(_IntegerField): - """ - **IntegerField** using **RangeInput** by default - """ - - widget = RangeInput() - - -class DecimalRangeField(_DecimalField): - """ - **DecimalField** using **RangeInput** by default - """ - - widget = RangeInput() diff --git a/src/lib/flaskext/wtf/recaptcha/__init__.py b/src/lib/flaskext/wtf/recaptcha/__init__.py deleted file mode 100644 index 272092b..0000000 --- a/src/lib/flaskext/wtf/recaptcha/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from flaskext.wtf.recaptcha import fields -from flaskext.wtf.recaptcha import validators -from flaskext.wtf.recaptcha import widgets - -__all__ = fields.__all__ + validators.__all__ + widgets.__all__ diff --git a/src/lib/flaskext/wtf/recaptcha/fields.py b/src/lib/flaskext/wtf/recaptcha/fields.py deleted file mode 100644 index 59a392d..0000000 --- a/src/lib/flaskext/wtf/recaptcha/fields.py +++ /dev/null @@ -1,16 +0,0 @@ -from wtforms.fields import Field - -from flaskext.wtf.recaptcha import widgets -from flaskext.wtf.recaptcha.validators import Recaptcha - -__all__ = ["RecaptchaField"] - -class RecaptchaField(Field): - widget = widgets.RecaptchaWidget() - - # error message if recaptcha validation fails - recaptcha_error = None - - def __init__(self, label='', validators=None, **kwargs): - validators = validators or [Recaptcha()] - super(RecaptchaField, self).__init__(label, validators, **kwargs) diff --git a/src/lib/flaskext/wtf/recaptcha/validators.py b/src/lib/flaskext/wtf/recaptcha/validators.py deleted file mode 100644 index 01d3d58..0000000 --- a/src/lib/flaskext/wtf/recaptcha/validators.py +++ /dev/null @@ -1,73 +0,0 @@ -import urllib2 - -from flask import request, current_app - -from wtforms import ValidationError - -from werkzeug import url_encode - -RECAPTCHA_VERIFY_SERVER = 'http://api-verify.recaptcha.net/verify' - -__all__ = ["Recaptcha"] - -class Recaptcha(object): - """Validates a ReCaptcha.""" - _error_codes = { - 'invalid-site-public-key': 'The public key for reCAPTCHA is invalid', - 'invalid-site-private-key': 'The private key for reCAPTCHA is invalid', - 'invalid-referrer': 'The public key for reCAPTCHA is not valid for ' - 'this domainin', - 'verify-params-incorrect': 'The parameters passed to reCAPTCHA ' - 'verification are incorrect', - } - - def __init__(self, message=u'Invalid word. Please try again.'): - self.message = message - - def __call__(self, form, field): - challenge = request.form.get('recaptcha_challenge_field', '') - response = request.form.get('recaptcha_response_field', '') - remote_ip = request.remote_addr - - if not challenge or not response: - raise ValidationError(field.gettext('This field is required.')) - - if not self._validate_recaptcha(challenge, response, remote_ip): - field.recaptcha_error = 'incorrect-captcha-sol' - raise ValidationError(field.gettext(self.message)) - - def _validate_recaptcha(self, challenge, response, remote_addr): - """Performs the actual validation.""" - - if current_app.testing: - return True - - try: - private_key = current_app.config['RECAPTCHA_PRIVATE_KEY'] - except KeyError: - raise RuntimeError, "No RECAPTCHA_PRIVATE_KEY config set" - - data = url_encode({ - 'privatekey': private_key, - 'remoteip': remote_addr, - 'challenge': challenge, - 'response': response - }) - - - response = urllib2.urlopen(RECAPTCHA_VERIFY_SERVER, data) - - if response.code != 200: - return False - - rv = [l.strip() for l in response.readlines()] - - if rv and rv[0] == 'true': - return True - - if len(rv) > 1: - error = rv[1] - if error in self._error_codes: - raise RuntimeError(self._error_codes[error]) - - return False diff --git a/src/lib/flaskext/wtf/recaptcha/widgets.py b/src/lib/flaskext/wtf/recaptcha/widgets.py deleted file mode 100644 index 2d2fcfb..0000000 --- a/src/lib/flaskext/wtf/recaptcha/widgets.py +++ /dev/null @@ -1,81 +0,0 @@ -""" -Custom widgets -""" -try: - import json -except ImportError: - import simplejson as json - -from flask import current_app -from werkzeug import url_encode - -# use flaskext.babel for translations, if available - -try: - from flaskext.babel import gettext as _ -except ImportError: - _ = lambda(s) : s - -RECAPTCHA_API_SERVER = 'http://api.recaptcha.net/' -RECAPTCHA_SSL_API_SERVER = 'https://www.google.com/recaptcha/api/' -RECAPTCHA_HTML = u''' - - - -''' - -__all__ = ["RecaptchaWidget"] - -class RecaptchaWidget(object): - - def recaptcha_html(self, server, query, options): - return RECAPTCHA_HTML % dict( - script_url='%schallenge?%s' % (server, query), - frame_url='%snoscript?%s' % (server, query), - options=json.dumps(options) - ) - - def __call__(self, field, error=None, **kwargs): - """Returns the recaptcha input HTML.""" - - if current_app.config.get('RECAPTCHA_USE_SSL', False): - - server = RECAPTCHA_SSL_API_SERVER - - else: - - server = RECAPTCHA_API_SERVER - - try: - public_key = current_app.config['RECAPTCHA_PUBLIC_KEY'] - except KeyError: - raise RuntimeError, "RECAPTCHA_PUBLIC_KEY config not set" - query_options = dict(k=public_key) - - if field.recaptcha_error is not None: - query_options['error'] = unicode(field.recaptcha_error) - - query = url_encode(query_options) - - options = { - 'theme': 'clean', - 'custom_translations': { - 'visual_challenge': _('Get a visual challenge'), - 'audio_challenge': _('Get an audio challenge'), - 'refresh_btn': _('Get a new challenge'), - 'instructions_visual': _('Type the two words:'), - 'instructions_audio': _('Type what you hear:'), - 'help_btn': _('Help'), - 'play_again': _('Play sound again'), - 'cant_hear_this': _('Download sound as MP3'), - 'incorrect_try_again': _('Incorrect. Try again.'), - } - } - - options.update(current_app.config.get('RECAPTCHA_OPTIONS', {})) - - return self.recaptcha_html(server, query, options) diff --git a/src/lib/gae_mini_profiler/.gitignore b/src/lib/gae_mini_profiler/.gitignore deleted file mode 100755 index 0d20b64..0000000 --- a/src/lib/gae_mini_profiler/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.pyc diff --git a/src/lib/gae_mini_profiler/README.md b/src/lib/gae_mini_profiler/README.md deleted file mode 100755 index b3d383d..0000000 --- a/src/lib/gae_mini_profiler/README.md +++ /dev/null @@ -1,132 +0,0 @@ -# Google App Engine Mini Profiler - -gae_mini_profiler is a quick drop-in WSGI app that provides ubiquitous profiling of your existing GAE projects. It exposes RPC statistics and CPU profiling output for users of your choosing on your production site. Only requests coming from users of your choosing will be profiled, and others will not suffer any performance degradation, so you can use this profiler to learn about production performance without stressing about slowing users down. See screenshots and features below. - -This project is heavily inspired by the Stack Exchange team's impressive [mini-profiler](http://miniprofiler.com/). - -* See it in action -* Screenshots -* Getting Started -* Features -* Dependencies -* Bonus -* FAQ - -## See it in action - -Play around with a demo App Engine applications with gae_mini_profiler enabled at [http://mini-profiler.appspot.com](http://mini-profiler.appspot.com/). - -## Screenshots - -All profiled pages have total milliseconds in corner, which can be expanded...
    -

    -...to show more details...
    -

    -...about remote procedure call performance...
    -

    -...or CPU profiler output.
    -

    -Choose between an instrumented CPU profiler (above) or a sampling -profiler (below).
    -

    -Ajax requests and redirects are also profiled and added to the corner of your page.
    -

    -Any Python logging module output is also available for easy access. -
    - -## Getting Started - -1. Download this repository's source and copy the `gae_mini_profiler/` folder into your App Engine project's root directory. - -2. Add the following two handler definitions to `app.yaml`: - - handlers: - - url: /gae_mini_profiler/static - static_dir: gae_mini_profiler/static - - url: /gae_mini_profiler/.* - script: gae_mini_profiler.main.application - -3. Modify the WSGI application you want to profile by wrapping it with the gae_mini_profiler WSGI application. - - import gae_mini_profiler.profiler - ... - application = webapp.WSGIApplication([...]) - application = gae_mini_profiler.profiler.ProfilerWSGIMiddleware(application) - -4. Modify your template to include our javascript and stylesheets just before your ending body tag. - - There is a profiler_includes() function in gae_mini_profiler.templatetags that spits out the right code for these scripts and stylesheets. - - Using any template engine of your choice, call this function at the end of your template: - - ... - {% profiler_includes %} - - - - Note that these resources will not be loaded on requests when the profiler is disabled, so you don't need to worry about extra HTTP requests slowing down your users. - - Using Django? - You can register a simple_tag to expose this to your templates: - - register = template.create_template_register() - @register.simple_tag - def profiler_includes(): - return gae_mini_profiler.templatetags.profiler_includes() - - Using jinja2? - You can expose this function to your templates easily: - - webapp2_extras.jinja2.default_config = { - "globals": { - "profiler_includes": gae_mini_profiler.templatetags.profiler_includes - } - } - - Using anything else to generate your HTML? - Just find some way to spit the results of profiler_includes() into your HTML. Doesn't have to be anything fancy. - -5. You're all set! Now you just need to choose when you want to enable the profiler by overriding a simple function. By default it's enabled on the dev server and disabled in production. To enable it for App Engine admins in production, add the following to appengine_config.py: - - def gae_mini_profiler_should_profile_production(): - from google.appengine.api import users - return users.is_current_user_admin() - - In appengine_config.py you can override both of the following... - - def gae_mini_profiler_should_profile_production(): pass - def gae_mini_profiler_should_profile_development(): pass - - ...with any logic you want to choose when the profiler should be enabled. - - -## Features - -* Production profiling without impacting normal users -* Easily profile all requests, including ajax calls -* Summaries of RPC call types and their performance so you can quickly figure out whether datastore, memcache, or urlfetch is your bottleneck -* Redirect chains are tracked -- quickly examine the profile of not just the currently rendered request, but any preceding request that issued a 302 redirect leading to the current page. -* Share individual profile results with others by sending link -* Duplicate RPC calls are flagged for easy spotting in case you're repeating memcache or datastore queries -* Choose from either an instrumented or sampling CPU profiler to quickly figure out where your requests are spending time - -## Dependencies - -* jQuery must be included somewhere on your page. -* (Optional) If you want the fancy slider selector for the Logs output, jQuery UI must also be included with its Slider plugin. - -## Bonus - -gae_mini_profiler is currently in production use at [Khan Academy](http://khanacademy.org). If you make good use of it elsewhere, please lemme know. - -## FAQ - -1. What's the license? [MIT licensed](http://en.wikipedia.org/wiki/MIT_License). -2. I had my appstats_RECORD_FRACTION variable set to 0.1, which means only 10% of my queries were getting profiles generated. This meant that most of the time gae_mini_profiler was failing with a javascript error, because the appstats variable was null. - - If you are using appengine_config.py to customize Appstats behavior you should add this to the top of your "appstats_should_record" method. -
    def appstats_should_record(env):
    -        from gae_mini_profiler.config import should_profile
    -        if should_profile(env):
    -            return True
    -
    diff --git a/src/lib/gae_mini_profiler/__init__.py b/src/lib/gae_mini_profiler/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/src/lib/gae_mini_profiler/appstats_profiler.py b/src/lib/gae_mini_profiler/appstats_profiler.py deleted file mode 100755 index 0899b43..0000000 --- a/src/lib/gae_mini_profiler/appstats_profiler.py +++ /dev/null @@ -1,150 +0,0 @@ -"""RPC profiler that uses appstats to track, time, and log all RPC events. - -This is just a simple wrapper for appstats with result formatting. See -https://developers.google.com/appengine/docs/python/tools/appstats for more. -""" - -import logging -from pprint import pformat - -from google.appengine.ext.appstats import recording - -import cleanup -import unformatter -import util - -class Profile(object): - """Profiler that wraps appstats for programmatic access and reporting.""" - def __init__(self): - # Configure AppStats output, keeping a high level of request - # content so we can detect dupe RPCs more accurately - recording.config.MAX_REPR = 750 - - # Each request has its own internal appstats recorder - self.recorder = None - - def results(self): - """Return appstats results in a dictionary for template context.""" - if not self.recorder: - # If appstats fails to initialize for any reason, return an empty - # set of results. - logging.warn("Missing recorder for appstats profiler.") - return { - "calls": [], - "total_time": 0, - } - - total_call_count = 0 - total_time = 0 - calls = [] - service_totals_dict = {} - likely_dupes = False - end_offset_last = 0 - - requests_set = set() - - appstats_key = long(self.recorder.start_timestamp * 1000) - - for trace in self.recorder.traces: - total_call_count += 1 - - total_time += trace.duration_milliseconds() - - # Don't accumulate total RPC time for traces that overlap asynchronously - if trace.start_offset_milliseconds() < end_offset_last: - total_time -= (end_offset_last - trace.start_offset_milliseconds()) - end_offset_last = trace.start_offset_milliseconds() + trace.duration_milliseconds() - - service_prefix = trace.service_call_name() - - if "." in service_prefix: - service_prefix = service_prefix[:service_prefix.find(".")] - - if service_prefix not in service_totals_dict: - service_totals_dict[service_prefix] = { - "total_call_count": 0, - "total_time": 0, - "total_misses": 0, - } - - service_totals_dict[service_prefix]["total_call_count"] += 1 - service_totals_dict[service_prefix]["total_time"] += trace.duration_milliseconds() - - stack_frames_desc = [] - for frame in trace.call_stack_list(): - stack_frames_desc.append("%s:%s %s" % - (util.short_rpc_file_fmt(frame.class_or_file_name()), - frame.line_number(), - frame.function_name())) - - request = trace.request_data_summary() - response = trace.response_data_summary() - - likely_dupe = request in requests_set - likely_dupes = likely_dupes or likely_dupe - requests_set.add(request) - - request_short = request_pretty = None - response_short = response_pretty = None - miss = 0 - try: - request_object = unformatter.unformat(request) - response_object = unformatter.unformat(response) - - request_short, response_short, miss = cleanup.cleanup(request_object, response_object) - - request_pretty = pformat(request_object) - response_pretty = pformat(response_object) - except Exception, e: - logging.warning("Prettifying RPC calls failed.\n%s\nRequest: %s\nResponse: %s", - e, request, response, exc_info=True) - - service_totals_dict[service_prefix]["total_misses"] += miss - - calls.append({ - "service": trace.service_call_name(), - "start_offset": util.milliseconds_fmt(trace.start_offset_milliseconds()), - "total_time": util.milliseconds_fmt(trace.duration_milliseconds()), - "request": request_pretty or request, - "response": response_pretty or response, - "request_short": request_short or cleanup.truncate(request), - "response_short": response_short or cleanup.truncate(response), - "stack_frames_desc": stack_frames_desc, - "likely_dupe": likely_dupe, - }) - - service_totals = [] - for service_prefix in service_totals_dict: - service_totals.append({ - "service_prefix": service_prefix, - "total_call_count": service_totals_dict[service_prefix]["total_call_count"], - "total_misses": service_totals_dict[service_prefix]["total_misses"], - "total_time": util.milliseconds_fmt(service_totals_dict[service_prefix]["total_time"]), - }) - service_totals = sorted(service_totals, reverse=True, key=lambda service_total: float(service_total["total_time"])) - - return { - "total_call_count": total_call_count, - "total_time": util.milliseconds_fmt(total_time), - "calls": calls, - "service_totals": service_totals, - "likely_dupes": likely_dupes, - "appstats_key": appstats_key, - } - - def wrap(self, app): - """Wrap and return a WSGI application with appstats recording enabled. - - Args: - app: existing WSGI application to be wrapped - Returns: - new WSGI application that will run the original app with appstats - enabled. - """ - def wrapped_appstats_app(environ, start_response): - # Use this wrapper to grab the app stats recorder for RequestStats.save() - if recording.recorder_proxy.has_recorder_for_current_request(): - self.recorder = recording.recorder_proxy.get_for_current_request() - return app(environ, start_response) - - return recording.appstats_wsgi_middleware(wrapped_appstats_app) diff --git a/src/lib/gae_mini_profiler/cleanup.py b/src/lib/gae_mini_profiler/cleanup.py deleted file mode 100755 index deab177..0000000 --- a/src/lib/gae_mini_profiler/cleanup.py +++ /dev/null @@ -1,272 +0,0 @@ -import StringIO - -def cleanup(request, response): - ''' - Convert request and response dicts to a human readable format where - possible. - ''' - request_short = None - response_short = None - miss = 0 - - if "MemcacheGetRequest" in request: - request = request["MemcacheGetRequest"] - response = response["MemcacheGetResponse"] - if request: - request_short = memcache_get(request) - if response: - response_short, miss = memcache_get_response(response) - elif "MemcacheSetRequest" in request and request["MemcacheSetRequest"]: - request_short = memcache_set(request["MemcacheSetRequest"]) - elif "Query" in request and request["Query"]: - request_short = datastore_query(request["Query"]) - elif "GetRequest" in request and request["GetRequest"]: - request_short = datastore_get(request["GetRequest"]) - elif "PutRequest" in request and request["PutRequest"]: - request_short = datastore_put(request["PutRequest"]) - # todo: - # TaskQueueBulkAddRequest - # BeginTransaction - # Transaction - - return request_short, response_short, miss - -def memcache_get_response(response): - """Pretty-format a memcache.get() response. - - Arguments: - response - The memcache.get() response object, e.g. - {'item': [{'Item': {'flags': '0L', 'key': 'memcache_key', ... - - Returns: - The tuple (value, miss) where the "value" is the value of the - memcache.get() response as a string. If there are multiple response - values, as when multiple keys are passed in, the values are separated by - newline characters. "miss" is 1 if there were no items returned from - memcache and 0 otherwise. - """ - if 'item' not in response or not response['item']: - return None, 1 - - items = response['item'] - for i, item in enumerate(items): - if type(item) == dict: - if 'MemcacheGetResponse_Item' in item: - # This key exists in dev and in the 'python' production runtime. - item = item['MemcacheGetResponse_Item']['value'] - else: - # But it's a different key in the 'python27' production runtime. - item = item['Item']['value'] - item = truncate(repr(item)) - items[i] = item - response_short = "\n".join(items) - return response_short, 0 - -def memcache_get(request): - """Pretty-format a memcache.get() request. - - Arguments: - request - The memcache.get() request object, i.e. - {'key': ['memcache_key']} - - Returns: - The keys of the memcache.get() response as a string. If there are - multiple keys, they are separated by newline characters. - """ - keys = request['key'] - request_short = "\n".join([truncate(k) for k in keys]) - namespace = '' - if 'name_space' in request: - namespace = request['name_space'] - if len(keys) > 1: - request_short += '\n' - else: - request_short += ' ' - request_short += '(ns:%s)' % truncate(namespace) - return request_short - -def memcache_set(request): - """Pretty-format a memcache.set() request. - - Arguments: - request - The memcache.set() request object, e.g., - {'item': [{'Item': {'flags': '0L', 'key': 'memcache_key' ... - - Returns: - The keys of the memcache.get() response as a string. If there are - multiple keys, they are separated by newline characters. - """ - keys = [] - for i in request["item"]: - if "MemcacheSetRequest_Item" in i: - # This key exists in dev and in the 'python' production runtime. - key = i["MemcacheSetRequest_Item"]["key"] - else: - # But it's a different key in the 'python27' production runtime. - key = i["Item"]["key"] - keys.append(truncate(key)) - return "\n".join(keys) - -def datastore_query(query): - kind = query.get('kind', 'UnknownKind') - count = query.get('count', '') - - filters_clean = datastore_query_filter(query) - orders_clean = datastore_query_order(query) - - s = StringIO.StringIO() - s.write("SELECT FROM %s\n" % kind) - if filters_clean: - s.write("WHERE\n") - for name, op, value in filters_clean: - s.write("%s %s %s\n" % (name, op, value)) - if orders_clean: - s.write("ORDER BY\n") - for prop, direction in orders_clean: - s.write("%s %s\n" % (prop, direction)) - if count: - s.write("LIMIT %s\n" % count) - - result = s.getvalue() - s.close() - return result - -def datastore_query_filter(query): - _Operator_NAMES = { - 0: "?", - 1: "<", - 2: "<=", - 3: ">", - 4: ">=", - 5: "=", - 6: "IN", - 7: "EXISTS", - } - filters = query.get('filter', []) - filters_clean = [] - for f in filters: - if 'Query_Filter' in f: - # This key exists in dev and in the 'python' production runtime. - f = f["Query_Filter"] - elif 'Filter' in f: - # But it's a different key in the 'python27' production runtime. - f = f["Filter"] - else: - # Filters are optional, so there might be no filter at all. - continue - op = _Operator_NAMES[int(f.get('op', 0))] - props = f["property"] - for p in props: - p = p["Property"] - name = p["name"] if "name" in p else "UnknownName" - - if 'value' in p: - - propval = p['value']['PropertyValue'] - - if 'stringvalue' in propval: - value = propval["stringvalue"] - elif 'referencevalue' in propval: - if 'PropertyValue_ReferenceValue' in propval['referencevalue']: - # This key exists in dev and in the 'python' production runtime. - ref = propval['referencevalue']['PropertyValue_ReferenceValue'] - else: - # But it's a different key in the 'python27' production runtime. - ref = propval['referencevalue']['ReferenceValue'] - els = ref['pathelement'] - paths = [] - for el in els: - if 'PropertyValue_ReferenceValuePathElement' in el: - # This key exists in dev and in the 'python' production runtime. - path = el['PropertyValue_ReferenceValuePathElement'] - else: - # But it's a different key in the 'python27' production runtime. - path = el['ReferenceValuePathElement'] - paths.append("%s(%s)" % (path['type'], id_or_name(path))) - value = "->".join(paths) - elif 'booleanvalue' in propval: - value = propval["booleanvalue"] - elif 'uservalue' in propval: - if 'PropertyValue_UserValue' in propval['uservalue']: - # This key exists in dev and in the 'python' production runtime. - email = propval['uservalue']['PropertyValue_UserValue']['email'] - else: - # But it's a different key in the 'python27' production runtime. - email = propval['uservalue']['UserValue']['email'] - value = 'User(%s)' % email - elif '...' in propval: - value = '...' - elif 'int64value' in propval: - value = propval["int64value"] - else: - raise Exception(propval) - else: - value = '' - filters_clean.append((name, op, value)) - return filters_clean - -def datastore_query_order(query): - orders = query.get('order', []) - _Direction_NAMES = { - 0: "?DIR", - 1: "ASC", - 2: "DESC", - } - orders_clean = [] - for order in orders: - if 'Query_Order' in order: - # This key exists in dev and in the 'python' production runtime. - order = order['Query_Order'] - else: - # But it's a different key in the 'python27' production runtime. - order = order['Order'] - direction = _Direction_NAMES[int(order.get('direction', 0))] - prop = order.get('property', 'UnknownProperty') - orders_clean.append((prop, direction)) - return orders_clean - -def id_or_name(path): - if 'name' in path: - return path['name'] - else: - return path['id'] - -def datastore_get(request): - keys = request["key"] - if len(keys) > 1: - keylist = cleanup_key(keys.pop(0)) - for key in keys: - keylist += ", " + cleanup_key(key) - return keylist - elif keys: - return cleanup_key(keys[0]) - -def cleanup_key(key): - if 'Reference' not in key: - #sometimes key is passed in as '...' - return key - els = key['Reference']['path']['Path']['element'] - paths = [] - for el in els: - if 'Path_Element' in el: - # This key exists in dev and in the 'python' production runtime. - path = el['Path_Element'] - else: - # But it's a different key in the 'python27' production runtime. - path = el['Element'] - paths.append("%s(%s)" % (path['type'] if 'type' in path - else 'UnknownType', id_or_name(path))) - return "->".join(paths) - -def datastore_put(request): - entities = request["entity"] - keys = [] - for entity in entities: - keys.append(cleanup_key(entity["EntityProto"]["key"])) - return "\n".join(keys) - -def truncate(value, limit=100): - if len(value) > limit: - return value[:limit - 3] + "..." - else: - return value diff --git a/src/lib/gae_mini_profiler/config.py b/src/lib/gae_mini_profiler/config.py deleted file mode 100755 index 1d90342..0000000 --- a/src/lib/gae_mini_profiler/config.py +++ /dev/null @@ -1,40 +0,0 @@ -import os - -from google.appengine.api import lib_config - -# These should_profile functions return true whenever a request should be -# profiled. -# -# You can override these functions in appengine_config.py. See example below -# and https://developers.google.com/appengine/docs/python/tools/appengineconfig -# -# These functions will be run once per request, so make sure they are fast. -# -# Example: -# ...in appengine_config.py: -# def gae_mini_profiler_should_profile_production(): -# from google.appengine.api import users -# return users.is_current_user_admin() - -def _should_profile_production_default(): - """Default to disabling in production if this function isn't overridden. - - Can be overridden in appengine_config.py""" - return False - -def _should_profile_development_default(): - """Default to enabling in development if this function isn't overridden. - - Can be overridden in appengine_config.py""" - return True - -_config = lib_config.register("gae_mini_profiler", { - "should_profile_production": _should_profile_production_default, - "should_profile_development": _should_profile_development_default}) - -def should_profile(): - """Returns true if the current request should be profiles.""" - if os.environ["SERVER_SOFTWARE"].startswith("Devel"): - return _config.should_profile_development() - else: - return _config.should_profile_production() diff --git a/src/lib/gae_mini_profiler/cookies.py b/src/lib/gae_mini_profiler/cookies.py deleted file mode 100755 index f82f1fa..0000000 --- a/src/lib/gae_mini_profiler/cookies.py +++ /dev/null @@ -1,50 +0,0 @@ -import Cookie -import logging -import os - -def get_cookie_value(key): - cookies = None - try: - cookies = Cookie.BaseCookie(os.environ.get('HTTP_COOKIE','')) - except Cookie.CookieError, error: - logging.debug("Ignoring Cookie Error, skipping get cookie: '%s'" % error) - - if not cookies: - return None - - cookie = cookies.get(key) - - if not cookie: - return None - - return cookie.value - -# Cookie handling from http://appengine-cookbook.appspot.com/recipe/a-simple-cookie-class/ -def set_cookie_value(key, value='', max_age=None, - path='/', domain=None, secure=None, httponly=False, - version=None, comment=None): - cookies = Cookie.BaseCookie() - cookies[key] = value - for var_name, var_value in [ - ('max-age', max_age), - ('path', path), - ('domain', domain), - ('secure', secure), - #('HttpOnly', httponly), Python 2.6 is required for httponly cookies - ('version', version), - ('comment', comment), - ]: - if var_value is not None and var_value is not False: - cookies[key][var_name] = str(var_value) - if max_age is not None: - cookies[key]['expires'] = max_age - - cookies_header = cookies[key].output(header='').lstrip() - - if httponly: - # We have to manually add this part of the header until GAE uses Python 2.6. - cookies_header += "; HttpOnly" - - return cookies_header - - diff --git a/src/lib/gae_mini_profiler/instrumented_profiler.py b/src/lib/gae_mini_profiler/instrumented_profiler.py deleted file mode 100755 index 6d09962..0000000 --- a/src/lib/gae_mini_profiler/instrumented_profiler.py +++ /dev/null @@ -1,70 +0,0 @@ -"""CPU profiler that works by instrumenting all function calls (uses cProfile). - -This profiler provides detailed function timings for all function calls -during a request. - -This is just a simple wrapper for cProfile with result formatting. See -http://docs.python.org/2/library/profile.html for more. - -PRO: since every function call is instrumented, you'll be sure to see -everything that goes on during a request. For code that doesn't have lots of -deeply nested function calls, this can be the easiest and most accurate way to -get an idea for which functions are taking lots of time. - -CON: overhead is added to each function call due to this instrumentation. If -you're profiling code with deeply nested function calls or tight loops going -over lots of function calls, this perf overhead will add up. -""" - -import cProfile -import pstats -import StringIO - -import util - -class Profile(object): - """Profiler that wraps cProfile for programmatic access and reporting.""" - def __init__(self): - self.c_profile = cProfile.Profile() - - def results(self): - """Return cProfile results in a dictionary for template context.""" - # Make sure nothing is printed to stdout - output = StringIO.StringIO() - stats = pstats.Stats(self.c_profile, stream=output) - stats.sort_stats("cumulative") - - results = { - "total_call_count": stats.total_calls, - "total_time": util.seconds_fmt(stats.total_tt), - "calls": [] - } - - width, list_func_names = stats.get_print_list([80]) - for func_name in list_func_names: - primitive_call_count, total_call_count, total_time, cumulative_time, callers = stats.stats[func_name] - - func_desc = pstats.func_std_string(func_name) - - callers_names = map(lambda func_name: pstats.func_std_string(func_name), callers.keys()) - callers_desc = map( - lambda name: {"func_desc": name, "func_desc_short": util.short_method_fmt(name)}, - callers_names) - - results["calls"].append({ - "primitive_call_count": primitive_call_count, - "total_call_count": total_call_count, - "cumulative_time": util.seconds_fmt(cumulative_time, 2), - "per_call_cumulative": util.seconds_fmt(cumulative_time / primitive_call_count, 2) if primitive_call_count else "", - "func_desc": func_desc, - "func_desc_short": util.short_method_fmt(func_desc), - "callers_desc": callers_desc, - }) - - output.close() - - return results - - def run(self, fxn): - """Run function with cProfile enabled, saving results.""" - return self.c_profile.runcall(lambda *args, **kwargs: fxn(), None, None) diff --git a/src/lib/gae_mini_profiler/main.py b/src/lib/gae_mini_profiler/main.py deleted file mode 100755 index 9716419..0000000 --- a/src/lib/gae_mini_profiler/main.py +++ /dev/null @@ -1,16 +0,0 @@ -from google.appengine.ext import webapp -from google.appengine.ext.webapp.util import run_wsgi_app - -import profiler - -application = webapp.WSGIApplication([ - ("/gae_mini_profiler/request/log", profiler.RequestLogHandler), - ("/gae_mini_profiler/request", profiler.RequestStatsHandler), - ("/gae_mini_profiler/shared", profiler.SharedStatsHandler), -]) - -def main(): - run_wsgi_app(application) - -if __name__ == "__main__": - main() diff --git a/src/lib/gae_mini_profiler/profiler.py b/src/lib/gae_mini_profiler/profiler.py deleted file mode 100755 index 9c0dd4d..0000000 --- a/src/lib/gae_mini_profiler/profiler.py +++ /dev/null @@ -1,576 +0,0 @@ -from __future__ import with_statement - -import datetime -import time -import logging -import os -import re - -try: - import threading -except ImportError: - import dummy_threading as threading - -# use json in Python 2.7, fallback to simplejson for Python 2.5 -try: - import json -except ImportError: - import simplejson as json - -import StringIO -from types import GeneratorType -import zlib - -from google.appengine.api import logservice -from google.appengine.api import memcache -from google.appengine.ext.appstats import recording -from google.appengine.ext.webapp import RequestHandler - -import cookies -import pickle -import config -import util - -dev_server = os.environ["SERVER_SOFTWARE"].startswith("Devel") - - -class CurrentRequestId(object): - """A per-request identifier accessed by other pieces of mini profiler. - - It is managed as part of the middleware lifecycle.""" - - # In production use threading.local() to make request ids threadsafe - _local = threading.local() - _local.request_id = None - - # On the devserver don't use threading.local b/c it's reset on Thread.start - dev_server_request_id = None - - @staticmethod - def get(): - if dev_server: - return CurrentRequestId.dev_server_request_id - else: - return CurrentRequestId._local.request_id - - @staticmethod - def set(request_id): - if dev_server: - CurrentRequestId.dev_server_request_id = request_id - else: - CurrentRequestId._local.request_id = request_id - - -class Mode(object): - """Possible profiler modes. - - TODO(kamens): switch this from an enum to a more sensible bitmask or other - alternative that supports multiple settings without an exploding number of - enums. - - TODO(kamens): when this is changed from an enum to a bitmask or other more - sensible object with multiple properties, we should pass a Mode object - around the rest of this code instead of using a simple string that this - static class is forced to examine (e.g. if self.mode.is_rpc_enabled()). - """ - - SIMPLE = "simple" # Simple start/end timing for the request as a whole - CPU_INSTRUMENTED = "instrumented" # Profile all function calls - CPU_SAMPLING = "sampling" # Sample call stacks - RPC_ONLY = "rpc" # Profile all RPC calls - RPC_AND_CPU_INSTRUMENTED = "rpc_instrumented" # RPCs and all fxn calls - RPC_AND_CPU_SAMPLING = "rpc_sampling" # RPCs and sample call stacks - - @staticmethod - def get_mode(environ): - """Get the profiler mode requested by current request's headers & - cookies.""" - if "HTTP_G_M_P_MODE" in environ: - mode = environ["HTTP_G_M_P_MODE"] - else: - mode = cookies.get_cookie_value("g-m-p-mode") - - if (mode not in [ - Mode.SIMPLE, - Mode.CPU_INSTRUMENTED, - Mode.CPU_SAMPLING, - Mode.RPC_ONLY, - Mode.RPC_AND_CPU_INSTRUMENTED, - Mode.RPC_AND_CPU_SAMPLING]): - mode = Mode.RPC_AND_CPU_INSTRUMENTED - - return mode - - @staticmethod - def is_rpc_enabled(mode): - return mode in [ - Mode.RPC_ONLY, - Mode.RPC_AND_CPU_INSTRUMENTED, - Mode.RPC_AND_CPU_SAMPLING]; - - @staticmethod - def is_sampling_enabled(mode): - return mode in [ - Mode.CPU_SAMPLING, - Mode.RPC_AND_CPU_SAMPLING]; - - @staticmethod - def is_instrumented_enabled(mode): - return mode in [ - Mode.CPU_INSTRUMENTED, - Mode.RPC_AND_CPU_INSTRUMENTED]; - - -class SharedStatsHandler(RequestHandler): - - def get(self): - path = os.path.join(os.path.dirname(__file__), "templates/shared.html") - - request_id = self.request.get("request_id") - if not RequestStats.get(request_id): - self.response.out.write("Profiler stats no longer exist for this request.") - return - - # Late-bind templatetags to avoid a circular import. - # TODO(chris): remove late-binding once templatetags has been teased - # apart and no longer contains so many broad dependencies. - - import templatetags - profiler_includes = templatetags.profiler_includes_request_id(request_id, True) - - # We are not using a templating engine here to avoid pulling in Jinja2 - # or Django. It's an admin page anyway, and all other templating lives - # in javascript right now. - - with open(path, 'rU') as f: - template = f.read() - - template = template.replace('{{profiler_includes}}', profiler_includes) - self.response.out.write(template) - - -class RequestLogHandler(RequestHandler): - """Handler for retrieving and returning a RequestLog from GAE's logs API. - - See https://developers.google.com/appengine/docs/python/logs. - - This GET request accepts a logging_request_id via query param that matches - the request_id from an App Engine RequestLog. - - It returns a JSON object that contains the pieces of RequestLog info we - find most interesting, such as pending_ms and loading_request. - """ - - def get(self): - - self.response.headers["Content-Type"] = "application/json" - dict_request_log = None - - # This logging_request_id should match a request_id from an App Engine - # request log. - # https://developers.google.com/appengine/docs/python/logs/functions - logging_request_id = self.request.get("logging_request_id") - - # Grab the single request log from logservice - logs = logservice.fetch(request_ids=[logging_request_id]) - - # This slightly strange query result implements __iter__ but not next, - # so we have to iterate to get our expected single result. - for log in logs: - dict_request_log = { - "pending_ms": log.pending_time, # time spent in pending queue - "loading_request": log.was_loading_request, # loading request? - "logging_request_id": logging_request_id - } - # We only expect a single result. - break - - # Log fetching doesn't work on the dev server and this data isn't - # relevant in dev server's case, so we return a simple fake response. - if dev_server: - dict_request_log = { - "pending_ms": 0, - "loading_request": False, - "logging_request_id": logging_request_id - } - - self.response.out.write(json.dumps(dict_request_log)) - - -class RequestStatsHandler(RequestHandler): - - def get(self): - - self.response.headers["Content-Type"] = "application/json" - - list_request_ids = [] - - request_ids = self.request.get("request_ids") - if request_ids: - list_request_ids = request_ids.split(",") - - list_request_stats = [] - - for request_id in list_request_ids: - - request_stats = RequestStats.get(request_id) - - if request_stats and not request_stats.disabled: - - dict_request_stats = {} - for property in RequestStats.serialized_properties: - dict_request_stats[property] = request_stats.__getattribute__(property) - - list_request_stats.append(dict_request_stats) - - # Don't show temporary redirect profiles more than once automatically, as they are - # tied to URL params and may be copied around easily. - if request_stats.temporary_redirect: - request_stats.disabled = True - request_stats.store() - - self.response.out.write(json.dumps(list_request_stats)) - -class RequestStats(object): - - serialized_properties = ["request_id", "url", "url_short", "s_dt", - "profiler_results", "appstats_results", "mode", - "temporary_redirect", "logs", - "logging_request_id"] - - def __init__(self, profiler, environ): - # unique mini profiler request id - self.request_id = profiler.request_id - - # App Engine's logservice request_id - # https://developers.google.com/appengine/docs/python/logs/ - self.logging_request_id = profiler.logging_request_id - - self.url = environ.get("PATH_INFO") - if environ.get("QUERY_STRING"): - self.url += "?%s" % environ.get("QUERY_STRING") - - self.url_short = self.url - if len(self.url_short) > 26: - self.url_short = self.url_short[:26] + "..." - - self.mode = profiler.mode - self.s_dt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - - self.profiler_results = profiler.profiler_results() - self.appstats_results = profiler.appstats_results() - self.logs = profiler.logs - - self.temporary_redirect = profiler.temporary_redirect - self.disabled = False - - def store(self): - # Store compressed results so we stay under the memcache 1MB limit - pickled = pickle.dumps(self) - compressed_pickled = zlib.compress(pickled) - - return memcache.set(RequestStats.memcache_key(self.request_id), compressed_pickled) - - @staticmethod - def get(request_id): - if request_id: - - compressed_pickled = memcache.get(RequestStats.memcache_key(request_id)) - - if compressed_pickled: - pickled = zlib.decompress(compressed_pickled) - return pickle.loads(pickled) - - return None - - @staticmethod - def memcache_key(request_id): - if not request_id: - return None - return "__gae_mini_profiler_request_%s" % request_id - - -class RequestProfiler(object): - """Profile a single request.""" - - def __init__(self, request_id, mode): - self.request_id = request_id - self.mode = mode - self.instrumented_prof = None - self.sampling_prof = None - self.appstats_prof = None - self.temporary_redirect = False - self.handler = None - self.logs = None - self.logging_request_id = self.get_logging_request_id() - self.start = None - self.end = None - - def profiler_results(self): - """Return the CPU profiler results for this request, if any. - - This will return a dictionary containing results for either the - sampling profiler, instrumented profiler results, or a simple - start/stop timer if both profilers are disabled.""" - - total_time = util.seconds_fmt(self.end - self.start, 0) - results = {"total_time": total_time} - - if self.instrumented_prof: - results.update(self.instrumented_prof.results()) - elif self.sampling_prof: - results.update(self.sampling_prof.results()) - - return results - - def appstats_results(self): - """Return the RPC profiler (appstats) results for this request, if any. - - This will return a dictionary containing results from appstats or an - empty result set if appstats profiling is disabled.""" - - results = { - "calls": [], - "total_time": 0, - } - - if self.appstats_prof: - results.update(self.appstats_prof.results()) - - return results - - def profile_start_response(self, app, environ, start_response): - """Collect and store statistics for a single request. - - Use this method from middleware in place of the standard - request-serving pattern. Do: - - profiler = RequestProfiler(...) - return profiler(app, environ, start_response) - - Instead of: - - return app(environ, start_response) - - Depending on the mode, this method gathers timing information - and an execution profile and stores them in the datastore for - later access. - """ - - # Always track simple start/stop time. - self.start = time.time() - - if self.mode == Mode.SIMPLE: - - # Detailed recording is disabled. - result = app(environ, start_response) - for value in result: - yield value - - else: - - # Add logging handler - self.add_handler() - - if Mode.is_rpc_enabled(self.mode): - # Turn on AppStats monitoring for this request - # Note that we don't import appstats_profiler at the top of - # this file so we don't bring in a lot of imports for users who - # don't have the profiler enabled. - from gae_mini_profiler import appstats_profiler - self.appstats_prof = appstats_profiler.Profile() - app = self.appstats_prof.wrap(app) - - # By default, we create a placeholder wrapper function that - # simply calls whatever function it is passed as its first - # argument. - result_fxn_wrapper = lambda fxn: fxn() - - # TODO(kamens): both sampling_profiler and instrumented_profiler - # could subclass the same class. Then they'd both be guaranteed to - # implement run(), and the following if/else could be simplified. - if Mode.is_sampling_enabled(self.mode): - # Turn on sampling profiling for this request. - # Note that we don't import sampling_profiler at the top of - # this file so we don't bring in a lot of imports for users who - # don't have the profiler enabled. - from gae_mini_profiler import sampling_profiler - self.sampling_prof = sampling_profiler.Profile() - result_fxn_wrapper = self.sampling_prof.run - - elif Mode.is_instrumented_enabled(self.mode): - # Turn on cProfile instrumented profiling for this request - # Note that we don't import instrumented_profiler at the top of - # this file so we don't bring in a lot of imports for users who - # don't have the profiler enabled. - from gae_mini_profiler import instrumented_profiler - self.instrumented_prof = instrumented_profiler.Profile() - result_fxn_wrapper = self.instrumented_prof.run - - # Get wsgi result - result = result_fxn_wrapper(lambda: app(environ, start_response)) - - # If we're dealing w/ a generator, profile all of the .next calls as well - if type(result) == GeneratorType: - - while True: - try: - yield result_fxn_wrapper(result.next) - except StopIteration: - break - - else: - for value in result: - yield value - - self.logs = self.get_logs(self.handler) - logging.getLogger().removeHandler(self.handler) - self.handler.stream.close() - self.handler = None - - self.end = time.time() - - # Store stats for later access - RequestStats(self, environ).store() - - def get_logging_request_id(self): - """Return the identifier for this request used by GAE's logservice. - - This logging_request_id will match the request_id parameter of a - RequestLog object stored in App Engine's logging API: - https://developers.google.com/appengine/docs/python/logs/ - """ - return os.environ.get("REQUEST_LOG_ID", None) - - def add_handler(self): - if self.handler is None: - self.handler = RequestProfiler.create_handler() - logging.getLogger().addHandler(self.handler) - - @staticmethod - def create_handler(): - handler = logging.StreamHandler(StringIO.StringIO()) - handler.setLevel(logging.DEBUG) - formatter = logging.Formatter("\t".join([ - '%(levelno)s', - '%(asctime)s%(msecs)d', - '%(funcName)s', - '%(filename)s', - '%(lineno)d', - '%(message)s', - ]), '%M:%S.') - handler.setFormatter(formatter) - return handler - - @staticmethod - def get_logs(handler): - raw_lines = [l for l in handler.stream.getvalue().split("\n") if l] - - lines = [] - for line in raw_lines: - if "\t" in line: - fields = line.split("\t") - lines.append(fields) - else: # line is part of a multiline log message (prob a traceback) - prevline = lines[-1][-1] - if prevline: # ignore leading blank lines in the message - prevline += "\n" - prevline += line - lines[-1][-1] = prevline - - return lines - -class ProfilerWSGIMiddleware(object): - - def __init__(self, app): - self.app = app - - def __call__(self, environ, start_response): - - CurrentRequestId.set(None) - - # Never profile calls to the profiler itself to avoid endless recursion. - if (not config.should_profile() or - environ.get("PATH_INFO", "").startswith("/gae_mini_profiler/")): - result = self.app(environ, start_response) - for value in result: - yield value - else: - # Set a random ID for this request so we can look up stats later - import base64 - CurrentRequestId.set(base64.urlsafe_b64encode(os.urandom(5))) - - # Send request id in headers so jQuery ajax calls can pick - # up profiles. - def profiled_start_response(status, headers, exc_info = None): - - if status.startswith("302 "): - # Temporary redirect. Add request identifier to redirect location - # so next rendered page can show this request's profile. - headers = ProfilerWSGIMiddleware.headers_with_modified_redirect(environ, headers) - # Access the profiler in closure scope - profiler.temporary_redirect = True - - # Append headers used when displaying profiler results from ajax requests - headers.append(("X-MiniProfiler-Id", CurrentRequestId.get())) - headers.append(("X-MiniProfiler-QS", environ.get("QUERY_STRING"))) - - return start_response(status, headers, exc_info) - - # As a simple form of rate-limiting, appstats protects all - # its work with a memcache lock to ensure that only one - # appstats request ever runs at a time, across all - # appengine instances. (GvR confirmed this is the purpose - # of the lock). So our attempt to profile will fail if - # appstats is running on another instance. Boo-urns! We - # just turn off the lock-checking for us, which means we - # don't rate-limit quite as much with the mini-profiler as - # we would do without. - old_memcache_add = memcache.add - old_memcache_delete = memcache.delete - memcache.add = (lambda key, *args, **kwargs: - (True if key == recording.lock_key() - else old_memcache_add(key, *args, **kwargs))) - memcache.delete = (lambda key, *args, **kwargs: - (True if key == recording.lock_key() - else old_memcache_delete(key, *args, **kwargs))) - - try: - profiler = RequestProfiler(CurrentRequestId.get(), - Mode.get_mode(environ)) - result = profiler.profile_start_response(self.app, environ, profiled_start_response) - for value in result: - yield value - finally: - CurrentRequestId.set(None) - memcache.add = old_memcache_add - memcache.delete = old_memcache_delete - - @staticmethod - def headers_with_modified_redirect(environ, headers): - headers_modified = [] - - for header in headers: - if header[0] == "Location": - reg = re.compile("mp-r-id=([^&]+)") - - # Keep any chain of redirects around - request_id_chain = CurrentRequestId.get() - match = reg.search(environ.get("QUERY_STRING")) - if match: - request_id_chain = ",".join([match.groups()[0], request_id_chain]) - - # Remove any pre-existing miniprofiler redirect id - location = header[1] - location = reg.sub("", location) - - # Add current request id as miniprofiler redirect id - location += ("&" if "?" in location else "?") - location = location.replace("&&", "&") - location += "mp-r-id=%s" % request_id_chain - - headers_modified.append((header[0], location)) - else: - headers_modified.append(header) - - return headers_modified diff --git a/src/lib/gae_mini_profiler/sampling_profiler.py b/src/lib/gae_mini_profiler/sampling_profiler.py deleted file mode 100755 index c47c7f7..0000000 --- a/src/lib/gae_mini_profiler/sampling_profiler.py +++ /dev/null @@ -1,176 +0,0 @@ -"""CPU profiler that works by sampling the call stack periodically. - -This profiler provides a very simplistic view of where your request is spending -its time. It does this by periodically sampling your request's call stack to -figure out in which functions real time is being spent. - -PRO: since the profiler only samples the call stack occasionally, it has much -less overhead than an instrumenting profiler, and avoids biases that -instrumenting profilers have due to instrumentation overhead (which causes -instrumenting profilers to overstate how much time is spent in frequently -called functions, or functions with deep call stacks). - -CON: since the profiler only samples, it does not allow you to accurately -answer a question like, "how much time was spent in routine X?", especially if -routine X takes relatively little time. (You *can* answer questions like "what -is the ratio of time spent in routine X vs routine Y," at least if both -routines take a reasonable amount of time.) It is better suited for answering -the question, "Where is the time spent by my app?" -""" - -from collections import defaultdict -import logging -import os -import sys -import time -import threading -import traceback - -from gae_mini_profiler import util - -_is_dev_server = os.environ["SERVER_SOFTWARE"].startswith("Devel") - -class InspectingThread(threading.Thread): - """Thread that periodically triggers profiler inspections.""" - SAMPLES_PER_SECOND = 250 - - def __init__(self, profile=None): - super(InspectingThread, self).__init__() - self._stop_event = threading.Event() - self.profile = profile - - def stop(self): - """Stop this thread.""" - # http://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python - self._stop_event.set() - - def should_stop(self): - return self._stop_event.is_set() - - def run(self): - """Start periodic profiler inspections. - - This will run, periodically inspecting and then sleeping, until - manually stopped via stop().""" - # Keep sampling until this thread is explicitly stopped. - while not self.should_stop(): - - # Take a sample of the main request thread's frame stack... - self.profile.take_sample() - - # ...then sleep and let it do some more work. - time.sleep(1.0 / InspectingThread.SAMPLES_PER_SECOND) - - # Only take one sample per thread if this is running on the - # single-threaded dev server. - if _is_dev_server and len(self.profile.samples) > 0: - break - - -class ProfileSample(object): - """Single stack trace sample gathered during a periodic inspection.""" - def __init__(self, stack): - self.stack_trace = traceback.extract_stack(stack) - - -class Profile(object): - """Profiler that periodically inspects a request and logs stack traces.""" - def __init__(self): - # All saved stack trace samples - self.samples = [] - - # Thread id for the request thread currently being profiled - self.current_request_thread_id = None - - # Thread that constantly waits, inspects, waits, inspect, ... - self.inspecting_thread = None - - def results(self): - """Return sampling results in a dictionary for template context.""" - aggregated_calls = defaultdict(int) - total_samples = len(self.samples) - - for sample in self.samples: - for filename, line_num, function_name, src in sample.stack_trace: - aggregated_calls["%s\n\n%s:%s (%s)" % - (src, filename, line_num, function_name)] += 1 - - # Turn aggregated call samples into dictionary of results - calls = [{ - "func_desc": item[0], - "func_desc_short": util.short_method_fmt(item[0]), - "count_samples": item[1], - "per_samples": "%s%%" % util.decimal_fmt( - 100.0 * item[1] / total_samples), - } for item in aggregated_calls.items()] - - # Sort call sample results by # of times calls appeared in a sample - calls = sorted(calls, reverse=True, - key=lambda call: call["count_samples"]) - - return { - "calls": calls, - "total_samples": total_samples, - "is_dev_server": _is_dev_server, - } - - def take_sample(self): - # Look at stacks of all existing threads... - # See http://bzimmer.ziclix.com/2008/12/17/python-thread-dumps/ - for thread_id, stack in sys._current_frames().items(): - - # ...but only sample from the main request thread. - - if _is_dev_server: - # In development, current_request_thread_id won't be set - # properly. threading.current_thread().ident always returns -1 - # in dev. So instead, we just take a peek at the stack's - # current package to figure out if it is the request thread. - # Even though the dev server is single-threaded, - # sys._current_frames will return multiple threads, because - # some of them are spawned by the App Engine dev server for - # internal purposes. We don't want to sample these internal dev - # server threads -- we want to sample the thread that is - # running the current request. Since the dev server will be - # running this sampling code immediately from the run() code - # below, we can spot this thread's stack by looking at its - # global namespace (f_globals) and making sure it's currently - # in the gae_mini_profiler package. - should_sample = (stack.f_globals["__package__"] == - "gae_mini_profiler") - else: - # In production, current_request_thread_id will be set properly - # by threading.current_thread().ident. - # TODO(kamens): this profiler will need work if we ever - # actually use multiple threads in a single request and want to - # profile more than one of them. - should_sample = thread_id == self.current_request_thread_id - - if should_sample: - # Grab a sample of this thread's current stack - self.samples.append(ProfileSample(stack)) - - def run(self, fxn): - """Run function with samping profiler enabled, saving results.""" - if not hasattr(threading, "current_thread"): - # Sampling profiler is not supported in Python2.5 - logging.warn("The sampling profiler is not supported in Python2.5") - return fxn() - - # Store the thread id for the current request's thread. This lets - # the inspecting thread know which thread to inspect. - self.current_request_thread_id = threading.current_thread().ident - - # Start the thread that will be periodically inspecting the frame - # stack of this current request thread - self.inspecting_thread = InspectingThread(profile=self) - self.inspecting_thread.start() - - try: - # Run the request fxn which will be inspected by the inspecting - # thread. - return fxn() - finally: - # Stop and clear the inspecting thread - self.inspecting_thread.stop() - self.inspecting_thread = None diff --git a/src/lib/gae_mini_profiler/static/css/profiler.css b/src/lib/gae_mini_profiler/static/css/profiler.css deleted file mode 100755 index 3473e4d..0000000 --- a/src/lib/gae_mini_profiler/static/css/profiler.css +++ /dev/null @@ -1,324 +0,0 @@ -.g-m-p-corner { - padding: 4px; - cursor: pointer; - text-align: right; - - max-height: 205px; - overflow: auto; - overflow-x: hidden; - overflow-y: auto; -} - -.g-m-p-corner .ms, -.g-m-p .ms { - color: #777; -} - -.g-m-p-corner .entry { - height: auto; - margin: auto; - white-space: nowrap; -} - -.g-m-p-corner .entry.ajax { - border-top: 1px dotted #DDD; -} - -.g-m-p-corner .entry.expanded { - font-weight: bold; -} - -.g-m-p { - min-width: 410px; - padding: 9px; - padding-bottom: 18px; -} - -.g-m-p, .g-m-p-corner, .g-m-p-shared { - font-family: Helvetica, Arial, sans-serif; - font-size: 12px; - color: #444; - line-height: 18px; -} - -.g-m-p a, .g-m-p-corner a, .g-m-p-shared a { - color: #069; - text-decoration: none; -} - -.g-m-p a.uses_script, .g-m-p-corner a.uses_script, .g-m-p-shared a.uses_script { - border-bottom: dotted 1px #069 -} - -.g-m-p, .g-m-p-corner { - position: absolute; - left: 9px; - top: 0; - - background: #F7F7F7; - - border-top: 0; - border-left: 1px solid #CCC; - border-bottom: 1px solid #DDD; - border-right: 1px solid #DDD; - - box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.25); - -moz-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.25); - -webkit-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.25); - - border-bottom-left-radius: 12px; - border-bottom-right-radius: 12px; - - z-index: 99999; -} - -.g-m-p .title { - font-size: 1.25em; - text-align: left; - font-weight: bold; - border-bottom: 1px solid #CCC; - padding: 0; -} - -.g-m-p .date_and_share { - text-align: right; - margin-bottom: 18px; -} - -.g-m-p .date_and_share .date { - font-style: italic; - color: #CCC; -} - -.g-m-p .appstats-link { - float:right; -} - -.g-m-p .url { - font-size: 125%; -} - -.g-m-p .redirect { - float: left; - color: #444; -} - -.g-m-p .total { - float: right; -} - -.g-m-p .warn { - font-weight: bold; - color: red; -} - -.g-m-p .summary { - float: right; - display: inline; -} - -.g-m-p .details { - max-width: 800px; - max-height: 500px; - margin-bottom: 18px; - overflow: auto; -} - -.g-m-p .expand.expanded { - border-bottom: 1px solid #DDD; -} - -.g-m-p .expand.expanded a { - text-decoration: none; - border-bottom: 0; - font-weight: bold; -} - -.g-m-p .details table { - margin-top: 6px; - border-spacing: 0; - font-size: 12px; -} - -.g-m-p .details table tr:nth-child(odd) { - background-color: #FFF; -} - -.g-m-p .details table tr:nth-child(even) { - background-color: #F7F7F7; -} - -.g-m-p .details table .callers-label { - color: #CCC; -} - -.g-m-p .details th, .g-m-p .details th.header { - font-size: 12px; - background-color: #F7F7F7; - font-weight: bold; - cursor: pointer; - float: none; - position: static; -} - -.g-m-p .details th.headerSortUp, -.g-m-p .details th.headerSortDown { - text-decoration: underline; -} - -.g-m-p .details th, -.g-m-p .details td { - padding-right: 18px; - vertical-align: top; -} - -.g-m-p .details .left { - text-align: left; - float: none; -} - -.g-m-p .details .right { - text-align: right; - float: none; -} - -.g-m-p-shared .shared-teaser-container { - text-align: center; -} - -.g-m-p-shared .shared-teaser { - margin-left: auto; - margin-right: auto; - height: 400px; - width: 600px; - text-align: center; - padding: 200px 0; - font-size: 24px; - font-weight: bold; -} - -.g-m-p span.loglevel { - display: inline-block; - height: 1.2em; - width: 1.2em; - line-height: 1.2; - text-align: center; - text-transform: capitalize; - font-weight: bold; - border-radius: 2px; -} - -.g-m-p span.loglevel span { - display: none; -} - -.g-m-p .boxes li { - display: inline; - margin: 0 10px 0 0; -} - -.g-m-p div.simple-timing { - margin-top: 18px; - text-align: center; -} - -.g-m-p .summary span.loglevel { - margin: 0 .1em 0 .6em; -} -.g-m-p span.loglevel.ll50:before { content: 'C'; } -.g-m-p span.loglevel.ll40:before { content: 'E'; } -.g-m-p span.loglevel.ll30:before { content: 'W'; } -.g-m-p span.loglevel.ll20:before { content: 'I'; } -.g-m-p span.loglevel.ll10:before { content: 'D'; } - -.g-m-p .ll50 { background-color: #F22; } -.g-m-p .ll40 { background-color: #F90; } -.g-m-p .ll30 { background-color: #Fd0; } -.g-m-p .ll20 { background-color: #3C0; } -.g-m-p .ll10 { background-color: #09F; } - -#slider { - padding: 5px 0 3px 0; -} - -#slider .container { - width: 150px; - display: inline-block; -} - -#slider .minlevel-text { - display: inline-block; - width: 4em; -} - -#slider .loglevel { - margin-left: .5em; -} - -#slider .ui-slider-horizontal { - /*height: .2em;*/ -} - -/* Borrowed from those smart guys @ Fog Creek. Props to Justin & Bobby */ -.g-m-p .fancy-scrollbar::-webkit-scrollbar { - height: 8px; - width: 8px; -} -.g-m-p .fancy-scrollbar::-webkit-scrollbar-button:start:decrement, -.g-m-p .fancy-scrollbar::-webkit-scrollbar-button:end:increment { - background: transparent; - display: none; -} -.g-m-p .fancy-scrollbar::-webkit-scrollbar-track-piece { - background: transparent; -} -.g-m-p .fancy-scrollbar::-webkit-scrollbar-track-piece:vertical:start { - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; -} -.g-m-p .fancy-scrollbar::-webkit-scrollbar-track-piece:vertical:end { - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; -} -.g-m-p .fancy-scrollbar::-webkit-scrollbar-track-piece:horizontal:start { - -webkit-border-top-left-radius: 4px; - -webkit-border-bottom-left-radius: 4px; -} -.g-m-p .fancy-scrollbar::-webkit-scrollbar-track-piece:horizontal:end { - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; -} -.g-m-p .fancy-scrollbar::-webkit-scrollbar-thumb:vertical, -.g-m-p .fancy-scrollbar::-webkit-scrollbar-thumb:horizontal { - background: #ccc; - border: 1px solid #aaa; - border-radius: 4px; - display: block; - height: 50px; -} - -.g-m-p .settings { - background: #E6E6E6; - padding: 9px; - - border: 1px solid #CCC; - border-top: 0; - - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; -} - -.g-m-p .settings table { - width: 100%; - padding: 0; -} -.g-m-p .settings table th, -.g-m-p .settings table td { - max-width: 200px; - text-align: left; - vertical-align: top; - width: 50%; -} -.g-m-p .settings table tr.tips td { - font-style: italic; -} diff --git a/src/lib/gae_mini_profiler/static/js/profiler.js b/src/lib/gae_mini_profiler/static/js/profiler.js deleted file mode 100755 index 061d997..0000000 --- a/src/lib/gae_mini_profiler/static/js/profiler.js +++ /dev/null @@ -1,475 +0,0 @@ - -var GaeMiniProfiler = { - - // Profiler modes match gae_mini_profiler.profiler.Mode's enum. - // TODO(kamens): switch this from an enum to a more sensible bitmask or - // other alternative that supports multiple settings without an exploding - // number of enums. - modes: { - SIMPLE: "simple", - CPU_INSTRUMENTED: "instrumented", - CPU_SAMPLING: "sampling", - RPC_ONLY: "rpc", - RPC_AND_CPU_INSTRUMENTED: "rpc_instrumented", - RPC_AND_CPU_SAMPLING: "rpc_sampling" - }, - - init: function(requestId, fShowImmediately) { - // Fetch profile results for any ajax calls - // (see http://code.google.com/p/mvc-mini-profiler/source/browse/MvcMiniProfiler/UI/Includes.js) - $(document).ajaxComplete(function (e, xhr, settings) { - if (xhr) { - var requestId = xhr.getResponseHeader('X-MiniProfiler-Id'); - if (requestId) { - var queryString = xhr.getResponseHeader('X-MiniProfiler-QS'); - GaeMiniProfiler.fetch(requestId, queryString); - } - } - }); - - GaeMiniProfiler.fetch(requestId, window.location.search, fShowImmediately); - }, - - /** - * Return the profiler mode being requested by the current browser cookie. - */ - getCookieMode: function() { - var mode = $.cookiePlugin("g-m-p-mode"); - - // Default to RPC + Instrumented - var valid = false; - for (var key in this.modes) { - if (mode == this.modes[key]) { - valid = true; - break; - } - } - if (!valid) { - mode = this.modes.RPC_AND_CPU_INSTRUMENTED; - } - - return mode; - }, - - /** - * Set browser cookie for current profiler mode according to radio inputs. - */ - setCookieMode: function(elLink) { - // Get current state of RPC/CPU profiler settings according to radios - var jel = $(elLink).closest(".g-m-p").find(".settings"), - rpcValue = jel.find("input:radio[name=rpc]:checked").val(), - cpuValue = jel.find("input:radio[name=cpu]:checked").val(); - - // Convert to format matching this.modes values. - var mode = "simple"; - if (rpcValue && cpuValue) { - mode = rpcValue + "_" + cpuValue; - } - else { - mode = rpcValue || cpuValue || "simple"; - } - - // Set mode cookie for profiler to detect on next request - $.cookiePlugin("g-m-p-mode", mode, {path: '/', expires: 365}); - }, - - /** - * True if profiler mode has enabled RPC profiling - */ - isRpcEnabled: function(mode) { - return (mode == this.modes.RPC_ONLY || - mode == this.modes.RPC_AND_CPU_INSTRUMENTED || - mode == this.modes.RPC_AND_CPU_SAMPLING); - }, - - /** - * True if profiler mode has enabled CPU instrumentation - */ - isInstrumentedEnabled: function(mode) { - return (mode == this.modes.CPU_INSTRUMENTED || - mode == this.modes.RPC_AND_CPU_INSTRUMENTED); - }, - - /** - * True if profiler mode has enabled CPU sampling - */ - isSamplingEnabled: function(mode) { - return (mode == this.modes.CPU_SAMPLING || - mode == this.modes.RPC_AND_CPU_SAMPLING); - }, - - /** - * True if either CPU instrumentation or CPU sampling is enabled - */ - isCpuEnabled: function(mode) { - return (GaeMiniProfiler.isInstrumentedEnabled(mode) || - GaeMiniProfiler.isSamplingEnabled(mode)); - }, - - appendRedirectIds: function(requestId, queryString) { - if (queryString) { - var re = /mp-r-id=([^&]+)/; - var matches = re.exec(queryString); - if (matches && matches.length) { - var sRedirectIds = matches[1]; - var list = sRedirectIds.split(","); - list[list.length] = requestId; - return list; - } - } - - return [requestId]; - }, - - fetch: function(requestId, queryString, fShowImmediately) { - var requestIds = this.appendRedirectIds(requestId, queryString); - - $.get( - "/gae_mini_profiler/request", - { "request_ids": requestIds.join(",") }, - function(data) { - GaeMiniProfilerTemplate.init(function() { GaeMiniProfiler.finishFetch(data, fShowImmediately); }); - }, - "json" - ); - }, - - finishFetch: function(data, fShowImmediately) { - if (!data || !data.length) return; - - for (var ix = 0; ix < data.length; ix++) { - - var jCorner = this.renderCorner(data[ix]); - - if (!jCorner.data("attached")) { - $('body') - .append(jCorner) - .click(function(e) { return GaeMiniProfiler.collapse(e); }); - jCorner - .data("attached", true); - } - - if (fShowImmediately) - jCorner.find(".entry").first().click(); - - } - }, - - /** - * Fetch the RequestLog data (pending_ms and loading_request) from App - * Engine's logservice API. - */ - fetchRequestLog: function(data, attempts) { - - // We're willing to ask the logservice API for its RequestLog data more - // than once, because it may take App Engine a while to flush its logs. - if (!attempts) { - attempts = 0; - } - - // We only try to get the request log three times. - if (attempts > 2) { - $(".g-m-p .request-log-" + data.logging_request_id) - .html("Request log data not found."); - return; - } - - $.get( - "/gae_mini_profiler/request/log", - { - "request_id": data.request_id, - "logging_request_id": data.logging_request_id - }, - function(requestLogData) { - - if (!requestLogData) { - // The request log may not be available just yet, because - // App Engine may still be writing its logs. We'll wait a - // sec and try up to three times. - setTimeout(function() { - GaeMiniProfiler.fetchRequestLog(data, attempts + 1); - }, 1000); - return; - } - - requestLogData.request_id = data.request_id; - GaeMiniProfiler.finishFetchRequestLog(requestLogData); - } - ); - }, - - /** - * Render the RequestLog information (pending_ms and loading_request). - */ - finishFetchRequestLog: function(requestLogData) { - $(".g-m-p .request-log-" + requestLogData.logging_request_id) - .empty() - .append( - $("#profilerRequestLogTemplate").tmplPlugin( - requestLogData)); - }, - - collapse: function(e) { - if ($(".g-m-p").is(":visible")) { - $(".g-m-p").slideUp("fast"); - $(".g-m-p-corner").slideDown("fast") - .find(".expanded").removeClass("expanded"); - return false; - } - - return true; - }, - - expand: function(elEntry, data) { - var jPopup = $(".g-m-p"); - - if (jPopup.length) - jPopup.remove(); - else - $(document).keyup(function(e) { if (e.which == 27) GaeMiniProfiler.collapse() }); - - jPopup = this.renderPopup(data); - $('body').append(jPopup); - - var jCorner = $(".g-m-p-corner"); - jCorner.find(".expanded").removeClass("expanded"); - $(elEntry).addClass("expanded"); - - jPopup - .find(".profile-link") - .click(function() { GaeMiniProfiler.toggleSection(this, ".profiler-details"); return false; }).end() - .find(".rpc-link") - .click(function() { GaeMiniProfiler.toggleSection(this, ".rpc-details"); return false; }).end() - .find(".logs-link") - .click(function() { GaeMiniProfiler.toggleSection(this, ".logs-details"); return false; }).end() - .find(".callers-link") - .click(function() { $(this).parents("td").find(".callers").slideToggle("fast"); return false; }).end() - .find(".request-log-link") - .click(function() { GaeMiniProfiler.showRequestLog(this); return false; }).end() - .find(".settings-link") - .click(function() { GaeMiniProfiler.toggleSettings(this); return false; }).end() - .find(".settings input") - .change(function() { GaeMiniProfiler.setCookieMode(this); return false; }).end() - .click(function(e) { e.stopPropagation(); }) - .css("left", jCorner.offset().left + jCorner.width() + 18) - .slideDown("fast"); - - var toggleLogRows = function(level) { - var names = {10:'Debug', 20:'Info', 30:'Warning', 40:'Error', 50:'Critical'}; - $('#slider .minlevel-text').text(names[level]); - $('#slider .loglevel').attr('class', 'loglevel ll'+level); - for (var i = 10; i<=50; i += 10) { - var rows = $('tr.ll'+i); - if (i)[^>]*$|\{\{\! /,b={},f={},e,p={key:0,data:{}},i=0,c=0,l=[];function g(g,d,h,e){var c={data:e||(e===0||e===false)?e:d?d.data:{},_wrap:d?d._wrap:null,tmplPlugin:null,parent:d||null,nodes:[],calls:u,nest:w,wrap:x,html:v,update:t};g&&a.extend(c,g,{nodes:[],parent:d});if(h){c.tmplPlugin=h;c._ctnt=c._ctnt||c.tmplPlugin(a,c);c.key=++i;(l.length?f:b)[i]=c}return c}a.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(f,d){a.fn[f]=function(n){var g=[],i=a(n),k,h,m,l,j=this.length===1&&this[0].parentNode;e=b||{};if(j&&j.nodeType===11&&j.childNodes.length===1&&i.length===1){i[d](this[0]);g=this}else{for(h=0,m=i.length;h0?this.clone(true):this).get();a(i[h])[d](k);g=g.concat(k)}c=0;g=this.pushStack(g,f,i.selector)}l=e;e=null;a.tmplPlugin.complete(l);return g}});a.fn.extend({tmplPlugin:function(d,c,b){return a.tmplPlugin(this[0],d,c,b)},tmplItem:function(){return a.tmplItem(this[0])},template:function(b){return a.template(b,this[0])},domManip:function(d,m,k){if(d[0]&&a.isArray(d[0])){var g=a.makeArray(arguments),h=d[0],j=h.length,i=0,f;while(i").join(">").split('"').join(""").split("'").join("'")}});a.extend(a.tmplPlugin,{tag:{tmplPlugin:{_default:{$2:"null"},open:"if($notnull_1){__=__.concat($item.nest($1,$2));}"},wrap:{_default:{$2:"null"},open:"$item.calls(__,$1,$2);__=[];",close:"call=$item.calls();__=call._.concat($item.wrap(call,__));"},each:{_default:{$2:"$index, $value"},open:"if($notnull_1){$.each($1a,function($2){with(this){",close:"}});}"},"if":{open:"if(($notnull_1) && $1a){",close:"}"},"else":{_default:{$1:"true"},open:"}else if(($notnull_1) && $1a){"},html:{open:"if($notnull_1){__.push($1a);}"},"=":{_default:{$1:"$data"},open:"if($notnull_1){__.push($.encode($1a));}"},"!":{open:""}},complete:function(){b={}},afterManip:function(f,b,d){var e=b.nodeType===11?a.makeArray(b.childNodes):b.nodeType===1?[b]:[];d.call(f,b);m(e);c++}});function j(e,g,f){var b,c=f?a.map(f,function(a){return typeof a==="string"?e.key?a.replace(/(<\w+)(?=[\s>])(?![^>]*_tmplitem)([^>]*)/g,"$1 "+d+'="'+e.key+'" $2'):a:j(a,e,a._ctnt)}):e;if(g)return c;c=c.join("");c.replace(/^\s*([^<\s][^<]*)?(<[\w\W]+>)([^>]*[^>\s])?\s*$/,function(f,c,e,d){b=a(e).get();m(b);if(c)b=k(c).concat(b);if(d)b=b.concat(k(d))});return b?b:k(c)}function k(c){var b=document.createElement("div");b.innerHTML=c;return a.makeArray(b.childNodes)}function o(b){return new Function("jQuery","$item","var $=jQuery,call,__=[],$data=$item.data;with($data){__.push('"+a.trim(b).replace(/([\\'])/g,"\\$1").replace(/[\r\t\n]/g," ").replace(/\$\{([^\}]*)\}/g,"{{= $1}}").replace(/\{\{(\/?)(\w+|.)(?:\(((?:[^\}]|\}(?!\}))*?)?\))?(?:\s+(.*?)?)?(\(((?:[^\}]|\}(?!\}))*?)\))?\s*\}\}/g,function(m,l,k,g,b,c,d){var j=a.tmplPlugin.tag[k],i,e,f;if(!j)throw"Unknown template tag: "+k;i=j._default||[];if(c&&!/\w$/.test(b)){b+=c;c=""}if(b){b=h(b);d=d?","+h(d)+")":c?")":"";e=c?b.indexOf(".")>-1?b+h(c):"("+b+").call($item"+d:b;f=c?e:"(typeof("+b+")==='function'?("+b+").call($item):("+b+"))"}else f=e=i.$1||"null";g=h(g);return"');"+j[l?"close":"open"].split("$notnull_1").join(b?"typeof("+b+")!=='undefined' && ("+b+")!=null":"true").split("$1a").join(f).split("$1").join(e).split("$2").join(g||i.$2||"")+"__.push('"})+"');}return __;")}function n(c,b){c._wrap=j(c,true,a.isArray(b)?b:[q.test(b)?b:a(b).html()]).join("")}function h(a){return a?a.replace(/\\'/g,"'").replace(/\\\\/g,"\\"):null}function s(b){var a=document.createElement("div");a.appendChild(b.cloneNode(true));return a.innerHTML}function m(o){var n="_"+c,k,j,l={},e,p,h;for(e=0,p=o.length;e=0;h--)m(j[h]);m(k)}function m(j){var p,h=j,k,e,m;if(m=j.getAttribute(d)){while(h.parentNode&&(h=h.parentNode).nodeType===1&&!(p=h.getAttribute(d)));if(p!==m){h=h.parentNode?h.nodeType===11?0:h.getAttribute(d)||0:0;if(!(e=b[m])){e=f[m];e=g(e,b[h]||f[h]);e.key=++i;b[i]=e}c&&o(m)}j.removeAttribute(d)}else if(c&&(e=a.data(j,"tmplItem"))){o(e.key);b[e.key]=e;h=a.data(j.parentNode,"tmplItem");h=h?h.key:0}if(e){k=e;while(k&&k.key!=h){k.nodes.push(j);k=k.parent}delete e._ctnt;delete e._wrap;a.data(j,"tmplItem",e)}function o(a){a=a+n;e=l[a]=l[a]||g(e,b[e.parent.key+n]||e.parent)}}}function u(a,d,c,b){if(!a)return l.pop();l.push({_:a,tmplPlugin:d,item:this,data:c,options:b})}function w(d,c,b){return a.tmplPlugin(a.template(d),c,b,this)}function x(b,d){var c=b.options||{};c.wrapped=d;return a.tmplPlugin(a.template(b.tmplPlugin),b.data,c,b.item)}function v(d,c){var b=this._wrap;return a.map(a(a.isArray(b)?b.join(""):b).filter(d||"*"),function(a){return c?a.innerText||a.textContent:a.outerHTML||s(a)})}function t(){var b=this.nodes;a.tmplPlugin(null,null,null,this).insertBefore(b[0]);a(b).remove()}})(jQuery); - -/* - * jQuery TableSorter plugin - * http://autobahn.tablesorter.com/jquery.tablesorter.min.js - */ - -(function($){$.extend({tablesorter:new -function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'/\.|\,/g',onRenderHeader:null,selectorHeaders:'thead th',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}if(table.tBodies.length==0)return;var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder))return table.config.headers[i].lockedOrder;return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i b["+i+"]) ? 1 : 0));";};function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));";};function makeSortNumeric(i){return"a["+i+"]-b["+i+"];";};function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];";};function sortText(a,b){if(table.config.sortLocaleCompare)return a.localeCompare(b);return((ab)?1:0));};function sortTextDesc(a,b){if(table.config.sortLocaleCompare)return b.localeCompare(a);return((ba)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder)this.order=this.lockedOrder;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i 1 && String(value) !== "[object Object]") { - options = jQuery.extend({}, options); - - if (value === null || value === undefined) { - options.expires = -1; - } - - if (typeof options.expires === 'number') { - var days = options.expires, t = options.expires = new Date(); - t.setDate(t.getDate() + days); - } - - value = String(value); - - return (document.cookie = [ - encodeURIComponent(key), '=', - options.raw ? value : encodeURIComponent(value), - options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE - options.path ? '; path=' + options.path : '', - options.domain ? '; domain=' + options.domain : '', - options.secure ? '; secure' : '' - ].join('')); - } - - // key and possibly options given, get cookie... - options = value || {}; - var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent; - return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null; -}; diff --git a/src/lib/gae_mini_profiler/static/js/template.tmpl b/src/lib/gae_mini_profiler/static/js/template.tmpl deleted file mode 100755 index ad54c69..0000000 --- a/src/lib/gae_mini_profiler/static/js/template.tmpl +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - - diff --git a/src/lib/gae_mini_profiler/templates/includes.html b/src/lib/gae_mini_profiler/templates/includes.html deleted file mode 100755 index e161a97..0000000 --- a/src/lib/gae_mini_profiler/templates/includes.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/lib/gae_mini_profiler/templates/shared.html b/src/lib/gae_mini_profiler/templates/shared.html deleted file mode 100755 index 9793d86..0000000 --- a/src/lib/gae_mini_profiler/templates/shared.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - -
    -
    - Shared profiler results -
    -
    - {{profiler_includes}} - - diff --git a/src/lib/gae_mini_profiler/templatetags.py b/src/lib/gae_mini_profiler/templatetags.py deleted file mode 100755 index 02e9ec3..0000000 --- a/src/lib/gae_mini_profiler/templatetags.py +++ /dev/null @@ -1,25 +0,0 @@ -# use json in Python 2.7, fallback to simplejson for Python 2.5 -try: - import json -except ImportError: - import simplejson as json - -import profiler - - -def profiler_includes_request_id(request_id, show_immediately=False): - if not request_id: - return "" - - js_path = "/gae_mini_profiler/static/js/profiler.js" - css_path = "/gae_mini_profiler/static/css/profiler.css" - - return """ - - - - """ % (css_path, js_path, request_id, json.dumps(show_immediately)) - - -def profiler_includes(): - return profiler_includes_request_id(profiler.CurrentRequestId.get()) diff --git a/src/lib/gae_mini_profiler/unformatter/__init__.py b/src/lib/gae_mini_profiler/unformatter/__init__.py deleted file mode 100755 index a3f4ae6..0000000 --- a/src/lib/gae_mini_profiler/unformatter/__init__.py +++ /dev/null @@ -1,112 +0,0 @@ -import pprint -import re -import sys - - -_STRING = re.compile(r"^\s*(['\"])") -_NUMBER = re.compile(r"^\s*(\d+L?)\s*") -_BOOLEAN = re.compile(r"^\s*(True|False)\s*") -_DETAILS_OMMITTED = re.compile(r"^\s*\.\.\.\s*") -_LIST = re.compile(r"^\s*\[") -_LIST_SEPARATOR = re.compile(r"^\s*,\s*") -_LIST_END = re.compile(r"^\s*]\s*") -_DICT = re.compile(r"^\s*([\w-]+)<") -_DICT_FIELD = re.compile(r"^\s*([\w-]+)\s*=\s*") -_DICT_SEPARATOR = _LIST_SEPARATOR -_DICT_END = re.compile(r"^\s*>\s*") - - -def _consume_re(re, text): - m = re.match(text) - if not m: - return None, text - return m, text[m.end(0):] - - -def _parse_string(text, quote_char): - end = text.index(quote_char) - while text[end-1] == "\\": - end = text.index(quote_char, end+1) - return text[:end].decode('string_escape', 'ignore'), text[end+1:] - - -def _parse_list(text): - result = [] - while True: - m, text = _consume_re(_LIST_END, text) - if m: - return result, text - element, text = _parse(text) - result.append(element) - _, text = _consume_re(_LIST_SEPARATOR, text) - - -def _parse_dict(text, name): - args = [] - kwargs = {} - while True: - m, text = _consume_re(_DICT_END, text) - if m: - if args and kwargs: - obj = { 'args': args } - obj.update(kwargs) - elif args: - obj = args if len(args) > 1 else args[0] - elif kwargs: - obj = kwargs - else: - obj = None - return {name: obj}, text - m, text = _consume_re(_DICT_SEPARATOR, text) - if m: - continue - m, text = _consume_re(_DICT_FIELD, text) - if m: - element, text = _parse(text) - kwargs[ m.group(1).strip("_") ] = element - continue - element, text = _parse(text) - args.append(element) - - -def _parse(text): - m, text = _consume_re(_STRING, text) - if m: - return _parse_string(text, m.group(1)) - m, text = _consume_re(_NUMBER, text) - if m: - value = long(m.group(1)[:-1]) if m.group(1).endswith("L") else int(m.group(1)) - return value, text - m, text = _consume_re(_BOOLEAN, text) - if m: - return m.group(1) == "True", text - m, text = _consume_re(_DETAILS_OMMITTED, text) - if m: - return "...", text - m, text = _consume_re(_LIST, text) - if m: - return _parse_list(text) - m, text = _consume_re(_DICT, text) - if m: - return _parse_dict(text, m.group(1)) - raise ValueError(text) - - -def unformat(text): - result, remainder = _parse(text) - assert remainder == "" - return result - - -def main(): - from io import StringIO - f = open('examples.txt', 'r') - for line in f: - result = unformat(line.strip()) - pprint.pprint(result) - - raw_input('cont?') - f.close() - -if __name__ == '__main__': - main() diff --git a/src/lib/gae_mini_profiler/unformatter/examples.txt b/src/lib/gae_mini_profiler/unformatter/examples.txt deleted file mode 100755 index 7cd39fc..0000000 --- a/src/lib/gae_mini_profiler/unformatter/examples.txt +++ /dev/null @@ -1,16 +0,0 @@ -MemcacheGetRequest> -MemcacheGetResponse -MemcacheGetRequest, name_space_='764.1'> -MemcacheGetResponse]> -MemcacheGetRequest, name_space_='764.1'> -MemcacheGetResponseThank You Khan Academy!q\tU\x03keyq\ncgoogle.appengine.api.datastore_types\nKey\nq\x0b)\x81q\x0c}q\r(U\x0f_Key__referenceq\x0e(cgoogle.appengine.datastore.entity_pb...Interior Angles of Any Polygonr`\x02\x00\x00h\nh\x0b)\x81ra\x02\x00\x00}rb\x02\x00\x00(h\x0e(h\x0forc\x02\x00\x00U"j\x10dev~khan-academyr\x0e\x0b\x12\x05Video\x18\xed\xbc\xc5v\x0cbh\x11Nubh\x12X\x0b\x00\x00\x00ilsS0IDaQ5Ard\x02\x00\x00h\x14X3\x00\x00\x00http://img.youtube.com/vi/ilsS0IDaQ5A/hqdefault.jpgre\x02\x00\x00h\x16h\x17h\x18XD\x00\x00\x00Showing a generalized way to find the sum of the interior an…rf\x02\x00\x00uae.'>]> -MemcacheGetRequest, name_space_='764.1'> -MemcacheGetResponseSurveys and Samples\n\n
    \n \n
    \n

    #!# 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 o4$7WP0L0T{4aP2UTTO1{OP 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�Yr9WZ90r=z zMHyK*GPXL`EjjU{rP>gyoy|Eg0zks-@$3DRK5Xq%|)7(ec^ zu61k`Kb#82`{xr1RWtBr^(pU%D8czf&DJVMVxia~-aC8?ZED^Bn5!wo`&;D;LoIw<@n zi_vl{kF;FPurQR>nS4flQ75b5y^0RL(dN=&TmRg?^(*lVtNI7vl0}68SlVUJ-VM-I`02f? z4fA~^=q3~VNP=R5Ixj)5>#UIcV3JNltOis&Y(n{YTSiPSK-LK|>cPv3+z zBVS5f`FBd_WAXBonhHK9|50kdvr@E|NSf=^4%z*O$4b$9>1fk4ewcJPg-b#yXNIJO zV9+wD1h5UyrGlKoz4lWL=4&b3n-A?r;a+fCABDSPV{v2~Dcmb|GKKrb7IwL74y=5< z(>lHMO(1;}rUn%=2_ zqd?R+DWfi432Trll6#BNqOGc=Iiz;(rWk6c!PE|DtPy@AXRBBNJ@v9zKs!F;1io5K z4+}@z{G#nrlW}?4`JT^)25E2?sUCyIs~$H1cu~zbBkEPpY#W+XPxIp5s%Ngf>kUb` z_BRmgq@3Q#(+fsg=@!>r=!}Hxc8+sa@sEu%KwzEfu&tan&*zLl8EDSuH4x30-;uV_ z^EB)e#F95kq=j0EmzlI6_Q{XjLpSB3ghe=pLv=M^*PUYyF^*Krx@Bq+fiptN<>Bi_ zHnlw1T%O;k9HyhbubIlc;Al6_<8mCJ)Tj1%zBU-UZv6aJ-x}Y(a^3i0%W4PA7tb`v zaUxu5l*Bci4aBV+J7WX!hN-^5F#VbZ?dE~+c3%Nsz(|pi@VnXY%?+8;7YfG*FsYvXa;*mW#++Cjw^)9+*pnkc@m&V7Ycj?A6 zIh=umDSi%1;$PY%N11fnHw-AL5hW`+Ch&8_QuNDyjDUC;ntlFm87(SlWao^ zGahu^bCt%^kV<1y7%s|f=zrZO!P6ozc)OyMM#G;k&ab)H#JcGDO$!UFQn9EL=6 zh3z=^3Tg`l$3x=rk1aiTW7##qqtR@s(LBXk0l$n5Vq`C(F_cjG@?$AT(r4O!PCJ!} zgiUG?td#Gzj!D{)Pjbp~5P$z~Dr(d=7YS`kZd&dDFaIMVf2eC6QOwu*w!#|zQa^TIv!+(v2xSLtWoYSc0 z2;S`cL}^53bp|2P)Q%6hU^fOaUx&KWM5d%AMpKmwz)U5;mn?Wt|9i3&w&$)%l`U%J zm2)*eG++DTXhoBE%G;_T;n=klO$oi(E5Dk!BI(vkK+wrzM*X81qF5xveXb433(BWh zCw#5pRjCHh)F6ykDm0y-1t~2pIgX$@FQXI+;i7(+D&Y-?_ZG4+nZ*5F8Y_QF+{|^i zc5gWF&%3!IrSvZ_+ZWbhwoj8HxiHnSapvL_AGNMKMu6)xK1XCqMvq*T2zKF~G+XPq zk&6?7z6^)h9+7F&=`!}7IsK9&sC0ERH{;J-CDBf%^mW@;r65R~j02ghxBtFVu9cB4 zLc_4W2u3i8qRR7$D}Sjf!9jQZb-2|G|2e}cuu8W*0==P=_90O%eQ3D>@YBX5PKvy} zRVxa9RH`F}4pcL|s^L}XqA^K+xG(+ERTIROf>eecP-{|rx9G|*zzRo$Rne~F*nk4QqWy-wl6fR{)_TudDu8JnCj zCJFaXfBR^L>GeFN&?+;%6JiR;dv;J%K9T-ZdbVAoIMeHth&4oRu|PLh=ut>&?1bsG zaMHCNsnTv$cJM^_*+wq2a3E4`cq5(&N8}3%-;}P-{topLF3FXa9EYpVbfm4%59a?* z9%i_03{`*saSD^VUsrOh{hZ{CPOr+whzQ1|7iZr`U+MP?T6E#R1~*jqOb(ZD4I5{p z)fSM|w%=KkBZrLsx3)axZ-=S6`5u;tmfv!)>NOxJ&~R zrDCEx|7~*MSw@0wOOxaapxNqdK-|>Z4eF?_uu+ot<vEtc!J< z5@H|zG#|npri!d*pXAsX+4dewgI=K4VkJlAOItUk;Xb}JV(fi9R4PFgr6*pSFAY3u zd)+C;ZAWVty><>_FZ@;Z7}^L!`w1OEQTi5r=`f_5u&uoaLkM%X-Xrx(bjA1^$)_(A zC!m~tW{LHRn7oPDk)d1sU^k4_^D=o(17x;Jbo?5b%#`Gx6@R8>M; zrP@F{i%)6jnmnJ_L%!#HaxtH5?j7cDB}}d6#uA=>GiXmkfSiAm$3NhBeV}AN@k77* zz`OcpMJ+3X`v6^TGP?YzLdFf6T!fWlvO?cHl#h*R-&99k)`(=-Jrfj6C!flDbvEBn z0>!n#@n4RgzlQMe<8|ZP-%8dFutPtSGG>&oOa(`y&<_o@3kMi)#P7BH zTKSirXEWRB%ZsVZsA;^a&BQLzB{+7SJ`>pfo=`pi-54+)umYh!Agm2)4_GM(8*76T z4p^mc_ce^m4E;;f1e}XkTFzq-2ZZ!?z)D~^U=?4Hrfuy1x+TnhPlby5ZED2lF8RSz zAC~f?PCrcV@B^02AGcB{a^Z(xykZ%4Vk(AK8t!|QBWzl2I1=(joS1)j<2Ifi0}YbCB0&0F-zD`*y{P zyd9t3J`?-dc@s*;2d9=E6P#IAo4(yl@swYF4SEHdUPoFa=ZG^W)x$yPn+Slu7{@& zE#m3Cel+{!*9+Da$6F22YG_&;q#pO@HNMP1Q+w2iq9`Qkf4V&*9E1S z__>p1eGYt?6~$X1%`X>3N5=FL>)o%w>by&YutnJ}@Ps7M^r+GbC|uZwpeOup<7?2F zm{C#yyG!4~$JKJF>r?6D%QEF(p38Fh=UAMW-YAvXT7?@@X@6e$)i{ zo17$u^wL>b`1Ac;XDn^9IDogL&RAZ067bbgYi|Kc8{{bsFG2an)&^ccZ~||wmE#kx z6(Ucq{&HdfmNeLJn6EM!RJF6iMHKK0p!U6vfsJH{ISse|@de|C`|pq4qM&^J-yge6 zEGc(bU)jJL7NIoBe5Tn@A9d*~4>r#X&s-#)Nn9i6iV)NI#z>J%w{O06DyZEW^hWUXSn=`ykedIpK1!VdqcDSG9b<<&X7>iH$yyYdFvdU0=FljpeiSKsf=y>*^@qeFPbz@yGF z2Hw#a_yB=#*c1<2Xz)q)WzjOn#{an7u`zAAW_p&$K6YuCoLc7~35LFStaxsR;gF&% z+@q=&zv+;~lSCYtr7;rqOg)r=7$aX#T+^-Q^a+|YNm2<3aLJ&6i!C#;bfYBvv@J!S zEpznQ($NRH9FkYg<0zCH(>My}=|lNG^g;PkV7B!nBCMP4An%7hZ~IsM&}S*HdVWbh zx9)np`zTH~sS$pFleHA#MrW;$KFZ;kcA5QOMjY0lqFoM1rI)ipDV6>x`(_bICK)6a z?oqSn1r5RI5u}oAK+R}Vd0o;x0dv%XQ=q4eIN$eae@0`?G(WjYKs97W?L(Kf!MG<^ z={r6%^l~vjxKb)b()X#U=R=fAb4yVY+MPKLbIq8*7tZu+wLZ8F{0Vtw;iN&H{Mxtw z^w|t)X$yp~NCK%@lKm6|5h;**r$DY~b8J@M^Ln`FC$f~r=ZeY%OL(@ukMd~VBWcLi zOL<=Pu~}Bm%lbK)z%(;Dt+o`k82~+MvWH1GN8-*lxREG3z#n?)X;6%K3~$#teVOfA zHc7vfy&KcaXX1Zp7TUehaqT5NZ$gruMd3+Z=(W+x2;}V>81UzH-YH(+(0QHsYf@Uf znbHEG#Lm?&c3x31V{_gkQS2Q5(a}z?d(`{&x@F;-%^kk06-n7yA($ofn4`-{I`)Zg!d|GWOeXRU3`=^O4*1$7#DeZlw+-#~wdlAB11 zz2SHL15xOfLSI6UKr#3XC%oatQUUJR_xRRK#xl1UUnkQZr6_;@9%pcw%ASniTmIf zdZzrd9$AJctAbi96CjqiFo@p$_$6a&fbk(@;Jzo(S0kLp5?_~1i_f-J zW|@xCyT%l!$pkr{V|aLWyclhrOU=WL!ut;Q%?%WrOlAIa8IJL2P0qx9>=Ej@8!N)W z(d)wDSD|O_EeegyCobaW#1(0^SM1+Mo6HzLxG~iiQ;NMuT}OtL#6>hk6~`T z{SQ<>F4*BGweqx%4TdkTm7Ak&|3?KobdSr#k3L=AJC;^_b5v%B}nq{-{TPG;l;s zY@^GWq6OW;DK%t#g|TomvBeAFU$f3@iM=vCDu+{Fn?8#oVXL?=veY)#S}0m!A9@R4 zz7nEzMi#3V{@WNN_@^(~9CRWmmqOJ9oX!u^g5Hr&TzDb}{r?0md6q}p@Li{7xrd7` zJUkT)nwQEPIG;+;06{Dh&=sk)RF~$I0+xU{_CcB4tQ{hC1?qoYs6mC*g78eoHhK7h zj^R3x!=CoWF@O&mUoF1 zw-4LMsX*Fx4Qp+QiM}R0C||FjOg*t?FVV5RtWw5*ZqqN)fH>QWa3th5Rz|e3HghZq zHH-GA7=dfZAy*tUjJT2QDD_^z^6u*>>md?<%;T8{N}=Q_d3bqfS56 zf&gpOkJ9d>NevFk!Jsy>02@tG zq_p`0WdaV-iXDMZl!B~JTY!My?<3ZnIyv$Wp4fayF8y-$MOly__Q54i+(iUxd28I$%0yn8f*KG4hg5#M{)1dq--+;?vcXZ)ynfntRbHO1ns|b)Cw%GyVX$E+(l{izDZPh8__L$?o8|48 zE4igWy+#7#UAH%CvG0Td?z1v7mK*+@EV zVs2v4C6jU)XSt)9OM%INwTM|XN;4(|ClIVCkk*poJ|ae`CmK6}CL> z4(GT~LN_(zl>nm|qb7v(#6ygk`ZI-9h{>7rq(a)Cs7$RxsCrR*=2oU(;;+t?=|n7o z`1~=-he*u;1m9cUC3Bnf3^WcRwIP9zeN(Ez!U9Ak`vJloesn1UT+3bm@~ilK z9KH_nFd0JN>p%^2vuKwXLS)c+6tRB{lzP;1Pjavl@WUR5DFF)m)vG)4qMEe1{p*kxb4`g10 zS>ADpd7F%@UesLH{!CI=79c&rtU}MDxGk6NhS;uClC=F3@Ryj^yyd!@wl9;3PR+hQ zPFp249iKHn%?!vuN;U78Xup$ZG&yL*=(bhKmP<$584^d32dg-zexGtv8;TeH zznB{Ej8p#7T9Qg3kMGs|<6TP}u^gp^m76k~0$r4RfqxY-Lk0-Cc7_X_&vBLF>6tF7(c?_Sefuw zc2O^&FX}~r)TGk#PQ~XE9PhUX`X&}hDD5Ta6FKNP83$461#Yi)!#XTaIRWUcT|mnmC~TM<-$szj0;=A-SOxG zK+emf>1Vf|pl`hE;ROPD65pV%6oD;Fw<%N*TZ641keF#-CJR#N*!ffWM)?!{Zy&GL z_HoKL?>C~G5D4ovh8oMJGFKxlXjn!o`84l;y==jKdRfm3LxE8!i2eR>w~3@+^iSX5 zRg}|YD6s0D+XRK~_ zCBrY=9+zN?vRZ7&paJbG2k3BzREC1>3riP-N4zA6>F}MXA%9h`=78xd!Xux!gbx|- zuw~oYwhOnAl^XfPw11*HD+cITLp#@`7k$d)-1e6b!q<|Kd>-R?$#$5+GL(K>;_~IP zj_nIJvc{jB_O3$sjyZZ5l#iG!1%$4LcS>P(e&CUXM}511;ZY_y5zZSnX04NUA=C6p zA}|LAd(|lGxYIZg@NKM7+lA-W2IB{eA36WB&Bx6cv?Nd{d;{Kt zVH(k7pUT@=7f73Qq?IzD9i4eu_?IU>MTMlo!*nQUip5&UHN{P3uAq=uTA)(P)Jef9 zC%yPLOT}LNOLNsx2Q|@6D!Qq&8#-ysAH?&Zosq-Dj#Kz3rYxL>LG~O*b;I``i&w8&62;>1h;HF! z7ebgd1==KcUd@b^YAe$g>cTuD$u4m!z;i-eCicu3&@PDIYu~qx|Q)HGKcOA{t%y{0${E z=ORHToe+65;m9+i0s(}(^XE>STFG(2-3#|tQ7LzrY&-97cT zG%@GvLyA8Zk;25l^RFiPWqn6Jd+Da;;G@lw3$!JOn8NLst5AG$3mP4*&c+x2S458~ z$3u%Mp{}wpSF8i(;402uo9V{l+zZ>?{OI3Z76L`<6A(3m8|##_ej@?B=lXv8n?!#! zF83Y(#xzKU2q%(N|dM*xhnmL*d&?V7TCqKR(1ipH0? z;wNhFEBd5yYYmlPO~TaS>VLUjjWS7Q=`Y2Jf#~80U~CX*x@oi<#_a$=48HwC(`41U zP@vul7;{m%F(0;sLx43qK^{#WUSxN<-`^^uIsJpX)KA(icuWQUiZB15p4&VK0^m6@ zyr0wHHHN%uX%dUJ%K7&dc%_9K5u<(Fr$&QnG%7F9Mi=_i{S0?&_gw||H$?YA>~G(V z*xM$N4b=05gs4wblJf@Gri`v!5LAk!iWVqKF z?2_=A<0GAC90SY3?P4GzrnxGanFQ|9zK2~ijvr02%b{Olj6^_?)jF9LsKysBQ zQdvwGIplO=T8foTvEvSMvg39P8(0yGRf=q*B6N^e(dZ8RO_XqX3RG7l~3y+-=*)D zzog$RH99>LuOA~-e}hW!02+1aR>%xTsXYc>n$sv{LIyCMAc|bU*JMvOy?%0%@AbwBy?fo+di`EOuP65D^@I)dYBkjBTED}FUc>Xx zg&}@WWQ6kk5RmFagE^J;ceoOj<#K;>+>8M#tJ=`r;pYk1k}vHO#8+G=K9K>Htl7ac ztd2ANRUm68s!i~0CBr{l2~<&LmStUsqJs~(9ELz`)zP*7=&s@i z!uU*|(d@`&G!44x3kCFoRQsB(n+Ntho+CQ--hJ7D=`;%;=PU__X7VYefjwQ&<>H<5 ziGKsjlmNP_$;pDNT&l{mw{(F$aqA8wFbf#_UmeXj*GC13pKYeWpy(MPuuLn_zi9yt{Wqn}c@@=e~ z6htuTOWBALP1sakM~onUT@?4j?2R$8Y|*b>uIpxo%1Ol+hTy`V}BFLFiDucx5-%o2~T&y){w zt!ZcTRB_5OR}9K3WNcsX1?3xQttk`hIm|k4z^Ohkm7dTbuqAtv!FsOx)4iq<>>jIC zBzQ8vV$E>+N#Y4N=$;2n5OZDY{deuXVDyC|$gth_ab%jcT z_0X=f++0@>d+WQ>dTzo}16gjbJBF8d;wT*gUTjWClRkD&xo*m7>F!qFG%IGS-d9*% zgo|C*!Tr9cT)?&eEC)=sTXV8OymFPW!GPg)%14_=2y?=?;oNnSz1F61pYXf$v*+5+ zC$n{SMQ=eC(`wQ;;h850vu+sKAu5uIeQR1DUB9=49b}00G|@aOV%a z8K;ry9~jotb8J@*8_(Y};fzU4_gV}Z=8XF9irUq)lE z`0oP5#JpL?#vP3M0}=_+UJfeiW-csEWxmPrh#KvwfXxb^Gp*1hUhI#B*(A~NG$Ffd zm+sXhW^k`X@*boMZ}w{w6!Wld$dtC0e1&%<{Xzwu6SJQ!mUaG=P?>@(%G~-VG^{6D z4DMp1n>~yXe2I>iOZEOyr+6@hrAFBMy=>p_^p$04dAUkZ!WCr{(x2`t3ht8y_tIci zCOGKCzHRu-1^h*S!YL@h=re0M|J&HNp zkf{ek9Nt8?p!~q!I^W4TeQ0<(ndKIXnsrpPJk~|1nATdv8+11Lz9b9k z%YMsNPa~kxgDy1yFw1m>%}^|n4^?0~z*|TG{V~vkCPoo@v{6z6ePg@c_*tRiG^eUx zHPD~777kRIAq~{kmK&*o0>2xmZo>94UwfdJ$nnpMAa09cH$M0A-2e{h3*z6sNc~H& z=&3^ehhsL*b8Y7UH4((l>!#S^`CADR>4VR;>@bKe-d#yNkUtCa{2om!>= zdO33gFKjWD8G6yNWS4M4E5fQ*WCfK`G(davj#^(RUzgS!#7ttMll+7AaqzLb77|vx z8V+79^X|K;5^{=BL96eZhg_tAbrdW}dfeX3avv$=B!rW4W0PLJ!QQgBGdSoEFYbza z{(7Rb)t=pKSWI-p^oxWuTCS$SM(`Jti-GHwF^e-?8tO88;DwSgcARYw6bqDp$695b z=#lo!No%5WFZ<<|+a%^qI;VqEXBLV{%&?f5j`SOrI=r%e17vJz7LrW?0_#X|MYz?l z;!o@qOLkW{@yS;}tG9{M7ghrjM;7&O54*zQ{gmzsx9I1o7%03hS=2d3ty~Zq)#0Z$ z#+psYTK8g_uJDni{eTr!c~y?FKO)6eBXLm0&-5%}U=4iaw?X832Xbn^?IU4N@KJ?` z@9D2mBnl3?`LDZ{WI4ACNU@fW?^HCbUck$C?=Dbgh?Je({WN!sn$t9VSNI&xdtdx7 zplV6BgAy#>$)2TaW>cN5>{`uMS>2!YSC_HpaO_;Yym2TC$3Cs5@`X?3uW= zUE#=n8t)2s>Gx^8->081?q_Jo?Ofpnq&=uB6zb-xKiw~Jw^EO#wUM!isz^QFw@q(j z(XFa9tE%~t3k&&yO9;QbyHKY@R?*e&-&mY<*w-``AZ>5fMRtXQ`Wte@m62Kv;(IhZ zyWtWcW;fn{(h2VJH*%BA#JAnY(ko@Kvb3 zB+eTmVZpU&d+(zu>F+TjEIPE(`SWH4?FM zTUrsh;p!e+F_9GS?Z!=4m>e5T=b%mu1 z`!cJjOR_N1GI$@r>O?QTVyEa(zFqoB-mUg`o@P z|7<yV)|TCdRH+U*KeDn3$4_`TWDLaO#v>k=K&I#Y6$OA=S^ zsCF4IK$yVeWAdvsjF0))##IPE0K<$n2%RNIWLBj(6J5{;lF%$O&kO70<=I+MphlQf z3$RVsXgKZqCZfFnJLsSMvk0dTnbG~v+w}F-p>Yi`c}}VbKOOJJ33Zfu@2CIpzWXhi zCvc54;RO>R(rF@6!C!vGUNZRk$SbO+vxkwiyZBau-u-MCnuYB2O@Yber$*3fmihB~{aov*G{ zf9mNu)^=@>#SktGQ`K6ktiuB4uO*5731=TJPYqb6*EnaGmGFWyB2zsXtd1HnRvJcdTlCb}D2H zXV*c{Zx$1@7d>B6xY1_~CS1F!G|_PyFB2VWM9cP7u|)6ycaFYS=^0po5AyVVY)Bud zPG3+!U)wh@bKj`B%ZK_#>WtC}{R-;Vq&UVr)Er|?{jk{=MVz3IJQjO8=feg}c*l&vn*mzQ3Sjcy%scyo)lG(?2k;IX%buZGpeyn+R>v zhMn&!8yUprmxGwa^W||X0C5SInLgsSRzE6%YCC-6&b@TwkpWN znvG=a%KIpVagM46@vUA};*=5ND!K%SPxrK1GfMZIzgfRKydGBK4zI1v!1X)SK`k9| zv`VH4#wQ<(b66S>aD zcuQ`c-Bjo%OyBpCwV4#EEc6TF?;P(J+0~9H4hJG6rkH0fqfaG~p0Iq}Opj*!9`mQk zC`L$hPPf`J0(-7zAnk@huaxKb%jcd2rz`Yt`<`_ELW4cgR-%8yj} z^bGyXQB&!tZF$Z{Vav!(C>@s>Q#N|~s!J*=M>CV4hbr@yZqhF@aXakSyOoS*=}G4T zt1!zlgNe>(#11;#FvEU3j!T?*9}h-w3S+9C$7V}w>>UJWY=_!0Q|^#H950S}8vN6p zS$0e!Wv*ZPSt`QaC18X2%u5E+eW~QHnkG%$UC}+cD~qqDFO=A7 z&-*{GSJ(XiimTF7H?TV(VNTPl#J$ zhixN$GNvxuVp%H0E{IjyGs){o)oPQL?2tyu@?1fuuCXDd;la^+wmg|^snW3Mq0f9_ zL%|}5QH??N(xEx~SA2xj9_)zvD0>9AFu@6_A;0EmI(Y|T0?TTqKZXf*xKT{-QKIuU zy<-|h+91*CqW)tU?nyAgvx%9z@;G7w&Z+a$4eg6CA&uIU zwCab1-tB(5sPV#V4K|2ZUF3Non!K3l=QSR+BYibfyUNg#Yx%w@u4T>d?msl*61D)N z(<*>aOu{5D1i0Tdkq2t3ubPRk-l2$xI0RjEdPEi|hwBFpjtKNCJrClu4$zt4vKR6> zgQz>r39mjxW!aRI}H!KPkH3b_Y$4E3pC+2?YkIF^=JYl&i2*v42k0j=~;KU3M!&Z)W_lCGh{m83F*sR<)v@`y&c~g z#x0N!;#W`2NgoZVSw33krLfN3R}>u|{-mJ0K|~nvY^MB=+Y9COr7WwE@FI`D)swtD zdR(4wGvKlb;@fi$ig0;y?zvcYf<1ThK|S|}AKz)dH(8@974uozcg4!-C$o!m@|I=SC;a2Njn%+e)AvpoVi6gut?>PdE?2 zr>N;}&=7H?#C(Z<2j$mYBh4tUJv!`4h)I;Vjw+;x%CgIqJEU!CUHwS|OY^E7Y28$B zjf>E@(L|Gh-ctgO<*H9xE7TBwx)0qg@WggKIG^HOrq{-4fBDjR3JxB1yTabNs#F{E zsYn1G#9OB#Nfx z0KKf^oeiZvx@m}R8g+yB-ULl@(Nxa*q-N~petVNvwZ^YH!I1wxZO$G6&o?UJWXfyH0_Eq9g zRy4Ib_i=;vH#Zh=4f^Vr7@w0p*9bLb;lbCtkkUqgi|W%__`{m)V|ckdf+b@ajVaQK zaGwcLj(~P*MD(PZPFdf=I!G%!G(7SgH>Icsr+rt&YLuQ}M0K19`Q+4Zr!tCkX&m#c z)RDdoIhrVR6|wM2QWFHFgSL}f)FxnH)EQhkT^~9i@M?I|NHL24NL;%fTI*QTH565ot!3g5~qh@M?*oV+L-+u6(7$1 z7JMYT90^NbezJU0pEXOcmvp5icqA#tVqy&48AU3><7c>(DGVst^6Q1*aa+UY6R5$^ zzx%wn6E}k&eyEU5PKG-j6LAZptWqPq5X;aFZ306O8+c(Kd0jGB@;VuwY1e9~rH3=j z;Z9t7%gfc$F#YHQwN0OOj_-r=Sga7ER4NJY^KmQ;ti*`+_5m9bq3j#Z$CWmTjJKi< z`q9GAVb5sWA2}KpeI6J&JLPu{>eKoOxz+)LOwiIxjuwU2qiXbO{R|A#8vo{1h{S4c zDmbAOSd;Z0&h$mFA~*j z$gm$eN?2%0?Xi}RA{EHtV&w1}des^ooa2Eh%-+=BX4#tw?y}t|$aNzAhH+&t{q}(v zym(Ji5UU<52kCD-=kt!(KcUst zyXAk<;SGDa+7&&23pYOuYI+ zNWsU`+kgt_X26w&hb|D(RJ)yH6m9HMC8`&0;UTH)c{IHInifqUk^$PpAdVaBvl8=I zf#%;t3s_C@fci&*f>cetC=4Tb3rj=M=}oizaGBNKonRo3)jG(NmVku3>DN0a9&)kW9tfXf_;?}&-2Kq$DzcB@(uu|(x zmHdI9BbK&*Gyn`92b`VXvG?Y4!#ON51DWAB7 zFm+0q(DX%2Wkv(GU;iw^{)vZj(~e_9{~md8`Fz;o8n6Vm<6F>%vLx-Q?_~|3;UGA1 zz&#Egh~(jch7nU0@LjZ_BLeK9xB+Ilu1_tSG`c$9y;3^8vR5;#!VPVJq`~~o>iFzc zBpx$n@YZ7FLA=&SOjq(iUlF>4ENQ-Z*=lDlkhe4Jz-p;H31LuPzipwNlCcgyc-@5r z$^4#`ObKVl4B(AA<;vPL z&5RT*=<5dY-AbGyaDeeV)aZb+EX*9LnqK`^(AZEGebIzOd(KJh%TZT0v>=bP$FOGcD&c-nppws!3Rc{^)xLJheC z<|ft*NOay}bqBYt-ZL?4zC_F@kx3;PJ35zd9@g2J5j*6@x45PrZzZQW7S*(}4!eKd z*%j_}yPJz&Egi&alYoq!A@Hy)O{5lLm=Fl=gv5#l%1_`A< z{T@&^fbtX1DP%ee$fmyPJ~mW|WX7_0x%&H9IiJA>!fv2bY3%a#xu!j9JAU?Mjcpd* z>G&9qahWFAzwJkESxxwDTL&9kvd6v<_b``Ec>CQO&GEnlwa)f^1AFR_DCvCuE*6pQm#b3^xVxz zx=VzN4wp7ykjr?1JOfrFSI*f+T4TTXsYhtw(+o6O7T)vQm)2!BS1jPVp2$VNZr7zcQ_A1L1 zMJcO!_($2PJQ}eS4t&HJ5)Jqky*RR{>{WX7g>pefYvph27a8ELvQsV*@^cmre6xMNB7Vd*%nNF!T zL1l~(lrLH(<)x5V7}mq^U6vA?EcGNF0Y6Z6)13>&Nx+16S#99R zKB4RrXABH;he(E3f1|)p>Js4a;}EWy`0<-K(=}aBgZR8h)hxQu8AxnQ5*5bq>MAnj zyHl3DB&M=ul%+EZC_&vDMksj|Sz4!PyTYH~A1P_GTpi>TlkhA;-)|nAPfp%zav#J; z7!Z1WUBPSn`YNM(Ht9$8;E?r>>XMD!sIG9Mdh!uJDw{Y?;fbF{0YV!sUOPgAZBs#I zXp4vRr>g#j^v7HK8xq2rYe=xaw3EQ|L%Y)tt;QhH>xTpiON5iPy@8t{m1M~^#8jEW@O=hesTy;x7!zdVk zSNLK-CBo_Z5sG~ANm06>cRbzc@=uM5Ng5QBG>D^{P!`VI%lv**Wg?8phJJwzV1)S= z87Brko4ERK_S;(l)-vHNdzpZ9?a3`PGI>+_n2*nZP9Vn5BU$v1L6vanBde^ag5bxX>{zVrx zF?m**iJwgwX7s8ob;*1&lX&!Y6jz-?nH!~FqRwb%8_@YtM(Xk3I|vBc<@7;-qR%hi zQJ-SKH|-s;WiOVKkQohD^=-oJ!Tby_yv8zZ(B1hzev$dEHnHG@g+47v6sq+nnVfBR z+~-lwQ>iljN$WVmxQ}q;ONGzx4Y!_NoZRZ2-N6g_l^we{w&!H8>#~s64g@;*njHiNV@vYcstGi{TJ%bXzbj(sY%1dF`iKToz zhm2{RKdhvcLE3<7+>xw};sc}2$Y&D4K~|ZM-6CatUXW8_Ev#{bad8S! zEkke)EX$0VT>_``9h!G-K+R(A1BuhitARnRrs-9AS(0w5xX-NFX_etSw?yt8WNgsf zn&??C&7X;<)b3L4WRC0sZy$BI2u=oS&IC&ZQ%PCbDn%uuEo>ziQ3TmTJF%pG`x37Jbs$R)dsZE@}Q%G6D-K6;KyW-((dmuCG`#xJRF8cn~ z5ehKZ|NSlVGcu_fi;rembm_M(1@Vnf@Y+JYk2~4ns+*)NaseAI^cL*+tq?MT_`kJ5 z3-)q&`O7h@ttf7ZpFM!fL`H^Cr4hr^eqCx4d4pliQ~1Ai^PZgKi_h#7#m&QKt7&-M z$;F)EZTemKO)kS<5ZlC`)a3j$JKo{&@wvdInblQvNYgSZJ-6B~ci)wR7^*yKpLB2b z-rg|!3Rk6at+Z^bp~Fvp6gGgS>=C9wy|4+DnK}f)6p-v4`aO^tVc!4dw+k3MsaV0G ze-d>jrfl2iV6(UEw+u!-qi+rKt+UP(Bqk5ji~cSX>M#SS7gOZnEuoUZH{83u^U7xHClu|Uf@YRRSOYRkM|p3tvFGGnxBD~&jvj>0XG(?E_3y!#k+6xhk{1t6Db0g2rR{Y6HzUgOsR!Zr4*$ZMT zG9nUc;B$X`tMP406_dhr9lC4UU^%th3=jX#+A#G+ZOyAt28y!+;GVU04Bft-OA^Ya zBv4+96;93;R!d)G~=xKrOXW`1(1mYIBhkw$yaVFHgkikPA<|8kK`)|Y>>WY z3rU4OJg2YBKL8GNP^8+kmT3*T%ylh))^bSZpu`%{=0QEdWn`U;b=x!3d4=-apEjq> zPYYFM&qvyviq^|zwihV(a-v=aLw~TNtQihh6v&#Yqzn8Z<;M66U%X0Euk0!uV+>^~ zy)t{6+Q?i8oToPCJK7|-d=Z|gkfx%d6eUAq-=Cq4MZ>Jxq_yl|1Jd|81fG|NZWx{; z4IXqj@&77tLJujD0EU>Qe1I=~xnV8iFIPELZ2AoGSfV(l*Fai~izB!53j699jrKgk z(f)OM=MOk*Up*+%xi@r6%-gPQEqS}7-A@|Ow)VJ0=hp7Wz_zu=CptHFKQ?MxdjiRR z;WJI=+xu7>RgiPRjogf(l=J9qIB2|7@VKBBXWV3Uf93|EO0K+n!0v{4D!o!DsLY;Y zl2(5G4niR!`4uGHDE$(ryFB)}u;=G2ghK1HyJZOZ73&W)!QMu(7kjQZKB4#0@GLt! zNEmw6aUal!$N2+=d=0r%*`q|=_SGA;?C3DoGK3ATVC%$|I5%MGgha>Rh2Zwpv6jh+ zd7HMau4}1J%sXm8+v?FRW4R#+Fa!uGB_2 z8FC9d=(fS0ZltGLa<@jXv$TU)fU}X-jc0ksc$Rn6vbjs0;bm4+=K!b}L z%Kjz$$QFH%VmAs(6oyLFtILI{xMz;;CfCkc2!^&=*G|{D!Gza!e|;oQHO8~B#$!^b zousEi;so97@oa=ZA@i${xK~-fNR&QH38z)zIi^)|NOWq@A@O(L$Rp7qS4eE^`U)gI z^|3>uowJQxL`V$sYj(rWZ&L$#rtaJey_$)2Q8gz@!L_0q(ZhklKQ8HXqaqGu6$sFu zoXP6wp2Vanhv^HYGl;>^&aR#$cnBV9PcATXAnEy+cuIEuad`Wsmd*%9t=&TSI?P2V zLXc-icsv>I`(Z)URV^Gg$nYX|NI>@6rt}aVhL-Q+M)mO^0}N}TKCb_&KA!x?SM_nL zGW|h$`H&4;py`);p3B4!{z#bh%<7HM(iVKF%OfKMf}hRSqMw}}5^~<$RF0ji)Pv(R z%N^%KibhyhD!3Tq8+iYh!4%PPrSKQLIh za_#p#9PYLq)@~S{Nbh{AK3~^sy$f6lCq+i98T-=aL`@(EvAwntrNvZ=D@`qPhv?!v zhKE0zS1af#O$cAg?rd(|2L#YmmO9O?gu!8{0|awD>+Oa-T)`?C@6Zek&(h3;K+8_X zD2FF*%Yd}MJ8!RT{pI?{;|$?a8;?^dZak-M{T1Um?~(skU#R2CmOy)Si2#OUJRgD78siVF*9@kX<%9IVC~RKHQiyh(Zwi2UN30*K(l9E*(hZayv5q9uteHx*#1?1$2W zUo~6{w7oFq8xLaZ26&mh;|n(`hNS#I83iY>=Y3!TI~Liy_W&obU(rtxKXx<8a{t|d z7Mf|aW+cKN`+X}_J@qLL+V0m->9u~?1b>!>Qnk(GoKu6O&}lF`;YC$~1`x-k4h zIUpYk$#bE%-Sm>zht>x_^EvIS2Q(*Gu2BQa=9GfI3eJ+dfj#f~F>c>$jDOmv5KvYz zF@O2rUvG@51Nv0`;m`UXBQZ$N!tgKKFvdNL#@K6oUrnDgnv3Z(xG(G<%=>zZ{;a#0-34e`vFC{)m(p%+% z@C5bn%U{R{)mMOL?TJ9t=P*y5LHFi4NVjU+sqV?T0C@_a5J>CAn^f0Jc<5FT_8nASFL?{b4Zpz!v$ttI-t-Sb zYhljt6}krgidXa?zx5}7w%hL9{gQ(FWd--kqkH^~mE6m(Q5$HpTkq0RP}0cX|J<>$ zDbV^%{Gj)60E4bJiYdbR2Xv69y~?V)rDcJSDOLT*vm#tYJ`?Cp%0$gj4aX|Ba?sMF zI_yHRY1&?vr#1&?BbPPrtr3-AC-o;N-E`SZAI5tOOkXI(IOp7yU#2{v1~NlSba4Tp z0?}XW>gH9GtP+C$@sU<4wkMaK>muh%qY{ig?F9jKY{=gVrBx7#rgm&gc<5Pf|1xso zqk9O;F~Bqbjlxb`{h{R)P>-6>hQS)d1W1OTy>4H-QKDn18VuqkCCdGRzV}!_EI9!C zKI+DTZAYO@e9k*&!CEQ)+lQq75IotZ%mjv{^%+{!a3zIoeTL=Q>TEGX4v#^6mG@8` zIy=^bPM=N)w_7J*92`9lm?*I_!}^xlTWfoO-0N(UTn3wRQa-a`@f&%G0X$nD&PG>} z+6_4tU*|3Mzy7t}AwTqXZpaTmSTtl5fYK9Mk}``zen|@HMYn#VV92qrJ!Fk(_kuCy zhJ3j7t=FXmuicPYjvveJWB!uyfVS6?Hg?H>IXAh*L-D8nDpr#65eFG7K|tdQc*HU- zWb?w?cW^6+YV@qy<8BPg%I^6)*kC!prOFSb&0~W4ZdqmeC=#w$QGm(R3d!kcD>MdZ z#w6WlV((mp2R`O>s8fWAc_&D_>r3wGu`u${RXRlUP~}~MXjL2<|66SZV(lbZgUflI zO2Eja^>W-+Dmi|(w;a#(a=bpqi~OHV`M1?TW@xo8c{zS*SdkpZF0fMZ?{SeFM{cl- zp?lghvDUZ12xzQlhO=6@8!sV^DT%xdv;5Ig%^AqOK0 zm`&nd;)?P=7k$$W?Nt(f$k73|bj228u9Y9p)^023XXgNHE+ti(S6k%TwG^4~6ZnE4 zt1LYHQipN$nxC%?;%ibaAr;PFS)eky)FAuSOSB}j{BT`tef+c)h|6StLjDaZ zxOlW-imPEMQ+}c=hQb|?9cO8nNKm$4!}`b(_9${9N_ixWs6JVRnT|B&%GG)fpJm-9 z=GcB~ymlK>25_(o&5Fg>c zb16uA<{E30jS!H*qT_hgMjE@poN{_gbY+r4f}}}` z{Bora_xBSN5kLW0P~-G@-N!?zjjJ>B3Ez*114uKSH$n%>!{){k5Jvi{lcK5<`c#!U z6>OEoRc)l|b*HH6kUmwbd{xT^a{lpZ!H2+ubvIJ+{~LZP!_>6_TjQ&xe2=T_w-n{f z;U#8eY`o=rUM$8I2VnIpw7ek|%<@B(>E&r9w%XjvD&2(b*|*Jksu5xc-Y{DavbtBO zuA>t-AGE9h-Di!6=7U@bt$s2-$Wvtcfq9C|7Nn$^*pq=Kb3YQDyU1bSfxYECo|ZCg z4e92!HsMS(hagscvA1dQ;e=`DU zJeu!(u9;$JOHSlu0prlJRI>)Glv5|PKUY^o=j!+E0Vo?^ijU6*r8{}xwouEq=7-jo z19tth{E3JIfTJW_ahu3tA+-{38t&!3l?cFmi>5}f^oB**#+^%g`wmI*eyJ5ejC7Uh z7s!}?E_Ph7-s{g?gy_C^IoT3x2REXhcC;L|%)H%*Fl>SfQa6K>GpGJYyI0u8@lPqM z9Ig8zWWafaB4Nv^{&K5Bh*6BZk($x$?*_*;>d%a*Wsr8Sq()US)Rs+HebfSo5AvfV zdv2t{y$;#LmfTC>NE~g^{Dr&tCHG>7le2r!EoN+I>;0>-VV3tRu(iSWAgNVUYG-HL z)g8cVKuh4Rv3(hMM0yQFI!0W2DQ7D>j~^y%-raV{b?Pu+3F~~yia^Kno6WV7-2vJE zkF+y^kE%NRe?Ug#5+^Rv)HXWWsKKQLkrotmqKFfW8kDwitEpN=i;9|1w5Y*Mkm+zS zRhSuOe3S|NfqH?kq{@>;HZ8QSP04&+?pS zKhJs2x#QIk4DXd_Y|D>}C$xrui}&)5U(Y?@@h(<(fU7-%>y~aqB3M03xC~-D9U(Ui z5jy0ZBFnxQ=$F&KLEB|eH$Y9)fbPu!2IH0dFjZG=H+bDHsTKwvhlNL6(e{j1rO+c- z4ZrA2ROfVLeBXZ~++oEZ_&I60TOP_d6A~f4c}* z=CU%ecgTqL13mGayrFpKbvzcyg;AVWV%XK(fwg49TE&sxpa=X(lsCFtyDw9V{OP&1 zuKS>3(EAf;DVlyn`-370PNgvNNogqD21y3z1$|%nY8dIG3(G`O?X;mTOe%E^94Lk; zsB0QVf+f{a7Cyev33bBR1z=hw;P?}KYuv5fuPeHjI@O;#Q+ai!vSP{&hMEBY?mg23 zd_!R!$OF92w_$2Jh~0l|L|A_mic$9WelcV-lzl^MTH=O0S+GChCerlGY;iKTTuX^>cg))z3Bp?itLLmp$bMW{A^o=4Oo>= zWifoY6K#n_kqAz5zR0&|Q-0hbOCyftgC-z(?7(GCFBGB^;T_hbtQ2Kh1PubMP!3;r zu9xj={hGdPy_cQ*IDx(XpK#{J`<%J4L|9oM_y(=aJ;sV`c;)FX=ifcf-EXV3Q39@? zWH{#2h{AO>UL|WV^h~EcUEwyLy+XW{V~+d8OKm-Ij=C#}S+gK93a$Zulv3c9NkJ9( z0?D7ZdkZXuWe>qMv6^x;L zVT8$&nB4_ZO!tYktu1MYaM)s}%@TTNYTLN5#bQ8>2IfTgtfsteZ`3tkQX8sg8NQ@e zZ;F->X!IpDeK$_6G#7+tVw057RO;7tD=G~KKebLdalc*V!a1g=(A4qH=S(432w@Og zxnozWL@=>j?{4<*n%U2dEcv97Y*Q+}=!8n5T%9w88UV}L4l0BJJE>(AUTnqFp|1Hj@rd0N1#P;Gkksvkn!&Go0Ypn{xvrT@g39pV&3adJ$2iiyI&dI_fyw>#~BfTNlmWPyemx!qVQO_FceSerDb)( z<9a#OxG%gW|8f`A#6JJSPt!D_vPuVgrEbDAAB)mp7+g|KCM3$Eq()#LRQ>P(kgS)!jdx?sZ|65Id0zazdVRjKH}A5E~4GbTvcXr45rZC}e9 zO||Xe@y>1xywP#-^f;>0%ns6VyTXSlrJ=Bf*U+5Ghzp{fU7$%n7Qk`N zR`BC?|D!rw|4@mnKDR{#ZE2UTBsTYe(-#gSOSe|5_zFed~9q2NR+@L}MDbVXgHG=}LWe0+^l z8YzuzvN}wvwqe*l93ZWf+g$?8yg)xvS+4tu;!&(tnOu!Y%$JMvnXnV;@s;HX_tDSEG8hZo;?f1rV+E zEDm!YzS7%sbw7W@{G<0&tABn{B)$uH?PO57IQc}P0(U@2{6NH!Z^S<60vgT_HS-wn zcEXp^KtN|WSKR>?%R=34dmDgyj^^Iw0q1DC+K7Hx`1B(^y*(NKe%>2mLeQXmlH!1pIVmIBQ+Cu4?5;V=(^XD2ckEV_kXUpe3n}_2RPrfiL(X3+8NBIMx8?$zqr@vn-| z)A_n7i#eVQ*R~6$?9XQF0-{>nepOVRS0{WGEYNW+sjSU{dwMEcXjUyQ zH;1bf!ejeGc=#8Eu!Z)*iT^+o&2Vm3-b!d_<=_Yr#Lp(i5cOV6> zy3u$r`-d(AAsGNea z3G@&BkJ9l{%afN5!Vjn;xML%8nWCu-CjAEo39FDzzmU3^omHvdNOPs~H+gu)QfJ*= z7%8TK9(fwZ``)loaQ$$gc!=@y`No0$V8W!eo-8Fyn$yfp`(M7)!8y_~7rM>p)Z z4Mz6fNuYquE}dH$`$EZhTA6_}H$Ab-oI~1ldTi^ZfcNpP3CgW$J4*vew(d!cC}oPT ziNbc%Y&Y<#A9<7#?=4{HHe{okv^f32O1p1Go%|NAS5>pAAlByl^W4-I&t{zpY8`wx_)_HijwY@; zmp~5G9Imp<0@6tU#}nE!ygw(470oFb8dxEy7{8MwI+`0P7#qHOjfY&;*)=mUrF5!) z;c>a8nwyM0>y4V>ZgFHbz!R@-?4>)e?k-IEQ zhN*A2XR(Qv79k;3PMT@jzx~RYKM-&3h-YW@)U8Ss0&8iHOvPaTeRWav9t9yg2@=;> zY5xUZ#wq#|=2h>y?FxVWEqA7nG0V(l;vLhc;kG9Vu`n=;gf<-%itIRE2_pnfLb5p? z9FvYY9vl-ii??jYDKaVzJPPX=g<%H=#53A=V7EL{VpSl33Zr% zywlR?nf*GZCAVTlveH&|gPNPRI)?J_G)}gFkOeFctA05!;eyx?UKd10H}n5Qw4-M^ zq80EnOyc73vsOs3Tjpd?z%glVikv7$R!rHh@Rbt>K#xgW1iZovA3y7$o0_MbADf*@ zPA-^MW4BNT*@-QwnVU4!_|4t94d!OSp>TD%a1lOqfav9fA;*c)^6M_GQj`SKvw&|I ziR_gc?_|+lM)mPszk)L7E16%DR0S0ithlkaNj^%Nh<>$D$#-n--=DUq7@pbSj%)q9 zUO?peT=l2>1$L(jvBuC5T(2X*geDc?^?NZ=IwgirMxrKX-_gvewytpK3H@o-749^^(^N(Z z017garT6T?NI-5llr6&?Uko0^CHm_MpTlWaHo@)uB4Bbim!)C*8<>tKv`ektvunz40sqraffh39BkdeO10a%tE_Q#}tCXsx?G_!=o0>~}tV zleKoMJP>-|7oZhZ*`B^LlF6rzax(dvxJD&0eZv$F?&JaYgqT|^yTa7*V#X=RKnLf! zFXx+3xD(l`b6?idR?W$F8F{8%E=B6DL|~K|PfEI63!74i8oe(J08Q*rgGQ*m=k1p` z9Pg#$iaUdQcY1U`NT#3^T5Hsv0u?X#nJ8b(N2~b$@lBoxo-lBrDW2U>sqt;Q!mCOe z4o9qmPQT0hVG)-5;P*6#-)7N_Xq5f|Pc3lc4r#E!Xir8w2oGgX7-roGNX_-pYtYti z&^NuSRV|@mm`bs-rdJR<+eKq@Di%i8O9xYyxiZ-)X>vO>+#6n&!zP*1+6t|hsHW6o zW%#q7yMZTc;66z@o>pRuShYpl zz=osFaBSFT-l+O?$@sz>gch~kb04&3H1d+Ym(jYFdvl|^WZdN{)oxi%)`fL(8x5GT z3h#UsI?T$`p%4BoiZbx`X~QMTiKSITND+U(e|yB=|2)F+_v3~NN_zfI%b8!E94w`(~u@Td^)w-LhASs*IPj^bmziDF!9*tC- zw^m|Ob)sGD;BL4jNoGugp2!+tjF1x3L9oiIuJDCpoD2*@;6|~=y`s}2BP@7ol%}lOb=|&lIoiIZ3FViVQVs9^vqWn{{GMxNGvo6f zO|Nzl^n}>}=5%{N+?mebleh%29Ww=$v4>;h-=F0R-ttZ46HSK^6oOXoJHGTFD2pMG{3cE+_ z(B3Wz3tgLayU^_|;BE5K@Rc!AmZsv>!eP;n9Mhocm_JJ3v!`l`gNB!%+pf0x!K<6S z4{dSRD9sH0Ak6`E=ocSGN{I8(h4uv*^xnTn>NZr;H%L<{%#a^y7Dtkaz6@!m}z)KpSGoF8e5%R7TY!}aXSFAsC{YG_^S?IRo1kp8i*{f2rpmMmG9dFwzMH!`}#?v}o3MH`P zS}6gNSu7V$JFv9{?(MZCnXsb;g6w(w7&;th22qQ$x>L=Y1uYzG3&PBHP~+0uqM5{NT{e>d48xI-ceaqH z)s&#>=@*1RCT`>H*&G|6RtZTOVvbl@RyG5rv^l^kJ~&r^VdwtjvlGk3C8KbvM?ERl zVQK?A^~nl3_BSqwY%G+JD^RCWNd^l|XVj+pQ)-XF5splRHUC01n}l2&6`eL0s3X4x z(nvTX(n#IeJu)>)Ut@Ei!emBzFVXaP4!*#lO5)DEll8bBXq32!_aZO&;h~o=tvZy zqc;+lpyI_BC7)0?sJP}iI0zgVujltj`b}9g(Wxr0~M#I#+H>M)tv|Ebx?7RKvL4~p~lHt=G3b0 z-uBB<;9|!y15^rJ%$||g)<*sazWV5;Gj`Mzz8(As_GVyjS&E*yaw}#3AOuLtIgg2< znc~4~eyr(VJ4Q}8rgx~*%Av6|49bkL=EAi;z3GNOITo?XNg;Yv%BMGB43*wA>9&(>;?Fay>&ceBSQx#?HNaS5&C?)dqZ3WTOCSApm&B>x`ezFsufAT?X@{O=%j1hC z4pjvHd11tMPBhe^+~9AWJmB0$bNtL_^sXej;)^(pH8(y1c1Evl-77D~@Y8JdgsJYb z9t%sJV9jJWTXUwWWk;T+i}|Wr=?p)6bB(QCBnX-^lVcXX{KzliT6ljI(Zx&EF6Yt* zX-f@3c-~v>);@@?D+Yx%%55tF)mVk@y=ga*P5g||Imw-4Nf3r*E zQJtbByzqi~{(0_xiEB1i^Q1;mvAZsqy>=?=PeXSo@F8+Eo149d$2g0%x$l^*1Jbzbf_r(naU5-x&kQ&78lEVNgn&#tw2JoaM=v5Z*zu#e$XW%!I|& z{YousTGp>3!}%tTZ7XVGvJ|m3fmQNNU;v7mxY;$Kc~QQJ8!w8Q2)0YI?q3zZ`UYh` z1(T9JsgGYI&`1vdr{wT|NDlv6<3XI0Q$8bEqBef@SyuGaQ`V+Feu+;bP_&n#A5--6 z)Z%l_c7K)!(~wz}`uLv>8NMG%ktLf3r-p9I2djfIKS@3PPQ%bo8o|~oVQukKAD{Tf zZ8t4TsB)?yv)U?u>ML*ME3dSo+rIFtsbjZ!;a3frXB$55X&m$-&2Om^c?cRZ&!s+o zSG^va`A5T&&kk=K`fe)NnNI)SF!cFG5}UfMr3hl0i9pP^k;=T_+i1vqW^mAhYojsq z&xWDTHD(q%Up(0P5o`FF#^?)fg+?F@DyGnq!WKW3M@8Kj!j7;;g(L-Jq!7 ztjW9}ju#&^ds6Lq9u1Dq`j$Ovj1QjOSbLPB2D8Sv+UIxgS4P&(kZ+Eo{eoHI9BQe$51KXlT0J zHN`PC)O7%?;NEnhdksHSLl5g`4;fKEd(wzO^|KpC3_iPl#kdh$9FS-Tju=)yd)$av zLr`xwTh=chH)5;AQ9LU@YW9o~Ti4G%b;LG$xGjZoT2*?xhG4wiR5S!f*$rvkelFJ0 zZ4ctAQVGNQBMbav{3AcL_YZbdxt$KtW22jYY#Z#l0GoKbwO6HbyI47+l7Gx+DZNYX zA5?2#UrHQ(>?9!|X;^u%Hl-^ig%Dw>$$l?%lNA4HfyUs#FF&Fjn*&HuTWAPv#IwaM zB;?nK8A3J9s7-{kZYs{TX~YgOue!8GtK~;2pgUfl^2-y=lC;J(qW>hx`tpM#%CBvG zQynd~=T7Lv2=G7=9goh9z#fF}?`PBacirX0{q0wyyHq`f)fmRkx`Mq3(7rN4mcRLM zoI%fA-(|R1=spx3_$wN_o9FtI_O^^Fe_#Ck?x>8&WbF_GxaEnwJ&kvMiB7_8+oe8z z5m`sVG~kDugYg+JB}C90PrprWkKHWirXkavT72)k=l2P>{n`!w}$l!-?WYe9jcL5X=}cXy&73-}wHr#>`5b`*9)@N*^~y z6OGZ<%cF%}>S^ucTtntb+l{qk({A$Ug6-(#xqL6r(#uz(Ue;EqmvJKp1wVGZus;IR zl$51vYA{#ngj9n?31`%nkCVfqtSs2YEhZGY zle1OhZ@qtdmHiQmZoPbia5uU~WVWnt-^gj^G52fyAby?@ z@BAl+F~k>58=P$aydmECqK;IitUUr}gng z!>GJpGCprP+af@*D_Y%{Ju-o&FOR49jseH)z))!LXp>-?b%E_Q(}e zxT*dKA<;ikEXh12w9YWmO>1A^Q2{u(6P~kN>8YuVpEieQ+_TB01u4yEI4MmeV!Ju3 zO%Ds(jZ2@lvkO# zPCw;Fn;_a3=Ps&CW$u;r$d3GjRe9iURe`7XbXD{-TXlopWiKM;@xUs*M{J+pLQUSQ zpQ-GLN#p_@v|4-SPC#DAKC7=7jD8{B`Af>R4Ou>36C+EvYsGQmob1jkc)^o#_+ZJ= zn`}uZp59lj236nQOXw+@(B|E1-Biur4lj8#?yka{!)W=K2Tby-6&e5vOR#jQa zld6Szcm8;NbvD*}gSFnI`iJ@YhKWo)vHp6C0A^!rt<<%W1{M53-P6$mT{E_1CTH*P z+4cMBdf4px{iQ-BAo@LqneLF~^?VYQI(n#(;w)>jiQq=O(+(2PaK38(J?OfBiNuiE zctqeaMeejB(o}kNR`IKgi)yzU zT2-XpibQ79u}RLpzveq~jG&^s6t`x9Ea47VoXJ#?4}Vt#?yZV-*?Pzcd@QUUHv#R5 z%Yrs&)j}Pi4t*s+E7y^#h@{>riri0$S4;ASug;~l2DU<(2W7bvbe|dH)$x_q=Vn^i zGGA1PpY)%KKA@HR%)zv(qC-oHdU(FCB4pcr&1rTyxZ;6zTy=B_ul~NKpxN!U(c#p~ zoEG>Zntkd41F%k?qkY34-B~a}J4Sjnz6k4_`>EFcg4plu=wBDS5R4mu&(_0(*kMI5 zh63AQTzu&lhw(}L@&48)R&#{I%SJUypJfQ5@AL5&3V5;C*5^3iC#FG0f+_`z7x`_@ zZ|@452kvv>G}mW2eW`&;uKENbDEM|!pZ41NTs8fRkMm7tA$`Z$wlfaUFgZZ=@mspb zWme=q=X?dWRrP!*?y=22WTB6FM0S=5mDvJRN?EuI=?kJ!LiVvmQazi;@&NJvJcr## zTf;xfUFR+rx=W|Ke8XLS=q^*;UGcpXOgy&S(jpl z@>m=Gku*3y=B6#$4t3wSZX4lT?-SZkwDxW5wmmsmex*>F?dsMAuUYOm-+jyvYEOqmfewFru0VTxZFETe@Qc&o)S><9kXJl1KRP*^)siH^$i$y47`dk| zB@ETqh1zPMMvH26g>Tgj)UBI&h^*!2)?ays3x`71yr(0@C^aI{stm_oE95DurQp^u zeL;~MCJsBx<$goE%2f*eeCI74LIZg*>ZB_C|qnLFl+N9o8uQgmbd#DWJueZRL?bIxAo zoT_j&zf+l2+TW$Fj-v4D;k~&_^f-HIU2X@viKP}9{zvOlgw4W4EE4Fe_wA3}@Ss02 z#jn}$pVvQrVqCaBq4l_Gt;d1bajbu2Q%P2@lEQo?{N1|i@?n*&q z+LP@ji2doea*{PgQdugLhi6}0qA_^ZqTVMLG#$`0;Y0RsAIbL>YOmU35j&1rt*rIc5#jw>fwAU?0p>X1JU>AlNIqUV4bFboM z*~hMy%iW6Ds)tG%Fl@CUYivc_FJCJOXXP5Le52O?r93p?+iufT@{?u6@XUiD$oBs&;9G72Y(PJl9kcyLIxX( z5(4ItE^8qJ8klblMMpv?9RpIgsOj7No4a)dXOs12s@^R2Z@T>(oKlBvq5^OWO?b{{ z*=pk!mmjFpEKn|~D8PU~ywtXDs$)rIs<*qe@Qi27aZtld&$)2c{>Yu*I+nqXt(i}Af_K}B=JS1#*Y$=FQ7f$BmCQ3qjjd*4D8d%KqRaV_sVK+7H0vXDeWO}4!( z{CbsQwnA?akcYUY4s}h98K9|A{ebklvh0rLS@bD^twztuD|E`@2`T}#cQ}Gg`M(>OE9_FUSeHJPY6a#$nZks-{Q(KPjk`YU-vJ?hDGn2{yE#f15p%~V zEv&7RBq3sUg&g`K88$;lv~;#n)bgHPC~|=zm^BO1P{_W1@`u8A6pBc(bPf_`PpbWa z#ljkJ81;e0{b(b;Xj^^euX9(sKZef%9u@E0!u`c$axgSSXqzO1iJ3 z@%h=#kLua<98W(&F&#BvB8lJ74Mh5r4`C{rd-mtAerFI17jA8J+-$$*N;R3QMv&31 zVgyl=rZgU`oy@g=sPS0xYNa>uFop#rqo;i7H1fYl@JHFvZ7VC;V52UGPydo7PsupOI4E6(u?fSRXE z!h)N9MkK(6%ZRTEp{6GSr7rofK+t57q4~7_fI7*YrZESx>$cYr9cGR5Oiu(=hi@Zm zDB;z3ZKHSf#Qb;*UeftY`}1B>6qK=}1m@K)pr4fcOqycH;jZ1z2beBWUoS~G-{gw8 zIkTxrwdX21+;JfMOwOKBdjZqZUshb9g-!+O|V6eM!4&_p|Dv>q*Vpf6a^L>B9SbhCo|W#m2M2 z3Lg)+Ir`8&E7)houWqEo@YOm)ZoXDcW_~gZ28(wduOHcwcf2kgKlUbFhz3j@zPcb7 z4>~>_{lVquH)fA6Z_LIU5mZMJ$Wuo$TN2;_K=C_giA8L%UTZmG1M$Qf`vJ2GgJT43 zRtKs{!KE*><(^0)A{)yg%_@edr?~1*_f19j%|-Vu(S1;J=PjBI5Y|N8H>#RsKm69& zUg^pEz&_7$%iky>H5su3+oC2r`yW)iaf8}H8}8Pxs(O|VQ?L1|ijPDyin0Uur$98L z_?Dmuq8_731zL(BAv3xO_r6$VV)wr-q@rYaQ4XV7^TpKdU8Pkh@4A|5#4u(LMX<55 zJF`d?U-V7Z=PB;f#Ls4$>Qz+Tq%- zv(>-3&6KiDE7CoO@*}?JB;)(7?B45}*+NNBlXz6)fCw6gL|cZuWE}Xs1*ZX7q8Bnh z=6;>}f8u|Rj&J=k%H#Vp)zBPw-Z2c&&O3moJtPq7}b&f^({+s%QUHcEccL25sBCF{q3zJz>4!bTb;J!*&>5wdiR_O{q*h?-->ju z*iqPpJzuy|)WDlD)h{}P2QXcgm@5I%VoMrU?lkM(u~fvame8vCZqLGgL%^Lpg*f9& z@mrQ=Ud-Kyw>|u&p8p2;U%yerNKPOIVkGB}II+l$GiTi&Io0twiuVTaWQsSvvwvsm zZ|3Ju0&F~eFt5>4ojEaYmhaivlJ%qfGXF>l>;ishnCI)qcdVS!K07`|f&Gm}(%q2+ zEl=*i?uoI_-6X&tbeSbEZWndr48_yeYMr6u)2&)#xmmh}@owjZylL;JRL!@_5s6eS z9I`?YVZ(D9N57S#R`WiMC^u3K2C+K_$tUq@L@tRcl!%|%h+?eeoA|(XCH8}9?APwn zfV3ndvtKTlrY_IJ)Vg;B6XT~lM+&#h=3)C84SN(u?*$;%C#mxkLJJc5ctU4=VdU=rtBA2t)24_8>Z(Fs~Ly9(Skc8`*QCZ`ZN{ zeYX+mF34$1p0c{|Ix*n6ajYPL&+}}XUBr{+>@1$S}Q24A3PYPzK6+QnJ+=4j|Fzch2WaITARf1 zw|=;nM80+F;aVlRLyI2Sk!PD~9s3<2oPYtOY2^kSO-(vpqyD2-`u;J0I%Id*Dx-oK5f&r%23OUuV)kFKnr zx$&Zpw%IM-nNrM66Viiqli7r$|N6gc%Nj<167Ss69=#@Kb`4{8=iXCu&o#f;Ki*lT z=2Wv*H>01AcgDGicYY>VvvHP&h7Mm%MBu#iV{I*LbB*Pm*E$gDDg4F#+yt=?{v@<| zb>+N;e(EZSoqVZEr3Y{Y9MW@Fs#!ZgLz`2DO^kOXPQ?5z{W0&qKP_+P458)Lki9zJNgdZKQokHUj0CU+nq6jQF#|I-B{lCSv*_tu8u$VD=Z9IL0 z`@Qfc``t<(4oposBthq89(NzE&G*JR)GC~a8{Z-3dzUaN&OB4J+jzpWS zgET<{EclP3`oX&Z3L&wH5e|QY( zcgoE>$h}~?INs9muGsxyWReuTk6O2mFS>Yt-3(cN#PmU#jk)6~tAnVgVJkl$l#Ji9 zyyu1CAN4#F8KxopxFfPk`f-c3)pG+=!Repv4fzPOaOR|&BF?BK`W1U;ZSfh6^4`MF z4$n(qAvE$ZZ;T$K1b#(gHr<<;D6qlgA~))vhL!ECFLVVe)b(YqY1QxUmv)F;Ci7~q z?cdiGO%V@te6kIi_$Q`zymveF0W}eMx7Nhmhw>IMo<0NmN5TMI%WMJ999lkrV*A=G z?2?=N56Zz~+c;5Z)=&6#fsOLyspN_B;TyT7vhWJ+p%O=^P*C%=e+!cs#L~(3*jv^J zw8;4~Ox}Cg0GNECfXR601N;!HO%bczYHyf?dTl*-rakarWhP86gjz?Ww@l4kt|OTN*Pg-G0k!j1U{>v?A8o^yJ+PPtq+JlC|#EHBa4K@;%`tB6e=L z{d554&NNi#-&OGr6zfzPz5rkrd#m9ur;h-cEM2>vBAh=m zApr>9!sLe%-Bjx)d~{HRP;`7ZPsCz(+jU-TJJ;NtcWF$@QwR}8px8OT5M^X%@^0}- z4~S__)meW&+FR1faJ7=1+LRlW1IWj6JG)DTyKLz$y`c(~PV~a$jYRhM=S|U$zry;N zou72FaNK`?n~fb@6WsvxaK&z)80wi5TY8B%hLg>VR~Wg#l@p7qNiD^a#mlnrJL}#u zC6*9pEfOMVyQQ=fu)dqsj0DPRzVhB%)^nYDPKsX=igOvqG_qR8H$o=#%c8B$gG>2p zfNUG4nL`Tmfp>3v4fyl{AS6p#nz2X=nXJdz;i1uh;LfS3?BL#2J$8I%U#Ro1i|XcE z2_K#h1u`&Ko&p8@2Wi`)?ABL~R<`NP_0@*Ug)R`y`bwpKGaD4k>QDEhqI>Kf-Uhf# zF#}~bKR1WpWd;bdcbHJUk_X~So612RFi>^V1*98d{==*G#|#Fs{SQv?TMDvbQLFZ0DpdSX#Ch3wO z)_S8D#Bbm$g04lQTVUg)9QU_J_d(TPu2OW3SwNtp8R?z#kNheDo|5@xZVIV}RgZq= zpP_!d5G&xA0_6*I%`0u8Qi3QvmW9J+M4zLe0GhuM4TV0MuR=l9;1LN2Lbm2NS3CCy zL`9q7kmzvgH$ASr(U4z}z>_^(A+X=mg%*TNwu6!L{(K;<<+tNs^p|M4IXY3~W>*q4 z$ZVPRh{CV<)y|!=Gd!J>t#NMRKWt927jxi!DfJIZsk zVY4?w-~)QwK5APWsJ6v@UEw}MT!M}9=gehdTXMv!4xi$AYoGm$x4v$_5omyM`Y-nE z*$Q<^sT{HC#a^w-w+o)^I5C`-)`Qs3h9@W@j*NX{mJlt-1HI#}GW;=z*r>eGJxR7o zdA91K^T>Qy-G(0<1*K6{t8z!m09Z?YY}WB_(`rDQPkiZ~XS%{kTMRTJ(||w{#9m<) z!$AVORB9?G({8LmqXtWpBqkBQ_{-wGO@_qW7P34+?BbseEz1q^erA{2h%n1|7>W~a z&OaJF05FlHe7rU{3{O#kiex@eu?Fd(m_buAc;n_Kmyh?1u9VXGw5{Ld{DJ z|DPP^2*?1;knmEbBmCZ$wj=Au*8#rHzcroN2mY(n{O0Y|R7WD(oown$KcNkdf$kE5 z&;iEHFhLl;tOhAC%5%gd@gZ?zJ%-(9+ci3kJhBeq+dlzDPFU}gk2URz{~0#14~;qz zjBXNk6M>D^0lctYrTT(qLy6LR=J{orJY2^Ku5%;Y4M6{krGoo^pTV{bF`wH0dN0-(T!0lJp3fW7PG7s$D#4`^{5(=3ZR%opQK;399AJzvNHxaAH6oj z(RHdt!Jnqopr=t3+}mcb-qx-8P;UI1d(}N{u`c&m>vv3?1f`f!eYOZtnAE#L)!~Nk zD4GswR4Ji`p;RAQz&j?`2u*|oq*TpPF=9{8k9>dnG}of(kEq4Xb6?bAZ1=z@5!dAl zQX=;F9INwyE?=xpaVhR43;I)SjZuG64jw9v5fZv{R=@Rv{LyiIX6blTU%2QR`0^rX z)K?$8lLw}=2A#zc*k6D@!ye8*hjw^>vpWKmTN#LO8r_@uXu!&NkxQO@gyCgJ1M@uJZhXICTpcpzFOFjp_tPdwq`pG9vqjPL=A z;F@H$e${{h&y$g)7G#L{(lvdWv?94_jMROTDc-3QdH4#GOW--t{cs69Iuj0E9j35mth)X{W{hu}f?|NH0G|!Gdn;0=@hc*L&)1&8$Bc@=Q zBE~65&X=F{+|u)Kc%^y|ihA#7&jsfIFwnOYWZUW7NV}EtDQq6g!=wUY{15-chM3r0 z-_vF!d4R#hX5;S__05Khht2&KQ|o7V){od|bcfa4dXZ{gQdE--S-2-F>YG$l8K`ZL zwX}XM^{u0x*TVT(2>exwFw#=|jvZ)h!l2|woCXmiF-^hgJBM0_RD5R+eguS4TW;}`y4yIt2y7_ z|7%V7s(mCb?>}Yh6Ka6D7Z%T$drg(a&BtL--i%x+j4{B#sMuex&`2Yw0Yy#?@F&6pe_HIU z>lxBu$-R+X3pdS%iDpM6D(OEyYph(2K0Fi)JA`meFh(zlr~hh{i7oB)N7_d2g~MR@ z#L<31sDy=D1taN2`N(rc$I;Xuy+m7Vzn(Jw+KKvb34 zcx&FjieVQP1%7gKeo;W`2XvU#>(f|x)74PG0IIN3I; z?xM~z6B3e@qN(de6Zhva{2yKoyKCzD0&C@(2Kw$LK9xnAfNP%mF2+`;vi(v8aTPUD zj(1KlXo2E{I>k9xi9xin_327Ar{@S9@z3b__IeKV;gtt}WLgj5PrIOw8`vC|lnO}c zaxoA@@yQ6#H zQF)C~Wd**<2{}po?e^alkVO&v#UM7Nqj*BFxB7$dt}V^oG${aGK!LK?O}O8&_Wg$s zUj!AN17pVByeLhS8 zib#Sk9QMs3bT8J^K+`d!y)0o)?C3P-fNX^d!P=q1Nfq+Q{q>9hTXr zm67>Y@MC?7uLW3i2rYfD?lqzA-nwYRd`cig zd1S+v!CKMoJgc0ox%VVt5?sQ0^SJ~O^NQme-NKMo!9@2{6Z?3iOchJSLd z$FR+x=`CAvI&B)jg#87YF=d8$&3JVdoMc>oi(Y2xQ)nN>Cm%>p;HS5;;VpMKJI~?$ zI~ss_vNfsU@mBYUCg3>o=c)%!DL5!@ai3|O^E=l-b++Q^<`TL$tATfwOPM*M*?NTb z4v}W#3Ye@6-^MvA@GkPABr#C8Q6wRvoX}dgg~&*aM5ynxI2n$oJka>u>6WoMogrR1 zDmtG;3+21&xe&cSvA9%r0&*RF`W$KBb4t;ic4kZ^{E?vfi0=tJwN)b)KFOvsUoYNS zt6*}3?qK3nBeHR<0;n~A>J-J4rv|xg1WMxw&$wDnK)wfn)qXb-LcBB&ohYkNsi^LL z7FYJEm$E~AOW8gyj6xgwj7D_Ld*VX90tGN;c<_Qg7>tm2GK02rf#BYtV(eR@qO`Mg zZ#ef*H)@Ax4wH6=czY?6jGmeoiIUR`qYwM zg*@!MawM%~|Jf6KuzEr*hs_{L>`%wh8QR&Awf1Cel`bssm0Jc5;KGjXq#P$8x&4`J zhmU;IC(&?(c;WCKX`+>4Tpi-`ZYs0Jj$^Y!d|pgtSxgKL-c2Wpx#NOTLs!A=<%3p@ z)mF_Jm#2bBdkl){5FZ7gn%r{ zY5DJ*^B11)KV}Jk)4wPlROHBrNo8P!NF;XSh>4M3og{5_3Mz4WdFMy?dzog6-0aev zb=XMul%!~`94uM`<>3bGf*ov-vJ(uD@bDo!7%1P>73#|O({m4fzjwb*a78|!J+nxA zPZnU7fWakc6F&Qb5coTLMY38l>Gf20B7mF(AkF33nyDvBt52 zOnl9cFM|oK+4%tpy1p2Hh}F83?K+%WDm%b@@i3y-ZV+;}Hck<2QIEcrpyug6Pbljl zu7@z@n}++s$Ej33)jj)nJ>zH7lA$u!ncPzW!XxVpp^~i*y z>h72KW(;0Kg3J?7)0{)9Lu$j8SH|w)(3+q{$S3=Kg`(``3LY89mx1ftalY}qp85+( zoL%7~@Aek~0`53E74t5`*&h8wJpB(-8=eos)8OR1ntn*H;BzxfMN^5z$0&(qNxU=T z3yiWW@Fhu4P3T7u+fHe}E0(Z1gE6K3PME?1w-bDQQCVM8mNAjS1}Ue!kuao$7yFgN zgsQh#58nG|){n@i2&!Jp2yIZr^e86LShQS)c#3NAOJVeqU^@HGyZiA%W)>_DOB#H( z9?a(j!m&Sg^EtRuG2((I0u9!!af^p1(%lK#03aO9=w_I1!j|v8iCQ=$*PjTfAo?hh zENa!dhl@vGC=06A)Vqg8J}kUZCzytXduIfvtwAxp&fTbq&Wdi={SsYrmzXMh2xqIG zo12$<&f}e~sb1~ z>j_##IsE1uc`h~*`e{B~vduPbPUKkr8UPm_6I=&EX#6xSuofxa3rJ(>3fH_dz#wfl zHyz$GXF#beBAo;a#wZJ)RRT=ZR3!dzigUvJ2p7m``x6gl=-x0Vm2%r;jmX=|US&My zU;ViF)vrokU1+bIADe5mS5iKaV=F(Y(Tb#P<3aQ$w=G4x!uQ`EV3?+<1<_8vqVv-u z7u|X1kzby>(2lL!WTvZh3O?D($ia&^Nnuh35|hLo@&d zm2dXbAC{p_09pFdRa;f&xVS@PrW7jf%Jyb9ks5YH}u=%W~|TO#*y4(nNbCSz7!^;fn@WuEWr z&ZV;Oi}UG@P6dtI_w(tX0+~CNbUVB=P9AUE-g##| z_ogyydwv%l(hpP%cmS$gP7f}}NB$o{MdN=#P=AK%7!XvSs+l{%w9*l83?!}+G|Bl{ z=E!*k@(lTA;p$cbS!212LWOoM#ItPuy+c&$|4m$*C0z7?*i?ccO&7$r4aD#Ijn<34 ze4B1`51mzE`d1b`)uxY{>okHhqvYJ3Xzr(@Z$rQzNJRwCC2KHJh# zy1q{5Q|ShMUb+O>u7~`UK4)puJ!I81x^dMRSxf1f!JwVGbAkvq9^|4|u*iza=;qVY4%IBF>Od2P{Buc&bf{RyJ>Vql>P2scC z9I{PYStpZ)>#1t8T6fcRmr&Dn(xL6vxlahdm*O*Vd%i9PiPqj#yv6)RSI(n1uB6Fm`Eu7Q9I!399yto6 z$ox(|kRrr1ky4X9eEqCKszuTmC!EVBayKHNz=C?i9e(tt;`QMk7sCacv@Dzd>%$K} zQPX|m+jLt>$N3$3I=asuBv~O{shWU@T;>DKoaMCC0iF=xbt4_%bwz+D9N^C#Ffia_ z9pGnQ1mF{4-_rG>_^g+uPWydNW3oj%uTyWh;r5MZw~OI66;~wmTHR#yjpr{v$&5(b zcrVr?&^9%mKAzi|o80yVo2IMEetI8N9Fs{#S`>1@|euT2H0E*fn$YMg#V7f+D z86G1;07{w>#1?&s!{?TZkN}7{5uLXihdl8lcM5Th`KDx_CMi;`s6;9de$}iVnPa3I z8P&4zjBiERYzzWtIm!pC+GB;9iTv$KwF8XC^oj5*S2zcHnCE96xtnSupXH=er}1baH3eo_PzC5_2T8RPco-8|hG zV+?-WGe(;pImS4S+lVm^iK-0MO;B;r)d|NKmLRM0ZLA6RVT@2KT{dAOXA_n4zv7G9 zk^et@G2z6`@WocP!G1G*F=WPO`QqG`etfZuKbsU!wM6e+fqrA1(DQ}X_V{Rd?kQc1 z_#%8~fsdEL0bfsCx6FoL5xTkV;W0#c{4xM}98x;gQ?1+FjzmWO5gI&D!Yt}uPm zB+a9o&%K{X&=v@=5lOe`4)jQ6*3}hhnS>QHrHb~Wfq}K(uP2Gir(k+J^qs$vKY$ln zV3HDjG3_{LGfeca6aArX|F!NQ_Tdu_VNS{JsNqS;N;8BN;y=3aZq?t;gB@-zVuvF8 z1hfm>V&+su`)96SrbOjt{%Yjk#plMx(b!9?J^pyQS=+3OM5B zRxxV8|Av~OI?A35$KB_1gbB;Cp^1I4d>I+tr=pJnzQ^RR_ir zz{6OwRjW@@48?f90B2?R#8!FcgC_~x!Fr>_b@*P9NsXO3tys`p2+Ma!Nl;gimIU1X z)nTr<3t>4+9{ca3-NTf)tI48=|NNm-y3GQ+MPpcODD$&D9P*X?)}Ng4Rqj^8_x#C` z@I_UGjdp*MPb7b?x+eCjO0{1+C2Tk(8q)wggN`!GC5t!L=FwrhZ7J+zF=}jJajcs7 zW^Zns2@6J8D{tSnH6(H)vA~_SiIjdk4*(#GB9_I*>gm=hxnc>N1B_K04+Kpxk8!9X z&5uh8L_)z4jye1j6BEy_5s3^&Qx){$1kBULaXRuG?%C$BjT&IeA+$sSHD6r|FK(z+ zmkS11rQmjjJHO~Qsw7Cr-~$a`G12rbj9wYPdWaqjUBX0w543E;?tH)}Z64J?tZ_au z19Vf>X}fjiH(GVD4}Fey&JkDdO^se2zxoc7pcSd18ybUTZ^M#}hc|R==xy9{d1}zB zwrxGFldvsy`$88%m;qY;`(TF_6NE1H-~@pKg_NOwp>`0=LLJ5Q2UluGFD z5rwB;8ZmvuO(~(RsmLNecqSI{#zLQ^_V*qmsc6Kt-@(ek5*;CcPq@8+cqHT-`$b>$u zE&dE*Umx0!wSO_SSSmC?Mk&qDutwp?B$vh)Rnl(jn|xJruVv1cj*L*%t94E*xpL#}~9J>IQjfu`2nl!a--iF6B-x#7#eAJAB#hrd+F-w!&B)G>0S@+1}De5qu$!NZRqGm!Z~wA_nG$_ zGt0#m8^nqm!d<%@K>3EUmB(WKb%xe3eGf_v=!-^puQL?jai^9PHSjz+?;4RH=*&{u zc3HPhQ<7DzVf4x?_}KF}_NgE`5Lj~oSZAsYNS!bsW4dT*OFcM5985m@8_F{E7kb>vx@TPX@*BJ_x4Fr#Cu90_OjrA@a z=Hs7@UVgdj!sh+?mdE&W%4A>FX>~a2|F?^9%Oy_h&hz`$(k>r|yqu&#f3yFZmFLiz z%fz@#!}#fN{B9*P#)7^I(na6*TkiPXIS31#M*+W^XOZW3&}Ao}Z^cFx^9Piw>>V59 zZ~51!$n@o_6qSIU)#7KgX{!`nE4)H3Vftu|AUj+9$Fb?+U2#ge^GC1)P6j1DkVg$9 z!hNmxNDQY|vQHa=ASf1d&?+P?z{n5QTB`*ic$frqcM7gPKSRQk`Jbln_|dJt1Gm{( zRyh3Uk#3FxFcu7zqBAZIs+Khqby1lg9O)cLD>GHxpGs*DU&TQqlq{zFR`YeyV#&$_ zHP)cwofa)P&GD?4_Nk9HKTP`-KU0;S%uElA5dNcNsf=ugH42`>I~pATQ+sYnWn|}V z@!CMu+UXOQ=hu7UX^Cxr;>9v2#)O>;8&0bcBb4uf>%rxY(>QA!{=_LK>eu3Tfe=dhpe=3u&3qB?j zM}|1z$NvzU`QIQ6Pq19YgNj=Yh{E_gb-OVB4-7AqWm=ffo|uPK61ak;+&ANi%oTb%(}?rUdeIa5Npq$>W(ixv#r`P+1kw zV~9QOe+iZm!?Lo;e^^d*yZ_%T{h!ip<0T4x@PoMw?>`qTB%FNCO!{#7kBYR zTl1-hc;~J5((Plv;)=zPxQx^VlC>7*G&gKYDKBZkdOa>YDiO9(LnC4PuLqs5eMj9=e7^dXC$+=^Dn7|u zF{tm_1D^+=500BU4Qg7qPXG?9rC56-9M%Y90J_4Vo1F8Kh%bW5@y>acuIgYSm|3mx zK)TB3u)4Z-6n}Jn*Cb>FMY4(k>reM<+^yZOE4mMh?l<`R<*q6lAa3@#>V5}3zi&7E zx{rNIL{(pAPj!`l8IA6S3O~9)R#`&}KYYxMs#@QNI{N^Z_*`c}4j*43#gAM*`Edfb zh*k@kPdY1$QW8aVSnb#2>D6YoiB<7zd3^$iJqkKkUr}Q-4v?LcQ_!)1qPTID&W$6{ zBhBnUaWZiT$Ha?qh?8B!2wG()Mn1cpMj-PC3usu?;k6r!>C(n=7bW0yu2NGZl15N? zrW5}a_-_16KNb|-Fsm@n`(E-e5Xz+U4FVtRK`6q-hdQ^x_+yk*pXsp_(Vn2myA1~) zTI4n~smv(nHhj9DLv@up<8dklo>zF+0oJ(PlU;0bchUXgqWkWmdnqXWVSJ`GJGVpC zq|#L-LW+KO``;!V{8rUSxNNo~J%Os3ylsN|Qbp0UHT=tpB5oOFLumWDRK38}2t22_ zuJehd{89L1Nv{$<{QbALdL+@CwW|J9UxUTp|0 zx^+Vk;)ALic60N{q9DpQR^%u8zU=6gKdj?muGG*+jS-i8N>oT6bY3H|GNB!`hOmWM zitwHL<&K9_?ULu8PQK3Nm^*i%;0!7r>FhI{RfY`>=d5uI=OxRgt*G8c_+-?w3Y0+X zDH7dO>n5!IvuEaP#o9WT_b)L5*lL_i5>1al6jtSQ$fT($Q|Z^(7a*N7>sgndwFj{m zN4WJDXF>K)_@G0H zKiWS&WwRKuuvaWNPUEBk7z}V-_yY;BnP>|WXfQYVFp*!e`3n7QK0Y-b-xmr_!KEW8 zkl+l2Nt2JIN!Q~r8>f0i7pcbxit143SIE>84qjHbG+fj~FTd81O2!kP^^veu+6ROf z#Zx$pIWuNEm@RUPNRWfnk~^N2hIQ}Y7aqbi1&{fZJtHIj`hCubUllcm7iRhaCz)f@ z+9O>tsw@2V!_LQZ;3A3FZy~lS60vaUrB0yOi8Fg|36##%3~p2-PN1%G?XBwhbwQvG zvm@0g+4DB}j}H}h68`ddDE(fa@KRs=EEDW~Vv<64VI;>EjRY!HyfnBEo3@_I}F zl6K^p!Y^-x_Z`P*_kb%rUq_b$KVTfzIA>4C^bt&R_+03P%wLgynIZkjqIKIH_h_KI zxi8@t_!EA)Y_<3${~DIzc?rwZ?Gdre@BZLe#=@k&j$!BfvK7S-hL~q)K6c&(rqzVB zy8uaLZ(N`Y!LeljXy3kp3Qsug*)kduLt5U)I?s#XNsVyps zj{H-kw7$K2#DNER_@*$xJbbEu9S@W!qZ3{_clU2M7#5f}0>?((=UKwKVeV+*QTwz~ zQoLwidMbFU^QT38s6eg+7u=P%(~`^~C@KpNy`Qs~pcSvB^&4efB74dEvT&Ql99sln zXqL9aOG+mDlw9}6d`S-T-W>|%i-$Wu9DUlzjfpug)OBO(vu~MsiC98BDt71!=P!0_ zxdw3X_1AI1*T+Jrh!y1rtRI!1JV5!b@Pq-Mjv3%-_)Y`NeUQZfO7zz{r@vkhbTij4 z5IC8IE&{@2bw0nDd`UYPX(c`-`U^Q4ow5am)1GB5wKoF2~JE&=a?) zP9*+NdsKhTa~FxPZk?g(o)@GTc1Bs7qOchS{e+{Jujw`UBKv3$QCx?qw4Uw1_?@s^ z)OK|wrhoESZyQul-t(usYIDuw@y_2HEM;w5vMM{cb)2op?vV<7s3*Mc31^V@DDI{0 z#@P-*UE$J2j;O*KL|wqeh?+>*R*h!V;3)|q%w=+LD}wjIfg4%HisuU|5T=j{-1$+d zz^Y?`R?NFc?z>{g72R}GW-X(e~DGIN0!9Q||{^)41Zhs+xoO-eEsTcw{Fb$rO;llUcbnFY7z(`4U zOTl~Hcog324bEdJ=`TKOE0Mb2dTI(Dg+E#EQz&PZjm4%y#-cjGF?(aTjqDFLKu!>D ztBNoBa{H(IX;a*899mG$k+)m59_YeqcFv)q=~+|L+5%D*0qf@DXzgn8}vS7#nLv?33J{Hg~LMR<`0% z1trFwtbNGL;7{sSIQ>ZALGe z+BIz}qzG0lwVeC6Wx$(!uzWS5mm2hIuBIO_=K1{$RhO_zk*Z zk{vAqc12j1F*UhQ8TF(-9bWK&OeYCH47qwxcuz@rYpPHIUM^HfP@%32U=wOCsQJ!z zGO!3-c*}n|c%QdGW^CHmfH$c4&RyagAErPQE%1Amoq{s}}%cTZ^*BjG<6TeId5BLzT4JdnZo#MuBJW;M<9uxjVFB9Ml=9`|7U~=DVgtt&xCRfPlr_p~CQ<-)ow^1el}K$=!x04T(xksst<&0wgV=ZkiPv z?{xbM3N&;u2_ND3)1)$d3sap1FWGD<_LkcY{>#FR_q)%d6sO`hNUx<+NVb+5A_U<_NSbh0|7lN~P8kZnMbYTYAp-P3jUSaL3$ z?WkWXx|7E=mT{Io2MomLx-=Xiy0crE;yhH3N&S;5Y?hcVR7o7$b;FY_GiB1qhS5=Z{4rU&0pnzWxm7pE>^m(rKR+Hlj&5X&GSJaNQF5jP4x- zgzcREEjQX!jN3k%GdzB)Q)zQNBepPMn6EY(bs2m|mu*MK85tsaXK=E{;QW zK?YTtTX_DJY{hvy5+Vw^#4Hp%HMPP5ZTzCHm*1rBkZw&Tv+dS7Oe&*V^P&`&Sj-1B zE5jRq?_IPsRKM#E;ZJDjuv5xWe=wQGSQb9*H{-PQ+(15~RxG*L`f}9ouzbIx`t*C- z+Csm>oF4dq&xrH{@OsAH73&GQth51f<5brDzw|nQ@$cY5WG#fqG&GQ)5Sbh0s@%`T z^73Xh;;_bG#;fXiqbpqX+v356GY^F=*4r%8`JVc>V6QDd!NLUn{iy-?BNN z_vepVGkFMfc*idse+=^c0ml_ceH8-|f3%SCii4sxEvP7LF5r!g2`YZ)u>v+nIcz?A zR}mH8x!n!aJ5^CLkf)@X%A#gGQBLDaD}0zFsQA}Pb@88xlDIWbl;`4(D9Dh-qkQr?Y8kGDWS(So!3|`S;a-uKgeSOFOKQ+z-Mmm zZs>#&IyMaAAjoTIyw7=!YN9-woPx2qUSGqlTw36T0r;W+d5JPSqZBiGl)ik}46A>2 zJw5{laf~;J14Y`C4>^|6J7~nfN>s}GTSqG8hqs7j+D;U(5DFDPlFu@*|8sj`T|P!| zt?7eq_D8OmsaySZg|FgXNt_dia~TT52oc%miWlGRUy&%g2xY#m;jDo@CWJIq}bH*A$}5L95dG^C8L>z zZiPAUSBz51WLGDyFvWk2In|0KSYXt0RmU!xH+Y*K<*;R-*okV95m5&!n{!fOkMgZ0 zjA5P_KFF8DtS(lg`i83xmd-XaE-5y-hGG@OwE8f0C*DC-CZwms$1D6a1*S~jVt#eL zp@fXk+zagC9Cu)e49qw^;Fyu+wKV2=gc0KAAP~9$f40Q< zs0R(>w^k-rTP8Haa3G`{WI>cDhT@@@H)vcJzB|KBnNix3Oi)#)6psZ~OAb94?}W%@ z0x6x)jeX0zV$iU?nL=}H&IT0?Vi(<{)oNI0zCUjRs=M402;X|6rbwhUp0bUQ-c+tu z-AT=JTwf$TDpllA_r4M~Z7$3m6+W5czd4JN4=R2=PwmO!6g|SDbUp;!3hr!fLoT)e z1-a7=U@ri~AGf0m<%M>GHL zzUOBCYb@@e?j0EE&4BSgfEm<$wp1)GA)3KZgXr59c#+{5w)3dKO~qW4`zLNfSb4q6 z`b9!)5Z!wzc;loXw-Y5a=bbG4Xv%%3mMb!k<{q*a9271Jb=n$+6TMuowS5VWLiLT;aatj4}GE9$t~3>)7Lvq>o}HmWx2+zs=&mol4;YSG{G^}epp zeShvGHQWDxKiYgw*WrD=&)54p4Pi#gRNHiS$@s1Pfj^sX9gJ))hoL`YURjtf|FRf$ z^R4q6TkS^Le~xlGqCCnNz^=ml+c?Y|inZAu)yy*&@@+b)q8~I4Tf~&>=+L1FvB&cG zk$HF;?kS&=xhOzd)j-Y4<15t4`PW=p-|#vLU)P zCoD;w8d2B&${S_evQA|!&cUr${)VDGjSdqy7q7>j{2O?lU;4%1`SyPR&pmbj1|F?P zhP3C%cIXchUSlfean7akU1+zLcLg3pl^+n04&r$FvcA7W$56xPtw(-N7%Lr54^w5k zCbXx8N-w`4-Z&8T0zgICe}AgdN~y~C$CQ;t7hO;|-Km{{S{sSA?Z-<7+Es?MGdaql zGk^XG>}9H1aYotg)xccw7t9uI82I@5%o3$I*uSv!oH67P1 z%n&;(9}=DTmMhH2m3^?R{Do+^avRTH@fSXZsm@*(ZiPjSuH$jDsHQ2drrB-^g-4xV zqFMWtuy6nV&jr$ErTeu|b_+fU4YIgcJVs6{p+K0Lb+#j*oAJZOv=YAC{^DE%XbEpt zy?mLfNqo9NcC$<^+0UiX9IbEZHPtX7bV)-^S%m;ifBO9zaB6Dv`>iDwal^m*4wkaj zI2Hv&m@BoQk)U9ZzEc+=!Dup@VMgEYLFu`w#9YBn4*INLS;!ZF)R*tZU-H_+Bl`2c z6mV`ocRN9!uxnTi>72iMuH3Det6D@Z{8jU^@K^1MtJ0(QLC-Q_MGoJA_6(BsppFY4 zjg?`|2I*yIX2ApZX7L4~9y+ZC)0T48j`@qUyRT^GV%3k*nB$!}`ak=A_g_Uxq=YzL zCl)orAQOIeZ|+Kg5TtWMOh9FSA(Q&{x>fATPCP7hBggJ2OcrL-h3S@yMKL2@<)_DS zE3E$b9Y;6nF>1w?jcW)}yI4(AaK<%bZz8O=EYEUu-&Ixa*Ua@w)bZ+7ds!XPhFf|r z4ALvg061<%c)hSJTW<>oar-HBB#Z>s%*G*7R zJ3s#qRbp?M(iyLpFYNkkbSyf|hxtPCo2y}A<&M?>@4{rmV#K~8YB7X5ZpptUx21sV zKW<;dbzW;cqQm!wJ-hF6b+GjX; z`LH0i;&WrYa)tmnO>pbX!tFcPrWqhywrQC>}dS4zL;vCg%dw*RXyDn)01eBPio zl#GYE4m+$%KUsLG6R=I$QOjmPitU+_O?#$;;8CA(D$(pk71?#YeZ+$00=G#5g*8Jt z4qsKYA2ToH2WV%wkJ=Ker^*FjX8q*BS!RU{a=Gz-6j?!&N#0zIF7?< zw>u^{z9!MjCJk&z&#f`H`LMC;m{n}U%!=`$I8N8H!=?%0MHROG@R)Ec$gvTD7+m2P z9--or>ZV_fVSLwi_UszgDZ2UrhAQ2|r+z_Efs_4!LE%ey=|8R6mu~{LSzcL_=~@Th zak}`YT%zSY)>|pSlK-{d&e;?4XvZVZXZ`47+v=9^ml^}c)M4Zwdj!L*4jm$hu?Jp@ zEJdRWR+j6oMIS4oFJ0`;YOG^cuxXH#VB6kJakD|z0n(S}S{*x8IJF$Y19mZQEz0re<+wny*&NGBSt(qVbn`A_8Fg9xb1{d&rLi1$jri> zHaTL~mpPYw+R;bxP<}-H%baMq?uiNO7Lj!NA3+_&Z-C3p39$|Ypw3=g{+OJz`nbIf zuD$+Kblc@NrTqrGd``m8`4la4nb8L|qDfU={z8m6f9;RI2BoaaYDdiBA zR(Tej$}0V#nOQH`BmRA`L+0t6=`gtBb;pBma`^b@owKvw*)Ti&jcoV2Ot)G5QSWEw zT&8^N`I(vZ9o>cFhGug^U1x_8cwUVC#JQtE>d=$qiB|7rmoc@vptulMI`d{BqRp8% zDg}>3qArwuNpHC>pcp=tM?7ljjP2Ec_5-rBd#Nk&Vfs7bHz%6Op;5#%3rja~NN3ZA z*q+Q4W~kr<4A0A%D{SN5;e4Hz*x=&{8K&m!kk4#-F6Fw&8UUkcs!upkO&K|!OJk54 zsSA+M6vYKeQyYyvy3iE7M9}WwcSpj9sSE2J<8;J>xNh5=7}DsMvtthVoc2U>zEG+& zzfh`*T~T4bE_Ipu%bzJ!v<~ujrO4vsuVzsBt3dwbRXjCgcxGW$=i2fM4(nXIS=*Px zY5%|+Y<|Ir*^j-|xpu<~hGX;1*LZ6Bi%8VJ7CXe)s>gb5_LYsrM%1n2g=t`?n&MB< ztXVO>TnZ45<~6L##o?}ju@ljuTstatJ=uP;X&v?Lc2dE$alxfEJoZGxkRdG9Q{svq zjAyERM;l|_L>J|Q>y1D00MViJFH(Qm!BV`VOQB>S@F@}^+fQEig9+#-by|t%V0;i+ z{-nC=&y&BY_u1t^8s-N^Ma${g^uz7`)r2g=IwznStZwx?bj>knr8 z@uq{-UiL!`urAsS!N#H6!K>YvgmZ_+j;YVkvia@5+>JtmY+St9+dR)C@m($X8ZebdtJr=G`k z`h=dG&s9I&FL1Y1Amw&z0%ET@RpGjm=-DhXkUr`_b#TODxZ22)usvK+v^#HHWvhlcN#L? zpGZD~NyOil>wF*f4$<`H!|W|nSSK?vkTI&A^qkWP9Pj-NeWjr@N@o*2(25>tZVsv+B`v#(Wo5COmFa&iQxlSAgVjOxd`r>MqK~JzkCZcsZWY5P z)p`+3t`h{^S}O4na#_~Hk>PeANN^Dan^v1HtyVq$vKk=bc=)frupTXWfYs)-S7E1f;Zj_SVb@ z(>}gyX@+K&k0Vmin+g9cY6KiHrQyb>d63+4wmoO#9Re}4ITit2LG$&RwJGfx`|jj= zTO|ln3r==xG^6uAQ`=J&TkJ=XQVvkLiLD1eO7kK&wmeAf2ha$@q-<_W))@e83&GDO zVV0|+g=InICQ75j&U0CIngSSC*`0QVh|S9L(WB@Qzjt9v-;1WHG%_9i)Lv3?-wl>K z-%3VzccvB50K3uFH74!72-~{+dnW9$3{15WBsh1Kyl*PJx1Ijj<>AszjVtnRd$F9v z1OfJbxZ%1h_`X<@{-^r8UO)O+#pQV z9kw?#qgJW^eXV%=Dqo9NRgPvvYIGAl{>htAz7Vd#&dB!Yr^wfQyZULGNxQ@NB)aQa zEm}-|Sh3MU4_|Qv zL?gyUCG&NHp+x=3((nXHf(RUFxgS+}J!cO!F%~!+GD(vS5U)d}km_Dvj5Wwm2Bc%^*zr;$(z`3nf{?TmE=~ zDdR5oMp0e9k@Bk(CN?v7V!MI)FNpI?P#_~DbeotYN;=#|ed3ZdK_(h=up3>ifmD}m z;|W(NV2Bm!xuN*c4rh**Zw({PKo%3;eKOu0vg3pD+x(qFs0}~g`p~(%+^9tuUsEqW zu9?YRwoHDG7$ZR>M$8k#!nBE#rPw_Op>A%KIeJ=ib#j`C0|(m)pc+j8Wi=A&;za!P zw_lgsYV2Ud_N?q8>pYt^A&y(di2V$_p4lyeLc zW1%R#tgxhz{eaPOLXrSdtC6`mehU+M6ARrMNlY}u67e1_9JF=fz5vIm%;HFeZxsROEEI)GzfM~Yl{yjF@ z*vg|R+zz{;NeyZRG;0J_?kp70tB?GI=B4h|?w2L*SH$;Wdb6!Gs8l-B8ED$})oTzJ zDtv9O+lb$nDswmcMR`@6u-&VxGD)Y?JOkDd`dK9LoIG=}7@R1#ET>rRODrd1V~H?TIm9FD)DH(m)_VFRpyXb_(og7lz}*6S zdgzu84fFL0ld?cpFEB-!h)0wB+^aC2^5Y%t(k6e`Pk*Gfeq_!ySzX%hw|$eJ)Cm2! zs(iU=sn|m}k|hCl+Aj=(qhtpFfYTO$GMrAe8w9H*8;DQMu!gBe_AU~w#Sv{f%OsV? z@Q!51coz_5{ejS$IEQSx>WlEU@~!p?hbZQ;a$;9UZ7P-?nbpNKDK2nT^rzk3!Ux7y z+KwyWZb?IhfDO{$e@jhn($I7z&RCT-VM#;1uK7*kYQ#Bu6CG~8p3_*kUo-(hLyGdh zmHT0L_v^+&3Aq%36?4}m2?3W)65TuXiJ$I!+^yZuP267>-{XG{7g}AmLc4fY zR(J!{YAs5<>${)y18;Qddu~wPIO*5x7l*UnEQmu|;_$?{vxej&>lMXvuqP|VVp{gS zk;Fl?*-TpqT@abIpD3xrV}55G)aa}uAgUt7^E<_Vf{PN6IPbrO$ z@?fPiU03izdl+ZBEr6>50Rj!*JD%5>Id;M~-jLhMacKJi<`Oiu?~S>~^Es}4S8i|# zPSEk&atTgsmsizbJ`HXYr|sYcY}meoxhhTVTRB(dr1nklM~IG`*v6h<>fivK?Thxf zQH9L6xj;)C{^ENt`F5W;rjUMX<=cK3W1vT-E32- ztiW))scTzx1!rtq^$kalZ+o&I)Ot*olJmU^l+E#54{%|wWj2K0W|@$q4Fu6SKMJkT zubh8ZOTp1eKWdXYV@JsxoiCNvG6AWhmT_F76E=e@-s|svB*tek1lKv|;~>hy`G}0Y z?{d}@=VPTI-kDF3(;$YpUVcgrKlWNmRwv1}A2?Oc20Zz`u2pjO$TAE)O8Q%Sq@W? z(eCVzqS`1_!-v#iYTNWxhiao5Pxq98maIX1-Q zGF{s#%j}Q0$aFmeI=I_1(`B2FTU{E$!ck%5{DaG;X=H**wec>H0*F2=`twjq+m1Q6 z@4S9oSz|bKJ5W6w>TQ=r$*S$#4~uq~GoT^)1K?9P$x?=+$2LM!xmF={we&rl4aan@ z6&*%nOMLA#&E{ibJp@NhbhnXYI_L*e=zBR)0|^~bhEG&dOob&IT2z_84R(doSBuvUCfeVM3+Y% z&8gnmYwdeP@KDHkR-L{z6u!;2Z@#r<_U`4ErSeyp35xX#=&Fcb?{jD2z)QeRov;!dpgS0w6rj56 z_XFm}?bYJ8L#q`c>Wce>RX$>?3)D}O0k;7yN`X1#Gjf8`Gp;D)ANG*9741~%X7JXl zs0LRjsjnq3UOy%#gNR-nla%cx79G!vHB4iE};77U6hwD>r z@~}t}_XKwmV7K1fzZwFNPUYnf`Xbe-8pwniNv}4Nm1y#BGS9)=3t#Aq*mjipGK)ba z8y|0XBEKlCy!wPB_sB_#R?l~!8ZQ%_L~lQ;h88t+y)|0uQ@ejghivqQu?Sc;py&fC zz451~`U}5HQr$>3WNSw%Uk#~EkM$!}0@~>G{(xzB1K-^DwS6e0`g~dYH{U;pq_2J_ zNm40=XxUBcC+T(u&gXMb^tTPMu|FjmRqWyy{jYHRum_xdZE^N>sp0glVZFLyU+qfs zm+9FBnlfDqVDQj{|C1Hvt}3$^8e!VXnT3Zi!Dd3cGG<+Uca5}NvaaUIh1El6F#D99 zFuPx{ch@?dg;U!}ZJF--c$-<+JhcncG^!+pBCxP&Gm({=w3I3_>LpP@sk%U&_=IGP z2+mm{)!AIGn8Onrs(OpK5+w_(Th6Yr{M?Q_QkvA_-_kQ@KH>_jQ9&@wwH^uVml~W8 z7ioSWsZkUX8cF$EUdoF+-E|<@!<9b_dlFZbtPdbrtR*dq?qSJ0D;W$i+bGqhux5P8W%*Emr`pGhhhBOco z-Q1Qqc}M{%`dzpfE3AIk*!*Nrp9|E6k}%ioU+(w^zzAJ^3*? z$qYTs_nYV7d(l6o>>z#aAI$Ay=jyooj3V<39H*YLEAc}AFJn*@=cHl_UHF1rACi%P62kD z+2d8tGOJ+{Wljc4Nw;a%pz`LOG-Ijy7G31TO4CHs3&j;nLc`W)hpcd0Fd!|FO2m}B zZzcERE|o-9+9UEEvr1y>LMwT5WUVGX!8m{ayYx+o8}zm6gc~Ht^IKzxaf3G31!eD* zx)+cUPiAvV^P4LQ@{LbkU6;SK#1_jcC+u-D-oAN;Caf>s{;>Iru4DMVX3D*2B3C4Y`iI#y**@yU8*0V>cW=o_mn=>&1JKoK=>W>)9vgcwl>C_BdwFdAHMGA9e=0 z-=CcDu!Aj_R;zb)s>3$?y5B7h24)S(Ed}Px!moDp%(EpFBVOq_b=c{`vSnbF`5tRpxMNe8iCd`O#GQ~?zUjZ$_s zTy@Y)v##(pZBSqy?qx2|iNj9s5xc4ey1ekS^*8BKM0exYNtZV0Ym4g7${``ng{a-P zncCVo>~!`jVB4oT9zoZ-S~bqLm&K&AHdtmcBn_4kLmF#?Wj0%<>q$IjQNGDQ^(#kE zB(6!trU-OF28<@F*0*PDd>?uf0|VXe%<6NJJ{_wMe2 zQAj2|J&Nnp{e&FYuyRF&M$^d2PtBpNUZ&@8l&j?Z#P1LM#Y(MmtFV?f0@ineI!K1%jIzrsp4~Q!6Puhs|2`S|XR(!!Vuw zL>d-FeGmDG3z(wb&X+M?tZ%y74~c1=R%N%PY_5_U{1C2z@N}JVKvPvv{Vn_2TBE5U zXW7?ytNrGh%t9x6JX)-Y6t6vz{ULrzvhE^9?mhBgZrsImlH+L8M%oqjAl#? zQny%w2`vSj z9NrP6+Vru2lWP`G1L;_`73enqCv%3S#bhP-qDAgBXluE=k!`Gzw4rZ-GtO%HI&-ji z=?205w1+Lt=YO6J@+i5?V!kj%{!OdmAgpoBY_jhUTM@A<7mw;XX3e*nd&!_gfqMl? z?(?$jVp(MK2stuU;YVlTPYxFDE3qlTs1$8}sTez)f=Kl}$Glx{2;v?4rd* zJ#5xZJpug`9`5Dpyntm1FW|CWycd86q}0;hN-4FoRM#-IvB2k14vhF{zFNVvIi3hY z8P5=n(e^Hjci24$>?FNb%N_Eh&1gDObZ}J^R?GF0BmvARyLn)!#c&s%B|j6 z?OK3_La-}(Y`Ip>fxw|~g z#dzdzK$`j9N}8u3{8paS4Zn_Os^0fyDR%7a)+-Y1;6A3$`?FWNMH#1izoZt;DN)8sT>|oHYQ35*0kC4k-6#D?wL3BEyA!zD8VcAM{#cBi zd*V%yR_Z_h@B_PBF|iom!|MGK8nKzoaq zyxIGgpCxF<(qrf9Rlc+bo+!nR)n?d9nyOp&8)&KqV5dPu^Vo642s?+YEWyqI>}}`2 zD@T5`1SPCI@UQ{`qeU?SzjK#E3f;Ov5I6vuU(!8L=gf=?$ZdUFUcB5hb?q&5{%VCf zAdFpzdS0R)_#a7>=J)-Jd1WJB$-l=%B331OhtuZaU47%i?VM+I2j7_aBDNfo|B({T zT&qrA`_K`u^u5kQ9bfF>xnFZv*2k_BXk7CY!|K=H8UWG6K_J?*0MY&qqFRGUAnvKV zFg=tMeeX)?$O5akcCW7eEiX)4q4#0s2gjDEi1gWZ&a1F0+}Nl@=hY6|;Kq%+c0YOP zSF;)m)<(Iq*)mcW4^usgmp~Jes?*J^hphxllfi&%o?rA&k>Xkp9rG{-fsR99d;9K? zSbT093T+&`6!dYs?K0vgfyfa7?{olZcIx4kE})bR{by^#nRk}*Rou2`THKnF$H-ik zzu+HYgQMw#c`OD;n-CjY1V`8EeVw)IX!G&w?LO{|xn8F4!H6f33M<7g)A?A-+&p`PtWZl?5|K%kL_1z5bq~{c^&} z*ZH0gxQ~XtOZWNN_miP)3u-6&&xLsQfjIJXp3T_heD{AqJR6RnL2%;rjbbb?7*?K; z9nLLQ$9T%d_4d8i^OSmK*kTZ<^Q?@c#t+MCW#l~TC8W2t%znlWM3iAv5t8y{cHKUf z>%FW>q>65-Xl()IXvCSSDz?hm8bU-YX`d6@$=c1pF-1go|`DJ$XOV3*r&VuAeDA zOv>OcTMGjPFxmt;7O|SgH)`p$>Dfgqhh_;SQFWWbL#J*89(UR(7&D<4Z^!px4Vv6e z8z~524W7M(b;>A=2^u!mLC^ol=03B!@_#l5SKeyZFqcp2=arX4x z*HZsQIkV#ZehbaL|qv5TwuhO@V_J|5#Wx4r+lu^7Yii<=VmjBI zEHmpz>mbO3y9vXwaWRMGS+;H#ht-(Dgm4XRYTt_{nqFmeZGP7{n5S|Eg4RKE!@I;(z6_Fxhs+yLcx%M$d+eQMW z;yf!UwCk0&gM=~TF;&97jJSTfm&0K9@UFFZ=3*h@F)Y%hO9ZV({oIoO*=vVrw%X2} zYwOzXlKz@cLW!$JQ(LG^=mX6cR#S%i?_Cp z+4RL*MV81wc_I5zUv|jLEbrean|s3+qz`}DW(#(G1(TSaxz0T9{|?VH*9np~=9+am z-&nfwHD2jOxm_9E)~rL#l?-{IHG-LLJ99ZDamkM{;#9cPvl4b2f(28mBUA*Yk zMrTwIEI&fQpq%$svII{*D{S#G`%M(CJf$HY$m45h43A=;%$un#{hQWYP z@yo_w>qaIQx})h8={vtr6DQph7{a}OxFiiEbjP( za0*@+<0!{yQ%6|1McAuXnJ7}hXaMq|xfHTFXUbC{isg6^pC_!|vRXW-Sq%jqyzm6g zY)Eoyx^E|?l4g%nsmd0E(pApKn&{n0H^ep}E<`*Yrf>J9Bs#Ibo>j03@E;?% z*4230cAH<3|48u)+JTqgdKh|W&_k~{f`_agmg)gUm&2%^?yqyVQmj9jQdF!D=(9vF z+VaQ!6|1tVIAtZv((TeNrP3h)~Zmp;#|_ykz=8QVJ>c^Yln`&>Ps|%LWXW zCdNx`Kk+lgEQ9QaCC_orA^I4mA3RjZ$Ekuqt&V14@qhI&J_R zF;oCS9;u2EvYa6gt8ZVZVl)$o*4NNgD~r}V@v-$hbgaoCsxs!{ge#aa283EA{P?FkIlOwPsAWWV4Nzw~6sDrq=*=)&uH$^i~olYIwMQk}p z@rD7~5T?IolWAfGwxZ@XN!0>%-{VAx1er~Wcc4YLyaq*Ppo0?LQOWrA_+hJ^fAnXw zajRs>)YS@MZ<5U-Zyer9C zc8(Pkx6BG!c$|shJ)?cq5UZT3ja4h+n=0KzKR!I>0xzR9Eo0NccHrwczY{@iZ zQM*ZAw_^ZxS0&SZa~&g5Gt@*7XI!B&&`oEy>z{ETn(S{)=j& zt6xSSKEa441)|trF#WWT=u~>%0abMhb^OFB9qy*|WvjguFR*wr%ez#iuTOK{IR89l8L5tIe_H zoMD}mG&lO^Q6)znPv63Vr@0XB}n#%Iz;D!alsjEl)I1teXPd{tb($)58N505$;?Hge%mPPZ8K zO#7i)pFohAzTl1k_J&naz0xjb&|c0zB+&$IG#C@x_fF#e6(9X|;iYJiWQW=TRvkUM zBIg-m&RlZ%L0Bg64-w@3EIGVF%?n1}beBRFmsEk5U3pujw^?@14o6lBK#HN(Q(2>} z!&XcM!~K#R)^Bi#q$+b@Sv`G=?c%dZ3kOPJZlz0>e^;Z+LF%68gv#`MU6SHmAisB$ z3U)p^=>_<_hTQ%5`(Z&`y8qddUV85|!*eJih?V21JgT_#uLg6KLl6v9BZzB7&W1uV z=c)v$SsNLUv+YvZr3{@Qt^|&!^A_a|TrVXZSTjHCk@l9)d z<4ghcXwJ%8Q2V1-k6i6(OnYdZg*=RpCB?G(w#8&nx%;y;YSeRWG(Mg<>jN(RZJp3+ z$O$Sxd`5Vwen%Il0~ig9dZL03U`7ahVD&ci-43e{HCayoORWCyDk>rg4z=AR+71qy zD`u{BvxWYbb|ac=vIHteJ<)ziHup?h%gnVlUq+`Yo-uDPJ}hcKyscJJb)C?}Pxtff zj{AOX>)I$AUcNwyau_T)qdd~#rmS^Z@`SSV-EYS(cN9NsCVk(0s*X48xX4t)Gx=${ zGXD0P8Y?XN#sf}4z*BP3h{7L0fkAqo1r|dc0l?=~$@r>Yx91Y)6A5M+gZaAlgVkUN z(_gksve=6jxf+`Kexp2=*O0%y0)o^9%S6BQw{-c!)M%)&stc0!WhL z(dj9XZ-1U_CpbmE@3qF?1S`ZA~B`$6du|$SWfSCORA%bm3c+Gu;b$;as=2Js3=1{zSt_?7E%H7yF^-jB$P_o#@3=>47j!L`v^lF6VHK zzwThgI;W3)x9~}h2l>^zeX=v^gB3>a(U^9|q#^pukITx2mR-8(6AcFsQH7kB7Np0% zN1rCBJV2Km^rjh-;jiZzWNuND(+{H%dnqtx@$4oWOg&(?Ax^EVI)*UdnH3%)pnv$QWD{L?NH7?7_%WbSe5~@Bg`=m)kZ| zc?~uLVV>Oz5MTf#+!Vk0&_-5zy5(JK;3QoV4V&Ge>YR>Wypa ziu_k4Tt$;6IYQ_IaPzW+|2DWW=D(g1cHCFBuv3>=*l;kBnfkfWmL9koSgZE2xzUi4 z=jfNe1K6*D!6LBS^@BI}AHaKa)91o_{0%X@E9wm1ni$@L2<N_IZ($2soihJ_crzkC)MLNvQ@e%*Rf#w zC!>;J8xOjV(pOJCguZ%ZZZxYTQFNf%a%f3gM2LRvS7kbPG|L>O=0E5s8C>CytSna<_3~}DB4?03?k2N8Q_+SC_Zv&r{y9s_)}yb($TfCt6+lc6Z_1 z<+OE1%I!r=ab~9adCzmMRe9s=N{AwDNqR)Tr>P^>%I1k)uCzX z*;!^WW;DeQ3yfA|Y9Q#>l_(^N-d;juYd}dq{=0P`|G^gzC=v@PD6!n)r+aSU&KEMr zry`q+xh+i1woN}IC&EOUc1PQ9Q8-^H(_L@I*$icTA__Za+RJQ*LI|5C7()k$6Ci&V zGvBIj8}$8Ia725xtu+=l{xmdI7@Cyk%(m0B!B`uHsf+PnZ#N*fPH3a=nreMV?CYDf z51-|o@ihhK%P_jyoPP=GUct^Mmxbc~Wo+_=eZ7BsqY7nX^=Mn+>j9ste#$ z1x>@4O}OPl#($%po4)0ehGBMJV9#83Sl{2Xxt*NEMo)2WtJs8gQFz~dNqod26YcQ? z^lQNI7U@R=R=9Y(%?g{jYJot=-8F2!uA#r;Z=1BsaVqSglZqEuZ`rwKYNq=}n;xJI z`P$eZ*gdc$h6io9>^A0O{l=;GFkxut$I~)hwLHihuo=&LsY8zv%sO;yqWnthGt=o4 z{k}yYT1^B5`BpLeME9Jh;(4!L^TocGO(D>Ug!L-2JlZ?p^g=S5v^41hh587NKw+u5&~*$`nHdSD*Cr9!uxnVSt_8ja=Z^1n6Fqxp|M9v9 zc&(pG?X~M1H@HYQWWJtfE*9J2m@8UDB4tnmd%5bTd&!1=>buO>HO};(ruXNs%>HcX zjIG>k=1t{`cK5ou{}L&wELfAKR=@v!#{y0@>1A}|n~L&SSI|_FXQO7M4mb;q{i5*y zH+h2e$1lkb$ARtLK{%0JfF4*0&)M~`oBAuUER~YdJ!7&J*Ib+xaSG~FzgyORor3wR|-#rB(ywUDpGp{N=4e0 z#x^6(`hl*exfdhrmB7gL#KJ1i+F7`t>lvmmC zVVmzhaOX9TK?j%_IAjPAb>3=nNkp?`adsA}TIPBXt+%nJgf%5N`MaBYKi%VIvt{{f!XgD<-6Tw}km^1H`tpyR3bBUH4* zf|hM;&-NJ8r+&Iu zfp(84X0|UDQiQXF-qAKc7IGU!Y+(%6smd>wIW6H3Z||gZigXz@!qLT%45^>WK@=rT zjFAKWO?B`b(__#k7wC^p*zx~sVQ_>P>N=ss?8}4&PAM6)$5i(z^3&yWdF;3b$=Ywb zo-C^=G{3*k61CoDvyLvhwT7C&L(Po|rD3iC+CqMLkbXNX_+YRvdXrYu{La(f(JnpPSCq&B*vZ1S@Xlhi4*hi+bESh-3e{E_C zK!WTKZZYIPe20&5-8wIU{FPQ?L%CZ9F?EiRpXu(@+c5n%J8>7uG()0L*HI+!p{~Ou zCi9ihqFo8O4b%5}Kl$@%B=(Do5HX&*-Lc^k@;|+-~mA;9RS@0K0RJklpf%` zELZ(>-xS{yKl@4SC;5El@SNP*p9_^;#VIRXc>aS4F5FYa!i6r4&<69#iA!+d;_Lrg zE~J6`bI=28Zd2_i#*TUW5!^YaynUo@%^`2!L$~IPw^!9Y$C`s|H(zDzGhE2nPKH$j&iPmcAnO8W`#ir zYH1=)*I=E%TfmarNzsOxm;iN|cO~|mxW4@99SyFfZB{gZ7K#Qs30aF%;X!K6J!)0D zPZwM~BpD%y<~&i5xyL)h(^}J;d6Kv0; z?iYFJ`<1dY(?fqBw7>Udx@Lkx?o;iI`*AYJi8^pZ+khW$2ZGqiAUY6)wNUOr5Kac+ zz>%{YFdMg}^3y3=eC_mKn10|E1(k#@=?ujcqX|rjh&@80*~H-TwWg~Qu?Tw-|H|rCi-)q;BsWa## zj*V!Pj*DX=enxAUdifh3eClcO_1y0RCpZYvl{F4@^AIVZJV<{u%lxTwIbD&}=7tYZ zjqxrApnTW5QUJS8H>vU=7VywvuB+kJ$F;*$V*wh!8iz7%LW!EZZkGZm^p7kf(419( zrkx#ah-TOa1p_?sq0zs-u0|Sdy$WSN_g}oYZf^AS4jS9`tT=PAIMk1DCLNTwSzF^h za7t~mqM~KI%kjTr-}JiWhUXD!0Tsi{I4%#B{%eqeK> zD}II;k25h&$nW@Jy-s*L#OE_t^@`F6uep5)uU!E<%X`Veq{D|;Te528QcDb~`o&z0 z2W94O9pS`V2}y(eL=F2FUtuWGYmLKdgUVc|xUIQDVTLC~TOXSVD$jFYY*)0veW?;K zPc)RX%h4o#4XSsWzc0nxgyoT2=sx5m>#(6#%R1^+rj2IiT5C9_uh!tm)&U2z#+nDp z=j%+5^;#3kEI@3U)4Tk{>aweTYIEFr{eG%j^k>}KM&td27*aIHv}*ClAkNkIYV^aOfYYsDhJNk6;9LFh zDIF#PBHi~L=A;{D5etIID#JpRH8C`uBe{Osz)=#d<_{VSOGb-^1iCAMpl|j-|NZg7 z@vX>Wd@>&UmLLu_LOycy{ETxrW|Oa@ikw>it~*xCEEe#dD7!bVE=V0VU7Ca=Dtp@} za#9Z9jUznV+s+OfnpPSfOX4<)4o_p2-!f$c#fiG6Uz_m96P~%c*J}GCKM;MWuJ88f zz&pV4&W7WHb5zn^WYo{M9qybXv)ky`1%_~crS~jp)lWU?W$xDQS0wINChnv79yQ#{ zy&+FCW^t;{z0-}0my3W+;y&JM6g7uTTO0PdH8G~YSW2~DG4WnCbKLd;aV%C8@|D#8 zP`M;&luu1_hOHDBxE=yc<(cUSn$V8R+lP(l)i%3+Gieg9wnY7=$rga19H}1**h;?1 zCE7El0-#we)0rGSDq=Fj^w zoBQrpqq4%>RNWa$P~xp8HN{t^&4D3YIg&iTNfo5(G4zoW*>|ZzkPX0pbaccRY9$4tY1@9 zE1*wsK$pOK!Q_7S1~BSO2DmZtDv!RR7V+r$4M8>==ghX0E$Ku!(*>xr=%?TS8+YG) zEX>uV^9h#9>9GFj>&&slrF}s9Eq9k2=??u>YL@qg9PU@d_fkRJXBPJK@Xas9eCq~t zF8-(soU4rDTxFUYowtQ^w(r&3nTu5$Gi`dVBRd0SGdAe^t@= zt0$LmnNzITcuiZmxf4c(Y>gzw zG*(Vt^0mHZv}$w&SSh3odMuIXc%E{SQZKqVE~Tl~BCV?|?z5Gq7F^Y6NmRH^?3-jM zx)+hc^|)HH!4y8mQ%lZAc*dN(!(Ie~KZV!hz}@-8-!8%k>+knpr0 zMK$KwLhb;4==-idjAME4vE}-z%@Z1PN0tX8pW_SLq<7!Mo9q()5Hlb7FfX&=#pU{N zl6@El@9N7f?n{NfWZahueW6cKn_b5)o?L)>zP-Y=_LSLipCV=K8}BQk+b!M{+ii?7 z=d=GvnyT_mT`aHh^YlP9cnL#JE7t|7zn`c00@yBKBQ$JaqS%MqW)$Z?j=Q;r z&YN>JWz3B(Mi`@$d@=`~F}h>u{O{>1XG_u!ADC8= zK1d-#=Vw_4;J`I7R*Y8Lwq~(bx5ASd4k3ePj!BQu-~0T;|H4tr<__|SZ~XkkclyLq zcc|dhx-(e*MI)#Tq{Q?*9wAP++FTPIa<&{i^$y8WCmyILqC_ah zDgJD3sopi@uk^duiP!ZL7mMTdV>^JAm3yHo-1M48RG~gKhLw%Y!+GrqqOBquH9JpN zg@Fd?3)CN`>F#EE%pUb`UYjDV7?9Yyd47B5W6hjq9J7kzl^6Y zyxhr&xVvv9gLNl6NKY|HoqHyTotL%AAdt#DHc4~``YrPxk8OR-;YGjYs*y!yYS~Sh zHe=@UH)u?FJ+9&0s2iV2QM9C|hyORoTUxW?8i#jXApbJKS!m5y2G4V%%X8A8c{Uy- zPxQ+l;B|k>7ulrx;;`t_)U z=+h(gqD|5}U7gIrB(}X57qPBFB)ZXY+dFsEy(n=>-n_ zntqmzxm$0j9{Yu^$)8Nu%BjLauW96LNnOD1htAfB&bG~ zaEeagmY@RTvivm#gC^zw%q%CUO4+w^ZglC8L9moyp}EnigQSQyz6MtPy2W@C{Mj`u ztA<&BZA?mNUsW$s=k9W2KlIn?^i263T=nC&)8FcKPvX8cz7Hvvdt<<359cOk*VY8P zUc&5j*CB8-TKovbjoUhgZJ+?XDq-14--ucE#Sb0Jepjw9ny5_mQBAUj?fcbWT@~}o z!t_t-iX3Wr%~cy)R?49o;e#f2JfXrD5MS$j@4-D~$eev5kJ4Q@5#Eql81-Cc_LuY~ zIPv+_>I(=Xf^I&D>kr)}y}tc)M6UR|q#S-wtK;(%5%7^^1|~K#E(Eh(5l!*S;i}9A z#+?FqRh@$0oas6Rms^n*`=%8R$JsDj!}bn1Jq8&-H=BcR7C5Xtphif+ESgSk8&Qf3 zBZh6~y+X~Q5C`p~8d>lbf;{;2FULN8b9vW>*`O{Mv!CF>Yky8n%Mk~z>e?_ExgBq_ zK?gql;pV7cWnV90n(wFoLwct9o}f2Ns0sJAI^tzEY%SM^E$sv9$-X?}zEtST^Sp_N zt_VEi(=SD+%!Ozc@usp2uGZ`yp3f1xsIj=?p)DI!_jmawYO$X=F75fJBMadICOYWA z?84`u)4Ao^%UwygtyyVP9EdD%QsP-9Nqc$)>RdS=>;W%7Lt0M~1&?%E%jptuog3Zs z=}Xk%#ct+eNh4!LFhHzVqTgI9AY~Bg{MpB?(*taOqme&Njtem<&!;cM8pXL~t4ASq}rScj<*NCj$vGH(I@R;M?fd5FLBt=d8EUc-p1J;}Dp02&FTgh6FRnFShIgj$#eAC9Dvm9or2F&Vh^F#JX_jWS;4;i@r36m1Ahm;QmgmoKn&oz>T(4QQRckQjLB5z~LGOIszD`54+^Y1b z30sR9YnH2c8Ecler81Yqnx)NsG0pN5_oV_1)9Qp~@rXdVv?kjd?cm#sa=|1?xwNO8 zaxuhNKykVj<`mqwZ$IRj8&zL!$X2JK`2Fbkdl5ZYB!}LYhR4;-b9vQ`iKcz*{0*24 zC&tED+-{v&0%^QaESjh_gWYTe+I6ZCbeoqn6CrrZE`OIO?&sowBnRS(I$l zlIg3YpNtJ=E*5vNekI*euD%>0CieFqz9ySnn_cwIhK=F4brTk?K5WA5_t#C>b@hZH z?^}O%LasMEe1)nv_>qIdhh&E@%7&Af-nOK?uzT*VZ*aK4p*A`=VR)~y!cL9D>Y{z5 zYQWM05d#&G#L^xQ#wtRslm55vXd^MhQA;mulZ|z}b$kJN^J-({B}1Vfeo{bQJo5%; zFY9dVpVVA7FvDx)AGHW`@_))hGt8Ry zYsP60#LejP@H+QHUG`Ob30{Xot&jr3Trvx z%HOWVj7RpMw5*!)M$v4)+o z%6XP<&m7|(CLE|2bejpkD9$SOZ!0>{ECH-Xn(B?_5a-#-m^i+pP!Zkb-F^o1gY+(6 zGtNOI9p}uAe*Q0+l5^nJ*|zfoghi!$CR%oZcK%Res)F~ERedv26%7>=Y&nGFcOj2i z`-VKmv>T*5@`rZ|-I3g>^2Ti8{*-#(7okbZ@@aD|;-JAeps{3qZ_bVW_0J^S(H)mV zpEKaU{`5I}0Db)AOHkXNNH=rjg<8KJA{~E9Or#Zmbwv8qND>nX3?U%tqqh+aXnaf| z)?4oBCKcMAjraLX(6P6zy?|WkC`k_{&~jJM25~_l-8{Xlh~8N3)q;q5{8x>b?3&|< zX>&K{Mz4I3#Egk*k)ofqL82GbNGNKdErY(uLE+X#4)SFE^12t9Ib&#>8_g&weQtDa z$#b-GH*~m2bclaN`)=}byiD2bRUI-d^qchuLF+V}G=UPPYu#j~poxJWCMxOURyzItET=}wRmW7BZWdNSmRhUjSLsRfdDnJ>fq`%^^CO!qKbyX#&DgyO+H0HI)hH2Xbp0UsjOvA`L&p}t{U zqnLjL0%J{WYRh)HmzHNaSm|_GW|fnr9MPyXR#D$O+Ns2f=xx7bs8c0SL9de2!&%Bz zKiw~j@A2Ra@iP~T9yS}%O0@7d*s6*ajv@=df-Xft9FpzEghxp~5oz!f5R3S`TkLVxC8~anIO+jb81U9|jb&XV9xw9^SEXPGZ z-OG21@0%0%Es6W7@qJjmHQN!3s^&M4sJ5^eA z{hbLgO&%G4UtD9P&&h{W*hnX(n;!HXyhx?{l{`wu@zxMx%4tcCUlt) z3sr4FuK9Bch9l&HKo|!7F$?(dFsC)4m7LmMRSe-E5a$H?hdSmS)EY$97fukLPHt9kuGxbpMM^U6AH&*CD^fjKEcU7$_RDpge!lq?m>L7K0@aA8c z_su$I&6eo;nQ#MIg$3cXNg362$yJNSt%MVipjmdWL(+tSeX@-`=UL;-u8dHD>yz}y z{!{4l0@tJB3m2s(}O~AFOTjAZLEgP(>I=2+__d3i!;4sf77f-7B!DV3n zpkeD?R3^jxGL;6lg);qgUz@mZjqjmC2loT1@DkHf-SqA`J_zZ(R8=jwi6fLn*Zsv& zLFL6%SgHDq3a)u1J0oADK=-Rk3+0k|4BpZ_`xW!FP4(FDn~`+7=J&QW;AcaI;-XQA zWy_7FRQ1zfk`${*C8eq^afw0=($!OO9m3RSf0x`0c-?Cl=CJ+`q z^)6_k1D%@SfcUa5$zuO4HAa5#OtOSyTHofh<6-hiC_gFUJxPK{ONrAeqOx}q1bM&{ z#C_JxQA9jzTz9Qqosc2b95F&{Qqs&+3z~_u{T~`+7>-Oh4R_mC0ajTSozj%m=1iyx zyjN{`Z>B>G-UH?6A#9nHdX8rL$GYe87poK3ue~b^?JWq?HppDeeBDobVM^l2sSJ|@ z(=Q0%%C`%7+AbDXl%Qjo+TKc(&}ok`ll;pEJRgCs@JN zC+dO>B8XZKS3Rdh5YuBURq9YK+MCzI;fu=K`jZ5$qpKu~$j(60q}H~nA?a1R{3oCX z)nmUwmT=^59LAkL)#eq*ftlm`DsV`&-I?-=y8Lu>_a(o%e3~5o!;`h34&H!;(JkiB znB${BgZRtYtJp^|pWQro@1aw!WHEoXP9P4d@B8{On(J{bM``B|)~hhRbiTS1v5pJl zK7&O1T@P6~bk4u{f!4pY({(wLJJ(|__Lsq9uO_-!|K;LcfSDy)igV{!%%dy)7k5pa zVinS~)4rN;2V1eC?0%VNG62Q_*E27YUiR`h^fBEih-arab6?>`{B4!E{_Lxgj zNciPAVVHVwuY_k!yUL<>ZcMnWCK_RS>sqA(DTusUUluJ&rfO30Vfx%;DiU$tPcl{3 zrCPFU|FYVXscesuFum)5vW`ops&{35<(|C^u4uO@3EXMhg&_U63FbaClZELC%+xV1 zGlXR;2*Ff7Yu`I;ecDm_PKU4`p0>KxAvCDG#S%AnD8}(Ob`_DY?9@h6M^M>iU$5(= z$x3jmPhe=t&DHCmvc;v5wNRQ9eHuebZmwPjm7`sn`94j`r!kb|=IV7&S>@6!@M#vZ z%Z7k4gyiPxwH}vQLnT`ChOMxBIq>^FwHmHR1Iwtawxr0HJ_nOpEo9T|ixc}X6%!F- zXSCUC+0*h6zSwb-?1MJU?oVT>H`|_7xCfSd^Y96~?qwF9#*%M#K#SZ1%f6@ivoN2v zP5E}vl*AuAHv5AiJ@baq-|>7(*rt|hb!O%*RlHP~=H+361FLU9HenG8A|HP6SiyogU|ss85#*l^U-G=E#=>9X!cru%h0A+?5S+;f8d z?7b!G|Jc$Yr4Q}$uOda}doVH0zH6zPT)+NW2W2oNtHJT(n@r8qNdr+pd_s+$%cE~! z=z3_bM)M__Xu$IJ(Nfdp>ZT|?2yIbaf|Pf9wz_$)vS+WHSaAs6nH8Vf>UIV_Q7h{1 ziAbpMjqO!Ir*z%ql~1B@$Bh_7tIYR?f*sa9pFh_ei_};Cu%{Ipef{Kw{7yCIn`2m% z)`{-l&0)zp5_0pU*eayhs`OCoa<0443vBA|N1!>GnDn=8T>C5+w6L;sL$cvT76Iy) z{}G>G7>RKR)eMK3?xQIysQe)%ORS7*!fDN-=N76ZcXYF;?L=ow6Q|d#C2TvWRdDQ` z(7sP*;h_zk>!!BvmRWcy2gt5#YiB>=OE<8)Ex6l|yVgwCtLzc2trare*Hc7h;kLGy z>{WJuvfE2`rh9OE$+o$N4LjE$ci(akLp#?@%XClSAsd_k!}uxO!L+QxPQAu#51V8) z23PdL7Z%X^bW0b=s^dF55l+5P(;%Ti?}-TtJ)q3QOzC8!X}iZeD>a|2n1Q!XlURb@ z^e0~tc@@7(X0~~01w=7Y8%(ZZH?}JD9|bX@YKw{MR9KGTTeO*~>)Ifw-pRh7Z{w=( zR_Hqu6oaw8gjuFUQy(3!LVno^Xkvg{EZy~b3{tPyHwG&BaGE|qXEl_9P!s?<@oD)5 z(vX3?38niq!}l;X_m4ifP8P$RbG^`?mS6rsxVJ+Q@JI!jKSCs{{AOm|;e9|uAjJpZs7Wf>?+dQzCAbE>$trlvv7{t0FB{KHRVH~ z#7dk*xMO)6DW_C%ZZg3RnIlf0kaB)mJ?Aj>Tk*Fos-8a;>AZ=K_DF;A~^ zY-xC`l{gt(taZ2;!;2vG^jPuAlorvsLP>HHTPSw?9AE4|4HN0ndJe09{`T%p%|Bzr zd@j@d0EhstszR|pF*a+nVkb{!x&=o7Pnv2y!oq5v)Y}Iuq9)w``nyhFTZ6?ag+%G4 zmPiiq|CS_jYFz5vqD}&Ud#P>x6iqO{GFIJ$znp34H4n+*Hver?zm?PN3~0Orxpl&e z8|&jHy80__nH&t!(X_(JYX{&GJS%}rsTEPreMb|eaw8Z-c&>TMjl{uaW{Yt&d zWoy{~zCpNe(oEws^u@~6zF%Q_@s;2^m#quZd%Hv$S=>g69HO+0`_cThHe~I(5AMCN zwPLa$@C#Obj=p6sP8wIDboVCG^#z)Ju;fu-E6eX`#V*QkW>?>@h-O-HXNB`GSr{Pw z+9$&R6RmOEafw#16mx{>n$r_*ZYgd@emSuOu_ntH4kw@>k|0(;*|lEoT?7o!3pREL zvxY4KhFmJOgjFd;qoulrsoXh29ib&XO1t^bD|DrjG9&`xyS?b*d(j1`yV#fE!9&sI z%i9kywQG5|jBTZ>sQ}DNKa7ESH2+JDzK4~+TPuV>5mSBid>xRQ!}1G{ZiC0y*S8qi zjE_@kwgLP{^J8?yDRUm*LX)sUmzFw~R!MQH4$TJmYsRbG_z+X6k!?(BecLUW#o7kxH6pwG!n6qR^^>R?Ihp_sAThs-C^=~>R z!31$LEm5vKNS`rA+}>OcBaap%R~T-!O6|W8=t6!m@;l}_xz-ZTfFI)(8Z)+1R~D@j zJ;pXM>dJfZe^g5!c<`=&hwvG#J3}0UA~5zb6!vtA9c5@9F4fHDP26i~CgV-a8@53A z;mD&SA>*K7(f1n@$SAXftRmDEWK^Cw+9LzAvcHwg$b)@s(#S{kLH511L7M&#=J_*- zY2TY0o@l7RdmA}(Yl+uEPIZCHvS|OgiGFK?uhO;fYHJ5Vv%=a#t#88mtT@AsGdItI zmoS|{3S(jU{GJ`PXyh8@3M)^pliHS>J@g#ZHp0}QiuIBE&iFn|y}gxSle6sS&Pvy3 zLzmtWWckek*5wkuJ3YKAQBvKcXAs|gp`9}RS!i4^9XajrC@^8FTU*j=Nbd7YnbJNWvuL?|J*PCWj?~1s7x$9q2UgPL*9H2zu#3nwn4=id+VC2R% z>Ascb<^N~_A$Yy;5gbRa*kNFar& z2k-W+w^Ujglb3Mydb*g#!-=|#$Jbj|>bxHg=wg1;UKK3Pu2*}?P<>o@+{JW-5A0%A zuUJq6=b)e09hDG~GKol-4sPY*)*1F5B960lhNhq!jN{xo!xdryvpHh2lRta|j4R3t z9G1+hQrlnO((%IOmx4ZWk}8IWy;$l?-vU!!=$~a)kD@a>$LaKj5*$UnX7nlZpGtL$ zuOa!pmQ@PrO>?`vnDon<|EbsZk{feZQr0KNE~rC+2oNr^l4f<%&LFk$U}0iP2eQY? zl8G?qvV2)wtt@-gX4ScDeJgFeLc_s`lr#LP6ZTRUP&MFLR#CWlmNfuS7F~G%TcBgS zo6E3FpMauPO0V7;9xvtzuFSUvxc&m=SN4X3)_CE@NUJ>e@%)G`_G;z-Gt#zQSkb>SSTozAWTg( z&k$*$#=f6Nmn?GgIeiz>Hk(bfaal>7w0EiiO^8sBe;!m^*`Mtn^1o0VTOW~V?Fwb$ z_z6Oe<{b=l_HWyNP=~Yv-KC!eTK*qpUjk?4*#18)CsR7kpkY$OU}&;VsZ4|u;gl(p z?VUH%@9Vy={krb;!Sl`uX~pfV0{Wfcw zu1?nVT7k1Q-K==n7eC;RQX32)A8|2Y*HU4Zog+hD)hvJOWK-;+?{QaUZ6g{%7)EyT z(aYp9odqrph^V}Bpp9g;_sKp5-^6P8Jj#Rkf!zWRX+_R7 z#d;;&dNE6+No=6O_di(zTnot}_x?;Y0uKO>cPk%b2YCV%!QCqPl^y==CPf&6B-$e* zFP178cmkRqy`?Dl{&f3Z0wz2f`-^=LC(ZbX20VG|X-FT>v|u8wry-a}_4A%Ho3RVo zt{eFBjbu8)_es^4`BJKWo|U_eVBIW-Sm!yna#ed5}|MlpGKG-^7*NTHZFKag|eojpZ>sgC#9 zGyji{*9~r*!Uo9nm4n%#^}ElexYfV);R7Hz2Gz;7jcUt;Qu(#ifAcLUq$U>0EEu)d z3#KyWV79=RE&QgVz#ra145m18Z^8B|nyP;L6mCxtM;Jt4Gc#t>H2L5PJM}YfsEAlIx;Ji4IPQJ&x;=zrnMe7f?f8v6B+AH^vTIsIe|dPsp%-n z2|Ij=svA7-cH$5J7p42^MCD1G;_pkj8$4e6VDXod+hL-L#gnLVK;ea`=i?Un zierP>0aQcm9(_B(w~i$0r6s@$7Kv;&;nA$M9zu1dsfu2Vv8}Oz_y@h##rl1XOApq? zy6I0B{R!$%2mNXJik;$ECty&uJ>E)#cvU3!NrlVxHB7!ykzz*?(k6W2MAa>l&R8P6 zs-J(EtQtvFUD8_BMqkyEMAhl7RUPQ7TAHXjs%utwTEzB1PRF*a=lPHGc)kEnzWv2KPlwC1 zH-@(Vqc@ekd=AIwXk2~ARwlR!)rmY=doJc*BJthxL;rr}w>ZkzS2#y{OH_Y|k!;J~C9t};TA?nq8|KmSo3lhI}SpNlF z5{+2u`{1gjJ{l;IC;=ZaXFv53$$^R)J41UcP~o9=o_9A9IM={l`!5)Oy?pqb-#llW zXX4iKhKH$Q=wbHKi~3%;Q=zN`cespPHHcwBnsm>wy5*jY!(O5_JQrA&f+Qimg%j`Wsn`1qtF(wg}Y6obHyRmMO#*i@MnD+q`3}hl(ljfwf8Z&=^v+6rN z65NSJvPT+{t+hE4ZJKK>z3+Mi0O_*@*~A<9)T81+ zBfAE)J^(TC_e=a3;qpGvSCPg)_-A#^vFg8QbyvOF_dB@>Mo0R$bF;U9W8scN}72 z?GiuuxgI#|0A96{ak4ZMt1wyArXt!}n0f$Zkb{K4ffLlIni$$QjQ21gmbHt@;Po)4 z=k$RSfMljuFt|JV%k^Ti0{7e3ozwXm*VLZ`EFy?P(JD>V)}*Vp3l8X zRRmey4lXV9-5XUhzN<6>qdw$dR{DSZKDYI}W zL~t`~%^&Uk@t*m}MUVv;IuhML7U)ZkZeYE8S!E9zz8QZKolk;Vu&t16D`HxqXZ9f* zh=ns?JC~Ugfkb?gAA@ARA^ISxeXBVU8Z4&Na5*blhG48>n-L!*B2Lx*7Gu^#^%7Ps zO{P37MS?sW2XA-zJQ0X+s0>_+0W7`nH!41$w4-6O2dC2)#nQG zu$(-^KjU!b2x3iD$VFqliK4*EC)%|dSGG+v@w|LD9Rxw2nD&4QsAw@%)D1X^+BOp) z6{hb_0MKMIzzvK@0N8E9XbtN}763AqWT%+fCAYM@flrFb4={;SFPV%su6G<*Jfn;h zQO4P|4C550Uo4KWj0W|(a%4~tQzYSl6_+I zcgJ#R7KWR+#3WSrG~WUJFcB=pA2Lf+CJ%04O+SypV&x=1&_Nm83i&k$a|Cb6&tp>{ zUzn2&4D5!Jh#6*_B_Eo}3>@R96HSk-ucv@M!?gT|a0j z`dM39M8^Q0z92kBo)gt4q^a^Ifw;|%6Eakz!#EL*-NnY7zEk-F7YanMW@(PRD7oJ| zPr6xLI|T?!LWzE;*)GG^_v4wl_IoR4RjbB3y}mU1?cMfKTR@1X^iXz1mbrjde(O47Cu8gjb8bGNih0!n%Ahct-qRTR1iI*vip1H5b=%b;FnESnfwBg)ngV0vY z0M9dP*ueonb(=W6a;4~an3Kg}w2GJ+n!2EFWo1^QxeYlwH3(VBqCy!g0T4#Sp(+HH zWzO62xiAniM`jxTAK`ngjL&a0#VMe;KMz7%<8z{E{8|sX)ASF$w5Dxamnjo=p>2=v z<1yi|r+rKyzaWeW)HNp%>c&~CDbznueF6yzqfqoQiumjVPCbQQBG`{VLbH(jZC~E? zGYW$Naz*ts672$jgoB>ihYlK@#b0bRr>E33I|hLX?NoEq=-;CB7g1jdsV}fxw&{H> z2KR>nF|%!{Raj^MF-lt5tZa|&-ZS-jU0AN)j2BsXwOe*Gbnm zOaY?IG!i5Ye@W*kP@nGuFAo&nJk6gZZ+7oP-kgi!0C|J!Z59>5c27`{)qX=0dulvIm;O1XGCH=p%@S>(X~L3Ycvb|+W|1Uje4+Z+q(We(;8~2^fCG1# z3r1<(u~Isa8PwQyc?c{EICaT+CbUvcwj#uMlTCbwelSyW2F4YfAmCMFlCG7B&hHw? zY0!j%Sh>MT+q!{UU_5L+3zEq&oo>-hH?&CfO^fV5zv>A#SOSs3AeU9{#q(W*iRuw2 z90*k3ueu5!8OP3$fCeHoR=~#CYN0#;S`dTOEj3W5z_tJ8LI9+PlmNQGOycT4wfh`) zouv#&r#;M5vsHH>?n7x?;u9mdl<_S{O9=7Whd;KyS!6(lxJB?NV(f_M{X^F#H=OGkD2HEh_b%6_3b2|B7S ze;g<35~|;hDxxx>x(2C@h(HBuk49w)HiEaJKPB=2u0tWM?K2HuI?>Ud64ow1`< zv_sSa`VjjK+Q)Yw!QNA%Ox%g^gg&H~n6)QDiw9XPPR0kfEW;vFpG5Bk{zz7idYYnaoG2owe9dWA^W5JRYM@G&(V8AG_7^24JV zLzeL@1;z#|`I$UX(2UMBc zoyRK!MsraB#w2(Qc{N5{JME^aAL|d{_PAelh6)D%_O`z?(3LH7-@vP1qO~2 z&eU5Hn5s>>_pcy0Rt$~&VyY!9SE5>0ISp(0p8lc*d?zYe5#jx*1qkn4v}T8_h3DD6 zXCcJCZ}z=k>OFh%a3a+jnsNT{M=Jo=Zb^fHao(buLeQQ_PYqh&UX=#!B+aPO>*7PTBn8iKv3VZj82-B@p#jkeDs7** zro2gFQ^nPSFFC2;{PNl^x5;`e;f6QNo&C~2RM$pUwmB{04Cf)T(A^90HP;HB&uhk| zHoZ7DJFgBJw;a=%u)Jr#rI3(FQri%FGR*W#6ILR#8^O0n11Kv0cp_NI_5>I(R$ zFxrSC>nXgEMmynMvTsYJn~L~ZhbgQSJq3$_f&4wWfQhL3w*981^dTzm2ER@AG0E4* zq5eLc+)+}5qfFewjAK&lwNa#6n&tF88>P6EK8O8|mC`xZ2UX+@asqu=3>lFZL*3zp zry^sl=l5_2M+Y(!x^&E7xe&j4a5NkqauG>Yvw-i-mFy33??7)}mubOn`8q&Zt^doFZJ1OLP>wi)~d4@x+{ z#%IvS9cns>xSpx}CJt>jnIV^0cjDsaOZH*&o=gKU(g;pxn2wf4tpU#he_LkVT5PpE?X$IcVv z$4cSv=s3;G+2qbn<-J*MJHYoR4#uA;4d7jfRa}*<;%Ze!v@OBP$YTjjtL&BZpxj{! zzl|=G{hap=x+$H$#sn;_1JSb74!(s(5I5ZYqZeODgXyuT@=Rn2h|*~n$w2%X^KllA z`Uc)9KH@!P41|`=2a{4TJ4o`y;9CbGrE&vLHsRunN76AB#ZSfb1RtiDQd04OlbG{Q zA=F$tLvM=6zC?Q%gdSoIawbSmE_nQIrZ%Q_vgVN_JN9WbYmqMPtYFDj%#Nqn*I=g_ zNh%gu-4m|4l{4n!tU1sg%$z6xKqE-!X>C{;+0mX~ByTg|3Ldr{*k-_uJa#y+?SLz* zpk@Qx4XCI*5`5WX6oRuG-0cQhj9g1@l^HwU$aL;@td70OozQOJz%qO5+>EXo$;7EN zk-jDPhd<#=`ztoeol^XpTUyWQsC%havmW?LKaa45&W8{ObdJntNZ83eoD~s4Zj%Zp zBU195D(uV+jF~{P>CC9QLiUlCYy@nckb}Cq!KUk2jl*|V+XL;G4yY!y3|hjC&EUkbyXaq#_Tpl(#Us`oNJ)GVWY+R4tZwk+UALh)#a_gK zxtOf9(xs!yH22F#T?3<`vEi>g&nX!bABrLYw6&zHUdV&m23ol z%=AcwY4BiTFUb)X=(rG;p@jWX<->@26DyW#DNU}D)F_b^z2(8gGNdlBrbd`&l1Z4R zM6v1HDB!>HF$q68dxkIMJVO6%vrSCZN|ZsC%nyPkH-q$A)=zQ2jUh2aa?P z4ArmIKX9yjP^kVL{6Tz?R>a#&O;RDv;rc z9nYEGvm2PaUved}RE^@*m^Z*cpE(=|5S9Zl!oj7zd3R40EJZ(n9Yac52RcBXn8ObE zK+a~Eo?X)Ceri~bmK*r%*+#UBSbmN4mKu9^yGi*c7Y2KiT&nSP35_pjXKWB8R(sD( zF8B`USFmCHEuG?T*5Thx{KenRtjE+Fd`ngQm8G8IBlQ-p0##DartzDFcNymTdu{41 zHRuJ?Qg0%t$>~$m5=vY3PqI&2RhVWpmJBcWBg5{ij~%8rR;kE0-8cW)kQPVXqNd?E*r9>O;|*VvHbUb>?#ff#DJ41z=`Ib zb_i+ddn|uAYS9VPH76z~OtUFQ>B*9;A5igLih>4Oda#+`CjN-~2S!Mv0GS-< ziMmlfn7!WnMv^@;E4GT(h;39SlY9&wMc1rA%!~qP?%6tFoYYs@k2IRPSGy6s7zxxd z=q@2%qPcpm7*|SAM}HAr6n@$HPK0MfOlDVI_wjBw0bOFod1PRi5ghEMeRHy8sx*PY z6!7J3;TU~Ya0}U`q57+Bk@mZe=b6vXlS@d%2Hf0jpOC{$z$`o_+L6o4&Nl4LFsEV4 zJ>p337)93pf;Km@8@z&qc|;<*RJujR#1M>0I@K{)9T^Vo05MG1inBdpk{W}{8b(uQ z5haTh@d*9q--n@xO7<`Yd;8{*=h&myGZLLG>_sRdR@%+QBV>xj>X^?AtORVh|bcJ%?KG`F$~S#u}5qMdqCg5 z_5AKz=`)DVzoWVq^N~c=1Wb*EsbC(&2KXPJXX~Rp&-0!gxh9WBTh8348ShhbpO3K9 zRS$sLp#iOu0i_02@vFJdn8}*^5MGlCIiCSEBW^MxWSJAEBoY}ICVdgS4-unG;EKE% zM>}Zp)D!DrW7zhVuQ|Vyx;_Xop_ZcPXmWSrPO7~Li48%q8oVTDbv1xd3 z45`sBlnC*N7p22xVe#7>+^iEE&x6C`=h3A|g+R39d-SF_hLrlB>g;AZz(ZDWjc0T|=CziL@UH>W2+ zu?!!G{V9C#Mplf4kdOL8JY|^%tdljGm5rJliH=QJMAgGJbi!e*M#Dpl+JmmpQ=~`* z3&YGn>c1pTKoC5}-2}tK^zU^G@G?}VpYOmGQf}@e-MO}mZ_Z6bNv~z#S0$pmxDtuJ zOPMLWDJi8oI#d&FY~lm{V`Xr|&Tx1PX<~^RTsV+|197gGnJ^Z;{wbMwj;a7m++y$M zb^$VR2b&~HMQ+#8@|MiUzb&y#`0VCx>4qBkT4Zhv53yo>`6-^0ILA)sTdz?kQceU+ z&u{1lsoT`O7*5H^K((28MwzyH!G(5`g|`{zG}wnPfj|9@Rzv~+;5A_`pQ;J`{;gCr z%kto89>?|;IvSsU8RUK6^ig_|U3}jZ#H!0fu4x%0omR-0U0vmrQTM)>fGO zZ7$cejW?{90Xn8$s@C8@sV zD(t9LUsFt-hpf?9s-p?sPDevuVL4qOu7H_sA)m6$x=9IESDlqoHBYN1gz|i{W@Qex z`WrzT$pZMmf?aZvalQJOz5}xjEuHDq8!45&vflvuX!p)Yuu4LLA067kTJ@^BL zGRT2$@uOhO1i`GFg^4Osj(LVGEFxs#H8$#HwMiDg<9iespMGGNNmZ5jvn@yxH_jFh zH!FVze-VG=7qMau{uXZFnWIYY+5dj2_uk3g-j^%zyu-x}9DjD6n1R`VZ(u1kNH~_F z1sL&XbMd1Q`?0Nz*u1?dRDS}oq4Osi@+k(cza!xAZzeX#nIcggiDa3c_v&nb-1I-A zGpp!LUlDI#tal9sjP;X8s8hDwE^M{TPb}ItWKxekw+r{(OhnO@IYut3#Tb__aB1E_ zY(){mfPvxRRjk-XWb^<{^)5*k5|Dw0=0>A{V!gbr236F;6U=8y`LapPB+zeuX+&MINZiB5hNG_4(M;RW-Wa0H-Pan9( zzQ^|En2+qDns*|k+jsU)J>;bxj1J(XshW&vhxvJlOz>GWG`!C+15Wb>GLRa(qyG8w zkLlle`NxJD%|F@+1|EkIHlVd(M6lk=tQ%q5q|dBBHPJScYv`8D6tNQsUl;>P@Eud( zJpO`VGX#mLx{(A*p&WjpMqZOrx9^g7*%cWu$AUA!9vDG)Zr~~@^wU`C$D<4b%iZ#i z0Q@AoH{~^5Bz61lIGC>!lNpx{vF^!3mfy0OYOkWurCctfo!Btd=5a~fCC>vb%1|#! zu$Q?xBP6Udgx)N!7x|5gW75J0j&@2?ph~6|}JBom8Hla2CM>*}#N0fVVZctKe!iFjt6fyo| zbrH9H&hp+Py)4BuU4HG76+XW9#vWiV#bgah@TfFQrKrZBCd2Gqrzxh^&@dZOj}B%L zSB7#{3nPUj$&C^zGeHkv-SX-Xg-c)}t&W@Kkp zL+Fn#SpnZI(G&SamJE<)2(!4l43SpLE0?c$X(*(y9{uw_K2tUL9~E}J{7%xzGdFwd zrF0o^u4Fm(-~eZ@4)ZF!rA10Sr%7g*fBv~aFezlFQ{YEZ#X*N*x@5wAHM54~k;i50Sqy;ONJm~&hXP{I!MB#WH6pv>A53dnG<0`0X}A${NOpp=e1Iia}XsW&NvX|p-JgxF@ENlFL9GV5>ODv zEfWE`N;CW2HkgTYgU{7q+5cWYgUzf4%@XT$Ga7_SXGoTK+=iN@Wj0tY6}B*f0iCeL zLX;Ajve_Y~FLxn`!NHPZvjh=K7gg5@j_N}Po_#%kL{uVLhcgXM_61TH9EzV_&9Q4O zv??{|C!?u=VrWcfIP??vw^x!6yr+Ox0@&UHoBMW#uwd3Ln6Yn^jVz;XZOtzGem9yM z)YM?$6o8GVt9;1e8}rePYKnPI(1~%D&1#T40{J1f)kjYTdP*!8;gCpaS`=&Jt<;J| zA1x`T!p7fa95Dm_(9@LMo{yv}r46kZyN4^ZZlLWFCJ{DIfXp&X;R(bF5x8}@GQd?~ z&S7*R6S;8c!Nsxuc-3oLthcQB+LVUV5@!`r6Ok1C>mPKs7`X})=xxo2dT(ciH={-= z#Fqc8`sayAzJ$r)Z?IWz1occq(z$(nZD3oQXq+!!00uZLAUhCWLzj}YVsws~GR}QV zqf5^tVqT*f27)JVVB$zUgrxGINXQTCh^?~mWpXKYFcEcw?XK5-h^)FRG5;vLOVN}Q zeEi#;#Eg5QAZFZ*$8&R%1c*>awBb0y3U$3)Z-B*9PNgLlPY>5Wbn$e5{X-W|0 zwo9FlF*ku-%<(;BjpGykAYdm(SBdbaqq0Vv4{62B*ki(eAw`ofJ==koEr~sjHFa}) z7KWW);~uxP@gdJkW1e~=BH>7=Jk|!F_mCBi6nWz+st29okqMU`MJ9>-XpBTRS<||}9;y&=~|8~A>Z`oV8PQ&$SbrPGqA1#WjD%>n>@5M3Y?N`)n6aH3sl5{@yKPT7U_prV}jS&p?m zdcsOb#H{TMcCAu&rSr>vKe&wgXYZSU^I(F>|L91Vbn-tw``kOh=P8&yV1R}r^ z=){waYT)H?RUojKGruJeF0z8q+|nH8?Ga>8sN5&tbj0nxOi@qbyx?sVAezJ^2L6iJ zzt9dS!+=yiUuy3>!5i6wBmp+L&X+?K^sa$IK2Jp1B7jBMHjjp1Bsu7&3MW#3zCjJy zUSxslzzsU{=^aW4{(|@the-l=e?oUb=69>mX$;qPQx1~zFg&R|nGMio`_p!TAw#mv zoiZRm21C5Sn^e4F1b|3h^u7XmkDN>I6lKdpgVCN`QEQy|UdouG1Q-wzi1yhH8N z@9*FWBIq3*fa&r8q{2y!g8o3G&Y7%&U;+3gN|lsHFtE;Z-_Ervk8DqoLUSWIm`1DL zfVLNhbKpj?6BF{eP6XwYLNEG$)E)%(-;B>LIwdf4xlLO9Jv|S#7osj{H1Ca7{&?P% zrCg$Mf_Jk4C;J}$P`Xt09CP&kiH!=C7pPVnU=l9VSoL>nh zu~$~&Bsh0IfD%3cdq#Mj$`o&B-6l*DrB3dTpE3dBWi#&0g;@IT9$9i)p@R@N`@Eo45c~NR*mjx*F+<)l)CrlVSUioJpnO{Kt zDP)!E#C$ZSJk`*&Mzz+NN8(=VwMZ0LQ-+wE&fwW`evV-_e1#9e>uu1CV?NtIcWo!I%?v z-YWpUfe5(zv+RNIOmY*lm+X()4UN>5esc%fjz5!3=J15|lT82mN&4T2+1ozStVhRe z2SE0|MHb(qw445SivEuIXDj(N)hkyhSbyYCq7PuJgu9U-gGn@Sc%qCWF;F?_JIxi+ z>zEhXgSIK@`N44vQfd2rWRHxR3nyo(3osN6hr+iWicZ7@c>9pd$R%3^CkR#ihVBdj z1XCh6+r5kV3{(grET@iSndOfsoMzQkRByZ&KO+6oFz7Mez*zzcBXO-K$TFd^N?ZBCPZmgzIOR13IF*5Pz2JfAf2ddya_P3j11?d7O_`@3FZh~I zC`eoqF2Ey*cwGRhMzW`}NR&qcM%-yrK+iW4+bmY+Lk=Iz;wu$HWD7U3eb{0d?vJP4 zB}U1EU?ZA15cfV?2!U#_Fzw5uYCkDK_widrQbKA#UP8-s^AI#kS@8X4?YJP82Tx)y zY71kWiB-dd%}}85VNeqIB3#e(N}P&j=RQS{C5#xbI*_Ic*m5U%#=S zl@xmjO?-@Gr{0g{28!x+CdNGctzskWN6-oGznvwZjJyjImb~MGIc6o+2Y?*>K_d5u zQbI@02KXs(Q@vJ0c)X+`x;w;hcAx#w)F8NRXsv`Txc)_9jJdq+C0}e}?`R^v!kpU% zj0o=>k51KiRLXc%BKzs|9)?cXHp{?A=i~;L+{mw7;edW8R$tPLf{dyI;kEIVt6wu9 z`*D~@5Cx&NB=y`49O-E<31&@I7Ce}f-}eXx74UMBgxY}(to0mF=H?#R!G1;RoNs)r zgvS+|V&stc&$M)}k3^BVR|?m97n3mvF-yXQ#MTLJ{ZNYavr$XJMSKg=Hr{Y>h9)lb z0)iz9%o9Iqci}jeFzFtoJ%$-4QSzAOgk1DtwzjNmi9M9?`<}w3=*yTB)BL9!cxSgf zh!Ku)G_EV5{NY-H+e^7+Oc;{lNX=w)5})O@&EJ&vLlb4|MB4p*ff=vRFQSi7q7Sef z;tn3w9TAi(ZvPfXntdq$c5_!(Q{MP++yK6gE~pxgORu~ynvENT@9qU3UqyC~$OE?z zz#LK@H1d&u5Nq+5auk9ix>|cJpIYacKafU@Tk-WRH?XJN3<1mCSvL-SPjw@YaH1Q~ z2#Nr}1=I}~Q|_Mat!@^j@NXgKl7 zGJ9^sj@z-4t4sR`TX>&oqLRYlReZ9!@K?~8gF3D1LulfUaHh~{7|uxgbN)kmogu)N z12%prQ8V+ifTau|;HSnOqcmcS*Iaox2S+&TJmJ^Xd-o58>SbFkcfZ%N?I>;^?z`Lh zaB%(KtrC{$IA+4HV;|deO4Z(M0V#j*(hFE+ZB<)1bT|0Xl~h1W5ZMM(C&?GRthrwS zS*l8bb(gmBr}UGei6JHg(Xt{w1$WfPA0rCb$zDZ9Mc{m|v2G zK_=l)3EG#Wj@%wssCy+g`E>5seAT&#D~{ZT+<9o3hS?6k=DUBxFwr^a1n!uD+9dtL z@v8B%&fLoqi^N!I$J)gX*3o$r?=TnG`d-85AlG6#VG#*{EhU;JzCha7?nSCuGuxp%JelVS zB`JU4ZO`kB;h<<&=XK~!yb-=SlxocOKoKM+;}?sHr+=yQ%qZb>kfZ<;<*H9SCtuZV zmGCcG&pBfF$cl)w7bjkjLf=_Kp7W%{Y)KyMSRLgKZ5ggA68B-cqlW1TG`CY_@ z!uXVNo6xP-64V`m8^M3Wjo=un)qV*##!-5kt&+*MU@Dm-@VZjpmFeYbo@fg`CA;U5 z3}NW6@DuAAsqAGD%$5Q}5QN3=q@2;Ayej9b92Q3SlxI$E@B88rVkw6#(IJ^m@a4DZ zW^pGzA){@ryEr+=2|SDve3C8;S@~$b26;TgsMDFuik!eWtx|w0$FQVH8acTDq5b(^ zBWTY%Rb%%vL0cPGC2=?jPAUOL6W(2NI1ZFvi$qx{-Lhn}q(LarJJi4tHTt!Q_xzBC zx$z&mJ;Vy>{B;x(kd&pd!TxF&3zNAX5y>9sp>8LBA~0H6=vm9&fj-ZnwbOWKbz^3q~>Z+^ZcRKG$L zQ>hK+{$)rMb#}>f#c7~N0;y%2rKZiN%xUuYDQ5%bY~b^4%JC0frnA=;dP5; zcHH4V$Ig7?qu|(7QG(fjU<^$vcI2WHk)uqL$?X{DXYmkvGmspLP*n_-&5@Jj^tw8& z@WF+@$|?izdcQ8>S}cI5nK>pEt@&=>e0a((H>ZcW#xoL*o!<2VmX=z|5vby+Qn!>z35=Kqz$)2o!Jp=_Kr(z(sO(GTY7|E zFdJY05PP9bdYcpJxt3q8y$p*t)vd!qDGEi5-WHHUxv3eQ&0xnApd0+}`%Lz{$OKc$ zFqd8mzF-St3FO_1{&!F4|M`N1@|>iK51_sgl7D2G>T6fG^lI+4jI*&YTB#(XceyKl zy4J+8?7IIE1bE8ECTBD>xsnF~yY)h*gFCeZ(7XC!r-u4(54o43fnulKP|WcT#T@TY z-0?n?_JiQhYaR+cA1(4I=JXprHFm;F{JuOhV&nvQXd%Pw)1t|G5fN@?zfinzVxC!i zwL3y0M|q_G*3ccYCl9;cl(^S)sSWLyk%aQd{0;5F-+iI#osS#j1XjN_3>PHv#?)y0 zeJOY_M5r;%B2mUbQ6Ae!b*AV=v99=>hQi(egkYup z$De>EUa)~yKZ4>{StCHWe*ZP8ccncL=*T;7@wLoH+@MObhHc^>hT@@u4jI{RE2 znQNuS=>E^^)t?CM;FCo$OHhPjh+;tmS*GO!o|*L|N1b8ZBnf;f7i~cl=rgwmaP|a( znbc8z*(Yd&IL)hN_!QoD?7=bz{(xBW8n#|} zxekAm@kG|^>ZpOW8>{K-E12_EXwEF@h^9ATqyYObWsf$S3B5Z;hEJFbkH}=*}AqRjxPq-%f~6MM78W& zq#B)zi)!R@8Q^7bTP_cvAi{PadYc}UqxFp42cva}+4aP1PME1K9Yl+Sywt^RV8l>C z@imnjA*_p`LVjWGEUyJbBXzuo&cI;Axks+x>ZLH4t_=+Hjn_y-kw-*W9>7~+H3S^E z`UMIYsH0jYHIOt&X=^)t$F9^Jz9Qm6E8@0J;K%tgX_X06@5tOPHckSRH(@$^9Rd@B zuQ`;|9*C!OeO$(_Q|EhS3@2t90lP~|VE2*eI^Lk_-YSR&3%;|H0R{=3cBpaUW40(&FqOk8fT$3xsL8z!5 z24xV_EWEM_uREws9__8#*|YzO&}|2z*`5n9MFT7&I{f0n<5I-Ju$=uYFLuvpGr0fz zx7--vr=X%GSPaM)Ji9y)al5|{b;kFJJ-piEdrITpM`+s#p-U48S>a7sM457Z?vVF6 zmkRq56?MI~V63JSG%5ZLW?9-u9SVZxOEsn>k>}Dmu6jik+L|2Rg{jp=41;h*XXiNC zqu!7SsePc$U@2EM*2vt+`>{i4hNxX0iF*2*zlQoNt)PMUdt^@OVoc@>mllWfBncK3 z^r%SINFxtHQI+St)ofIy9XnJqQ2R$$`2$+AnETx7Qa3+Gy|{ke(BC}e<4GqA`>9Rf zbfdI46<`>z*oBVV}*(nQ>P}#1b9? zeoC$<`-mi+BLvDw^7Auvm~^&yNfXL2dt#pj_c`UozOvh=)x;)Q6SEtVkYP1x8;t=k zUU*@F7&cn1i`h|v{Usmy*gptG#b6;3E=Fq4l#2=O8u{HxcV}d) zF%`SnFXwd!1jhT}ca(R~BnC7$c=5Z`VlcwRnG3cGm~z@I>4or!M#}*WW`E&qR-K#Wm~~DN!|3qH1x%cJ>$qU?_rA zIEukDwu)?HO`uweUwJ6=9yC)xQH8w0`pw*2G@7oUS2v|_kKUYY1-k<)*4niRX!ImD zFRFQ*1+W^8x-e^wH*xjShfIvn0~k{xwej-m5B!?C8{2WE6Y!Uq7raBqNOgyOQTEF5{vFgp(ZRD4TGYy-^R-1j9UFx93u$@nMv zr;H=g_H%NEjkr14V^<-1V2=F~!4pjjo<;HiT`MD_3aNGAfXsWzx{@r{kj;VjDrsQE z4GaNWX|ABXfKNH*iz|Kunj<+?CR;Lb69wz##iy8WHUQ<}srd;2mukGel_3t3FT{tF zFZ@Nk*5APWYpm43kIWp4a~2=Wb1!&V2@rrLF+T?4;>m%O=(W8@!5Izto{tE?G#_Is zAf8(j;jB7FAoo73Is+a_RtZ6PREpTM_&&_0#T+ASI?oK8Kogftip;{)&kzpxG;>e5 z(Fg9Z=)+4d6$;5e*Q*B>8nXwxw*+H~1htTGi^@^=Y}a5q2@<1ra;NUiM4<28@^ivH z`~hh>Bn>>kP|V!9ySmRpT+(@BD<*~fx^>h%(V7zArPIEOj5mr*86gZJPByoIgsOo& zv`Xh9{yCYn4-4wBc@(TjjshAoH&df=GVX%zUvPN_v5Bu8eenHr<4+9u|O>-~&*UjV)$Zgy>gmTm`@c6qpGF>gD&hQLR7B-Cw5*9IuqM;W!e@B&l=QMF?V4XUN-V2 z{wSqMh^o7RkN@Rqzty=+vjh`)tOiVp7FubN)~p#phg3>Xf9%_O${!GPmzCGOCpaji zFt&gXCa3y0T>e9qJ~1qF=TW*58BdA#lRi1MaPj7kkYT}V)^0`?36aP80ScEZ9*rNS zmCb?{6tw<`-|-?gPyW=JSJV?d0w6cw0NaEi`)EgkSJnbG>YCHwQe;rUH5EXiUL9@dHQ6J^TERYM^tT zb#?;N;)gq`QDtGYfz8qrD7GWA)DK{TTKjx4W-?L~VD*=3!Z0dtBFE1BI>R9jq@r&n zmby@5wzO+Cu_m<>$Or-QynKqE*60ME-gda)x``EGDm&!2?*sBWF_@g>nTj{(>P*Wj^I6D z;dZJEhE+!N#N4^`6BK+rMdEo5Wj;1ZI~Aa0j?HXN$mo&>ga_oC9?j|xzyfcS9{gY= zsR5qeoIN%b1V4L@Lx2+O84K0dl3bK38+g*zo9!1@=dEf;&f*P~VCuA>0!+>25!?;@ z{&-Jx!+5;q^R+Dy@i?GBm1GR3I`Th0mwM0e0%A5+EvZgPG&ox5x{TB)A+gJ0f;L>B zkrmpWG`Pn1yx#Y0yyt|bpH+ZRch}`y;_>2_U6TN32}-sR4D{Ty$d@-9B=0=xSx)_|;GD{m0u+{f8!= z3!Vc9SkFi#7{H+fI25trBFxC48_C{BM3~DIay(i-lv&6hR7jV%u6#>KYo7f&So6Fs zTNmNb5F<;lhwwhTfIs3HY2;@3Y3jtvC9#o{Z%**F4^gN8(n?(F%zP1uloJGo4)U=N zLFmRaP=nhX_6C}O4pl>QV0=>9#$x;daL?*VSgl+^NQ9(irdv+-Iqc8LJ(WM85$t3j z?iXhuMmCF8y^yv`pcu}?i{I7bJtf2ptU*w!8bQ**HAJKtzy+TW$H|1?pB&&h*)9A* zU63Lv4rZjpjlU1?;B~ zj`4$I>^=j~3-TGukx-$S2~`IglK;Wr;sQwBFAAxQaU?yNGuH}}{ZJd$QZ>B(M5YeeSA+0F~kH~+Z~c5@B- z>$||^>USRqf=Mw3P-S9}rc=r47DO-h0LB(Y7xY{Tg!+)nWgPpQ#wS=%$B291JXFF* zc;wf80eIAG|E&L}o3UR)W>a9OJKk+(c75jxu znog@>5;3@$txZ@&CN6BVFe)g-Z-YDrFa?CbPyT^X12O{RF*an-YH?G8mbVMTM$xoZ z!SF!UUY6O>27_kh;^E7oQDN_OasD7GK?w>asFuou8+?2KH#v1i@80x%DQJ@d)_C`A3vGl_vFT?!V0gJOAVX)$%)36b*V~aTU zxqbyyaeTT%Na~~5R{+hxzAESs%IOavSk=HVhVabTbZH2Z!k7}1E6^`)`QZvx?R?+` z*~QLLUmRXsGXuQ?M$f}(>G|i`Qe7#*Wsc5Zn5~3UvcV1B&{sEink*|GVGueY&EPdG zU1nS$O63&UgD134+wC+3F$sSbkgbJ$2bH4wxq$=5w>F4EG2yQN{UgAU;#z)Q`;_;< zuFt?Y&vNxQg68p~uno}Xy? z3nKblvT1or!8bI~>I+!NKn5O^fCu1+uwU2r(Fw;gy669oS9rz%Bd9@hRQXXNxsGJw zx*@3`f`cDUuBeAY6<&kY@&JZFw|%(_bc&hn$**e@MUvB-z5n<3`VyKb zW3g2G0%r<<L?&m*m#+Ib!^%Uo<(niu;Qgln4L21{Q}HNiCfThFFb=l3l?&pyB& zjQIF@MHXC)fSuxKWVyZ+c3J`7!Xtqr@IM{ekQ^r%eMBOB1(KE4I25?y19C_#lkwFJ z6zsbbhn~1CokJzmno>4c2Asubm&*h6D-8X@r47iaRXe|Zh0s7Uh7V7)n0d>=ht|H& zJZ1!FFQ6{u(f069;FE-|2c}F%o+UnGUyF@6Qc!9AViB$m=buH+&A7r;@y93%2^1JJEhqusW_{Ur|;q#Wrycec^bg0?=C}h9LJ|f#=k@>&kmg1$6`M;bL>A5`OFp_ug6p4Nm zxpHO3^81gE^jtyJY6Ay~vDFEDHLgE`{T^)s8T~F>L~jeejE2hLk{joIxJdXA2uEoq z?wpw=61BK^rM`K5X9Bkb*iamIajcEMW=fWUpyN{sN~7m=jo(nVk#v3dCp6a^)9NO2 zEPvp7eUgp!s{(JYtqjH_QW7Q5Tt)n)5dyDp(K488dt))k0OmGx0I@`_`8X=DSIrDu z0(MVNbw9rGJBV7Z`TLc~#*x1_5o_e{)A;LpzjgwPp1tg3->L=}MWze$5a#M?C^;wl zr-d|$+^_kAu~U2KN+$Or)vaK;n?3zCrZ8|6%BMCSpRj)LJU;*fx}aN(duTq7$_W2p z&*g~D@h`i6&=lwGP#pe{MY42oiC}RKz)=laluVw+<(Kcg05EKe9X>cpW*tz3lcjD$ zriCvPS7bonPEfÏ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≻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

    \n
    \n \n
    \n
    \n
    '>]> -Query, stringvalue_='http://googleid.khanacademy.org/185804764220139124118'>>]>], has_app_=1, has_compile_=1, has_count_=1, has_kind_=1, has_limit_=1, kind_='UserData', lazy_init_lock_=LockType, limit_=1, order_=[Query_Order]> -QueryResult>>], key_=Reference]>>, lazy_init_lock_=LockType, start_inclusive_=False>]>, compiled_query_=CompiledQuery, ...>, ...> -MemcacheGetRequest, name_space_='764.1'> -MemcacheGetResponse]> -MemcacheGetRequest, name_space_='764.1'> -MemcacheGetResponse]> -PutRequest, key=Reference]>>, property=[Property>], raw_property=[Property>>]>]> -MemcacheGetResponse^F\x8c8t\x88>S\naR\x99x\x05\xf0\xcf?\xb4\x17\xe0\xcc\xbf\x01\xfa$l7\x88\x86q\x03cdatetime\ndatetime\nq\x04U\n\x07\xdd\x01\x1e\x13\x14#\x05h\xce\x85Rq\x05M\xe7\x17G?\xd4\xb7\x81\x00\x00\x00\x00tb.', ...>, ...]> diff --git a/src/lib/gae_mini_profiler/util.py b/src/lib/gae_mini_profiler/util.py deleted file mode 100755 index f18369a..0000000 --- a/src/lib/gae_mini_profiler/util.py +++ /dev/null @@ -1,17 +0,0 @@ -def seconds_fmt(f, n=0): - return milliseconds_fmt(f * 1000, n) - -def milliseconds_fmt(f, n=0): - return decimal_fmt(f, n) - -def decimal_fmt(f, n=0): - format = "%." + str(n) + "f" - return format % f - -def short_method_fmt(s): - return s[s.rfind("/") + 1:] - -def short_rpc_file_fmt(s): - if not s: - return "" - return s[s.find("/"):] diff --git a/src/lib/werkzeug/__init__.py b/src/lib/werkzeug/__init__.py deleted file mode 100644 index edccb26..0000000 --- a/src/lib/werkzeug/__init__.py +++ /dev/null @@ -1,149 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug - ~~~~~~~~ - - Werkzeug is the Swiss Army knife of Python web development. - - It provides useful classes and functions for any WSGI application to make - the life of a python web developer much easier. All of the provided - classes are independent from each other so you can mix it with any other - library. - - - :copyright: (c) 2011 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from types import ModuleType -import sys - - -# the version. Usually set automatically by a script. -__version__ = '0.8.3' - - -# This import magic raises concerns quite often which is why the implementation -# and motivation is explained here in detail now. -# -# The majority of the functions and classes provided by Werkzeug work on the -# HTTP and WSGI layer. There is no useful grouping for those which is why -# they are all importable from "werkzeug" instead of the modules where they are -# implemented. The downside of that is, that now everything would be loaded at -# once, even if unused. -# -# The implementation of a lazy-loading module in this file replaces the -# werkzeug package when imported from within. Attribute access to the werkzeug -# module will then lazily import from the modules that implement the objects. - - -# import mapping to objects in other modules -all_by_module = { - 'werkzeug.debug': ['DebuggedApplication'], - 'werkzeug.local': ['Local', 'LocalManager', 'LocalProxy', - 'LocalStack', 'release_local'], - 'werkzeug.templates': ['Template'], - 'werkzeug.serving': ['run_simple'], - 'werkzeug.test': ['Client', 'EnvironBuilder', 'create_environ', - 'run_wsgi_app'], - 'werkzeug.testapp': ['test_app'], - 'werkzeug.exceptions': ['abort', 'Aborter'], - 'werkzeug.urls': ['url_decode', 'url_encode', 'url_quote', - 'url_quote_plus', 'url_unquote', - 'url_unquote_plus', 'url_fix', 'Href', - 'iri_to_uri', 'uri_to_iri'], - 'werkzeug.formparser': ['parse_form_data'], - 'werkzeug.utils': ['escape', 'environ_property', - 'append_slash_redirect', 'redirect', - 'cached_property', 'import_string', - 'dump_cookie', 'parse_cookie', 'unescape', - 'format_string', 'find_modules', 'header_property', - 'html', 'xhtml', 'HTMLBuilder', - 'validate_arguments', 'ArgumentValidationError', - 'bind_arguments', 'secure_filename'], - 'werkzeug.wsgi': ['get_current_url', 'get_host', 'pop_path_info', - 'peek_path_info', 'SharedDataMiddleware', - 'DispatcherMiddleware', 'ClosingIterator', - 'FileWrapper', 'make_line_iter', 'LimitedStream', - 'responder', 'wrap_file', 'extract_path_info'], - 'werkzeug.datastructures': ['MultiDict', 'CombinedMultiDict', 'Headers', - 'EnvironHeaders', 'ImmutableList', - 'ImmutableDict', 'ImmutableMultiDict', - 'TypeConversionDict', 'ImmutableTypeConversionDict', - 'Accept', 'MIMEAccept', 'CharsetAccept', - 'LanguageAccept', 'RequestCacheControl', - 'ResponseCacheControl', 'ETags', 'HeaderSet', - 'WWWAuthenticate', 'Authorization', - 'FileMultiDict', 'CallbackDict', 'FileStorage', - 'OrderedMultiDict', 'ImmutableOrderedMultiDict'], - 'werkzeug.useragents': ['UserAgent'], - 'werkzeug.http': ['parse_etags', 'parse_date', 'http_date', - 'cookie_date', 'parse_cache_control_header', - 'is_resource_modified', 'parse_accept_header', - 'parse_set_header', 'quote_etag', 'unquote_etag', - 'generate_etag', 'dump_header', - 'parse_list_header', 'parse_dict_header', - 'parse_authorization_header', - 'parse_www_authenticate_header', - 'remove_entity_headers', 'is_entity_header', - 'remove_hop_by_hop_headers', 'parse_options_header', - 'dump_options_header', 'is_hop_by_hop_header', - 'unquote_header_value', - 'quote_header_value', 'HTTP_STATUS_CODES'], - 'werkzeug.wrappers': ['BaseResponse', 'BaseRequest', 'Request', - 'Response', 'AcceptMixin', 'ETagRequestMixin', - 'ETagResponseMixin', 'ResponseStreamMixin', - 'CommonResponseDescriptorsMixin', - 'UserAgentMixin', 'AuthorizationMixin', - 'WWWAuthenticateMixin', - 'CommonRequestDescriptorsMixin'], - 'werkzeug.security': ['generate_password_hash', 'check_password_hash'], - # the undocumented easteregg ;-) - 'werkzeug._internal': ['_easteregg'] -} - -# modules that should be imported when accessed as attributes of werkzeug -attribute_modules = frozenset(['exceptions', 'routing', 'script']) - - -object_origins = {} -for module, items in all_by_module.iteritems(): - for item in items: - object_origins[item] = module - - -class module(ModuleType): - """Automatically import objects from the modules.""" - - def __getattr__(self, name): - if name in object_origins: - module = __import__(object_origins[name], None, None, [name]) - for extra_name in all_by_module[module.__name__]: - setattr(self, extra_name, getattr(module, extra_name)) - return getattr(module, name) - elif name in attribute_modules: - __import__('werkzeug.' + name) - return ModuleType.__getattribute__(self, name) - - def __dir__(self): - """Just show what we want to show.""" - result = list(new_module.__all__) - result.extend(('__file__', '__path__', '__doc__', '__all__', - '__docformat__', '__name__', '__path__', - '__package__', '__version__')) - return result - -# keep a reference to this module so that it's not garbage collected -old_module = sys.modules['werkzeug'] - - -# setup the new module and patch it into the dict of loaded modules -new_module = sys.modules['werkzeug'] = module('werkzeug') -new_module.__dict__.update({ - '__file__': __file__, - '__package__': 'werkzeug', - '__path__': __path__, - '__doc__': __doc__, - '__version__': __version__, - '__all__': tuple(object_origins) + tuple(attribute_modules), - '__docformat__': 'restructuredtext en' -}) diff --git a/src/lib/werkzeug/contrib/kickstart.py b/src/lib/werkzeug/contrib/kickstart.py deleted file mode 100644 index 43c0e7c..0000000 --- a/src/lib/werkzeug/contrib/kickstart.py +++ /dev/null @@ -1,288 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.contrib.kickstart - ~~~~~~~~~~~~~~~~~~~~~~~~~~ - - This module provides some simple shortcuts to make using Werkzeug simpler - for small scripts. - - These improvements include predefined `Request` and `Response` objects as - well as a predefined `Application` object which can be customized in child - classes, of course. The `Request` and `Reponse` objects handle URL - generation as well as sessions via `werkzeug.contrib.sessions` and are - purely optional. - - There is also some integration of template engines. The template loaders - are, of course, not neccessary to use the template engines in Werkzeug, - but they provide a common interface. Currently supported template engines - include Werkzeug's minitmpl and Genshi_. Support for other engines can be - added in a trivial way. These loaders provide a template interface - similar to the one used by Django_. - - .. _Genshi: http://genshi.edgewall.org/ - .. _Django: http://www.djangoproject.com/ - - :copyright: (c) 2011 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -from os import path -from werkzeug.wrappers import Request as RequestBase, Response as ResponseBase -from werkzeug.templates import Template -from werkzeug.exceptions import HTTPException -from werkzeug.routing import RequestRedirect - -__all__ = ['Request', 'Response', 'TemplateNotFound', 'TemplateLoader', - 'GenshiTemplateLoader', 'Application'] - -from warnings import warn -warn(DeprecationWarning('werkzeug.contrib.kickstart is deprecated and ' - 'will be removed in Werkzeug 1.0')) - - -class Request(RequestBase): - """A handy subclass of the base request that adds a URL builder. - It when supplied a session store, it is also able to handle sessions. - """ - - def __init__(self, environ, url_map, - session_store=None, cookie_name=None): - # call the parent for initialization - RequestBase.__init__(self, environ) - # create an adapter - self.url_adapter = url_map.bind_to_environ(environ) - # create all stuff for sessions - self.session_store = session_store - self.cookie_name = cookie_name - - if session_store is not None and cookie_name is not None: - if cookie_name in self.cookies: - # get the session out of the storage - self.session = session_store.get(self.cookies[cookie_name]) - else: - # create a new session - self.session = session_store.new() - - def url_for(self, callback, **values): - return self.url_adapter.build(callback, values) - - -class Response(ResponseBase): - """ - A subclass of base response which sets the default mimetype to text/html. - It the `Request` that came in is using Werkzeug sessions, this class - takes care of saving that session. - """ - default_mimetype = 'text/html' - - def __call__(self, environ, start_response): - # get the request object - request = environ['werkzeug.request'] - - if request.session_store is not None: - # save the session if neccessary - request.session_store.save_if_modified(request.session) - - # set the cookie for the browser if it is not there: - if request.cookie_name not in request.cookies: - self.set_cookie(request.cookie_name, request.session.sid) - - # go on with normal response business - return ResponseBase.__call__(self, environ, start_response) - - -class Processor(object): - """A request and response processor - it is what Django calls a - middleware, but Werkzeug also includes straight-foward support for real - WSGI middlewares, so another name was chosen. - - The code of this processor is derived from the example in the Werkzeug - trac, called `Request and Response Processor - `_ - """ - - def process_request(self, request): - return request - - def process_response(self, request, response): - return response - - def process_view(self, request, view_func, view_args, view_kwargs): - """process_view() is called just before the Application calls the - function specified by view_func. - - If this returns None, the Application processes the next Processor, - and if it returns something else (like a Response instance), that - will be returned without any further processing. - """ - return None - - def process_exception(self, request, exception): - return None - - -class Application(object): - """A generic WSGI application which can be used to start with Werkzeug in - an easy, straightforward way. - """ - - def __init__(self, name, url_map, session=False, processors=None): - # save the name and the URL-map, as it'll be needed later on - self.name = name - self.url_map = url_map - # save the list of processors if supplied - self.processors = processors or [] - # create an instance of the storage - if session: - self.store = session - else: - self.store = None - - def __call__(self, environ, start_response): - # create a request - with or without session support - if self.store is not None: - request = Request(environ, self.url_map, - session_store=self.store, cookie_name='%s_sid' % self.name) - else: - request = Request(environ, self.url_map) - - # apply the request processors - for processor in self.processors: - request = processor.process_request(request) - - try: - # find the callback to which the URL is mapped - callback, args = request.url_adapter.match(request.path) - except (HTTPException, RequestRedirect), e: - response = e - else: - # check all view processors - for processor in self.processors: - action = processor.process_view(request, callback, (), args) - if action is not None: - # it is overriding the default behaviour, this is - # short-circuiting the processing, so it returns here - return action(environ, start_response) - - try: - response = callback(request, **args) - except Exception, exception: - # the callback raised some exception, need to process that - for processor in reversed(self.processors): - # filter it through the exception processor - action = processor.process_exception(request, exception) - if action is not None: - # the exception processor returned some action - return action(environ, start_response) - # still not handled by a exception processor, so re-raise - raise - - # apply the response processors - for processor in reversed(self.processors): - response = processor.process_response(request, response) - - # return the completely processed response - return response(environ, start_response) - - - def config_session(self, store, expiration='session'): - """ - Configures the setting for cookies. You can also disable cookies by - setting store to None. - """ - self.store = store - # expiration=session is the default anyway - # TODO: add settings to define the expiration date, the domain, the - # path any maybe the secure parameter. - - -class TemplateNotFound(IOError, LookupError): - """ - A template was not found by the template loader. - """ - - def __init__(self, name): - IOError.__init__(self, name) - self.name = name - - -class TemplateLoader(object): - """ - A simple loader interface for the werkzeug minitmpl - template language. - """ - - def __init__(self, search_path, encoding='utf-8'): - self.search_path = path.abspath(search_path) - self.encoding = encoding - - def get_template(self, name): - """Get a template from a given name.""" - filename = path.join(self.search_path, *[p for p in name.split('/') - if p and p[0] != '.']) - if not path.exists(filename): - raise TemplateNotFound(name) - return Template.from_file(filename, self.encoding) - - def render_to_response(self, *args, **kwargs): - """Load and render a template into a response object.""" - return Response(self.render_to_string(*args, **kwargs)) - - def render_to_string(self, *args, **kwargs): - """Load and render a template into a unicode string.""" - try: - template_name, args = args[0], args[1:] - except IndexError: - raise TypeError('name of template required') - return self.get_template(template_name).render(*args, **kwargs) - - -class GenshiTemplateLoader(TemplateLoader): - """A unified interface for loading Genshi templates. Actually a quite thin - wrapper for Genshi's TemplateLoader. - - It sets some defaults that differ from the Genshi loader, most notably - auto_reload is active. All imporant options can be passed through to - Genshi. - The default output type is 'html', but can be adjusted easily by changing - the `output_type` attribute. - """ - def __init__(self, search_path, encoding='utf-8', **kwargs): - TemplateLoader.__init__(self, search_path, encoding) - # import Genshi here, because we don't want a general Genshi - # dependency, only a local one - from genshi.template import TemplateLoader as GenshiLoader - from genshi.template.loader import TemplateNotFound - - self.not_found_exception = TemplateNotFound - # set auto_reload to True per default - reload_template = kwargs.pop('auto_reload', True) - # get rid of default_encoding as this template loaders overwrites it - # with the value of encoding - kwargs.pop('default_encoding', None) - - # now, all arguments are clean, pass them on - self.loader = GenshiLoader(search_path, default_encoding=encoding, - auto_reload=reload_template, **kwargs) - - # the default output is HTML but can be overridden easily - self.output_type = 'html' - self.encoding = encoding - - def get_template(self, template_name): - """Get the template which is at the given name""" - try: - return self.loader.load(template_name, encoding=self.encoding) - except self.not_found_exception, e: - # catch the exception raised by Genshi, convert it into a werkzeug - # exception (for the sake of consistency) - raise TemplateNotFound(template_name) - - def render_to_string(self, template_name, context=None): - """Load and render a template into an unicode string""" - # create an empty context if no context was specified - context = context or {} - tmpl = self.get_template(template_name) - # render the template into a unicode string (None means unicode) - return tmpl. \ - generate(**context). \ - render(self.output_type, encoding=None) diff --git a/src/lib/werkzeug/debug/__init__.py b/src/lib/werkzeug/debug/__init__.py deleted file mode 100644 index db91b74..0000000 --- a/src/lib/werkzeug/debug/__init__.py +++ /dev/null @@ -1,185 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.debug - ~~~~~~~~~~~~~~ - - WSGI application traceback debugger. - - :copyright: (c) 2011 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import mimetypes -from os.path import join, dirname, basename, isfile -from werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response -from werkzeug.debug.tbtools import get_current_traceback, render_console_html -from werkzeug.debug.console import Console -from werkzeug.security import gen_salt - - -#: import this here because it once was documented as being available -#: from this module. In case there are users left ... -from werkzeug.debug.repr import debug_repr - - -class _ConsoleFrame(object): - """Helper class so that we can reuse the frame console code for the - standalone console. - """ - - def __init__(self, namespace): - self.console = Console(namespace) - self.id = 0 - - -class DebuggedApplication(object): - """Enables debugging support for a given application:: - - from werkzeug.debug import DebuggedApplication - from myapp import app - app = DebuggedApplication(app, evalex=True) - - The `evalex` keyword argument allows evaluating expressions in a - traceback's frame context. - - .. versionadded:: 0.7 - The `lodgeit_url` parameter was added. - - :param app: the WSGI application to run debugged. - :param evalex: enable exception evaluation feature (interactive - debugging). This requires a non-forking server. - :param request_key: The key that points to the request object in ths - environment. This parameter is ignored in current - versions. - :param console_path: the URL for a general purpose console. - :param console_init_func: the function that is executed before starting - the general purpose console. The return value - is used as initial namespace. - :param show_hidden_frames: by default hidden traceback frames are skipped. - You can show them by setting this parameter - to `True`. - :param lodgeit_url: the base URL of the LodgeIt instance to use for - pasting tracebacks. - """ - - # this class is public - __module__ = 'werkzeug' - - def __init__(self, app, evalex=False, request_key='werkzeug.request', - console_path='/console', console_init_func=None, - show_hidden_frames=False, - lodgeit_url='http://paste.pocoo.org/'): - if not console_init_func: - console_init_func = dict - self.app = app - self.evalex = evalex - self.frames = {} - self.tracebacks = {} - self.request_key = request_key - self.console_path = console_path - self.console_init_func = console_init_func - self.show_hidden_frames = show_hidden_frames - self.lodgeit_url = lodgeit_url - self.secret = gen_salt(20) - - def debug_application(self, environ, start_response): - """Run the application and conserve the traceback frames.""" - app_iter = None - try: - app_iter = self.app(environ, start_response) - for item in app_iter: - yield item - if hasattr(app_iter, 'close'): - app_iter.close() - except Exception: - if hasattr(app_iter, 'close'): - app_iter.close() - traceback = get_current_traceback(skip=1, show_hidden_frames= - self.show_hidden_frames, - ignore_system_exceptions=True) - for frame in traceback.frames: - self.frames[frame.id] = frame - self.tracebacks[traceback.id] = traceback - - try: - start_response('500 INTERNAL SERVER ERROR', [ - ('Content-Type', 'text/html; charset=utf-8') - ]) - except Exception: - # if we end up here there has been output but an error - # occurred. in that situation we can do nothing fancy any - # more, better log something into the error log and fall - # back gracefully. - environ['wsgi.errors'].write( - 'Debugging middleware caught exception in streamed ' - 'response at a point where response headers were already ' - 'sent.\n') - else: - yield traceback.render_full(evalex=self.evalex, - lodgeit_url=self.lodgeit_url, - secret=self.secret) \ - .encode('utf-8', 'replace') - - traceback.log(environ['wsgi.errors']) - - def execute_command(self, request, command, frame): - """Execute a command in a console.""" - return Response(frame.console.eval(command), mimetype='text/html') - - def display_console(self, request): - """Display a standalone shell.""" - if 0 not in self.frames: - self.frames[0] = _ConsoleFrame(self.console_init_func()) - return Response(render_console_html(secret=self.secret), - mimetype='text/html') - - def paste_traceback(self, request, traceback): - """Paste the traceback and return a JSON response.""" - paste_id = traceback.paste(self.lodgeit_url) - return Response('{"url": "%sshow/%s/", "id": "%s"}' - % (self.lodgeit_url, paste_id, paste_id), - mimetype='application/json') - - def get_source(self, request, frame): - """Render the source viewer.""" - return Response(frame.render_source(), mimetype='text/html') - - def get_resource(self, request, filename): - """Return a static resource from the shared folder.""" - filename = join(dirname(__file__), 'shared', basename(filename)) - if isfile(filename): - mimetype = mimetypes.guess_type(filename)[0] \ - or 'application/octet-stream' - f = file(filename, 'rb') - try: - return Response(f.read(), mimetype=mimetype) - finally: - f.close() - return Response('Not Found', status=404) - - def __call__(self, environ, start_response): - """Dispatch the requests.""" - # important: don't ever access a function here that reads the incoming - # form data! Otherwise the application won't have access to that data - # any more! - request = Request(environ) - response = self.debug_application - if request.args.get('__debugger__') == 'yes': - cmd = request.args.get('cmd') - arg = request.args.get('f') - secret = request.args.get('s') - traceback = self.tracebacks.get(request.args.get('tb', type=int)) - frame = self.frames.get(request.args.get('frm', type=int)) - if cmd == 'resource' and arg: - response = self.get_resource(request, arg) - elif cmd == 'paste' and traceback is not None and \ - secret == self.secret: - response = self.paste_traceback(request, traceback) - elif cmd == 'source' and frame and self.secret == secret: - response = self.get_source(request, frame) - elif self.evalex and cmd is not None and frame is not None and \ - self.secret == secret: - response = self.execute_command(request, cmd, frame) - elif self.evalex and self.console_path is not None and \ - request.path == self.console_path: - response = self.display_console(request) - return response(environ, start_response) diff --git a/src/lib/werkzeug/debug/shared/jquery.js b/src/lib/werkzeug/debug/shared/jquery.js deleted file mode 100644 index 8f3ca2e..0000000 --- a/src/lib/werkzeug/debug/shared/jquery.js +++ /dev/null @@ -1,167 +0,0 @@ -/*! - * jQuery JavaScript Library v1.4.4 - * http://jquery.com/ - * - * Copyright 2010, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2010, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Nov 11 19:04:53 2010 -0500 - */ -(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h= -h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;kd)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La, -"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this, -e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a, -"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+ -a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/, -C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j, -s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this, -j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length}, -toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j=== --1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false; -if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", -b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& -!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& -l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H
    a";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), -k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, -scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= -false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= -1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="
    ";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="
    t
    ";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= -"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= -c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); -else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; -if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, -attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& -b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; -c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, -arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= -d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ -c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== -8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== -"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ -d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= -B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== -"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== -0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); -(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; -break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, -q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= -l;g.sort(w);if(h)for(var i=1;i0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, -m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== -true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== -g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return in[3]-0},nth:function(g,i,n){return n[3]- -0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== -i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; -if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, -g);else if(typeof g.length==="number")for(var p=g.length;n";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); -n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& -function(){var g=k,i=t.createElement("div");i.innerHTML="

    ";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| -p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= -t.createElement("div");g.innerHTML="
    ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? -function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n0)for(var h=d;h0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= -h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): -c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, -2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, -b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& -e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/\s]+\/)>/g,P={option:[1, -""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div
    ","
    "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= -c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, -wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, -prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, -this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); -return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; -else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", -prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| -b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]===""&&!x?r.childNodes:[];for(o=k.length- -1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); -d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, -jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, -zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), -h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); -if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= -d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; -e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/)<[^<]*)*<\/script>/gi, -ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b=== -"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("
    ").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& -!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, -getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", -script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| -!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache= -false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset; -A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type", -b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& -c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| -c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]= -encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess", -[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"), -e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}}); -if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show", -3),a,b,d);else{d=0;for(var e=this.length;d=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, -d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* -Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)} -var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; -this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| -this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= -c.timers,b=0;b-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a, -e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&& -c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); -c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+ -b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window); diff --git a/src/lib/werkzeug/security.py b/src/lib/werkzeug/security.py deleted file mode 100644 index 5f1d7d4..0000000 --- a/src/lib/werkzeug/security.py +++ /dev/null @@ -1,140 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.security - ~~~~~~~~~~~~~~~~~ - - Security related helpers such as secure password hashing tools. - - :copyright: (c) 2011 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import os -import hmac -import posixpath -from itertools import izip -from random import SystemRandom - -# because the API of hmac changed with the introduction of the -# new hashlib module, we have to support both. This sets up a -# mapping to the digest factory functions and the digest modules -# (or factory functions with changed API) -try: - from hashlib import sha1, md5 - _hash_funcs = _hash_mods = {'sha1': sha1, 'md5': md5} - _sha1_mod = sha1 - _md5_mod = md5 -except ImportError: - import sha as _sha1_mod, md5 as _md5_mod - _hash_mods = {'sha1': _sha1_mod, 'md5': _md5_mod} - _hash_funcs = {'sha1': _sha1_mod.new, 'md5': _md5_mod.new} - - -SALT_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' - - -_sys_rng = SystemRandom() -_os_alt_seps = list(sep for sep in [os.path.sep, os.path.altsep] - if sep not in (None, '/')) - - -def safe_str_cmp(a, b): - """This function compares strings in somewhat constant time. This - requires that the length of at least one string is known in advance. - - Returns `True` if the two strings are equal or `False` if they are not. - - .. versionadded:: 0.7 - """ - if len(a) != len(b): - return False - rv = 0 - for x, y in izip(a, b): - rv |= ord(x) ^ ord(y) - return rv == 0 - - -def gen_salt(length): - """Generate a random string of SALT_CHARS with specified ``length``.""" - if length <= 0: - raise ValueError('requested salt of length <= 0') - return ''.join(_sys_rng.choice(SALT_CHARS) for _ in xrange(length)) - - -def _hash_internal(method, salt, password): - """Internal password hash helper. Supports plaintext without salt, - unsalted and salted passwords. In case salted passwords are used - hmac is used. - """ - if method == 'plain': - return password - if salt: - if method not in _hash_mods: - return None - if isinstance(salt, unicode): - salt = salt.encode('utf-8') - h = hmac.new(salt, None, _hash_mods[method]) - else: - if method not in _hash_funcs: - return None - h = _hash_funcs[method]() - if isinstance(password, unicode): - password = password.encode('utf-8') - h.update(password) - return h.hexdigest() - - -def generate_password_hash(password, method='sha1', salt_length=8): - """Hash a password with the given method and salt with with a string of - the given length. The format of the string returned includes the method - that was used so that :func:`check_password_hash` can check the hash. - - The format for the hashed string looks like this:: - - method$salt$hash - - This method can **not** generate unsalted passwords but it is possible - to set the method to plain to enforce plaintext passwords. If a salt - is used, hmac is used internally to salt the password. - - :param password: the password to hash - :param method: the hash method to use (``'md5'`` or ``'sha1'``) - :param salt_length: the lengt of the salt in letters - """ - salt = method != 'plain' and gen_salt(salt_length) or '' - h = _hash_internal(method, salt, password) - if h is None: - raise TypeError('invalid method %r' % method) - return '%s$%s$%s' % (method, salt, h) - - -def check_password_hash(pwhash, password): - """check a password against a given salted and hashed password value. - In order to support unsalted legacy passwords this method supports - plain text passwords, md5 and sha1 hashes (both salted and unsalted). - - Returns `True` if the password matched, `False` otherwise. - - :param pwhash: a hashed string like returned by - :func:`generate_password_hash` - :param password: the plaintext password to compare against the hash - """ - if pwhash.count('$') < 2: - return False - method, salt, hashval = pwhash.split('$', 2) - return safe_str_cmp(_hash_internal(method, salt, password), hashval) - - -def safe_join(directory, filename): - """Safely join `directory` and `filename`. If this cannot be done, - this function returns ``None``. - - :param directory: the base directory. - :param filename: the untrusted filename relative to that directory. - """ - filename = posixpath.normpath(filename) - for sep in _os_alt_seps: - if sep in filename: - return None - if os.path.isabs(filename) or filename.startswith('../'): - return None - return os.path.join(directory, filename) diff --git a/src/lib/werkzeug/serving.py b/src/lib/werkzeug/serving.py deleted file mode 100644 index abb9927..0000000 --- a/src/lib/werkzeug/serving.py +++ /dev/null @@ -1,617 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.serving - ~~~~~~~~~~~~~~~~ - - There are many ways to serve a WSGI application. While you're developing - it you usually don't want a full blown webserver like Apache but a simple - standalone one. From Python 2.5 onwards there is the `wsgiref`_ server in - the standard library. If you're using older versions of Python you can - download the package from the cheeseshop. - - However there are some caveats. Sourcecode won't reload itself when - changed and each time you kill the server using ``^C`` you get an - `KeyboardInterrupt` error. While the latter is easy to solve the first - one can be a pain in the ass in some situations. - - The easiest way is creating a small ``start-myproject.py`` that runs the - application:: - - #!/usr/bin/env python - # -*- coding: utf-8 -*- - from myproject import make_app - from werkzeug.serving import run_simple - - app = make_app(...) - run_simple('localhost', 8080, app, use_reloader=True) - - You can also pass it a `extra_files` keyword argument with a list of - additional files (like configuration files) you want to observe. - - For bigger applications you should consider using `werkzeug.script` - instead of a simple start file. - - - :copyright: (c) 2011 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD, see LICENSE for more details. -""" -import os -import socket -import sys -import time -import thread -import signal -import subprocess -from urllib import unquote -from SocketServer import ThreadingMixIn, ForkingMixIn -from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler - -import werkzeug -from werkzeug._internal import _log -from werkzeug.exceptions import InternalServerError - - -class WSGIRequestHandler(BaseHTTPRequestHandler, object): - """A request handler that implements WSGI dispatching.""" - - @property - def server_version(self): - return 'Werkzeug/' + werkzeug.__version__ - - def make_environ(self): - if '?' in self.path: - path_info, query = self.path.split('?', 1) - else: - path_info = self.path - query = '' - - def shutdown_server(): - self.server.shutdown_signal = True - - url_scheme = self.server.ssl_context is None and 'http' or 'https' - environ = { - 'wsgi.version': (1, 0), - 'wsgi.url_scheme': url_scheme, - 'wsgi.input': self.rfile, - 'wsgi.errors': sys.stderr, - 'wsgi.multithread': self.server.multithread, - 'wsgi.multiprocess': self.server.multiprocess, - 'wsgi.run_once': False, - 'werkzeug.server.shutdown': - shutdown_server, - 'SERVER_SOFTWARE': self.server_version, - 'REQUEST_METHOD': self.command, - 'SCRIPT_NAME': '', - 'PATH_INFO': unquote(path_info), - 'QUERY_STRING': query, - 'CONTENT_TYPE': self.headers.get('Content-Type', ''), - 'CONTENT_LENGTH': self.headers.get('Content-Length', ''), - 'REMOTE_ADDR': self.client_address[0], - 'REMOTE_PORT': self.client_address[1], - 'SERVER_NAME': self.server.server_address[0], - 'SERVER_PORT': str(self.server.server_address[1]), - 'SERVER_PROTOCOL': self.request_version - } - - for key, value in self.headers.items(): - key = 'HTTP_' + key.upper().replace('-', '_') - if key not in ('HTTP_CONTENT_TYPE', 'HTTP_CONTENT_LENGTH'): - environ[key] = value - - return environ - - def run_wsgi(self): - app = self.server.app - environ = self.make_environ() - headers_set = [] - headers_sent = [] - - def write(data): - assert headers_set, 'write() before start_response' - if not headers_sent: - status, response_headers = headers_sent[:] = headers_set - code, msg = status.split(None, 1) - self.send_response(int(code), msg) - header_keys = set() - for key, value in response_headers: - self.send_header(key, value) - key = key.lower() - header_keys.add(key) - if 'content-length' not in header_keys: - self.close_connection = True - self.send_header('Connection', 'close') - if 'server' not in header_keys: - self.send_header('Server', self.version_string()) - if 'date' not in header_keys: - self.send_header('Date', self.date_time_string()) - self.end_headers() - - assert type(data) is str, 'applications must write bytes' - self.wfile.write(data) - self.wfile.flush() - - def start_response(status, response_headers, exc_info=None): - if exc_info: - try: - if headers_sent: - raise exc_info[0], exc_info[1], exc_info[2] - finally: - exc_info = None - elif headers_set: - raise AssertionError('Headers already set') - headers_set[:] = [status, response_headers] - return write - - def execute(app): - application_iter = app(environ, start_response) - try: - for data in application_iter: - write(data) - # make sure the headers are sent - if not headers_sent: - write('') - finally: - if hasattr(application_iter, 'close'): - application_iter.close() - application_iter = None - - try: - execute(app) - except (socket.error, socket.timeout), e: - self.connection_dropped(e, environ) - except Exception: - if self.server.passthrough_errors: - raise - from werkzeug.debug.tbtools import get_current_traceback - traceback = get_current_traceback(ignore_system_exceptions=True) - try: - # if we haven't yet sent the headers but they are set - # we roll back to be able to set them again. - if not headers_sent: - del headers_set[:] - execute(InternalServerError()) - except Exception: - pass - self.server.log('error', 'Error on request:\n%s', - traceback.plaintext) - - def handle(self): - """Handles a request ignoring dropped connections.""" - rv = None - try: - rv = BaseHTTPRequestHandler.handle(self) - except (socket.error, socket.timeout), e: - self.connection_dropped(e) - except Exception: - if self.server.ssl_context is None or not is_ssl_error(): - raise - if self.server.shutdown_signal: - self.initiate_shutdown() - return rv - - def initiate_shutdown(self): - """A horrible, horrible way to kill the server for Python 2.6 and - later. It's the best we can do. - """ - # Windows does not provide SIGKILL, go with SIGTERM then. - sig = getattr(signal, 'SIGKILL', signal.SIGTERM) - # reloader active - if os.environ.get('WERKZEUG_RUN_MAIN') == 'true': - os.kill(os.getpid(), sig) - # python 2.7 - self.server._BaseServer__shutdown_request = True - # python 2.6 - self.server._BaseServer__serving = False - - def connection_dropped(self, error, environ=None): - """Called if the connection was closed by the client. By default - nothing happens. - """ - - def handle_one_request(self): - """Handle a single HTTP request.""" - self.raw_requestline = self.rfile.readline() - if not self.raw_requestline: - self.close_connection = 1 - elif self.parse_request(): - return self.run_wsgi() - - def send_response(self, code, message=None): - """Send the response header and log the response code.""" - self.log_request(code) - if message is None: - message = code in self.responses and self.responses[code][0] or '' - if self.request_version != 'HTTP/0.9': - self.wfile.write("%s %d %s\r\n" % - (self.protocol_version, code, message)) - - def version_string(self): - return BaseHTTPRequestHandler.version_string(self).strip() - - def address_string(self): - return self.client_address[0] - - def log_request(self, code='-', size='-'): - self.log('info', '"%s" %s %s', self.requestline, code, size) - - def log_error(self, *args): - self.log('error', *args) - - def log_message(self, format, *args): - self.log('info', format, *args) - - def log(self, type, message, *args): - _log(type, '%s - - [%s] %s\n' % (self.address_string(), - self.log_date_time_string(), - message % args)) - - -#: backwards compatible name if someone is subclassing it -BaseRequestHandler = WSGIRequestHandler - - -def generate_adhoc_ssl_context(): - """Generates an adhoc SSL context for the development server.""" - from random import random - from OpenSSL import crypto, SSL - - cert = crypto.X509() - cert.set_serial_number(int(random() * sys.maxint)) - cert.gmtime_adj_notBefore(0) - cert.gmtime_adj_notAfter(60 * 60 * 24 * 365) - - subject = cert.get_subject() - subject.CN = '*' - subject.O = 'Dummy Certificate' - - issuer = cert.get_issuer() - issuer.CN = 'Untrusted Authority' - issuer.O = 'Self-Signed' - - pkey = crypto.PKey() - pkey.generate_key(crypto.TYPE_RSA, 768) - cert.set_pubkey(pkey) - cert.sign(pkey, 'md5') - - ctx = SSL.Context(SSL.SSLv23_METHOD) - ctx.use_privatekey(pkey) - ctx.use_certificate(cert) - - return ctx - - -def is_ssl_error(error=None): - """Checks if the given error (or the current one) is an SSL error.""" - if error is None: - error = sys.exc_info()[1] - from OpenSSL import SSL - return isinstance(error, SSL.Error) - - -class _SSLConnectionFix(object): - """Wrapper around SSL connection to provide a working makefile().""" - - def __init__(self, con): - self._con = con - - def makefile(self, mode, bufsize): - return socket._fileobject(self._con, mode, bufsize) - - def __getattr__(self, attrib): - return getattr(self._con, attrib) - - -def select_ip_version(host, port): - """Returns AF_INET4 or AF_INET6 depending on where to connect to.""" - # disabled due to problems with current ipv6 implementations - # and various operating systems. Probably this code also is - # not supposed to work, but I can't come up with any other - # ways to implement this. - ##try: - ## info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, - ## socket.SOCK_STREAM, 0, - ## socket.AI_PASSIVE) - ## if info: - ## return info[0][0] - ##except socket.gaierror: - ## pass - if ':' in host and hasattr(socket, 'AF_INET6'): - return socket.AF_INET6 - return socket.AF_INET - - -class BaseWSGIServer(HTTPServer, object): - """Simple single-threaded, single-process WSGI server.""" - multithread = False - multiprocess = False - request_queue_size = 128 - - def __init__(self, host, port, app, handler=None, - passthrough_errors=False, ssl_context=None): - if handler is None: - handler = WSGIRequestHandler - self.address_family = select_ip_version(host, port) - HTTPServer.__init__(self, (host, int(port)), handler) - self.app = app - self.passthrough_errors = passthrough_errors - self.shutdown_signal = False - - if ssl_context is not None: - try: - from OpenSSL import tsafe - except ImportError: - raise TypeError('SSL is not available if the OpenSSL ' - 'library is not installed.') - if ssl_context == 'adhoc': - ssl_context = generate_adhoc_ssl_context() - self.socket = tsafe.Connection(ssl_context, self.socket) - self.ssl_context = ssl_context - else: - self.ssl_context = None - - def log(self, type, message, *args): - _log(type, message, *args) - - def serve_forever(self): - self.shutdown_signal = False - try: - HTTPServer.serve_forever(self) - except KeyboardInterrupt: - pass - - def handle_error(self, request, client_address): - if self.passthrough_errors: - raise - else: - return HTTPServer.handle_error(self, request, client_address) - - def get_request(self): - con, info = self.socket.accept() - if self.ssl_context is not None: - con = _SSLConnectionFix(con) - return con, info - - -class ThreadedWSGIServer(ThreadingMixIn, BaseWSGIServer): - """A WSGI server that does threading.""" - multithread = True - - -class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer): - """A WSGI server that does forking.""" - multiprocess = True - - def __init__(self, host, port, app, processes=40, handler=None, - passthrough_errors=False, ssl_context=None): - BaseWSGIServer.__init__(self, host, port, app, handler, - passthrough_errors, ssl_context) - self.max_children = processes - - -def make_server(host, port, app=None, threaded=False, processes=1, - request_handler=None, passthrough_errors=False, - ssl_context=None): - """Create a new server instance that is either threaded, or forks - or just processes one request after another. - """ - if threaded and processes > 1: - raise ValueError("cannot have a multithreaded and " - "multi process server.") - elif threaded: - return ThreadedWSGIServer(host, port, app, request_handler, - passthrough_errors, ssl_context) - elif processes > 1: - return ForkingWSGIServer(host, port, app, processes, request_handler, - passthrough_errors, ssl_context) - else: - return BaseWSGIServer(host, port, app, request_handler, - passthrough_errors, ssl_context) - - -def _iter_module_files(): - for module in sys.modules.values(): - filename = getattr(module, '__file__', None) - if filename: - old = None - while not os.path.isfile(filename): - old = filename - filename = os.path.dirname(filename) - if filename == old: - break - else: - if filename[-4:] in ('.pyc', '.pyo'): - filename = filename[:-1] - yield filename - - -def _reloader_stat_loop(extra_files=None, interval=1): - """When this function is run from the main thread, it will force other - threads to exit when any modules currently loaded change. - - Copyright notice. This function is based on the autoreload.py from - the CherryPy trac which originated from WSGIKit which is now dead. - - :param extra_files: a list of additional files it should watch. - """ - from itertools import chain - mtimes = {} - while 1: - for filename in chain(_iter_module_files(), extra_files or ()): - try: - mtime = os.stat(filename).st_mtime - except OSError: - continue - - old_time = mtimes.get(filename) - if old_time is None: - mtimes[filename] = mtime - continue - elif mtime > old_time: - _log('info', ' * Detected change in %r, reloading' % filename) - sys.exit(3) - time.sleep(interval) - - -def _reloader_inotify(extra_files=None, interval=None): - # Mutated by inotify loop when changes occur. - changed = [False] - - # Setup inotify watches - from pyinotify import WatchManager, Notifier - - # this API changed at one point, support both - try: - from pyinotify import EventsCodes as ec - ec.IN_ATTRIB - except (ImportError, AttributeError): - import pyinotify as ec - - wm = WatchManager() - mask = ec.IN_DELETE_SELF | ec.IN_MOVE_SELF | ec.IN_MODIFY | ec.IN_ATTRIB - - def signal_changed(event): - if changed[0]: - return - _log('info', ' * Detected change in %r, reloading' % event.path) - changed[:] = [True] - - for fname in extra_files or (): - wm.add_watch(fname, mask, signal_changed) - - # ... And now we wait... - notif = Notifier(wm) - try: - while not changed[0]: - # always reiterate through sys.modules, adding them - for fname in _iter_module_files(): - wm.add_watch(fname, mask, signal_changed) - notif.process_events() - if notif.check_events(timeout=interval): - notif.read_events() - # TODO Set timeout to something small and check parent liveliness - finally: - notif.stop() - sys.exit(3) - - -# currently we always use the stat loop reloader for the simple reason -# that the inotify one does not respond to added files properly. Also -# it's quite buggy and the API is a mess. -reloader_loop = _reloader_stat_loop - - -def restart_with_reloader(): - """Spawn a new Python interpreter with the same arguments as this one, - but running the reloader thread. - """ - while 1: - _log('info', ' * Restarting with reloader') - args = [sys.executable] + sys.argv - new_environ = os.environ.copy() - new_environ['WERKZEUG_RUN_MAIN'] = 'true' - - # a weird bug on windows. sometimes unicode strings end up in the - # environment and subprocess.call does not like this, encode them - # to latin1 and continue. - if os.name == 'nt': - for key, value in new_environ.iteritems(): - if isinstance(value, unicode): - new_environ[key] = value.encode('iso-8859-1') - - exit_code = subprocess.call(args, env=new_environ) - if exit_code != 3: - return exit_code - - -def run_with_reloader(main_func, extra_files=None, interval=1): - """Run the given function in an independent python interpreter.""" - import signal - signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) - if os.environ.get('WERKZEUG_RUN_MAIN') == 'true': - thread.start_new_thread(main_func, ()) - try: - reloader_loop(extra_files, interval) - except KeyboardInterrupt: - return - try: - sys.exit(restart_with_reloader()) - except KeyboardInterrupt: - pass - - -def run_simple(hostname, port, application, use_reloader=False, - use_debugger=False, use_evalex=True, - extra_files=None, reloader_interval=1, threaded=False, - processes=1, request_handler=None, static_files=None, - passthrough_errors=False, ssl_context=None): - """Start an application using wsgiref and with an optional reloader. This - wraps `wsgiref` to fix the wrong default reporting of the multithreaded - WSGI variable and adds optional multithreading and fork support. - - .. versionadded:: 0.5 - `static_files` was added to simplify serving of static files as well - as `passthrough_errors`. - - .. versionadded:: 0.6 - support for SSL was added. - - :param hostname: The host for the application. eg: ``'localhost'`` - :param port: The port for the server. eg: ``8080`` - :param application: the WSGI application to execute - :param use_reloader: should the server automatically restart the python - process if modules were changed? - :param use_debugger: should the werkzeug debugging system be used? - :param use_evalex: should the exception evaluation feature be enabled? - :param extra_files: a list of files the reloader should watch - additionally to the modules. For example configuration - files. - :param reloader_interval: the interval for the reloader in seconds. - :param threaded: should the process handle each request in a separate - thread? - :param processes: number of processes to spawn. - :param request_handler: optional parameter that can be used to replace - the default one. You can use this to replace it - with a different - :class:`~BaseHTTPServer.BaseHTTPRequestHandler` - subclass. - :param static_files: a dict of paths for static files. This works exactly - like :class:`SharedDataMiddleware`, it's actually - just wrapping the application in that middleware before - serving. - :param passthrough_errors: set this to `True` to disable the error catching. - This means that the server will die on errors but - it can be useful to hook debuggers in (pdb etc.) - :param ssl_context: an SSL context for the connection. Either an OpenSSL - context, the string ``'adhoc'`` if the server should - automatically create one, or `None` to disable SSL - (which is the default). - """ - if use_debugger: - from werkzeug.debug import DebuggedApplication - application = DebuggedApplication(application, use_evalex) - if static_files: - from werkzeug.wsgi import SharedDataMiddleware - application = SharedDataMiddleware(application, static_files) - - def inner(): - make_server(hostname, port, application, threaded, - processes, request_handler, - passthrough_errors, ssl_context).serve_forever() - - if os.environ.get('WERKZEUG_RUN_MAIN') != 'true': - display_hostname = hostname != '*' and hostname or 'localhost' - if ':' in display_hostname: - display_hostname = '[%s]' % display_hostname - _log('info', ' * Running on %s://%s:%d/', ssl_context is None - and 'http' or 'https', display_hostname, port) - if use_reloader: - # Create and destroy a socket so that any exceptions are raised before - # we spawn a separate Python interpreter and lose this ability. - address_family = select_ip_version(hostname, port) - test_socket = socket.socket(address_family, socket.SOCK_STREAM) - test_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - test_socket.bind((hostname, port)) - test_socket.close() - run_with_reloader(inner, extra_files, reloader_interval) - else: - inner() diff --git a/src/lib/werkzeug/templates.py b/src/lib/werkzeug/templates.py deleted file mode 100644 index a9d60e9..0000000 --- a/src/lib/werkzeug/templates.py +++ /dev/null @@ -1,399 +0,0 @@ -# -*- coding: utf-8 -*- -r""" - werkzeug.templates - ~~~~~~~~~~~~~~~~~~ - - A minimal template engine. - - :copyright: (c) 2011 by the Werkzeug Team, see AUTHORS for more details. - :license: BSD License. -""" -import sys -import re -import __builtin__ as builtins -from compiler import ast, parse -from compiler.pycodegen import ModuleCodeGenerator -from tokenize import PseudoToken -from werkzeug import urls, utils -from werkzeug._internal import _decode_unicode -from werkzeug.datastructures import MultiDict - - -from warnings import warn -warn(DeprecationWarning('werkzeug.templates is deprecated and ' - 'will be removed in Werkzeug 1.0')) - - -# Copyright notice: The `parse_data` method uses the string interpolation -# algorithm by Ka-Ping Yee which originally was part of `Itpl20.py`_. -# -# .. _Itpl20.py: http://lfw.org/python/Itpl20.py - - -token_re = re.compile('%s|%s(?s)' % ( - r'[uU]?[rR]?("""|\'\'\')((?\n?(?s)') -escape_re = re.compile(r'\\\n|\\(\\|<%)') -namestart_chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_' -undefined = type('UndefinedType', (object,), { - '__iter__': lambda x: iter(()), - '__repr__': lambda x: 'Undefined', - '__str__': lambda x: '' -})() -runtime_vars = frozenset(['Undefined', '__to_unicode', '__context', - '__write', '__write_many']) - - -def call_stmt(func, args, lineno): - return ast.CallFunc(ast.Name(func, lineno=lineno), - args, lineno=lineno) - - -def tokenize(source, filename): - escape = escape_re.sub - escape_repl = lambda m: m.group(1) or '' - lineno = 1 - pos = 0 - - for match in directive_re.finditer(source): - start, end = match.span() - if start > pos: - data = source[pos:start] - yield lineno, 'data', escape(escape_repl, data) - lineno += data.count('\n') - is_comment, is_code, cmd, args = match.groups() - if is_code: - yield lineno, 'code', args - elif not is_comment: - yield lineno, 'cmd', (cmd, args) - lineno += source[start:end].count('\n') - pos = end - - if pos < len(source): - yield lineno, 'data', escape(escape_repl, source[pos:]) - - -def transform(node, filename): - root = ast.Module(None, node, lineno=1) - nodes = [root] - while nodes: - node = nodes.pop() - node.filename = filename - if node.__class__ in (ast.Printnl, ast.Print): - node.dest = ast.Name('__context') - elif node.__class__ is ast.Const and isinstance(node.value, str): - try: - node.value.decode('ascii') - except UnicodeError: - node.value = node.value.decode('utf-8') - nodes.extend(node.getChildNodes()) - return root - - -class TemplateSyntaxError(SyntaxError): - - def __init__(self, msg, filename, lineno): - from linecache import getline - l = getline(filename, lineno) - SyntaxError.__init__(self, msg, (filename, lineno, len(l) or 1, l)) - - -class Parser(object): - - def __init__(self, gen, filename): - self.gen = gen - self.filename = filename - self.lineno = 1 - - def fail(self, msg): - raise TemplateSyntaxError(msg, self.filename, self.lineno) - - def parse_python(self, expr, type='exec'): - if isinstance(expr, unicode): - expr = '\xef\xbb\xbf' + expr.encode('utf-8') - try: - node = parse(expr, type) - except SyntaxError, e: - raise TemplateSyntaxError(str(e), self.filename, - self.lineno + e.lineno - 1) - nodes = [node] - while nodes: - n = nodes.pop() - if hasattr(n, 'lineno'): - n.lineno = (n.lineno or 1) + self.lineno - 1 - nodes.extend(n.getChildNodes()) - return node.node - - def parse(self, needle=()): - start_lineno = self.lineno - result = [] - add = result.append - for self.lineno, token, value in self.gen: - if token == 'data': - add(self.parse_data(value)) - elif token == 'code': - add(self.parse_code(value.splitlines())) - elif token == 'cmd': - name, args = value - if name in needle: - return name, args, ast.Stmt(result, lineno=start_lineno) - if name in ('for', 'while'): - add(self.parse_loop(args, name)) - elif name == 'if': - add(self.parse_if(args)) - else: - self.fail('unknown directive %s' % name) - if needle: - self.fail('unexpected end of template') - return ast.Stmt(result, lineno=start_lineno) - - def parse_loop(self, args, type): - rv = self.parse_python('%s %s: pass' % (type, args), 'exec').nodes[0] - tag, value, rv.body = self.parse(('end' + type, 'else')) - if value: - self.fail('unexpected data after ' + tag) - if tag == 'else': - tag, value, rv.else_ = self.parse(('end' + type,)) - if value: - self.fail('unexpected data after else') - return rv - - def parse_if(self, args): - cond = self.parse_python('if %s: pass' % args).nodes[0] - tag, value, body = self.parse(('else', 'elif', 'endif')) - cond.tests[0] = (cond.tests[0][0], body) - while 1: - if tag == 'else': - if value: - self.fail('unexpected data after else') - tag, value, cond.else_ = self.parse(('endif',)) - elif tag == 'elif': - expr = self.parse_python(value, 'eval') - tag, value, body = self.parse(('else', 'elif', 'endif')) - cond.tests.append((expr, body)) - continue - break - if value: - self.fail('unexpected data after endif') - return cond - - def parse_code(self, lines): - margin = sys.maxint - for line in lines[1:]: - content = len(line.lstrip()) - if content: - indent = len(line) - content - margin = min(margin, indent) - if lines: - lines[0] = lines[0].lstrip() - if margin < sys.maxint: - for i in xrange(1, len(lines)): - lines[i] = lines[i][margin:] - while lines and not lines[-1]: - lines.pop() - while lines and not lines[0]: - lines.pop(0) - return self.parse_python('\n'.join(lines)) - - def parse_data(self, text): - start_lineno = lineno = self.lineno - pos = 0 - end = len(text) - nodes = [] - - def match_or_fail(pos): - match = token_re.match(text, pos) - if match is None: - self.fail('invalid syntax') - return match.group().strip(), match.end() - - def write_expr(code): - node = self.parse_python(code, 'eval') - nodes.append(call_stmt('__to_unicode', [node], lineno)) - return code.count('\n') - - def write_data(value): - if value: - nodes.append(ast.Const(value, lineno=lineno)) - return value.count('\n') - return 0 - - while 1: - offset = text.find('$', pos) - if offset < 0: - break - next = text[offset + 1] - - if next == '{': - lineno += write_data(text[pos:offset]) - pos = offset + 2 - level = 1 - while level: - token, pos = match_or_fail(pos) - if token in ('{', '}'): - level += token == '{' and 1 or -1 - lineno += write_expr(text[offset + 2:pos - 1]) - elif next in namestart_chars: - lineno += write_data(text[pos:offset]) - token, pos = match_or_fail(offset + 1) - while pos < end: - if text[pos] == '.' and pos + 1 < end and \ - text[pos + 1] in namestart_chars: - token, pos = match_or_fail(pos + 1) - elif text[pos] in '([': - pos += 1 - level = 1 - while level: - token, pos = match_or_fail(pos) - if token in ('(', ')', '[', ']'): - level += token in '([' and 1 or -1 - else: - break - lineno += write_expr(text[offset + 1:pos]) - else: - lineno += write_data(text[pos:offset + 1]) - pos = offset + 1 + (next == '$') - write_data(text[pos:]) - - return ast.Discard(call_stmt(len(nodes) == 1 and '__write' or - '__write_many', nodes, start_lineno), - lineno=start_lineno) - - -class Context(object): - - def __init__(self, namespace, charset, errors): - self.charset = charset - self.errors = errors - self._namespace = namespace - self._buffer = [] - self._write = self._buffer.append - _extend = self._buffer.extend - self.runtime = dict( - Undefined=undefined, - __to_unicode=self.to_unicode, - __context=self, - __write=self._write, - __write_many=lambda *a: _extend(a) - ) - - def write(self, value): - self._write(self.to_unicode(value)) - - def to_unicode(self, value): - if isinstance(value, str): - return _decode_unicode(value, self.charset, self.errors) - return unicode(value) - - def get_value(self, as_unicode=True): - rv = u''.join(self._buffer) - if not as_unicode: - return rv.encode(self.charset, self.errors) - return rv - - def __getitem__(self, key, default=undefined): - try: - return self._namespace[key] - except KeyError: - return getattr(builtins, key, default) - - def get(self, key, default=None): - return self.__getitem__(key, default) - - def __setitem__(self, key, value): - self._namespace[key] = value - - def __delitem__(self, key): - del self._namespace[key] - - -class TemplateCodeGenerator(ModuleCodeGenerator): - - def __init__(self, node, filename): - ModuleCodeGenerator.__init__(self, transform(node, filename)) - - def _nameOp(self, prefix, name): - if name in runtime_vars: - return self.emit(prefix + '_GLOBAL', name) - return ModuleCodeGenerator._nameOp(self, prefix, name) - - -class Template(object): - """Represents a simple text based template. It's a good idea to load such - templates from files on the file system to get better debug output. - """ - - default_context = { - 'escape': utils.escape, - 'url_quote': urls.url_quote, - 'url_quote_plus': urls.url_quote_plus, - 'url_encode': urls.url_encode - } - - def __init__(self, source, filename='