Giter Site home page Giter Site logo

mabot's Introduction

Robot Framework

Introduction

Robot Framework ® is a generic open source automation framework for acceptance testing, acceptance test driven development (ATDD), and robotic process automation (RPA). It has simple plain text syntax and it can be extended easily with generic and custom libraries.

Robot Framework is operating system and application independent. It is implemented using Python which is also the primary language to extend it. The framework has a rich ecosystem around it consisting of various generic libraries and tools that are developed as separate projects. For more information about Robot Framework and the ecosystem, see http://robotframework.org.

Robot Framework project is hosted on GitHub where you can find source code, an issue tracker, and some further documentation. Downloads are hosted on PyPI.

Robot Framework development is sponsored by non-profit Robot Framework Foundation. If you are using the framework and benefiting from it, consider joining the foundation to help maintaining the framework and developing it further.

Latest version

License

Installation

If you already have Python with pip installed, you can simply run:

pip install robotframework

For more detailed installation instructions, including installing Python, see INSTALL.rst.

Robot Framework requires Python 3.8 or newer and runs also on PyPy. The latest version that supports Python 3.6 and 3.7 is Robot Framework 6.1.1. If you need to use Python 2, Jython or IronPython, you can use Robot Framework 4.1.3.

Example

Below is a simple example test case for testing login to some system. You can find more examples with links to related demo projects from http://robotframework.org.

*** Settings ***
Documentation     A test suite with a single test for valid login.
...
...               This test has a workflow that is created using keywords in
...               the imported resource file.
Resource          login.resource

*** Test Cases ***
Valid Login
    Open Browser To Login Page
    Input Username    demo
    Input Password    mode
    Submit Credentials
    Welcome Page Should Be Open
    [Teardown]    Close Browser

Usage

Tests (or tasks) are executed from the command line using the robot command or by executing the robot module directly like python -m robot .

The basic usage is giving a path to a test (or task) file or directory as an argument with possible command line options before the path:

robot tests.robot
robot --variable BROWSER:Firefox --outputdir results path/to/tests/

Additionally, there is the rebot tool for combining results and otherwise post-processing outputs:

rebot --name Example output1.xml output2.xml

Run robot --help and rebot --help for more information about the command line usage. For a complete reference manual see Robot Framework User Guide.

Documentation

Support and Contact

Contributing

Interested to contribute to Robot Framework? Great! In that case it is a good start by looking at the CONTRIBUTING.rst. If you do not already have an issue you would like to work on, you can check issues with good new issue and help wanted labels.

Remember also that there are many other tools and libraries in the wider Robot Framework ecosystem that you can contribute to!

License and Trademark

Robot Framework is open source software provided under the Apache License 2.0. Robot Framework documentation and other similar content use the Creative Commons Attribution 3.0 Unported license. Most libraries and tools in the ecosystem are also open source, but they may use different licenses.

Robot Framework trademark is owned by Robot Framework Foundation.

mabot's People

Contributors

jussimalinen avatar mikahanninen avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mabot's Issues

Mabot needs to remember it's window size

maybot starts out absolutely HUGE on my setup (I have a dual-screen setup)
and I have to manually resize it each time it starts up.

Since mabot has the ability to save preferences, it should save the window
geometry and use that at startup.

Original issue reported on code.google.com by [email protected] on 4 Jun 2009 at 2:07

Remove tags when test is modified

When user modifies test, it is possible to add automatically some tags like
executed-by-bond, build-x and so on. 

It would be good also remove some old similar tags using option remove tags
when test case is modified. Those could be given like executed-by*

Actually this could be done also automatically based on the additionally
added tags by finding the prefix using last '-' sign in the added tags. In
case you would have additinal tags: executed-by-bond, build-x, before
adding tags matching executed-by-* and build-* could be removed. This would
be better as when the user changes the tags that additionally are added,
also tags that are removed follow the change. This could be at least the
first implementation.

Original issue reported on code.google.com by [email protected] on 26 May 2009 at 9:01

