mirror of
https://github.com/taigrr/yq
synced 2025-01-18 04:53:17 -08:00
Compare commits
No commits in common. "master" and "1.12" have entirely different histories.
@ -1 +0,0 @@
|
|||||||
bin/*
|
|
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
@ -1 +0,0 @@
|
|||||||
github: mikefarah
|
|
51
.github/ISSUE_TEMPLATE/bug_report_v3.md
vendored
51
.github/ISSUE_TEMPLATE/bug_report_v3.md
vendored
@ -1,51 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report - V3
|
|
||||||
about: Create a report to help us improve
|
|
||||||
title: ''
|
|
||||||
labels: bug, v3
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
Note that any how to questions should be posted in the discussion board and not raised as an issue.
|
|
||||||
|
|
||||||
Version of yq: 3.X.X
|
|
||||||
Operating system: mac/linux/windows/....
|
|
||||||
Installed via: docker/binary release/homebrew/snap/...
|
|
||||||
|
|
||||||
**Input Yaml**
|
|
||||||
Concise yaml document(s) (as simple as possible to show the bug, please keep it to 10 lines or less)
|
|
||||||
data1.yml:
|
|
||||||
```yaml
|
|
||||||
this: should really work
|
|
||||||
```
|
|
||||||
|
|
||||||
data2.yml:
|
|
||||||
```yaml
|
|
||||||
but: it strangely didn't
|
|
||||||
```
|
|
||||||
|
|
||||||
**Command**
|
|
||||||
The command you ran:
|
|
||||||
```
|
|
||||||
yq merge data1.yml data2.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
**Actual behavior**
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
cat: meow
|
|
||||||
```
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
this: should really work
|
|
||||||
but: it strangely didn't
|
|
||||||
```
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context about the problem here.
|
|
51
.github/ISSUE_TEMPLATE/bug_report_v4.md
vendored
51
.github/ISSUE_TEMPLATE/bug_report_v4.md
vendored
@ -1,51 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report - V4
|
|
||||||
about: Create a report to help us improve
|
|
||||||
title: ''
|
|
||||||
labels: bug, v4
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
Note that any how to questions should be posted in the discussion board and not raised as an issue.
|
|
||||||
|
|
||||||
Version of yq: 4.X.X
|
|
||||||
Operating system: mac/linux/windows/....
|
|
||||||
Installed via: docker/binary release/homebrew/snap/...
|
|
||||||
|
|
||||||
**Input Yaml**
|
|
||||||
Concise yaml document(s) (as simple as possible to show the bug, please keep it to 10 lines or less)
|
|
||||||
data1.yml:
|
|
||||||
```yaml
|
|
||||||
this: should really work
|
|
||||||
```
|
|
||||||
|
|
||||||
data2.yml:
|
|
||||||
```yaml
|
|
||||||
but: it strangely didn't
|
|
||||||
```
|
|
||||||
|
|
||||||
**Command**
|
|
||||||
The command you ran:
|
|
||||||
```
|
|
||||||
yq eval-all 'select(fileIndex==0) | .a.b.c' data1.yml data2.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
**Actual behavior**
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
cat: meow
|
|
||||||
```
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
this: should really work
|
|
||||||
but: it strangely didn't
|
|
||||||
```
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context about the problem here.
|
|
42
.github/ISSUE_TEMPLATE/feature_request.md
vendored
42
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -1,42 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request - V4
|
|
||||||
about: Suggest an idea for this project
|
|
||||||
title: ''
|
|
||||||
labels: enhancement, v4
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Please describe your feature request.**
|
|
||||||
A clear and concise description of what the request is and what it would solve.
|
|
||||||
Eg. I wish I could use yq to [...]
|
|
||||||
|
|
||||||
Note:
|
|
||||||
- how to questions should be posted in the discussion board and not raised as an issue.
|
|
||||||
- V3 will no longer have any enhancements.
|
|
||||||
|
|
||||||
**Describe the solution you'd like**
|
|
||||||
If we have data1.yml like:
|
|
||||||
(please keep to around 10 lines )
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
country: Australia
|
|
||||||
```
|
|
||||||
|
|
||||||
And we run a command:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yq eval 'predictWeatherOf(.country)'
|
|
||||||
```
|
|
||||||
|
|
||||||
it could output
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
temp: 32
|
|
||||||
```
|
|
||||||
|
|
||||||
**Describe alternatives you've considered**
|
|
||||||
A clear and concise description of any alternative solutions or features you've considered.
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context or screenshots about the feature request here.
|
|
31
.github/workflows/go.yml
vendored
31
.github/workflows/go.yml
vendored
@ -1,31 +0,0 @@
|
|||||||
name: Build
|
|
||||||
on: [push]
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
build:
|
|
||||||
name: Build
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
|
|
||||||
- name: Set up Go 1.15
|
|
||||||
uses: actions/setup-go@v1
|
|
||||||
with:
|
|
||||||
go-version: 1.15
|
|
||||||
id: go
|
|
||||||
|
|
||||||
- name: Check out code into the Go module directory
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Get dependencies
|
|
||||||
run: |
|
|
||||||
go get -v -t -d ./...
|
|
||||||
if [ -f Gopkg.toml ]; then
|
|
||||||
curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
|
|
||||||
dep ensure
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Download deps
|
|
||||||
run: |
|
|
||||||
export PATH=${PATH}:`go env GOPATH`/bin
|
|
||||||
scripts/devtools.sh
|
|
||||||
make local build
|
|
70
.github/workflows/release.yml
vendored
70
.github/workflows/release.yml
vendored
@ -1,70 +0,0 @@
|
|||||||
name: Release YQ
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'v*'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publishGitRelease:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
- uses: actions/setup-go@v2
|
|
||||||
with:
|
|
||||||
go-version: '^1.15'
|
|
||||||
- name: Cross compile
|
|
||||||
run: |
|
|
||||||
sudo apt-get install rhash -y
|
|
||||||
go get github.com/mitchellh/gox
|
|
||||||
./scripts/xcompile.sh
|
|
||||||
|
|
||||||
- name: Create Release
|
|
||||||
id: create_release
|
|
||||||
uses: actions/create-release@v1.0.0
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
tag_name: ${{ github.ref }}
|
|
||||||
release_name: ${{ github.ref }}
|
|
||||||
draft: true
|
|
||||||
prerelease: false
|
|
||||||
|
|
||||||
- uses: shogo82148/actions-upload-release-asset@v1
|
|
||||||
with:
|
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
|
||||||
asset_path: build/*
|
|
||||||
|
|
||||||
publishDocker:
|
|
||||||
environment: dockerhub
|
|
||||||
env:
|
|
||||||
IMAGE_NAME: mikefarah/yq
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v1
|
|
||||||
with:
|
|
||||||
platforms: all
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
id: buildx
|
|
||||||
uses: docker/setup-buildx-action@v1
|
|
||||||
with:
|
|
||||||
version: latest
|
|
||||||
|
|
||||||
- name: Available platforms
|
|
||||||
run: echo ${{ steps.buildx.outputs.platforms }} && docker version
|
|
||||||
|
|
||||||
- name: Build and push image
|
|
||||||
run: |
|
|
||||||
IMAGE_V_VERSION="$(git describe --tags --abbrev=0)"
|
|
||||||
IMAGE_VERSION=${IMAGE_V_VERSION:1}
|
|
||||||
|
|
||||||
SHORT_SHA1=$(git rev-parse --short HEAD)
|
|
||||||
PLATFORMS="linux/amd64,linux/ppc64le,linux/arm64"
|
|
||||||
echo "Building and pushing version ${IMAGE_VERSION} of image ${IMAGE_NAME}"
|
|
||||||
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
|
|
||||||
docker buildx build --platform "${PLATFORMS}" -t "${IMAGE_NAME}:${IMAGE_VERSION}" -t "${IMAGE_NAME}:latest" -t "${IMAGE_NAME}:4" \
|
|
||||||
--push .
|
|
||||||
|
|
14
.gitignore
vendored
14
.gitignore
vendored
@ -6,9 +6,7 @@
|
|||||||
# Folders
|
# Folders
|
||||||
_obj
|
_obj
|
||||||
_test
|
_test
|
||||||
bin
|
|
||||||
build
|
build
|
||||||
build-done
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
# Architecture specific extensions/prefixes
|
# Architecture specific extensions/prefixes
|
||||||
@ -23,18 +21,8 @@ _cgo_export.*
|
|||||||
|
|
||||||
_testmain.go
|
_testmain.go
|
||||||
coverage.out
|
coverage.out
|
||||||
coverage.html
|
|
||||||
*.exe
|
*.exe
|
||||||
*.test
|
*.test
|
||||||
*.prof
|
*.prof
|
||||||
yaml
|
yaml
|
||||||
vendor/
|
vendor/*/
|
||||||
tmp/
|
|
||||||
cover/
|
|
||||||
yq
|
|
||||||
|
|
||||||
# snapcraft
|
|
||||||
parts/
|
|
||||||
prime/
|
|
||||||
.snapcraft/
|
|
||||||
yq*.snap
|
|
||||||
|
4
.travis.yml
Normal file
4
.travis.yml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
language: go
|
||||||
|
go:
|
||||||
|
- 1.7.x
|
||||||
|
script: ./ci.sh
|
@ -1,76 +0,0 @@
|
|||||||
# Contributor Covenant Code of Conduct
|
|
||||||
|
|
||||||
## Our Pledge
|
|
||||||
|
|
||||||
In the interest of fostering an open and welcoming environment, we as
|
|
||||||
contributors and maintainers pledge to making participation in our project and
|
|
||||||
our community a harassment-free experience for everyone, regardless of age, body
|
|
||||||
size, disability, ethnicity, sex characteristics, gender identity and expression,
|
|
||||||
level of experience, education, socio-economic status, nationality, personal
|
|
||||||
appearance, race, religion, or sexual identity and orientation.
|
|
||||||
|
|
||||||
## Our Standards
|
|
||||||
|
|
||||||
Examples of behavior that contributes to creating a positive environment
|
|
||||||
include:
|
|
||||||
|
|
||||||
* Using welcoming and inclusive language
|
|
||||||
* Being respectful of differing viewpoints and experiences
|
|
||||||
* Gracefully accepting constructive criticism
|
|
||||||
* Focusing on what is best for the community
|
|
||||||
* Showing empathy towards other community members
|
|
||||||
|
|
||||||
Examples of unacceptable behavior by participants include:
|
|
||||||
|
|
||||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
|
||||||
advances
|
|
||||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
|
||||||
* Public or private harassment
|
|
||||||
* Publishing others' private information, such as a physical or electronic
|
|
||||||
address, without explicit permission
|
|
||||||
* Other conduct which could reasonably be considered inappropriate in a
|
|
||||||
professional setting
|
|
||||||
|
|
||||||
## Our Responsibilities
|
|
||||||
|
|
||||||
Project maintainers are responsible for clarifying the standards of acceptable
|
|
||||||
behavior and are expected to take appropriate and fair corrective action in
|
|
||||||
response to any instances of unacceptable behavior.
|
|
||||||
|
|
||||||
Project maintainers have the right and responsibility to remove, edit, or
|
|
||||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
|
||||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
|
||||||
permanently any contributor for other behaviors that they deem inappropriate,
|
|
||||||
threatening, offensive, or harmful.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
This Code of Conduct applies both within project spaces and in public spaces
|
|
||||||
when an individual is representing the project or its community. Examples of
|
|
||||||
representing a project or community include using an official project e-mail
|
|
||||||
address, posting via an official social media account, or acting as an appointed
|
|
||||||
representative at an online or offline event. Representation of a project may be
|
|
||||||
further defined and clarified by project maintainers.
|
|
||||||
|
|
||||||
## Enforcement
|
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
||||||
reported by contacting the project team at mikefarah@gmail.com. All
|
|
||||||
complaints will be reviewed and investigated and will result in a response that
|
|
||||||
is deemed necessary and appropriate to the circumstances. The project team is
|
|
||||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
|
||||||
Further details of specific enforcement policies may be posted separately.
|
|
||||||
|
|
||||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
|
||||||
faith may face temporary or permanent repercussions as determined by other
|
|
||||||
members of the project's leadership.
|
|
||||||
|
|
||||||
## Attribution
|
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
|
||||||
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
|
||||||
|
|
||||||
[homepage]: https://www.contributor-covenant.org
|
|
||||||
|
|
||||||
For answers to common questions about this code of conduct, see
|
|
||||||
https://www.contributor-covenant.org/faq
|
|
@ -1,8 +0,0 @@
|
|||||||
1. Install (golang)[https://golang.org/]
|
|
||||||
1. Run `scripts/devtools.sh` to install the required devtools
|
|
||||||
2. Run `make [local] vendor` to install the vendor dependencies
|
|
||||||
2. Run `make [local] test` to ensure you can run the existing tests
|
|
||||||
3. Write unit tests - (see existing examples). Changes will not be accepted without corresponding unit tests.
|
|
||||||
4. Make the code changes.
|
|
||||||
5. `make [local] test` to lint code and run tests
|
|
||||||
6. Profit! ok no profit, but raise a PR and get kudos :)
|
|
25
Dockerfile
25
Dockerfile
@ -1,25 +0,0 @@
|
|||||||
FROM golang:1.15 as builder
|
|
||||||
|
|
||||||
WORKDIR /go/src/mikefarah/yq
|
|
||||||
|
|
||||||
# cache devtools
|
|
||||||
COPY ./scripts/devtools.sh /go/src/mikefarah/yq/scripts/devtools.sh
|
|
||||||
RUN ./scripts/devtools.sh
|
|
||||||
|
|
||||||
COPY . /go/src/mikefarah/yq
|
|
||||||
|
|
||||||
RUN CGO_ENABLED=0 make local build
|
|
||||||
|
|
||||||
# Choose alpine as a base image to make this useful for CI, as many
|
|
||||||
# CI tools expect an interactive shell inside the container
|
|
||||||
FROM alpine:3.12.3 as production
|
|
||||||
|
|
||||||
COPY --from=builder /go/src/mikefarah/yq/yq /usr/bin/yq
|
|
||||||
RUN chmod +x /usr/bin/yq
|
|
||||||
|
|
||||||
ARG VERSION=none
|
|
||||||
LABEL version=${VERSION}
|
|
||||||
|
|
||||||
WORKDIR /workdir
|
|
||||||
|
|
||||||
ENTRYPOINT ["/usr/bin/yq"]
|
|
@ -1,10 +0,0 @@
|
|||||||
FROM golang:1.15
|
|
||||||
|
|
||||||
COPY scripts/devtools.sh /opt/devtools.sh
|
|
||||||
|
|
||||||
RUN set -e -x \
|
|
||||||
&& /opt/devtools.sh
|
|
||||||
ENV PATH=/go/bin:$PATH
|
|
||||||
|
|
||||||
ENV CGO_ENABLED 0
|
|
||||||
ENV GOPATH /go:/yq
|
|
114
Makefile
114
Makefile
@ -1,114 +0,0 @@
|
|||||||
MAKEFLAGS += --warn-undefined-variables
|
|
||||||
SHELL := /bin/bash
|
|
||||||
.SHELLFLAGS := -o pipefail -euc
|
|
||||||
.DEFAULT_GOAL := install
|
|
||||||
|
|
||||||
include Makefile.variables
|
|
||||||
|
|
||||||
.PHONY: help
|
|
||||||
help:
|
|
||||||
@echo 'Management commands for cicdtest:'
|
|
||||||
@echo
|
|
||||||
@echo 'Usage:'
|
|
||||||
@echo ' ## Develop / Test Commands'
|
|
||||||
@echo ' make build Build yq binary.'
|
|
||||||
@echo ' make install Install yq.'
|
|
||||||
@echo ' make xcompile Build cross-compiled binaries of yq.'
|
|
||||||
@echo ' make vendor Install dependencies to vendor directory.'
|
|
||||||
@echo ' make format Run code formatter.'
|
|
||||||
@echo ' make check Run static code analysis (lint).'
|
|
||||||
@echo ' make secure Run gosec.'
|
|
||||||
@echo ' make test Run tests on project.'
|
|
||||||
@echo ' make cover Run tests and capture code coverage metrics on project.'
|
|
||||||
@echo ' make clean Clean the directory tree of produced artifacts.'
|
|
||||||
@echo
|
|
||||||
@echo ' ## Utility Commands'
|
|
||||||
@echo ' make setup Configures Minishfit/Docker directory mounts.'
|
|
||||||
@echo
|
|
||||||
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
@rm -rf bin build cover *.out
|
|
||||||
|
|
||||||
## prefix before other make targets to run in your local dev environment
|
|
||||||
local: | quiet
|
|
||||||
@$(eval DOCKRUN= )
|
|
||||||
@mkdir -p tmp
|
|
||||||
@touch tmp/dev_image_id
|
|
||||||
quiet: # this is silly but shuts up 'Nothing to be done for `local`'
|
|
||||||
@:
|
|
||||||
|
|
||||||
prepare: tmp/dev_image_id
|
|
||||||
tmp/dev_image_id: Dockerfile.dev scripts/devtools.sh
|
|
||||||
@mkdir -p tmp
|
|
||||||
@docker rmi -f ${DEV_IMAGE} > /dev/null 2>&1 || true
|
|
||||||
@docker build -t ${DEV_IMAGE} -f Dockerfile.dev .
|
|
||||||
@docker inspect -f "{{ .ID }}" ${DEV_IMAGE} > tmp/dev_image_id
|
|
||||||
|
|
||||||
# ----------------------------------------------
|
|
||||||
# build
|
|
||||||
.PHONY: build
|
|
||||||
build: build/dev
|
|
||||||
|
|
||||||
.PHONY: build/dev
|
|
||||||
build/dev: test *.go
|
|
||||||
@mkdir -p bin/
|
|
||||||
${DOCKRUN} go build --ldflags "$(LDFLAGS)"
|
|
||||||
${DOCKRUN} bash ./scripts/acceptance.sh
|
|
||||||
|
|
||||||
## Compile the project for multiple OS and Architectures.
|
|
||||||
xcompile: check
|
|
||||||
@rm -rf build/
|
|
||||||
@mkdir -p build
|
|
||||||
${DOCKRUN} bash ./scripts/xcompile.sh
|
|
||||||
@find build -type d -exec chmod 755 {} \; || :
|
|
||||||
@find build -type f -exec chmod 755 {} \; || :
|
|
||||||
|
|
||||||
.PHONY: install
|
|
||||||
install: build
|
|
||||||
${DOCKRUN} go install
|
|
||||||
|
|
||||||
# Each of the fetch should be an entry within vendor.json; not currently included within project
|
|
||||||
.PHONY: vendor
|
|
||||||
vendor: tmp/dev_image_id
|
|
||||||
${DOCKRUN} go mod vendor
|
|
||||||
|
|
||||||
# ----------------------------------------------
|
|
||||||
# develop and test
|
|
||||||
|
|
||||||
.PHONY: format
|
|
||||||
format: vendor
|
|
||||||
${DOCKRUN} bash ./scripts/format.sh
|
|
||||||
|
|
||||||
.PHONY: check
|
|
||||||
check: format
|
|
||||||
${DOCKRUN} bash ./scripts/check.sh
|
|
||||||
|
|
||||||
.PHONY: secure
|
|
||||||
secure:
|
|
||||||
${DOCKRUN} bash ./scripts/secure.sh
|
|
||||||
|
|
||||||
.PHONY: test
|
|
||||||
test: check
|
|
||||||
${DOCKRUN} bash ./scripts/test.sh
|
|
||||||
|
|
||||||
.PHONY: cover
|
|
||||||
cover: check
|
|
||||||
@rm -rf cover/
|
|
||||||
@mkdir -p cover
|
|
||||||
${DOCKRUN} bash ./scripts/coverage.sh
|
|
||||||
@find cover -type d -exec chmod 755 {} \; || :
|
|
||||||
@find cover -type f -exec chmod 644 {} \; || :
|
|
||||||
|
|
||||||
|
|
||||||
.PHONY: release
|
|
||||||
release: xcompile
|
|
||||||
${DOCKRUN} bash ./scripts/publish.sh
|
|
||||||
|
|
||||||
# ----------------------------------------------
|
|
||||||
# utilities
|
|
||||||
|
|
||||||
.PHONY: setup
|
|
||||||
setup:
|
|
||||||
@bash ./scripts/setup.sh
|
|
@ -1,38 +0,0 @@
|
|||||||
export PROJECT = yq
|
|
||||||
IMPORT_PATH := github.com/mikefarah/${PROJECT}
|
|
||||||
|
|
||||||
export GIT_COMMIT = $(shell git rev-parse --short HEAD)
|
|
||||||
export GIT_DIRTY = $(shell test -n "$$(git status --porcelain)" && echo "+CHANGES" || true)
|
|
||||||
export GIT_DESCRIBE = $(shell git describe --tags --always)
|
|
||||||
LDFLAGS :=
|
|
||||||
LDFLAGS += -X main.GitCommit=${GIT_COMMIT}${GIT_DIRTY}
|
|
||||||
LDFLAGS += -X main.GitDescribe=${GIT_DESCRIBE}
|
|
||||||
|
|
||||||
GITHUB_TOKEN ?=
|
|
||||||
|
|
||||||
# Windows environment?
|
|
||||||
CYG_CHECK := $(shell hash cygpath 2>/dev/null && echo 1)
|
|
||||||
ifeq ($(CYG_CHECK),1)
|
|
||||||
VBOX_CHECK := $(shell hash VBoxManage 2>/dev/null && echo 1)
|
|
||||||
|
|
||||||
# Docker Toolbox (pre-Windows 10)
|
|
||||||
ifeq ($(VBOX_CHECK),1)
|
|
||||||
ROOT := /${PROJECT}
|
|
||||||
else
|
|
||||||
# Docker Windows
|
|
||||||
ROOT := $(shell cygpath -m -a "$(shell pwd)")
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
# all non-windows environments
|
|
||||||
ROOT := $(shell pwd)
|
|
||||||
endif
|
|
||||||
|
|
||||||
DEV_IMAGE := ${PROJECT}_dev
|
|
||||||
|
|
||||||
DOCKRUN := docker run --rm \
|
|
||||||
-e LDFLAGS="${LDFLAGS}" \
|
|
||||||
-e GITHUB_TOKEN="${GITHUB_TOKEN}" \
|
|
||||||
-v ${ROOT}/vendor:/go/src \
|
|
||||||
-v ${ROOT}:/${PROJECT}/src/${IMPORT_PATH} \
|
|
||||||
-w /${PROJECT}/src/${IMPORT_PATH} \
|
|
||||||
${DEV_IMAGE}
|
|
222
README.md
222
README.md
@ -1,211 +1,51 @@
|
|||||||
# yq
|
# yaml [](https://travis-ci.org/mikefarah/yaml)
|
||||||
|
yaml is a lightweight and portable command-line YAML processor
|
||||||
|
|
||||||
   
