• Stars
    star
    239
  • Rank 168,763 (Top 4 %)
  • Language
    Python
  • License
    Apache License 2.0
  • Created over 13 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Couchbase Python Client Library (Official)

Couchbase Python Client

Python client for Couchbase

NOTE: This is the documentation for the 4.x version of the client. This is mostly compatible with the older 3.x version. Please refer to the 3.2.7 tag for the older 3.x version.

Contents

Prerequisites

  • Couchbase Server
  • You may need a C++ compiler supporting C++ 17 and Python development files, unless a binary wheel is available for your platform. With the 4.0.2 release, wheels are available on Windows, MacOS and Linux (via manylinux) for Python 3.7 - 3.10.
  • CMake (version >= 3.18), unless a binary wheel is available for your platform.
  • Git, unless a binary wheel is available for your platform.
  • OpenSSL is now required for the 4.x Python SDK.
  • If using the Twisted Framework and the txcouchbase API, Twisted >= 21.7.0 is required.

Debian and Ubuntu

First-time setup:

$ sudo apt install git-all python3-dev python3-pip python3-setuptools cmake build-essential libssl-dev

NOTE: We have provided Dockerfiles to demonstrate steps to achieve a working setup for various linux platforms. See the dockerfiles folder in the Python SDK examples folder for details.

See Debian and Ubuntu install section to install SDK.

RHEL and CentOS

First-time setup:

$ sudo yum install git-all gcc gcc-c++ python3-devel python3-pip python3-setuptools cmake openssl-devel

❗IMPORTANT❗
Some of the defaults for older operating systems like Centos/RHEL 7 and 8 have defaults to do not meet the 4.x Python SDK minimum requirements. Be sure to update to the minimum requirements prior to installing the SDK. Most notably be sure to check the following:

  • The default Python version might be less than 3.7. If so, the Python version will need to be udpated.
  • The default OpenSSL version might be less than 1.1.1. If so, the OpenSSL version will need to be updated.
  • The gcc version must provide C++17 support. If the installed gcc version does not support C++17, gcc will need to be updated.
  • The installed CMake version might be less than 3.17. If so, the CMake version will need to be updated. Check out the steps here to update CMake.

NOTE: We have provided Dockerfiles to demonstrate steps to achieve a working setup for various linux platforms. See the dockerfiles folder in the Python SDK examples folder for details.

See RHEL and Centos install section to install SDK.

Mac OS

It is not recommended to use the vendor-supplied Python that ships with OS X. Best practice is to use a Python virtual environment such as pyenv or venv (after another version of Python that is not vendor-supplied has been installed) to manage multiple versions of Python.

❗IMPORTANT❗
There can be a problem when using the Python (3.8.2) that ships with Xcode on Catalina. It is advised to install Python with one of the following:

pyenv

See detailed walk through in Appendix. Also, see pyenv install docs for further details.

NOTE: If using pyenv, make sure the python interpreter is the pyenv default, or a virtual environment has been activiated. Otherwise cmake might not be able to find the correct version of Python3 to use when building.

Homebrew

See Homebrew install docs for further details.

Get the latest packages:

$ brew update

Install Python:

$ brew install python

Update path:

  • zsh:
    $ echo 'export PATH="/usr/local/bin:"$PATH' >> ~/.zshrc
  • bash:
    $ echo 'export PATH="/usr/local/bin:"$PATH' >> ~/.bash_profile

Install OpenSSL:

$ brew install [email protected]

To get OpenSSL to be found by cmake on macos, find where openssl was installed via homebrew:

This will show you how to get it seen by pkg-config. To check that it worked, do this:

pkg-config --modversion openssl

See Mac OS install section to install SDK.

Windows

Wheels are available on Windows for Python 3.7, 3.8, 3.9 and 3.10.

Best practice is to use a Python virtual environment such as venv or pyenv (checkout the pyenv-win project) to manage multiple versions of Python.

If wanting to install from source, see the Windows building section for details.

See Windows install section to install SDK.

Installing

Back to Contents

You can always get the latest supported release version from pypi.

NOTE: If you have a recent version of pip, you may use the latest development version by issuing the following incantation:

pip install git+https://github.com/couchbase/couchbase-python-client.git

