Code Monkey home page Code Monkey logo

php-trello-api's Introduction

PHP Trello API v2 client

Build Status Code Coverage Code Quality Packagist

A simple Object Oriented wrapper for the Trello API, written in PHP7.4.

Uses Trello API v1. The object API is very similar to the RESTful API.

Features

  • Follows PSR-0 conventions and coding standards: autoload friendly
  • Light and fast thanks to lazy loading of API classes
  • Extensively tested
  • Ready for Symfony 5

Requirements

Installation

The recommended way is using composer:

$ composer require matteocacciola/php-trello-api

However, php-trello-api follows the PSR-0 naming conventions, which means you can easily integrate php-trello-api class loading in your own autoloader.

Basic usage

use Trello\Client;

$client = new Client();
$client->authenticate('api_key', 'token', Client::AUTH_URL_CLIENT_ID);

$boards = $client->api('member')->boards()->all();

The $client object gives you access to the entire Trello API.

Advanced usage with the Trello manager

This package includes a simple model layer above the API with a nice chainable API allowing following manipulation of Trello objects:

use Trello\Client;
use Trello\Manager;

$client = new Client();
$client->authenticate('api_key', 'token', Client::AUTH_URL_CLIENT_ID);

$manager = new Manager($client);

$card = $manager->getCard('547440ad3f8b882bc11f0497');

$card
    ->setName('Test card')
    ->setDescription('Test description')
    ->save();

Dispatching Trello events to your app

The service uses the Symfony EventDispatcher component to dispatch events occuring on incoming webhooks.

Take a look at the Events class constants for names and associated event classes.

use Trello\Client;
use Trello\Service;
use Trello\Events;

$client = new Client();
$client->authenticate('api_key', 'token', Client::AUTH_URL_CLIENT_ID);

$service = new Service($client);

// Bind a callable to a given event...
$service->addListener(Events::BOARD_UPDATE, function ($event) {
    $board = $event->getBoard();

    // do something
});

// Check if the current request was made by a Trello webhook
// This will dispatch any Trello event to listeners defined above
$service->handleWebhook();

Documentation

Contributing

Feel free to make any comments, file issues or make pull requests.

License

php-trello-api is licensed under the MIT License - see the LICENSE file for details

Credits

php-trello-api's People

Contributors

andreybolonin avatar augustohp avatar bogdan1993 avatar cdaguerre avatar dialogik avatar joe-brainlabs avatar joshk avatar matteocacciola avatar ogabrielsantos avatar xrip avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

php-trello-api's Issues

"Cannot put" for Laravel app

Hi there,

I want to update a checklist item with :

$client = new Client();
            $client->authenticate(env('TRELLO_API_KEY'), env('TRELLO_API_TOKEN'), Client::AUTH_URL_CLIENT_ID);

$card = $client->cards()->show($report_category->trello_card_id);
$checklistId = $card['idChecklists'][0];
$checklists = $client->card()->checklists()->all($card['id']);
$checkItemId = $checklists[0]['checkItems'][0]['id'];

$checkItem = $client->card()->checklists()->updateItem($card['id'], $checklistId, $checkItemId,
        [
               'state' => 'complete'
         ]
 );

But I want to execute this, an error appears :
Trello \ Exception \ RuntimeException (404)

Cannot PUT /1/cards/5d4a20142da4a07bbc21b99a/checklists/5d4a2015dff67c16ccac8d64/checkItem/5d4ab33e48e8396343770dc9?key=***&token=

get all Lists from board

Can someone give me hint, how I can get all lists in a specific board?
I tried
$boards = $manager->getBoard($board_id)->getLists();

but this is the point where I stuck.

Card members are not showing

I am working to assign and then show member of the card but it is showing resource not found error.
$allMembers = $client->api('card')->members()->all($id); with this error
"RuntimeException
The requested resource was not found."
. I have done it manually form card id which is working on trello developers.

Create a card with image

How can I set a card's image?
I checked https://developers.trello.com/reference#cards-2 to see how the api does it and tried this but doesn't work. Says that the fileSource is invalid.

How raw request should look like:
curl --request POST \ --url 'https://api.trello.com/1/cards?idList=idList&fileSource=data%3Aimage%2Fpng%3Bname%3Dcoolscreenhot.png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAANUAAAAsCAMAAA&keepFromSource=all'

How I tried doing it:


$this->client()->cards()->create([
	'idList' => 'listhere',
	'name' => 'name here',
	'desc' => 'cool description',
	'fileSource' => 'data:image/png;name=test.png;base64,' . base64_encode(Storage::disk('local')->get('image.png')), 
]);