A plugin for save/load test result

It's useful to support custom plugin at saving/loading test result, if it's
need saving the result in customer format. (like, saving result to
reporting in IPA).

Like:
save_test_result(TestCase, status, message)
load_test_result(TestCase)

Parameter:
1. TestCase -- is data model in robot.
2. status -- PASS/FAIL
3. message -- error message 

Original issue reported on code.google.com by [email protected] on 24 Sep 2009 at 2:53

Robot Framework 2.1 compatibiity

RF 2.1 has some internal changes that make it incompatible with the latest
Mabot release. 

Original issue reported on code.google.com by pekka.klarck on 30 Mar 2009 at 4:24

User can load results from existing XML to currently open test suites/tests

Allow the possibility of use the HTML reports files generated by robot to
fill the  test results.

It should exit a menu entry called "open result file" in the file menu that
does the match between the tests that already are in Mabot and the tests
reported by the result file. The tests that that are in both places should
be updated automatically in Mabot with the values of the result file.

Original issue reported on code.google.com by [email protected] on 4 Jun 2009 at 10:48

exiting with unsaved changes is not clear

If I have unsaved changes and exit maybot, I get a dialog box that says
"Data is not Saved! Continue?"

"Continue" in this context is a bit ambiguous. Does it mean "continue to
exit" or "continue to edit the file"? Fortunately, the best guess is the
correct one ("continue to exit") but it could be more clear.

Something a little less dramatic and more explicit should be used instead,
such as "You have unsaved changes. Do you still want to exit?" with buttons
that say "Exit" and "Don't Exit". 

<soapbox>
There's never a need to put exclamation points in dialogs unless you are
building nuclear reactors. Dialogs should inform the user, not scare them. :-)
</soapbox>

Original issue reported on code.google.com by [email protected] on 4 Jun 2009 at 2:25

Mabot sometimes cannot paste.

What steps will reproduce the problem?
1. open an manual script
2. copy some text words
3. paste to Mabot, SOME TIMES it fails to paste

What is the expected output? What do you see instead?
Expteted is pasted, but some times it fails

What version of the product are you using? On what operating system?
Mabot 0.4, python 2.5.2, robot 2.02

Please provide any additional information below.


Original issue reported on code.google.com by [email protected] on 29 Dec 2008 at 7:32

Mabot does not work with Robot Framework 2.0.3

What steps will reproduce the problem?
1. Create a folder "Manual_Tests" and add the two attached HTML files to 
it.
2. Open a CMD window at the "Manual_Test" folder.
3. In the CMD window, run mabot.py .
4. Try to expand the tree on the left hand side of the Mabot GUI screen

What is the expected output? What do you see instead?
Don't know what is expected.  I've never run Mabot before.
The CMD window showed this traceback:

Exception in Tkinter callback
Traceback (most recent call last):
  File "c:\python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
    return self.func(*args)
  File "C:\Python25\lib\idlelib\TreeWidget.py", line 132, in expand
    self.update()
  File "C:\Python25\lib\idlelib\TreeWidget.py", line 165, in update
    self.parent.update()
  File "C:\Python25\lib\idlelib\TreeWidget.py", line 171, in update
    self.draw(7, 2)
  File "C:\Python25\lib\idlelib\TreeWidget.py", line 198, in draw
    cy = child.draw(cx, cy)
  File "C:\Python25\lib\idlelib\TreeWidget.py", line 190, in draw
    child = self.__class__(self.canvas, self, item)
  File "C:\Python25\lib\site-packages\mabot\ui\tree.py", line 28, in 
__init__
    get_status_color(self.item.model_item),
  File "C:\Python25\lib\site-packages\mabot\ui\tree.py", line 119, in 
get_status_color
    return COLOURS[item.get_execution_status()]
KeyError: 'NOT_RUN'


What version of the product are you using? On what operating system?
Version 0.4

Please provide any additional information below.


