Repository: Azure/azure-cli

Issue:
CLI inconsistency -- to specify a parameters file, one must not use equal sign
If you use an equal sign between --parameters and the actual file path, you end up with the following:

```
az resource group deployment create --resource-group=jmsdcosrg --template-file=./output/azuredeploy.json --parameters="@./output/azuredeploy.parameters.json"
No JSON object could be decoded
```

Removing the equal sign works:

```
az resource group deployment create --resource-group=jmsdcosrg --template-file=./output/azuredeploy.json --parameters "@./output/azuredeploy.parameters.json"
```

Discussion:
mention-bot: @brendandburns, thanks for your PR! By analyzing the history of the files in this pull request, we identified @yugangw-msft, @tjprescott and @derekbekoe to be potential reviewers.
tjprescott: @brendandburns this issue applies more generally to the CLI. See issue #1419. I think it can fixed more generally by making a change here: https://github.com/Azure/azure-cli/blob/master/src/azure-cli-core/azure/cli/core/application.py#L200

In addition to startswith('@') we can probably have something like `or '=@' in ...`. 
derekbekoe: Can we not make use of this?
https://docs.python.org/3/library/argparse.html#fromfile-prefix-chars

cc @tjprescott @johanste
brendandburns: @tjprescott thanks for the tip, I moved the code to that location (and I added unit tests too as a bonus!)

please take another look.

Thanks!
--brendan
tjprescott: @derekbekoe 

>  then arguments that start with any of the specified characters will be treated as files, and will be replaced by the arguments they contain

This problem is that with `foo=@bar`, the @ is in the middle of the string. 
brendandburns: @tjprescott fixed (and added tests to cover it) please take another look.

Thanks
--brendan

Patch:
diff --git a/src/azure-cli-core/azure/cli/core/application.py b/src/azure-cli-core/azure/cli/core/application.py
index 0bc115f74..caab463a1 100644
--- a/src/azure-cli-core/azure/cli/core/application.py
+++ b/src/azure-cli-core/azure/cli/core/application.py
@@ -6,6 +6,7 @@
 from collections import defaultdict
 import sys
 import os
+import re
 import uuid
 import argparse
 from azure.cli.core.parser import AzCliCommandParser, enable_autocomplete
@@ -196,10 +197,24 @@ class Application(object):
         global_group.add_argument('--debug', dest='_log_verbosity_debug', action='store_true',
                                   help='Increase logging verbosity to show all debug logs.')
 
+    @staticmethod
+    def _maybe_load_file(arg):
+        ix = arg.find('@')
+        if ix == -1:
+            return arg
+
+        if ix == 0:
+            return Application._load_file(arg[1:])
+
+        res = re.match('(\\-\\-?[a-zA-Z0-9]+[\\-a-zA-Z0-9]*\\=)\\"?@([^\\"]*)\\"?', arg)
+        if not res:
+            return arg
+        return res.group(1) + Application._load_file(res.group(2))
+
     @staticmethod
     def _expand_file_prefixed_files(argv):
         return list(
-            [Application._load_file(arg[1:]) if arg.startswith('@') else arg for arg in argv]
+            [Application._maybe_load_file(arg) for arg in argv]
             )
 
     @staticmethod
diff --git a/src/command_modules/azure-cli-appservice/azure/cli/command_modules/appservice/_params.py b/src/command_modules/azure-cli-appservice/azure/cli/command_modules/appservice/_params.py
index 6a50031c7..2d3464686 100644
--- a/src/command_modules/azure-cli-appservice/azure/cli/command_modules/appservice/_params.py
+++ b/src/command_modules/azure-cli-appservice/azure/cli/command_modules/appservice/_params.py
@@ -53,7 +53,7 @@ register_cli_argument('appservice plan', 'admin_site_name', help='The name of th
 register_cli_argument('appservice web', 'slot', help="the name of the slot. Default to the productions slot if not specified")
 register_cli_argument('appservice web', 'name', arg_type=name_arg_type, completer=get_resource_name_completion_list('Microsoft.Web/sites'), id_part='name', help='name of the web')
 register_cli_argument('appservice web create', 'name', options_list=('--name', '-n'), help='name of the new webapp')
-register_cli_argument('appservice web create', 'plan', options_list=('--plan',), completer=get_resource_name_completion_list('Microsoft.Web/serverFarms'),
+register_cli_argument('appservice web create', 'plan', options_list=('--plan', '-p'), completer=get_resource_name_completion_list('Microsoft.Web/serverFarms'),
                       help="name or resource id of the app service plan. Use 'appservice plan create' to get one")
 
 register_cli_argument('appservice web deployment user', 'user_name', help='user name')


Test patch:
diff --git a/src/azure-cli-core/azure/cli/core/tests/test_application.py b/src/azure-cli-core/azure/cli/core/tests/test_application.py
index aef479668..252fd558a 100644
--- a/src/azure-cli-core/azure/cli/core/tests/test_application.py
+++ b/src/azure-cli-core/azure/cli/core/tests/test_application.py
@@ -5,10 +5,14 @@
 
 import unittest
 
+import os
+import tempfile
+
 from six import StringIO
 
 from azure.cli.core.application import Application, Configuration, IterateAction
 from azure.cli.core.commands import CliCommand
+from azure.cli.core._util import CLIError
 
 class TestApplication(unittest.TestCase):
 
@@ -80,5 +84,32 @@ class TestApplication(unittest.TestCase):
         self.assertEqual(hellos[1]['hello'], 'sir')
         self.assertEqual(hellos[1]['something'], 'else')
 
+    def test_expand_file_prefixed_files(self):
+        f = tempfile.NamedTemporaryFile(delete=False)
+        f.close()
+
+        with open(f.name, 'w+') as stream:
+            stream.write('foo')
+
+        cases = [
+            [['--bar=baz'], ['--bar=baz']],
+            [['--bar', 'baz'], ['--bar', 'baz']],
+            [['--bar=@{}'.format(f.name)], ['--bar=foo']],
+            [['--bar', '@{}'.format(f.name)], ['--bar', 'foo']],
+            [['--bar', f.name], ['--bar', f.name]],
+            [['--bar="@{}"'.format(f.name)], ['--bar=foo']],
+            [['--bar=name@company.com'], ['--bar=name@company.com']],
+            [['--bar', 'name@company.com'], ['--bar', 'name@company.com']],
+        ]
+
+        for test_case in cases:
+            try:
+                args = Application._expand_file_prefixed_files(test_case[0]) #pylint: disable=protected-access
+                self.assertEqual(args, test_case[1], 'Failed for: {}'.format(test_case[0]))
+            except CLIError as ex:
+                self.fail('Unexpected error for {} ({}): {}'.format(test_case[0], args, ex))
+
+        os.remove(f.name)
+
 if __name__ == '__main__':
     unittest.main()