Error - New card

Hello, I have trouble creating a new card, the error is:

Fatal error: Uncaught exception 'Trello\Exception\RuntimeException' with message 'The requested resource was not found. ' in C:\xampp\htdocs\trello-api\vendor\cdaguerre\php-trello-api\lib\Trello\HttpClient\Listener\ErrorListener.php:62 Stack trace: #0 [internal function]: Trello\HttpClient\Listener\ErrorListener->onRequestError(Object(Guzzle\Common\Event), 'request.error', Object(Symfony\Component\EventDispatcher\EventDispatcher)) #1 C:\xampp\htdocs\trello-api\vendor\symfony\event-dispatcher\EventDispatcher.php(164): call_user_func(Array, Object(Guzzle\Common\Event), 'request.error', Object(Symfony\Component\EventDispatcher\EventDispatcher)) #2 C:\xampp\htdocs\trello-api\vendor\symfony\event-dispatcher\EventDispatcher.php(53): Symfony\Component\EventDispatcher\EventDispatcher->doDispatch(Array, 'request.error', Object(Guzzle\Common\Event)) #3 C:\xampp\htdocs\trello-api\vendor\guzzle\guzzle\src\Guzzle\Http\Message\Request.php(589): Symfony\Component\EventDispatcher\EventDispatcher->dispatch('request.error', Object(Guzzle\C in C:\xampp\htdocs\trello-api\vendor\cdaguerre\php-trello-api\lib\Trello\HttpClient\HttpClient.php on line 152

guzzle installation problem

I tried to install this but my guzzle is too new:

matteocacciola/php-trello-api 2.0.0 requires guzzlehttp/guzzle ~5.3 -> found guzzlehttp/guzzle[5.3.0, ..., 5.3.4] but the package is fixed to 7.3.0 (lock file version) by a partial update and that version does not match.

Can you fix it?

Can't add a member to board

Hello I have and issue with adding new member to board.

I can get board which I want, can use i.e. ->setLabelNames() but can't use setMemberships();

Is this function "that" function what I need to add new member to the board?

I used exactly this code
$currentBoard->setMemberships([ 'idMembership' => 'id of member', 'type' => 'normal' ])->save();

