Giter Site home page Giter Site logo

pythonremoteserver's Introduction

Robot Framework

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

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.

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

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.

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!

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.

pythonremoteserver's People

Contributors

bartvanherck avatar brunogoncalooliveira avatar eddypronk avatar jfoederer avatar mkorpela avatar pekkaklarck avatar spooning avatar tirkarthi avatar yanne 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

pythonremoteserver's Issues

RobotRemoteServer fault on Windows Server 2016

I am getting the following error in Windows:

Faulting application name: RobotRemoteServer.exe, version: 1.0.0.1, time stamp: 0x559fc533
Faulting module name: KERNELBASE.dll, version: 10.0.14393.1532, time stamp: 0x5965adf8
Exception code: 0xe0434352
Fault offset: 0x000da9f2
Faulting process id: 0x213c
Faulting application start time: 0x01d36398b275c90b
Faulting application path: C:\Users\Public\Automated_Testing\Test_Libraries\GUILibrary\RobotRemoteServer.exe
Faulting module path: C:\Windows\System32\KERNELBASE.dll
Report Id: 42e1ed1c-5563-44c6-9789-d0ab4afe1057
Faulting package full name:
Faulting package-relative application ID:

I am running Windows Server 2016 and Windows 7. I am not seeing the problem on Windows 7 but it comes up every few days on Server 2016. I was thinking about upgrading to the new RobotRemoteServer but I do not see any fixes in the new version that would lead me to believe this might fix my issues.

Any help would be appreciated.

Add support for Robot's programmatic logging APIs

As far as I can tell, the way how logging works in combination with the PythonRemoteServer depends very much on when the corresponding logging StreamHandler is first created.
If it is created before _intercept_std_streams() is called, then the logging output will be sent to stderr of the server. If it is created after _intercept_std_streams(), then the output is sent as output to the calling client.

I fixed this for my use case with this change to _intercept_std_streams(), which makes sure that I receive all log messages logged during run_keyword() on the robotframework client:

    def _intercept_std_streams(self):
        sys.stdout = StringIO()
        sys.stderr = StringIO()
        # reset the logging handler so that it is connected to the right stderr stream
        import logging
        logging.getLogger().handlers = []
        ch = logging.StreamHandler()
        logging.getLogger().addHandler(ch)

NOTE: I mostly opened this issue so that it is documented in case other people run into similiar problems. I'm not sure if this is something that can/should be handled by the default implementation of PythonRemoteServer, since you would have to consider a myriad of possible python logging configurations. Feel free to close.

Possible RecursionError in KeywordResult._handle_return_value()

KeywordResult._handle_return_value() calls itself as part of a list-comprehension if ret does not get handled by the initial if-statements:

def _handle_return_value(self, ret):
    if isinstance(ret, (str, unicode, bytes)):
        return self._handle_binary_result(ret)
    if isinstance(ret, (int, long, float)):
        return ret
    if isinstance(ret, Mapping):
        return dict((self._str(key), self._handle_return_value(value))
                    for key, value in ret.items())
    try:
        return [self._handle_return_value(item) for item in ret]
    except TypeError:
        return self._str(ret)

However, in this case ret is an object provided by a library, which happens to return itself when __getitem__ is called. _handle_return_value then enters an infinite recursion, which eventually causes the interpreter to raise a RecursionError. Should the list comprehension be inside an if-clause which checks that the object is actually a list-like object?

To get around this for now I am pickling and base64-encoding the object to a string and returning that, but that means I have to decode and de-pickle it back into an object on the client side. It would be nice if I didn't have to do this and could just return an object from my remote keyword without this issue.

Error importing SeleniumLibrary

As a background, I have to use .net Robot Framework, because some complex testing libraries are .net based. So my idea was to use robotremoteserver to also utilize SeleniumLibrary (not supported by .net rf).

import sys
from robotremoteserver import RobotRemoteServer
from SeleniumLibrary import SeleniumLibrary

RobotRemoteServer(SeleniumLibrary())

This yields

