diff --git a/spacy/about.py b/spacy/about.py index 6cb85da5b..debd63d33 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -1,6 +1,6 @@ # fmt: off __title__ = "spacy" -__version__ = "3.0.0" +__version__ = "3.0.1.dev0" __download_url__ = "https://github.com/explosion/spacy-models/releases/download" __compatibility__ = "https://raw.githubusercontent.com/explosion/spacy-models/master/compatibility.json" __projects__ = "https://github.com/explosion/projects" diff --git a/spacy/cli/project/run.py b/spacy/cli/project/run.py index ca3ffcebf..28ac3c24e 100644 --- a/spacy/cli/project/run.py +++ b/spacy/cli/project/run.py @@ -37,7 +37,12 @@ def project_run_cli( def project_run( - project_dir: Path, subcommand: str, *, force: bool = False, dry: bool = False + project_dir: Path, + subcommand: str, + *, + force: bool = False, + dry: bool = False, + capture: bool = False, ) -> None: """Run a named script defined in the project.yml. If the script is part of the default pipeline (defined in the "run" section), DVC is used to @@ -48,6 +53,11 @@ def project_run( subcommand (str): Name of command to run. force (bool): Force re-running, even if nothing changed. dry (bool): Perform a dry run and don't execute commands. + capture (bool): Whether to capture the output and errors of individual commands. + If False, the stdout and stderr will not be redirected, and if there's an error, + sys.exit will be called with the return code. You should use capture=False + when you want to turn over execution to the command, and capture=True + when you want to run the command more like a function. """ config = load_project_config(project_dir) commands = {cmd["name"]: cmd for cmd in config.get("commands", [])} @@ -72,7 +82,7 @@ def project_run( if not rerun and not force: msg.info(f"Skipping '{cmd['name']}': nothing changed") else: - run_commands(cmd["script"], dry=dry) + run_commands(cmd["script"], dry=dry, capture=capture) if not dry: update_lockfile(current_dir, cmd) @@ -126,12 +136,18 @@ def run_commands( commands: Iterable[str] = SimpleFrozenList(), silent: bool = False, dry: bool = False, + capture: bool = False, ) -> None: """Run a sequence of commands in a subprocess, in order. commands (List[str]): The string commands. silent (bool): Don't print the commands. dry (bool): Perform a dry run and don't execut anything. + capture (bool): Whether to capture the output and errors of individual commands. + If False, the stdout and stderr will not be redirected, and if there's an error, + sys.exit will be called with the return code. You should use capture=False + when you want to turn over execution to the command, and capture=True + when you want to run the command more like a function. """ for command in commands: command = split_command(command) @@ -149,7 +165,7 @@ def run_commands( if not silent: print(f"Running command: {join_command(command)}") if not dry: - run_command(command, capture=False) + run_command(command, capture=capture) def validate_subcommand( diff --git a/spacy/language.py b/spacy/language.py index 46c571815..5bd1545d2 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -1190,7 +1190,6 @@ class Language: get_examples: Optional[Callable[[], Iterable[Example]]] = None, *, sgd: Optional[Optimizer] = None, - link_components: bool = True, ) -> Optimizer: """Initialize the pipe for training, using data examples if available. @@ -1198,8 +1197,6 @@ class Language: returns gold-standard Example objects. sgd (Optional[Optimizer]): An optimizer to use for updates. If not provided, will be created using the .create_optimizer() method. - link_components (bool): Link listener components automatically or not - (default True) RETURNS (thinc.api.Optimizer): The optimizer. DOCS: https://spacy.io/api/language#initialize @@ -1247,8 +1244,7 @@ class Language: proc.initialize, p_settings, section="components", name=name ) proc.initialize(get_examples, nlp=self, **p_settings) - if link_components: - self._link_components() + self._link_components() self._optimizer = sgd if sgd is not None: self._optimizer = sgd diff --git a/spacy/pipeline/tok2vec.py b/spacy/pipeline/tok2vec.py index 87fce2067..5e723c14c 100644 --- a/spacy/pipeline/tok2vec.py +++ b/spacy/pipeline/tok2vec.py @@ -80,7 +80,8 @@ class Tok2Vec(TrainablePipe): def add_listener(self, listener: "Tok2VecListener", component_name: str) -> None: """Add a listener for a downstream component. Usually internals.""" self.listener_map.setdefault(component_name, []) - self.listener_map[component_name].append(listener) + if listener not in self.listener_map[component_name]: + self.listener_map[component_name].append(listener) def remove_listener(self, listener: "Tok2VecListener", component_name: str) -> bool: """Remove a listener for a downstream component. Usually internals.""" diff --git a/spacy/training/initialize.py b/spacy/training/initialize.py index 76c5eaddc..7457dc359 100644 --- a/spacy/training/initialize.py +++ b/spacy/training/initialize.py @@ -67,7 +67,7 @@ def init_nlp(config: Config, *, use_gpu: int = -1) -> "Language": # Make sure that listeners are defined before initializing further nlp._link_components() with nlp.select_pipes(disable=[*frozen_components, *resume_components]): - nlp.initialize(lambda: train_corpus(nlp), sgd=optimizer, link_components=False) + nlp.initialize(lambda: train_corpus(nlp), sgd=optimizer) logger.info(f"Initialized pipeline components: {nlp.pipe_names}") # Detect components with listeners that are not frozen consistently for name, proc in nlp.pipeline: diff --git a/spacy/util.py b/spacy/util.py index f1292e327..f55b03db8 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -803,7 +803,7 @@ def run_command( stdin (Optional[Any]): stdin to read from or None. capture (bool): Whether to capture the output and errors. If False, the stdout and stderr will not be redirected, and if there's an error, - sys.exit will be called with the returncode. You should use capture=False + sys.exit will be called with the return code. You should use capture=False when you want to turn over execution to the command, and capture=True when you want to run the command more like a function. RETURNS (Optional[CompletedProcess]): The process object. diff --git a/website/docs/usage/models.md b/website/docs/usage/models.md index 4cfa60151..9a32fad41 100644 --- a/website/docs/usage/models.md +++ b/website/docs/usage/models.md @@ -269,7 +269,7 @@ best-matching package compatible with your spaCy installation. > > ```diff > - python -m spacy download en -> + python -m spacy dowmload en_core_web_sm +> + python -m spacy download en_core_web_sm > ``` > > ```diff diff --git a/website/package-lock.json b/website/package-lock.json index d8444c2b2..11b1e4899 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -15069,6 +15069,11 @@ "parse-url": "^5.0.0" } }, + "github-buttons": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.14.2.tgz", + "integrity": "sha512-DMakrcFRdojVAndkKYVDTHF3Ym09OoWia//IQ7B/MVxC+iQ2DenYfD7IR69ZZ9awM8PNS/9wthr4IyDhkFJ4mg==" + }, "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -22693,6 +22698,14 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-3.0.0.tgz", "integrity": "sha512-XzgvowFrwDo6TWcpJ/WTiarb9UI6lhA4PMzS7n1joK3sHfBBBOQHUc0U4u57D6DWO9vHv6lVSWx2Q/Ymfyv4hw==" }, + "react-github-btn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-github-btn/-/react-github-btn-1.2.0.tgz", + "integrity": "sha512-/b2TGTeek5Ky+KtuP5BxOaXgb1FGhbwgZNI6rkwkGk7+xtCtsNMkdchOcCnC3qU1JGTWPKzYZWpPBIouVhXAoQ==", + "requires": { + "github-buttons": "^2.8.0" + } + }, "react-helmet": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.0.tgz", diff --git a/website/package.json b/website/package.json index ef62f3c19..95336a539 100644 --- a/website/package.json +++ b/website/package.json @@ -49,6 +49,7 @@ "prop-types": "^15.7.2", "react": "^16.8.2", "react-dom": "^16.8.2", + "react-github-btn": "^1.2.0", "react-helmet": "^5.2.0", "react-intersection-observer": "^8.0.1", "remark-react": "^5.0.1" diff --git a/website/src/components/navigation.js b/website/src/components/navigation.js index 93a56039f..b498df451 100644 --- a/website/src/components/navigation.js +++ b/website/src/components/navigation.js @@ -1,6 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' +import GitHubButton from 'react-github-btn' import Link from './link' import Icon from './icon' @@ -61,10 +62,13 @@ export default function Navigation({ title, items = [], section, search, alert, ) })} -
  • - - - +
  • +
  • {search &&
    {search}
    } diff --git a/website/src/styles/navigation.module.sass b/website/src/styles/navigation.module.sass index b619330c0..5ea87de85 100644 --- a/website/src/styles/navigation.module.sass +++ b/website/src/styles/navigation.module.sass @@ -68,6 +68,14 @@ height: 100% padding-right: 2rem +.github + text-transform: initial + margin-top: 0.25rem + margin-left: 1.5em !important + + & > span + min-width: 100px + .dropdown --dropdown-text-color: var(--color-theme) font-family: var(--font-secondary)