NOTE: The Python Client installer relies on PEP517 which older versions of PIP do not support. If you experience issues installing it is advised to upgrade your PIP/setuptools installation as follows:

python3 -m pip install --upgrade pip setuptools wheel

Debian and Ubuntu

First, make sure the prerequisites have been installed.

Install the SDK:

$ python3 -m pip install couchbase

RHEL and CentOS

First, make sure the prerequisites have been installed.

Install the SDK:

$ python3 -m pip install couchbase

Mac OS

First, make sure the prerequisites have been installed.

Install the SDK:

$ python -m pip install couchbase

Windows

First, make sure the prerequisites have been installed.

NOTE: Commands assume user is working within a virtual environment. For example, the following commands have been executed after downloading and installing Python from python.org:
-C:\Users\Administrator\AppData\Local\Programs\Python\Python39\python -m venv C:\python\python39
-C:\python\python39\Scripts\activate

Install the SDK (if using Python 3.7, 3.8, 3.9 or 3.10):

python -m pip install couchbase

Alternative Installation Methods

In order to successfully install with the following methods, ensure a proper build system is in place (see the Windows building section for details).

Source Install (i.e. no wheel)

First, ensure all the requirements for a build system are met.

Install the SDK:

python -m pip install couchbase --no-binary couchbase

Local Install

First, ensure all the requirements for a build system are met.

Clone this Python SDK repository:

git clone --depth 1 --branch <tag_name> --recurse-submodules https://github.com/couchbase/couchbase-python-client.git

Where tag_name is equal to the latest release.
Example: git clone --depth 1 --branch 4.0.0 --recurse-submodules https://github.com/couchbase/couchbase-python-client.git

Move into the directory created after cloning the Python SDK repository:

cd couchbase-python-client

NOTE: If the --recurse-submodules option was not used when cloning the Python SDK repository, run (after moving into the cloned repository directory) git submodule update --init --recursive to recursively update and initialize the submodules.

Install the SDK from source:

python -m pip install .

Anaconda/Miniconda

To use the SDK within the Anaconda/Miniconda platform, make sure the prerequisites for the desired Operating System are met:

In the Anaconda Prompt, create a new environment:

(base) C:\Users\user1>conda create -n test_env python=3.9

Activate the environment

(base) C:\Users\user1>conda activate test_env

Install the SDK:

(test_env) C:\Users\user1>python -m pip install couchbase

NOTE: If using Windows, and no wheel is available, see the Alternative Install Methods Windows section. The same process should work within the Anaconda/Miniconda platform.

Building

Back to Contents

NOTE: This section only applies to building from source.

Build System Setup

Linux

Make sure the prerequisites have been installed:

Mac OS

First, make sure the prerequisites have been installed.

Install cmake:

$ brew install cmake

Install command line developer tools:

$ xcode-select --install

NOTE: It is possible that installing or updating to the the latest version of Xcode is needed.

If setuptools is not installed:

$ python -m pip install setuptools

Windows

Requirements

  • Download and install Git
  • Download and install Visual Studio 2019
    • Check Desktop development with C++ prior to installing
  • Download and install CMake >= v 3.18
  • Download and install Python

VS2019 Notes

If seeing issues when trying to build (steps in ), some things to check/try:

  • Try running the build commands within the Developer Command Prompt for VS2019
  • Make sure MSBuild can find the correct VCTargetsPath
    • It is possible the VCTargetsPath environment variable needs to be set. The below example is based on a typical path, but the actual setting should match that of your current environment setup.
      • set VCTargetsPath=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160
  • Make sure CMake is picking up the correct generator
    • It is possible the CMAKE_GENERATOR environment variable needs to be set
      • set CMAKE_GENERATOR=Visual Studio 16 2019

Build the Python SDK

Clone this Python SDK repository:

git clone --depth 1 --recurse-submodules https://github.com/couchbase/couchbase-python-client.git

NOTE: If the --recurse-submodules option was not used when cloning the Python SDK repository, run (after moving into the cloned repository directory) git submodule update --init --recursive to recursively update and initialize the submodules.

Move into the directory created after cloning the Python SDK repository:

cd couchbase-python-client

The following will compile the module locally:

python setup.py build_ext --inplace

You can also modify the environment CFLAGS and LDFLAGS variables.

❗WARNING: If you do not intend to install this module, ensure you set the PYTHONPATH environment variable to this directory before running any scripts depending on it. Failing to do so may result in your script running against an older version of this module (if installed), or throwing an exception stating that the couchbase module could not be found.

Install

pip install .

❗WARNING: If you are on Linux/Mac OS you may need to remove the build directory: rm -rf ./build before installing with pip: pip3 install ..

Using the SDK

Back to Contents

Connecting

See official documentation for further details on connecting.

# needed for any cluster connection
from couchbase.cluster import Cluster
from couchbase.auth import PasswordAuthenticator

# options for a cluster and SQL++ (N1QL) queries
from couchbase.options import ClusterOptions, QueryOptions

# get a reference to our cluster
cluster = Cluster.connect('couchbase://localhost', ClusterOptions(
  PasswordAuthenticator('Administrator', 'password')))

NOTE: The authenticator is always required.

Basic Operations

See official documentation for further details on Working with Data.

Building upon the example code in the Connecting section:

# get a reference to our bucket
cb = cluster.bucket('travel-sample')

# get a reference to the default collection
cb_coll = cb.default_collection()

# get a document
result = cb_coll.get('airline_10')
print(result.content_as[dict])

# using SQL++ (a.k.a N1QL)
call_sign = 'CBS'
sql_query = 'SELECT VALUE name FROM `travel-sample` WHERE type = "airline" AND callsign = $1'
query_res = cluster.query(sql_query, QueryOptions(positional_parameters=[call_sign]))
for row in query_res:
    print(row)

Async Operations

The Python Couchbase SDK supports asynchronous I/O through the use of the asyncio (Python standard library) or the Twisted async framework.

Asyncio

To use asyncio, import acouchbase.cluster instead of couchbase.cluster. The acouchbase API offers an API similar to the couchbase API.

from acouchbase.cluster import Cluster, get_event_loop
from couchbase.options import ClusterOptions
from couchbase.auth import PasswordAuthenticator


async def write_and_read(key, value):
    cluster = await Cluster.connect('couchbase://localhost',
                      ClusterOptions(PasswordAuthenticator('Administrator', 'password')))
    cb = cluster.bucket('default')
    await cb.on_connect()
    cb_coll = cb.default_collection()
    await cb_coll.upsert(key, value)
    result = await cb_coll.get(key)
    return result

loop = get_event_loop()
rv = loop.run_until_complete(write_and_read('foo', 'bar'))
print(rv.content_as[str])

Twisted

To use with Twisted, import txcouchbase.cluster instead of couchbase.cluster. The txcouchbase API offers an API similar to the couchbase API.

NOTE: The minimum required Twisted version is 21.7.0.

❗WARNING: The 4.x SDK introduced a breaking change where the txcouchbase package must be imported prior to importing the reactor (see example below). This is so that the asyncio reactor can be installed.

# IMPORTANT -- the txcouchbase import must occur PRIOR to importing the reactor
import txcouchbase
from twisted.internet import reactor, defer

from txcouchbase.cluster import TxCluster
from couchbase.options import ClusterOptions
from couchbase.auth import PasswordAuthenticator


def after_upsert(res, key, d):
    print('Set key.  Result CAS: ', res.cas)
    # trigger get_document callback
    d.callback(key)

def upsert_document(key, doc):
    d = defer.Deferred()
    res = cb.upsert(key, doc)
    res.addCallback(after_upsert, key, d)
    return d

def on_get(res, _type=str):
    print('Got res: \n', res.content_as[_type])
    reactor.stop()

def get_document(key):
    res = cb.get(key)
    res.addCallback(on_get)


# create a cluster object
cluster = TxCluster('couchbase://localhost',
                    ClusterOptions(PasswordAuthenticator('Administrator', 'password')))

# create a bucket object
bucket = cluster.bucket('default')
# create a collection object
cb = bucket.default_collection()

d = upsert_document('testDoc_1', {'id': 1, 'type': 'testDoc', 'info': 'fake document'})
d.addCallback(get_document)

reactor.run()

Building Documentation

Back to Contents

The documentation is using Sphinx and a number of extensions. To build the documentation be sure to pip install the sphinx_requirements.txt.

python3 -m pip install -r sphinx_requirements.txt

