From 0ebcf5098c86a4543da76e487ec0428c286c30aa Mon Sep 17 00:00:00 2001 From: Navid Yaghoobi Date: Sun, 5 Nov 2023 19:54:28 +1100 Subject: [PATCH] [:GHPAGES:] - workflow update Signed-off-by: Navid Yaghoobi --- .github/workflows/gh-pages.yml | 57 ++++++ .gitignore | 4 + LICENSE | 201 +++++++++++++++++++++ Makefile | 9 +- README.md | 30 ++- cmd/gopensky-query/root.go | 6 +- cmd/gopensky-query/states.go | 14 +- doc.go | 5 + docs/Makefile | 22 +++ docs/_static/custom.css | 14 ++ docs/{ => _static}/gopensky-query.png | Bin docs/_static/radar.png | Bin 0 -> 63749 bytes docs/conf.py | 251 ++++++++++++++++++++++++++ docs/examples.rst | 40 ++++ docs/goapi_functions.rst | 62 +++++++ docs/goapi_types.rst | 126 +++++++++++++ docs/index.rst | 42 +++++ states.go | 10 - types_state.go | 10 + 19 files changed, 866 insertions(+), 37 deletions(-) create mode 100644 .github/workflows/gh-pages.yml create mode 100644 doc.go create mode 100644 docs/Makefile create mode 100644 docs/_static/custom.css rename docs/{ => _static}/gopensky-query.png (100%) create mode 100644 docs/_static/radar.png create mode 100644 docs/conf.py create mode 100644 docs/examples.rst create mode 100644 docs/goapi_functions.rst create mode 100644 docs/goapi_types.rst create mode 100644 docs/index.rst diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml new file mode 100644 index 0000000..de1a994 --- /dev/null +++ b/.github/workflows/gh-pages.yml @@ -0,0 +1,57 @@ +# Sample workflow for building and deploying a Jekyll site to GitHub Pages +name: Build and Deploy GitHub Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + if: "contains(github.event.head_commit.message, '[:GHPAGES:]')" + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install additional packages + run: sudo apt-get update -y && sudo pip install -U sphinx sphinx_rtd_theme + + - name: Build documents + run: | + make docs + mkdir _site/ + cp -r docs/_build/html/* _site/ + + - name: Setup Pages + uses: actions/configure-pages@v3 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v2 + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 diff --git a/.gitignore b/.gitignore index 7460f72..6b984c0 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,7 @@ go.work bin/* *.log *.out + + +_site/ +docs/_build/ diff --git a/LICENSE b/LICENSE index e69de29..261eeb9 100644 --- a/LICENSE +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/Makefile b/Makefile index d9d2cd3..8a37b3b 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ PKG_MANAGER ?= $(shell command -v dnf yum|head -n1) BUILDFLAGS := -mod=vendor $(BUILDFLAGS) #================================================= -# Build binary, clean, install and uninstall +# Build binary, documents #================================================= all: binary @@ -26,6 +26,11 @@ $(TARGET): $(SRC) @mkdir -p $(BIN) $(GO) build $(BUILDFLAGS) -o $(BIN)/$(TARGET) ./cmd/$(TARGET)/ +.PHONY: docs +docs: ## Generates html documents + @make -C docs + + #================================================= # Required tools installation tartgets #================================================= @@ -83,7 +88,7 @@ gofmt: ## Run gofmt .PHONY: codespell codespell: ## Run codespell @echo "running codespell" - @codespell -S ./vendor,go.mod,go.sum,./.git + @codespell -S ./vendor,go.mod,go.sum,./.git,./docs/_build #================================================= # Help menu diff --git a/README.md b/README.md index f662be7..04a9d4c 100644 --- a/README.md +++ b/README.md @@ -5,14 +5,15 @@ This is the golang implementation of the OpenSky network's live API. The API lets you retrieve live airspace information (ADS-B and Mode S data) for research and non-commerical purposes. -A command line (`gopensky-query`) is also available to query the opensky network api. +For documentation and examples visit [Golang OpenSky Network API](https://navidys.github.io/gopensky/). -`NOTE:` there are some limitation sets for anonymous and OpenSky users, visit [OpenSky Network Rest API documentation](https://openskynetwork.github.io/opensky-api/) for more information. +A `gopensky-query` binary command line is also available to query the opensky network api. -For more information about OpenSky Network visit [OpenSky Network Website](https://opensky-network.org/). +`NOTE:` there are some limitation sets for anonymous and OpenSky users, visit following links for more information: +* [OpenSky Network Rest API documentation](https://openskynetwork.github.io/opensky-api/) +* [OpenSky Network Website](https://opensky-network.org/). -## Example -### gopensky module +## gopensky module ``` import ( @@ -43,9 +44,18 @@ func main() { } ``` -### gopensky-query cmd (json output) +## gopensky-query cmd + +### build + +``` +$ make binary +``` + +### json output + ``` -$ gopensky /bin/gopensky-query states -j +$ ./bin/gopensky-query /bin/gopensky-query states -j { "time": 1699160183, "states": [ @@ -76,9 +86,9 @@ $ gopensky /bin/gopensky-query states -j } ``` -### gopensky-query cmd (table output) +### table output ``` -$ gopensky /bin/gopensky-query states +$ ./bin/gopensky-query /bin/gopensky-query states ``` -![Screenshot](./docs/gopensky-query.png) +![Screenshot](./docs/_static/gopensky-query.png) diff --git a/cmd/gopensky-query/root.go b/cmd/gopensky-query/root.go index 6e5aa86..25b73cd 100644 --- a/cmd/gopensky-query/root.go +++ b/cmd/gopensky-query/root.go @@ -16,7 +16,7 @@ import ( var ( cmdUsername string cmdPassword string - cmdIcao24List string + cmdIcao24List []string cmdTime int64 = -1 cmdDebug = false cmdPrintJSON = false @@ -73,7 +73,7 @@ func init() { //nolint:gochecknoinits rootCmd.PersistentFlags().BoolVarP(&cmdPrintJSON, "json", "j", cmdPrintJSON, "print json output") // states command - statesCommand.Flags().StringVarP(&cmdIcao24List, "icao24", "i", "", + statesCommand.Flags().StringSliceVarP(&cmdIcao24List, "icao24", "i", cmdIcao24List, "comma separates (,) list of unique ICAO 24-bit address of the transponder in hex string representation") statesCommand.Flags().Int64VarP(&cmdTime, "time", "t", cmdTime, @@ -83,7 +83,7 @@ func init() { //nolint:gochecknoinits "request the category of aircraft ") statesCommand.Flags().Float64SliceVar(&cmdStatesBoundingBox, "box", nil, - "query a certain area defined by a bounding box of WGS84 coordinates ([lamin,lomin,lamax,lomax])") + "query a certain area defined by a bounding box of WGS84 coordinates (lamin,lomin,lamax,lomax)") rootCmd.AddCommand(statesCommand) } diff --git a/cmd/gopensky-query/states.go b/cmd/gopensky-query/states.go index dad898c..d7173d6 100644 --- a/cmd/gopensky-query/states.go +++ b/cmd/gopensky-query/states.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "os" - "strings" "text/tabwriter" "github.com/navidys/gopensky" @@ -30,16 +29,7 @@ func preStateRun(cmd *cobra.Command, args []string) error { } func runStates(cmd *cobra.Command, args []string) { - var ( - icao24List []string - boundingBoxOpts *gopensky.BoundingBoxOptions - ) - - icao24Input := strings.TrimSpace(cmdIcao24List) - - if icao24Input != "" { - icao24List = strings.Split(icao24Input, ",") - } + var boundingBoxOpts *gopensky.BoundingBoxOptions if len(cmdStatesBoundingBox) == 4 { //nolint:gomnd boundingBoxOpts = &gopensky.BoundingBoxOptions{ @@ -57,7 +47,7 @@ func runStates(cmd *cobra.Command, args []string) { return } - states, err := gopensky.GetStates(conn, cmdTime, icao24List, boundingBoxOpts, cmdStatesExtended) + states, err := gopensky.GetStates(conn, cmdTime, cmdIcao24List, boundingBoxOpts, cmdStatesExtended) if err != nil { log.Error().Msgf("%v", err) diff --git a/doc.go b/doc.go new file mode 100644 index 0000000..5cbb4e1 --- /dev/null +++ b/doc.go @@ -0,0 +1,5 @@ +/* +This is the golang implementation of the OpenSky network's live API. +The API lets you retrieve live airspace information (ADS-B and Mode S data) for research and non-commercial purposes. +*/ +package gopensky diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..1e83189 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,22 @@ +all: html + +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." diff --git a/docs/_static/custom.css b/docs/_static/custom.css new file mode 100644 index 0000000..b28e5f5 --- /dev/null +++ b/docs/_static/custom.css @@ -0,0 +1,14 @@ +/* override table width restrictions */ +@media screen and (min-width: 767px) { + + .wy-table-responsive table td { + /* !important prevents the common CSS stylesheets from + overriding this as on RTD they are loaded after this stylesheet */ + white-space: normal !important; + } + + .wy-table-responsive { + overflow: visible !important; + } + + } diff --git a/docs/gopensky-query.png b/docs/_static/gopensky-query.png similarity index 100% rename from docs/gopensky-query.png rename to docs/_static/gopensky-query.png diff --git a/docs/_static/radar.png b/docs/_static/radar.png new file mode 100644 index 0000000000000000000000000000000000000000..76e91a7c81ad22332bf29a7116a5ae9b9963a52f GIT binary patch literal 63749 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 We8Yf=JH!G20000 v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +html_logo = os.path.join('_static', 'radar.png') + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +html_show_sourcelink = False + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr' +#html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'GoOpenSkyNetworkAPIdoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', + +# Latex figure (float) alignment +#'figure_align': 'htbp', +} + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + +# Custom CSS e.g. for table width +def setup(app): + app.add_css_file("custom.css") diff --git a/docs/examples.rst b/docs/examples.rst new file mode 100644 index 0000000..1a38c38 --- /dev/null +++ b/docs/examples.rst @@ -0,0 +1,40 @@ +Examples +======== + +All State Vectors +-------------------- +Example for retrieving all states without authentication: + +.. code-block:: go + + import ( + "context" + "fmt" + "os" + + "github.com/navidys/gopensky" + ) + + func main() { + conn, err := gopensky.NewConnection(context.Background(), "", "") + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + // retrieve all states information + statesData, err := gopensky.GetStates(conn, 0, nil, nil) + if err != nil { + fmt.Println(err) + os.Exit(2) + } + + for _, state := range statesData.States { + fmt.Printf("ICAO24: %s, Origin Country: %s, Longitude: %v, Latitude: %v \n", + state.Icao24, + state.OriginCountry, + state.Longitude, + state.Latitude, + ) + } + } diff --git a/docs/goapi_functions.rst b/docs/goapi_functions.rst new file mode 100644 index 0000000..1631207 --- /dev/null +++ b/docs/goapi_functions.rst @@ -0,0 +1,62 @@ +Go OpenSky API Functions +============================== + +.. _FUNC_CONNECTION: + +func :ref:`NewConnection ` +-------------------------------------------- + + Creates a new connection context to OpenSky Network live API server. + + + .. code-block:: go + + func NewConnection(ctx context.Context, username string, password string) (context.Context, error) + + + :Parameters: + - **ctx** (`context.Context `_) - connection context. + - **username** (string) - an OpenSky username (Anonymous connection will be use by providing empty username). + - **password** (string) - an OpenSky password for the given username. + + :Returns: context.Context, error + +.. _FUNC_GET_STATES: + +func :ref:`GetStates ` +-------------------------------------------- + + Retrieve state vectors for a given time. + + .. code-block:: go + + func GetStates(ctx context.Context, time int64, icao24 []string, bBox *BoundingBoxOptions, extended bool) (*States, error) + + + :Parameters: + - **ctx** (`context.Context `_) - connection context. + - **time** (int64) - time as Unix time stamp (seconds since epoch) or datetime. The datetime must be in UTC!. If ``time = 0`` the most recent ones are taken. + - **icao24** ([]string) - optionally retrieve only state vectors for the given ICAO24 address(es). The parameter an array of str containing multiple addresses. + - **bBox** (:ref:`*BoundingBoxOptions`) - optionally retrieve state vectors within a bounding box. Use :ref:`NewBoundingBox` function to create a new one. + - **extended** (bool) - set to ``true`` to request the category of aircraft + + :Returns: :ref:`*States`, error + +.. _BBOX_FUNC: + +func :ref:`NewBoundingBox ` +-------------------------------------------- + + Creates a new bounding (min_latitude, max_latitude, min_longitude, max_longitude) box option. + + .. code-block:: go + + func NewBoundingBox (lamin float64, lomin float64, lamax float64, lomax float64) *BoundingBoxOptions + + :Parameters: + - **lamin** (float64) - lower bound for the latitude in WGS84 decimal degrees. + - **lomin** (float64) - lower bound for the longitude in in WGS84 decimal degrees. + - **lamax** (float64) - upper bound for the latitude in WGS84 decimal degrees. + - **lomax** (float64) - upper bound for the longitude in in WGS84 decimal degrees. + + :Returns: :ref:`*BoundingBoxOptions` diff --git a/docs/goapi_types.rst b/docs/goapi_types.rst new file mode 100644 index 0000000..8d46bb5 --- /dev/null +++ b/docs/goapi_types.rst @@ -0,0 +1,126 @@ +Go OpenSky API Types +======================== + +.. _TYPE_STATES: + +type :ref:`States ` +-------------------------------------------- + +.. code-block:: go + + type States struct { + // The time which the state vectors in this response are associated with. + // All vectors represent the state of a vehicle with the interval. + Time int64 `json:"time"` + + // The state vectors. + // States []StateVector `json:"states"` + States []StateVector `json:"states"` + } + +.. _TYPE_STATE_VECTOR: + +type :ref:`StateVector ` +-------------------------------------------- + +.. code-block:: go + + type StateVector struct { + // Unique ICAO 24-bit address of the transponder in hex string representation. + Icao24 string `json:"icao24"` + + // Callsign of the vehicle (8 chars). Can be null if no callsign has been received. + Callsign *string `json:"callsign"` + + // Country name inferred from the ICAO 24-bit address. + OriginCountry string `json:"origin_country"` + + // Unix timestamp (seconds) for the last position update. + // Can be null if no position report was received by OpenSky within the past 15s. + TimePosition *int64 `json:"time_position"` + + // Unix timestamp (seconds) for the last update in general. + // This field is updated for any new, valid message received from the transponder. + LastContact int64 `json:"last_contact"` + + // WGS-84 longitude in decimal degrees. Can be null. + Longitude *float64 `json:"longitude"` + + // WGS-84 latitude in decimal degrees. Can be null. + Latitude *float64 `json:"latitude"` + + // Barometric altitude in meters. Can be null. + BaroAltitude *float64 `json:"baro_altitude"` + + // Boolean value which indicates if the position was retrieved from a surface position report. + OnGround bool `json:"on_ground"` + + // Velocity over ground in m/s. Can be null. + Velocity *float64 `json:"velocity"` + + // True track in decimal degrees clockwise from north (north=0°). Can be null. + TrueTrack *float64 `json:"true_track"` + + // Vertical rate in m/s. + // A positive value indicates that the airplane is climbing, a negative value indicates that it descends. + // Can be null. + VerticalRate *float64 `json:"vertical_rate"` + + // IDs of the receivers which contributed to this state vector. + // Is null if no filtering for sensor was used in the request. + Sensors []int `json:"sensors"` + + // Geometric altitude in meters. Can be null. + GeoAltitude *float64 `json:"geo_altitude"` + + // The transponder code aka Squawk. Can be null. + Squawk *string `json:"squawk"` + + // Whether flight status indicates special purpose indicator. + Spi bool `json:"spi"` + + // Origin of this state’s position. + // 0 = ADS-B + // 1 = ASTERIX + // 2 = MLAT + // 3 = FLARM + PositionSource int `json:"position_source"` + + // Aircraft category. + // 0 = No information at all + // 1 = No ADS-B Emitter Category Information + // 2 = Light (< 15500 lbs) + // 3 = Small (15500 to 75000 lbs) + // 4 = Large (75000 to 300000 lbs) + // 5 = High Vortex Large (aircraft such as B-757) + // 6 = Heavy (> 300000 lbs) + // 7 = High Performance (> 5g acceleration and 400 kts) + // 8 = Rotorcraft + // 9 = Glider / sailplane + // 10 = Lighter-than-air + // 11 = Parachutist / Skydiver + // 12 = Ultralight / hang-glider / paraglider + // 13 = Reserved + // 14 = Unmanned Aerial Vehicle + // 15 = Space / Trans-atmospheric vehicle + // 16 = Surface Vehicle – Emergency Vehicle + // 17 = Surface Vehicle – Service Vehicle + // 18 = Point Obstacle (includes tethered balloons) + // 19 = Cluster Obstacle + // 20 = Line Obstacle + Category int `json:"category"` + } + +.. _TYPE_BBOX_OPTIONS: + +type :ref:`BoundingBoxOption ` +------------------------------------------------- + +.. code-block:: go + + type BoundingBoxOptions struct { + Lamin float64 // Lower bound for the latitude in decimal degrees. + Lomin float64 // lower bound for the longitude in decimal degrees. + Lamax float64 // upper bound for the latitude in decimal degrees. + Lomax float64 // upper bound for the longitude in decimal degrees. + } diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..791810a --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,42 @@ +Go OpenSky Network API documentation +==================================== + +**gopensky** is the Go implementation of the OpenSky network's live API. +It lets you retrieve live airspace information (ADS-B and Mode S data) for research and non-commerical purposes. + + +There are some limitation sets for anonymous and OpenSky users, visit following links for more information: + + * `OpenSky Network Rest API documentation `_ + * `OpenSky Network Website `_ + +.. warning:: + + This project is under active development. + +Installation +-------------- + +Use ``go get`` to install the latest version of the library: + +.. code-block:: bash + + $ go get github.com/navidys/gopensky + +Next, include gopensky in you application: + +.. code-block:: go + + import "github.com/navidys/gopensky" + + +Further Reading +--------------- + +.. toctree:: + :maxdepth: 1 + + Introduction + Go API Functions + Go API Types + Examples diff --git a/states.go b/states.go index 2e30973..e0be714 100644 --- a/states.go +++ b/states.go @@ -55,16 +55,6 @@ func GetStates(ctx context.Context, time int64, icao24 []string, return &states, nil } -// NewBoundingBox returns new bounding box options for states information gathering. -func NewBoundingBox(lamin float64, lomin float64, lamax float64, lomax float64) *BoundingBoxOptions { - return &BoundingBoxOptions{ - Lamin: lamin, - Lomin: lomin, - Lamax: lamax, - Lomax: lomax, - } -} - func getStateRequestParams(time int64, icao24 []string, bBox *BoundingBoxOptions, extended bool) url.Values { requestParams := make(url.Values) if time >= 0 { diff --git a/types_state.go b/types_state.go index c598ce1..0b39e39 100644 --- a/types_state.go +++ b/types_state.go @@ -165,3 +165,13 @@ type BoundingBoxOptions struct { // upper bound for the longitude in decimal degrees. Lomax float64 } + +// NewBoundingBox returns new bounding box options for states information gathering. +func NewBoundingBox(lamin float64, lomin float64, lamax float64, lomax float64) *BoundingBoxOptions { + return &BoundingBoxOptions{ + Lamin: lamin, + Lomin: lomin, + Lamax: lamax, + Lomax: lomax, + } +}