Retrofit implementation in PHP. A REST client for PHP.

Related tags

HTTP retrofit-php
Overview

Retrofit PHP

Build Status Code Coverage Scrutinizer Code Quality SensioLabsInsight

Retrofit is a type-safe REST client. It is blatantly stolen from square/retrofit and implemented in PHP.

UPGRADE NOTICE

Version 3 introduces many breaking changes. Please review the upgrade guide before upgrading.

Overview

The following is for version 3, please check out the corresponding tag for version 2 documentation

Retrofit allows you to define your REST API with a simple interface. The follow example will attempt to display a typical use-case, but requires two additional libraries. The first uses Guzzle to make http requests as Retrofit does not ship with any default way to make network requests. The second uses a serializer (Gson) to hook into Retrofit's Converter functionality. This allows for automatic serialization of request bodies and deserialization of response bodies.

interface GitHubService
{
    /**
     * @GET("/users/{user}/list")
     * @Path("user")
     * @ResponseBody("App\GithubService\ListRepo")
     * @ErrorBody("App\GitHubService\ApiError")
     */
    public function listRepos(string $user): Call;
}

Annotations are used to configure the endpoint. Then, the Retrofit class generates a working implementation of the service interface.

$retrofit = Retrofit::builder()
    ->setBaseUrl('https://api.github.com')
    ->setHttpClient(new Guzzle6HttpClient(new Client())) // requires a separate library
    ->addConverterFactory(new GsonConverterFactory(Gson::builder()->build())) // requies a separate library
    ->build();
    
$gitHubService = $retrofit->create(GitHubService::class);

Our newly created service is capable of making GET requests to /users/{user}/list, which returns a Call object.

$call = $gitHubService->listRepos('octocat');

The Call object is then used to execute the request synchronously or asynchronously, returning a response.

$response = $call->execute();

// or

$call->enqueue(
    function(Response $response) { }, // response callback (optional)
    function(Throwable $throwable) { } // error callback (optional)
);
$call->wait();

You can then check to see if the request was successful and get the deserialized response body.

if (!$response->isSuccessful()) {
    throw new ApiException($response->errorBody());
}

$responseBody = $response->body();

Usage examples are referenced from Square's documentation

Installation & Usage

Retrofit 3 requires PHP 7.1

composer require tebru/retrofit-php

Please make sure you also install an http client.

composer require tebru/retrofit-php-http-guzzle6

Install a converter to handle more advanced request and response body conversions.

composer require tebru/retrofit-php-converter-gson

Documentation

License

This project is licensed under the MIT license. Please see the LICENSE file for more information.