|
The aim of the project is to be the [jq](https://github.com/stedolan/jq) or sed of yaml files.
|
||||||
|
|
||||||
|
|
||||||
a lightweight and portable command-line YAML processor. `yq` uses [jq](https://github.com/stedolan/jq) like syntax but works with yaml files as well as json. It doesn't yet support everything `jq` does - but it does support the most common operations and functions, and more is being added continuously.
|
|
||||||
|
|
||||||
yq is written in go - so you can download a dependency free binary for your platform and you are good to go! If you prefer there are a variety of package managers that can be used as well as docker, all listed below.
|
|
||||||
|
|
||||||
## V4 released!
|
|
||||||
V4 is now officially released, it's quite different from V3 (sorry for the migration), however it is much more similar to ```jq```, using a similar expression syntax and therefore support much more complex functionality!
|
|
||||||
|
|
||||||
If you've been using v3 and want/need to upgrade, checkout the [upgrade guide](https://mikefarah.gitbook.io/yq/v/v4.x/upgrading-from-v3).
|
|
||||||
|
|
||||||
Support for v3 will cease August 2021, until then, critical bug and security fixes will still get applied if required.
|
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
[Download latest binary](https://github.com/mikefarah/yaml/releases/latest) or alternatively:
|
||||||
### [Download the latest binary](https://github.com/mikefarah/yq/releases/latest)
|
|
||||||
|
|
||||||
### wget
|
|
||||||
Use wget to download the pre-compiled binaries:
|
|
||||||
|
|
||||||
#### Compressed via tar.gz
|
|
||||||
```bash
|
|
||||||
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY}.tar.gz -O - |\
|
|
||||||
tar xz && mv ${BINARY} /usr/bin/yq
|
|
||||||
```
|
```
|
||||||
|
go get github.com/mikefarah/yaml
|
||||||
#### Plain binary
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY} -O /usr/bin/yq &&\
|
|
||||||
chmod +x /usr/bin/yq
|
|
||||||
```
|
```
|
||||||
|
|
||||||
For instance, VERSION=v4.2.0 and BINARY=yq_linux_amd64
|
|
||||||
|
|
||||||
### MacOS / Linux via Homebrew:
|
|
||||||
Using [Homebrew](https://brew.sh/)
|
|
||||||
```
|
|
||||||
brew install yq
|
|
||||||
```
|
|
||||||
|
|
||||||
or, for the (deprecated) v3 version:
|
|
||||||
|
|
||||||
```
|
|
||||||
brew install yq@3
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that for v3, as it is a versioned brew it will not add the `yq` command to your path automatically. Please follow the instructions given by brew upon installation.
|
|
||||||
|
|
||||||
### Linux via snap:
|
|
||||||
```
|
|
||||||
snap install yq
|
|
||||||
```
|
|
||||||
|
|
||||||
or, for the (deprecated) v3 version:
|
|
||||||
|
|
||||||
```
|
|
||||||
snap install yq --channel=v3/stable
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Snap notes
|
|
||||||
`yq` installs with [_strict confinement_](https://docs.snapcraft.io/snap-confinement/6233) in snap, this means it doesn't have direct access to root files. To read root files you can:
|
|
||||||
|
|
||||||
```
|
|
||||||
sudo cat /etc/myfile | yq e '.a.path' -
|
|
||||||
```
|
|
||||||
|
|
||||||
And to write to a root file you can either use [sponge](https://linux.die.net/man/1/sponge):
|
|
||||||
```
|
|
||||||
sudo cat /etc/myfile | yq e '.a.path = "value"' - | sudo sponge /etc/myfile
|
|
||||||
```
|
|
||||||
or write to a temporary file:
|
|
||||||
```
|
|
||||||
sudo cat /etc/myfile | yq e '.a.path = "value"' | sudo tee /etc/myfile.tmp
|
|
||||||
sudo mv /etc/myfile.tmp /etc/myfile
|
|
||||||
rm /etc/myfile.tmp
|
|
||||||
```
|
|
||||||
|
|
||||||
### Run with Docker
|
|
||||||
|
|
||||||
#### Oneshot use:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker run --rm -v "${PWD}":/workdir mikefarah/yq <command> [flags] [expression ]FILE...
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Run commands interactively:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq
|
|
||||||
```
|
|
||||||
|
|
||||||
It can be useful to have a bash function to avoid typing the whole docker command:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yq() {
|
|
||||||
docker run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Go Get:
|
|
||||||
```
|
|
||||||
GO111MODULE=on go get github.com/mikefarah/yq/v4
|
|
||||||
```
|
|
||||||
|
|
||||||
## Community Supported Installation methods
|
|
||||||
As these are supported by the community :heart: - however, they may be out of date with the officially supported releases.
|
|
||||||
|
|
||||||
# Webi
|
|
||||||
|
|
||||||
```
|
|
||||||
webi yq
|
|
||||||
```
|
|
||||||
|
|
||||||
See [webi](https://webinstall.dev/)
|
|
||||||
Supported by @adithyasunil26 (https://github.com/webinstall/webi-installers/tree/master/yq)
|
|
||||||
|
|
||||||
### Windows:
|
|
||||||
[](https://chocolatey.org/packages/yq)
|
|
||||||
[](https://chocolatey.org/packages/yq)
|
|
||||||
```
|
|
||||||
choco install yq
|
|
||||||
```
|
|
||||||
Supported by @chillum (https://chocolatey.org/packages/yq)
|
|
||||||
|
|
||||||
### Mac:
|
|
||||||
Using [MacPorts](https://www.macports.org/)
|
|
||||||
```
|
|
||||||
sudo port selfupdate
|
|
||||||
sudo port install yq
|
|
||||||
```
|
|
||||||
Supported by @herbygillot (https://ports.macports.org/maintainer/github/herbygillot)
|
|
||||||
|
|
||||||
### Alpine Linux
|
|
||||||
- Enable edge/community repo by adding ```$MIRROR/alpine/edge/community``` to ```/etc/apk/repositories```
|
|
||||||
- Update database index with ```apk update```
|
|
||||||
- Install yq with ```apk add yq```
|
|
||||||
|
|
||||||
Supported by Tuan Hoang
|
|
||||||
https://pkgs.alpinelinux.org/package/edge/community/x86/yq
|
|
||||||
|
|
||||||
|
|
||||||
### On Ubuntu 16.04 or higher from Debian package:
|
|
||||||
```sh
|
|
||||||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CC86BB64
|
|
||||||
sudo add-apt-repository ppa:rmescandon/yq
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install yq -y
|
|
||||||
```
|
|
||||||
Supported by @rmescandon (https://launchpad.net/~rmescandon/+archive/ubuntu/yq)
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
- [Detailed documentation with many examples](https://mikefarah.gitbook.io/yq/)
|
|
||||||
- Written in portable go, so you can download a lovely dependency free binary
|
- Written in portable go, so you can download a lovely dependency free binary
|
||||||
- Uses similar syntax as `jq` but works with YAML and JSON files
|
- Deep read a yaml file with a given path
|
||||||
- Fully supports multi document yaml files
|
- Update a yaml file given a path
|
||||||
- Colorized yaml output
|
- Update a yaml file given a script file
|
||||||
- [Deeply traverse yaml](https://mikefarah.gitbook.io/yq/operators/traverse-read)
|
- Update creates any missing entries in the path on the fly
|
||||||
- [Sort yaml by keys](https://mikefarah.gitbook.io/yq/operators/sort-keys)
|
- Create a yaml file given a deep path and value
|
||||||
- Manipulate yaml [comments](https://mikefarah.gitbook.io/yq/operators/comment-operators), [styling](https://mikefarah.gitbook.io/yq/operators/style), [tags](https://mikefarah.gitbook.io/yq/operators/tag) and [anchors and aliases](https://mikefarah.gitbook.io/yq/operators/anchor-and-alias-operators).
|
- Create a yaml file given a script file
|
||||||
- [Update yaml inplace](https://mikefarah.gitbook.io/yq/v/v4.x/commands/evaluate#flags)
|
- Convert from json to yaml
|
||||||
- [Complex expressions to select and update](https://mikefarah.gitbook.io/yq/operators/select#select-and-update-matching-values-in-map)
|
- Convert from yaml to json
|
||||||
- Keeps yaml formatting and comments when updating (though there are issues with whitespace)
|
- Pipe data in by using '-'
|
||||||
- [Convert to/from json to yaml](https://mikefarah.gitbook.io/yq/v/v4.x/usage/convert)
|
|
||||||
- [Pipe data in by using '-'](https://mikefarah.gitbook.io/yq/v/v4.x/commands/evaluate)
|
|
||||||
- [General shell completion scripts (bash/zsh/fish/powershell)](https://mikefarah.gitbook.io/yq/v/v4.x/commands/shell-completion)
|
|
||||||
- [Reduce](https://mikefarah.gitbook.io/yq/operators/reduce) to merge multiple files or sum an array or other fancy things.
|
|
||||||
|
|
||||||
## [Usage](https://mikefarah.gitbook.io/yq/)
|
## [Usage](http://mikefarah.github.io/yaml/)
|
||||||
|
|
||||||
Check out the [documentation](https://mikefarah.gitbook.io/yq/) for more detailed and advanced usage.
|
Check out the [documentation](http://mikefarah.github.io/yaml/) for more detailed and advanced usage.
|
||||||
|
|
||||||
```
|
```
|
||||||
Usage:
|
Usage:
|
||||||
yq [flags]
|
yaml [command]
|
||||||
yq [command]
|
|
||||||
|
|
||||||
Available Commands:
|
Available Commands:
|
||||||
eval Apply expression to each document in each yaml file given in sequence
|
read yaml r sample.yaml a.b.c
|
||||||
eval-all Loads _all_ yaml documents of _all_ yaml files and runs expression once
|
write yaml w [--inplace/-i] [--script/-s script_file] sample.yaml a.b.c newValueForC
|
||||||
help Help about any command
|
new yaml n [--script/-s script_file] a.b.c newValueForC
|
||||||
shell-completion Generate completion script
|
|
||||||
|
|
||||||
Flags:
|
Flags:
|
||||||
-C, --colors force print with colors
|
-h, --help[=false]: help for yaml
|
||||||
-e, --exit-status set exit status if there are no matches or null or false is returned
|
-j, --tojson[=false]: output as json
|
||||||
-h, --help help for yq
|
-t, --trim[=true]: trim yaml output
|
||||||
-I, --indent int sets indent level for output (default 2)
|
-v, --verbose[=false]: verbose mode
|
||||||
-i, --inplace update the yaml file inplace of first yaml file given.
|
|
||||||
-M, --no-colors force print with no colors
|
|
||||||
-N, --no-doc Don't print document separators (---)
|
|
||||||
-n, --null-input Don't read input, simply evaluate the expression given. Useful for creating yaml docs from scratch.
|
|
||||||
-P, --prettyPrint pretty print, shorthand for '... style = ""'
|
|
||||||
-j, --tojson output as json. Set indent to 0 to print json in one line.
|
|
||||||
-v, --verbose verbose mode
|
|
||||||
-V, --version Print version information and quit
|
|
||||||
|
|
||||||
Use "yq [command] --help" for more information about a command.
|
Use "yaml [command] --help" for more information about a command.
|
||||||
```
|
```
|
||||||
|
|
||||||
Simple Example:
|
## Contribute
|
||||||
|
1. run `govendor sync` [link](https://github.com/kardianos/govendor)
|
||||||
```bash
|
2. add unit tests
|
||||||
yq e '.a.b | length' f1.yml f2.yml
|
3. make changes
|
||||||
```
|
4. run ./precheckin.sh
|
||||||
|
5. profit
|
||||||
## Known Issues / Missing Features
|
|
||||||
- `yq` attempts to preserve comment positions and whitespace as much as possible, but it does not handle all scenarios (see https://github.com/go-yaml/yaml/tree/v3 for details)
|
|
||||||
|
13
action.yml
13
action.yml
@ -1,13 +0,0 @@
|
|||||||
name: 'yq - portable yaml processor'
|
|
||||||
description: 'create, read, update, delete, merge, validate and do more with yaml'
|
|
||||||
icon: command
|
|
||||||
color: gray-dark
|
|
||||||
inputs:
|
|
||||||
cmd:
|
|
||||||
description: 'The Command which should be run'
|
|
||||||
required: true
|
|
||||||
runs:
|
|
||||||
using: 'docker'
|
|
||||||
image: 'github-action/Dockerfile'
|
|
||||||
args:
|
|
||||||
- ${{ inputs.cmd }}
|
|
15
ci.sh
Executable file
15
ci.sh
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
go test
|
||||||
|
go build
|
||||||
|
|
||||||
|
# acceptance test
|
||||||
|
X=$(./yaml w sample.yaml b.c 3 | ./yaml r - b.c)
|
||||||
|
|
||||||
|
if [ $X != 3 ]
|
||||||
|
then
|
||||||
|
echo "Failed acceptance test: expected 2 but was $X"
|
||||||
|
exit 1
|
||||||
|
fi
|
@ -1,83 +0,0 @@
|
|||||||
package cmd
|
|
||||||
|
|
||||||
// import (
|
|
||||||
// "strings"
|
|
||||||
// "testing"
|
|
||||||
|
|
||||||
// "github.com/mikefarah/yq/v3/test"
|
|
||||||
// "github.com/spf13/cobra"
|
|
||||||
// )
|
|
||||||
|
|
||||||
// func getRootCommand() *cobra.Command {
|
|
||||||
// return New()
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func TestRootCmd(t *testing.T) {
|
|
||||||
// cmd := getRootCommand()
|
|
||||||
// result := test.RunCmd(cmd, "")
|
|
||||||
// if result.Error != nil {
|
|
||||||
// t.Error(result.Error)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if !strings.Contains(result.Output, "Usage:") {
|
|
||||||
// t.Error("Expected usage message to be printed out, but the usage message was not found.")
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func TestRootCmd_Help(t *testing.T) {
|
|
||||||
// cmd := getRootCommand()
|
|
||||||
// result := test.RunCmd(cmd, "--help")
|
|
||||||
// if result.Error != nil {
|
|
||||||
// t.Error(result.Error)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if !strings.Contains(result.Output, "yq is a lightweight and portable command-line YAML processor. It aims to be the jq or sed of yaml files.") {
|
|
||||||
// t.Error("Expected usage message to be printed out, but the usage message was not found.")
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func TestRootCmd_VerboseLong(t *testing.T) {
|
|
||||||
// cmd := getRootCommand()
|
|
||||||
// result := test.RunCmd(cmd, "--verbose")
|
|
||||||
// if result.Error != nil {
|
|
||||||
// t.Error(result.Error)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if !verbose {
|
|
||||||
// t.Error("Expected verbose to be true")
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func TestRootCmd_VerboseShort(t *testing.T) {
|
|
||||||
// cmd := getRootCommand()
|
|
||||||
// result := test.RunCmd(cmd, "-v")
|
|
||||||
// if result.Error != nil {
|
|
||||||
// t.Error(result.Error)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if !verbose {
|
|
||||||
// t.Error("Expected verbose to be true")
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func TestRootCmd_VersionShort(t *testing.T) {
|
|
||||||
// cmd := getRootCommand()
|
|
||||||
// result := test.RunCmd(cmd, "-V")
|
|
||||||
// if result.Error != nil {
|
|
||||||
// t.Error(result.Error)
|
|
||||||
// }
|
|
||||||
// if !strings.Contains(result.Output, "yq version") {
|
|
||||||
// t.Error("expected version message to be printed out, but the message was not found.")
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func TestRootCmd_VersionLong(t *testing.T) {
|
|
||||||
// cmd := getRootCommand()
|
|
||||||
// result := test.RunCmd(cmd, "--version")
|
|
||||||
// if result.Error != nil {
|
|
||||||
// t.Error(result.Error)
|
|
||||||
// }
|
|
||||||
// if !strings.Contains(result.Output, "yq version") {
|
|
||||||
// t.Error("expected version message to be printed out, but the message was not found.")
|
|
||||||
// }
|
|
||||||
// }
|
|
@ -1,19 +0,0 @@
|
|||||||
package cmd
|
|
||||||
|
|
||||||
var unwrapScalar = true
|
|
||||||
|
|
||||||
var writeInplace = false
|
|
||||||
var outputToJSON = false
|
|
||||||
|
|
||||||
var exitStatus = false
|
|
||||||
var forceColor = false
|
|
||||||
var forceNoColor = false
|
|
||||||
var colorsEnabled = false
|
|
||||||
var indent = 2
|
|
||||||
var noDocSeparators = false
|
|
||||||
var nullInput = false
|
|
||||||
var verbose = false
|
|
||||||
var version = false
|
|
||||||
var prettyPrint = false
|
|
||||||
|
|
||||||
var completedSuccessfully = false
|
|
@ -1,104 +0,0 @@
|
|||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/mikefarah/yq/v4/pkg/yqlib"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
func createEvaluateAllCommand() *cobra.Command {
|
|
||||||
var cmdEvalAll = &cobra.Command{
|
|
||||||
Use: "eval-all [expression] [yaml_file1]...",
|
|
||||||
Aliases: []string{"ea"},
|
|
||||||
Short: "Loads _all_ yaml documents of _all_ yaml files and runs expression once",
|
|
||||||
Example: `
|
|
||||||
# merges f2.yml into f1.yml (inplace)
|
|
||||||
yq eval-all --inplace 'select(fileIndex == 0) * select(fileIndex == 1)' f1.yml f2.yml
|
|
||||||
|
|
||||||
# use '-' as a filename to read from STDIN
|
|
||||||
cat file2.yml | yq ea '.a.b' file1.yml - file3.yml
|
|
||||||
`,
|
|
||||||
Long: "Evaluate All:\nUseful when you need to run an expression across several yaml documents or files. Consumes more memory than eval",
|
|
||||||
RunE: evaluateAll,
|
|
||||||
}
|
|
||||||
return cmdEvalAll
|
|
||||||
}
|
|
||||||
func evaluateAll(cmd *cobra.Command, args []string) error {
|
|
||||||
cmd.SilenceUsage = true
|
|
||||||
// 0 args, read std in
|
|
||||||
// 1 arg, null input, process expression
|
|
||||||
// 1 arg, read file in sequence
|
|
||||||
// 2+ args, [0] = expression, file the rest
|
|
||||||
|
|
||||||
var err error
|
|
||||||
stat, _ := os.Stdin.Stat()
|
|
||||||
pipingStdIn := (stat.Mode() & os.ModeCharDevice) == 0
|
|
||||||
|
|
||||||
out := cmd.OutOrStdout()
|
|
||||||
|
|
||||||
fileInfo, _ := os.Stdout.Stat()
|
|
||||||
|
|
||||||
if forceColor || (!forceNoColor && (fileInfo.Mode()&os.ModeCharDevice) != 0) {
|
|
||||||
colorsEnabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
firstFileIndex := -1
|
|
||||||
if !nullInput && len(args) == 1 {
|
|
||||||
firstFileIndex = 0
|
|
||||||
} else if len(args) > 1 {
|
|
||||||
firstFileIndex = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if writeInplace && (firstFileIndex == -1) {
|
|
||||||
return fmt.Errorf("Write inplace flag only applicable when giving an expression and at least one file")
|
|
||||||
}
|
|
||||||
|
|
||||||
if writeInplace {
|
|
||||||
// only use colors if its forced
|
|
||||||
colorsEnabled = forceColor
|
|
||||||
writeInPlaceHandler := yqlib.NewWriteInPlaceHandler(args[firstFileIndex])
|
|
||||||
out, err = writeInPlaceHandler.CreateTempFile()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// need to indirectly call the function so that completedSuccessfully is
|
|
||||||
// passed when we finish execution as opposed to now
|
|
||||||
defer func() { writeInPlaceHandler.FinishWriteInPlace(completedSuccessfully) }()
|
|
||||||
}
|
|
||||||
|
|
||||||
if nullInput && len(args) > 1 {
|
|
||||||
return errors.New("Cannot pass files in when using null-input flag")
|
|
||||||
}
|
|
||||||
|
|
||||||
printer := yqlib.NewPrinter(out, outputToJSON, unwrapScalar, colorsEnabled, indent, !noDocSeparators)
|
|
||||||
|
|
||||||
allAtOnceEvaluator := yqlib.NewAllAtOnceEvaluator()
|
|
||||||
switch len(args) {
|
|
||||||
case 0:
|
|
||||||
if pipingStdIn {
|
|
||||||
err = allAtOnceEvaluator.EvaluateFiles(processExpression(""), []string{"-"}, printer)
|
|
||||||
} else {
|
|
||||||
cmd.Println(cmd.UsageString())
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
if nullInput {
|
|
||||||
err = yqlib.NewStreamEvaluator().EvaluateNew(processExpression(args[0]), printer)
|
|
||||||
} else {
|
|
||||||
err = allAtOnceEvaluator.EvaluateFiles(processExpression(""), []string{args[0]}, printer)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
err = allAtOnceEvaluator.EvaluateFiles(processExpression(args[0]), args[1:], printer)
|
|
||||||
}
|
|
||||||
|
|
||||||
completedSuccessfully = err == nil
|
|
||||||
|
|
||||||
if err == nil && exitStatus && !printer.PrintedAnything() {
|
|
||||||
return errors.New("no matches found")
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
@ -1,124 +0,0 @@
|
|||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/mikefarah/yq/v4/pkg/yqlib"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
func createEvaluateSequenceCommand() *cobra.Command {
|
|
||||||
var cmdEvalSequence = &cobra.Command{
|
|
||||||
Use: "eval [expression] [yaml_file1]...",
|
|
||||||
Aliases: []string{"e"},
|
|
||||||
Short: "Apply expression to each document in each yaml file given in sequence",
|
|
||||||
Example: `
|
|
||||||
# runs the expression against each file, in series
|
|
||||||
yq e '.a.b | length' f1.yml f2.yml
|
|
||||||
|
|
||||||
# prints out the file
|
|
||||||
yq e sample.yaml
|
|
||||||
|
|
||||||
# use '-' as a filename to read from STDIN
|
|
||||||
cat file2.yml | yq e '.a.b' file1.yml - file3.yml
|
|
||||||
|
|
||||||
# prints a new yaml document
|
|
||||||
yq e -n '.a.b.c = "cat"'
|
|
||||||
|
|
||||||
|
|
||||||
# updates file.yaml directly
|
|
||||||
yq e '.a.b = "cool"' -i file.yaml
|
|
||||||
`,
|
|
||||||
Long: "Evaluate Sequence:\nIterate over each yaml document, apply the expression and print the results, in sequence.",
|
|
||||||
RunE: evaluateSequence,
|
|
||||||
}
|
|
||||||
return cmdEvalSequence
|
|
||||||
}
|
|
||||||
|
|
||||||
func processExpression(expression string) string {
|
|
||||||
if prettyPrint && expression == "" {
|
|
||||||
return `... style=""`
|
|
||||||
} else if prettyPrint {
|
|
||||||
return fmt.Sprintf("%v | ... style= \"\"", expression)
|
|
||||||
}
|
|
||||||
return expression
|
|
||||||
}
|
|
||||||
|
|
||||||
func evaluateSequence(cmd *cobra.Command, args []string) error {
|
|
||||||
cmd.SilenceUsage = true
|
|
||||||
// 0 args, read std in
|
|
||||||
// 1 arg, null input, process expression
|
|
||||||
// 1 arg, read file in sequence
|
|
||||||
// 2+ args, [0] = expression, file the rest
|
|
||||||
|
|
||||||
var err error
|
|
||||||
stat, _ := os.Stdin.Stat()
|
|
||||||
pipingStdIn := (stat.Mode() & os.ModeCharDevice) == 0
|
|
||||||
|
|
||||||
out := cmd.OutOrStdout()
|
|
||||||
|
|
||||||
fileInfo, _ := os.Stdout.Stat()
|
|
||||||
|
|
||||||
if forceColor || (!forceNoColor && (fileInfo.Mode()&os.ModeCharDevice) != 0) {
|
|
||||||
colorsEnabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
firstFileIndex := -1
|
|
||||||
if !nullInput && len(args) == 1 {
|
|
||||||
firstFileIndex = 0
|
|
||||||
} else if len(args) > 1 {
|
|
||||||
firstFileIndex = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if writeInplace && (firstFileIndex == -1) {
|
|
||||||
return fmt.Errorf("Write inplace flag only applicable when giving an expression and at least one file")
|
|
||||||
}
|
|
||||||
|
|
||||||
if writeInplace {
|
|
||||||
// only use colors if its forced
|
|
||||||
colorsEnabled = forceColor
|
|
||||||
writeInPlaceHandler := yqlib.NewWriteInPlaceHandler(args[firstFileIndex])
|
|
||||||
out, err = writeInPlaceHandler.CreateTempFile()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// need to indirectly call the function so that completedSuccessfully is
|
|
||||||
// passed when we finish execution as opposed to now
|
|
||||||
defer func() { writeInPlaceHandler.FinishWriteInPlace(completedSuccessfully) }()
|
|
||||||
}
|
|
||||||
|
|
||||||
printer := yqlib.NewPrinter(out, outputToJSON, unwrapScalar, colorsEnabled, indent, !noDocSeparators)
|
|
||||||
|
|
||||||
streamEvaluator := yqlib.NewStreamEvaluator()
|
|
||||||
|
|
||||||
if nullInput && len(args) > 1 {
|
|
||||||
return errors.New("Cannot pass files in when using null-input flag")
|
|
||||||
}
|
|
||||||
|
|
||||||
switch len(args) {
|
|
||||||
case 0:
|
|
||||||
if pipingStdIn {
|
|
||||||
err = streamEvaluator.EvaluateFiles(processExpression(""), []string{"-"}, printer)
|
|
||||||
} else {
|
|
||||||
cmd.Println(cmd.UsageString())
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
if nullInput {
|
|
||||||
err = streamEvaluator.EvaluateNew(processExpression(args[0]), printer)
|
|
||||||
} else {
|
|
||||||
err = streamEvaluator.EvaluateFiles(processExpression(""), []string{args[0]}, printer)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
err = streamEvaluator.EvaluateFiles(processExpression(args[0]), args[1:], printer)
|
|
||||||
}
|
|
||||||
completedSuccessfully = err == nil
|
|
||||||
|
|
||||||
if err == nil && exitStatus && !printer.PrintedAnything() {
|
|
||||||
return errors.New("no matches found")
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
62
cmd/root.go
62
cmd/root.go
@ -1,62 +0,0 @@
|
|||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
logging "gopkg.in/op/go-logging.v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
func New() *cobra.Command {
|
|
||||||
var rootCmd = &cobra.Command{
|
|
||||||
Use: "yq",
|
|
||||||
Short: "yq is a lightweight and portable command-line YAML processor.",
|
|
||||||
Long: `yq is a lightweight and portable command-line YAML processor. It aims to be the jq or sed of yaml files.`,
|
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
|
||||||
if version {
|
|
||||||
cmd.Print(GetVersionDisplay())
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
cmd.Println(cmd.UsageString())
|
|
||||||
return nil
|
|
||||||
|
|
||||||
},
|
|
||||||
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
|
||||||
cmd.SetOut(cmd.OutOrStdout())
|
|
||||||
var format = logging.MustStringFormatter(
|
|
||||||
`%{color}%{time:15:04:05} %{shortfunc} [%{level:.4s}]%{color:reset} %{message}`,
|
|
||||||
)
|
|
||||||
var backend = logging.AddModuleLevel(
|
|
||||||
logging.NewBackendFormatter(logging.NewLogBackend(os.Stderr, "", 0), format))
|
|
||||||
|
|
||||||
if verbose {
|
|
||||||
backend.SetLevel(logging.DEBUG, "")
|
|
||||||
} else {
|
|
||||||
backend.SetLevel(logging.ERROR, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
logging.SetBackend(backend)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose mode")
|
|
||||||
rootCmd.PersistentFlags().BoolVarP(&outputToJSON, "tojson", "j", false, "output as json. Set indent to 0 to print json in one line.")
|
|
||||||
rootCmd.PersistentFlags().BoolVarP(&nullInput, "null-input", "n", false, "Don't read input, simply evaluate the expression given. Useful for creating yaml docs from scratch.")
|
|
||||||
rootCmd.PersistentFlags().BoolVarP(&noDocSeparators, "no-doc", "N", false, "Don't print document separators (---)")
|
|
||||||
|
|
||||||
rootCmd.PersistentFlags().IntVarP(&indent, "indent", "I", 2, "sets indent level for output")
|
|
||||||
rootCmd.Flags().BoolVarP(&version, "version", "V", false, "Print version information and quit")
|
|
||||||
rootCmd.PersistentFlags().BoolVarP(&writeInplace, "inplace", "i", false, "update the yaml file inplace of first yaml file given.")
|
|
||||||
rootCmd.PersistentFlags().BoolVarP(&unwrapScalar, "unwrapScalar", "", true, "unwrap scalar, print the value with no quotes, colors or comments")
|
|
||||||
rootCmd.PersistentFlags().BoolVarP(&prettyPrint, "prettyPrint", "P", false, "pretty print, shorthand for '... style = \"\"'")
|
|
||||||
rootCmd.PersistentFlags().BoolVarP(&exitStatus, "exit-status", "e", false, "set exit status if there are no matches or null or false is returned")
|
|
||||||
|
|
||||||
rootCmd.PersistentFlags().BoolVarP(&forceColor, "colors", "C", false, "force print with colors")
|
|
||||||
rootCmd.PersistentFlags().BoolVarP(&forceNoColor, "no-colors", "M", false, "force print with no colors")
|
|
||||||
rootCmd.AddCommand(
|
|
||||||
createEvaluateSequenceCommand(),
|
|
||||||
createEvaluateAllCommand(),
|
|
||||||
completionCmd,
|
|
||||||
)
|
|
||||||
return rootCmd
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var completionCmd = &cobra.Command{
|
|
||||||
Use: "shell-completion [bash|zsh|fish|powershell]",
|
|
||||||
Short: "Generate completion script",
|
|
||||||
Long: `To load completions:
|
|
||||||
|
|
||||||
Bash:
|
|
||||||
|
|
||||||
$ source <(yq shell-completion bash)
|
|
||||||
|
|
||||||
# To load completions for each session, execute once:
|
|
||||||
Linux:
|
|
||||||
$ yq shell-completion bash > /etc/bash_completion.d/yq
|
|
||||||
MacOS:
|
|
||||||
$ yq shell-completion bash > /usr/local/etc/bash_completion.d/yq
|
|
||||||
|
|
||||||
Zsh:
|
|
||||||
|
|
||||||
# If shell completion is not already enabled in your environment you will need
|
|
||||||
# to enable it. You can execute the following once:
|
|
||||||
|
|
||||||
$ echo "autoload -U compinit; compinit" >> ~/.zshrc
|
|
||||||
|
|
||||||
# To load completions for each session, execute once:
|
|
||||||
$ yq shell-completion zsh > "${fpath[1]}/_yq"
|
|
||||||
|
|
||||||
# You will need to start a new shell for this setup to take effect.
|
|
||||||
|
|
||||||
Fish:
|
|
||||||
|
|
||||||
$ yq shell-completion fish | source
|
|
||||||
|
|
||||||
# To load completions for each session, execute once:
|
|
||||||
$ yq shell-completion fish > ~/.config/fish/completions/yq.fish
|
|
||||||
`,
|
|
||||||
DisableFlagsInUseLine: true,
|
|
||||||
ValidArgs: []string{"bash", "zsh", "fish", "powershell"},
|
|
||||||
Args: cobra.ExactValidArgs(1),
|
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
|
||||||
var err error = nil
|
|
||||||
switch args[0] {
|
|
||||||
case "bash":
|
|
||||||
err = cmd.Root().GenBashCompletion(os.Stdout)
|
|
||||||
case "zsh":
|
|
||||||
err = cmd.Root().GenZshCompletion(os.Stdout)
|
|
||||||
case "fish":
|
|
||||||
err = cmd.Root().GenFishCompletion(os.Stdout, true)
|
|
||||||
case "powershell":
|
|
||||||
err = cmd.Root().GenPowerShellCompletion(os.Stdout)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// The git commit that was compiled. This will be filled in by the compiler.
|
|
||||||
var (
|
|
||||||
GitCommit string
|
|
||||||
GitDescribe string
|
|
||||||
|
|
||||||
// Version is main version number that is being run at the moment.
|
|
||||||
Version = "4.9.3"
|
|
||||||
|
|
||||||
// VersionPrerelease is a pre-release marker for the version. If this is "" (empty string)
|
|
||||||
// then it means that it is a final release. Otherwise, this is a pre-release
|
|
||||||
// such as "dev" (in development), "beta", "rc1", etc.
|
|
||||||
VersionPrerelease = ""
|
|
||||||
)
|
|
||||||
|
|
||||||
// ProductName is the name of the product
|
|
||||||
const ProductName = "yq"
|
|
||||||
|
|
||||||
// GetVersionDisplay composes the parts of the version in a way that's suitable
|
|
||||||
// for displaying to humans.
|
|
||||||
func GetVersionDisplay() string {
|
|
||||||
return fmt.Sprintf("%s version %s\n", ProductName, getHumanVersion())
|
|
||||||
}
|
|
||||||
|
|
||||||
func getHumanVersion() string {
|
|
||||||
version := Version
|
|
||||||
if GitDescribe != "" {
|
|
||||||
version = GitDescribe
|
|
||||||
}
|
|
||||||
|
|
||||||
release := VersionPrerelease
|
|
||||||
if release != "" {
|
|
||||||
if !strings.Contains(version, release) {
|
|
||||||
version += fmt.Sprintf("-%s", release)
|
|
||||||
}
|
|
||||||
if GitCommit != "" {
|
|
||||||
version += fmt.Sprintf(" (%s)", GitCommit)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Strip off any single quotes added by the git information.
|
|
||||||
return strings.Replace(version, "'", "", -1)
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
package cmd
|
|
||||||
|
|
||||||
import "testing"
|
|
||||||
|
|
||||||
func TestGetVersionDisplay(t *testing.T) {
|
|
||||||
var expectedVersion = ProductName + " version " + Version
|
|
||||||
if VersionPrerelease != "" {
|
|
||||||
expectedVersion = expectedVersion + "-" + VersionPrerelease
|
|
||||||
}
|
|
||||||
expectedVersion = expectedVersion + "\n"
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "Display Version",
|
|
||||||
want: expectedVersion,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
if got := GetVersionDisplay(); got != tt.want {
|
|
||||||
t.Errorf("%q. GetVersionDisplay() = %v, want %v", tt.name, got, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Test_getHumanVersion(t *testing.T) {
|
|
||||||
GitDescribe = "e42813d"
|
|
||||||
GitCommit = "e42813d+CHANGES"
|
|
||||||
var wanted string
|
|
||||||
if VersionPrerelease == "" {
|
|
||||||
wanted = GitDescribe
|
|
||||||
} else {
|
|
||||||
wanted = "e42813d-" + VersionPrerelease + " (e42813d+CHANGES)"
|
|
||||||
}
|
|
||||||
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
want string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "Git Variables defined",
|
|
||||||
want: wanted,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for _, tt := range tests {
|
|
||||||
if got := getHumanVersion(); got != tt.want {
|
|
||||||
t.Errorf("%q. getHumanVersion() = %v, want %v", tt.name, got, tt.want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
3
coverage.sh
Executable file
3
coverage.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
go test -coverprofile=coverage.out && go tool cover -html=coverage.out
|
166
data_navigator.go
Normal file
166
data_navigator.go
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
func entryInSlice(context yaml.MapSlice, key interface{}) *yaml.MapItem {
|
||||||
|
for idx := range context {
|
||||||
|
var entry = &context[idx]
|
||||||
|
if entry.Key == key {
|
||||||
|
return entry
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func writeMap(context interface{}, paths []string, value interface{}) yaml.MapSlice {
|
||||||
|
log.Debugf("writeMap for %v for %v with value %v\n", paths, context, value)
|
||||||
|
|
||||||
|
var mapSlice yaml.MapSlice
|
||||||
|
switch context.(type) {
|
||||||
|
case yaml.MapSlice:
|
||||||
|
mapSlice = context.(yaml.MapSlice)
|
||||||
|
default:
|
||||||
|
mapSlice = make(yaml.MapSlice, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(paths) == 0 {
|
||||||
|
return mapSlice
|
||||||
|
}
|
||||||
|
|
||||||
|
child := entryInSlice(mapSlice, paths[0])
|
||||||
|
if child == nil {
|
||||||
|
newChild := yaml.MapItem{Key: paths[0]}
|
||||||
|
mapSlice = append(mapSlice, newChild)
|
||||||
|
child = entryInSlice(mapSlice, paths[0])
|
||||||
|
log.Debugf("\tAppended child at %v for mapSlice %v\n", paths[0], mapSlice)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("\tchild.Value %v\n", child.Value)
|
||||||
|
|
||||||
|
remainingPaths := paths[1:len(paths)]
|
||||||
|
child.Value = updatedChildValue(child.Value, remainingPaths, value)
|
||||||
|
log.Debugf("\tReturning mapSlice %v\n", mapSlice)
|
||||||
|
return mapSlice
|
||||||
|
}
|
||||||
|
|
||||||
|
func updatedChildValue(child interface{}, remainingPaths []string, value interface{}) interface{} {
|
||||||
|
if len(remainingPaths) == 0 {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
_, nextIndexErr := strconv.ParseInt(remainingPaths[0], 10, 64)
|
||||||
|
if nextIndexErr != nil {
|
||||||
|
// must be a map
|
||||||
|
return writeMap(child, remainingPaths, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// must be an array
|
||||||
|
return writeArray(child, remainingPaths, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func writeArray(context interface{}, paths []string, value interface{}) []interface{} {
|
||||||
|
log.Debugf("writeArray for %v for %v with value %v\n", paths, context, value)
|
||||||
|
var array []interface{}
|
||||||
|
switch context.(type) {
|
||||||
|
case []interface{}:
|
||||||
|
array = context.([]interface{})
|
||||||
|
default:
|
||||||
|
array = make([]interface{}, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(paths) == 0 {
|
||||||
|
return array
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("\tarray %v\n", array)
|
||||||
|
|
||||||
|
rawIndex := paths[0]
|
||||||
|
index, err := strconv.ParseInt(rawIndex, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
die("Error accessing array: %v", err)
|
||||||
|
}
|
||||||
|
for index >= int64(len(array)) {
|
||||||
|
array = append(array, nil)
|
||||||
|
}
|
||||||
|
currentChild := array[index]
|
||||||
|
|
||||||
|
log.Debugf("\tcurrentChild %v\n", currentChild)
|
||||||
|
|
||||||
|
remainingPaths := paths[1:len(paths)]
|
||||||
|
array[index] = updatedChildValue(currentChild, remainingPaths, value)
|
||||||
|
log.Debugf("\tReturning array %v\n", array)
|
||||||
|
return array
|
||||||
|
}
|
||||||
|
|
||||||
|
func readMap(context yaml.MapSlice, head string, tail []string) interface{} {
|
||||||
|
if head == "*" {
|
||||||
|
return readMapSplat(context, tail)
|
||||||
|
}
|
||||||
|
var value interface{}
|
||||||
|
|
||||||
|
entry := entryInSlice(context, head)
|
||||||
|
if entry != nil {
|
||||||
|
value = entry.Value
|
||||||
|
}
|
||||||
|
return calculateValue(value, tail)
|
||||||
|
}
|
||||||
|
|
||||||
|
func readMapSplat(context yaml.MapSlice, tail []string) interface{} {
|
||||||
|
var newArray = make([]interface{}, len(context))
|
||||||
|
var i = 0
|
||||||
|
for _, entry := range context {
|
||||||
|
if len(tail) > 0 {
|
||||||
|
newArray[i] = recurse(entry.Value, tail[0], tail[1:len(tail)])
|
||||||
|
} else {
|
||||||
|
newArray[i] = entry.Value
|
||||||
|
}
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
return newArray
|
||||||
|
}
|
||||||
|
|
||||||
|
func recurse(value interface{}, head string, tail []string) interface{} {
|
||||||
|
switch value.(type) {
|
||||||
|
case []interface{}:
|
||||||
|
if head == "*" {
|
||||||
|
return readArraySplat(value.([]interface{}), tail)
|
||||||
|
}
|
||||||
|
index, err := strconv.ParseInt(head, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
die("Error accessing array: %v", err)
|
||||||
|
}
|
||||||
|
return readArray(value.([]interface{}), index, tail)
|
||||||
|
case yaml.MapSlice:
|
||||||
|
return readMap(value.(yaml.MapSlice), head, tail)
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func readArray(array []interface{}, head int64, tail []string) interface{} {
|
||||||
|
if head >= int64(len(array)) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
value := array[head]
|
||||||
|
|
||||||
|
return calculateValue(value, tail)
|
||||||
|
}
|
||||||
|
|
||||||
|
func readArraySplat(array []interface{}, tail []string) interface{} {
|
||||||
|
var newArray = make([]interface{}, len(array))
|
||||||
|
for index, value := range array {
|
||||||
|
newArray[index] = calculateValue(value, tail)
|
||||||
|
}
|
||||||
|
return newArray
|
||||||
|
}
|
||||||
|
|
||||||
|
func calculateValue(value interface{}, tail []string) interface{} {
|
||||||
|
if len(tail) > 0 {
|
||||||
|
return recurse(value, tail[0], tail[1:len(tail)])
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
248
data_navigator_test.go
Normal file
248
data_navigator_test.go
Normal file
@ -0,0 +1,248 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/op/go-logging"
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
|
"os"
|
||||||
|
"sort"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMain(m *testing.M) {
|
||||||
|
backend.SetLevel(logging.ERROR, "")
|
||||||
|
logging.SetBackend(backend)
|
||||||
|
os.Exit(m.Run())
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadMap_simple(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
---
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
`)
|
||||||
|
assertResult(t, 2, readMap(data, "b", []string{"c"}))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadMap_splat(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
---
|
||||||
|
mapSplat:
|
||||||
|
item1: things
|
||||||
|
item2: whatever
|
||||||
|
`)
|
||||||
|
var result = readMap(data, "mapSplat", []string{"*"}).([]interface{})
|
||||||
|
var actual = []string{result[0].(string), result[1].(string)}
|
||||||
|
sort.Strings(actual)
|
||||||
|
assertResult(t, "[things whatever]", fmt.Sprintf("%v", actual))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadMap_deep_splat(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
---
|
||||||
|
mapSplatDeep:
|
||||||
|
item1:
|
||||||
|
cats: bananas
|
||||||
|
item2:
|
||||||
|
cats: apples
|
||||||
|
`)
|
||||||
|
|
||||||
|
var result = readMap(data, "mapSplatDeep", []string{"*", "cats"}).([]interface{})
|
||||||
|
var actual = []string{result[0].(string), result[1].(string)}
|
||||||
|
sort.Strings(actual)
|
||||||
|
assertResult(t, "[apples bananas]", fmt.Sprintf("%v", actual))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadMap_key_doesnt_exist(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
---
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
`)
|
||||||
|
assertResult(t, nil, readMap(data, "b.x.f", []string{"c"}))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadMap_recurse_against_string(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
---
|
||||||
|
a: cat
|
||||||
|
`)
|
||||||
|
assertResult(t, nil, readMap(data, "a", []string{"b"}))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadMap_with_array(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
---
|
||||||
|
b:
|
||||||
|
d:
|
||||||
|
- 3
|
||||||
|
- 4
|
||||||
|
`)
|
||||||
|
assertResult(t, 4, readMap(data, "b", []string{"d", "1"}))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadMap_with_array_out_of_bounds(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
---
|
||||||
|
b:
|
||||||
|
d:
|
||||||
|
- 3
|
||||||
|
- 4
|
||||||
|
`)
|
||||||
|
assertResult(t, nil, readMap(data, "b", []string{"d", "3"}))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadMap_with_array_out_of_bounds_by_1(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
---
|
||||||
|
b:
|
||||||
|
d:
|
||||||
|
- 3
|
||||||
|
- 4
|
||||||
|
`)
|
||||||
|
assertResult(t, nil, readMap(data, "b", []string{"d", "2"}))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadMap_with_array_splat(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
e:
|
||||||
|
-
|
||||||
|
name: Fred
|
||||||
|
thing: cat
|
||||||
|
-
|
||||||
|
name: Sam
|
||||||
|
thing: dog
|
||||||
|
`)
|
||||||
|
assertResult(t, "[Fred Sam]", fmt.Sprintf("%v", readMap(data, "e", []string{"*", "name"})))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWrite_really_simple(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
b: 2
|
||||||
|
`)
|
||||||
|
|
||||||
|
updated := writeMap(data, []string{"b"}, "4")
|
||||||
|
b := entryInSlice(updated, "b").Value
|
||||||
|
assertResult(t, "4", b)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWrite_simple(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
`)
|
||||||
|
|
||||||
|
updated := writeMap(data, []string{"b", "c"}, "4")
|
||||||
|
b := entryInSlice(updated, "b").Value.(yaml.MapSlice)
|
||||||
|
c := entryInSlice(b, "c").Value
|
||||||
|
assertResult(t, "4", c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWrite_new(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
`)
|
||||||
|
|
||||||
|
updated := writeMap(data, []string{"b", "d"}, "4")
|
||||||
|
b := entryInSlice(updated, "b").Value.(yaml.MapSlice)
|
||||||
|
d := entryInSlice(b, "d").Value
|
||||||
|
assertResult(t, "4", d)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWrite_new_deep(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
`)
|
||||||
|
|
||||||
|
updated := writeMap(data, []string{"b", "d", "f"}, "4")
|
||||||
|
assertResult(t, "4", readMap(updated, "b", []string{"d", "f"}))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWrite_array(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
b:
|
||||||
|
- aa
|
||||||
|
`)
|
||||||
|
|
||||||
|
updated := writeMap(data, []string{"b", "0"}, "bb")
|
||||||
|
|
||||||
|
b := entryInSlice(updated, "b").Value.([]interface{})
|
||||||
|
assertResult(t, "bb", b[0].(string))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWrite_new_array(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
`)
|
||||||
|
|
||||||
|
updated := writeMap(data, []string{"b", "0"}, "4")
|
||||||
|
assertResult(t, "4", readMap(updated, "b", []string{"0"}))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWrite_new_array_deep(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
`)
|
||||||
|
|
||||||
|
var expected = `b:
|
||||||
|
- c: "4"`
|
||||||
|
|
||||||
|
updated := writeMap(data, []string{"b", "0", "c"}, "4")
|
||||||
|
assertResult(t, expected, yamlToString(updated))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWrite_new_map_array_deep(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
`)
|
||||||
|
|
||||||
|
updated := writeMap(data, []string{"b", "d", "0"}, "4")
|
||||||
|
assertResult(t, "4", readMap(updated, "b", []string{"d", "0"}))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWrite_add_to_array(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
b:
|
||||||
|
- aa
|
||||||
|
`)
|
||||||
|
|
||||||
|
var expected = `b:
|
||||||
|
- aa
|
||||||
|
- bb`
|
||||||
|
|
||||||
|
updated := writeMap(data, []string{"b", "1"}, "bb")
|
||||||
|
|
||||||
|
assertResult(t, expected, yamlToString(updated))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWrite_with_no_tail(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
`)
|
||||||
|
updated := writeMap(data, []string{"b"}, "4")
|
||||||
|
|
||||||
|
b := entryInSlice(updated, "b").Value
|
||||||
|
assertResult(t, "4", fmt.Sprintf("%v", b))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWriteMap_no_paths(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
b: 5
|
||||||
|
`)
|
||||||
|
|
||||||
|
result := writeMap(data, []string{}, 4)
|
||||||
|
assertResult(t, fmt.Sprintf("%v", data), fmt.Sprintf("%v", result))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWriteArray_no_paths(t *testing.T) {
|
||||||
|
var data = make([]interface{}, 1)
|
||||||
|
data[0] = "mike"
|
||||||
|
result := writeArray(data, []string{}, 4)
|
||||||
|
assertResult(t, fmt.Sprintf("%v", data), fmt.Sprintf("%v", result))
|
||||||
|
}
|
76
debian/changelog
vendored
76
debian/changelog
vendored
@ -1,76 +0,0 @@
|
|||||||
yq (3.3.2) focal; urgency=medium
|
|
||||||
|
|
||||||
* Bug fix: existStatus bug (#459)
|
|
||||||
* Automatically makes a os temp directory if it does not exist (#461)
|
|
||||||
|
|
||||||
-- Roberto Mier Escandon <rmescandon@gmail.com> Fri, 07 Aug 2020 18:53:01 +0200
|
|
||||||
|
|
||||||
yq (3.3-0) focal; urgency=medium
|
|
||||||
|
|
||||||
* You can control string styles (quotes) using the new --style flag
|
|
||||||
* String values now always have quotes when outputting to json
|
|
||||||
* Negative array indices now traverse the array backwards
|
|
||||||
* Added a --stripComments flag to print yaml without any comments
|
|
||||||
* Bumped go to version 1.14
|
|
||||||
|
|
||||||
-- Roberto Mier Escandon <rmescandon@gmail.com> Thu, 30 Apr 2020 20:45:44 +0200
|
|
||||||
|
|
||||||
yq (3.1-2) eoan; urgency=medium
|
|
||||||
|
|
||||||
* Bug fix: yq 3 was removing empty inline-style objects and arrays (#355)
|
|
||||||
* Bug fix: Merge option returned different output when switching order of
|
|
||||||
merging files(#347)
|
|
||||||
* Bug fix: Add new object to existing array object was failing in 3.1.1 (#361)
|
|
||||||
* Bug fix: yq 3 empty keys did not allow merging of values (#356)
|
|
||||||
* Bug fix: keys quoted during merge (#363)
|
|
||||||
* Bug fix: Correct length with wc -l (#362)
|
|
||||||
* Bug fix: Write to empty document removed path (#359)
|
|
||||||
|
|
||||||
-- Roberto Mier Escandon <rmescandon@gmail.com> Mon, 24 Feb 2020 20:31:58 +0100
|
|
||||||
|
|
||||||
yq (3.1-1) eoan; urgency=medium
|
|
||||||
|
|
||||||
* Keeps yaml comments and formatting, can specify yaml tags when updating.
|
|
||||||
* Handles anchors
|
|
||||||
* Can print out matching paths and values when splatting
|
|
||||||
* JSON output works for all commands
|
|
||||||
* Yaml files with multiple documents are printed out as one JSON
|
|
||||||
document per line.
|
|
||||||
* Deep splat (**) to match arbitrary paths
|
|
||||||
* Update scripts file format has changed to be more powerful
|
|
||||||
* Reading and splatting, matching results are printed once per line
|
|
||||||
* Bugfixing
|
|
||||||
|
|
||||||
-- Roberto Mier Escandon <rmescandon@gmail.com> Tue, 11 Feb 2020 22:18:24 +0100
|
|
||||||
|
|
||||||
yq (2.2-1) bionic; urgency=medium
|
|
||||||
|
|
||||||
* Added Windows support for the "--inplace" command flag
|
|
||||||
* Prefix now supports arrays
|
|
||||||
* Add prefix command
|
|
||||||
* Bump Alpine version to 3.8
|
|
||||||
* Improved docker build process
|
|
||||||
* Lint fixes
|
|
||||||
* Build support for all linux architectures supported by gox
|
|
||||||
|
|
||||||
-- Roberto Mier Escandon <rmescandon@gmail.com> Sat, 19 Jan 2019 15:50:47 +0100
|
|
||||||
|
|
||||||
yq (2.1-0) bionic; urgency=medium
|
|
||||||
|
|
||||||
* Ability to read multiple documents in a single file
|
|
||||||
* Ability to append list items instead of overwriting
|
|
||||||
|
|
||||||
-- Roberto Mier EscandĂłn <rmescandon@gmail.com> Tue, 10 Jul 2018 14:02:42 +0200
|
|
||||||
|
|
||||||
yq (2.0-0) bionic; urgency=medium
|
|
||||||
|
|
||||||
* Release 2.0.0
|
|
||||||
|
|
||||||
-- Roberto Mier EscandĂłn <rmescandon@gmail.com> Wed, 20 Jun 2018 10:29:53 +0200
|
|
||||||
|
|
||||||
yq (1.15-0) bionic; urgency=medium
|
|
||||||
|
|
||||||
* Release 1.15
|
|
||||||
|
|
||||||
-- Roberto Mier EscandĂłn <rmescandon@gmail.com> Wed, 06 Jun 2018 11:32:03 +0200
|
|
||||||
|
|
1
debian/compat
vendored
1
debian/compat
vendored
@ -1 +0,0 @@
|
|||||||
10
|
|
22
debian/control
vendored
22
debian/control
vendored
@ -1,22 +0,0 @@
|
|||||||
Source: yq
|
|
||||||
Section: devel
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: Roberto Mier EscandĂłn <rmescandon@gmail.com>
|
|
||||||
Build-Depends: debhelper (>=10),
|
|
||||||
dh-golang (>=1.34),
|
|
||||||
golang-1.13,
|
|
||||||
rsync
|
|
||||||
Standards-Version: 4.1.4
|
|
||||||
Homepage: https://github.com/mikefarah/yq.git
|
|
||||||
Vcs-Browser: https://github.com/mikefarah/yq.git
|
|
||||||
Vcs-Git: https://github.com/mikefarah/yq.git
|
|
||||||
XS-Go-Import-Path: github.com/mikefarah/yq
|
|
||||||
XSBC-Original-Maintainer: Roberto Mier EscandĂłn <rmescandon@gmail.com>
|
|
||||||
|
|
||||||
Package: yq
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
|
||||||
Description: lightweight and portable command-line YAML processor
|
|
||||||
.
|
|
||||||
The aim of the project is to be the
|
|
||||||
[jq](https://github.com/stedolan/jq) or sed of yaml files.
|
|
24
debian/copyright
vendored
24
debian/copyright
vendored
@ -1,24 +0,0 @@
|
|||||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
|
||||||
Upstream-Name: yq
|
|
||||||
Source: https://github.com/mikefarah/yq.git
|
|
||||||
|
|
||||||
Files: *
|
|
||||||
Copyright: 2017 Mike Farah
|
|
||||||
License: Expat
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
.
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
.
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
2
debian/gbp.conf
vendored
2
debian/gbp.conf
vendored
@ -1,2 +0,0 @@
|
|||||||
[DEFAULT]
|
|
||||||
pristine-tar = True
|
|
57
debian/rules
vendored
57
debian/rules
vendored
@ -1,57 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
#
|
|
||||||
# Copyright (C) 2018 Roberto Mier EscandĂłn <rmescandon@gmail.com>
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License version 3 as
|
|
||||||
# published by the Free Software Foundation.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
PROJECT := yq
|
|
||||||
OWNER := mikefarah
|
|
||||||
REPO := github.com
|
|
||||||
GOVERSION := 1.13
|
|
||||||
|
|
||||||
export DH_OPTIONS
|
|
||||||
export DH_GOPKG := ${REPO}/${OWNER}/${PROJECT}
|
|
||||||
export GOROOT := /usr/lib/go-${GOVERSION}
|
|
||||||
export GOPATH := ${CURDIR}/_build
|
|
||||||
export GOBIN := ${GOPATH}/bin
|
|
||||||
export PATH := ${GOROOT}/bin:${GOBIN}:${PATH}
|
|
||||||
export GOCACHE := /tmp/gocache
|
|
||||||
export GOFLAGS := -mod=vendor
|
|
||||||
|
|
||||||
SRCDIR := ${GOPATH}/src/${DH_GOPKG}
|
|
||||||
DESTDIR := ${CURDIR}/debian/${PROJECT}
|
|
||||||
BINDIR := /usr/bin
|
|
||||||
ASSETSDIR := /usr/share/${PROJECT}
|
|
||||||
|
|
||||||
%:
|
|
||||||
dh $@ --builddirectory=${GOPATH} --buildsystem=golang
|
|
||||||
|
|
||||||
override_dh_auto_build:
|
|
||||||
mkdir -p ${SRCDIR}
|
|
||||||
mkdir -p ${GOBIN}
|
|
||||||
# copy project to local srcdir to build from there
|
|
||||||
rsync -avz --progress --exclude=_build --exclude=debian --exclude=tmp. --exclude=go.mod --exclude=docs . $(SRCDIR)
|
|
||||||
# build go code
|
|
||||||
(cd ${SRCDIR} && go install -buildmode=pie ./...)
|
|
||||||
|
|
||||||
override_dh_auto_test:
|
|
||||||
(cd ${SRCDIR} && go test -v ./...)
|
|
||||||
|
|
||||||
override_dh_auto_install:
|
|
||||||
cp ${GOBIN}/yq ${DESTDIR}/${BINDIR}
|
|
||||||
cp -f ${SRCDIR}/LICENSE ${DESTDIR}/${ASSETSDIR}
|
|
||||||
chmod a+x ${DESTDIR}/${BINDIR}/yq
|
|
||||||
|
|
||||||
override_dh_auto_clean:
|
|
||||||
dh_clean
|
|
||||||
rm -rf ${CURDIR}/_build
|
|
1
debian/source/format
vendored
1
debian/source/format
vendored
@ -1 +0,0 @@
|
|||||||
3.0 (native)
|
|
3
debian/yq.dirs
vendored
3
debian/yq.dirs
vendored
@ -1,3 +0,0 @@
|
|||||||
usr/bin
|
|
||||||
usr/share/yq
|
|
||||||
usr/share/man/man1
|
|
297
docs/404.html
Normal file
297
docs/404.html
Normal file
@ -0,0 +1,297 @@
|
|||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="no-js">
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="shortcut icon" href="/assets/images/favicon.png">
|
||||||
|
|
||||||
|
<meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.5.4">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<title>Yaml</title>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="/assets/javascripts/modernizr-56ade86843.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="/assets/stylesheets/application-b1a1975878.css">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
|
||||||
|
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<svg class="md-svg">
|
||||||
|
<defs>
|
||||||
|
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
|
||||||
|
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
|
||||||
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
|
||||||
|
<label class="md-overlay" data-md-component="overlay" for="drawer"></label>
|
||||||
|
|
||||||
|
<header class="md-header" data-md-component="header">
|
||||||
|
<nav class="md-header-nav md-grid">
|
||||||
|
<div class="md-flex">
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
|
||||||
|
<a href="/" title="Yaml" class="md-icon md-icon--home md-header-nav__button">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch">
|
||||||
|
<span class="md-flex__ellipsis md-header-nav__title">
|
||||||
|
|
||||||
|
|
||||||
|
Yaml
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
|
||||||
|
<label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
|
||||||
|
|
||||||
|
<div class="md-search" data-md-component="search">
|
||||||
|
<div class="md-search__overlay"></div>
|
||||||
|
<div class="md-search__inner">
|
||||||
|
<form class="md-search__form" name="search">
|
||||||
|
<input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
|
||||||
|
<label class="md-icon md-search__icon" for="search"></label>
|
||||||
|
<button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
|
||||||
|
</form>
|
||||||
|
<div class="md-search__output">
|
||||||
|
<div class="md-search__scrollwrap" data-md-scrollfix>
|
||||||
|
<div class="md-search-result" data-md-component="result">
|
||||||
|
<div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
|
||||||
|
Type to start searching
|
||||||
|
</div>
|
||||||
|
<ol class="md-search-result__list"></ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<div class="md-header-nav__source">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah/yaml" title="Go to repository" class="md-source" data-md-source="github">
|
||||||
|
|
||||||
|
<div class="md-source__icon">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<use xlink:href="#github" width="24" height="24"></use>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-source__repository">
|
||||||
|
mikefarah/yaml
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="md-container">
|
||||||
|
|
||||||
|
|
||||||
|
<main class="md-main">
|
||||||
|
<div class="md-main__inner md-grid" data-md-component="container">
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
<nav class="md-nav md-nav--primary" data-md-level="0">
|
||||||
|
<label class="md-nav__title md-nav__title--site" for="drawer">
|
||||||
|
|
||||||
|
<i class="md-icon md-icon--home md-nav__button"></i>
|
||||||
|
|
||||||
|
Yaml
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="md-nav__source">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah/yaml" title="Go to repository" class="md-source" data-md-source="github">
|
||||||
|
|
||||||
|
<div class="md-source__icon">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<use xlink:href="#github" width="24" height="24"></use>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-source__repository">
|
||||||
|
mikefarah/yaml
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/" title="Install" class="md-nav__link">
|
||||||
|
Install
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/read/" title="Read" class="md-nav__link">
|
||||||
|
Read
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/write/" title="Write/Update" class="md-nav__link">
|
||||||
|
Write/Update
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/create/" title="Create" class="md-nav__link">
|
||||||
|
Create
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/convert/" title="Convert" class="md-nav__link">
|
||||||
|
Convert
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-content">
|
||||||
|
<article class="md-content__inner md-typeset">
|
||||||
|
|
||||||
|
<h1>404 - Not found</h1>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
|
||||||
|
<footer class="md-footer">
|
||||||
|
|
||||||
|
<div class="md-footer-meta md-typeset">
|
||||||
|
<div class="md-footer-meta__inner md-grid">
|
||||||
|
<div class="md-footer-copyright">
|
||||||
|
|
||||||
|
powered by
|
||||||
|
<a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
|
||||||
|
and
|
||||||
|
<a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
|
||||||
|
Material for MkDocs</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-footer-social">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah" class="md-footer-social__link fa fa-github"></a>
|
||||||
|
|
||||||
|
<a href="https://www.linkedin.com/in/mike-farah-b5a75b2/" class="md-footer-social__link fa fa-linkedin"></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="/assets/javascripts/application-0b7df094bf.js"></script>
|
||||||
|
<script>app.initialize({url:{base:""}})</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
BIN
docs/assets/images/favicon.ico
Normal file
BIN
docs/assets/images/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
1
docs/assets/images/icons/bitbucket-670608a71a.svg
Normal file
1
docs/assets/images/icons/bitbucket-670608a71a.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="352" height="448" viewBox="0 0 352 448" id="bitbucket"><path fill="currentColor" d="M203.75 214.75q2 15.75-12.625 25.25t-27.875 1.5q-9.75-4.25-13.375-14.5t-.125-20.5 13-14.5q9-4.5 18.125-3t16 8.875 6.875 16.875zm27.75-5.25q-3.5-26.75-28.25-41T154 165.25q-15.75 7-25.125 22.125t-8.625 32.375q1 22.75 19.375 38.75t41.375 14q22.75-2 38-21t12.5-42zM291.25 74q-5-6.75-14-11.125t-14.5-5.5T245 54.25q-72.75-11.75-141.5.5-10.75 1.75-16.5 3t-13.75 5.5T60.75 74q7.5 7 19 11.375t18.375 5.5T120 93.75Q177 101 232 94q15.75-2 22.375-3t18.125-5.375T291.25 74zm14.25 258.75q-2 6.5-3.875 19.125t-3.5 21-7.125 17.5-14.5 14.125q-21.5 12-47.375 17.875t-50.5 5.5-50.375-4.625q-11.5-2-20.375-4.5T88.75 412 70.5 401.125t-13-15.375q-6.25-24-14.25-73l1.5-4 4.5-2.25q55.75 37 126.625 37t126.875-37q5.25 1.5 6 5.75t-1.25 11.25-2 9.25zM350.75 92.5q-6.5 41.75-27.75 163.75-1.25 7.5-6.75 14t-10.875 10T291.75 288q-63 31.5-152.5 22-62-6.75-98.5-34.75-3.75-3-6.375-6.625t-4.25-8.75-2.25-8.5-1.5-9.875T25 232.75q-2.25-12.5-6.625-37.5t-7-40.375T5.5 118 0 78.5Q.75 72 4.375 66.375T12.25 57t11.25-7.5T35 43.875t12-4.625q31.25-11.5 78.25-16 94.75-9.25 169 12.5Q333 47.25 348 66.25q4 5 4.125 12.75t-1.375 13.5z"/></svg>
|
After Width: | Height: | Size: 1.2 KiB |
1
docs/assets/images/icons/github-1da075986e.svg
Normal file
1
docs/assets/images/icons/github-1da075986e.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
|
After Width: | Height: | Size: 991 B |
1
docs/assets/images/icons/gitlab-5ad3f9f9e5.svg
Normal file
1
docs/assets/images/icons/gitlab-5ad3f9f9e5.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewBox="0 0 500 500" id="gitlab"><path fill="currentColor" d="M93.667 473.347l90.684-279.097H2.983l90.684 279.097z" transform="translate(156.198 1.16)"/><path fill="currentColor" d="M221.333 473.345L130.649 194.25H3.557l217.776 279.095z" transform="translate(28.531 1.16)" opacity=".7"/><path fill="currentColor" d="M32 195.155L4.441 279.97a18.773 18.773 0 0 0 6.821 20.99l238.514 173.29L32 195.155z" transform="translate(.089 .256)" opacity=".5"/><path fill="currentColor" d="M2.667-84.844h127.092L75.14-252.942c-2.811-8.649-15.047-8.649-17.856 0L2.667-84.844z" transform="translate(29.422 280.256)"/><path fill="currentColor" d="M2.667 473.345L93.351 194.25h127.092L2.667 473.345z" transform="translate(247.198 1.16)" opacity=".7"/><path fill="currentColor" d="M221.334 195.155l27.559 84.815a18.772 18.772 0 0 1-6.821 20.99L3.557 474.25l217.777-279.095z" transform="translate(246.307 .256)" opacity=".5"/><path fill="currentColor" d="M130.667-84.844H3.575l54.618-168.098c2.811-8.649 15.047-8.649 17.856 0l54.618 168.098z" transform="translate(336.974 280.256)"/></svg>
|
After Width: | Height: | Size: 1.1 KiB |
3
docs/assets/javascripts/application-0b7df094bf.js
Normal file
3
docs/assets/javascripts/application-0b7df094bf.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/assets/javascripts/modernizr-56ade86843.js
Normal file
1
docs/assets/javascripts/modernizr-56ade86843.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/assets/stylesheets/application-b1a1975878.css
Normal file
1
docs/assets/stylesheets/application-b1a1975878.css
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
432
docs/convert/index.html
Normal file
432
docs/convert/index.html
Normal file
@ -0,0 +1,432 @@
|
|||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="no-js">
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="shortcut icon" href="../assets/images/favicon.png">
|
||||||
|
|
||||||
|
<meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.5.4">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<title>Convert - Yaml</title>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="../assets/javascripts/modernizr-56ade86843.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="../assets/stylesheets/application-b1a1975878.css">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
|
||||||
|
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<svg class="md-svg">
|
||||||
|
<defs>
|
||||||
|
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
|
||||||
|
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
|
||||||
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
|
||||||
|
<label class="md-overlay" data-md-component="overlay" for="drawer"></label>
|
||||||
|
|
||||||
|
<header class="md-header" data-md-component="header">
|
||||||
|
<nav class="md-header-nav md-grid">
|
||||||
|
<div class="md-flex">
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
|
||||||
|
<a href=".." title="Yaml" class="md-icon md-icon--home md-header-nav__button">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch">
|
||||||
|
<span class="md-flex__ellipsis md-header-nav__title">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Convert
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
|
||||||
|
<label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
|
||||||
|
|
||||||
|
<div class="md-search" data-md-component="search">
|
||||||
|
<div class="md-search__overlay"></div>
|
||||||
|
<div class="md-search__inner">
|
||||||
|
<form class="md-search__form" name="search">
|
||||||
|
<input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
|
||||||
|
<label class="md-icon md-search__icon" for="search"></label>
|
||||||
|
<button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
|
||||||
|
</form>
|
||||||
|
<div class="md-search__output">
|
||||||
|
<div class="md-search__scrollwrap" data-md-scrollfix>
|
||||||
|
<div class="md-search-result" data-md-component="result">
|
||||||
|
<div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
|
||||||
|
Type to start searching
|
||||||
|
</div>
|
||||||
|
<ol class="md-search-result__list"></ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<div class="md-header-nav__source">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah/yaml" title="Go to repository" class="md-source" data-md-source="github">
|
||||||
|
|
||||||
|
<div class="md-source__icon">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<use xlink:href="#github" width="24" height="24"></use>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-source__repository">
|
||||||
|
mikefarah/yaml
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="md-container">
|
||||||
|
|
||||||
|
|
||||||
|
<main class="md-main">
|
||||||
|
<div class="md-main__inner md-grid" data-md-component="container">
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
<nav class="md-nav md-nav--primary" data-md-level="0">
|
||||||
|
<label class="md-nav__title md-nav__title--site" for="drawer">
|
||||||
|
|
||||||
|
<i class="md-icon md-icon--home md-nav__button"></i>
|
||||||
|
|
||||||
|
Yaml
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="md-nav__source">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah/yaml" title="Go to repository" class="md-source" data-md-source="github">
|
||||||
|
|
||||||
|
<div class="md-source__icon">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<use xlink:href="#github" width="24" height="24"></use>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-source__repository">
|
||||||
|
mikefarah/yaml
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href=".." title="Install" class="md-nav__link">
|
||||||
|
Install
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../read/" title="Read" class="md-nav__link">
|
||||||
|
Read
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../write/" title="Write/Update" class="md-nav__link">
|
||||||
|
Write/Update
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../create/" title="Create" class="md-nav__link">
|
||||||
|
Create
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--active">
|
||||||
|
|
||||||
|
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link md-nav__link--active" for="toc">
|
||||||
|
Convert
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<a href="./" title="Convert" class="md-nav__link md-nav__link--active">
|
||||||
|
Convert
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--secondary">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__title" for="toc">Table of contents</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#yaml-to-json" title="Yaml to Json" class="md-nav__link">
|
||||||
|
Yaml to Json
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#json-to-yaml" title="Json to Yaml" class="md-nav__link">
|
||||||
|
Json to Yaml
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--secondary">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__title" for="toc">Table of contents</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#yaml-to-json" title="Yaml to Json" class="md-nav__link">
|
||||||
|
Yaml to Json
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#json-to-yaml" title="Json to Yaml" class="md-nav__link">
|
||||||
|
Json to Yaml
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-content">
|
||||||
|
<article class="md-content__inner md-typeset">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h1>Convert</h1>
|
||||||
|
|
||||||
|
<h3 id="yaml-to-json">Yaml to Json<a class="headerlink" href="#yaml-to-json" title="Permanent link">¶</a></h3>
|
||||||
|
<p>To convert output to json, use the --tojson (or -j) flag. This can be used with any command.</p>
|
||||||
|
<p>Given a sample.yaml file of:</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
c: 2
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>then</p>
|
||||||
|
<pre><code class="bash">yaml r -j sample.yaml b.c
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output</p>
|
||||||
|
<pre><code class="json">{"b":{"c":2}}
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<h3 id="json-to-yaml">Json to Yaml<a class="headerlink" href="#json-to-yaml" title="Permanent link">¶</a></h3>
|
||||||
|
<p>To read in json, just pass in a json file instead of yaml, it will just work :)</p>
|
||||||
|
<p>e.g given a json file</p>
|
||||||
|
<pre><code class="json">{"a":"Easy! as one two three","b":{"c":2,"d":[3,4]}}
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>then</p>
|
||||||
|
<pre><code class="bash">yaml r sample.json
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output</p>
|
||||||
|
<pre><code class="yaml">a: Easy! as one two three
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
d:
|
||||||
|
- 3
|
||||||
|
- 4
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
|
||||||
|
<footer class="md-footer">
|
||||||
|
|
||||||
|
<div class="md-footer-nav">
|
||||||
|
<nav class="md-footer-nav__inner md-grid">
|
||||||
|
|
||||||
|
<a href="../create/" title="Create" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
|
||||||
|
<span class="md-flex__ellipsis">
|
||||||
|
<span class="md-footer-nav__direction">
|
||||||
|
Previous
|
||||||
|
</span>
|
||||||
|
Create
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-footer-meta md-typeset">
|
||||||
|
<div class="md-footer-meta__inner md-grid">
|
||||||
|
<div class="md-footer-copyright">
|
||||||
|
|
||||||
|
powered by
|
||||||
|
<a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
|
||||||
|
and
|
||||||
|
<a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
|
||||||
|
Material for MkDocs</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-footer-social">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah" class="md-footer-social__link fa fa-github"></a>
|
||||||
|
|
||||||
|
<a href="https://www.linkedin.com/in/mike-farah-b5a75b2/" class="md-footer-social__link fa fa-linkedin"></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../assets/javascripts/application-0b7df094bf.js"></script>
|
||||||
|
<script>app.initialize({url:{base:".."}})</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
447
docs/create/index.html
Normal file
447
docs/create/index.html
Normal file
@ -0,0 +1,447 @@
|
|||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="no-js">
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="shortcut icon" href="../assets/images/favicon.png">
|
||||||
|
|
||||||
|
<meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.5.4">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<title>Create - Yaml</title>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="../assets/javascripts/modernizr-56ade86843.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="../assets/stylesheets/application-b1a1975878.css">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
|
||||||
|
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<svg class="md-svg">
|
||||||
|
<defs>
|
||||||
|
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
|
||||||
|
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
|
||||||
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
|
||||||
|
<label class="md-overlay" data-md-component="overlay" for="drawer"></label>
|
||||||
|
|
||||||
|
<header class="md-header" data-md-component="header">
|
||||||
|
<nav class="md-header-nav md-grid">
|
||||||
|
<div class="md-flex">
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
|
||||||
|
<a href=".." title="Yaml" class="md-icon md-icon--home md-header-nav__button">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch">
|
||||||
|
<span class="md-flex__ellipsis md-header-nav__title">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Create
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
|
||||||
|
<label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
|
||||||
|
|
||||||
|
<div class="md-search" data-md-component="search">
|
||||||
|
<div class="md-search__overlay"></div>
|
||||||
|
<div class="md-search__inner">
|
||||||
|
<form class="md-search__form" name="search">
|
||||||
|
<input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
|
||||||
|
<label class="md-icon md-search__icon" for="search"></label>
|
||||||
|
<button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
|
||||||
|
</form>
|
||||||
|
<div class="md-search__output">
|
||||||
|
<div class="md-search__scrollwrap" data-md-scrollfix>
|
||||||
|
<div class="md-search-result" data-md-component="result">
|
||||||
|
<div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
|
||||||
|
Type to start searching
|
||||||
|
</div>
|
||||||
|
<ol class="md-search-result__list"></ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<div class="md-header-nav__source">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah/yaml" title="Go to repository" class="md-source" data-md-source="github">
|
||||||
|
|
||||||
|
<div class="md-source__icon">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<use xlink:href="#github" width="24" height="24"></use>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-source__repository">
|
||||||
|
mikefarah/yaml
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="md-container">
|
||||||
|
|
||||||
|
|
||||||
|
<main class="md-main">
|
||||||
|
<div class="md-main__inner md-grid" data-md-component="container">
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
<nav class="md-nav md-nav--primary" data-md-level="0">
|
||||||
|
<label class="md-nav__title md-nav__title--site" for="drawer">
|
||||||
|
|
||||||
|
<i class="md-icon md-icon--home md-nav__button"></i>
|
||||||
|
|
||||||
|
Yaml
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="md-nav__source">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah/yaml" title="Go to repository" class="md-source" data-md-source="github">
|
||||||
|
|
||||||
|
<div class="md-source__icon">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<use xlink:href="#github" width="24" height="24"></use>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-source__repository">
|
||||||
|
mikefarah/yaml
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href=".." title="Install" class="md-nav__link">
|
||||||
|
Install
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../read/" title="Read" class="md-nav__link">
|
||||||
|
Read
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../write/" title="Write/Update" class="md-nav__link">
|
||||||
|
Write/Update
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--active">
|
||||||
|
|
||||||
|
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link md-nav__link--active" for="toc">
|
||||||
|
Create
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<a href="./" title="Create" class="md-nav__link md-nav__link--active">
|
||||||
|
Create
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--secondary">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__title" for="toc">Table of contents</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#creating-a-simple-yaml-file" title="Creating a simple yaml file" class="md-nav__link">
|
||||||
|
Creating a simple yaml file
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#creating-using-a-create-script" title="Creating using a create script" class="md-nav__link">
|
||||||
|
Creating using a create script
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../convert/" title="Convert" class="md-nav__link">
|
||||||
|
Convert
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--secondary">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__title" for="toc">Table of contents</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#creating-a-simple-yaml-file" title="Creating a simple yaml file" class="md-nav__link">
|
||||||
|
Creating a simple yaml file
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#creating-using-a-create-script" title="Creating using a create script" class="md-nav__link">
|
||||||
|
Creating using a create script
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-content">
|
||||||
|
<article class="md-content__inner md-typeset">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h1>Create</h1>
|
||||||
|
|
||||||
|
<p>Yaml files can be created using the 'new' command. This works in the same way as the write command, but you don't pass in an existing Yaml file.</p>
|
||||||
|
<pre><code>yaml n <path> <new value>
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<h3 id="creating-a-simple-yaml-file">Creating a simple yaml file<a class="headerlink" href="#creating-a-simple-yaml-file" title="Permanent link">¶</a></h3>
|
||||||
|
<pre><code class="bash">yaml n b.c cat
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output:</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
c: cat
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<h3 id="creating-using-a-create-script">Creating using a create script<a class="headerlink" href="#creating-using-a-create-script" title="Permanent link">¶</a></h3>
|
||||||
|
<p>Create scripts follow the same format as the update scripts.</p>
|
||||||
|
<p>Given a script create_instructions.yaml of:</p>
|
||||||
|
<pre><code class="yaml">b.c: 3
|
||||||
|
b.e[0].name: Howdy Partner
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>then</p>
|
||||||
|
<pre><code class="bash">yaml n -s create_instructions.yaml
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output:</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
c: 3
|
||||||
|
e:
|
||||||
|
- name: Howdy Partner
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>You can also pipe the instructions in:</p>
|
||||||
|
<pre><code class="bash">cat create_instructions.yaml | yaml n -s -
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
|
||||||
|
<footer class="md-footer">
|
||||||
|
|
||||||
|
<div class="md-footer-nav">
|
||||||
|
<nav class="md-footer-nav__inner md-grid">
|
||||||
|
|
||||||
|
<a href="../write/" title="Write/Update" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
|
||||||
|
<span class="md-flex__ellipsis">
|
||||||
|
<span class="md-footer-nav__direction">
|
||||||
|
Previous
|
||||||
|
</span>
|
||||||
|
Write/Update
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
<a href="../convert/" title="Convert" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
|
||||||
|
<span class="md-flex__ellipsis">
|
||||||
|
<span class="md-footer-nav__direction">
|
||||||
|
Next
|
||||||
|
</span>
|
||||||
|
Convert
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-footer-meta md-typeset">
|
||||||
|
<div class="md-footer-meta__inner md-grid">
|
||||||
|
<div class="md-footer-copyright">
|
||||||
|
|
||||||
|
powered by
|
||||||
|
<a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
|
||||||
|
and
|
||||||
|
<a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
|
||||||
|
Material for MkDocs</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-footer-social">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah" class="md-footer-social__link fa fa-github"></a>
|
||||||
|
|
||||||
|
<a href="https://www.linkedin.com/in/mike-farah-b5a75b2/" class="md-footer-social__link fa fa-linkedin"></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../assets/javascripts/application-0b7df094bf.js"></script>
|
||||||
|
<script>app.initialize({url:{base:".."}})</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
413
docs/index.html
Normal file
413
docs/index.html
Normal file
@ -0,0 +1,413 @@
|
|||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="no-js">
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="shortcut icon" href="./assets/images/favicon.png">
|
||||||
|
|
||||||
|
<meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.5.4">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<title>Yaml</title>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="./assets/javascripts/modernizr-56ade86843.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="./assets/stylesheets/application-b1a1975878.css">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
|
||||||
|
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<svg class="md-svg">
|
||||||
|
<defs>
|
||||||
|
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
|
||||||
|
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
|
||||||
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
|
||||||
|
<label class="md-overlay" data-md-component="overlay" for="drawer"></label>
|
||||||
|
|
||||||
|
<header class="md-header" data-md-component="header">
|
||||||
|
<nav class="md-header-nav md-grid">
|
||||||
|
<div class="md-flex">
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
|
||||||
|
<a href="." title="Yaml" class="md-icon md-icon--home md-header-nav__button">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch">
|
||||||
|
<span class="md-flex__ellipsis md-header-nav__title">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Install
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
|
||||||
|
<label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
|
||||||
|
|
||||||
|
<div class="md-search" data-md-component="search">
|
||||||
|
<div class="md-search__overlay"></div>
|
||||||
|
<div class="md-search__inner">
|
||||||
|
<form class="md-search__form" name="search">
|
||||||
|
<input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
|
||||||
|
<label class="md-icon md-search__icon" for="search"></label>
|
||||||
|
<button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
|
||||||
|
</form>
|
||||||
|
<div class="md-search__output">
|
||||||
|
<div class="md-search__scrollwrap" data-md-scrollfix>
|
||||||
|
<div class="md-search-result" data-md-component="result">
|
||||||
|
<div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
|
||||||
|
Type to start searching
|
||||||
|
</div>
|
||||||
|
<ol class="md-search-result__list"></ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<div class="md-header-nav__source">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah/yaml" title="Go to repository" class="md-source" data-md-source="github">
|
||||||
|
|
||||||
|
<div class="md-source__icon">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<use xlink:href="#github" width="24" height="24"></use>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-source__repository">
|
||||||
|
mikefarah/yaml
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="md-container">
|
||||||
|
|
||||||
|
|
||||||
|
<main class="md-main">
|
||||||
|
<div class="md-main__inner md-grid" data-md-component="container">
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
<nav class="md-nav md-nav--primary" data-md-level="0">
|
||||||
|
<label class="md-nav__title md-nav__title--site" for="drawer">
|
||||||
|
|
||||||
|
<i class="md-icon md-icon--home md-nav__button"></i>
|
||||||
|
|
||||||
|
Yaml
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="md-nav__source">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah/yaml" title="Go to repository" class="md-source" data-md-source="github">
|
||||||
|
|
||||||
|
<div class="md-source__icon">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<use xlink:href="#github" width="24" height="24"></use>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-source__repository">
|
||||||
|
mikefarah/yaml
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--active">
|
||||||
|
|
||||||
|
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link md-nav__link--active" for="toc">
|
||||||
|
Install
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<a href="." title="Install" class="md-nav__link md-nav__link--active">
|
||||||
|
Install
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--secondary">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__title" for="toc">Table of contents</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#download-latest-binary" title="download latest binary" class="md-nav__link">
|
||||||
|
download latest binary
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#get-the-source" title="get the source" class="md-nav__link">
|
||||||
|
get the source
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="read/" title="Read" class="md-nav__link">
|
||||||
|
Read
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="write/" title="Write/Update" class="md-nav__link">
|
||||||
|
Write/Update
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="create/" title="Create" class="md-nav__link">
|
||||||
|
Create
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="convert/" title="Convert" class="md-nav__link">
|
||||||
|
Convert
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--secondary">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__title" for="toc">Table of contents</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#download-latest-binary" title="download latest binary" class="md-nav__link">
|
||||||
|
download latest binary
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#get-the-source" title="get the source" class="md-nav__link">
|
||||||
|
get the source
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-content">
|
||||||
|
<article class="md-content__inner md-typeset">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h1 id="yaml">yaml<a class="headerlink" href="#yaml" title="Permanent link">¶</a></h1>
|
||||||
|
<p>yaml is a lightweight and portable command-line YAML processor</p>
|
||||||
|
<p>The aim of the project is to be the <a href="https://github.com/stedolan/jq">jq</a> or sed of yaml files.</p>
|
||||||
|
<h3 id="download-latest-binary"><a href="https://github.com/mikefarah/yaml/releases/latest">download latest binary</a><a class="headerlink" href="#download-latest-binary" title="Permanent link">¶</a></h3>
|
||||||
|
<h3 id="get-the-source">get the source<a class="headerlink" href="#get-the-source" title="Permanent link">¶</a></h3>
|
||||||
|
<pre><code class="bash">go get github.com/mikefarah/yaml
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p><a href="https://github.com/mikefarah/yaml/zipball/master">.zip</a> or <a href="https://github.com/mikefarah/yaml/tarball/master">tar.gz</a></p>
|
||||||
|
<p><a href="https://github.com/mikefarah/yaml">View on GitHub</a></p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
|
||||||
|
<footer class="md-footer">
|
||||||
|
|
||||||
|
<div class="md-footer-nav">
|
||||||
|
<nav class="md-footer-nav__inner md-grid">
|
||||||
|
|
||||||
|
|
||||||
|
<a href="read/" title="Read" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
|
||||||
|
<span class="md-flex__ellipsis">
|
||||||
|
<span class="md-footer-nav__direction">
|
||||||
|
Next
|
||||||
|
</span>
|
||||||
|
Read
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-footer-meta md-typeset">
|
||||||
|
<div class="md-footer-meta__inner md-grid">
|
||||||
|
<div class="md-footer-copyright">
|
||||||
|
|
||||||
|
powered by
|
||||||
|
<a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
|
||||||
|
and
|
||||||
|
<a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
|
||||||
|
Material for MkDocs</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-footer-social">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah" class="md-footer-social__link fa fa-github"></a>
|
||||||
|
|
||||||
|
<a href="https://www.linkedin.com/in/mike-farah-b5a75b2/" class="md-footer-social__link fa fa-linkedin"></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="./assets/javascripts/application-0b7df094bf.js"></script>
|
||||||
|
<script>app.initialize({url:{base:"."}})</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
7
docs/mkdocs/js/lunr.min.js
vendored
Normal file
7
docs/mkdocs/js/lunr.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
docs/mkdocs/js/mustache.min.js
vendored
Normal file
1
docs/mkdocs/js/mustache.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
36
docs/mkdocs/js/require.js
Normal file
36
docs/mkdocs/js/require.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
RequireJS 2.1.16 Copyright (c) 2010-2015, The Dojo Foundation All Rights Reserved.
|
||||||
|
Available via the MIT or new BSD license.
|
||||||
|
see: http://github.com/jrburke/requirejs for details
|
||||||
|
*/
|
||||||
|
var requirejs,require,define;
|
||||||
|
(function(ba){function G(b){return"[object Function]"===K.call(b)}function H(b){return"[object Array]"===K.call(b)}function v(b,c){if(b){var d;for(d=0;d<b.length&&(!b[d]||!c(b[d],d,b));d+=1);}}function T(b,c){if(b){var d;for(d=b.length-1;-1<d&&(!b[d]||!c(b[d],d,b));d-=1);}}function t(b,c){return fa.call(b,c)}function m(b,c){return t(b,c)&&b[c]}function B(b,c){for(var d in b)if(t(b,d)&&c(b[d],d))break}function U(b,c,d,e){c&&B(c,function(c,g){if(d||!t(b,g))e&&"object"===typeof c&&c&&!H(c)&&!G(c)&&!(c instanceof
|
||||||
|
RegExp)?(b[g]||(b[g]={}),U(b[g],c,d,e)):b[g]=c});return b}function u(b,c){return function(){return c.apply(b,arguments)}}function ca(b){throw b;}function da(b){if(!b)return b;var c=ba;v(b.split("."),function(b){c=c[b]});return c}function C(b,c,d,e){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+b);c.requireType=b;c.requireModules=e;d&&(c.originalError=d);return c}function ga(b){function c(a,k,b){var f,l,c,d,e,g,i,p,k=k&&k.split("/"),h=j.map,n=h&&h["*"];if(a){a=a.split("/");l=a.length-1;j.nodeIdCompat&&
|
||||||
|
Q.test(a[l])&&(a[l]=a[l].replace(Q,""));"."===a[0].charAt(0)&&k&&(l=k.slice(0,k.length-1),a=l.concat(a));l=a;for(c=0;c<l.length;c++)if(d=l[c],"."===d)l.splice(c,1),c-=1;else if(".."===d&&!(0===c||1==c&&".."===l[2]||".."===l[c-1])&&0<c)l.splice(c-1,2),c-=2;a=a.join("/")}if(b&&h&&(k||n)){l=a.split("/");c=l.length;a:for(;0<c;c-=1){e=l.slice(0,c).join("/");if(k)for(d=k.length;0<d;d-=1)if(b=m(h,k.slice(0,d).join("/")))if(b=m(b,e)){f=b;g=c;break a}!i&&(n&&m(n,e))&&(i=m(n,e),p=c)}!f&&i&&(f=i,g=p);f&&(l.splice(0,
|
||||||
|
g,f),a=l.join("/"))}return(f=m(j.pkgs,a))?f:a}function d(a){z&&v(document.getElementsByTagName("script"),function(k){if(k.getAttribute("data-requiremodule")===a&&k.getAttribute("data-requirecontext")===i.contextName)return k.parentNode.removeChild(k),!0})}function e(a){var k=m(j.paths,a);if(k&&H(k)&&1<k.length)return k.shift(),i.require.undef(a),i.makeRequire(null,{skipMap:!0})([a]),!0}function n(a){var k,c=a?a.indexOf("!"):-1;-1<c&&(k=a.substring(0,c),a=a.substring(c+1,a.length));return[k,a]}function p(a,
|
||||||
|
k,b,f){var l,d,e=null,g=k?k.name:null,j=a,p=!0,h="";a||(p=!1,a="_@r"+(K+=1));a=n(a);e=a[0];a=a[1];e&&(e=c(e,g,f),d=m(r,e));a&&(e?h=d&&d.normalize?d.normalize(a,function(a){return c(a,g,f)}):-1===a.indexOf("!")?c(a,g,f):a:(h=c(a,g,f),a=n(h),e=a[0],h=a[1],b=!0,l=i.nameToUrl(h)));b=e&&!d&&!b?"_unnormalized"+(O+=1):"";return{prefix:e,name:h,parentMap:k,unnormalized:!!b,url:l,originalName:j,isDefine:p,id:(e?e+"!"+h:h)+b}}function s(a){var k=a.id,b=m(h,k);b||(b=h[k]=new i.Module(a));return b}function q(a,
|
||||||
|
k,b){var f=a.id,c=m(h,f);if(t(r,f)&&(!c||c.defineEmitComplete))"defined"===k&&b(r[f]);else if(c=s(a),c.error&&"error"===k)b(c.error);else c.on(k,b)}function w(a,b){var c=a.requireModules,f=!1;if(b)b(a);else if(v(c,function(b){if(b=m(h,b))b.error=a,b.events.error&&(f=!0,b.emit("error",a))}),!f)g.onError(a)}function x(){R.length&&(ha.apply(A,[A.length,0].concat(R)),R=[])}function y(a){delete h[a];delete V[a]}function F(a,b,c){var f=a.map.id;a.error?a.emit("error",a.error):(b[f]=!0,v(a.depMaps,function(f,
|
||||||
|
d){var e=f.id,g=m(h,e);g&&(!a.depMatched[d]&&!c[e])&&(m(b,e)?(a.defineDep(d,r[e]),a.check()):F(g,b,c))}),c[f]=!0)}function D(){var a,b,c=(a=1E3*j.waitSeconds)&&i.startTime+a<(new Date).getTime(),f=[],l=[],g=!1,h=!0;if(!W){W=!0;B(V,function(a){var i=a.map,j=i.id;if(a.enabled&&(i.isDefine||l.push(a),!a.error))if(!a.inited&&c)e(j)?g=b=!0:(f.push(j),d(j));else if(!a.inited&&(a.fetched&&i.isDefine)&&(g=!0,!i.prefix))return h=!1});if(c&&f.length)return a=C("timeout","Load timeout for modules: "+f,null,
|
||||||
|
f),a.contextName=i.contextName,w(a);h&&v(l,function(a){F(a,{},{})});if((!c||b)&&g)if((z||ea)&&!X)X=setTimeout(function(){X=0;D()},50);W=!1}}function E(a){t(r,a[0])||s(p(a[0],null,!0)).init(a[1],a[2])}function I(a){var a=a.currentTarget||a.srcElement,b=i.onScriptLoad;a.detachEvent&&!Y?a.detachEvent("onreadystatechange",b):a.removeEventListener("load",b,!1);b=i.onScriptError;(!a.detachEvent||Y)&&a.removeEventListener("error",b,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}function J(){var a;
|
||||||
|
for(x();A.length;){a=A.shift();if(null===a[0])return w(C("mismatch","Mismatched anonymous define() module: "+a[a.length-1]));E(a)}}var W,Z,i,L,X,j={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},h={},V={},$={},A=[],r={},S={},aa={},K=1,O=1;L={require:function(a){return a.require?a.require:a.require=i.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?r[a.map.id]=a.exports:a.exports=r[a.map.id]={}},module:function(a){return a.module?
|
||||||
|
a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){return m(j.config,a.map.id)||{}},exports:a.exports||(a.exports={})}}};Z=function(a){this.events=m($,a.id)||{};this.map=a;this.shim=m(j.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};Z.prototype={init:function(a,b,c,f){f=f||{};if(!this.inited){this.factory=b;if(c)this.on("error",c);else this.events.error&&(c=u(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.errback=
|
||||||
|
c;this.inited=!0;this.ignore=f.ignore;f.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=b)},fetch:function(){if(!this.fetched){this.fetched=!0;i.startTime=(new Date).getTime();var a=this.map;if(this.shim)i.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],u(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=
|
||||||
|
this.map.url;S[a]||(S[a]=!0,i.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,b,c=this.map.id;b=this.depExports;var f=this.exports,l=this.factory;if(this.inited)if(this.error)this.emit("error",this.error);else{if(!this.defining){this.defining=!0;if(1>this.depCount&&!this.defined){if(G(l)){if(this.events.error&&this.map.isDefine||g.onError!==ca)try{f=i.execCb(c,l,b,f)}catch(d){a=d}else f=i.execCb(c,l,b,f);this.map.isDefine&&void 0===f&&((b=this.module)?f=b.exports:this.usingExports&&
|
||||||
|
(f=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else f=l;this.exports=f;if(this.map.isDefine&&!this.ignore&&(r[c]=f,g.onResourceLoad))g.onResourceLoad(i,this.map,this.depMaps);y(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a=
|
||||||
|
this.map,b=a.id,d=p(a.prefix);this.depMaps.push(d);q(d,"defined",u(this,function(f){var l,d;d=m(aa,this.map.id);var e=this.map.name,P=this.map.parentMap?this.map.parentMap.name:null,n=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(e=f.normalize(e,function(a){return c(a,P,!0)})||""),f=p(a.prefix+"!"+e,this.map.parentMap),q(f,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=m(h,f.id)){this.depMaps.push(f);
|
||||||
|
if(this.events.error)d.on("error",u(this,function(a){this.emit("error",a)}));d.enable()}}else d?(this.map.url=i.nameToUrl(d),this.load()):(l=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),l.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(h,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),l.fromText=u(this,function(f,c){var d=a.name,e=p(d),P=M;c&&(f=c);P&&(M=!1);s(e);t(j.config,b)&&(j.config[d]=j.config[b]);try{g.exec(f)}catch(h){return w(C("fromtexteval",
|
||||||
|
"fromText eval for "+b+" failed: "+h,h,[b]))}P&&(M=!0);this.depMaps.push(e);i.completeLoad(d);n([d],l)}),f.load(a.name,n,l,j))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){V[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,u(this,function(a,b){var c,f;if("string"===typeof a){a=p(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=m(L,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;q(a,"defined",u(this,function(a){this.defineDep(b,
|
||||||
|
a);this.check()}));this.errback?q(a,"error",u(this,this.errback)):this.events.error&&q(a,"error",u(this,function(a){this.emit("error",a)}))}c=a.id;f=h[c];!t(L,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,u(this,function(a){var b=m(h,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){v(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:j,contextName:b,
|
||||||
|
registry:h,defined:r,urlFetched:S,defQueue:A,Module:Z,makeModuleMap:p,nextTick:g.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=j.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(j[b]||(j[b]={}),U(j[b],a,!0,!0)):j[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(aa[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);
|
||||||
|
b[c]=a}),j.shim=b);a.packages&&v(a.packages,function(a){var b,a="string"===typeof a?{name:a}:a;b=a.name;a.location&&(j.paths[b]=a.location);j.pkgs[b]=a.name+"/"+(a.main||"main").replace(ia,"").replace(Q,"")});B(h,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=p(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ba,arguments));return b||a.exports&&da(a.exports)}},makeRequire:function(a,e){function j(c,d,m){var n,
|
||||||
|
q;e.enableBuildCallback&&(d&&G(d))&&(d.__requireJsBuild=!0);if("string"===typeof c){if(G(d))return w(C("requireargs","Invalid require call"),m);if(a&&t(L,c))return L[c](h[a.id]);if(g.get)return g.get(i,c,a,j);n=p(c,a,!1,!0);n=n.id;return!t(r,n)?w(C("notloaded",'Module name "'+n+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[n]}J();i.nextTick(function(){J();q=s(p(null,a));q.skipMap=e.skipMap;q.init(c,d,m,{enabled:!0});D()});return j}e=e||{};U(j,{isBrowser:z,toUrl:function(b){var d,
|
||||||
|
e=b.lastIndexOf("."),k=b.split("/")[0];if(-1!==e&&(!("."===k||".."===k)||1<e))d=b.substring(e,b.length),b=b.substring(0,e);return i.nameToUrl(c(b,a&&a.id,!0),d,!0)},defined:function(b){return t(r,p(b,a,!1,!0).id)},specified:function(b){b=p(b,a,!1,!0).id;return t(r,b)||t(h,b)}});a||(j.undef=function(b){x();var c=p(b,a,!0),e=m(h,b);d(b);delete r[b];delete S[c.url];delete $[b];T(A,function(a,c){a[0]===b&&A.splice(c,1)});e&&(e.events.defined&&($[b]=e.events),y(b))});return j},enable:function(a){m(h,a.id)&&
|
||||||
|
s(a).enable()},completeLoad:function(a){var b,c,d=m(j.shim,a)||{},g=d.exports;for(x();A.length;){c=A.shift();if(null===c[0]){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);E(c)}c=m(h,a);if(!b&&!t(r,a)&&c&&!c.inited){if(j.enforceDefine&&(!g||!da(g)))return e(a)?void 0:w(C("nodefine","No define call for "+a,null,[a]));E([a,d.deps||[],d.exportsFn])}D()},nameToUrl:function(a,b,c){var d,e,h;(d=m(j.pkgs,a))&&(a=d);if(d=m(aa,a))return i.nameToUrl(d,b,c);if(g.jsExtRegExp.test(a))d=a+(b||"");else{d=j.paths;
|
||||||
|
a=a.split("/");for(e=a.length;0<e;e-=1)if(h=a.slice(0,e).join("/"),h=m(d,h)){H(h)&&(h=h[0]);a.splice(0,e,h);break}d=a.join("/");d+=b||(/^data\:|\?/.test(d)||c?"":".js");d=("/"===d.charAt(0)||d.match(/^[\w\+\.\-]+:/)?"":j.baseUrl)+d}return j.urlArgs?d+((-1===d.indexOf("?")?"?":"&")+j.urlArgs):d},load:function(a,b){g.load(i,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if("load"===a.type||ja.test((a.currentTarget||a.srcElement).readyState))N=null,a=I(a),i.completeLoad(a.id)},
|
||||||
|
onScriptError:function(a){var b=I(a);if(!e(b.id))return w(C("scripterror","Script error for: "+b.id,a,[b.id]))}};i.require=i.makeRequire();return i}var g,x,y,D,I,E,N,J,s,O,ka=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,la=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,Q=/\.js$/,ia=/^\.\//;x=Object.prototype;var K=x.toString,fa=x.hasOwnProperty,ha=Array.prototype.splice,z=!!("undefined"!==typeof window&&"undefined"!==typeof navigator&&window.document),ea=!z&&"undefined"!==typeof importScripts,ja=
|
||||||
|
z&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,Y="undefined"!==typeof opera&&"[object Opera]"===opera.toString(),F={},q={},R=[],M=!1;if("undefined"===typeof define){if("undefined"!==typeof requirejs){if(G(requirejs))return;q=requirejs;requirejs=void 0}"undefined"!==typeof require&&!G(require)&&(q=require,require=void 0);g=requirejs=function(b,c,d,e){var n,p="_";!H(b)&&"string"!==typeof b&&(n=b,H(c)?(b=c,c=d,d=e):b=[]);n&&n.context&&(p=n.context);(e=m(F,p))||(e=F[p]=g.s.newContext(p));
|
||||||
|
n&&e.configure(n);return e.require(b,c,d)};g.config=function(b){return g(b)};g.nextTick="undefined"!==typeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=g);g.version="2.1.16";g.jsExtRegExp=/^\/|:|\?|\.js$/;g.isBrowser=z;x=g.s={contexts:F,newContext:ga};g({});v(["toUrl","undef","defined","specified"],function(b){g[b]=function(){var c=F._;return c.require[b].apply(c,arguments)}});if(z&&(y=x.head=document.getElementsByTagName("head")[0],D=document.getElementsByTagName("base")[0]))y=
|
||||||
|
x.head=D.parentNode;g.onError=ca;g.createNode=function(b){var c=b.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");c.type=b.scriptType||"text/javascript";c.charset="utf-8";c.async=!0;return c};g.load=function(b,c,d){var e=b&&b.config||{};if(z)return e=g.createNode(e,c,d),e.setAttribute("data-requirecontext",b.contextName),e.setAttribute("data-requiremodule",c),e.attachEvent&&!(e.attachEvent.toString&&0>e.attachEvent.toString().indexOf("[native code"))&&
|
||||||
|
!Y?(M=!0,e.attachEvent("onreadystatechange",b.onScriptLoad)):(e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)),e.src=d,J=e,D?y.insertBefore(e,D):y.appendChild(e),J=null,e;if(ea)try{importScripts(d),b.completeLoad(c)}catch(m){b.onError(C("importscripts","importScripts failed for "+c+" at "+d,m,[c]))}};z&&!q.skipDataMain&&T(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(I=b.getAttribute("data-main"))return s=I,q.baseUrl||(E=s.split("/"),
|
||||||
|
s=E.pop(),O=E.length?E.join("/")+"/":"./",q.baseUrl=O),s=s.replace(Q,""),g.jsExtRegExp.test(s)&&(s=I),q.deps=q.deps?q.deps.concat(s):[s],!0});define=function(b,c,d){var e,g;"string"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(ka,"").replace(la,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(M){if(!(e=J))N&&"interactive"===N.readyState||T(document.getElementsByTagName("script"),function(b){if("interactive"===
|
||||||
|
b.readyState)return N=b}),e=N;e&&(b||(b=e.getAttribute("data-requiremodule")),g=F[e.getAttribute("data-requirecontext")])}(g?g.defQueue:R).push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(q)}})(this);
|
4
docs/mkdocs/js/search-results-template.mustache
Normal file
4
docs/mkdocs/js/search-results-template.mustache
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<article>
|
||||||
|
<h3><a href="{{location}}">{{title}}</a></h3>
|
||||||
|
<p>{{summary}}</p>
|
||||||
|
</article>
|
88
docs/mkdocs/js/search.js
Normal file
88
docs/mkdocs/js/search.js
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
require([
|
||||||
|
base_url + '/mkdocs/js/mustache.min.js',
|
||||||
|
base_url + '/mkdocs/js/lunr.min.js',
|
||||||
|
'text!search-results-template.mustache',
|
||||||
|
'text!../search_index.json',
|
||||||
|
], function (Mustache, lunr, results_template, data) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
function getSearchTerm()
|
||||||
|
{
|
||||||
|
var sPageURL = window.location.search.substring(1);
|
||||||
|
var sURLVariables = sPageURL.split('&');
|
||||||
|
for (var i = 0; i < sURLVariables.length; i++)
|
||||||
|
{
|
||||||
|
var sParameterName = sURLVariables[i].split('=');
|
||||||
|
if (sParameterName[0] == 'q')
|
||||||
|
{
|
||||||
|
return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var index = lunr(function () {
|
||||||
|
this.field('title', {boost: 10});
|
||||||
|
this.field('text');
|
||||||
|
this.ref('location');
|
||||||
|
});
|
||||||
|
|
||||||
|
data = JSON.parse(data);
|
||||||
|
var documents = {};
|
||||||
|
|
||||||
|
for (var i=0; i < data.docs.length; i++){
|
||||||
|
var doc = data.docs[i];
|
||||||
|
doc.location = base_url + doc.location;
|
||||||
|
index.add(doc);
|
||||||
|
documents[doc.location] = doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
var search = function(){
|
||||||
|
|
||||||
|
var query = document.getElementById('mkdocs-search-query').value;
|
||||||
|
var search_results = document.getElementById("mkdocs-search-results");
|
||||||
|
while (search_results.firstChild) {
|
||||||
|
search_results.removeChild(search_results.firstChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(query === ''){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var results = index.search(query);
|
||||||
|
|
||||||
|
if (results.length > 0){
|
||||||
|
for (var i=0; i < results.length; i++){
|
||||||
|
var result = results[i];
|
||||||
|
doc = documents[result.ref];
|
||||||
|
doc.base_url = base_url;
|
||||||
|
doc.summary = doc.text.substring(0, 200);
|
||||||
|
var html = Mustache.to_html(results_template, doc);
|
||||||
|
search_results.insertAdjacentHTML('beforeend', html);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
search_results.insertAdjacentHTML('beforeend', "<p>No results found</p>");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(jQuery){
|
||||||
|
/*
|
||||||
|
* We currently only automatically hide bootstrap models. This
|
||||||
|
* requires jQuery to work.
|
||||||
|
*/
|
||||||
|
jQuery('#mkdocs_search_modal a').click(function(){
|
||||||
|
jQuery('#mkdocs_search_modal').modal('hide');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
var search_input = document.getElementById('mkdocs-search-query');
|
||||||
|
|
||||||
|
var term = getSearchTerm();
|
||||||
|
if (term){
|
||||||
|
search_input.value = term;
|
||||||
|
search();
|
||||||
|
}
|
||||||
|
|
||||||
|
search_input.addEventListener("keyup", search);
|
||||||
|
|
||||||
|
});
|
390
docs/mkdocs/js/text.js
Normal file
390
docs/mkdocs/js/text.js
Normal file
@ -0,0 +1,390 @@
|
|||||||
|
/**
|
||||||
|
* @license RequireJS text 2.0.12 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.
|
||||||
|
* Available via the MIT or new BSD license.
|
||||||
|
* see: http://github.com/requirejs/text for details
|
||||||
|
*/
|
||||||
|
/*jslint regexp: true */
|
||||||
|
/*global require, XMLHttpRequest, ActiveXObject,
|
||||||
|
define, window, process, Packages,
|
||||||
|
java, location, Components, FileUtils */
|
||||||
|
|
||||||
|
define(['module'], function (module) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var text, fs, Cc, Ci, xpcIsWindows,
|
||||||
|
progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'],
|
||||||
|
xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,
|
||||||
|
bodyRegExp = /<body[^>]*>\s*([\s\S]+)\s*<\/body>/im,
|
||||||
|
hasLocation = typeof location !== 'undefined' && location.href,
|
||||||
|
defaultProtocol = hasLocation && location.protocol && location.protocol.replace(/\:/, ''),
|
||||||
|
defaultHostName = hasLocation && location.hostname,
|
||||||
|
defaultPort = hasLocation && (location.port || undefined),
|
||||||
|
buildMap = {},
|
||||||
|
masterConfig = (module.config && module.config()) || {};
|
||||||
|
|
||||||
|
text = {
|
||||||
|
version: '2.0.12',
|
||||||
|
|
||||||
|
strip: function (content) {
|
||||||
|
//Strips <?xml ...?> declarations so that external SVG and XML
|
||||||
|
//documents can be added to a document without worry. Also, if the string
|
||||||
|
//is an HTML document, only the part inside the body tag is returned.
|
||||||
|
if (content) {
|
||||||
|
content = content.replace(xmlRegExp, "");
|
||||||
|
var matches = content.match(bodyRegExp);
|
||||||
|
if (matches) {
|
||||||
|
content = matches[1];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
content = "";
|
||||||
|
}
|
||||||
|
return content;
|
||||||
|
},
|
||||||
|
|
||||||
|
jsEscape: function (content) {
|
||||||
|
return content.replace(/(['\\])/g, '\\$1')
|
||||||
|
.replace(/[\f]/g, "\\f")
|
||||||
|
.replace(/[\b]/g, "\\b")
|
||||||
|
.replace(/[\n]/g, "\\n")
|
||||||
|
.replace(/[\t]/g, "\\t")
|
||||||
|
.replace(/[\r]/g, "\\r")
|
||||||
|
.replace(/[\u2028]/g, "\\u2028")
|
||||||
|
.replace(/[\u2029]/g, "\\u2029");
|
||||||
|
},
|
||||||
|
|
||||||
|
createXhr: masterConfig.createXhr || function () {
|
||||||
|
//Would love to dump the ActiveX crap in here. Need IE 6 to die first.
|
||||||
|
var xhr, i, progId;
|
||||||
|
if (typeof XMLHttpRequest !== "undefined") {
|
||||||
|
return new XMLHttpRequest();
|
||||||
|
} else if (typeof ActiveXObject !== "undefined") {
|
||||||
|
for (i = 0; i < 3; i += 1) {
|
||||||
|
progId = progIds[i];
|
||||||
|
try {
|
||||||
|
xhr = new ActiveXObject(progId);
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
if (xhr) {
|
||||||
|
progIds = [progId]; // so faster next time
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return xhr;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses a resource name into its component parts. Resource names
|
||||||
|
* look like: module/name.ext!strip, where the !strip part is
|
||||||
|
* optional.
|
||||||
|
* @param {String} name the resource name
|
||||||
|
* @returns {Object} with properties "moduleName", "ext" and "strip"
|
||||||
|
* where strip is a boolean.
|
||||||
|
*/
|
||||||
|
parseName: function (name) {
|
||||||
|
var modName, ext, temp,
|
||||||
|
strip = false,
|
||||||
|
index = name.indexOf("."),
|
||||||
|
isRelative = name.indexOf('./') === 0 ||
|
||||||
|
name.indexOf('../') === 0;
|
||||||
|
|
||||||
|
if (index !== -1 && (!isRelative || index > 1)) {
|
||||||
|
modName = name.substring(0, index);
|
||||||
|
ext = name.substring(index + 1, name.length);
|
||||||
|
} else {
|
||||||
|
modName = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = ext || modName;
|
||||||
|
index = temp.indexOf("!");
|
||||||
|
if (index !== -1) {
|
||||||
|
//Pull off the strip arg.
|
||||||
|
strip = temp.substring(index + 1) === "strip";
|
||||||
|
temp = temp.substring(0, index);
|
||||||
|
if (ext) {
|
||||||
|
ext = temp;
|
||||||
|
} else {
|
||||||
|
modName = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
moduleName: modName,
|
||||||
|
ext: ext,
|
||||||
|
strip: strip
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
xdRegExp: /^((\w+)\:)?\/\/([^\/\\]+)/,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is an URL on another domain. Only works for browser use, returns
|
||||||
|
* false in non-browser environments. Only used to know if an
|
||||||
|
* optimized .js version of a text resource should be loaded
|
||||||
|
* instead.
|
||||||
|
* @param {String} url
|
||||||
|
* @returns Boolean
|
||||||
|
*/
|
||||||
|
useXhr: function (url, protocol, hostname, port) {
|
||||||
|
var uProtocol, uHostName, uPort,
|
||||||
|
match = text.xdRegExp.exec(url);
|
||||||
|
if (!match) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
uProtocol = match[2];
|
||||||
|
uHostName = match[3];
|
||||||
|
|
||||||
|
uHostName = uHostName.split(':');
|
||||||
|
uPort = uHostName[1];
|
||||||
|
uHostName = uHostName[0];
|
||||||
|
|
||||||
|
return (!uProtocol || uProtocol === protocol) &&
|
||||||
|
(!uHostName || uHostName.toLowerCase() === hostname.toLowerCase()) &&
|
||||||
|
((!uPort && !uHostName) || uPort === port);
|
||||||
|
},
|
||||||
|
|
||||||
|
finishLoad: function (name, strip, content, onLoad) {
|
||||||
|
content = strip ? text.strip(content) : content;
|
||||||
|
if (masterConfig.isBuild) {
|
||||||
|
buildMap[name] = content;
|
||||||
|
}
|
||||||
|
onLoad(content);
|
||||||
|
},
|
||||||
|
|
||||||
|
load: function (name, req, onLoad, config) {
|
||||||
|
//Name has format: some.module.filext!strip
|
||||||
|
//The strip part is optional.
|
||||||
|
//if strip is present, then that means only get the string contents
|
||||||
|
//inside a body tag in an HTML string. For XML/SVG content it means
|
||||||
|
//removing the <?xml ...?> declarations so the content can be inserted
|
||||||
|
//into the current doc without problems.
|
||||||
|
|
||||||
|
// Do not bother with the work if a build and text will
|
||||||
|
// not be inlined.
|
||||||
|
if (config && config.isBuild && !config.inlineText) {
|
||||||
|
onLoad();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
masterConfig.isBuild = config && config.isBuild;
|
||||||
|
|
||||||
|
var parsed = text.parseName(name),
|
||||||
|
nonStripName = parsed.moduleName +
|
||||||
|
(parsed.ext ? '.' + parsed.ext : ''),
|
||||||
|
url = req.toUrl(nonStripName),
|
||||||
|
useXhr = (masterConfig.useXhr) ||
|
||||||
|
text.useXhr;
|
||||||
|
|
||||||
|
// Do not load if it is an empty: url
|
||||||
|
if (url.indexOf('empty:') === 0) {
|
||||||
|
onLoad();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Load the text. Use XHR if possible and in a browser.
|
||||||
|
if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) {
|
||||||
|
text.get(url, function (content) {
|
||||||
|
text.finishLoad(name, parsed.strip, content, onLoad);
|
||||||
|
}, function (err) {
|
||||||
|
if (onLoad.error) {
|
||||||
|
onLoad.error(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
//Need to fetch the resource across domains. Assume
|
||||||
|
//the resource has been optimized into a JS module. Fetch
|
||||||
|
//by the module name + extension, but do not include the
|
||||||
|
//!strip part to avoid file system issues.
|
||||||
|
req([nonStripName], function (content) {
|
||||||
|
text.finishLoad(parsed.moduleName + '.' + parsed.ext,
|
||||||
|
parsed.strip, content, onLoad);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
write: function (pluginName, moduleName, write, config) {
|
||||||
|
if (buildMap.hasOwnProperty(moduleName)) {
|
||||||
|
var content = text.jsEscape(buildMap[moduleName]);
|
||||||
|
write.asModule(pluginName + "!" + moduleName,
|
||||||
|
"define(function () { return '" +
|
||||||
|
content +
|
||||||
|
"';});\n");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
writeFile: function (pluginName, moduleName, req, write, config) {
|
||||||
|
var parsed = text.parseName(moduleName),
|
||||||
|
extPart = parsed.ext ? '.' + parsed.ext : '',
|
||||||
|
nonStripName = parsed.moduleName + extPart,
|
||||||
|
//Use a '.js' file name so that it indicates it is a
|
||||||
|
//script that can be loaded across domains.
|
||||||
|
fileName = req.toUrl(parsed.moduleName + extPart) + '.js';
|
||||||
|
|
||||||
|
//Leverage own load() method to load plugin value, but only
|
||||||
|
//write out values that do not have the strip argument,
|
||||||
|
//to avoid any potential issues with ! in file names.
|
||||||
|
text.load(nonStripName, req, function (value) {
|
||||||
|
//Use own write() method to construct full module value.
|
||||||
|
//But need to create shell that translates writeFile's
|
||||||
|
//write() to the right interface.
|
||||||
|
var textWrite = function (contents) {
|
||||||
|
return write(fileName, contents);
|
||||||
|
};
|
||||||
|
textWrite.asModule = function (moduleName, contents) {
|
||||||
|
return write.asModule(moduleName, fileName, contents);
|
||||||
|
};
|
||||||
|
|
||||||
|
text.write(pluginName, nonStripName, textWrite, config);
|
||||||
|
}, config);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (masterConfig.env === 'node' || (!masterConfig.env &&
|
||||||
|
typeof process !== "undefined" &&
|
||||||
|
process.versions &&
|
||||||
|
!!process.versions.node &&
|
||||||
|
!process.versions['node-webkit'])) {
|
||||||
|
//Using special require.nodeRequire, something added by r.js.
|
||||||
|
fs = require.nodeRequire('fs');
|
||||||
|
|
||||||
|
text.get = function (url, callback, errback) {
|
||||||
|
try {
|
||||||
|
var file = fs.readFileSync(url, 'utf8');
|
||||||
|
//Remove BOM (Byte Mark Order) from utf8 files if it is there.
|
||||||
|
if (file.indexOf('\uFEFF') === 0) {
|
||||||
|
file = file.substring(1);
|
||||||
|
}
|
||||||
|
callback(file);
|
||||||
|
} catch (e) {
|
||||||
|
if (errback) {
|
||||||
|
errback(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else if (masterConfig.env === 'xhr' || (!masterConfig.env &&
|
||||||
|
text.createXhr())) {
|
||||||
|
text.get = function (url, callback, errback, headers) {
|
||||||
|
var xhr = text.createXhr(), header;
|
||||||
|
xhr.open('GET', url, true);
|
||||||
|
|
||||||
|
//Allow plugins direct access to xhr headers
|
||||||
|
if (headers) {
|
||||||
|
for (header in headers) {
|
||||||
|
if (headers.hasOwnProperty(header)) {
|
||||||
|
xhr.setRequestHeader(header.toLowerCase(), headers[header]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Allow overrides specified in config
|
||||||
|
if (masterConfig.onXhr) {
|
||||||
|
masterConfig.onXhr(xhr, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
xhr.onreadystatechange = function (evt) {
|
||||||
|
var status, err;
|
||||||
|
//Do not explicitly handle errors, those should be
|
||||||
|
//visible via console output in the browser.
|
||||||
|
if (xhr.readyState === 4) {
|
||||||
|
status = xhr.status || 0;
|
||||||
|
if (status > 399 && status < 600) {
|
||||||
|
//An http 4xx or 5xx error. Signal an error.
|
||||||
|
err = new Error(url + ' HTTP status: ' + status);
|
||||||
|
err.xhr = xhr;
|
||||||
|
if (errback) {
|
||||||
|
errback(err);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
callback(xhr.responseText);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (masterConfig.onXhrComplete) {
|
||||||
|
masterConfig.onXhrComplete(xhr, url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
xhr.send(null);
|
||||||
|
};
|
||||||
|
} else if (masterConfig.env === 'rhino' || (!masterConfig.env &&
|
||||||
|
typeof Packages !== 'undefined' && typeof java !== 'undefined')) {
|
||||||
|
//Why Java, why is this so awkward?
|
||||||
|
text.get = function (url, callback) {
|
||||||
|
var stringBuffer, line,
|
||||||
|
encoding = "utf-8",
|
||||||
|
file = new java.io.File(url),
|
||||||
|
lineSeparator = java.lang.System.getProperty("line.separator"),
|
||||||
|
input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding)),
|
||||||
|
content = '';
|
||||||
|
try {
|
||||||
|
stringBuffer = new java.lang.StringBuffer();
|
||||||
|
line = input.readLine();
|
||||||
|
|
||||||
|
// Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324
|
||||||
|
// http://www.unicode.org/faq/utf_bom.html
|
||||||
|
|
||||||
|
// Note that when we use utf-8, the BOM should appear as "EF BB BF", but it doesn't due to this bug in the JDK:
|
||||||
|
// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058
|
||||||
|
if (line && line.length() && line.charAt(0) === 0xfeff) {
|
||||||
|
// Eat the BOM, since we've already found the encoding on this file,
|
||||||
|
// and we plan to concatenating this buffer with others; the BOM should
|
||||||
|
// only appear at the top of a file.
|
||||||
|
line = line.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line !== null) {
|
||||||
|
stringBuffer.append(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((line = input.readLine()) !== null) {
|
||||||
|
stringBuffer.append(lineSeparator);
|
||||||
|
stringBuffer.append(line);
|
||||||
|
}
|
||||||
|
//Make sure we return a JavaScript string and not a Java string.
|
||||||
|
content = String(stringBuffer.toString()); //String
|
||||||
|
} finally {
|
||||||
|
input.close();
|
||||||
|
}
|
||||||
|
callback(content);
|
||||||
|
};
|
||||||
|
} else if (masterConfig.env === 'xpconnect' || (!masterConfig.env &&
|
||||||
|
typeof Components !== 'undefined' && Components.classes &&
|
||||||
|
Components.interfaces)) {
|
||||||
|
//Avert your gaze!
|
||||||
|
Cc = Components.classes;
|
||||||
|
Ci = Components.interfaces;
|
||||||
|
Components.utils['import']('resource://gre/modules/FileUtils.jsm');
|
||||||
|
xpcIsWindows = ('@mozilla.org/windows-registry-key;1' in Cc);
|
||||||
|
|
||||||
|
text.get = function (url, callback) {
|
||||||
|
var inStream, convertStream, fileObj,
|
||||||
|
readData = {};
|
||||||
|
|
||||||
|
if (xpcIsWindows) {
|
||||||
|
url = url.replace(/\//g, '\\');
|
||||||
|
}
|
||||||
|
|
||||||
|
fileObj = new FileUtils.File(url);
|
||||||
|
|
||||||
|
//XPCOM, you so crazy
|
||||||
|
try {
|
||||||
|
inStream = Cc['@mozilla.org/network/file-input-stream;1']
|
||||||
|
.createInstance(Ci.nsIFileInputStream);
|
||||||
|
inStream.init(fileObj, 1, 0, false);
|
||||||
|
|
||||||
|
convertStream = Cc['@mozilla.org/intl/converter-input-stream;1']
|
||||||
|
.createInstance(Ci.nsIConverterInputStream);
|
||||||
|
convertStream.init(inStream, "utf-8", inStream.available(),
|
||||||
|
Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
|
||||||
|
|
||||||
|
convertStream.readString(inStream.available(), readData);
|
||||||
|
convertStream.close();
|
||||||
|
inStream.close();
|
||||||
|
callback(readData.value);
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error((fileObj && fileObj.path || '') + ': ' + e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
});
|
124
docs/mkdocs/search_index.json
Normal file
124
docs/mkdocs/search_index.json
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
{
|
||||||
|
"docs": [
|
||||||
|
{
|
||||||
|
"location": "/",
|
||||||
|
"text": "yaml\n\n\nyaml is a lightweight and portable command-line YAML processor\n\n\nThe aim of the project is to be the \njq\n or sed of yaml files.\n\n\ndownload latest binary\n\n\nget the source\n\n\ngo get github.com/mikefarah/yaml\n\n\n\n\n.zip\n or \ntar.gz\n\n\nView on GitHub",
|
||||||
|
"title": "Install"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/#yaml",
|
||||||
|
"text": "yaml is a lightweight and portable command-line YAML processor The aim of the project is to be the jq or sed of yaml files.",
|
||||||
|
"title": "yaml"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/#download-latest-binary",
|
||||||
|
"text": "",
|
||||||
|
"title": "download latest binary"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/#get-the-source",
|
||||||
|
"text": "go get github.com/mikefarah/yaml .zip or tar.gz View on GitHub",
|
||||||
|
"title": "get the source"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/read/",
|
||||||
|
"text": "yaml r \nyaml_file|json_file\n \npath\n\n\n\n\n\nThis command can take a json file as input too, and will output yaml unless specified to export as json (-j)\n\n\nBasic\n\n\nGiven a sample.yaml file of:\n\n\nb:\n c: 2\n\n\n\n\nthen\n\n\nyaml r sample.yaml b.c\n\n\n\n\nwill output the value of '2'.\n\n\nFrom Stdin\n\n\nGiven a sample.yaml file of:\n\n\ncat sample.yaml | yaml r - b.c\n\n\n\n\nwill output the value of '2'.\n\n\nSplat\n\n\nGiven a sample.yaml file of:\n\n\n---\nbob:\n item1:\n cats: bananas\n item2:\n cats: apples\n\n\n\n\nthen\n\n\nyaml r sample.yaml bob.*.cats\n\n\n\n\nwill output\n\n\n- bananas\n- apples\n\n\n\n\nHandling '.' in the yaml key\n\n\nGiven a sample.yaml file of:\n\n\nb.x:\n c: 2\n\n\n\n\nthen\n\n\nyaml r sample.yaml \\\nb.x\\\n.c\n\n\n\n\nwill output the value of '2'.\n\n\nArrays\n\n\nYou can give an index to access a specific element:\ne.g.: given a sample file of\n\n\nb:\n e:\n - name: fred\n value: 3\n - name: sam\n value: 4\n\n\n\n\nthen\n\n\nyaml r sample.yaml b.e[1].name\n\n\n\n\nwill output 'sam'\n\n\nArray Splat\n\n\ne.g.: given a sample file of\n\n\nb:\n e:\n - name: fred\n value: 3\n - name: sam\n value: 4\n\n\n\n\nthen\n\n\nyaml r sample.yaml b.e[*].name\n\n\n\n\nwill output:\n\n\n- fred\n- sam",
|
||||||
|
"title": "Read"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/read/#basic",
|
||||||
|
"text": "Given a sample.yaml file of: b:\n c: 2 then yaml r sample.yaml b.c will output the value of '2'.",
|
||||||
|
"title": "Basic"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/read/#from-stdin",
|
||||||
|
"text": "Given a sample.yaml file of: cat sample.yaml | yaml r - b.c will output the value of '2'.",
|
||||||
|
"title": "From Stdin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/read/#splat",
|
||||||
|
"text": "Given a sample.yaml file of: ---\nbob:\n item1:\n cats: bananas\n item2:\n cats: apples then yaml r sample.yaml bob.*.cats will output - bananas\n- apples",
|
||||||
|
"title": "Splat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/read/#handling-in-the-yaml-key",
|
||||||
|
"text": "Given a sample.yaml file of: b.x:\n c: 2 then yaml r sample.yaml \\ b.x\\ .c will output the value of '2'.",
|
||||||
|
"title": "Handling '.' in the yaml key"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/read/#arrays",
|
||||||
|
"text": "You can give an index to access a specific element:\ne.g.: given a sample file of b:\n e:\n - name: fred\n value: 3\n - name: sam\n value: 4 then yaml r sample.yaml b.e[1].name will output 'sam'",
|
||||||
|
"title": "Arrays"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/read/#array-splat",
|
||||||
|
"text": "e.g.: given a sample file of b:\n e:\n - name: fred\n value: 3\n - name: sam\n value: 4 then yaml r sample.yaml b.e[*].name will output: - fred\n- sam",
|
||||||
|
"title": "Array Splat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/write/",
|
||||||
|
"text": "yaml w \nyaml_file|json_file\n \npath\n \nnew value\n\n\n\n\n\nThis command can take a json file as input too, and will output yaml unless specified to export as json (-j)\n\n\nTo Stdout\n\n\nGiven a sample.yaml file of:\n\n\nb:\n c: 2\n\n\n\n\nthen\n\n\nyaml w sample.yaml b.c cat\n\n\n\n\nwill output:\n\n\nb:\n c: cat\n\n\n\n\nFrom STDIN\n\n\ncat sample.yaml | yaml w - b.c blah\n\n\n\n\nAdding new fields\n\n\nAny missing fields in the path will be created on the fly.\n\n\nGiven a sample.yaml file of:\n\n\nb:\n c: 2\n\n\n\n\nthen\n\n\nyaml w sample.yaml b.d[0] \nnew thing\n\n\n\n\n\nwill output:\n\n\nb:\n c: cat\n d:\n - new thing\n\n\n\n\nUpdating files in-place\n\n\nGiven a sample.yaml file of:\n\n\nb:\n c: 2\n\n\n\n\nthen\n\n\nyaml w -i sample.yaml b.c cat\n\n\n\n\nwill update the sample.yaml file so that the value of 'c' is cat.\n\n\nUpdating multiple values with a script\n\n\nGiven a sample.yaml file of:\n\n\nb:\n c: 2\n e:\n - name: Billy Bob\n\n\n\n\nand a script update_instructions.yaml of:\n\n\nb.c: 3\nb.e[0].name: Howdy Partner\n\n\n\n\nthen\n\n\nyaml w -s update_instructions.yaml sample.yaml\n\n\n\n\nwill output:\n\n\nb:\n c: 3\n e:\n - name: Howdy Partner\n\n\n\n\nAnd, of course, you can pipe the instructions in using '-':\n\n\ncat update_instructions.yaml | yaml w -s - sample.yaml\n\n\n\n\nValues starting with a hyphen (or dash)\n\n\nThe flag terminator needs to be used to stop the app from attempting to parse the subsequent arguments as flags:\n\n\nyaml w -- my.path -3\n\n\n\n\nwill output\n\n\nmy:\n path: -3",
|
||||||
|
"title": "Write/Update"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/write/#to-stdout",
|
||||||
|
"text": "Given a sample.yaml file of: b:\n c: 2 then yaml w sample.yaml b.c cat will output: b:\n c: cat",
|
||||||
|
"title": "To Stdout"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/write/#from-stdin",
|
||||||
|
"text": "cat sample.yaml | yaml w - b.c blah",
|
||||||
|
"title": "From STDIN"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/write/#adding-new-fields",
|
||||||
|
"text": "Any missing fields in the path will be created on the fly. Given a sample.yaml file of: b:\n c: 2 then yaml w sample.yaml b.d[0] new thing will output: b:\n c: cat\n d:\n - new thing",
|
||||||
|
"title": "Adding new fields"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/write/#updating-files-in-place",
|
||||||
|
"text": "Given a sample.yaml file of: b:\n c: 2 then yaml w -i sample.yaml b.c cat will update the sample.yaml file so that the value of 'c' is cat.",
|
||||||
|
"title": "Updating files in-place"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/write/#updating-multiple-values-with-a-script",
|
||||||
|
"text": "Given a sample.yaml file of: b:\n c: 2\n e:\n - name: Billy Bob and a script update_instructions.yaml of: b.c: 3\nb.e[0].name: Howdy Partner then yaml w -s update_instructions.yaml sample.yaml will output: b:\n c: 3\n e:\n - name: Howdy Partner And, of course, you can pipe the instructions in using '-': cat update_instructions.yaml | yaml w -s - sample.yaml",
|
||||||
|
"title": "Updating multiple values with a script"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/write/#values-starting-with-a-hyphen-or-dash",
|
||||||
|
"text": "The flag terminator needs to be used to stop the app from attempting to parse the subsequent arguments as flags: yaml w -- my.path -3 will output my:\n path: -3",
|
||||||
|
"title": "Values starting with a hyphen (or dash)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/create/",
|
||||||
|
"text": "Yaml files can be created using the 'new' command. This works in the same way as the write command, but you don't pass in an existing Yaml file.\n\n\nyaml n \npath\n \nnew value\n\n\n\n\n\nCreating a simple yaml file\n\n\nyaml n b.c cat\n\n\n\n\nwill output:\n\n\nb:\n c: cat\n\n\n\n\nCreating using a create script\n\n\nCreate scripts follow the same format as the update scripts.\n\n\nGiven a script create_instructions.yaml of:\n\n\nb.c: 3\nb.e[0].name: Howdy Partner\n\n\n\n\nthen\n\n\nyaml n -s create_instructions.yaml\n\n\n\n\nwill output:\n\n\nb:\n c: 3\n e:\n - name: Howdy Partner\n\n\n\n\nYou can also pipe the instructions in:\n\n\ncat create_instructions.yaml | yaml n -s -",
|
||||||
|
"title": "Create"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/create/#creating-a-simple-yaml-file",
|
||||||
|
"text": "yaml n b.c cat will output: b:\n c: cat",
|
||||||
|
"title": "Creating a simple yaml file"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/create/#creating-using-a-create-script",
|
||||||
|
"text": "Create scripts follow the same format as the update scripts. Given a script create_instructions.yaml of: b.c: 3\nb.e[0].name: Howdy Partner then yaml n -s create_instructions.yaml will output: b:\n c: 3\n e:\n - name: Howdy Partner You can also pipe the instructions in: cat create_instructions.yaml | yaml n -s -",
|
||||||
|
"title": "Creating using a create script"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/convert/",
|
||||||
|
"text": "Yaml to Json\n\n\nTo convert output to json, use the --tojson (or -j) flag. This can be used with any command.\n\n\nGiven a sample.yaml file of:\n\n\nb:\n c: 2\n\n\n\n\nthen\n\n\nyaml r -j sample.yaml b.c\n\n\n\n\nwill output\n\n\n{\nb\n:{\nc\n:2}}\n\n\n\n\nJson to Yaml\n\n\nTo read in json, just pass in a json file instead of yaml, it will just work :)\n\n\ne.g given a json file\n\n\n{\na\n:\nEasy! as one two three\n,\nb\n:{\nc\n:2,\nd\n:[3,4]}}\n\n\n\n\nthen\n\n\nyaml r sample.json\n\n\n\n\nwill output\n\n\na: Easy! as one two three\nb:\n c: 2\n d:\n - 3\n - 4",
|
||||||
|
"title": "Convert"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/convert/#yaml-to-json",
|
||||||
|
"text": "To convert output to json, use the --tojson (or -j) flag. This can be used with any command. Given a sample.yaml file of: b:\n c: 2 then yaml r -j sample.yaml b.c will output { b :{ c :2}}",
|
||||||
|
"title": "Yaml to Json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "/convert/#json-to-yaml",
|
||||||
|
"text": "To read in json, just pass in a json file instead of yaml, it will just work :) e.g given a json file { a : Easy! as one two three , b :{ c :2, d :[3,4]}} then yaml r sample.json will output a: Easy! as one two three\nb:\n c: 2\n d:\n - 3\n - 4",
|
||||||
|
"title": "Json to Yaml"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
554
docs/read/index.html
Normal file
554
docs/read/index.html
Normal file
@ -0,0 +1,554 @@
|
|||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="no-js">
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="shortcut icon" href="../assets/images/favicon.png">
|
||||||
|
|
||||||
|
<meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.5.4">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<title>Read - Yaml</title>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="../assets/javascripts/modernizr-56ade86843.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="../assets/stylesheets/application-b1a1975878.css">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
|
||||||
|
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<svg class="md-svg">
|
||||||
|
<defs>
|
||||||
|
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
|
||||||
|
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
|
||||||
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
|
||||||
|
<label class="md-overlay" data-md-component="overlay" for="drawer"></label>
|
||||||
|
|
||||||
|
<header class="md-header" data-md-component="header">
|
||||||
|
<nav class="md-header-nav md-grid">
|
||||||
|
<div class="md-flex">
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
|
||||||
|
<a href=".." title="Yaml" class="md-icon md-icon--home md-header-nav__button">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch">
|
||||||
|
<span class="md-flex__ellipsis md-header-nav__title">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Read
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
|
||||||
|
<label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
|
||||||
|
|
||||||
|
<div class="md-search" data-md-component="search">
|
||||||
|
<div class="md-search__overlay"></div>
|
||||||
|
<div class="md-search__inner">
|
||||||
|
<form class="md-search__form" name="search">
|
||||||
|
<input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
|
||||||
|
<label class="md-icon md-search__icon" for="search"></label>
|
||||||
|
<button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
|
||||||
|
</form>
|
||||||
|
<div class="md-search__output">
|
||||||
|
<div class="md-search__scrollwrap" data-md-scrollfix>
|
||||||
|
<div class="md-search-result" data-md-component="result">
|
||||||
|
<div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
|
||||||
|
Type to start searching
|
||||||
|
</div>
|
||||||
|
<ol class="md-search-result__list"></ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<div class="md-header-nav__source">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah/yaml" title="Go to repository" class="md-source" data-md-source="github">
|
||||||
|
|
||||||
|
<div class="md-source__icon">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<use xlink:href="#github" width="24" height="24"></use>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-source__repository">
|
||||||
|
mikefarah/yaml
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="md-container">
|
||||||
|
|
||||||
|
|
||||||
|
<main class="md-main">
|
||||||
|
<div class="md-main__inner md-grid" data-md-component="container">
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
<nav class="md-nav md-nav--primary" data-md-level="0">
|
||||||
|
<label class="md-nav__title md-nav__title--site" for="drawer">
|
||||||
|
|
||||||
|
<i class="md-icon md-icon--home md-nav__button"></i>
|
||||||
|
|
||||||
|
Yaml
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="md-nav__source">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah/yaml" title="Go to repository" class="md-source" data-md-source="github">
|
||||||
|
|
||||||
|
<div class="md-source__icon">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<use xlink:href="#github" width="24" height="24"></use>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-source__repository">
|
||||||
|
mikefarah/yaml
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href=".." title="Install" class="md-nav__link">
|
||||||
|
Install
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--active">
|
||||||
|
|
||||||
|
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link md-nav__link--active" for="toc">
|
||||||
|
Read
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<a href="./" title="Read" class="md-nav__link md-nav__link--active">
|
||||||
|
Read
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--secondary">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__title" for="toc">Table of contents</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#basic" title="Basic" class="md-nav__link">
|
||||||
|
Basic
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#from-stdin" title="From Stdin" class="md-nav__link">
|
||||||
|
From Stdin
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#splat" title="Splat" class="md-nav__link">
|
||||||
|
Splat
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#handling-in-the-yaml-key" title="Handling '.' in the yaml key" class="md-nav__link">
|
||||||
|
Handling '.' in the yaml key
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#arrays" title="Arrays" class="md-nav__link">
|
||||||
|
Arrays
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#array-splat" title="Array Splat" class="md-nav__link">
|
||||||
|
Array Splat
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../write/" title="Write/Update" class="md-nav__link">
|
||||||
|
Write/Update
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../create/" title="Create" class="md-nav__link">
|
||||||
|
Create
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../convert/" title="Convert" class="md-nav__link">
|
||||||
|
Convert
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--secondary">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__title" for="toc">Table of contents</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#basic" title="Basic" class="md-nav__link">
|
||||||
|
Basic
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#from-stdin" title="From Stdin" class="md-nav__link">
|
||||||
|
From Stdin
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#splat" title="Splat" class="md-nav__link">
|
||||||
|
Splat
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#handling-in-the-yaml-key" title="Handling '.' in the yaml key" class="md-nav__link">
|
||||||
|
Handling '.' in the yaml key
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#arrays" title="Arrays" class="md-nav__link">
|
||||||
|
Arrays
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#array-splat" title="Array Splat" class="md-nav__link">
|
||||||
|
Array Splat
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-content">
|
||||||
|
<article class="md-content__inner md-typeset">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h1>Read</h1>
|
||||||
|
|
||||||
|
<pre><code>yaml r <yaml_file|json_file> <path>
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>This command can take a json file as input too, and will output yaml unless specified to export as json (-j)</p>
|
||||||
|
<h3 id="basic">Basic<a class="headerlink" href="#basic" title="Permanent link">¶</a></h3>
|
||||||
|
<p>Given a sample.yaml file of:</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
c: 2
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>then</p>
|
||||||
|
<pre><code class="bash">yaml r sample.yaml b.c
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output the value of '2'.</p>
|
||||||
|
<h3 id="from-stdin">From Stdin<a class="headerlink" href="#from-stdin" title="Permanent link">¶</a></h3>
|
||||||
|
<p>Given a sample.yaml file of:</p>
|
||||||
|
<pre><code class="bash">cat sample.yaml | yaml r - b.c
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output the value of '2'.</p>
|
||||||
|
<h3 id="splat">Splat<a class="headerlink" href="#splat" title="Permanent link">¶</a></h3>
|
||||||
|
<p>Given a sample.yaml file of:</p>
|
||||||
|
<pre><code class="yaml">---
|
||||||
|
bob:
|
||||||
|
item1:
|
||||||
|
cats: bananas
|
||||||
|
item2:
|
||||||
|
cats: apples
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>then</p>
|
||||||
|
<pre><code class="bash">yaml r sample.yaml bob.*.cats
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output</p>
|
||||||
|
<pre><code class="yaml">- bananas
|
||||||
|
- apples
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<h3 id="handling-in-the-yaml-key">Handling '.' in the yaml key<a class="headerlink" href="#handling-in-the-yaml-key" title="Permanent link">¶</a></h3>
|
||||||
|
<p>Given a sample.yaml file of:</p>
|
||||||
|
<pre><code class="yaml">b.x:
|
||||||
|
c: 2
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>then</p>
|
||||||
|
<pre><code class="bash">yaml r sample.yaml \"b.x\".c
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output the value of '2'.</p>
|
||||||
|
<h3 id="arrays">Arrays<a class="headerlink" href="#arrays" title="Permanent link">¶</a></h3>
|
||||||
|
<p>You can give an index to access a specific element:
|
||||||
|
e.g.: given a sample file of</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
e:
|
||||||
|
- name: fred
|
||||||
|
value: 3
|
||||||
|
- name: sam
|
||||||
|
value: 4
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>then</p>
|
||||||
|
<pre><code>yaml r sample.yaml b.e[1].name
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output 'sam'</p>
|
||||||
|
<h3 id="array-splat">Array Splat<a class="headerlink" href="#array-splat" title="Permanent link">¶</a></h3>
|
||||||
|
<p>e.g.: given a sample file of</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
e:
|
||||||
|
- name: fred
|
||||||
|
value: 3
|
||||||
|
- name: sam
|
||||||
|
value: 4
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>then</p>
|
||||||
|
<pre><code>yaml r sample.yaml b.e[*].name
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output:</p>
|
||||||
|
<pre><code>- fred
|
||||||
|
- sam
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
|
||||||
|
<footer class="md-footer">
|
||||||
|
|
||||||
|
<div class="md-footer-nav">
|
||||||
|
<nav class="md-footer-nav__inner md-grid">
|
||||||
|
|
||||||
|
<a href=".." title="Install" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
|
||||||
|
<span class="md-flex__ellipsis">
|
||||||
|
<span class="md-footer-nav__direction">
|
||||||
|
Previous
|
||||||
|
</span>
|
||||||
|
Install
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
<a href="../write/" title="Write/Update" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
|
||||||
|
<span class="md-flex__ellipsis">
|
||||||
|
<span class="md-footer-nav__direction">
|
||||||
|
Next
|
||||||
|
</span>
|
||||||
|
Write/Update
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-footer-meta md-typeset">
|
||||||
|
<div class="md-footer-meta__inner md-grid">
|
||||||
|
<div class="md-footer-copyright">
|
||||||
|
|
||||||
|
powered by
|
||||||
|
<a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
|
||||||
|
and
|
||||||
|
<a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
|
||||||
|
Material for MkDocs</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-footer-social">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah" class="md-footer-social__link fa fa-github"></a>
|
||||||
|
|
||||||
|
<a href="https://www.linkedin.com/in/mike-farah-b5a75b2/" class="md-footer-social__link fa fa-linkedin"></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../assets/javascripts/application-0b7df094bf.js"></script>
|
||||||
|
<script>app.initialize({url:{base:".."}})</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
44
docs/sitemap.xml
Normal file
44
docs/sitemap.xml
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
|
|
||||||
|
|
||||||
|
<url>
|
||||||
|
<loc>/</loc>
|
||||||
|
<lastmod>2017-05-03</lastmod>
|
||||||
|
<changefreq>daily</changefreq>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<url>
|
||||||
|
<loc>/read/</loc>
|
||||||
|
<lastmod>2017-05-03</lastmod>
|
||||||
|
<changefreq>daily</changefreq>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<url>
|
||||||
|
<loc>/write/</loc>
|
||||||
|
<lastmod>2017-05-03</lastmod>
|
||||||
|
<changefreq>daily</changefreq>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<url>
|
||||||
|
<loc>/create/</loc>
|
||||||
|
<lastmod>2017-05-03</lastmod>
|
||||||
|
<changefreq>daily</changefreq>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<url>
|
||||||
|
<loc>/convert/</loc>
|
||||||
|
<lastmod>2017-05-03</lastmod>
|
||||||
|
<changefreq>daily</changefreq>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
|
||||||
|
</urlset>
|
558
docs/write/index.html
Normal file
558
docs/write/index.html
Normal file
@ -0,0 +1,558 @@
|
|||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="no-js">
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="shortcut icon" href="../assets/images/favicon.png">
|
||||||
|
|
||||||
|
<meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.5.4">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<title>Write/Update - Yaml</title>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="../assets/javascripts/modernizr-56ade86843.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="../assets/stylesheets/application-b1a1975878.css">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
|
||||||
|
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<svg class="md-svg">
|
||||||
|
<defs>
|
||||||
|
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
|
||||||
|
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
|
||||||
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
|
||||||
|
<label class="md-overlay" data-md-component="overlay" for="drawer"></label>
|
||||||
|
|
||||||
|
<header class="md-header" data-md-component="header">
|
||||||
|
<nav class="md-header-nav md-grid">
|
||||||
|
<div class="md-flex">
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
|
||||||
|
<a href=".." title="Yaml" class="md-icon md-icon--home md-header-nav__button">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch">
|
||||||
|
<span class="md-flex__ellipsis md-header-nav__title">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Write/Update
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
|
||||||
|
<label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
|
||||||
|
|
||||||
|
<div class="md-search" data-md-component="search">
|
||||||
|
<div class="md-search__overlay"></div>
|
||||||
|
<div class="md-search__inner">
|
||||||
|
<form class="md-search__form" name="search">
|
||||||
|
<input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
|
||||||
|
<label class="md-icon md-search__icon" for="search"></label>
|
||||||
|
<button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
|
||||||
|
</form>
|
||||||
|
<div class="md-search__output">
|
||||||
|
<div class="md-search__scrollwrap" data-md-scrollfix>
|
||||||
|
<div class="md-search-result" data-md-component="result">
|
||||||
|
<div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
|
||||||
|
Type to start searching
|
||||||
|
</div>
|
||||||
|
<ol class="md-search-result__list"></ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<div class="md-header-nav__source">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah/yaml" title="Go to repository" class="md-source" data-md-source="github">
|
||||||
|
|
||||||
|
<div class="md-source__icon">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<use xlink:href="#github" width="24" height="24"></use>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-source__repository">
|
||||||
|
mikefarah/yaml
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="md-container">
|
||||||
|
|
||||||
|
|
||||||
|
<main class="md-main">
|
||||||
|
<div class="md-main__inner md-grid" data-md-component="container">
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
<nav class="md-nav md-nav--primary" data-md-level="0">
|
||||||
|
<label class="md-nav__title md-nav__title--site" for="drawer">
|
||||||
|
|
||||||
|
<i class="md-icon md-icon--home md-nav__button"></i>
|
||||||
|
|
||||||
|
Yaml
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="md-nav__source">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah/yaml" title="Go to repository" class="md-source" data-md-source="github">
|
||||||
|
|
||||||
|
<div class="md-source__icon">
|
||||||
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
||||||
|
<use xlink:href="#github" width="24" height="24"></use>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-source__repository">
|
||||||
|
mikefarah/yaml
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href=".." title="Install" class="md-nav__link">
|
||||||
|
Install
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../read/" title="Read" class="md-nav__link">
|
||||||
|
Read
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--active">
|
||||||
|
|
||||||
|
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link md-nav__link--active" for="toc">
|
||||||
|
Write/Update
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<a href="./" title="Write/Update" class="md-nav__link md-nav__link--active">
|
||||||
|
Write/Update
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--secondary">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__title" for="toc">Table of contents</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#to-stdout" title="To Stdout" class="md-nav__link">
|
||||||
|
To Stdout
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#from-stdin" title="From STDIN" class="md-nav__link">
|
||||||
|
From STDIN
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#adding-new-fields" title="Adding new fields" class="md-nav__link">
|
||||||
|
Adding new fields
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#updating-files-in-place" title="Updating files in-place" class="md-nav__link">
|
||||||
|
Updating files in-place
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#updating-multiple-values-with-a-script" title="Updating multiple values with a script" class="md-nav__link">
|
||||||
|
Updating multiple values with a script
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#values-starting-with-a-hyphen-or-dash" title="Values starting with a hyphen (or dash)" class="md-nav__link">
|
||||||
|
Values starting with a hyphen (or dash)
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../create/" title="Create" class="md-nav__link">
|
||||||
|
Create
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="../convert/" title="Convert" class="md-nav__link">
|
||||||
|
Convert
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--secondary">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__title" for="toc">Table of contents</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#to-stdout" title="To Stdout" class="md-nav__link">
|
||||||
|
To Stdout
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#from-stdin" title="From STDIN" class="md-nav__link">
|
||||||
|
From STDIN
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#adding-new-fields" title="Adding new fields" class="md-nav__link">
|
||||||
|
Adding new fields
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#updating-files-in-place" title="Updating files in-place" class="md-nav__link">
|
||||||
|
Updating files in-place
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#updating-multiple-values-with-a-script" title="Updating multiple values with a script" class="md-nav__link">
|
||||||
|
Updating multiple values with a script
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="#values-starting-with-a-hyphen-or-dash" title="Values starting with a hyphen (or dash)" class="md-nav__link">
|
||||||
|
Values starting with a hyphen (or dash)
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-content">
|
||||||
|
<article class="md-content__inner md-typeset">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h1>Write/Update</h1>
|
||||||
|
|
||||||
|
<pre><code>yaml w <yaml_file|json_file> <path> <new value>
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>This command can take a json file as input too, and will output yaml unless specified to export as json (-j)</p>
|
||||||
|
<h3 id="to-stdout">To Stdout<a class="headerlink" href="#to-stdout" title="Permanent link">¶</a></h3>
|
||||||
|
<p>Given a sample.yaml file of:</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
c: 2
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>then</p>
|
||||||
|
<pre><code class="bash">yaml w sample.yaml b.c cat
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output:</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
c: cat
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<h3 id="from-stdin">From STDIN<a class="headerlink" href="#from-stdin" title="Permanent link">¶</a></h3>
|
||||||
|
<pre><code class="bash">cat sample.yaml | yaml w - b.c blah
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<h3 id="adding-new-fields">Adding new fields<a class="headerlink" href="#adding-new-fields" title="Permanent link">¶</a></h3>
|
||||||
|
<p>Any missing fields in the path will be created on the fly.</p>
|
||||||
|
<p>Given a sample.yaml file of:</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
c: 2
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>then</p>
|
||||||
|
<pre><code class="bash">yaml w sample.yaml b.d[0] "new thing"
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output:</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
c: cat
|
||||||
|
d:
|
||||||
|
- new thing
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<h3 id="updating-files-in-place">Updating files in-place<a class="headerlink" href="#updating-files-in-place" title="Permanent link">¶</a></h3>
|
||||||
|
<p>Given a sample.yaml file of:</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
c: 2
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>then</p>
|
||||||
|
<pre><code class="bash">yaml w -i sample.yaml b.c cat
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will update the sample.yaml file so that the value of 'c' is cat.</p>
|
||||||
|
<h3 id="updating-multiple-values-with-a-script">Updating multiple values with a script<a class="headerlink" href="#updating-multiple-values-with-a-script" title="Permanent link">¶</a></h3>
|
||||||
|
<p>Given a sample.yaml file of:</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
c: 2
|
||||||
|
e:
|
||||||
|
- name: Billy Bob
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>and a script update_instructions.yaml of:</p>
|
||||||
|
<pre><code class="yaml">b.c: 3
|
||||||
|
b.e[0].name: Howdy Partner
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>then</p>
|
||||||
|
<pre><code class="bash">yaml w -s update_instructions.yaml sample.yaml
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output:</p>
|
||||||
|
<pre><code class="yaml">b:
|
||||||
|
c: 3
|
||||||
|
e:
|
||||||
|
- name: Howdy Partner
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>And, of course, you can pipe the instructions in using '-':</p>
|
||||||
|
<pre><code class="bash">cat update_instructions.yaml | yaml w -s - sample.yaml
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<h3 id="values-starting-with-a-hyphen-or-dash">Values starting with a hyphen (or dash)<a class="headerlink" href="#values-starting-with-a-hyphen-or-dash" title="Permanent link">¶</a></h3>
|
||||||
|
<p>The flag terminator needs to be used to stop the app from attempting to parse the subsequent arguments as flags:</p>
|
||||||
|
<pre><code>yaml w -- my.path -3
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
<p>will output</p>
|
||||||
|
<pre><code class="yaml">my:
|
||||||
|
path: -3
|
||||||
|
</code></pre>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
|
||||||
|
<footer class="md-footer">
|
||||||
|
|
||||||
|
<div class="md-footer-nav">
|
||||||
|
<nav class="md-footer-nav__inner md-grid">
|
||||||
|
|
||||||
|
<a href="../read/" title="Read" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
|
||||||
|
<span class="md-flex__ellipsis">
|
||||||
|
<span class="md-footer-nav__direction">
|
||||||
|
Previous
|
||||||
|
</span>
|
||||||
|
Read
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
<a href="../create/" title="Create" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
|
||||||
|
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
|
||||||
|
<span class="md-flex__ellipsis">
|
||||||
|
<span class="md-footer-nav__direction">
|
||||||
|
Next
|
||||||
|
</span>
|
||||||
|
Create
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex__cell md-flex__cell--shrink">
|
||||||
|
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-footer-meta md-typeset">
|
||||||
|
<div class="md-footer-meta__inner md-grid">
|
||||||
|
<div class="md-footer-copyright">
|
||||||
|
|
||||||
|
powered by
|
||||||
|
<a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
|
||||||
|
and
|
||||||
|
<a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
|
||||||
|
Material for MkDocs</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-footer-social">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
|
||||||
|
<a href="https://github.com/mikefarah" class="md-footer-social__link fa fa-github"></a>
|
||||||
|
|
||||||
|
<a href="https://www.linkedin.com/in/mike-farah-b5a75b2/" class="md-footer-social__link fa fa-linkedin"></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../assets/javascripts/application-0b7df094bf.js"></script>
|
||||||
|
<script>app.initialize({url:{base:".."}})</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
- become: true
|
|
||||||
gather_facts: false
|
|
||||||
hosts: lalaland
|
|
||||||
name: "Apply smth"
|
|
||||||
roles:
|
|
||||||
- lala
|
|
||||||
- land
|
|
||||||
serial: 1
|
|
||||||
- become: false
|
|
||||||
gather_facts: true
|
|
@ -1,8 +0,0 @@
|
|||||||
b:
|
|
||||||
d: be gone
|
|
||||||
c: 2
|
|
||||||
e:
|
|
||||||
- name: Billy Bob # comment over here
|
|
||||||
|
|
||||||
---
|
|
||||||
[123123
|
|
@ -1,4 +0,0 @@
|
|||||||
a: simple
|
|
||||||
b: [1, 2]
|
|
||||||
c:
|
|
||||||
test: 1
|
|
@ -1,6 +0,0 @@
|
|||||||
a:
|
|
||||||
key1: "value1"
|
|
||||||
key2: 2.6
|
|
||||||
ab:
|
|
||||||
key1: 6
|
|
||||||
key2: "h"
|
|
@ -1,7 +0,0 @@
|
|||||||
a: other # better than the original
|
|
||||||
b: [3, 4]
|
|
||||||
c:
|
|
||||||
toast: leave
|
|
||||||
test: 1
|
|
||||||
tell: 1
|
|
||||||
tasty.taco: cool
|
|
@ -1,4 +0,0 @@
|
|||||||
a: "simple" # just the best
|
|
||||||
b: [1, 3]
|
|
||||||
c:
|
|
||||||
test: 1
|
|
@ -1,2 +0,0 @@
|
|||||||
# a: apple
|
|
||||||
# b: cat
|
|
@ -1,7 +0,0 @@
|
|||||||
- command: update
|
|
||||||
path: b.c
|
|
||||||
value:
|
|
||||||
#great
|
|
||||||
things: frog # wow!
|
|
||||||
- command: delete
|
|
||||||
path: b.d
|
|
@ -1,19 +0,0 @@
|
|||||||
foo: &foo
|
|
||||||
a: foo_a
|
|
||||||
thing: foo_thing
|
|
||||||
c: foo_c
|
|
||||||
|
|
||||||
bar: &bar
|
|
||||||
b: bar_b
|
|
||||||
thing: bar_thing
|
|
||||||
c: bar_c
|
|
||||||
|
|
||||||
foobarList:
|
|
||||||
b: foobarList_b
|
|
||||||
<<: [*foo,*bar]
|
|
||||||
c: foobarList_c
|
|
||||||
|
|
||||||
foobar:
|
|
||||||
c: foobar_c
|
|
||||||
<<: *foo
|
|
||||||
thing: foobar_thing
|
|
@ -1,5 +0,0 @@
|
|||||||
test: |
|
|
||||||
abcdefg
|
|
||||||
hijklmno
|
|
||||||
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
commonKey: first document
|
|
||||||
a: Easy! as one two three
|
|
||||||
b:
|
|
||||||
c: 2
|
|
||||||
d: [3, 4]
|
|
||||||
e:
|
|
||||||
- name: fred
|
|
||||||
value: 3
|
|
||||||
- name: sam
|
|
||||||
value: 4
|
|
||||||
---
|
|
||||||
commonKey: second document
|
|
||||||
another:
|
|
||||||
document: here
|
|
||||||
---
|
|
||||||
commonKey: third document
|
|
||||||
wow:
|
|
||||||
- here is another
|
|
@ -1,7 +0,0 @@
|
|||||||
a: Easy! as one two three
|
|
||||||
---
|
|
||||||
another:
|
|
||||||
document: here
|
|
||||||
---
|
|
||||||
- 1
|
|
||||||
- 2
|
|
@ -1,2 +0,0 @@
|
|||||||
5:
|
|
||||||
6: camel!
|
|
@ -1 +0,0 @@
|
|||||||
{"a":"Easy! as one two three","b":{"c":2,"d":[3,4],"e":[{"name":"fred","value":3},{"name":"sam","value":4}]},"ab":"must appear last"}
|
|
@ -1,2 +0,0 @@
|
|||||||
- 4
|
|
||||||
- 5
|
|
@ -1,5 +0,0 @@
|
|||||||
foo:
|
|
||||||
a: 1
|
|
||||||
|
|
||||||
foobar:
|
|
||||||
a: 1
|
|
@ -1,5 +0,0 @@
|
|||||||
foo: &foo
|
|
||||||
a: 1
|
|
||||||
|
|
||||||
foobar:
|
|
||||||
<<: *foo
|
|
@ -1,5 +0,0 @@
|
|||||||
FROM mikefarah/yq:4.9.3
|
|
||||||
|
|
||||||
COPY entrypoint.sh /entrypoint.sh
|
|
||||||
|
|
||||||
ENTRYPOINT ["/entrypoint.sh"]
|
|
@ -1,4 +0,0 @@
|
|||||||
#!/bin/sh -l
|
|
||||||
|
|
||||||
echo "$1"
|
|
||||||
eval $1
|
|
16
go.mod
16
go.mod
@ -1,16 +0,0 @@
|
|||||||
module github.com/mikefarah/yq/v4
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/elliotchance/orderedmap v1.4.0
|
|
||||||
github.com/fatih/color v1.10.0
|
|
||||||
github.com/goccy/go-yaml v1.8.9
|
|
||||||
github.com/jinzhu/copier v0.2.8
|
|
||||||
github.com/spf13/cobra v1.1.3
|
|
||||||
github.com/timtadh/data-structures v0.5.3 // indirect
|
|
||||||
github.com/timtadh/lexmachine v0.2.2
|
|
||||||
golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e // indirect
|
|
||||||
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
|
||||||
)
|
|
||||||
|
|
||||||
go 1.15
|
|
328
go.sum
328
go.sum
@ -1,328 +0,0 @@
|
|||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
|
||||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
|
||||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
|
||||||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
|
||||||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
|
||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
|
||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
|
||||||
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
|
|
||||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
|
||||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
|
||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
|
||||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
|
|
||||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
|
||||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
|
||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
|
||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
|
||||||
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
|
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
|
||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
|
||||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
|
||||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
|
||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
|
||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
|
||||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
|
||||||
github.com/elliotchance/orderedmap v1.4.0 h1:wZtfeEONCbx6in1CZyE6bELEt/vFayMvsxqI5SgsR+A=
|
|
||||||
github.com/elliotchance/orderedmap v1.4.0/go.mod h1:wsDwEaX5jEoyhbs7x93zk2H/qv0zwuhg4inXhDkYqys=
|
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
|
||||||
github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg=
|
|
||||||
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
|
||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
|
||||||
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
|
||||||
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
|
|
||||||
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
|
|
||||||
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
|
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
|
||||||
github.com/goccy/go-yaml v1.8.9 h1:4AEXg2qx+/w29jXnXpMY6mTckmYu1TMoHteKuMf0HFg=
|
|
||||||
github.com/goccy/go-yaml v1.8.9/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA=
|
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
|
||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
|
||||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
|
||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
|
||||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
|
||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
|
||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
|
||||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
|
||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
|
||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
|
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
|
||||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
|
|
||||||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
|
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
|
||||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
|
||||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
|
|
||||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
|
|
||||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
|
|
||||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
|
|
||||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
|
||||||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
|
||||||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
|
||||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
|
||||||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
|
||||||
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
|
|
||||||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
|
|
||||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
|
||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
|
||||||
github.com/jinzhu/copier v0.2.8 h1:N8MbL5niMwE3P4dOwurJixz5rMkKfujmMRFmAanSzWE=
|
|
||||||
github.com/jinzhu/copier v0.2.8/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro=
|
|
||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
|
||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
|
||||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
|
||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
|
||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
|
||||||
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
|
|
||||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
|
||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
|
||||||
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
|
|
||||||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
|
||||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
|
||||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
|
|
||||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
|
||||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
|
|
||||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
|
||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
|
||||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
|
|
||||||
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
|
|
||||||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
|
||||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
|
||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
|
||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
|
||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
|
||||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
|
|
||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
|
||||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
|
||||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
|
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
|
||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
|
||||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
|
||||||
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
|
||||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
|
||||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
|
|
||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
|
|
||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
|
||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
|
||||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
|
|
||||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
|
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
|
||||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
|
||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
|
||||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
|
||||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
|
||||||
github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M=
|
|
||||||
github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
|
|
||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
|
||||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
|
||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
|
||||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
|
||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
|
||||||
github.com/timtadh/data-structures v0.5.3 h1:F2tEjoG9qWIyUjbvXVgJqEOGJPMIiYn7U5W5mE+i/vQ=
|
|
||||||
github.com/timtadh/data-structures v0.5.3/go.mod h1:9R4XODhJ8JdWFEI8P/HJKqxuJctfBQw6fDibMQny2oU=
|
|
||||||
github.com/timtadh/lexmachine v0.2.2 h1:g55RnjdYazm5wnKv59pwFcBJHOyvTPfDEoz21s4PHmY=
|
|
||||||
github.com/timtadh/lexmachine v0.2.2/go.mod h1:GBJvD5OAfRn/gnp92zb9KTgHLB7akKyxmVivoYCcjQI=
|
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
|
||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
|
||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
|
||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
|
||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
|
||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
|
||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
|
||||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
|
||||||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
|
||||||
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
|
||||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
|
||||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
|
||||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
|
||||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
|
||||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
|
||||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e h1:XNp2Flc/1eWQGk5BLzqTAN7fQIwIbfyVTuVxXxZh73M=
|
|
||||||
golang.org/x/sys v0.0.0-20210317225723-c4fcb01b228e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
|
||||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
|
||||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
|
||||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
|
||||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
|
||||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
|
||||||
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
|
||||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
|
||||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
|
||||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
|
||||||
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
|
||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
|
||||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|
||||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
|
||||||
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE=
|
|
||||||
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog=
|
|
||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
|
|
||||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
|
|
||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
|
||||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
|
||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
|
2
instruction_sample.yaml
Normal file
2
instruction_sample.yaml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
b.c: cat
|
||||||
|
b.e[0].name: Mike Farah
|
35
json_converter.go
Normal file
35
json_converter.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
func jsonToString(context interface{}) string {
|
||||||
|
out, err := json.Marshal(toJSON(context))
|
||||||
|
if err != nil {
|
||||||
|
die("error printing yaml as json: ", err)
|
||||||
|
}
|
||||||
|
return string(out)
|
||||||
|
}
|
||||||
|
|
||||||
|
func toJSON(context interface{}) interface{} {
|
||||||
|
switch context.(type) {
|
||||||
|
case []interface{}:
|
||||||
|
oldArray := context.([]interface{})
|
||||||
|
newArray := make([]interface{}, len(oldArray))
|
||||||
|
for index, value := range oldArray {
|
||||||
|
newArray[index] = toJSON(value)
|
||||||
|
}
|
||||||
|
return newArray
|
||||||
|
case yaml.MapSlice:
|
||||||
|
oldMap := context.(yaml.MapSlice)
|
||||||
|
newMap := make(map[string]interface{})
|
||||||
|
for _, entry := range oldMap {
|
||||||
|
newMap[entry.Key.(string)] = toJSON(entry.Value)
|
||||||
|
}
|
||||||
|
return newMap
|
||||||
|
default:
|
||||||
|
return context
|
||||||
|
}
|
||||||
|
}
|
24
json_converter_test.go
Normal file
24
json_converter_test.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestJsonToString(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
---
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
`)
|
||||||
|
assertResult(t, "{\"b\":{\"c\":2}}", jsonToString(data))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestJsonToString_withArray(t *testing.T) {
|
||||||
|
var data = parseData(`
|
||||||
|
---
|
||||||
|
b:
|
||||||
|
- item: one
|
||||||
|
- item: two
|
||||||
|
`)
|
||||||
|
assertResult(t, "{\"b\":[{\"item\":\"one\"},{\"item\":\"two\"}]}", jsonToString(data))
|
||||||
|
}
|
23
mkdocs.yml
23
mkdocs.yml
@ -1,7 +1,24 @@
|
|||||||
docs_dir: mkdocs
|
docs_dir: mkdocs
|
||||||
site_dir: docs
|
site_dir: docs
|
||||||
site_name: Yq
|
site_name: Yaml
|
||||||
theme: 'material'
|
theme: 'material'
|
||||||
repo_name: 'mikefarah/yq'
|
pages:
|
||||||
repo_url: 'https://github.com/mikefarah/yq'
|
- Install: index.md
|
||||||
|
- Read: read.md
|
||||||
|
- Write/Update: write.md
|
||||||
|
- Create: create.md
|
||||||
|
- Convert: convert.md
|
||||||
|
repo_name: 'mikefarah/yaml'
|
||||||
|
repo_url: 'https://github.com/mikefarah/yaml'
|
||||||
|
|
||||||
|
extra:
|
||||||
|
social:
|
||||||
|
- type: 'github'
|
||||||
|
link: 'https://github.com/mikefarah'
|
||||||
|
- type: 'linkedin'
|
||||||
|
link: 'https://www.linkedin.com/in/mike-farah-b5a75b2/'
|
||||||
|
|
||||||
|
markdown_extensions:
|
||||||
|
- markdown_include.include:
|
||||||
|
base_path: mkdocs
|
||||||
|
- toc(permalink=true)
|
40
mkdocs/convert.md
Normal file
40
mkdocs/convert.md
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
### Yaml to Json
|
||||||
|
To convert output to json, use the --tojson (or -j) flag. This can be used with any command.
|
||||||
|
|
||||||
|
Given a sample.yaml file of:
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```bash
|
||||||
|
yaml r -j sample.yaml b.c
|
||||||
|
```
|
||||||
|
|
||||||
|
will output
|
||||||
|
```json
|
||||||
|
{"b":{"c":2}}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Json to Yaml
|
||||||
|
To read in json, just pass in a json file instead of yaml, it will just work :)
|
||||||
|
|
||||||
|
e.g given a json file
|
||||||
|
|
||||||
|
```json
|
||||||
|
{"a":"Easy! as one two three","b":{"c":2,"d":[3,4]}}
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```bash
|
||||||
|
yaml r sample.json
|
||||||
|
```
|
||||||
|
will output
|
||||||
|
```yaml
|
||||||
|
a: Easy! as one two three
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
d:
|
||||||
|
- 3
|
||||||
|
- 4
|
||||||
|
```
|
||||||
|
|
42
mkdocs/create.md
Normal file
42
mkdocs/create.md
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
Yaml files can be created using the 'new' command. This works in the same way as the write command, but you don't pass in an existing Yaml file.
|
||||||
|
|
||||||
|
```
|
||||||
|
yaml n <path> <new value>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Creating a simple yaml file
|
||||||
|
```bash
|
||||||
|
yaml n b.c cat
|
||||||
|
```
|
||||||
|
will output:
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
c: cat
|
||||||
|
```
|
||||||
|
|
||||||
|
### Creating using a create script
|
||||||
|
Create scripts follow the same format as the update scripts.
|
||||||
|
|
||||||
|
Given a script create_instructions.yaml of:
|
||||||
|
```yaml
|
||||||
|
b.c: 3
|
||||||
|
b.e[0].name: Howdy Partner
|
||||||
|
```
|
||||||
|
then
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yaml n -s create_instructions.yaml
|
||||||
|
```
|
||||||
|
will output:
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
c: 3
|
||||||
|
e:
|
||||||
|
- name: Howdy Partner
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also pipe the instructions in:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat create_instructions.yaml | yaml n -s -
|
||||||
|
```
|
16
mkdocs/index.md
Normal file
16
mkdocs/index.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# yaml
|
||||||
|
yaml is a lightweight and portable command-line YAML processor
|
||||||
|
|
||||||
|
The aim of the project is to be the [jq](https://github.com/stedolan/jq) or sed of yaml files.
|
||||||
|
|
||||||
|
### [download latest binary](https://github.com/mikefarah/yaml/releases/latest)
|
||||||
|
|
||||||
|
### get the source
|
||||||
|
```bash
|
||||||
|
go get github.com/mikefarah/yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
[.zip](https://github.com/mikefarah/yaml/zipball/master) or [tar.gz](https://github.com/mikefarah/yaml/tarball/master)
|
||||||
|
|
||||||
|
[View on GitHub](https://github.com/mikefarah/yaml)
|
||||||
|
|
93
mkdocs/read.md
Normal file
93
mkdocs/read.md
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
```
|
||||||
|
yaml r <yaml_file|json_file> <path>
|
||||||
|
```
|
||||||
|
|
||||||
|
{!snippets/works_with_json.md!}
|
||||||
|
|
||||||
|
### Basic
|
||||||
|
Given a sample.yaml file of:
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```bash
|
||||||
|
yaml r sample.yaml b.c
|
||||||
|
```
|
||||||
|
will output the value of '2'.
|
||||||
|
|
||||||
|
### From Stdin
|
||||||
|
Given a sample.yaml file of:
|
||||||
|
```bash
|
||||||
|
cat sample.yaml | yaml r - b.c
|
||||||
|
```
|
||||||
|
will output the value of '2'.
|
||||||
|
|
||||||
|
### Splat
|
||||||
|
Given a sample.yaml file of:
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
bob:
|
||||||
|
item1:
|
||||||
|
cats: bananas
|
||||||
|
item2:
|
||||||
|
cats: apples
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```bash
|
||||||
|
yaml r sample.yaml bob.*.cats
|
||||||
|
```
|
||||||
|
will output
|
||||||
|
```yaml
|
||||||
|
- bananas
|
||||||
|
- apples
|
||||||
|
```
|
||||||
|
|
||||||
|
### Handling '.' in the yaml key
|
||||||
|
Given a sample.yaml file of:
|
||||||
|
```yaml
|
||||||
|
b.x:
|
||||||
|
c: 2
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```bash
|
||||||
|
yaml r sample.yaml \"b.x\".c
|
||||||
|
```
|
||||||
|
will output the value of '2'.
|
||||||
|
|
||||||
|
### Arrays
|
||||||
|
You can give an index to access a specific element:
|
||||||
|
e.g.: given a sample file of
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
e:
|
||||||
|
- name: fred
|
||||||
|
value: 3
|
||||||
|
- name: sam
|
||||||
|
value: 4
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```
|
||||||
|
yaml r sample.yaml b.e[1].name
|
||||||
|
```
|
||||||
|
will output 'sam'
|
||||||
|
|
||||||
|
### Array Splat
|
||||||
|
e.g.: given a sample file of
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
e:
|
||||||
|
- name: fred
|
||||||
|
value: 3
|
||||||
|
- name: sam
|
||||||
|
value: 4
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```
|
||||||
|
yaml r sample.yaml b.e[*].name
|
||||||
|
```
|
||||||
|
will output:
|
||||||
|
```
|
||||||
|
- fred
|
||||||
|
- sam
|
||||||
|
```
|
1
mkdocs/snippets/works_with_json.md
Normal file
1
mkdocs/snippets/works_with_json.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
This command can take a json file as input too, and will output yaml unless specified to export as json (-j)
|
102
mkdocs/write.md
Normal file
102
mkdocs/write.md
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
```
|
||||||
|
yaml w <yaml_file|json_file> <path> <new value>
|
||||||
|
```
|
||||||
|
{!snippets/works_with_json.md!}
|
||||||
|
|
||||||
|
### To Stdout
|
||||||
|
Given a sample.yaml file of:
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```bash
|
||||||
|
yaml w sample.yaml b.c cat
|
||||||
|
```
|
||||||
|
will output:
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
c: cat
|
||||||
|
```
|
||||||
|
|
||||||
|
### From STDIN
|
||||||
|
```bash
|
||||||
|
cat sample.yaml | yaml w - b.c blah
|
||||||
|
```
|
||||||
|
|
||||||
|
### Adding new fields
|
||||||
|
Any missing fields in the path will be created on the fly.
|
||||||
|
|
||||||
|
Given a sample.yaml file of:
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```bash
|
||||||
|
yaml w sample.yaml b.d[0] "new thing"
|
||||||
|
```
|
||||||
|
will output:
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
c: cat
|
||||||
|
d:
|
||||||
|
- new thing
|
||||||
|
```
|
||||||
|
|
||||||
|
### Updating files in-place
|
||||||
|
Given a sample.yaml file of:
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```bash
|
||||||
|
yaml w -i sample.yaml b.c cat
|
||||||
|
```
|
||||||
|
will update the sample.yaml file so that the value of 'c' is cat.
|
||||||
|
|
||||||
|
|
||||||
|
### Updating multiple values with a script
|
||||||
|
Given a sample.yaml file of:
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
c: 2
|
||||||
|
e:
|
||||||
|
- name: Billy Bob
|
||||||
|
```
|
||||||
|
and a script update_instructions.yaml of:
|
||||||
|
```yaml
|
||||||
|
b.c: 3
|
||||||
|
b.e[0].name: Howdy Partner
|
||||||
|
```
|
||||||
|
then
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yaml w -s update_instructions.yaml sample.yaml
|
||||||
|
```
|
||||||
|
will output:
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
c: 3
|
||||||
|
e:
|
||||||
|
- name: Howdy Partner
|
||||||
|
```
|
||||||
|
|
||||||
|
And, of course, you can pipe the instructions in using '-':
|
||||||
|
```bash
|
||||||
|
cat update_instructions.yaml | yaml w -s - sample.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Values starting with a hyphen (or dash)
|
||||||
|
The flag terminator needs to be used to stop the app from attempting to parse the subsequent arguments as flags:
|
||||||
|
|
||||||
|
```
|
||||||
|
yaml w -- my.path -3
|
||||||
|
```
|
||||||
|
|
||||||
|
will output
|
||||||
|
```yaml
|
||||||
|
my:
|
||||||
|
path: -3
|
||||||
|
```
|
55
path_parser.go
Normal file
55
path_parser.go
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
func parsePath(path string) []string {
|
||||||
|
return parsePathAccum([]string{}, path)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parsePathAccum(paths []string, remaining string) []string {
|
||||||
|
head, tail := nextYamlPath(remaining)
|
||||||
|
if tail == "" {
|
||||||
|
return append(paths, head)
|
||||||
|
}
|
||||||
|
return parsePathAccum(append(paths, head), tail)
|
||||||
|
}
|
||||||
|
|
||||||
|
func nextYamlPath(path string) (pathElement string, remaining string) {
|
||||||
|
switch path[0] {
|
||||||
|
case '[':
|
||||||
|
// e.g [0].blah.cat -> we need to return "0" and "blah.cat"
|
||||||
|
return search(path[1:len(path)], []uint8{']'}, true)
|
||||||
|
case '"':
|
||||||
|
// e.g "a.b".blah.cat -> we need to return "a.b" and "blah.cat"
|
||||||
|
return search(path[1:len(path)], []uint8{'"'}, true)
|
||||||
|
default:
|
||||||
|
// e.g "a.blah.cat" -> return "a" and "blah.cat"
|
||||||
|
return search(path[0:len(path)], []uint8{'.', '['}, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func search(path string, matchingChars []uint8, skipNext bool) (pathElement string, remaining string) {
|
||||||
|
for i := 0; i < len(path); i++ {
|
||||||
|
var char = path[i]
|
||||||
|
if contains(matchingChars, char) {
|
||||||
|
var remainingStart = i + 1
|
||||||
|
if skipNext {
|
||||||
|
remainingStart = remainingStart + 1
|
||||||
|
} else if !skipNext && char != '.' {
|
||||||
|
remainingStart = i
|
||||||
|
}
|
||||||
|
if remainingStart > len(path) {
|
||||||
|
remainingStart = len(path)
|
||||||
|
}
|
||||||
|
return path[0:i], path[remainingStart:len(path)]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return path, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func contains(matchingChars []uint8, candidate uint8) bool {
|
||||||
|
for _, a := range matchingChars {
|
||||||
|
if a == candidate {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
42
path_parser_test.go
Normal file
42
path_parser_test.go
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
var parsePathsTests = []struct {
|
||||||
|
path string
|
||||||
|
expectedPaths []string
|
||||||
|
}{
|
||||||
|
{"a.b", []string{"a", "b"}},
|
||||||
|
{"a.b[0]", []string{"a", "b", "0"}},
|
||||||
|
}
|
||||||
|
|
||||||
|
func testParsePath(t *testing.T) {
|
||||||
|
for _, tt := range parsePathsTests {
|
||||||
|
assertResultWithContext(t, tt.expectedPaths, parsePath(tt.path), tt)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var nextYamlPathTests = []struct {
|
||||||
|
path string
|
||||||
|
expectedElement string
|
||||||
|
expectedRemaining string
|
||||||
|
}{
|
||||||
|
{"a.b", "a", "b"},
|
||||||
|
{"a", "a", ""},
|
||||||
|
{"a.b.c", "a", "b.c"},
|
||||||
|
{"\"a.b\".c", "a.b", "c"},
|
||||||
|
{"a.\"b.c\".d", "a", "\"b.c\".d"},
|
||||||
|
{"[1].a.d", "1", "a.d"},
|
||||||
|
{"a[0].c", "a", "[0].c"},
|
||||||
|
{"[0]", "0", ""},
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNextYamlPath(t *testing.T) {
|
||||||
|
for _, tt := range nextYamlPathTests {
|
||||||
|
var element, remaining = nextYamlPath(tt.path)
|
||||||
|
assertResultWithContext(t, tt.expectedElement, element, tt)
|
||||||
|
assertResultWithContext(t, tt.expectedRemaining, remaining, tt)
|
||||||
|
}
|
||||||
|
}
|
@ -1,70 +0,0 @@
|
|||||||
package yqlib
|
|
||||||
|
|
||||||
import (
|
|
||||||
"container/list"
|
|
||||||
|
|
||||||
yaml "gopkg.in/yaml.v3"
|
|
||||||
)
|
|
||||||
|
|
||||||
// A yaml expression evaluator that runs the expression once against all files/nodes in memory.
|
|
||||||
type Evaluator interface {
|
|
||||||
EvaluateFiles(expression string, filenames []string, printer Printer) error
|
|
||||||
|
|
||||||
// EvaluateNodes takes an expression and one or more yaml nodes, returning a list of matching candidate nodes
|
|
||||||
EvaluateNodes(expression string, nodes ...*yaml.Node) (*list.List, error)
|
|
||||||
|
|
||||||
// EvaluateCandidateNodes takes an expression and list of candidate nodes, returning a list of matching candidate nodes
|
|
||||||
EvaluateCandidateNodes(expression string, inputCandidateNodes *list.List) (*list.List, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type allAtOnceEvaluator struct {
|
|
||||||
treeNavigator DataTreeNavigator
|
|
||||||
treeCreator ExpressionParser
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewAllAtOnceEvaluator() Evaluator {
|
|
||||||
return &allAtOnceEvaluator{treeNavigator: NewDataTreeNavigator(), treeCreator: NewExpressionParser()}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *allAtOnceEvaluator) EvaluateNodes(expression string, nodes ...*yaml.Node) (*list.List, error) {
|
|
||||||
inputCandidates := list.New()
|
|
||||||
for _, node := range nodes {
|
|
||||||
inputCandidates.PushBack(&CandidateNode{Node: node})
|
|
||||||
}
|
|
||||||
return e.EvaluateCandidateNodes(expression, inputCandidates)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *allAtOnceEvaluator) EvaluateCandidateNodes(expression string, inputCandidates *list.List) (*list.List, error) {
|
|
||||||
node, err := e.treeCreator.ParseExpression(expression)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
context, err := e.treeNavigator.GetMatchingNodes(Context{MatchingNodes: inputCandidates}, node)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return context.MatchingNodes, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *allAtOnceEvaluator) EvaluateFiles(expression string, filenames []string, printer Printer) error {
|
|
||||||
fileIndex := 0
|
|
||||||
|
|
||||||
var allDocuments *list.List = list.New()
|
|
||||||
for _, filename := range filenames {
|
|
||||||
reader, err := readStream(filename)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fileDocuments, err := readDocuments(reader, filename, fileIndex)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
allDocuments.PushBackList(fileDocuments)
|
|
||||||
fileIndex = fileIndex + 1
|
|
||||||
}
|
|
||||||
matches, err := e.EvaluateCandidateNodes(expression, allDocuments)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return printer.PrintResults(matches)
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
package yqlib
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/mikefarah/yq/v4/test"
|
|
||||||
)
|
|
||||||
|
|
||||||
var evaluateNodesScenario = []expressionScenario{
|
|
||||||
{
|
|
||||||
document: `a: hello`,
|
|
||||||
expression: `.a`,
|
|
||||||
expected: []string{
|
|
||||||
"D0, P[a], (!!str)::hello\n",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
document: `a: hello`,
|
|
||||||
expression: `.`,
|
|
||||||
expected: []string{
|
|
||||||
"D0, P[], (doc)::a: hello\n",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
document: `- a: "yes"`,
|
|
||||||
expression: `.[] | has("a")`,
|
|
||||||
expected: []string{
|
|
||||||
"D0, P[0], (!!bool)::true\n",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestAllAtOnceEvaluateNodes(t *testing.T) {
|
|
||||||
var evaluator = NewAllAtOnceEvaluator()
|
|
||||||
for _, tt := range evaluateNodesScenario {
|
|
||||||
node := test.ParseData(tt.document)
|
|
||||||
list, _ := evaluator.EvaluateNodes(tt.expression, &node)
|
|
||||||
test.AssertResultComplex(t, tt.expected, resultsToString(list))
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,101 +0,0 @@
|
|||||||
package yqlib
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/jinzhu/copier"
|
|
||||||
yaml "gopkg.in/yaml.v3"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CandidateNode struct {
|
|
||||||
Node *yaml.Node // the actual node
|
|
||||||
Parent *CandidateNode // parent node
|
|
||||||
Path []interface{} /// the path we took to get to this node
|
|
||||||
Document uint // the document index of this node
|
|
||||||
Filename string
|
|
||||||
FileIndex int
|
|
||||||
// when performing op against all nodes given, this will treat all the nodes as one
|
|
||||||
// (e.g. top level cross document merge). This property does not propegate to child nodes.
|
|
||||||
EvaluateTogether bool
|
|
||||||
IsMapKey bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *CandidateNode) GetKey() string {
|
|
||||||
keyPrefix := ""
|
|
||||||
if n.IsMapKey {
|
|
||||||
keyPrefix = "key-"
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("%v%v - %v", keyPrefix, n.Document, n.Path)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *CandidateNode) CreateChild(path interface{}, node *yaml.Node) *CandidateNode {
|
|
||||||
return &CandidateNode{
|
|
||||||
Node: node,
|
|
||||||
Path: n.createChildPath(path),
|
|
||||||
Parent: n,
|
|
||||||
Document: n.Document,
|
|
||||||
Filename: n.Filename,
|
|
||||||
FileIndex: n.FileIndex,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *CandidateNode) createChildPath(path interface{}) []interface{} {
|
|
||||||
if path == nil {
|
|
||||||
newPath := make([]interface{}, len(n.Path))
|
|
||||||
copy(newPath, n.Path)
|
|
||||||
return newPath
|
|
||||||
}
|
|
||||||
|
|
||||||
//don't use append as they may actually modify the path of the orignal node!
|
|
||||||
newPath := make([]interface{}, len(n.Path)+1)
|
|
||||||
copy(newPath, n.Path)
|
|
||||||
newPath[len(n.Path)] = path
|
|
||||||
return newPath
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *CandidateNode) Copy() (*CandidateNode, error) {
|
|
||||||
clone := &CandidateNode{}
|
|
||||||
err := copier.Copy(clone, n)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return clone, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// updates this candidate from the given candidate node
|
|
||||||
func (n *CandidateNode) UpdateFrom(other *CandidateNode) {
|
|
||||||
|
|
||||||
n.UpdateAttributesFrom(other)
|
|
||||||
n.Node.Content = other.Node.Content
|
|
||||||
n.Node.Value = other.Node.Value
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *CandidateNode) UpdateAttributesFrom(other *CandidateNode) {
|
|
||||||
log.Debug("UpdateAttributesFrom: n: %v other: %v", n.GetKey(), other.GetKey())
|
|
||||||
if n.Node.Kind != other.Node.Kind {
|
|
||||||
// clear out the contents when switching to a different type
|
|
||||||
// e.g. map to array
|
|
||||||
n.Node.Content = make([]*yaml.Node, 0)
|
|
||||||
n.Node.Value = ""
|
|
||||||
}
|
|
||||||
n.Node.Kind = other.Node.Kind
|
|
||||||
n.Node.Tag = other.Node.Tag
|
|
||||||
n.Node.Alias = other.Node.Alias
|
|
||||||
n.Node.Anchor = other.Node.Anchor
|
|
||||||
|
|
||||||
// merge will pickup the style of the new thing
|
|
||||||
// when autocreating nodes
|
|
||||||
if n.Node.Style == 0 {
|
|
||||||
n.Node.Style = other.Node.Style
|
|
||||||
}
|
|
||||||
|
|
||||||
if other.Node.FootComment != "" {
|
|
||||||
n.Node.FootComment = other.Node.FootComment
|
|
||||||
}
|
|
||||||
if other.Node.HeadComment != "" {
|
|
||||||
n.Node.HeadComment = other.Node.HeadComment
|
|
||||||
}
|
|
||||||
if other.Node.LineComment != "" {
|
|
||||||
n.Node.LineComment = other.Node.LineComment
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
package yqlib
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
|
|
||||||
"github.com/fatih/color"
|
|
||||||
"github.com/goccy/go-yaml/lexer"
|
|
||||||
"github.com/goccy/go-yaml/printer"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Thanks @risentveber!
|
|
||||||
|
|
||||||
const escape = "\x1b"
|
|
||||||
|
|
||||||
func format(attr color.Attribute) string {
|
|
||||||
return fmt.Sprintf("%s[%dm", escape, attr)
|
|
||||||
}
|
|
||||||
|
|
||||||
func colorizeAndPrint(yamlBytes []byte, writer io.Writer) error {
|
|
||||||
tokens := lexer.Tokenize(string(yamlBytes))
|
|
||||||
var p printer.Printer
|
|
||||||
p.Bool = func() *printer.Property {
|
|
||||||
return &printer.Property{
|
|
||||||
Prefix: format(color.FgHiMagenta),
|
|
||||||
Suffix: format(color.Reset),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p.Number = func() *printer.Property {
|
|
||||||
return &printer.Property{
|
|
||||||
Prefix: format(color.FgHiMagenta),
|
|
||||||
Suffix: format(color.Reset),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p.MapKey = func() *printer.Property {
|
|
||||||
return &printer.Property{
|
|
||||||
Prefix: format(color.FgCyan),
|
|
||||||
Suffix: format(color.Reset),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p.Anchor = func() *printer.Property {
|
|
||||||
return &printer.Property{
|
|
||||||
Prefix: format(color.FgHiYellow),
|
|
||||||
Suffix: format(color.Reset),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p.Alias = func() *printer.Property {
|
|
||||||
return &printer.Property{
|
|
||||||
Prefix: format(color.FgHiYellow),
|
|
||||||
Suffix: format(color.Reset),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
p.String = func() *printer.Property {
|
|
||||||
return &printer.Property{
|
|
||||||
Prefix: format(color.FgGreen),
|
|
||||||
Suffix: format(color.Reset),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err := writer.Write([]byte(p.PrintTokens(tokens) + "\n"))
|
|
||||||
return err
|
|
||||||
}
|
|
@ -1,68 +0,0 @@
|
|||||||
package yqlib
|
|
||||||
|
|
||||||
import (
|
|
||||||
"container/list"
|
|
||||||
|
|
||||||
"github.com/jinzhu/copier"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Context struct {
|
|
||||||
MatchingNodes *list.List
|
|
||||||
Variables map[string]*list.List
|
|
||||||
DontAutoCreate bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *Context) SingleReadonlyChildContext(candidate *CandidateNode) Context {
|
|
||||||
list := list.New()
|
|
||||||
list.PushBack(candidate)
|
|
||||||
newContext := n.ChildContext(list)
|
|
||||||
newContext.DontAutoCreate = true
|
|
||||||
return newContext
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *Context) SingleChildContext(candidate *CandidateNode) Context {
|
|
||||||
list := list.New()
|
|
||||||
list.PushBack(candidate)
|
|
||||||
return n.ChildContext(list)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *Context) GetVariable(name string) *list.List {
|
|
||||||
if n.Variables == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return n.Variables[name]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *Context) SetVariable(name string, value *list.List) {
|
|
||||||
if n.Variables == nil {
|
|
||||||
n.Variables = make(map[string]*list.List)
|
|
||||||
}
|
|
||||||
n.Variables[name] = value
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *Context) ChildContext(results *list.List) Context {
|
|
||||||
clone := Context{}
|
|
||||||
err := copier.Copy(&clone, n)
|
|
||||||
if err != nil {
|
|
||||||
log.Error("Error cloning context :(")
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
clone.MatchingNodes = results
|
|
||||||
return clone
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *Context) Clone() Context {
|
|
||||||
clone := Context{}
|
|
||||||
err := copier.Copy(&clone, n)
|
|
||||||
if err != nil {
|
|
||||||
log.Error("Error cloning context :(")
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return clone
|
|
||||||
}
|
|
||||||
|
|
||||||
func (n *Context) ReadOnlyClone() Context {
|
|
||||||
clone := n.Clone()
|
|
||||||
clone.DontAutoCreate = true
|
|
||||||
return clone
|
|
||||||
}
|
|
@ -1,41 +0,0 @@
|
|||||||
package yqlib
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
logging "gopkg.in/op/go-logging.v1"
|
|
||||||
)
|
|
||||||
|
|
||||||
type DataTreeNavigator interface {
|
|
||||||
// given the context and a expressionNode,
|
|
||||||
// this will process the against the given expressionNode and return
|
|
||||||
// a new context of matching candidates
|
|
||||||
GetMatchingNodes(context Context, expressionNode *ExpressionNode) (Context, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type dataTreeNavigator struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewDataTreeNavigator() DataTreeNavigator {
|
|
||||||
return &dataTreeNavigator{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *dataTreeNavigator) GetMatchingNodes(context Context, expressionNode *ExpressionNode) (Context, error) {
|
|
||||||
if expressionNode == nil {
|
|
||||||
log.Debugf("getMatchingNodes - nothing to do")
|
|
||||||
return context, nil
|
|
||||||
}
|
|
||||||
log.Debugf("Processing Op: %v", expressionNode.Operation.toString())
|
|
||||||
if log.IsEnabledFor(logging.DEBUG) {
|
|
||||||
for el := context.MatchingNodes.Front(); el != nil; el = el.Next() {
|
|
||||||
log.Debug(NodeToString(el.Value.(*CandidateNode)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.Debug(">>")
|
|
||||||
handler := expressionNode.Operation.OperationType.Handler
|
|
||||||
if handler != nil {
|
|
||||||
return handler(d, context, expressionNode)
|
|
||||||
}
|
|
||||||
return Context{}, fmt.Errorf("Unknown operator %v", expressionNode.Operation.OperationType)
|
|
||||||
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user