Please help me :( I really need it to finish my work.

Client::AUTH_HTTP_PASSWORD method

I am trying to connect with Trello with AUTH_HTTP_PASSWORD method:

$this->client = new Client();
$this->client->authenticate($username, $password, Client::AUTH_HTTP_PASSWORD);

and get all user boards:

$boards = $this->client->api('member')->boards()->all('me');

But I get an error:
PHP Fatal error: Uncaught exception 'Trello\Exception\RuntimeException' with message 'Invalid Authorization Header'

Is this a bug or Trello blocked this method?

error on Dispatching Trello events to your app

hi
error on Dispatching Trello events to your app

( ! ) Fatal error: Uncaught TypeError: Argument 1 passed to Symfony\Component\HttpFoundation\ParameterBag::replace() must be of the type array, null given, called in D:\wamp64\www\1397\php-trello-api-master\lib\Trello\Service.php on line 95 and defined in D:\wamp64\www\1397\php-trello-api-master\vendor\symfony\http-foundation\ParameterBag.php on line 59

Update guzzlehttp/guzzle deps and create a new tag

Hello

Is it possible for you to create a new tag after updating the dep guzzle to a newer version ?

The aim is to get rid of

Package guzzle/guzzle is abandoned, you should avoid using it. Use guzzlehttp/guzzle instead.

Many thanks

Planyway_Data-DO_NOT_DELETE

Description of Trello Card start return extra characters like:
[](Planyway_Data-DO_NOT_DELETE)[](eJyVUk1r4zAQ/S86p2UkW5LlW4i7ECg9pOketixF1oy6oo4dLKVQQv575aSFTUtgF3QQ8+Z9aDR79kpjDEPPavZashlDm+zPU2mJrOYAMxbivOsa+8bqNO5oxmKyY8oEAUJcQXElJiL1+LWEO7oN/cv6bUsZah5unu7X89X6HPmUPuI3d01GB+8jpWZHZ4JrMDVAPtcA8Cu3bccwjCFlbs7odjENmyanZ/WeOTviaugmgcV8NWme8B+BOlxkMJ46H/csTLGVENK3Vmpecu+UQzBYaqnPictjK1dlWbVSEXhteIuaKo9Vy77PKcTFsNl2lCgTve0iHWbnhpURBgtTeSoEEseLho4KR0Ziqz1xZb0/Dvi/DVsFWoOX2VBrqwrlLr7QtSQLLwSvjCmrChX+m+HvLPiH3Msy0ebvSed6P6Tgg7MpL1c8lbq8BR/X/JfPobfdRFp+RC5KDgjgnCsk1960svTADod3sqbUtg==)

What does It mean and how to remove that?

Issue with attachments.

Can you show me please how can an attachment can be added?

Here is my current code:

$reply_upload = $client->api('cards')->attachments()->create($id_card, array(
'file' => DOCROOT.'media/uploads/issue_tracker/'.$options['filename'],
'mimeType' => File::mime_by_ext($ext),
'name' => uniqid().'.'.$ext
));

The issue is that if I put the path to the file on the file parameter .. it shows in the content of the Trello attachment but if I use file_get_contents on it, it is ok there but the mime is not set at all.

Thanks!

Trello/Api/Card will throw an exception when due date is not null

Trello/Model/Card.php expects a due date as DateTime but Trello/Api/Card does not convert the object to a valid string. When create or update is called, Guzzle throws an exception because can't handle the DateTime object.

 [Symfony\Component\Debug\Exception\FatalErrorException]                          
 Error: Method Guzzle\Http\QueryString::__toString() must not throw an exception

Can I send a PR?

403 deprecated

Not workin anymore since api updated from Atlassian: https://developer.atlassian.com/changelog/#CHANGE-1459

403 ERROR
The request could not be satisfied.
Bad request. We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.
Generated by cloudfront (CloudFront)
Request ID: m_m-gAKPJn8VCHIvdphdRLMNZi1qeEtLsWejL8-pHnLNgrkYlzZIew=

How i can add 2 or more descriptions on a card?

I have a code:
`$client = new Client();
$client->authenticate($apiKey, $token, Client::AUTH_URL_CLIENT_ID);

$manager = new Manager($client);
$card = $manager->getCard();

$card
->setName($_POST['nameProj'])
->setListId('5ac91a71bd573908d72377cd')
->setDescription('NewDescr')
->setDescription('Newdesct2')
->save();`
When I add second "->setDescription('Newdesct2')", the first one is not working. How I can fix this?

Question: How to add board and organization members?

Hi,

I'm trying to add members to both an organization and a board.

Regarding the board, I've tried things like:
$board->setMemberships(['idMembership' => $baboon->trello_username, 'type' => $role])
->save();

And loads of other things but without success. I also tried to put that member above into an array because the function's doc says 'An array of array' but that's pretty much all.

Any ideas?

Is this project still being maintained?

It's been about 5 months since the last commit and the last version released was in 2015.

Is there any plans to continue maintaining this package or has it been abandoned?

Labels in card are not saved

Hi guys,

When i'm trying to create a new card, there is no problem with this. But, if I want to assign a label on this card with the addLabel method, it seems doesn't work.

For example :

$card = new Card();
$card->setName('Name');
$card->setDescription('Description');

$card->addLabel('green');//-> $this->data['labels'] doesn't exists, a error was thrown
// OR
$card->setLabels([['colors' => 'green']]); //->Array has been taken from addLabel function

$card->save();

If we debug the body of the request send on save, we have this (with the addLabel and the fix for $data['labels'] not exists) :

array (
  'idBoard' => 'xxxxxxxxxxxx',
  'idList' => 'xxxxxxxxx',
  'name' => 'Name',
  'desc' => 'Description',
  'due' => NULL,
  'urlSource' => NULL,
  'labels/0' => 'green',
)  

I think the body is not good according to Trello API right ?

Thanks !

Package abandoned?

if this project do not maintained, please set as abandoned in the packagist.org
thx

Comments aren't triggering the webhook events

I have my server listening to webhook events like so:

$client = new Client();
$client->authenticate(Credentials::TrelloAPIKey, Credentials::TrelloAPIToken, Client::AUTH_URL_CLIENT_ID);

$service = new Service($client);

// Other event listeners here
$service->addListener(Events::CARD_COMMENT, function (CardCommentEvent $event) {
//    do something here
});
$service->handleWebhook();

However, when I comment on a card, nothing happens. Other triggers, like creating a card or changing a card's list, work perfectly.

RuntimeException error

If you get non-existent card
$getCard = $client->api('card')->show('123456', ['fields' => 'all', 'customFieldItems' => true]);
You get Fatal Error Instead of correct throw RuntimeException:
Fatal error: Uncaught Error: Cannot use object of type GuzzleHttp\Stream\Stream as array in ... /vendor/matteocacciola/php-trello-api/lib/Trello/HttpClient/Subscriber/ErrorSubscriber.php on line 89

Solution was go to file /vendor/matteocacciola/php-trello-api/lib/Trello/HttpClient/Subscriber/ErrorSubscriber.php on line 89 and change this line:
throw new RuntimeException(isset($content['message']) ? $content['message'] : $content, $response->getStatusCode());
to new:
throw new RuntimeException(is_array($content) && isset($content['message']) ? $content['message'] : $content, $response->getStatusCode());

Fatal error: Uncaught exception 'Trello\Exception\RuntimeException'

hi
i catch fatal error, what is this?

Fatal error: Uncaught exception 'Trello\Exception\RuntimeException' with message 'T' in /www/lib/Trello/HttpClient/Listener/ErrorListener.php:62 Stack trace: #0 [internal function]: Trello\HttpClient\Listener\ErrorListener->onRequestError(Object(Guzzle\Common\Event), 'request.error', Object(Symfony\Component\EventDispatcher\EventDispatcher)) #1 /www/vendor/symfony/event-dispatcher/EventDispatcher.php(184): call_user_func(Array, Object(Guzzle\Common\Event), 'request.error', Object(Symfony\Component\EventDispatcher\EventDispatcher)) #2 /www/vendor/symfony/event-dispatcher/EventDispatcher.php(46): Symfony\Component\EventDispatcher\EventDispatcher->doDispatch(Array, 'request.error', Object(Guzzle\Common\Event)) #3 /www/vendor/guzzle/guzzle/src/Guzzle/Http/Message/Request.php(589): Symfony\C in /www/lib/Trello/HttpClient/HttpClient.php on line 152

code in my project:

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
require 'vendor/autoload.php';
use Trello\Client;
use Trello\Manager;

$client = new Client();

$client->authenticate('example-dsfsfdsf34f43f34ff3f', ''example-dffdsfde3r4443ffvf33', Client::AUTH_URL_CLIENT_ID);

$manager = new Manager($client);

$card = $manager->getCard(''example-fe4f4f54f45f');
echo $client;

Checlist item state always true

Because of this line:

$this->data['checkItems'][$key]['state'] = in_array($item['state'], array(true, 'complete', 'true'));

$this->data['checkItems'][$key]['state'] = in_array($item['state'], array(true, 'complete', 'true'));

Should be:

$this->data['checkItems'][$key]['state'] = in_array($item['state'], array(true, 'complete', 'true'), true);

The problem is that both 'incomplete' == true and 'complete' == true evaluate to true. The strict mode is required (in_array, third parameter). To me it seems even unneeded to have this kind of in_array check. The values are just 'incomplete' and 'complete', right? Can't we trust on that?

Webhook handle return null

In webhook handle I can't get the "action" data.

I've checked this$request->getContent() it has data

But, in this in code $request->get('action') return null

I try it this way I got 500 Internal Server Error

if (!$this->isTrelloWebhook($request)) {
  return;
}

$action = json_decode($request->getContent(), true)['action'];

Anyone have and idea how to catch the request?

Thank you

How to delete a card?

Hi everybody,
Please tell me how to delete a card? I can not see any method like "delete()" or "remove()" on Card class.
Many thanks!

Client::AUTH_HTTP_PASSWORD method

I am trying to connect with Trello with AUTH_HTTP_PASSWORD method:

$this->client = new Client();
$this->client->authenticate($username, $password, Client::AUTH_HTTP_PASSWORD);

and get all user boards:

$boards = $this->client->api('member')->boards()->all('me');

But I get an error:
PHP Fatal error: Uncaught exception 'Trello\Exception\RuntimeException' with message 'Invalid Authorization Header'

Is this a bug or Trello blocked this method?

Webhook JSON body not being parsed?

I'm not sure if the Trello API was updated recently but the webhooks were not working out of the box. I needed to modify the Service::handleWebhook method to be like this:

if (!$request) {
    $request = Request::createFromGlobals();
    $data = json_decode($request->getContent(), true);
    $request->request->replace($data);
}

How to debug rate limiting errors, or all the API calls being made?

Hi Christian,

So I am using this wrapper to automate Trello cards on an internal platform. One page lists actions and triggers that need to take place or Trello cards to be copied when the actions take place - mostly relating to staff on-boarding and departure ... On listing the page of actions and triggers, I get the following in the error log ...

[2019-06-03 12:33:53] request.CRITICAL: Uncaught PHP Exception Trello\Exception\RuntimeException: "Rate limit exceeded" at /var/www/html/vendor/cdaguerre/php-trello-api/lib/Trello/HttpClient/HttpClient.php line 152 {"exception":"[object] (Trello\\Exception\\RuntimeException(code: 429): Rate limit exceeded at /var/www/html/vendor/cdaguerre/php-trello-api/lib/Trello/HttpClient/HttpClient.php:152, Trello\\Exception\\RuntimeException(code: 429): Rate limit exceeded at /var/www/html/vendor/cdaguerre/php-trello-api/lib/Trello/HttpClient/Listener/ErrorListener.php:62)"} []

All that we do is a refresh of the page but the weird thing is that the list displays fine at times. But gives that error in the log at other times.

Any advice to debug all the calls that are happening?

Apologies - I know this is more of a support request rather than an issue per se

Thank you in advance

Too many api calls when trying to get cards moved from a list to another

Hi,

Here is a use case I needed to implement for generating BurnDown Chart using Trello actions.

Here is my algorithme :

  1. Get board
  2. Get lists "from and "to"
  3. Get all cards in the "to" list.
  4. Foreach cards of this list, get all actions of the card.
  5. Foreach action, check the type of action (update) and check from wich list and to wich list the card has been moved (in order to check if the card is coming from my "from" list)
  6. If the card is coming from the "from" list, get the name and preg_match ([0-9]*)

The global goal is to find all cards which have been moved from a list 1 to a list 2 during an interval of 2 dates.

Unfortunately, it seems that Trello API does not provide a web service to get all the moved card from or to a selected list.

Anyway, with your php-trello-api wrapper, it seems that the refresh method is called each time an object is instantiated... resulting an API call for each instantiation...

In my example it result 1865 API Calls...

Here is the Blackfire profile : https://blackfire.io/profiles/dff19c00-03a0-41b8-99f7-d36dcf542f3e/graph?settings%5Bdimension%5D=wt&settings%5Bdisplay%5D=landscape&settings%5BtabPane%5D=nodes&selected=&callname=main()

Add Function to Delete/Remove Cards

lib/Trello/Api/Card.php is missing the bits to delete/remove a card, I'll just leave this here:

public function remove($id)
{
    return $this->delete($this->getPath().'/'.rawurlencode($id));
}

How to get boards lists ??

Hello , i got all the boards using boards()->all() method after this i'm getting array like this

0 => array:23 [▼ "name" => "2017 Spring Products" "desc" => "" "descData" => null "closed" => false "idOrganization" => "55b9087e7c4fb0d17b4d83e4" "limits" => null "pinned" => null "invitations" => null "shortLink" => "byu1RxCC" "powerUps" => [] "dateLastActivity" => "2017-05-24T00:05:10.992Z" "idTags" => [] "datePluginDisable" => null "id" => "58dc0c4ad5af9684b24132c0" "invited" => false "starred" => false "url" => "https://trello.com/b/byu1RxCC/2017-spring-products" "prefs" => array:20 [▶] "subscribed" => false "labelNames" => array:10 [▶] "dateLastView" => "2018-03-28T07:07:00.878Z" "shortUrl" => "https://trello.com/b/byu1RxCC" "memberships" => array:4 [▶] ]

Then how can view this boards cards using id or etc ... And which method is used to get particular boards values ???? can u help me in this ???

Class 'Symfony \ Component \ EventDispatcher \ Event' not found

Error on request, tried to install EventDispatcher separately, but did not help.
My code;
`protected $client;

public function __construct()
{
    $this->client = new Client();

    $this->client->authenticate(getenv('TRELLO_API_KEY'), getenv('TRELLO_TOKEN'),Client::AUTH_URL_CLIENT_ID);
}

public function createCard(Task $task): array
{
    $this->client->api('members')->boards()->all('me');
    dd( 1);
}`

how i can retrieve webhook data

$json = file_get_contents('php://input');
$action = json_decode($json, true);

    \Storage::put('test.txt', $action);

    $client = new Client();
    $client->authenticate('my api key', 'my token', Client::AUTH_URL_CLIENT_ID);
    
    $service = new Service($client);

    // Check if the current request was made by a Trello webhook
    // This will dispatch any Trello event to listeners defined above
    //$service->handleWebhook();
    
    \Storage::put('test2.txt', $service->handleWebhook());

what is the wrong

i try the same webhook with requestcatcher.com it's working .. but how i can catch to request in laravel

Including even a null due date causes Trello to set the due date

When updating anything other than the due date on a card, the expected behavior is that the due date is not touched.

However, it looks like we set the parameter due to null, and this causes Trello to leave a message about setting the due date to Invalid date.

screen shot 2016-05-11 at 2 57 06 pm

I confirmed with Trello support that the due parameter should be omitted if not updating it.

Example code that will cause this:

$trello_card->setListId( $list_id )->save();

Will submit a PR to fix.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.