internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: EleutherAI/gpt-neox

Issue:
[Broken] Generation with Sequential Model
Take up a config and set `"pipe-parallel-size": 1`
Run `python deepy.py generate.py configs/70M-deduped.yml -i input_prompt.txt -o prompt_out.txt`
This will bring sequential model in action.

Error: `'SequentialWrapper' object has no attribute 'clear_cache'` in [line](https://github.com/EleutherAI/gpt-neox/blob/5c06ec1b9885f74d810a6d33e6015abb55f16ff2/megatron/text_generation_utils.py#L448)



Discussion:
I don't have the bandwidth to handle this for now. Would appreciate if someone can take a look.
Will take a look!
is this error solved now? I encountered the same problem when I train and inference a 125M GPT2 model according to the guidelines.
> is this error solved now? I encountered the same problem when I train and inference a 125M GPT2 model according to the guidelines.

If you encountered the same problem, it’s safe to say that it’s not solved.
The same problem here. Could you please help to check it?
Same here. Would the temporary comment the line out affect anything?
Sorry all. This happened due to a line that snuck into the neox 2.0 release. To clarify for all, there are three pipeline parallelism cases in gpt-neox:

**(pipe_parallel_size == 0):** In this case, the model is wrapped in a standard nn.Sequential module 
https://github.com/EleutherAI/gpt-neox/blob/c64bacccf3a68a27e1f79fa176db4ecd2206a5e9/megatron/training.py#L416
This is done to reduce memory overhead and latency. This case is rarely used, and is where the issue you're seeing above lies.

**(pipe_parallel_size == 1):** This is the most common case. The model is wrapped in a single GPT2ModelPipe module, which makes it easier for both DeepSpeed and us to handle. This should be the default case, which we just resolved in https://github.com/EleutherAI/gpt-neox/pull/866.

**(pipe_parallel_size > 1):** This is for large models that require multiple pipeline module stages to distribute the model. This case remains unchanged.

**What should you do:** If you trained a model and need those weights to stay in a sequential module, we're working on a fix and will share it shortly. If you don't need those weights and instead simply need to run inference on a public model, apply the patch in https://github.com/EleutherAI/gpt-neox/pull/866 and run again.
@satpalsr @FourWinds021 @DaoD @yizhilll have your issues been resolved by the recent patches?
yes

Resolving patch:
diff --git a/megatron/model/utils.py b/megatron/model/utils.py
--- a/megatron/model/utils.py
+++ b/megatron/model/utils.py
@@ -190,6 +190,12 @@ def exec_func(*inputs):
                     x = exec_range_func(start_idx, end_idx)(*x)
         return x
 
+    def clear_cache(self):
+        """
+        Recursively clears the kv cache on all layers
+        """
+        recursive_setattr(self.sequential, "layer_past", None)
+
 
 def recursive_setattr(m, attr, value, assert_type=None, type_filter=None):
     """


Test patch:
Repository: EleutherAI/gpt-neox

Issue:
Add a Contributor Guide
We should document some of our contributor guidelines (pre-commit, tests, etc) now that we have them.

A good one to model after: https://github.com/microsoft/DeepSpeed/blob/master/CONTRIBUTING.md


Discussion:

Resolving patch:
diff --git a/megatron/neox_arguments/arguments.py b/megatron/neox_arguments/arguments.py
--- a/megatron/neox_arguments/arguments.py
+++ b/megatron/neox_arguments/arguments.py
@@ -510,7 +510,7 @@ def get_deepspeed_main_args(self):
                 args_list.extend(
                     self.convert_key_value_to_command_line_arg("account", account)
                 )
-            
+
             # master_address = os.environ['SLURM_JOB_NODELIST'].split('\n')[0]
             # args_list.extend(
             #    self.convert_key_value_to_command_line_arg('master_addr', master_address)


Test patch:
Repository: EleutherAI/gpt-neox

Issue:
Large model instantiation using `DeepSpeed.zero.Init` under ZeRO-3
**Is your feature request related to a problem? Please describe.**
Currently GPT-NeoX doesn't support partitioned model initialization when using ZeRO-3, which will cause OOM error in most cases.

**Describe the solution you'd like**
A simple fix like this will do the trick inside `get_model`

```
    if neox_args.zero_stage == 3:
        with deepspeed.zero.Init():
            model = GPT2ModelPipe(
                neox_args=neox_args,
                num_tokentypes=0,
                parallel_output=True,
                topology=mpu.get_topology(),
                use_cache=use_cache,
            )
``` 


**Describe alternatives you've considered**
Other things I have in mind is to figure out a way to properly test this, I have tested this on a 175B model and it works. Please let me know if there's other testing needed

**Additional context**
Related issue: https://github.com/huggingface/accelerate/issues/922



Discussion:
I am working on a branch addressing this issue

Resolving patch:
diff --git a/megatron/training.py b/megatron/training.py
--- a/megatron/training.py
+++ b/megatron/training.py
@@ -24,6 +24,7 @@
 
 import math
 import sys
+from contextlib import nullcontext
 
 import torch
 import deepspeed
@@ -426,13 +427,15 @@ def get_model(neox_args, use_cache=False):
     # If mup isn't being used anyways, this has no effect.
     old_use_mup = neox_args.use_mup
     neox_args.use_mup = False
-    model = GPT2ModelPipe(
-        neox_args=neox_args,
-        num_tokentypes=0,
-        parallel_output=True,
-        topology=mpu.get_topology(),
-        use_cache=use_cache,
-    )
+
+    with deepspeed.zero.Init() if neox_args.zero_stage == 3 else nullcontext() as gs:
+        model = GPT2ModelPipe(
+            neox_args=neox_args,
+            num_tokentypes=0,
+            parallel_output=True,
+            topology=mpu.get_topology(),
+            use_cache=use_cache,
+        )
 
     ### soft prompt tuning stuff ###
     if neox_args.soft_prompt_tuning is not None and neox_args.soft_prompt_tuning.get(


Test patch:
Repository: pre-commit/pre-commit

Issue:
pre-commit -i does not install the file with +x
No executable = no run :'(



Discussion:

Resolving patch:
diff --git a/pre_commit/git.py b/pre_commit/git.py
--- a/pre_commit/git.py
+++ b/pre_commit/git.py
@@ -3,6 +3,7 @@
 import os.path
 import pkg_resources
 import re
+import stat
 from plumbum import local
 
 from pre_commit.util import memoize_by_cwd
@@ -32,6 +33,8 @@ def create_pre_commit():
     path = get_pre_commit_path()
     pre_commit_file = pkg_resources.resource_filename('pre_commit', 'resources/pre-commit.sh')
     local.path(path).write(local.path(pre_commit_file).read())
+    original_mode = os.stat(path).st_mode
+    os.chmod(path, original_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
 
 
 def remove_pre_commit():


Test patch:
diff --git a/tests/git_test.py b/tests/git_test.py
--- a/tests/git_test.py
+++ b/tests/git_test.py
@@ -1,6 +1,7 @@
 
 import os
 import pytest
+import stat
 from plumbum import local
 
 from pre_commit import git
@@ -25,6 +26,10 @@ def test_get_pre_commit_path(empty_git_dir):
 def test_create_pre_commit(empty_git_dir):
     git.create_pre_commit()
     assert len(open(git.get_pre_commit_path(), 'r').read()) > 0
+    stat_result = os.stat(git.get_pre_commit_path())
+    assert stat_result.st_mode & stat.S_IXUSR
+    assert stat_result.st_mode & stat.S_IXGRP
+    assert stat_result.st_mode & stat.S_IXOTH
 
 
 def test_remove_pre_commit(empty_git_dir):
Repository: pre-commit/pre-commit

Issue:
Consider using --no-checkout for cloning
I'd assume it is faster...



Discussion:
Seems to work (tests pass)


Resolving patch:
diff --git a/pre_commit/repository.py b/pre_commit/repository.py
--- a/pre_commit/repository.py
+++ b/pre_commit/repository.py
@@ -56,7 +56,7 @@ def create(self):
                 # Project already exists, no reason to re-create it
                 return
 
-            local['git']['clone', self.repo_url, self.sha]()
+            local['git']['clone', '--no-checkout', self.repo_url, self.sha]()
             with self.in_checkout():
                 local['git']['checkout', self.sha]()
 
@@ -69,4 +69,4 @@ def install(self):
     def run_hook(self, hook_id, file_args):
         with self.in_checkout():
             hook = self.hooks[hook_id]
-            return languages[hook['language']].run_hook(hook, file_args)
\ No newline at end of file
+            return languages[hook['language']].run_hook(hook, file_args)


Test patch:
Repository: pre-commit/pre-commit

Issue:
TypeError while instantiating LoggingHandler (2.6)
I assume this is new-style vs old-style classes being grumpy?

```
>>> from pre_commit.logging_handler import LoggingHandler
>>> LoggingHandler(True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".../py_env/lib/python2.6/site-packages/pre_commit/logging_handler.py", line 19, in __init__
    super(LoggingHandler, self).__init__()
TypeError: super() argument 1 must be type, not classobj
```



Discussion:

Resolving patch:
diff --git a/pre_commit/logging_handler.py b/pre_commit/logging_handler.py
--- a/pre_commit/logging_handler.py
+++ b/pre_commit/logging_handler.py
@@ -16,7 +16,7 @@
 
 class LoggingHandler(logging.Handler):
     def __init__(self, use_color):
-        super(LoggingHandler, self).__init__()
+        logging.Handler.__init__(self)
         self.use_color = use_color
 
     def emit(self, record):


Test patch:
diff --git a/tests/logging_handler_test.py b/tests/logging_handler_test.py
new file mode 100644
--- /dev/null
+++ b/tests/logging_handler_test.py
@@ -0,0 +1,38 @@
+import __builtin__
+import mock
+import pytest
+
+from pre_commit import color
+from pre_commit.logging_handler import LoggingHandler
+
+
+@pytest.yield_fixture
+def print_mock():
+    with mock.patch.object(__builtin__, 'print', autospec=True) as print_mock:
+        yield print_mock
+
+
+class FakeLogRecord(object):
+    def __init__(self, message, levelname, levelno):
+        self.message = message
+        self.levelname = levelname
+        self.levelno = levelno
+
+    def getMessage(self):
+        return self.message
+
+
+def test_logging_handler_color(print_mock):
+    handler = LoggingHandler(True)
+    handler.emit(FakeLogRecord('hi', 'WARNING', 30))
+    print_mock.assert_called_once_with(
+        color.YELLOW + '[WARNING]' + color.NORMAL + ' hi',
+    )
+
+
+def test_logging_handler_no_color(print_mock):
+    handler = LoggingHandler(False)
+    handler.emit(FakeLogRecord('hi', 'WARNING', 30))
+    print_mock.assert_called_once_with(
+        '[WARNING] hi',
+    )
Repository: pre-commit/pre-commit

Issue:
npmrc causes npm to install to home directory instead of nodeenv
Here is what happened when I tried to get eslint installed: 

```
$ pre-commit run --all-files
eslint..............................................................................................................................................................................................................................................................................................................Failed
hookid: eslint

xargs: eslint: No such file or directory
```

Moving .npmrc to nope.npmrc fixed the issue.



Discussion:
Here's an example npmrc causing this problem:

```
prefix=~/.npm-packages
```


Resolving patch:
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -41,7 +41,7 @@
         'aspy.yaml',
         'cached-property',
         'jsonschema',
-        'nodeenv>=0.9.4',
+        'nodeenv>=0.11.1',
         'ordereddict',
         'plumbum',
         'pyyaml',


Test patch:
Repository: pre-commit/pre-commit

Issue:
Crash when /tmp is on a different device
```
Traceback (most recent call last):
  File "/home/cameron/Workspace/hack16-llvm-lang/venv/bin/pre-commit", line 9, in <module>
    load_entry_point('pre-commit==0.4.0', 'console_scripts', 'pre-commit')()
  File "/home/cameron/Workspace/hack16-llvm-lang/venv/lib/python3.4/site-packages/pre_commit/main.py", line 136, in main
    'Command {0} failed to exit with a returncode'.format(args.command)
  File "/usr/lib64/python3.4/contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "/home/cameron/Workspace/hack16-llvm-lang/venv/lib/python3.4/site-packages/pre_commit/error_handler.py", line 41, in error_handler
    traceback.format_exc(),
  File "/home/cameron/Workspace/hack16-llvm-lang/venv/lib/python3.4/site-packages/pre_commit/error_handler.py", line 24, in _log_and_exit
    store.require_created()
  File "/home/cameron/Workspace/hack16-llvm-lang/venv/lib/python3.4/site-packages/pre_commit/store.py", line 97, in require_created
    self._create()
  File "/home/cameron/Workspace/hack16-llvm-lang/venv/lib/python3.4/site-packages/pre_commit/store.py", line 90, in _create
    self._write_sqlite_db()
  File "/home/cameron/Workspace/hack16-llvm-lang/venv/lib/python3.4/site-packages/pre_commit/store.py", line 82, in _write_sqlite_db
    os.rename(tmpfile, self.db_path)
OSError: [Errno 18] Invalid cross-device link: '/tmp/tmpz1pkyqsm' -> '/home/cameron/.pre-commit/db.db'
```



Discussion:
Seems your tempfs is on a different device and os.rename derps on that.  Thanks python!  Should be easy enough to fix :)


Resolving patch:
diff --git a/pre_commit/store.py b/pre_commit/store.py
--- a/pre_commit/store.py
+++ b/pre_commit/store.py
@@ -62,7 +62,7 @@ def _write_readme(self):
     def _write_sqlite_db(self):
         # To avoid a race where someone ^Cs between db creation and execution
         # of the CREATE TABLE statement
-        fd, tmpfile = tempfile.mkstemp()
+        fd, tmpfile = tempfile.mkstemp(dir=self.directory)
         # We'll be managing this file ourselves
         os.close(fd)
         # sqlite doesn't close its fd with its contextmanager >.<


Test patch:
Repository: pre-commit/pre-commit

Issue:
pre-commit potentially uses the wrong `virtualenv` when building environments
It should use `sys.executable, '-m', 'virtualenv'` instead of `'virtualenv'`



Discussion:

Resolving patch:
diff --git a/pre_commit/languages/python.py b/pre_commit/languages/python.py
--- a/pre_commit/languages/python.py
+++ b/pre_commit/languages/python.py
@@ -3,6 +3,7 @@
 import contextlib
 import distutils.spawn
 import os
+import sys
 
 import virtualenv
 
@@ -43,7 +44,10 @@ def install_environment(repo_cmd_runner, version='default'):
 
     # Install a virtualenv
     with clean_path_on_failure(repo_cmd_runner.path(ENVIRONMENT_DIR)):
-        venv_cmd = ['virtualenv', '{{prefix}}{0}'.format(ENVIRONMENT_DIR)]
+        venv_cmd = [
+            sys.executable, '-m', 'virtualenv',
+            '{{prefix}}{0}'.format(ENVIRONMENT_DIR)
+        ]
         if version != 'default':
             venv_cmd.extend(['-p', norm_version(version)])
         repo_cmd_runner.run(venv_cmd)


Test patch:
Repository: pre-commit/pre-commit

Issue:
Some versions of git don't create .git/hooks directory
Noticed here: https://github.com/victorlin/bugbuzz-python/pull/1#issuecomment-104971132



Discussion:

Resolving patch:
diff --git a/pre_commit/commands/install_uninstall.py b/pre_commit/commands/install_uninstall.py
--- a/pre_commit/commands/install_uninstall.py
+++ b/pre_commit/commands/install_uninstall.py
@@ -48,6 +48,9 @@ def install(runner, overwrite=False, hooks=False, hook_type='pre-commit'):
     hook_path = runner.get_hook_path(hook_type)
     legacy_path = hook_path + '.legacy'
 
+    if not os.path.exists(os.path.dirname(hook_path)):
+        os.makedirs(os.path.dirname(hook_path))
+
     # If we have an existing hook, move it to pre-commit.legacy
     if (
         os.path.exists(hook_path) and


Test patch:
diff --git a/tests/commands/install_uninstall_test.py b/tests/commands/install_uninstall_test.py
--- a/tests/commands/install_uninstall_test.py
+++ b/tests/commands/install_uninstall_test.py
@@ -5,6 +5,7 @@
 import os
 import os.path
 import re
+import shutil
 import subprocess
 import sys
 
@@ -78,6 +79,15 @@ def test_install_pre_commit(tmpdir_factory):
     assert pre_push_contents == expected_contents
 
 
+def test_install_hooks_directory_not_present(tmpdir_factory):
+    path = git_dir(tmpdir_factory)
+    # Simulate some git clients which don't make .git/hooks #234
+    shutil.rmtree(os.path.join(path, '.git', 'hooks'))
+    runner = Runner(path)
+    install(runner)
+    assert os.path.exists(runner.pre_commit_path)
+
+
 def test_uninstall_does_not_blow_up_when_not_there(tmpdir_factory):
     path = git_dir(tmpdir_factory)
     runner = Runner(path)
Repository: pre-commit/pre-commit

Issue:
Make pre-commit consider a hook as "failed" if it modifies files and still (incorrectly?) exits 0
This would allow us to ditch autopep8-wrapper and support a bunch of hooks which refused to be scriptable (yapf, etc.)



Discussion:

Resolving patch:
diff --git a/pre_commit/commands/run.py b/pre_commit/commands/run.py
--- a/pre_commit/commands/run.py
+++ b/pre_commit/commands/run.py
@@ -85,7 +85,13 @@ def _run_single_hook(hook, repo, args, write, skips=frozenset()):
     write(get_hook_message(_hook_msg_start(hook, args.verbose), end_len=6))
     sys.stdout.flush()
 
+    diff_before = cmd_output('git', 'diff', retcode=None)
     retcode, stdout, stderr = repo.run_hook(hook, filenames)
+    diff_after = cmd_output('git', 'diff', retcode=None)
+
+    # If the hook makes changes, fail the commit
+    if diff_before != diff_after:
+        retcode = 1
 
     if retcode:
         retcode = 1


Test patch:
diff --git a/testing/resources/modified_file_returns_zero_repo/bin/hook.sh b/testing/resources/modified_file_returns_zero_repo/bin/hook.sh
new file mode 100755
--- /dev/null
+++ b/testing/resources/modified_file_returns_zero_repo/bin/hook.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+for f in $@; do
+    echo modified > "$f"
+    echo "Modified: $f!"
+done
diff --git a/testing/resources/modified_file_returns_zero_repo/bin/hook2.sh b/testing/resources/modified_file_returns_zero_repo/bin/hook2.sh
new file mode 100755
--- /dev/null
+++ b/testing/resources/modified_file_returns_zero_repo/bin/hook2.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+echo $@
diff --git a/testing/resources/modified_file_returns_zero_repo/hooks.yaml b/testing/resources/modified_file_returns_zero_repo/hooks.yaml
new file mode 100644
--- /dev/null
+++ b/testing/resources/modified_file_returns_zero_repo/hooks.yaml
@@ -0,0 +1,10 @@
+-   id: bash_hook
+    name: Bash hook
+    entry: bin/hook.sh
+    language: script
+    files: ''
+-   id: bash_hook2
+    name: Bash hook
+    entry: bin/hook2.sh
+    language: script
+    files: ''
diff --git a/tests/commands/run_test.py b/tests/commands/run_test.py
--- a/tests/commands/run_test.py
+++ b/tests/commands/run_test.py
@@ -120,6 +120,29 @@ def test_arbitrary_bytes_hook(tempdir_factory, mock_out_store_directory):
         _test_run(git_path, {}, (b'\xe2\x98\x83\xb2\n',), 1, True)
 
 
+def test_hook_that_modifies_but_returns_zero(
+        tempdir_factory, mock_out_store_directory,
+):
+    git_path = make_consuming_repo(
+        tempdir_factory, 'modified_file_returns_zero_repo',
+    )
+    with cwd(git_path):
+        _test_run(
+            git_path,
+            {},
+            (
+                # The first should fail
+                b'Failed',
+                # With a modified file (the hook's output)
+                b'Modified: foo.py',
+                # The next hook should pass despite the first modifying
+                b'Passed',
+            ),
+            1,
+            True,
+        )
+
+
 @pytest.mark.parametrize(
     ('options', 'outputs', 'expected_ret', 'stage'),
     (
Repository: pre-commit/pre-commit

Issue:
Improve error message when attempting to run non-existent hook
Hook id in `/.pre-commit-config.yaml` doesn't exist in the included repository

(From https://github.com/pre-commit/pre-commit-hooks/issues/37)

It should probably suggest updating hooks or checking the spelling of the hookid



Discussion:
+1 I've been bitten by this :)


Resolving patch:
diff --git a/pre_commit/repository.py b/pre_commit/repository.py
--- a/pre_commit/repository.py
+++ b/pre_commit/repository.py
@@ -61,7 +61,16 @@ def additional_dependencies(self):
 
     @cached_property
     def hooks(self):
-        # TODO: merging in manifest dicts is a smell imo
+        for hook in self.repo_config['hooks']:
+            if hook['id'] not in self.manifest.hooks:
+                logger.error(
+                    '`{0}` is not present in repository {1}.  '
+                    'Typo? Perhaps it is introduced in a newer version?  '
+                    'Often `pre-commit autoupdate` fixes this.'.format(
+                        hook['id'], self.repo_config['repo'],
+                    )
+                )
+                exit(1)
         return tuple(
             (hook['id'], dict(self.manifest.hooks[hook['id']], **hook))
             for hook in self.repo_config['hooks']


Test patch:
diff --git a/tests/repository_test.py b/tests/repository_test.py
--- a/tests/repository_test.py
+++ b/tests/repository_test.py
@@ -2,6 +2,7 @@
 from __future__ import unicode_literals
 
 import io
+import logging
 import os
 import os.path
 import shutil
@@ -485,3 +486,26 @@ def test_local_repository():
     with pytest.raises(NotImplementedError):
         local_repo.manifest
     assert len(local_repo.hooks) == 1
+
+
+@pytest.yield_fixture
+def fake_log_handler():
+    handler = mock.Mock(level=logging.INFO)
+    logger = logging.getLogger('pre_commit')
+    logger.addHandler(handler)
+    yield handler
+    logger.removeHandler(handler)
+
+
+def test_hook_id_not_present(tempdir_factory, store, fake_log_handler):
+    path = make_repo(tempdir_factory, 'script_hooks_repo')
+    config = make_config_from_repo(path)
+    config['hooks'][0]['id'] = 'i-dont-exist'
+    repo = Repository.create(config, store)
+    with pytest.raises(SystemExit):
+        repo.install()
+    assert fake_log_handler.handle.call_args[0][0].msg == (
+        '`i-dont-exist` is not present in repository {0}.  '
+        'Typo? Perhaps it is introduced in a newer version?  '
+        'Often `pre-commit autoupdate` fixes this.'.format(path)
+    )
Repository: pre-commit/pre-commit

Issue:
Windows: Terminal width support
We detect terminal width in unixlikes by running `tput cols`.  This works fine for those platforms but doesn't work well for windows.  Maybe find a package which does this logic for us and depend on that.



Discussion:

Resolving patch:
diff --git a/pre_commit/output.py b/pre_commit/output.py
--- a/pre_commit/output.py
+++ b/pre_commit/output.py
@@ -1,27 +1,15 @@
 from __future__ import unicode_literals
 
-import os
-import subprocess
 import sys
 
+from backports.shutil_get_terminal_size import get_terminal_size
+
 from pre_commit import color
 from pre_commit import five
 
-
 # TODO: smell: import side-effects
-try:
-    if not os.environ.get('TERM'):  # pragma: no cover (dumb terminal)
-        raise OSError('Cannot determine width without TERM')
-    else:  # pragma no cover (windows)
-        COLS = int(
-            subprocess.Popen(
-                ('tput', 'cols'), stdout=subprocess.PIPE,
-            ).communicate()[0] or
-            # Default in the case of no terminal
-            80
-        )
-except OSError:  # pragma: no cover (windows)
-    COLS = 80
+# TODO: https://github.com/chrippa/backports.shutil_get_terminal_size/issues/4
+COLS = get_terminal_size().columns or 80
 
 
 def get_hook_message(
diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -41,6 +41,7 @@
     install_requires=[
         'argparse',
         'aspy.yaml',
+        'backports.shutil_get_terminal_size',
         'cached-property',
         'jsonschema',
         'nodeenv>=0.11.1',


Test patch: