hynek / doc2dash Goto Github PK
View Code? Open in Web Editor NEWCreate docsets for Dash.app-compatible API browsers.
Home Page: https://doc2dash.hynek.me/
License: MIT License
Create docsets for Dash.app-compatible API browsers.
Home Page: https://doc2dash.hynek.me/
License: MIT License
I am trying to add the clang docset to Dash.
Clang use Sphinx to create HTML documents, its source rst files have been added to the repository, so I can build the same HTML documents too.
But as you see, when converting to docset, its index miss.
Why would this happend?
I built the html files using sphinx from the documentation folder associated with the scikit-learn
python library source code.
https://github.com/scikit-learn/scikit-learn/tree/master/doc
The html build output was created successfully via sphinx using make html-noplot
, however when I try and run the html material through doc2dash, I get an error indicating that the essential index file was not found. Take a look below:
Edwins-MacBook-Pro:~ Legion$ doc2dash -A ~/Desktop/scikitlearn
Converting sphinx docs from "/Users/Legion/Desktop/scikitlearn" to "/Users/Legion/Library/Application Support/doc2dash/DocSets/scikitlearn.docset".
Parsing HTML...
Traceback (most recent call last):
File "/usr/local/bin/doc2dash", line 8, in <module>
load_entry_point('doc2dash==1.1.0', 'console_scripts', 'doc2dash')()
File "/Library/Python/2.7/site-packages/doc2dash/__main__.py", line 100, in main
for entry in doc_parser.parse():
File "/Library/Python/2.7/site-packages/doc2dash/parsers/sphinx.py", line 38, in parse
raise IOError(errno.ENOENT, 'Essential index file not found.')
IOError: [Errno 2] Essential index file not found.
I have the html folder I'm trying to run through doc2dash available at:
https://github.com/Black-Milk/Dash-Docset/tree/master/HTML/scikitlearn
I'm using the enthought Canopy Python distribution. For some reason the command $ pip install --user doc2dash
does not go through successfully.
(User) $ pip install --user doc2dash
zsh: correct 'pip' to 'pp' [nyae]? n
Downloading/unpacking doc2dash
Downloading doc2dash-1.1.0.tar.gz
Running setup.py egg_info for package doc2dash
Downloading/unpacking beautifulsoup4==4.1.3 (from doc2dash)
Downloading beautifulsoup4-4.1.3.tar.gz (131kB): 131kB downloaded
Running setup.py egg_info for package beautifulsoup4
Downloading/unpacking lxml==3.0.2 (from doc2dash)
Downloading lxml-3.0.2.tar.gz (1.9MB): 1.9MB downloaded
Running setup.py egg_info for package lxml
Building lxml version 3.0.2.
Building without Cython.
Using build configuration of libxslt 1.1.26
Building against libxml2/libxslt in one of the following directories:
/Users/Epsilon/Library/Enthought/Canopy_64bit/User/lib
/Users/vagrant/src/master-env/lib
warning: no previously-included files found matching '*.py'
warning: no files found matching '*.txt' under directory 'src/lxml/tests'
Installing collected packages: doc2dash, beautifulsoup4, lxml
Running setup.py install for doc2dash
Installing doc2dash script to /Users/Epsilon/Library/Python/2.7/bin
Running setup.py install for beautifulsoup4
Running setup.py install for lxml
Building lxml version 3.0.2.
Building without Cython.
Using build configuration of libxslt 1.1.26
Building against libxml2/libxslt in one of the following directories:
/Users/Epsilon/Library/Enthought/Canopy_64bit/User/lib
/Users/vagrant/src/master-env/lib
building 'lxml.etree' extension
gcc -fno-strict-aliasing -fno-common -dynamic -arch x86_64 -DNDEBUG -g -O3 -arch x86_64 -I/Users/Epsilon/Library/Enthought/Canopy_64bit/User/include -I/Users/Epsilon/Library/Enthought/Canopy_64bit/User/include/libxml2 -I/private/var/folders/kq/tn9_jz8x1jg11hfc_zh2ty980000gn/T/pip-build-Epsilon/lxml/src/lxml/includes -I/Applications/Canopy.app/appdata/canopy-1.0.0.1160.macosx-x86_64/Canopy.app/Contents/include/python2.7 -c src/lxml/lxml.etree.c -o build/temp.macosx-10.6-x86_64-2.7/src/lxml/lxml.etree.o -flat_namespace
In file included from /Applications/Canopy.app/appdata/canopy-1.0.0.1160.macosx-x86_64/Canopy.app/Contents/include/python2.7/Python.h:19,
from src/lxml/lxml.etree.c:4:
/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/include/limits.h:15:25: error: limits.h: No such file or directory
In file included from src/lxml/lxml.etree.c:4:
/Applications/Canopy.app/appdata/canopy-1.0.0.1160.macosx-x86_64/Canopy.app/Contents/include/python2.7/Python.h:33:19: error: stdio.h: No such file or directory
.
.
.
error: command 'gcc' failed with exit status 1
----------------------------------------
Can't roll back lxml; was not uninstalled
Command /Users/Epsilon/Library/Enthought/Canopy_64bit/User/bin/python -c "import setuptools;__file__='/private/var/folders/kq/tn9_jz8x1jg11hfc_zh2ty980000gn/T/pip-build-Epsilon/lxml/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /var/folders/kq/tn9_jz8x1jg11hfc_zh2ty980000gn/T/pip-px9WU5-record/install-record.txt --single-version-externally-managed failed with error code 1 in /private/var/folders/kq/tn9_jz8x1jg11hfc_zh2ty980000gn/T/pip-build-Epsilon/lxml
Storing complete log in /Users/Epsilon/.pip/pip.log
I'm getting this error when trying to generate the docset for Twisted:
"apidocs" does not contain a known documentation format.
The problem seems to be that the index.html of the generated docs contains this:
This documentation was automatically generated by
<a href="https://launchpad.net/pydoctor/">pydoctor</a>
While doc2dash expects this:
This documentation was automatically generated by
<a href="http://codespeak.net/~mwh/pydoctor/">pydoctor</a>'''
I was able to generate the docset after modifying the index.html to what doc2dash expects.
https://github.com/bfortuner/ml-cheatsheet/tree/master/docs
I followed all the steps and finally after:
doc2dash ./_build/html/ -n ml-cheatsheet
I got:
Converting intersphinx docs from "html" to "./ml-cheatsheet.docset".
Parsing documentation...
Added 0 index entries.
Adding table of contents meta data... [#######################################################################################################] 100%
Which basically gave me an empty file....
Doc2Dash seems very cool but unfortunately, I was not able to import BeautifulSoup documentation :S
Steps to reproduce:
wget http://www.crummy.com/software/BeautifulSoup/bs4/download/4.3/beautifulsoup4-4.3.2.tar.gz
tar xzvf beautifulsoup4-4.3.2.tar.gz
cd beautifulsoup4-4.3.2/doc
make html
doc2dash -A build/html -n BeautifulSoup
In Dash, I see "Empty docset". When I open beautifulsoup4-4.3.2/doc/build/html/index.html
, the documentation is good. Have I done something wrong ?
Thanks !
doc2dash isn't adding the table of contents metadata with docs that are generated using the latest pydoctor. Happens with the Twisted docs. No errors are shown.
I do this:
$ cd ~/Projects/Twisted/trunk
$ pydoctor --add-package twisted
$ doc2dash apidocs
Then I click the "+" button in DashDoc's preference, Then I navigate to the resulting apidocs.docset bundle and click 'open'.
Nothing happens.
If I do this twice, DashDoc freezes forever.
Do you have a working Twisted docset that I could use while this bug is getting fixed?
I'm lazy, I don't want to clone a repo just to get their docs (I'm looking at you, Zope...) so I can build to Dash. I'd love to be able to pass in the base/home URL of documentation to doc2dash, e.g.
doc2dash [OPTIONS] http://docs.zope.org/zope.interface/
My environments:
pip install doc2dash
successfully installed the package, but not creating the bin/doc2dash, from the log it's picking up the wheel version: doc2dash-1.1.0-py2.py3-none-any.whl
On same machine inside a virtualenv, pip install will create a bin/doc2dash without any error.
I installed doc2dash on python 2.7 (the default build on Lion), ran it, and it worked. Maybe update the trove classifier so that users can see it's installable without getting py3 ;).
Hi, thanks for this project.
You recently dropped dependency over lxml
, but it looks like the version hosted at pypi still depends on it:
pip install doc2dash
wants to install lxml==3.8.0
pip install git+https://github.com/hynek/doc2dash
is perfectThanks in advance!
$ doc2dash --name beautifulsoup4 html
Converting sphinx docs from "html" to "beautifulsoup4.docset".
Parsing HTML...
Creating database...
Added 0 index entries.
Adding table of contents meta data...
Libraries and applications have a fundamental different requirement in delivery. If you embed a lib, you the lib shouldn’t constrain your requirements beyond known incompatibilities.
OTOH applications (as doc2dash is right now) are supposed to work on install.
To enable embedding of doc2dash, there should be a loosely restricted lib containing the core functionality and a CLI interface pulling everything together into a proper application.
Gevent's document is generated by Sphinx, but I ran:
doc2dash -n 'Py2_gevent' -I ./gevent/doc/_build/html/contents.html ./gevent/doc/_build/html/
and got the message:
"./gevent/doc/_build/html/" does not contain a known documentation format.
When trying to convert the api for Cozmo, the following error occured:
Converting intersphinx docs from "cozmo-api" to "/Users/andy/Library/Application Support/doc2dash/DocSets/cozmo-api.docset".
Parsing documentation...
Traceback (most recent call last):
File "/Users/andy/anaconda/bin/doc2dash", line 11, in <module>
sys.exit(main())
File "/Users/andy/anaconda/lib/python3.5/site-packages/click/core.py", line 716, in __call__
return self.main(*args, **kwargs)
File "/Users/andy/anaconda/lib/python3.5/site-packages/click/core.py", line 696, in main
rv = self.invoke(ctx)
File "/Users/andy/anaconda/lib/python3.5/site-packages/click/core.py", line 889, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Users/andy/anaconda/lib/python3.5/site-packages/click/core.py", line 534, in invoke
return callback(*args, **kwargs)
File "/Users/andy/anaconda/lib/python3.5/site-packages/doc2dash/__main__.py", line 136, in main
for entry in doc_parser.parse():
File "/Users/andy/anaconda/lib/python3.5/site-packages/doc2dash/parsers/intersphinx.py", line 73, in parse
read_inventory_v2(inv_f, "", os.path.join)
File "/Users/andy/anaconda/lib/python3.5/site-packages/sphinx/ext/intersphinx.py", line 85, in read_inventory_v2
raise ValueError
ValueError
Exception ignored in: <generator object patch_anchors at 0x10ed54990>
Traceback (most recent call last):
File "/Users/andy/anaconda/lib/python3.5/site-packages/doc2dash/parsers/utils.py", line 136, in patch_anchors
label='Adding table of contents meta data...') as pbar:
File "/Users/andy/anaconda/lib/python3.5/site-packages/click/termui.py", line 299, in progressbar
from ._termui_impl import ProgressBar
File "/Users/andy/anaconda/lib/python3.5/site-packages/click/_termui_impl.py", line 522, in <module>
import tty
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 954, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 896, in _find_spec
File "<frozen importlib._bootstrap_external>", line 1152, in find_spec
File "<frozen importlib._bootstrap_external>", line 1120, in _get_spec
TypeError: 'NoneType' object is not iterable
Currently all of the requirements use a very specific version which means the project won't work with some of my other projects which require newer versions of Sphinx. Now I'm wondering, is there a reason for that or was this chosen by accident?
https://github.com/hynek/doc2dash/blob/master/setup.py#L13-L22
Should they be replaced with:
INSTALL_REQUIRES = [
"Sphinx>=1.4.6",
"attrs>=16.2.0",
"beautifulsoup4>=4.5.1",
"click>=6.6",
"colorama>=0.3.7",
"lxml>=3.6.4",
"six>=1.10.0",
"zope.interface>=4.3.2",
]
I am trying to convert this PromyLOPh/pandora-apidoc to a dash documentation bundle.
I noticed doc2dash's index defaults to genindex.html
, so I made improvements in a pending a pull request (PromyLOPh/pandora-apidoc#4). Strangely enough, I cannot search even after populating genindex.html
in the pull request.
I believe I am missing something 😕.
The docset created with doc2dash
is not showing the icon in Zeal. As stated here when putting a symlink (or a copy) at Contents/Resources/Documents/icon.png
the icon also shows up in Zeal correctly. I think this code should either create that symlink or if that's not working on all platforms just make another copy of the specified icon file.
To reproduce:
cd docs
make html
doc2dash -a _build/html -n 'zope.interface'
verifyObject
/ verifyClass
workI'd rather see the page on verifications rather than getting bounced to Google. Any chance you could index section titles or something?
All you need to do in order to add a docset to dash is 'open -a Dash path/to/my.docset'. It might be handy if this were automatic.
I have generated html api doc from sphinx-apidoc
, but when I use doc2dash to convert to docset, error occurred:
Traceback (most recent call last):
File "/usr/local/bin/doc2dash", line 11, in
sys.exit(main())
File "/usr/local/lib/python2.7/site-packages/click/core.py", line 572, in call
return self.main(_args, *_kwargs)
File "/usr/local/lib/python2.7/site-packages/click/core.py", line 552, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python2.7/site-packages/click/core.py", line 744, in invoke
return ctx.invoke(self.callback, *_ctx.params)
File "/usr/local/lib/python2.7/site-packages/click/core.py", line 388, in invoke
return callback(_args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/doc2dash/main.py", line 115, in main
docset = prepare_docset(source, dest, name, index_page)
File "/usr/local/lib/python2.7/site-packages/doc2dash/main.py", line 248, in prepare_docset
shutil.copytree(source, docs)
File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 208, in copytree
raise Error, errors
shutil.Error: [('html/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Info.plist', u'doc/scrapy.docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Info.plist', "[Errno 63] File name too long: u'doc/scrapy.docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Info.plist'"), ('html/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources', u'doc/scrapy.docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources', "[Errno 63] File name too long: 'doc/scrapy.docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources/Documents/..docset/Contents/Resources'")]
I'm not sure if this is a Dash problem or a doc2dash problem, but I was generating a docset from Julia's docs and the beautifully rendered math in the documentation (for instance take a look at http://docs.julialang.org/en/latest/stdlib/linalg/ ). If I have Dash open the file in the browser, it seems to display correctly, but inside Dash itself, I see:
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T)\]
instead of the math we see on the online docs. I thought maybe the problem was the CDN it was using, so I carefully replaced that with a local copy of the javascript file, making sure the sphinx extension copied the correct path into the html. Again, works in the browser but not in Dash.
A second, smaller issue, and perhaps one I should file separately, but even if I pass --file-index index.html
it continues to use genindex.html
as the index page.
cc @Kapeli
It seems that docs2dash fails if there is an already existing target dash file. We either need to be able to overwrite it by default or have an option for it.
Removing the file before running docs2dash is not a viable option because the build may fail for other reasons.
doc2dash --name jira docs/build/html --destination docs/build/docset --icon docs/_static/python-256.png --online-redirect-url https://jira.readthedocs.io/en/stable/
Destination path "docs/build/docset/jira.docset" already exists.
make: *** [docs] Error 17
Observe:
glyph@milly:~/tmp★ curl -#O https://media.readthedocs.org/htmlzip/pyopenssl/release-0.14/pyopenssl.zip
↩ Fri Apr 4 18:00:16 PDT 2014
######################################################################## 100.0%
↪ Fri Apr 4 18:00:19 PDT 2014 (★ curl -#O https://media.readthedocs.org/htmlzip/pyopenssl/release-0.14/pyopenssl.zip) (3 seconds elapsed)
glyph@milly:~/tmp★ unzip -q pyopenssl.zip
↩ Fri Apr 4 18:00:35 PDT 2014
↪ Fri Apr 4 18:00:35 PDT 2014 (★ unzip -q pyopenssl.zip )
glyph@milly:~/tmp★ doc2dash pyopenssl-release-0.14
↩ Fri Apr 4 18:00:42 PDT 2014
Converting sphinx docs from "pyopenssl-release-0.14" to "pyopenssl-release-0.14.docset".
Parsing HTML...
Traceback (most recent call last):
File "/Users/glyph/Library/Python/2.7/bin/doc2dash", line 11, in <module>
sys.exit(main())
File ".../doc2dash/__main__.py", line 108, in main
for entry in doc_parser.parse():
File ".../doc2dash/parsers/sphinx.py", line 38, in parse
raise IOError(errno.ENOENT, 'Essential index file not found.')
IOError: [Errno 2] Essential index file not found.
↪ Fri Apr 4 18:00:42 PDT 2014 (★ doc2dash pyopenssl-release-0.14)
[Error: 1]
glyph@milly:~/tmp★ ls pyopenssl-release-0.14
↩ Fri Apr 4 18:00:49 PDT 2014
_static index.html objects.inv
↪ Fri Apr 4 18:00:49 PDT 2014 (★ ls pyopenssl-release-0.14)
glyph@milly:~/tmp★
Downloading/unpacking doc2dash
Running setup.py egg_info for package doc2dash
Traceback (most recent call last):
File "<string>", line 14, in <module>
File "~/build/doc2dash/setup.py", line 10, in <module>
long_description=open('README.rst').read(),
IOError: [Errno 2] No such file or directory: 'README.rst'
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 14, in <module>
File "~/build/doc2dash/setup.py", line 10, in <module>
long_description=open('README.rst').read(),
IOError: [Errno 2] No such file or directory: 'README.rst'
----------------------------------------
Command python setup.py egg_info failed with error code 1 in ~/build/doc2dash
Storing complete log in ~/Library/Logs/pip.log
Mountain Lion, Python 2.7
dash2doc -A bottlepydocs
result: .docset created in current directory.
mv .docset ~/Library/Application Support/doc2dash/DocSets/bottlepy.docset
Dash does not recognize this.
putting it in ~/Library/Application Support/Dash
Now dash takes it.
I got a big surprised on CentOS where running doc2dash proved to return 0 and do nothing, regardless even creating any docset.
Example:
# inside almost any python package repo run
PACKAGE=`python setup.py --name`
pip install -q --user doc2dash
tox -e docs
python -m doc2dash -n $PACKAGE docs/build/html
I discovered that this happens when doc2dash is called as a python module, python -m doc2dash
ignores any cli parameters, so doing nothing.
pip
is more than happy to write six 1.7.3 to ~/.local, even though it requires 1.10.0, because doc2dash's setup.py specifies == 1.7.3 (though I see that has been bumped to 1.9.0 since the last PyPI update). This resulted in my inability to run pip, and most other Python utilities on my system that require six (until I used python -s -m pip install -U --user --force-reinstall six
to force an update).
Is there any way to possibly be a bit more lax in version requirements? doc2dash 2.0.2 seems perfectly happy using six 1.10.0.
Hello,
I've just built a docset. Without a "--name" the docset was generated with just the extension and wasn't added to dash.
When I added the --name parameter, it worked.
Python's str.format() does not support unicode arguments (see http://bugs.python.org/issue7300). Thus doc2dash fails to build docs for e.g. https://github.com/JuliaLang/julia:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xd7' in position 0: ordinal not in range(128)
The fix is to use the % operator:
diff -ura doc2dash/parsers/intersphinx.py /usr/local/lib/python2.7/dist-packages/doc2dash/parsers/intersphinx.py
--- doc2dash/parsers/intersphinx.py 2014-08-25 23:54:24.601090985 -0300
+++ /usr/local/lib/python2.7/dist-packages/doc2dash/parsers/intersphinx.py 2014-08-25 23:30:39.885093298 -0300
@@ -80,7 +80,7 @@
"""
link = soup.find('a', {'class': 'headerlink'}, href='#' + entry.anchor)
tag = soup.new_tag('a')
- tag['name'] = APPLE_REF_TEMPLATE.format(entry.type, entry.name)
+ tag['name'] = APPLE_REF_TEMPLATE % (entry.type, entry.name)
if link:
link.parent.insert(0, tag)
return True
diff -ura doc2dash/parsers/pydoctor.py /usr/local/lib/python2.7/dist-packages/doc2dash/parsers/pydoctor.py
--- doc2dash/parsers/pydoctor.py 2014-08-25 23:54:24.601090985 -0300
+++ /usr/local/lib/python2.7/dist-packages/doc2dash/parsers/pydoctor.py 2014-08-25 23:30:49.149093284 -0300
@@ -57,7 +57,7 @@
link = soup.find('a', attrs={'name': entry.anchor})
if link:
tag = soup.new_tag('a')
- tag['name'] = APPLE_REF_TEMPLATE.format(entry.type, entry.name)
+ tag['name'] = APPLE_REF_TEMPLATE % (entry.type, entry.name)
link.insert_before(tag)
return True
else:
diff -ura doc2dash/parsers/utils.py /usr/local/lib/python2.7/dist-packages/doc2dash/parsers/utils.py
--- doc2dash/parsers/utils.py 2014-08-25 23:54:24.601090985 -0300
+++ /usr/local/lib/python2.7/dist-packages/doc2dash/parsers/utils.py 2014-08-25 23:30:29.613093316 -0300
@@ -84,7 +84,7 @@
return start
-APPLE_REF_TEMPLATE = '//apple_ref/cpp/{}/{}'
+APPLE_REF_TEMPLATE = '//apple_ref/cpp/%s/%s'
@coroutine
Prerequisites:
I'm using Dash 2.2.2 on Mac OS X Yosemite 10.10 and have the current CMake (3.1.0) DocSet installed
Steps to reproduce:
Search
Field ⌘F
cmake: if
to search for the if
command in the CMake documentationExpected behaviour:
Dash shows the documentation for the if command
Actual behaviour:
Dash shows a syntax entry for the if
command in the Release Notes
This misbehaviour can be reproduced with several other searches, e.g. searching for cmake_policy
links the documentation for the CMP0052 policy but not for the command itself
Sphinx is wont to output most of its documentation under the inventory key 'std:doc' which is currently handled with a KeyError
and discarded by doc2dash
.
Adding std:doc
to INV_TO_TYPE
(mapped to 'Guide') at least means these pages can be found in a search within Dash. But it leads to a few issues:
inv['std:doc']
are not the appropriate titles for the documentation pages, as assumed by doc2dash
. Rather inv['std:doc'][key][3]
contains the title.So:
Related to: twisted/pydoctor#29 (comment).
The problem is that Dash (and doc2dash) currently treats private methods/classes the same with public ones.
doc2dash should have an option that makes it completely ignore private methods/classes.
I generated docset for scikit-learn but have trouble with the table of content.
In API Reference
, clicking sklearn.metrics
at the bottom left directs the page to the top instead of the anchor. So do sklearn.metrics.cluster
and sklearn.metrics.pairwise
.
The documentation I converted is https://drive.google.com/file/d/0B1jLoa9G1ngQWDBUSktWYV9JMVE/view?usp=sharing
Are all of those strict fixed dependency versions really necessary? This very particular set of version numbers makes it close to impossible to use doc2dash
in an Anaconda environment..
Currently doc2dash has pinned requirements and that is blocking its inclusion in other projects because it would create dependency conflicts.
Until recently pip was not able to detect these conflicts but versions >=8.0 do have the pip check
command which can report such conflicts.
Example:
doc2dash 2.1.0 has requirement Sphinx==1.3.5, but you have Sphinx 1.5.1.
As any pypi project it should contain open ranges using one of these models:
requests>=2.10.0 # most common use
requests>=2.10.0,!=2.10.1 # if we know that a specific version is broken and newer release are likely to work
requests>=2.10.0,<3.0 # if we want to be sure new major release will not break
I am fully aware about the fact that an workaround would be to install it in its own virtualenv but that's not really working for two reasons:
Hi,
As far as I understand doc2dash, one has to download repository, build documentation on local drive, then doc2dash and finally import in dash. Fine.
Wouldn’t it be nice to have doc2dash download documentation directly from a hosted documentation ? I mean running :
$ doc2dash --website http://docs.python-requests.org/en/latest/
What do you think ?
Thanx for everything.
Short version
doc2dash crashes with an exception when I try to generate a docset. The problem appears to be caused by lxml 3.44 not playing well with beautifulsoup 4.4.1. No more trouble after updating lxml to version 3.6.0.
Setup
Crash behavior
Running the doc2dash command line utility. The error happens when calling BeautifulSoup()
in doc2dash.parsers.utils.py
(line 124). BeautifulSoup raises a FeatureNotFound exception with message:
"Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?"
Reproducing the error outside of doc2dash
Trying to run a test file through BeautifulSoup
produces the same error:
from bs4 import BeautifulSoup
with open("test.html") as f:
soup = BeautifulSoup(f, "lxml")
print(soup)
Resolution
Upgrading lxml to version 3.6.0 does the trick, doc2dash works fine.
I am trying to build the Sphinx
documentation for Brian2
. I have doc2dash
2.2.0 installed on python
2.7 using conda
(package from conda_forge
).
doc2dash -n Brian-2.1.2 -A -f --parser doc2dash.parsers.intersphinx.InterSphinxParser docs_sphinx
results in a long list of "filename too long" errors:
File "/Users/dylan/anaconda/envs/py27/lib/python2.7/shutil.py", line 208, in copytree
raise Error, errors
shutil.Error: [('/Users/dylan/Development/brian2_dev_GIT/docs_sphinx/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/.gitignore', u'/Users/dylan/Library/Application Support/doc2dash/DocSets/Brian-2.1.2.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/.gitignore', "[Errno 63] File name too long: u'/Users/dylan/Library/Application Support/doc2dash/DocSets/Brian-2.1.2.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/docs_sphinx.docset/Contents/Resources/Documents/.gitignore'"), ...
and then fails.
The command doc2dash -n Brian-2.1.2 -A -f docs_sphinx
results in the error
"/Users/dylan/Development/brian2_dev_GIT/docs_sphinx" does not contain a known documentation format.
The document set builds successfully using sphinx
. Please let me know where I should start looking to fix this problem.
Please let me know if there's a workaround, I'm consulting these docs a lot :).
$ doc2dash -n click-6.7 -u http://click.pocoo.org/6/ _build/dirhtml
Converting intersphinx docs from "dirhtml" to "./click-6.7.docset".
Parsing documentation...
Added 172 index entries.
Adding table of contents meta data... [#################################] 100%
Traceback (most recent call last):
File "/Users/glyph/.local/bin/doc2dash", line 11, in <module>
sys.exit(main())
File "/Users/glyph/.local/venvs/doc2dash/lib/python3.6/site-packages/click/core.py", line 716, in __call__
return self.main(*args, **kwargs)
File "/Users/glyph/.local/venvs/doc2dash/lib/python3.6/site-packages/click/core.py", line 696, in main
rv = self.invoke(ctx)
File "/Users/glyph/.local/venvs/doc2dash/lib/python3.6/site-packages/click/core.py", line 889, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Users/glyph/.local/venvs/doc2dash/lib/python3.6/site-packages/click/core.py", line 534, in invoke
return callback(*args, **kwargs)
File "/Users/glyph/.local/venvs/doc2dash/lib/python3.6/site-packages/doc2dash/__main__.py", line 149, in main
toc.close()
File "/Users/glyph/.local/venvs/doc2dash/lib/python3.6/site-packages/doc2dash/parsers/utils.py", line 137, in patch_anchors
patch_files(pbar)
File "/Users/glyph/.local/venvs/doc2dash/lib/python3.6/site-packages/doc2dash/parsers/utils.py", line 123, in patch_files
with codecs.open(full_path, mode="r", encoding="utf-8") as fp:
File "/Users/glyph/.local/venvs/doc2dash/bin/../lib/python3.6/codecs.py", line 895, in open
file = builtins.open(filename, mode, buffering)
IsADirectoryError: [Errno 21] Is a directory: './click-6.7.docset/Contents/Resources/Documents/api/'
when i install the doc2dash, some problem occurs.it is as follows:
zhenmingmindeMacBook-Pro:~ zhenmingmin$ pip install --user doc2dash
Downloading/unpacking doc2dash
Downloading doc2dash-1.2.0-py2.py3-none-any.whl
Downloading/unpacking beautifulsoup4==4.3.2 (from doc2dash)
Downloading beautifulsoup4-4.3.2.tar.gz (143kB): 143kB downloaded
Running setup.py (path:/private/var/folders/km/y39j55yd78n8f8r4nqh_zfn00000gn/T/pip_build_zhenmingmin/beautifulsoup4/setup.py) egg_info for package beautifulsoup4
Downloading/unpacking lxml==3.2.3 (from doc2dash)
Downloading lxml-3.2.3.tar.gz (3.3MB): 3.3MB downloaded
Running setup.py (path:/private/var/folders/km/y39j55yd78n8f8r4nqh_zfn00000gn/T/pip_build_zhenmingmin/lxml/setup.py) egg_info for package lxml
/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'bugtrack_url'
warnings.warn(msg)
Building lxml version 3.2.3.
Building without Cython.
Using build configuration of libxslt 1.1.28
warning: no previously-included files found matching '*.py'
warning: no files found matching '*.txt' under directory 'src/lxml/tests'
Installing collected packages: doc2dash, beautifulsoup4, lxml
Cleaning up...
Exception:
Traceback (most recent call last):
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pip-1.5.4-py2.7.egg/pip/basecommand.py", line 122, in main
status = self.run(options, args)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pip-1.5.4-py2.7.egg/pip/commands/install.py", line 283, in run
requirement_set.install(install_options, global_options, root=options.root_path)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pip-1.5.4-py2.7.egg/pip/req.py", line 1435, in install
requirement.install(install_options, global_options, _args, *_kwargs)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pip-1.5.4-py2.7.egg/pip/req.py", line 671, in install
self.move_wheel_files(self.source_dir, root=root)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pip-1.5.4-py2.7.egg/pip/req.py", line 901, in move_wheel_files
pycompile=self.pycompile,
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pip-1.5.4-py2.7.egg/pip/wheel.py", line 140, in move_wheel_files
scheme = distutils_scheme(name, user=user, home=home, root=root)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pip-1.5.4-py2.7.egg/pip/locations.py", line 155, in distutils_scheme
i.finalize_options()
File "build/bdist.macosx-10.9-x86_64/egg/setuptools/command/install.py", line 31, in finalize_options
install.finalize_options(self)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py", line 268, in finalize_options
raise DistutilsOptionError("can't combine user with prefix, "
DistutilsOptionError: can't combine user with prefix, exec_prefix/home, or install(plat)base
Storing debug log for failure in /Users/zhenmingmin/.pip/pip.log
Trying to create docs for astropy using doc2dash installed under anaconda python on my Mac, I have run into the following problem when running doc2dash:
Traceback (most recent call last):
File "/Users/xxx/anaconda/bin/doc2dash", line 11, in
sys.exit(main())
File "/Users/xxx/anaconda/lib/python2.7/site-packages/doc2dash/main.py", line 108, in main
for entry in doc_parser.parse():
File "/Users/xxx/anaconda/lib/python2.7/site-packages/doc2dash/parsers/sphinx.py", line 40, in parse
for t in _parse_soup(soup):
File "/Users/xxx/anaconda/lib/python2.7/site-packages/doc2dash/parsers/sphinx.py", line 80, in _parse_soup
dd = dt.next_sibling.next_sibling
AttributeError: 'NoneType' object has no attribute ‘next_sibling'
I suspect there is a problem in the HTML formatting of the docs, but any ideas?
Hi, I can't figure out how to convert the latest version of the NetworkX docset (generated using sphnix): http://networkx.readthedocs.io/en/latest/
I downloaded the webpage using this: wget --recursive http://networkx.readthedocs.io/en/latest/
I tried converting using these commands, but all gives the same error…
~/temp/nx2dashdoc
(py35) ❯ doc2dash --name "Networkx2dev" networkx.readthedocs.io
"/Users/allan/temp/nx2dashdoc/networkx.readthedocs.io" does not contain a known documentation format.
~/temp/nx2dashdoc
(py35) ❯ doc2dash --name "Networkx2dev" networkx.readthedocs.io/en
"/Users/allan/temp/nx2dashdoc/networkx.readthedocs.io/en" does not contain a known documentation format.
~/temp/nx2dashdoc
(py35) ❯ doc2dash --name "Networkx2dev" networkx.readthedocs.io/en/latest
"/Users/allan/temp/nx2dashdoc/networkx.readthedocs.io/en/latest" does not contain a known documentation format.
What am I doing wrong?
Also, here's the top four levels of the directory tree:
(py35) ❯ tree -FL 4 # Only descend 4 levels down into the file tree
.
└── networkx.readthedocs.io/
├── en/
│ ├── latest/
│ │ ├── _images/
│ │ ├── _modules/
│ │ ├── _static/
│ │ ├── bibliography.html
│ │ ├── developer/
│ │ ├── download.html
│ │ ├── examples/
│ │ ├── gallery.html
│ │ ├── genindex.html
│ │ ├── index.html
│ │ ├── install.html
│ │ ├── overview.html
│ │ ├── py-modindex.html
│ │ ├── reference/
│ │ ├── search.html
│ │ ├── test.html
│ │ └── tutorial/
│ ├── networkx-1.10/
│ │ ├── _images/
│ │ ├── _modules/
│ │ ├── _static/
│ │ ├── bibliography.html
│ │ ├── developer/
│ │ ├── download.html
│ │ ├── gallery.html
│ │ ├── genindex.html
│ │ ├── index.html
│ │ ├── install.html
│ │ ├── overview.html
│ │ ├── py-modindex.html
│ │ ├── reference/
│ │ ├── search.html
│ │ ├── test.html
│ │ └── tutorial/
│ ├── networkx-1.11/
│ │ ├── _images/
│ │ ├── _modules/
│ │ ├── _static/
│ │ ├── bibliography.html
│ │ ├── developer/
│ │ ├── download.html
│ │ ├── examples/
│ │ ├── gallery.html
│ │ ├── genindex.html
│ │ ├── index.html
│ │ ├── install.html
│ │ ├── overview.html
│ │ ├── py-modindex.html
│ │ ├── reference/
│ │ ├── search.html
│ │ ├── test.html
│ │ └── tutorial/
│ └── stable/
│ ├── _images/
│ ├── _modules/
│ ├── _static/
│ ├── bibliography.html
│ ├── developer/
│ ├── download.html
│ ├── examples/
│ ├── gallery.html
│ ├── genindex.html
│ ├── index.html
│ ├── install.html
│ ├── overview.html
│ ├── py-modindex.html
│ ├── reference/
│ ├── search.html
│ ├── test.html
│ └── tutorial/
└── robots.txt
33 directories, 41 files
It has become common for python docs to reference jupyter notebooks with external links to http://nbviewer.ipython.org./. (e.g. http://nbviewer.jupyter.org/github/cvxgrp/cvx_short_course/blob/master/applications/portfolio_optimization.ipynb) I have found that these notebooks are often the most useful portion of the docs, however they are not automatically captured by doc2dash. I propose a feature that automatically downloads these notebooks.
When installing doc2dash using pip on ElCapitan MAC OS it does not allow uninstalling six v 1.4.1 as it is a protected file.
Use the following to install doc2dash by ignoring six
$ sudo -H pip install doc2dash --ignore-installed six
For more information refer to pypa/pip#3165 as it is a related issue.
Or
Use brew to install python then you can use pip without the problems of protected files.
Hi, I would like to execute doc2dash pgi-docs-gh-pages -d ~/.local/share/zeal/docsets
, however, it told me that the python-six's version must be 1.7.3, not the latest version 1.8.1:
Traceback (most recent call last):
File "/usr/lib/python3.4/site-packages/pkg_resources.py", line 432, in _build_master
ws.require(__requires__)
File "/usr/lib/python3.4/site-packages/pkg_resources.py", line 741, in require
needed = self.resolve(parse_requirements(requirements))
File "/usr/lib/python3.4/site-packages/pkg_resources.py", line 632, in resolve
raise VersionConflict(tmpl % args)
pkg_resources.VersionConflict: six 1.8.0 is installed but six==1.7.3 is required by ['doc2dash']
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/bin/doc2dash", line 5, in <module>
from pkg_resources import load_entry_point
File "/usr/lib/python3.4/site-packages/pkg_resources.py", line 2880, in <module>
working_set = WorkingSet._build_master()
File "/usr/lib/python3.4/site-packages/pkg_resources.py", line 434, in _build_master
return cls._build_from_requirements(__requires__)
File "/usr/lib/python3.4/site-packages/pkg_resources.py", line 447, in _build_from_requirements
dists = ws.resolve(reqs, Environment())
File "/usr/lib/python3.4/site-packages/pkg_resources.py", line 626, in resolve
raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: six==1.7.3
Any idea? Thank you!
Hello,
in latest sphinx stable (at least 1.6.2) read_inventory_v2 is no more:
File "/usr/lib/python3.6/site-packages/doc2dash/parsers/intersphinx.py", line 9, in <module>
from sphinx.ext.intersphinx import read_inventory_v2
I think InventoryFile should be used instead:
from sphinx.ext.intersphinx import InventoryFile
invdata = InventoryFile.load(f, '/util', posixpath.join)
More generally, python dependencies are pinned.
What's missing to use the latests versions, apart from sphinx here ?
I tried to build the docs for subliminal but failed. I was hoping that maybe someone could point me to what I'm doing wrong.
cd subliminal/docs
mkdir html
sphinx-builder . html
returns
Running Sphinx v1.6.2
Exception occurred:
File "conf.py", line 19, in
import sphinx_rtd_theme
ModuleNotFoundError: No module named 'sphinx_rtd_theme'
Am I running sphinx wrong, or does something in subliminal need to be patched?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.