Giter VIP home page Giter VIP logo

jorgebastida / django-dajaxice Goto Github PK

View Code? Open in Web Editor NEW
403.0 34.0 176.0 2.34 MB

Easy to use AJAX library for django. dajaxice mains goal is to trivialize the asynchronous communication within the django server side code and your js code. It's an "agnostic JS framework" approach and focus on decoupling the presentation logic.

Home Page: http://dajaxproject.com/

License: Other

Python 75.49% JavaScript 24.51%

django-dajaxice's Introduction

django-dajaxice

https://badge.fury.io/py/django-dajaxice.png https://travis-ci.org/jorgebastida/django-dajaxice.png?branch=master https://pypip.in/d/django-dajaxice/badge.png

Dajaxice is the communication core of dajaxproject. It's main goal is to trivialize the asynchronous communication within the django server side code and your js code.

dajaxice is JS-framework agnostic and focuses on decoupling the presentation logic from the server-side logic. dajaxice only requieres 5 minutes to start working.

Project status

From v0.6 this project is not going to accept new features. In order to not break existing projects using this library, django-dajaxice will be maintained until django 1.8 is released.

Should I use django-dajaxice?

In a word, No. I created this project 4 years ago as a cool tool in order to solve one specific problem I had at that time.

These days using this project is a bad idea.

Perhaps I'm more pragmatic now, perhaps my vision of how my django projects should be coupled to libraries like this has change, or perhaps these days I really treasure the purity and simplicity of a vanilla django development.

If you want to mimic what this project does, you would only need some simple views and jQuery.

Forget about adding more unnecessary complexity. Keep things simple.

Project Aims

  • Isolate the communication between the client and the server.
  • JS Framework agnostic (No Prototype, JQuery... needed ).
  • Presentation logic outside the views (No presentation code inside ajax functions).
  • Lightweight.
  • Crossbrowsing ready.
  • Unobtrusive standard-compliant (W3C) XMLHttpRequest 1.0 object usage.

Official site http://dajaxproject.com Documentation http://readthedocs.org/projects/django-dajaxice/

django-dajaxice's People

Contributors

angelabad avatar antonagestam avatar clement avatar dnx avatar fladi avatar flegoff avatar horejsek avatar randalldegges-okta-2 avatar youen 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

django-dajaxice's Issues

Sending JSON to django?

Dear,

I am pretty new to the ajax - json stuff, so this might be an obvious question for some. But I have been banging my head for the past couple of days, so here it goes.

I am trying to do a synchronization with LinkedIn and am using their extremely simple Javascript API. Client side, everything goes fine, I get authorized and can display the information that I want. But I would also send this info back serverside, so I can save it. Since the LinkedIn service returns a JSON formatted value, I had hoped that I could just pass this along, but alas. (more info about the API http://developer.linkedinlabs.com/tutorials/jsapi_profile/ )
When I check what is being sent over, it is something like this:

`````` argv=%5B%7B%22length%22%3A1%2C%220%22%3A%7B%7D%2C%22context%22%3A%7B%22jQuery162016655682312221687%22%3A1%2C%22location%22%3A%7B%7D%2C%22onreadystatechange%22%3Anull%7D%2C%22selector%22%3A%22%23profile%22%7D%5D```

But when I print whatever I would like to send, it is in JSON format.

I managed to build up arrays and send pieces of info, but I was hoping to simply send the whole bunch all together...

Here is some code snippets:

*javascript on page:

    </div>
    <script type="IN/Login" data-onAuth="loadData"></script>```

*javascript function and callback:

```function loadData() {
    IN.API.Profile("me")
    .fields(["firstName","lastName","headline","positions"])
    .result(function(result) {
        profile = [];
        profile = $("#profile").html(JSON.stringify(result));
        Dajaxice.valueRecycling.assessmentRecycling.sync_linkedin(callback_sync_linkedin, [profile]);
    } )
function callback_sync_linkedin(data){
    alert(data.data);
}```

* ajax function

```def sync_linkedin(request, data):
    return simplejson.dumps({'data': data})
dajaxice_functions.register(sync_linkedin)
}```

Thanks for any pointers!

Please remove zip_safe

Hi Jorge, please remove zip_safe from setup.py. Is an unrecognized option for standard python distutils.

Here is the patch included in debian package:

--- a/setup.py
+++ b/setup.py
@@ -13,7 +13,6 @@
url = "http://dajaxproject.com",
packages= ['dajaxice', 'dajaxice.templatetags', 'dajaxice.core', 'dajaxice.management.commands'],
package_data = {'dajaxice': ['templates/dajaxice/*']},

  • zip_safe = False,
    classifiers=['Development Status :: 4 - Beta',
    'Environment :: Web Environment',
    'Framework :: Django',
    @@ -22,4 +21,4 @@
    'Operating System :: OS Independent',
    'Programming Language :: Python',
    'Topic :: Utilities']
    -)
    \ No newline at end of file
    +)