To build the documentation, go into the docs directory and run:

make html

The HTML output can be found in docs/build/html/.

Alternatively, you can also build the documentation from the top-level directory:

python setup.py build_sphinx

Once built, the docs will be in in build/sphinx/html. You can open the index.html file with the following command:

open docs/build/sphinx/html/index.html

Testing

Back to Contents

For running the tests, be sure to pip install the dev_requirements.txt. The Couchbase Python SDK uses pytest for the test suite.

python3 -m pip install -r dev_requirements.txt

The tests need a running Couchbase instance. For this, a test_config.ini file must be present, containing various connection parameters. The default test_config.ini file may be found in the tests directory. You may modify the values of the test_config.ini file as needed.

To run the tests for the blocking API (i.e. couchbase API):

python -m pytest -m pycbc_couchbase -p no:asyncio -v -p no:warnings

To run the tests for the asyncio API (i.e. acouchbase API):

python -m pytest -m pycbc_acouchbase --asyncio-mode=strict -v -p no:warnings

Contributing

Back to Contents

We welcome contributions from the community! Please see follow the steps outlined here to get started.

The Python SDK uses pre-commit in order to handle linting, formatting and verifying the code base. pre-commit can be installed either by installing the development requirements:

python3 -m pip install -r dev_requirements.txt

Or by installing pre-commit separately

python3 -m pip install pre-commit

To run pre-commit, use the following:

pre-commit run --all-files

License

Back to Contents

The Couchbase Python SDK is licensed under the Apache License 2.0.

See LICENSE for further details.

Support & Additional Resources

Back to Contents

If you found an issue, please file it in our JIRA.

The Couchbase Discord server is a place where you can collaborate about all things Couchbase. Connect with others from the community, learn tips and tricks, and ask questions. Join Discord and contribute.

You can ask questions in our forums.

The official documentation can be consulted as well for general Couchbase concepts and offers a more didactic approach to using the SDK.

Appendix

Back to Contents

Mac OS pyenv Install

See pyenv install docs for further details.

Get the latest packages:

$ brew update

For TLS/SSL support:

$ brew install [email protected]

Install pyenv:

$ brew install pyenv

NOTE: It is possible that Xcode might need to be reinstalled. Try one of the following:

  • Use command xcode-select --install
  • Install the latest version of Xcode

For Zsh, run the following commands to update .zprofile and .zshrc. See pyenv install docs for further details on other shells.

$ echo 'eval "$(pyenv init --path)"' >> ~/.zprofile
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc

NOTE: You need to restart your login session for changes to take affect. On MacOS, restarting terminal windows should suffice.

Install Python version:

$ pyenv install 3.9.7

Set local shell to installed Python version:

$  pyenv local 3.9.7

To use virtualenvwrapper with pyenv, install pyenv-virtualenvwrapper:

$ brew install pyenv-virtualenvwrapper

To setup a virtualenvwrapper in your pyenv shell, run either pyenv virtualenvwrapper or pyenv virtualenvwrapper_lazy

NOTE: If issues with pyenv virtualenvwrapper, using python -m pip install virtualenvwrapper should accomplish the same goal.

Make a virtualenv:

$ mkvirtualenv python-3.9.7-test

Install the SDK:

$ python -m pip install couchbase

Run individual pre-commit commands

To run pre-commit hooks separately, use the following.

autopep8

pre-commit run autopep8 --all-files

bandit

pre-commit run bandit --all-files

clang-format

pre-commit run clang-format --all-files

flake8

pre-commit run flake8 --all-files

isort

pre-commit run isort --all-files

trailing whitespace

pre-commit run trailing-whitespace --all-files

More Repositories

1

couchbase-lite-ios

Lightweight, embedded, syncable NoSQL database engine for iOS and MacOS apps.
Objective-C
1,603
star
2

forestdb

A Fast Key-Value Storage Engine Based on Hierarchical B+-Tree Trie
C++
1,284
star
3

couchbase-lite-android

Lightweight, embedded, syncable NoSQL database engine for Android.
Java
1,173
star
4

moss

moss - a simple, fast, ordered, persistable, key-val storage library for golang
Go
947
star
5

geocouch

GeoCouch, a spatial index for CouchDB
Erlang
513
star
6

vellum

