nebius/SWE-rebench-V2-PRs huggingface dataset:
Repository: lightningnetwork/lnd
Pull request #7289 (2023-01-05 07:53:45)

lint: disable `thelper` linter
We often split tests into separate test functions. If we are forced to
call `t.Helper()` within those functions, we lose the information where
exactly a test failed in the generated failure stack trace.


Patch:
diff --git a/.golangci.yml b/.golangci.yml
index be2b63897..2ab612f58 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -179,6 +179,11 @@ linters:
 
     # Disable nil check to allow returning multiple nil values.
     - nilnil
+    
+    # We often split tests into separate test functions. If we are forced to
+    # call t.Helper() within those functions, we lose the information where
+    # exactly a test failed in the generated failure stack trace.
+    - thelper
 
 
 issues:
diff --git a/docs/release-notes/release-notes-0.16.0.md b/docs/release-notes/release-notes-0.16.0.md
index 49e51052c..b3713c657 100644
--- a/docs/release-notes/release-notes-0.16.0.md
+++ b/docs/release-notes/release-notes-0.16.0.md
@@ -301,7 +301,9 @@ certain large transactions](https://github.com/lightningnetwork/lnd/pull/7100).
   adding a data migration functionality to `lndinit`.
 
 * [`golangci-lint` will now check new code using additional
-  linters.](https://github.com/lightningnetwork/lnd/pull/7064)
+  linters](https://github.com/lightningnetwork/lnd/pull/7064) and was
+  [fine-tuned](https://github.com/lightningnetwork/lnd/pull/7289) to fit our
+  code style.
 
 * Update github actions to [check commits against the target base 
   branch](https://github.com/lightningnetwork/lnd/pull/7103) rather than just 


Test patch:
diff --git a/lnwire/onion_error_test.go b/lnwire/onion_error_test.go
index 96a088065..9746cf076 100644
--- a/lnwire/onion_error_test.go
+++ b/lnwire/onion_error_test.go
@@ -101,7 +101,7 @@ func TestEncodeDecodeTlv(t *testing.T) {
 
 var testTlv, _ = hex.DecodeString("fd023104deadbeef")
 
-func testEncodeDecodeTlv(t *testing.T, testFailure FailureMessage) { //nolint: lll,thelper
+func testEncodeDecodeTlv(t *testing.T, testFailure FailureMessage) {
 	var failureMessageBuffer bytes.Buffer
 
 	err := EncodeFailureMessage(&failureMessageBuffer, testFailure, 0)
Repository: zauberzeug/nicegui
Pull request #3524 (2024-08-16 14:00:29)

Fix events on hidden and disabled elements
This PR fixes issue #3522 by not ignoring _all_ events on hidden and disabled elements, but only those emitted from the client. This still prevents the user from manipulating the server state using the browser's developer tools, but allows handling server-side events.


Patch:
diff --git a/nicegui/client.py b/nicegui/client.py
index aa5dd5d8..c8953de1 100644
--- a/nicegui/client.py
+++ b/nicegui/client.py
@@ -274,7 +274,7 @@ class Client:
         """Forward an event to the corresponding element."""
         with self:
             sender = self.elements.get(msg['id'])
-            if sender is not None:
+            if sender is not None and not sender.is_ignoring_events:
                 msg['args'] = [None if arg is None else json.loads(arg) for arg in msg.get('args', [])]
                 if len(msg['args']) == 1:
                     msg['args'] = msg['args'][0]
diff --git a/nicegui/events.py b/nicegui/events.py
index 3594fdfe..34e64633 100644
--- a/nicegui/events.py
+++ b/nicegui/events.py
@@ -403,8 +403,6 @@ def handle_event(handler: Optional[Callable[..., Any]], arguments: EventArgument
 
         parent_slot: Union[Slot, nullcontext]
         if isinstance(arguments, UiEventArguments):
-            if arguments.sender.is_ignoring_events:
-                return
             parent_slot = arguments.sender.parent_slot or arguments.sender.client.layout.default_slot
         else:
             parent_slot = nullcontext()


Test patch:
diff --git a/tests/test_events.py b/tests/test_events.py
index fb87a8df..cdfa30a3 100644
--- a/tests/test_events.py
+++ b/tests/test_events.py
@@ -163,19 +163,26 @@ def test_throttling_variants(screen: Screen):
 
 @pytest.mark.parametrize('attribute', ['disabled', 'hidden'])
 def test_server_side_validation(screen: Screen, attribute: Literal['disabled', 'hidden']):
-    b = ui.button('Button', on_click=lambda: ui.label('Success'))
+    b = ui.button('Button', on_click=lambda: ui.label('Button clicked'))
+    n = ui.number('Number', on_change=lambda: ui.label('Number changed'))
     if attribute == 'disabled':
         b.disable()
+        n.disable()
     else:
         b.set_visibility(False)
-    ui.button('Hack', on_click=lambda: ui.run_javascript(f'''
+        n.set_visibility(False)
+    ui.button('Forbidden', on_click=lambda: ui.run_javascript(f'''
         getElement({b.id}).$emit("click", {{"id": {b.id}, "listener_id": "{next(iter(b._event_listeners))}"}});
     '''))  # pylint: disable=protected-access
+    ui.button('Allowed', on_click=lambda: n.set_value(42))
 
     screen.open('/')
-    screen.click('Hack')
+    screen.click('Forbidden')
     screen.wait(0.5)
-    screen.should_not_contain('Success')
+    screen.should_not_contain('Button clicked')  # triggering the click event through JavaScript does not work
+
+    screen.click('Allowed')
+    screen.should_contain('Number changed')  # triggering the change event through Python works
 
 
 def test_js_handler(screen: Screen) -> None:
Repository: zauberzeug/nicegui
Pull request #4702 (2025-05-05 15:50:29)

Fix multi-cursor updates in `ui.codemirror`
This PR fixes issue #4701 which has been introduced in PR #4676. When one change caused the content to shift, subsequent changes have been applied at the wrong position. This is fixed by creating a new string from scratch instead of manipulating the old string "in place". While at it, this PR replaces the many instantiations of large strings with a single `''.join()` operation to connect individual parts.


Patch:
diff --git a/nicegui/elements/codemirror.py b/nicegui/elements/codemirror.py
index 47c4f146..03daeffd 100644
--- a/nicegui/elements/codemirror.py
+++ b/nicegui/elements/codemirror.py
@@ -1,6 +1,6 @@
-from itertools import zip_longest
+from itertools import accumulate, zip_longest
 from pathlib import Path
-from typing import List, Literal, Optional, Tuple, cast, get_args
+from typing import List, Literal, Optional, get_args
 
 from nicegui.elements.mixins.disableable_element import DisableableElement
 from nicegui.elements.mixins.value_element import ValueElement
@@ -338,12 +338,12 @@ class CodeMirror(ValueElement, DisableableElement, component='codemirror.js', de
 
 def _apply_change_set(doc, sections: List[int], inserted: List[List[str]]) -> str:
     # based on https://github.com/codemirror/state/blob/main/src/change.ts
-    assert sum(sections[::2]) == len(doc), 'Cannot apply change set to document due to length mismatch'
-    pos = 0
+    old_lengths = sections[::2]
+    new_lengths = sections[1::2]
+    end_positions = accumulate(old_lengths)
     joined_inserts = ('\n'.join(ins) for ins in inserted)
-    for section in zip_longest(sections[::2], sections[1::2], joined_inserts, fillvalue=''):
-        old_len, new_len, ins = cast(Tuple[int, int, str], section)
-        if new_len >= 0:
-            doc = doc[:pos] + ins + doc[pos + old_len:]
-        pos += old_len
-    return doc
+    assert sum(old_lengths) == len(doc), 'Cannot apply change set to document due to length mismatch'
+    return ''.join(
+        doc[pos-old_len:pos] if new_len == -1 else ins  # type: ignore
+        for pos, old_len, new_len, ins in zip_longest(end_positions, old_lengths, new_lengths, joined_inserts, fillvalue='')
+    )


Test patch:
diff --git a/tests/test_codemirror.py b/tests/test_codemirror.py
index 97d7ba8d..64f5eac9 100644
--- a/tests/test_codemirror.py
+++ b/tests/test_codemirror.py
@@ -42,3 +42,4 @@ def test_change_set():
     assert _apply_change_set('X', [1, -1, 0, 1], [[], ['Y']]) == 'XY'
     assert _apply_change_set('Hello', [5, -1, 0, 8], [[], [', world!']]) == 'Hello, world!'
     assert _apply_change_set('Hello, world!', [5, -1, 7, 0, 1, -1], []) == 'Hello!'
+    assert _apply_change_set('Hello, hello!', [2, -1, 3, 1, 4, -1, 3, 1, 1, -1], [[], ['y'], [], ['y']]) == 'Hey, hey!'
Repository: api-platform/admin
Pull request #59 (2017-10-03 14:47:19)

Each element in a response of a GET_MANY request had a 'data' key 
| Q             | A
| ------------- | ---
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets |
| License       | MIT
| Doc PR        |

Before a request like this:
`GET_MANY books`
```json
{
  "ids": ["books/1","books/3"]
}
```
was returning:
```json
{
  "data": [
    {"data": {"@id": "books/1", "id": "books/1"}},
    {"data": {"@id": "books/3", "id": "books/3"}},
  ]
}
```
But it should return:
```json
{
  "data": [
    {"@id": "books/1", "id": "books/1"},
    {"@id": "books/3", "id": "books/3"},
  ]
}
```

The fields were not correctly interpreted by admin-on-rest.


Patch:
diff --git a/src/hydra/hydraClient.js b/src/hydra/hydraClient.js
index ce5b384..5ab2903 100644
--- a/src/hydra/hydraClient.js
+++ b/src/hydra/hydraClient.js
@@ -242,7 +242,7 @@ export default ({entrypoint, resources = []}, httpClient = fetchHydra) => {
     if (GET_MANY === type) {
       return Promise.all(
         params.ids.map(id => fetchApi(GET_ONE, resource, {id})),
-      ).then(responses => ({data: responses}));
+      ).then(responses => ({data: responses.map(response => response.data)}));
     }
 
     return convertAORRequestToHydraRequest(type, resource, params)


Test patch:
diff --git a/src/hydra/hydraClient.test.js b/src/hydra/hydraClient.test.js
index 197b443..23013ff 100644
--- a/src/hydra/hydraClient.test.js
+++ b/src/hydra/hydraClient.test.js
@@ -1,4 +1,5 @@
-import {transformJsonLdDocumentToAORDocument} from './hydraClient';
+import hydraClient, {transformJsonLdDocumentToAORDocument} from './hydraClient';
+import {GET_MANY} from 'admin-on-rest';
 
 describe('map a json-ld document to an admin on rest compatible document', () => {
   const jsonLdDocument = {
@@ -73,3 +74,19 @@ describe('map a json-ld document to an admin on rest compatible document', () =>
     });
   });
 });
+
+describe('fetch data from an hydra api', () => {
+  test('fetch a get_many resource', async () => {
+    const mockHttpClient = jest.fn();
+    mockHttpClient
+      .mockReturnValueOnce(Promise.resolve({json: {'@id': 'books/3'}}))
+      .mockReturnValue(Promise.resolve({json: {'@id': 'books/5'}}));
+
+    await hydraClient({entrypoint: '/'}, mockHttpClient)(GET_MANY, 'books', {
+      ids: [3, 5],
+    }).then(response => {
+      expect(response.data[0].id).toEqual('books/3');
+      expect(response.data[1].id).toEqual('books/5');
+    });
+  });
+});
Repository: api-platform/admin
Pull request #137 (2018-11-26 09:20:10)

Add icon props to Resource + Test

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #127
| License       | MIT
| Doc PR        | api-platform/doc#674

Now custom icons can be defined in the admin component of the api-platform


Patch:
diff --git a/src/resourceFactory.js b/src/resourceFactory.js
index 9783be1..2f0d370 100644
--- a/src/resourceFactory.js
+++ b/src/resourceFactory.js
@@ -16,6 +16,7 @@ export default (
     create = Create,
     edit = Edit,
     list = List,
+    icon,
     name,
     props,
     show = Show,
@@ -28,6 +29,7 @@ export default (
       key={name}
       list={list}
       name={name}
+      icon={icon}
       options={{
         api,
         fieldFactory,


Test patch:
diff --git a/src/resourceFactory.test.js b/src/resourceFactory.test.js
index 9460fc4..68f768d 100644
--- a/src/resourceFactory.test.js
+++ b/src/resourceFactory.test.js
@@ -35,6 +35,10 @@ describe('makes Resource component', () => {
       expect(resourceComponent.props.name).toEqual(resource.name);
     });
 
+    test('have proper icon prop set', () => {
+      expect(resourceComponent.props.icon).toEqual(resource.icon);
+    });
+
     test('have default actions: create, edit, list, show set', () => {
       expect(resourceComponent.props.create).toBeInstanceOf(Function);
       expect(resourceComponent.props.edit).toBeInstanceOf(Function);
@@ -89,6 +93,21 @@ describe('makes Resource component', () => {
       expect(resourceComponent.props.create).toEqual(customCreate);
     });
 
+    test('have custom icon action', () => {
+      const customIcon = jest.fn();
+      const resourceComponent = resourceFactory(
+        Object.assign({}, resource, {
+          icon: customIcon,
+        }),
+        api,
+        fieldFactory,
+        inputFactory,
+        parameterFactory,
+      );
+
+      expect(resourceComponent.props.icon).toEqual(customIcon);
+    });
+
     test('have custom list action', () => {
       const customList = jest.fn();
       const resourceComponent = resourceFactory(
Repository: softlayer/softlayer-python
Pull request #497 (2015-03-02 22:25:52)

Fix server cost reporting
Update server manager and CLI to properly show the recurring cost of
the server


Patch:
diff --git a/SoftLayer/CLI/server/detail.py b/SoftLayer/CLI/server/detail.py
index 78d03dec..61eeb43e 100644
--- a/SoftLayer/CLI/server/detail.py
+++ b/SoftLayer/CLI/server/detail.py
@@ -80,7 +80,9 @@ def cli(env, identifier, passwords, price):
 
     if price:
         table.add_row(['price rate',
-                       result['billingItem']['recurringFee']])
+                       utils.lookup(result,
+                                    'billingItem',
+                                    'nextInvoiceTotalRecurringAmount')])
 
     if passwords:
         pass_table = formatting.Table(['username', 'password'])
diff --git a/SoftLayer/managers/hardware.py b/SoftLayer/managers/hardware.py
index 97769857..434890e2 100644
--- a/SoftLayer/managers/hardware.py
+++ b/SoftLayer/managers/hardware.py
@@ -288,7 +288,7 @@ def get_hardware(self, hardware_id, **kwargs):
                                                         version,
                                                         referenceCode]],
                     passwords[username,password]]''',
-                'billingItem.recurringFee',
+                'billingItem.nextInvoiceTotalRecurringAmount',
                 'hourlyBillingFlag',
                 'tagReferences[id,tag[name,id]]',
                 'networkVlans[id,vlanNumber,networkSpace]',


Test patch:
diff --git a/SoftLayer/testing/fixtures/SoftLayer_Hardware_Server.py b/SoftLayer/testing/fixtures/SoftLayer_Hardware_Server.py
index 9fda2844..646b4776 100644
--- a/SoftLayer/testing/fixtures/SoftLayer_Hardware_Server.py
+++ b/SoftLayer/testing/fixtures/SoftLayer_Hardware_Server.py
@@ -6,6 +6,7 @@
     'billingItem': {
         'id': 6327,
         'recurringFee': 1.54,
+        'nextInvoiceTotalRecurringAmount': 16.08,
         'orderItem': {
             'order': {
                 'userRecord': {
diff --git a/SoftLayer/tests/CLI/modules/server_tests.py b/SoftLayer/tests/CLI/modules/server_tests.py
index ee571000..675fae24 100644
--- a/SoftLayer/tests/CLI/modules/server_tests.py
+++ b/SoftLayer/tests/CLI/modules/server_tests.py
@@ -116,7 +116,7 @@ def test_server_details(self):
             'notes': 'These are test notes.',
             'os': 'Ubuntu',
             'owner': 'chechu',
-            'price rate': 1.54,
+            'price rate': 16.08,
             'private_ip': '10.1.0.2',
             'ptr': '2.0.1.10.in-addr.arpa',
             'public_ip': '172.16.1.100',
Repository: softlayer/softlayer-python
Pull request #498 (2015-03-04 22:53:21)

Update RestTransport to honor verify and cert settings


Patch:
diff --git a/SoftLayer/transports.py b/SoftLayer/transports.py
index 86307354..cd8f91d8 100644
--- a/SoftLayer/transports.py
+++ b/SoftLayer/transports.py
@@ -176,6 +176,8 @@ def __call__(self, request):
             resp = requests.request('GET', url,
                                     headers=request.transport_headers,
                                     timeout=request.timeout,
+                                    verify=request.verify,
+                                    cert=request.cert,
                                     proxies=_proxies_dict(request.proxy))
             LOGGER.debug("=== RESPONSE ===")
             LOGGER.debug(resp.headers)


Test patch:
diff --git a/SoftLayer/tests/transport_tests.py b/SoftLayer/tests/transport_tests.py
index b37e70b4..29b9a7e7 100644
--- a/SoftLayer/tests/transport_tests.py
+++ b/SoftLayer/tests/transport_tests.py
@@ -262,6 +262,8 @@ def test_basic(self, request):
         request.assert_called_with(
             'GET', 'http://something.com/SoftLayer_Service/Resource.json',
             headers={},
+            verify=True,
+            cert=None,
             proxies=None,
             timeout=None)
 
@@ -305,6 +307,8 @@ def test_valid_proxy(self, request):
             'GET', 'http://something.com/SoftLayer_Service/Resource.json',
             proxies={'https': 'http://localhost:3128',
                      'http': 'http://localhost:3128'},
+            verify=True,
+            cert=None,
             timeout=mock.ANY,
             headers=mock.ANY)
 
@@ -325,6 +329,8 @@ def test_with_id(self, request):
             'GET',
             'http://something.com/SoftLayer_Service/getObject/2.json',
             headers={},
+            verify=True,
+            cert=None,
             proxies=None,
             timeout=None)
Repository: softlayer/softlayer-python
Pull request #544 (2015-05-05 02:52:07)

Ignore CD devices when capturing


Patch:
diff --git a/SoftLayer/managers/vs.py b/SoftLayer/managers/vs.py
index 5739ebc5..c7f9fbcf 100644
--- a/SoftLayer/managers/vs.py
+++ b/SoftLayer/managers/vs.py
@@ -581,9 +581,10 @@ def capture(self, instance_id, name, additional_disks=False, notes=None):
         vsi = self.get_instance(instance_id)
 
         disk_filter = lambda x: x['device'] == '0'
-        # Disk 1 is swap partition.  Need to skip its capture.
+        # Skip disk 1 (swap partition) and CD mounts
         if additional_disks:
-            disk_filter = lambda x: x['device'] != '1'
+            disk_filter = lambda x: (str(x['device']) != '1' and
+                                     x['mountType'] != 'CD')
 
         disks = [block_device for block_device in vsi['blockDevices']
                  if disk_filter(block_device)]


Test patch:
diff --git a/SoftLayer/testing/fixtures/SoftLayer_Virtual_Guest.py b/SoftLayer/testing/fixtures/SoftLayer_Virtual_Guest.py
index 1235a3b6..43800962 100644
--- a/SoftLayer/testing/fixtures/SoftLayer_Virtual_Guest.py
+++ b/SoftLayer/testing/fixtures/SoftLayer_Virtual_Guest.py
@@ -26,9 +26,10 @@
     "primaryNetworkComponent": {"speed": 10, "maxSpeed": 100},
     'hourlyBillingFlag': False,
     'createDate': '2013-08-01 15:23:45',
-    'blockDevices': [{"device": 0, "uuid": 1},
-                     {"device": 1},
-                     {"device": 2, "uuid": 2}],
+    'blockDevices': [{"device": 0, 'mountType': 'Disk', "uuid": 1},
+                     {"device": 1, 'mountType': 'Disk'},
+                     {"device": 2, 'mountType': 'CD'},
+                     {"device": 3, 'mountType': 'Disk', "uuid": 3}],
     'notes': 'notes',
     'networkVlans': [{'networkSpace': 'PUBLIC',
                       'vlanNumber': 23,
diff --git a/SoftLayer/tests/managers/vs_tests.py b/SoftLayer/tests/managers/vs_tests.py
index 71b71c02..3a179b46 100644
--- a/SoftLayer/tests/managers/vs_tests.py
+++ b/SoftLayer/tests/managers/vs_tests.py
@@ -610,9 +610,8 @@ def test_capture_additional_disks(self):
 
         expected = fixtures.SoftLayer_Virtual_Guest.createArchiveTransaction
         self.assertEqual(result, expected)
-        args = ('a', [{'device': 0, 'uuid': 1},
-                      {'device': 1},
-                      {'device': 2, 'uuid': 2}], None)
+        args = ('a', [{'device': 0, 'mountType': 'Disk', 'uuid': 1},
+                      {'device': 3, 'mountType': 'Disk', 'uuid': 3}], None)
         self.assert_called_with('SoftLayer_Virtual_Guest',
                                 'createArchiveTransaction',
                                 args=args,
Repository: softlayer/softlayer-python
Pull request #589 (2015-07-28 20:28:53)

Better comforms to click.MultiCommand.get_command
Usually click.MultiCommand.get_command will return None when the command is not found. In slcli, this is handled by raising an exception. Since click handles this condition for us, there's no reason it should be done here.

Removes SoftLayer.CLI.InvalidCommand and its single reference


Patch:
diff --git a/SoftLayer/CLI/environment.py b/SoftLayer/CLI/environment.py
index ab3d1dbe..5965f012 100644
--- a/SoftLayer/CLI/environment.py
+++ b/SoftLayer/CLI/environment.py
@@ -7,7 +7,6 @@
 """
 import importlib
 
-from SoftLayer.CLI import exceptions
 from SoftLayer.CLI import formatting
 from SoftLayer.CLI import routes
 
@@ -68,7 +67,7 @@ def list_commands(self, *path):
                     len(path) == command.count(":")]):
 
                 # offset is used to exclude the path that the caller requested.
-                offset = len(path_str)+1 if path_str else 0
+                offset = len(path_str) + 1 if path_str else 0
                 commands.append(command[offset:])
 
         return sorted(commands)
@@ -80,7 +79,7 @@ def get_command(self, *path):
         if path_str in self.commands:
             return self.commands[path_str].load()
 
-        raise exceptions.InvalidCommand(path)
+        return None
 
     def resolve_alias(self, path_str):
         """Returns the actual command name. Uses the alias mapping."""
diff --git a/SoftLayer/CLI/exceptions.py b/SoftLayer/CLI/exceptions.py
index 37882326..8f5917f5 100644
--- a/SoftLayer/CLI/exceptions.py
+++ b/SoftLayer/CLI/exceptions.py
@@ -6,8 +6,6 @@
     :license: MIT, see LICENSE for more details.
 """
 
-import SoftLayer
-
 
 class CLIHalt(SystemExit):
     """Smoothly halt the execution of the command. No error."""
@@ -34,10 +32,3 @@ class ArgumentError(CLIAbort):
     def __init__(self, msg, *args):
         super(ArgumentError, self).__init__(msg, *args)
         self.message = "Argument Error: %s" % msg
-
-
-class InvalidCommand(SoftLayer.SoftLayerError):
-    """Raised when trying to use a command that does not exist."""
-    def __init__(self, path, *args):
-        msg = 'Invalid command: "%s"' % ' '.join(path)
-        SoftLayer.SoftLayerError.__init__(self, msg, *args)


Test patch:
diff --git a/SoftLayer/tests/CLI/environment_tests.py b/SoftLayer/tests/CLI/environment_tests.py
index b3826df8..3d1f2cc7 100644
--- a/SoftLayer/tests/CLI/environment_tests.py
+++ b/SoftLayer/tests/CLI/environment_tests.py
@@ -9,7 +9,6 @@
 import mock
 
 from SoftLayer.CLI import environment
-from SoftLayer.CLI import exceptions
 from SoftLayer import testing
 
 
@@ -30,8 +29,8 @@ def test_list_commands(self):
         self.assertIn('dns', actions)
 
     def test_get_command_invalid(self):
-        self.assertRaises(exceptions.InvalidCommand,
-                          self.env.get_command, 'invalid', 'command')
+        cmd = self.env.get_command('invalid', 'command')
+        self.assertEqual(cmd, None)
 
     def test_get_command(self):
         mod_path = 'SoftLayer.tests.CLI.environment_tests'