Original issue reported on code.google.com by [email protected] on 4 Dec 2008 at 12:59

Attachments:

resize behavior is bad

If I resize the main window to not be huge, the Modified/Saved section at
the bottom gets clipped. What should happen instead is that the Message
and/or Steps windows should shrink. 

Obviously, at some point widgets have to be clipped, but that shouldn't
happen until the steps and messages boxes have shrunk to, say, two lines. 

Original issue reported on code.google.com by [email protected] on 4 Jun 2009 at 1:50

Take test cases criticality into account.

Currently there is no way for defining critical test cases in Mabot. I
don't know would it provide some value to users. I add this issue anyway in
case someone finds some use case for this.

Original issue reported on code.google.com by [email protected] on 29 Oct 2008 at 5:52

Create backup from XML

Create backup from the xml before the data is saved. This is needed to
prevent data corruption, if saving fails.

Original issue reported on code.google.com by [email protected] on 20 Jan 2009 at 6:32

Long suite hierarchy could be shorten as one item in suite tree

In case suite has only one suite child the statistics are same for both
suites. User needs to open more items in the tree in this case. To make the
use of suite tree faster, all suites with only one suite can be handled as
one item in suite tree like below:

Suite/some/other/suite
- suite1
-- test1
-- test2
- suite2
-- test3
-- test4

Original issue reported on code.google.com by [email protected] on 13 Feb 2009 at 12:21

Tags are not loaded from html if results are loaded from XML


Pre-condition: Always Load Old Data from Xml setting is ON
1. Load tests and save results
2. Add tags for test cases in testdata (HTML/TSV)
3. Open Mabot
4. Added tags are not visible

This can be fixed. However there is one problem as the tags in datasource
are not the only tags. It is possible to add tags also in Mabot which means
that also those should be saved to the test cases even those are not in the
datasource. This will mean that if you want to remove some already saved
tags, that is possible only from Mabot with remove tags functionality. As
that works recursively for suites, it should not be too much work to remove
those in case there are some extra tags. It is anyway better to read the
new tags from datasource. 

Original issue reported on code.google.com by [email protected] on 30 Dec 2008 at 9:25

Use same issue templates as Robot Framework itself

The default templates aren't that good and we have created our own versions
to the core framework. They should be used here too.

Original issue reported on code.google.com by pekka.klarck on 4 Dec 2008 at 1:28

Add more info to the test Case/step

1)Add more fields to the test case/step like tester name/id, bug id and
program version used in that test. Also allow the user to have more
customised fields.

2)The tester name should be requested when the application begins as a
login(it shouldn't be need a password or any kind of validation just an
identification).

3)The program version should also be requested at the start-up but should
be changeable during the session.

4)The tester name and the program version should be field automatically by
mabot the same way the modified data is.

Original issue reported on code.google.com by [email protected] on 4 Jun 2009 at 1:43

Modify tags functionality

Currently it is possible to add and remove tags. However it would be much
more usable if you could just modify the tags in the testcase editor or at
least have separate dialog where you could modify the tags. This editing
should probably be allowed only for test case as there is no easy and
usable way to do it for suites.

Original issue reported on code.google.com by [email protected] on 26 May 2009 at 8:02

Any keyword fail, the whole case should be failed

Explain the defect you encountered either using free text or steps. 
Mention the expected and actual results.

Always include the Mabot and Robot Framework version, Python or Jython 
version, and operating system. You can, for example, copy the output 
of 'mabot.py --version' and 'pybot/jybot --version'.

For new features and other enhancements, please use the Enhancement 
request template.

All this text can be deleted.
------------------------------------------------------------------------
Mabot 0.5.1
Robot Framework 2.0.4 (Python 2.5.2 on win32)

Keyword of one case is fail. But the case is still shown PASS.
Please check and verify it.
Thanks


Original issue reported on code.google.com by [email protected] on 16 Feb 2009 at 1:13

Attachments:

Progressbar does not work in linux