A Go library implementing an FST (finite state transducer)
Go
497
star
7

couchnode

Couchbase Node.js Client Library (Official)
C++
462
star
8

sync_gateway

Manages access and synchronization between Couchbase Lite and Couchbase Server
Go
447
star
9

couchbase-lite-net

A lightweight, document-oriented (NoSQL), syncable database engine for .NET
C#
436
star
10

go-slab

slab allocator in go
Go
364
star
11

gocb

The Couchbase Go SDK
Go
359
star
12

go-couchbase

Couchbase client in Go
Go
318
star
13

fleece

A super-fast, compact, JSON-equivalent binary data format
C++
309
star
14

couchbase-net-client

The official Couchbase SDK for .NET Core and Full Frameworks
C#
271
star
15

couchbase-lite-core

Cross-platform C++ core library for Couchbase Lite
C++
253
star
16

couchbase-java-client

The official Java client for Couchbase Server
Java
252
star
17

couchbase-elasticsearch-connector

The Official Couchbase Elasticsearch Connector
Java
176
star
18

libcouchbase

The couchbase client for C.
C
173
star
19

docker

Dockerfiles and configuration scripts for the Docker Hub Official Couchbase images
Dockerfile
140
star
20

cbft

Couchbase Full Text server
Go
136
star
21

couchdb

CouchDB
Erlang
129
star
22

kv_engine

Couchbase Key-Value Engine
C++
128
star
23

couchbase-spark-connector

The Official Couchbase Spark Connector
Scala
119
star
24

couchbase-lite-C

C language bindings for the Couchbase Lite embedded NoSQL database engine
C++
112
star
25

nitro

A high performance in-memory index storage engine
Go
107
star
26

couchbase-ruby-client

Couchbase Ruby Client Library (Official)
Ruby
107
star
27

query

Query engine.
Go
103
star
28

kafka-connect-couchbase

Kafka Connect connector for Couchbase Server
Java
70
star
29

couchbase-kafka-connector

Legacy Couchbase to Kafka connector, superseded by Kafka Connect based.
Java
69
star
30

couchbase-lite-java-core

Couchbase Lite Java core library
Java
68
star
31

CouchbaseMock

A Java mock for Couchbase
Java
62
star
32

couchbase-ruby-model

The Active Model implementation for Couchbase Server built on couchbase-ruby-client
Ruby
61
star
33

memcached

Memcached work planned for contribution back to memcached/memcached
C++
56
star
34

couchstore

couchbase storage file library
C
54
star
35

couchbase-lite-java

Portable java version of Couchbase Lite
Java
52
star
36

java-dcp-client

Couchbase Java DCP Client
Java
48
star
37

couchbase-lite-java-ce-root

The root workspace for the Community Editions of the Java language family of products (Java Desktop, Java WebService, and Android)
Shell
47
star
38

ns_server

The Membase Server Superdupervisor.
JavaScript
44
star
39

couchbase-jvm-clients

The Couchbase Monorepo for JVM Clients: Java, Scala, io-core…
Java
44
star
40

kubernetes

Deprecated. Please use the Couchbase Autonomous Operator
Shell
43
star
41

couchbase-cli

Command Line tools for Administering a Couchbase Cluster
Python
39
star
42

moxi

a memcached proxy with energy and pep
C
39
star
43

indexing

Couchbase Indexes
Go
38
star
44

tlm

top level makefile
CMake
35
star
45

docs-site

The Antora playbook project, contributing documentation, and home page for the new Couchbase Docs site.
JavaScript
34
star
46

go_n1ql

N1QL Driver for Go lang's database/sql package
Go
33
star
47

couchbase-jvm-core

The JVM core for Couchbase SDKs.
Java
32
star
48

docs-cb4

Documentation for Couchbase Server 4.x and 5.x GA releases
HTML
28
star
49

ep-engine

Eventually Persistent Couchbase Data Layer.
C++
28
star
50

couchbase-exporter

Couchbase Prometheus Exporter
Go
27
star
51

eventing

Couchbase Eventing Engine
Go
26
star
52

couchbase-lite-android-liteserv

An HTTP (ReST) interface to the Couchbase-Lite database running on the device/emulator
Java
24
star
53

gocbcore

The IO component of gocb
Go
22
star
54

cbgt