RobotRemoteServer(SeleniumLibrary()) File "/usr/local/lib/python3.7/site-packages/robotremoteserver.py", line 73, in __init__ self._library = RemoteLibraryFactory(library) File "/usr/local/lib/python3.7/site-packages/robotremoteserver.py", line 259, in RemoteLibraryFactory return DynamicRemoteLibrary(library, get_keyword_names, run_keyword) File "/usr/local/lib/python3.7/site-packages/robotremoteserver.py", line 362, in __init__ HybridRemoteLibrary.__init__(self, library, get_keyword_names) File "/usr/local/lib/python3.7/site-packages/robotremoteserver.py", line 355, in __init__ StaticRemoteLibrary.__init__(self, library) File "/usr/local/lib/python3.7/site-packages/robotremoteserver.py", line 280, in __init__ self._names, self._robot_name_index = self._get_keyword_names(library) File "/usr/local/lib/python3.7/site-packages/robotremoteserver.py", line 285, in _get_keyword_names for name, kw in inspect.getmembers(library): File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/inspect.py", line 341, in getmembers value = getattr(object, key) File "/usr/local/lib/python3.7/site-packages/SeleniumLibrary/__init__.py", line 415, in driver raise NoOpenBrowser('No browser is open.') SeleniumLibrary.errors.NoOpenBrowser: No browser is open.

Similar error also with python 2.7.
According to Tatu Aaltonen and Pekka Klärck, there's a bug in remote server.

Asynchronous remote server

Hi,

it is possible to create asynchronous remote server? Using SocketServer.ThreadingMixIn or any other possible way?

It would be nice to have server that can accept more than one command in one time. It would definitely lowers the time to run keywords (eg. vmware connector to work with more than one machine at the time)

Example documentation improvements (or corrections?)

First time I am using this library/server, and I had difficulties in running the example. If I start with default values, then I can only test using 127.0.0.1:8270, not from other machines in my network.
Now if I start using the IP address of my server machine, I can run the example as intended. See below:

robot@linux-techno:~/test> python examplelibrary.py 192.168.2.10 &
robot@linux-techno:~/test> python -m robotremoteserver test 192.168.2.10:8270
Remote server running at http://192.168.2.10:8270.
robot@linux-techno:~/test> python -m robotremoteserver test 127.0.0.1:8270
No remote server running at http://127.0.0.1:8270.
robot@linux-techno:~/test> python -m robotremoteserver test 127.0.0.1
No remote server running at http://127.0.0.1.
robot@linux-techno:~/test> python -m robotremoteserver test localhost
No remote server running at http://localhost.

On client machines:

[helio@localhost remote]$ python -m robotremoteserver test 192.168.2.10:8270
Remote server running at http://192.168.2.10:8270.
[helio@localhost remote]$ python -m robotremoteserver test techno:8270
Remote server running at http://techno:8270.

[robot@candy-house test]$ python -m robotremoteserver test 192.168.2.10:8270
Remote server running at http://192.168.2.10:8270.
[robot@candy-house test]$ python -m robotremoteserver test techno:8270
Remote server running at http://techno:8270.

Running the tests (in the test file the positive test is using ${CURDIR}, this is always at client's side, is this the desired behavior?):
a) I had to create at server "techno" a same path from client @CANDY-HOUSE.

[robot@candy-house test]$ robot -v ADDRESS:techno -v PORT:8270 example_tests.robot 
==============================================================================
Example Tests                                                                 
==============================================================================
Count Items in Directory                                              | PASS |
------------------------------------------------------------------------------
Failing Example                                                       | FAIL |
Given strings are not equal.
------------------------------------------------------------------------------
Example Tests                                                         | FAIL |
2 critical tests, 1 passed, 1 failed
2 tests total, 1 passed, 1 failed
==============================================================================
Output:  /home/robot/test/output.xml
Log:     /home/robot/test/log.html
Report:  /home/robot/test/report.html

b) I did not have a matching path at server, so first test fails

[helio@localhost remote]$ robot -v ADDRESS:techno -v PORT:8270 example_tests.robot 
==============================================================================
Example Tests                                                                 
==============================================================================
Count Items in Directory                                              | FAIL |
OSError: [Errno 2] No such file or directory: '/home/helio/Test/Robot/remote'
------------------------------------------------------------------------------
Failing Example                                                       | FAIL |
Given strings are not equal.
------------------------------------------------------------------------------
Example Tests                                                         | FAIL |
2 critical tests, 0 passed, 2 failed
2 tests total, 0 passed, 2 failed
==============================================================================
Output:  /home/helio/Test/Robot/remote/output.xml
Log:     /home/helio/Test/Robot/remote/log.html
Report:  /home/helio/Test/Robot/remote/report.html

