Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-phabricator for 
openSUSE:Factory checked in at 2021-06-02 22:11:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-phabricator (Old)
 and      /work/SRC/openSUSE:Factory/.python-phabricator.new.1898 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-phabricator"

Wed Jun  2 22:11:22 2021 rev:2 rq:896591 version:0.8.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-phabricator/python-phabricator.changes    
2019-05-12 11:34:30.178063879 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-phabricator.new.1898/python-phabricator.changes
  2021-06-02 22:11:42.516134741 +0200
@@ -1,0 +2,15 @@
+Tue Jun  1 07:51:34 UTC 2021 - [email protected]
+
+- version update to 0.8.1
+  * Fixed bug where built-in interface dict overwrote `interface` 
+    methods from Almanac (`interface.search`, `interface.edit`). 
+    The `Resource` attribute `interface` is renamed `_interface`.
+  * Switch to using requests
+  * Allow library to be used from a zip archive
+  * Deprecated parameters are now set to optional
+  * Fixed bug where instance attribute was shadowing API endpoint
+  * Update interfaces.json
+  * Update README
+- %check: use %pyunittest rpm macro
+
+-------------------------------------------------------------------

Old:
----
  phabricator-0.7.0.tar.gz

New:
----
  phabricator-0.8.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-phabricator.spec ++++++
--- /var/tmp/diff_new_pack.EhOU3S/_old  2021-06-02 22:11:42.972135492 +0200
+++ /var/tmp/diff_new_pack.EhOU3S/_new  2021-06-02 22:11:42.972135492 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-phabricator
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2021 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -12,32 +12,35 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
+#
 
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-phabricator
-Version:        0.7.0
+Version:        0.8.1
 Release:        0
-License:        Apache-2.0
 Summary:        Phabricator API Bindings
-Url:            http://github.com/disqus/python-phabricator
+License:        Apache-2.0
 Group:          Development/Languages/Python
-Source:         
https://files.pythonhosted.org/packages/source/p/phabricator/phabricator-%{version}.tar.gz
-BuildRequires:  python-rpm-macros
-# For tests
-BuildRequires:  %{python_module mock}
+URL:            https://github.com/disqus/python-phabricator
+Source:         
https://github.com/disqus/python-phabricator/archive/refs/tags/%{version}.tar.gz#/phabricator-%{version}.tar.gz
 BuildRequires:  %{python_module setuptools}
+# SECTION test requirements
+BuildRequires:  %{python_module requests >= 2.22}
+BuildRequires:  %{python_module responses >= 0.12}
+# /SECTION
 BuildRequires:  fdupes
+BuildRequires:  python-rpm-macros
+Requires:       python-requests >= 2.22
 BuildArch:      noarch
-
 %python_subpackages
 
 %description
 Phabricator API Bindings
 
 %prep
-%setup -q -n phabricator-%{version}
+%setup -q -n python-phabricator-%{version}
 
 %build
 %python_build
@@ -47,8 +50,7 @@
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 
 %check
-# Tests currently broken
-#%%python_exec setup.py test
+%pyunittest discover -v
 
 %files %{python_files}
 %doc README.rst

++++++ phabricator-0.7.0.tar.gz -> phabricator-0.8.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/.gitignore 
new/python-phabricator-0.8.1/.gitignore
--- old/phabricator-0.7.0/.gitignore    1970-01-01 01:00:00.000000000 +0100
+++ new/python-phabricator-0.8.1/.gitignore     2021-02-23 22:35:45.000000000 
+0100
@@ -0,0 +1,7 @@
+*.pyc
+*.swp
+*.egg
+*.egg-info
+build/
+dist/
+.idea
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/.travis.yml 
new/python-phabricator-0.8.1/.travis.yml
--- old/phabricator-0.7.0/.travis.yml   1970-01-01 01:00:00.000000000 +0100
+++ new/python-phabricator-0.8.1/.travis.yml    2021-02-23 22:35:45.000000000 
+0100
@@ -0,0 +1,13 @@
+language: python
+python:
+- '2.7'
+- '3.5'
+install: pip install .[tests]
+script: python -m phabricator.tests.test_phabricator
+deploy:
+  provider: pypi
+  user: disqus
+  password:
+    secure: 
AJ7zSLd6BgI4W8Kp3KEx5O40bUJA91PkgLTZb5MnCx4/8nUPlkk+LqvodaiiJQEGzpP8COPvRlzJ/swd8d0P38+Se6V83wA43MylimzrgngO6t3c/lXa/aMnrRzSpSfK5QznEMP2zcSU1ReD+2dNr7ATKajbGqTzrCFk/hQPMZ0=
+  on:
+    tags: true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/CHANGES 
new/python-phabricator-0.8.1/CHANGES
--- old/phabricator-0.7.0/CHANGES       1970-01-01 01:00:00.000000000 +0100
+++ new/python-phabricator-0.8.1/CHANGES        2021-02-23 22:35:45.000000000 
+0100
@@ -0,0 +1,44 @@
+0.8.1
+
+* Fixed bug where built-in interface dict overwrote `interface` methods from 
Almanac (`interface.search`, `interface.edit`). The `Resource` attribute 
`interface` is renamed `_interface`.
+
+0.8.0
+
+* Switch to using requests
+* Allow library to be used from a zip archive
+* Deprecated parameters are now set to optional
+* Fixed bug where instance attribute was shadowing API endpoint
+* Update interfaces.json
+* Update README
+
+0.7.0
+
+* Allow for nested methods to support conduit calls such as 
diffusion.repository.edit
+* Fix regular expressions that cause type parsing to fail
+
+0.6.1
+
+* Fix Python 3 related issues
+
+0.6.0
+
+* Python 3 support
+* Fix "not JSON serializable" error when not using a token
+* Better tests
+* Updated interfaces
+* Moved `conduit` to `_conduit` so `.conduit` API is available now
+* Updated interfaces to the latest Phabricator version
+
+0.5.0
+
+* Support new style token-based authentication
+
+0.4.0
+
+* Update interfaces.json to Phab @ e75b389
+* Add Phabricator.update_interfaces to pull latest interfaces from 
conduit.query
+* Fix validation of string to be str or unicode
+
+0.1.0
+
+* Initial release
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/PKG-INFO 
new/python-phabricator-0.8.1/PKG-INFO
--- old/phabricator-0.7.0/PKG-INFO      2016-07-08 17:41:43.000000000 +0200
+++ new/python-phabricator-0.8.1/PKG-INFO       1970-01-01 01:00:00.000000000 
+0100
@@ -1,19 +0,0 @@
-Metadata-Version: 1.1
-Name: phabricator
-Version: 0.7.0
-Summary: Phabricator API Bindings
-Home-page: http://github.com/disqus/python-phabricator
-Author: Disqus
-Author-email: [email protected]
-License: UNKNOWN
-Description: UNKNOWN
-Platform: UNKNOWN
-Classifier: Intended Audience :: Developers
-Classifier: Intended Audience :: System Administrators
-Classifier: Operating System :: OS Independent
-Classifier: Topic :: Software Development
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/README.rst 
new/python-phabricator-0.8.1/README.rst
--- old/phabricator-0.7.0/README.rst    2016-07-08 17:41:35.000000000 +0200
+++ new/python-phabricator-0.8.1/README.rst     2021-02-23 22:35:45.000000000 
+0100
@@ -20,6 +20,10 @@
     phab = Phabricator()  # This will use your ~/.arcrc file
     phab.user.whoami()
 
+You can also use::
+
+    phab = Phabricator(host='https://my-phabricator.org/api/', 
token='api-mytoken')
+    
 Parameters are passed as keyword arguments to the resource call::
 
     phab.user.find(aliases=["sugarc0de"])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/phabricator/__init__.py 
new/python-phabricator-0.8.1/phabricator/__init__.py
--- old/phabricator-0.7.0/phabricator/__init__.py       2016-07-08 
17:41:35.000000000 +0200
+++ new/python-phabricator-0.8.1/phabricator/__init__.py        2021-02-23 
22:35:45.000000000 +0100
@@ -21,10 +21,12 @@
 import os.path
 import re
 import socket
+import pkgutil
 import time
+import requests
 
 from ._compat import (
-    MutableMapping, iteritems, string_types, httplib, urlparse, urlencode,
+    MutableMapping, iteritems, string_types, urlencode,
 )
 
 
@@ -37,8 +39,9 @@
 
 # Default Phabricator interfaces
 INTERFACES = {}
-with open(os.path.join(os.path.dirname(__file__), 'interfaces.json')) as fobj:
-    INTERFACES = json.load(fobj)
+INTERFACES = json.loads(
+    pkgutil.get_data(__name__, 'interfaces.json')
+    .decode('utf-8'))
 
 
 # Load arc config
@@ -170,6 +173,8 @@
                     param_type = 'string'
                 elif info_piece == 'nonempty':
                     optionality = 'required'
+                elif info_piece == 'deprecated':
+                    optionality = 'optional'
                 else:
                     param_type = info_piece
 
@@ -219,7 +224,7 @@
 class Resource(object):
     def __init__(self, api, interface=None, endpoint=None, method=None, 
nested=False):
         self.api = api
-        self.interface = interface or 
copy.deepcopy(parse_interfaces(INTERFACES))
+        self._interface = interface or 
copy.deepcopy(parse_interfaces(INTERFACES))
         self.endpoint = endpoint
         self.method = method
         self.nested = nested
@@ -227,7 +232,7 @@
     def __getattr__(self, attr):
         if attr in getattr(self, '__dict__'):
             return getattr(self, attr)
-        interface = self.interface
+        interface = self._interface
         if self.nested:
             attr = "%s.%s" % (self.endpoint, attr)
         submethod_exists = False
@@ -249,7 +254,7 @@
 
     def _request(self, **kwargs):
         # Check for missing variables
-        resource = self.interface
+        resource = self._interface
 
         def validate_kwarg(key, target):
             # Always allow list
@@ -286,41 +291,28 @@
             self.api.connect()
             kwargs['__conduit__'] = self.api._conduit
 
-        url = urlparse.urlparse(self.api.host)
-        if url.scheme == 'https':
-            conn = httplib.HTTPSConnection(url.netloc, 
timeout=self.api.timeout)
-        else:
-            conn = httplib.HTTPConnection(url.netloc, timeout=self.api.timeout)
-
-        path = url.path + '%s.%s' % (self.method, self.endpoint)
 
         headers = {
             'User-Agent': 'python-phabricator/%s' % 
str(self.api.clientVersion),
             'Content-Type': 'application/x-www-form-urlencoded'
         }
 
-        body = urlencode({
+        body = {
             "params": json.dumps(kwargs),
             "output": self.api.response_format
-        })
+        }
 
         # TODO: Use HTTP "method" from interfaces.json
-        conn.request('POST', path, body, headers)
-        response = conn.getresponse()
+        path = '%s%s.%s' % (self.api.host, self.method, self.endpoint)
+        response = requests.post(path, data=body, headers=headers, 
timeout=self.api.timeout)
 
         # Make sure we got a 2xx response indicating success
