#
#==================================================================================
#       Copyright (c) 2019 Nokia
#       Copyright (c) 2018-2019 AT&T Intellectual Property.
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.
#==================================================================================
#

RIC Message Router -- RMR

RMR is a message router library which an application can use to send messages
to other RMR based applications. The destination of each message is governed
by the message type and subscription ID, or just the message type.  RMR is
responsible for establishing and managing each connection freeing the application
from any network connectivity management.

This repo contains the source and documentation for both the core RMR library
and for the Python bindings which allow a Python (v3) application to use RMR
to send and receive messages.

The directories at the root level are as follows, each contains its own readme
file where additional details are necessary.


ci		This directory contains the continuous integration scripts needed
		to build and verify RMR when changes are made and committed to the repo.

doc		RMR documentation is written in a document language and thus is
		source code.  This directory contains the source for all generated
		documentation.

docs	This is a 'canned' directory which is intended to be scraped. Direct
		editing of documentation files in this directory is dangerous as
		most of the files, even though checked into the repo per mandate,
		are artifacts and will be overlaid if hand edited.

examples This directory contains example programmes which illustrate the use
		of RMR.

ext		RMR makes use of NNG (next generation Nanomsg). The ext directory is
		the git reference allowing the NNG code to be pulled and built as
		a reference.

src		This directory is the top level source directory containing both the
		core RMR code, and any bindings which have been written.

test	All unit and application level tests for the core library are kept
		within this directory.  Tests for bindings are managed within the
		binding's directory under the source directory.

Top level pollution
There are several "configuration" files which sit at the top level of the
repo that are required for some sort of CI/CD/Documentation automation. Most,
if not all of the CI/CD goo is in the ci directory where it's out of the way
and thus not confusing. However, there is some pollution that can generally
be ignored:

	tox.ini -- this seems to drive the scraper which pulls from docs and
			writes to some external documentation repo/host.


	.readthedocs.yaml -- this seems to be some configuration for the docs
			scraping process(es).