Question - Help Please

Hi,

I have the python remote server running on one machine. See screenshot (connectionerror.png)
connectionerror

And I am trying to run a selenium test from another machine calling the keywords from the above machine. But I get this error (seleniumtesterror.png).
seleniumtesterror

I would appreciate if you can help me figure out what I am doing wrong. Thanks!

image

`stop_remote_server` should return `True/False` depending was server stopped or not

Currently this method always returns True simply because all XML-RPC methods need to return something. This should be changed so that True is returned only if stopping server was allowed and False should be returned otherwise. After this external tools stopping the server can know was the server actually stopped or not.

As a separate task outside the scope of this project, the remote library API documentation needs to be updated to recommend that stop_remote_server returns True/False.

Cant run server with python modules

Hello,
I am trying to run the server by passing a pythonmodule as library, as I understood it from the docs it should work.

But when I run some keywords from Robot framework the test just stalls and I have to force it to stop.

As soon as I edit my module and change it to a class it works.
It works to pass an objectinstance to RemoteServer and it works to pass a class as static with static methods.

I have an exisiting testlibrary that I would want to run with Robot framework so it would be nice to not have to change too much and be able to run it as an module.

The RemoteServer instance doesnt produce any output or debug messages so I cant give more detailed information at the moment.

If I had missunderstood the docs about support for module I am willing to look into it and try to add support if its something that would be interesting for you.

Problems with **kwargs

I am relatively new to Robot Framework, so maybe this is just a newbie error... I have a library method like this:

class MyLibrary:
    def do_something(self, *args, **kwargs):
        stuff_happens()

This library is getting launched remotely, and for the most part everything is working great, except for the kwargs. In my .robot file, if I call it like this:

My test
    Do something  x  y  z  my_arg=1

What I am seeing is that the my_arg=1 is getting passed in wholesale to args as a string, rather than as a k/v pair in kwargs. Am I doing something wrong here?

Merge more libraries on remote server

Can't figure out how to merge more libraries on remote server side.

Found this discussion: https://groups.google.com/forum/#!topic/robotframework-users/ESMmd11z3b8
but the errors are the same.

Traceback (most recent call last):
  File "frankenlib.py", line 92, in <module>
    RobotRemoteServer(FrankenLib(), *sys.argv[1:])
  File "C:\Python27\lib\site-packages\robotremoteserver.py", line 73, in __init__
    self._library = RemoteLibraryFactory(library)
  File "C:\Python27\lib\site-packages\robotremoteserver.py", line 256, in RemoteLibraryFactory
    run_keyword = dynamic_method(library, 'run_keyword')
  File "C:\Python27\lib\site-packages\robotremoteserver.py", line 266, in dynamic_method
    method = getattr(library, name, None)
  File "frankenlib.py", line 50, in __getattr__
    module_num = self._modulenames.index(module)
ValueError: 'run' is not in list

Python3 Support

This server code works great with Python2, but is not compatible with Python3. I attempted to port the code to Python3 (both manually and via 2to3), but am running into various errors:

TypeError: a bytes-like object is required, not 'str'
<class 'TypeError'>:'TypeError' object is not iterable

For someone more familiar with Python 2->3 than I am, I'm assuming this should be fairly easy. This remote server is very important for using as a reference.

SyntaxError: invalid syntax for Python 3.6

Cite: 'Remote server 1.1 and newer support Python 2.6, 2.7, 3.3, and newer.'

Python 3.6.0 on win32:

import robotremoteserver
Traceback (most recent call last):
File "", line 1, in
File "C:\Program Files (x86)\Python36-32\lib\site-packages\robotremoteserver.py", line 103
except (OSError, select.error), err:

SyntaxError: invalid syntax

Simple IPv6 Support