-        if not response.status >= 200 or not response.status < 300:
-            raise httplib.HTTPException(
-                'Bad response status: {0}'.format(response.status)
+        if not response.status_code >= 200 or not response.status_code < 300:
+            raise requests.exceptions.HTTPError(
+                'Bad response status: {0}'.format(response.status_code)
             )
 
-        response_data = response.read()
-        if isinstance(response_data, str):
-            response = response_data
-        else:
-            response = response_data.decode("utf-8")
-
-        data = self._parse_response(response)
+        data = self._parse_response(response.text)
 
         return Result(data['result'])
 
@@ -351,9 +343,9 @@
             raise ConfigurationError("No host found or provided.")
 
         current_host_config = defined_hosts.get(self.host, {})
-        self.token = token if token else current_host_config.get('token')
+        self.conduit_token = token if token else 
current_host_config.get('token')
 
-        if self.token is None:
+        if self.conduit_token is None:
             self.username = username if username else 
current_host_config.get('user')
             self.certificate = certificate if certificate else 
current_host_config.get('cert')
 
@@ -364,15 +356,15 @@
         self.clientDescription = socket.gethostname() + ':python-phabricator'
         self._conduit = None
 
-        super(Phabricator, self).__init__(self)
+        super(Phabricator, self).__init__(self, **kwargs)
 
     def _request(self, **kwargs):
         raise SyntaxError('You cannot call the Conduit API without a 
resource.')
 
     def connect(self):
-        if self.token:
+        if self.conduit_token:
             self._conduit = {
-                'token': self.token
+                'token': self.conduit_token
             }
             return
 
@@ -399,4 +391,4 @@
 
         interfaces = query()
 
-        self.interface = parse_interfaces(interfaces)
+        self._interface = parse_interfaces(interfaces)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/phabricator/_compat.py 
new/python-phabricator-0.8.1/phabricator/_compat.py
--- old/phabricator-0.7.0/phabricator/_compat.py        2016-07-08 
17:41:35.000000000 +0200
+++ new/python-phabricator-0.8.1/phabricator/_compat.py 2021-02-23 
22:35:45.000000000 +0100
@@ -8,16 +8,6 @@
     from collections import MutableMapping
 
 try:
-    import httplib
-except ImportError:
-    import http.client as httplib
-
-try:
-    import urlparse
-except ImportError:
-    import urllib.parse as urlparse
-
-try:
     from urllib import urlencode
 except ImportError:
     from urllib.parse import urlencode
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/phabricator/interfaces.json 
new/python-phabricator-0.8.1/phabricator/interfaces.json
--- old/phabricator-0.7.0/phabricator/interfaces.json   2016-07-08 
17:41:35.000000000 +0200
+++ new/python-phabricator-0.8.1/phabricator/interfaces.json    2021-02-23 
22:35:45.000000000 +0100
@@ -1 +1 @@
-{"almanac.device.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"almanac.service.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]*
 *.","params":{"queryKey":"optional string","constraints":"optional 
map\u003cstring, wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"audit.query":{"description":"Query audit 
requests.","params":{"auditorPHIDs":"optional 
list\u003cphid\u003e","commitPHIDs":"optional 
list\u003cphid\u003e","status":"optional 
string-constant\u003c\"audit-status-any\", \"audit-status-open\", 
\"audit-status-concern\", \"audit-status-accepted\", 
\"audit-status-partial\"\u003e (default = 
\"audit-status-any\")","offset":"optional int","limit":"optional int (default = 
100)"},"return":"list\u003cdict\u003e"},"auth.logout":{"description":"Terminate 
all web login sessions. If called via OAuth, also terminate the current OAuth 
token.\n\nWARNING: This method does what it claims on the label. If you call 
this method via the test console in the
  web UI, it will log you 
out!","params":[],"return":"void"},"auth.querypublickeys":{"description":"Query 
public keys.","params":{"ids":"optional list\u003cid\u003e","phids":"optional 
list\u003cphid\u003e","objectPHIDs":"optional 
list\u003cphid\u003e","keys":"optional 
list\u003cstring\u003e","before":"optional string","after":"optional 
string","limit":"optional int (default = 
100)"},"return":"result-set"},"badges.edit":{"description":"This is a standard 
**ApplicationEditor** method which allows you to create and modify objects by 
applying transactions. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"badges.search":{"description":"This is a standard 
**ApplicationSearch** method w
 hich will let you list, query, or search for objects. For documentation on 
these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"conduit.connect":{"description":"Connect a session-based 
client.","params":{"client":"required string","clientVersion":"required 
int","clientDescription":"optional string","user":"optional 
string","authToken":"optional int","authSignature":"optional 
string","host":"deprecated"},"return":"dict\u003cstring, 
any\u003e"},"conduit.getcapabilities":{"description":"List capabilities, wire 
formats, and authentication protocols available o
 n this server.","params":[],"return":"dict\u003cstring, 
any\u003e"},"conduit.getcertificate":{"description":"Retrieve certificate 
information for a user.","params":{"token":"required string","host":"required 
string"},"return":"dict\u003cstring, 
any\u003e"},"conduit.ping":{"description":"Basic ping for monitoring or a 
health-check.","params":[],"return":"string"},"conduit.query":{"description":"Returns
 the parameters of the Conduit 
methods.","params":[],"return":"dict\u003cdict\u003e"},"conpherence.createthread":{"description":"Create
 a new conpherence thread.","params":{"title":"optional 
string","message":"required string","participantPHIDs":"required 
list\u003cphids\u003e"},"return":"nonempty 
dict"},"conpherence.querythread":{"description":"Query for Conpherence threads 
for the logged in user. You can query by IDs or PHIDs for specific Conpherence 
threads. Otherwise, specify limit and offset to query the most recently updated 
Conpherences for the logged in user.","params":{"ids":"o
 ptional array\u003cint\u003e","phids":"optional 
array\u003cphids\u003e","limit":"optional int","offset":"optional 
int"},"return":"nonempty 
dict"},"conpherence.querytransaction":{"description":"Query for transactions 
for the logged in user within a specific Conpherence room. You can specify the 
room by ID or PHID. Otherwise, specify limit and offset to query the most 
recent transactions within the Conpherence room for the logged in 
user.","params":{"roomID":"optional int","roomPHID":"optional 
phid","limit":"optional int","offset":"optional int"},"return":"nonempty 
dict"},"conpherence.updatethread":{"description":"Update an existing 
conpherence room.","params":{"id":"optional int","phid":"optional 
phid","title":"optional string","message":"optional 
string","addParticipantPHIDs":"optional 
list\u003cphids\u003e","removeParticipantPHID":"optional 
phid"},"return":"bool"},"dashboard.panel.edit":{"description":"This is a 
standard **ApplicationEditor** method which allows you to create and m
 odify objects by applying transactions. For documentation on these endpoints, 
see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"differential.close":{"description":"Close a Differential 
revision.","params":{"revisionID":"required 
int"},"return":"void"},"differential.createcomment":{"description":"Add a 
comment to a Differential revision.","params":{"revision_id":"required 
revisionid","message":"optional string","action":"optional 
string","silent":"optional bool","attach_inlines":"optional 
bool"},"return":"nonempty 
dict"},"differential.creatediff":{"description":"Create a new Differential 
diff.","params":{"changes":"required 
list\u003cdict\u003e","sourceMachine":"required string","sourcePath":"required 
string","branch"
 :"required string","bookmark":"optional 
string","sourceControlSystem":"required string-constant\u003c\"svn\", \"git\", 
\"hg\"\u003e","sourceControlPath":"required 
string","sourceControlBaseRevision":"required 
string","creationMethod":"optional string","lintStatus":"required 
string-constant\u003c\"none\", \"skip\", \"okay\", \"warn\", 
\"fail\"\u003e","unitStatus":"required string-constant\u003c\"none\", \"skip\", 
\"okay\", \"warn\", \"fail\"\u003e","repositoryPHID":"optional 
phid","parentRevisionID":"deprecated","authorPHID":"deprecated","repositoryUUID":"deprecated"},"return":"nonempty
 dict"},"differential.createinline":{"description":"Add an inline comment to a 
Differential revision.","params":{"revisionID":"optional 
revisionid","diffID":"optional diffid","filePath":"required 
string","isNewFile":"required bool","lineNumber":"required 
int","lineLength":"optional int","content":"required 
string"},"return":"nonempty 
dict"},"differential.createrawdiff":{"description":"Create a new Diff
 erential diff from a raw diff source.","params":{"diff":"required 
string","repositoryPHID":"optional string","viewPolicy":"optional 
string"},"return":"nonempty 
dict"},"differential.createrevision":{"description":"Create a new Differential 
revision.","params":{"user":"ignored","diffid":"required 
diffid","fields":"required dict"},"return":"nonempty 
dict"},"differential.getcommitmessage":{"description":"Retrieve Differential 
commit messages or message templates.","params":{"revision_id":"optional 
revision_id","fields":"optional dict\u003cstring, wild\u003e","edit":"optional 
string-constant\u003c\"edit\", \"create\"\u003e"},"return":"nonempty 
string"},"differential.getcommitpaths":{"description":"Query which paths should 
be included when committing a Differential 
revision.","params":{"revision_id":"required int"},"return":"nonempty 
list\u003cstring\u003e"},"differential.getrawdiff":{"description":"Retrieve a 
raw diff","params":{"diffID":"required diffID"},"return":"nonempty string"},"di
 fferential.parsecommitmessage":{"description":"Parse commit messages for 
Differential fields.","params":{"corpus":"required string","partial":"optional 
bool"},"return":"nonempty dict"},"differential.query":{"description":"Query 
Differential revisions which match certain 
criteria.","params":{"authors":"optional list\u003cphid\u003e","ccs":"optional 
list\u003cphid\u003e","reviewers":"optional 
list\u003cphid\u003e","paths":"optional list\u003cpair\u003ccallsign, 
path\u003e\u003e","commitHashes":"optional 
list\u003cpair\u003cstring-constant\u003c\"gtcm\", \"gttr\", \"hgcm\"\u003e, 
string\u003e\u003e","status":"optional string-constant\u003c\"status-any\", 
\"status-open\", \"status-accepted\", 
\"status-closed\"\u003e","order":"optional 
string-constant\u003c\"order-modified\", 
\"order-created\"\u003e","limit":"optional uint","offset":"optional 
uint","ids":"optional list\u003cuint\u003e","phids":"optional 
list\u003cphid\u003e","subscribers":"optional 
list\u003cphid\u003e","responsibleUsers
 ":"optional list\u003cphid\u003e","branches":"optional 
list\u003cstring\u003e"},"return":"list\u003cdict\u003e"},"differential.querydiffs":{"description":"Query
 differential diffs which match certain criteria.","params":{"ids":"optional 
list\u003cuint\u003e","revisionIDs":"optional 
list\u003cuint\u003e"},"return":"list\u003cdict\u003e"},"differential.setdiffproperty":{"description":"Attach
 properties to Differential diffs.","params":{"diff_id":"required 
diff_id","name":"required string","data":"required 
string"},"return":"void"},"differential.updaterevision":{"description":"Update 
a Differential revision.","params":{"id":"required 
revisionid","diffid":"required diffid","fields":"required 
dict","message":"required string"},"return":"nonempty 
dict"},"differential.revision.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\
 /find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1 | 
Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"differential.find":{"description":"Query Differential revisions 
which match certain criteria.","params":{"query":"required 
string-constant\u003c\"open\", \"committable\", \"revision-ids\", 
\"phids\"\u003e","guids":"required nonempty 
list\u003cguids\u003e"},"return":"nonempty 
list\u003cdict\u003e"},"differential.getalldiffs":{"description":"Load all 
diffs for given revisions from 
Differential.","params":{"revision_ids":"required 
list\u003cint\u003e"},"return":"dict"},"differential.getdiff":{"description":"Load
 the content of a diff from Differential by revision ID or diff
  ID.","params":{"revision_id":"optional id","diff_id":"optional 
id"},"return":"nonempty dict"},"differential.getrevision":{"description":"Load 
the content of a revision from Differential.","params":{"revision_id":"required 
id"},"return":"nonempty 
dict"},"differential.getrevisioncomments":{"description":"Retrieve Differential 
Revision Comments.","params":{"ids":"required 
list\u003cint\u003e","inlines":"optional bool (deprecated)"},"return":"nonempty 
list\u003cdict\u003cstring, 
wild\u003e\u003e"},"diffusion.findsymbols":{"description":"Retrieve Diffusion 
symbol information.","params":{"name":"optional string","namePrefix":"optional 
string","context":"optional string","language":"optional 
string","type":"optional string","repositoryPHID":"optional 
string"},"return":"nonempty 
list\u003cdict\u003e"},"diffusion.getrecentcommitsbypath":{"description":"Get 
commit identifiers for recent commits affecting a given 
path.","params":{"callsign":"required string","path":"required string","branch":
 "optional string","limit":"optional int"},"return":"nonempty 
list\u003cstring\u003e"},"diffusion.querycommits":{"description":"Retrieve 
information about commits.","params":{"ids":"optional 
list\u003cint\u003e","phids":"optional list\u003cphid\u003e","names":"optional 
list\u003cstring\u003e","repositoryPHID":"optional 
phid","needMessages":"optional bool","bypassCache":"optional 
bool","before":"optional string","after":"optional string","limit":"optional 
int (default = 100)"},"return":"map\u003cstring, 
dict\u003e"},"diffusion.blame":{"description":"Get blame information for a list 
of paths.","params":{"paths":"required 
list\u003cstring\u003e","commit":"required string","timeout":"optional 
int","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional string"},"return":"map\u003cstring, 
wild\u003e"},"diffusion.branchquery":{"description":"Determine what branches 
exist for a repository.","params":{"closed":"optional bool","limit":"optional 
int","offset
 ":"optional int","contains":"optional string","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"list\u003cdict\u003e"},"diffusion.browsequery":{"description":"File(s)
 information for a repository at an (optional) path and (optional) 
commit.","params":{"path":"optional string","commit":"optional 
string","needValidityOnly":"optional bool","limit":"optional 
int","offset":"optional int","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"array"},"diffusion.commitparentsquery":{"description":"Get 
the commit identifiers for a commit's parent or 
parents.","params":{"commit":"required string","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"list\u003cstring\u003e"},"diffusion.diffquery":{"description":"Get
 diff information from a repository for a specific path at an (optional) 
commit.","params":{"path":"required
  string","commit":"optional string","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"array"},"diffusion.existsquery":{"description":"Determine if 
code exists in a version control system.","params":{"commit":"required 
string","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"bool"},"diffusion.filecontentquery":{"description":"Retrieve 
file content from a repository.","params":{"path":"required 
string","commit":"required string","timeout":"optional 
int","byteLimit":"optional int","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"array"},"diffusion.getlintmessages":{"description":"Get lint 
messages for existing code.","params":{"repositoryPHID":"required 
phid","branch":"required string","commit":"optional string","files":"required 
list\u003cstring\u003e"},"return":"list\u003cdict\u003e"},"diffusion.histor
 yquery":{"description":"Returns history information for a repository at a 
specific commit and path.","params":{"commit":"required 
string","path":"required string","offset":"required int","limit":"required 
int","needDirectChanges":"optional bool","needChildChanges":"optional 
bool","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"array"},"diffusion.internal.gitrawdiffquery":{"description":"Internal
 method for getting raw diff information.","params":{"commit":"required 
string","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"string"},"diffusion.lastmodifiedquery":{"description":"Get 
the commits at which paths were last modified.","params":{"paths":"required 
map\u003cstring, string\u003e","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"map\u003cstring, 
string\u003e"},"diffusion.looksoon":{"description":
 "Advises Phabricator to look for new commits in a repository as soon as 
possible. This advice is most useful if you have just pushed new commits to 
that repository.","params":{"callsigns":"optional list\u003cstring\u003e 
(deprecated)","repositories":"optional 
list\u003cstring\u003e","urgency":"optional 
string"},"return":"void"},"diffusion.mergedcommitsquery":{"description":"Merged 
commit information for a specific commit in a 
repository.","params":{"commit":"required string","limit":"optional 
int","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"array"},"diffusion.querypaths":{"description":"Filename 
search on a repository.","params":{"path":"required string","commit":"required 
string","pattern":"optional string","limit":"optional int","offset":"optional 
int","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"list\u003cstring\u003e"},"diffusion.rawdiffquery":{"de
 scription":"Get raw diff information from a repository for a specific commit 
at an (optional) path.","params":{"commit":"required string","path":"optional 
string","timeout":"optional int","byteLimit":"optional 
int","linesOfContext":"optional int","againstCommit":"optional 
string","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"string"},"diffusion.refsquery":{"description":"Query a git 
repository for ref information at a specific 
commit.","params":{"commit":"required string","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"array"},"diffusion.repository.edit":{"description":"This is 
a standard **ApplicationEditor** method which allows you to create and modify 
objects by applying transactions. For documentation on these endpoints, see 
**[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API:
  Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"diffusion.repository.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"diffusion.resolverefs":{"description":"Resolve references into 
stable, canonical identifiers.","params":{"refs":"required 
list\u003cstring\u003e","types"
 :"optional list\u003cstring\u003e","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"dict\u003cstring, list\u003cdict\u003cstring, 
wild\u003e\u003e\u003e"},"diffusion.searchquery":{"description":"Search (grep) 
a repository at a specific path and commit.","params":{"path":"required 
string","commit":"optional string","grep":"required string","limit":"optional 
int","offset":"optional int","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"array"},"diffusion.tagsquery":{"description":"Retrieve 
information about tags in a repository.","params":{"names":"optional 
list\u003cstring\u003e","commit":"optional string","needMessages":"optional 
bool","offset":"optional int","limit":"optional int","callsign":"optional 
string (deprecated)","repository":"optional string","branch":"optional 
string"},"return":"array"},"diffusion.updatecoverage":{"description":"Publish 
coverage info
 rmation for a repository.","params":{"repositoryPHID":"required 
phid","branch":"required string","commit":"required 
string","coverage":"required map\u003cstring, string\u003e","mode":"optional 
string-constant\u003c\"overwrite\", 
\"update\"\u003e"},"return":"void"},"diffusion.uri.edit":{"description":"This 
is a standard **ApplicationEditor** method which allows you to create and 
modify objects by applying transactions. For documentation on these endpoints, 
see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"diffusion.createcomment":{"description":"Add a comment to a 
Diffusion commit. By specifying an action of \"concern\", \"accept\", 
\"resign\", or \"close\", auditing actions can be triggered. Defaults to 
\"comment\"."
 ,"params":{"phid":"required string","action":"optional 
string","message":"required string","silent":"optional 
bool"},"return":"bool"},"feed.publish":{"description":"Publish a story to the 
feed.","params":{"type":"required string","data":"required 
dict","time":"optional int"},"return":"nonempty 
phid"},"feed.query":{"description":"Query the feed for 
stories","params":{"filterPHIDs":"optional list 
\u003cphid\u003e","limit":"optional int (default 100)","after":"optional 
int","before":"optional int","view":"optional string (data, html, html-summary, 
text)"},"return":"nonempty dict"},"file.allocate":{"description":"Prepare to 
upload a 
file.","params":{"name":"string","contentLength":"int","contentHash":"optional 
string","viewPolicy":"optional string","deleteAfterEpoch":"optional 
int"},"return":"map\u003cstring, 
wild\u003e"},"file.download":{"description":"Download a file from the 
server.","params":{"phid":"required phid"},"return":"nonempty 
base64-bytes"},"file.info":{"description":"Get i
 nformation about a file.","params":{"phid":"optional phid","id":"optional 
id"},"return":"nonempty dict"},"file.querychunks":{"description":"Get 
information about file 
chunks.","params":{"filePHID":"phid"},"return":"list\u003cwild\u003e"},"file.upload":{"description":"Upload
 a file to the server.","params":{"data_base64":"required nonempty 
base64-bytes","name":"optional string","viewPolicy":"optional valid policy 
string or \u003cphid\u003e","canCDN":"optional bool"},"return":"nonempty 
guid"},"file.uploadchunk":{"description":"Upload a chunk of file data to the 
server.","params":{"filePHID":"phid","byteStart":"int","data":"string","dataEncoding":"string"},"return":"void"},"file.uploadhash":{"description":"Upload
 a file to the server using content hash.","params":{"hash":"required nonempty 
string","name":"required nonempty string"},"return":"phid or 
null"},"flag.delete":{"description":"Clear a flag.","params":{"id":"optional 
id","objectPHID":"optional phid"},"return":"dict | null"},"fl
 ag.edit":{"description":"Create or modify a 
flag.","params":{"objectPHID":"required phid","color":"optional 
int","note":"optional 
string"},"return":"dict"},"flag.query":{"description":"Query flag 
markers.","params":{"ownerPHIDs":"optional 
list\u003cphid\u003e","types":"optional 
list\u003ctype\u003e","objectPHIDs":"optional 
list\u003cphid\u003e","offset":"optional int","limit":"optional int (default = 
100)"},"return":"list\u003cdict\u003e"},"harbormaster.createartifact":{"description":"Use
 this method to attach artifacts to build targets while running builds. 
Artifacts can be used to carry data through a complex build workflow, provide 
extra information to users, or store build results.\n\nWhen creating an 
artifact, you will choose an `artifactType` from this table. These types of 
artifacts are supported:\n| Artifact Type | Name | Summary 
|\n|-------------|--------------|--------------|\n| `host` | **Drydock Host** | 
References a host lease from Drydock. |\n| `working-copy` | **Drydo
 ck Working Copy** | References a working copy lease from Drydock. |\n| `file` 
| **File** | Stores a reference to file data which has been uploaded to 
Phabricator. |\n| `uri` | **URI** | Stores a URI. |\n\nEach artifact also needs 
an `artifactKey`, which names the artifact. Finally, you will provide some 
`artifactData` to fill in the content of the artifact. The data you provide 
depends on what type of artifact you are creating.\nDrydock 
Host\n--------------------------\n\nReferences a host lease from 
Drydock.\n\nCreate an artifact of this type by passing `host` as the 
`artifactType`. When creating an artifact of this type, provide these 
parameters as a dictionary to `artifactData`:\n| Key | Type | Description 
|\n|-------------|--------------|--------------|\n| `drydockLeasePHID` | 
\/\/string\/\/ | Drydock working copy lease to create an artifact from. |\nFor 
example:\n```lang=json\n{\n  \"drydockLeasePHID\": 
\"PHID-DRYL-abcdefghijklmnopqrst\"\n}\n\n```\nDrydock Working Copy\n-------
 -------------------\n\nReferences a working copy lease from Drydock.\n\nCreate 
an artifact of this type by passing `working-copy` as the `artifactType`. When 
creating an artifact of this type, provide these parameters as a dictionary to 
`artifactData`:\n| Key | Type | Description 
|\n|-------------|--------------|--------------|\n| `drydockLeasePHID` | 
\/\/string\/\/ | Drydock working copy lease to create an artifact from. |\nFor 
example:\n```lang=json\n{\n  \"drydockLeasePHID\": 
\"PHID-DRYL-abcdefghijklmnopqrst\"\n}\n\n```\nFile\n--------------------------\n\nStores
 a reference to file data which has been uploaded to Phabricator.\n\nCreate an 
artifact of this type by passing `file` as the `artifactType`. When creating an 
artifact of this type, provide these parameters as a dictionary to 
`artifactData`:\n| Key | Type | Description 
|\n|-------------|--------------|--------------|\n| `filePHID` | \/\/string\/\/ 
| File to create an artifact from. |\nFor example:\n```lang=json\n{\n  \"fi
 lePHID\": 
\"PHID-FILE-abcdefghijklmnopqrst\"\n}\n\n```\nURI\n--------------------------\n\nStores
 a URI.\n\nWith `ui.external`, you can use this artifact type to add links to 
build results in an external build system.\n\nCreate an artifact of this type 
by passing `uri` as the `artifactType`. When creating an artifact of this type, 
provide these parameters as a dictionary to `artifactData`:\n| Key | Type | 
Description |\n|-------------|--------------|--------------|\n| `uri` | 
\/\/string\/\/ | The URI to store. |\n| `name` | \/\/optional string\/\/ | 
Optional label for this URI. |\n| `ui.external` | \/\/optional bool\/\/ | If 
true, display this URI in the UI as an link to additional build details in an 
external build system. |\nFor example:\n```lang=json\n{\n  \"uri\": 
\"https:\/\/buildserver.mycompany.com\/build\/123\/\",\n  \"name\": \"View 
External Build Results\",\n  \"ui.external\": 
true\n}\n\n```","params":{"buildTargetPHID":"phid","artifactKey":"string","artifactType":"string"
 ,"artifactData":"map\u003cstring, 
wild\u003e"},"return":"wild"},"harbormaster.queryautotargets":{"description":"Load
 or create build 
autotargets.","params":{"objectPHID":"phid","targetKeys":"list\u003cstring\u003e"},"return":"map\u003cstring,
 phid\u003e"},"harbormaster.querybuildables":{"description":"Query Harbormaster 
buildables.","params":{"ids":"optional list\u003cid\u003e","phids":"optional 
list\u003cphid\u003e","buildablePHIDs":"optional 
list\u003cphid\u003e","containerPHIDs":"optional 
list\u003cphid\u003e","manualBuildables":"optional bool","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"wild"},"harbormaster.querybuilds":{"description":"Query 
Harbormaster builds.","params":{"ids":"optional 
list\u003cid\u003e","phids":"optional 
list\u003cphid\u003e","buildStatuses":"optional 
list\u003cstring\u003e","buildablePHIDs":"optional 
list\u003cphid\u003e","buildPlanPHIDs":"optional 
list\u003cphid\u003e","before":"optional string","
 after":"optional string","limit":"optional int (default = 
100)"},"return":"wild"},"harbormaster.sendmessage":{"description":"Send a 
message about the status of a build target to Harbormaster, notifying the 
application of build results in an external system.\n\nSending 
Messages\n================\nIf you run external builds, you can use this method 
to publish build results back into Harbormaster after the external system 
finishes work or as it makes progress.\n\nThe simplest way to use this method 
is to call it once after the build finishes with a `pass` or `fail` message. 
This will record the build result, and continue the next step in the build if 
the build was waiting for a result.\n\nWhen you send a status message about a 
build target, you can optionally include detailed `lint` or `unit` results 
alongside the message. See below for details.\n\nIf you want to report 
intermediate results but a build hasn't completed yet, you can use the `work` 
message. This message doesn't have any 
 direct effects, but allows you to send additional data to update the progress 
of the build target. The target will continue waiting for a completion message, 
but the UI will update to show the progress which has been made.\n\nMessage 
Types\n=============\nWhen you send Harbormaster a message, you must include a 
`type`, which describes the overall state of the build. For example, use `pass` 
to tell Harbomaster that a build completed successfully.\n\nSupported message 
types are:\n\n| Type | Description |\n|--------------|--------------|\n| `pass` 
| Report that the target is complete, and the target has passed. |\n| `fail` | 
Report that the target is complete, and the target has failed. |\n| `work` | 
Report that work on the target is ongoing. This message can be used to report 
partial results during a build. |\n\nUnit Results\n============\nYou can report 
test results alongside a message. The simplest way to do this is to report all 
the results alongside a `pass` or `fail` message, but
  you can also send a `work` message to report intermediate results.\n\nTo 
provide unit test results, pass a list of results in the `unit` parameter. Each 
result shoud be a dictionary with these keys:\n\n| Key | Type | Description 
|\n|-------------|--------------|--------------|\n| `name` | \/\/string\/\/ | 
Short test name, like \"ExampleTest\". |\n| `result` | \/\/string\/\/ | Result 
of the test. |\n| `namespace` | \/\/optional string\/\/ | Optional namespace 
for this test. This is organizational and is often a class or module name, like 
\"ExampleTestCase\". |\n| `engine` | \/\/optional string\/\/ | Test engine 
running the test, like \"JavascriptTestEngine\". This primarily prevents 
collisions between tests with the same name in different test suites (for 
example, a Javascript test and a Python test). |\n| `duration` | \/\/optional 
float or int\/\/ | Runtime duration of the test, in seconds. |\n| `path` | 
\/\/optional string\/\/ | Path to the file where the test is declared, relativ
 e to the project root. |\n| `coverage` | \/\/optional map\u003cstring, 
wild\u003e\/\/ | Coverage information for this test. |\n| `details` | 
\/\/optional string\/\/ | Additional human-readable information about the 
failure. |\n\nThe `result` parameter recognizes these test results:\n\n| Key | 
Name | Description |\n|-------------|--------------|--------------|\n| `pass` | 
**Pass** | The test passed. |\n| `fail` | **Fail** | The test failed. |\n| 
`skip` | **Skip** | The test was not executed. |\n| `broken` | **Broken** | The 
test failed in an abnormal or severe way. For example, the harness crashed 
instead of reporting a failure. |\n| `unsound` | **Unsound** | The test failed, 
but this change is probably not what broke it. For example, it might have 
already been failing. |\n\nThis is a simple, valid value for the `unit` 
parameter. It reports one passing test and one failing 
test:\n\n\n\n```lang=json\n[\n  {\n    \"name\": \"PassingTest\",\n    
\"result\": \"pass\"\n  },\n  {\n    \"na
 me\": \"FailingTest\",\n    \"result\": \"fail\"\n  }\n]\n```\n\nLint 
Results\n============\nLike unit test results, you can report lint results 
alongside a message. The `lint` parameter should contain results as a list of 
dictionaries with these keys:\n\n| Key | Type | Description 
|\n|-------------|--------------|--------------|\n| `name` | \/\/string\/\/ | 
Short message name, like \"Syntax Error\". |\n| `code` | \/\/string\/\/ | Lint 
message code identifying the type of message, like \"ERR123\". |\n| `severity` 
| \/\/string\/\/ | Severity of the message. |\n| `path` | \/\/string\/\/ | Path 
to the file containing the lint message, from the project root. |\n| `line` | 
\/\/optional int\/\/ | Line number in the file where the text which triggered 
the message first appears. The first line of the file is line 1, not line 0. 
|\n| `char` | \/\/optional int\/\/ | Byte position on the line where the text 
which triggered the message starts. The first byte on the line is byte 1, not 
byte 0. T
 his position is byte-based (not character-based) because not all lintable 
files have a valid character encoding. |\n| `description` | \/\/optional 
string\/\/ | Long explanation of the lint message. |\n\nThe `severity` 
parameter recognizes these severity levels:\n\n| Key | Name 
|\n|-------------|--------------|\n| `advice` | **Advice** |\n| `autofix` | 
**Auto-Fix** |\n| `warning` | **Warning** |\n| `error` | **Error** |\n| 
`disabled` | **Disabled** |\n\nThis is a simple, valid value for the `lint` 
parameter. It reports one error and one warning:\n\n```lang=json\n[\n  {\n    
\"name\": \"Syntax Error\",\n    \"code\": \"EXAMPLE1\",\n    \"severity\": 
\"error\",\n    \"path\": \"path\/to\/example.c\",\n    \"line\": 17,\n    
\"char\": 3\n  },\n  {\n    \"name\": \"Not A Haiku\",\n    \"code\": 
\"EXAMPLE2\",\n    \"severity\": \"error\",\n    \"path\": 
\"path\/to\/source.cpp\",\n    \"line\": 23,\n    \"char\": 1,\n    
\"description\": \"This function definition is not a haiku.\"\n  }\n]
 \n```\n\n","params":{"buildTargetPHID":"required phid","type":"required 
string-constant\u003c\"pass\", \"fail\", \"work\"\u003e","unit":"optional 
list\u003cwild\u003e","lint":"optional 
list\u003cwild\u003e"},"return":"void"},"macro.query":{"description":"Retrieve 
image macro information.","params":{"authorPHIDs":"optional 
list\u003cphid\u003e","phids":"optional list\u003cphid\u003e","ids":"optional 
list\u003cid\u003e","names":"optional 
list\u003cstring\u003e","nameLike":"optional 
string"},"return":"list\u003cdict\u003e"},"macro.creatememe":{"description":"Generate
 a meme.","params":{"macroName":"string","upperText":"optional 
string","lowerText":"optional 
string"},"return":"string"},"maniphest.createtask":{"description":"Create a new 
Maniphest task.","params":{"title":"required string","description":"optional 
string","ownerPHID":"optional phid","viewPolicy":"optional phid or policy 
string","editPolicy":"optional phid or policy string","ccPHIDs":"optional 
list\u003cphid\u003e","priori
 ty":"optional int","projectPHIDs":"optional 
list\u003cphid\u003e","auxiliary":"optional dict"},"return":"nonempty 
dict"},"maniphest.gettasktransactions":{"description":"Retrieve Maniphest task 
transactions.","params":{"ids":"required 
list\u003cint\u003e"},"return":"nonempty list\u003cdict\u003cstring, 
wild\u003e\u003e"},"maniphest.info":{"description":"Retrieve information about 
a Maniphest task, given its ID.","params":{"task_id":"required 
id"},"return":"nonempty dict"},"maniphest.query":{"description":"Execute 
complex searches for Maniphest tasks.","params":{"ids":"optional 
list\u003cuint\u003e","phids":"optional 
list\u003cphid\u003e","ownerPHIDs":"optional 
list\u003cphid\u003e","authorPHIDs":"optional 
list\u003cphid\u003e","projectPHIDs":"optional 
list\u003cphid\u003e","ccPHIDs":"optional 
list\u003cphid\u003e","fullText":"optional string","status":"optional 
string-constant\u003c\"status-any\", \"status-open\", \"status-closed\", 
\"status-resolved\", \"status-wontfix\", \"status-i
 nvalid\", \"status-spite\", \"status-duplicate\"\u003e","order":"optional 
string-constant\u003c\"order-priority\", \"order-created\", 
\"order-modified\"\u003e","limit":"optional int","offset":"optional 
int"},"return":"list"},"maniphest.querystatuses":{"description":"Retrieve 
information about possible Maniphest task status 
values.","params":[],"return":"nonempty dict\u003cstring, 
wild\u003e"},"maniphest.update":{"description":"Update an existing Maniphest 
task.","params":{"id":"optional int","phid":"optional int","title":"optional 
string","description":"optional string","ownerPHID":"optional 
phid","viewPolicy":"optional phid or policy string","editPolicy":"optional phid 
or policy string","ccPHIDs":"optional 
list\u003cphid\u003e","priority":"optional int","projectPHIDs":"optional 
list\u003cphid\u003e","auxiliary":"optional dict","status":"optional 
string","comments":"optional string"},"return":"nonempty 
dict"},"maniphest.edit":{"description":"This is a standard 
**ApplicationEditor** 
 method which allows you to create and modify objects by applying transactions. 
For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"maniphest.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional st
 ring","limit":"optional int (default = 100)"},"return":"map\u003cstring, 
wild\u003e"},"owners.edit":{"description":"This is a standard 
**ApplicationEditor** method which allows you to create and modify objects by 
applying transactions. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"owners.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional 
 map\u003cstring, wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"owners.query":{"description":"Query for Owners packages. 
Obsoleted by \"owners.search\".","params":{"userOwner":"optional 
string","projectOwner":"optional string","userAffiliated":"optional 
string","repositoryCallsign":"optional string","path":"optional 
string"},"return":"dict\u003cphid -\u003e dict of package 
info\u003e"},"passphrase.query":{"description":"Query 
credentials.","params":{"ids":"optional list\u003cint\u003e","phids":"optional 
list\u003cphid\u003e","needSecrets":"optional bool","needPublicKeys":"optional 
bool","order":"optional order","before":"optional string","after":"optional 
string","limit":"optional int (default = 
100)"},"return":"list\u003cdict\u003e"},"paste.create":{"description":"Create a 
new paste.","params":{"content":"re
 quired string","title":"optional string","language":"optional 
string"},"return":"nonempty dict"},"paste.query":{"description":"Query 
Pastes.","params":{"ids":"optional list\u003cint\u003e","phids":"optional 
list\u003cphid\u003e","authorPHIDs":"optional 
list\u003cphid\u003e","after":"optional int","limit":"optional int, default = 
100"},"return":"list\u003cdict\u003e"},"paste.edit":{"description":"This is a 
standard **ApplicationEditor** method which allows you to create and modify 
objects by applying transactions. For documentation on these endpoints, see 
**[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"paste.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search
  for objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"paste.info":{"description":"Retrieve an array of information 
about a paste.","params":{"paste_id":"required id"},"return":"nonempty 
dict"},"phame.blog.edit":{"description":"This is a standard 
**ApplicationEditor** method which allows you to create and modify objects by 
applying transactions. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Ed
 it Endpoints ]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"phame.blog.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"phame.post.edit":{"description":"This is a standard 
**ApplicationEditor** method which allows you to create and modify objects by 
applying transactions. For documentation o
 n these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"phame.post.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, wild\u003e"},"phid.looku
 p":{"description":"Look up objects by name.","params":{"names":"required 
list\u003cstring\u003e"},"return":"nonempty dict\u003cstring, 
wild\u003e"},"phid.query":{"description":"Retrieve information about arbitrary 
PHIDs.","params":{"phids":"required list\u003cphid\u003e"},"return":"nonempty 
dict\u003cstring, wild\u003e"},"phid.info":{"description":"Retrieve information 
about an arbitrary PHID.","params":{"phid":"required phid"},"return":"nonempty 
dict\u003cstring, wild\u003e"},"phragment.getpatch":{"description":"Retrieve 
the patches to apply for a given set of files.","params":{"path":"required 
string","state":"required dict\u003cstring, string\u003e"},"return":"nonempty 
dict"},"phragment.queryfragments":{"description":"Query fragments based on 
their paths.","params":{"paths":"required 
list\u003cstring\u003e"},"return":"nonempty 
dict"},"phriction.create":{"description":"Create a Phriction 
document.","params":{"slug":"required string","title":"required 
string","content":"required st
 ring","description":"optional string"},"return":"nonempty 
dict"},"phriction.edit":{"description":"Update a Phriction 
document.","params":{"slug":"required string","title":"optional 
string","content":"optional string","description":"optional 
string"},"return":"nonempty dict"},"phriction.history":{"description":"Retrieve 
history about a Phriction document.","params":{"slug":"required 
string"},"return":"nonempty list"},"phriction.info":{"description":"Retrieve 
information about a Phriction document.","params":{"slug":"required 
string"},"return":"nonempty dict"},"project.create":{"description":"Create a 
project.","params":{"name":"required string","members":"optional 
list\u003cphid\u003e","icon":"optional string","color":"optional 
string","tags":"optional 
list\u003cstring\u003e"},"return":"dict"},"project.query":{"description":"Execute
 searches for Projects.","params":{"ids":"optional 
list\u003cint\u003e","names":"optional 
list\u003cstring\u003e","phids":"optional list\u003cphid\u003e",
 "slugs":"optional list\u003cstring\u003e","icons":"optional 
list\u003cstring\u003e","colors":"optional 
list\u003cstring\u003e","status":"optional string-constant\u003c\"status-any\", 
\"status-open\", \"status-closed\", \"status-active\", 
\"status-archived\"\u003e","members":"optional 
list\u003cphid\u003e","limit":"optional int","offset":"optional 
int"},"return":"list"},"project.edit":{"description":"This is a standard 
**ApplicationEditor** method which allows you to create and modify objects by 
applying transactions. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"project.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or 
 search for objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"releeph.getbranches":{"description":"Return information about all 
active Releeph branches.","params":[],"return":"nonempty 
list\u003cdict\u003cstring, 
wild\u003e\u003e"},"releeph.querybranches":{"description":"Query information 
about Releeph branches.","params":{"ids":"optional 
list\u003cid\u003e","phids":"optional 
list\u003cphid\u003e","productPHIDs":"optional 
list\u003cphid\u003e","before":"optional string","after":"optional 
string","limit":"optional int (defaul
 t = 
100)"},"return":"query-results"},"releeph.queryproducts":{"description":"Query 
information about Releeph products.","params":{"ids":"optional 
list\u003cid\u003e","phids":"optional 
list\u003cphid\u003e","repositoryPHIDs":"optional 
list\u003cphid\u003e","isActive":"optional bool","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"query-results"},"releeph.queryrequests":{"description":"Return 
information about all Releeph requests linked to the given 
ids.","params":{"revisionPHIDs":"optional 
list\u003cphid\u003e","requestedCommitPHIDs":"optional 
list\u003cphid\u003e"},"return":"dict\u003cstring, 
wild\u003e"},"releeph.request":{"description":"Request a commit or diff to be 
picked to a branch.","params":{"branchPHID":"required 
string","things":"required list\u003cstring\u003e","fields":"dict\u003cstring, 
string\u003e"},"return":"dict\u003cstring, 
wild\u003e"},"releephwork.canpush":{"description":"Return whether the conduit 
user is a
 llowed to push.","params":{"projectPHID":"required 
string"},"return":"bool"},"releephwork.getauthorinfo":{"description":"Return a 
string to use as the VCS author.","params":{"userPHID":"required 
string","vcsType":"required string"},"return":"nonempty 
string"},"releephwork.getbranch":{"description":"Return information to help 
checkout \/ cut a Releeph branch.","params":{"branchPHID":"required 
string"},"return":"dict\u003cstring, 
wild\u003e"},"releephwork.getbranchcommitmessage":{"description":"Get a commit 
message for committing a Releeph branch.","params":{"branchPHID":"required 
string"},"return":"nonempty 
string"},"releephwork.getcommitmessage":{"description":"Get commit message 
components for building a ReleephRequest commit 
message.","params":{"requestPHID":"required string","action":"required 
string-constant\u003c\"pick\", \"revert\"\u003e"},"return":"dict\u003cstring, 
string\u003e"},"releephwork.nextrequest":{"description":"Return info required 
to cut a branch, and pick and rev
 ert ReleephRequests.","params":{"branchPHID":"required phid","seen":"required 
map\u003cstring, 
bool\u003e"},"return":""},"releephwork.record":{"description":"Record whether 
we committed a pick or revert to the upstream 
repository.","params":{"requestPHID":"required string","action":"required 
string-constant\u003c\"pick\", \"revert\"\u003e","commitIdentifier":"required 
string"},"return":"void"},"releephwork.recordpickstatus":{"description":"Record 
whether a pick or revert was successful or 
not.","params":{"requestPHID":"required string","action":"required 
string-constant\u003c\"pick\", \"revert\"\u003e","ok":"required 
bool","dryRun":"optional bool","details":"optional dict\u003cstring, 
wild\u003e"},"return":""},"remarkup.process":{"description":"Process text 
through remarkup in Phabricator context.","params":{"context":"required 
string-constant\u003c\"phriction\", \"maniphest\", \"differential\", \"phame\", 
\"feed\", \"diffusion\"\u003e","contents":"required list\u003cstring\u003e"},
 "return":"nonempty dict"},"repository.query":{"description":"Query 
repositories.","params":{"ids":"optional list\u003cint\u003e","phids":"optional 
list\u003cphid\u003e","callsigns":"optional 
list\u003cstring\u003e","vcsTypes":"optional 
list\u003cstring\u003e","remoteURIs":"optional 
list\u003cstring\u003e","uuids":"optional 
list\u003cstring\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"list\u003cdict\u003e"},"slowvote.info":{"description":"Retrieve
 an array of information about a poll.","params":{"poll_id":"required 
id"},"return":"nonempty dict"},"token.give":{"description":"Give or change a 
token.","params":{"tokenPHID":"phid|null","objectPHID":"phid"},"return":"void"},"token.given":{"description":"Query
 tokens given to 
objects.","params":{"authorPHIDs":"list\u003cphid\u003e","objectPHIDs":"list\u003cphid\u003e","tokenPHIDs":"list\u003cphid\u003e"},"return":"list\u003cdict\u003e"},"token.query":
 {"description":"Query 
tokens.","params":[],"return":"list\u003cdict\u003e"},"user.disable":{"description":"Permanently
 disable specified users (admin only).","params":{"phids":"required 
list\u003cphid\u003e"},"return":"void"},"user.enable":{"description":"Re-enable 
specified users (admin only).","params":{"phids":"required 
list\u003cphid\u003e"},"return":"void"},"user.query":{"description":"Query 
users.","params":{"usernames":"optional 
list\u003cstring\u003e","emails":"optional 
list\u003cstring\u003e","realnames":"optional 
list\u003cstring\u003e","phids":"optional list\u003cphid\u003e","ids":"optional 
list\u003cuint\u003e","offset":"optional int","limit":"optional int (default = 
100)"},"return":"list\u003cdict\u003e"},"user.whoami":{"description":"Retrieve 
information about the logged-in user.","params":[],"return":"nonempty 
dict\u003cstring, wild\u003e"},"user.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for objec
 ts. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"user.find":{"description":"Lookup PHIDs by username. Obsoleted by 
\"user.query\".","params":{"aliases":"required 
list\u003cstring\u003e"},"return":"nonempty dict\u003cstring, phid\u003e"}}
\ No newline at end of file
+{"almanac.device.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"almanac.service.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]*
 *.","params":{"queryKey":"optional string","constraints":"optional 
map\u003cstring, wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"audit.query":{"description":"Query audit 
requests.","params":{"auditorPHIDs":"optional 
list\u003cphid\u003e","commitPHIDs":"optional 
list\u003cphid\u003e","status":"optional 
string-constant\u003c\"audit-status-any\", \"audit-status-open\", 
\"audit-status-concern\", \"audit-status-accepted\", 
\"audit-status-partial\"\u003e (default = 
\"audit-status-any\")","offset":"optional int","limit":"optional int (default = 
100)"},"return":"list\u003cdict\u003e"},"auth.logout":{"description":"Terminate 
all web login sessions. If called via OAuth, also terminate the current OAuth 
token.\n\nWARNING: This method does what it claims on the label. If you call 
this method via the test console in the
  web UI, it will log you 
out!","params":[],"return":"void"},"auth.querypublickeys":{"description":"Query 
public keys.","params":{"ids":"optional list\u003cid\u003e","phids":"optional 
list\u003cphid\u003e","objectPHIDs":"optional 
list\u003cphid\u003e","keys":"optional 
list\u003cstring\u003e","before":"optional string","after":"optional 
string","limit":"optional int (default = 
100)"},"return":"result-set"},"badges.edit":{"description":"This is a standard 
**ApplicationEditor** method which allows you to create and modify objects by 
applying transactions. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"badges.search":{"description":"This is a standard 
**ApplicationSearch** method w
 hich will let you list, query, or search for objects. For documentation on 
these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"conduit.connect":{"description":"Connect a session-based 
client.","params":{"client":"required string","clientVersion":"required 
int","clientDescription":"optional string","user":"optional 
string","authToken":"optional int","authSignature":"optional 
string","host":"deprecated"},"return":"dict\u003cstring, 
any\u003e"},"conduit.getcapabilities":{"description":"List capabilities, wire 
formats, and authentication protocols available o
 n this server.","params":[],"return":"dict\u003cstring, 
any\u003e"},"conduit.getcertificate":{"description":"Retrieve certificate 
information for a user.","params":{"token":"required string","host":"required 
string"},"return":"dict\u003cstring, 
any\u003e"},"conduit.ping":{"description":"Basic ping for monitoring or a 
health-check.","params":[],"return":"string"},"conduit.query":{"description":"Returns
 the parameters of the Conduit 
methods.","params":[],"return":"dict\u003cdict\u003e"},"conpherence.createthread":{"description":"Create
 a new conpherence thread.","params":{"title":"optional 
string","message":"required string","participantPHIDs":"required 
list\u003cphids\u003e"},"return":"nonempty 
dict"},"conpherence.querythread":{"description":"Query for Conpherence threads 
for the logged in user. You can query by IDs or PHIDs for specific Conpherence 
threads. Otherwise, specify limit and offset to query the most recently updated 
Conpherences for the logged in user.","params":{"ids":"o
 ptional array\u003cint\u003e","phids":"optional 
array\u003cphids\u003e","limit":"optional int","offset":"optional 
int"},"return":"nonempty 
dict"},"conpherence.querytransaction":{"description":"Query for transactions 
for the logged in user within a specific Conpherence room. You can specify the 
room by ID or PHID. Otherwise, specify limit and offset to query the most 
recent transactions within the Conpherence room for the logged in 
user.","params":{"roomID":"optional int","roomPHID":"optional 
phid","limit":"optional int","offset":"optional int"},"return":"nonempty 
dict"},"conpherence.updatethread":{"description":"Update an existing 
conpherence room.","params":{"id":"optional int","phid":"optional 
phid","title":"optional string","message":"optional 
string","addParticipantPHIDs":"optional 
list\u003cphids\u003e","removeParticipantPHID":"optional 
phid"},"return":"bool"},"dashboard.panel.edit":{"description":"This is a 
standard **ApplicationEditor** method which allows you to create and m
 odify objects by applying transactions. For documentation on these endpoints, 
see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"differential.close":{"description":"Close a Differential 
revision.","params":{"revisionID":"required 
int"},"return":"void"},"differential.createcomment":{"description":"Add a 
comment to a Differential revision.","params":{"revision_id":"required 
revisionid","message":"optional string","action":"optional 
string","silent":"optional bool","attach_inlines":"optional 
bool"},"return":"nonempty 
dict"},"differential.creatediff":{"description":"Create a new Differential 
diff.","params":{"changes":"required 
list\u003cdict\u003e","sourceMachine":"required string","sourcePath":"required 
string","branch"
 :"required string","bookmark":"optional 
string","sourceControlSystem":"required string-constant\u003c\"svn\", \"git\", 
\"hg\"\u003e","sourceControlPath":"required 
string","sourceControlBaseRevision":"required 
string","creationMethod":"optional string","lintStatus":"required 
string-constant\u003c\"none\", \"skip\", \"okay\", \"warn\", 
\"fail\"\u003e","unitStatus":"required string-constant\u003c\"none\", \"skip\", 
\"okay\", \"warn\", \"fail\"\u003e","repositoryPHID":"optional 
phid","parentRevisionID":"deprecated","authorPHID":"deprecated","repositoryUUID":"deprecated"},"return":"nonempty
 dict"},"differential.createinline":{"description":"Add an inline comment to a 
Differential revision.","params":{"revisionID":"optional 
revisionid","diffID":"optional diffid","filePath":"required 
string","isNewFile":"required bool","lineNumber":"required 
int","lineLength":"optional int","content":"required 
string"},"return":"nonempty 
dict"},"differential.createrawdiff":{"description":"Create a new Diff
 erential diff from a raw diff source.","params":{"diff":"required 
string","repositoryPHID":"optional string","viewPolicy":"optional 
string"},"return":"nonempty 
dict"},"differential.createrevision":{"description":"Create a new Differential 
revision.","params":{"user":"ignored","diffid":"required 
diffid","fields":"required dict"},"return":"nonempty 
dict"},"differential.getcommitmessage":{"description":"Retrieve Differential 
commit messages or message templates.","params":{"revision_id":"optional 
revision_id","fields":"optional dict\u003cstring, wild\u003e","edit":"optional 
string-constant\u003c\"edit\", \"create\"\u003e"},"return":"nonempty 
string"},"differential.getcommitpaths":{"description":"Query which paths should 
be included when committing a Differential 
revision.","params":{"revision_id":"required int"},"return":"nonempty 
list\u003cstring\u003e"},"differential.getrawdiff":{"description":"Retrieve a 
raw diff","params":{"diffID":"required diffID"},"return":"nonempty string"},"di
 fferential.parsecommitmessage":{"description":"Parse commit messages for 
Differential fields.","params":{"corpus":"required string","partial":"optional 
bool"},"return":"nonempty dict"},"differential.query":{"description":"Query 
Differential revisions which match certain 
criteria.","params":{"authors":"optional list\u003cphid\u003e","ccs":"optional 
list\u003cphid\u003e","reviewers":"optional 
list\u003cphid\u003e","paths":"optional list\u003cpair\u003ccallsign, 
path\u003e\u003e","commitHashes":"optional 
list\u003cpair\u003cstring-constant\u003c\"gtcm\", \"gttr\", \"hgcm\"\u003e, 
string\u003e\u003e","status":"optional string-constant\u003c\"status-any\", 
\"status-open\", \"status-accepted\", 
\"status-closed\"\u003e","order":"optional 
string-constant\u003c\"order-modified\", 
\"order-created\"\u003e","limit":"optional uint","offset":"optional 
uint","ids":"optional list\u003cuint\u003e","phids":"optional 
list\u003cphid\u003e","subscribers":"optional 
list\u003cphid\u003e","responsibleUsers
 ":"optional list\u003cphid\u003e","branches":"optional 
list\u003cstring\u003e"},"return":"list\u003cdict\u003e"},"differential.querydiffs":{"description":"Query
 differential diffs which match certain criteria.","params":{"ids":"optional 
list\u003cuint\u003e","revisionIDs":"optional 
list\u003cuint\u003e"},"return":"list\u003cdict\u003e"},"differential.setdiffproperty":{"description":"Attach
 properties to Differential diffs.","params":{"diff_id":"required 
diff_id","name":"required string","data":"required 
string"},"return":"void"},"differential.updaterevision":{"description":"Update 
a Differential revision.","params":{"id":"required 
revisionid","diffid":"required diffid","fields":"required 
dict","message":"required string"},"return":"nonempty 
dict"},"differential.revision.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\
 /find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1 | 
Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"differential.find":{"description":"Query Differential revisions 
which match certain criteria.","params":{"query":"required 
string-constant\u003c\"open\", \"committable\", \"revision-ids\", 
\"phids\"\u003e","guids":"required nonempty 
list\u003cguids\u003e"},"return":"nonempty 
list\u003cdict\u003e"},"differential.getalldiffs":{"description":"Load all 
diffs for given revisions from 
Differential.","params":{"revision_ids":"required 
list\u003cint\u003e"},"return":"dict"},"differential.getdiff":{"description":"Load
 the content of a diff from Differential by revision ID or diff
  ID.","params":{"revision_id":"optional id","diff_id":"optional 
id"},"return":"nonempty dict"},"differential.getrevision":{"description":"Load 
the content of a revision from Differential.","params":{"revision_id":"required 
id"},"return":"nonempty 
dict"},"differential.getrevisioncomments":{"description":"Retrieve Differential 
Revision Comments.","params":{"ids":"required 
list\u003cint\u003e","inlines":"optional bool (deprecated)"},"return":"nonempty 
list\u003cdict\u003cstring, 
wild\u003e\u003e"},"diffusion.commit.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https://secure.phabricator.com/diviner/find/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"after":"optional 
string","attachments":"optional map<string, bool>","before":"optional 
string","constraints":"optional map<string, wild>","li
 mit":"optional int (default = 100)","order":"optional 
order","queryKey":"optional 
string"},"return":"list<string>"},"diffusion.findsymbols":{"description":"Retrieve
 Diffusion symbol information.","params":{"name":"optional 
string","namePrefix":"optional string","context":"optional 
string","language":"optional string","type":"optional 
string","repositoryPHID":"optional string"},"return":"nonempty 
list\u003cdict\u003e"},"diffusion.getrecentcommitsbypath":{"description":"Get 
commit identifiers for recent commits affecting a given 
path.","params":{"callsign":"required string","path":"required 
string","branch":"optional string","limit":"optional int"},"return":"nonempty 
list\u003cstring\u003e"},"diffusion.querycommits":{"description":"Retrieve 
information about commits.","params":{"ids":"optional 
list\u003cint\u003e","phids":"optional list\u003cphid\u003e","names":"optional 
list\u003cstring\u003e","repositoryPHID":"optional 
phid","needMessages":"optional bool","bypassCache":"optional boo
 l","before":"optional string","after":"optional string","limit":"optional int 
(default = 100)"},"return":"map\u003cstring, 
dict\u003e"},"diffusion.blame":{"description":"Get blame information for a list 
of paths.","params":{"paths":"required 
list\u003cstring\u003e","commit":"required string","timeout":"optional 
int","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional string"},"return":"map\u003cstring, 
wild\u003e"},"diffusion.branchquery":{"description":"Determine what branches 
exist for a repository.","params":{"closed":"optional bool","limit":"optional 
int","offset":"optional int","contains":"optional string","callsign":"optional 
string (deprecated)","repository":"optional string","branch":"optional 
string"},"return":"list\u003cdict\u003e"},"diffusion.browsequery":{"description":"File(s)
 information for a repository at an (optional) path and (optional) 
commit.","params":{"path":"optional string","commit":"optional 
string","needValidityOnly":
 "optional bool","limit":"optional int","offset":"optional 
int","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"array"},"diffusion.commitparentsquery":{"description":"Get 
the commit identifiers for a commit's parent or 
parents.","params":{"commit":"required string","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"list\u003cstring\u003e"},"diffusion.diffquery":{"description":"Get
 diff information from a repository for a specific path at an (optional) 
commit.","params":{"path":"required string","commit":"optional 
string","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"array"},"diffusion.existsquery":{"description":"Determine if 
code exists in a version control system.","params":{"commit":"required 
string","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional strin
 g"},"return":"bool"},"diffusion.filecontentquery":{"description":"Retrieve 
file content from a repository.","params":{"path":"required 
string","commit":"required string","timeout":"optional 
int","byteLimit":"optional int","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"array"},"diffusion.getlintmessages":{"description":"Get lint 
messages for existing code.","params":{"repositoryPHID":"required 
phid","branch":"required string","commit":"optional string","files":"required 
list\u003cstring\u003e"},"return":"list\u003cdict\u003e"},"diffusion.historyquery":{"description":"Returns
 history information for a repository at a specific commit and 
path.","params":{"commit":"required string","path":"required 
string","offset":"required int","limit":"required 
int","needDirectChanges":"optional bool","needChildChanges":"optional 
bool","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional string"},"r
 eturn":"array"},"diffusion.internal.gitrawdiffquery":{"description":"Internal 
method for getting raw diff information.","params":{"commit":"required 
string","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"string"},"diffusion.lastmodifiedquery":{"description":"Get 
the commits at which paths were last modified.","params":{"paths":"required 
map\u003cstring, string\u003e","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"map\u003cstring, 
string\u003e"},"diffusion.looksoon":{"description":"Advises Phabricator to look 
for new commits in a repository as soon as possible. This advice is most useful 
if you have just pushed new commits to that 
repository.","params":{"callsigns":"optional list\u003cstring\u003e 
(deprecated)","repositories":"optional 
list\u003cstring\u003e","urgency":"optional 
string"},"return":"void"},"diffusion.mergedcommitsquery":{"description":"Merged 
 commit information for a specific commit in a 
repository.","params":{"commit":"required string","limit":"optional 
int","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"array"},"diffusion.querypaths":{"description":"Filename 
search on a repository.","params":{"path":"required string","commit":"required 
string","pattern":"optional string","limit":"optional int","offset":"optional 
int","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"list\u003cstring\u003e"},"diffusion.rawdiffquery":{"description":"Get
 raw diff information from a repository for a specific commit at an (optional) 
path.","params":{"commit":"required string","path":"optional 
string","timeout":"optional int","byteLimit":"optional 
int","linesOfContext":"optional int","againstCommit":"optional 
string","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional string"},"r
 eturn":"string"},"diffusion.refsquery":{"description":"Query a git repository 
for ref information at a specific commit.","params":{"commit":"required 
string","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"array"},"diffusion.repository.edit":{"description":"This is 
a standard **ApplicationEditor** method which allows you to create and modify 
objects by applying transactions. For documentation on these endpoints, see 
**[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"diffusion.repository.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ ht
 
tps:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"diffusion.resolverefs":{"description":"Resolve references into 
stable, canonical identifiers.","params":{"refs":"required 
list\u003cstring\u003e","types":"optional 
list\u003cstring\u003e","callsign":"optional string 
(deprecated)","repository":"optional string","branch":"optional 
string"},"return":"dict\u003cstring, list\u003cdict\u003cstring, 
wild\u003e\u003e\u003e"},"diffusion.searchquery":{"description":"Search (grep) 
a repository at a specific path and commit.","params":{"path":"required 
string","commit":"optional string","grep"
 :"required string","limit":"optional int","offset":"optional 
int","callsign":"optional string (deprecated)","repository":"optional 
string","branch":"optional 
string"},"return":"array"},"diffusion.tagsquery":{"description":"Retrieve 
information about tags in a repository.","params":{"names":"optional 
list\u003cstring\u003e","commit":"optional string","needMessages":"optional 
bool","offset":"optional int","limit":"optional int","callsign":"optional 
string (deprecated)","repository":"optional string","branch":"optional 
string"},"return":"array"},"diffusion.updatecoverage":{"description":"Publish 
coverage information for a repository.","params":{"repositoryPHID":"required 
phid","branch":"required string","commit":"required 
string","coverage":"required map\u003cstring, string\u003e","mode":"optional 
string-constant\u003c\"overwrite\", 
\"update\"\u003e"},"return":"void"},"diffusion.uri.edit":{"description":"This 
is a standard **ApplicationEditor** method which allows you to create and mod
 ify objects by applying transactions. For documentation on these endpoints, 
see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"diffusion.createcomment":{"description":"Add a comment to a 
Diffusion commit. By specifying an action of \"concern\", \"accept\", 
\"resign\", or \"close\", auditing actions can be triggered. Defaults to 
\"comment\".","params":{"phid":"required string","action":"optional 
string","message":"required string","silent":"optional 
bool"},"return":"bool"},"feed.publish":{"description":"Publish a story to the 
feed.","params":{"type":"required string","data":"required 
dict","time":"optional int"},"return":"nonempty 
phid"},"feed.query":{"description":"Query the feed for 
stories","params":{"filterPHIDs":"
 optional list \u003cphid\u003e","limit":"optional int (default 
100)","after":"optional int","before":"optional int","view":"optional string 
(data, html, html-summary, text)"},"return":"nonempty 
dict"},"file.allocate":{"description":"Prepare to upload a 
file.","params":{"name":"string","contentLength":"int","contentHash":"optional 
string","viewPolicy":"optional string","deleteAfterEpoch":"optional 
int"},"return":"map\u003cstring, 
wild\u003e"},"file.download":{"description":"Download a file from the 
server.","params":{"phid":"required phid"},"return":"nonempty 
base64-bytes"},"file.info":{"description":"Get information about a 
file.","params":{"phid":"optional phid","id":"optional id"},"return":"nonempty 
dict"},"file.querychunks":{"description":"Get information about file 
chunks.","params":{"filePHID":"phid"},"return":"list\u003cwild\u003e"},"file.upload":{"description":"Upload
 a file to the server.","params":{"data_base64":"required nonempty 
base64-bytes","name":"optional string","vie
 wPolicy":"optional valid policy string or \u003cphid\u003e","canCDN":"optional 
bool"},"return":"nonempty guid"},"file.uploadchunk":{"description":"Upload a 
chunk of file data to the 
server.","params":{"filePHID":"phid","byteStart":"int","data":"string","dataEncoding":"string"},"return":"void"},"file.uploadhash":{"description":"Upload
 a file to the server using content hash.","params":{"hash":"required nonempty 
string","name":"required nonempty string"},"return":"phid or 
null"},"flag.delete":{"description":"Clear a flag.","params":{"id":"optional 
id","objectPHID":"optional phid"},"return":"dict | 
null"},"flag.edit":{"description":"Create or modify a 
flag.","params":{"objectPHID":"required phid","color":"optional 
int","note":"optional 
string"},"return":"dict"},"flag.query":{"description":"Query flag 
markers.","params":{"ownerPHIDs":"optional 
list\u003cphid\u003e","types":"optional 
list\u003ctype\u003e","objectPHIDs":"optional 
list\u003cphid\u003e","offset":"optional int","limit":"opti
 onal int (default = 
100)"},"return":"list\u003cdict\u003e"},"harbormaster.createartifact":{"description":"Use
 this method to attach artifacts to build targets while running builds. 
Artifacts can be used to carry data through a complex build workflow, provide 
extra information to users, or store build results.\n\nWhen creating an 
artifact, you will choose an `artifactType` from this table. These types of 
artifacts are supported:\n| Artifact Type | Name | Summary 
|\n|-------------|--------------|--------------|\n| `host` | **Drydock Host** | 
References a host lease from Drydock. |\n| `working-copy` | **Drydock Working 
Copy** | References a working copy lease from Drydock. |\n| `file` | **File** | 
Stores a reference to file data which has been uploaded to Phabricator. |\n| 
`uri` | **URI** | Stores a URI. |\n\nEach artifact also needs an `artifactKey`, 
which names the artifact. Finally, you will provide some `artifactData` to fill 
in the content of the artifact. The data you provide dep
 ends on what type of artifact you are creating.\nDrydock 
Host\n--------------------------\n\nReferences a host lease from 
Drydock.\n\nCreate an artifact of this type by passing `host` as the 
`artifactType`. When creating an artifact of this type, provide these 
parameters as a dictionary to `artifactData`:\n| Key | Type | Description 
|\n|-------------|--------------|--------------|\n| `drydockLeasePHID` | 
\/\/string\/\/ | Drydock working copy lease to create an artifact from. |\nFor 
example:\n```lang=json\n{\n  \"drydockLeasePHID\": 
\"PHID-DRYL-abcdefghijklmnopqrst\"\n}\n\n```\nDrydock Working 
Copy\n--------------------------\n\nReferences a working copy lease from 
Drydock.\n\nCreate an artifact of this type by passing `working-copy` as the 
`artifactType`. When creating an artifact of this type, provide these 
parameters as a dictionary to `artifactData`:\n| Key | Type | Description 
|\n|-------------|--------------|--------------|\n| `drydockLeasePHID` | 
\/\/string\/\/ | Drydock worki
 ng copy lease to create an artifact from. |\nFor example:\n```lang=json\n{\n  
\"drydockLeasePHID\": 
\"PHID-DRYL-abcdefghijklmnopqrst\"\n}\n\n```\nFile\n--------------------------\n\nStores
 a reference to file data which has been uploaded to Phabricator.\n\nCreate an 
artifact of this type by passing `file` as the `artifactType`. When creating an 
artifact of this type, provide these parameters as a dictionary to 
`artifactData`:\n| Key | Type | Description 
|\n|-------------|--------------|--------------|\n| `filePHID` | \/\/string\/\/ 
| File to create an artifact from. |\nFor example:\n```lang=json\n{\n  
\"filePHID\": 
\"PHID-FILE-abcdefghijklmnopqrst\"\n}\n\n```\nURI\n--------------------------\n\nStores
 a URI.\n\nWith `ui.external`, you can use this artifact type to add links to 
build results in an external build system.\n\nCreate an artifact of this type 
by passing `uri` as the `artifactType`. When creating an artifact of this type, 
provide these parameters as a dictionary to `artifa
 ctData`:\n| Key | Type | Description 
|\n|-------------|--------------|--------------|\n| `uri` | \/\/string\/\/ | 
The URI to store. |\n| `name` | \/\/optional string\/\/ | Optional label for 
this URI. |\n| `ui.external` | \/\/optional bool\/\/ | If true, display this 
URI in the UI as an link to additional build details in an external build 
system. |\nFor example:\n```lang=json\n{\n  \"uri\": 
\"https:\/\/buildserver.mycompany.com\/build\/123\/\",\n  \"name\": \"View 
External Build Results\",\n  \"ui.external\": 
true\n}\n\n```","params":{"buildTargetPHID":"phid","artifactKey":"string","artifactType":"string","artifactData":"map\u003cstring,
 
wild\u003e"},"return":"wild"},"harbormaster.queryautotargets":{"description":"Load
 or create build 
autotargets.","params":{"objectPHID":"phid","targetKeys":"list\u003cstring\u003e"},"return":"map\u003cstring,
 phid\u003e"},"harbormaster.querybuildables":{"description":"Query Harbormaster 
buildables.","params":{"ids":"optional list\u003cid\u003e","ph
 ids":"optional list\u003cphid\u003e","buildablePHIDs":"optional 
list\u003cphid\u003e","containerPHIDs":"optional 
list\u003cphid\u003e","manualBuildables":"optional bool","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"wild"},"harbormaster.querybuilds":{"description":"Query 
Harbormaster builds.","params":{"ids":"optional 
list\u003cid\u003e","phids":"optional 
list\u003cphid\u003e","buildStatuses":"optional 
list\u003cstring\u003e","buildablePHIDs":"optional 
list\u003cphid\u003e","buildPlanPHIDs":"optional 
list\u003cphid\u003e","before":"optional string","after":"optional 
string","limit":"optional int (default = 
100)"},"return":"wild"},"harbormaster.sendmessage":{"description":"Send a 
message about the status of a build target to Harbormaster, notifying the 
application of build results in an external system.\n\nSending 
Messages\n================\nIf you run external builds, you can use this method 
to publish build results back into 
 Harbormaster after the external system finishes work or as it makes 
progress.\n\nThe simplest way to use this method is to call it once after the 
build finishes with a `pass` or `fail` message. This will record the build 
result, and continue the next step in the build if the build was waiting for a 
result.\n\nWhen you send a status message about a build target, you can 
optionally include detailed `lint` or `unit` results alongside the message. See 
below for details.\n\nIf you want to report intermediate results but a build 
hasn't completed yet, you can use the `work` message. This message doesn't have 
any direct effects, but allows you to send additional data to update the 
progress of the build target. The target will continue waiting for a completion 
message, but the UI will update to show the progress which has been 
made.\n\nMessage Types\n=============\nWhen you send Harbormaster a message, 
you must include a `type`, which describes the overall state of the build. For 
example, us
 e `pass` to tell Harbomaster that a build completed successfully.\n\nSupported 
message types are:\n\n| Type | Description 
|\n|--------------|--------------|\n| `pass` | Report that the target is 
complete, and the target has passed. |\n| `fail` | Report that the target is 
complete, and the target has failed. |\n| `work` | Report that work on the 
target is ongoing. This message can be used to report partial results during a 
build. |\n\nUnit Results\n============\nYou can report test results alongside a 
message. The simplest way to do this is to report all the results alongside a 
`pass` or `fail` message, but you can also send a `work` message to report 
intermediate results.\n\nTo provide unit test results, pass a list of results 
in the `unit` parameter. Each result shoud be a dictionary with these 
keys:\n\n| Key | Type | Description 
|\n|-------------|--------------|--------------|\n| `name` | \/\/string\/\/ | 
Short test name, like \"ExampleTest\". |\n| `result` | \/\/string\/\/ | Resu
 lt of the test. |\n| `namespace` | \/\/optional string\/\/ | Optional 
namespace for this test. This is organizational and is often a class or module 
name, like \"ExampleTestCase\". |\n| `engine` | \/\/optional string\/\/ | Test 
engine running the test, like \"JavascriptTestEngine\". This primarily prevents 
collisions between tests with the same name in different test suites (for 
example, a Javascript test and a Python test). |\n| `duration` | \/\/optional 
float or int\/\/ | Runtime duration of the test, in seconds. |\n| `path` | 
\/\/optional string\/\/ | Path to the file where the test is declared, relative 
to the project root. |\n| `coverage` | \/\/optional map\u003cstring, 
wild\u003e\/\/ | Coverage information for this test. |\n| `details` | 
\/\/optional string\/\/ | Additional human-readable information about the 
failure. |\n\nThe `result` parameter recognizes these test results:\n\n| Key | 
Name | Description |\n|-------------|--------------|--------------|\n| `pass` | 
**Pass** |
  The test passed. |\n| `fail` | **Fail** | The test failed. |\n| `skip` | 
**Skip** | The test was not executed. |\n| `broken` | **Broken** | The test 
failed in an abnormal or severe way. For example, the harness crashed instead 
of reporting a failure. |\n| `unsound` | **Unsound** | The test failed, but 
this change is probably not what broke it. For example, it might have already 
been failing. |\n\nThis is a simple, valid value for the `unit` parameter. It 
reports one passing test and one failing test:\n\n\n\n```lang=json\n[\n  {\n    
\"name\": \"PassingTest\",\n    \"result\": \"pass\"\n  },\n  {\n    \"name\": 
\"FailingTest\",\n    \"result\": \"fail\"\n  }\n]\n```\n\nLint 
Results\n============\nLike unit test results, you can report lint results 
alongside a message. The `lint` parameter should contain results as a list of 
dictionaries with these keys:\n\n| Key | Type | Description 
|\n|-------------|--------------|--------------|\n| `name` | \/\/string\/\/ | 
Short message name, lik
 e \"Syntax Error\". |\n| `code` | \/\/string\/\/ | Lint message code 
identifying the type of message, like \"ERR123\". |\n| `severity` | 
\/\/string\/\/ | Severity of the message. |\n| `path` | \/\/string\/\/ | Path 
to the file containing the lint message, from the project root. |\n| `line` | 
\/\/optional int\/\/ | Line number in the file where the text which triggered 
the message first appears. The first line of the file is line 1, not line 0. 
|\n| `char` | \/\/optional int\/\/ | Byte position on the line where the text 
which triggered the message starts. The first byte on the line is byte 1, not 
byte 0. This position is byte-based (not character-based) because not all 
lintable files have a valid character encoding. |\n| `description` | 
\/\/optional string\/\/ | Long explanation of the lint message. |\n\nThe 
`severity` parameter recognizes these severity levels:\n\n| Key | Name 
|\n|-------------|--------------|\n| `advice` | **Advice** |\n| `autofix` | 
**Auto-Fix** |\n| `warning` | 
 **Warning** |\n| `error` | **Error** |\n| `disabled` | **Disabled** |\n\nThis 
is a simple, valid value for the `lint` parameter. It reports one error and one 
warning:\n\n```lang=json\n[\n  {\n    \"name\": \"Syntax Error\",\n    
\"code\": \"EXAMPLE1\",\n    \"severity\": \"error\",\n    \"path\": 
\"path\/to\/example.c\",\n    \"line\": 17,\n    \"char\": 3\n  },\n  {\n    
\"name\": \"Not A Haiku\",\n    \"code\": \"EXAMPLE2\",\n    \"severity\": 
\"error\",\n    \"path\": \"path\/to\/source.cpp\",\n    \"line\": 23,\n    
\"char\": 1,\n    \"description\": \"This function definition is not a 
haiku.\"\n  }\n]\n```\n\n","params":{"buildTargetPHID":"required 
phid","type":"required string-constant\u003c\"pass\", \"fail\", 
\"work\"\u003e","unit":"optional list\u003cwild\u003e","lint":"optional 
list\u003cwild\u003e"},"return":"void"},"macro.query":{"description":"Retrieve 
image macro information.","params":{"authorPHIDs":"optional 
list\u003cphid\u003e","phids":"optional list\u003cphid\u003e
 ","ids":"optional list\u003cid\u003e","names":"optional 
list\u003cstring\u003e","nameLike":"optional 
string"},"return":"list\u003cdict\u003e"},"macro.creatememe":{"description":"Generate
 a meme.","params":{"macroName":"string","upperText":"optional 
string","lowerText":"optional 
string"},"return":"string"},"maniphest.createtask":{"description":"Create a new 
Maniphest task.","params":{"title":"required string","description":"optional 
string","ownerPHID":"optional phid","viewPolicy":"optional phid or policy 
string","editPolicy":"optional phid or policy string","ccPHIDs":"optional 
list\u003cphid\u003e","priority":"optional int","projectPHIDs":"optional 
list\u003cphid\u003e","auxiliary":"optional dict"},"return":"nonempty 
dict"},"maniphest.gettasktransactions":{"description":"Retrieve Maniphest task 
transactions.","params":{"ids":"required 
list\u003cint\u003e"},"return":"nonempty list\u003cdict\u003cstring, 
wild\u003e\u003e"},"maniphest.info":{"description":"Retrieve information about 
a 
 Maniphest task, given its ID.","params":{"task_id":"required 
id"},"return":"nonempty dict"},"maniphest.query":{"description":"Execute 
complex searches for Maniphest tasks.","params":{"ids":"optional 
list\u003cuint\u003e","phids":"optional 
list\u003cphid\u003e","ownerPHIDs":"optional 
list\u003cphid\u003e","authorPHIDs":"optional 
list\u003cphid\u003e","projectPHIDs":"optional 
list\u003cphid\u003e","ccPHIDs":"optional 
list\u003cphid\u003e","fullText":"optional string","status":"optional 
string-constant\u003c\"status-any\", \"status-open\", \"status-closed\", 
\"status-resolved\", \"status-wontfix\", \"status-invalid\", \"status-spite\", 
\"status-duplicate\"\u003e","order":"optional 
string-constant\u003c\"order-priority\", \"order-created\", 
\"order-modified\"\u003e","limit":"optional int","offset":"optional 
int"},"return":"list"},"maniphest.querystatuses":{"description":"Retrieve 
information about possible Maniphest task status 
values.","params":[],"return":"nonempty dict\u003cstring, w
 ild\u003e"},"maniphest.update":{"description":"Update an existing Maniphest 
task.","params":{"id":"optional int","phid":"optional int","title":"optional 
string","description":"optional string","ownerPHID":"optional 
phid","viewPolicy":"optional phid or policy string","editPolicy":"optional phid 
or policy string","ccPHIDs":"optional 
list\u003cphid\u003e","priority":"optional int","projectPHIDs":"optional 
list\u003cphid\u003e","auxiliary":"optional dict","status":"optional 
string","comments":"optional string"},"return":"nonempty 
dict"},"maniphest.edit":{"description":"This is a standard 
**ApplicationEditor** method which allows you to create and modify objects by 
applying transactions. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional id|p
 hid|string"},"return":"map\u003cstring, 
wild\u003e"},"maniphest.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"owners.edit":{"description":"This is a standard 
**ApplicationEditor** method which allows you to create and modify objects by 
applying transactions. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=artic
 le&jump=1 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"owners.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"owners.query":{"description":"Query for Owners packages. 
Obsoleted by \"owners.search\".","params":{"userOwner":"optional 
string","projectOwner
 ":"optional string","userAffiliated":"optional 
string","repositoryCallsign":"optional string","path":"optional 
string"},"return":"dict\u003cphid -\u003e dict of package 
info\u003e"},"passphrase.query":{"description":"Query 
credentials.","params":{"ids":"optional list\u003cint\u003e","phids":"optional 
list\u003cphid\u003e","needSecrets":"optional bool","needPublicKeys":"optional 
bool","order":"optional order","before":"optional string","after":"optional 
string","limit":"optional int (default = 
100)"},"return":"list\u003cdict\u003e"},"paste.create":{"description":"Create a 
new paste.","params":{"content":"required string","title":"optional 
string","language":"optional string"},"return":"nonempty 
dict"},"paste.query":{"description":"Query Pastes.","params":{"ids":"optional 
list\u003cint\u003e","phids":"optional 
list\u003cphid\u003e","authorPHIDs":"optional 
list\u003cphid\u003e","after":"optional int","limit":"optional int, default = 
100"},"return":"list\u003cdict\u003e"},"paste.edit":{
 "description":"This is a standard **ApplicationEditor** method which allows 
you to create and modify objects by applying transactions. For documentation on 
these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"paste.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional or
 der","before":"optional string","after":"optional string","limit":"optional 
int (default = 100)"},"return":"map\u003cstring, 
wild\u003e"},"paste.info":{"description":"Retrieve an array of information 
about a paste.","params":{"paste_id":"required id"},"return":"nonempty 
dict"},"phame.blog.edit":{"description":"This is a standard 
**ApplicationEditor** method which allows you to create and modify objects by 
applying transactions. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"phame.blog.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ https:\/\/secure.phab
 
ricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"phame.post.edit":{"description":"This is a standard 
**ApplicationEditor** method which allows you to create and modify objects by 
applying transactions. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"phame.post.search":{"description":"This is a
  standard **ApplicationSearch** method which will let you list, query, or 
search for objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return":"map\u003cstring, 
wild\u003e"},"phid.lookup":{"description":"Look up objects by 
name.","params":{"names":"required list\u003cstring\u003e"},"return":"nonempty 
dict\u003cstring, wild\u003e"},"phid.query":{"description":"Retrieve 
information about arbitrary PHIDs.","params":{"phids":"required 
list\u003cphid\u003e"},"return":"nonempty dict\u003cstring, 
wild\u003e"},"phid.info":{"description":"Retrieve information about an arb
 itrary PHID.","params":{"phid":"required phid"},"return":"nonempty 
dict\u003cstring, wild\u003e"},"phragment.getpatch":{"description":"Retrieve 
the patches to apply for a given set of files.","params":{"path":"required 
string","state":"required dict\u003cstring, string\u003e"},"return":"nonempty 
dict"},"phragment.queryfragments":{"description":"Query fragments based on 
their paths.","params":{"paths":"required 
list\u003cstring\u003e"},"return":"nonempty 
dict"},"phriction.create":{"description":"Create a Phriction 
document.","params":{"slug":"required string","title":"required 
string","content":"required string","description":"optional 
string"},"return":"nonempty dict"},"phriction.edit":{"description":"Update a 
Phriction document.","params":{"slug":"required string","title":"optional 
string","content":"optional string","description":"optional 
string"},"return":"nonempty dict"},"phriction.history":{"description":"Retrieve 
history about a Phriction document.","params":{"slug":"required
  string"},"return":"nonempty list"},"phriction.info":{"description":"Retrieve 
information about a Phriction document.","params":{"slug":"required 
string"},"return":"nonempty dict"},"project.create":{"description":"Create a 
project.","params":{"name":"required string","members":"optional 
list\u003cphid\u003e","icon":"optional string","color":"optional 
string","tags":"optional 
list\u003cstring\u003e"},"return":"dict"},"project.query":{"description":"Execute
 searches for Projects.","params":{"ids":"optional 
list\u003cint\u003e","names":"optional 
list\u003cstring\u003e","phids":"optional 
list\u003cphid\u003e","slugs":"optional 
list\u003cstring\u003e","icons":"optional 
list\u003cstring\u003e","colors":"optional 
list\u003cstring\u003e","status":"optional string-constant\u003c\"status-any\", 
\"status-open\", \"status-closed\", \"status-active\", 
\"status-archived\"\u003e","members":"optional 
list\u003cphid\u003e","limit":"optional int","offset":"optional 
int"},"return":"list"},"project.edi
 t":{"description":"This is a standard **ApplicationEditor** method which 
allows you to create and modify objects by applying transactions. For 
documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Edit+Endpoints&type=article&jump=1
 | Conduit API: Using Edit Endpoints 
]]**.","params":{"transactions":"list\u003cmap\u003cstring, 
wild\u003e\u003e","objectIdentifier":"optional 
id|phid|string"},"return":"map\u003cstring, 
wild\u003e"},"project.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, bool\u003e","order":"optio
 nal order","before":"optional string","after":"optional 
string","limit":"optional int (default = 100)"},"return":"map\u003cstring, 
wild\u003e"},"releeph.getbranches":{"description":"Return information about all 
active Releeph branches.","params":[],"return":"nonempty 
list\u003cdict\u003cstring, 
wild\u003e\u003e"},"releeph.querybranches":{"description":"Query information 
about Releeph branches.","params":{"ids":"optional 
list\u003cid\u003e","phids":"optional 
list\u003cphid\u003e","productPHIDs":"optional 
list\u003cphid\u003e","before":"optional string","after":"optional 
string","limit":"optional int (default = 
100)"},"return":"query-results"},"releeph.queryproducts":{"description":"Query 
information about Releeph products.","params":{"ids":"optional 
list\u003cid\u003e","phids":"optional 
list\u003cphid\u003e","repositoryPHIDs":"optional 
list\u003cphid\u003e","isActive":"optional bool","before":"optional 
string","after":"optional string","limit":"optional int (default = 
100)"},"return"
 :"query-results"},"releeph.queryrequests":{"description":"Return information 
about all Releeph requests linked to the given 
ids.","params":{"revisionPHIDs":"optional 
list\u003cphid\u003e","requestedCommitPHIDs":"optional 
list\u003cphid\u003e"},"return":"dict\u003cstring, 
wild\u003e"},"releeph.request":{"description":"Request a commit or diff to be 
picked to a branch.","params":{"branchPHID":"required 
string","things":"required list\u003cstring\u003e","fields":"dict\u003cstring, 
string\u003e"},"return":"dict\u003cstring, 
wild\u003e"},"releephwork.canpush":{"description":"Return whether the conduit 
user is allowed to push.","params":{"projectPHID":"required 
string"},"return":"bool"},"releephwork.getauthorinfo":{"description":"Return a 
string to use as the VCS author.","params":{"userPHID":"required 
string","vcsType":"required string"},"return":"nonempty 
string"},"releephwork.getbranch":{"description":"Return information to help 
checkout \/ cut a Releeph branch.","params":{"branchPHID"
 :"required string"},"return":"dict\u003cstring, 
wild\u003e"},"releephwork.getbranchcommitmessage":{"description":"Get a commit 
message for committing a Releeph branch.","params":{"branchPHID":"required 
string"},"return":"nonempty 
string"},"releephwork.getcommitmessage":{"description":"Get commit message 
components for building a ReleephRequest commit 
message.","params":{"requestPHID":"required string","action":"required 
string-constant\u003c\"pick\", \"revert\"\u003e"},"return":"dict\u003cstring, 
string\u003e"},"releephwork.nextrequest":{"description":"Return info required 
to cut a branch, and pick and revert 
ReleephRequests.","params":{"branchPHID":"required phid","seen":"required 
map\u003cstring, 
bool\u003e"},"return":""},"releephwork.record":{"description":"Record whether 
we committed a pick or revert to the upstream 
repository.","params":{"requestPHID":"required string","action":"required 
string-constant\u003c\"pick\", \"revert\"\u003e","commitIdentifier":"required 
string"},"ret
 urn":"void"},"releephwork.recordpickstatus":{"description":"Record whether a 
pick or revert was successful or not.","params":{"requestPHID":"required 
string","action":"required string-constant\u003c\"pick\", 
\"revert\"\u003e","ok":"required bool","dryRun":"optional 
bool","details":"optional dict\u003cstring, 
wild\u003e"},"return":""},"remarkup.process":{"description":"Process text 
through remarkup in Phabricator context.","params":{"context":"required 
string-constant\u003c\"phriction\", \"maniphest\", \"differential\", \"phame\", 
\"feed\", \"diffusion\"\u003e","contents":"required 
list\u003cstring\u003e"},"return":"nonempty 
dict"},"repository.query":{"description":"Query 
repositories.","params":{"ids":"optional list\u003cint\u003e","phids":"optional 
list\u003cphid\u003e","callsigns":"optional 
list\u003cstring\u003e","vcsTypes":"optional 
list\u003cstring\u003e","remoteURIs":"optional 
list\u003cstring\u003e","uuids":"optional 
list\u003cstring\u003e","order":"optional order","before":"
 optional string","after":"optional string","limit":"optional int (default = 
100)"},"return":"list\u003cdict\u003e"},"slowvote.info":{"description":"Retrieve
 an array of information about a poll.","params":{"poll_id":"required 
id"},"return":"nonempty dict"},"token.give":{"description":"Give or change a 
token.","params":{"tokenPHID":"phid|null","objectPHID":"phid"},"return":"void"},"token.given":{"description":"Query
 tokens given to 
objects.","params":{"authorPHIDs":"list\u003cphid\u003e","objectPHIDs":"list\u003cphid\u003e","tokenPHIDs":"list\u003cphid\u003e"},"return":"list\u003cdict\u003e"},"token.query":{"description":"Query
 
tokens.","params":[],"return":"list\u003cdict\u003e"},"user.disable":{"description":"Permanently
 disable specified users (admin only).","params":{"phids":"required 
list\u003cphid\u003e"},"return":"void"},"user.enable":{"description":"Re-enable 
specified users (admin only).","params":{"phids":"required 
list\u003cphid\u003e"},"return":"void"},"user.query":{"desc
 ription":"Query users.","params":{"usernames":"optional 
list\u003cstring\u003e","emails":"optional 
list\u003cstring\u003e","realnames":"optional 
list\u003cstring\u003e","phids":"optional list\u003cphid\u003e","ids":"optional 
list\u003cuint\u003e","offset":"optional int","limit":"optional int (default = 
100)"},"return":"list\u003cdict\u003e"},"user.whoami":{"description":"Retrieve 
information about the logged-in user.","params":[],"return":"nonempty 
dict\u003cstring, wild\u003e"},"user.search":{"description":"This is a standard 
**ApplicationSearch** method which will let you list, query, or search for 
objects. For documentation on these endpoints, see **[[ 
https:\/\/secure.phabricator.com\/diviner\/find\/?name=Conduit+API%3A+Using+Search+Endpoints&type=article&jump=1
 | Conduit API: Using Search Endpoints ]]**.","params":{"queryKey":"optional 
string","constraints":"optional map\u003cstring, 
wild\u003e","attachments":"optional map\u003cstring, 
bool\u003e","order":"optional order","befo
 re":"optional string","after":"optional string","limit":"optional int (default 
= 100)"},"return":"map\u003cstring, 
wild\u003e"},"user.find":{"description":"Lookup PHIDs by username. Obsoleted by 
\"user.query\".","params":{"aliases":"required 
list\u003cstring\u003e"},"return":"nonempty dict\u003cstring, phid\u003e"}}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phabricator-0.7.0/phabricator/tests/resources/certificate.txt 
new/python-phabricator-0.8.1/phabricator/tests/resources/certificate.txt
--- old/phabricator-0.7.0/phabricator/tests/resources/certificate.txt   
1970-01-01 01:00:00.000000000 +0100
+++ new/python-phabricator-0.8.1/phabricator/tests/resources/certificate.txt    
2021-02-23 22:35:45.000000000 +0100
@@ -0,0 +1 @@
+fdhcq3zsyijnm4h6gmh43zue5umsmng5t4dlwodvmiz4cnc6fl6fzrvjbfg2ftktrcddan7b3xtgmfge2afbrh4uwam6pfxpq5dbkhbl6mgaijdzpq5efw2ynlnjhoeqyh6dakl4yg346gbhabzkcxreu7hcjhw6vo6wwa7ky2sjdk742khlgsakwtme6sr2dfkhlxxkcqw3jngyrq5zj7m6m7hnscuzlzsviawnvg47pe7l4hxiexpbb5k456r
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phabricator-0.7.0/phabricator/tests/resources/responses.json 
new/python-phabricator-0.8.1/phabricator/tests/resources/responses.json
--- old/phabricator-0.7.0/phabricator/tests/resources/responses.json    
1970-01-01 01:00:00.000000000 +0100
+++ new/python-phabricator-0.8.1/phabricator/tests/resources/responses.json     
2021-02-23 22:35:45.000000000 +0100
@@ -0,0 +1,5 @@
+{
+  "conduit.connect": 
"{\"result\":{\"connectionID\":1759,\"sessionKey\":\"lwvyv7f6hlzb2vawac6reix7ejvjty72svnir6zy\",\"userPHID\":\"PHID-USER-6ij4rnamb2gsfpdkgmny\"},\"error_code\":null,\"error_info\":null}",
+  "user.whoami": 
"{\"result\":{\"phid\":\"PHID-USER-6ij4rnamz2gxfpbkamny\",\"userName\":\"testaccount\",\"realName\":\"Test
 Account\"},\"error_code\":null,\"error_info\":null}",
+  "maniphest.find": 
"{\"result\":{\"PHID-TASK-4cgpskv6zzys6rp5rvrc\":{\"id\":\"722\",\"phid\":\"PHID-TASK-4cgpskv6zzys6rp5rvrc\",\"authorPHID\":\"PHID-USER-5022a9389121884ab9db\",\"ownerPHID\":\"PHID-USER-5022a9389121884ab9db\",\"ccPHIDs\":[\"PHID-USER-5022a9389121884ab9db\",\"PHID-USER-ba8aeea1b3fe2853d6bb\"],\"status\":\"3\",\"priority\":\"Needs
 Triage\",\"title\":\"Relations should be two-way\",\"description\":\"When 
adding a differential revision you can specify Maniphest Tickets to add the 
relation. However, this doesnt add the relation from the ticket -> the 
differently.(This was added via the commit 
message)\",\"projectPHIDs\":[\"PHID-PROJ-358dbc2e601f7e619232\",\"PHID-PROJ-f58a9ac58c333f106a69\"],\"uri\":\"https://secure.phabricator.com/T722\",\"auxiliary\":[],\"objectName\":\"T722\",\"dateCreated\":\"1325553508\",\"dateModified\":\"1325618490\"}},\"error_code\":null,\"error_info\":null}";
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phabricator-0.7.0/phabricator/tests/test_phabricator.py 
new/python-phabricator-0.8.1/phabricator/tests/test_phabricator.py
--- old/phabricator-0.7.0/phabricator/tests/test_phabricator.py 2016-07-08 
17:41:35.000000000 +0200
+++ new/python-phabricator-0.8.1/phabricator/tests/test_phabricator.py  
2021-02-23 22:35:45.000000000 +0100
@@ -3,20 +3,14 @@
 except ImportError:
     import unittest
 
-try:
-    from StringIO import StringIO
-except ImportError:
-    from io import StringIO
-
-try:
-    import unittest.mock as mock
-except ImportError:
-    import mock
+import requests
+import responses
 
 from pkg_resources import resource_string
 import json
 
 import phabricator
+phabricator.ARCRC = {}  # overwrite any arcrc that might be read
 
 
 RESPONSES = json.loads(
@@ -40,7 +34,7 @@
         self.api = phabricator.Phabricator(
             username='test',
             certificate='test',
-            host='http://localhost'
+            host='http://localhost/api/'
         )
         self.api.certificate = CERTIFICATE
 
@@ -49,35 +43,32 @@
         hashed = self.api.generate_hash(token)
         self.assertEqual(hashed, 'f8d3bea4e58a2b2967d93d5b307bfa7c693b2e7f')
 
-    @mock.patch('phabricator.httplib.HTTPConnection')
-    def test_connect(self, mock_connection):
-        mock_obj = mock_connection.return_value = mock.Mock()
-        mock_obj.getresponse.return_value = StringIO(
-            RESPONSES['conduit.connect']
-        )
-        mock_obj.getresponse.return_value.status = 200
+    @responses.activate
+    def test_connect(self):
+        responses.add('POST', 'http://localhost/api/conduit.connect',
+                      body=RESPONSES['conduit.connect'], status=200)
 
         api = phabricator.Phabricator(
             username='test',
             certificate='test',
-            host='http://localhost'
+            host='http://localhost/api/'
         )
 
         api.connect()
         keys = api._conduit.keys()
         self.assertIn('sessionKey', keys)
         self.assertIn('connectionID', keys)
+        assert len(responses.calls) == 1
 
-    @mock.patch('phabricator.httplib.HTTPConnection')
-    def test_user_whoami(self, mock_connection):
-        mock_obj = mock_connection.return_value = mock.Mock()
-        mock_obj.getresponse.return_value = StringIO(RESPONSES['user.whoami'])
-        mock_obj.getresponse.return_value.status = 200
+    @responses.activate
+    def test_user_whoami(self):
+        responses.add('POST', 'http://localhost/api/user.whoami',
+                      body=RESPONSES['user.whoami'], status=200)
 
         api = phabricator.Phabricator(
             username='test',
             certificate='test',
-            host='http://localhost'
+            host='http://localhost/api/'
         )
         api._conduit = True
 
@@ -87,7 +78,7 @@
         api = phabricator.Phabricator(
             username='test',
             certificate='test',
-            host='http://localhost'
+            host='http://localhost/api/'
         )
 
         self.assertEqual(api.user.whoami.method, 'user')
@@ -97,40 +88,37 @@
         api = phabricator.Phabricator(
             username='test',
             certificate='test',
-            host='http://localhost'
+            host='http://localhost/api/'
         )
 
         self.assertEqual(api.diffusion.repository.edit.method, 'diffusion')
-        self.assertEqual(api.diffusion.repository.edit.endpoint, 
'repository.edit')
+        self.assertEqual(
+            api.diffusion.repository.edit.endpoint, 'repository.edit')
 
-    @mock.patch('phabricator.httplib.HTTPConnection')
-    def test_bad_status(self, mock_connection):
-        mock_obj = mock_connection.return_value = mock.Mock()
-        mock_obj.getresponse.return_value = mock.Mock()
-        mock_obj.getresponse.return_value.status = 400
+    @responses.activate
+    def test_bad_status(self):
+        responses.add(
+            'POST', 'http://localhost/api/conduit.connect', status=400)
 
         api = phabricator.Phabricator(
-                username='test',
-                certificate='test',
-                host='http://localhost'
+            username='test',
+            certificate='test',
+            host='http://localhost/api/'
         )
-        api._conduit = True
 
-        with self.assertRaises(phabricator.httplib.HTTPException):
+        with self.assertRaises(requests.exceptions.HTTPError):
             api.user.whoami()
+        assert len(responses.calls) == 1
 
-    @mock.patch('phabricator.httplib.HTTPConnection')
-    def test_maniphest_find(self, mock_connection):
-        mock_obj = mock_connection.return_value = mock.Mock()
-        mock_obj.getresponse.return_value = StringIO(
-            RESPONSES['maniphest.find']
-        )
-        mock_obj.getresponse.return_value.status = 200
+    @responses.activate
+    def test_maniphest_find(self):
+        responses.add('POST', 'http://localhost/api/maniphest.find',
+                      body=RESPONSES['maniphest.find'], status=200)
 
         api = phabricator.Phabricator(
             username='test',
             certificate='test',
-            host='http://localhost'
+            host='http://localhost/api/'
         )
         api._conduit = True
 
@@ -161,16 +149,26 @@
 
     def test_map_param_type(self):
         uint = 'uint'
-        self.assertEqual(phabricator.map_param_type(uint), int) 
+        self.assertEqual(phabricator.map_param_type(uint), int)
 
         list_bool = 'list<bool>'
-        self.assertEqual(phabricator.map_param_type(list_bool), [bool]) 
+        self.assertEqual(phabricator.map_param_type(list_bool), [bool])
 
         list_pair = 'list<pair<callsign, path>>'
-        self.assertEqual(phabricator.map_param_type(list_pair), [tuple]) 
+        self.assertEqual(phabricator.map_param_type(list_pair), [tuple])
 
         complex_list_pair = 'list<pair<string-constant<"gtcm">, string>>'
-        self.assertEqual(phabricator.map_param_type(complex_list_pair), 
[tuple])
+        self.assertEqual(phabricator.map_param_type(
+            complex_list_pair), [tuple])
+
+
+    def test_endpoint_shadowing(self):
+        shadowed_endpoints = [e for e in self.api._interface.keys() if e in 
self.api.__dict__]
+        self.assertEqual(
+            shadowed_endpoints,
+            [],
+            "The following endpoints are shadowed: 
{}".format(shadowed_endpoints)
+        )
 
 if __name__ == '__main__':
     unittest.main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/phabricator.egg-info/PKG-INFO 
new/python-phabricator-0.8.1/phabricator.egg-info/PKG-INFO
--- old/phabricator-0.7.0/phabricator.egg-info/PKG-INFO 2016-07-08 
17:41:43.000000000 +0200
+++ new/python-phabricator-0.8.1/phabricator.egg-info/PKG-INFO  1970-01-01 
01:00:00.000000000 +0100
@@ -1,19 +0,0 @@
-Metadata-Version: 1.1
-Name: phabricator
-Version: 0.7.0
-Summary: Phabricator API Bindings
-Home-page: http://github.com/disqus/python-phabricator
-Author: Disqus
-Author-email: [email protected]
-License: UNKNOWN
-Description: UNKNOWN
-Platform: UNKNOWN
-Classifier: Intended Audience :: Developers
-Classifier: Intended Audience :: System Administrators
-Classifier: Operating System :: OS Independent
-Classifier: Topic :: Software Development
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/phabricator.egg-info/SOURCES.txt 
new/python-phabricator-0.8.1/phabricator.egg-info/SOURCES.txt
--- old/phabricator-0.7.0/phabricator.egg-info/SOURCES.txt      2016-07-08 
17:41:43.000000000 +0200
+++ new/python-phabricator-0.8.1/phabricator.egg-info/SOURCES.txt       
1970-01-01 01:00:00.000000000 +0100
@@ -1,16 +0,0 @@
-LICENSE
-MANIFEST.in
-README.rst
-setup.cfg
-setup.py
-phabricator/__init__.py
-phabricator/_compat.py
-phabricator/interfaces.json
-phabricator.egg-info/PKG-INFO
-phabricator.egg-info/SOURCES.txt
-phabricator.egg-info/dependency_links.txt
-phabricator.egg-info/not-zip-safe
-phabricator.egg-info/top_level.txt
-phabricator/tests/__init__.py
-phabricator/tests/test_phabricator.py
-phabricator/tests/resources/__init__.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/phabricator-0.7.0/phabricator.egg-info/dependency_links.txt 
new/python-phabricator-0.8.1/phabricator.egg-info/dependency_links.txt
--- old/phabricator-0.7.0/phabricator.egg-info/dependency_links.txt     
2016-07-08 17:41:43.000000000 +0200
+++ new/python-phabricator-0.8.1/phabricator.egg-info/dependency_links.txt      
1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/phabricator.egg-info/not-zip-safe 
new/python-phabricator-0.8.1/phabricator.egg-info/not-zip-safe
--- old/phabricator-0.7.0/phabricator.egg-info/not-zip-safe     2016-07-08 
17:41:43.000000000 +0200
+++ new/python-phabricator-0.8.1/phabricator.egg-info/not-zip-safe      
1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/phabricator.egg-info/top_level.txt 
new/python-phabricator-0.8.1/phabricator.egg-info/top_level.txt
--- old/phabricator-0.7.0/phabricator.egg-info/top_level.txt    2016-07-08 
17:41:43.000000000 +0200
+++ new/python-phabricator-0.8.1/phabricator.egg-info/top_level.txt     
1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-phabricator
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/setup.cfg 
new/python-phabricator-0.8.1/setup.cfg
--- old/phabricator-0.7.0/setup.cfg     2016-07-08 17:41:43.000000000 +0200
+++ new/python-phabricator-0.8.1/setup.cfg      2021-02-23 22:35:45.000000000 
+0100
@@ -1,8 +1,2 @@
 [bdist_wheel]
-universal = 1
-
-[egg_info]
-tag_svn_revision = 0
-tag_date = 0
-tag_build = 
-
+universal=1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/phabricator-0.7.0/setup.py 
new/python-phabricator-0.8.1/setup.py
--- old/phabricator-0.7.0/setup.py      2016-07-08 17:41:35.000000000 +0200
+++ new/python-phabricator-0.8.1/setup.py       2021-02-23 22:35:45.000000000 
+0100
@@ -4,7 +4,7 @@
 
 from setuptools import setup, find_packages
 
-tests_requires = []
+tests_requires = ['responses>=0.12']
 
 if sys.version_info[:2] < (2, 7):
     tests_requires.append('unittest2')
@@ -14,15 +14,18 @@
 
 setup(
     name='phabricator',
-    version='0.7.0',
+    version='0.8.1',
     author='Disqus',
     author_email='[email protected]',
     url='http://github.com/disqus/python-phabricator',
     description='Phabricator API Bindings',
     packages=find_packages(),
     zip_safe=False,
+    install_requires=['requests>=2.22'],
     test_suite='phabricator.tests.test_phabricator',
-    tests_require=tests_requires,
+    extras_require={
+        'tests': tests_requires,
+    },
     include_package_data=True,
     classifiers=[
         'Intended Audience :: Developers',

Reply via email to