Skip to main content

Python C Extention 2 Sequence Compare

Upload pypi.org

Edit distance, Similarity and 2 sequence differences printing.

How to Install?

pip install cdiffer

Requirement

  • python3.6 or later

cdiffer.dist

Compute absolute Levenshtein distance of two strings.

Usage

dist(sequence, sequence)

Examples (it's hard to spell Levenshtein correctly):

Help on built-in function dist in module cdiffer:

dist(...)
    Compute absolute Levenshtein distance of two strings.

    dist(sequence, sequence)

    Examples (it's hard to spell Levenshtein correctly):

    >>> dist('coffee', 'cafe')
    4
    >>> dist(list('coffee'), list('cafe'))
    4
    >>> dist(tuple('coffee'), tuple('cafe'))
    4
    >>> dist(iter('coffee'), iter('cafe'))
    4
    >>> dist(range(4), range(5))
    1
    >>> dist('coffee', 'xxxxxx')
    12
    >>> dist('coffee', 'coffee')
    0

cdiffer.similar

Compute similarity of two strings.

Usage

similar(sequence, sequence)

The similarity is a number between 0 and 1, base on levenshtein edit distance.

Examples

>>> from cdiffer import similar
>>>
>>> similar('coffee', 'cafe')
0.6
>>> similar('hoge', 'bar')
0.0

cdiffer.differ

Find sequence of edit operations transforming one string to another.

Usage

differ(source_sequence, destination_sequence, diffonly=False, rep_rate=60)

Examples

>>> from cdiffer import differ
>>>
    >>> for x in differ('coffee', 'cafe'):
    ...     print(x)
    ...
    ['equal',   0, 0,   'c', 'c']
    ['delete',  1, None,'o',None]
    ['insert',  None, 1,None,'a']
    ['equal',   2, 2,   'f', 'f']
    ['delete',  3, None,'f',None]
    ['delete',  4, None,'e',None]
    ['equal',   5, 3,   'e', 'e']
    >>> for x in differ('coffee', 'cafe', diffonly=True):
    ...     print(x)
    ...
    ['delete',  1, None,'o',None]
    ['insert',  None, 1,None,'a']
    ['delete',  3, None,'f',None]
    ['delete',  4, None,'e',None]

    >>> for x in differ('coffee', 'cafe', rep_rate = 0):
    ...     print(x)
    ...
    ['equal',   0, 0,   'c', 'c']
    ['replace', 1, 1,   'o', 'a']
    ['equal',   2, 2,   'f', 'f']
    ['delete',  3, None,'f',None]
    ['delete',  4, None,'e',None]
    ['equal',   5, 3,   'e', 'e']
    >>> for x in differ('coffee', 'cafe', diffonly=True, rep_rate = 0):
    ...     print(x)
    ...
    ['replace', 1, 1,   'o', 'a']
    ['delete',  3, None,'f',None]
    ['delete',  4, None,'e',None]

cdiffer.compare

This Function is compare and prety printing 2 sequence data.

Usage

compare(source_sequence, destination_sequence, diffonly=False, rep_rate=60, condition_value=" ---> ")

Parameters :

arg1 -> iterable : left comare target data.
arg2 -> iterable : right comare target data.
keya -> callable one argument function : Using sort and compare with key about `a` object.
keyb -> callable one argument function : Using sort and compare with key about `a` object.
header -> bool : output data with header(True) or without header(False). <default True>
diffonly -> bool : output data with equal data(False) or without equal data(True). <default False>
rep_rate -> int: Threshold to be considered as replacement.(-1 ~ 100). -1: allways replacement.
startidx -> int: output record index starting number. <default `0`>
condition_value -> str : Conjunctions for comparison.
na_value -> str: if not found data when filled value.
delete_sign_value -> str: if deleted data when adding sign value.
insert_sign_value ->  str: if insert data when adding sign value.

Return : Lists of List

1st column -> matching rate (0 ~ 100).
2nd column -> matching tagname (unicode string).
3rd over   -> compare data.

Examples

In [1]: from cdiffer import compare
... compare('coffee', 'cafe')
[['tag', 'index_a', 'index_b', 'data'],
 ['equal', 0, 0, 'c'],
 ['insert', '-', 1, 'ADD ---> a'],
 ['delete', 1, '-', 'o ---> DEL'],
 ['equal', 2, 2, 'f'],
 ['delete', 3, '-', 'f ---> DEL'],
 ['equal', 4, 3, 'e'],
 ['delete', 5, '-', 'e ---> DEL']]

In [2]: compare([list("abc"), list("abc")], [list("abc"), list("acc"), list("xtz")], rep_rate=50)
[['tag', 'index_a', 'index_b', 'COL_00', 'COL_01', 'COL_02', 'COL_03'],
 ['equal', 0, 0, 'a', 'b', 'c'],
 ['replace', 1, 1, 'a', 'b ---> DEL', 'ADD ---> c', 'c'],
 ['insert', '-', 2, 'ADD ---> x', 'ADD ---> t', 'ADD ---> z']]

In [3]: compare(["abc", "abc"], ["abc", "acc", "xtz"], rep_rate=40)
[['tag', 'index_a', 'index_b', 'data'],
 ['equal', 0, 0, 'abc'],
 ['replace', 1, 1, 'abc ---> acc'],
 ['insert', '-', 2, 'ADD ---> xtz']]

In [4]: compare(["abc", "abc"], ["abc", "acc", "xtz"], rep_rate=50)
[['tag', 'index_a', 'index_b', 'data'],
 ['equal', 0, 0, 'abc'],
 ['replace', 1, 1, 'abc ---> acc'],
 ['insert', '-', 2, 'ADD ---> xtz']]

Performance

C:\Windows\system>ipython
Python 3.7.7 (tags/v3.7.7:d7c567b08f, Mar 10 2020, 10:41:24) [MSC v.1900 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.21.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from cdiffer import *

In [2]: %timeit dist('coffee', 'cafe')
   ...: %timeit dist(list('coffee'), list('cafe'))
   ...: %timeit dist(tuple('coffee'), tuple('cafe'))
   ...: %timeit dist(iter('coffee'), iter('cafe'))
   ...: %timeit dist(range(4), range(5))
   ...: %timeit dist('coffee', 'xxxxxx')
   ...: %timeit dist('coffee', 'coffee')
125 ns ± 0.534 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
677 ns ± 2.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
638 ns ± 3.42 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
681 ns ± 2.16 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
843 ns ± 3.66 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
125 ns ± 0.417 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
50.5 ns ± 0.338 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [3]: %timeit similar('coffee', 'cafe')
   ...: %timeit similar(list('coffee'), list('cafe'))
   ...: %timeit similar(tuple('coffee'), tuple('cafe'))
   ...: %timeit similar(iter('coffee'), iter('cafe'))
   ...: %timeit similar(range(4), range(5))
   ...: %timeit similar('coffee', 'xxxxxx')
   ...: %timeit similar('coffee', 'coffee')
123 ns ± 0.301 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
680 ns ± 2.64 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
647 ns ± 1.78 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
680 ns ± 7.57 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
848 ns ± 4.19 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
130 ns ± 0.595 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
54.8 ns ± 0.691 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [4]: %timeit differ('coffee', 'cafe')
    ...: %timeit differ(list('coffee'), list('cafe'))
    ...: %timeit differ(tuple('coffee'), tuple('cafe'))
    ...: %timeit differ(iter('coffee'), iter('cafe'))
    ...: %timeit differ(range(4), range(5))
    ...: %timeit differ('coffee', 'xxxxxx')
    ...: %timeit differ('coffee', 'coffee')
735 ns ± 4.18 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.36 µs ± 5.17 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.31 µs ± 5.25 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.37 µs ± 5.04 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.33 µs ± 5.32 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.07 µs ± 6.75 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
638 ns ± 3.67 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [5]: a = dict(zip('012345', 'coffee'))
    ...: b = dict(zip('0123', 'cafe'))
    ...: %timeit dist(a, b)
    ...: %timeit similar(a, b)
    ...: %timeit differ(a, b)
524 ns ± 2.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
539 ns ± 2.23 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.07 µs ± 1.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [6]: %timeit compare("coffee", "cafe")
    ...: %timeit compare([list("abc"), list("abc")], [list("abc"), list("acc"), list("xtz")], rep_rate=50)
    ...: %timeit compare(["abc", "abc"], ["abc", "acc", "xtz"], rep_rate=40)
    ...: %timeit compare(["abc", "abc"], ["abc", "acc", "xtz"], rep_rate=50)
844 ns ± 3.88 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
3.32 µs ± 6.92 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
1.16 µs ± 3.94 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.3 µs ± 31.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Release files for cdiffer 0.7.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cdiffer 0.7.2
File Size Uploaded
cdiffer-0.7.2.tar.gz 30.8 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for cdiffer 0.7.2
File
cdiffer-0.7.2-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
cdiffer-0.7.2-cp39-cp39-manylinux2010_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.12+ x86-64 Details
cdiffer-0.7.2-cp39-cp39-macosx_10_16_x86_64.whl CPython 3.9 CPython 3.9 macOS 10.16+ x86-64 Details
cdiffer-0.7.2-cp38-cp38-win_amd64.whl CPython 3.8 CPython 3.8 Windows x86-64 Details
cdiffer-0.7.2-cp38-cp38-manylinux2010_x86_64.whl CPython 3.8 CPython 3.8 Linux glibc 2.12+ x86-64 Details
cdiffer-0.7.2-cp38-cp38-macosx_10_16_x86_64.whl CPython 3.8 CPython 3.8 macOS 10.16+ x86-64 Details
cdiffer-0.7.2-cp37-cp37m-win_amd64.whl CPython 3.7 CPython 3.7 pymalloc Windows x86-64 Details
cdiffer-0.7.2-cp37-cp37m-manylinux2010_x86_64.whl CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.12+ x86-64 Details
cdiffer-0.7.2-cp37-cp37m-macosx_10_16_x86_64.whl CPython 3.7 CPython 3.7 pymalloc macOS 10.16+ x86-64 Details
cdiffer-0.7.2-cp36-cp36m-win_amd64.whl CPython 3.6 CPython 3.6 pymalloc Windows x86-64 Details
cdiffer-0.7.2-cp36-cp36m-manylinux2010_x86_64.whl CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.12+ x86-64 Details
cdiffer-0.7.2-cp36-cp36m-macosx_10_16_x86_64.whl CPython 3.6 CPython 3.6 pymalloc macOS 10.16+ x86-64 Details

Total release size: 9.6 MB

Release files / cdiffer-0.7.2.tar.gz

Download URL cdiffer-0.7.2.tar.gz
Size 30.8 kB
Tags Source
SHA-256 checksum
How to use checksums
d72409850a5cb03b9c47d04a5328bdcd521bd1b4277c08b37a8f7ae4a0d7a5e7
BLAKE2b-256 checksum
How to use checksums
fd550606c03869f8c9ea2036cbfe1106de5ad5ab95ff76e56aebe52c9cd5ca63
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / cdiffer-0.7.2-cp39-cp39-win_amd64.whl

Download URL cdiffer-0.7.2-cp39-cp39-win_amd64.whl
Size 554.3 kB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
693b517e3d3e10cb65a2f1e41366ea88fe23cb012e60e8306f6ce1a559e54353
BLAKE2b-256 checksum
How to use checksums
5fe9c0ed061e755e79a4c67575b7c6bfd2d4c44a774130ed2113a037ea9695fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / cdiffer-0.7.2-cp39-cp39-manylinux2010_x86_64.whl

Download URL cdiffer-0.7.2-cp39-cp39-manylinux2010_x86_64.whl
Size 1.4 MB
Tags CPython 3.9 Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
fde77caf855e42639ff54711a5a74e814d71b3f8d0261de8665db6ced53420b2
BLAKE2b-256 checksum
How to use checksums
dfcc8f45eeca007ae4006b764c95e236040decb669eb4121fa7755d149f1df89
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / cdiffer-0.7.2-cp39-cp39-macosx_10_16_x86_64.whl

Download URL cdiffer-0.7.2-cp39-cp39-macosx_10_16_x86_64.whl
Size 442.2 kB
Tags CPython 3.9 macOS 10.16+ x86-64
SHA-256 checksum
How to use checksums
0add3c3d74227d3cb4c05c38d03e0b454563c1e194e62bdf8c07e92359cba0fd
BLAKE2b-256 checksum
How to use checksums
10d50a6b8577e8d4c7d05478c621ced5301d6e71c8f4eca792c537fef5451f4e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / cdiffer-0.7.2-cp38-cp38-win_amd64.whl

Download URL cdiffer-0.7.2-cp38-cp38-win_amd64.whl
Size 553.1 kB
Tags CPython 3.8 Windows x86-64
SHA-256 checksum
How to use checksums
dfa5cedd5f370966ef1af0164726b4637ddc7e324bbb1ff6945941668bbe06e5
BLAKE2b-256 checksum
How to use checksums
27a384d1f64ee831453dedd9fc3de2cd149426f9e4c7a91e0ec24dc61b5c8236
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / cdiffer-0.7.2-cp38-cp38-manylinux2010_x86_64.whl

Download URL cdiffer-0.7.2-cp38-cp38-manylinux2010_x86_64.whl
Size 1.4 MB
Tags CPython 3.8 Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
17701a0f5affb2dfdad1e3bb0cdbb352a66b1bf8548f2a8d78470387e4972848
BLAKE2b-256 checksum
How to use checksums
6eb10e6b2198ff4fb9fd3ccad8623d3014ee0ba6027ef09fe84369bea2be0037
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / cdiffer-0.7.2-cp38-cp38-macosx_10_16_x86_64.whl

Download URL cdiffer-0.7.2-cp38-cp38-macosx_10_16_x86_64.whl
Size 441.8 kB
Tags CPython 3.8 macOS 10.16+ x86-64
SHA-256 checksum
How to use checksums
e59d03e0be3dadb9009d9c620bd5a1c53210d584ec6361d0606f83358a7ab203
BLAKE2b-256 checksum
How to use checksums
add0c8520a170649324a314b3bfef957c35bf9fd2eb16b62f86533bdb3cd6627
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / cdiffer-0.7.2-cp37-cp37m-win_amd64.whl

Download URL cdiffer-0.7.2-cp37-cp37m-win_amd64.whl
Size 561.1 kB
Tags CPython 3.7 CPython 3.7 pymalloc Windows x86-64
SHA-256 checksum
How to use checksums
fb6f68607376532f57dabc51a857cc1b6e4faea0651f2754982685e6da76d8de
BLAKE2b-256 checksum
How to use checksums
1b99f071c55df6e06bb48fe7061332aafe9f87ac59625ffacbec014d4abaa8b6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / cdiffer-0.7.2-cp37-cp37m-manylinux2010_x86_64.whl

Download URL cdiffer-0.7.2-cp37-cp37m-manylinux2010_x86_64.whl
Size 1.3 MB
Tags CPython 3.7 CPython 3.7 pymalloc Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
a7d1b56eabc160745c1f0ce08575f0b5e1e36eb726742f1b5ce9a807ee2becf4
BLAKE2b-256 checksum
How to use checksums
4858f66bcf02cc55fd891b0bcf511092c5f5a673eb0490e65c8e67ef208e1cba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / cdiffer-0.7.2-cp37-cp37m-macosx_10_16_x86_64.whl

Download URL cdiffer-0.7.2-cp37-cp37m-macosx_10_16_x86_64.whl
Size 481.1 kB
Tags CPython 3.7 CPython 3.7 pymalloc macOS 10.16+ x86-64
SHA-256 checksum
How to use checksums
090dbd6a64482c8be0f6d0bcebbc75f175141328ef107bc32fc99422caf65fe0
BLAKE2b-256 checksum
How to use checksums
101f87a42d71f76565e3d235fbd73bc6d7233eb1f0e91fb269baaaa78d3ce6c8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / cdiffer-0.7.2-cp36-cp36m-win_amd64.whl

Download URL cdiffer-0.7.2-cp36-cp36m-win_amd64.whl
Size 561.0 kB
Tags CPython 3.6 CPython 3.6 pymalloc Windows x86-64
SHA-256 checksum
How to use checksums
ea2b3064fe73e3b3026fa9bae505755655d88abe572b24b68d5bcdd76a238ef5
BLAKE2b-256 checksum
How to use checksums
b1d1be62bbb2d3a825d87de7fa2c0e42c8328772713bb1456f7b83c3831f5917
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / cdiffer-0.7.2-cp36-cp36m-manylinux2010_x86_64.whl

Download URL cdiffer-0.7.2-cp36-cp36m-manylinux2010_x86_64.whl
Size 1.3 MB
Tags CPython 3.6 CPython 3.6 pymalloc Linux glibc 2.12+ x86-64
SHA-256 checksum
How to use checksums
13a988e9021ab43741ec5b57d71dc27412801d3f9bc7a3f26464401e0a9f6af1
BLAKE2b-256 checksum
How to use checksums
89960a75ce08daae92cdaa55ff09a5163f7f76ca3739c7723bb1771cdfd685a9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release files / cdiffer-0.7.2-cp36-cp36m-macosx_10_16_x86_64.whl

Download URL cdiffer-0.7.2-cp36-cp36m-macosx_10_16_x86_64.whl
Size 481.1 kB
Tags CPython 3.6 CPython 3.6 pymalloc macOS 10.16+ x86-64
SHA-256 checksum
How to use checksums
d5be4be67eeb8b2e445568905ebfd6abb6a4e6f571be57a05ffa179541222e39
BLAKE2b-256 checksum
How to use checksums
1e12f33c7cb7a5eb632d815dfd7e0447579b58dffe329703ddf528f2d12f09ca
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.22.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

Release history Release notifications | RSS feed

This release

0.7.2 This release

13 release files

0.7.1

13 release files

0.4.4

19 release files

0.4.3

19 release files

0.2.4

20 release files

0.1.7

20 release files

0.1.6

20 release files

0.1.5

6 release files

0.1.4

6 release files

0.1.3

20 release files

0.1.2

20 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page