The cbgt project provides a generic golang library that manages partitions or data shards across a cluster of servers.
Go
22
star
55

testrunner

The TestRunner (Extracted from carlin).
Python
21
star
56

perfrunner

Performance TAF for Couchbase Server
Python
20
star
57

couchbase-lite-java-native

This is a shared native SQLite library used for Couchbase Lite Android/Java.
C++
20
star
58

couchbase-examples

Ruby
19
star
59

chronicle

Erlang
19
star
60

docs-server

The Couchbase Server documentation source files (in AsciiDoc) used in the Couchbase Docs site.
HTML
18
star
61

service-broker

An Open Service Broker Based Kubernetes Templating Engine
Go
17
star
62

build

jenkins scripts for executing builds, cgi scripts for status and reporting
Shell
17
star
63

goxdcr

Go
16
star
64

phosphor

High performance event tracing
C++
16
star
65

couchbase-fluent-bit

Fast and Lightweight Log processor and forwarder. Based on upstream Fluent Bit, this includes some additional Couchbase specific configuration and support - https://github.com/fluent/fluent-bit
Go
13
star
66

subjson

High performance JSON manipulation library
C++
13
star
67

gperftools

C++
12
star
68

platform

Small library providing a platform layer
C++
12
star
69

docs-ui-old

Produces the UI bundle used by the Couchbase documentation site.
CSS
12
star
70

couchbase-lite-java-listener

Embedded web server to expose Couchbase Lite REST API on an http socket
Java
12
star
71

cbmonitor

cbmonitor
Python
11
star
72

docs-couchbase-lite

Documentation for Couchbase Lite
Java
10
star
73

couchbase-lite-java-javascript

Javascript view engine for Couchbase Lite Android
Java
10
star
74

sg-bucket

Sync Gateway Bucket interface and common code used by all Sync Gateway bucket implementations.
Go
10
star
75

query-ui

The Couchbase query workbench UI for SQL++ / N1QL.
JavaScript
10
star
76

godbc

Golang database connectivity API. This API is more flexible and extensible than golang's built-in database/sql package, because like JDBC, the API uses interfaces instead of concrete types. This allows it to be extended to handle both SQL and NoSQL / JSON data sources.
Go
10
star
77

couchbase-lite-android-ce

The community edition of couchbase lite for android
9
star
78

clog

Couchbase logging for go.
Go
9
star
79

gometa

Go
9
star
80

cbbootstrap

REST API to help bootstrap Couchbase Server clusters
Go
8
star
81

build-infra

Various programs and scripts used by the Build & Release team not directly related to specific software build processes
Dockerfile
7
star
82

gocbmgr

A library for the making Couchbase REST API calls in golang
Go
7
star
83

sigar

System Information Gatherer And Reporter
C++
7
star
84

Android-EmptyApp

The android empty app.
Java
7
star
85

product-metadata

Various configuration files describing products we build
Jinja
6
star
86

go-blip

Go language implementation of BLIP-over-WebSocket protocol
Go
6
star
87

docs-sdk-go

The Go SDK documentation source files used in the new Couchbase Docs site.
Go
5
star
88

build-manifests

Internal build manifests for all products.
5
star
89

tools-common

Go
5
star
90

couchbase-php-client

Couchbase PHP Client Library (Official)
PHP
5
star
91

docs-sdk-java

The Java SDK documentation source files used in the Couchbase Docs site.
Java
5
star
92

couchbase-lite-java-common

Common code for the Java language family of products (Java Desktop, Java WebService, and Android)
Java
5
star
93

server-sandbox

Dockerfiles for couchbase/server-sandbox automated build
Shell
5
star
94

couchbase-hadoop-plugin

A Couchbase to Hadoop (Sqoop) plugin for importing and exporting data
Java
5
star
95

n1k1

n1k1, pronounced "nicky", is a prototype execution compiler and engine for N1QL query plans
Go
4
star
96

gocb-opentelemetry

Go
4
star
97

stellar-gateway

Go
4
star
98

rhmap

robinhood hashmap in golang
Go
4
star
99

spring

Simple Couchbase CRUD-workload generator based on pylibcouchbase
Python
4
star
100

product-texts

Repository for product-specific documents (e.g. READMEs, license files, etc.)
Rich Text Format
3
star