Progressbar does not work at all in Linux. Following error is shown:

Unhandled exception in thread started by 
Traceback (most recent call last):
  File
"/home/rantanen/code/robotframework-mabot/src/mabot/ui/progressbar.py",
line 45, in _update
    self.progress_bar_view.update_progress()
  File
"/home/rantanen/code/robotframework-mabot/src/mabot/ui/progressbar.py",
line 77, in update_progress
    self.update()
  File
"/home/rantanen/code/robotframework-mabot/src/mabot/ui/progressbar.py",
line 85, in update
    self.canvas.coords(self.scale, start, 0, end, self.height)
  File "/usr/lib/python2.5/lib-tk/Tkinter.py", line 2147, in coords
    self.tk.call((self._w, 'coords') + args)))
RuntimeError: main thread is not in main loop

Original issue reported on code.google.com by [email protected] on 25 May 2009 at 4:03

getting error when try to open mabot.py. except ImportError, e:

mabot version 0.5.2
python version: 3.1
robotframework: 2.1



error

C:\Python31>mabot.py
  File "C:\Python31\Scripts\mabot.py", line 30
    except ImportError, e:
                      ^
SyntaxError: invalid syntax

C:\Python31>mabot.py --version
  File "C:\Python31\Scripts\mabot.py", line 30
    except ImportError, e:
                      ^
SyntaxError: invalid syntax

C:\Python31>

Original issue reported on code.google.com by [email protected] on 29 Jun 2009 at 3:13

Clear data from test case or keyword

There should be way to clear data from test case or keywords. Probably this
could be also recursive as set all passed and set all failed functionalities.

Original issue reported on code.google.com by [email protected] on 2 Jun 2009 at 1:04

A workspace concept is required for team co-operation

Mabot 0.6.1
Robot Framework 2.0.4 (Python 2.5.2 on win32)

In current version, the Mabot saves settings of mabot in %APPDATA%. It's
not suitable for a team sharing the setting in one project. May be a
workspace concept is better for team co-operation, then all of settings can
save in the workspace.


Original issue reported on code.google.com by [email protected] on 24 Sep 2009 at 2:32

Generate reports automatically after changes

As a user, I create a mabot suite and create the log for it.
But if I changed the mabot suite, for example added a new case to the 
suite. Then, I will not be able to reuse the created log, but have to 
create a new log.
Could you make mabot support user reuse the log after mabot case changed?

Original issue reported on code.google.com by [email protected] on 19 Feb 2009 at 6:10

Test plan functionality

It would be usefull to have following functionality:

- Create list of the test cases that should be tested in different
environments.
- Start Mabot with this list and your test cases.
- The test cases are dublicated automatically for different envs.
- Tag selection could be used to see only one envs test cases.

To know how to implement this, there is need for further investigation.

Original issue reported on code.google.com by [email protected] on 29 Oct 2008 at 5:56

Mabot's output trim the "space" of each line in coloum "commands" of the case file.

What steps will reproduce the problem?
1. download the attachment 
2. open it by mabot ( python -m mablot test.html)
3. click the "step one" of case "TEST"

What is the expected output? What do you see instead?
-- In the right panel , the format of the commands should be as same as 
they're in coloum "commands" in the file test.html, ( four lines, one line 
one command). But mabot trim the "space" character of each line.

What version of the product are you using? On what operating system?

-- mabot version 0.4
Please provide any additional information below.


Original issue reported on code.google.com by [email protected] on 11 Nov 2008 at 1:41

Attachments:

Mabot causing seg fault on Mac OS X

Mac OS X 10.6.2 (Snow Leopard)
python --version
Python 2.6.1
jython --version
Jython 2.5.1
pybot --version
Robot Framework 2.1.3 (Python 2.6.1 on darwin)
jybot --version
Robot Framework 2.1.3 (Jython 2.5.1 on java1.6.0_17)
rebot --version
Rebot 2.1.3 (Python 2.6.1 on darwin)
mabot.py --version
Mabot 0.6.1