The dependent libraries used by RobotRemoteServer will work with IPv6, but this requires specific documentation and a small code modification (see Issue #60).

Support for dynamic library API

Currently the remote server supports only static and hybrid APIs. Supporting also the dynamic API shouldn't be too complicated and would mean all library APIs are covered.

There exits an old pull request #1 that implements this functionality. Unfortunately changes done in 1.0 version mean that it cannot be anymore cleanly merged. I also have quite big refactoring plans for the code in general, and the approach in the pull request isn't compatible with them.

Dynamic port selection and writing used port to external file

Selecting the port to use dynamically has two major benefits:

  • No need to have port open on registered port range.
  • Faster to launch remote servers sequentially when there's no need to wait ports to be free'ed. This happens to be needed in our acceptance tests and thus this feature is included into the 1.0 release.

This feature has three sides:

  1. Actual implementation of selecting a port dynamically. This actually happens to be possible already now by explicitly using port 0. SimpleXMLRPCServer takes care of everything else.
  2. Announcing the selected port so that users can easily check it and later connect to the right port. This will be implemented in two ways:
    • The already now printed message contains the actually used port, not the port that user gave.
    • Add feature to give the server a path to a file where to write the port number in use. This will be easy to use programmatically.
  3. Document the functionality.

PythonRemoteServer silently changes default keyword arguments values

It's easier to demonstrate the problem with a simple example. Let's create remote library py.py run it and use it in test.robot

py.py:

class py:
    def foo(self, a=None, b=2, c=None, d=None):
        print('{}: {}'.format(a, type(a)))
        print('{}: {}'.format(b, type(b)))
        print('{}: {}'.format(c, type(c)))
        print('{}: {}'.format(d, type(d)))

if __name__ == "__main__":
    import robotremoteserver
    robotremoteserver.RobotRemoteServer(py(), '0.0.0.0', 8270)

test.robot:

*** Settings ***
Library  Remote  127.0.0.1:8270  WITH NAME  py


*** Test Cases ***
Test
    py.Foo

Test2
    py.Foo  c=\

$ pybot -L TRACE test.robot generates this:
robot log

Robot remote server passes default values converted to strings to first 2 parameters (but not 4th!).

The biggest problem is that all parameters with default None values became strings, and all checks like

if function_parameter is not None:
    do_some_stuff()

will pass now.

I know, that robot framework converts almost everything to strings, but this behavior (silently converting to strings values of some parameters) is not obvious to users. Also if we include this library as local, nothing will be silently passed to python functions.

Stopping server with Ctrl-C or signals does not work with Jython or IronPython

With Python Ctrl-C stops the server fully. With Jython and IronPython stopping is initiated but the process doesn't return and there is a traceback on the console. The server exits if it is ever used again.

The problem is caused by differences in handling exceptions raised by signal handlers. With Python the exception we use breaks the loop in serve_forever, but with Jython and IronPython it is just logged to console. A fix is removing this hack solution and using timeout in handle_request inside the main loop.

Support starting server on background

The init currently calls serve_forever() that prevents execution from continuing.
Init also registers signal handlers - this is only allowed in the main thread.
Thus currently it is not possible to start the server on background and continuing working on something else on the main thread.

Can I use nginx as a proxy?

Hello:
I would like to set up a number of remote services, the use of nginx proxy http rpc, I wonder if this is feasible?

Thank you!

With new style classes __init__ documentation got from object if not overridden

If a new style class has no __init__, remote server incorrectly returns the generic docstring of object.__init__ when run on Jython or IronPython. In practice this means that you get following doc to the importing section:

x.__init__(...) initializes x; see x.__class__.__doc__ for signature

This bug is due to inspect.isroutine(object().__init__) returning True with Jython and IronPython. Because you get False with Python I assume this is a bug. Luckily we can workaround it by using inspect.ismethod(x) or inspect.isfunction(x) instead of inspect.isroutine(x).

Getting Error 10060 while using Remote Server and running tests

Hi,
I am not able to run tests given in examples. Not able to connect to the server running on the same Windows 7 PC.

image

Please see the image; In one command window, the server has already started. but while running tests, I get error 10060;
[ ERROR ] Error in file 'C:\Users\jitendrasi\gitrepos\PythonRemoteServer\example
\tests.robot': Getting keyword names from library 'Remote' failed: Calling dynam
ic method 'get_keyword_names' failed: Connecting remote server at http://192.168
.0.103:8270 failed: [Errno 10060] A connection attempt failed because the connec
ted party did not properly respond after a period of time, or established connec
tion failed because connected host has failed to respond

Python 3.10 compatibility

Hi,

I get this in Python 3.8:

robotremoteserver.py:18: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.9 it will stop working
from collections import Mapping

Kind regards

Holger

Misleading documentation related to listening to "all interfaces"

README states:

"Address to listen. Use '0.0.0.0' to listen to all available interfaces."

However, this value for "host" only listens on IPv4 addresses. A minimal program, such as this:
"""
from robotremoteserver import RobotRemoteServer as rs

class DummyClass ():
def init (self):
pass

rs (DummyClass (), host = "0.0.0.0")
"""

only listens on 0.0.0.0, which is an ipv4 address, rather than ::, which would include ipv4 and ipv6. The listening ports can be spotted, on linux, with netstat -anp |grep python, in a separate terminal, which produces something like this:
"""
tcp 0 0 0.0.0.0:8270 0.0.0.0:* LISTEN 10921/python3
"""

report is not generated

Hi, we executed TCs via Jenkin and the execution was successful but got below error for report generation. Can someone please help how to resolve this issue

raise DataError("Reading XML source '%s' failed: %s" % (unic(ets), error))
robot.errors.DataError: Reading XML source 'results\pabot_results\test.sample\fir.xml' failed: Incompatible XML element 'errors'.

Allow using `SIGTERM` signal for terminating the server

Currently the server can be closed by SIGINT (sent e.g. by Ctrl-C) and SIGHUP (sent by console when it closes).

We should also support SIGTERM because most tools that can be used to stop processes use it by default. For example kill program and Terminate Process keyword use it.

Changes None to ''

Did some tests with remote lib. I just noticed that when running Easter in PythonRemoteServer the None parameter is changed to empty string.. And then "None shall pass" :(

`Ctrl-C` or `SIGINT/SIGHUP` signals don't shut down the server immediately

When SIGINT or SIGHUP signals are sent to the remote server or Ctrl-C pressed, the server reports that it is shutting down but the process doesn't actually end. The reason is that it is still waiting in handle_request method and exits only after next request comes and that method returns.

This can be fixed by sending an exception from the signal handler to exit handle_request. This exception needs to be caught and silenced to make the exit clean.

Hide exception type name for custom exceptions

If an exception thrown in a user keyword has the attribute ROBOT_SUPPRESS_NAME, its value should be honored to be consistent with local execution. ROBOT_SUPPRESS_NAME was added in 2.8.2.

Python 3 support

This would be especially handy because Robot Framework itself doesn't yet support Python 3. Most likely we will target Python 3.3 or newer and will at the same time drop support from versions prior to Python/Jython 2.5.

Support for testing is server running and for stopping servers

There has been some needs for both testing is a server running and easily stopping a running server. It would be convenient if the remote server itself supported them like this:

python -m robotremoteserver test
python -m robotremoteserver stop lolcathost:12345

This can be implemented by connecting to the remote server via XML-RPC and using stop_remote_server method for stopping it (if allowed) and get_keyword_names to test is it running. This approach supports servers running on remote machines and also other remote server implementations.

support for running RobotRemoteServer() on remote machine other than localhost

it runs successfully when running RobotRemoteServer(ExampleRemoteLibrary(), host='127.0.0.1')
but it fails for other than localhost, RobotRemoteServer(ExampleRemoteLibrary(), host='200.20.57.10')


Traceback (most recent call last):
File "C:\eclipse\my_workspace\march_3\remote_server\server.py", line 32, in
RobotRemoteServer(ExampleRemoteLibrary(), host='200.20.57.10')
File "C:\Python27\lib\site-packages\robotremoteserver.py", line 60, in init
SimpleXMLRPCServer.init(self, (host, int(port)), logRequests=False)
File "C:\Python27\lib\SimpleXMLRPCServer.py", line 593, in init
SocketServer.TCPServer.init(self, addr, requestHandler, bind_and_activate)
File "C:\Python27\lib\SocketServer.py", line 419, in init
self.server_bind()
File "C:\Python27\lib\SocketServer.py", line 430, in server_bind
self.socket.bind(self.server_address)
File "C:\Python27\lib\socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 10049] The requested address is not valid in its context


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.