From e9f1e6ca2354c2cfc7e08ac7986e8d71480e8e36 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Wed, 21 Aug 2024 17:45:41 -0600 Subject: [PATCH 001/111] Allows 'Open Workspace' to open workspace whenever possible, even if logfile doesn't exist --- workbench/src/main/ipcMainChannels.js | 1 + workbench/src/main/setupDialogs.js | 6 +++++ .../renderer/components/InvestTab/index.jsx | 27 ++++++++++++++++--- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/workbench/src/main/ipcMainChannels.js b/workbench/src/main/ipcMainChannels.js index de7ca13c19..f908d7c33b 100644 --- a/workbench/src/main/ipcMainChannels.js +++ b/workbench/src/main/ipcMainChannels.js @@ -14,6 +14,7 @@ export const ipcMainChannels = { IS_FIRST_RUN: 'is-first-run', LOGGER: 'logger', OPEN_EXTERNAL_URL: 'open-external-url', + OPEN_PATH: 'open-path', OPEN_LOCAL_HTML: 'open-local-html', SET_SETTING: 'set-setting', SHOW_ITEM_IN_FOLDER: 'show-item-in-folder', diff --git a/workbench/src/main/setupDialogs.js b/workbench/src/main/setupDialogs.js index cecc003a90..3e79df45ba 100644 --- a/workbench/src/main/setupDialogs.js +++ b/workbench/src/main/setupDialogs.js @@ -26,4 +26,10 @@ export default function setupDialogs() { shell.showItemInFolder(filepath); } ); + + ipcMain.handle( + ipcMainChannels.OPEN_PATH, async (event, dirpath) => { + return await shell.openPath(dirpath); + } + ); } diff --git a/workbench/src/renderer/components/InvestTab/index.jsx b/workbench/src/renderer/components/InvestTab/index.jsx index 0c250a4e3a..e8e66c485f 100644 --- a/workbench/src/renderer/components/InvestTab/index.jsx +++ b/workbench/src/renderer/components/InvestTab/index.jsx @@ -45,8 +45,27 @@ async function investGetSpec(modelName) { return undefined; } -function handleOpenWorkspace(logfile) { - ipcRenderer.send(ipcMainChannels.SHOW_ITEM_IN_FOLDER, logfile); +function handleOpenWorkspace(logfile, workspace_dir) { + if (logfile) { + logger.info(`Attempting to show logfile in workspace directory: ${logfile}`); + ipcRenderer.send(ipcMainChannels.SHOW_ITEM_IN_FOLDER, logfile); + } + // Always call shell.openPath. + // If shell.showItemInFolder failed, it will have failed silently; + // if it succeeded, the subsequent call to shell.openPath will not "undo" the result of shell.showItemInFolder. + openWorkspaceDir(workspace_dir); +} + +async function openWorkspaceDir(workspace_dir) { + logger.info(`Attempting to open directory: ${workspace_dir}`); + const error = await ipcRenderer.invoke(ipcMainChannels.OPEN_PATH, workspace_dir); + if (error) { + logger.error(`Error opening directory: ${error}`); + // @TODO: render this error message in a modal + alert('Failed to open workspace directory. Make sure the directory exists and that you have write access to it.'); + } else { + logger.info(`Directory should be open now`); + } } /** @@ -154,6 +173,7 @@ class InvestTab extends React.Component { updateJobProperties(tabID, { argsValues: args, status: undefined, // in case of re-run, clear an old status + logfile: undefined, // in case of re-run where logfile may no longer exist, clear old logfile path }); ipcRenderer.send( @@ -200,6 +220,7 @@ class InvestTab extends React.Component { argsValues, logfile, } = this.props.job; + const {workspace_dir} = argsValues; const { tabID, t } = this.props; @@ -253,7 +274,7 @@ class InvestTab extends React.Component { ? ( handleOpenWorkspace(logfile)} + handleOpenWorkspace={() => handleOpenWorkspace(logfile, workspace_dir)} terminateInvestProcess={this.terminateInvestProcess} /> ) From c182f29a856c40989fef099c0799cf2ccebe4cf9 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Thu, 22 Aug 2024 17:44:55 -0600 Subject: [PATCH 002/111] Adds/updates tests --- .../renderer/components/InvestTab/index.jsx | 13 +-- workbench/tests/main/main.test.js | 1 + workbench/tests/renderer/investtab.test.js | 94 ++++++++++++++++++- 3 files changed, 100 insertions(+), 8 deletions(-) diff --git a/workbench/src/renderer/components/InvestTab/index.jsx b/workbench/src/renderer/components/InvestTab/index.jsx index e8e66c485f..971feab23c 100644 --- a/workbench/src/renderer/components/InvestTab/index.jsx +++ b/workbench/src/renderer/components/InvestTab/index.jsx @@ -50,10 +50,12 @@ function handleOpenWorkspace(logfile, workspace_dir) { logger.info(`Attempting to show logfile in workspace directory: ${logfile}`); ipcRenderer.send(ipcMainChannels.SHOW_ITEM_IN_FOLDER, logfile); } - // Always call shell.openPath. - // If shell.showItemInFolder failed, it will have failed silently; - // if it succeeded, the subsequent call to shell.openPath will not "undo" the result of shell.showItemInFolder. - openWorkspaceDir(workspace_dir); + if (workspace_dir) { + // Always call shell.openPath. + // If shell.showItemInFolder failed, it will have failed silently; + // if it succeeded, the subsequent call to shell.openPath will not "undo" the result of shell.showItemInFolder. + openWorkspaceDir(workspace_dir); + } } async function openWorkspaceDir(workspace_dir) { @@ -220,7 +222,6 @@ class InvestTab extends React.Component { argsValues, logfile, } = this.props.job; - const {workspace_dir} = argsValues; const { tabID, t } = this.props; @@ -274,7 +275,7 @@ class InvestTab extends React.Component { ? ( handleOpenWorkspace(logfile, workspace_dir)} + handleOpenWorkspace={() => handleOpenWorkspace(logfile, argsValues?.workspace_dir)} terminateInvestProcess={this.terminateInvestProcess} /> ) diff --git a/workbench/tests/main/main.test.js b/workbench/tests/main/main.test.js index a65e806ff6..2b479b6882 100644 --- a/workbench/tests/main/main.test.js +++ b/workbench/tests/main/main.test.js @@ -187,6 +187,7 @@ describe('createWindow', () => { ipcMainChannels.GET_N_CPUS, ipcMainChannels.INVEST_VERSION, ipcMainChannels.IS_FIRST_RUN, + ipcMainChannels.OPEN_PATH, ipcMainChannels.SHOW_OPEN_DIALOG, ipcMainChannels.SHOW_SAVE_DIALOG, ]; diff --git a/workbench/tests/renderer/investtab.test.js b/workbench/tests/renderer/investtab.test.js index 74e9c9aa8e..5694440863 100644 --- a/workbench/tests/renderer/investtab.test.js +++ b/workbench/tests/renderer/investtab.test.js @@ -117,10 +117,100 @@ describe('Run status Alert renders with status from a recent run', () => { logfile: 'foo.txt', }); + jest.spyOn(shell, 'showItemInFolder'); + + const { findByRole } = renderInvestTab(job); + const openWorkspaceBtn = await findByRole('button', { name: 'Open Workspace' }); + expect(openWorkspaceBtn).toBeTruthy(); + openWorkspaceBtn.click(); + expect(shell.showItemInFolder).toHaveBeenCalledTimes(1); + }); +}); + +describe('Open Workspace button', () => { + const spec = { + args: {}, + }; + + const baseJob = { + ...DEFAULT_JOB, + status: 'success', + }; + + beforeEach(() => { + getSpec.mockResolvedValue(spec); + fetchValidation.mockResolvedValue([]); + uiConfig.UI_SPEC = mockUISpec(spec); + setupDialogs(); + }); + + afterEach(() => { + removeIpcMainListeners(); + }); + + test('should open workspace with logfile selected, if logfile exists', async () => { + const job = { + ...baseJob, + argsValues: { + workspace_dir: '/workspace', + }, + logfile: '/workspace/log.txt', + }; + + jest.spyOn(shell, 'showItemInFolder'); + const { findByRole } = renderInvestTab(job); - const openWorkspace = await findByRole('button', { name: 'Open Workspace' }) - openWorkspace.click(); + const openWorkspaceBtn = await findByRole('button', { name: 'Open Workspace' }); + openWorkspaceBtn.click(); + expect(shell.showItemInFolder).toHaveBeenCalledTimes(1); + expect(shell.showItemInFolder).toHaveBeenCalledWith(job.logfile); + }); + + test('should open workspace (without logfile selected), if workspace exists but logfile does not', async () => { + const job = { + ...baseJob, + argsValues: { + workspace_dir: '/workspace', + }, + logfile: undefined, + }; + + jest.spyOn(shell, 'showItemInFolder'); + jest.spyOn(ipcRenderer, 'invoke'); + + const { findByRole } = renderInvestTab(job); + const openWorkspaceBtn = await findByRole('button', { name: 'Open Workspace' }) + openWorkspaceBtn.click(); + + expect(shell.showItemInFolder).not.toHaveBeenCalled(); + expect(ipcRenderer.invoke).toHaveBeenCalledTimes(1); + expect(ipcRenderer.invoke).toHaveBeenCalledWith(ipcMainChannels.OPEN_PATH, job.argsValues.workspace_dir); + }); + + test('should present an error message to the user if workspace cannot be opened (e.g., if it does not exist)', async () => { + const job = { + ...baseJob, + status: 'error', + argsValues: { + workspace_dir: '/nonexistent-workspace', + }, + logfile: undefined, + }; + + jest.spyOn(shell, 'showItemInFolder'); + jest.spyOn(ipcRenderer, 'invoke'); + ipcRenderer.invoke.mockResolvedValue('Error opening workspace'); + + const { findByRole } = renderInvestTab(job); + const openWorkspaceBtn = await findByRole('button', { name: 'Open Workspace' }) + openWorkspaceBtn.click(); + + expect(shell.showItemInFolder).not.toHaveBeenCalled(); + expect(ipcRenderer.invoke).toHaveBeenCalledTimes(1); + expect(ipcRenderer.invoke).toHaveBeenCalledWith(ipcMainChannels.OPEN_PATH, job.argsValues.workspace_dir); + + // @TODO: expect error message UI element to exist }); }); From c50520921abecec2bb5800df0008da9471237e9a Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Fri, 23 Aug 2024 14:01:47 -0600 Subject: [PATCH 003/111] Adds "error opening workspace" modal & updates tests --- .../renderer/components/InvestTab/index.jsx | 229 ++++++++++-------- workbench/tests/renderer/investtab.test.js | 7 +- 2 files changed, 130 insertions(+), 106 deletions(-) diff --git a/workbench/src/renderer/components/InvestTab/index.jsx b/workbench/src/renderer/components/InvestTab/index.jsx index 971feab23c..dbfd04df17 100644 --- a/workbench/src/renderer/components/InvestTab/index.jsx +++ b/workbench/src/renderer/components/InvestTab/index.jsx @@ -7,6 +7,8 @@ import TabContainer from 'react-bootstrap/TabContainer'; import Nav from 'react-bootstrap/Nav'; import Row from 'react-bootstrap/Row'; import Col from 'react-bootstrap/Col'; +import Modal from 'react-bootstrap/Modal'; +import Button from 'react-bootstrap/Button'; import { MdKeyboardArrowRight, } from 'react-icons/md'; @@ -45,31 +47,6 @@ async function investGetSpec(modelName) { return undefined; } -function handleOpenWorkspace(logfile, workspace_dir) { - if (logfile) { - logger.info(`Attempting to show logfile in workspace directory: ${logfile}`); - ipcRenderer.send(ipcMainChannels.SHOW_ITEM_IN_FOLDER, logfile); - } - if (workspace_dir) { - // Always call shell.openPath. - // If shell.showItemInFolder failed, it will have failed silently; - // if it succeeded, the subsequent call to shell.openPath will not "undo" the result of shell.showItemInFolder. - openWorkspaceDir(workspace_dir); - } -} - -async function openWorkspaceDir(workspace_dir) { - logger.info(`Attempting to open directory: ${workspace_dir}`); - const error = await ipcRenderer.invoke(ipcMainChannels.OPEN_PATH, workspace_dir); - if (error) { - logger.error(`Error opening directory: ${error}`); - // @TODO: render this error message in a modal - alert('Failed to open workspace directory. Make sure the directory exists and that you have write access to it.'); - } else { - logger.info(`Directory should be open now`); - } -} - /** * Render an invest model setup form, log display, etc. * Manage launching of an invest model in a child process. @@ -85,6 +62,7 @@ class InvestTab extends React.Component { uiSpec: null, userTerminated: false, executeClicked: false, + showErrorModal: false, }; this.investExecute = this.investExecute.bind(this); @@ -92,6 +70,9 @@ class InvestTab extends React.Component { this.terminateInvestProcess = this.terminateInvestProcess.bind(this); this.investLogfileCallback = this.investLogfileCallback.bind(this); this.investExitCallback = this.investExitCallback.bind(this); + this.handleOpenWorkspace = this.handleOpenWorkspace.bind(this); + this.openWorkspaceDir = this.openWorkspaceDir.bind(this); + this.showErrorModal = this.showErrorModal.bind(this); } async componentDidMount() { @@ -208,6 +189,36 @@ class InvestTab extends React.Component { ); } + handleOpenWorkspace(logfile, workspace_dir) { + if (logfile) { + logger.info(`Attempting to show logfile in workspace directory: ${logfile}`); + ipcRenderer.send(ipcMainChannels.SHOW_ITEM_IN_FOLDER, logfile); + } + if (workspace_dir) { + // Always call shell.openPath. + // If shell.showItemInFolder failed, it will have failed silently; + // if it succeeded, the subsequent call to shell.openPath will not "undo" the result of shell.showItemInFolder. + this.openWorkspaceDir(workspace_dir); + } + } + + async openWorkspaceDir(workspace_dir) { + logger.info(`Attempting to open directory: ${workspace_dir}`); + const error = await ipcRenderer.invoke(ipcMainChannels.OPEN_PATH, workspace_dir); + if (error) { + logger.error(`Error opening directory: ${error}`); + this.showErrorModal(true); + } else { + logger.info(`Directory should be open now`); + } + } + + showErrorModal(shouldShow) { + this.setState({ + showErrorModal: shouldShow, + }); + } + render() { const { activeTab, @@ -215,6 +226,7 @@ class InvestTab extends React.Component { argsSpec, uiSpec, executeClicked, + showErrorModal, } = this.state; const { status, @@ -235,88 +247,99 @@ class InvestTab extends React.Component { const sidebarFooterElementId = `sidebar-footer-${tabID}`; return ( - - - - -
-
- -
-
+ + + - { - status - ? ( - handleOpenWorkspace(logfile, argsValues?.workspace_dir)} - terminateInvestProcess={this.terminateInvestProcess} - /> - ) - : null - } -
- - - - - + {t('Setup')} + + + + {t('Log')} + + + +
+
+ - - +
- - - - - - + { + status + ? ( + this.handleOpenWorkspace(logfile, argsValues?.workspace_dir)} + terminateInvestProcess={this.terminateInvestProcess} + /> + ) + : null + } +
+ + + + + + + + + + + + + + this.showErrorModal(false)} aria-labelledby="error-modal-title"> + + {t('Error opening workspace')} + + {t('Failed to open workspace directory. Make sure the directory exists and that you have write access to it.')} + + + + + ); } } diff --git a/workbench/tests/renderer/investtab.test.js b/workbench/tests/renderer/investtab.test.js index 5694440863..1b6f9f544d 100644 --- a/workbench/tests/renderer/investtab.test.js +++ b/workbench/tests/renderer/investtab.test.js @@ -203,14 +203,15 @@ describe('Open Workspace button', () => { ipcRenderer.invoke.mockResolvedValue('Error opening workspace'); const { findByRole } = renderInvestTab(job); - const openWorkspaceBtn = await findByRole('button', { name: 'Open Workspace' }) + const openWorkspaceBtn = await findByRole('button', { name: 'Open Workspace' }); openWorkspaceBtn.click(); expect(shell.showItemInFolder).not.toHaveBeenCalled(); expect(ipcRenderer.invoke).toHaveBeenCalledTimes(1); expect(ipcRenderer.invoke).toHaveBeenCalledWith(ipcMainChannels.OPEN_PATH, job.argsValues.workspace_dir); - // @TODO: expect error message UI element to exist + const errorModal = await findByRole('dialog', { name: 'Error opening workspace'}); + expect(errorModal).toBeTruthy(); }); }); @@ -505,7 +506,7 @@ describe('InVEST Run Button', () => { uiConfig.UI_SPEC = mockUISpec(spec); }); - test('Changing inputs trigger validation & enable/disable Run', async () => { + xtest('Changing inputs trigger validation & enable/disable Run', async () => { let invalidFeedback = 'is a required key'; fetchValidation.mockResolvedValue([[['a', 'b'], invalidFeedback]]); From d824e973b2d75b27f325ae698562a5d497208887 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Fri, 23 Aug 2024 14:13:41 -0600 Subject: [PATCH 004/111] Removes unneeded log messages & updates HISTORY --- HISTORY.rst | 1 + workbench/src/renderer/components/InvestTab/index.jsx | 6 +----- workbench/tests/renderer/investtab.test.js | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 47406cd82c..54ac3a115c 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -39,6 +39,7 @@ Unreleased Changes ------------------ * Workbench * Several small updates to the model input form UI to improve usability and visual consistency (https://github.com/natcap/invest/issues/912) + * Fixed a bug that caused the application to crash when attempting to open a workspace without a valid logfile (https://github.com/natcap/invest/issues/1598) 3.14.2 (2024-05-29) ------------------- diff --git a/workbench/src/renderer/components/InvestTab/index.jsx b/workbench/src/renderer/components/InvestTab/index.jsx index dbfd04df17..f6624f2142 100644 --- a/workbench/src/renderer/components/InvestTab/index.jsx +++ b/workbench/src/renderer/components/InvestTab/index.jsx @@ -191,7 +191,6 @@ class InvestTab extends React.Component { handleOpenWorkspace(logfile, workspace_dir) { if (logfile) { - logger.info(`Attempting to show logfile in workspace directory: ${logfile}`); ipcRenderer.send(ipcMainChannels.SHOW_ITEM_IN_FOLDER, logfile); } if (workspace_dir) { @@ -203,13 +202,10 @@ class InvestTab extends React.Component { } async openWorkspaceDir(workspace_dir) { - logger.info(`Attempting to open directory: ${workspace_dir}`); const error = await ipcRenderer.invoke(ipcMainChannels.OPEN_PATH, workspace_dir); if (error) { - logger.error(`Error opening directory: ${error}`); + logger.error(`Error opening workspace (${workspace_dir}). ${error}`); this.showErrorModal(true); - } else { - logger.info(`Directory should be open now`); } } diff --git a/workbench/tests/renderer/investtab.test.js b/workbench/tests/renderer/investtab.test.js index 1b6f9f544d..4a82955f32 100644 --- a/workbench/tests/renderer/investtab.test.js +++ b/workbench/tests/renderer/investtab.test.js @@ -506,7 +506,7 @@ describe('InVEST Run Button', () => { uiConfig.UI_SPEC = mockUISpec(spec); }); - xtest('Changing inputs trigger validation & enable/disable Run', async () => { + test('Changing inputs trigger validation & enable/disable Run', async () => { let invalidFeedback = 'is a required key'; fetchValidation.mockResolvedValue([[['a', 'b'], invalidFeedback]]); From 2c7e4f808718f7ac2b646c85cf8abf1a2dfac898 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Mon, 26 Aug 2024 16:43:18 -0600 Subject: [PATCH 005/111] Updates directory permissions validation to use an EAFP approach --- src/natcap/invest/validation.py | 62 ++++++++++++++------------------- tests/test_validation.py | 55 +++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 35 deletions(-) diff --git a/src/natcap/invest/validation.py b/src/natcap/invest/validation.py index 56e053dd7f..314220f912 100644 --- a/src/natcap/invest/validation.py +++ b/src/natcap/invest/validation.py @@ -9,6 +9,7 @@ import pprint import queue import re +import tempfile import threading import warnings @@ -166,9 +167,8 @@ def check_directory(dirpath, must_exist=True, permissions='rx', **kwargs): must_exist=True (bool): If ``True``, the directory at ``dirpath`` must already exist on the filesystem. permissions='rx' (string): A string that includes the lowercase - characters ``r``, ``w`` and/or ``x`` indicating required - permissions for this folder . See ``check_permissions`` for - details. + characters ``r``, ``w`` and/or ``x``, indicating read, write, and execute + permissions (respectively) required for this directory. Returns: A string error message if an error was found. ``None`` otherwise. @@ -193,9 +193,26 @@ def check_directory(dirpath, must_exist=True, permissions='rx', **kwargs): dirpath = parent break - permissions_warning = check_permissions(dirpath, permissions, True) - if permissions_warning: - return permissions_warning + MESSAGE_KEY = 'NEED_PERMISSION_DIRECTORY' + + if 'r' in permissions: + try: + os.scandir(dirpath).close() + except: + return MESSAGES[MESSAGE_KEY].format(permission='read') + + # Check for x access before checking for w, since w operations to a dir are dependent on x access + if 'x' in permissions: + try: + os.chdir(dirpath) + except: + return MESSAGES[MESSAGE_KEY].format(permission='execute') + + if 'w' in permissions: + try: + tempfile.TemporaryFile(dir=dirpath) + except: + return MESSAGES[MESSAGE_KEY].format(permission='write') def check_file(filepath, permissions='r', **kwargs): @@ -204,9 +221,8 @@ def check_file(filepath, permissions='r', **kwargs): Args: filepath (string): The filepath to validate. permissions='r' (string): A string that includes the lowercase - characters ``r``, ``w`` and/or ``x`` indicating required - permissions for this file. See ``check_permissions`` for - details. + characters ``r``, ``w`` and/or ``x``, indicating read, write, and execute + permissions (respectively) required for this file. Returns: A string error message if an error was found. ``None`` otherwise. @@ -215,36 +231,12 @@ def check_file(filepath, permissions='r', **kwargs): if not os.path.exists(filepath): return MESSAGES['FILE_NOT_FOUND'] - permissions_warning = check_permissions(filepath, permissions) - if permissions_warning: - return permissions_warning - - -def check_permissions(path, permissions, is_directory=False): - """Validate permissions on a filesystem object. - - This function uses ``os.access`` to determine permissions access. - - Args: - path (string): The path to examine for permissions. - permissions (string): a string including the characters ``r``, ``w`` - and/or ``x`` (lowercase), indicating read, write, and execute - permissions (respectively) that the filesystem object at ``path`` - must have. - is_directory (boolean): Indicates whether the path refers to a directory - (True) or a file (False). Defaults to False. - - Returns: - A string error message if an error was found. ``None`` otherwise. - - """ for letter, mode, descriptor in ( ('r', os.R_OK, 'read'), ('w', os.W_OK, 'write'), ('x', os.X_OK, 'execute')): - if letter in permissions and not os.access(path, mode): - message_key = 'NEED_PERMISSION_DIRECTORY' if is_directory else 'NEED_PERMISSION_FILE' - return MESSAGES[message_key].format(permission=descriptor) + if letter in permissions and not os.access(filepath, mode): + return MESSAGES['NEED_PERMISSION_FILE'].format(permission=descriptor) def _check_projection(srs, projected, projection_units): diff --git a/tests/test_validation.py b/tests/test_validation.py index b87e5e6663..0adb5f8a17 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -5,6 +5,7 @@ import os import platform import shutil +import stat import string import tempfile import textwrap @@ -319,6 +320,60 @@ def test_valid_permissions(self): self.assertEqual(None, validation.check_directory( self.workspace_dir, permissions='rwx')) + def test_invalid_permissions_r(self): + """Validation: when a folder must have read/write/execute permissions but is missing write and execute permissions.""" + from natcap.invest import validation + + with tempfile.TemporaryDirectory() as tempdir: + os.chmod(tempdir, stat.S_IREAD) + validation_warning = validation.check_directory(tempdir, permissions='rwx') + self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='execute')) + + def test_invalid_permissions_w(self): + """Validation: when a folder must have read/write/execute permissions but is missing read and execute permissions.""" + from natcap.invest import validation + + with tempfile.TemporaryDirectory() as tempdir: + os.chmod(tempdir, stat.S_IWRITE) + validation_warning = validation.check_directory(tempdir, permissions='rwx') + self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='read')) + + def test_invalid_permissions_x(self): + """Validation: when a folder must have read/write/execute permissions but is missing read and write permissions.""" + from natcap.invest import validation + + with tempfile.TemporaryDirectory() as tempdir: + os.chmod(tempdir, stat.S_IEXEC) + validation_warning = validation.check_directory(tempdir, permissions='rwx') + self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='read')) + + def test_invalid_permissions_rw(self): + """Validation: when a folder must have read/write/execute permissions but is missing execute permission.""" + from natcap.invest import validation + + with tempfile.TemporaryDirectory() as tempdir: + os.chmod(tempdir, stat.S_IREAD | stat.S_IWRITE) + validation_warning = validation.check_directory(tempdir, permissions='rwx') + self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='execute')) + + def test_invalid_permissions_rx(self): + """Validation: when a folder must have read/write/execute permissions but is missing write permission.""" + from natcap.invest import validation + + with tempfile.TemporaryDirectory() as tempdir: + os.chmod(tempdir, stat.S_IREAD | stat.S_IEXEC) + validation_warning = validation.check_directory(tempdir, permissions='rwx') + self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='write')) + + def test_invalid_permissions_wx(self): + """Validation: when a folder must have read/write/execute permissions but is missing read permission.""" + from natcap.invest import validation + + with tempfile.TemporaryDirectory() as tempdir: + os.chmod(tempdir, stat.S_IWRITE | stat.S_IEXEC) + validation_warning = validation.check_directory(tempdir, permissions='rwx') + self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='read')) + def test_workspace_not_exists(self): """Validation: when a folder's parent must exist with permissions.""" from natcap.invest import validation From f03191f6988f5ab23c23609a1b80997e6b662b0f Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 27 Aug 2024 13:49:18 -0600 Subject: [PATCH 006/111] Closes temp file to ensure auto cleanup; reverts chdir operation to prevent side effects --- src/natcap/invest/validation.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/natcap/invest/validation.py b/src/natcap/invest/validation.py index 314220f912..616aab4559 100644 --- a/src/natcap/invest/validation.py +++ b/src/natcap/invest/validation.py @@ -204,13 +204,15 @@ def check_directory(dirpath, must_exist=True, permissions='rx', **kwargs): # Check for x access before checking for w, since w operations to a dir are dependent on x access if 'x' in permissions: try: + cwd = os.getcwd() os.chdir(dirpath) + os.chdir(cwd) except: return MESSAGES[MESSAGE_KEY].format(permission='execute') if 'w' in permissions: try: - tempfile.TemporaryFile(dir=dirpath) + tempfile.TemporaryFile(dir=dirpath).close() except: return MESSAGES[MESSAGE_KEY].format(permission='write') From 789ca5f8134f32f841e23e98ed44de4280ec60e9 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 27 Aug 2024 17:31:08 -0600 Subject: [PATCH 007/111] Rewrites write permission check to avoid using tempfile module --- src/natcap/invest/validation.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/natcap/invest/validation.py b/src/natcap/invest/validation.py index 616aab4559..b94ac2c352 100644 --- a/src/natcap/invest/validation.py +++ b/src/natcap/invest/validation.py @@ -9,7 +9,6 @@ import pprint import queue import re -import tempfile import threading import warnings @@ -212,7 +211,10 @@ def check_directory(dirpath, must_exist=True, permissions='rx', **kwargs): if 'w' in permissions: try: - tempfile.TemporaryFile(dir=dirpath).close() + temp_path = os.path.join(dirpath, '__temp__workspace_validation_check.txt') + with open(temp_path, 'w') as temp: + temp.close() + os.remove(temp_path) except: return MESSAGES[MESSAGE_KEY].format(permission='write') From 6ab5e4320426ca72ac3a299198c49857ff2771b1 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Wed, 28 Aug 2024 14:06:38 -0600 Subject: [PATCH 008/111] Skip directory permissions unit tests on Windows; update HISTORY --- HISTORY.rst | 1 + tests/test_validation.py | 26 +++++++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 47406cd82c..7a6b43fe21 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -39,6 +39,7 @@ Unreleased Changes ------------------ * Workbench * Several small updates to the model input form UI to improve usability and visual consistency (https://github.com/natcap/invest/issues/912) + * Fixed a bug that was allowing readonly workspace directories on Windows (https://github.com/natcap/invest/issues/1599) 3.14.2 (2024-05-29) ------------------- diff --git a/tests/test_validation.py b/tests/test_validation.py index 0adb5f8a17..35da3a2ae5 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -7,6 +7,7 @@ import shutil import stat import string +import sys import tempfile import textwrap import time @@ -320,6 +321,20 @@ def test_valid_permissions(self): self.assertEqual(None, validation.check_directory( self.workspace_dir, permissions='rwx')) + def test_workspace_not_exists(self): + """Validation: when a folder's parent must exist with permissions.""" + from natcap.invest import validation + + dirpath = 'foo' + new_dir = os.path.join(self.workspace_dir, dirpath) + + self.assertEqual(None, validation.check_directory( + new_dir, must_exist=False, permissions='rwx')) + +@unittest.skipIf(sys.platform.startswith('win'), 'requires support for os.chmod(), which is unreliable on Windows') +class DirectoryValidationMacOnly(unittest.TestCase): + """Test Directory Permissions Validation.""" + def test_invalid_permissions_r(self): """Validation: when a folder must have read/write/execute permissions but is missing write and execute permissions.""" from natcap.invest import validation @@ -374,17 +389,6 @@ def test_invalid_permissions_wx(self): validation_warning = validation.check_directory(tempdir, permissions='rwx') self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='read')) - def test_workspace_not_exists(self): - """Validation: when a folder's parent must exist with permissions.""" - from natcap.invest import validation - - dirpath = 'foo' - new_dir = os.path.join(self.workspace_dir, dirpath) - - self.assertEqual(None, validation.check_directory( - new_dir, must_exist=False, permissions='rwx')) - - class FileValidation(unittest.TestCase): """Test File Validator.""" From 3276d21c4d78a1ea4641873d235ded048412b749 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Thu, 29 Aug 2024 17:35:26 -0600 Subject: [PATCH 009/111] Simplifies 'open workspace' behavior, omitting selection of logfile --- .../renderer/components/InvestTab/index.jsx | 10 ++---- workbench/tests/renderer/investtab.test.js | 31 +------------------ 2 files changed, 3 insertions(+), 38 deletions(-) diff --git a/workbench/src/renderer/components/InvestTab/index.jsx b/workbench/src/renderer/components/InvestTab/index.jsx index f6624f2142..8cee4a53b2 100644 --- a/workbench/src/renderer/components/InvestTab/index.jsx +++ b/workbench/src/renderer/components/InvestTab/index.jsx @@ -189,14 +189,8 @@ class InvestTab extends React.Component { ); } - handleOpenWorkspace(logfile, workspace_dir) { - if (logfile) { - ipcRenderer.send(ipcMainChannels.SHOW_ITEM_IN_FOLDER, logfile); - } + handleOpenWorkspace(workspace_dir) { if (workspace_dir) { - // Always call shell.openPath. - // If shell.showItemInFolder failed, it will have failed silently; - // if it succeeded, the subsequent call to shell.openPath will not "undo" the result of shell.showItemInFolder. this.openWorkspaceDir(workspace_dir); } } @@ -284,7 +278,7 @@ class InvestTab extends React.Component { ? ( this.handleOpenWorkspace(logfile, argsValues?.workspace_dir)} + handleOpenWorkspace={() => this.handleOpenWorkspace(argsValues?.workspace_dir)} terminateInvestProcess={this.terminateInvestProcess} /> ) diff --git a/workbench/tests/renderer/investtab.test.js b/workbench/tests/renderer/investtab.test.js index 4a82955f32..2a125fbddc 100644 --- a/workbench/tests/renderer/investtab.test.js +++ b/workbench/tests/renderer/investtab.test.js @@ -117,13 +117,9 @@ describe('Run status Alert renders with status from a recent run', () => { logfile: 'foo.txt', }); - jest.spyOn(shell, 'showItemInFolder'); - const { findByRole } = renderInvestTab(job); const openWorkspaceBtn = await findByRole('button', { name: 'Open Workspace' }); expect(openWorkspaceBtn).toBeTruthy(); - openWorkspaceBtn.click(); - expect(shell.showItemInFolder).toHaveBeenCalledTimes(1); }); }); @@ -148,42 +144,20 @@ describe('Open Workspace button', () => { removeIpcMainListeners(); }); - test('should open workspace with logfile selected, if logfile exists', async () => { - const job = { - ...baseJob, - argsValues: { - workspace_dir: '/workspace', - }, - logfile: '/workspace/log.txt', - }; - - jest.spyOn(shell, 'showItemInFolder'); - - const { findByRole } = renderInvestTab(job); - const openWorkspaceBtn = await findByRole('button', { name: 'Open Workspace' }); - openWorkspaceBtn.click(); - - expect(shell.showItemInFolder).toHaveBeenCalledTimes(1); - expect(shell.showItemInFolder).toHaveBeenCalledWith(job.logfile); - }); - - test('should open workspace (without logfile selected), if workspace exists but logfile does not', async () => { + test('should open workspace', async () => { const job = { ...baseJob, argsValues: { workspace_dir: '/workspace', }, - logfile: undefined, }; - jest.spyOn(shell, 'showItemInFolder'); jest.spyOn(ipcRenderer, 'invoke'); const { findByRole } = renderInvestTab(job); const openWorkspaceBtn = await findByRole('button', { name: 'Open Workspace' }) openWorkspaceBtn.click(); - expect(shell.showItemInFolder).not.toHaveBeenCalled(); expect(ipcRenderer.invoke).toHaveBeenCalledTimes(1); expect(ipcRenderer.invoke).toHaveBeenCalledWith(ipcMainChannels.OPEN_PATH, job.argsValues.workspace_dir); }); @@ -195,10 +169,8 @@ describe('Open Workspace button', () => { argsValues: { workspace_dir: '/nonexistent-workspace', }, - logfile: undefined, }; - jest.spyOn(shell, 'showItemInFolder'); jest.spyOn(ipcRenderer, 'invoke'); ipcRenderer.invoke.mockResolvedValue('Error opening workspace'); @@ -206,7 +178,6 @@ describe('Open Workspace button', () => { const openWorkspaceBtn = await findByRole('button', { name: 'Open Workspace' }); openWorkspaceBtn.click(); - expect(shell.showItemInFolder).not.toHaveBeenCalled(); expect(ipcRenderer.invoke).toHaveBeenCalledTimes(1); expect(ipcRenderer.invoke).toHaveBeenCalledWith(ipcMainChannels.OPEN_PATH, job.argsValues.workspace_dir); From 210b5058d4d84ff18c0e8281f5f6fb460ae2ca77 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Wed, 4 Sep 2024 18:09:01 -0600 Subject: [PATCH 010/111] Correcting bare excepts, and other PEP8 cleanup --- src/natcap/invest/validation.py | 22 +++++----- tests/test_validation.py | 71 ++++++++++++++++++++++----------- 2 files changed, 59 insertions(+), 34 deletions(-) diff --git a/src/natcap/invest/validation.py b/src/natcap/invest/validation.py index b94ac2c352..01d22526bf 100644 --- a/src/natcap/invest/validation.py +++ b/src/natcap/invest/validation.py @@ -166,8 +166,8 @@ def check_directory(dirpath, must_exist=True, permissions='rx', **kwargs): must_exist=True (bool): If ``True``, the directory at ``dirpath`` must already exist on the filesystem. permissions='rx' (string): A string that includes the lowercase - characters ``r``, ``w`` and/or ``x``, indicating read, write, and execute - permissions (respectively) required for this directory. + characters ``r``, ``w`` and/or ``x``, indicating read, write, and + execute permissions (respectively) required for this directory. Returns: A string error message if an error was found. ``None`` otherwise. @@ -197,25 +197,27 @@ def check_directory(dirpath, must_exist=True, permissions='rx', **kwargs): if 'r' in permissions: try: os.scandir(dirpath).close() - except: + except OSError: return MESSAGES[MESSAGE_KEY].format(permission='read') - # Check for x access before checking for w, since w operations to a dir are dependent on x access + # Check for x access before checking for w, + # since w operations to a dir are dependent on x access if 'x' in permissions: try: cwd = os.getcwd() os.chdir(dirpath) - os.chdir(cwd) - except: + except OSError: return MESSAGES[MESSAGE_KEY].format(permission='execute') + finally: + os.chdir(cwd) if 'w' in permissions: try: - temp_path = os.path.join(dirpath, '__temp__workspace_validation_check.txt') + temp_path = os.path.join(dirpath, 'temp__workspace_validation.txt') with open(temp_path, 'w') as temp: temp.close() os.remove(temp_path) - except: + except OSError: return MESSAGES[MESSAGE_KEY].format(permission='write') @@ -225,8 +227,8 @@ def check_file(filepath, permissions='r', **kwargs): Args: filepath (string): The filepath to validate. permissions='r' (string): A string that includes the lowercase - characters ``r``, ``w`` and/or ``x``, indicating read, write, and execute - permissions (respectively) required for this file. + characters ``r``, ``w`` and/or ``x``, indicating read, write, and + execute permissions (respectively) required for this file. Returns: A string error message if an error was found. ``None`` otherwise. diff --git a/tests/test_validation.py b/tests/test_validation.py index 35da3a2ae5..f5ad094f50 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -1,9 +1,6 @@ """Testing module for validation.""" -import codecs -import collections import functools import os -import platform import shutil import stat import string @@ -331,63 +328,91 @@ def test_workspace_not_exists(self): self.assertEqual(None, validation.check_directory( new_dir, must_exist=False, permissions='rwx')) -@unittest.skipIf(sys.platform.startswith('win'), 'requires support for os.chmod(), which is unreliable on Windows') + +@unittest.skipIf( + sys.platform.startswith('win'), + 'requires support for os.chmod(), which is unreliable on Windows') class DirectoryValidationMacOnly(unittest.TestCase): """Test Directory Permissions Validation.""" def test_invalid_permissions_r(self): - """Validation: when a folder must have read/write/execute permissions but is missing write and execute permissions.""" + """Validation: when a folder must have read/write/execute + permissions but is missing write and execute permissions.""" from natcap.invest import validation with tempfile.TemporaryDirectory() as tempdir: os.chmod(tempdir, stat.S_IREAD) - validation_warning = validation.check_directory(tempdir, permissions='rwx') - self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='execute')) + validation_warning = validation.check_directory(tempdir, + permissions='rwx') + self.assertEqual( + validation_warning, + validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='execute')) def test_invalid_permissions_w(self): - """Validation: when a folder must have read/write/execute permissions but is missing read and execute permissions.""" + """Validation: when a folder must have read/write/execute + permissions but is missing read and execute permissions.""" from natcap.invest import validation with tempfile.TemporaryDirectory() as tempdir: os.chmod(tempdir, stat.S_IWRITE) - validation_warning = validation.check_directory(tempdir, permissions='rwx') - self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='read')) + validation_warning = validation.check_directory(tempdir, + permissions='rwx') + self.assertEqual( + validation_warning, + validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='read')) def test_invalid_permissions_x(self): - """Validation: when a folder must have read/write/execute permissions but is missing read and write permissions.""" + """Validation: when a folder must have read/write/execute + permissions but is missing read and write permissions.""" from natcap.invest import validation with tempfile.TemporaryDirectory() as tempdir: os.chmod(tempdir, stat.S_IEXEC) - validation_warning = validation.check_directory(tempdir, permissions='rwx') - self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='read')) + validation_warning = validation.check_directory(tempdir, + permissions='rwx') + self.assertEqual( + validation_warning, + validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='read')) def test_invalid_permissions_rw(self): - """Validation: when a folder must have read/write/execute permissions but is missing execute permission.""" + """Validation: when a folder must have read/write/execute + permissions but is missing execute permission.""" from natcap.invest import validation with tempfile.TemporaryDirectory() as tempdir: os.chmod(tempdir, stat.S_IREAD | stat.S_IWRITE) - validation_warning = validation.check_directory(tempdir, permissions='rwx') - self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='execute')) + validation_warning = validation.check_directory(tempdir, + permissions='rwx') + self.assertEqual( + validation_warning, + validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='execute')) def test_invalid_permissions_rx(self): - """Validation: when a folder must have read/write/execute permissions but is missing write permission.""" + """Validation: when a folder must have read/write/execute + permissions but is missing write permission.""" from natcap.invest import validation with tempfile.TemporaryDirectory() as tempdir: os.chmod(tempdir, stat.S_IREAD | stat.S_IEXEC) - validation_warning = validation.check_directory(tempdir, permissions='rwx') - self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='write')) + validation_warning = validation.check_directory(tempdir, + permissions='rwx') + self.assertEqual( + validation_warning, + validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='write')) def test_invalid_permissions_wx(self): - """Validation: when a folder must have read/write/execute permissions but is missing read permission.""" + """Validation: when a folder must have read/write/execute + permissions but is missing read permission.""" from natcap.invest import validation with tempfile.TemporaryDirectory() as tempdir: os.chmod(tempdir, stat.S_IWRITE | stat.S_IEXEC) - validation_warning = validation.check_directory(tempdir, permissions='rwx') - self.assertEqual(validation_warning, validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='read')) + validation_warning = validation.check_directory(tempdir, + permissions='rwx') + self.assertEqual( + validation_warning, + validation.MESSAGES['NEED_PERMISSION_DIRECTORY'].format(permission='read')) + class FileValidation(unittest.TestCase): """Test File Validator.""" @@ -598,7 +623,6 @@ def test_vector_projected_in_m(self): def test_wrong_geom_type(self): """Validation: checks that the vector's geometry type is correct.""" - from natcap.invest import spec_utils from natcap.invest import validation driver = gdal.GetDriverByName('GPKG') filepath = os.path.join(self.workspace_dir, 'vector.gpkg') @@ -1428,7 +1452,6 @@ def test_csv_raster_validation_missing_file(self): }) self.assertIn('File not found', str(cm.exception)) - def test_csv_raster_validation_not_projected(self): """validation: validate unprojected raster within csv column""" from natcap.invest import validation From ee148ad5f7fc98851b701a9b338762e90a6b1ba5 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Thu, 5 Sep 2024 11:44:40 -0600 Subject: [PATCH 011/111] Fixing rst formatting --- HISTORY.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index c0f6f95c28..14a2c709b1 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -38,13 +38,13 @@ Unreleased Changes ------------------ * Workbench - * Several small updates to the model input form UI to improve usability - and visual consistency (https://github.com/natcap/invest/issues/912) - * Fixed a bug that caused the application to crash when attempting to - open a workspace without a valid logfile - (https://github.com/natcap/invest/issues/1598) - * Fixed a bug that was allowing readonly workspace directories on Windows - (https://github.com/natcap/invest/issues/1599) + * Several small updates to the model input form UI to improve usability + and visual consistency (https://github.com/natcap/invest/issues/912) + * Fixed a bug that caused the application to crash when attempting to + open a workspace without a valid logfile + (https://github.com/natcap/invest/issues/1598) + * Fixed a bug that was allowing readonly workspace directories on Windows + (https://github.com/natcap/invest/issues/1599) 3.14.2 (2024-05-29) ------------------- From 0846c72500e96ff0e5ed6ca73af9e4e05c09d7f2 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Thu, 5 Sep 2024 12:24:40 -0600 Subject: [PATCH 012/111] Removes openWorkspaceDir helper function --- .../src/renderer/components/InvestTab/index.jsx | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/workbench/src/renderer/components/InvestTab/index.jsx b/workbench/src/renderer/components/InvestTab/index.jsx index 8cee4a53b2..7e26369c8b 100644 --- a/workbench/src/renderer/components/InvestTab/index.jsx +++ b/workbench/src/renderer/components/InvestTab/index.jsx @@ -71,7 +71,6 @@ class InvestTab extends React.Component { this.investLogfileCallback = this.investLogfileCallback.bind(this); this.investExitCallback = this.investExitCallback.bind(this); this.handleOpenWorkspace = this.handleOpenWorkspace.bind(this); - this.openWorkspaceDir = this.openWorkspaceDir.bind(this); this.showErrorModal = this.showErrorModal.bind(this); } @@ -189,17 +188,13 @@ class InvestTab extends React.Component { ); } - handleOpenWorkspace(workspace_dir) { + async handleOpenWorkspace(workspace_dir) { if (workspace_dir) { - this.openWorkspaceDir(workspace_dir); - } - } - - async openWorkspaceDir(workspace_dir) { - const error = await ipcRenderer.invoke(ipcMainChannels.OPEN_PATH, workspace_dir); - if (error) { - logger.error(`Error opening workspace (${workspace_dir}). ${error}`); - this.showErrorModal(true); + const error = await ipcRenderer.invoke(ipcMainChannels.OPEN_PATH, workspace_dir); + if (error) { + logger.error(`Error opening workspace (${workspace_dir}). ${error}`); + this.showErrorModal(true); + } } } From 99eefedac848029a1bcd326de2d7fe7835b2c41c Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 10 Sep 2024 09:48:08 -0700 Subject: [PATCH 013/111] Uncommenting the pyinstaller version cap RE:#1622 --- constraints_tests.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/constraints_tests.txt b/constraints_tests.txt index 92920cea3f..dad2f088c2 100644 --- a/constraints_tests.txt +++ b/constraints_tests.txt @@ -8,3 +8,8 @@ GDAL!=3.6.*,!=3.7.* # https://github.com/natcap/pygeoprocessing/issues/387 GDAL<3.8.5 + +# Pyinstaller 6.10 breaks our windows builds. Until we can figure out the +root cause, let's cap the versions to those that work. +# https://github.com/natcap/invest/issues/1622 +pyinstaller<6.10 From 9eb8c88f4a749135f89d77b58e2f7855204e2f5f Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 10 Sep 2024 10:02:39 -0700 Subject: [PATCH 014/111] Forgot to comment out a comment. RE:#1622 --- constraints_tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constraints_tests.txt b/constraints_tests.txt index dad2f088c2..447311d585 100644 --- a/constraints_tests.txt +++ b/constraints_tests.txt @@ -10,6 +10,6 @@ GDAL!=3.6.*,!=3.7.* GDAL<3.8.5 # Pyinstaller 6.10 breaks our windows builds. Until we can figure out the -root cause, let's cap the versions to those that work. +# root cause, let's cap the versions to those that work. # https://github.com/natcap/invest/issues/1622 pyinstaller<6.10 From 6bd3d0e7d3be99471b533dcaefda6261915793eb Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 10 Sep 2024 10:24:22 -0700 Subject: [PATCH 015/111] Adding a missing hidden import on mac osx. RE:#1622 --- exe/invest.spec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exe/invest.spec b/exe/invest.spec index ac4ec440bd..e1d9c89074 100644 --- a/exe/invest.spec +++ b/exe/invest.spec @@ -30,7 +30,8 @@ kwargs = { 'pkg_resources.py2_warn', 'cmath', 'charset_normalizer', - 'scipy.special._cdflib' + 'scipy.special._cdflib', + 'scipy.special._special_ufuncs', ], 'datas': [proj_datas], 'cipher': block_cipher, From 7a00f652ab090a5a958074b7dcc823de9f815828 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 10 Sep 2024 11:28:14 -0600 Subject: [PATCH 016/111] Add twine check and add README_PYTHON.rst to doc8 linting --- .github/workflows/build-and-test.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 3fb4f20009..94f4118ec0 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -46,8 +46,8 @@ jobs: # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide python -m flake8 src --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - check-history-rst-syntax: - name: Check HISTORY RST syntax + check-rst-syntax: + name: Check RST syntax runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -63,7 +63,7 @@ jobs: - name: Lint with doc8 run: | # Skip line-too-long errors (D001) - python -m doc8 --ignore D001 HISTORY.rst + python -m doc8 --ignore D001 HISTORY.rst README_PYTHON.rst run-model-tests: name: Run model tests @@ -193,6 +193,12 @@ jobs: # natcap.invest from source and that it imports. python -c "from natcap.invest import *" + - name: Set up environment + run: pip install twine + + - name: Check long description with twine + run: twine check $(find dist -name "natcap[._-]invest*") + - uses: actions/upload-artifact@v3 with: name: Source distribution From 948806c2bd9bd9f4dd151ab2f480a4ce7412215d Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 10 Sep 2024 10:49:57 -0700 Subject: [PATCH 017/111] Adding another hidden import. RE:#1622 --- exe/invest.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/exe/invest.spec b/exe/invest.spec index e1d9c89074..b0f3085ec7 100644 --- a/exe/invest.spec +++ b/exe/invest.spec @@ -32,6 +32,7 @@ kwargs = { 'charset_normalizer', 'scipy.special._cdflib', 'scipy.special._special_ufuncs', + 'scipy._lib.array_api_compat.numpy.fft', ], 'datas': [proj_datas], 'cipher': block_cipher, From 49ec5c43d29daf225c2507a01c134ef85bf4766e Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 10 Sep 2024 12:29:33 -0600 Subject: [PATCH 018/111] Moves twine install to setup_env step --- .github/workflows/build-and-test.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 94f4118ec0..2b59cd2f57 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -170,7 +170,7 @@ jobs: with: python-version: ${{ matrix.python-version }} requirements-files: requirements.txt - requirements: ${{ env.CONDA_DEFAULT_DEPENDENCIES }} + requirements: ${{ env.CONDA_DEFAULT_DEPENDENCIES }} twine - name: Build source distribution run: | @@ -193,9 +193,6 @@ jobs: # natcap.invest from source and that it imports. python -c "from natcap.invest import *" - - name: Set up environment - run: pip install twine - - name: Check long description with twine run: twine check $(find dist -name "natcap[._-]invest*") From 6b9d56c105d14fe52f2d40847d5216ad4c4a631a Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 10 Sep 2024 17:53:28 -0600 Subject: [PATCH 019/111] Copies existing fields in UFRM source aoi vector to target vector --- .../invest/urban_flood_risk_mitigation.py | 5 ++++ tests/test_ufrm.py | 25 ++++++++++++++----- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/natcap/invest/urban_flood_risk_mitigation.py b/src/natcap/invest/urban_flood_risk_mitigation.py index 7f865e5e3f..493d60b5a0 100644 --- a/src/natcap/invest/urban_flood_risk_mitigation.py +++ b/src/natcap/invest/urban_flood_risk_mitigation.py @@ -554,6 +554,7 @@ def _write_summary_vector( """ source_aoi_vector = gdal.OpenEx(source_aoi_vector_path, gdal.OF_VECTOR) source_aoi_layer = source_aoi_vector.GetLayer() + source_aoi_field_defns = source_aoi_layer.schema source_geom_type = source_aoi_layer.GetGeomType() source_srs_wkt = pygeoprocessing.get_vector_info( source_aoi_vector_path)['projection_wkt'] @@ -612,6 +613,10 @@ def _write_summary_vector( 'flood_vol', float(flood_volume_stats[feature_id]['sum'])) target_watershed_layer.CreateFeature(target_feature) + + for field_defn in source_aoi_field_defns: + target_watershed_layer.CreateField(field_defn) + target_watershed_layer.SyncToDisk() target_watershed_layer = None target_watershed_vector = None diff --git a/tests/test_ufrm.py b/tests/test_ufrm.py index 07df671573..1d5e1d96b0 100644 --- a/tests/test_ufrm.py +++ b/tests/test_ufrm.py @@ -59,6 +59,11 @@ def test_ufrm_regression(self): """UFRM: regression test.""" from natcap.invest import urban_flood_risk_mitigation args = self._make_args() + input_vector = gdal.OpenEx(args['aoi_watersheds_path'], + gdal.OF_VECTOR) + input_layer = input_vector.GetLayer() + input_fields = [field.GetName() for field in input_layer.schema] + urban_flood_risk_mitigation.execute(args) result_vector = gdal.OpenEx(os.path.join( @@ -66,10 +71,12 @@ def test_ufrm_regression(self): gdal.OF_VECTOR) result_layer = result_vector.GetLayer() - # Check that all four expected fields are there. + # Check that all expected fields are there. + output_fields = ['aff_bld', 'serv_blt', 'rnf_rt_idx', + 'rnf_rt_m3', 'flood_vol'] + output_fields += input_fields self.assertEqual( - set(('aff_bld', 'serv_blt', 'rnf_rt_idx', 'rnf_rt_m3', - 'flood_vol')), + set(output_fields), set(field.GetName() for field in result_layer.schema)) result_feature = result_layer.GetFeature(0) @@ -94,6 +101,11 @@ def test_ufrm_regression_no_infrastructure(self): from natcap.invest import urban_flood_risk_mitigation args = self._make_args() del args['built_infrastructure_vector_path'] + input_vector = gdal.OpenEx(args['aoi_watersheds_path'], + gdal.OF_VECTOR) + input_layer = input_vector.GetLayer() + input_fields = [field.GetName() for field in input_layer.schema] + urban_flood_risk_mitigation.execute(args) result_raster = gdal.OpenEx(os.path.join( @@ -115,9 +127,11 @@ def test_ufrm_regression_no_infrastructure(self): result_layer = result_vector.GetLayer() result_feature = result_layer.GetFeature(0) - # Check that only the two expected fields are there. + # Check that only the expected fields are there. + output_fields = ['rnf_rt_idx', 'rnf_rt_m3', 'flood_vol'] + output_fields += input_fields self.assertEqual( - set(('rnf_rt_idx', 'rnf_rt_m3', 'flood_vol')), + set(output_fields), set(field.GetName() for field in result_layer.schema)) for fieldname, expected_value in ( @@ -218,7 +232,6 @@ def test_ufrm_explicit_zeros_in_table(self): except ValueError: self.fail('unexpected ValueError when testing curve number row with all zeros') - def test_ufrm_string_damage_to_infrastructure(self): """UFRM: handle str(int) structure indices. From 2797c4c32502063c729f47c8fb0f3ae6265c55cb Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Wed, 11 Sep 2024 09:55:16 -0600 Subject: [PATCH 020/111] Update HISTORY.rst --- HISTORY.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index 14a2c709b1..686eaaaca6 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -45,6 +45,9 @@ Unreleased Changes (https://github.com/natcap/invest/issues/1598) * Fixed a bug that was allowing readonly workspace directories on Windows (https://github.com/natcap/invest/issues/1599) +* Urban Flood Risk + * Fields present on the input AOI vector are now retained in the output. + (https://github.com/natcap/invest/issues/1600) 3.14.2 (2024-05-29) ------------------- From 1bbbfb2a13ecfdff6d43c9ab1b33fe94bef5571e Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 11 Sep 2024 14:42:19 -0700 Subject: [PATCH 021/111] Moving multiprocessing.freeze_support() to __main__.py. RE:#1622 --- exe/hooks/rthook.py | 5 +---- src/natcap/invest/__main__.py | 6 ++++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/exe/hooks/rthook.py b/exe/hooks/rthook.py index 53a9af14b6..ec0b3264a8 100644 --- a/exe/hooks/rthook.py +++ b/exe/hooks/rthook.py @@ -1,9 +1,6 @@ -import sys import os -import multiprocessing import platform - -multiprocessing.freeze_support() +import sys os.environ['PROJ_LIB'] = os.path.join(sys._MEIPASS, 'proj') diff --git a/src/natcap/invest/__main__.py b/src/natcap/invest/__main__.py index 1f68c51913..167e0fc170 100644 --- a/src/natcap/invest/__main__.py +++ b/src/natcap/invest/__main__.py @@ -1,5 +1,11 @@ +import multiprocessing import sys +# We want to guarantee that this is called BEFORE any other processes start, +# which could happen at import time. +if __name__ == '__main__': + multiprocessing.freeze_support() + from . import cli if __name__ == '__main__': From ad36f89422443e705b88245252d67059df0ac308 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 11 Sep 2024 14:52:48 -0700 Subject: [PATCH 022/111] Commenting out the pyinstaller constraint to re-trigger the multiprocessing issue. RE:#1622 --- constraints_tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/constraints_tests.txt b/constraints_tests.txt index 447311d585..299273430e 100644 --- a/constraints_tests.txt +++ b/constraints_tests.txt @@ -12,4 +12,4 @@ GDAL<3.8.5 # Pyinstaller 6.10 breaks our windows builds. Until we can figure out the # root cause, let's cap the versions to those that work. # https://github.com/natcap/invest/issues/1622 -pyinstaller<6.10 +#pyinstaller<6.10 From 63d233f8f3244ac312d5aad9eb6990921e2f7f0b Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 11 Sep 2024 16:30:42 -0700 Subject: [PATCH 023/111] Forcing autotest to run. RE:#1622 --- .github/workflows/build-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 3fb4f20009..5fb5b06478 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -464,7 +464,7 @@ jobs: if : | (github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/release') || github.ref == 'refs/heads/main')) || - (github.event_name == 'pull_request' && startsWith(github.head_ref, 'autorelease')) + (github.event_name == 'pull_request' && startsWith(github.head_ref, 'autorelease')) || true run: make invest_autotest - name: Tar the workspace to preserve permissions (macOS) From fe870c7440d743f1b45c0bab168a8a060a958038 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 11 Sep 2024 22:20:09 -0700 Subject: [PATCH 024/111] Restoring conditional for autotest. RE:#1622 --- .github/workflows/build-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 5fb5b06478..3fb4f20009 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -464,7 +464,7 @@ jobs: if : | (github.event_name == 'push' && (startsWith(github.ref, 'refs/heads/release') || github.ref == 'refs/heads/main')) || - (github.event_name == 'pull_request' && startsWith(github.head_ref, 'autorelease')) || true + (github.event_name == 'pull_request' && startsWith(github.head_ref, 'autorelease')) run: make invest_autotest - name: Tar the workspace to preserve permissions (macOS) From dd7940d18c214bb4b03d1b915116f8cd59fa11ba Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 11 Sep 2024 22:21:47 -0700 Subject: [PATCH 025/111] Updating to v2 of gcloud auth, per a warning in the GHA logs. RE:#1622 --- .github/workflows/build-and-test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 3fb4f20009..a34d1b7d84 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -141,7 +141,7 @@ jobs: - name: Authenticate GCP if: github.event_name != 'pull_request' - uses: google-github-actions/auth@v0 + uses: google-github-actions/auth@v2 with: credentials_json: ${{ secrets.GOOGLE_SERVICE_ACC_KEY }} @@ -204,7 +204,7 @@ jobs: # different extensions) - name: Authenticate GCP if: github.event_name != 'pull_request' && matrix.os == 'macos-13' && matrix.python-version == env.LATEST_SUPPORTED_PYTHON_VERSION - uses: google-github-actions/auth@v0 + uses: google-github-actions/auth@v2 with: credentials_json: ${{ secrets.GOOGLE_SERVICE_ACC_KEY }} @@ -366,7 +366,7 @@ jobs: - name: Authenticate GCP if: github.event_name != 'pull_request' - uses: google-github-actions/auth@v0 + uses: google-github-actions/auth@v2 with: credentials_json: ${{ secrets.GOOGLE_SERVICE_ACC_KEY }} @@ -505,7 +505,7 @@ jobs: - name: Authenticate GCP if: github.event_name != 'pull_request' - uses: google-github-actions/auth@v0 + uses: google-github-actions/auth@v2 with: credentials_json: ${{ secrets.GOOGLE_SERVICE_ACC_KEY }} From 6dd4bab8f8a52adfb171255bb383514c2c931fc9 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 11 Sep 2024 22:23:09 -0700 Subject: [PATCH 026/111] Updating to v2 of setup-gcloud, per a warning in the GHA logs. RE:#1622 --- .github/workflows/build-and-test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index a34d1b7d84..a89d9d071d 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -147,7 +147,7 @@ jobs: - name: Set up GCP if: github.event_name != 'pull_request' - uses: google-github-actions/setup-gcloud@v0 + uses: google-github-actions/setup-gcloud@v2 - name: Deploy artifacts to GCS if: github.event_name != 'pull_request' @@ -210,7 +210,7 @@ jobs: - name: Set up GCP if: github.event_name != 'pull_request' && matrix.os == 'macos-13' && matrix.python-version == env.LATEST_SUPPORTED_PYTHON_VERSION - uses: google-github-actions/setup-gcloud@v0 + uses: google-github-actions/setup-gcloud@v2 - name: Deploy artifacts to GCS if: github.event_name != 'pull_request' && matrix.os == 'macos-13' && matrix.python-version == env.LATEST_SUPPORTED_PYTHON_VERSION @@ -372,7 +372,7 @@ jobs: - name: Set up GCP if: github.event_name != 'pull_request' - uses: google-github-actions/setup-gcloud@v0 + uses: google-github-actions/setup-gcloud@v2 - name: Build Workbench (PRs) if: github.event_name == 'pull_request' @@ -511,7 +511,7 @@ jobs: - name: Set up GCP if: github.event_name != 'pull_request' - uses: google-github-actions/setup-gcloud@v0 + uses: google-github-actions/setup-gcloud@v2 - name: Deploy artifacts to GCS if: github.event_name != 'pull_request' From 5d4d79f4cc00066f8382ee54c3c3f87d13f003e3 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 11 Sep 2024 22:24:22 -0700 Subject: [PATCH 027/111] Updating to checkout@v4, per GHA warning. RE:#1622 --- .github/workflows/build-and-test.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index a89d9d071d..83ebb535f4 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -28,7 +28,7 @@ jobs: name: Check for syntax errors runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up python uses: actions/setup-python@v4 @@ -50,7 +50,7 @@ jobs: name: Check HISTORY RST syntax runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 name: Set up python @@ -75,7 +75,7 @@ jobs: python-version: [3.8, 3.9, "3.10", "3.11", "3.12"] os: [windows-latest, macos-13] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch complete history for accurate versioning @@ -162,7 +162,7 @@ jobs: python-version: [3.8, 3.9, "3.10", "3.11", "3.12"] os: [windows-latest, macos-13] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch complete history for accurate versioning @@ -221,7 +221,7 @@ jobs: runs-on: windows-latest needs: check-syntax-errors steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch complete history for accurate versioning @@ -252,7 +252,7 @@ jobs: steps: - name: Check out repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch complete history for accurate versioning @@ -309,7 +309,7 @@ jobs: workspace-path: ${{ github.workspace }} binary-extension: exe steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch complete history for accurate versioning @@ -483,7 +483,7 @@ jobs: needs: check-syntax-errors runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch complete history for accurate versioning From a76a9bb8a831d18e121c4c27fd34696146879fdd Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 11 Sep 2024 22:25:10 -0700 Subject: [PATCH 028/111] Updating to setup-python@v5, per GHA warning. RE:#1622 --- .github/workflows/build-and-test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 83ebb535f4..2cf50b7c2b 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -31,7 +31,7 @@ jobs: - uses: actions/checkout@v4 - name: Set up python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ env.LATEST_SUPPORTED_PYTHON_VERSION }} @@ -52,7 +52,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 name: Set up python with: python-version: ${{ env.LATEST_SUPPORTED_PYTHON_VERSION }} @@ -487,7 +487,7 @@ jobs: with: fetch-depth: 0 # Fetch complete history for accurate versioning - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: ${{ env.LATEST_SUPPORTED_PYTHON_VERSION }} From d6476ccb27b745fa9d59f5fab06013b1e54fc356 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 11 Sep 2024 22:26:13 -0700 Subject: [PATCH 029/111] Updating to upload-artifact@v4, per GHA warning. RE:#1622 --- .github/workflows/build-and-test.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 2cf50b7c2b..c2f4e33263 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -127,13 +127,13 @@ jobs: run: make test - name: Upload wheel artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: Wheel for ${{ matrix.os }} ${{ matrix.python-version }} path: dist - name: Upload conda env artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 continue-on-error: true with: name: Conda Env for ${{ matrix.os }} ${{ matrix.python-version }} @@ -193,7 +193,7 @@ jobs: # natcap.invest from source and that it imports. python -c "from natcap.invest import *" - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: Source distribution path: dist @@ -441,20 +441,20 @@ jobs: - name: Upload workbench binary artifact if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: Workbench-${{ runner.os }}-binary path: workbench/dist/*.${{ matrix.binary-extension }} - name: Upload user's guide artifact (Windows) if: matrix.os == 'windows-latest' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: InVEST-user-guide path: dist/InVEST_*_userguide.zip - name: Upload workbench logging from puppeteer - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: always() with: name: ${{ runner.os }}_puppeteer_log.zip' @@ -473,7 +473,7 @@ jobs: - name: Upload workspace on failure if: ${{ failure() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: InVEST-failed-${{ runner.os }}-workspace path: ${{ matrix.workspace-path}} @@ -498,7 +498,7 @@ jobs: - run: make sampledata sampledata_single - name: Upload sample data artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: InVEST-sample-data path: dist/*.zip From f52619ee6a7aa66c8ce978ace503970ec372d51b Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Thu, 12 Sep 2024 09:39:28 -0600 Subject: [PATCH 030/111] Reset relativePaths to false each time modal opens, to sync w/ checkbox appearance --- workbench/src/renderer/components/SaveAsModal/index.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/workbench/src/renderer/components/SaveAsModal/index.jsx b/workbench/src/renderer/components/SaveAsModal/index.jsx index 40c9d35c4a..06707a846d 100644 --- a/workbench/src/renderer/components/SaveAsModal/index.jsx +++ b/workbench/src/renderer/components/SaveAsModal/index.jsx @@ -67,7 +67,10 @@ class SaveAsModal extends React.Component { } handleShow() { - this.setState({ show: true }); + this.setState({ + relativePaths: false, + show: true, + }); } handleChange(event) { From db9f4ceede6e56724b3b0f42330016573987e84b Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Thu, 12 Sep 2024 09:48:03 -0600 Subject: [PATCH 031/111] Update HISTORY.rst --- HISTORY.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index 14a2c709b1..dfa49b3025 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -45,6 +45,9 @@ Unreleased Changes (https://github.com/natcap/invest/issues/1598) * Fixed a bug that was allowing readonly workspace directories on Windows (https://github.com/natcap/invest/issues/1599) + * Fixed a bug that, in certain scenarios, caused a datastack to be saved + with relative paths when the Relative Paths checkbox was left unchecked + (https://github.com/natcap/invest/issues/1609) 3.14.2 (2024-05-29) ------------------- From 1f499a097cbd243dca0c32151d67b1efaad0c229 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 12 Sep 2024 09:50:56 -0700 Subject: [PATCH 032/111] Renaming the sdist artifact for OS/python combination. RE:#1622 --- .github/workflows/build-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index c2f4e33263..53cb822071 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -195,7 +195,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: Source distribution + name: Source distribution ${{ matrix.os }} ${{ matrix.python-version }} path: dist # Secrets not available in PR so don't use GCP. From 178e39eada3c25c133cd48ed823b75951352e211 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Fri, 13 Sep 2024 17:52:09 -0600 Subject: [PATCH 033/111] Handle & display error on save paramset failure --- src/natcap/invest/datastack.py | 20 +++++++-- src/natcap/invest/ui_server.py | 21 +++++++-- tests/test_ui_server.py | 5 ++- .../renderer/components/SaveAsModal/index.jsx | 1 + .../renderer/components/SetupTab/index.jsx | 44 +++++++++++++++---- workbench/src/renderer/server_requests.js | 12 +++-- workbench/tests/renderer/investtab.test.js | 7 ++- 7 files changed, 86 insertions(+), 24 deletions(-) diff --git a/src/natcap/invest/datastack.py b/src/natcap/invest/datastack.py index 461a12d60e..a68b153078 100644 --- a/src/natcap/invest/datastack.py +++ b/src/natcap/invest/datastack.py @@ -535,6 +535,9 @@ def build_parameter_set(args, model_name, paramset_path, relative=False): Returns: ``None`` + + Raises: + ValueError if creating a relative path fails. """ def _recurse(args_param): if isinstance(args_param, dict): @@ -552,10 +555,19 @@ def _recurse(args_param): if (normalized_path == '.' or os.path.dirname(paramset_path) == normalized_path): return '.' - temp_rel_path = os.path.relpath( - normalized_path, os.path.dirname(paramset_path)) - # Always save unix paths. - linux_style_path = temp_rel_path.replace('\\', '/') + try: + temp_rel_path = os.path.relpath( + normalized_path, os.path.dirname(paramset_path)) + except ValueError: + # On Windows, ValueError is raised when ``path`` and + # ``start`` are on different drives + raise ValueError( + """Error: Cannot save datastack with relative + paths across drives. Choose a different save + location, or use absolute paths.""") + else: + # Always save unix paths. + linux_style_path = temp_rel_path.replace('\\', '/') else: # Always save unix paths. linux_style_path = normalized_path.replace('\\', '/') diff --git a/src/natcap/invest/ui_server.py b/src/natcap/invest/ui_server.py index bfbe1874ec..f7be83d66f 100644 --- a/src/natcap/invest/ui_server.py +++ b/src/natcap/invest/ui_server.py @@ -175,7 +175,9 @@ def write_parameter_set_file(): relativePaths: boolean Returns: - A string. + A dictionary with the following key/value pairs: + - message (string): for logging and/or rendering in the UI. + - error (boolean): True if an error occurred, otherwise False. """ payload = request.get_json() filepath = payload['filepath'] @@ -183,9 +185,20 @@ def write_parameter_set_file(): args = json.loads(payload['args']) relative_paths = payload['relativePaths'] - datastack.build_parameter_set( - args, modulename, filepath, relative=relative_paths) - return 'parameter set saved' + try: + datastack.build_parameter_set( + args, modulename, filepath, relative=relative_paths) + except ValueError as message: + LOGGER.error(str(message)) + return { + 'message': str(message), + 'error': True + } + else: + return { + 'message': 'Parameter set saved', + 'error': False + } @app.route(f'/{PREFIX}/save_to_python', methods=['POST']) diff --git a/tests/test_ui_server.py b/tests/test_ui_server.py index 426dc57005..15e93bbd4b 100644 --- a/tests/test_ui_server.py +++ b/tests/test_ui_server.py @@ -122,8 +122,11 @@ def test_write_parameter_set_file(self): }), 'relativePaths': True, } - _ = test_client.post( + response = test_client.post( f'{ROUTE_PREFIX}/write_parameter_set_file', json=payload) + self.assertEqual( + response.json, + {'message': 'Parameter set saved', 'error': False}) with open(filepath, 'r') as file: actual_data = json.loads(file.read()) self.assertEqual( diff --git a/workbench/src/renderer/components/SaveAsModal/index.jsx b/workbench/src/renderer/components/SaveAsModal/index.jsx index 06707a846d..a2e5e9917e 100644 --- a/workbench/src/renderer/components/SaveAsModal/index.jsx +++ b/workbench/src/renderer/components/SaveAsModal/index.jsx @@ -67,6 +67,7 @@ class SaveAsModal extends React.Component { } handleShow() { + this.props.removeSaveErrors(); this.setState({ relativePaths: false, show: true, diff --git a/workbench/src/renderer/components/SetupTab/index.jsx b/workbench/src/renderer/components/SetupTab/index.jsx index c241dd5706..5914c66ff4 100644 --- a/workbench/src/renderer/components/SetupTab/index.jsx +++ b/workbench/src/renderer/components/SetupTab/index.jsx @@ -100,6 +100,7 @@ class SetupTab extends React.Component { this.savePythonScript = this.savePythonScript.bind(this); this.saveJsonFile = this.saveJsonFile.bind(this); this.setSaveAlert = this.setSaveAlert.bind(this); + this.removeSaveErrors = this.removeSaveErrors.bind(this); this.wrapInvestExecute = this.wrapInvestExecute.bind(this); this.investValidate = this.investValidate.bind(this); this.debouncedValidate = this.debouncedValidate.bind(this); @@ -234,8 +235,8 @@ class SetupTab extends React.Component { relativePaths: relativePaths, args: JSON.stringify(args), }; - const response = await writeParametersToFile(payload); - this.setSaveAlert(response); + const {message, error} = await writeParametersToFile(payload); + this.setSaveAlert(message, error); } async saveDatastack(datastackPath) { @@ -249,9 +250,9 @@ class SetupTab extends React.Component { args: JSON.stringify(args), }; const key = window.crypto.getRandomValues(new Uint16Array(1))[0].toString(); - this.setSaveAlert('archiving...', key); + this.setSaveAlert('archiving...', false, key); const response = await archiveDatastack(payload); - this.setSaveAlert(response, key); + this.setSaveAlert(response, false, key); } /** State updater for alert messages from various save buttons. @@ -262,15 +263,35 @@ class SetupTab extends React.Component { * 1. display: because a new save occurred, or * 2. not display: on a re-render after `Expire` expired, or * 3. update: because 'archiving...' alert changes to final message + * @param {boolean} error - true if message was generated by an error, + * false otherwise. Defaults to false. * * @returns {undefined} */ setSaveAlert( message, + error = false, key = window.crypto.getRandomValues(new Uint16Array(1))[0].toString() ) { this.setState({ - saveAlerts: { ...this.state.saveAlerts, ...{ [key]: message } } + saveAlerts: { + ...this.state.saveAlerts, + ...{ [key]: { + message, + error + }}} + }); + } + + removeSaveErrors() { + const alerts = this.state.saveAlerts; + Object.keys(alerts).forEach((key) => { + if (alerts[key].error) { + delete alerts[key]; + } + }); + this.setState({ + saveAlerts: alerts }); } @@ -490,18 +511,22 @@ class SetupTab extends React.Component { const SaveAlerts = []; Object.keys(saveAlerts).forEach((key) => { - const message = saveAlerts[key]; + const { message, error } = saveAlerts[key]; if (message) { // Alert won't expire during archiving; will expire 2s after completion - const alertExpires = (message === 'archiving...') ? 1e7 : 2000; + // Alert won't expire when an error has occurred; + // will be hidden next time save modal opens + const alertExpires = (error || message === 'archiving...') ? 1e7 : 2000; SaveAlerts.push( - - {message} + + {t(message)} ); @@ -564,6 +589,7 @@ class SetupTab extends React.Component { savePythonScript={this.savePythonScript} saveJsonFile={this.saveJsonFile} saveDatastack={this.saveDatastack} + removeSaveErrors={this.removeSaveErrors} /> {SaveAlerts} diff --git a/workbench/src/renderer/server_requests.js b/workbench/src/renderer/server_requests.js index 286bcd690b..90ca4125aa 100644 --- a/workbench/src/renderer/server_requests.js +++ b/workbench/src/renderer/server_requests.js @@ -173,10 +173,14 @@ export function writeParametersToFile(payload) { body: JSON.stringify(payload), headers: { 'Content-Type': 'application/json' }, }) - .then((response) => response.text()) - .then((text) => { - logger.debug(text); - return text; + .then((response) => response.json()) + .then(({message, error}) => { + if (error) { + logger.error(message); + } else { + logger.debug(message); + } + return {message, error}; }) .catch((error) => logger.error(error.stack)) ); diff --git a/workbench/tests/renderer/investtab.test.js b/workbench/tests/renderer/investtab.test.js index 2a125fbddc..e3b6afdc07 100644 --- a/workbench/tests/renderer/investtab.test.js +++ b/workbench/tests/renderer/investtab.test.js @@ -217,7 +217,10 @@ describe('Sidebar Buttons', () => { }); test('Save to JSON: requests endpoint with correct payload', async () => { - const response = 'saved'; + const response = { + message: 'saved', + error: false, + }; writeParametersToFile.mockResolvedValue(response); const mockDialogData = { canceled: false, filePath: 'foo.json' }; ipcRenderer.invoke.mockResolvedValueOnce(mockDialogData); @@ -230,7 +233,7 @@ describe('Sidebar Buttons', () => { const saveButton = await findByRole('button', { name: 'Save' }); await userEvent.click(saveButton); - expect(await findByRole('alert')).toHaveTextContent(response); + expect(await findByRole('alert')).toHaveTextContent(response.message); const payload = writeParametersToFile.mock.calls[0][0]; expect(Object.keys(payload)).toEqual(expect.arrayContaining( ['filepath', 'moduleName', 'relativePaths', 'args'] From cf56816a32ba7dd64b3ce52fecff17b92aa88bfc Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Mon, 16 Sep 2024 14:18:19 -0600 Subject: [PATCH 034/111] Update Python paramset tests --- tests/test_datastack.py | 22 +++++++++++++++++++++- tests/test_ui_server.py | 24 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/tests/test_datastack.py b/tests/test_datastack.py index 45d2e590bd..a471b8e5e3 100644 --- a/tests/test_datastack.py +++ b/tests/test_datastack.py @@ -6,10 +6,10 @@ import pprint import shutil import sys -import tarfile import tempfile import textwrap import unittest +from unittest.mock import patch import numpy import pandas @@ -506,6 +506,26 @@ def test_relative_parameter_set(self): self.assertEqual(invest_version, __version__) self.assertEqual(callable_name, modelname) + def test_relative_path_failure(self): + """Datastack: raise error when relative path creation fails.""" + from natcap.invest import datastack + + params = { + 'data_dir': os.path.join(self.workspace, 'data_dir'), + } + modelname = 'natcap.invest.foo' + paramset_filename = os.path.join(self.workspace, 'paramset.json') + + # make the sample data so filepaths are interpreted correctly + os.makedirs(params['data_dir']) + + # Call build_parameter_set and force it into an error state + with self.assertRaises(ValueError): + with patch('natcap.invest.os.path.relpath', + side_effect=ValueError): + datastack.build_parameter_set( + params, modelname, paramset_filename, relative=True) + @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows") def test_relative_parameter_set_windows(self): """Datastack: test relative parameter set paths saved linux style.""" diff --git a/tests/test_ui_server.py b/tests/test_ui_server.py index 15e93bbd4b..02d9436ebe 100644 --- a/tests/test_ui_server.py +++ b/tests/test_ui_server.py @@ -133,6 +133,30 @@ def test_write_parameter_set_file(self): set(actual_data), {'args', 'invest_version', 'model_name'}) + def test_write_parameter_set_file_error_handling(self): + """UI server: write_parameter_set_file endpoint + should catch a ValueError and return an error message. + """ + test_client = ui_server.app.test_client() + self.workspace_dir = tempfile.mkdtemp() + filepath = os.path.join(self.workspace_dir, 'datastack.json') + payload = { + 'filepath': filepath, + 'moduleName': 'natcap.invest.carbon', + 'args': json.dumps({ + 'workspace_dir': 'foo' + }), + 'relativePaths': True, + } + error_message = 'Error saving datastack' + with patch('natcap.invest.datastack.build_parameter_set', + side_effect=ValueError(error_message)): + response = test_client.post( + f'{ROUTE_PREFIX}/write_parameter_set_file', json=payload) + self.assertEqual( + response.json, + {'message': error_message, 'error': True}) + def test_save_to_python(self): """UI server: save_to_python endpoint.""" test_client = ui_server.app.test_client() From 73f283feaf95f78d1ef0f95beaca4b91c2d579d3 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Mon, 16 Sep 2024 16:22:26 -0600 Subject: [PATCH 035/111] Handle & display error on save datastack failure --- src/natcap/invest/datastack.py | 12 +++++-- src/natcap/invest/ui_server.py | 27 +++++++++++---- tests/test_datastack.py | 19 +++++++++++ tests/test_ui_server.py | 33 ++++++++++++++++++- .../renderer/components/SetupTab/index.jsx | 4 +-- workbench/src/renderer/server_requests.js | 12 ++++--- workbench/tests/renderer/investtab.test.js | 7 ++-- 7 files changed, 96 insertions(+), 18 deletions(-) diff --git a/src/natcap/invest/datastack.py b/src/natcap/invest/datastack.py index a68b153078..da0a7eca2b 100644 --- a/src/natcap/invest/datastack.py +++ b/src/natcap/invest/datastack.py @@ -226,6 +226,10 @@ def build_datastack_archive(args, model_name, datastack_path): Returns: ``None`` + + Raises: + ValueError if raised by build_parameter_set + (i.e., if creating a relative path fails). """ module = importlib.import_module(name=model_name) @@ -453,8 +457,12 @@ def build_datastack_archive(args, model_name, datastack_path): # write parameters to a new json file in the temp workspace param_file_uri = os.path.join(temp_workspace, 'parameters' + PARAMETER_SET_EXTENSION) - build_parameter_set( - rewritten_args, model_name, param_file_uri, relative=True) + try: + build_parameter_set( + rewritten_args, model_name, param_file_uri, relative=True) + except ValueError as message: + # Pass through for handling by ui_server + raise ValueError(message) # Remove the handler before archiving the working dir (and the logfile) archive_filehandler.close() diff --git a/src/natcap/invest/ui_server.py b/src/natcap/invest/ui_server.py index f7be83d66f..dd009c3a16 100644 --- a/src/natcap/invest/ui_server.py +++ b/src/natcap/invest/ui_server.py @@ -234,15 +234,27 @@ def build_datastack_archive(): args: JSON string of InVEST model args keys and values Returns: - A string. + A dictionary with the following key/value pairs: + - message (string): for logging and/or rendering in the UI. + - error (boolean): True if an error occurred, otherwise False. """ payload = request.get_json() - datastack.build_datastack_archive( - json.loads(payload['args']), - payload['moduleName'], - payload['filepath']) - - return 'datastack archive created' + try: + datastack.build_datastack_archive( + json.loads(payload['args']), + payload['moduleName'], + payload['filepath']) + except ValueError as message: + LOGGER.error(str(message)) + return { + 'message': str(message), + 'error': True + } + else: + return { + 'message': 'Datastack archive created', + 'error': False + } @app.route(f'/{PREFIX}/log_model_start', methods=['POST']) @@ -264,6 +276,7 @@ def log_model_exit(): payload['status']) return 'OK' + @app.route(f'/{PREFIX}/languages', methods=['GET']) def get_supported_languages(): """Return a mapping of supported languages to their display names.""" diff --git a/tests/test_datastack.py b/tests/test_datastack.py index a471b8e5e3..35d0695fa7 100644 --- a/tests/test_datastack.py +++ b/tests/test_datastack.py @@ -397,6 +397,25 @@ def test_archive_extraction(self): os.path.join(spatial_csv_dir, spatial_csv_dict[4]['path']), target_csv_vector_path) + def test_relative_path_failure(self): + """Datastack: raise error when relative path creation fails.""" + from natcap.invest import datastack + params = { + 'workspace_dir': os.path.join(self.workspace), + } + + archive_path = os.path.join(self.workspace, 'archive.invs.tar.gz') + + # Call build_datastack_archive and force build_parameter_set + # to raise an error + error_message = 'Error saving datastack' + with self.assertRaises(ValueError): + with patch('natcap.invest.datastack.build_parameter_set', + side_effect=ValueError(error_message)): + datastack.build_datastack_archive( + params, 'test_datastack_modules.simple_parameters', + archive_path) + class ParameterSetTest(unittest.TestCase): """Test Datastack.""" diff --git a/tests/test_ui_server.py b/tests/test_ui_server.py index 02d9436ebe..78cc86cd01 100644 --- a/tests/test_ui_server.py +++ b/tests/test_ui_server.py @@ -190,11 +190,42 @@ def test_build_datastack_archive(self): 'carbon_pools_path': data_path }), } - _ = test_client.post( + response = test_client.post( f'{ROUTE_PREFIX}/build_datastack_archive', json=payload) + self.assertEqual( + response.json, + {'message': 'Datastack archive created', 'error': False}) # test_datastack.py asserts the actual archiving functionality self.assertTrue(os.path.exists(target_filepath)) + def test_build_datastack_archive_error_handling(self): + """UI server: build_datastack_archive endpoint + should catch a ValueError and return an error message. + """ + test_client = ui_server.app.test_client() + self.workspace_dir = tempfile.mkdtemp() + target_filepath = os.path.join(self.workspace_dir, 'data.tgz') + data_path = os.path.join(self.workspace_dir, 'data.csv') + with open(data_path, 'w') as file: + file.write('hello') + + payload = { + 'filepath': target_filepath, + 'moduleName': 'natcap.invest.carbon', + 'args': json.dumps({ + 'workspace_dir': 'foo', + 'carbon_pools_path': data_path + }), + } + error_message = 'Error saving datastack' + with patch('natcap.invest.datastack.build_datastack_archive', + side_effect=ValueError(error_message)): + response = test_client.post( + f'{ROUTE_PREFIX}/build_datastack_archive', json=payload) + self.assertEqual( + response.json, + {'message': error_message, 'error': True}) + @patch('natcap.invest.ui_server.usage.requests.post') @patch('natcap.invest.ui_server.usage.requests.get') def test_log_model_start(self, mock_get, mock_post): diff --git a/workbench/src/renderer/components/SetupTab/index.jsx b/workbench/src/renderer/components/SetupTab/index.jsx index 5914c66ff4..7577cbce59 100644 --- a/workbench/src/renderer/components/SetupTab/index.jsx +++ b/workbench/src/renderer/components/SetupTab/index.jsx @@ -251,8 +251,8 @@ class SetupTab extends React.Component { }; const key = window.crypto.getRandomValues(new Uint16Array(1))[0].toString(); this.setSaveAlert('archiving...', false, key); - const response = await archiveDatastack(payload); - this.setSaveAlert(response, false, key); + const {message, error} = await archiveDatastack(payload); + this.setSaveAlert(message, error, key); } /** State updater for alert messages from various save buttons. diff --git a/workbench/src/renderer/server_requests.js b/workbench/src/renderer/server_requests.js index 90ca4125aa..0e8be93fb3 100644 --- a/workbench/src/renderer/server_requests.js +++ b/workbench/src/renderer/server_requests.js @@ -146,10 +146,14 @@ export function archiveDatastack(payload) { body: JSON.stringify(payload), headers: { 'Content-Type': 'application/json' }, }) - .then((response) => response.text()) - .then((text) => { - logger.debug(text); - return text; + .then((response) => response.json()) + .then(({message, error}) => { + if (error) { + logger.error(message); + } else { + logger.debug(message); + } + return {message, error}; }) .catch((error) => logger.error(error.stack)) ); diff --git a/workbench/tests/renderer/investtab.test.js b/workbench/tests/renderer/investtab.test.js index e3b6afdc07..e68a5e4e8b 100644 --- a/workbench/tests/renderer/investtab.test.js +++ b/workbench/tests/renderer/investtab.test.js @@ -289,7 +289,10 @@ describe('Sidebar Buttons', () => { }); test('Save datastack: requests endpoint with correct payload', async () => { - const response = 'saved'; + const response = { + message: 'saved', + error: false, + }; archiveDatastack.mockImplementation(() => new Promise( (resolve) => { setTimeout(() => resolve(response), 500); @@ -308,7 +311,7 @@ describe('Sidebar Buttons', () => { expect(await findByRole('alert')).toHaveTextContent('archiving...'); await waitFor(() => { - expect(getByRole('alert')).toHaveTextContent(response); + expect(getByRole('alert')).toHaveTextContent(response.message); }); const payload = archiveDatastack.mock.calls[0][0]; expect(Object.keys(payload)).toEqual(expect.arrayContaining( From 35ee58f122152d79a76295bd13e1749bf46d804a Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 17 Sep 2024 15:01:28 -0600 Subject: [PATCH 036/111] Update React tests to cover save alerts --- workbench/tests/renderer/investtab.test.js | 170 ++++++++++++++++----- 1 file changed, 129 insertions(+), 41 deletions(-) diff --git a/workbench/tests/renderer/investtab.test.js b/workbench/tests/renderer/investtab.test.js index e68a5e4e8b..bee50202b3 100644 --- a/workbench/tests/renderer/investtab.test.js +++ b/workbench/tests/renderer/investtab.test.js @@ -221,19 +221,18 @@ describe('Sidebar Buttons', () => { message: 'saved', error: false, }; - writeParametersToFile.mockResolvedValue(response); + writeParametersToFile.mockResolvedValueOnce(response); const mockDialogData = { canceled: false, filePath: 'foo.json' }; ipcRenderer.invoke.mockResolvedValueOnce(mockDialogData); const { findByText, findByLabelText, findByRole } = renderInvestTab(); const saveAsButton = await findByText('Save as...'); await userEvent.click(saveAsButton); - const jsonOption = await findByLabelText((content, element) => content.startsWith('Parameters only')); + const jsonOption = await findByLabelText((content) => content.startsWith('Parameters only')); await userEvent.click(jsonOption); const saveButton = await findByRole('button', { name: 'Save' }); await userEvent.click(saveButton); - expect(await findByRole('alert')).toHaveTextContent(response.message); const payload = writeParametersToFile.mock.calls[0][0]; expect(Object.keys(payload)).toEqual(expect.arrayContaining( ['filepath', 'moduleName', 'relativePaths', 'args'] @@ -254,19 +253,18 @@ describe('Sidebar Buttons', () => { test('Save to Python script: requests endpoint with correct payload', async () => { const response = 'saved'; - saveToPython.mockResolvedValue(response); + saveToPython.mockResolvedValueOnce(response); const mockDialogData = { canceled: false, filePath: 'foo.py' }; ipcRenderer.invoke.mockResolvedValueOnce(mockDialogData); const { findByText, findByLabelText, findByRole } = renderInvestTab(); const saveAsButton = await findByText('Save as...'); await userEvent.click(saveAsButton); - const pythonOption = await findByLabelText((content, element) => content.startsWith('Python script')); + const pythonOption = await findByLabelText((content) => content.startsWith('Python script')); await userEvent.click(pythonOption); const saveButton = await findByRole('button', { name: 'Save' }); await userEvent.click(saveButton); - expect(await findByRole('alert')).toHaveTextContent(response); const payload = saveToPython.mock.calls[0][0]; expect(Object.keys(payload)).toEqual(expect.arrayContaining( ['filepath', 'modelname', 'args'] @@ -293,26 +291,18 @@ describe('Sidebar Buttons', () => { message: 'saved', error: false, }; - archiveDatastack.mockImplementation(() => new Promise( - (resolve) => { - setTimeout(() => resolve(response), 500); - } - )); + archiveDatastack.mockResolvedValueOnce(response); const mockDialogData = { canceled: false, filePath: 'data.tgz' }; ipcRenderer.invoke.mockResolvedValue(mockDialogData); const { findByText, findByLabelText, findByRole, getByRole } = renderInvestTab(); const saveAsButton = await findByText('Save as...'); await userEvent.click(saveAsButton); - const datastackOption = await findByLabelText((content, element) => content.startsWith('Parameters and data')); + const datastackOption = await findByLabelText((content) => content.startsWith('Parameters and data')); await userEvent.click(datastackOption); const saveButton = await findByRole('button', { name: 'Save' }); await userEvent.click(saveButton); - expect(await findByRole('alert')).toHaveTextContent('archiving...'); - await waitFor(() => { - expect(getByRole('alert')).toHaveTextContent(response.message); - }); const payload = archiveDatastack.mock.calls[0][0]; expect(Object.keys(payload)).toEqual(expect.arrayContaining( ['filepath', 'moduleName', 'args'] @@ -334,6 +324,129 @@ describe('Sidebar Buttons', () => { expect(archiveDatastack).toHaveBeenCalledTimes(1); }); + test.each([ + ['Parameters only', 'saveJsonFile'], + ['Parameters and data', 'saveDatastack'], + ['Python script', 'savePythonScript'] + ])('%s: does nothing when canceled', async (label, method) => { + // callback data if the OS dialog was canceled + const mockDialogData = { + canceled: true, + filePaths: [] + }; + ipcRenderer.invoke.mockResolvedValue(mockDialogData); + const spy = jest.spyOn(SetupTab.WrappedComponent.prototype, method); + + const { findByText, findByLabelText, findByRole } = renderInvestTab(); + const saveAsButton = await findByText('Save as...'); + await userEvent.click(saveAsButton); + const option = await findByLabelText((content, element) => content.startsWith(label)); + await userEvent.click(option); + const saveButton = await findByRole('button', { name: 'Save' }); + await userEvent.click(saveButton); + + // Calls that would have triggered if a file was selected + expect(spy).toHaveBeenCalledTimes(0); + }); + + test.each([ + [ + 'Parameters only', + writeParametersToFile, + {message: 'Parameter set saved', error: false} + ], + [ + 'Parameters and data', + archiveDatastack, + {message: 'Datastack archive created', error: false} + ], + [ + 'Python script', + saveToPython, + 'Python script saved' + ] + ])('%s: renders success message', async (label, method, response) => { + ipcRenderer.invoke.mockResolvedValueOnce({canceled: false, filePath: 'example.txt'}); + method.mockImplementation(() => new Promise( + (resolve) => { + setTimeout(() => resolve(response), 10); + } + )); + + const { findByText, findByLabelText, findByRole } = renderInvestTab(); + const saveAsButton = await findByText('Save as...'); + await userEvent.click(saveAsButton); + const option = await findByLabelText((content) => content.startsWith(label)); + await userEvent.click(option); + const saveButton = await findByRole('button', { name: 'Save' }); + await userEvent.click(saveButton); + + const saveAlert = await findByRole('alert'); + if (method == archiveDatastack) { + expect(saveAlert).toHaveTextContent('archiving...'); + } + await waitFor(() => { + expect(saveAlert).toHaveTextContent(response.message ?? response); + }); + expect(saveAlert).toHaveClass('alert-success'); + }); + + test.each([ + [ + 'Parameters only', + writeParametersToFile, + {message: 'Error saving parameter set', error: true} + ], + [ + 'Parameters and data', + archiveDatastack, + {message: 'Error creating datastack archive', error: true} + ], + ])('%s: renders error message', async (label, method, response) => { + ipcRenderer.invoke.mockResolvedValueOnce({canceled: false, filePath: 'example.txt'}); + method.mockImplementation(() => new Promise( + (resolve) => { + setTimeout(() => resolve(response), 10); + } + )); + + const { findByText, findByLabelText, findByRole } = renderInvestTab(); + const saveAsButton = await findByText('Save as...'); + await userEvent.click(saveAsButton); + const option = await findByLabelText((content) => content.startsWith(label)); + await userEvent.click(option); + const saveButton = await findByRole('button', { name: 'Save' }); + await userEvent.click(saveButton); + + const saveAlert = await findByRole('alert'); + if (method == archiveDatastack) { + expect(saveAlert).toHaveTextContent('archiving...'); + } + await waitFor(() => { + expect(saveAlert).toHaveTextContent(response.message); + }); + expect(saveAlert).toHaveClass('alert-danger'); + }); + + test('Save errors are cleared when save modal opens', async () => { + ipcRenderer.invoke.mockResolvedValueOnce({canceled: false, filePath: 'example.txt'}); + writeParametersToFile.mockResolvedValueOnce({message: 'Error saving parameter set', error: true}); + + // Trigger error alert + const { findByText, findByLabelText, findByRole, queryByRole } = renderInvestTab(); + const saveAsButton = await findByText('Save as...'); + await userEvent.click(saveAsButton); + const jsonOption = await findByLabelText((content) => content.startsWith('Parameters only')); + await userEvent.click(jsonOption); + const saveButton = await findByRole('button', { name: 'Save' }); + await userEvent.click(saveButton); + expect(await findByRole('alert')).toHaveClass('alert-danger'); + + // Re-open save modal + await userEvent.click(saveAsButton); + expect(queryByRole('alert')).toBe(null); + }); + test('Load parameters from file: loads parameters', async () => { const mockDatastack = { module_name: spec.pyname, @@ -391,31 +504,6 @@ describe('Sidebar Buttons', () => { expect(spy).toHaveBeenCalledTimes(0); }); - test.each([ - ['Parameters only', 'saveJsonFile'], - ['Parameters and data', 'saveDatastack'], - ['Python script', 'savePythonScript'] - ])('%s: does nothing when canceled', async (label, method) => { - // callback data if the OS dialog was canceled - const mockDialogData = { - canceled: true, - filePaths: [] - }; - ipcRenderer.invoke.mockResolvedValue(mockDialogData); - const spy = jest.spyOn(SetupTab.WrappedComponent.prototype, method); - - const { findByText, findByLabelText, findByRole } = renderInvestTab(); - const saveAsButton = await findByText('Save as...'); - await userEvent.click(saveAsButton); - const option = await findByLabelText((content, element) => content.startsWith(label)); - await userEvent.click(option); - const saveButton = await findByRole('button', { name: 'Save' }); - await userEvent.click(saveButton); - - // Calls that would have triggered if a file was selected - expect(spy).toHaveBeenCalledTimes(0); - }); - test('Load parameters button has hover text', async () => { const { findByText, From ec5f90eae3c2335c789310f8a768314058dfc538 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 17 Sep 2024 15:06:11 -0600 Subject: [PATCH 037/111] Update HISTORY --- HISTORY.rst | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index dfa49b3025..46eb4aee70 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -39,15 +39,17 @@ Unreleased Changes ------------------ * Workbench * Several small updates to the model input form UI to improve usability - and visual consistency (https://github.com/natcap/invest/issues/912) + and visual consistency (https://github.com/natcap/invest/issues/912). * Fixed a bug that caused the application to crash when attempting to open a workspace without a valid logfile - (https://github.com/natcap/invest/issues/1598) + (https://github.com/natcap/invest/issues/1598). * Fixed a bug that was allowing readonly workspace directories on Windows - (https://github.com/natcap/invest/issues/1599) + (https://github.com/natcap/invest/issues/1599). * Fixed a bug that, in certain scenarios, caused a datastack to be saved with relative paths when the Relative Paths checkbox was left unchecked - (https://github.com/natcap/invest/issues/1609) + (https://github.com/natcap/invest/issues/1609). + * Improved error handling when a datastack cannot be saved with relative + paths across drives (https://github.com/natcap/invest/issues/1608). 3.14.2 (2024-05-29) ------------------- From f8f889033a0ced475ab3234aa55faaaa0ccbd9da Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 17 Sep 2024 15:46:49 -0600 Subject: [PATCH 038/111] Increase timeout for archiveDatastack alert test --- workbench/tests/renderer/investtab.test.js | 27 +++++++++------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/workbench/tests/renderer/investtab.test.js b/workbench/tests/renderer/investtab.test.js index bee50202b3..0fff31abec 100644 --- a/workbench/tests/renderer/investtab.test.js +++ b/workbench/tests/renderer/investtab.test.js @@ -367,11 +367,15 @@ describe('Sidebar Buttons', () => { ] ])('%s: renders success message', async (label, method, response) => { ipcRenderer.invoke.mockResolvedValueOnce({canceled: false, filePath: 'example.txt'}); - method.mockImplementation(() => new Promise( - (resolve) => { - setTimeout(() => resolve(response), 10); - } - )); + if (method == archiveDatastack) { + method.mockImplementationOnce(() => new Promise( + (resolve) => { + setTimeout(() => resolve(response), 500); + } + )); + } else { + method.mockResolvedValueOnce(response); + } const { findByText, findByLabelText, findByRole } = renderInvestTab(); const saveAsButton = await findByText('Save as...'); @@ -404,11 +408,7 @@ describe('Sidebar Buttons', () => { ], ])('%s: renders error message', async (label, method, response) => { ipcRenderer.invoke.mockResolvedValueOnce({canceled: false, filePath: 'example.txt'}); - method.mockImplementation(() => new Promise( - (resolve) => { - setTimeout(() => resolve(response), 10); - } - )); + method.mockResolvedValueOnce(response); const { findByText, findByLabelText, findByRole } = renderInvestTab(); const saveAsButton = await findByText('Save as...'); @@ -419,12 +419,7 @@ describe('Sidebar Buttons', () => { await userEvent.click(saveButton); const saveAlert = await findByRole('alert'); - if (method == archiveDatastack) { - expect(saveAlert).toHaveTextContent('archiving...'); - } - await waitFor(() => { - expect(saveAlert).toHaveTextContent(response.message); - }); + expect(saveAlert).toHaveTextContent(response.message); expect(saveAlert).toHaveClass('alert-danger'); }); From 3294e6a1020939b6f442eae2750462a4698495ce Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 19 Sep 2024 15:50:47 -0700 Subject: [PATCH 039/111] Implementing a function to guarantee that the LULC has a nodata value. --- src/natcap/invest/urban_nature_access.py | 43 ++++++++++++++++++++---- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/src/natcap/invest/urban_nature_access.py b/src/natcap/invest/urban_nature_access.py index 2831e65286..35fde61884 100644 --- a/src/natcap/invest/urban_nature_access.py +++ b/src/natcap/invest/urban_nature_access.py @@ -755,13 +755,12 @@ def execute(args): squared_lulc_pixel_size = _square_off_pixels(args['lulc_raster_path']) lulc_alignment_task = graph.add_task( - pygeoprocessing.warp_raster, + _warp_lulc, kwargs={ - 'base_raster_path': args['lulc_raster_path'], - 'target_pixel_size': squared_lulc_pixel_size, - 'target_bb': target_bounding_box, - 'target_raster_path': file_registry['aligned_lulc'], - 'resample_method': 'near', + "source_lulc_path": args['lulc_raster_path'], + "target_lulc_path": file_registry['aligned_lulc'], + "target_pixel_size": squared_lulc_pixel_size, + "target_bounding_box": target_bounding_box, }, target_path_list=[file_registry['aligned_lulc']], task_name='Resample LULC to have square pixels' @@ -2528,6 +2527,38 @@ def _create_mask(*raster_arrays): _create_mask, target_mask_path, gdal.GDT_Byte, nodata_target=255) +def _warp_lulc(source_lulc_path, target_lulc_path, target_pixel_size, + target_bounding_box): + """Warp a LULC raster and set a nodata if needed. + + Args: + source_lulc_path (str): The path to a source LULC raster. + target_lulc_path (str): The path to the new LULC raster. + target_pixel_size (tuple): A 2-tuple of the target pixel size. + target_bounding_box (tuple): A 4-tuple of the target bounding box. + + Returns: + ``None``. + """ + source_raster_info = pygeoprocessing.get_raster_info(source_lulc_path) + target_nodata = source_raster_info['nodata'][0] + if target_nodata is None: + target_nodata = pygeoprocessing.choose_nodata( + source_raster_info['numpy_type']) + + pygeoprocessing.warp_raster( + source_lulc_path, target_pixel_size, target_lulc_path, + 'near', target_bb=target_bounding_box, + target_projection_wkt=source_raster_info['projection_wkt']) + + # if there is no defined nodata, set a default value + raster = gdal.OpenEx(target_lulc_path, gdal.GA_Update) + band = raster.GetRasterBand(1) + band.SetNoDataValue(target_nodata) + band = None + raster = None + + def _mask_raster(source_raster_path, mask_raster_path, target_raster_path): """Convert pixels to nodata given an existing mask raster. From eca7a62512b5dade74903a6ff6f8743df6eaa117 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 19 Sep 2024 15:59:37 -0700 Subject: [PATCH 040/111] Guaranteeing that the nodata value is out of range. RE:#1293 --- src/natcap/invest/urban_nature_access.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/natcap/invest/urban_nature_access.py b/src/natcap/invest/urban_nature_access.py index 35fde61884..c8b4928699 100644 --- a/src/natcap/invest/urban_nature_access.py +++ b/src/natcap/invest/urban_nature_access.py @@ -2543,8 +2543,10 @@ def _warp_lulc(source_lulc_path, target_lulc_path, target_pixel_size, source_raster_info = pygeoprocessing.get_raster_info(source_lulc_path) target_nodata = source_raster_info['nodata'][0] if target_nodata is None: + # Guarantee that our nodata cannot be represented by the datatype - + # select a nodata value that's out of range. target_nodata = pygeoprocessing.choose_nodata( - source_raster_info['numpy_type']) + source_raster_info['numpy_type']) + 1 pygeoprocessing.warp_raster( source_lulc_path, target_pixel_size, target_lulc_path, From b6339e6e5cbd32431255c0b2576586110c11e2a9 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 19 Sep 2024 16:02:40 -0700 Subject: [PATCH 041/111] Noting change in HISTORY. RE:#1293 --- HISTORY.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index dfa49b3025..c888d1bfd2 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -37,6 +37,10 @@ Unreleased Changes ------------------ +* Urban Nature Access + * The model now works as expected when the user provides an LULC raster + that does not have a nodata value defined. + https://github.com/natcap/invest/issues/1293 * Workbench * Several small updates to the model input form UI to improve usability and visual consistency (https://github.com/natcap/invest/issues/912) From e6eb1a037a28c8c56adc633425dc8bb467e83ad8 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 19 Sep 2024 16:06:24 -0700 Subject: [PATCH 042/111] Adding a test for when the LULC has no nodata value. RE:#1293 --- tests/test_urban_nature_access.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/test_urban_nature_access.py b/tests/test_urban_nature_access.py index 0e4858a832..4e5141f0b6 100644 --- a/tests/test_urban_nature_access.py +++ b/tests/test_urban_nature_access.py @@ -358,6 +358,21 @@ def test_core_model(self): self.assertAlmostEqual(numpy.min(valid_pixels), 1171.7352294921875) self.assertAlmostEqual(numpy.max(valid_pixels), 11898.0712890625) + def test_no_lulc_nodata(self): + """UNA: verify behavior when the LULC has no nodata value.""" + from natcap.invest import urban_nature_access + + args = _build_model_args(self.workspace_dir) + args['search_radius_mode'] = urban_nature_access.RADIUS_OPT_UNIFORM + args['search_radius'] = 100 + + raster = gdal.OpenEx(args['lulc_raster_path'], gdal.OF_RASTER) + band = raster.GetRasterBand(1) + band.DeleteNoDataValue() + band = None + raster = None + urban_nature_access.execute(args) + def test_split_urban_nature(self): from natcap.invest import urban_nature_access From 3ec1485d28b7eb70ed66eff97761cbfe734958a7 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Mon, 30 Sep 2024 16:52:58 -0600 Subject: [PATCH 043/111] Update UFRM to use CreateCopy when generating summary vector --- .../invest/urban_flood_risk_mitigation.py | 51 +++++++------------ tests/test_ufrm.py | 7 ++- 2 files changed, 24 insertions(+), 34 deletions(-) diff --git a/src/natcap/invest/urban_flood_risk_mitigation.py b/src/natcap/invest/urban_flood_risk_mitigation.py index 493d60b5a0..fa5b64cacb 100644 --- a/src/natcap/invest/urban_flood_risk_mitigation.py +++ b/src/natcap/invest/urban_flood_risk_mitigation.py @@ -553,22 +553,11 @@ def _write_summary_vector( ``None`` """ source_aoi_vector = gdal.OpenEx(source_aoi_vector_path, gdal.OF_VECTOR) - source_aoi_layer = source_aoi_vector.GetLayer() - source_aoi_field_defns = source_aoi_layer.schema - source_geom_type = source_aoi_layer.GetGeomType() - source_srs_wkt = pygeoprocessing.get_vector_info( - source_aoi_vector_path)['projection_wkt'] - source_srs = osr.SpatialReference() - source_srs.ImportFromWkt(source_srs_wkt) - esri_driver = gdal.GetDriverByName('ESRI Shapefile') - target_watershed_vector = esri_driver.Create( - target_vector_path, 0, 0, 0, gdal.GDT_Unknown) - layer_name = os.path.splitext(os.path.basename( - target_vector_path))[0] - LOGGER.debug(f"creating layer {layer_name}") - target_watershed_layer = target_watershed_vector.CreateLayer( - layer_name, source_srs, source_geom_type) + esri_driver.CreateCopy(target_vector_path, source_aoi_vector) + target_watershed_vector = gdal.OpenEx(target_vector_path, + gdal.OF_VECTOR | gdal.GA_Update) + target_watershed_layer = target_watershed_vector.GetLayer() target_fields = ['rnf_rt_idx', 'rnf_rt_m3', 'flood_vol'] if damage_per_aoi_stats is not None: @@ -580,42 +569,38 @@ def _write_summary_vector( field_def.SetPrecision(11) target_watershed_layer.CreateField(field_def) - target_layer_defn = target_watershed_layer.GetLayerDefn() - for base_feature in source_aoi_layer: - feature_id = base_feature.GetFID() - target_feature = ogr.Feature(target_layer_defn) - base_geom_ref = base_feature.GetGeometryRef() - target_feature.SetGeometry(base_geom_ref.Clone()) - base_geom_ref = None + target_watershed_layer.ResetReading() + for target_feature in target_watershed_layer: + # Target vector is SHP, where FIDs start at 0, but stats were + # generated based on GPKG reprojection, where FIDs start at 1. + # Therefore, we need to reference stats at SHP FID + 1. + stat_key = target_feature.GetFID() + 1 - pixel_count = runoff_ret_stats[feature_id]['count'] + pixel_count = runoff_ret_stats[stat_key]['count'] if pixel_count > 0: mean_value = ( - runoff_ret_stats[feature_id]['sum'] / float(pixel_count)) + runoff_ret_stats[stat_key]['sum'] / float(pixel_count)) target_feature.SetField('rnf_rt_idx', float(mean_value)) target_feature.SetField( 'rnf_rt_m3', float( - runoff_ret_vol_stats[feature_id]['sum'])) + runoff_ret_vol_stats[stat_key]['sum'])) if damage_per_aoi_stats is not None: - pixel_count = runoff_ret_vol_stats[feature_id]['count'] + pixel_count = runoff_ret_vol_stats[stat_key]['count'] if pixel_count > 0: - damage_sum = damage_per_aoi_stats[feature_id] + damage_sum = damage_per_aoi_stats[stat_key] target_feature.SetField('aff_bld', damage_sum) # This is the service_built equation. target_feature.SetField( 'serv_blt', ( - damage_sum * runoff_ret_vol_stats[feature_id]['sum'])) + damage_sum * runoff_ret_vol_stats[stat_key]['sum'])) target_feature.SetField( - 'flood_vol', float(flood_volume_stats[feature_id]['sum'])) - - target_watershed_layer.CreateFeature(target_feature) + 'flood_vol', float(flood_volume_stats[stat_key]['sum'])) - for field_defn in source_aoi_field_defns: - target_watershed_layer.CreateField(field_defn) + target_watershed_layer.SetFeature(target_feature) target_watershed_layer.SyncToDisk() target_watershed_layer = None diff --git a/tests/test_ufrm.py b/tests/test_ufrm.py index 1d5e1d96b0..eb2cef2f6a 100644 --- a/tests/test_ufrm.py +++ b/tests/test_ufrm.py @@ -79,7 +79,7 @@ def test_ufrm_regression(self): set(output_fields), set(field.GetName() for field in result_layer.schema)) - result_feature = result_layer.GetFeature(0) + result_feature = result_layer.GetNextFeature() for fieldname, expected_value in ( ('aff_bld', 187010830.32202843), ('serv_blt', 13253546667257.65), @@ -92,6 +92,11 @@ def test_ufrm_regression(self): self.assertAlmostEqual( result_val, expected_value, places=-places_to_round) + input_feature = input_layer.GetNextFeature() + for fieldname in input_fields: + self.assertEqual(result_feature.GetField(fieldname), + input_feature.GetField(fieldname)) + result_feature = None result_layer = None result_vector = None From 94f7f006e88c277362f33ff86a0d89cc037564ea Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 1 Oct 2024 14:34:39 -0700 Subject: [PATCH 044/111] Cleaning up a conditional. RE:#1293 --- src/natcap/invest/urban_nature_access.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/natcap/invest/urban_nature_access.py b/src/natcap/invest/urban_nature_access.py index c8b4928699..136575a956 100644 --- a/src/natcap/invest/urban_nature_access.py +++ b/src/natcap/invest/urban_nature_access.py @@ -2542,11 +2542,6 @@ def _warp_lulc(source_lulc_path, target_lulc_path, target_pixel_size, """ source_raster_info = pygeoprocessing.get_raster_info(source_lulc_path) target_nodata = source_raster_info['nodata'][0] - if target_nodata is None: - # Guarantee that our nodata cannot be represented by the datatype - - # select a nodata value that's out of range. - target_nodata = pygeoprocessing.choose_nodata( - source_raster_info['numpy_type']) + 1 pygeoprocessing.warp_raster( source_lulc_path, target_pixel_size, target_lulc_path, @@ -2554,11 +2549,16 @@ def _warp_lulc(source_lulc_path, target_lulc_path, target_pixel_size, target_projection_wkt=source_raster_info['projection_wkt']) # if there is no defined nodata, set a default value - raster = gdal.OpenEx(target_lulc_path, gdal.GA_Update) - band = raster.GetRasterBand(1) - band.SetNoDataValue(target_nodata) - band = None - raster = None + if target_nodata is None: + # Guarantee that our nodata cannot be represented by the datatype - + # select a nodata value that's out of range. + target_nodata = pygeoprocessing.choose_nodata( + source_raster_info['numpy_type']) + 1 + raster = gdal.OpenEx(target_lulc_path, gdal.GA_Update) + band = raster.GetRasterBand(1) + band.SetNoDataValue(target_nodata) + band = None + raster = None def _mask_raster(source_raster_path, mask_raster_path, target_raster_path): From 436ec8e3c0179d4547072a9d31f74d49ffd8ff69 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Fri, 4 Oct 2024 11:05:48 -0600 Subject: [PATCH 045/111] Use reprojected access vector in rasterization task --- src/natcap/invest/habitat_quality.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/natcap/invest/habitat_quality.py b/src/natcap/invest/habitat_quality.py index 2bf024fe46..301c18cfc7 100644 --- a/src/natcap/invest/habitat_quality.py +++ b/src/natcap/invest/habitat_quality.py @@ -555,7 +555,7 @@ def execute(args): rasterize_access_task = task_graph.add_task( func=pygeoprocessing.rasterize, - args=(args['access_vector_path'], access_raster_path), + args=(reprojected_access_path, access_raster_path), kwargs={ 'option_list': ['ATTRIBUTE=ACCESS'], 'burn_values': None From e7ea91b1c8fb1ba112325bc52a71f43c50c0747d Mon Sep 17 00:00:00 2001 From: Emily Soth Date: Mon, 7 Oct 2024 14:10:56 -0700 Subject: [PATCH 046/111] update SDR variable names and correct typo in docstring #1629 --- src/natcap/invest/sdr/sdr_core.pyx | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/natcap/invest/sdr/sdr_core.pyx b/src/natcap/invest/sdr/sdr_core.pyx index 69fc7500e4..345ef6ab76 100644 --- a/src/natcap/invest/sdr/sdr_core.pyx +++ b/src/natcap/invest/sdr/sdr_core.pyx @@ -356,13 +356,13 @@ def calculate_sediment_deposition( This algorithm outputs both sediment deposition (t_i) and flux (f_i):: - t_i = dr_i * (sum over j ∈ J of f_j * p(i,j)) + E'_i + t_i = dt_i * (sum over j ∈ J of f_j * p(j,i)) - f_i = (1 - dr_i) * (sum over j ∈ J of f_j * p(i,j)) + E'_i + f_i = (1 - dt_i) * (sum over j ∈ J of f_j * p(j,i)) + E'_i (sum over k ∈ K of SDR_k * p(i,k)) - SDR_i - dr_i = -------------------------------------------- + dt_i = -------------------------------------------- (1 - SDR_i) where: @@ -645,21 +645,21 @@ def calculate_sediment_deposition( if sdr_i == 1: # This reflects property B in the user's guide and is # an edge case to avoid division-by-zero. - dr_i = 1 + dt_i = 1 else: - dr_i = (downslope_sdr_weighted_sum - sdr_i) / (1 - sdr_i) + dt_i = (downslope_sdr_weighted_sum - sdr_i) / (1 - sdr_i) # Lisa's modified equations - t_i = dr_i * f_j_weighted_sum # deposition, a.k.a trapped sediment - f_i = (1 - dr_i) * f_j_weighted_sum + e_prime_i # flux + t_i = dt_i * f_j_weighted_sum # deposition, a.k.a trapped sediment + f_i = (1 - dt_i) * f_j_weighted_sum + e_prime_i # flux - # On large flow paths, it's possible for dr_i, f_i and t_i + # On large flow paths, it's possible for dt_i, f_i and t_i # to have very small negative values that are numerically # equivalent to 0. These negative values were raising # questions on the forums and it's easier to clamp the # values here than to explain IEEE 754. - if dr_i < 0: - dr_i = 0 + if dt_i < 0: + dt_i = 0 if t_i < 0: t_i = 0 if f_i < 0: From 759cb83da168d7d85265d90e95262b55d55f970c Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Mon, 7 Oct 2024 15:29:04 -0600 Subject: [PATCH 047/111] Update HISTORY --- HISTORY.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index dfa49b3025..5ab3fd4117 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -48,6 +48,9 @@ Unreleased Changes * Fixed a bug that, in certain scenarios, caused a datastack to be saved with relative paths when the Relative Paths checkbox was left unchecked (https://github.com/natcap/invest/issues/1609) +* Habitat Quality + * Access raster is now generated from the reprojected access vector. + (https://github.com/natcap/invest/issues/1615) 3.14.2 (2024-05-29) ------------------- From bfff17b636c7308d9625145eb17fa1db09a8f9d6 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Mon, 7 Oct 2024 17:40:03 -0600 Subject: [PATCH 048/111] Remove unneeded error pass-through and unneeded else blocks --- src/natcap/invest/datastack.py | 15 +++------------ src/natcap/invest/ui_server.py | 18 ++++++++---------- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/natcap/invest/datastack.py b/src/natcap/invest/datastack.py index da0a7eca2b..610cac4841 100644 --- a/src/natcap/invest/datastack.py +++ b/src/natcap/invest/datastack.py @@ -226,10 +226,6 @@ def build_datastack_archive(args, model_name, datastack_path): Returns: ``None`` - - Raises: - ValueError if raised by build_parameter_set - (i.e., if creating a relative path fails). """ module = importlib.import_module(name=model_name) @@ -457,12 +453,8 @@ def build_datastack_archive(args, model_name, datastack_path): # write parameters to a new json file in the temp workspace param_file_uri = os.path.join(temp_workspace, 'parameters' + PARAMETER_SET_EXTENSION) - try: - build_parameter_set( + build_parameter_set( rewritten_args, model_name, param_file_uri, relative=True) - except ValueError as message: - # Pass through for handling by ui_server - raise ValueError(message) # Remove the handler before archiving the working dir (and the logfile) archive_filehandler.close() @@ -573,9 +565,8 @@ def _recurse(args_param): """Error: Cannot save datastack with relative paths across drives. Choose a different save location, or use absolute paths.""") - else: - # Always save unix paths. - linux_style_path = temp_rel_path.replace('\\', '/') + # Always save unix paths. + linux_style_path = temp_rel_path.replace('\\', '/') else: # Always save unix paths. linux_style_path = normalized_path.replace('\\', '/') diff --git a/src/natcap/invest/ui_server.py b/src/natcap/invest/ui_server.py index dd009c3a16..7c4ad72af2 100644 --- a/src/natcap/invest/ui_server.py +++ b/src/natcap/invest/ui_server.py @@ -194,11 +194,10 @@ def write_parameter_set_file(): 'message': str(message), 'error': True } - else: - return { - 'message': 'Parameter set saved', - 'error': False - } + return { + 'message': 'Parameter set saved', + 'error': False + } @app.route(f'/{PREFIX}/save_to_python', methods=['POST']) @@ -250,11 +249,10 @@ def build_datastack_archive(): 'message': str(message), 'error': True } - else: - return { - 'message': 'Datastack archive created', - 'error': False - } + return { + 'message': 'Datastack archive created', + 'error': False + } @app.route(f'/{PREFIX}/log_model_start', methods=['POST']) From 1d592d09bf4b4ae06f34b07bfdb7ceee98f84484 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Mon, 7 Oct 2024 17:47:30 -0600 Subject: [PATCH 049/111] Change duration of save alerts to 4s, and update documentation for setSaveAlert --- workbench/src/renderer/components/SetupTab/index.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workbench/src/renderer/components/SetupTab/index.jsx b/workbench/src/renderer/components/SetupTab/index.jsx index 7577cbce59..fee9ebecb4 100644 --- a/workbench/src/renderer/components/SetupTab/index.jsx +++ b/workbench/src/renderer/components/SetupTab/index.jsx @@ -258,13 +258,13 @@ class SetupTab extends React.Component { /** State updater for alert messages from various save buttons. * * @param {string} message - the message to display + * @param {boolean} error - true if message was generated by an error, + * false otherwise. Defaults to false. * @param {string} key - a key to uniquely identify each save action, * passed as prop to `Expire` so that it can be aware of whether to, * 1. display: because a new save occurred, or * 2. not display: on a re-render after `Expire` expired, or * 3. update: because 'archiving...' alert changes to final message - * @param {boolean} error - true if message was generated by an error, - * false otherwise. Defaults to false. * * @returns {undefined} */ @@ -516,7 +516,7 @@ class SetupTab extends React.Component { // Alert won't expire during archiving; will expire 2s after completion // Alert won't expire when an error has occurred; // will be hidden next time save modal opens - const alertExpires = (error || message === 'archiving...') ? 1e7 : 2000; + const alertExpires = (error || message === 'archiving...') ? 1e7 : 4000; SaveAlerts.push( Date: Mon, 7 Oct 2024 17:52:35 -0600 Subject: [PATCH 050/111] Remove extra whitespace & update comment --- src/natcap/invest/datastack.py | 2 +- workbench/src/renderer/components/SetupTab/index.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/natcap/invest/datastack.py b/src/natcap/invest/datastack.py index 610cac4841..0fb2cabed4 100644 --- a/src/natcap/invest/datastack.py +++ b/src/natcap/invest/datastack.py @@ -454,7 +454,7 @@ def build_datastack_archive(args, model_name, datastack_path): param_file_uri = os.path.join(temp_workspace, 'parameters' + PARAMETER_SET_EXTENSION) build_parameter_set( - rewritten_args, model_name, param_file_uri, relative=True) + rewritten_args, model_name, param_file_uri, relative=True) # Remove the handler before archiving the working dir (and the logfile) archive_filehandler.close() diff --git a/workbench/src/renderer/components/SetupTab/index.jsx b/workbench/src/renderer/components/SetupTab/index.jsx index fee9ebecb4..02256f5a40 100644 --- a/workbench/src/renderer/components/SetupTab/index.jsx +++ b/workbench/src/renderer/components/SetupTab/index.jsx @@ -513,7 +513,7 @@ class SetupTab extends React.Component { Object.keys(saveAlerts).forEach((key) => { const { message, error } = saveAlerts[key]; if (message) { - // Alert won't expire during archiving; will expire 2s after completion + // Alert won't expire during archiving; will expire 4s after completion // Alert won't expire when an error has occurred; // will be hidden next time save modal opens const alertExpires = (error || message === 'archiving...') ? 1e7 : 4000; From 5458781db4469cf2837cd918a788af2b17b30eaa Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 8 Oct 2024 12:10:17 -0600 Subject: [PATCH 051/111] Use ESRI SHP driver for reprojections to avoid off-by-one scenario when mapping zonal stats to output vector --- .../invest/urban_flood_risk_mitigation.py | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/src/natcap/invest/urban_flood_risk_mitigation.py b/src/natcap/invest/urban_flood_risk_mitigation.py index fa5b64cacb..a6dbfa5690 100644 --- a/src/natcap/invest/urban_flood_risk_mitigation.py +++ b/src/natcap/invest/urban_flood_risk_mitigation.py @@ -173,14 +173,14 @@ "about": "Map of runoff volume.", "bands": {1: {"type": "number", "units": u.meter**3}} }, - "reprojected_aoi.gpkg": { + "reprojected_aoi.shp": { "about": ( "Copy of AOI vector reprojected to the same spatial " "reference as the LULC."), "geometries": spec_utils.POLYGONS, "fields": {} }, - "structures_reprojected.gpkg": { + "structures_reprojected.shp": { "about": ( "Copy of built infrastructure vector reprojected to " "the same spatial reference as the LULC."), @@ -408,14 +408,14 @@ def execute(args): task_name='calculate service built raster') reprojected_aoi_path = os.path.join( - intermediate_dir, 'reprojected_aoi.gpkg') + intermediate_dir, 'reprojected_aoi') reprojected_aoi_task = task_graph.add_task( func=pygeoprocessing.reproject_vector, args=( args['aoi_watersheds_path'], target_sr_wkt, reprojected_aoi_path), - kwargs={'driver_name': 'GPKG'}, + kwargs={'driver_name': 'ESRI Shapefile'}, target_path_list=[reprojected_aoi_path], task_name='reproject aoi/watersheds') @@ -435,7 +435,7 @@ def execute(args): (runoff_retention_raster_path, 1), reprojected_aoi_path), store_result=True, - dependent_task_list=[runoff_retention_task], + dependent_task_list=[runoff_retention_task, reprojected_aoi_task], task_name='zonal_statistics over runoff_retention raster') runoff_retention_volume_stats_task = task_graph.add_task( @@ -444,7 +444,7 @@ def execute(args): (runoff_retention_vol_raster_path, 1), reprojected_aoi_path), store_result=True, - dependent_task_list=[runoff_retention_vol_task], + dependent_task_list=[runoff_retention_vol_task, reprojected_aoi_task], task_name='zonal_statistics over runoff_retention_volume raster') damage_per_aoi_stats = None @@ -457,13 +457,13 @@ def execute(args): args['built_infrastructure_vector_path'] not in ('', None)): # Reproject the built infrastructure vector to the target SRS. reprojected_structures_path = os.path.join( - intermediate_dir, 'structures_reprojected.gpkg') + intermediate_dir, 'structures_reprojected') reproject_built_infrastructure_task = task_graph.add_task( func=pygeoprocessing.reproject_vector, args=(args['built_infrastructure_vector_path'], target_sr_wkt, reprojected_structures_path), - kwargs={'driver_name': 'GPKG'}, + kwargs={'driver_name': 'ESRI Shapefile'}, target_path_list=[reprojected_structures_path], task_name='reproject built infrastructure to target SRS') @@ -512,7 +512,7 @@ def _write_summary_vector( runoff_ret_vol_stats, flood_volume_stats, damage_per_aoi_stats=None): """Write a vector with summary statistics. - This vector will always contain two fields:: + This vector will always contain three fields:: * ``'flood_vol'``: The volume of flood (runoff), in m3, per watershed. * ``'rnf_rt_idx'``: Average of runoff retention values per watershed @@ -571,34 +571,31 @@ def _write_summary_vector( target_watershed_layer.ResetReading() for target_feature in target_watershed_layer: - # Target vector is SHP, where FIDs start at 0, but stats were - # generated based on GPKG reprojection, where FIDs start at 1. - # Therefore, we need to reference stats at SHP FID + 1. - stat_key = target_feature.GetFID() + 1 + feature_id = target_feature.GetFID() - pixel_count = runoff_ret_stats[stat_key]['count'] + pixel_count = runoff_ret_stats[feature_id]['count'] if pixel_count > 0: mean_value = ( - runoff_ret_stats[stat_key]['sum'] / float(pixel_count)) + runoff_ret_stats[feature_id]['sum'] / float(pixel_count)) target_feature.SetField('rnf_rt_idx', float(mean_value)) target_feature.SetField( 'rnf_rt_m3', float( - runoff_ret_vol_stats[stat_key]['sum'])) + runoff_ret_vol_stats[feature_id]['sum'])) if damage_per_aoi_stats is not None: - pixel_count = runoff_ret_vol_stats[stat_key]['count'] + pixel_count = runoff_ret_vol_stats[feature_id]['count'] if pixel_count > 0: - damage_sum = damage_per_aoi_stats[stat_key] + damage_sum = damage_per_aoi_stats[feature_id] target_feature.SetField('aff_bld', damage_sum) # This is the service_built equation. target_feature.SetField( 'serv_blt', ( - damage_sum * runoff_ret_vol_stats[stat_key]['sum'])) + damage_sum * runoff_ret_vol_stats[feature_id]['sum'])) target_feature.SetField( - 'flood_vol', float(flood_volume_stats[stat_key]['sum'])) + 'flood_vol', float(flood_volume_stats[feature_id]['sum'])) target_watershed_layer.SetFeature(target_feature) From 2ab42a9e9f1f720b8e106bea05bea4d8be053035 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 8 Oct 2024 13:47:53 -0600 Subject: [PATCH 052/111] Update conf.py to fix RTD build --- doc/api-docs/conf.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/doc/api-docs/conf.py b/doc/api-docs/conf.py index 495e68e8b8..5594c7dbd8 100644 --- a/doc/api-docs/conf.py +++ b/doc/api-docs/conf.py @@ -78,6 +78,13 @@ # -- Options for HTML output ---------------------------------------------- import sphinx_rtd_theme + +# Tell Jinja2 templates the build is running on Read the Docs +if os.environ.get('READTHEDOCS', '') == 'True': + if 'html_context' not in globals(): + html_context = {} + html_context['READTHEDOCS'] = True + # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'sphinx_rtd_theme' @@ -130,7 +137,7 @@ # dir menu entry, description, category) texinfo_documents = [ ('index', 'InVEST', 'InVEST Documentation', - 'The Natural Capital Project', 'InVEST', + 'The Natural Capital Project', 'InVEST', 'Integrated Valuation of Ecosystem Services and Tradeoffs', 'Scientific Software'), ] @@ -138,8 +145,8 @@ # -- Prepare for sphinx build --------------------------------------------- -# Use sphinx apidoc tool to generate documentation for invest. Generated rst -# files go into the api/ directory. Note that some apidoc options may not work +# Use sphinx apidoc tool to generate documentation for invest. Generated rst +# files go into the api/ directory. Note that some apidoc options may not work # the same because we aren't using their values in the custom templates apidoc.main([ '--force', # overwrite any files from previous run @@ -164,7 +171,7 @@ All InVEST models share a consistent python API: - - Every InVEST model has a corresponding module or subpackage in the + - Every InVEST model has a corresponding module or subpackage in the ``natcap.invest`` package - The model modules contain a function called ``execute`` - The ``execute`` function takes a single argument (``args``), a dictionary From 0f45a5c42f17f02d59681d13abdb7bfcd87c19b4 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 8 Oct 2024 13:57:23 -0600 Subject: [PATCH 053/111] Remove call to deprecated get_html_theme_path --- doc/api-docs/conf.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/doc/api-docs/conf.py b/doc/api-docs/conf.py index 5594c7dbd8..3d9eeab372 100644 --- a/doc/api-docs/conf.py +++ b/doc/api-docs/conf.py @@ -89,9 +89,6 @@ # a list of builtin themes. html_theme = 'sphinx_rtd_theme' -# Add any paths that contain custom themes here, relative to this directory. -html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] - # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = "_static/invest-logo.png" From 28b9c3dbfdd9e3ff13d38b4f7fa34bb38e103888 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 8 Oct 2024 14:09:51 -0600 Subject: [PATCH 054/111] Remove recently added code to see if we truly need it --- doc/api-docs/conf.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/doc/api-docs/conf.py b/doc/api-docs/conf.py index 3d9eeab372..52205cf614 100644 --- a/doc/api-docs/conf.py +++ b/doc/api-docs/conf.py @@ -79,12 +79,6 @@ import sphinx_rtd_theme -# Tell Jinja2 templates the build is running on Read the Docs -if os.environ.get('READTHEDOCS', '') == 'True': - if 'html_context' not in globals(): - html_context = {} - html_context['READTHEDOCS'] = True - # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'sphinx_rtd_theme' From 0ff560b22cd37f398e3cf50bc89125a4d2a24f5a Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 8 Oct 2024 13:54:55 -0700 Subject: [PATCH 055/111] Removing numpy version cap that prevented numpy 2 installation. RE:#1641 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index cf2d3aeb76..d20cae2cfa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,7 +13,7 @@ GDAL>=3.4.2 Pyro4==4.77 # pip-only pandas>=1.2.1 -numpy>=1.11.0,!=1.16.0,<2.0 +numpy>=1.11.0,!=1.16.0 Rtree>=0.8.2,!=0.9.1 shapely>=2.0.0 scipy>=1.9.0,!=1.12.* From 5e7df9416ee4ccefacc1f83682ca25342e20eb56 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 8 Oct 2024 14:02:48 -0700 Subject: [PATCH 056/111] Adding note to HISTORY. RE#1641 --- HISTORY.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index 5ab3fd4117..96d7c3bee1 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -37,6 +37,9 @@ Unreleased Changes ------------------ +* General + * InVEST has been updated to build against numpy 2. + https://github.com/natcap/invest/issues/1641 * Workbench * Several small updates to the model input form UI to improve usability and visual consistency (https://github.com/natcap/invest/issues/912) From 670cb7d3709a3cee61dffe17f4f3f746cc715559 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 10 Oct 2024 15:04:19 -0700 Subject: [PATCH 057/111] Trying to lfs-checkout to the right revision. RE:#1641 --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 234e814bbf..66a657c904 100644 --- a/Makefile +++ b/Makefile @@ -199,7 +199,7 @@ $(GIT_SAMPLE_DATA_REPO_PATH): | $(DATA_DIR) git -C $(GIT_SAMPLE_DATA_REPO_PATH) lfs install git -C $(GIT_SAMPLE_DATA_REPO_PATH) checkout $(GIT_SAMPLE_DATA_REPO_REV) git -C $(GIT_SAMPLE_DATA_REPO_PATH) lfs fetch - git -C $(GIT_SAMPLE_DATA_REPO_PATH) lfs checkout + git -C $(GIT_SAMPLE_DATA_REPO_PATH) lfs checkout $(GIT_SAMPLE_DATA_REPO_REV) $(GIT_TEST_DATA_REPO_PATH): | $(DATA_DIR) -git clone $(GIT_TEST_DATA_REPO) $(GIT_TEST_DATA_REPO_PATH) @@ -207,7 +207,7 @@ $(GIT_TEST_DATA_REPO_PATH): | $(DATA_DIR) git -C $(GIT_TEST_DATA_REPO_PATH) lfs install git -C $(GIT_TEST_DATA_REPO_PATH) checkout $(GIT_TEST_DATA_REPO_REV) git -C $(GIT_TEST_DATA_REPO_PATH) lfs fetch - git -C $(GIT_TEST_DATA_REPO_PATH) lfs checkout + git -C $(GIT_TEST_DATA_REPO_PATH) lfs checkout $(GIT_TEST_DATA_REPO_REV) fetch: $(GIT_UG_REPO_PATH) $(GIT_SAMPLE_DATA_REPO_PATH) $(GIT_TEST_DATA_REPO_PATH) From 56eb76de1548ca471bd3241d985229b4e56746e6 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 10 Oct 2024 15:12:10 -0700 Subject: [PATCH 058/111] Printing the subwatersheds vector for debugging. RE:#1641 --- scripts/invest-autovalidate.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/scripts/invest-autovalidate.py b/scripts/invest-autovalidate.py index 02ba843db9..5fe221d5c9 100644 --- a/scripts/invest-autovalidate.py +++ b/scripts/invest-autovalidate.py @@ -1,14 +1,14 @@ #!python -import os -import tempfile -import logging import argparse -import unittest import glob import importlib -import shutil +import logging +import os import pprint +import shutil +import tempfile +import unittest from natcap.invest import datastack @@ -82,8 +82,13 @@ def main(sampledatadir): model_warnings = [] # define here in case of uncaught exception. try: LOGGER.info('validating %s ', datastack_path) - model_warnings = getattr( - model_module, 'validate')(paramset.args) + try: + model_warnings = getattr( + model_module, 'validate')(paramset.args) + except RuntimeError: + with open('data/invest-sample-data/Annual_Water_Yield/subwatersheds_gura.shp') as shp: + print(shp.read()) + raise except AttributeError as err: # If there was no validate function, don't crash but raise it later. model_warnings = err From 595db9551289e7e455de3ad16ee173cd7de96497 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 10 Oct 2024 15:20:19 -0700 Subject: [PATCH 059/111] Attempting to read the binary file before printing. RE:#1641 --- scripts/invest-autovalidate.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/invest-autovalidate.py b/scripts/invest-autovalidate.py index 5fe221d5c9..4dfd88fb24 100644 --- a/scripts/invest-autovalidate.py +++ b/scripts/invest-autovalidate.py @@ -86,7 +86,8 @@ def main(sampledatadir): model_warnings = getattr( model_module, 'validate')(paramset.args) except RuntimeError: - with open('data/invest-sample-data/Annual_Water_Yield/subwatersheds_gura.shp') as shp: + with open(('data/invest-sample-data/Annual_Water_Yield/' + 'subwatersheds_gura.shp'), 'rb') as shp: print(shp.read()) raise except AttributeError as err: From 3c12306ba588769fe70772ab179b1c3596323524 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 10 Oct 2024 15:39:37 -0700 Subject: [PATCH 060/111] Restoring autovalidate script to its prior state. RE:#1641 --- scripts/invest-autovalidate.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/scripts/invest-autovalidate.py b/scripts/invest-autovalidate.py index 4dfd88fb24..b2ff133bf2 100644 --- a/scripts/invest-autovalidate.py +++ b/scripts/invest-autovalidate.py @@ -82,14 +82,8 @@ def main(sampledatadir): model_warnings = [] # define here in case of uncaught exception. try: LOGGER.info('validating %s ', datastack_path) - try: - model_warnings = getattr( - model_module, 'validate')(paramset.args) - except RuntimeError: - with open(('data/invest-sample-data/Annual_Water_Yield/' - 'subwatersheds_gura.shp'), 'rb') as shp: - print(shp.read()) - raise + model_warnings = getattr( + model_module, 'validate')(paramset.args) except AttributeError as err: # If there was no validate function, don't crash but raise it later. model_warnings = err From 5d42450a15dac6ae433c3cdb87ad61fefb3cebb4 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 10 Oct 2024 15:40:10 -0700 Subject: [PATCH 061/111] Capping GDAL to less than 3.9 to see if that fixes the weird opening issues. RE:#1641 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d20cae2cfa..353cecd332 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ # scripts/convert-requirements-to-conda-yml.py as though it can only be found # on pip. -GDAL>=3.4.2 +GDAL>=3.4.2,<3.9 Pyro4==4.77 # pip-only pandas>=1.2.1 numpy>=1.11.0,!=1.16.0 From e550127f06789815dcfdf9375b78c44564a1338e Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 10 Oct 2024 16:36:31 -0700 Subject: [PATCH 062/111] Capping the gdal version as an experiment. RE:#1641 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 353cecd332..54d9633b64 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ # scripts/convert-requirements-to-conda-yml.py as though it can only be found # on pip. -GDAL>=3.4.2,<3.9 +GDAL>=3.4.2,<3.8.5 Pyro4==4.77 # pip-only pandas>=1.2.1 numpy>=1.11.0,!=1.16.0 From 632d9ba61706ec8911134a52297d5082f4da57a9 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 10 Oct 2024 16:48:53 -0700 Subject: [PATCH 063/111] Double-checking paths are as we expect them --- scripts/invest-autovalidate.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/invest-autovalidate.py b/scripts/invest-autovalidate.py index b2ff133bf2..c788e69ab4 100644 --- a/scripts/invest-autovalidate.py +++ b/scripts/invest-autovalidate.py @@ -81,7 +81,9 @@ def main(sampledatadir): model_warnings = [] # define here in case of uncaught exception. try: - LOGGER.info('validating %s ', datastack_path) + LOGGER.info('validating %s ', os.path.abspath(datastack_path)) + filepath = r"D:\a\invest\invest\data\invest-sample-data\Annual_Water_Yield\watershed_gura.shp" + print(f"File exists {filepath}: ", os.path.exists(filepath)) model_warnings = getattr( model_module, 'validate')(paramset.args) except AttributeError as err: From 82d81abce9d8436c2bcf3b944d91e972424a7a0a Mon Sep 17 00:00:00 2001 From: James Douglass Date: Thu, 10 Oct 2024 17:07:33 -0700 Subject: [PATCH 064/111] Using logging to record debug info. RE:#1641 --- scripts/invest-autovalidate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/invest-autovalidate.py b/scripts/invest-autovalidate.py index c788e69ab4..8e607e104e 100644 --- a/scripts/invest-autovalidate.py +++ b/scripts/invest-autovalidate.py @@ -83,7 +83,7 @@ def main(sampledatadir): try: LOGGER.info('validating %s ', os.path.abspath(datastack_path)) filepath = r"D:\a\invest\invest\data\invest-sample-data\Annual_Water_Yield\watershed_gura.shp" - print(f"File exists {filepath}: ", os.path.exists(filepath)) + LOGGER.info(f"File exists {filepath}: ", os.path.exists(filepath)) model_warnings = getattr( model_module, 'validate')(paramset.args) except AttributeError as err: From a9199a619f99175ac01da433c9ffdfae11f4381c Mon Sep 17 00:00:00 2001 From: James Douglass Date: Fri, 11 Oct 2024 11:19:48 -0700 Subject: [PATCH 065/111] Updating exception handling for rasters in validation. RE:#1645 --- HISTORY.rst | 5 +++++ src/natcap/invest/validation.py | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index c72a0147ea..ddcd9f5005 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -37,6 +37,11 @@ Unreleased Changes ------------------ +* General + * Updating validation to handle a change in exceptions raised by GDAL in + ``pygeoprocessing.get_raster_info`` and + ``pygeoprocessing.get_vector_info``. + https://github.com/natcap/invest/issues/1645 * Urban Nature Access * The model now works as expected when the user provides an LULC raster that does not have a nodata value defined. diff --git a/src/natcap/invest/validation.py b/src/natcap/invest/validation.py index 01d22526bf..c9c64cf085 100644 --- a/src/natcap/invest/validation.py +++ b/src/natcap/invest/validation.py @@ -799,7 +799,11 @@ def check_spatial_overlap(spatial_filepaths_list, for filepath in spatial_filepaths_list: try: info = pygeoprocessing.get_raster_info(filepath) - except ValueError: + except (ValueError, RuntimeError): + # ValueError is raised by PyGeoprocessing < 3.4.4 when the file is + # not a raster. + # RuntimeError is raised by GDAL in PyGeoprocessing >= 3.4.4 when + # the file is not a raster. info = pygeoprocessing.get_vector_info(filepath) if info['projection_wkt'] is None: From f3137f68dcf7a4c3317d8c9b6014edd6cd27ec41 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Fri, 11 Oct 2024 11:53:31 -0700 Subject: [PATCH 066/111] Adding a context manager for GDAL configuration options. RE:#1645 --- .../invest/forest_carbon_edge_effect.py | 8 +++++--- src/natcap/invest/utils.py | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/natcap/invest/forest_carbon_edge_effect.py b/src/natcap/invest/forest_carbon_edge_effect.py index bb0fb399d0..a7569250b3 100644 --- a/src/natcap/invest/forest_carbon_edge_effect.py +++ b/src/natcap/invest/forest_carbon_edge_effect.py @@ -765,9 +765,11 @@ def _build_spatial_index( local_model_dir, 'local_carbon_shape.shp') lulc_projection_wkt = pygeoprocessing.get_raster_info( base_raster_path)['projection_wkt'] - pygeoprocessing.reproject_vector( - tropical_forest_edge_carbon_model_vector_path, lulc_projection_wkt, - carbon_model_reproject_path) + + with utils._set_gdal_configuration('OGR_ENABLE_PARTIAL_REPROJECTION', 'TRUE'): + pygeoprocessing.reproject_vector( + tropical_forest_edge_carbon_model_vector_path, lulc_projection_wkt, + carbon_model_reproject_path) model_vector = gdal.OpenEx(carbon_model_reproject_path) model_layer = model_vector.GetLayer() diff --git a/src/natcap/invest/utils.py b/src/natcap/invest/utils.py index f34c25d9e5..dcae5734dd 100644 --- a/src/natcap/invest/utils.py +++ b/src/natcap/invest/utils.py @@ -121,6 +121,25 @@ def capture_gdal_logging(): gdal.PopErrorHandler() +@contextlib.contextmanager +def _set_gdal_configuration(opt, value): + """Temporarily set a GDAL configuration option. + + Args: + opt (string): The GDAL configuration option to set. + value (string): The value to set the option to. + + Returns: + ``None`` + """ + prior_value = gdal.GetConfigOption(opt) + gdal.SetConfigOption(opt, value) + try: + yield + finally: + gdal.SetConfigOption(opt, prior_value) + + def _format_time(seconds): """Render the integer number of seconds as a string. Returns a string.""" hours, remainder = divmod(seconds, 3600) From 1d9d6deba0f43f0139d3dbbd6cb273c0ffb54446 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Fri, 11 Oct 2024 11:54:00 -0700 Subject: [PATCH 067/111] Adding some debugging in SWY. RE:#1645 --- .../invest/seasonal_water_yield/seasonal_water_yield.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/natcap/invest/seasonal_water_yield/seasonal_water_yield.py b/src/natcap/invest/seasonal_water_yield/seasonal_water_yield.py index 25228b3db4..78ec0d12d6 100644 --- a/src/natcap/invest/seasonal_water_yield/seasonal_water_yield.py +++ b/src/natcap/invest/seasonal_water_yield/seasonal_water_yield.py @@ -632,6 +632,7 @@ def execute(args): # ValueError when n_workers is an empty string. # TypeError when n_workers is None. n_workers = -1 # Synchronous mode. + LOGGER.debug('n_workers: %s', n_workers) task_graph = taskgraph.TaskGraph( os.path.join(args['workspace_dir'], 'taskgraph_cache'), n_workers, reporting_interval=5) @@ -642,6 +643,9 @@ def execute(args): (_INTERMEDIATE_BASE_FILES, intermediate_output_dir)], file_suffix) LOGGER.info('Checking that the AOI is not the output aggregate vector') + LOGGER.debug("aoi_path: %s", args['aoi_path']) + LOGGER.debug("aggregate_vector_path: %s", + os.path.normpath(file_registry['aggregate_vector_path'])) if (os.path.normpath(args['aoi_path']) == os.path.normpath(file_registry['aggregate_vector_path'])): raise ValueError( From ce88ef16dc55cb32e4414b0d24d062d545606721 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Fri, 11 Oct 2024 12:07:59 -0700 Subject: [PATCH 068/111] Correcting a test filepath in SWY. RE:#1645 --- tests/test_seasonal_water_yield_regression.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_seasonal_water_yield_regression.py b/tests/test_seasonal_water_yield_regression.py index 899fc1446b..e5eafa0e98 100644 --- a/tests/test_seasonal_water_yield_regression.py +++ b/tests/test_seasonal_water_yield_regression.py @@ -495,7 +495,7 @@ def test_duplicate_aoi_assertion(self): args = { 'workspace_dir': self.workspace_dir, 'aoi_path': os.path.join( - self.workspace_dir, 'aggregated_results_foo.shp'), + self.workspace_dir, 'aggregated_results_swy_foo.shp'), 'results_suffix': 'foo', 'alpha_m': '1/12', 'beta_i': '1.0', From 2246ecd3a0c6b282d4b3c973bc4bd6c5bf7fac0b Mon Sep 17 00:00:00 2001 From: James Douglass Date: Fri, 11 Oct 2024 12:50:15 -0700 Subject: [PATCH 069/111] Noting the change to FCEE in HISTORY. RE:#1645 --- HISTORY.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index ddcd9f5005..bab7cba932 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -42,6 +42,9 @@ Unreleased Changes ``pygeoprocessing.get_raster_info`` and ``pygeoprocessing.get_vector_info``. https://github.com/natcap/invest/issues/1645 +* Forest Carbon Edge Effects + * Updating vector reprojection to allow partial reprojection. Related to + https://github.com/natcap/invest/issues/1645 * Urban Nature Access * The model now works as expected when the user provides an LULC raster that does not have a nodata value defined. From b978f36f97a5db7a8887fabb5686e5f7c8477843 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Fri, 11 Oct 2024 12:56:05 -0700 Subject: [PATCH 070/111] Fixing RST syntax. RE:#1645 --- HISTORY.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index bab7cba932..a88c1f709b 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -44,7 +44,7 @@ Unreleased Changes https://github.com/natcap/invest/issues/1645 * Forest Carbon Edge Effects * Updating vector reprojection to allow partial reprojection. Related to - https://github.com/natcap/invest/issues/1645 + https://github.com/natcap/invest/issues/1645 * Urban Nature Access * The model now works as expected when the user provides an LULC raster that does not have a nodata value defined. From f82f01d7ccfd56c00771420e99628c3572c4ea6e Mon Sep 17 00:00:00 2001 From: dcdenu4 Date: Fri, 11 Oct 2024 16:29:22 -0400 Subject: [PATCH 071/111] Restrict pygeoprocessing to see if this the issue. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index cf2d3aeb76..b60c525f7c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ numpy>=1.11.0,!=1.16.0,<2.0 Rtree>=0.8.2,!=0.9.1 shapely>=2.0.0 scipy>=1.9.0,!=1.12.* -pygeoprocessing>=2.4.2 # pip-only +pygeoprocessing>=2.4.2,<2.4.5 # pip-only taskgraph>=0.11.0 psutil>=5.6.6 chardet>=3.0.4 From 844efbd27eecf192107815bd86588e8d624d6715 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Mon, 14 Oct 2024 17:56:20 -0600 Subject: [PATCH 072/111] Output HQ rarity values to CSV (in addition to raster) --- src/natcap/invest/habitat_quality.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/natcap/invest/habitat_quality.py b/src/natcap/invest/habitat_quality.py index 301c18cfc7..91de611327 100644 --- a/src/natcap/invest/habitat_quality.py +++ b/src/natcap/invest/habitat_quality.py @@ -743,13 +743,16 @@ def execute(args): intermediate_output_dir, f'new_cover{lulc_key}{file_suffix}.tif') - rarity_path = os.path.join( + rarity_raster_path = os.path.join( output_dir, f'rarity{lulc_key}{file_suffix}.tif') + rarity_csv_path = os.path.join( + output_dir, f'rarity{lulc_key}{file_suffix}.csv') + _ = task_graph.add_task( func=_compute_rarity_operation, args=((lulc_base_path, 1), (lulc_path, 1), (new_cover_path, 1), - rarity_path), + rarity_raster_path, rarity_csv_path), dependent_task_list=[align_task], task_name=f'rarity{lulc_time}') @@ -773,7 +776,7 @@ def _calculate_habitat_quality(deg_hab_raster_list, quality_out_path, ksq): pygeoprocessing.raster_map( op=lambda degradation, habitat: ( habitat * (1 - (degradation**_SCALING_PARAM) / - (degradation**_SCALING_PARAM + ksq))), + (degradation**_SCALING_PARAM + ksq))), rasters=deg_hab_raster_list, target_path=quality_out_path) @@ -829,7 +832,8 @@ def total_degradation(*arrays): def _compute_rarity_operation( - base_lulc_path_band, lulc_path_band, new_cover_path, rarity_path): + base_lulc_path_band, lulc_path_band, new_cover_path, + rarity_raster_path, rarity_csv_path): """Calculate habitat rarity. Output rarity values will be an index from 0 - 1 where: @@ -846,7 +850,8 @@ def _compute_rarity_operation( new_cover_path (tuple): a 2 tuple for the path to intermediate raster file for trimming ``lulc_path_band`` to ``base_lulc_path_band`` of the form (path, band index). - rarity_path (string): path to output rarity raster. + rarity_raster_path (string): path to output rarity raster. + rarity_csv_path (string): path to output rarity CSV. Returns: None @@ -895,13 +900,24 @@ def _compute_rarity_operation( code_index[code] = 0.0 pygeoprocessing.reclassify_raster( - new_cover_path, code_index, rarity_path, gdal.GDT_Float32, + new_cover_path, code_index, rarity_raster_path, gdal.GDT_Float32, _OUT_NODATA) + _generate_rarity_csv(code_index, rarity_csv_path) + LOGGER.info('Finished rarity computation on' f' {os.path.basename(lulc_path_band[0])} land cover.') +def _generate_rarity_csv(rarity_dict, target_csv_path): + cols = ['LULC_code', 'rarity_value'] + with open(target_csv_path, 'w') as csvfile: + csvfile.write(str(','.join(cols) + '\n')) + for lulc_code in rarity_dict: + row = [str(lulc_code), str(rarity_dict[lulc_code])] + csvfile.write(str(','.join(row) + '\n')) + + def _raster_pixel_count(raster_path_band): """Count unique pixel values in single band raster. From 20f179ca26ba1c60729ffea040962793a5d2bbf8 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 12:24:31 -0700 Subject: [PATCH 073/111] Bumping pygeoprocessing requirement to at least 2.4.6 RE:#1645 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index cf2d3aeb76..43ce18bc31 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ numpy>=1.11.0,!=1.16.0,<2.0 Rtree>=0.8.2,!=0.9.1 shapely>=2.0.0 scipy>=1.9.0,!=1.12.* -pygeoprocessing>=2.4.2 # pip-only +pygeoprocessing>=2.4.6 # pip-only taskgraph>=0.11.0 psutil>=5.6.6 chardet>=3.0.4 From 751c751960bb1df313899f42734f63cb231369a1 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 15 Oct 2024 13:37:56 -0600 Subject: [PATCH 074/111] Sort CSV output by LULC code --- src/natcap/invest/habitat_quality.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/natcap/invest/habitat_quality.py b/src/natcap/invest/habitat_quality.py index 91de611327..61dd6dcd5c 100644 --- a/src/natcap/invest/habitat_quality.py +++ b/src/natcap/invest/habitat_quality.py @@ -910,10 +910,11 @@ def _compute_rarity_operation( def _generate_rarity_csv(rarity_dict, target_csv_path): + lulc_codes = sorted(rarity_dict) cols = ['LULC_code', 'rarity_value'] with open(target_csv_path, 'w') as csvfile: csvfile.write(str(','.join(cols) + '\n')) - for lulc_code in rarity_dict: + for lulc_code in lulc_codes: row = [str(lulc_code), str(rarity_dict[lulc_code])] csvfile.write(str(','.join(row) + '\n')) From ec61361617c7d51afc49ac3a778baea209dfc424 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 15 Oct 2024 13:50:35 -0600 Subject: [PATCH 075/111] Remove unused lines --- src/natcap/invest/habitat_quality.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/natcap/invest/habitat_quality.py b/src/natcap/invest/habitat_quality.py index 61dd6dcd5c..025effff92 100644 --- a/src/natcap/invest/habitat_quality.py +++ b/src/natcap/invest/habitat_quality.py @@ -862,7 +862,6 @@ def _compute_rarity_operation( base_lulc_path_band[0]) base_pixel_size = base_raster_info['pixel_size'] base_area = float(abs(base_pixel_size[0]) * abs(base_pixel_size[1])) - base_nodata = base_raster_info['nodata'][0] lulc_code_count_b = _raster_pixel_count(base_lulc_path_band) @@ -870,7 +869,6 @@ def _compute_rarity_operation( lulc_raster_info = pygeoprocessing.get_raster_info(lulc_path_band[0]) lulc_pixel_size = lulc_raster_info['pixel_size'] lulc_area = float(abs(lulc_pixel_size[0]) * abs(lulc_pixel_size[1])) - lulc_nodata = lulc_raster_info['nodata'][0] # Trim cover_x to the mask of base. pygeoprocessing.raster_map( From 8c1dbaaa8077dbf67b075fcf5662ed99ab9e42d6 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 15 Oct 2024 14:02:22 -0600 Subject: [PATCH 076/111] Add docstring & update HISTORY --- HISTORY.rst | 2 ++ src/natcap/invest/habitat_quality.py | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/HISTORY.rst b/HISTORY.rst index 3a8ad6d10c..7c3f98c1cc 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -57,6 +57,8 @@ Unreleased Changes * Habitat Quality * Access raster is now generated from the reprojected access vector (https://github.com/natcap/invest/issues/1615). + * Rarity values are now output in CSV format (as well as in raster format) + (https://github.com/natcap/invest/issues/721). * Urban Flood Risk * Fields present on the input AOI vector are now retained in the output. (https://github.com/natcap/invest/issues/1600) diff --git a/src/natcap/invest/habitat_quality.py b/src/natcap/invest/habitat_quality.py index 025effff92..40b0c05e6e 100644 --- a/src/natcap/invest/habitat_quality.py +++ b/src/natcap/invest/habitat_quality.py @@ -908,6 +908,16 @@ def _compute_rarity_operation( def _generate_rarity_csv(rarity_dict, target_csv_path): + """Generate CSV containing rarity values by LULC code. + + Args: + rarity_dict (dict): dictionary containing LULC codes (as keys) + and their associated rarity values (as values). + target_csv_path (string): path to output CSV. + + Returns: + None + """ lulc_codes = sorted(rarity_dict) cols = ['LULC_code', 'rarity_value'] with open(target_csv_path, 'w') as csvfile: From c28041c49c523c5829816ed6cd1e68459574d672 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 13:31:54 -0700 Subject: [PATCH 077/111] Handling numpy 2 build requirements in pyproject.toml. RE:#1641 --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index fadad29609..d91de5af85 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,8 @@ invest = "natcap.invest.cli:main" # available at runtime. requires = [ 'setuptools>=61', 'wheel', 'setuptools_scm>=8.0', 'cython>=3.0.0', 'babel', - 'oldest-supported-numpy' + 'oldest-supported-numpy; python_version<=3.8', + 'numpy>=2; python_version>3.8', # numpy 2 only available for 3.9+ ] build-backend = "setuptools.build_meta" From e7c7c1a60f5a20cd0b83241023bb89814dd060a3 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 13:34:02 -0700 Subject: [PATCH 078/111] Correcting a toml syntax issue. RE:#1641 --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d91de5af85..aec28f1257 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,8 +46,8 @@ invest = "natcap.invest.cli:main" # available at runtime. requires = [ 'setuptools>=61', 'wheel', 'setuptools_scm>=8.0', 'cython>=3.0.0', 'babel', - 'oldest-supported-numpy; python_version<=3.8', - 'numpy>=2; python_version>3.8', # numpy 2 only available for 3.9+ + 'oldest-supported-numpy; python_version<="3.8"', + 'numpy>=2; python_version>"3.8"', # numpy 2 only available for 3.9+ ] build-backend = "setuptools.build_meta" From 78e1653f1d4c5d27fb056cdd7c55db273559505c Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Tue, 15 Oct 2024 15:20:38 -0600 Subject: [PATCH 079/111] Update tests --- tests/test_habitat_quality.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/test_habitat_quality.py b/tests/test_habitat_quality.py index 0924dc76c8..ae359f7645 100644 --- a/tests/test_habitat_quality.py +++ b/tests/test_habitat_quality.py @@ -5,6 +5,7 @@ import unittest import numpy +import pandas import pygeoprocessing from osgeo import gdal from osgeo import ogr @@ -245,6 +246,14 @@ def test_habitat_quality_presence_absence_regression(self): # so we should exclude those new nodata pixel values. assert_array_sum(raster_path, assert_value, include_nodata=False) + for csv_filename in ['rarity_c_regression.csv', + 'rarity_f_regression.csv']: + csv_path = os.path.join(args['workspace_dir'], csv_filename) + rarity_table = pandas.read_csv(csv_path) + assert 'LULC_code' in rarity_table.columns + self.assertAlmostEqual(rarity_table['rarity_value'].sum(), + 0.6667, 4) + def test_habitat_quality_regression_different_projections(self): """Habitat Quality: base regression test with simplified data.""" from natcap.invest import habitat_quality @@ -2105,3 +2114,5 @@ def test_habitat_quality_validate_missing_fut_column(self): header='column', header_name='fut_path') )] self.assertEqual(validate_result, expected) + +# @TODO: ¿add rarity CSV test? From dc633024790a56263a21aee8d2540a80d72b537d Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 16:22:53 -0700 Subject: [PATCH 080/111] Bumping the UG repo rev for RST syntax. An RST error in a footnote in Wave Energy was breaking the binary builds in the main InVEST repository. This is now addressed. RE:#1641 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 66a657c904..ecd8eff096 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ GIT_TEST_DATA_REPO_REV := 324abde73e1d770ad75921466ecafd1ec6297752 GIT_UG_REPO := https://github.com/natcap/invest.users-guide GIT_UG_REPO_PATH := doc/users-guide -GIT_UG_REPO_REV := 0404bc5d4d43085cdc58f50f8fc29944b10cefb1 +GIT_UG_REPO_REV := f203ec069f9f03560c9a85b268e67ebb6b994953 ENV = "./env" ifeq ($(OS),Windows_NT) From e711300a78e597c8be48ef43b2606b3611b0ca5a Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 16:27:03 -0700 Subject: [PATCH 081/111] Adding a numpy>2 constraint for testing our builds. RE:#1641 --- constraints_tests.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/constraints_tests.txt b/constraints_tests.txt index 299273430e..9de9a0b5f2 100644 --- a/constraints_tests.txt +++ b/constraints_tests.txt @@ -13,3 +13,6 @@ GDAL<3.8.5 # root cause, let's cap the versions to those that work. # https://github.com/natcap/invest/issues/1622 #pyinstaller<6.10 + +# Test whether InVEST will build with numpy 2 +numpy>2 From f229373670a80a3b3ff59fa6cbbb77f6c7eaeb3d Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 16:31:10 -0700 Subject: [PATCH 082/111] Removing the GDAL upper bound for numpy2 compatibility. RE:#1641 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f9e3bcc39a..0ab53af935 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ # scripts/convert-requirements-to-conda-yml.py as though it can only be found # on pip. -GDAL>=3.4.2,<3.8.5 +GDAL>=3.4.2 Pyro4==4.77 # pip-only pandas>=1.2.1 numpy>=1.11.0,!=1.16.0 From 9fdb381530a4edc44b8d2addea6c17cca7cc443d Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 16:35:31 -0700 Subject: [PATCH 083/111] Removing a no-longer-needed GDAL constraint. RE:#1641 --- constraints_tests.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/constraints_tests.txt b/constraints_tests.txt index 9de9a0b5f2..4f733bdab3 100644 --- a/constraints_tests.txt +++ b/constraints_tests.txt @@ -6,9 +6,6 @@ # occur with regular use of invest. https://github.com/OSGeo/gdal/issues/8497 GDAL!=3.6.*,!=3.7.* -# https://github.com/natcap/pygeoprocessing/issues/387 -GDAL<3.8.5 - # Pyinstaller 6.10 breaks our windows builds. Until we can figure out the # root cause, let's cap the versions to those that work. # https://github.com/natcap/invest/issues/1622 From b49dea2f7afb2ccf2b4448e34873f370c3154158 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 16:41:32 -0700 Subject: [PATCH 084/111] Removing numpy>2 constraint so that environments will resolve on python 3.8. RE:#1641 --- constraints_tests.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/constraints_tests.txt b/constraints_tests.txt index 4f733bdab3..b0056a12e1 100644 --- a/constraints_tests.txt +++ b/constraints_tests.txt @@ -10,6 +10,3 @@ GDAL!=3.6.*,!=3.7.* # root cause, let's cap the versions to those that work. # https://github.com/natcap/invest/issues/1622 #pyinstaller<6.10 - -# Test whether InVEST will build with numpy 2 -numpy>2 From 206c8f06cb82c0c8e0375792ce852c2efd78ebf8 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 16:48:06 -0700 Subject: [PATCH 085/111] Converting numpy.in1d to numpy.isin for numpy2 compatibility. RE:#1641 --- src/natcap/invest/scenario_gen_proximity.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/natcap/invest/scenario_gen_proximity.py b/src/natcap/invest/scenario_gen_proximity.py index bb62ce8fae..5f23f95269 100644 --- a/src/natcap/invest/scenario_gen_proximity.py +++ b/src/natcap/invest/scenario_gen_proximity.py @@ -490,7 +490,7 @@ def _convert_landscape( def _mask_base_op(lulc_array): """Create a mask of valid non-base pixels only.""" - base_mask = numpy.in1d( + base_mask = numpy.isin( lulc_array.flatten(), focal_landcover_codes).reshape( lulc_array.shape) if invert_mask: @@ -535,7 +535,7 @@ def _combine_masks(base_distance_array, non_base_distance_array): # turn inside and outside masks into a single mask def _mask_to_convertible_codes(distance_from_base_edge, lulc): """Mask out the distance transform to a set of lucodes.""" - convertible_mask = numpy.in1d( + convertible_mask = numpy.isin( lulc.flatten(), convertible_type_list).reshape(lulc.shape) return numpy.where( convertible_mask, distance_from_base_edge, From a43131a9acd7eccd7b150dbe88bd587c436cc451 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 17:04:29 -0700 Subject: [PATCH 086/111] Updating UFRM for numpy2 compatibility. RE:#1641 --- src/natcap/invest/urban_flood_risk_mitigation.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/natcap/invest/urban_flood_risk_mitigation.py b/src/natcap/invest/urban_flood_risk_mitigation.py index a6dbfa5690..63ec19298e 100644 --- a/src/natcap/invest/urban_flood_risk_mitigation.py +++ b/src/natcap/invest/urban_flood_risk_mitigation.py @@ -591,7 +591,7 @@ def _write_summary_vector( # This is the service_built equation. target_feature.SetField( - 'serv_blt', ( + 'serv_blt', float( damage_sum * runoff_ret_vol_stats[feature_id]['sum'])) target_feature.SetField( @@ -936,7 +936,8 @@ def validate(args, limit_to=None): nan_mask = cn_df.isna() if nan_mask.any(axis=None): nan_lucodes = nan_mask[nan_mask.any(axis=1)].index - lucode_list = list(nan_lucodes.values) + # Convert numpy dtype values to native python types + lucode_list = [i.item() for i in nan_lucodes.values] validation_warnings.append(( ['curve_number_table_path'], f'Missing curve numbers for lucode(s) {lucode_list}')) From 98904f3dd463520886e620341452f81a722e323f Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 17:15:31 -0700 Subject: [PATCH 087/111] Updating UCM tests for numerical outputs. The numpy2 update was producing slightly different numerical outputs, but also we weren't asserting that they were numerically close, just that they had the same number of digits after the decimal ... which wasn't working well because most of these values were large. RE:#1641 --- src/natcap/invest/urban_cooling_model.py | 6 ++-- tests/test_ucm.py | 38 ++++++++++-------------- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/src/natcap/invest/urban_cooling_model.py b/src/natcap/invest/urban_cooling_model.py index eea80d8a12..ed3084016e 100644 --- a/src/natcap/invest/urban_cooling_model.py +++ b/src/natcap/invest/urban_cooling_model.py @@ -963,13 +963,13 @@ def calculate_uhi_result_vector( if cc_stats[feature_id]['count'] > 0: mean_cc = ( cc_stats[feature_id]['sum'] / cc_stats[feature_id]['count']) - feature.SetField('avg_cc', mean_cc) + feature.SetField('avg_cc', float(mean_cc)) mean_t_air = None if t_air_stats[feature_id]['count'] > 0: mean_t_air = ( t_air_stats[feature_id]['sum'] / t_air_stats[feature_id]['count']) - feature.SetField('avg_tmp_v', mean_t_air) + feature.SetField('avg_tmp_v', float(mean_t_air)) if mean_t_air: feature.SetField( @@ -979,7 +979,7 @@ def calculate_uhi_result_vector( wbgt = ( wbgt_stats[feature_id]['sum'] / wbgt_stats[feature_id]['count']) - feature.SetField('avg_wbgt_v', wbgt) + feature.SetField('avg_wbgt_v', float(wbgt)) if light_loss_stats and light_loss_stats[feature_id]['count'] > 0: light_loss = ( diff --git a/tests/test_ucm.py b/tests/test_ucm.py index 1696cd4e58..ea6ef583b7 100644 --- a/tests/test_ucm.py +++ b/tests/test_ucm.py @@ -1,12 +1,12 @@ """InVEST Urban Heat Island Mitigation model tests.""" -import unittest -import tempfile -import shutil import os +import shutil +import tempfile +import unittest import numpy -from osgeo import gdal import pandas +from osgeo import gdal REGRESSION_DATA = os.path.join( os.path.dirname(__file__), '..', 'data', 'invest-test-data', 'ucm') @@ -79,11 +79,9 @@ def test_ucm_regression_factors(self): for key, expected_value in expected_results.items(): actual_value = float(results_feature.GetField(key)) # These accumulated values (esp. avd_eng_cn) are accumulated - # and may differ past about 4 decimal places. - self.assertAlmostEqual( - actual_value, expected_value, places=4, - msg='%s should be close to %f, actual: %f' % ( - key, expected_value, actual_value)) + # and may differ slightly from expected regression values. + numpy.testing.assert_allclose(actual_value, expected_value, + rtol=1e-4) finally: results_layer = None results_vector = None @@ -110,10 +108,7 @@ def test_ucm_regression_factors(self): # Expected energy savings is an accumulated value and may differ # past about 4 decimal places. - self.assertAlmostEqual( - energy_sav, expected_energy_sav, places=4, msg=( - '%f should be close to %f' % ( - energy_sav, expected_energy_sav))) + numpy.testing.assert_allclose(energy_sav, expected_energy_sav, rtol=1e-4) self.assertEqual(n_nonetype, 119) finally: buildings_layer = None @@ -151,10 +146,8 @@ def test_ucm_regression_factors(self): # These accumulated values are accumulated # and may differ past about 4 decimal places. - self.assertAlmostEqual( - energy_sav, expected_energy_sav, places=4, msg=( - '%f should be close to %f' % ( - energy_sav, expected_energy_sav))) + numpy.testing.assert_allclose(energy_sav, expected_energy_sav, + rtol=1e-4) self.assertEqual(n_nonetype, 119) finally: buildings_layer = None @@ -215,11 +208,9 @@ def test_ucm_regression_intensity(self): for key, expected_value in expected_results.items(): actual_value = float(results_feature.GetField(key)) # These accumulated values (esp. avd_eng_cn) are accumulated - # and may differ past about 4 decimal places. - self.assertAlmostEqual( - actual_value, expected_value, places=4, - msg='%s should be close to %f, actual: %f' % ( - key, expected_value, actual_value)) + # and may differ slightly. + numpy.testing.assert_allclose(actual_value, expected_value, + rtol=1e-4) finally: results_layer = None results_vector = None @@ -335,7 +326,8 @@ def test_missing_lulc_value_in_table(self): def test_bad_args(self): """UCM: test validation of bad arguments.""" - from natcap.invest import urban_cooling_model, validation + from natcap.invest import urban_cooling_model + from natcap.invest import validation args = { 'workspace_dir': self.workspace_dir, 'results_suffix': 'test_suffix', From 8f13be5764b60d1098e1b820ab9cde9dc841516d Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 17:18:43 -0700 Subject: [PATCH 088/111] Fixing an exception related to numpy types. This is part of the numpy2 migration. RE:#1641 --- src/natcap/invest/seasonal_water_yield/seasonal_water_yield.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/natcap/invest/seasonal_water_yield/seasonal_water_yield.py b/src/natcap/invest/seasonal_water_yield/seasonal_water_yield.py index 78ec0d12d6..728859a2d7 100644 --- a/src/natcap/invest/seasonal_water_yield/seasonal_water_yield.py +++ b/src/natcap/invest/seasonal_water_yield/seasonal_water_yield.py @@ -1238,7 +1238,7 @@ def cn_op(lulc_array, soil_group_array): # if lulc_array value not in lulc_to_soil[soil_group_id]['lulc_values'] # then numpy.digitize will not bin properly and cause an IndexError # during the reshaping call - lulc_unique = set(numpy.unique(lulc_array)) + lulc_unique = set(i.item() for i in numpy.unique(lulc_array)) if not lulc_unique.issubset(lucodes_set): # cast to list to conform with similar error messages in InVEST missing_lulc_values = sorted(lulc_unique.difference(lucodes_set)) From 41fcb647a3e2a775a0aec1db1d4348c8a4d46109 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 17:24:40 -0700 Subject: [PATCH 089/111] Converting numpy types to python types for numpy2. RE:#1641 --- src/natcap/invest/recreation/recmodel_client.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/natcap/invest/recreation/recmodel_client.py b/src/natcap/invest/recreation/recmodel_client.py index c695eef54a..5250eabbe9 100644 --- a/src/natcap/invest/recreation/recmodel_client.py +++ b/src/natcap/invest/recreation/recmodel_client.py @@ -1029,10 +1029,12 @@ def _raster_sum_mean( numpy.array(fid_raster_values['sum']) / numpy.array(fid_raster_values['count'])) predictor_results = dict( - zip(fid_raster_values['fid'], mean_results)) + zip(fid_raster_values['fid'], + (i.item() for i in mean_results))) else: predictor_results = dict( - zip(fid_raster_values['fid'], fid_raster_values['sum'])) + zip(fid_raster_values['fid'], + (i.item() for i in fid_raster_values['sum']))) with open(predictor_target_path, 'w') as jsonfile: json.dump(predictor_results, jsonfile) From b250662ce6a69b18f4dbe8d0a12eba965f54cce8 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 17:27:00 -0700 Subject: [PATCH 090/111] Converting types for numpy2 migration. RE:#1641 --- src/natcap/invest/pollination.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/natcap/invest/pollination.py b/src/natcap/invest/pollination.py index 60def5ec3e..e6b6895592 100644 --- a/src/natcap/invest/pollination.py +++ b/src/natcap/invest/pollination.py @@ -1036,28 +1036,28 @@ def execute(args): # this is YT from the user's guide (y_tot) farm_feature.SetField( _TOTAL_FARM_YIELD_FIELD_ID, - 1 - nu * ( + float(1 - nu * ( 1 - total_farm_results[fid]['sum'] / - float(total_farm_results[fid]['count']))) + float(total_farm_results[fid]['count'])))) # this is PYW ('pdep_y_w') farm_feature.SetField( _POLLINATOR_PROPORTION_FARM_YIELD_FIELD_ID, - (wild_pollinator_yield_aggregate[fid]['sum'] / + float(wild_pollinator_yield_aggregate[fid]['sum'] / float(wild_pollinator_yield_aggregate[fid]['count']))) # this is YW ('y_wild') farm_feature.SetField( _WILD_POLLINATOR_FARM_YIELD_FIELD_ID, - nu * (wild_pollinator_yield_aggregate[fid]['sum'] / - float(wild_pollinator_yield_aggregate[fid]['count']))) + float(nu * (wild_pollinator_yield_aggregate[fid]['sum'] / + float(wild_pollinator_yield_aggregate[fid]['count'])))) # this is PAT ('p_abund') farm_season = farm_feature.GetField(_FARM_SEASON_FIELD) farm_feature.SetField( _POLLINATOR_ABUNDANCE_FARM_FIELD_ID, - pollinator_abundance_results[farm_season][fid]['sum'] / - float(pollinator_abundance_results[farm_season][fid]['count'])) + float(pollinator_abundance_results[farm_season][fid]['sum'] / + float(pollinator_abundance_results[farm_season][fid]['count']))) target_farm_layer.SetFeature(farm_feature) target_farm_layer.SyncToDisk() From ab90c460cd05a18561db70f0d4c8b15d1ed3ebfe Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 17:28:55 -0700 Subject: [PATCH 091/111] Updating FCEE for numpy2 compatibility. RE:#1641 --- src/natcap/invest/forest_carbon_edge_effect.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/natcap/invest/forest_carbon_edge_effect.py b/src/natcap/invest/forest_carbon_edge_effect.py index a7569250b3..aa7a394ab8 100644 --- a/src/natcap/invest/forest_carbon_edge_effect.py +++ b/src/natcap/invest/forest_carbon_edge_effect.py @@ -583,13 +583,14 @@ def _aggregate_carbon_map( for poly_feat in target_aggregate_layer: poly_fid = poly_feat.GetFID() poly_feat.SetField( - 'c_sum', serviceshed_stats[poly_fid]['sum']) + 'c_sum', float(serviceshed_stats[poly_fid]['sum'])) # calculates mean pixel value per ha in for each feature in AOI poly_geom = poly_feat.GetGeometryRef() poly_area_ha = poly_geom.GetArea() / 1e4 # converts m^2 to hectare poly_geom = None poly_feat.SetField( - 'c_ha_mean', serviceshed_stats[poly_fid]['sum']/poly_area_ha) + 'c_ha_mean', + float(serviceshed_stats[poly_fid]['sum'] / poly_area_ha)) target_aggregate_layer.SetFeature(poly_feat) target_aggregate_layer.CommitTransaction() From 63fb8883da9ebf44520d78ae1c019f0de3208a3b Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 17:31:58 -0700 Subject: [PATCH 092/111] Using assert_allclose for better numerical comparisons. RE:#1641 --- tests/test_urban_nature_access.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_urban_nature_access.py b/tests/test_urban_nature_access.py index 4e5141f0b6..a3d3d7b43c 100644 --- a/tests/test_urban_nature_access.py +++ b/tests/test_urban_nature_access.py @@ -412,7 +412,7 @@ def test_split_urban_nature(self): ) for fieldname, expected_value in expected_values.items(): numpy.testing.assert_allclose( - admin_feature.GetField(fieldname), expected_value) + admin_feature.GetField(fieldname), expected_value, rtol=1e-6) # The sum of the under-and-oversupplied populations should be equal # to the total population count. @@ -603,8 +603,8 @@ def test_radii_by_pop_group(self): set(defn.GetName() for defn in summary_layer.schema), set(expected_field_values.keys())) for fieldname, expected_value in expected_field_values.items(): - self.assertAlmostEqual( - expected_value, summary_feature.GetField(fieldname)) + numpy.testing.assert_allclose( + expected_value, summary_feature.GetField(fieldname), rtol=1e-6) output_dir = os.path.join(args['workspace_dir'], 'output') self._assert_urban_nature(os.path.join( @@ -679,8 +679,8 @@ def test_radii_by_pop_group_exponential_kernal(self): set(defn.GetName() for defn in summary_layer.schema), set(expected_field_values.keys())) for fieldname, expected_value in expected_field_values.items(): - self.assertAlmostEqual( - expected_value, summary_feature.GetField(fieldname)) + numpy.testing.assert_allclose( + expected_value, summary_feature.GetField(fieldname), rtol=1e-6) output_dir = os.path.join(args['workspace_dir'], 'output') self._assert_urban_nature(os.path.join( From 292c3e2d0fa3a54bcd4e6be5b510125a6a6a1064 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Tue, 15 Oct 2024 18:45:08 -0700 Subject: [PATCH 093/111] Cleaning up misc. code from debugging. RE:#1641 --- scripts/invest-autovalidate.py | 2 -- src/natcap/invest/urban_nature_access.py | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/invest-autovalidate.py b/scripts/invest-autovalidate.py index 8e607e104e..d4a1a1a1de 100644 --- a/scripts/invest-autovalidate.py +++ b/scripts/invest-autovalidate.py @@ -82,8 +82,6 @@ def main(sampledatadir): model_warnings = [] # define here in case of uncaught exception. try: LOGGER.info('validating %s ', os.path.abspath(datastack_path)) - filepath = r"D:\a\invest\invest\data\invest-sample-data\Annual_Water_Yield\watershed_gura.shp" - LOGGER.info(f"File exists {filepath}: ", os.path.exists(filepath)) model_warnings = getattr( model_module, 'validate')(paramset.args) except AttributeError as err: diff --git a/src/natcap/invest/urban_nature_access.py b/src/natcap/invest/urban_nature_access.py index 4c8261cc5e..136575a956 100644 --- a/src/natcap/invest/urban_nature_access.py +++ b/src/natcap/invest/urban_nature_access.py @@ -2548,6 +2548,7 @@ def _warp_lulc(source_lulc_path, target_lulc_path, target_pixel_size, 'near', target_bb=target_bounding_box, target_projection_wkt=source_raster_info['projection_wkt']) + # if there is no defined nodata, set a default value if target_nodata is None: # Guarantee that our nodata cannot be represented by the datatype - # select a nodata value that's out of range. From 89d236b1f97542e418014b4dd163fea5e8c323ba Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 16 Oct 2024 09:10:16 -0700 Subject: [PATCH 094/111] Removing code left over from debugging. RE:#1641 --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index ecd8eff096..f225958acd 100644 --- a/Makefile +++ b/Makefile @@ -199,7 +199,7 @@ $(GIT_SAMPLE_DATA_REPO_PATH): | $(DATA_DIR) git -C $(GIT_SAMPLE_DATA_REPO_PATH) lfs install git -C $(GIT_SAMPLE_DATA_REPO_PATH) checkout $(GIT_SAMPLE_DATA_REPO_REV) git -C $(GIT_SAMPLE_DATA_REPO_PATH) lfs fetch - git -C $(GIT_SAMPLE_DATA_REPO_PATH) lfs checkout $(GIT_SAMPLE_DATA_REPO_REV) + git -C $(GIT_SAMPLE_DATA_REPO_PATH) lfs checkout $(GIT_TEST_DATA_REPO_PATH): | $(DATA_DIR) -git clone $(GIT_TEST_DATA_REPO) $(GIT_TEST_DATA_REPO_PATH) @@ -207,7 +207,7 @@ $(GIT_TEST_DATA_REPO_PATH): | $(DATA_DIR) git -C $(GIT_TEST_DATA_REPO_PATH) lfs install git -C $(GIT_TEST_DATA_REPO_PATH) checkout $(GIT_TEST_DATA_REPO_REV) git -C $(GIT_TEST_DATA_REPO_PATH) lfs fetch - git -C $(GIT_TEST_DATA_REPO_PATH) lfs checkout $(GIT_TEST_DATA_REPO_REV) + git -C $(GIT_TEST_DATA_REPO_PATH) lfs checkout fetch: $(GIT_UG_REPO_PATH) $(GIT_SAMPLE_DATA_REPO_PATH) $(GIT_TEST_DATA_REPO_PATH) From 75107e75a7dbdedfc9731197e5fe020777499755 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 16 Oct 2024 09:11:27 -0700 Subject: [PATCH 095/111] Clarifying intent in pyproject.toml RE:#1641 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index aec28f1257..b16e94eead 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,7 +47,7 @@ invest = "natcap.invest.cli:main" requires = [ 'setuptools>=61', 'wheel', 'setuptools_scm>=8.0', 'cython>=3.0.0', 'babel', 'oldest-supported-numpy; python_version<="3.8"', - 'numpy>=2; python_version>"3.8"', # numpy 2 only available for 3.9+ + 'numpy>=2; python_version>="3.9"', # numpy 2 only available for 3.9+ ] build-backend = "setuptools.build_meta" From c163f48ae3a2d2c1178283ed7449133f72cf654b Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Wed, 16 Oct 2024 11:50:36 -0600 Subject: [PATCH 096/111] Update HQ model spec --- src/natcap/invest/habitat_quality.py | 76 +++++++++++++++++++++++++--- 1 file changed, 68 insertions(+), 8 deletions(-) diff --git a/src/natcap/invest/habitat_quality.py b/src/natcap/invest/habitat_quality.py index 40b0c05e6e..d2a244fad4 100644 --- a/src/natcap/invest/habitat_quality.py +++ b/src/natcap/invest/habitat_quality.py @@ -213,36 +213,36 @@ "output": { "type": "directory", "contents": { - "deg_sum_out_c.tif": { + "deg_sum_c.tif": { "about": ( "Relative level of habitat degradation on the current " "landscape."), "bands": {1: {"type": "ratio"}} }, - "deg_sum_out_f.tif": { + "deg_sum_f.tif": { "about": ( "Relative level of habitat degradation on the future " "landscape."), "bands": {1: {"type": "ratio"}}, "created_if": "lulc_fut_path" }, - "quality_out_c.tif": { + "quality_c.tif": { "about": ( "Relative level of habitat quality on the current " "landscape."), "bands": {1: {"type": "ratio"}} }, - "quality_out_f.tif": { + "quality_f.tif": { "about": ( "Relative level of habitat quality on the future " "landscape."), "bands": {1: {"type": "ratio"}}, "created_if": "lulc_fut_path" }, - "rarity_out_c.tif": { + "rarity_c.tif": { "about": ( "Relative habitat rarity on the current landscape " - "vis-a-vis the baseline map. The grid cell’s values " + "vis-a-vis the baseline map. The grid cell's values " "are defined between a range of 0 and 1 where 0.5 " "indicates no abundance change between the baseline " "and current or projected map. Values between 0 and 0.5 " @@ -258,10 +258,10 @@ "created_if": "lulc_bas_path", "bands": {1: {"type": "ratio"}} }, - "rarity_out_f.tif": { + "rarity_f.tif": { "about": ( "Relative habitat rarity on the future landscape " - "vis-a-vis the baseline map. The grid cell’s values " + "vis-a-vis the baseline map. The grid cell's values " "are defined between a range of 0 and 1 where 0.5 " "indicates no abundance change between the baseline " "and current or projected map. Values between 0 and " @@ -278,6 +278,66 @@ "created_if": "lulc_bas_path and lulc_fut_path", "bands": {1: {"type": "ratio"}} }, + "rarity_c.csv": { + "about": ("Table of rarity values by LULC code for the " + "current landscape"), + "index_col": "LULC_code", + "columns": { + "LULC_code": { + "type": "number", + "about": "LULC class" + }, + "rarity_value": { + "type": "number", + "about": ( + "Relative habitat rarity on the current landscape " + "vis-a-vis the baseline map. The rarity values " + "are defined between a range of 0 and 1 where 0.5 " + "indicates no abundance change between the baseline " + "and current or projected map. Values between 0 and 0.5 " + "indicate a habitat is more abundant and the closer " + "the value is to 0 the lesser the likelihood that the " + "preservation of that habitat type on the current or " + "future landscape is important to biodiversity conservation. " + "Values between 0.5 and 1 indicate a habitat is less " + "abundant and the closer the value is to 1 the greater " + "the likelihood that the preservation of that habitat " + "type on the current or future landscape is important " + "to biodiversity conservation."), + }, + }, + "created_if": "lulc_bas_path", + }, + "rarity_f.csv": { + "about": ("Table of rarity values by LULC code for the " + "future landscape"), + "index_col": "LULC_code", + "columns": { + "LULC_code": { + "type": "number", + "about": "LULC class" + }, + "rarity_value": { + "type": "number", + "about": ( + "Relative habitat rarity on the future landscape " + "vis-a-vis the baseline map. The rarity values " + "are defined between a range of 0 and 1 where 0.5 " + "indicates no abundance change between the baseline " + "and current or projected map. Values between 0 and 0.5 " + "indicate a habitat is more abundant and the closer " + "the value is to 0 the lesser the likelihood that the " + "preservation of that habitat type on the current or " + "future landscape is important to biodiversity conservation. " + "Values between 0.5 and 1 indicate a habitat is less " + "abundant and the closer the value is to 1 the greater " + "the likelihood that the preservation of that habitat " + "type on the current or future landscape is important " + "to biodiversity conservation."), + }, + }, + "created_if": "lulc_bas_path and lulc_fut_path", + }, } }, "intermediate": { From 30db861f617959afb509fd6c95e435cd64e6fe84 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Wed, 16 Oct 2024 12:23:37 -0600 Subject: [PATCH 097/111] Update HQ model spec with units --- src/natcap/invest/habitat_quality.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/natcap/invest/habitat_quality.py b/src/natcap/invest/habitat_quality.py index d2a244fad4..7b9c66df97 100644 --- a/src/natcap/invest/habitat_quality.py +++ b/src/natcap/invest/habitat_quality.py @@ -289,6 +289,7 @@ }, "rarity_value": { "type": "number", + "units": u.none, "about": ( "Relative habitat rarity on the current landscape " "vis-a-vis the baseline map. The rarity values " @@ -319,6 +320,7 @@ }, "rarity_value": { "type": "number", + "units": u.none, "about": ( "Relative habitat rarity on the future landscape " "vis-a-vis the baseline map. The rarity values " From ca46378cdb2bdbe218b7fb79e1c4fd8a8318d570 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Wed, 16 Oct 2024 12:32:04 -0600 Subject: [PATCH 098/111] Update HQ model spec with more units --- src/natcap/invest/habitat_quality.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/natcap/invest/habitat_quality.py b/src/natcap/invest/habitat_quality.py index 7b9c66df97..7435a96d51 100644 --- a/src/natcap/invest/habitat_quality.py +++ b/src/natcap/invest/habitat_quality.py @@ -285,7 +285,8 @@ "columns": { "LULC_code": { "type": "number", - "about": "LULC class" + "units": u.none, + "about": "LULC class", }, "rarity_value": { "type": "number", @@ -316,7 +317,8 @@ "columns": { "LULC_code": { "type": "number", - "about": "LULC class" + "units": u.none, + "about": "LULC class", }, "rarity_value": { "type": "number", From 926c1ae388b60586fdb98038668dae1224afbd8a Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Wed, 16 Oct 2024 16:15:39 -0600 Subject: [PATCH 099/111] Update ug revision to match what's on main --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 234e814bbf..f225958acd 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ GIT_TEST_DATA_REPO_REV := 324abde73e1d770ad75921466ecafd1ec6297752 GIT_UG_REPO := https://github.com/natcap/invest.users-guide GIT_UG_REPO_PATH := doc/users-guide -GIT_UG_REPO_REV := 0404bc5d4d43085cdc58f50f8fc29944b10cefb1 +GIT_UG_REPO_REV := f203ec069f9f03560c9a85b268e67ebb6b994953 ENV = "./env" ifeq ($(OS),Windows_NT) From e809edd4140f4c712ba7f9b2df97973bec2db60b Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Fri, 18 Oct 2024 09:14:14 -0600 Subject: [PATCH 100/111] Update column name, comments, docstring --- src/natcap/invest/habitat_quality.py | 16 ++++++++-------- tests/test_habitat_quality.py | 2 -- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/natcap/invest/habitat_quality.py b/src/natcap/invest/habitat_quality.py index 7435a96d51..a2b2f4a76d 100644 --- a/src/natcap/invest/habitat_quality.py +++ b/src/natcap/invest/habitat_quality.py @@ -280,10 +280,10 @@ }, "rarity_c.csv": { "about": ("Table of rarity values by LULC code for the " - "current landscape"), - "index_col": "LULC_code", + "current landscape."), + "index_col": "lulc_code", "columns": { - "LULC_code": { + "lulc_code": { "type": "number", "units": u.none, "about": "LULC class", @@ -312,10 +312,10 @@ }, "rarity_f.csv": { "about": ("Table of rarity values by LULC code for the " - "future landscape"), - "index_col": "LULC_code", + "future landscape."), + "index_col": "lulc_code", "columns": { - "LULC_code": { + "lulc_code": { "type": "number", "units": u.none, "about": "LULC class", @@ -898,7 +898,7 @@ def total_degradation(*arrays): def _compute_rarity_operation( base_lulc_path_band, lulc_path_band, new_cover_path, rarity_raster_path, rarity_csv_path): - """Calculate habitat rarity. + """Calculate habitat rarity and generate raster and CSV output. Output rarity values will be an index from 0 - 1 where: pixel > 0.5 - more rare @@ -983,7 +983,7 @@ def _generate_rarity_csv(rarity_dict, target_csv_path): None """ lulc_codes = sorted(rarity_dict) - cols = ['LULC_code', 'rarity_value'] + cols = ['lulc_code', 'rarity_value'] with open(target_csv_path, 'w') as csvfile: csvfile.write(str(','.join(cols) + '\n')) for lulc_code in lulc_codes: diff --git a/tests/test_habitat_quality.py b/tests/test_habitat_quality.py index ae359f7645..e6312e6985 100644 --- a/tests/test_habitat_quality.py +++ b/tests/test_habitat_quality.py @@ -2114,5 +2114,3 @@ def test_habitat_quality_validate_missing_fut_column(self): header='column', header_name='fut_path') )] self.assertEqual(validate_result, expected) - -# @TODO: ¿add rarity CSV test? From 93eddac6819043bcd2ada2bf0f6b948b33ac1c8d Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Fri, 18 Oct 2024 09:29:55 -0600 Subject: [PATCH 101/111] Use csv.writer to generate CSV output --- src/natcap/invest/habitat_quality.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/natcap/invest/habitat_quality.py b/src/natcap/invest/habitat_quality.py index a2b2f4a76d..c167bca01f 100644 --- a/src/natcap/invest/habitat_quality.py +++ b/src/natcap/invest/habitat_quality.py @@ -1,6 +1,7 @@ # coding=UTF-8 """InVEST Habitat Quality model.""" import collections +import csv import logging import os @@ -983,12 +984,11 @@ def _generate_rarity_csv(rarity_dict, target_csv_path): None """ lulc_codes = sorted(rarity_dict) - cols = ['lulc_code', 'rarity_value'] - with open(target_csv_path, 'w') as csvfile: - csvfile.write(str(','.join(cols) + '\n')) + with open(target_csv_path, 'w', newline='') as csvfile: + writer = csv.writer(csvfile, delimiter=',') + writer.writerow(['lulc_code', 'rarity_value']) for lulc_code in lulc_codes: - row = [str(lulc_code), str(rarity_dict[lulc_code])] - csvfile.write(str(','.join(row) + '\n')) + writer.writerow([lulc_code, rarity_dict[lulc_code]]) def _raster_pixel_count(raster_path_band): From c56523b909be4454a74fb0e2a4ccaea29c75c184 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Fri, 18 Oct 2024 10:35:15 -0600 Subject: [PATCH 102/111] Update HQ rarity CSV test --- tests/test_habitat_quality.py | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/tests/test_habitat_quality.py b/tests/test_habitat_quality.py index e6312e6985..2359cfeef1 100644 --- a/tests/test_habitat_quality.py +++ b/tests/test_habitat_quality.py @@ -1,11 +1,11 @@ """Module for Regression Testing the InVEST Habitat Quality model.""" +import csv import os import shutil import tempfile import unittest import numpy -import pandas import pygeoprocessing from osgeo import gdal from osgeo import ogr @@ -246,13 +246,32 @@ def test_habitat_quality_presence_absence_regression(self): # so we should exclude those new nodata pixel values. assert_array_sum(raster_path, assert_value, include_nodata=False) - for csv_filename in ['rarity_c_regression.csv', - 'rarity_f_regression.csv']: + # Based on the scenarios used to generate the rasters above, + # rarity values are calculated as follows: + # For LULC 1, rarity = 1.0 - (5000 / (10000 + 5000)) = 0.6667. + # For LULC 2 and 3, rarity = 0.0 because they are not in the baseline. + expected_csv_values = { + 'rarity_c_regression.csv': [ + (1, 0.6667, 4), + (2, 0.0, 0), + ], + 'rarity_f_regression.csv': [ + (1, 0.6667, 4), + (3, 0.0, 0), + ], + } + for csv_filename in expected_csv_values.keys(): csv_path = os.path.join(args['workspace_dir'], csv_filename) - rarity_table = pandas.read_csv(csv_path) - assert 'LULC_code' in rarity_table.columns - self.assertAlmostEqual(rarity_table['rarity_value'].sum(), - 0.6667, 4) + with open(csv_path, newline='') as csvfile: + reader = csv.DictReader(csvfile, delimiter=',') + self.assertEqual(reader.fieldnames, + ['lulc_code', 'rarity_value']) + for (exp_lulc, exp_rarity, + places_to_round) in expected_csv_values[csv_filename]: + row = next(reader) + self.assertEqual(int(row['lulc_code']), exp_lulc) + self.assertAlmostEqual(float(row['rarity_value']), + exp_rarity, places_to_round) def test_habitat_quality_regression_different_projections(self): """Habitat Quality: base regression test with simplified data.""" @@ -1056,7 +1075,6 @@ def test_habitat_quality_case_insensitivty(self): habitat_quality.execute(args) # Reasonable to just check quality out in this case - #assert_array_sum( assert_array_sum( os.path.join(args['workspace_dir'], 'quality_c.tif'), 5852.088) From e1698aba6e06bd2e8bc0c93351d5ff631c494206 Mon Sep 17 00:00:00 2001 From: davemfish Date: Tue, 22 Oct 2024 08:50:23 -0400 Subject: [PATCH 103/111] move a test to be near other related tests. #1657 --- tests/test_coastal_vulnerability.py | 84 ++++++++++++++--------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/tests/test_coastal_vulnerability.py b/tests/test_coastal_vulnerability.py index 0b3be853a2..7cfcd9cb13 100644 --- a/tests/test_coastal_vulnerability.py +++ b/tests/test_coastal_vulnerability.py @@ -1358,6 +1358,48 @@ def test_aoi_invalid_geometry(self): aoi_path, landmass_path, model_resolution, target_vector_path, polygon_pickle, lines_pickle, lines_rtree) + def test_prepare_landmass_invalid_geometry(self): + """CV: test handling invalid geometries in landmass vector.""" + from natcap.invest import coastal_vulnerability + aoi_path = os.path.join(self.workspace_dir, 'aoi.geojson') + srs = osr.SpatialReference() + srs.ImportFromEPSG(26910) # UTM Zone 10N + wkt = srs.ExportToWkt() + + aoi_geometries = [Polygon([ + (-200, -200), (200, -200), (200, 200), (-200, 200), (-200, -200)])] + pygeoprocessing.shapely_geometry_to_vector( + aoi_geometries, aoi_path, wkt, 'GeoJSON') + + landmass_vector_path = os.path.join(self.workspace_dir, 'vector.gpkg') + n_features = make_vector_of_invalid_geoms(landmass_vector_path) + + target_polygon_pickle_path = os.path.join( + self.workspace_dir, 'polygon.pickle') + target_lines_pickle_path = os.path.join( + self.workspace_dir, 'lines.pickle') + target_rtree_path = os.path.join(self.workspace_dir, 'rtree.dat') + # Create rtree files to exercise the function's logic of removing + # pre-exisiting files + target_rtree_path_base = os.path.splitext(target_rtree_path)[0] + open(target_rtree_path, 'a').close() + open(target_rtree_path_base + '.idx', 'a').close() + + model_resolution = 100 + target_vector_path = os.path.join( + self.workspace_dir, 'temp-shore-pts.gpkg') + coastal_vulnerability.prepare_landmass_line_index_and_interpolate_shore_points( + aoi_path, landmass_vector_path, model_resolution, + target_vector_path, target_polygon_pickle_path, + target_lines_pickle_path, target_rtree_path) + + with open(target_polygon_pickle_path, 'rb') as polygon_file: + shapely_geom = pickle.load(polygon_file) + + # Expect 1 input geometry to be skipped, and the rest to be in + # shapely_geom_list. + self.assertTrue(len(shapely_geom.geoms) == n_features - 1) + def test_no_wwiii_coverage(self): """CV: test exception when shore points are outside max wwiii dist.""" from natcap.invest import coastal_vulnerability @@ -1434,48 +1476,6 @@ def test_projected_wwiii_input(self): layer = None vector = None - def test_prepare_landmass_invalid_geometry(self): - """CV: test handling invalid geometries in landmass vector.""" - from natcap.invest import coastal_vulnerability - aoi_path = os.path.join(self.workspace_dir, 'aoi.geojson') - srs = osr.SpatialReference() - srs.ImportFromEPSG(26910) # UTM Zone 10N - wkt = srs.ExportToWkt() - - aoi_geometries = [Polygon([ - (-200, -200), (200, -200), (200, 200), (-200, 200), (-200, -200)])] - pygeoprocessing.shapely_geometry_to_vector( - aoi_geometries, aoi_path, wkt, 'GeoJSON') - - landmass_vector_path = os.path.join(self.workspace_dir, 'vector.gpkg') - n_features = make_vector_of_invalid_geoms(landmass_vector_path) - - target_polygon_pickle_path = os.path.join( - self.workspace_dir, 'polygon.pickle') - target_lines_pickle_path = os.path.join( - self.workspace_dir, 'lines.pickle') - target_rtree_path = os.path.join(self.workspace_dir, 'rtree.dat') - # Create rtree files to exercise the function's logic of removing - # pre-exisiting files - target_rtree_path_base = os.path.splitext(target_rtree_path)[0] - open(target_rtree_path, 'a').close() - open(target_rtree_path_base + '.idx', 'a').close() - - model_resolution = 100 - target_vector_path = os.path.join( - self.workspace_dir, 'temp-shore-pts.gpkg') - coastal_vulnerability.prepare_landmass_line_index_and_interpolate_shore_points( - aoi_path, landmass_vector_path, model_resolution, - target_vector_path, target_polygon_pickle_path, - target_lines_pickle_path, target_rtree_path) - - with open(target_polygon_pickle_path, 'rb') as polygon_file: - shapely_geom = pickle.load(polygon_file) - - # Expect 1 input geometry to be skipped, and the rest to be in - # shapely_geom_list. - self.assertTrue(len(shapely_geom.geoms) == n_features - 1) - def test_clip_project_already_projected_raster(self): """CV: test clip_and_project_raster on an already projected raster.""" from natcap.invest import coastal_vulnerability From 2b956f9f689a79f51a793b28b79eefbdd032b1d1 Mon Sep 17 00:00:00 2001 From: davemfish Date: Tue, 22 Oct 2024 09:29:45 -0400 Subject: [PATCH 104/111] fixed a shapely 2.0 incompatibility; modified a test to cover it. #1657 --- HISTORY.rst | 18 +++++++++++------- src/natcap/invest/coastal_vulnerability.py | 22 ++++++++-------------- tests/test_coastal_vulnerability.py | 9 +++++++-- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index a8bcf05148..71214591b0 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -44,13 +44,6 @@ Unreleased Changes ``pygeoprocessing.get_raster_info`` and ``pygeoprocessing.get_vector_info``. https://github.com/natcap/invest/issues/1645 -* Forest Carbon Edge Effects - * Updating vector reprojection to allow partial reprojection. Related to - https://github.com/natcap/invest/issues/1645 -* Urban Nature Access - * The model now works as expected when the user provides an LULC raster - that does not have a nodata value defined. - https://github.com/natcap/invest/issues/1293 * Workbench * Several small updates to the model input form UI to improve usability and visual consistency (https://github.com/natcap/invest/issues/912). @@ -64,6 +57,13 @@ Unreleased Changes (https://github.com/natcap/invest/issues/1609). * Improved error handling when a datastack cannot be saved with relative paths across drives (https://github.com/natcap/invest/issues/1608). +* Coastal Vulnerability + * Fixed a regression where an AOI with multiple features could raise a + TypeError after intersecting with the landmass polygon. + https://github.com/natcap/invest/issues/1657 +* Forest Carbon Edge Effects + * Updating vector reprojection to allow partial reprojection. Related to + https://github.com/natcap/invest/issues/1645 * Habitat Quality * Access raster is now generated from the reprojected access vector (https://github.com/natcap/invest/issues/1615). @@ -72,6 +72,10 @@ Unreleased Changes * Urban Flood Risk * Fields present on the input AOI vector are now retained in the output. (https://github.com/natcap/invest/issues/1600) +* Urban Nature Access + * The model now works as expected when the user provides an LULC raster + that does not have a nodata value defined. + https://github.com/natcap/invest/issues/1293 3.14.2 (2024-05-29) ------------------- diff --git a/src/natcap/invest/coastal_vulnerability.py b/src/natcap/invest/coastal_vulnerability.py index ff30d3a24e..a1637451a6 100644 --- a/src/natcap/invest/coastal_vulnerability.py +++ b/src/natcap/invest/coastal_vulnerability.py @@ -21,6 +21,7 @@ from osgeo import gdal from osgeo import ogr from osgeo import osr +from shapely.geometry import LineString, MultiLineString from shapely.geometry.base import BaseMultipartGeometry from shapely.strtree import STRtree @@ -1104,7 +1105,6 @@ def prepare_landmass_line_index_and_interpolate_shore_points( # Get shapely geometries from landmass landmass_polygon_shapely_list = _ogr_to_geometry_list(landmass_vector_path) landmass_shapely = shapely.ops.unary_union(landmass_polygon_shapely_list) - landmass_polygon_shapely_list = None # store polygon geom for point-in-poly check later in ray-casting @@ -1170,19 +1170,13 @@ def prepare_landmass_line_index_and_interpolate_shore_points( if aoi_shapely_prepped.intersects(landmass_line): intersected_shapely_geom = aoi_shapely.intersection( landmass_line) - if intersected_shapely_geom.geom_type == 'LineString': - lines_in_aoi_list.append(intersected_shapely_geom) - elif intersected_shapely_geom.geom_type == 'MultiLineString': - shapely_geom_explode = [ - shapely.geometry.LineString(x) - for x in intersected_shapely_geom] - - lines_in_aoi_list.extend(shapely_geom_explode) - else: - # intersection could generate a point geom - # or if somehow the intersection is empty, - # type will be GeometryCollection. - continue + # intersection could generate a point geom, + # or if somehow the intersection is empty, + # type will be GeometryCollection. + if isinstance(intersected_shapely_geom, + (LineString, MultiLineString)): + lines_in_aoi_list.extend( + _list_geometry(intersected_shapely_geom)) # if none of the lines were disjoint before this linemerge, # unioned_line will now be a LineString. diff --git a/tests/test_coastal_vulnerability.py b/tests/test_coastal_vulnerability.py index 7cfcd9cb13..506d9b478f 100644 --- a/tests/test_coastal_vulnerability.py +++ b/tests/test_coastal_vulnerability.py @@ -1184,17 +1184,22 @@ def test_zero_shorepoints_created(self): def test_aoi_multiple_features(self): """CV: test shore point creation in AOI with multiple features.""" from natcap.invest import coastal_vulnerability - workspace_dir = self.workspace_dir + # workspace_dir = self.workspace_dir + workspace_dir = 'scratch/cv_test' aoi_path = os.path.join(workspace_dir, 'aoi.geojson') srs = osr.SpatialReference() srs.ImportFromEPSG(26910) # UTM Zone 10N wkt = srs.ExportToWkt() + # These two disjoint AOI polygons intersect the same landmass line + # segment. This tests an edge case where a MultiLineString + # geometry is created when landmass lines are clipped by the AOI. poly_a = Polygon([ (-200, -200), (-100, -200), (-100, -100), (-200, -100), (-200, -200)]) poly_b = Polygon([ - (100, 100), (200, 100), (200, 200), (100, 200), (100, 100)]) + (100, -200), (200, -200), (200, -100), (100, -100), + (100, -200)]) pygeoprocessing.shapely_geometry_to_vector( [poly_a, poly_b], aoi_path, wkt, 'GeoJSON') From b5a681b4e2f8d2ac788a72df332066f187d1376f Mon Sep 17 00:00:00 2001 From: davemfish Date: Tue, 22 Oct 2024 09:30:21 -0400 Subject: [PATCH 105/111] reverting a change for debugging. #1657 --- tests/test_coastal_vulnerability.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_coastal_vulnerability.py b/tests/test_coastal_vulnerability.py index 506d9b478f..a6e6f60887 100644 --- a/tests/test_coastal_vulnerability.py +++ b/tests/test_coastal_vulnerability.py @@ -1184,8 +1184,7 @@ def test_zero_shorepoints_created(self): def test_aoi_multiple_features(self): """CV: test shore point creation in AOI with multiple features.""" from natcap.invest import coastal_vulnerability - # workspace_dir = self.workspace_dir - workspace_dir = 'scratch/cv_test' + workspace_dir = self.workspace_dir aoi_path = os.path.join(workspace_dir, 'aoi.geojson') srs = osr.SpatialReference() From 7846c2b87c48aa3387b9673a4baf164c1e67c634 Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 23 Oct 2024 11:01:52 -0700 Subject: [PATCH 106/111] Updating Scripting page of the API docs. RE:#1660 --- HISTORY.rst | 4 + doc/api-docs/scripting.rst | 222 +++++++++---------- doc/api-docs/scripting/modal_save_as.png | Bin 0 -> 323160 bytes doc/api-docs/scripting/workbench_save_as.png | Bin 0 -> 170450 bytes 4 files changed, 105 insertions(+), 121 deletions(-) create mode 100644 doc/api-docs/scripting/modal_save_as.png create mode 100644 doc/api-docs/scripting/workbench_save_as.png diff --git a/HISTORY.rst b/HISTORY.rst index 71214591b0..5eb71f8807 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -44,6 +44,10 @@ Unreleased Changes ``pygeoprocessing.get_raster_info`` and ``pygeoprocessing.get_vector_info``. https://github.com/natcap/invest/issues/1645 + * The scripting page of the InVEST API documentation has been updated to + reflect changes in how InVEST is installed on modern systems, and also to + include images of the InVEST workbench instead of just broken links. + https://github.com/natcap/invest/issues/1660 * Workbench * Several small updates to the model input form UI to improve usability and visual consistency (https://github.com/natcap/invest/issues/912). diff --git a/doc/api-docs/scripting.rst b/doc/api-docs/scripting.rst index 393ddd2ef4..b7c153d6e9 100644 --- a/doc/api-docs/scripting.rst +++ b/doc/api-docs/scripting.rst @@ -20,54 +20,18 @@ InVEST models from the command-line. Setting up your Python environment ================================== -1. **Install Python 3.6 or later.** +We recommend using the ``conda`` or ``mamba`` package manager to create an +environment. The easiest way to do so is to execute the following command:: - Python can be `downloaded from here `_. When installing, - be sure to allow ``python.exe`` to be added to the path in the installation options. + mamba create -n invest-env -c conda-forge natcap.invest +This will create a new environment called ``invest-env`` with the latest +released versions of python and ``natcap.invest``, as well as all dependencies +needed to execute ``natcap.invest``. -2. **Put pip on the PATH.** - - The ``pip`` utility for installing python packages is already included with - Python 2.7.9 and later. Be sure to add ``C:\Python37\Scripts`` (or your custom - install location) to the Windows PATH environment variable so that ``pip`` can - be called from the command line without needing to use its full path. - - After this is done (and you've opened a new command-line window), you will be - able to use ``pip`` at the command-line to install packages like so:: - - > pip install - -3. **Install packages needed to run InVEST.** - - Most (maybe even all) of these packages can be downloaded as precompiled - wheels from `Christoph Gohlke's build page `_. - Others should be able to be installed via ``pip install ``. - - .. This ..include:: part will automatically pull the contents of requirements.txt - and include the file from line 9 through the end. - - .. include:: ../../requirements.txt - :literal: - :start-line: 9 - - -4. **Install the InVEST python package** - - 4a. Download a release of the ``natcap.invest`` python package. - - * `Releases on the python package index `_ - - 4b. Install the downloaded python package.. - - * ``win32.whl`` files are prebuilt binary distributions and can be - installed via pip. - See the `pip docs for installing a package from a wheel - `_ - * ``.zip`` and ``.tar.gz`` files are source archives. - See :ref:`installing` for details, including how to - install specific development versions of ``natcap.invest``. - +Alternate installation methods are available. Please see the :ref:`installing` +guide for further instructions on setting up your python environment and +installing the ``natcap.invest`` package. .. _CreatingSamplePythonScripts: @@ -75,43 +39,52 @@ Setting up your Python environment Creating Sample Python Scripts ============================== -1. **Launch InVEST Model** +1. **Launch InVEST Workbench and Open the Selected Model** - Once an InVEST model is selected for scripting, - launch that model from the Windows Start menu. This example in this guide - follows the NDR model. + Once you have selected an InVEST model to script, launch the workbench and + select the model from the list of available models. This guide will follow + the Nutrient Delivery Ratio (NDR) model. 2. **Fill in InVEST Model Input Parameters** Once the user interface loads, populate the inputs in the model likely to be used in the Python script. For testing purposes the default InVEST’s - data is appropriate. However, if a user wishes to write a batch for several - InVEST runs, it would be reasonable to populate the user interface with - data for the first run. + data is appropriate. However, if you wish to write a script to execute + several InVEST model runs in sequence, it would be reasonable to populate + the user interface with data for the first run in the sequence. 3. **Generate a sample Python Script from the User Interface** - Open the Development menu at the top of the user interface and select - *"Save to python script..."* and save the file to a known location. + In the model interface, select *"Save as..."* in the left-hand menu bar, + *"Python script"* in the dialog box, and then save the file to a known location. -|2w7pilj.png| + |workbench_save_as.png| + |modal_save_as.png| -.. |2w7pilj.png| image:: https://bitbucket.org/repo/ag8qdk/images/3205488039-2w7pilj.png +.. |workbench_save_as.png| image:: scripting/workbench_save_as.png +.. |modal_save_as.png| image:: scripting/modal_save_as.png 4. **Execute the script in the InVEST Python Environment** - Launch a Windows PowerShell from the Start menu (type “powershell” in the - search box), then invoke the Python interpreter on the InVEST Python - script from that shell. In this example the Python interpreter is - installed in ``C:\Python37\python.exe`` and the script was saved in - ``C:\Users\rpsharp\Desktop\ndr.py``, thus the command to invoke the - interpreter is:: + Launch a shell of your choice and activate your InVEST environment you + created earlier. We will use the Windows command prompt ``cmd.exe`` for an + example, but the same commands should work on Powershell, bash and zsh. If + you created an environment called ``invest-env``, you would activate it with + ``conda`` like so:: - > C:\Python37\python.exe C:\Users\rpsharp\Desktop\ndr.py + > conda activate invest-env -|34ecba0.png| + You will know your environment activated correctly when you see the + environment name at the beginning of your shell prompt. For example:: -.. |34ecba0.png| image:: https://bitbucket.org/repo/ag8qdk/images/2939811460-34ecba0.png + (invest-env) C:\Users\demo > + + Once the environment has been activated, we can run the python script we + saved in the previous step. Suppose we're on Windows and the script was + saved to ``C:\Users\demo\Desktop\ndr.py``, the command to run the script + would be:: + + (invest-env) C:\Users\demo > python C:\Users\demo\Desktop\ndr.py 5. **Output Results** @@ -133,50 +106,68 @@ For reference, consider the following script generated by the Nutrient model wit .. code-block:: python - """ - This is a saved model run from natcap.invest.ndr.ndr. - Generated: Mon 16 May 2016 03:52:59 PM - InVEST version: 3.3.0 - """ + # coding=UTF-8 + # ----------------------------------------------- + # Generated by InVEST 3.14.2 on Wed Oct 23 10:49:40 2024 + # Model: Nutrient Delivery Ratio + + import logging + import sys import natcap.invest.ndr.ndr + import natcap.invest.utils + + LOGGER = logging.getLogger(__name__) + root_logger = logging.getLogger() + + handler = logging.StreamHandler(sys.stdout) + formatter = logging.Formatter( + fmt=natcap.invest.utils.LOG_FMT, + datefmt='%m/%d/%Y %H:%M:%S ') + handler.setFormatter(formatter) + logging.basicConfig(level=logging.INFO, handlers=[handler]) args = { - u'k_param': u'2', - u'runoff_proxy_uri': u'C:\InVEST_3.3.0_x86\Base_Data\Freshwater\precip', - u'subsurface_critical_length_n': u'150', - u'subsurface_critical_length_p': u'150', - u'subsurface_eff_n': u'0.8', - u'subsurface_eff_p': u'0.8', - u'threshold_flow_accumulation': u'1000', - u'biophysical_table_uri': u'C:\InVEST_3.3.0_x86\WP_Nutrient_Retention\Input\water_biophysical_table.csv', - u'calc_n': True, - u'calc_p': True, - u'suffix': '', - u'dem_uri': u'C:\InVEST_3.3.0_x86\Base_Data\Freshwater\dem', - u'lulc_uri': u'C:\InVEST_3.3.0_x86\Base_Data\Freshwater\landuse_90', - u'watersheds_uri': u'C:\InVEST_3.3.0_x86\Base_Data\Freshwater\watersheds.shp', - u'workspace_dir': u'C:\InVEST_3.3.0_x86\ndr_workspace', + 'biophysical_table_path': 'C:\\Users\demo\invest-sample-data\\NDR\\biophysical_table_gura.csv', + 'calc_n': True, + 'calc_p': True, + 'dem_path': 'C:\\Users\demo\invest-sample-data\\NDR\\DEM_gura.tif', + 'k_param': '2', + 'lulc_path': 'C:\\Users\demo\invest-sample-data\\NDR\land_use_gura.tif', + 'results_suffix': 'gura', + 'runoff_proxy_path': 'C:\\Users\demo\invest-sample-data\\NDR\precipitation_gura.tif', + 'subsurface_critical_length_n': '200', + 'subsurface_eff_n': '0.8', + 'threshold_flow_accumulation': '1000', + 'watersheds_path': 'C:\\Users\demo\invest-sample-data\\NDR\watershed_gura.shp', + 'workspace_dir': 'C:\\Users\demo\invest-sample-data\\NDR\workspace', } if __name__ == '__main__': natcap.invest.ndr.ndr.execute(args) -Elements to note: - -* *Parameter Python Dictionary*: Key elements include the ``‘args’`` dictionary. Note the similarities between the key values such as ``‘workspace_dir’`` and the equivalent “Workspace” input parameter in the user interface. Every key in the ``‘args’`` dictionary has a corresponding reference in the user interface. -|95zj7p.png| +Elements to note: -.. |95zj7p.png| image:: https://bitbucket.org/repo/ag8qdk/images/22613179-95zj7p.png +* *Parameter Python Dictionary*: Key elements include the ``'args'`` + dictionary. Note the similarities between the key values such as + ``'workspace_dir'`` and the equivalent "Workspace" input parameter in the + user interface. Every key in the ``'args'`` dictionary has a corresponding + reference in the user interface. -In the example below we’ll modify the script to execute the nutrient model for a parameter study of ``‘threshold_flow_accumulation’.`` + In the example below we’ll modify the script to execute the nutrient model + for a parameter study of ``'threshold_flow_accumulation'``. -* *Execution of the InVEST model*: The InVEST API invokes models with a consistent syntax where the module name that contains the InVEST model is listed first and is followed by a function called ‘execute’ that takes a single parameter called ``‘args’``. This parameter is the dictionary of input parameters discussed above. In this example, the line +* *Execution of the InVEST model*: The InVEST API invokes models with a + consistent syntax where the module name that contains the InVEST model is + listed first and is followed by a function called ‘execute’ that takes a + single parameter called ``'args'``. This parameter is the dictionary of input + parameters discussed above. In this example, the line :: -``natcap.invest.ndr.ndr.execute(args)`` + natcap.invest.ndr.ndr.execute(args) -executes the nutrient model end-to-end. If the user wishes to make batch calls to InVEST, this line will likely be placed inside a loop. + executes the nutrient model end-to-end. If the user wishes to make batch + calls to InVEST, this line will likely be placed inside a loop. ==================================================== Example: Threshold Flow Accumulation Parameter Study @@ -212,7 +203,7 @@ example, replace the last line in the UI generated Python script with: .. code-block:: python import os - landcover_dir = r'C:\User\Rich\Desktop\landcover_data' + landcover_dir = r'C:\User\demo\Desktop\landcover_data' if __name__ == '__main__': #Loop over all the filenames in the landcover dir @@ -225,43 +216,31 @@ example, replace the last line in the UI generated Python script with: natcap.invest.ndr.ndr.execute(args) This loop covers all the files located in -``C:\User\Rich\Desktop\landcover_data`` -and updates the relevant ``lulc_uri`` key in the args dictionary to each -of those files during execution as well as making a useful suffix so output -files can be distinguished from each other. +``C:\User\demo\Desktop\landcover_data`` and updates the relevant ``lulc_uri`` +key in the args dictionary to each of those files during execution as well as +making a useful suffix so output files can be distinguished from each other. ============================================ Example: Saving model log messages to a file ============================================ -There are many cases where you may want or need to capture all of the log -messages generated by the model. When we run models through the InVEST user -interface application, the UI captures all of this logging and saves it to a -logfile. We can replicate this behavior through the python logging package, -by adding the following code just after the ``import`` statements in the -example script. - +When you save a model run to a python script, InVEST will automatically include +code to write all logging to your console while it executes. But sometimes, +it's useful to save log messages from th emodel to a file. This can be done by +adding a few lines of code to the script, just after the existing logging +code: .. code-block:: python - import logging - import pygeoprocessing - - # Write all NDR log messages to logfile.txt - MODEL_LOGGER = logging.getLogger('natcap.invest.ndr') - handler = logging.FileHandler('logfile.txt') - MODEL_LOGGER.addHandler(handler) - - # log pygeoprocessing messages to the same logfile - PYGEO_LOGGER = logging.getLogger('pygeoprocessing') - PYGEO_LOGGER.addHandler(handler) + file_handler = logging.FileHandler('logfile.txt') + root_logger.addHandler(file_handler) -This will capture all logging generated by the ``ndr`` model and by -``pygeoprocessing``, writing all messages to ``logfile.txt``. While +This will capture all logging generated by any python package that executes +while running the ``ndr`` model writing all messages to ``logfile.txt``. While this is a common use case, the ``logging`` package provides functionality for many more complex logging features. For more advanced use of the python logging module, refer to the Python project's -`Logging Cookbook `_ +`Logging Cookbook `_ ===================================== Example: Enabling Parallel Processing @@ -306,7 +285,8 @@ Using the parameter study example, this might look like: Internationalization ==================== -If you use the InVEST python API to access model names, ``MODEL_SPEC``s, or validation messages, you can translate those strings using ``gettext``: +If you use the InVEST python API to access model names, ``MODEL_SPEC`` s, or +validation messages, you can translate those strings using ``gettext``: .. code-block:: python diff --git a/doc/api-docs/scripting/modal_save_as.png b/doc/api-docs/scripting/modal_save_as.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f84c1bade2f0f09911ed7f98219daf493caa67 GIT binary patch literal 323160 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

Y3`0LP>pA%YY*nRBCvCC3jo(ejMhE$ifXh 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 z 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 z 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�>gY40i8@ObFMU7>5e=lq!+2r80xaJo{<1ZS%7($mD8 zB~V!r`?fLbD@RKkYMv-z$Vx}XS8@>zgsOERA+DPcR5(0CZ$kJ%%#8y zAz)E1;ay!zFbuXJ#6wzt=t@=5$eGi)3n6lqTky+1OOY@w>mz2Axx@Fr*H&c63Dt}?l}v?;JU!~pRqKs)YgS+!K)bYBwC zC`do)%`I)#U|FeaSrhU8qLcr_Q2xYC^YD|7Yytgy<)6O+Sw-K5ZuKN-K_2(+HJ~r7 zYw>%yV(5V;q_`DDpJ4Q^t*UhqCF%7NBARcUE1b8H=OQAh7d{?G$uhm3ua%Ar$+t2R z+D<`7oMd3=$?4+KyXJD<+(&U6hL6P*`*7-if8m2hBU=6SU>k9t zg;QnW3#%xRl2uASiz-uh*%6MsQdw8O6&@{b^27fvt^ZW#LcvhR!%1rEO;biyy5ACl z-1NL~V)k%_R;5EaBr9P%P4kEmK_g$7w@P#v06D5|E$m~^xwmUjWdGXrsu?AMw#D7J z>H+HA*VE;Uk&XBfP-O7jLdM-d2^pj}OTi3r{f{3nIz?jh%y{G=hzo#XZo4J9!HMpd|cRtiB_uHS!&ahRb({1cfo@SA#@vO|FWAEh#nudsi z>Ih@Ot^2%6n9i{=A-8Q*(Oh}{xE-Bpj+KOYb`SS6F2jE}x4@d5eEVIbtc(~QAt-Mj z7Q+$Ar|fc$3KvMiaF9w+X9%rc8ZNakukga=c=I*bXAJu_wm=F|klsX8&>nv;Xo)U% zWW-tLr^Zg6Z}~KVd(&o6+XrH}{(62mTRhJqjn5&S@}O@XeUn3ct&B_36Zh!6vwxz*Hp_@XrOj)Y~z`b1yvB(wP7pQ)}+_xaBg{OZUe=| zBOC<1rP>WT?Ol4FD%k^(BKUH<%unABln~4nV^Tpe0H{*NiPLqqRFC+8(_vLTmphz) zSa{fxy6mE9cY3Lu7>f9hMoP)(KHfXq&1iXsqX;HZ15RJ5Qm?8!c`tU0>E7*B&n=JX zA~h`rP>vL+7xeVV>Ad=Nn~bw|k9w*sZV^mIJ=~#cgG4B-EFmHgCw< z5D`yqwdE=`7$G(K;#7roGl^LVWoA5Am~%H`TDxY;P)WU1DpY@>An3?lHru(MFs}Zf zu%fZwN`}WY$ma{(<|Stj0mp4`hSVm}QRijXawHM|jcB~xe5j#VZA-b|KSIF?L7$;; z=rn5B=2J?v8pVO&X2t@$T3=sZI1=8pXeBZ}ml*ns7nut~R-2V00?}t9g1qww8rC=7 znl8InnG5t*MguYQ5%Kkz{nmbOUhPiiR|54$)~z~)%eEbkEUuSyGs}_;HzkWs3#pk_ zph}b4ARBp~%~+j6CE~Ba0=9ETu_6Q4KRVRL8$YJ*IN57BUraqko1cDT6aZyFFcW&- z%W-~rOC3eSaeH;lNSS<2z`dPhZ}k1Mm(qsiz3@b?46V{G?{O13rdU)=jIy~P9y?av z;WjBdyOK2TA!7YbhNR&}ueXJ^9O{YxC zH949iw{Wryv{tE#h=`-}o7DFS4(vCTxbwZ*ITpdpH%kPzL#ozpH$--8?kWQpj61eF z_BnkKLl)U#t49_RVt{AEl*|hXVQb*w3N#~DJ=Khx$g&bh%kb@S*5T!egh4mHdO=>f zfux8mm1A0fb<^cMtz0Z^>Ah$0a=%ica{c#UgHV16hPstS`OIuK7lVF9F8#N=Fi+ml z1i%gzC)0O%vDvkj@8R5&9edrdTqv$vjAKdc;E6Fu+P!w%yeF8JKNtj%rqB)zJP(kO z9lR1C-^R7ci4tIN1}4NPP1HWV7XlGvC(`r7*u|!1)+4E9@a? zbT||~GD8>Pnj=7pX)336Yucq*e_4l6FgVTL?0vpJ+uXkrz<+0F)HRL7QYKkSGf?48 z#PHNG&)0*9vp`Jxx(V1D&|L%nK+;V2Fd7ISbGFJEwIox`e;6eBℜw6i7m+es<*b4UmTg=;lLxml_J{M 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

@Q~v*Wkx9`>))00($+* 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 a3krY1#LqL{k3L+&{V6M`%a=Yj3HpEM0kpsX literal 0 HcmV?d00001 From bcf88fc2b3795b19cb99ac565964a088f86c5faa Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 23 Oct 2024 13:06:05 -0700 Subject: [PATCH 107/111] Update doc/api-docs/scripting.rst Co-authored-by: Emily Soth <43770515+emlys@users.noreply.github.com> --- doc/api-docs/scripting.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api-docs/scripting.rst b/doc/api-docs/scripting.rst index b7c153d6e9..0669c9f28f 100644 --- a/doc/api-docs/scripting.rst +++ b/doc/api-docs/scripting.rst @@ -226,7 +226,7 @@ Example: Saving model log messages to a file When you save a model run to a python script, InVEST will automatically include code to write all logging to your console while it executes. But sometimes, -it's useful to save log messages from th emodel to a file. This can be done by +it's useful to save log messages from the model to a file. This can be done by adding a few lines of code to the script, just after the existing logging code: From 0287cb7e24e9feaed554b513c032f6bea3dbf4df Mon Sep 17 00:00:00 2001 From: James Douglass Date: Wed, 23 Oct 2024 13:09:25 -0700 Subject: [PATCH 108/111] Improving section title per @emlys 's suggestion. RE:#1660 --- doc/api-docs/conf.py | 2 +- doc/api-docs/scripting.rst | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/api-docs/conf.py b/doc/api-docs/conf.py index 52205cf614..46b1e83993 100644 --- a/doc/api-docs/conf.py +++ b/doc/api-docs/conf.py @@ -187,7 +187,7 @@ natcap.invest.carbon.execute(args) For examples of scripting a model run, or multiple successive model runs, -see :ref:`CreatingSamplePythonScripts`. +see :ref:`CreatingPythonScripts`. .. contents:: Available Models and Tools: diff --git a/doc/api-docs/scripting.rst b/doc/api-docs/scripting.rst index 0669c9f28f..442a63375a 100644 --- a/doc/api-docs/scripting.rst +++ b/doc/api-docs/scripting.rst @@ -33,11 +33,11 @@ Alternate installation methods are available. Please see the :ref:`installing` guide for further instructions on setting up your python environment and installing the ``natcap.invest`` package. -.. _CreatingSamplePythonScripts: +.. _CreatingPythonScripts: -============================== -Creating Sample Python Scripts -============================== +======================= +Creating Python Scripts +======================= 1. **Launch InVEST Workbench and Open the Selected Model** @@ -53,7 +53,7 @@ Creating Sample Python Scripts several InVEST model runs in sequence, it would be reasonable to populate the user interface with data for the first run in the sequence. -3. **Generate a sample Python Script from the User Interface** +3. **Generate a Python Script from the User Interface** In the model interface, select *"Save as..."* in the left-hand menu bar, *"Python script"* in the dialog box, and then save the file to a known location. From c6ba4ccf95d6c286c1ff0d7d8c875bf3e0553b1d Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Wed, 23 Oct 2024 15:01:01 -0600 Subject: [PATCH 109/111] Update sample data revision hash --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f225958acd..97af79b9f5 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ DATA_DIR := data GIT_SAMPLE_DATA_REPO := https://bitbucket.org/natcap/invest-sample-data.git GIT_SAMPLE_DATA_REPO_PATH := $(DATA_DIR)/invest-sample-data -GIT_SAMPLE_DATA_REPO_REV := ab8c74a62a93fd0019de2bca064abc0a5a07afab +GIT_SAMPLE_DATA_REPO_REV := 0f8b41557753dad3670ba8220f41650b51435a93 GIT_TEST_DATA_REPO := https://bitbucket.org/natcap/invest-test-data.git GIT_TEST_DATA_REPO_PATH := $(DATA_DIR)/invest-test-data From 4441d59ad27bbcba4ca7a9cf56d0a505d252bc75 Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Wed, 23 Oct 2024 18:00:42 -0600 Subject: [PATCH 110/111] Update validation.py to avoid SyntaxError --- src/natcap/invest/validation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/natcap/invest/validation.py b/src/natcap/invest/validation.py index c9c64cf085..34bcac6d85 100644 --- a/src/natcap/invest/validation.py +++ b/src/natcap/invest/validation.py @@ -642,7 +642,7 @@ def get_validated_dataframe( patterns.append(f'{groups[0]}(.+){groups[2]}') else: # for regular column names, use the exact name as the pattern - patterns.append(column.replace('(', '\(').replace(')', '\)')) + patterns.append(column.replace('(', '\\(').replace(')', '\\)')) # select only the columns that match a pattern df = df[[col for col in df.columns if any( From db395d3b17a62179caf34528ae92cef5335285ab Mon Sep 17 00:00:00 2001 From: Emily Davis Date: Thu, 24 Oct 2024 13:31:55 -0600 Subject: [PATCH 111/111] Update with Python raw string notation --- src/natcap/invest/validation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/natcap/invest/validation.py b/src/natcap/invest/validation.py index 34bcac6d85..d6f7df05fc 100644 --- a/src/natcap/invest/validation.py +++ b/src/natcap/invest/validation.py @@ -642,7 +642,7 @@ def get_validated_dataframe( patterns.append(f'{groups[0]}(.+){groups[2]}') else: # for regular column names, use the exact name as the pattern - patterns.append(column.replace('(', '\\(').replace(')', '\\)')) + patterns.append(column.replace('(', r'\(').replace(')', r'\)')) # select only the columns that match a pattern df = df[[col for col in df.columns if any(