I tried starting MaBot several different ways and they all resulted in the
following segfault
mabot.py &
mabot.py simple.html &
mabot.py . &

The following commands do work without the segfault
mabot.py --version
mabot.py --help

Here is a snippet of the segfault that was reported.
-------------------
Process:         Python [5484]
Path:           
/System/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Co
ntents/MacOS/Python
Identifier:      org.python.python.app
Version:         2.6 (2.6)
Build Info:      python-440000~1
Code Type:       X86 (Native)
Parent Process:  bash [5428]

Date/Time:       2010-03-18 07:28:25.485 -0700
OS Version:      Mac OS X 10.6.2 (10C540)
Report Version:  6

Interval Since Last Report:          62763 sec
Crashes Since Last Report:           2
Per-App Interval Since Last Report:  41099 sec
Per-App Crashes Since Last Report:   2
Anonymous UUID:                      29369D91-8741-478F-8EBD-E376ED4EAF46

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000065726f46
Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   ???                             0x65726f46 0 + 1701998406
1   com.tcltk.tcllibrary            0x010f14f0 Tcl_FindCommand + 840
2   com.tcltk.tcllibrary            0x010880eb Tcl_GetCommandInfo + 51
3   com.tcltk.tklibrary             0x01226475 TkpGetSubFonts + 5008
4   com.apple.AE                    0x94326f3a aeDispatchAppleEvent(AEDesc
const*, AEDesc*, unsigned long, unsigned char*) + 166
5   com.apple.AE                    0x94326e39
dispatchEventAndSendReply(AEDesc const*, AEDesc*) + 43
6   com.apple.AE                    0x94326d46 aeProcessAppleEvent + 197
7   com.apple.HIToolbox             0x93bbf2a1 AEProcessAppleEvent + 50
8   com.apple.AppKit                0x904a9d02 _DPSNextEvent + 1420
9   com.apple.AppKit                0x904a9306 -[NSApplication
nextEventMatchingMask:untilDate:inMode:dequeue:] + 156
10  com.tcltk.tklibrary             0x0122ee94 XQueryPointer + 2261
11  com.tcltk.tklibrary             0x0122f3d6 Tk_MacOSXSetupTkNotifier + 1079
12  com.tcltk.tcllibrary            0x010f6a63 Tcl_DoOneEvent + 229
13  com.tcltk.tklibrary             0x01170376 TkGetDisplayOf + 424
14  com.tcltk.tcllibrary            0x01089977 Tcl_CreateInterp + 4919
15  com.tcltk.tcllibrary            0x0108a96c Tcl_EvalObjv + 72
16  _tkinter.so                     0x007da49d Tkapp_CallDeallocArgs + 11750
17  org.python.python               0x0008b372 PyEval_EvalFrameEx + 16375
18  org.python.python               0x0008b4d5 PyEval_EvalFrameEx + 16730
19  org.python.python               0x0008b4d5 PyEval_EvalFrameEx + 16730
20  org.python.python               0x0008b4d5 PyEval_EvalFrameEx + 16730
21  org.python.python               0x0008b4d5 PyEval_EvalFrameEx + 16730
22  org.python.python               0x0008b4d5 PyEval_EvalFrameEx + 16730
23  org.python.python               0x0008cf64 PyEval_EvalCodeEx + 1720
24  org.python.python               0x0002ee2c PyClassMethod_New + 1823
25  org.python.python               0x0000c700 PyObject_Call + 101
26  org.python.python               0x0001c12e PyClass_New + 1603
27  org.python.python               0x0000c700 PyObject_Call + 101
28  org.python.python               0x0008677a PyEval_CallObjectWithKeywords
+ 171
29  org.python.python               0x0001ba58 PyInstance_New + 290
30  org.python.python               0x0000c700 PyObject_Call + 101
31  org.python.python               0x0008c802 PyEval_EvalFrameEx + 21639
32  org.python.python               0x0008b4d5 PyEval_EvalFrameEx + 16730
33  org.python.python               0x0008cf64 PyEval_EvalCodeEx + 1720
34  org.python.python               0x0008d009 PyEval_EvalCode + 87
35  org.python.python               0x000a40bb Py_CompileString + 111
36  org.python.python               0x000a4167 PyRun_FileExFlags + 139
37  org.python.python               0x000a5e8a PyRun_SimpleFileExFlags + 814
38  org.python.python               0x000b3168 Py_Main + 3074
39  org.python.python.app           0x00001eb5 start + 53