xhr.upload is undefined

I'm currently developing a file-upload javascript module, and I think that dajaxice somehow is messing things up.

In a fresh console on firefox/chrome i can write:
new XMLHttpRequest().upload ? true :false

which will respond with "true" in the console (requires modern browser)

If i do the same in my django project with dajaxice, I get false

I'm suspecting that the xmlHttpRequst object get's manipulated within dajaxice.

This is unfortunate as xhr.upload gives the means to track progress of a file-stream.

Dajaxice should make use of autodiscover pattern

Propose to use autodiscover pattern (similar to Django's admin) - this would allow other pluggable's to use dajaxice - having to configure ajaxed functions at project's level makes it a little bit harder.

generate_static_dajaxice command doesn't work when using easy_install

It seems that Django cannot recognize new management commands when Python packages are installed as eggs by easy_install. Adding 'zip_safe = False' should solve this problem by preventing easy_install from zipping (or egging) the package allowing Django to recognize the generate_static_dajaxice command. An explanation is here:

http://stackoverflow.com/questions/1145524/how-to-make-easy-install-expand-a-package-into-directories-rather-than-a-single-e

missing some characters

When you send strings like 'my+stuff' back to dajaxice, the ajax.py will only get 'my stuff' --- the '+' is replaced by ' ' (space)!

But looks like other characters are fine (~!@#$%^&*, etc.).

Not sure if it's a bug or I need to somehow "encode" the string before sending. This issue can be critical as tokens/hashes may often contains '+'. I don't want to send plain text back, of course.

Root of Onclick button

I have a fail in the root of de onclick button... My application is called 'ajax'... and inside I have a views.py

I write:
onclick="Dajaxice.ajax.views(my_callback)">???????

I probe diferent forms but I don´t resolve it...

Thanks.
Greatings

"Something goes wrong" when DAJAXICE_DEBUG=False

I am working on a project that implements endless scroll. I am using Dajaxice to get content from the database and display it on the screen. However, whenever the page is refreshed during an AJAX call, I get the annoying, "Something goes wrong" error. This site needs to be launched soon, and this isn't something that I want to display for real users, especially since nothing is actually going wrong.

Is there any way to suppress this error, perhaps even on a case-by-case basis? I would rather not have everyone on the team editing the core Dajaxice source code on their machines, as well as editing the source code directly on the production server.

All help is appreciated, and thank you for this library. It's been a great help. Also, I'm sorry if this sounds more like a question than an issue. I sort of combined them together.

Gerard

Problem with Opera Turbo mode

Ive been using Dajaxice for a simple project, this morning I turned on turbo and then had "something goes wrong", spent a while trying to work out what was going on, then turned it off and it worked fine again.

Not a problem for my small project as its personal, but thought its worth knowing.

Request timeout

There is a way to catch timeout issues?. I can recognize 3 kinds of end states after an JS call:

  1. Everthing is OK and the answer comes good from server
  2. Something bad occurs serverside and an DAJAXICE_EXCEPTION comes good from server.
  3. The server is down, and nothing is triggered to handle this.

How to handle type 3 issues?

onclick in examples

The examples give the onclick code in the form of:

onclick="Dajaxice.example.myexample(my_js_callback);"

This failed for me under Firefox 11 (the alert flicked onto the screen, then was immediately removed) and recent Safari (alert appears with the usual "Something goes wrong" message). I was using "" for the href URL.

Changing this to:

onclick="Dajaxice.example.myexample(my_js_callback); return false;"

means the alert appears, displaying data.message correctly, in both browsers.

Need help to send parameters to a function in ajax.py

Hello

I've been doing something with dajaxice, very simple, just to see that everything is working fine. Now, I want to do some complicated work but I don't know how to send parameters to the function.

I have an Id, and I need to get some data based on that id so, I need to send it to the function and work around that id and retrieve the data related to the id.

I've tried using Dajaxice.MyApp.myExample(my_js_callback,{'data':this.id}); but it throws an error: TypeError: myexample() got an unexpected keyword argument 'data'.

Can anyone help me? Please is urgent!

Please remove the setuptools import try

Hi Jorge, Im again :-D Please remove the try for setuptools in setup.py. For this package with standard python distutils is enough, Remove unnecesary deps, less depends, less problems.

What shit of bug tracker without file upload option :-D

I attach the debian package applied patch:

--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,4 @@
-try:

  • from setuptools import setup
    -except:
  • from distutils.core import setup
    +from distutils.core import setup

setup(
name = "django-dajaxice",

Thanks for your work!

Best Regards,

example question

This is your example for arg, No effects for me. The 'text' shall be text?

problem with cyrillic in post

Example:
callback=Dajax.process&argv=%7B%22form%22%3A%7B%22description%22%3A%22%u0430%22%2C%22conference%22%3A%227050f7448d9411df982a0026557eb006%22%2C%22image%22%3A%221498f6f58f7148aca69b13ec4e034b89%22%7D%7D

python can't decode %22%3A%22%u0430%22%2C%22 because '%u0430' is not valid unicode string
'%u0430' = cyrilic 'а' symbol

to fix this my patch:

--- /usr/local/src/django/django-dajaxice/dajaxice/core/DajaxiceRequest.py 2010-07-08 14:15:07.246026470 +0300
+++ DajaxiceRequest.py 2010-07-20 11:19:11.010302874 +0300
@@ -59,6 +59,15 @@

log.info('DAJAXICE_MODERN_IMPORT=%s' % DAJAXICE_MODERN_IMPORT)

+from urllib import unquote
+
+def unquote_u(source):

  • result = unquote(source)
  • if '%u' in result:
  •    result = result.replace('%u','\u').decode('unicode_escape')
    
  • return result

def safe_dict(d):
"""
Recursively clone json structure with UTF-8 dictionary keys
@@ -69,7 +78,7 @@
elif isinstance(d, list):
return [safe_dict(x) for x in d]
else:

  •    return d
    
  •    return unquote_u(d)
    

exception in js_core()

If kwargs are defined in your urlpatterns, then you get errors in js_core() and dajaxice_request.

Example:
myproject/urls:
...
url(r'^', include('someapp.urls'), {'key':'values'} ),

someapp/urls:
...
url( dajaxice_url, include('dajaxice.urls') ),

FIX:
dajaxice/views.py:
-def dajaxice_request( request, call ):
+def dajaxice_request( request, call, _args, *_kwargs ):

-def js_core( request ):
+def js_core( request, _args, *_kwargs ):

dajaxice cannot be located at samba directory of windows share

python setup.py install
or
pip install django-dajaxice

in windows, create a share

mount this share to linux

move the newly installed dajaxice to a this mounted directory
(move to other directory does not cause this problem)

in any django project

python manage.py shell

import sys
sys.path.append("")
from dajaxice import *
NO PROBLEM
from dajaxice.core import *
ImportError: No module named core

A problem when calling Dajaxice in html

My problem :

When loading a new page, the page will call a Dajaxice function in Django, and dynamically creates a table, buttons or something else.
Sometimes it takes some time to run the Dajaxice function. If the user press the backwards button during that the period, an error msg will occur.
I am now trying to avoid this error. One way I figured out till now is to disable all the things on the page while running the Dajaxice. But I can't disable the tool bars of the browser. The error will still happen when the user using the back button of the tool bar. Can anyone provide a better solution? Thank you very much.

No support for non-blank SERVER_ROOT_URL?

I have a non-blank SERVER_ROOT_URL for a particular project, which means URLs for all the views in my project are of the form:
www.mysite.com/project_name/some_view

Instead of:
www.mysite.com/some_view

My configuration is only this way in the production server, not the dev server. Consequently, dajax works great on my dev server but not the production server. It seems the reason for this is because dajaxice uses only DAJAX_MEDIA_PREFIX to generate the paths to the ajax views and doesn't take SERVER_ROOT_URL into account. The result on my production server is that the ajax view urls look like this:
www.mysite.com/dajaxice/myapp.some_view

When they should really look like this:
www.mysite.com/project_name/dajaxice/myapp.some_view

Can you offer some insight here? I've spent hours trying to figure out if I just had it configured incorrectly... I tried changing the DAJAX_MEDIA_PREFIX to something else but it didn't seem to fix the problem since you have multiple dependencies on that prefix in your code...

Callback issue

Dajaxice/ JS isn't 'connecting' to ajax.py from the admin.

dajaxice 0.1.5 breaks on older version of Django

The new release of dajaxice 0.1.5 breaks on version 1.0.4 of Django because it relies on django.util.importlib which is not available until the 1.1.x versions of Django. The previous version of dajaxice 0.1.4 had code to detect this case.

If the new versions of dajaxice will not be compatible with older versions of Django, it would be helpful if that was mentioned in the documentation or even better dajaxice could check if the version of Django is compatible and display an nice error message.

Unfortunately, I can't easily upgrade my Django version so I will be stuck with the older version of dajaxice if this can't be fixed.

try:
from importlib import import_module
DAJAXICE_MODERN_IMPORT = True
except:
try:
from django.utils import importlib
DAJAXICE_MODERN_IMPORT = True
except:
DAJAXICE_MODERN_IMPORT = False

What Went Wrong?

I've just upgraded to 1.2 and am now getting an alert with the message "Something goes wrong". (Which, by the way should be "Something went wrong")

But how does one tell what exactly went wrong?

'+' char stripped from strings on hash tables

It seems that a string containing a '+' chars in the javascript object on the client side will see its '+' replaced with ' ' (space) on the server side.

For exemple, on the client side :

resp = { 'test': 'aabb++--==!!' }

Dajaxice.myproject.myapp.my_func('Dajax.process',
    { 'response' : resp } );

When executed, this code gives in the server console :

2010-06-25 11:30:56,838 DEBUG Function hcloud.vitale.ajax.hc_process_genererFacture is callable
2010-06-25 11:30:56,839 DEBUG callback Dajax.process
2010-06-25 11:30:56,839 DEBUG argv {' response': {'test': u'aabb  --==!!' } }

We can see that something is missing in the 'test' field...

(The results have been edited for clarity).

race condition with the 'is_callback_a_function' variable

Hi,

When two ajax calls are done simultaneously, one with a function as callback and one with string as callback, the result is likely to fail because 'is_callback_a_function' takes the value of the most recent call.

call 1: string as callback -> is_callback_a_function = false
call 2: function as callback -> is_callback_a_function = true
result of call 1: use is_callback_a_function = true, which is wrong

BR,
Pierre

JavaScript created for dajaxice.core.js is incorrect

The JavaScript created in dajaxice.core.js has a trailing comma, which causes a failure in IE6 and Google Closure won't compile it. The IE6 error is “Expected identifier, string, or number”. The Google error is: "JSC_TRAILING_COMMA: Parse error. Trailing comma is not legal in an ECMA-262 object initializer at line 13 character 9"

The problem is the trailing comma after the definition of pickable_semesters.

var Dajaxice = {

    escola: {

            copy_atividade: function(callback_function,argv){
                Dajaxice.call('escola.copy_atividade',callback_function,argv);
            },

            pickable_semesters: function(callback_function,argv){
                Dajaxice.call('escola.pickable_semesters',callback_function,argv);
            }, //  This comma should be deleted

    },

dajaxice callbacks are called twice if the callback function throws an exception

Hey there,

I've noticed that if my callbacks are throwing an exception then the callback is being
called again, but this time without the JSON parsed. Digging through, I found this in
dajaxice_core.js:

                try{
                    dajaxice_callback(JSON.parse(this.responseText));
                }
                catch(exception){
                    dajaxice_callback(this.responseText);
                }

The try/catch block seems to be to catch failures in JSON parsing, but is also catching
other exceptions from the handler, and then calling the handler again.

Maybe something like:

var response;
try {
response = JSON.parse(this.responseText));
}
catch (exception) {
response = this.responseText;
}
dajaxice_callback(response);

Erroneus 0.1.3 tar.gz

The django-dajaxice-0.1.3.tar.gz in Downloads section is erroneus, has no CHANGELOG, templates dir in dajaxice, and other miss files, also include *.egg-info invalid dir.

I have send you for email the corrected tar.gz or you can download it from:

for 15 days.

Please upload it!

Thanks for your work.

Calling other methods

I can't call any other methods in ajax.py

ajax.py

def method1(request):
pass

def method2(request):
request.method1()

I've tried calling every iteration

method1()
self.method1()

Not sure how to resolve it. I can hack it by not reusing the code and just copying it over. Maybe I am missing something.

Any thoughts?

Exception when adding single ajax method only

This error occurs when stripping down the original 'simple' example. Remove all but 1 of the methods from DAJAXICE_FUNCTIONS and try to load dajaxice.core.js. This is the stacktrace, I obtained. It seems like dajaxice assumes that there's more than 1 method specified...

Environment:

Request Method: GET
Request URL: http://localhost:1234/dajaxice/dajaxice.core.js
Django Version: 1.1.1
Python Version: 2.6.5
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'dajaxice',
'simple']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware')

Traceback:
File "/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/core/handlers/base.py" in get_response

  1.             response = callback(request, _callback_args, *_callback_kwargs)
    
    File "/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/views/decorators/cache.py" in _cache_controlled
  2.         response = viewfunc(request, _args, *_kw)
    
    File "/usr/local/lib/python2.6/dist-packages/dajaxice/views.py" in js_core
  3. data = {'dajaxice_js_functions':DajaxiceRequest.get_js_functions(),
    
    File "/usr/local/lib/python2.6/dist-packages/dajaxice/core/DajaxiceRequest.py" in get_js_functions
  4.                 data[module].append(function[2])
    

Exception Type: IndexError at /dajaxice/dajaxice.core.js
Exception Value: list index out of range

Exception check doesn't work DAJAXICE_DEBUG=True

If DAJAXICE_DEBUG is set to True (which it is by default), the exception detection code:

if( data == Dajaxice.EXCEPTION ) { ... }

doesn't work since data is now "alert(...)". If the settings is False, there is no information about the exception.

It would be extremely useful if exceptions were provided in an object that is actually checkable for being an exception. Then, the trace-back may be included or omitted based on the DEBUG flag. At this point, the application may choose to call something like alert(data.traceback) or whatever else.

TEMPLATE_CONTEXT_PROCESSORS question

The docs (http://docs.dajaxproject.com/dajaxice/installation.html) say: "Ensure that TEMPLATE_CONTEXT_PROCESSORS has django.core.context_processors.request.:"

I displayed django.conf.settings.TEMPLATE_CONTEXT_PROCESSORS and it did not contain that; apparently it's not in the default.

Is the proper procedure to override TEMPLATE_CONTEXT_PROCESSORS in my project's settings.py? Or should it have been there without my doing that, in which case what was supposed to make that happen?

The docs seem a little unclear on this.

optional comment string sent as argument to "register"

Hi,

Thank you for a very useful django extension.
I really enjoy how I can reference the generated dajaxice/dajaxice.core.js file and see available ajax functions. For the way my team works, it would be perfect if I could send a small doc-string with the register function, which would appear as a comment as first line inside the js function, like this:

dajaxice_functions.register(bar, "Send size and age, receive list bla bla")

And then in dajaxice/dajaxice.core.js:

var Dajaxice = {
  foo: {
    bar: function(callback_function, argv){
       /* Send size and age, receive list bla bla */
       Dajaxice.call('foo.bar', callback_function, argv);

},
....    

I suppose the comment could be added if DEBUG=True only.

Missing csrftoken cookie causes CSRF errors

The csrftoken cookie is only set by Django when a {% csrf_token %} tag is used in a form. Dajaxice needs this cookie to be set to make an ajax request without be blocked by Django's csrf protection. When a new user visits a site they may not initially have this cookie set which means the ajax requests made by Dajaxice fail.

This is easy to reproduce by clearing the cookies for a site and then making an ajax request through Dajaxice. Since the cookie has not been set, the X-CSRFToken header sent by Dajaxice is null and Django will reject the request as a CSRF error.

This issue is documented as Django bug #15354 http://code.djangoproject.com/ticket/15354

My workaround is to force Django to set the cookie on every request with the following MiddleWare:

class CsrfFixMiddleware:
    def process_view(self, request, view_func, callback_args, callback_kwargs):
        request.META["CSRF_COOKIE_USED"] = True
        return None

Functions called twice

Hi! Firstly, many thanks for this extension; I probably wouldn't have used django if it wasn't for this sweet ajax integration.

As for my issue, perhaps it's a setup problem although I'm far from certain: while their callback is only called once, every python functions called via ajax is raised twice (tested using pdb.set_trace() and a global counter for I wouldn't believe it).

I've check Dajaxice.py for register_function() and the _callable property and it seems that at runtime, I'm getting my functions registered twice under my_sub_app.ajax.function and my_main_app.my_sub_app.ajax.my_function(). I've done a dirty patch to fix this behavior but it didn't helped.

And of course, js is only calling those functions once.

Note: I've pulled my version from amccool's repository, perhaps this issue is actually originating from his sources. I'll make a test comparing the your version to his later today.

If you have any insight about this issue, it might save me a lot of time.

Thanks!

Version 0.5 does not work in Django 1.3.x

File affected: dajaxice/templatetags/dajaxice_templatetags.py
Error: ImportError raised loading dajaxice.templatetags.dajaxice_templatetags: cannot import name staticfiles_storage

Version 0.5 appears to be only compatible with Django 1.4+

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.