Comments
  • Add a layout capabilitie to {% bootstrap_form %}

    Add a layout capabilitie to {% bootstrap_form %}

    situation

    for now, the tag {% bootstrap_form %} create an horizontal OR inline form.

        <form role="form" method="post">
            {% csrf_token %}
            {% bootstrap_form form %}
            {% buttons submit='OK' reset="Cancel" %}{% endbuttons %}
        </form>
    

    forms_orig

    cons

    But what if we want two field on the same line for readability purpose ? we then must stop use {% bootstrap_form %} and switch to a {% bootstrap_field %} for each fields and create our line with .row and .col-md-6.

        <form role="form" method="post">
            {% csrf_token %}
          <div class="row">
            <div class="col-md-6">
              {%  bootstrap_field form.subject %}
            </div>
            <div class="col-md-6">
              {%  bootstrap_field form.password %}
            </div>
          </div>
          {%  bootstrap_field form.message %}
          {% buttons submit='OK' reset="Cancel" %}{% endbuttons %}
        </form>
    

    form_password_n_subject

    this is a probleme as soon as the form is a little dynamic and when some field can be missing (ie because of user perms). so you will soon need to add some {% if %} that should not be used if {% bootstrap_form %} was used

        <form role="form" method="post">
            {% csrf_token %}
          <div class="row">
            <div class="col-md-6">
              {%  bootstrap_field form.subject %}
            </div>
            <div class="col-md-6">
              {%  bootstrap_field form.password %}
            </div>
          </div>
          {%  bootstrap_field form.message %}
          {%  if form.maybemissing %}
            {%  bootstrap_field form.maybemissing %}
          {%  endif %}
          {% buttons submit='OK' reset="Cancel" %}{% endbuttons %}
        </form>
    

    if you don't use {% if %} you will have the BootstrapError: Parameter "field" should contain a valid Django BoundField.

    enhancement

    it seem that the layout of {% bootstrap_form %} should be more powerfull and allow us to create a real layout, not just «horizontal» or «inline».

    so, we can have in form.py

    
    class MyLayoutForm(forms.Form):
        layout = [
            ("subject", "password"),
            "message",
            "maybemissing"
        ]
        subject = forms.CharField(
            max_length=100,
            help_text='my_help_text',
            required=True,
            widget=forms.TextInput(attrs={'placeholder': 'placeholdertest'}),
        )
        password = forms.CharField(widget=forms.PasswordInput)
        message = forms.CharField(required=False, help_text='<i>my_help_text</i>')
        maybemissing = forms.EmailField(
            label='Sender © unicode',
            help_text='E.g., "[email protected]"')
    
        def __init__(self, *args, **kwargs):
            super(MyLayoutForm, self).__init__(*args, **kwargs)
            if whatever:
                self.fields.pop("maybemissing")
    

    and keep the simple {% bootstrap_form %} in our template, as desired :

        <form role="form" method="post">
            {% csrf_token %}
            {% bootstrap_form form %}
            {% buttons submit='OK' reset="Cancel" %}{% endbuttons %}
        </form>
    

    by adding the "layout" attribute of the Form, the {% bootstrap_form %} will use it for the form rendering. if none layout is given, it will create one with all fields, which will render exactly the same way as before.

    the layout will allow to create the .row and .col-md-x recursively. It will take 2 possible type

    list and tuple

    so, to get the following form, we can just add a list with tuples :

        class MyLayoutForm(forms.Form):
            layout = [
                ("subject", "password"),
                "message",
                "maybemissing"
            ]
            ...
    

    form_password_n_subject

    Col and Row

    the col and Row are the final step of the layout processing. all given layout will be computed in Col and Row. the {% bootstrap_form %} will use it to render the correct layout.

    The Col class

    Col(unicode: fieldname, unicode: class_="col-md-x", *rows)

    the Col represent a <div class="col-md-xx">. it can contains other rows or a field of the form (by his name)

    Col("message")
    
    Col("message", class_="col-md-6 red")
    
    Col(
        Row("message"),
        Row("password")
    )
    

    the Row class

    Row(*cols_or_fields, **field_config)

    a Row can contains many Col, or the name of the fields. the related Col will be created to give equal size of all fields. the desired class can be given with a dict like construction. where the name of the field is the key, and the class is the value

    the followings lines are equivalent :

    Row("message", "subject")
    
    Row(message="col-md-6", subject="col-md-6")
    
    Row(Col("message", class_="col-md-6"), Col("subject", class_="col-md-6"))
    

    a Row should always contains Col and Col can contains Row or the field itself. a Row can be used as :

    layout = [
        Row(subject="col-md-8 col-xs-6", password="col-md-4 col-xs-6"),
        Row("message"),
        Row(maybemissing="col-md-12"),
    ]
    

    Col and Row mixed up with list and tuples

    the list constuction is compiled in Row/Col construction. the 3 following initialization will be identical.

    layout = (
        ("message", "subject"),
        ("mybemissing",)
    ) 
    layout = Col(
        ("message", "subject"),
        ("mybemissing",)
    )
    layout = Col(
        Row("message", "subject"),
        Row("mybemissing",)
    ) 
    

    Col and Row recursivity

    you can add row into cols and cols into Row without deep limitation

    layout = Row(
        Col(Row(Col("subject")), Row(Col("message"))),
        Col("password", "maybemissing"),
    )
    

    the last hope

    with this logic, it can even be possible to add more layout class with Row and Col, like Tab, Fieldset or Accordion.

    opened by onysos 16
  • How to use local bootstrap?

    How to use local bootstrap?

    Of course, I can override css_url with hardcoded URL. But how to use static tag to get css file url without overriding whole bootstrap3.html template?

    opened by cl0ne 14
  • Fix Django 1.9 warning

    Fix Django 1.9 warning

    django-bootstrap3/bootstrap3/utils.py:142: RemovedInDjango110Warning: render() must be called with a dict, not a Context.
      return template.render(Context(context))
    
    opened by jonashaag 13
  • Python33 Django 1.6.5 - demo error

    Python33 Django 1.6.5 - demo error

    I have Python33 with Django 1.6.5, when I'm trying to run demo got error.

    Installed c:\tmp\django-bootstrap3-4.7.0
    

    Successfully installed django-bootstrap3 Cleaning up...

    C:\tmp\django-bootstrap3-4.7.0\demo>python manage.py runserver Traceback (most recent call last): File "manage.py", line 10, in execute_from_command_line(sys.argv) File "C:\Program Files (x86)\Python33\lib\site-packages\django\core\management init.py", line 399, in execute_from_command_line utility.execute() File "C:\Program Files (x86)\Python33\lib\site-packages\django\core\management init.py", line 392, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "C:\Program Files (x86)\Python33\lib\site-packages\django\core\management init.py", line 261, in fetch_command commands = get_commands() File "C:\Program Files (x86)\Python33\lib\site-packages\django\core\management init.py", line 107, in get_commands apps = settings.INSTALLED_APPS File "C:\Program Files (x86)\Python33\lib\site-packages\django\conf__init__.p y", line 54, in getattr self.setup(name) File "C:\Program Files (x86)\Python33\lib\site-packages\django\conf__init_.p y", line 50, in setup self.configure_logging() File "C:\Program Files (x86)\Python33\lib\site-packages\django\conf__init.p y", line 72, in configure_logging from django.utils.log import DEFAULT_LOGGING File "C:\Program Files (x86)\Python33\lib\site-packages\django\utils\log.py", line 7, in from django.views.debug import ExceptionReporter, get_exception_reporter_fil ter File "C:\Program Files (x86)\Python33\lib\site-packages\django\views\debug.py" , line 10, in from django.http import (HttpResponse, HttpResponseServerError, File "C:\Program Files (x86)\Python33\lib\site-packages\django\http__init_.p y", line 2, in from django.http.request import (HttpRequest, QueryDict, UnreadablePostError , File "C:\Program Files (x86)\Python33\lib\site-packages\django\http\request.py ", line 14, in from django.http.multipartparser import MultiPartParser File "C:\Program Files (x86)\Python33\lib\site-packages\django\http\multipartp arser.py", line 10, in import cgi File "C:\Program Files (x86)\Python33\lib\cgi.py", line 40, in import html File "C:\tmp\django-bootstrap3-4.7.0\bootstrap3\html.py", line 4, in from django.forms.widgets import flatatt File "C:\Program Files (x86)\Python33\lib\site-packages\django\forms__init__. py", line 8, in from django.forms.fields import * File "C:\Program Files (x86)\Python33\lib\site-packages\django\forms\fields.py ", line 17, in from django.forms.util import ErrorList, from_current_timezone, to_current_t imezone File "C:\Program Files (x86)\Python33\lib\site-packages\django\forms\util.py", line 4, in from django.utils.html import format_html, format_html_join File "C:\Program Files (x86)\Python33\lib\site-packages\django\utils\html.py", line 12, in from django.utils.text import normalize_newlines File "C:\Program Files (x86)\Python33\lib\site-packages\django\utils\text.py", line 11, in from django.utils.six.moves import html_entities ImportError: cannot import name html_entities

    bug awaiting feedback 
    opened by omcdr 13
  • 'str' object has no attribute 'non_field_errors'

    'str' object has no attribute 'non_field_errors'

    Error during template rendering

    In template C:...............\blog\index.html, error at line 21

    <form action="/url/to/submit/" method="post" class="form">
    

    20 {% csrf_token %} 21 {% bootstrap_form form %} 22 {% bootstrap_form_buttons %} 23 26 {% end_bootstrap_form_buttons %}

    opened by znetor 13
  • Add basic tag that generates tabs

    Add basic tag that generates tabs

    Will be filling branch with more commits as I implement them.

    Goals:

    • extra css classes for li elements
    • pills variant
    • bootstrap_tabs_activate for corresponding js snippet
    • docs (whistle)
    • maybe: bootstrap_tabs_container block tag for the actual tab content
    opened by melvyn-sopacua 12
  • Django 1.9: template tag output needs to be marked as safe

    Django 1.9: template tag output needs to be marked as safe

    Edit: I know that Django 1.9 hasn't been released yet. :)

    Django 1.9 tightens up some security around template tags: https://docs.djangoproject.com/en/dev/releases/1.9/#simple-tag-now-wraps-tag-output-in-conditional-escape

    This change in Django is causing the bootstrap_form template tag to output the form markup as text instead of an actual form - ie. you see the html markup for the fields rather than the fields themselves.

    bug 
    opened by jaddison 11
  • bootstrap3 cannot load template tags

    bootstrap3 cannot load template tags

    Trying to migrate from bootstrap_toolkit to bootstrap3, both released by you. Bootstrap_toolkit works perfectly, however when I download bootstrap3, add to settings.py and include the appropriate tag { load bootstrap3 } I get a Django error that states bootstrap3 is not a valid tag library. Checked the directory /usr/local/lib/python2.7 /distpackage and bootstrap3 is in the correct spot, along with the old bootstrap_toolkit. Am I missing something?

    Best, Greg

    opened by gcperrin 11
  • Error on upgrading to 11.0.0

    Error on upgrading to 11.0.0

    I tried to upgrade from 9.0.0 to 11.0.0 but I keep getting the following BootstrapError when I try to access my app. I can't figure out what the issue is, so I've gone back to 9.0.0 in the meantime. Any ideas?

    Environment:
    
    
    Request Method: GET
    Request URL: http://example.com/login/
    
    Django Version: 1.11.15
    Python Version: 3.6.5
    Installed Applications:
    ['harold.apps.HaroldConfig',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'bootstrap3']
    Installed Middleware:
    ['django.middleware.security.SecurityMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'harold.middleware.current_user.CurrentUserMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware']
    
    
    Template error:
    In template /opt/django/leasea/harold/templates/harold/login.html, error at line 22
       Function "url_to_attrs_dict" expects a string or a dict with key "url".   12 : 
       13 :     <meta charset="utf-8">
       14 :     <meta http-equiv="X-UA-Compatible" content="IE=edge">
       15 :     <meta name="viewport" content="width=device-width, initial-scale=1">
       16 :     <meta name="description" content="">
       17 :     <meta name="author" content="">
       18 : 
       19 :     <title>Login</title>
       20 : 
       21 :     <!-- Bootstrap Core CSS -->
       22 :      {% bootstrap_css %} 
       23 : 
       24 :     <!-- MetisMenu CSS -->
       25 :     <link href="{% static 'harold/vendor/metisMenu/metisMenu.min.css' %}" rel="stylesheet">
       26 : 
       27 :     <!-- Custom CSS -->
       28 :     <link href="{% static 'harold/dist/css/sb-admin-2.min.css' %}" rel="stylesheet">
       29 : 
       30 :     <!-- Morris Charts CSS -->
       31 :     <link href="{% static 'harold/vendor/morrisjs/morris.css' %}" rel="stylesheet">
       32 : 
    
    
    Traceback:
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/bootstrap3/utils.py" in url_to_attrs_dict
      184.             url_value = url["url"]
    
    During handling of the above exception ('NoneType' object is not subscriptable), another exception occurred:
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
      41.             response = get_response(request)
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
      217.                 response = self.process_exception_by_middleware(e, request)
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
      215.                 response = response.render()
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/django/template/response.py" in render
      107.             self.content = self.rendered_content
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/django/template/response.py" in rendered_content
      84.         content = template.render(context, self._request)
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/django/template/backends/django.py" in render
      66.             return self.template.render(context)
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/django/template/base.py" in render
      207.                     return self._render(context)
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/django/template/base.py" in _render
      199.         return self.nodelist.render(context)
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/django/template/base.py" in render
      990.                 bit = node.render_annotated(context)
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/django/template/base.py" in render_annotated
      957.             return self.render(context)
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/django/template/library.py" in render
      203.         output = self.func(*resolved_args, **resolved_kwargs)
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/bootstrap3/templatetags/bootstrap3.py" in bootstrap_css
      207.     rendered_urls = [render_link_tag(bootstrap_css_url())]
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/bootstrap3/utils.py" in render_link_tag
      120.     url_dict = url_to_attrs_dict(url, url_attr="href")
    
    File "/opt/django/leasea_venv/lib/python3.6/site-packages/bootstrap3/utils.py" in url_to_attrs_dict
      187.                 'Function "url_to_attrs_dict" expects a string or a dict with key "url".'
    
    Exception Type: BootstrapError at /login/
    Exception Value: Function "url_to_attrs_dict" expects a string or a dict with key "url".
    
    opened by patabongo 10
  • Fix Deprecation warning in Django 1.9

    Fix Deprecation warning in Django 1.9

    about first param to template.render:

    /home/jieter/.virtualenvs/bootstrap/local/lib/python2.7/site-packages/bootstrap3/utils.py:142: RemovedInDjango110Warning: render() must be called with a dict, not a Context.
      return template.render(Context(context))
    

    Let's see if this works better than my try in #292.

    opened by jieter 10
  • Fix Deprecation warning in Django 1.9

    Fix Deprecation warning in Django 1.9

    about first param to template.render:

    [...]bootstrap3/utils.py:142: RemovedInDjango110Warning: render() must be called with a dict, not a Context.
      return template.render(Context(context))
    

    Fixes #279 and #290

    opened by jieter 10
  • Bump tox from 3.27.1 to 4.2.1

    Bump tox from 3.27.1 to 4.2.1

    Bumps tox from 3.27.1 to 4.2.1.

    Release notes

    Sourced from tox's releases.

    4.2.1

    What's Changed

    New Contributors

    Full Changelog: https://github.com/tox-dev/tox/compare/4.2.0...4.2.1

    4.2.0

    What's Changed

    Full Changelog: https://github.com/tox-dev/tox/compare/4.1.3...4.2.0

    4.1.3

    What's Changed

    Full Changelog: https://github.com/tox-dev/tox/compare/4.1.2...4.1.3

    4.1.2

    What's Changed

    Full Changelog: https://github.com/tox-dev/tox/compare/4.1.1...4.1.2

    4.1.1

    What's Changed

    Full Changelog: https://github.com/tox-dev/tox/compare/4.1.0...4.1.1

    4.1.0

    What's Changed

    ... (truncated)

    Changelog

    Sourced from tox's changelog.

    v4.2.1 (2023-01-03)

    Bugfixes - 4.2.1

    - Fix extracting extras from markers with more than 2 extras in an or chain - by :user:`dconathan`. (:issue:`2791`)
    

    v4.2.0 (2023-01-03)

    Features - 4.2.0

    • Packaging environments now inherit from the pkgenv section, allowing to set all your packaging options in one place, and support the deps key to set additional dependencies that will be installed after pyproject.toml static requires but before backends dynamic requires - by :user:gaborbernat. (:issue:2543)

    Improved Documentation - 4.2.0

    - Document breaking changes with tox 4 and packaging environments - by :user:`gaborbernat`. (:issue:`2543`)
    - Document how to handle environments whose names match ``tox`` subcommands - by :user:`sirosen`. (:issue:`2728`)
    

    v4.1.3 (2023-01-02)

    Bugfixes - 4.1.3

    - Reuse package_env with ``--installpkg`` - by :user:`q0w`. (:issue:`2442`)
    - Fail more gracefully when pip :ref:`install_command` is empty - by :user:`jayaddison`. (:issue:`2695`)
    

    Improved Documentation - 4.1.3 </code></pre> <ul> <li>Add breaking-change documentation for empty <code>install_command</code> values - by :user:<code>jayaddison</code>. (:issue:<code>2695</code>)</li> </ul> <p>Misc - 4.1.3</p> <pre><code>- :issue:2796, :issue:2797

    v4.1.2 (2022-12-30)

    Bugfixes - 4.1.2 </code></pre> <ul> <li>Fix <code>--skip-missing-interpreters</code> behaviour - by :user:<code>q0w</code>. (:issue:<code>2649</code>)</li> <li>Restore tox 3 behaviour of showing the output of pip freeze, however now only active when running inside a CI environment - by :user:<code>gaborbernat</code>. (:issue:<code>2685</code>)</li> <li>Fix extracting extras from markers with many extras - by :user:<code>q0w</code>. (:issue:<code>2791</code>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary>

    <ul> <li><a href="https://github.com/tox-dev/tox/commit/43382af3a228c4dfc098ec50e136971553ee0035"><code>43382af</code></a> release 4.2.1</li> <li><a href="https://github.com/tox-dev/tox/commit/4578eaa45fe5f5f80f08754627be8f4376cf3a97"><code>4578eaa</code></a> update how extras are extracted to handle cases with more than 2 groups (<a href="https://github-redirect.dependabot.com/tox-dev/tox/issues/2812">#2812</a>)</li> <li><a href="https://github.com/tox-dev/tox/commit/27c52ec2b77647374b7ff4a82244f0ff489d1afc"><code>27c52ec</code></a> Update upgrading.rst</li> <li><a href="https://github.com/tox-dev/tox/commit/2e977fb97a60129eee6764fcf0a4c86e01ceabee"><code>2e977fb</code></a> Update changelog.rst</li> <li><a href="https://github.com/tox-dev/tox/commit/d16a666ae31c2fd6d8204c39498758cc529167a3"><code>d16a666</code></a> release 4.2.0</li> <li><a href="https://github.com/tox-dev/tox/commit/82dcd45af55af239a7be81ee2e86948c6fe75518"><code>82dcd45</code></a> Packaging inherits from pkgenv, deps and document tox 4 packaging changes (<a href="https://github-redirect.dependabot.com/tox-dev/tox/issues/2">#2</a>...</li> <li><a href="https://github.com/tox-dev/tox/commit/31c8d1fc48ccf95f66b2920b356f9490686ccfc7"><code>31c8d1f</code></a> Document ambiguous usages in v3-to-v4 (<a href="https://github-redirect.dependabot.com/tox-dev/tox/issues/2808">#2808</a>)</li> <li><a href="https://github.com/tox-dev/tox/commit/031e902822284d65cbeb11b23dd05e6ba5107961"><code>031e902</code></a> Introduce Upgrading doc page for tox4 (<a href="https://github-redirect.dependabot.com/tox-dev/tox/issues/2805">#2805</a>)</li> <li><a href="https://github.com/tox-dev/tox/commit/d05ea02b7344766be3eb8046bac8843e10cf43a8"><code>d05ea02</code></a> release 4.1.3</li> <li><a href="https://github.com/tox-dev/tox/commit/997128ced47936adabb2f267d2606f8eac253ad3"><code>997128c</code></a> Better message when command parsing on empty input (<a href="https://github-redirect.dependabot.com/tox-dev/tox/issues/2807">#2807</a>)</li> <li>Additional commits viewable in <a href="https://github.com/tox-dev/tox/compare/3.27.1...4.2.1">compare view</a></li> </ul> </details>

    <br />

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 0
  • Bump isort from 5.11.2 to 5.11.4

    Bump isort from 5.11.2 to 5.11.4

    Bumps isort from 5.11.2 to 5.11.4.

    Release notes

    Sourced from isort's releases.

    5.11.4

    Changes

    :package: Dependencies

    5.11.3

    Changes

    :beetle: Fixes

    :construction_worker: Continuous Integration

    v5.11.3

    Changes

    :beetle: Fixes

    :construction_worker: Continuous Integration

    Changelog

    Sourced from isort's changelog.

    5.11.4 December 21 2022

    5.11.3 December 16 2022

    Commits
    • 98390f5 Merge pull request #2059 from PyCQA/version/5.11.4
    • df69a05 Bump version 5.11.4
    • f9add58 Merge pull request #2058 from PyCQA/deps/poetry-1.3.1
    • 36caa91 Bump Poetry 1.3.1
    • 3c2e2d0 Merge pull request #1978 from mgorny/toml-test
    • 45d6abd Remove obsolete toml import from the test suite
    • 3020e0b Merge pull request #2057 from mgorny/poetry-install
    • a6fdbfd Stop installing documentation files to top-level site-packages
    • ff306f8 Fix tag template to match old standard
    • 227c4ae Merge pull request #2052 from hugovk/main
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 0
  • Bump autoflake from 1.7.8 to 2.0.0

    Bump autoflake from 1.7.8 to 2.0.0

    Bumps autoflake from 1.7.8 to 2.0.0.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 0
  • Bump flake8 from 5.0.4 to 6.0.0

    Bump flake8 from 5.0.4 to 6.0.0

    Bumps flake8 from 5.0.4 to 6.0.0.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 0
  • Bump m2r2 from 0.3.2 to 0.3.3

    Bump m2r2 from 0.3.2 to 0.3.3

    Bumps m2r2 from 0.3.2 to 0.3.3.

    Changelog

    Sourced from m2r2's changelog.

    Version 0.3.3 (2022-08-11)

    • Drop support for all python versions prior to 3.7
    • Upgrade to docutils 0.19
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 1
  • cannot create floating labels

    cannot create floating labels

    It seems impossible to create a bootstrap form with floating labels as shown below because:

    1. when using the bootstrap_field tag only, the label is rendered before the input tag, this breaks floating labels
    2. when using separate bootstrap_field and bootstrap_label tags, the input field is wrapped in a div that breaks floating labels.
    <div class="form-floating mb-3">
      <input type="email" class="form-control" id="floatingInput" placeholder="Username">
      <label for="floatingInput">Email address</label>
    </div>
    <div class="form-floating">
      <input type="password" class="form-control" id="floatingPassword" placeholder="Password">
      <label for="floatingPassword">Password</label>
    </div>
    
    opened by hayate 2
Releases(v3.2.1)
Owner
null
Event-driven, streaming HTTP client and server implementation for ReactPHP

HTTP Event-driven, streaming HTTP client and server implementation for ReactPHP. This HTTP library provides re-usable implementations for an HTTP clie

ReactPHP 640 Dec 29, 2022
A PHP HttpClient for the Neo4j ReST API with MultiDB Support

NeoClient This repository has moved Neoxygen's NeoClient has been moved to https://github.com/graphaware/neo4j-php-client Version 3 of this library is

Neoxygen 120 Oct 19, 2022
PSR-7 HTTP Message implementation

zend-diactoros Repository abandoned 2019-12-31 This repository has moved to laminas/laminas-diactoros. Master: Develop: Diactoros (pronunciation: /dɪʌ

Zend Framework 1.6k Dec 9, 2022
A super lightweight PSR-7 implementation

PSR-7 implementation A super lightweight PSR-7 implementation. Very strict and very fast. Description Guzzle Laminas Slim Nyholm Lines of code 3.300 3

Tobias Nyholm 972 Jan 5, 2023
Guzzle, an extensible PHP HTTP client

Guzzle, PHP HTTP client Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and trivial to integrate with web services. Simple interf

Guzzle 22.3k Jan 2, 2023
PHP's lightweight HTTP client

Buzz - Scripted HTTP browser Buzz is a lightweight (<1000 lines of code) PHP 7.1 library for issuing HTTP requests. The library includes three clients

Kris Wallsmith 1.9k Jan 4, 2023
HTTPlug, the HTTP client abstraction for PHP

HTTPlug HTTPlug, the HTTP client abstraction for PHP. Intro HTTP client standard built on PSR-7 HTTP messages. The HTTPlug client interface is compati

The PHP HTTP group 2.4k Dec 30, 2022
Unirest in PHP: Simplified, lightweight HTTP client library.

Unirest for PHP Unirest is a set of lightweight HTTP libraries available in multiple languages, built and maintained by Mashape, who also maintain the

Kong 1.3k Dec 28, 2022
↪️ Bypass for PHP creates a custom HTTP Server to return predefined responses to client requests

Bypass for PHP provides a quick way to create a custom HTTP Server to return predefined responses to client requests.Useful for tests with Pest PHP or PHPUnit.

CiaReis 101 Dec 1, 2022
A PHP proxy to solve client browser HTTP CORS(cross-origin) restrictions.

cors-bypass-proxy A PHP proxy to solve client browser HTTP CORS(cross-origin) restrictions. A simple way to solve CORS issue when you have no access t

Gracious Emmanuel 15 Nov 17, 2022
Zenscrape package is a simple PHP HTTP client-provider that makes it easy to parsing site-pages

Zenscrape package is a simple PHP HTTP client-provider that makes it easy to parsing site-pages

Andrei 3 Jan 17, 2022
General purpose PHP SOAP-client

General purpose PHP SOAP-client Sick and tired of building crappy SOAP implementations? This package aims to help you with some common SOAP integratio

PHPro 695 Dec 26, 2022
Async HTTP/1.1+2 client for PHP based on Amp.

This package provides an asynchronous HTTP client for PHP based on Amp. Its API simplifies standards-compliant HTTP resource traversal and RESTful web

AMPHP 641 Dec 19, 2022
Simple HTTP cURL client for PHP 7.1+ based on PSR-18

Simple HTTP cURL client for PHP 7.1+ based on PSR-18 Installation composer require sunrise/http-client-curl QuickStart composer require sunrise/http-f

Sunrise // PHP 15 Sep 5, 2022
Goetas-webservices / soap-client

goetas-webservices / soap-client PHP implementation of SOAP 1.1 and 1.2 client specifications. Strengths: Pure PHP, no dependencies on ext-soap Extens

Goetas Web Services 173 Dec 11, 2022
HTTP header kit for PHP 7.1+ (incl. PHP 8) based on PSR-7

HTTP header kit for PHP 7.1+ (incl. PHP 8) based on PSR-7 Installation composer require sunrise/http-header-kit How to use? HTTP Header Collection Mor

Sunrise // PHP 63 Dec 31, 2022
Express.php is a new HTTP - Server especially made for RESTful APIs written in PHP.

express.php Express.php is a new HTTP - Server especially made for RESTful APIs written in PHP. Features Fast The Library is handles requests fast and

null 5 Aug 19, 2022
PHP Curl ile letgo api kütüphanesi oluşturuldu. php ile letgo giriş yap.

Kendi LETGO API ile işlemler gerçekleştirelim. // email işlemleri $server = 'imap.gmail.com'; $user = '[email protected]'; $pass = 'password'; $port = 9

Görkem Bayraktar 2 Nov 3, 2022
Requests for PHP is a humble HTTP request library. It simplifies how you interact with other sites and takes away all your worries.

Requests for PHP Requests is a HTTP library written in PHP, for human beings. It is roughly based on the API from the excellent Requests Python librar

null 3.5k Dec 31, 2022