Thread 1:  Dispatch queue: com.apple.libdispatch-manager
0   libSystem.B.dylib               0x951c30ea kevent + 10
1   libSystem.B.dylib               0x951c3804 _dispatch_mgr_invoke + 215
2   libSystem.B.dylib               0x951c2cc3 _dispatch_queue_invoke + 163
3   libSystem.B.dylib               0x951c2a68 _dispatch_worker_thread2 + 234
4   libSystem.B.dylib               0x951c24f1 _pthread_wqthread + 390
5   libSystem.B.dylib               0x951c2336 start_wqthread + 30

Thread 2:
0   libSystem.B.dylib               0x951c2182 __workq_kernreturn + 10
1   libSystem.B.dylib               0x951c2718 _pthread_wqthread + 941
2   libSystem.B.dylib               0x951c2336 start_wqthread + 30

Thread 3:
0   libSystem.B.dylib               0x951bb856 select$DARWIN_EXTSN + 10
1   com.tcltk.tcllibrary            0x0112c737 Tcl_InitNotifier + 1643
2   libSystem.B.dylib               0x951c9fbd _pthread_start + 345
3   libSystem.B.dylib               0x951c9e42 thread_start + 34

Thread 0 crashed with X86 Thread State (32-bit):
  eax: 0x00aa2cb4  ebx: 0x010f0af6  ecx: 0x00aa2ca0  edx: 0xbfffc986
  edi: 0xbfffc984  esi: 0x01255172  ebp: 0xbfffca68  esp: 0xbfffc91c
   ss: 0x0000001f  efl: 0x00010206  eip: 0x65726f46   cs: 0x00000017
   ds: 0x0000001f   es: 0x0000001f   fs: 0x00000000   gs: 0x00000037
  cr2: 0x65726f46

Binary Images:
    0x1000 -     0x1ff7  org.python.python.app 2.6 (2.6)
<4D01A378-6EE4-7558-6564-0BC51C06A652>
/System/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Co
ntents/MacOS/Python
    0x5000 -    0xecfef  org.python.python 2.6.1 (2.6.1)
<99F1F7BA-7AFA-6069-4E43-11F97B892F65>
/System/Library/Frameworks/Python.framework/Versions/2.6/Python
  0x1df000 -   0x1e0ff7  cStringIO.so ??? (???)
<7FA5644E-4FA1-60EF-8322-5A15EAC0BED3>
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynlo
ad/cStringIO.so
  0x1e4000 -   0x1e6ff7  math.so ??? (???)
<0C41AF37-25FD-1EB3-D721-02CCFFC5D9B1>
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynlo
ad/math.so
  0x1eb000 -   0x1edfe7  binascii.so ??? (???)
<0E5DD6E7-614C-27F6-B1B8-1A2D88D75D97>
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynlo
ad/binascii.so
  0x1f1000 -   0x1f2ff7  _random.so ??? (???)
<04AE7C48-ED14-5BBA-610B-3B95E115188C> /System/Library/Frameworks/


If there is more information you would like gathered for this, just shout
and I will report/test whatever I can.

Original issue reported on code.google.com by [email protected] on 18 Mar 2010 at 2:39

Variable values are not resolved

Currently variables are not resolved. In case someone have need for this,
it should be investigated is it worth the effort to implement this.

Original issue reported on code.google.com by [email protected] on 29 Oct 2008 at 5:49

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.