From 36a68ac52b730df58dd4002e0da307e4d1a091c5 Mon Sep 17 00:00:00 2001 From: Mark Mandel Date: Sat, 16 Jun 2018 17:58:40 -0700 Subject: [PATCH] Update dependencies to support K8s 1.10.x Keeping up with Kubernetes versions, as well as providing us the functionality to do SubResources. Also will enable tightening up of permissions re: #150 --- Gopkg.lock | 126 +- Gopkg.toml | 8 +- build/gke-test-cluster/cluster.yml.jinja | 2 +- install/README.md | 2 +- .../github.com/PuerkitoBio/purell/.gitignore | 5 - vendor/github.com/PuerkitoBio/purell/LICENSE | 12 - .../github.com/PuerkitoBio/purell/README.md | 187 - .../PuerkitoBio/purell/bench_test.go | 57 - .../PuerkitoBio/purell/benchmarks/v0.1.0 | 9 - .../PuerkitoBio/purell/example_test.go | 35 - .../github.com/PuerkitoBio/purell/purell.go | 379 - .../PuerkitoBio/purell/purell_test.go | 768 -- .../PuerkitoBio/purell/urlnorm_test.go | 53 - .../github.com/PuerkitoBio/urlesc/README.md | 16 - .../github.com/PuerkitoBio/urlesc/urlesc.go | 180 - .../PuerkitoBio/urlesc/urlesc_test.go | 641 -- .../github.com/emicklei/go-restful/.gitignore | 70 - .../github.com/emicklei/go-restful/CHANGES.md | 226 - vendor/github.com/emicklei/go-restful/LICENSE | 22 - .../github.com/emicklei/go-restful/Makefile | 7 - .../github.com/emicklei/go-restful/README.md | 75 - vendor/github.com/emicklei/go-restful/Srcfile | 1 - .../emicklei/go-restful/bench_curly_test.go | 51 - .../emicklei/go-restful/bench_test.go | 43 - .../emicklei/go-restful/bench_test.sh | 10 - .../emicklei/go-restful/compress.go | 123 - .../emicklei/go-restful/compress_test.go | 125 - .../emicklei/go-restful/compressor_cache.go | 103 - .../emicklei/go-restful/compressor_pools.go | 91 - .../emicklei/go-restful/compressors.go | 54 - .../emicklei/go-restful/constants.go | 30 - .../emicklei/go-restful/container.go | 366 - .../emicklei/go-restful/container_test.go | 83 - .../emicklei/go-restful/cors_filter.go | 202 - .../emicklei/go-restful/cors_filter_test.go | 129 - .../emicklei/go-restful/coverage.sh | 2 - .../github.com/emicklei/go-restful/curly.go | 164 - .../emicklei/go-restful/curly_route.go | 52 - .../emicklei/go-restful/curly_test.go | 231 - vendor/github.com/emicklei/go-restful/doc.go | 185 - .../emicklei/go-restful/doc_examples_test.go | 41 - .../emicklei/go-restful/entity_accessors.go | 163 - .../go-restful/entity_accessors_test.go | 69 - .../examples/google_app_engine/app.yaml | 20 - .../google_app_engine/datastore/app.yaml | 18 - .../google_app_engine/datastore/main.go | 267 - .../restful-appstats-integration.go | 12 - .../google_app_engine/restful-user-service.go | 162 - .../emicklei/go-restful/examples/home.html | 7 - .../examples/msgpack/msgpack_entity.go | 34 - .../examples/msgpack/msgpack_entity_test.go | 160 - .../examples/restful-CORS-filter.go | 68 - .../examples/restful-NCSA-logging.go | 54 - .../examples/restful-basic-authentication.go | 35 - .../examples/restful-cpuprofiler-service.go | 65 - .../examples/restful-curly-router.go | 107 - .../examples/restful-curly-router_test.go | 149 - .../examples/restful-encoding-filter.go | 61 - .../go-restful/examples/restful-filters.go | 114 - .../examples/restful-form-handling.go | 63 - .../examples/restful-hello-world.go | 23 - .../examples/restful-html-template.go | 35 - .../examples/restful-multi-containers.go | 43 - .../examples/restful-no-cache-filter.go | 25 - .../examples/restful-options-filter.go | 51 - .../go-restful/examples/restful-path-tail.go | 27 - .../examples/restful-pre-post-filters.go | 98 - .../examples/restful-resource-functions.go | 63 - .../go-restful/examples/restful-route_test.go | 39 - .../examples/restful-routefunction_test.go | 29 - .../examples/restful-serve-static.go | 47 - .../go-restful/examples/restful-swagger.go | 61 - .../examples/restful-user-resource.go | 170 - .../github.com/emicklei/go-restful/filter.go | 35 - .../emicklei/go-restful/filter_test.go | 141 - .../github.com/emicklei/go-restful/jsr311.go | 268 - .../emicklei/go-restful/jsr311_test.go | 251 - .../github.com/emicklei/go-restful/log/log.go | 34 - .../github.com/emicklei/go-restful/logger.go | 32 - vendor/github.com/emicklei/go-restful/mime.go | 45 - .../emicklei/go-restful/mime_test.go | 17 - .../emicklei/go-restful/options_filter.go | 34 - .../go-restful/options_filter_test.go | 34 - .../emicklei/go-restful/parameter.go | 114 - .../emicklei/go-restful/path_expression.go | 69 - .../go-restful/path_expression_test.go | 37 - .../github.com/emicklei/go-restful/request.go | 113 - .../emicklei/go-restful/request_test.go | 141 - .../emicklei/go-restful/response.go | 250 - .../emicklei/go-restful/response_test.go | 213 - .../github.com/emicklei/go-restful/route.go | 192 - .../emicklei/go-restful/route_builder.go | 310 - .../emicklei/go-restful/route_builder_test.go | 76 - .../emicklei/go-restful/route_test.go | 127 - .../github.com/emicklei/go-restful/router.go | 18 - .../emicklei/go-restful/service_error.go | 23 - .../emicklei/go-restful/tracer_test.go | 18 - .../emicklei/go-restful/web_service.go | 290 - .../go-restful/web_service_container.go | 39 - .../emicklei/go-restful/web_service_test.go | 343 - .../go-openapi/jsonpointer/.gitignore | 1 - .../go-openapi/jsonpointer/CODE_OF_CONDUCT.md | 74 - .../github.com/go-openapi/jsonpointer/LICENSE | 202 - .../go-openapi/jsonpointer/README.md | 15 - .../go-openapi/jsonpointer/pointer.go | 390 - .../go-openapi/jsonpointer/pointer_test.go | 573 -- .../go-openapi/jsonreference/.gitignore | 1 - .../jsonreference/CODE_OF_CONDUCT.md | 74 - .../go-openapi/jsonreference/LICENSE | 202 - .../go-openapi/jsonreference/README.md | 15 - .../go-openapi/jsonreference/reference.go | 156 - .../jsonreference/reference_test.go | 420 - vendor/github.com/go-openapi/spec/.gitignore | 2 - .../go-openapi/spec/CODE_OF_CONDUCT.md | 74 - vendor/github.com/go-openapi/spec/LICENSE | 202 - vendor/github.com/go-openapi/spec/README.md | 5 - .../github.com/go-openapi/spec/auth_test.go | 128 - vendor/github.com/go-openapi/spec/bindata.go | 260 - .../go-openapi/spec/contact_info.go | 24 - .../go-openapi/spec/contact_info_test.go | 37 - vendor/github.com/go-openapi/spec/expander.go | 908 --- .../go-openapi/spec/expander_test.go | 1162 --- .../go-openapi/spec/external_docs.go | 24 - .../go-openapi/spec/external_docs_test.go | 29 - .../fixtures/expansion/all-the-things.json | 254 - .../spec/fixtures/expansion/circularRefs.json | 54 - .../spec/fixtures/expansion/circularSpec.json | 1 - .../spec/fixtures/expansion/circularSpec.yaml | 67 - .../spec/fixtures/expansion/clickmeter.json | 1 - .../spec/fixtures/expansion/clickmeter.yaml | 6461 --------------- .../spec/fixtures/expansion/invalid-refs.json | 85 - .../fixtures/expansion/missingItemRef.json | 31 - .../spec/fixtures/expansion/missingRef.json | 165 - .../spec/fixtures/expansion/overflow.json | 124 - .../spec/fixtures/expansion/params.json | 25 - .../spec/fixtures/expansion/schemas1.json | 127 - .../spec/fixtures/expansion/schemas2.json | 161 - .../spec/fixtures/local_expansion/item.json | 18 - .../spec/fixtures/local_expansion/spec.json | 46 - .../spec/fixtures/specs/deeper/arrayProp.json | 6 - .../fixtures/specs/deeper/stringProp.json | 3 - .../go-openapi/spec/fixtures/specs/refed.json | 224 - .../spec/fixtures/specs/resolution.json | 14 - .../spec/fixtures/specs/resolution2.json | 9 - vendor/github.com/go-openapi/spec/header.go | 195 - .../github.com/go-openapi/spec/header_test.go | 90 - vendor/github.com/go-openapi/spec/info.go | 168 - .../github.com/go-openapi/spec/info_test.go | 65 - vendor/github.com/go-openapi/spec/items.go | 228 - .../github.com/go-openapi/spec/items_test.go | 81 - vendor/github.com/go-openapi/spec/license.go | 23 - .../go-openapi/spec/license_test.go | 28 - .../github.com/go-openapi/spec/operation.go | 233 - .../go-openapi/spec/operation_test.go | 85 - .../github.com/go-openapi/spec/parameter.go | 301 - .../go-openapi/spec/parameters_test.go | 156 - .../github.com/go-openapi/spec/path_item.go | 90 - .../go-openapi/spec/path_item_test.go | 81 - vendor/github.com/go-openapi/spec/paths.go | 97 - .../github.com/go-openapi/spec/paths_test.go | 43 - .../go-openapi/spec/properties_test.go | 58 - vendor/github.com/go-openapi/spec/ref.go | 164 - .../github.com/go-openapi/spec/refmodifier.go | 82 - .../go-openapi/spec/refmodifier_test.go | 335 - vendor/github.com/go-openapi/spec/response.go | 134 - .../go-openapi/spec/response_test.go | 53 - .../github.com/go-openapi/spec/responses.go | 122 - vendor/github.com/go-openapi/spec/schema.go | 628 -- .../github.com/go-openapi/spec/schema_test.go | 205 - .../spec/schemas/jsonschema-draft-04.json | 150 - .../go-openapi/spec/schemas/v2/README.md | 5 - .../go-openapi/spec/schemas/v2/schema.json | 1607 ---- .../go-openapi/spec/security_scheme.go | 142 - vendor/github.com/go-openapi/spec/spec.go | 86 - .../go-openapi/spec/structs_test.go | 110 - vendor/github.com/go-openapi/spec/swagger.go | 317 - .../go-openapi/spec/swagger_test.go | 365 - vendor/github.com/go-openapi/spec/tag.go | 73 - .../github.com/go-openapi/spec/xml_object.go | 68 - .../go-openapi/spec/xml_object_test.go | 65 - vendor/github.com/go-openapi/swag/.gitignore | 1 - .../go-openapi/swag/CODE_OF_CONDUCT.md | 74 - vendor/github.com/go-openapi/swag/LICENSE | 202 - vendor/github.com/go-openapi/swag/README.md | 12 - vendor/github.com/go-openapi/swag/convert.go | 188 - .../go-openapi/swag/convert_test.go | 215 - .../go-openapi/swag/convert_types.go | 595 -- .../go-openapi/swag/convert_types_test.go | 579 -- vendor/github.com/go-openapi/swag/json.go | 295 - .../github.com/go-openapi/swag/json_test.go | 163 - vendor/github.com/go-openapi/swag/loading.go | 74 - .../go-openapi/swag/loading_test.go | 47 - vendor/github.com/go-openapi/swag/net.go | 24 - vendor/github.com/go-openapi/swag/net_test.go | 30 - vendor/github.com/go-openapi/swag/path.go | 59 - .../github.com/go-openapi/swag/path_test.go | 118 - vendor/github.com/go-openapi/swag/util.go | 336 - .../github.com/go-openapi/swag/util_test.go | 277 - vendor/github.com/go-openapi/swag/yaml.go | 215 - .../github.com/go-openapi/swag/yaml_test.go | 444 -- vendor/github.com/google/btree/LICENSE | 202 - vendor/github.com/google/btree/README.md | 12 - vendor/github.com/google/btree/btree.go | 821 -- vendor/github.com/google/btree/btree_mem.go | 76 - vendor/github.com/google/btree/btree_test.go | 689 -- .../gregjones/httpcache/LICENSE.txt | 7 - .../github.com/gregjones/httpcache/README.md | 24 - .../httpcache/diskcache/diskcache.go | 61 - .../httpcache/diskcache/diskcache_test.go | 42 - .../gregjones/httpcache/httpcache.go | 557 -- .../gregjones/httpcache/httpcache_test.go | 1384 ---- .../httpcache/leveldbcache/leveldbcache.go | 51 - .../leveldbcache/leveldbcache_test.go | 46 - .../gregjones/httpcache/memcache/appengine.go | 61 - .../httpcache/memcache/appengine_test.go | 44 - .../gregjones/httpcache/memcache/memcache.go | 60 - .../httpcache/memcache/memcache_test.go | 47 - .../gregjones/httpcache/redis/redis.go | 43 - .../gregjones/httpcache/redis/redis_test.go | 43 - vendor/github.com/juju/ratelimit/LICENSE | 191 - vendor/github.com/juju/ratelimit/README.md | 117 - vendor/github.com/juju/ratelimit/ratelimit.go | 344 - .../juju/ratelimit/ratelimit_test.go | 396 - vendor/github.com/juju/ratelimit/reader.go | 51 - vendor/github.com/mailru/easyjson/.gitignore | 4 - vendor/github.com/mailru/easyjson/LICENSE | 7 - vendor/github.com/mailru/easyjson/Makefile | 56 - vendor/github.com/mailru/easyjson/README.md | 331 - .../mailru/easyjson/benchmark/codec_test.go | 279 - .../mailru/easyjson/benchmark/data.go | 148 - .../mailru/easyjson/benchmark/data_codec.go | 6914 ----------------- .../mailru/easyjson/benchmark/data_ffjson.go | 6723 ---------------- .../mailru/easyjson/benchmark/data_var.go | 350 - .../mailru/easyjson/benchmark/default_test.go | 118 - .../mailru/easyjson/benchmark/dummy_test.go | 11 - .../easyjson/benchmark/easyjson_test.go | 184 - .../mailru/easyjson/benchmark/example.json | 415 - .../mailru/easyjson/benchmark/ffjson_test.go | 190 - .../easyjson/benchmark/jsoniter_test.go | 119 - .../mailru/easyjson/benchmark/ujson.sh | 7 - .../mailru/easyjson/bootstrap/bootstrap.go | 188 - .../github.com/mailru/easyjson/buffer/pool.go | 270 - .../mailru/easyjson/buffer/pool_test.go | 107 - .../mailru/easyjson/easyjson/main.go | 106 - .../github.com/mailru/easyjson/gen/decoder.go | 489 -- .../github.com/mailru/easyjson/gen/encoder.go | 369 - .../mailru/easyjson/gen/generator.go | 523 -- .../mailru/easyjson/gen/generator_test.go | 87 - vendor/github.com/mailru/easyjson/helpers.go | 78 - .../mailru/easyjson/jlexer/bytestostr.go | 24 - .../easyjson/jlexer/bytestostr_nounsafe.go | 13 - .../mailru/easyjson/jlexer/error.go | 15 - .../mailru/easyjson/jlexer/lexer.go | 1141 --- .../mailru/easyjson/jlexer/lexer_test.go | 311 - .../mailru/easyjson/jwriter/writer.go | 335 - .../mailru/easyjson/opt/gotemplate_Bool.go | 79 - .../mailru/easyjson/opt/gotemplate_Float32.go | 79 - .../mailru/easyjson/opt/gotemplate_Float64.go | 79 - .../mailru/easyjson/opt/gotemplate_Int.go | 79 - .../mailru/easyjson/opt/gotemplate_Int16.go | 79 - .../mailru/easyjson/opt/gotemplate_Int32.go | 79 - .../mailru/easyjson/opt/gotemplate_Int64.go | 79 - .../mailru/easyjson/opt/gotemplate_Int8.go | 79 - .../mailru/easyjson/opt/gotemplate_String.go | 79 - .../mailru/easyjson/opt/gotemplate_Uint.go | 79 - .../mailru/easyjson/opt/gotemplate_Uint16.go | 79 - .../mailru/easyjson/opt/gotemplate_Uint32.go | 79 - .../mailru/easyjson/opt/gotemplate_Uint64.go | 79 - .../mailru/easyjson/opt/gotemplate_Uint8.go | 79 - .../mailru/easyjson/opt/optional/opt.go | 80 - vendor/github.com/mailru/easyjson/opt/opts.go | 22 - .../mailru/easyjson/parser/parser.go | 97 - .../mailru/easyjson/parser/parser_unix.go | 42 - .../mailru/easyjson/parser/parser_windows.go | 49 - vendor/github.com/mailru/easyjson/raw.go | 45 - .../mailru/easyjson/tests/basic_test.go | 231 - .../github.com/mailru/easyjson/tests/data.go | 759 -- .../mailru/easyjson/tests/errors.go | 26 - .../mailru/easyjson/tests/errors_test.go | 285 - .../mailru/easyjson/tests/named_type.go | 22 - .../mailru/easyjson/tests/nested_easy.go | 25 - .../mailru/easyjson/tests/nothing.go | 3 - .../mailru/easyjson/tests/omitempty.go | 12 - .../mailru/easyjson/tests/required_test.go | 28 - .../github.com/mailru/easyjson/tests/snake.go | 10 - vendor/github.com/petar/GoLLRB/.gitignore | 23 - vendor/github.com/petar/GoLLRB/AUTHORS | 4 - vendor/github.com/petar/GoLLRB/LICENSE | 27 - vendor/github.com/petar/GoLLRB/README.md | 66 - .../petar/GoLLRB/doc/Sedgewick-LLRB.pdf | Bin 819932 -> 0 bytes .../GoLLRB/doc/Sedgewick-RedBlackBST.java | 475 -- .../GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf | Bin 11636171 -> 0 bytes vendor/github.com/petar/GoLLRB/example/ex1.go | 26 - vendor/github.com/petar/GoLLRB/llrb/avgvar.go | 39 - .../github.com/petar/GoLLRB/llrb/iterator.go | 93 - .../petar/GoLLRB/llrb/iterator_test.go | 76 - .../petar/GoLLRB/llrb/llrb-stats.go | 46 - vendor/github.com/petar/GoLLRB/llrb/llrb.go | 456 -- .../github.com/petar/GoLLRB/llrb/llrb_test.go | 239 - vendor/github.com/petar/GoLLRB/llrb/util.go | 17 - vendor/github.com/peterbourgon/diskv/LICENSE | 19 - .../github.com/peterbourgon/diskv/README.md | 141 - .../peterbourgon/diskv/basic_test.go | 336 - .../peterbourgon/diskv/compression.go | 64 - .../peterbourgon/diskv/compression_test.go | 72 - vendor/github.com/peterbourgon/diskv/diskv.go | 624 -- .../examples/content-addressable-store/cas.go | 63 - .../super-simple-store/super-simple-store.go | 30 - .../peterbourgon/diskv/import_test.go | 76 - vendor/github.com/peterbourgon/diskv/index.go | 115 - .../peterbourgon/diskv/index_test.go | 148 - .../peterbourgon/diskv/issues_test.go | 121 - .../peterbourgon/diskv/keys_test.go | 231 - .../peterbourgon/diskv/speed_test.go | 153 - .../peterbourgon/diskv/stream_test.go | 117 - vendor/golang.org/x/time/AUTHORS | 3 + vendor/golang.org/x/time/CONTRIBUTING.md | 26 + vendor/golang.org/x/time/CONTRIBUTORS | 3 + .../urlesc => golang.org/x/time}/LICENSE | 2 +- vendor/golang.org/x/time/PATENTS | 22 + vendor/golang.org/x/time/README.md | 17 + vendor/golang.org/x/time/rate/rate.go | 384 + vendor/golang.org/x/time/rate/rate_go16.go | 21 + vendor/golang.org/x/time/rate/rate_go17.go | 21 + vendor/golang.org/x/time/rate/rate_test.go | 459 ++ vendor/k8s.io/api/CONTRIBUTING.md | 7 + vendor/k8s.io/api/Godeps/Godeps.json | 126 +- vendor/k8s.io/api/Godeps/OWNERS | 2 + vendor/k8s.io/api/OWNERS | 1 - vendor/k8s.io/api/admission/v1beta1/BUILD | 43 - .../v1beta1/zz_generated.deepcopy.go | 5 +- .../api/admissionregistration/v1alpha1/BUILD | 44 - .../v1alpha1/zz_generated.deepcopy.go | 8 +- .../api/admissionregistration/v1beta1/BUILD | 44 - .../v1beta1/generated.proto | 8 +- .../admissionregistration/v1beta1/types.go | 14 +- .../v1beta1/types_swagger_doc_generated.go | 4 +- .../v1beta1/zz_generated.deepcopy.go | 14 +- vendor/k8s.io/api/apps/OWNERS | 1 - vendor/k8s.io/api/apps/v1/BUILD | 43 - vendor/k8s.io/api/apps/v1/generated.proto | 2 +- vendor/k8s.io/api/apps/v1/types.go | 2 +- .../apps/v1/types_swagger_doc_generated.go | 2 +- .../api/apps/v1/zz_generated.deepcopy.go | 32 +- vendor/k8s.io/api/apps/v1beta1/BUILD | 47 - .../api/apps/v1beta1/zz_generated.deepcopy.go | 26 +- vendor/k8s.io/api/apps/v1beta2/BUILD | 47 - .../api/apps/v1beta2/zz_generated.deepcopy.go | 35 +- vendor/k8s.io/api/authentication/OWNERS | 1 - vendor/k8s.io/api/authentication/v1/BUILD | 45 - .../api/authentication/v1/generated.pb.go | 962 ++- .../api/authentication/v1/generated.proto | 61 + .../k8s.io/api/authentication/v1/register.go | 1 + vendor/k8s.io/api/authentication/v1/types.go | 61 + .../v1/types_swagger_doc_generated.go | 41 + .../v1/zz_generated.deepcopy.go | 133 +- .../k8s.io/api/authentication/v1beta1/BUILD | 45 - .../v1beta1/zz_generated.deepcopy.go | 33 +- vendor/k8s.io/api/authorization/OWNERS | 1 - vendor/k8s.io/api/authorization/v1/BUILD | 45 - .../authorization/v1/zz_generated.deepcopy.go | 42 +- vendor/k8s.io/api/authorization/v1beta1/BUILD | 45 - .../v1beta1/zz_generated.deepcopy.go | 42 +- vendor/k8s.io/api/autoscaling/OWNERS | 1 - vendor/k8s.io/api/autoscaling/v1/BUILD | 46 - .../k8s.io/api/autoscaling/v1/generated.pb.go | 1006 ++- .../k8s.io/api/autoscaling/v1/generated.proto | 65 +- vendor/k8s.io/api/autoscaling/v1/types.go | 63 +- .../v1/types_swagger_doc_generated.go | 30 +- .../autoscaling/v1/zz_generated.deepcopy.go | 115 +- vendor/k8s.io/api/autoscaling/v2beta1/BUILD | 46 - .../api/autoscaling/v2beta1/generated.pb.go | 995 ++- .../api/autoscaling/v2beta1/generated.proto | 66 +- .../k8s.io/api/autoscaling/v2beta1/types.go | 64 +- .../v2beta1/types_swagger_doc_generated.go | 30 +- .../v2beta1/zz_generated.deepcopy.go | 112 +- vendor/k8s.io/api/batch/OWNERS | 1 - vendor/k8s.io/api/batch/v1/BUILD | 45 - .../api/batch/v1/zz_generated.deepcopy.go | 14 +- vendor/k8s.io/api/batch/v1beta1/BUILD | 46 - .../batch/v1beta1/zz_generated.deepcopy.go | 15 +- vendor/k8s.io/api/batch/v2alpha1/BUILD | 46 - .../batch/v2alpha1/zz_generated.deepcopy.go | 15 +- vendor/k8s.io/api/certificates/OWNERS | 1 - vendor/k8s.io/api/certificates/v1beta1/BUILD | 45 - .../k8s.io/api/certificates/v1beta1/types.go | 2 +- .../v1beta1/zz_generated.deepcopy.go | 36 +- vendor/k8s.io/api/code-of-conduct.md | 3 + vendor/k8s.io/api/core/v1/BUILD | 65 - vendor/k8s.io/api/core/v1/generated.pb.go | 4641 +++++++---- vendor/k8s.io/api/core/v1/generated.proto | 158 +- vendor/k8s.io/api/core/v1/register.go | 2 - vendor/k8s.io/api/core/v1/types.go | 175 +- .../core/v1/types_swagger_doc_generated.go | 69 +- .../api/core/v1/zz_generated.deepcopy.go | 328 +- vendor/k8s.io/api/events/v1beta1/BUILD | 42 - .../k8s.io/api/events/v1beta1/generated.proto | 2 +- vendor/k8s.io/api/events/v1beta1/types.go | 2 +- .../v1beta1/types_swagger_doc_generated.go | 2 +- .../events/v1beta1/zz_generated.deepcopy.go | 8 +- vendor/k8s.io/api/extensions/OWNERS | 1 - vendor/k8s.io/api/extensions/v1beta1/BUILD | 49 - .../v1beta1/zz_generated.deepcopy.go | 47 +- vendor/k8s.io/api/imagepolicy/v1alpha1/BUILD | 45 - .../v1alpha1/zz_generated.deepcopy.go | 5 +- vendor/k8s.io/api/networking/v1/BUILD | 46 - .../networking/v1/zz_generated.deepcopy.go | 8 +- vendor/k8s.io/api/policy/OWNERS | 4 + vendor/k8s.io/api/policy/v1beta1/BUILD | 46 - .../k8s.io/api/policy/v1beta1/generated.pb.go | 3526 +++++++-- .../k8s.io/api/policy/v1beta1/generated.proto | 193 + vendor/k8s.io/api/policy/v1beta1/register.go | 2 + vendor/k8s.io/api/policy/v1beta1/types.go | 253 + .../v1beta1/types_swagger_doc_generated.go | 124 + .../policy/v1beta1/zz_generated.deepcopy.go | 295 +- vendor/k8s.io/api/rbac/OWNERS | 1 - vendor/k8s.io/api/rbac/v1/BUILD | 44 - .../api/rbac/v1/zz_generated.deepcopy.go | 26 +- vendor/k8s.io/api/rbac/v1alpha1/BUILD | 44 - .../rbac/v1alpha1/zz_generated.deepcopy.go | 26 +- vendor/k8s.io/api/rbac/v1beta1/BUILD | 44 - .../api/rbac/v1beta1/zz_generated.deepcopy.go | 26 +- vendor/k8s.io/api/scheduling/v1alpha1/BUILD | 44 - .../api/scheduling/v1alpha1/generated.proto | 7 +- .../k8s.io/api/scheduling/v1alpha1/types.go | 7 +- .../v1alpha1/types_swagger_doc_generated.go | 6 +- .../v1alpha1/zz_generated.deepcopy.go | 8 +- vendor/k8s.io/api/settings/v1alpha1/BUILD | 45 - .../v1alpha1/zz_generated.deepcopy.go | 8 +- vendor/k8s.io/api/storage/v1/BUILD | 43 - .../api/storage/v1/zz_generated.deepcopy.go | 8 +- vendor/k8s.io/api/storage/v1alpha1/BUILD | 42 - .../storage/v1alpha1/zz_generated.deepcopy.go | 8 +- vendor/k8s.io/api/storage/v1beta1/BUILD | 43 - .../api/storage/v1beta1/generated.pb.go | 1579 +++- .../api/storage/v1beta1/generated.proto | 97 + vendor/k8s.io/api/storage/v1beta1/register.go | 3 + vendor/k8s.io/api/storage/v1beta1/types.go | 107 + .../v1beta1/types_swagger_doc_generated.go | 63 + .../storage/v1beta1/zz_generated.deepcopy.go | 167 +- vendor/k8s.io/apiextensions-apiserver/BUILD | 56 - .../apiextensions-apiserver/CONTRIBUTING.md | 7 + .../Godeps/Godeps.json | 1106 ++- .../apiextensions-apiserver/Godeps/OWNERS | 2 + .../artifacts/example/rc.yaml | 2 +- .../code-of-conduct.md | 3 + .../examples/client-go/BUILD | 19 - .../pkg/apis/cr/v1/zz_generated.deepcopy.go | 8 +- .../pkg/client/clientset/versioned/BUILD | 37 - .../pkg/client/clientset/versioned/fake/BUILD | 40 - .../clientset/versioned/fake/register.go | 2 +- .../clientset/versioned/scheme/register.go | 2 +- .../clientset/versioned/typed/cr/v1/BUILD | 39 - .../versioned/typed/cr/v1/fake/BUILD | 37 - .../client/informers/externalversions/BUILD | 38 - .../informers/externalversions/cr/BUILD | 29 - .../informers/externalversions/cr/v1/BUILD | 35 - .../externalversions/internalinterfaces/BUILD | 27 - .../client-go/pkg/client/listers/cr/v1/BUILD | 31 - .../hack/boilerplate.go.txt} | 3 +- .../hack/update-codegen.sh | 11 +- .../pkg/apis/apiextensions/BUILD | 53 - .../pkg/apis/apiextensions/fuzzer/BUILD | 30 - .../pkg/apis/apiextensions/fuzzer/fuzzer.go | 26 - .../pkg/apis/apiextensions/install/BUILD | 45 - .../pkg/apis/apiextensions/types.go | 47 +- .../pkg/apis/apiextensions/v1beta1/BUILD | 69 - .../apiextensions/v1beta1/generated.pb.go | 913 ++- .../apiextensions/v1beta1/generated.proto | 52 + .../pkg/apis/apiextensions/v1beta1/types.go | 50 +- .../v1beta1/zz_generated.conversion.go | 79 +- .../v1beta1/zz_generated.deepcopy.go | 153 +- .../v1beta1/zz_generated.defaults.go | 2 +- .../pkg/apis/apiextensions/validation/BUILD | 47 - .../apiextensions/validation/validation.go | 125 +- .../apiextensions/zz_generated.deepcopy.go | 153 +- .../pkg/apiserver/BUILD | 91 - .../pkg/apiserver/apiserver.go | 35 +- .../customresource_discovery_controller.go | 22 + .../pkg/apiserver/customresource_handler.go | 439 +- .../pkg/apiserver/validation/BUILD | 49 - .../pkg/apiserver/validation/validation.go | 44 +- .../apiserver/validation/validation_test.go | 2 +- .../pkg/client/clientset/clientset/BUILD | 40 - .../client/clientset/clientset/clientset.go | 2 + .../pkg/client/clientset/clientset/doc.go | 2 + .../pkg/client/clientset/clientset/fake/BUILD | 43 - .../clientset/fake/clientset_generated.go | 12 +- .../client/clientset/clientset/fake/doc.go | 2 + .../clientset/clientset/fake/register.go | 5 +- .../client/clientset/clientset/scheme/BUILD | 35 - .../client/clientset/clientset/scheme/doc.go | 2 + .../clientset/clientset/scheme/register.go | 5 +- .../typed/apiextensions/v1beta1/BUILD | 42 - .../v1beta1/apiextensions_client.go | 2 + .../v1beta1/customresourcedefinition.go | 2 + .../typed/apiextensions/v1beta1/doc.go | 2 + .../typed/apiextensions/v1beta1/fake/BUILD | 40 - .../typed/apiextensions/v1beta1/fake/doc.go | 2 + .../v1beta1/fake/fake_apiextensions_client.go | 2 + .../fake/fake_customresourcedefinition.go | 2 + .../v1beta1/generated_expansion.go | 2 + .../client/clientset/internalclientset/BUILD | 40 - .../clientset/internalclientset/clientset.go | 2 + .../client/clientset/internalclientset/doc.go | 2 + .../clientset/internalclientset/fake/BUILD | 43 - .../fake/clientset_generated.go | 12 +- .../clientset/internalclientset/fake/doc.go | 2 + .../internalclientset/fake/register.go | 5 +- .../clientset/internalclientset/scheme/doc.go | 2 + .../internalclientset/scheme/register.go | 6 +- .../typed/apiextensions/internalversion/BUILD | 41 - .../internalversion/apiextensions_client.go | 2 + .../customresourcedefinition.go | 2 + .../apiextensions/internalversion/doc.go | 2 + .../apiextensions/internalversion/fake/BUILD | 40 - .../apiextensions/internalversion/fake/doc.go | 2 + .../fake/fake_apiextensions_client.go | 2 + .../fake/fake_customresourcedefinition.go | 2 + .../internalversion/generated_expansion.go | 2 + .../client/informers/externalversions/BUILD | 42 - .../externalversions/apiextensions/BUILD | 32 - .../apiextensions/interface.go | 2 +- .../apiextensions/v1beta1/BUILD | 38 - .../v1beta1/customresourcedefinition.go | 5 +- .../apiextensions/v1beta1/interface.go | 2 +- .../informers/externalversions/factory.go | 9 +- .../informers/externalversions/generic.go | 3 +- .../externalversions/internalinterfaces/BUILD | 31 - .../internalinterfaces/factory_interfaces.go | 5 +- .../client/informers/internalversion/BUILD | 42 - .../internalversion/apiextensions/BUILD | 32 - .../apiextensions/interface.go | 2 +- .../apiextensions/internalversion/BUILD | 38 - .../customresourcedefinition.go | 5 +- .../internalversion/interface.go | 2 +- .../informers/internalversion/factory.go | 9 +- .../informers/internalversion/generic.go | 3 +- .../internalversion/internalinterfaces/BUILD | 31 - .../internalinterfaces/factory_interfaces.go | 5 +- .../apiextensions/internalversion/BUILD | 34 - .../customresourcedefinition.go | 2 +- .../internalversion/expansion_generated.go | 2 +- .../listers/apiextensions/v1beta1/BUILD | 34 - .../v1beta1/customresourcedefinition.go | 2 +- .../v1beta1/expansion_generated.go | 2 +- .../pkg/cmd/server/BUILD | 35 - .../pkg/cmd/server/start.go | 10 +- .../pkg/controller/finalizer/BUILD | 43 - .../pkg/controller/finalizer/crd_finalizer.go | 8 +- .../pkg/controller/status/BUILD | 54 - .../controller/status/naming_controller.go | 2 + .../pkg/features/BUILD | 26 - .../pkg/features/kube_features.go | 9 +- .../pkg/registry/customresource/BUILD | 46 - .../pkg/registry/customresource/etcd.go | 217 +- .../pkg/registry/customresource/etcd_test.go | 400 + .../pkg/registry/customresource/registry.go | 104 + .../customresource/status_strategy.go | 58 + .../customresource/status_strategy_test.go | 138 + .../pkg/registry/customresource/strategy.go | 187 +- .../tableconvertor/tableconvertor.go | 120 + .../pkg/registry/customresource/validator.go | 241 + .../registry/customresourcedefinition/BUILD | 48 - .../registry/customresourcedefinition/etcd.go | 2 +- .../customresourcedefinition/strategy.go | 19 +- .../test/integration/BUILD | 50 - .../certificates/apiserver.crt | 34 +- .../certificates/apiserver.key | 50 +- .../test/integration/basic_test.go | 39 +- .../test/integration/finalization_test.go | 2 +- .../test/integration/registration_test.go | 29 +- .../test/integration/subresources_test.go | 787 ++ .../test/integration/testserver/BUILD | 45 - .../test/integration/testserver/resources.go | 35 + .../test/integration/testserver/start.go | 58 +- .../test/integration/validation_test.go | 25 +- .../test/integration/yaml_test.go | 541 ++ vendor/k8s.io/apimachinery/CONTRIBUTING.md | 7 + vendor/k8s.io/apimachinery/Godeps/Godeps.json | 86 +- vendor/k8s.io/apimachinery/Godeps/OWNERS | 2 + vendor/k8s.io/apimachinery/README.md | 6 +- vendor/k8s.io/apimachinery/code-of-conduct.md | 3 + vendor/k8s.io/apimachinery/hack/godep-deps.sh | 66 - .../apimachinery/hack/sync-from-kubernetes.sh | 65 - .../apimachinery/pkg/api/equality/BUILD | 32 - .../k8s.io/apimachinery/pkg/api/errors/BUILD | 48 - .../k8s.io/apimachinery/pkg/api/errors/OWNERS | 1 - .../apimachinery/pkg/api/errors/errors.go | 21 + vendor/k8s.io/apimachinery/pkg/api/meta/BUILD | 69 - .../apimachinery/pkg/api/meta/errors.go | 20 +- .../k8s.io/apimachinery/pkg/api/meta/meta.go | 8 +- .../apimachinery/pkg/api/meta/meta_test.go | 4 +- .../pkg/api/meta/multirestmapper.go | 4 +- .../pkg/api/meta/multirestmapper_test.go | 84 +- .../apimachinery/pkg/api/meta/priority.go | 2 +- .../pkg/api/meta/priority_test.go | 6 +- .../apimachinery/pkg/api/meta/restmapper.go | 4 +- .../pkg/api/meta/restmapper_test.go | 2 +- .../apimachinery/pkg/api/meta/table/table.go | 71 + .../apimachinery/pkg/api/resource/BUILD | 73 - .../apimachinery/pkg/api/resource/OWNERS | 1 - .../apimachinery/pkg/api/resource/quantity.go | 22 +- .../pkg/api/resource/scale_int_test.go | 2 +- .../pkg/api/resource/zz_generated.deepcopy.go | 2 +- .../k8s.io/apimachinery/pkg/api/testing/BUILD | 35 - .../apimachinery/pkg/api/testing/fuzzer/BUILD | 40 - .../pkg/api/testing/roundtrip/BUILD | 45 - .../pkg/api/testing/roundtrip/roundtrip.go | 6 - .../apimachinery/pkg/api/validation/BUILD | 54 - .../pkg/api/validation/path/BUILD | 33 - .../apimachinery/pkg/apimachinery/BUILD | 46 - .../pkg/apimachinery/announced/BUILD | 46 - .../pkg/apimachinery/announced/announced.go | 2 +- .../pkg/apimachinery/registered/BUILD | 44 - .../apimachinery/pkg/apis/meta/fuzzer/BUILD | 36 - .../pkg/apis/meta/fuzzer/fuzzer.go | 6 +- .../pkg/apis/meta/internalversion/BUILD | 60 - .../pkg/apis/meta/internalversion/doc.go | 1 + .../pkg/apis/meta/internalversion/register.go | 20 +- .../zz_generated.conversion.go | 13 +- .../internalversion/zz_generated.deepcopy.go | 8 +- .../apimachinery/pkg/apis/meta/v1/BUILD | 105 - .../apimachinery/pkg/apis/meta/v1/OWNERS | 1 - .../pkg/apis/meta/v1/conversion.go | 18 + .../pkg/apis/meta/v1/generated.proto | 1 + .../pkg/apis/meta/v1/group_version_test.go | 2 +- .../apimachinery/pkg/apis/meta/v1/labels.go | 28 +- .../pkg/apis/meta/v1/labels_test.go | 7 +- .../pkg/apis/meta/v1/micro_time.go | 22 +- .../apimachinery/pkg/apis/meta/v1/time.go | 22 +- .../apimachinery/pkg/apis/meta/v1/types.go | 13 + .../meta/v1/types_swagger_doc_generated.go | 2 +- .../pkg/apis/meta/v1/types_test.go | 2 +- .../pkg/apis/meta/v1/unstructured/BUILD | 54 - .../pkg/apis/meta/v1/unstructured/helpers.go | 218 +- .../apis/meta/v1/unstructured/unstructured.go | 22 +- .../v1/unstructured/unstructured_list_test.go | 5 +- .../v1/unstructured/zz_generated.deepcopy.go | 8 +- .../pkg/apis/meta/v1/validation/BUILD | 39 - .../pkg/apis/meta/v1/zz_generated.deepcopy.go | 58 +- .../pkg/apis/meta/v1/zz_generated.defaults.go | 2 +- .../apimachinery/pkg/apis/meta/v1alpha1/BUILD | 48 - .../meta/{v1alpha1 => v1beta1}/conversion.go | 6 +- .../meta/{v1alpha1 => v1beta1}/deepcopy.go | 2 +- .../apis/meta/{v1alpha1 => v1beta1}/doc.go | 2 +- .../{v1alpha1 => v1beta1}/generated.pb.go | 68 +- .../{v1alpha1 => v1beta1}/generated.proto | 6 +- .../meta/{v1alpha1 => v1beta1}/register.go | 10 +- .../apis/meta/{v1alpha1 => v1beta1}/types.go | 6 +- .../types_swagger_doc_generated.go | 4 +- .../zz_generated.deepcopy.go | 16 +- .../meta/v1beta1/zz_generated.defaults.go | 32 + .../apimachinery/pkg/apis/testapigroup/BUILD | 40 - .../pkg/apis/testapigroup/fuzzer/BUILD | 34 - .../pkg/apis/testapigroup/install/BUILD | 44 - .../pkg/apis/testapigroup/v1/BUILD | 51 - .../pkg/apis/testapigroup/v1/generated.pb.go | 138 +- .../pkg/apis/testapigroup/v1/generated.proto | 4 +- .../pkg/apis/testapigroup/v1/types.go | 2 +- .../v1/zz_generated.conversion.go | 5 +- .../testapigroup/v1/zz_generated.deepcopy.go | 12 +- .../testapigroup/v1/zz_generated.defaults.go | 2 +- .../testapigroup/zz_generated.deepcopy.go | 12 +- .../k8s.io/apimachinery/pkg/conversion/BUILD | 50 - .../pkg/conversion/converter_test.go | 8 +- .../pkg/conversion/queryparams/BUILD | 40 - vendor/k8s.io/apimachinery/pkg/fields/BUILD | 42 - .../apimachinery/pkg/fields/selector.go | 2 +- vendor/k8s.io/apimachinery/pkg/labels/BUILD | 51 - .../pkg/labels/zz_generated.deepcopy.go | 2 +- vendor/k8s.io/apimachinery/pkg/runtime/BUILD | 100 - .../k8s.io/apimachinery/pkg/runtime/codec.go | 2 +- .../apimachinery/pkg/runtime/schema/BUILD | 44 - .../pkg/runtime/schema/group_version.go | 24 + .../k8s.io/apimachinery/pkg/runtime/scheme.go | 1 + .../apimachinery/pkg/runtime/scheme_test.go | 334 +- .../apimachinery/pkg/runtime/serializer/BUILD | 65 - .../pkg/runtime/serializer/json/BUILD | 57 - .../pkg/runtime/serializer/json/json.go | 58 +- .../pkg/runtime/serializer/json/json_test.go | 26 + .../pkg/runtime/serializer/protobuf/BUILD | 35 - .../pkg/runtime/serializer/recognizer/BUILD | 32 - .../serializer/recognizer/testing/BUILD | 31 - .../pkg/runtime/serializer/streaming/BUILD | 42 - .../pkg/runtime/serializer/testing/BUILD | 33 - .../testing/zz_generated.deepcopy.go | 17 +- .../pkg/runtime/serializer/versioning/BUILD | 42 - .../pkg/runtime/serializer/yaml/BUILD | 30 - .../apimachinery/pkg/runtime/testing/BUILD | 34 - .../apimachinery/pkg/runtime/testing/types.go | 3 + .../runtime/testing/zz_generated.deepcopy.go | 65 +- .../pkg/runtime/zz_generated.deepcopy.go | 8 +- .../k8s.io/apimachinery/pkg/selection/BUILD | 25 - vendor/k8s.io/apimachinery/pkg/test/BUILD | 66 - .../pkg/test/zz_generated.deepcopy.go | 8 +- vendor/k8s.io/apimachinery/pkg/types/BUILD | 31 - .../k8s.io/apimachinery/pkg/util/cache/BUILD | 44 - .../k8s.io/apimachinery/pkg/util/clock/BUILD | 33 - .../k8s.io/apimachinery/pkg/util/diff/BUILD | 37 - .../pkg/util/duration/duration.go | 43 + .../k8s.io/apimachinery/pkg/util/errors/BUILD | 36 - .../apimachinery/pkg/util/errors/errors.go | 2 +- .../k8s.io/apimachinery/pkg/util/framer/BUILD | 33 - .../apimachinery/pkg/util/httpstream/BUILD | 39 - .../pkg/util/httpstream/spdy/BUILD | 57 - .../pkg/util/initialization/BUILD | 27 - .../k8s.io/apimachinery/pkg/util/intstr/BUILD | 50 - .../apimachinery/pkg/util/intstr/intstr.go | 22 +- .../k8s.io/apimachinery/pkg/util/json/BUILD | 33 - .../pkg/util/jsonmergepatch/BUILD | 44 - .../apimachinery/pkg/util/mergepatch/BUILD | 40 - vendor/k8s.io/apimachinery/pkg/util/net/BUILD | 51 - .../k8s.io/apimachinery/pkg/util/net/http.go | 3 + .../pkg/util/net/interface_test.go | 6 +- .../k8s.io/apimachinery/pkg/util/net/util.go | 14 +- .../k8s.io/apimachinery/pkg/util/proxy/BUILD | 62 - .../k8s.io/apimachinery/pkg/util/rand/BUILD | 33 - .../apimachinery/pkg/util/rand/rand_test.go | 2 +- .../apimachinery/pkg/util/remotecommand/BUILD | 26 - .../apimachinery/pkg/util/runtime/BUILD | 34 - .../apimachinery/pkg/util/runtime/runtime.go | 2 +- .../k8s.io/apimachinery/pkg/util/sets/BUILD | 72 - .../apimachinery/pkg/util/sets/types/BUILD | 25 - .../pkg/util/strategicpatch/BUILD | 61 - .../pkg/util/strategicpatch/patch.go | 28 +- .../pkg/util/strategicpatch/patch_test.go | 15 + .../pkg/util/strategicpatch/testing/BUILD | 30 - .../k8s.io/apimachinery/pkg/util/uuid/BUILD | 29 - .../apimachinery/pkg/util/validation/BUILD | 38 - .../pkg/util/validation/field/BUILD | 43 - .../pkg/util/validation/field/errors_test.go | 2 +- .../k8s.io/apimachinery/pkg/util/wait/BUILD | 38 - .../pkg/util/waitgroup/waitgroup.go | 2 +- .../k8s.io/apimachinery/pkg/util/yaml/BUILD | 37 - .../apimachinery/pkg/util/yaml/decoder.go | 6 +- .../pkg/util/yaml/decoder_test.go | 56 + vendor/k8s.io/apimachinery/pkg/version/BUILD | 28 - vendor/k8s.io/apimachinery/pkg/watch/BUILD | 71 - .../pkg/watch/zz_generated.deepcopy.go | 2 +- .../third_party/forked/golang/json/BUILD | 33 - .../third_party/forked/golang/netutil/BUILD | 25 - .../third_party/forked/golang/reflect/BUILD | 33 - vendor/k8s.io/client-go/CHANGELOG.md | 105 + vendor/k8s.io/client-go/CONTRIBUTING.md | 7 + vendor/k8s.io/client-go/Godeps/Godeps.json | 328 +- vendor/k8s.io/client-go/Godeps/OWNERS | 2 + vendor/k8s.io/client-go/INSTALL.md | 6 +- vendor/k8s.io/client-go/README.md | 42 +- vendor/k8s.io/client-go/code-of-conduct.md | 3 + vendor/k8s.io/client-go/discovery/BUILD | 1 - .../k8s.io/client-go/discovery/cached/BUILD | 3 +- .../client-go/discovery/discovery_client.go | 34 +- .../discovery/discovery_client_test.go | 66 +- vendor/k8s.io/client-go/discovery/fake/BUILD | 1 - .../k8s.io/client-go/discovery/restmapper.go | 2 + vendor/k8s.io/client-go/dynamic/BUILD | 3 +- vendor/k8s.io/client-go/dynamic/client.go | 55 +- .../k8s.io/client-go/dynamic/client_test.go | 104 +- .../k8s.io/client-go/dynamic/fake/client.go | 2 +- .../create-update-delete-deployment/BUILD | 3 +- .../create-update-delete-deployment/README.md | 2 +- .../in-cluster-client-configuration/BUILD | 3 +- .../out-of-cluster-client-configuration/BUILD | 3 +- .../main.go | 11 +- .../k8s.io/client-go/examples/workqueue/BUILD | 3 +- .../admissionregistration/interface.go | 4 +- .../v1alpha1/initializerconfiguration.go | 7 +- .../v1alpha1/interface.go | 4 +- .../v1beta1/interface.go | 4 +- .../v1beta1/mutatingwebhookconfiguration.go | 7 +- .../v1beta1/validatingwebhookconfiguration.go | 7 +- .../client-go/informers/apps/interface.go | 4 +- .../informers/apps/v1/controllerrevision.go | 7 +- .../client-go/informers/apps/v1/daemonset.go | 7 +- .../client-go/informers/apps/v1/deployment.go | 7 +- .../client-go/informers/apps/v1/interface.go | 4 +- .../client-go/informers/apps/v1/replicaset.go | 7 +- .../informers/apps/v1/statefulset.go | 7 +- .../apps/v1beta1/controllerrevision.go | 7 +- .../informers/apps/v1beta1/deployment.go | 7 +- .../informers/apps/v1beta1/interface.go | 4 +- .../informers/apps/v1beta1/statefulset.go | 7 +- .../apps/v1beta2/controllerrevision.go | 7 +- .../informers/apps/v1beta2/daemonset.go | 7 +- .../informers/apps/v1beta2/deployment.go | 7 +- .../informers/apps/v1beta2/interface.go | 4 +- .../informers/apps/v1beta2/replicaset.go | 7 +- .../informers/apps/v1beta2/statefulset.go | 7 +- .../informers/autoscaling/interface.go | 4 +- .../autoscaling/v1/horizontalpodautoscaler.go | 7 +- .../informers/autoscaling/v1/interface.go | 4 +- .../v2beta1/horizontalpodautoscaler.go | 7 +- .../autoscaling/v2beta1/interface.go | 4 +- .../client-go/informers/batch/interface.go | 4 +- .../client-go/informers/batch/v1/interface.go | 4 +- .../client-go/informers/batch/v1/job.go | 7 +- .../informers/batch/v1beta1/cronjob.go | 7 +- .../informers/batch/v1beta1/interface.go | 4 +- .../informers/batch/v2alpha1/cronjob.go | 7 +- .../informers/batch/v2alpha1/interface.go | 4 +- .../informers/certificates/interface.go | 4 +- .../v1beta1/certificatesigningrequest.go | 7 +- .../certificates/v1beta1/interface.go | 4 +- .../client-go/informers/core/interface.go | 4 +- .../informers/core/v1/componentstatus.go | 7 +- .../client-go/informers/core/v1/configmap.go | 7 +- .../client-go/informers/core/v1/endpoints.go | 7 +- .../client-go/informers/core/v1/event.go | 7 +- .../client-go/informers/core/v1/interface.go | 4 +- .../client-go/informers/core/v1/limitrange.go | 7 +- .../client-go/informers/core/v1/namespace.go | 7 +- .../client-go/informers/core/v1/node.go | 7 +- .../informers/core/v1/persistentvolume.go | 7 +- .../core/v1/persistentvolumeclaim.go | 7 +- .../k8s.io/client-go/informers/core/v1/pod.go | 7 +- .../informers/core/v1/podtemplate.go | 7 +- .../core/v1/replicationcontroller.go | 7 +- .../informers/core/v1/resourcequota.go | 7 +- .../client-go/informers/core/v1/secret.go | 7 +- .../client-go/informers/core/v1/service.go | 7 +- .../informers/core/v1/serviceaccount.go | 7 +- .../client-go/informers/events/interface.go | 4 +- .../informers/events/v1beta1/event.go | 7 +- .../informers/events/v1beta1/interface.go | 4 +- .../informers/extensions/interface.go | 4 +- .../informers/extensions/v1beta1/daemonset.go | 7 +- .../extensions/v1beta1/deployment.go | 7 +- .../informers/extensions/v1beta1/ingress.go | 7 +- .../informers/extensions/v1beta1/interface.go | 4 +- .../extensions/v1beta1/podsecuritypolicy.go | 7 +- .../extensions/v1beta1/replicaset.go | 7 +- vendor/k8s.io/client-go/informers/factory.go | 11 +- vendor/k8s.io/client-go/informers/generic.go | 9 +- .../internalinterfaces/factory_interfaces.go | 7 +- .../informers/networking/interface.go | 4 +- .../informers/networking/v1/interface.go | 4 +- .../informers/networking/v1/networkpolicy.go | 7 +- .../client-go/informers/policy/interface.go | 4 +- .../client-go/informers/policy/v1beta1/BUILD | 1 + .../informers/policy/v1beta1/interface.go | 11 +- .../policy/v1beta1/poddisruptionbudget.go | 7 +- .../policy/v1beta1/podsecuritypolicy.go | 88 + .../client-go/informers/rbac/interface.go | 4 +- .../informers/rbac/v1/clusterrole.go | 7 +- .../informers/rbac/v1/clusterrolebinding.go | 7 +- .../client-go/informers/rbac/v1/interface.go | 4 +- .../client-go/informers/rbac/v1/role.go | 7 +- .../informers/rbac/v1/rolebinding.go | 7 +- .../informers/rbac/v1alpha1/clusterrole.go | 7 +- .../rbac/v1alpha1/clusterrolebinding.go | 7 +- .../informers/rbac/v1alpha1/interface.go | 4 +- .../client-go/informers/rbac/v1alpha1/role.go | 7 +- .../informers/rbac/v1alpha1/rolebinding.go | 7 +- .../informers/rbac/v1beta1/clusterrole.go | 7 +- .../rbac/v1beta1/clusterrolebinding.go | 7 +- .../informers/rbac/v1beta1/interface.go | 4 +- .../client-go/informers/rbac/v1beta1/role.go | 7 +- .../informers/rbac/v1beta1/rolebinding.go | 7 +- .../informers/scheduling/interface.go | 4 +- .../scheduling/v1alpha1/interface.go | 4 +- .../scheduling/v1alpha1/priorityclass.go | 7 +- .../client-go/informers/settings/interface.go | 4 +- .../informers/settings/v1alpha1/interface.go | 4 +- .../informers/settings/v1alpha1/podpreset.go | 7 +- .../client-go/informers/storage/interface.go | 4 +- .../informers/storage/v1/interface.go | 4 +- .../informers/storage/v1/storageclass.go | 7 +- .../informers/storage/v1alpha1/interface.go | 4 +- .../storage/v1alpha1/volumeattachment.go | 7 +- .../client-go/informers/storage/v1beta1/BUILD | 1 + .../informers/storage/v1beta1/interface.go | 11 +- .../informers/storage/v1beta1/storageclass.go | 7 +- .../storage/v1beta1/volumeattachment.go | 88 + .../k8s.io/client-go/kubernetes/clientset.go | 4 +- vendor/k8s.io/client-go/kubernetes/doc.go | 4 +- .../kubernetes/fake/clientset_generated.go | 14 +- .../k8s.io/client-go/kubernetes/fake/doc.go | 4 +- .../client-go/kubernetes/fake/register.go | 7 +- .../k8s.io/client-go/kubernetes/scheme/doc.go | 4 +- .../client-go/kubernetes/scheme/register.go | 7 +- .../v1alpha1/admissionregistration_client.go | 4 +- .../admissionregistration/v1alpha1/doc.go | 4 +- .../v1alpha1/fake/doc.go | 4 +- .../fake/fake_admissionregistration_client.go | 4 +- .../fake/fake_initializerconfiguration.go | 4 +- .../v1alpha1/generated_expansion.go | 4 +- .../v1alpha1/initializerconfiguration.go | 4 +- .../v1beta1/admissionregistration_client.go | 4 +- .../admissionregistration/v1beta1/doc.go | 4 +- .../admissionregistration/v1beta1/fake/doc.go | 4 +- .../fake/fake_admissionregistration_client.go | 4 +- .../fake/fake_mutatingwebhookconfiguration.go | 4 +- .../fake_validatingwebhookconfiguration.go | 4 +- .../v1beta1/generated_expansion.go | 4 +- .../v1beta1/mutatingwebhookconfiguration.go | 4 +- .../v1beta1/validatingwebhookconfiguration.go | 4 +- .../kubernetes/typed/apps/v1/apps_client.go | 4 +- .../typed/apps/v1/controllerrevision.go | 4 +- .../kubernetes/typed/apps/v1/daemonset.go | 4 +- .../kubernetes/typed/apps/v1/deployment.go | 4 +- .../client-go/kubernetes/typed/apps/v1/doc.go | 4 +- .../kubernetes/typed/apps/v1/fake/doc.go | 4 +- .../typed/apps/v1/fake/fake_apps_client.go | 4 +- .../apps/v1/fake/fake_controllerrevision.go | 4 +- .../typed/apps/v1/fake/fake_daemonset.go | 4 +- .../typed/apps/v1/fake/fake_deployment.go | 4 +- .../typed/apps/v1/fake/fake_replicaset.go | 4 +- .../typed/apps/v1/fake/fake_statefulset.go | 4 +- .../typed/apps/v1/generated_expansion.go | 4 +- .../kubernetes/typed/apps/v1/replicaset.go | 4 +- .../kubernetes/typed/apps/v1/statefulset.go | 4 +- .../typed/apps/v1beta1/apps_client.go | 4 +- .../typed/apps/v1beta1/controllerrevision.go | 4 +- .../typed/apps/v1beta1/deployment.go | 4 +- .../kubernetes/typed/apps/v1beta1/doc.go | 4 +- .../kubernetes/typed/apps/v1beta1/fake/doc.go | 4 +- .../apps/v1beta1/fake/fake_apps_client.go | 4 +- .../v1beta1/fake/fake_controllerrevision.go | 4 +- .../apps/v1beta1/fake/fake_deployment.go | 4 +- .../typed/apps/v1beta1/fake/fake_scale.go | 4 +- .../apps/v1beta1/fake/fake_statefulset.go | 4 +- .../typed/apps/v1beta1/generated_expansion.go | 4 +- .../kubernetes/typed/apps/v1beta1/scale.go | 4 +- .../typed/apps/v1beta1/statefulset.go | 4 +- .../typed/apps/v1beta2/apps_client.go | 4 +- .../typed/apps/v1beta2/controllerrevision.go | 4 +- .../typed/apps/v1beta2/daemonset.go | 4 +- .../typed/apps/v1beta2/deployment.go | 4 +- .../kubernetes/typed/apps/v1beta2/doc.go | 4 +- .../kubernetes/typed/apps/v1beta2/fake/doc.go | 4 +- .../apps/v1beta2/fake/fake_apps_client.go | 4 +- .../v1beta2/fake/fake_controllerrevision.go | 4 +- .../typed/apps/v1beta2/fake/fake_daemonset.go | 4 +- .../apps/v1beta2/fake/fake_deployment.go | 4 +- .../apps/v1beta2/fake/fake_replicaset.go | 4 +- .../typed/apps/v1beta2/fake/fake_scale.go | 4 +- .../apps/v1beta2/fake/fake_statefulset.go | 4 +- .../typed/apps/v1beta2/generated_expansion.go | 4 +- .../typed/apps/v1beta2/replicaset.go | 4 +- .../kubernetes/typed/apps/v1beta2/scale.go | 4 +- .../typed/apps/v1beta2/statefulset.go | 4 +- .../v1/authentication_client.go | 4 +- .../kubernetes/typed/authentication/v1/doc.go | 4 +- .../typed/authentication/v1/fake/doc.go | 4 +- .../v1/fake/fake_authentication_client.go | 4 +- .../v1/fake/fake_tokenreview.go | 4 +- .../authentication/v1/generated_expansion.go | 4 +- .../typed/authentication/v1/tokenreview.go | 4 +- .../v1beta1/authentication_client.go | 4 +- .../typed/authentication/v1beta1/doc.go | 4 +- .../typed/authentication/v1beta1/fake/doc.go | 4 +- .../fake/fake_authentication_client.go | 4 +- .../v1beta1/fake/fake_tokenreview.go | 4 +- .../v1beta1/generated_expansion.go | 4 +- .../authentication/v1beta1/tokenreview.go | 4 +- .../authorization/v1/authorization_client.go | 4 +- .../kubernetes/typed/authorization/v1/doc.go | 4 +- .../typed/authorization/v1/fake/doc.go | 4 +- .../v1/fake/fake_authorization_client.go | 4 +- .../v1/fake/fake_localsubjectaccessreview.go | 4 +- .../v1/fake/fake_selfsubjectaccessreview.go | 4 +- .../v1/fake/fake_selfsubjectrulesreview.go | 4 +- .../v1/fake/fake_subjectaccessreview.go | 4 +- .../authorization/v1/generated_expansion.go | 4 +- .../v1/localsubjectaccessreview.go | 4 +- .../v1/selfsubjectaccessreview.go | 4 +- .../v1/selfsubjectrulesreview.go | 4 +- .../authorization/v1/subjectaccessreview.go | 4 +- .../v1beta1/authorization_client.go | 4 +- .../typed/authorization/v1beta1/doc.go | 4 +- .../typed/authorization/v1beta1/fake/doc.go | 4 +- .../v1beta1/fake/fake_authorization_client.go | 4 +- .../fake/fake_localsubjectaccessreview.go | 4 +- .../fake/fake_selfsubjectaccessreview.go | 4 +- .../fake/fake_selfsubjectrulesreview.go | 4 +- .../v1beta1/fake/fake_subjectaccessreview.go | 4 +- .../v1beta1/generated_expansion.go | 4 +- .../v1beta1/localsubjectaccessreview.go | 4 +- .../v1beta1/selfsubjectaccessreview.go | 4 +- .../v1beta1/selfsubjectrulesreview.go | 4 +- .../v1beta1/subjectaccessreview.go | 4 +- .../autoscaling/v1/autoscaling_client.go | 4 +- .../kubernetes/typed/autoscaling/v1/doc.go | 4 +- .../typed/autoscaling/v1/fake/doc.go | 4 +- .../v1/fake/fake_autoscaling_client.go | 4 +- .../v1/fake/fake_horizontalpodautoscaler.go | 4 +- .../autoscaling/v1/generated_expansion.go | 4 +- .../autoscaling/v1/horizontalpodautoscaler.go | 4 +- .../autoscaling/v2beta1/autoscaling_client.go | 4 +- .../typed/autoscaling/v2beta1/doc.go | 4 +- .../typed/autoscaling/v2beta1/fake/doc.go | 4 +- .../v2beta1/fake/fake_autoscaling_client.go | 4 +- .../fake/fake_horizontalpodautoscaler.go | 4 +- .../v2beta1/generated_expansion.go | 4 +- .../v2beta1/horizontalpodautoscaler.go | 4 +- .../kubernetes/typed/batch/v1/batch_client.go | 4 +- .../kubernetes/typed/batch/v1/doc.go | 4 +- .../kubernetes/typed/batch/v1/fake/doc.go | 4 +- .../typed/batch/v1/fake/fake_batch_client.go | 4 +- .../typed/batch/v1/fake/fake_job.go | 4 +- .../typed/batch/v1/generated_expansion.go | 4 +- .../kubernetes/typed/batch/v1/job.go | 4 +- .../typed/batch/v1beta1/batch_client.go | 4 +- .../kubernetes/typed/batch/v1beta1/cronjob.go | 4 +- .../kubernetes/typed/batch/v1beta1/doc.go | 4 +- .../typed/batch/v1beta1/fake/doc.go | 4 +- .../batch/v1beta1/fake/fake_batch_client.go | 4 +- .../typed/batch/v1beta1/fake/fake_cronjob.go | 4 +- .../batch/v1beta1/generated_expansion.go | 4 +- .../typed/batch/v2alpha1/batch_client.go | 4 +- .../typed/batch/v2alpha1/cronjob.go | 4 +- .../kubernetes/typed/batch/v2alpha1/doc.go | 4 +- .../typed/batch/v2alpha1/fake/doc.go | 4 +- .../batch/v2alpha1/fake/fake_batch_client.go | 4 +- .../typed/batch/v2alpha1/fake/fake_cronjob.go | 4 +- .../batch/v2alpha1/generated_expansion.go | 4 +- .../v1beta1/certificates_client.go | 4 +- .../v1beta1/certificatesigningrequest.go | 4 +- .../typed/certificates/v1beta1/doc.go | 4 +- .../typed/certificates/v1beta1/fake/doc.go | 4 +- .../v1beta1/fake/fake_certificates_client.go | 4 +- .../fake/fake_certificatesigningrequest.go | 4 +- .../v1beta1/generated_expansion.go | 4 +- .../client-go/kubernetes/typed/core/v1/BUILD | 2 + .../typed/core/v1/componentstatus.go | 4 +- .../kubernetes/typed/core/v1/configmap.go | 4 +- .../kubernetes/typed/core/v1/core_client.go | 4 +- .../client-go/kubernetes/typed/core/v1/doc.go | 4 +- .../kubernetes/typed/core/v1/endpoints.go | 4 +- .../kubernetes/typed/core/v1/event.go | 4 +- .../kubernetes/typed/core/v1/fake/BUILD | 2 + .../kubernetes/typed/core/v1/fake/doc.go | 4 +- .../core/v1/fake/fake_componentstatus.go | 4 +- .../typed/core/v1/fake/fake_configmap.go | 4 +- .../typed/core/v1/fake/fake_core_client.go | 4 +- .../typed/core/v1/fake/fake_endpoints.go | 4 +- .../typed/core/v1/fake/fake_event.go | 4 +- .../typed/core/v1/fake/fake_limitrange.go | 4 +- .../typed/core/v1/fake/fake_namespace.go | 4 +- .../typed/core/v1/fake/fake_node.go | 4 +- .../core/v1/fake/fake_persistentvolume.go | 4 +- .../v1/fake/fake_persistentvolumeclaim.go | 4 +- .../kubernetes/typed/core/v1/fake/fake_pod.go | 4 +- .../typed/core/v1/fake/fake_podtemplate.go | 4 +- .../v1/fake/fake_replicationcontroller.go | 4 +- .../typed/core/v1/fake/fake_resourcequota.go | 4 +- .../typed/core/v1/fake/fake_secret.go | 4 +- .../typed/core/v1/fake/fake_service.go | 4 +- .../typed/core/v1/fake/fake_serviceaccount.go | 4 +- .../v1/fake/fake_serviceaccount_expansion.go | 31 + .../typed/core/v1/generated_expansion.go | 6 +- .../kubernetes/typed/core/v1/limitrange.go | 4 +- .../kubernetes/typed/core/v1/namespace.go | 4 +- .../kubernetes/typed/core/v1/node.go | 4 +- .../typed/core/v1/persistentvolume.go | 4 +- .../typed/core/v1/persistentvolumeclaim.go | 4 +- .../client-go/kubernetes/typed/core/v1/pod.go | 4 +- .../kubernetes/typed/core/v1/podtemplate.go | 4 +- .../typed/core/v1/replicationcontroller.go | 4 +- .../kubernetes/typed/core/v1/resourcequota.go | 4 +- .../kubernetes/typed/core/v1/secret.go | 4 +- .../kubernetes/typed/core/v1/service.go | 4 +- .../typed/core/v1/serviceaccount.go | 4 +- .../typed/core/v1/serviceaccount_expansion.go | 41 + .../kubernetes/typed/events/v1beta1/doc.go | 4 +- .../kubernetes/typed/events/v1beta1/event.go | 4 +- .../typed/events/v1beta1/events_client.go | 4 +- .../typed/events/v1beta1/fake/doc.go | 4 +- .../typed/events/v1beta1/fake/fake_event.go | 4 +- .../events/v1beta1/fake/fake_events_client.go | 4 +- .../events/v1beta1/generated_expansion.go | 4 +- .../typed/extensions/v1beta1/daemonset.go | 4 +- .../typed/extensions/v1beta1/deployment.go | 4 +- .../typed/extensions/v1beta1/doc.go | 4 +- .../extensions/v1beta1/extensions_client.go | 4 +- .../typed/extensions/v1beta1/fake/doc.go | 4 +- .../extensions/v1beta1/fake/fake_daemonset.go | 4 +- .../v1beta1/fake/fake_deployment.go | 4 +- .../v1beta1/fake/fake_extensions_client.go | 4 +- .../extensions/v1beta1/fake/fake_ingress.go | 4 +- .../v1beta1/fake/fake_podsecuritypolicy.go | 4 +- .../v1beta1/fake/fake_replicaset.go | 4 +- .../extensions/v1beta1/fake/fake_scale.go | 4 +- .../extensions/v1beta1/generated_expansion.go | 4 +- .../typed/extensions/v1beta1/ingress.go | 4 +- .../extensions/v1beta1/podsecuritypolicy.go | 4 +- .../typed/extensions/v1beta1/replicaset.go | 4 +- .../typed/extensions/v1beta1/scale.go | 4 +- .../kubernetes/typed/networking/v1/doc.go | 4 +- .../typed/networking/v1/fake/doc.go | 4 +- .../v1/fake/fake_networking_client.go | 4 +- .../networking/v1/fake/fake_networkpolicy.go | 4 +- .../networking/v1/generated_expansion.go | 4 +- .../typed/networking/v1/networking_client.go | 4 +- .../typed/networking/v1/networkpolicy.go | 4 +- .../kubernetes/typed/policy/v1beta1/BUILD | 1 + .../kubernetes/typed/policy/v1beta1/doc.go | 4 +- .../typed/policy/v1beta1/eviction.go | 4 +- .../typed/policy/v1beta1/fake/BUILD | 1 + .../typed/policy/v1beta1/fake/doc.go | 4 +- .../policy/v1beta1/fake/fake_eviction.go | 4 +- .../v1beta1/fake/fake_poddisruptionbudget.go | 4 +- .../v1beta1/fake/fake_podsecuritypolicy.go | 120 + .../policy/v1beta1/fake/fake_policy_client.go | 8 +- .../policy/v1beta1/generated_expansion.go | 6 +- .../policy/v1beta1/poddisruptionbudget.go | 4 +- .../typed/policy/v1beta1/podsecuritypolicy.go | 147 + .../typed/policy/v1beta1/policy_client.go | 9 +- .../kubernetes/typed/rbac/v1/clusterrole.go | 4 +- .../typed/rbac/v1/clusterrolebinding.go | 4 +- .../client-go/kubernetes/typed/rbac/v1/doc.go | 4 +- .../kubernetes/typed/rbac/v1/fake/doc.go | 4 +- .../typed/rbac/v1/fake/fake_clusterrole.go | 4 +- .../rbac/v1/fake/fake_clusterrolebinding.go | 4 +- .../typed/rbac/v1/fake/fake_rbac_client.go | 4 +- .../typed/rbac/v1/fake/fake_role.go | 4 +- .../typed/rbac/v1/fake/fake_rolebinding.go | 4 +- .../typed/rbac/v1/generated_expansion.go | 4 +- .../kubernetes/typed/rbac/v1/rbac_client.go | 4 +- .../kubernetes/typed/rbac/v1/role.go | 4 +- .../kubernetes/typed/rbac/v1/rolebinding.go | 4 +- .../typed/rbac/v1alpha1/clusterrole.go | 4 +- .../typed/rbac/v1alpha1/clusterrolebinding.go | 4 +- .../kubernetes/typed/rbac/v1alpha1/doc.go | 4 +- .../typed/rbac/v1alpha1/fake/doc.go | 4 +- .../rbac/v1alpha1/fake/fake_clusterrole.go | 4 +- .../v1alpha1/fake/fake_clusterrolebinding.go | 4 +- .../rbac/v1alpha1/fake/fake_rbac_client.go | 4 +- .../typed/rbac/v1alpha1/fake/fake_role.go | 4 +- .../rbac/v1alpha1/fake/fake_rolebinding.go | 4 +- .../rbac/v1alpha1/generated_expansion.go | 4 +- .../typed/rbac/v1alpha1/rbac_client.go | 4 +- .../kubernetes/typed/rbac/v1alpha1/role.go | 4 +- .../typed/rbac/v1alpha1/rolebinding.go | 4 +- .../typed/rbac/v1beta1/clusterrole.go | 4 +- .../typed/rbac/v1beta1/clusterrolebinding.go | 4 +- .../kubernetes/typed/rbac/v1beta1/doc.go | 4 +- .../kubernetes/typed/rbac/v1beta1/fake/doc.go | 4 +- .../rbac/v1beta1/fake/fake_clusterrole.go | 4 +- .../v1beta1/fake/fake_clusterrolebinding.go | 4 +- .../rbac/v1beta1/fake/fake_rbac_client.go | 4 +- .../typed/rbac/v1beta1/fake/fake_role.go | 4 +- .../rbac/v1beta1/fake/fake_rolebinding.go | 4 +- .../typed/rbac/v1beta1/generated_expansion.go | 4 +- .../typed/rbac/v1beta1/rbac_client.go | 4 +- .../kubernetes/typed/rbac/v1beta1/role.go | 4 +- .../typed/rbac/v1beta1/rolebinding.go | 4 +- .../typed/scheduling/v1alpha1/doc.go | 4 +- .../typed/scheduling/v1alpha1/fake/doc.go | 4 +- .../v1alpha1/fake/fake_priorityclass.go | 4 +- .../v1alpha1/fake/fake_scheduling_client.go | 4 +- .../v1alpha1/generated_expansion.go | 4 +- .../scheduling/v1alpha1/priorityclass.go | 4 +- .../scheduling/v1alpha1/scheduling_client.go | 4 +- .../kubernetes/typed/settings/v1alpha1/doc.go | 4 +- .../typed/settings/v1alpha1/fake/doc.go | 4 +- .../settings/v1alpha1/fake/fake_podpreset.go | 4 +- .../v1alpha1/fake/fake_settings_client.go | 4 +- .../settings/v1alpha1/generated_expansion.go | 4 +- .../typed/settings/v1alpha1/podpreset.go | 4 +- .../settings/v1alpha1/settings_client.go | 4 +- .../kubernetes/typed/storage/v1/doc.go | 4 +- .../kubernetes/typed/storage/v1/fake/doc.go | 4 +- .../storage/v1/fake/fake_storage_client.go | 4 +- .../storage/v1/fake/fake_storageclass.go | 4 +- .../typed/storage/v1/generated_expansion.go | 4 +- .../typed/storage/v1/storage_client.go | 4 +- .../typed/storage/v1/storageclass.go | 4 +- .../kubernetes/typed/storage/v1alpha1/doc.go | 4 +- .../typed/storage/v1alpha1/fake/doc.go | 4 +- .../v1alpha1/fake/fake_storage_client.go | 4 +- .../v1alpha1/fake/fake_volumeattachment.go | 4 +- .../storage/v1alpha1/generated_expansion.go | 4 +- .../typed/storage/v1alpha1/storage_client.go | 4 +- .../storage/v1alpha1/volumeattachment.go | 4 +- .../kubernetes/typed/storage/v1beta1/BUILD | 1 + .../kubernetes/typed/storage/v1beta1/doc.go | 4 +- .../typed/storage/v1beta1/fake/BUILD | 1 + .../typed/storage/v1beta1/fake/doc.go | 4 +- .../v1beta1/fake/fake_storage_client.go | 8 +- .../storage/v1beta1/fake/fake_storageclass.go | 4 +- .../v1beta1/fake/fake_volumeattachment.go | 131 + .../storage/v1beta1/generated_expansion.go | 6 +- .../typed/storage/v1beta1/storage_client.go | 9 +- .../typed/storage/v1beta1/storageclass.go | 4 +- .../typed/storage/v1beta1/volumeattachment.go | 163 + .../v1alpha1/expansion_generated.go | 4 +- .../v1alpha1/initializerconfiguration.go | 4 +- .../v1beta1/expansion_generated.go | 4 +- .../v1beta1/mutatingwebhookconfiguration.go | 4 +- .../v1beta1/validatingwebhookconfiguration.go | 4 +- .../listers/apps/v1/controllerrevision.go | 4 +- .../client-go/listers/apps/v1/daemonset.go | 4 +- .../client-go/listers/apps/v1/deployment.go | 4 +- .../listers/apps/v1/expansion_generated.go | 4 +- .../client-go/listers/apps/v1/replicaset.go | 4 +- .../client-go/listers/apps/v1/statefulset.go | 4 +- .../apps/v1beta1/controllerrevision.go | 4 +- .../listers/apps/v1beta1/deployment.go | 4 +- .../apps/v1beta1/expansion_generated.go | 4 +- .../client-go/listers/apps/v1beta1/scale.go | 4 +- .../listers/apps/v1beta1/statefulset.go | 4 +- .../apps/v1beta2/controllerrevision.go | 4 +- .../listers/apps/v1beta2/daemonset.go | 4 +- .../listers/apps/v1beta2/deployment.go | 4 +- .../apps/v1beta2/expansion_generated.go | 4 +- .../listers/apps/v1beta2/replicaset.go | 4 +- .../client-go/listers/apps/v1beta2/scale.go | 4 +- .../listers/apps/v1beta2/statefulset.go | 4 +- .../authentication/v1/expansion_generated.go | 4 +- .../listers/authentication/v1/tokenreview.go | 4 +- .../v1beta1/expansion_generated.go | 4 +- .../authentication/v1beta1/tokenreview.go | 4 +- .../authorization/v1/expansion_generated.go | 4 +- .../v1/localsubjectaccessreview.go | 4 +- .../v1/selfsubjectaccessreview.go | 4 +- .../v1/selfsubjectrulesreview.go | 4 +- .../authorization/v1/subjectaccessreview.go | 4 +- .../v1beta1/expansion_generated.go | 4 +- .../v1beta1/localsubjectaccessreview.go | 4 +- .../v1beta1/selfsubjectaccessreview.go | 4 +- .../v1beta1/selfsubjectrulesreview.go | 4 +- .../v1beta1/subjectaccessreview.go | 4 +- .../autoscaling/v1/expansion_generated.go | 4 +- .../autoscaling/v1/horizontalpodautoscaler.go | 4 +- .../v2beta1/expansion_generated.go | 4 +- .../v2beta1/horizontalpodautoscaler.go | 4 +- .../listers/batch/v1/expansion_generated.go | 4 +- .../k8s.io/client-go/listers/batch/v1/job.go | 4 +- .../listers/batch/v1beta1/cronjob.go | 4 +- .../batch/v1beta1/expansion_generated.go | 4 +- .../listers/batch/v2alpha1/cronjob.go | 4 +- .../batch/v2alpha1/expansion_generated.go | 4 +- .../v1beta1/certificatesigningrequest.go | 4 +- .../v1beta1/expansion_generated.go | 4 +- .../listers/core/v1/componentstatus.go | 4 +- .../client-go/listers/core/v1/configmap.go | 4 +- .../client-go/listers/core/v1/endpoints.go | 4 +- .../k8s.io/client-go/listers/core/v1/event.go | 4 +- .../listers/core/v1/expansion_generated.go | 4 +- .../client-go/listers/core/v1/limitrange.go | 4 +- .../client-go/listers/core/v1/namespace.go | 4 +- .../k8s.io/client-go/listers/core/v1/node.go | 4 +- .../listers/core/v1/persistentvolume.go | 4 +- .../listers/core/v1/persistentvolumeclaim.go | 4 +- .../k8s.io/client-go/listers/core/v1/pod.go | 4 +- .../client-go/listers/core/v1/podtemplate.go | 4 +- .../listers/core/v1/replicationcontroller.go | 4 +- .../listers/core/v1/resourcequota.go | 4 +- .../client-go/listers/core/v1/secret.go | 4 +- .../client-go/listers/core/v1/service.go | 4 +- .../listers/core/v1/serviceaccount.go | 4 +- .../client-go/listers/events/v1beta1/event.go | 4 +- .../events/v1beta1/expansion_generated.go | 4 +- .../listers/extensions/v1beta1/BUILD | 3 +- .../listers/extensions/v1beta1/daemonset.go | 4 +- .../listers/extensions/v1beta1/deployment.go | 4 +- .../extensions/v1beta1/expansion_generated.go | 4 +- .../listers/extensions/v1beta1/ingress.go | 4 +- .../extensions/v1beta1/podsecuritypolicy.go | 4 +- .../listers/extensions/v1beta1/replicaset.go | 4 +- .../listers/extensions/v1beta1/scale.go | 4 +- .../v1alpha1/expansion_generated.go | 4 +- .../imagepolicy/v1alpha1/imagereview.go | 4 +- .../networking/v1/expansion_generated.go | 4 +- .../listers/networking/v1/networkpolicy.go | 4 +- .../client-go/listers/policy/v1beta1/BUILD | 1 + .../listers/policy/v1beta1/eviction.go | 4 +- .../policy/v1beta1/expansion_generated.go | 8 +- .../policy/v1beta1/poddisruptionbudget.go | 4 +- .../policy/v1beta1/podsecuritypolicy.go | 65 + .../client-go/listers/rbac/v1/clusterrole.go | 4 +- .../listers/rbac/v1/clusterrolebinding.go | 4 +- .../listers/rbac/v1/expansion_generated.go | 4 +- .../k8s.io/client-go/listers/rbac/v1/role.go | 4 +- .../client-go/listers/rbac/v1/rolebinding.go | 4 +- .../listers/rbac/v1alpha1/clusterrole.go | 4 +- .../rbac/v1alpha1/clusterrolebinding.go | 4 +- .../rbac/v1alpha1/expansion_generated.go | 4 +- .../client-go/listers/rbac/v1alpha1/role.go | 4 +- .../listers/rbac/v1alpha1/rolebinding.go | 4 +- .../listers/rbac/v1beta1/clusterrole.go | 4 +- .../rbac/v1beta1/clusterrolebinding.go | 4 +- .../rbac/v1beta1/expansion_generated.go | 4 +- .../client-go/listers/rbac/v1beta1/role.go | 4 +- .../listers/rbac/v1beta1/rolebinding.go | 4 +- .../v1alpha1/expansion_generated.go | 4 +- .../scheduling/v1alpha1/priorityclass.go | 4 +- .../settings/v1alpha1/expansion_generated.go | 4 +- .../listers/settings/v1alpha1/podpreset.go | 4 +- .../listers/storage/v1/expansion_generated.go | 4 +- .../listers/storage/v1/storageclass.go | 4 +- .../storage/v1alpha1/expansion_generated.go | 4 +- .../storage/v1alpha1/volumeattachment.go | 4 +- .../client-go/listers/storage/v1beta1/BUILD | 1 + .../storage/v1beta1/expansion_generated.go | 8 +- .../listers/storage/v1beta1/storageclass.go | 4 +- .../storage/v1beta1/volumeattachment.go | 65 + .../pkg/apis/clientauthentication}/BUILD | 12 +- .../pkg/apis/clientauthentication/doc.go | 19 + .../apis/clientauthentication/install}/BUILD | 13 +- .../clientauthentication/install/install.go | 43 + .../pkg/apis/clientauthentication/register.go | 50 + .../pkg/apis/clientauthentication/types.go | 70 + .../apis/clientauthentication/v1alpha1}/BUILD | 7 +- .../apis/clientauthentication/v1alpha1/doc.go | 23 + .../clientauthentication/v1alpha1/register.go | 55 + .../clientauthentication/v1alpha1/types.go | 70 + .../v1alpha1/zz_generated.conversion.go | 141 + .../v1alpha1/zz_generated.deepcopy.go | 137 + .../v1alpha1/zz_generated.defaults.go | 2 +- .../zz_generated.deepcopy.go | 137 + vendor/k8s.io/client-go/pkg/version/def.bzl | 14 + .../authenticator/token/oidc/testing/BUILD | 30 - .../token/oidc/testing/provider.go | 200 - .../client-go/plugin/pkg/client/auth/BUILD | 1 + .../plugin/pkg/client/auth/azure/BUILD | 3 +- .../plugin/pkg/client/auth/exec/BUILD | 44 + .../plugin/pkg/client/auth/exec/exec.go | 280 + .../plugin/pkg/client/auth/exec/exec_test.go | 413 + .../client/auth/exec/testdata/test-plugin.sh | 18 + .../plugin/pkg/client/auth/gcp/BUILD | 3 +- .../plugin/pkg/client/auth/gcp/gcp.go | 75 +- .../plugin/pkg/client/auth/gcp/gcp_test.go | 109 + .../plugin/pkg/client/auth/oidc/BUILD | 3 +- .../plugin/pkg/client/auth/openstack/BUILD | 3 +- vendor/k8s.io/client-go/rest/BUILD | 5 +- vendor/k8s.io/client-go/rest/client.go | 4 +- vendor/k8s.io/client-go/rest/client_test.go | 2 +- vendor/k8s.io/client-go/rest/config.go | 14 +- vendor/k8s.io/client-go/rest/config_test.go | 2 +- vendor/k8s.io/client-go/rest/fake/fake.go | 2 +- vendor/k8s.io/client-go/rest/request.go | 3 +- vendor/k8s.io/client-go/rest/request_test.go | 14 +- vendor/k8s.io/client-go/rest/transport.go | 16 +- vendor/k8s.io/client-go/rest/versions.go | 88 - vendor/k8s.io/client-go/rest/watch/BUILD | 1 - .../client-go/rest/zz_generated.deepcopy.go | 4 +- vendor/k8s.io/client-go/scale/BUILD | 3 +- vendor/k8s.io/client-go/scale/client.go | 48 +- vendor/k8s.io/client-go/scale/client_test.go | 2 +- .../k8s.io/client-go/scale/roundtrip_test.go | 2 +- .../client-go/scale/scheme/appsint/doc.go | 2 +- .../appsv1beta1/zz_generated.conversion.go | 4 +- .../appsv1beta2/zz_generated.conversion.go | 4 +- .../autoscalingv1/zz_generated.conversion.go | 4 +- .../scale/scheme/extensionsint/doc.go | 2 +- .../zz_generated.conversion.go | 4 +- .../scale/scheme/zz_generated.deepcopy.go | 7 +- vendor/k8s.io/client-go/scale/util.go | 19 + vendor/k8s.io/client-go/testing/BUILD | 18 + vendor/k8s.io/client-go/testing/fixture.go | 60 +- .../k8s.io/client-go/testing/fixture_test.go | 192 + vendor/k8s.io/client-go/tools/auth/BUILD | 1 - .../k8s.io/client-go/tools/auth/clientauth.go | 2 +- .../tools/bootstrap/token/api}/BUILD | 13 +- .../tools/bootstrap/token/api/OWNERS | 5 + .../tools/bootstrap/token/api/doc.go | 20 + .../tools/bootstrap/token/api/types.go | 100 + .../tools/bootstrap/token/util}/BUILD | 16 +- .../tools/bootstrap/token/util/helpers.go | 52 + .../bootstrap/token/util/helpers_test.go | 76 + vendor/k8s.io/client-go/tools/cache/BUILD | 6 +- .../client-go/tools/cache/controller.go | 4 +- .../client-go/tools/cache/controller_test.go | 2 +- .../client-go/tools/cache/delta_fifo.go | 84 +- .../client-go/tools/cache/delta_fifo_test.go | 57 +- vendor/k8s.io/client-go/tools/cache/fifo.go | 2 +- .../k8s.io/client-go/tools/cache/listwatch.go | 14 +- .../k8s.io/client-go/tools/cache/reflector.go | 10 +- .../client-go/tools/cache/shared_informer.go | 59 +- .../tools/cache/shared_informer_test.go | 12 + .../client-go/tools/cache/testing/BUILD | 3 +- vendor/k8s.io/client-go/tools/clientcmd/BUILD | 3 +- .../client-go/tools/clientcmd/api/BUILD | 3 +- .../client-go/tools/clientcmd/api/types.go | 32 + .../client-go/tools/clientcmd/api/v1/types.go | 32 + .../clientcmd/api/v1/zz_generated.deepcopy.go | 58 +- .../clientcmd/api/zz_generated.deepcopy.go | 58 +- .../tools/clientcmd/client_config.go | 12 +- .../tools/clientcmd/client_config_test.go | 2 +- .../client-go/tools/clientcmd/loader.go | 11 +- .../client-go/tools/clientcmd/loader_test.go | 19 +- .../client-go/tools/clientcmd/validation.go | 23 + .../tools/clientcmd/validation_test.go | 129 + .../client-go/tools/leaderelection/BUILD | 3 +- .../tools/leaderelection/leaderelection.go | 4 +- .../leaderelection/leaderelection_test.go | 2 +- .../resourcelock/configmaplock.go | 12 +- vendor/k8s.io/client-go/tools/pager/BUILD | 5 +- .../client-go/tools/pager/pager_test.go | 6 +- .../k8s.io/client-go/tools/portforward/BUILD | 3 +- .../tools/portforward/portforward.go | 4 +- .../tools/portforward/portforward_test.go | 2 +- vendor/k8s.io/client-go/tools/record/BUILD | 3 +- .../client-go/tools/remotecommand/BUILD | 3 +- vendor/k8s.io/client-go/transport/BUILD | 6 +- vendor/k8s.io/client-go/transport/cache.go | 33 +- vendor/k8s.io/client-go/transport/config.go | 4 - .../client-go/transport/round_trippers.go | 31 - .../transport/round_trippers_test.go | 61 - vendor/k8s.io/client-go/util/buffer/BUILD | 3 +- vendor/k8s.io/client-go/util/cert/BUILD | 3 +- vendor/k8s.io/client-go/util/cert/cert.go | 42 +- .../k8s.io/client-go/util/certificate/BUILD | 3 +- .../util/certificate/certificate_manager.go | 89 +- .../certificate/certificate_manager_test.go | 61 +- .../client-go/util/certificate/csr/BUILD | 3 +- .../k8s.io/client-go/util/flowcontrol/BUILD | 5 +- .../client-go/util/flowcontrol/throttle.go | 55 +- .../util/flowcontrol/throttle_test.go | 24 - vendor/k8s.io/client-go/util/integer/BUILD | 3 +- vendor/k8s.io/client-go/util/jsonpath/BUILD | 3 +- .../client-go/util/jsonpath/jsonpath_test.go | 2 +- vendor/k8s.io/client-go/util/retry/BUILD | 3 +- vendor/k8s.io/client-go/util/testing/BUILD | 3 +- vendor/k8s.io/client-go/util/workqueue/BUILD | 6 +- .../util/workqueue/default_rate_limiters.go | 8 +- .../util/workqueue/delaying_queue.go | 2 +- 1420 files changed, 26419 insertions(+), 79921 deletions(-) delete mode 100644 vendor/github.com/PuerkitoBio/purell/.gitignore delete mode 100644 vendor/github.com/PuerkitoBio/purell/LICENSE delete mode 100644 vendor/github.com/PuerkitoBio/purell/README.md delete mode 100644 vendor/github.com/PuerkitoBio/purell/bench_test.go delete mode 100644 vendor/github.com/PuerkitoBio/purell/benchmarks/v0.1.0 delete mode 100644 vendor/github.com/PuerkitoBio/purell/example_test.go delete mode 100644 vendor/github.com/PuerkitoBio/purell/purell.go delete mode 100644 vendor/github.com/PuerkitoBio/purell/purell_test.go delete mode 100644 vendor/github.com/PuerkitoBio/purell/urlnorm_test.go delete mode 100644 vendor/github.com/PuerkitoBio/urlesc/README.md delete mode 100644 vendor/github.com/PuerkitoBio/urlesc/urlesc.go delete mode 100644 vendor/github.com/PuerkitoBio/urlesc/urlesc_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/.gitignore delete mode 100644 vendor/github.com/emicklei/go-restful/CHANGES.md delete mode 100644 vendor/github.com/emicklei/go-restful/LICENSE delete mode 100644 vendor/github.com/emicklei/go-restful/Makefile delete mode 100644 vendor/github.com/emicklei/go-restful/README.md delete mode 100644 vendor/github.com/emicklei/go-restful/Srcfile delete mode 100644 vendor/github.com/emicklei/go-restful/bench_curly_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/bench_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/bench_test.sh delete mode 100644 vendor/github.com/emicklei/go-restful/compress.go delete mode 100644 vendor/github.com/emicklei/go-restful/compress_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/compressor_cache.go delete mode 100644 vendor/github.com/emicklei/go-restful/compressor_pools.go delete mode 100644 vendor/github.com/emicklei/go-restful/compressors.go delete mode 100644 vendor/github.com/emicklei/go-restful/constants.go delete mode 100644 vendor/github.com/emicklei/go-restful/container.go delete mode 100644 vendor/github.com/emicklei/go-restful/container_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/cors_filter.go delete mode 100644 vendor/github.com/emicklei/go-restful/cors_filter_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/coverage.sh delete mode 100644 vendor/github.com/emicklei/go-restful/curly.go delete mode 100644 vendor/github.com/emicklei/go-restful/curly_route.go delete mode 100644 vendor/github.com/emicklei/go-restful/curly_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/doc.go delete mode 100644 vendor/github.com/emicklei/go-restful/doc_examples_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/entity_accessors.go delete mode 100644 vendor/github.com/emicklei/go-restful/entity_accessors_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/google_app_engine/app.yaml delete mode 100644 vendor/github.com/emicklei/go-restful/examples/google_app_engine/datastore/app.yaml delete mode 100644 vendor/github.com/emicklei/go-restful/examples/google_app_engine/datastore/main.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/google_app_engine/restful-appstats-integration.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/google_app_engine/restful-user-service.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/home.html delete mode 100644 vendor/github.com/emicklei/go-restful/examples/msgpack/msgpack_entity.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/msgpack/msgpack_entity_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-CORS-filter.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-NCSA-logging.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-basic-authentication.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-cpuprofiler-service.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-curly-router.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-curly-router_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-encoding-filter.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-filters.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-form-handling.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-hello-world.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-html-template.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-multi-containers.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-no-cache-filter.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-options-filter.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-path-tail.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-pre-post-filters.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-resource-functions.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-route_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-routefunction_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-serve-static.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-swagger.go delete mode 100644 vendor/github.com/emicklei/go-restful/examples/restful-user-resource.go delete mode 100644 vendor/github.com/emicklei/go-restful/filter.go delete mode 100644 vendor/github.com/emicklei/go-restful/filter_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/jsr311.go delete mode 100644 vendor/github.com/emicklei/go-restful/jsr311_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/log/log.go delete mode 100644 vendor/github.com/emicklei/go-restful/logger.go delete mode 100644 vendor/github.com/emicklei/go-restful/mime.go delete mode 100644 vendor/github.com/emicklei/go-restful/mime_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/options_filter.go delete mode 100644 vendor/github.com/emicklei/go-restful/options_filter_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/parameter.go delete mode 100644 vendor/github.com/emicklei/go-restful/path_expression.go delete mode 100644 vendor/github.com/emicklei/go-restful/path_expression_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/request.go delete mode 100644 vendor/github.com/emicklei/go-restful/request_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/response.go delete mode 100644 vendor/github.com/emicklei/go-restful/response_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/route.go delete mode 100644 vendor/github.com/emicklei/go-restful/route_builder.go delete mode 100644 vendor/github.com/emicklei/go-restful/route_builder_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/route_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/router.go delete mode 100644 vendor/github.com/emicklei/go-restful/service_error.go delete mode 100644 vendor/github.com/emicklei/go-restful/tracer_test.go delete mode 100644 vendor/github.com/emicklei/go-restful/web_service.go delete mode 100644 vendor/github.com/emicklei/go-restful/web_service_container.go delete mode 100644 vendor/github.com/emicklei/go-restful/web_service_test.go delete mode 100644 vendor/github.com/go-openapi/jsonpointer/.gitignore delete mode 100644 vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/go-openapi/jsonpointer/LICENSE delete mode 100644 vendor/github.com/go-openapi/jsonpointer/README.md delete mode 100644 vendor/github.com/go-openapi/jsonpointer/pointer.go delete mode 100644 vendor/github.com/go-openapi/jsonpointer/pointer_test.go delete mode 100644 vendor/github.com/go-openapi/jsonreference/.gitignore delete mode 100644 vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/go-openapi/jsonreference/LICENSE delete mode 100644 vendor/github.com/go-openapi/jsonreference/README.md delete mode 100644 vendor/github.com/go-openapi/jsonreference/reference.go delete mode 100644 vendor/github.com/go-openapi/jsonreference/reference_test.go delete mode 100644 vendor/github.com/go-openapi/spec/.gitignore delete mode 100644 vendor/github.com/go-openapi/spec/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/go-openapi/spec/LICENSE delete mode 100644 vendor/github.com/go-openapi/spec/README.md delete mode 100644 vendor/github.com/go-openapi/spec/auth_test.go delete mode 100644 vendor/github.com/go-openapi/spec/bindata.go delete mode 100644 vendor/github.com/go-openapi/spec/contact_info.go delete mode 100644 vendor/github.com/go-openapi/spec/contact_info_test.go delete mode 100644 vendor/github.com/go-openapi/spec/expander.go delete mode 100644 vendor/github.com/go-openapi/spec/expander_test.go delete mode 100644 vendor/github.com/go-openapi/spec/external_docs.go delete mode 100644 vendor/github.com/go-openapi/spec/external_docs_test.go delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/all-the-things.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/circularRefs.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.yaml delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.yaml delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/invalid-refs.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/missingItemRef.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/missingRef.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/overflow.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/params.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/schemas1.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/expansion/schemas2.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/local_expansion/item.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/local_expansion/spec.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/specs/deeper/arrayProp.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/specs/deeper/stringProp.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/specs/refed.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/specs/resolution.json delete mode 100644 vendor/github.com/go-openapi/spec/fixtures/specs/resolution2.json delete mode 100644 vendor/github.com/go-openapi/spec/header.go delete mode 100644 vendor/github.com/go-openapi/spec/header_test.go delete mode 100644 vendor/github.com/go-openapi/spec/info.go delete mode 100644 vendor/github.com/go-openapi/spec/info_test.go delete mode 100644 vendor/github.com/go-openapi/spec/items.go delete mode 100644 vendor/github.com/go-openapi/spec/items_test.go delete mode 100644 vendor/github.com/go-openapi/spec/license.go delete mode 100644 vendor/github.com/go-openapi/spec/license_test.go delete mode 100644 vendor/github.com/go-openapi/spec/operation.go delete mode 100644 vendor/github.com/go-openapi/spec/operation_test.go delete mode 100644 vendor/github.com/go-openapi/spec/parameter.go delete mode 100644 vendor/github.com/go-openapi/spec/parameters_test.go delete mode 100644 vendor/github.com/go-openapi/spec/path_item.go delete mode 100644 vendor/github.com/go-openapi/spec/path_item_test.go delete mode 100644 vendor/github.com/go-openapi/spec/paths.go delete mode 100644 vendor/github.com/go-openapi/spec/paths_test.go delete mode 100644 vendor/github.com/go-openapi/spec/properties_test.go delete mode 100644 vendor/github.com/go-openapi/spec/ref.go delete mode 100644 vendor/github.com/go-openapi/spec/refmodifier.go delete mode 100644 vendor/github.com/go-openapi/spec/refmodifier_test.go delete mode 100644 vendor/github.com/go-openapi/spec/response.go delete mode 100644 vendor/github.com/go-openapi/spec/response_test.go delete mode 100644 vendor/github.com/go-openapi/spec/responses.go delete mode 100644 vendor/github.com/go-openapi/spec/schema.go delete mode 100644 vendor/github.com/go-openapi/spec/schema_test.go delete mode 100644 vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json delete mode 100644 vendor/github.com/go-openapi/spec/schemas/v2/README.md delete mode 100644 vendor/github.com/go-openapi/spec/schemas/v2/schema.json delete mode 100644 vendor/github.com/go-openapi/spec/security_scheme.go delete mode 100644 vendor/github.com/go-openapi/spec/spec.go delete mode 100644 vendor/github.com/go-openapi/spec/structs_test.go delete mode 100644 vendor/github.com/go-openapi/spec/swagger.go delete mode 100644 vendor/github.com/go-openapi/spec/swagger_test.go delete mode 100644 vendor/github.com/go-openapi/spec/tag.go delete mode 100644 vendor/github.com/go-openapi/spec/xml_object.go delete mode 100644 vendor/github.com/go-openapi/spec/xml_object_test.go delete mode 100644 vendor/github.com/go-openapi/swag/.gitignore delete mode 100644 vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/go-openapi/swag/LICENSE delete mode 100644 vendor/github.com/go-openapi/swag/README.md delete mode 100644 vendor/github.com/go-openapi/swag/convert.go delete mode 100644 vendor/github.com/go-openapi/swag/convert_test.go delete mode 100644 vendor/github.com/go-openapi/swag/convert_types.go delete mode 100644 vendor/github.com/go-openapi/swag/convert_types_test.go delete mode 100644 vendor/github.com/go-openapi/swag/json.go delete mode 100644 vendor/github.com/go-openapi/swag/json_test.go delete mode 100644 vendor/github.com/go-openapi/swag/loading.go delete mode 100644 vendor/github.com/go-openapi/swag/loading_test.go delete mode 100644 vendor/github.com/go-openapi/swag/net.go delete mode 100644 vendor/github.com/go-openapi/swag/net_test.go delete mode 100644 vendor/github.com/go-openapi/swag/path.go delete mode 100644 vendor/github.com/go-openapi/swag/path_test.go delete mode 100644 vendor/github.com/go-openapi/swag/util.go delete mode 100644 vendor/github.com/go-openapi/swag/util_test.go delete mode 100644 vendor/github.com/go-openapi/swag/yaml.go delete mode 100644 vendor/github.com/go-openapi/swag/yaml_test.go delete mode 100644 vendor/github.com/google/btree/LICENSE delete mode 100644 vendor/github.com/google/btree/README.md delete mode 100644 vendor/github.com/google/btree/btree.go delete mode 100644 vendor/github.com/google/btree/btree_mem.go delete mode 100644 vendor/github.com/google/btree/btree_test.go delete mode 100644 vendor/github.com/gregjones/httpcache/LICENSE.txt delete mode 100644 vendor/github.com/gregjones/httpcache/README.md delete mode 100644 vendor/github.com/gregjones/httpcache/diskcache/diskcache.go delete mode 100644 vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go delete mode 100644 vendor/github.com/gregjones/httpcache/httpcache.go delete mode 100644 vendor/github.com/gregjones/httpcache/httpcache_test.go delete mode 100644 vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go delete mode 100644 vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go delete mode 100644 vendor/github.com/gregjones/httpcache/memcache/appengine.go delete mode 100644 vendor/github.com/gregjones/httpcache/memcache/appengine_test.go delete mode 100644 vendor/github.com/gregjones/httpcache/memcache/memcache.go delete mode 100644 vendor/github.com/gregjones/httpcache/memcache/memcache_test.go delete mode 100644 vendor/github.com/gregjones/httpcache/redis/redis.go delete mode 100644 vendor/github.com/gregjones/httpcache/redis/redis_test.go delete mode 100644 vendor/github.com/juju/ratelimit/LICENSE delete mode 100644 vendor/github.com/juju/ratelimit/README.md delete mode 100644 vendor/github.com/juju/ratelimit/ratelimit.go delete mode 100644 vendor/github.com/juju/ratelimit/ratelimit_test.go delete mode 100644 vendor/github.com/juju/ratelimit/reader.go delete mode 100644 vendor/github.com/mailru/easyjson/.gitignore delete mode 100644 vendor/github.com/mailru/easyjson/LICENSE delete mode 100644 vendor/github.com/mailru/easyjson/Makefile delete mode 100644 vendor/github.com/mailru/easyjson/README.md delete mode 100644 vendor/github.com/mailru/easyjson/benchmark/codec_test.go delete mode 100644 vendor/github.com/mailru/easyjson/benchmark/data.go delete mode 100644 vendor/github.com/mailru/easyjson/benchmark/data_codec.go delete mode 100644 vendor/github.com/mailru/easyjson/benchmark/data_ffjson.go delete mode 100644 vendor/github.com/mailru/easyjson/benchmark/data_var.go delete mode 100644 vendor/github.com/mailru/easyjson/benchmark/default_test.go delete mode 100644 vendor/github.com/mailru/easyjson/benchmark/dummy_test.go delete mode 100644 vendor/github.com/mailru/easyjson/benchmark/easyjson_test.go delete mode 100644 vendor/github.com/mailru/easyjson/benchmark/example.json delete mode 100644 vendor/github.com/mailru/easyjson/benchmark/ffjson_test.go delete mode 100644 vendor/github.com/mailru/easyjson/benchmark/jsoniter_test.go delete mode 100755 vendor/github.com/mailru/easyjson/benchmark/ujson.sh delete mode 100644 vendor/github.com/mailru/easyjson/bootstrap/bootstrap.go delete mode 100644 vendor/github.com/mailru/easyjson/buffer/pool.go delete mode 100644 vendor/github.com/mailru/easyjson/buffer/pool_test.go delete mode 100644 vendor/github.com/mailru/easyjson/easyjson/main.go delete mode 100644 vendor/github.com/mailru/easyjson/gen/decoder.go delete mode 100644 vendor/github.com/mailru/easyjson/gen/encoder.go delete mode 100644 vendor/github.com/mailru/easyjson/gen/generator.go delete mode 100644 vendor/github.com/mailru/easyjson/gen/generator_test.go delete mode 100644 vendor/github.com/mailru/easyjson/helpers.go delete mode 100644 vendor/github.com/mailru/easyjson/jlexer/bytestostr.go delete mode 100644 vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go delete mode 100644 vendor/github.com/mailru/easyjson/jlexer/error.go delete mode 100644 vendor/github.com/mailru/easyjson/jlexer/lexer.go delete mode 100644 vendor/github.com/mailru/easyjson/jlexer/lexer_test.go delete mode 100644 vendor/github.com/mailru/easyjson/jwriter/writer.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Bool.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Float32.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Float64.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Int.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Int16.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Int32.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Int64.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Int8.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_String.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Uint.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Uint16.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Uint32.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Uint64.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/gotemplate_Uint8.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/optional/opt.go delete mode 100644 vendor/github.com/mailru/easyjson/opt/opts.go delete mode 100644 vendor/github.com/mailru/easyjson/parser/parser.go delete mode 100644 vendor/github.com/mailru/easyjson/parser/parser_unix.go delete mode 100644 vendor/github.com/mailru/easyjson/parser/parser_windows.go delete mode 100644 vendor/github.com/mailru/easyjson/raw.go delete mode 100644 vendor/github.com/mailru/easyjson/tests/basic_test.go delete mode 100644 vendor/github.com/mailru/easyjson/tests/data.go delete mode 100644 vendor/github.com/mailru/easyjson/tests/errors.go delete mode 100644 vendor/github.com/mailru/easyjson/tests/errors_test.go delete mode 100644 vendor/github.com/mailru/easyjson/tests/named_type.go delete mode 100644 vendor/github.com/mailru/easyjson/tests/nested_easy.go delete mode 100644 vendor/github.com/mailru/easyjson/tests/nothing.go delete mode 100644 vendor/github.com/mailru/easyjson/tests/omitempty.go delete mode 100644 vendor/github.com/mailru/easyjson/tests/required_test.go delete mode 100644 vendor/github.com/mailru/easyjson/tests/snake.go delete mode 100644 vendor/github.com/petar/GoLLRB/.gitignore delete mode 100644 vendor/github.com/petar/GoLLRB/AUTHORS delete mode 100644 vendor/github.com/petar/GoLLRB/LICENSE delete mode 100644 vendor/github.com/petar/GoLLRB/README.md delete mode 100644 vendor/github.com/petar/GoLLRB/doc/Sedgewick-LLRB.pdf delete mode 100644 vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java delete mode 100644 vendor/github.com/petar/GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf delete mode 100644 vendor/github.com/petar/GoLLRB/example/ex1.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/avgvar.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/iterator.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/iterator_test.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/llrb-stats.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/llrb.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/llrb_test.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/util.go delete mode 100644 vendor/github.com/peterbourgon/diskv/LICENSE delete mode 100644 vendor/github.com/peterbourgon/diskv/README.md delete mode 100644 vendor/github.com/peterbourgon/diskv/basic_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/compression.go delete mode 100644 vendor/github.com/peterbourgon/diskv/compression_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/diskv.go delete mode 100644 vendor/github.com/peterbourgon/diskv/examples/content-addressable-store/cas.go delete mode 100644 vendor/github.com/peterbourgon/diskv/examples/super-simple-store/super-simple-store.go delete mode 100644 vendor/github.com/peterbourgon/diskv/import_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/index.go delete mode 100644 vendor/github.com/peterbourgon/diskv/index_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/issues_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/keys_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/speed_test.go delete mode 100644 vendor/github.com/peterbourgon/diskv/stream_test.go create mode 100644 vendor/golang.org/x/time/AUTHORS create mode 100644 vendor/golang.org/x/time/CONTRIBUTING.md create mode 100644 vendor/golang.org/x/time/CONTRIBUTORS rename vendor/{github.com/PuerkitoBio/urlesc => golang.org/x/time}/LICENSE (96%) create mode 100644 vendor/golang.org/x/time/PATENTS create mode 100644 vendor/golang.org/x/time/README.md create mode 100644 vendor/golang.org/x/time/rate/rate.go create mode 100644 vendor/golang.org/x/time/rate/rate_go16.go create mode 100644 vendor/golang.org/x/time/rate/rate_go17.go create mode 100644 vendor/golang.org/x/time/rate/rate_test.go create mode 100644 vendor/k8s.io/api/CONTRIBUTING.md create mode 100644 vendor/k8s.io/api/Godeps/OWNERS delete mode 100644 vendor/k8s.io/api/admission/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/apps/v1/BUILD delete mode 100644 vendor/k8s.io/api/apps/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/apps/v1beta2/BUILD delete mode 100644 vendor/k8s.io/api/authentication/v1/BUILD delete mode 100644 vendor/k8s.io/api/authentication/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/authorization/v1/BUILD delete mode 100644 vendor/k8s.io/api/authorization/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/autoscaling/v1/BUILD delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/BUILD delete mode 100644 vendor/k8s.io/api/batch/v1/BUILD delete mode 100644 vendor/k8s.io/api/batch/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/BUILD delete mode 100644 vendor/k8s.io/api/certificates/v1beta1/BUILD create mode 100644 vendor/k8s.io/api/code-of-conduct.md delete mode 100644 vendor/k8s.io/api/core/v1/BUILD delete mode 100644 vendor/k8s.io/api/events/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/extensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/imagepolicy/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/networking/v1/BUILD delete mode 100644 vendor/k8s.io/api/policy/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/rbac/v1/BUILD delete mode 100644 vendor/k8s.io/api/rbac/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/rbac/v1beta1/BUILD delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/settings/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/storage/v1/BUILD delete mode 100644 vendor/k8s.io/api/storage/v1alpha1/BUILD delete mode 100644 vendor/k8s.io/api/storage/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/BUILD create mode 100644 vendor/k8s.io/apiextensions-apiserver/CONTRIBUTING.md create mode 100644 vendor/k8s.io/apiextensions-apiserver/Godeps/OWNERS create mode 100644 vendor/k8s.io/apiextensions-apiserver/code-of-conduct.md delete mode 100644 vendor/k8s.io/apiextensions-apiserver/examples/client-go/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/fake/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/typed/cr/v1/fake/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/cr/v1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/informers/externalversions/internalinterfaces/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/examples/client-go/pkg/client/listers/cr/v1/BUILD rename vendor/k8s.io/{apimachinery/pkg/apis/testapigroup/v1/types_swagger_doc_generated.go => apiextensions-apiserver/hack/boilerplate.go.txt} (91%) delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/fuzzer/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/apiserver/validation/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/fake/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/scheme/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/fake/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/clientset/internalclientset/typed/apiextensions/internalversion/fake/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/apiextensions/internalversion/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion/internalinterfaces/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/internalversion/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/cmd/server/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/controller/finalizer/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/controller/status/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/features/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/BUILD create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/etcd_test.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/registry.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/status_strategy_test.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor/tableconvertor.go create mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresource/validator.go delete mode 100644 vendor/k8s.io/apiextensions-apiserver/pkg/registry/customresourcedefinition/BUILD delete mode 100644 vendor/k8s.io/apiextensions-apiserver/test/integration/BUILD create mode 100644 vendor/k8s.io/apiextensions-apiserver/test/integration/subresources_test.go delete mode 100644 vendor/k8s.io/apiextensions-apiserver/test/integration/testserver/BUILD create mode 100644 vendor/k8s.io/apiextensions-apiserver/test/integration/yaml_test.go create mode 100644 vendor/k8s.io/apimachinery/CONTRIBUTING.md create mode 100644 vendor/k8s.io/apimachinery/Godeps/OWNERS create mode 100644 vendor/k8s.io/apimachinery/code-of-conduct.md delete mode 100755 vendor/k8s.io/apimachinery/hack/godep-deps.sh delete mode 100755 vendor/k8s.io/apimachinery/hack/sync-from-kubernetes.sh delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/equality/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/errors/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/BUILD create mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/table/table.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/testing/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/testing/fuzzer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/testing/roundtrip/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/validation/path/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/announced/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apimachinery/registered/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/fuzzer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/internalversion/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/validation/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/BUILD rename vendor/k8s.io/apimachinery/pkg/apis/meta/{v1alpha1 => v1beta1}/conversion.go (73%) rename vendor/k8s.io/apimachinery/pkg/apis/meta/{v1alpha1 => v1beta1}/deepcopy.go (98%) rename vendor/k8s.io/apimachinery/pkg/apis/meta/{v1alpha1 => v1beta1}/doc.go (97%) rename vendor/k8s.io/apimachinery/pkg/apis/meta/{v1alpha1 => v1beta1}/generated.pb.go (83%) rename vendor/k8s.io/apimachinery/pkg/apis/meta/{v1alpha1 => v1beta1}/generated.proto (94%) rename vendor/k8s.io/apimachinery/pkg/apis/meta/{v1alpha1 => v1beta1}/register.go (92%) rename vendor/k8s.io/apimachinery/pkg/apis/meta/{v1alpha1 => v1beta1}/types.go (98%) rename vendor/k8s.io/apimachinery/pkg/apis/meta/{v1alpha1 => v1beta1}/types_swagger_doc_generated.go (98%) rename vendor/k8s.io/apimachinery/pkg/apis/meta/{v1alpha1 => v1beta1}/zz_generated.deepcopy.go (96%) create mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.defaults.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/testapigroup/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/testapigroup/fuzzer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/testapigroup/install/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/testapigroup/v1/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/queryparams/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/fields/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/labels/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/schema/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/testing/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/testing/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/yaml/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/testing/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/selection/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/test/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/types/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/cache/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/clock/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/diff/BUILD create mode 100644 vendor/k8s.io/apimachinery/pkg/util/duration/duration.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/errors/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/framer/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/initialization/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/intstr/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/json/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/jsonmergepatch/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/mergepatch/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/proxy/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/rand/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/remotecommand/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/runtime/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/types/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/strategicpatch/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/strategicpatch/testing/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/uuid/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/field/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/wait/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/yaml/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/version/BUILD delete mode 100644 vendor/k8s.io/apimachinery/pkg/watch/BUILD delete mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/json/BUILD delete mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/BUILD delete mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/BUILD create mode 100644 vendor/k8s.io/client-go/CONTRIBUTING.md create mode 100644 vendor/k8s.io/client-go/Godeps/OWNERS create mode 100644 vendor/k8s.io/client-go/code-of-conduct.md create mode 100644 vendor/k8s.io/client-go/informers/policy/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/informers/storage/v1beta1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/fake/fake_serviceaccount_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount_expansion.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/fake/fake_podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/fake/fake_volumeattachment.go create mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/volumeattachment.go create mode 100644 vendor/k8s.io/client-go/listers/policy/v1beta1/podsecuritypolicy.go create mode 100644 vendor/k8s.io/client-go/listers/storage/v1beta1/volumeattachment.go rename vendor/k8s.io/{apiextensions-apiserver/examples/client-go/pkg/client/clientset/versioned/scheme => client-go/pkg/apis/clientauthentication}/BUILD (66%) create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/doc.go rename vendor/k8s.io/{apiextensions-apiserver/pkg/client/clientset/internalclientset/scheme => client-go/pkg/apis/clientauthentication/install}/BUILD (57%) create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/install/install.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/register.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/types.go rename vendor/k8s.io/{apiextensions-apiserver/examples/client-go/pkg/apis/cr/v1 => client-go/pkg/apis/clientauthentication/v1alpha1}/BUILD (71%) create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/doc.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/register.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/types.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go rename vendor/k8s.io/{apimachinery/pkg/apis/meta => client-go/pkg/apis/clientauthentication}/v1alpha1/zz_generated.defaults.go (92%) create mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/client-go/plugin/pkg/auth/authenticator/token/oidc/testing/BUILD delete mode 100644 vendor/k8s.io/client-go/plugin/pkg/auth/authenticator/token/oidc/testing/provider.go create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/BUILD create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go create mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec_test.go create mode 100755 vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/testdata/test-plugin.sh delete mode 100644 vendor/k8s.io/client-go/rest/versions.go create mode 100644 vendor/k8s.io/client-go/testing/fixture_test.go rename vendor/k8s.io/{apiextensions-apiserver/examples/client-go/pkg/apis/cr => client-go/tools/bootstrap/token/api}/BUILD (63%) create mode 100644 vendor/k8s.io/client-go/tools/bootstrap/token/api/OWNERS create mode 100644 vendor/k8s.io/client-go/tools/bootstrap/token/api/doc.go create mode 100644 vendor/k8s.io/client-go/tools/bootstrap/token/api/types.go rename vendor/k8s.io/{apimachinery/pkg/util/waitgroup => client-go/tools/bootstrap/token/util}/BUILD (59%) create mode 100644 vendor/k8s.io/client-go/tools/bootstrap/token/util/helpers.go create mode 100644 vendor/k8s.io/client-go/tools/bootstrap/token/util/helpers_test.go diff --git a/Gopkg.lock b/Gopkg.lock index 8ea1e332c1..730f74d467 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1,18 +1,6 @@ # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. -[[projects]] - name = "github.com/PuerkitoBio/purell" - packages = ["."] - revision = "0bcb03f4b4d0a9428594752bd2a3b9aa0a9d4bd4" - version = "v1.1.0" - -[[projects]] - branch = "master" - name = "github.com/PuerkitoBio/urlesc" - packages = ["."] - revision = "de5bf2ad457846296e2031421a34e2568e304e35" - [[projects]] branch = "master" name = "github.com/beorn7/perks" @@ -25,15 +13,6 @@ revision = "346938d642f2ec3594ed81d874461961cd0faa76" version = "v1.1.0" -[[projects]] - name = "github.com/emicklei/go-restful" - packages = [ - ".", - "log" - ] - revision = "5741799b275a3c4a5a9623a993576d7545cf7b5c" - version = "v2.4.0" - [[projects]] name = "github.com/fsnotify/fsnotify" packages = ["."] @@ -46,30 +25,6 @@ revision = "0ca9ea5df5451ffdf184b4428c902747c2c11cd7" version = "v1.0.0" -[[projects]] - branch = "master" - name = "github.com/go-openapi/jsonpointer" - packages = ["."] - revision = "779f45308c19820f1a69e9a4cd965f496e0da10f" - -[[projects]] - branch = "master" - name = "github.com/go-openapi/jsonreference" - packages = ["."] - revision = "36d33bfe519efae5632669801b180bf1a245da3b" - -[[projects]] - branch = "master" - name = "github.com/go-openapi/spec" - packages = ["."] - revision = "84b5bee7bcb76f3d17bcbaf421bac44bd5709ca6" - -[[projects]] - branch = "master" - name = "github.com/go-openapi/swag" - packages = ["."] - revision = "f3f9494671f93fcff853e3c6e9e948b3eb71e590" - [[projects]] name = "github.com/gogo/protobuf" packages = [ @@ -106,12 +61,6 @@ revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" version = "v1.1.0" -[[projects]] - branch = "master" - name = "github.com/google/btree" - packages = ["."] - revision = "316fb6d3f031ae8f4d457c6c5186b9e3ded70435" - [[projects]] branch = "master" name = "github.com/google/gofuzz" @@ -128,15 +77,6 @@ revision = "ee43cbb60db7bd22502942cccbc39059117352ab" version = "v0.1.0" -[[projects]] - branch = "master" - name = "github.com/gregjones/httpcache" - packages = [ - ".", - "diskcache" - ] - revision = "c1f8028e62adb3d518b823a2f8e6a95c38bdd3aa" - [[projects]] name = "github.com/grpc-ecosystem/grpc-gateway" packages = [ @@ -184,28 +124,12 @@ revision = "6240e1e7983a85228f7fd9c3e1b6932d46ec58e2" version = "1.0.3" -[[projects]] - branch = "master" - name = "github.com/juju/ratelimit" - packages = ["."] - revision = "59fac5042749a5afb9af70e813da1dd5474f0167" - [[projects]] name = "github.com/magiconair/properties" packages = ["."] revision = "be5ece7dd465ab0765a9682137865547526d1dfb" version = "v1.7.3" -[[projects]] - branch = "master" - name = "github.com/mailru/easyjson" - packages = [ - "buffer", - "jlexer", - "jwriter" - ] - revision = "4d347d79dea0067c945f374f990601decb08abb5" - [[projects]] branch = "master" name = "github.com/mattbaird/jsonpatch" @@ -230,18 +154,6 @@ revision = "16398bac157da96aa88f98a2df640c7f32af1da2" version = "v1.0.1" -[[projects]] - branch = "master" - name = "github.com/petar/GoLLRB" - packages = ["llrb"] - revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4" - -[[projects]] - name = "github.com/peterbourgon/diskv" - packages = ["."] - revision = "5f041e8faa004a95c88a202771f4cc3e991971e6" - version = "v2.0.1" - [[projects]] name = "github.com/pkg/errors" packages = ["."] @@ -378,11 +290,16 @@ "unicode/bidi", "unicode/cldr", "unicode/norm", - "unicode/rangetable", - "width" + "unicode/rangetable" ] revision = "3cfc6c0d6bf80d724d98c26c4822f4a35d37598e" +[[projects]] + branch = "master" + name = "golang.org/x/time" + packages = ["rate"] + revision = "fbb02b2291d28baffd63558aa44b4b56f178d650" + [[projects]] branch = "master" name = "google.golang.org/genproto" @@ -436,6 +353,7 @@ revision = "eb3733d160e74a9c7e442f435eb3bea458e1d19f" [[projects]] + branch = "release-1.10" name = "k8s.io/api" packages = [ "admission/v1beta1", @@ -468,8 +386,7 @@ "storage/v1alpha1", "storage/v1beta1" ] - revision = "006a217681ae70cbacdd66a5e2fca1a61a8ff28e" - version = "kubernetes-1.9.1" + revision = "8b7507fac302640dd5f1efbf9643199952cc58db" [[projects]] name = "k8s.io/apiextensions-apiserver" @@ -482,8 +399,8 @@ "pkg/client/clientset/clientset/typed/apiextensions/v1beta1", "pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake" ] - revision = "6f29dd12234812844d29f52bd520bb01374619ce" - version = "kubernetes-1.9.2" + revision = "8e7f43002fec5394a8d96ebca781aa9d4b37aaef" + version = "kubernetes-1.10.4" [[projects]] name = "k8s.io/apimachinery" @@ -494,7 +411,7 @@ "pkg/apis/meta/internalversion", "pkg/apis/meta/v1", "pkg/apis/meta/v1/unstructured", - "pkg/apis/meta/v1alpha1", + "pkg/apis/meta/v1beta1", "pkg/conversion", "pkg/conversion/queryparams", "pkg/fields", @@ -530,8 +447,8 @@ "third_party/forked/golang/json", "third_party/forked/golang/reflect" ] - revision = "68f9c3a1feb3140df59c67ced62d3a5df8e6c9c2" - version = "kubernetes-1.9.1" + revision = "17529ec7eadb8de8e7dc835201455f53571f655a" + version = "kubernetes-1.10.4" [[projects]] name = "k8s.io/client-go" @@ -661,7 +578,10 @@ "listers/storage/v1", "listers/storage/v1alpha1", "listers/storage/v1beta1", + "pkg/apis/clientauthentication", + "pkg/apis/clientauthentication/v1alpha1", "pkg/version", + "plugin/pkg/client/auth/exec", "rest", "rest/watch", "testing", @@ -676,23 +596,21 @@ "util/cert", "util/flowcontrol", "util/integer", + "util/retry", "util/workqueue" ] - revision = "78700dec6369ba22221b72770783300f143df150" - version = "v6.0.0" + revision = "23781f4d6632d88e869066eaebb743857aa1ef9b" + version = "v7.0.0" [[projects]] branch = "master" name = "k8s.io/kube-openapi" - packages = [ - "pkg/common", - "pkg/util/proto" - ] + packages = ["pkg/util/proto"] revision = "d52097ab4580a8f654862188cd66db48e87f62a3" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "cbc0346d5d293a499c2a7e38e248a92594701b92f376b3f421cf40b173871740" + inputs-digest = "5f39542c1eb4cd19061ae02f9ab9edcec2fba90025d6bb435f9eb973d966261c" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 1c0cf88d73..757a701cd3 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -22,19 +22,19 @@ [[constraint]] name = "k8s.io/client-go" - version = "6.0.0" + version = "7.0.0" [[constraint]] name = "k8s.io/apiextensions-apiserver" - version = "kubernetes-1.9.2" + version = "kubernetes-1.10.4" [[constraint]] name = "k8s.io/apimachinery" - version = "kubernetes-1.9.2" + version = "kubernetes-1.10.4" [[constraint]] name = "k8s.io/api" - version = "kubernetes-1.9.2" + version = "kubernetes-1.10.4" [[constraint]] name = "github.com/stretchr/testify" diff --git a/build/gke-test-cluster/cluster.yml.jinja b/build/gke-test-cluster/cluster.yml.jinja index 387aa1439e..d3244805c9 100644 --- a/build/gke-test-cluster/cluster.yml.jinja +++ b/build/gke-test-cluster/cluster.yml.jinja @@ -21,7 +21,7 @@ resources: cluster: name: {{ properties["cluster.name"] }} description: Test cluster for Agones - initialClusterVersion: 1.9.6-gke.1 # be specific until 1.9.x becomes default + initialClusterVersion: 1.10.4-gke.0 # be specific until 1.9.x becomes default nodePools: - name: "default" initialNodeCount: {{ properties["cluster.nodePool.initialNodeCount"] }} diff --git a/install/README.md b/install/README.md index 8f07ce2216..a6ae8a9caf 100644 --- a/install/README.md +++ b/install/README.md @@ -94,7 +94,7 @@ To install `gcloud` and `kubectl`, perform the following steps: A [cluster][cluster] consists of at least one *cluster master* machine and multiple worker machines called *nodes*: [Compute Engine virtual machine][vms] instances that run the Kubernetes processes necessary to make them part of the cluster. ```bash -gcloud container clusters create [CLUSTER_NAME] --cluster-version=1.9 \ +gcloud container clusters create [CLUSTER_NAME] --cluster-version=1.10 \ --no-enable-legacy-authorization \ --tags=game-server \ --enable-basic-auth \ diff --git a/vendor/github.com/PuerkitoBio/purell/.gitignore b/vendor/github.com/PuerkitoBio/purell/.gitignore deleted file mode 100644 index 748e4c8073..0000000000 --- a/vendor/github.com/PuerkitoBio/purell/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -*.sublime-* -.DS_Store -*.swp -*.swo -tags diff --git a/vendor/github.com/PuerkitoBio/purell/LICENSE b/vendor/github.com/PuerkitoBio/purell/LICENSE deleted file mode 100644 index 4b9986dea7..0000000000 --- a/vendor/github.com/PuerkitoBio/purell/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) 2012, Martin Angers -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/PuerkitoBio/purell/README.md b/vendor/github.com/PuerkitoBio/purell/README.md deleted file mode 100644 index 09e8a32cbe..0000000000 --- a/vendor/github.com/PuerkitoBio/purell/README.md +++ /dev/null @@ -1,187 +0,0 @@ -# Purell - -Purell is a tiny Go library to normalize URLs. It returns a pure URL. Pure-ell. Sanitizer and all. Yeah, I know... - -Based on the [wikipedia paper][wiki] and the [RFC 3986 document][rfc]. - -[![build status](https://secure.travis-ci.org/PuerkitoBio/purell.png)](http://travis-ci.org/PuerkitoBio/purell) - -## Install - -`go get github.com/PuerkitoBio/purell` - -## Changelog - -* **2016-11-14 (v1.1.0)** : IDN: Conform to RFC 5895: Fold character width (thanks to @beeker1121). -* **2016-07-27 (v1.0.0)** : Normalize IDN to ASCII (thanks to @zenovich). -* **2015-02-08** : Add fix for relative paths issue ([PR #5][pr5]) and add fix for unnecessary encoding of reserved characters ([see issue #7][iss7]). -* **v0.2.0** : Add benchmarks, Attempt IDN support. -* **v0.1.0** : Initial release. - -## Examples - -From `example_test.go` (note that in your code, you would import "github.com/PuerkitoBio/purell", and would prefix references to its methods and constants with "purell."): - -```go -package purell - -import ( - "fmt" - "net/url" -) - -func ExampleNormalizeURLString() { - if normalized, err := NormalizeURLString("hTTp://someWEBsite.com:80/Amazing%3f/url/", - FlagLowercaseScheme|FlagLowercaseHost|FlagUppercaseEscapes); err != nil { - panic(err) - } else { - fmt.Print(normalized) - } - // Output: http://somewebsite.com:80/Amazing%3F/url/ -} - -func ExampleMustNormalizeURLString() { - normalized := MustNormalizeURLString("hTTpS://someWEBsite.com:443/Amazing%fa/url/", - FlagsUnsafeGreedy) - fmt.Print(normalized) - - // Output: http://somewebsite.com/Amazing%FA/url -} - -func ExampleNormalizeURL() { - if u, err := url.Parse("Http://SomeUrl.com:8080/a/b/.././c///g?c=3&a=1&b=9&c=0#target"); err != nil { - panic(err) - } else { - normalized := NormalizeURL(u, FlagsUsuallySafeGreedy|FlagRemoveDuplicateSlashes|FlagRemoveFragment) - fmt.Print(normalized) - } - - // Output: http://someurl.com:8080/a/c/g?c=3&a=1&b=9&c=0 -} -``` - -## API - -As seen in the examples above, purell offers three methods, `NormalizeURLString(string, NormalizationFlags) (string, error)`, `MustNormalizeURLString(string, NormalizationFlags) (string)` and `NormalizeURL(*url.URL, NormalizationFlags) (string)`. They all normalize the provided URL based on the specified flags. Here are the available flags: - -```go -const ( - // Safe normalizations - FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1 - FlagLowercaseHost // http://HOST -> http://host - FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF - FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA - FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$ - FlagRemoveDefaultPort // http://host:80 -> http://host - FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path - - // Usually safe normalizations - FlagRemoveTrailingSlash // http://host/path/ -> http://host/path - FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags) - FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c - - // Unsafe normalizations - FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/ - FlagRemoveFragment // http://host/path#fragment -> http://host/path - FlagForceHTTP // https://host -> http://host - FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b - FlagRemoveWWW // http://www.host/ -> http://host/ - FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags) - FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3 - - // Normalizations not in the wikipedia article, required to cover tests cases - // submitted by jehiah - FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147 - FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147 - FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147 - FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path - FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path - - // Convenience set of safe normalizations - FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator - - // For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags, - // while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix". - - // Convenience set of usually safe normalizations (includes FlagsSafe) - FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments - FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments - - // Convenience set of unsafe normalizations (includes FlagsUsuallySafe) - FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery - FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery - - // Convenience set of all available flags - FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator - FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator -) -``` - -For convenience, the set of flags `FlagsSafe`, `FlagsUsuallySafe[Greedy|NonGreedy]`, `FlagsUnsafe[Greedy|NonGreedy]` and `FlagsAll[Greedy|NonGreedy]` are provided for the similarly grouped normalizations on [wikipedia's URL normalization page][wiki]. You can add (using the bitwise OR `|` operator) or remove (using the bitwise AND NOT `&^` operator) individual flags from the sets if required, to build your own custom set. - -The [full godoc reference is available on gopkgdoc][godoc]. - -Some things to note: - -* `FlagDecodeUnnecessaryEscapes`, `FlagEncodeNecessaryEscapes`, `FlagUppercaseEscapes` and `FlagRemoveEmptyQuerySeparator` are always implicitly set, because internally, the URL string is parsed as an URL object, which automatically decodes unnecessary escapes, uppercases and encodes necessary ones, and removes empty query separators (an unnecessary `?` at the end of the url). So this operation cannot **not** be done. For this reason, `FlagRemoveEmptyQuerySeparator` (as well as the other three) has been included in the `FlagsSafe` convenience set, instead of `FlagsUnsafe`, where Wikipedia puts it. - -* The `FlagDecodeUnnecessaryEscapes` decodes the following escapes (*from -> to*): - - %24 -> $ - - %26 -> & - - %2B-%3B -> +,-./0123456789:; - - %3D -> = - - %40-%5A -> @ABCDEFGHIJKLMNOPQRSTUVWXYZ - - %5F -> _ - - %61-%7A -> abcdefghijklmnopqrstuvwxyz - - %7E -> ~ - - -* When the `NormalizeURL` function is used (passing an URL object), this source URL object is modified (that is, after the call, the URL object will be modified to reflect the normalization). - -* The *replace IP with domain name* normalization (`http://208.77.188.166/ → http://www.example.com/`) is obviously not possible for a library without making some network requests. This is not implemented in purell. - -* The *remove unused query string parameters* and *remove default query parameters* are also not implemented, since this is a very case-specific normalization, and it is quite trivial to do with an URL object. - -### Safe vs Usually Safe vs Unsafe - -Purell allows you to control the level of risk you take while normalizing an URL. You can aggressively normalize, play it totally safe, or anything in between. - -Consider the following URL: - -`HTTPS://www.RooT.com/toto/t%45%1f///a/./b/../c/?z=3&w=2&a=4&w=1#invalid` - -Normalizing with the `FlagsSafe` gives: - -`https://www.root.com/toto/tE%1F///a/./b/../c/?z=3&w=2&a=4&w=1#invalid` - -With the `FlagsUsuallySafeGreedy`: - -`https://www.root.com/toto/tE%1F///a/c?z=3&w=2&a=4&w=1#invalid` - -And with `FlagsUnsafeGreedy`: - -`http://root.com/toto/tE%1F/a/c?a=4&w=1&w=2&z=3` - -## TODOs - -* Add a class/default instance to allow specifying custom directory index names? At the moment, removing directory index removes `(^|/)((?:default|index)\.\w{1,4})$`. - -## Thanks / Contributions - -@rogpeppe -@jehiah -@opennota -@pchristopher1275 -@zenovich -@beeker1121 - -## License - -The [BSD 3-Clause license][bsd]. - -[bsd]: http://opensource.org/licenses/BSD-3-Clause -[wiki]: http://en.wikipedia.org/wiki/URL_normalization -[rfc]: http://tools.ietf.org/html/rfc3986#section-6 -[godoc]: http://go.pkgdoc.org/github.com/PuerkitoBio/purell -[pr5]: https://github.com/PuerkitoBio/purell/pull/5 -[iss7]: https://github.com/PuerkitoBio/purell/issues/7 diff --git a/vendor/github.com/PuerkitoBio/purell/bench_test.go b/vendor/github.com/PuerkitoBio/purell/bench_test.go deleted file mode 100644 index 7549731fc4..0000000000 --- a/vendor/github.com/PuerkitoBio/purell/bench_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package purell - -import ( - "testing" -) - -var ( - safeUrl = "HttPS://..iaMHost..Test:443/paTh^A%ef//./%41PaTH/..//?" - usuallySafeUrl = "HttPS://..iaMHost..Test:443/paTh^A%ef//./%41PaTH/../final/" - unsafeUrl = "HttPS://..www.iaMHost..Test:443/paTh^A%ef//./%41PaTH/../final/index.html?t=val1&a=val4&z=val5&a=val1#fragment" - allDWORDUrl = "HttPS://1113982867:/paTh^A%ef//./%41PaTH/../final/index.html?t=val1&a=val4&z=val5&a=val1#fragment" - allOctalUrl = "HttPS://0102.0146.07.0223:/paTh^A%ef//./%41PaTH/../final/index.html?t=val1&a=val4&z=val5&a=val1#fragment" - allHexUrl = "HttPS://0x42660793:/paTh^A%ef//./%41PaTH/../final/index.html?t=val1&a=val4&z=val5&a=val1#fragment" - allCombinedUrl = "HttPS://..0x42660793.:/paTh^A%ef//./%41PaTH/../final/index.html?t=val1&a=val4&z=val5&a=val1#fragment" -) - -func BenchmarkSafe(b *testing.B) { - for i := 0; i < b.N; i++ { - NormalizeURLString(safeUrl, FlagsSafe) - } -} - -func BenchmarkUsuallySafe(b *testing.B) { - for i := 0; i < b.N; i++ { - NormalizeURLString(usuallySafeUrl, FlagsUsuallySafeGreedy) - } -} - -func BenchmarkUnsafe(b *testing.B) { - for i := 0; i < b.N; i++ { - NormalizeURLString(unsafeUrl, FlagsUnsafeGreedy) - } -} - -func BenchmarkAllDWORD(b *testing.B) { - for i := 0; i < b.N; i++ { - NormalizeURLString(allDWORDUrl, FlagsAllGreedy) - } -} - -func BenchmarkAllOctal(b *testing.B) { - for i := 0; i < b.N; i++ { - NormalizeURLString(allOctalUrl, FlagsAllGreedy) - } -} - -func BenchmarkAllHex(b *testing.B) { - for i := 0; i < b.N; i++ { - NormalizeURLString(allHexUrl, FlagsAllGreedy) - } -} - -func BenchmarkAllCombined(b *testing.B) { - for i := 0; i < b.N; i++ { - NormalizeURLString(allCombinedUrl, FlagsAllGreedy) - } -} diff --git a/vendor/github.com/PuerkitoBio/purell/benchmarks/v0.1.0 b/vendor/github.com/PuerkitoBio/purell/benchmarks/v0.1.0 deleted file mode 100644 index 3bbe7113c5..0000000000 --- a/vendor/github.com/PuerkitoBio/purell/benchmarks/v0.1.0 +++ /dev/null @@ -1,9 +0,0 @@ -PASS -BenchmarkSafe 500000 6131 ns/op -BenchmarkUsuallySafe 200000 7864 ns/op -BenchmarkUnsafe 100000 28560 ns/op -BenchmarkAllDWORD 50000 38722 ns/op -BenchmarkAllOctal 50000 40941 ns/op -BenchmarkAllHex 50000 44063 ns/op -BenchmarkAllCombined 50000 33613 ns/op -ok github.com/PuerkitoBio/purell 17.404s diff --git a/vendor/github.com/PuerkitoBio/purell/example_test.go b/vendor/github.com/PuerkitoBio/purell/example_test.go deleted file mode 100644 index 997b95369c..0000000000 --- a/vendor/github.com/PuerkitoBio/purell/example_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package purell - -import ( - "fmt" - "net/url" -) - -func ExampleNormalizeURLString() { - if normalized, err := NormalizeURLString("hTTp://someWEBsite.com:80/Amazing%3f/url/", - FlagLowercaseScheme|FlagLowercaseHost|FlagUppercaseEscapes); err != nil { - panic(err) - } else { - fmt.Print(normalized) - } - // Output: http://somewebsite.com:80/Amazing%3F/url/ -} - -func ExampleMustNormalizeURLString() { - normalized := MustNormalizeURLString("hTTpS://someWEBsite.com:443/Amazing%fa/url/", - FlagsUnsafeGreedy) - fmt.Print(normalized) - - // Output: http://somewebsite.com/Amazing%FA/url -} - -func ExampleNormalizeURL() { - if u, err := url.Parse("Http://SomeUrl.com:8080/a/b/.././c///g?c=3&a=1&b=9&c=0#target"); err != nil { - panic(err) - } else { - normalized := NormalizeURL(u, FlagsUsuallySafeGreedy|FlagRemoveDuplicateSlashes|FlagRemoveFragment) - fmt.Print(normalized) - } - - // Output: http://someurl.com:8080/a/c/g?c=3&a=1&b=9&c=0 -} diff --git a/vendor/github.com/PuerkitoBio/purell/purell.go b/vendor/github.com/PuerkitoBio/purell/purell.go deleted file mode 100644 index 645e1b76f7..0000000000 --- a/vendor/github.com/PuerkitoBio/purell/purell.go +++ /dev/null @@ -1,379 +0,0 @@ -/* -Package purell offers URL normalization as described on the wikipedia page: -http://en.wikipedia.org/wiki/URL_normalization -*/ -package purell - -import ( - "bytes" - "fmt" - "net/url" - "regexp" - "sort" - "strconv" - "strings" - - "github.com/PuerkitoBio/urlesc" - "golang.org/x/net/idna" - "golang.org/x/text/unicode/norm" - "golang.org/x/text/width" -) - -// A set of normalization flags determines how a URL will -// be normalized. -type NormalizationFlags uint - -const ( - // Safe normalizations - FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1 - FlagLowercaseHost // http://HOST -> http://host - FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF - FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA - FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$ - FlagRemoveDefaultPort // http://host:80 -> http://host - FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path - - // Usually safe normalizations - FlagRemoveTrailingSlash // http://host/path/ -> http://host/path - FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags) - FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c - - // Unsafe normalizations - FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/ - FlagRemoveFragment // http://host/path#fragment -> http://host/path - FlagForceHTTP // https://host -> http://host - FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b - FlagRemoveWWW // http://www.host/ -> http://host/ - FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags) - FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3 - - // Normalizations not in the wikipedia article, required to cover tests cases - // submitted by jehiah - FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147 - FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147 - FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147 - FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path - FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path - - // Convenience set of safe normalizations - FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator - - // For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags, - // while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix". - - // Convenience set of usually safe normalizations (includes FlagsSafe) - FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments - FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments - - // Convenience set of unsafe normalizations (includes FlagsUsuallySafe) - FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery - FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery - - // Convenience set of all available flags - FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator - FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator -) - -const ( - defaultHttpPort = ":80" - defaultHttpsPort = ":443" -) - -// Regular expressions used by the normalizations -var rxPort = regexp.MustCompile(`(:\d+)/?$`) -var rxDirIndex = regexp.MustCompile(`(^|/)((?:default|index)\.\w{1,4})$`) -var rxDupSlashes = regexp.MustCompile(`/{2,}`) -var rxDWORDHost = regexp.MustCompile(`^(\d+)((?:\.+)?(?:\:\d*)?)$`) -var rxOctalHost = regexp.MustCompile(`^(0\d*)\.(0\d*)\.(0\d*)\.(0\d*)((?:\.+)?(?:\:\d*)?)$`) -var rxHexHost = regexp.MustCompile(`^0x([0-9A-Fa-f]+)((?:\.+)?(?:\:\d*)?)$`) -var rxHostDots = regexp.MustCompile(`^(.+?)(:\d+)?$`) -var rxEmptyPort = regexp.MustCompile(`:+$`) - -// Map of flags to implementation function. -// FlagDecodeUnnecessaryEscapes has no action, since it is done automatically -// by parsing the string as an URL. Same for FlagUppercaseEscapes and FlagRemoveEmptyQuerySeparator. - -// Since maps have undefined traversing order, make a slice of ordered keys -var flagsOrder = []NormalizationFlags{ - FlagLowercaseScheme, - FlagLowercaseHost, - FlagRemoveDefaultPort, - FlagRemoveDirectoryIndex, - FlagRemoveDotSegments, - FlagRemoveFragment, - FlagForceHTTP, // Must be after remove default port (because https=443/http=80) - FlagRemoveDuplicateSlashes, - FlagRemoveWWW, - FlagAddWWW, - FlagSortQuery, - FlagDecodeDWORDHost, - FlagDecodeOctalHost, - FlagDecodeHexHost, - FlagRemoveUnnecessaryHostDots, - FlagRemoveEmptyPortSeparator, - FlagRemoveTrailingSlash, // These two (add/remove trailing slash) must be last - FlagAddTrailingSlash, -} - -// ... and then the map, where order is unimportant -var flags = map[NormalizationFlags]func(*url.URL){ - FlagLowercaseScheme: lowercaseScheme, - FlagLowercaseHost: lowercaseHost, - FlagRemoveDefaultPort: removeDefaultPort, - FlagRemoveDirectoryIndex: removeDirectoryIndex, - FlagRemoveDotSegments: removeDotSegments, - FlagRemoveFragment: removeFragment, - FlagForceHTTP: forceHTTP, - FlagRemoveDuplicateSlashes: removeDuplicateSlashes, - FlagRemoveWWW: removeWWW, - FlagAddWWW: addWWW, - FlagSortQuery: sortQuery, - FlagDecodeDWORDHost: decodeDWORDHost, - FlagDecodeOctalHost: decodeOctalHost, - FlagDecodeHexHost: decodeHexHost, - FlagRemoveUnnecessaryHostDots: removeUnncessaryHostDots, - FlagRemoveEmptyPortSeparator: removeEmptyPortSeparator, - FlagRemoveTrailingSlash: removeTrailingSlash, - FlagAddTrailingSlash: addTrailingSlash, -} - -// MustNormalizeURLString returns the normalized string, and panics if an error occurs. -// It takes an URL string as input, as well as the normalization flags. -func MustNormalizeURLString(u string, f NormalizationFlags) string { - result, e := NormalizeURLString(u, f) - if e != nil { - panic(e) - } - return result -} - -// NormalizeURLString returns the normalized string, or an error if it can't be parsed into an URL object. -// It takes an URL string as input, as well as the normalization flags. -func NormalizeURLString(u string, f NormalizationFlags) (string, error) { - parsed, err := url.Parse(u) - if err != nil { - return "", err - } - - if f&FlagLowercaseHost == FlagLowercaseHost { - parsed.Host = strings.ToLower(parsed.Host) - } - - // The idna package doesn't fully conform to RFC 5895 - // (https://tools.ietf.org/html/rfc5895), so we do it here. - // Taken from Go 1.8 cycle source, courtesy of bradfitz. - // TODO: Remove when (if?) idna package conforms to RFC 5895. - parsed.Host = width.Fold.String(parsed.Host) - parsed.Host = norm.NFC.String(parsed.Host) - if parsed.Host, err = idna.ToASCII(parsed.Host); err != nil { - return "", err - } - - return NormalizeURL(parsed, f), nil -} - -// NormalizeURL returns the normalized string. -// It takes a parsed URL object as input, as well as the normalization flags. -func NormalizeURL(u *url.URL, f NormalizationFlags) string { - for _, k := range flagsOrder { - if f&k == k { - flags[k](u) - } - } - return urlesc.Escape(u) -} - -func lowercaseScheme(u *url.URL) { - if len(u.Scheme) > 0 { - u.Scheme = strings.ToLower(u.Scheme) - } -} - -func lowercaseHost(u *url.URL) { - if len(u.Host) > 0 { - u.Host = strings.ToLower(u.Host) - } -} - -func removeDefaultPort(u *url.URL) { - if len(u.Host) > 0 { - scheme := strings.ToLower(u.Scheme) - u.Host = rxPort.ReplaceAllStringFunc(u.Host, func(val string) string { - if (scheme == "http" && val == defaultHttpPort) || (scheme == "https" && val == defaultHttpsPort) { - return "" - } - return val - }) - } -} - -func removeTrailingSlash(u *url.URL) { - if l := len(u.Path); l > 0 { - if strings.HasSuffix(u.Path, "/") { - u.Path = u.Path[:l-1] - } - } else if l = len(u.Host); l > 0 { - if strings.HasSuffix(u.Host, "/") { - u.Host = u.Host[:l-1] - } - } -} - -func addTrailingSlash(u *url.URL) { - if l := len(u.Path); l > 0 { - if !strings.HasSuffix(u.Path, "/") { - u.Path += "/" - } - } else if l = len(u.Host); l > 0 { - if !strings.HasSuffix(u.Host, "/") { - u.Host += "/" - } - } -} - -func removeDotSegments(u *url.URL) { - if len(u.Path) > 0 { - var dotFree []string - var lastIsDot bool - - sections := strings.Split(u.Path, "/") - for _, s := range sections { - if s == ".." { - if len(dotFree) > 0 { - dotFree = dotFree[:len(dotFree)-1] - } - } else if s != "." { - dotFree = append(dotFree, s) - } - lastIsDot = (s == "." || s == "..") - } - // Special case if host does not end with / and new path does not begin with / - u.Path = strings.Join(dotFree, "/") - if u.Host != "" && !strings.HasSuffix(u.Host, "/") && !strings.HasPrefix(u.Path, "/") { - u.Path = "/" + u.Path - } - // Special case if the last segment was a dot, make sure the path ends with a slash - if lastIsDot && !strings.HasSuffix(u.Path, "/") { - u.Path += "/" - } - } -} - -func removeDirectoryIndex(u *url.URL) { - if len(u.Path) > 0 { - u.Path = rxDirIndex.ReplaceAllString(u.Path, "$1") - } -} - -func removeFragment(u *url.URL) { - u.Fragment = "" -} - -func forceHTTP(u *url.URL) { - if strings.ToLower(u.Scheme) == "https" { - u.Scheme = "http" - } -} - -func removeDuplicateSlashes(u *url.URL) { - if len(u.Path) > 0 { - u.Path = rxDupSlashes.ReplaceAllString(u.Path, "/") - } -} - -func removeWWW(u *url.URL) { - if len(u.Host) > 0 && strings.HasPrefix(strings.ToLower(u.Host), "www.") { - u.Host = u.Host[4:] - } -} - -func addWWW(u *url.URL) { - if len(u.Host) > 0 && !strings.HasPrefix(strings.ToLower(u.Host), "www.") { - u.Host = "www." + u.Host - } -} - -func sortQuery(u *url.URL) { - q := u.Query() - - if len(q) > 0 { - arKeys := make([]string, len(q)) - i := 0 - for k, _ := range q { - arKeys[i] = k - i++ - } - sort.Strings(arKeys) - buf := new(bytes.Buffer) - for _, k := range arKeys { - sort.Strings(q[k]) - for _, v := range q[k] { - if buf.Len() > 0 { - buf.WriteRune('&') - } - buf.WriteString(fmt.Sprintf("%s=%s", k, urlesc.QueryEscape(v))) - } - } - - // Rebuild the raw query string - u.RawQuery = buf.String() - } -} - -func decodeDWORDHost(u *url.URL) { - if len(u.Host) > 0 { - if matches := rxDWORDHost.FindStringSubmatch(u.Host); len(matches) > 2 { - var parts [4]int64 - - dword, _ := strconv.ParseInt(matches[1], 10, 0) - for i, shift := range []uint{24, 16, 8, 0} { - parts[i] = dword >> shift & 0xFF - } - u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[2]) - } - } -} - -func decodeOctalHost(u *url.URL) { - if len(u.Host) > 0 { - if matches := rxOctalHost.FindStringSubmatch(u.Host); len(matches) > 5 { - var parts [4]int64 - - for i := 1; i <= 4; i++ { - parts[i-1], _ = strconv.ParseInt(matches[i], 8, 0) - } - u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[5]) - } - } -} - -func decodeHexHost(u *url.URL) { - if len(u.Host) > 0 { - if matches := rxHexHost.FindStringSubmatch(u.Host); len(matches) > 2 { - // Conversion is safe because of regex validation - parsed, _ := strconv.ParseInt(matches[1], 16, 0) - // Set host as DWORD (base 10) encoded host - u.Host = fmt.Sprintf("%d%s", parsed, matches[2]) - // The rest is the same as decoding a DWORD host - decodeDWORDHost(u) - } - } -} - -func removeUnncessaryHostDots(u *url.URL) { - if len(u.Host) > 0 { - if matches := rxHostDots.FindStringSubmatch(u.Host); len(matches) > 1 { - // Trim the leading and trailing dots - u.Host = strings.Trim(matches[1], ".") - if len(matches) > 2 { - u.Host += matches[2] - } - } - } -} - -func removeEmptyPortSeparator(u *url.URL) { - if len(u.Host) > 0 { - u.Host = rxEmptyPort.ReplaceAllString(u.Host, "") - } -} diff --git a/vendor/github.com/PuerkitoBio/purell/purell_test.go b/vendor/github.com/PuerkitoBio/purell/purell_test.go deleted file mode 100644 index a3732e5a3d..0000000000 --- a/vendor/github.com/PuerkitoBio/purell/purell_test.go +++ /dev/null @@ -1,768 +0,0 @@ -package purell - -import ( - "fmt" - "net/url" - "testing" -) - -type testCase struct { - nm string - src string - flgs NormalizationFlags - res string - parsed bool -} - -var ( - cases = [...]*testCase{ - &testCase{ - "LowerScheme", - "HTTP://www.SRC.ca", - FlagLowercaseScheme, - "http://www.SRC.ca", - false, - }, - &testCase{ - "LowerScheme2", - "http://www.SRC.ca", - FlagLowercaseScheme, - "http://www.SRC.ca", - false, - }, - &testCase{ - "LowerHost", - "HTTP://www.SRC.ca/", - FlagLowercaseHost, - "http://www.src.ca/", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "UpperEscapes", - `http://www.whatever.com/Some%aa%20Special%8Ecases/`, - FlagUppercaseEscapes, - "http://www.whatever.com/Some%AA%20Special%8Ecases/", - false, - }, - &testCase{ - "UnnecessaryEscapes", - `http://www.toto.com/%41%42%2E%44/%32%33%52%2D/%5f%7E`, - FlagDecodeUnnecessaryEscapes, - "http://www.toto.com/AB.D/23R-/_~", - false, - }, - &testCase{ - "RemoveDefaultPort", - "HTTP://www.SRC.ca:80/", - FlagRemoveDefaultPort, - "http://www.SRC.ca/", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "RemoveDefaultPort2", - "HTTP://www.SRC.ca:80", - FlagRemoveDefaultPort, - "http://www.SRC.ca", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "RemoveDefaultPort3", - "HTTP://www.SRC.ca:8080", - FlagRemoveDefaultPort, - "http://www.SRC.ca:8080", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "Safe", - "HTTP://www.SRC.ca:80/to%1ato%8b%ee/OKnow%41%42%43%7e", - FlagsSafe, - "http://www.src.ca/to%1Ato%8B%EE/OKnowABC~", - false, - }, - &testCase{ - "BothLower", - "HTTP://www.SRC.ca:80/to%1ato%8b%ee/OKnow%41%42%43%7e", - FlagLowercaseHost | FlagLowercaseScheme, - "http://www.src.ca:80/to%1Ato%8B%EE/OKnowABC~", - false, - }, - &testCase{ - "RemoveTrailingSlash", - "HTTP://www.SRC.ca:80/", - FlagRemoveTrailingSlash, - "http://www.SRC.ca:80", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "RemoveTrailingSlash2", - "HTTP://www.SRC.ca:80/toto/titi/", - FlagRemoveTrailingSlash, - "http://www.SRC.ca:80/toto/titi", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "RemoveTrailingSlash3", - "HTTP://www.SRC.ca:80/toto/titi/fin/?a=1", - FlagRemoveTrailingSlash, - "http://www.SRC.ca:80/toto/titi/fin?a=1", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "AddTrailingSlash", - "HTTP://www.SRC.ca:80", - FlagAddTrailingSlash, - "http://www.SRC.ca:80/", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "AddTrailingSlash2", - "HTTP://www.SRC.ca:80/toto/titi.html", - FlagAddTrailingSlash, - "http://www.SRC.ca:80/toto/titi.html/", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "AddTrailingSlash3", - "HTTP://www.SRC.ca:80/toto/titi/fin?a=1", - FlagAddTrailingSlash, - "http://www.SRC.ca:80/toto/titi/fin/?a=1", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "RemoveDotSegments", - "HTTP://root/a/b/./../../c/", - FlagRemoveDotSegments, - "http://root/c/", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "RemoveDotSegments2", - "HTTP://root/../a/b/./../c/../d", - FlagRemoveDotSegments, - "http://root/a/d", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "UsuallySafe", - "HTTP://www.SRC.ca:80/to%1ato%8b%ee/./c/d/../OKnow%41%42%43%7e/?a=b#test", - FlagsUsuallySafeGreedy, - "http://www.src.ca/to%1Ato%8B%EE/c/OKnowABC~?a=b#test", - false, - }, - &testCase{ - "RemoveDirectoryIndex", - "HTTP://root/a/b/c/default.aspx", - FlagRemoveDirectoryIndex, - "http://root/a/b/c/", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "RemoveDirectoryIndex2", - "HTTP://root/a/b/c/default#a=b", - FlagRemoveDirectoryIndex, - "http://root/a/b/c/default#a=b", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "RemoveFragment", - "HTTP://root/a/b/c/default#toto=tata", - FlagRemoveFragment, - "http://root/a/b/c/default", // Since Go1.1, scheme is automatically lowercased - false, - }, - &testCase{ - "ForceHTTP", - "https://root/a/b/c/default#toto=tata", - FlagForceHTTP, - "http://root/a/b/c/default#toto=tata", - false, - }, - &testCase{ - "RemoveDuplicateSlashes", - "https://root/a//b///c////default#toto=tata", - FlagRemoveDuplicateSlashes, - "https://root/a/b/c/default#toto=tata", - false, - }, - &testCase{ - "RemoveDuplicateSlashes2", - "https://root//a//b///c////default#toto=tata", - FlagRemoveDuplicateSlashes, - "https://root/a/b/c/default#toto=tata", - false, - }, - &testCase{ - "RemoveWWW", - "https://www.root/a/b/c/", - FlagRemoveWWW, - "https://root/a/b/c/", - false, - }, - &testCase{ - "RemoveWWW2", - "https://WwW.Root/a/b/c/", - FlagRemoveWWW, - "https://Root/a/b/c/", - false, - }, - &testCase{ - "AddWWW", - "https://Root/a/b/c/", - FlagAddWWW, - "https://www.Root/a/b/c/", - false, - }, - &testCase{ - "SortQuery", - "http://root/toto/?b=4&a=1&c=3&b=2&a=5", - FlagSortQuery, - "http://root/toto/?a=1&a=5&b=2&b=4&c=3", - false, - }, - &testCase{ - "RemoveEmptyQuerySeparator", - "http://root/toto/?", - FlagRemoveEmptyQuerySeparator, - "http://root/toto/", - false, - }, - &testCase{ - "Unsafe", - "HTTPS://www.RooT.com/toto/t%45%1f///a/./b/../c/?z=3&w=2&a=4&w=1#invalid", - FlagsUnsafeGreedy, - "http://root.com/toto/tE%1F/a/c?a=4&w=1&w=2&z=3", - false, - }, - &testCase{ - "Safe2", - "HTTPS://www.RooT.com/toto/t%45%1f///a/./b/../c/?z=3&w=2&a=4&w=1#invalid", - FlagsSafe, - "https://www.root.com/toto/tE%1F///a/./b/../c/?z=3&w=2&a=4&w=1#invalid", - false, - }, - &testCase{ - "UsuallySafe2", - "HTTPS://www.RooT.com/toto/t%45%1f///a/./b/../c/?z=3&w=2&a=4&w=1#invalid", - FlagsUsuallySafeGreedy, - "https://www.root.com/toto/tE%1F///a/c?z=3&w=2&a=4&w=1#invalid", - false, - }, - &testCase{ - "AddTrailingSlashBug", - "http://src.ca/", - FlagsAllNonGreedy, - "http://www.src.ca/", - false, - }, - &testCase{ - "SourceModified", - "HTTPS://www.RooT.com/toto/t%45%1f///a/./b/../c/?z=3&w=2&a=4&w=1#invalid", - FlagsUnsafeGreedy, - "http://root.com/toto/tE%1F/a/c?a=4&w=1&w=2&z=3", - true, - }, - &testCase{ - "IPv6-1", - "http://[2001:db8:1f70::999:de8:7648:6e8]/test", - FlagsSafe | FlagRemoveDotSegments, - "http://[2001:db8:1f70::999:de8:7648:6e8]/test", - false, - }, - &testCase{ - "IPv6-2", - "http://[::ffff:192.168.1.1]/test", - FlagsSafe | FlagRemoveDotSegments, - "http://[::ffff:192.168.1.1]/test", - false, - }, - &testCase{ - "IPv6-3", - "http://[::ffff:192.168.1.1]:80/test", - FlagsSafe | FlagRemoveDotSegments, - "http://[::ffff:192.168.1.1]/test", - false, - }, - &testCase{ - "IPv6-4", - "htTps://[::fFff:192.168.1.1]:443/test", - FlagsSafe | FlagRemoveDotSegments, - "https://[::ffff:192.168.1.1]/test", - false, - }, - &testCase{ - "FTP", - "ftp://user:pass@ftp.foo.net/foo/bar", - FlagsSafe | FlagRemoveDotSegments, - "ftp://user:pass@ftp.foo.net/foo/bar", - false, - }, - &testCase{ - "Standard-1", - "http://www.foo.com:80/foo", - FlagsSafe | FlagRemoveDotSegments, - "http://www.foo.com/foo", - false, - }, - &testCase{ - "Standard-2", - "http://www.foo.com:8000/foo", - FlagsSafe | FlagRemoveDotSegments, - "http://www.foo.com:8000/foo", - false, - }, - &testCase{ - "Standard-3", - "http://www.foo.com/%7ebar", - FlagsSafe | FlagRemoveDotSegments, - "http://www.foo.com/~bar", - false, - }, - &testCase{ - "Standard-4", - "http://www.foo.com/%7Ebar", - FlagsSafe | FlagRemoveDotSegments, - "http://www.foo.com/~bar", - false, - }, - &testCase{ - "Standard-5", - "http://USER:pass@www.Example.COM/foo/bar", - FlagsSafe | FlagRemoveDotSegments, - "http://USER:pass@www.example.com/foo/bar", - false, - }, - &testCase{ - "Standard-6", - "http://test.example/?a=%26&b=1", - FlagsSafe | FlagRemoveDotSegments, - "http://test.example/?a=%26&b=1", - false, - }, - &testCase{ - "Standard-7", - "http://test.example/%25/?p=%20val%20%25", - FlagsSafe | FlagRemoveDotSegments, - "http://test.example/%25/?p=%20val%20%25", - false, - }, - &testCase{ - "Standard-8", - "http://test.example/path/with a%20space+/", - FlagsSafe | FlagRemoveDotSegments, - "http://test.example/path/with%20a%20space+/", - false, - }, - &testCase{ - "Standard-9", - "http://test.example/?", - FlagsSafe | FlagRemoveDotSegments, - "http://test.example/", - false, - }, - &testCase{ - "Standard-10", - "http://a.COM/path/?b&a", - FlagsSafe | FlagRemoveDotSegments, - "http://a.com/path/?b&a", - false, - }, - &testCase{ - "StandardCasesAddTrailingSlash", - "http://test.example?", - FlagsSafe | FlagAddTrailingSlash, - "http://test.example/", - false, - }, - &testCase{ - "OctalIP-1", - "http://0123.011.0.4/", - FlagsSafe | FlagDecodeOctalHost, - "http://0123.011.0.4/", - false, - }, - &testCase{ - "OctalIP-2", - "http://0102.0146.07.0223/", - FlagsSafe | FlagDecodeOctalHost, - "http://66.102.7.147/", - false, - }, - &testCase{ - "OctalIP-3", - "http://0102.0146.07.0223.:23/", - FlagsSafe | FlagDecodeOctalHost, - "http://66.102.7.147.:23/", - false, - }, - &testCase{ - "OctalIP-4", - "http://USER:pass@0102.0146.07.0223../", - FlagsSafe | FlagDecodeOctalHost, - "http://USER:pass@66.102.7.147../", - false, - }, - &testCase{ - "DWORDIP-1", - "http://123.1113982867/", - FlagsSafe | FlagDecodeDWORDHost, - "http://123.1113982867/", - false, - }, - &testCase{ - "DWORDIP-2", - "http://1113982867/", - FlagsSafe | FlagDecodeDWORDHost, - "http://66.102.7.147/", - false, - }, - &testCase{ - "DWORDIP-3", - "http://1113982867.:23/", - FlagsSafe | FlagDecodeDWORDHost, - "http://66.102.7.147.:23/", - false, - }, - &testCase{ - "DWORDIP-4", - "http://USER:pass@1113982867../", - FlagsSafe | FlagDecodeDWORDHost, - "http://USER:pass@66.102.7.147../", - false, - }, - &testCase{ - "HexIP-1", - "http://0x123.1113982867/", - FlagsSafe | FlagDecodeHexHost, - "http://0x123.1113982867/", - false, - }, - &testCase{ - "HexIP-2", - "http://0x42660793/", - FlagsSafe | FlagDecodeHexHost, - "http://66.102.7.147/", - false, - }, - &testCase{ - "HexIP-3", - "http://0x42660793.:23/", - FlagsSafe | FlagDecodeHexHost, - "http://66.102.7.147.:23/", - false, - }, - &testCase{ - "HexIP-4", - "http://USER:pass@0x42660793../", - FlagsSafe | FlagDecodeHexHost, - "http://USER:pass@66.102.7.147../", - false, - }, - &testCase{ - "UnnecessaryHostDots-1", - "http://.www.foo.com../foo/bar.html", - FlagsSafe | FlagRemoveUnnecessaryHostDots, - "http://www.foo.com/foo/bar.html", - false, - }, - &testCase{ - "UnnecessaryHostDots-2", - "http://www.foo.com./foo/bar.html", - FlagsSafe | FlagRemoveUnnecessaryHostDots, - "http://www.foo.com/foo/bar.html", - false, - }, - &testCase{ - "UnnecessaryHostDots-3", - "http://www.foo.com.:81/foo", - FlagsSafe | FlagRemoveUnnecessaryHostDots, - "http://www.foo.com:81/foo", - false, - }, - &testCase{ - "UnnecessaryHostDots-4", - "http://www.example.com./", - FlagsSafe | FlagRemoveUnnecessaryHostDots, - "http://www.example.com/", - false, - }, - &testCase{ - "EmptyPort-1", - "http://www.thedraymin.co.uk:/main/?p=308", - FlagsSafe | FlagRemoveEmptyPortSeparator, - "http://www.thedraymin.co.uk/main/?p=308", - false, - }, - &testCase{ - "EmptyPort-2", - "http://www.src.ca:", - FlagsSafe | FlagRemoveEmptyPortSeparator, - "http://www.src.ca", - false, - }, - &testCase{ - "Slashes-1", - "http://test.example/foo/bar/.", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo/bar/", - false, - }, - &testCase{ - "Slashes-2", - "http://test.example/foo/bar/./", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo/bar/", - false, - }, - &testCase{ - "Slashes-3", - "http://test.example/foo/bar/..", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo/", - false, - }, - &testCase{ - "Slashes-4", - "http://test.example/foo/bar/../", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo/", - false, - }, - &testCase{ - "Slashes-5", - "http://test.example/foo/bar/../baz", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo/baz", - false, - }, - &testCase{ - "Slashes-6", - "http://test.example/foo/bar/../..", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/", - false, - }, - &testCase{ - "Slashes-7", - "http://test.example/foo/bar/../../", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/", - false, - }, - &testCase{ - "Slashes-8", - "http://test.example/foo/bar/../../baz", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/baz", - false, - }, - &testCase{ - "Slashes-9", - "http://test.example/foo/bar/../../../baz", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/baz", - false, - }, - &testCase{ - "Slashes-10", - "http://test.example/foo/bar/../../../../baz", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/baz", - false, - }, - &testCase{ - "Slashes-11", - "http://test.example/./foo", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo", - false, - }, - &testCase{ - "Slashes-12", - "http://test.example/../foo", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo", - false, - }, - &testCase{ - "Slashes-13", - "http://test.example/foo.", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo.", - false, - }, - &testCase{ - "Slashes-14", - "http://test.example/.foo", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/.foo", - false, - }, - &testCase{ - "Slashes-15", - "http://test.example/foo..", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo..", - false, - }, - &testCase{ - "Slashes-16", - "http://test.example/..foo", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/..foo", - false, - }, - &testCase{ - "Slashes-17", - "http://test.example/./../foo", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo", - false, - }, - &testCase{ - "Slashes-18", - "http://test.example/./foo/.", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo/", - false, - }, - &testCase{ - "Slashes-19", - "http://test.example/foo/./bar", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo/bar", - false, - }, - &testCase{ - "Slashes-20", - "http://test.example/foo/../bar", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/bar", - false, - }, - &testCase{ - "Slashes-21", - "http://test.example/foo//", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo/", - false, - }, - &testCase{ - "Slashes-22", - "http://test.example/foo///bar//", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "http://test.example/foo/bar/", - false, - }, - &testCase{ - "Relative", - "foo/bar", - FlagsAllGreedy, - "foo/bar", - false, - }, - &testCase{ - "Relative-1", - "./../foo", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "foo", - false, - }, - &testCase{ - "Relative-2", - "./foo/bar/../baz/../bang/..", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "foo/", - false, - }, - &testCase{ - "Relative-3", - "foo///bar//", - FlagsSafe | FlagRemoveDotSegments | FlagRemoveDuplicateSlashes, - "foo/bar/", - false, - }, - &testCase{ - "Relative-4", - "www.youtube.com", - FlagsUsuallySafeGreedy, - "www.youtube.com", - false, - }, - /*&testCase{ - "UrlNorm-5", - "http://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%82%BF%E3%83%94%E3%83%A9%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%91%E3%83%B3", - FlagsSafe | FlagRemoveDotSegments, - "http://ja.wikipedia.org/wiki/\xe3\x82\xad\xe3\x83\xa3\xe3\x82\xbf\xe3\x83\x94\xe3\x83\xa9\xe3\x83\xbc\xe3\x82\xb8\xe3\x83\xa3\xe3\x83\x91\xe3\x83\xb3", - false, - }, - &testCase{ - "UrlNorm-1", - "http://test.example/?a=%e3%82%82%26", - FlagsAllGreedy, - "http://test.example/?a=\xe3\x82\x82%26", - false, - },*/ - } -) - -func TestRunner(t *testing.T) { - for _, tc := range cases { - runCase(tc, t) - } -} - -func runCase(tc *testCase, t *testing.T) { - t.Logf("running %s...", tc.nm) - if tc.parsed { - u, e := url.Parse(tc.src) - if e != nil { - t.Errorf("%s - FAIL : %s", tc.nm, e) - return - } else { - NormalizeURL(u, tc.flgs) - if s := u.String(); s != tc.res { - t.Errorf("%s - FAIL expected '%s', got '%s'", tc.nm, tc.res, s) - } - } - } else { - if s, e := NormalizeURLString(tc.src, tc.flgs); e != nil { - t.Errorf("%s - FAIL : %s", tc.nm, e) - } else if s != tc.res { - t.Errorf("%s - FAIL expected '%s', got '%s'", tc.nm, tc.res, s) - } - } -} - -func TestDecodeUnnecessaryEscapesAll(t *testing.T) { - var url = "http://host/" - - for i := 0; i < 256; i++ { - url += fmt.Sprintf("%%%02x", i) - } - if s, e := NormalizeURLString(url, FlagDecodeUnnecessaryEscapes); e != nil { - t.Fatalf("Got error %s", e.Error()) - } else { - const want = "http://host/%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%25&'()*+,-./0123456789:;%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ[%5C]%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF" - if s != want { - t.Errorf("DecodeUnnecessaryEscapesAll:\nwant\n%s\ngot\n%s", want, s) - } - } -} - -func TestEncodeNecessaryEscapesAll(t *testing.T) { - var url = "http://host/" - - for i := 0; i < 256; i++ { - if i != 0x25 { - url += string(i) - } - } - if s, e := NormalizeURLString(url, FlagEncodeNecessaryEscapes); e != nil { - t.Fatalf("Got error %s", e.Error()) - } else { - const want = "http://host/%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22#$&'()*+,-./0123456789:;%3C=%3E?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[%5C]%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%C2%80%C2%81%C2%82%C2%83%C2%84%C2%85%C2%86%C2%87%C2%88%C2%89%C2%8A%C2%8B%C2%8C%C2%8D%C2%8E%C2%8F%C2%90%C2%91%C2%92%C2%93%C2%94%C2%95%C2%96%C2%97%C2%98%C2%99%C2%9A%C2%9B%C2%9C%C2%9D%C2%9E%C2%9F%C2%A0%C2%A1%C2%A2%C2%A3%C2%A4%C2%A5%C2%A6%C2%A7%C2%A8%C2%A9%C2%AA%C2%AB%C2%AC%C2%AD%C2%AE%C2%AF%C2%B0%C2%B1%C2%B2%C2%B3%C2%B4%C2%B5%C2%B6%C2%B7%C2%B8%C2%B9%C2%BA%C2%BB%C2%BC%C2%BD%C2%BE%C2%BF%C3%80%C3%81%C3%82%C3%83%C3%84%C3%85%C3%86%C3%87%C3%88%C3%89%C3%8A%C3%8B%C3%8C%C3%8D%C3%8E%C3%8F%C3%90%C3%91%C3%92%C3%93%C3%94%C3%95%C3%96%C3%97%C3%98%C3%99%C3%9A%C3%9B%C3%9C%C3%9D%C3%9E%C3%9F%C3%A0%C3%A1%C3%A2%C3%A3%C3%A4%C3%A5%C3%A6%C3%A7%C3%A8%C3%A9%C3%AA%C3%AB%C3%AC%C3%AD%C3%AE%C3%AF%C3%B0%C3%B1%C3%B2%C3%B3%C3%B4%C3%B5%C3%B6%C3%B7%C3%B8%C3%B9%C3%BA%C3%BB%C3%BC%C3%BD%C3%BE%C3%BF" - if s != want { - t.Errorf("EncodeNecessaryEscapesAll:\nwant\n%s\ngot\n%s", want, s) - } - } -} diff --git a/vendor/github.com/PuerkitoBio/purell/urlnorm_test.go b/vendor/github.com/PuerkitoBio/purell/urlnorm_test.go deleted file mode 100644 index d1b2ca6c0e..0000000000 --- a/vendor/github.com/PuerkitoBio/purell/urlnorm_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package purell - -import ( - "testing" -) - -// Test cases merged from PR #1 -// Originally from https://github.com/jehiah/urlnorm/blob/master/test_urlnorm.py - -func assertMap(t *testing.T, cases map[string]string, f NormalizationFlags) { - for bad, good := range cases { - s, e := NormalizeURLString(bad, f) - if e != nil { - t.Errorf("%s normalizing %v to %v", e.Error(), bad, good) - } else { - if s != good { - t.Errorf("source: %v expected: %v got: %v", bad, good, s) - } - } - } -} - -// This tests normalization to a unicode representation -// precent escapes for unreserved values are unescaped to their unicode value -// tests normalization to idna domains -// test ip word handling, ipv6 address handling, and trailing domain periods -// in general, this matches google chromes unescaping for things in the address bar. -// spaces are converted to '+' (perhaphs controversial) -// http://code.google.com/p/google-url/ probably is another good reference for this approach -func TestUrlnorm(t *testing.T) { - testcases := map[string]string{ - "http://test.example/?a=%e3%82%82%26": "http://test.example/?a=%e3%82%82%26", - //"http://test.example/?a=%e3%82%82%26": "http://test.example/?a=\xe3\x82\x82%26", //should return a unicode character - "http://s.xn--q-bga.DE/": "http://s.xn--q-bga.de/", //should be in idna format - "http://XBLA\u306eXbox.com": "http://xn--xblaxbox-jf4g.com", //test utf8 and unicode - "http://президент.рф": "http://xn--d1abbgf6aiiy.xn--p1ai", - "http://ПРЕЗИДЕНТ.РФ": "http://xn--d1abbgf6aiiy.xn--p1ai", - "http://ab¥ヲ₩○.com": "http://xn--ab-ida8983azmfnvs.com", //test width folding - "http://\u00e9.com": "http://xn--9ca.com", - "http://e\u0301.com": "http://xn--9ca.com", - "http://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%82%BF%E3%83%94%E3%83%A9%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%91%E3%83%B3": "http://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%82%BF%E3%83%94%E3%83%A9%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%91%E3%83%B3", - //"http://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%82%BF%E3%83%94%E3%83%A9%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%91%E3%83%B3": "http://ja.wikipedia.org/wiki/\xe3\x82\xad\xe3\x83\xa3\xe3\x82\xbf\xe3\x83\x94\xe3\x83\xa9\xe3\x83\xbc\xe3\x82\xb8\xe3\x83\xa3\xe3\x83\x91\xe3\x83\xb3", - - "http://test.example/\xe3\x82\xad": "http://test.example/%E3%82%AD", - //"http://test.example/\xe3\x82\xad": "http://test.example/\xe3\x82\xad", - "http://test.example/?p=%23val#test-%23-val%25": "http://test.example/?p=%23val#test-%23-val%25", //check that %23 (#) is not escaped where it shouldn't be - - "http://test.domain/I%C3%B1t%C3%ABrn%C3%A2ti%C3%B4n%EF%BF%BDliz%C3%A6ti%C3%B8n": "http://test.domain/I%C3%B1t%C3%ABrn%C3%A2ti%C3%B4n%EF%BF%BDliz%C3%A6ti%C3%B8n", - //"http://test.domain/I%C3%B1t%C3%ABrn%C3%A2ti%C3%B4n%EF%BF%BDliz%C3%A6ti%C3%B8n": "http://test.domain/I\xc3\xb1t\xc3\xabrn\xc3\xa2ti\xc3\xb4n\xef\xbf\xbdliz\xc3\xa6ti\xc3\xb8n", - } - - assertMap(t, testcases, FlagsSafe|FlagRemoveDotSegments) -} diff --git a/vendor/github.com/PuerkitoBio/urlesc/README.md b/vendor/github.com/PuerkitoBio/urlesc/README.md deleted file mode 100644 index 57aff0a539..0000000000 --- a/vendor/github.com/PuerkitoBio/urlesc/README.md +++ /dev/null @@ -1,16 +0,0 @@ -urlesc [![Build Status](https://travis-ci.org/PuerkitoBio/urlesc.svg?branch=master)](https://travis-ci.org/PuerkitoBio/urlesc) [![GoDoc](http://godoc.org/github.com/PuerkitoBio/urlesc?status.svg)](http://godoc.org/github.com/PuerkitoBio/urlesc) -====== - -Package urlesc implements query escaping as per RFC 3986. - -It contains some parts of the net/url package, modified so as to allow -some reserved characters incorrectly escaped by net/url (see [issue 5684](https://github.com/golang/go/issues/5684)). - -## Install - - go get github.com/PuerkitoBio/urlesc - -## License - -Go license (BSD-3-Clause) - diff --git a/vendor/github.com/PuerkitoBio/urlesc/urlesc.go b/vendor/github.com/PuerkitoBio/urlesc/urlesc.go deleted file mode 100644 index 1b84624594..0000000000 --- a/vendor/github.com/PuerkitoBio/urlesc/urlesc.go +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package urlesc implements query escaping as per RFC 3986. -// It contains some parts of the net/url package, modified so as to allow -// some reserved characters incorrectly escaped by net/url. -// See https://github.com/golang/go/issues/5684 -package urlesc - -import ( - "bytes" - "net/url" - "strings" -) - -type encoding int - -const ( - encodePath encoding = 1 + iota - encodeUserPassword - encodeQueryComponent - encodeFragment -) - -// Return true if the specified character should be escaped when -// appearing in a URL string, according to RFC 3986. -func shouldEscape(c byte, mode encoding) bool { - // §2.3 Unreserved characters (alphanum) - if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' { - return false - } - - switch c { - case '-', '.', '_', '~': // §2.3 Unreserved characters (mark) - return false - - // §2.2 Reserved characters (reserved) - case ':', '/', '?', '#', '[', ']', '@', // gen-delims - '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=': // sub-delims - // Different sections of the URL allow a few of - // the reserved characters to appear unescaped. - switch mode { - case encodePath: // §3.3 - // The RFC allows sub-delims and : @. - // '/', '[' and ']' can be used to assign meaning to individual path - // segments. This package only manipulates the path as a whole, - // so we allow those as well. That leaves only ? and # to escape. - return c == '?' || c == '#' - - case encodeUserPassword: // §3.2.1 - // The RFC allows : and sub-delims in - // userinfo. The parsing of userinfo treats ':' as special so we must escape - // all the gen-delims. - return c == ':' || c == '/' || c == '?' || c == '#' || c == '[' || c == ']' || c == '@' - - case encodeQueryComponent: // §3.4 - // The RFC allows / and ?. - return c != '/' && c != '?' - - case encodeFragment: // §4.1 - // The RFC text is silent but the grammar allows - // everything, so escape nothing but # - return c == '#' - } - } - - // Everything else must be escaped. - return true -} - -// QueryEscape escapes the string so it can be safely placed -// inside a URL query. -func QueryEscape(s string) string { - return escape(s, encodeQueryComponent) -} - -func escape(s string, mode encoding) string { - spaceCount, hexCount := 0, 0 - for i := 0; i < len(s); i++ { - c := s[i] - if shouldEscape(c, mode) { - if c == ' ' && mode == encodeQueryComponent { - spaceCount++ - } else { - hexCount++ - } - } - } - - if spaceCount == 0 && hexCount == 0 { - return s - } - - t := make([]byte, len(s)+2*hexCount) - j := 0 - for i := 0; i < len(s); i++ { - switch c := s[i]; { - case c == ' ' && mode == encodeQueryComponent: - t[j] = '+' - j++ - case shouldEscape(c, mode): - t[j] = '%' - t[j+1] = "0123456789ABCDEF"[c>>4] - t[j+2] = "0123456789ABCDEF"[c&15] - j += 3 - default: - t[j] = s[i] - j++ - } - } - return string(t) -} - -var uiReplacer = strings.NewReplacer( - "%21", "!", - "%27", "'", - "%28", "(", - "%29", ")", - "%2A", "*", -) - -// unescapeUserinfo unescapes some characters that need not to be escaped as per RFC3986. -func unescapeUserinfo(s string) string { - return uiReplacer.Replace(s) -} - -// Escape reassembles the URL into a valid URL string. -// The general form of the result is one of: -// -// scheme:opaque -// scheme://userinfo@host/path?query#fragment -// -// If u.Opaque is non-empty, String uses the first form; -// otherwise it uses the second form. -// -// In the second form, the following rules apply: -// - if u.Scheme is empty, scheme: is omitted. -// - if u.User is nil, userinfo@ is omitted. -// - if u.Host is empty, host/ is omitted. -// - if u.Scheme and u.Host are empty and u.User is nil, -// the entire scheme://userinfo@host/ is omitted. -// - if u.Host is non-empty and u.Path begins with a /, -// the form host/path does not add its own /. -// - if u.RawQuery is empty, ?query is omitted. -// - if u.Fragment is empty, #fragment is omitted. -func Escape(u *url.URL) string { - var buf bytes.Buffer - if u.Scheme != "" { - buf.WriteString(u.Scheme) - buf.WriteByte(':') - } - if u.Opaque != "" { - buf.WriteString(u.Opaque) - } else { - if u.Scheme != "" || u.Host != "" || u.User != nil { - buf.WriteString("//") - if ui := u.User; ui != nil { - buf.WriteString(unescapeUserinfo(ui.String())) - buf.WriteByte('@') - } - if h := u.Host; h != "" { - buf.WriteString(h) - } - } - if u.Path != "" && u.Path[0] != '/' && u.Host != "" { - buf.WriteByte('/') - } - buf.WriteString(escape(u.Path, encodePath)) - } - if u.RawQuery != "" { - buf.WriteByte('?') - buf.WriteString(u.RawQuery) - } - if u.Fragment != "" { - buf.WriteByte('#') - buf.WriteString(escape(u.Fragment, encodeFragment)) - } - return buf.String() -} diff --git a/vendor/github.com/PuerkitoBio/urlesc/urlesc_test.go b/vendor/github.com/PuerkitoBio/urlesc/urlesc_test.go deleted file mode 100644 index 45202e1dd8..0000000000 --- a/vendor/github.com/PuerkitoBio/urlesc/urlesc_test.go +++ /dev/null @@ -1,641 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package urlesc - -import ( - "net/url" - "testing" -) - -type URLTest struct { - in string - out *url.URL - roundtrip string // expected result of reserializing the URL; empty means same as "in". -} - -var urltests = []URLTest{ - // no path - { - "http://www.google.com", - &url.URL{ - Scheme: "http", - Host: "www.google.com", - }, - "", - }, - // path - { - "http://www.google.com/", - &url.URL{ - Scheme: "http", - Host: "www.google.com", - Path: "/", - }, - "", - }, - // path with hex escaping - { - "http://www.google.com/file%20one%26two", - &url.URL{ - Scheme: "http", - Host: "www.google.com", - Path: "/file one&two", - }, - "http://www.google.com/file%20one&two", - }, - // user - { - "ftp://webmaster@www.google.com/", - &url.URL{ - Scheme: "ftp", - User: url.User("webmaster"), - Host: "www.google.com", - Path: "/", - }, - "", - }, - // escape sequence in username - { - "ftp://john%20doe@www.google.com/", - &url.URL{ - Scheme: "ftp", - User: url.User("john doe"), - Host: "www.google.com", - Path: "/", - }, - "ftp://john%20doe@www.google.com/", - }, - // query - { - "http://www.google.com/?q=go+language", - &url.URL{ - Scheme: "http", - Host: "www.google.com", - Path: "/", - RawQuery: "q=go+language", - }, - "", - }, - // query with hex escaping: NOT parsed - { - "http://www.google.com/?q=go%20language", - &url.URL{ - Scheme: "http", - Host: "www.google.com", - Path: "/", - RawQuery: "q=go%20language", - }, - "", - }, - // %20 outside query - { - "http://www.google.com/a%20b?q=c+d", - &url.URL{ - Scheme: "http", - Host: "www.google.com", - Path: "/a b", - RawQuery: "q=c+d", - }, - "", - }, - // path without leading /, so no parsing - { - "http:www.google.com/?q=go+language", - &url.URL{ - Scheme: "http", - Opaque: "www.google.com/", - RawQuery: "q=go+language", - }, - "http:www.google.com/?q=go+language", - }, - // path without leading /, so no parsing - { - "http:%2f%2fwww.google.com/?q=go+language", - &url.URL{ - Scheme: "http", - Opaque: "%2f%2fwww.google.com/", - RawQuery: "q=go+language", - }, - "http:%2f%2fwww.google.com/?q=go+language", - }, - // non-authority with path - { - "mailto:/webmaster@golang.org", - &url.URL{ - Scheme: "mailto", - Path: "/webmaster@golang.org", - }, - "mailto:///webmaster@golang.org", // unfortunate compromise - }, - // non-authority - { - "mailto:webmaster@golang.org", - &url.URL{ - Scheme: "mailto", - Opaque: "webmaster@golang.org", - }, - "", - }, - // unescaped :// in query should not create a scheme - { - "/foo?query=http://bad", - &url.URL{ - Path: "/foo", - RawQuery: "query=http://bad", - }, - "", - }, - // leading // without scheme should create an authority - { - "//foo", - &url.URL{ - Host: "foo", - }, - "", - }, - // leading // without scheme, with userinfo, path, and query - { - "//user@foo/path?a=b", - &url.URL{ - User: url.User("user"), - Host: "foo", - Path: "/path", - RawQuery: "a=b", - }, - "", - }, - // Three leading slashes isn't an authority, but doesn't return an error. - // (We can't return an error, as this code is also used via - // ServeHTTP -> ReadRequest -> Parse, which is arguably a - // different URL parsing context, but currently shares the - // same codepath) - { - "///threeslashes", - &url.URL{ - Path: "///threeslashes", - }, - "", - }, - { - "http://user:password@google.com", - &url.URL{ - Scheme: "http", - User: url.UserPassword("user", "password"), - Host: "google.com", - }, - "http://user:password@google.com", - }, - // unescaped @ in username should not confuse host - { - "http://j@ne:password@google.com", - &url.URL{ - Scheme: "http", - User: url.UserPassword("j@ne", "password"), - Host: "google.com", - }, - "http://j%40ne:password@google.com", - }, - // unescaped @ in password should not confuse host - { - "http://jane:p@ssword@google.com", - &url.URL{ - Scheme: "http", - User: url.UserPassword("jane", "p@ssword"), - Host: "google.com", - }, - "http://jane:p%40ssword@google.com", - }, - { - "http://j@ne:password@google.com/p@th?q=@go", - &url.URL{ - Scheme: "http", - User: url.UserPassword("j@ne", "password"), - Host: "google.com", - Path: "/p@th", - RawQuery: "q=@go", - }, - "http://j%40ne:password@google.com/p@th?q=@go", - }, - { - "http://www.google.com/?q=go+language#foo", - &url.URL{ - Scheme: "http", - Host: "www.google.com", - Path: "/", - RawQuery: "q=go+language", - Fragment: "foo", - }, - "", - }, - { - "http://www.google.com/?q=go+language#foo%26bar", - &url.URL{ - Scheme: "http", - Host: "www.google.com", - Path: "/", - RawQuery: "q=go+language", - Fragment: "foo&bar", - }, - "http://www.google.com/?q=go+language#foo&bar", - }, - { - "file:///home/adg/rabbits", - &url.URL{ - Scheme: "file", - Host: "", - Path: "/home/adg/rabbits", - }, - "file:///home/adg/rabbits", - }, - // "Windows" paths are no exception to the rule. - // See golang.org/issue/6027, especially comment #9. - { - "file:///C:/FooBar/Baz.txt", - &url.URL{ - Scheme: "file", - Host: "", - Path: "/C:/FooBar/Baz.txt", - }, - "file:///C:/FooBar/Baz.txt", - }, - // case-insensitive scheme - { - "MaIlTo:webmaster@golang.org", - &url.URL{ - Scheme: "mailto", - Opaque: "webmaster@golang.org", - }, - "mailto:webmaster@golang.org", - }, - // Relative path - { - "a/b/c", - &url.URL{ - Path: "a/b/c", - }, - "a/b/c", - }, - // escaped '?' in username and password - { - "http://%3Fam:pa%3Fsword@google.com", - &url.URL{ - Scheme: "http", - User: url.UserPassword("?am", "pa?sword"), - Host: "google.com", - }, - "", - }, - // escaped '?' and '#' in path - { - "http://example.com/%3F%23", - &url.URL{ - Scheme: "http", - Host: "example.com", - Path: "?#", - }, - "", - }, - // unescaped [ ] ! ' ( ) * in path - { - "http://example.com/[]!'()*", - &url.URL{ - Scheme: "http", - Host: "example.com", - Path: "[]!'()*", - }, - "http://example.com/[]!'()*", - }, - // escaped : / ? # [ ] @ in username and password - { - "http://%3A%2F%3F:%23%5B%5D%40@example.com", - &url.URL{ - Scheme: "http", - User: url.UserPassword(":/?", "#[]@"), - Host: "example.com", - }, - "", - }, - // unescaped ! $ & ' ( ) * + , ; = in username and password - { - "http://!$&'():*+,;=@example.com", - &url.URL{ - Scheme: "http", - User: url.UserPassword("!$&'()", "*+,;="), - Host: "example.com", - }, - "", - }, - // unescaped = : / . ? = in query component - { - "http://example.com/?q=http://google.com/?q=", - &url.URL{ - Scheme: "http", - Host: "example.com", - Path: "/", - RawQuery: "q=http://google.com/?q=", - }, - "", - }, - // unescaped : / ? [ ] @ ! $ & ' ( ) * + , ; = in fragment - { - "http://example.com/#:/?%23[]@!$&'()*+,;=", - &url.URL{ - Scheme: "http", - Host: "example.com", - Path: "/", - Fragment: ":/?#[]@!$&'()*+,;=", - }, - "", - }, -} - -func DoTestString(t *testing.T, parse func(string) (*url.URL, error), name string, tests []URLTest) { - for _, tt := range tests { - u, err := parse(tt.in) - if err != nil { - t.Errorf("%s(%q) returned error %s", name, tt.in, err) - continue - } - expected := tt.in - if len(tt.roundtrip) > 0 { - expected = tt.roundtrip - } - s := Escape(u) - if s != expected { - t.Errorf("Escape(%s(%q)) == %q (expected %q)", name, tt.in, s, expected) - } - } -} - -func TestURLString(t *testing.T) { - DoTestString(t, url.Parse, "Parse", urltests) - - // no leading slash on path should prepend - // slash on String() call - noslash := URLTest{ - "http://www.google.com/search", - &url.URL{ - Scheme: "http", - Host: "www.google.com", - Path: "search", - }, - "", - } - s := Escape(noslash.out) - if s != noslash.in { - t.Errorf("Expected %s; go %s", noslash.in, s) - } -} - -type EscapeTest struct { - in string - out string - err error -} - -var escapeTests = []EscapeTest{ - { - "", - "", - nil, - }, - { - "abc", - "abc", - nil, - }, - { - "one two", - "one+two", - nil, - }, - { - "10%", - "10%25", - nil, - }, - { - " ?&=#+%!<>#\"{}|\\^[]`☺\t:/@$'()*,;", - "+?%26%3D%23%2B%25%21%3C%3E%23%22%7B%7D%7C%5C%5E%5B%5D%60%E2%98%BA%09%3A/%40%24%27%28%29%2A%2C%3B", - nil, - }, -} - -func TestEscape(t *testing.T) { - for _, tt := range escapeTests { - actual := QueryEscape(tt.in) - if tt.out != actual { - t.Errorf("QueryEscape(%q) = %q, want %q", tt.in, actual, tt.out) - } - - // for bonus points, verify that escape:unescape is an identity. - roundtrip, err := url.QueryUnescape(actual) - if roundtrip != tt.in || err != nil { - t.Errorf("QueryUnescape(%q) = %q, %s; want %q, %s", actual, roundtrip, err, tt.in, "[no error]") - } - } -} - -var resolveReferenceTests = []struct { - base, rel, expected string -}{ - // Absolute URL references - {"http://foo.com?a=b", "https://bar.com/", "https://bar.com/"}, - {"http://foo.com/", "https://bar.com/?a=b", "https://bar.com/?a=b"}, - {"http://foo.com/bar", "mailto:foo@example.com", "mailto:foo@example.com"}, - - // Path-absolute references - {"http://foo.com/bar", "/baz", "http://foo.com/baz"}, - {"http://foo.com/bar?a=b#f", "/baz", "http://foo.com/baz"}, - {"http://foo.com/bar?a=b", "/baz?c=d", "http://foo.com/baz?c=d"}, - - // Scheme-relative - {"https://foo.com/bar?a=b", "//bar.com/quux", "https://bar.com/quux"}, - - // Path-relative references: - - // ... current directory - {"http://foo.com", ".", "http://foo.com/"}, - {"http://foo.com/bar", ".", "http://foo.com/"}, - {"http://foo.com/bar/", ".", "http://foo.com/bar/"}, - - // ... going down - {"http://foo.com", "bar", "http://foo.com/bar"}, - {"http://foo.com/", "bar", "http://foo.com/bar"}, - {"http://foo.com/bar/baz", "quux", "http://foo.com/bar/quux"}, - - // ... going up - {"http://foo.com/bar/baz", "../quux", "http://foo.com/quux"}, - {"http://foo.com/bar/baz", "../../../../../quux", "http://foo.com/quux"}, - {"http://foo.com/bar", "..", "http://foo.com/"}, - {"http://foo.com/bar/baz", "./..", "http://foo.com/"}, - // ".." in the middle (issue 3560) - {"http://foo.com/bar/baz", "quux/dotdot/../tail", "http://foo.com/bar/quux/tail"}, - {"http://foo.com/bar/baz", "quux/./dotdot/../tail", "http://foo.com/bar/quux/tail"}, - {"http://foo.com/bar/baz", "quux/./dotdot/.././tail", "http://foo.com/bar/quux/tail"}, - {"http://foo.com/bar/baz", "quux/./dotdot/./../tail", "http://foo.com/bar/quux/tail"}, - {"http://foo.com/bar/baz", "quux/./dotdot/dotdot/././../../tail", "http://foo.com/bar/quux/tail"}, - {"http://foo.com/bar/baz", "quux/./dotdot/dotdot/./.././../tail", "http://foo.com/bar/quux/tail"}, - {"http://foo.com/bar/baz", "quux/./dotdot/dotdot/dotdot/./../../.././././tail", "http://foo.com/bar/quux/tail"}, - {"http://foo.com/bar/baz", "quux/./dotdot/../dotdot/../dot/./tail/..", "http://foo.com/bar/quux/dot/"}, - - // Remove any dot-segments prior to forming the target URI. - // http://tools.ietf.org/html/rfc3986#section-5.2.4 - {"http://foo.com/dot/./dotdot/../foo/bar", "../baz", "http://foo.com/dot/baz"}, - - // Triple dot isn't special - {"http://foo.com/bar", "...", "http://foo.com/..."}, - - // Fragment - {"http://foo.com/bar", ".#frag", "http://foo.com/#frag"}, - - // RFC 3986: Normal Examples - // http://tools.ietf.org/html/rfc3986#section-5.4.1 - {"http://a/b/c/d;p?q", "g:h", "g:h"}, - {"http://a/b/c/d;p?q", "g", "http://a/b/c/g"}, - {"http://a/b/c/d;p?q", "./g", "http://a/b/c/g"}, - {"http://a/b/c/d;p?q", "g/", "http://a/b/c/g/"}, - {"http://a/b/c/d;p?q", "/g", "http://a/g"}, - {"http://a/b/c/d;p?q", "//g", "http://g"}, - {"http://a/b/c/d;p?q", "?y", "http://a/b/c/d;p?y"}, - {"http://a/b/c/d;p?q", "g?y", "http://a/b/c/g?y"}, - {"http://a/b/c/d;p?q", "#s", "http://a/b/c/d;p?q#s"}, - {"http://a/b/c/d;p?q", "g#s", "http://a/b/c/g#s"}, - {"http://a/b/c/d;p?q", "g?y#s", "http://a/b/c/g?y#s"}, - {"http://a/b/c/d;p?q", ";x", "http://a/b/c/;x"}, - {"http://a/b/c/d;p?q", "g;x", "http://a/b/c/g;x"}, - {"http://a/b/c/d;p?q", "g;x?y#s", "http://a/b/c/g;x?y#s"}, - {"http://a/b/c/d;p?q", "", "http://a/b/c/d;p?q"}, - {"http://a/b/c/d;p?q", ".", "http://a/b/c/"}, - {"http://a/b/c/d;p?q", "./", "http://a/b/c/"}, - {"http://a/b/c/d;p?q", "..", "http://a/b/"}, - {"http://a/b/c/d;p?q", "../", "http://a/b/"}, - {"http://a/b/c/d;p?q", "../g", "http://a/b/g"}, - {"http://a/b/c/d;p?q", "../..", "http://a/"}, - {"http://a/b/c/d;p?q", "../../", "http://a/"}, - {"http://a/b/c/d;p?q", "../../g", "http://a/g"}, - - // RFC 3986: Abnormal Examples - // http://tools.ietf.org/html/rfc3986#section-5.4.2 - {"http://a/b/c/d;p?q", "../../../g", "http://a/g"}, - {"http://a/b/c/d;p?q", "../../../../g", "http://a/g"}, - {"http://a/b/c/d;p?q", "/./g", "http://a/g"}, - {"http://a/b/c/d;p?q", "/../g", "http://a/g"}, - {"http://a/b/c/d;p?q", "g.", "http://a/b/c/g."}, - {"http://a/b/c/d;p?q", ".g", "http://a/b/c/.g"}, - {"http://a/b/c/d;p?q", "g..", "http://a/b/c/g.."}, - {"http://a/b/c/d;p?q", "..g", "http://a/b/c/..g"}, - {"http://a/b/c/d;p?q", "./../g", "http://a/b/g"}, - {"http://a/b/c/d;p?q", "./g/.", "http://a/b/c/g/"}, - {"http://a/b/c/d;p?q", "g/./h", "http://a/b/c/g/h"}, - {"http://a/b/c/d;p?q", "g/../h", "http://a/b/c/h"}, - {"http://a/b/c/d;p?q", "g;x=1/./y", "http://a/b/c/g;x=1/y"}, - {"http://a/b/c/d;p?q", "g;x=1/../y", "http://a/b/c/y"}, - {"http://a/b/c/d;p?q", "g?y/./x", "http://a/b/c/g?y/./x"}, - {"http://a/b/c/d;p?q", "g?y/../x", "http://a/b/c/g?y/../x"}, - {"http://a/b/c/d;p?q", "g#s/./x", "http://a/b/c/g#s/./x"}, - {"http://a/b/c/d;p?q", "g#s/../x", "http://a/b/c/g#s/../x"}, - - // Extras. - {"https://a/b/c/d;p?q", "//g?q", "https://g?q"}, - {"https://a/b/c/d;p?q", "//g#s", "https://g#s"}, - {"https://a/b/c/d;p?q", "//g/d/e/f?y#s", "https://g/d/e/f?y#s"}, - {"https://a/b/c/d;p#s", "?y", "https://a/b/c/d;p?y"}, - {"https://a/b/c/d;p?q#s", "?y", "https://a/b/c/d;p?y"}, -} - -func TestResolveReference(t *testing.T) { - mustParse := func(url_ string) *url.URL { - u, err := url.Parse(url_) - if err != nil { - t.Fatalf("Expected URL to parse: %q, got error: %v", url_, err) - } - return u - } - opaque := &url.URL{Scheme: "scheme", Opaque: "opaque"} - for _, test := range resolveReferenceTests { - base := mustParse(test.base) - rel := mustParse(test.rel) - url := base.ResolveReference(rel) - if Escape(url) != test.expected { - t.Errorf("URL(%q).ResolveReference(%q) == %q, got %q", test.base, test.rel, test.expected, Escape(url)) - } - // Ensure that new instances are returned. - if base == url { - t.Errorf("Expected URL.ResolveReference to return new URL instance.") - } - // Test the convenience wrapper too. - url, err := base.Parse(test.rel) - if err != nil { - t.Errorf("URL(%q).Parse(%q) failed: %v", test.base, test.rel, err) - } else if Escape(url) != test.expected { - t.Errorf("URL(%q).Parse(%q) == %q, got %q", test.base, test.rel, test.expected, Escape(url)) - } else if base == url { - // Ensure that new instances are returned for the wrapper too. - t.Errorf("Expected URL.Parse to return new URL instance.") - } - // Ensure Opaque resets the URL. - url = base.ResolveReference(opaque) - if *url != *opaque { - t.Errorf("ResolveReference failed to resolve opaque URL: want %#v, got %#v", url, opaque) - } - // Test the convenience wrapper with an opaque URL too. - url, err = base.Parse("scheme:opaque") - if err != nil { - t.Errorf(`URL(%q).Parse("scheme:opaque") failed: %v`, test.base, err) - } else if *url != *opaque { - t.Errorf("Parse failed to resolve opaque URL: want %#v, got %#v", url, opaque) - } else if base == url { - // Ensure that new instances are returned, again. - t.Errorf("Expected URL.Parse to return new URL instance.") - } - } -} - -type shouldEscapeTest struct { - in byte - mode encoding - escape bool -} - -var shouldEscapeTests = []shouldEscapeTest{ - // Unreserved characters (§2.3) - {'a', encodePath, false}, - {'a', encodeUserPassword, false}, - {'a', encodeQueryComponent, false}, - {'a', encodeFragment, false}, - {'z', encodePath, false}, - {'A', encodePath, false}, - {'Z', encodePath, false}, - {'0', encodePath, false}, - {'9', encodePath, false}, - {'-', encodePath, false}, - {'-', encodeUserPassword, false}, - {'-', encodeQueryComponent, false}, - {'-', encodeFragment, false}, - {'.', encodePath, false}, - {'_', encodePath, false}, - {'~', encodePath, false}, - - // User information (§3.2.1) - {':', encodeUserPassword, true}, - {'/', encodeUserPassword, true}, - {'?', encodeUserPassword, true}, - {'@', encodeUserPassword, true}, - {'$', encodeUserPassword, false}, - {'&', encodeUserPassword, false}, - {'+', encodeUserPassword, false}, - {',', encodeUserPassword, false}, - {';', encodeUserPassword, false}, - {'=', encodeUserPassword, false}, -} - -func TestShouldEscape(t *testing.T) { - for _, tt := range shouldEscapeTests { - if shouldEscape(tt.in, tt.mode) != tt.escape { - t.Errorf("shouldEscape(%q, %v) returned %v; expected %v", tt.in, tt.mode, !tt.escape, tt.escape) - } - } -} diff --git a/vendor/github.com/emicklei/go-restful/.gitignore b/vendor/github.com/emicklei/go-restful/.gitignore deleted file mode 100644 index cece7be664..0000000000 --- a/vendor/github.com/emicklei/go-restful/.gitignore +++ /dev/null @@ -1,70 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe - -restful.html - -*.out - -tmp.prof - -go-restful.test - -examples/restful-basic-authentication - -examples/restful-encoding-filter - -examples/restful-filters - -examples/restful-hello-world - -examples/restful-resource-functions - -examples/restful-serve-static - -examples/restful-user-service - -*.DS_Store -examples/restful-user-resource - -examples/restful-multi-containers - -examples/restful-form-handling - -examples/restful-CORS-filter - -examples/restful-options-filter - -examples/restful-curly-router - -examples/restful-cpuprofiler-service - -examples/restful-pre-post-filters - -curly.prof - -examples/restful-NCSA-logging - -examples/restful-html-template - -s.html -restful-path-tail diff --git a/vendor/github.com/emicklei/go-restful/CHANGES.md b/vendor/github.com/emicklei/go-restful/CHANGES.md deleted file mode 100644 index d90aaa22e4..0000000000 --- a/vendor/github.com/emicklei/go-restful/CHANGES.md +++ /dev/null @@ -1,226 +0,0 @@ -Change history of go-restful -= -2017-09-13 -- added route condition functions using `.If(func)` in route building. - -2017-02-16 -- solved issue #304, make operation names unique - -2017-01-30 - - [IMPORTANT] For swagger users, change your import statement to: - swagger "github.com/emicklei/go-restful-swagger12" - -- moved swagger 1.2 code to go-restful-swagger12 -- created TAG 2.0.0 - -2017-01-27 - -- remove defer request body close -- expose Dispatch for testing filters and Routefunctions -- swagger response model cannot be array -- created TAG 1.0.0 - -2016-12-22 - -- (API change) Remove code related to caching request content. Removes SetCacheReadEntity(doCache bool) - -2016-11-26 - -- Default change! now use CurlyRouter (was RouterJSR311) -- Default change! no more caching of request content -- Default change! do not recover from panics - -2016-09-22 - -- fix the DefaultRequestContentType feature - -2016-02-14 - -- take the qualify factor of the Accept header mediatype into account when deciding the contentype of the response -- add constructors for custom entity accessors for xml and json - -2015-09-27 - -- rename new WriteStatusAnd... to WriteHeaderAnd... for consistency - -2015-09-25 - -- fixed problem with changing Header after WriteHeader (issue 235) - -2015-09-14 - -- changed behavior of WriteHeader (immediate write) and WriteEntity (no status write) -- added support for custom EntityReaderWriters. - -2015-08-06 - -- add support for reading entities from compressed request content -- use sync.Pool for compressors of http response and request body -- add Description to Parameter for documentation in Swagger UI - -2015-03-20 - -- add configurable logging - -2015-03-18 - -- if not specified, the Operation is derived from the Route function - -2015-03-17 - -- expose Parameter creation functions -- make trace logger an interface -- fix OPTIONSFilter -- customize rendering of ServiceError -- JSR311 router now handles wildcards -- add Notes to Route - -2014-11-27 - -- (api add) PrettyPrint per response. (as proposed in #167) - -2014-11-12 - -- (api add) ApiVersion(.) for documentation in Swagger UI - -2014-11-10 - -- (api change) struct fields tagged with "description" show up in Swagger UI - -2014-10-31 - -- (api change) ReturnsError -> Returns -- (api add) RouteBuilder.Do(aBuilder) for DRY use of RouteBuilder -- fix swagger nested structs -- sort Swagger response messages by code - -2014-10-23 - -- (api add) ReturnsError allows you to document Http codes in swagger -- fixed problem with greedy CurlyRouter -- (api add) Access-Control-Max-Age in CORS -- add tracing functionality (injectable) for debugging purposes -- support JSON parse 64bit int -- fix empty parameters for swagger -- WebServicesUrl is now optional for swagger -- fixed duplicate AccessControlAllowOrigin in CORS -- (api change) expose ServeMux in container -- (api add) added AllowedDomains in CORS -- (api add) ParameterNamed for detailed documentation - -2014-04-16 - -- (api add) expose constructor of Request for testing. - -2014-06-27 - -- (api add) ParameterNamed gives access to a Parameter definition and its data (for further specification). -- (api add) SetCacheReadEntity allow scontrol over whether or not the request body is being cached (default true for compatibility reasons). - -2014-07-03 - -- (api add) CORS can be configured with a list of allowed domains - -2014-03-12 - -- (api add) Route path parameters can use wildcard or regular expressions. (requires CurlyRouter) - -2014-02-26 - -- (api add) Request now provides information about the matched Route, see method SelectedRoutePath - -2014-02-17 - -- (api change) renamed parameter constants (go-lint checks) - -2014-01-10 - -- (api add) support for CloseNotify, see http://golang.org/pkg/net/http/#CloseNotifier - -2014-01-07 - -- (api change) Write* methods in Response now return the error or nil. -- added example of serving HTML from a Go template. -- fixed comparing Allowed headers in CORS (is now case-insensitive) - -2013-11-13 - -- (api add) Response knows how many bytes are written to the response body. - -2013-10-29 - -- (api add) RecoverHandler(handler RecoverHandleFunction) to change how panic recovery is handled. Default behavior is to log and return a stacktrace. This may be a security issue as it exposes sourcecode information. - -2013-10-04 - -- (api add) Response knows what HTTP status has been written -- (api add) Request can have attributes (map of string->interface, also called request-scoped variables - -2013-09-12 - -- (api change) Router interface simplified -- Implemented CurlyRouter, a Router that does not use|allow regular expressions in paths - -2013-08-05 - - add OPTIONS support - - add CORS support - -2013-08-27 - -- fixed some reported issues (see github) -- (api change) deprecated use of WriteError; use WriteErrorString instead - -2014-04-15 - -- (fix) v1.0.1 tag: fix Issue 111: WriteErrorString - -2013-08-08 - -- (api add) Added implementation Container: a WebServices collection with its own http.ServeMux allowing multiple endpoints per program. Existing uses of go-restful will register their services to the DefaultContainer. -- (api add) the swagger package has be extended to have a UI per container. -- if panic is detected then a small stack trace is printed (thanks to runner-mei) -- (api add) WriteErrorString to Response - -Important API changes: - -- (api remove) package variable DoNotRecover no longer works ; use restful.DefaultContainer.DoNotRecover(true) instead. -- (api remove) package variable EnableContentEncoding no longer works ; use restful.DefaultContainer.EnableContentEncoding(true) instead. - - -2013-07-06 - -- (api add) Added support for response encoding (gzip and deflate(zlib)). This feature is disabled on default (for backwards compatibility). Use restful.EnableContentEncoding = true in your initialization to enable this feature. - -2013-06-19 - -- (improve) DoNotRecover option, moved request body closer, improved ReadEntity - -2013-06-03 - -- (api change) removed Dispatcher interface, hide PathExpression -- changed receiver names of type functions to be more idiomatic Go - -2013-06-02 - -- (optimize) Cache the RegExp compilation of Paths. - -2013-05-22 - -- (api add) Added support for request/response filter functions - -2013-05-18 - - -- (api add) Added feature to change the default Http Request Dispatch function (travis cline) -- (api change) Moved Swagger Webservice to swagger package (see example restful-user) - -[2012-11-14 .. 2013-05-18> - -- See https://github.com/emicklei/go-restful/commits - -2012-11-14 - -- Initial commit - - diff --git a/vendor/github.com/emicklei/go-restful/LICENSE b/vendor/github.com/emicklei/go-restful/LICENSE deleted file mode 100644 index ece7ec61ef..0000000000 --- a/vendor/github.com/emicklei/go-restful/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2012,2013 Ernest Micklei - -MIT License - -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. \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/Makefile b/vendor/github.com/emicklei/go-restful/Makefile deleted file mode 100644 index b40081cc0e..0000000000 --- a/vendor/github.com/emicklei/go-restful/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: test - -test: - go test -v . - -ex: - cd examples && ls *.go | xargs go build -o /tmp/ignore \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/README.md b/vendor/github.com/emicklei/go-restful/README.md deleted file mode 100644 index 002a08d965..0000000000 --- a/vendor/github.com/emicklei/go-restful/README.md +++ /dev/null @@ -1,75 +0,0 @@ -go-restful -========== -package for building REST-style Web Services using Google Go - -[![Build Status](https://travis-ci.org/emicklei/go-restful.png)](https://travis-ci.org/emicklei/go-restful) -[![Go Report Card](https://goreportcard.com/badge/github.com/emicklei/go-restful)](https://goreportcard.com/report/github.com/emicklei/go-restful) -[![GoDoc](https://godoc.org/github.com/emicklei/go-restful?status.svg)](https://godoc.org/github.com/emicklei/go-restful) - -- [Code examples](https://github.com/emicklei/go-restful/tree/master/examples) - -REST asks developers to use HTTP methods explicitly and in a way that's consistent with the protocol definition. This basic REST design principle establishes a one-to-one mapping between create, read, update, and delete (CRUD) operations and HTTP methods. According to this mapping: - -- GET = Retrieve a representation of a resource -- POST = Create if you are sending content to the server to create a subordinate of the specified resource collection, using some server-side algorithm. -- PUT = Create if you are sending the full content of the specified resource (URI). -- PUT = Update if you are updating the full content of the specified resource. -- DELETE = Delete if you are requesting the server to delete the resource -- PATCH = Update partial content of a resource -- OPTIONS = Get information about the communication options for the request URI - -### Example - -```Go -ws := new(restful.WebService) -ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) - -ws.Route(ws.GET("/{user-id}").To(u.findUser). - Doc("get a user"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")). - Writes(User{})) -... - -func (u UserResource) findUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - ... -} -``` - -[Full API of a UserResource](https://github.com/emicklei/go-restful/tree/master/examples/restful-user-resource.go) - -### Features - -- Routes for request → function mapping with path parameter (e.g. {id}) support -- Configurable router: - - (default) Fast routing algorithm that allows static elements, regular expressions and dynamic parameters in the URL path (e.g. /meetings/{id} or /static/{subpath:*} - - Routing algorithm after [JSR311](http://jsr311.java.net/nonav/releases/1.1/spec/spec.html) that is implemented using (but does **not** accept) regular expressions -- Request API for reading structs from JSON/XML and accesing parameters (path,query,header) -- Response API for writing structs to JSON/XML and setting headers -- Customizable encoding using EntityReaderWriter registration -- Filters for intercepting the request → response flow on Service or Route level -- Request-scoped variables using attributes -- Containers for WebServices on different HTTP endpoints -- Content encoding (gzip,deflate) of request and response payloads -- Automatic responses on OPTIONS (using a filter) -- Automatic CORS request handling (using a filter) -- API declaration for Swagger UI ([go-restful-openapi](https://github.com/emicklei/go-restful-openapi), see [go-restful-swagger12](https://github.com/emicklei/go-restful-swagger12)) -- Panic recovery to produce HTTP 500, customizable using RecoverHandler(...) -- Route errors produce HTTP 404/405/406/415 errors, customizable using ServiceErrorHandler(...) -- Configurable (trace) logging -- Customizable gzip/deflate readers and writers using CompressorProvider registration - -### Resources - -- [Example posted on blog](http://ernestmicklei.com/2012/11/go-restful-first-working-example/) -- [Design explained on blog](http://ernestmicklei.com/2012/11/go-restful-api-design/) -- [sourcegraph](https://sourcegraph.com/github.com/emicklei/go-restful) -- [showcase: Zazkia - tcp proxy for testing resiliency](https://github.com/emicklei/zazkia) -- [showcase: Mora - MongoDB REST Api server](https://github.com/emicklei/mora) - -Type ```git shortlog -s``` for a full list of contributors. - -© 2012 - 2017, http://ernestmicklei.com. MIT License. Contributions are welcome. diff --git a/vendor/github.com/emicklei/go-restful/Srcfile b/vendor/github.com/emicklei/go-restful/Srcfile deleted file mode 100644 index 16fd186892..0000000000 --- a/vendor/github.com/emicklei/go-restful/Srcfile +++ /dev/null @@ -1 +0,0 @@ -{"SkipDirs": ["examples"]} diff --git a/vendor/github.com/emicklei/go-restful/bench_curly_test.go b/vendor/github.com/emicklei/go-restful/bench_curly_test.go deleted file mode 100644 index db6a1a7524..0000000000 --- a/vendor/github.com/emicklei/go-restful/bench_curly_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package restful - -import ( - "fmt" - "net/http" - "net/http/httptest" - "testing" -) - -func setupCurly(container *Container) []string { - wsCount := 26 - rtCount := 26 - urisCurly := []string{} - - container.Router(CurlyRouter{}) - for i := 0; i < wsCount; i++ { - root := fmt.Sprintf("/%s/{%s}/", string(i+97), string(i+97)) - ws := new(WebService).Path(root) - for j := 0; j < rtCount; j++ { - sub := fmt.Sprintf("/%s2/{%s2}", string(j+97), string(j+97)) - ws.Route(ws.GET(sub).Consumes("application/xml").Produces("application/xml").To(echoCurly)) - } - container.Add(ws) - for _, each := range ws.Routes() { - urisCurly = append(urisCurly, "http://bench.com"+each.Path) - } - } - return urisCurly -} - -func echoCurly(req *Request, resp *Response) {} - -func BenchmarkManyCurly(b *testing.B) { - container := NewContainer() - urisCurly := setupCurly(container) - b.ResetTimer() - for t := 0; t < b.N; t++ { - for r := 0; r < 1000; r++ { - for _, each := range urisCurly { - sendNoReturnTo(each, container, t) - } - } - } -} - -func sendNoReturnTo(address string, container *Container, t int) { - httpRequest, _ := http.NewRequest("GET", address, nil) - httpRequest.Header.Set("Accept", "application/xml") - httpWriter := httptest.NewRecorder() - container.dispatch(httpWriter, httpRequest) -} diff --git a/vendor/github.com/emicklei/go-restful/bench_test.go b/vendor/github.com/emicklei/go-restful/bench_test.go deleted file mode 100644 index 3e77c2d292..0000000000 --- a/vendor/github.com/emicklei/go-restful/bench_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package restful - -import ( - "fmt" - "io" - "testing" -) - -var uris = []string{} - -func setup(container *Container) { - wsCount := 26 - rtCount := 26 - - for i := 0; i < wsCount; i++ { - root := fmt.Sprintf("/%s/{%s}/", string(i+97), string(i+97)) - ws := new(WebService).Path(root) - for j := 0; j < rtCount; j++ { - sub := fmt.Sprintf("/%s2/{%s2}", string(j+97), string(j+97)) - ws.Route(ws.GET(sub).To(echo)) - } - container.Add(ws) - for _, each := range ws.Routes() { - uris = append(uris, "http://bench.com"+each.Path) - } - } -} - -func echo(req *Request, resp *Response) { - io.WriteString(resp.ResponseWriter, "echo") -} - -func BenchmarkMany(b *testing.B) { - container := NewContainer() - setup(container) - b.ResetTimer() - for t := 0; t < b.N; t++ { - for _, each := range uris { - // println(each) - sendItTo(each, container) - } - } -} diff --git a/vendor/github.com/emicklei/go-restful/bench_test.sh b/vendor/github.com/emicklei/go-restful/bench_test.sh deleted file mode 100644 index 47ffbe4ac9..0000000000 --- a/vendor/github.com/emicklei/go-restful/bench_test.sh +++ /dev/null @@ -1,10 +0,0 @@ -#go test -run=none -file bench_test.go -test.bench . -cpuprofile=bench_test.out - -go test -c -./go-restful.test -test.run=none -test.cpuprofile=tmp.prof -test.bench=BenchmarkMany -./go-restful.test -test.run=none -test.cpuprofile=curly.prof -test.bench=BenchmarkManyCurly - -#go tool pprof go-restful.test tmp.prof -go tool pprof go-restful.test curly.prof - - diff --git a/vendor/github.com/emicklei/go-restful/compress.go b/vendor/github.com/emicklei/go-restful/compress.go deleted file mode 100644 index 220b37712f..0000000000 --- a/vendor/github.com/emicklei/go-restful/compress.go +++ /dev/null @@ -1,123 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "bufio" - "compress/gzip" - "compress/zlib" - "errors" - "io" - "net" - "net/http" - "strings" -) - -// OBSOLETE : use restful.DefaultContainer.EnableContentEncoding(true) to change this setting. -var EnableContentEncoding = false - -// CompressingResponseWriter is a http.ResponseWriter that can perform content encoding (gzip and zlib) -type CompressingResponseWriter struct { - writer http.ResponseWriter - compressor io.WriteCloser - encoding string -} - -// Header is part of http.ResponseWriter interface -func (c *CompressingResponseWriter) Header() http.Header { - return c.writer.Header() -} - -// WriteHeader is part of http.ResponseWriter interface -func (c *CompressingResponseWriter) WriteHeader(status int) { - c.writer.WriteHeader(status) -} - -// Write is part of http.ResponseWriter interface -// It is passed through the compressor -func (c *CompressingResponseWriter) Write(bytes []byte) (int, error) { - if c.isCompressorClosed() { - return -1, errors.New("Compressing error: tried to write data using closed compressor") - } - return c.compressor.Write(bytes) -} - -// CloseNotify is part of http.CloseNotifier interface -func (c *CompressingResponseWriter) CloseNotify() <-chan bool { - return c.writer.(http.CloseNotifier).CloseNotify() -} - -// Close the underlying compressor -func (c *CompressingResponseWriter) Close() error { - if c.isCompressorClosed() { - return errors.New("Compressing error: tried to close already closed compressor") - } - - c.compressor.Close() - if ENCODING_GZIP == c.encoding { - currentCompressorProvider.ReleaseGzipWriter(c.compressor.(*gzip.Writer)) - } - if ENCODING_DEFLATE == c.encoding { - currentCompressorProvider.ReleaseZlibWriter(c.compressor.(*zlib.Writer)) - } - // gc hint needed? - c.compressor = nil - return nil -} - -func (c *CompressingResponseWriter) isCompressorClosed() bool { - return nil == c.compressor -} - -// Hijack implements the Hijacker interface -// This is especially useful when combining Container.EnabledContentEncoding -// in combination with websockets (for instance gorilla/websocket) -func (c *CompressingResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { - hijacker, ok := c.writer.(http.Hijacker) - if !ok { - return nil, nil, errors.New("ResponseWriter doesn't support Hijacker interface") - } - return hijacker.Hijack() -} - -// WantsCompressedResponse reads the Accept-Encoding header to see if and which encoding is requested. -func wantsCompressedResponse(httpRequest *http.Request) (bool, string) { - header := httpRequest.Header.Get(HEADER_AcceptEncoding) - gi := strings.Index(header, ENCODING_GZIP) - zi := strings.Index(header, ENCODING_DEFLATE) - // use in order of appearance - if gi == -1 { - return zi != -1, ENCODING_DEFLATE - } else if zi == -1 { - return gi != -1, ENCODING_GZIP - } else { - if gi < zi { - return true, ENCODING_GZIP - } - return true, ENCODING_DEFLATE - } -} - -// NewCompressingResponseWriter create a CompressingResponseWriter for a known encoding = {gzip,deflate} -func NewCompressingResponseWriter(httpWriter http.ResponseWriter, encoding string) (*CompressingResponseWriter, error) { - httpWriter.Header().Set(HEADER_ContentEncoding, encoding) - c := new(CompressingResponseWriter) - c.writer = httpWriter - var err error - if ENCODING_GZIP == encoding { - w := currentCompressorProvider.AcquireGzipWriter() - w.Reset(httpWriter) - c.compressor = w - c.encoding = ENCODING_GZIP - } else if ENCODING_DEFLATE == encoding { - w := currentCompressorProvider.AcquireZlibWriter() - w.Reset(httpWriter) - c.compressor = w - c.encoding = ENCODING_DEFLATE - } else { - return nil, errors.New("Unknown encoding:" + encoding) - } - return c, err -} diff --git a/vendor/github.com/emicklei/go-restful/compress_test.go b/vendor/github.com/emicklei/go-restful/compress_test.go deleted file mode 100644 index cc3e93d543..0000000000 --- a/vendor/github.com/emicklei/go-restful/compress_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package restful - -import ( - "bytes" - "compress/gzip" - "compress/zlib" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "testing" -) - -// go test -v -test.run TestGzip ...restful -func TestGzip(t *testing.T) { - EnableContentEncoding = true - httpRequest, _ := http.NewRequest("GET", "/test", nil) - httpRequest.Header.Set("Accept-Encoding", "gzip,deflate") - httpWriter := httptest.NewRecorder() - wanted, encoding := wantsCompressedResponse(httpRequest) - if !wanted { - t.Fatal("should accept gzip") - } - if encoding != "gzip" { - t.Fatal("expected gzip") - } - c, err := NewCompressingResponseWriter(httpWriter, encoding) - if err != nil { - t.Fatal(err.Error()) - } - c.Write([]byte("Hello World")) - c.Close() - if httpWriter.Header().Get("Content-Encoding") != "gzip" { - t.Fatal("Missing gzip header") - } - reader, err := gzip.NewReader(httpWriter.Body) - if err != nil { - t.Fatal(err.Error()) - } - data, err := ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err.Error()) - } - if got, want := string(data), "Hello World"; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -func TestDeflate(t *testing.T) { - EnableContentEncoding = true - httpRequest, _ := http.NewRequest("GET", "/test", nil) - httpRequest.Header.Set("Accept-Encoding", "deflate,gzip") - httpWriter := httptest.NewRecorder() - wanted, encoding := wantsCompressedResponse(httpRequest) - if !wanted { - t.Fatal("should accept deflate") - } - if encoding != "deflate" { - t.Fatal("expected deflate") - } - c, err := NewCompressingResponseWriter(httpWriter, encoding) - if err != nil { - t.Fatal(err.Error()) - } - c.Write([]byte("Hello World")) - c.Close() - if httpWriter.Header().Get("Content-Encoding") != "deflate" { - t.Fatal("Missing deflate header") - } - reader, err := zlib.NewReader(httpWriter.Body) - if err != nil { - t.Fatal(err.Error()) - } - data, err := ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err.Error()) - } - if got, want := string(data), "Hello World"; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -func TestGzipDecompressRequestBody(t *testing.T) { - b := new(bytes.Buffer) - w := newGzipWriter() - w.Reset(b) - io.WriteString(w, `{"msg":"hi"}`) - w.Flush() - w.Close() - - req := new(Request) - httpRequest, _ := http.NewRequest("GET", "/", bytes.NewReader(b.Bytes())) - httpRequest.Header.Set("Content-Type", "application/json") - httpRequest.Header.Set("Content-Encoding", "gzip") - req.Request = httpRequest - - doc := make(map[string]interface{}) - req.ReadEntity(&doc) - - if got, want := doc["msg"], "hi"; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -func TestZlibDecompressRequestBody(t *testing.T) { - b := new(bytes.Buffer) - w := newZlibWriter() - w.Reset(b) - io.WriteString(w, `{"msg":"hi"}`) - w.Flush() - w.Close() - - req := new(Request) - httpRequest, _ := http.NewRequest("GET", "/", bytes.NewReader(b.Bytes())) - httpRequest.Header.Set("Content-Type", "application/json") - httpRequest.Header.Set("Content-Encoding", "deflate") - req.Request = httpRequest - - doc := make(map[string]interface{}) - req.ReadEntity(&doc) - - if got, want := doc["msg"], "hi"; got != want { - t.Errorf("got %v want %v", got, want) - } -} diff --git a/vendor/github.com/emicklei/go-restful/compressor_cache.go b/vendor/github.com/emicklei/go-restful/compressor_cache.go deleted file mode 100644 index ee426010a2..0000000000 --- a/vendor/github.com/emicklei/go-restful/compressor_cache.go +++ /dev/null @@ -1,103 +0,0 @@ -package restful - -// Copyright 2015 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "compress/gzip" - "compress/zlib" -) - -// BoundedCachedCompressors is a CompressorProvider that uses a cache with a fixed amount -// of writers and readers (resources). -// If a new resource is acquired and all are in use, it will return a new unmanaged resource. -type BoundedCachedCompressors struct { - gzipWriters chan *gzip.Writer - gzipReaders chan *gzip.Reader - zlibWriters chan *zlib.Writer - writersCapacity int - readersCapacity int -} - -// NewBoundedCachedCompressors returns a new, with filled cache, BoundedCachedCompressors. -func NewBoundedCachedCompressors(writersCapacity, readersCapacity int) *BoundedCachedCompressors { - b := &BoundedCachedCompressors{ - gzipWriters: make(chan *gzip.Writer, writersCapacity), - gzipReaders: make(chan *gzip.Reader, readersCapacity), - zlibWriters: make(chan *zlib.Writer, writersCapacity), - writersCapacity: writersCapacity, - readersCapacity: readersCapacity, - } - for ix := 0; ix < writersCapacity; ix++ { - b.gzipWriters <- newGzipWriter() - b.zlibWriters <- newZlibWriter() - } - for ix := 0; ix < readersCapacity; ix++ { - b.gzipReaders <- newGzipReader() - } - return b -} - -// AcquireGzipWriter returns an resettable *gzip.Writer. Needs to be released. -func (b *BoundedCachedCompressors) AcquireGzipWriter() *gzip.Writer { - var writer *gzip.Writer - select { - case writer, _ = <-b.gzipWriters: - default: - // return a new unmanaged one - writer = newGzipWriter() - } - return writer -} - -// ReleaseGzipWriter accepts a writer (does not have to be one that was cached) -// only when the cache has room for it. It will ignore it otherwise. -func (b *BoundedCachedCompressors) ReleaseGzipWriter(w *gzip.Writer) { - // forget the unmanaged ones - if len(b.gzipWriters) < b.writersCapacity { - b.gzipWriters <- w - } -} - -// AcquireGzipReader returns a *gzip.Reader. Needs to be released. -func (b *BoundedCachedCompressors) AcquireGzipReader() *gzip.Reader { - var reader *gzip.Reader - select { - case reader, _ = <-b.gzipReaders: - default: - // return a new unmanaged one - reader = newGzipReader() - } - return reader -} - -// ReleaseGzipReader accepts a reader (does not have to be one that was cached) -// only when the cache has room for it. It will ignore it otherwise. -func (b *BoundedCachedCompressors) ReleaseGzipReader(r *gzip.Reader) { - // forget the unmanaged ones - if len(b.gzipReaders) < b.readersCapacity { - b.gzipReaders <- r - } -} - -// AcquireZlibWriter returns an resettable *zlib.Writer. Needs to be released. -func (b *BoundedCachedCompressors) AcquireZlibWriter() *zlib.Writer { - var writer *zlib.Writer - select { - case writer, _ = <-b.zlibWriters: - default: - // return a new unmanaged one - writer = newZlibWriter() - } - return writer -} - -// ReleaseZlibWriter accepts a writer (does not have to be one that was cached) -// only when the cache has room for it. It will ignore it otherwise. -func (b *BoundedCachedCompressors) ReleaseZlibWriter(w *zlib.Writer) { - // forget the unmanaged ones - if len(b.zlibWriters) < b.writersCapacity { - b.zlibWriters <- w - } -} diff --git a/vendor/github.com/emicklei/go-restful/compressor_pools.go b/vendor/github.com/emicklei/go-restful/compressor_pools.go deleted file mode 100644 index d866ce64bb..0000000000 --- a/vendor/github.com/emicklei/go-restful/compressor_pools.go +++ /dev/null @@ -1,91 +0,0 @@ -package restful - -// Copyright 2015 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "bytes" - "compress/gzip" - "compress/zlib" - "sync" -) - -// SyncPoolCompessors is a CompressorProvider that use the standard sync.Pool. -type SyncPoolCompessors struct { - GzipWriterPool *sync.Pool - GzipReaderPool *sync.Pool - ZlibWriterPool *sync.Pool -} - -// NewSyncPoolCompessors returns a new ("empty") SyncPoolCompessors. -func NewSyncPoolCompessors() *SyncPoolCompessors { - return &SyncPoolCompessors{ - GzipWriterPool: &sync.Pool{ - New: func() interface{} { return newGzipWriter() }, - }, - GzipReaderPool: &sync.Pool{ - New: func() interface{} { return newGzipReader() }, - }, - ZlibWriterPool: &sync.Pool{ - New: func() interface{} { return newZlibWriter() }, - }, - } -} - -func (s *SyncPoolCompessors) AcquireGzipWriter() *gzip.Writer { - return s.GzipWriterPool.Get().(*gzip.Writer) -} - -func (s *SyncPoolCompessors) ReleaseGzipWriter(w *gzip.Writer) { - s.GzipWriterPool.Put(w) -} - -func (s *SyncPoolCompessors) AcquireGzipReader() *gzip.Reader { - return s.GzipReaderPool.Get().(*gzip.Reader) -} - -func (s *SyncPoolCompessors) ReleaseGzipReader(r *gzip.Reader) { - s.GzipReaderPool.Put(r) -} - -func (s *SyncPoolCompessors) AcquireZlibWriter() *zlib.Writer { - return s.ZlibWriterPool.Get().(*zlib.Writer) -} - -func (s *SyncPoolCompessors) ReleaseZlibWriter(w *zlib.Writer) { - s.ZlibWriterPool.Put(w) -} - -func newGzipWriter() *gzip.Writer { - // create with an empty bytes writer; it will be replaced before using the gzipWriter - writer, err := gzip.NewWriterLevel(new(bytes.Buffer), gzip.BestSpeed) - if err != nil { - panic(err.Error()) - } - return writer -} - -func newGzipReader() *gzip.Reader { - // create with an empty reader (but with GZIP header); it will be replaced before using the gzipReader - // we can safely use currentCompressProvider because it is set on package initialization. - w := currentCompressorProvider.AcquireGzipWriter() - defer currentCompressorProvider.ReleaseGzipWriter(w) - b := new(bytes.Buffer) - w.Reset(b) - w.Flush() - w.Close() - reader, err := gzip.NewReader(bytes.NewReader(b.Bytes())) - if err != nil { - panic(err.Error()) - } - return reader -} - -func newZlibWriter() *zlib.Writer { - writer, err := zlib.NewWriterLevel(new(bytes.Buffer), gzip.BestSpeed) - if err != nil { - panic(err.Error()) - } - return writer -} diff --git a/vendor/github.com/emicklei/go-restful/compressors.go b/vendor/github.com/emicklei/go-restful/compressors.go deleted file mode 100644 index 9db4a8c8e9..0000000000 --- a/vendor/github.com/emicklei/go-restful/compressors.go +++ /dev/null @@ -1,54 +0,0 @@ -package restful - -// Copyright 2015 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "compress/gzip" - "compress/zlib" -) - -// CompressorProvider describes a component that can provider compressors for the std methods. -type CompressorProvider interface { - // Returns a *gzip.Writer which needs to be released later. - // Before using it, call Reset(). - AcquireGzipWriter() *gzip.Writer - - // Releases an acquired *gzip.Writer. - ReleaseGzipWriter(w *gzip.Writer) - - // Returns a *gzip.Reader which needs to be released later. - AcquireGzipReader() *gzip.Reader - - // Releases an acquired *gzip.Reader. - ReleaseGzipReader(w *gzip.Reader) - - // Returns a *zlib.Writer which needs to be released later. - // Before using it, call Reset(). - AcquireZlibWriter() *zlib.Writer - - // Releases an acquired *zlib.Writer. - ReleaseZlibWriter(w *zlib.Writer) -} - -// DefaultCompressorProvider is the actual provider of compressors (zlib or gzip). -var currentCompressorProvider CompressorProvider - -func init() { - currentCompressorProvider = NewSyncPoolCompessors() -} - -// CurrentCompressorProvider returns the current CompressorProvider. -// It is initialized using a SyncPoolCompessors. -func CurrentCompressorProvider() CompressorProvider { - return currentCompressorProvider -} - -// SetCompressorProvider sets the actual provider of compressors (zlib or gzip). -func SetCompressorProvider(p CompressorProvider) { - if p == nil { - panic("cannot set compressor provider to nil") - } - currentCompressorProvider = p -} diff --git a/vendor/github.com/emicklei/go-restful/constants.go b/vendor/github.com/emicklei/go-restful/constants.go deleted file mode 100644 index 203439c5e5..0000000000 --- a/vendor/github.com/emicklei/go-restful/constants.go +++ /dev/null @@ -1,30 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -const ( - MIME_XML = "application/xml" // Accept or Content-Type used in Consumes() and/or Produces() - MIME_JSON = "application/json" // Accept or Content-Type used in Consumes() and/or Produces() - MIME_OCTET = "application/octet-stream" // If Content-Type is not present in request, use the default - - HEADER_Allow = "Allow" - HEADER_Accept = "Accept" - HEADER_Origin = "Origin" - HEADER_ContentType = "Content-Type" - HEADER_LastModified = "Last-Modified" - HEADER_AcceptEncoding = "Accept-Encoding" - HEADER_ContentEncoding = "Content-Encoding" - HEADER_AccessControlExposeHeaders = "Access-Control-Expose-Headers" - HEADER_AccessControlRequestMethod = "Access-Control-Request-Method" - HEADER_AccessControlRequestHeaders = "Access-Control-Request-Headers" - HEADER_AccessControlAllowMethods = "Access-Control-Allow-Methods" - HEADER_AccessControlAllowOrigin = "Access-Control-Allow-Origin" - HEADER_AccessControlAllowCredentials = "Access-Control-Allow-Credentials" - HEADER_AccessControlAllowHeaders = "Access-Control-Allow-Headers" - HEADER_AccessControlMaxAge = "Access-Control-Max-Age" - - ENCODING_GZIP = "gzip" - ENCODING_DEFLATE = "deflate" -) diff --git a/vendor/github.com/emicklei/go-restful/container.go b/vendor/github.com/emicklei/go-restful/container.go deleted file mode 100644 index 4196180e54..0000000000 --- a/vendor/github.com/emicklei/go-restful/container.go +++ /dev/null @@ -1,366 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "bytes" - "errors" - "fmt" - "net/http" - "os" - "runtime" - "strings" - "sync" - - "github.com/emicklei/go-restful/log" -) - -// Container holds a collection of WebServices and a http.ServeMux to dispatch http requests. -// The requests are further dispatched to routes of WebServices using a RouteSelector -type Container struct { - webServicesLock sync.RWMutex - webServices []*WebService - ServeMux *http.ServeMux - isRegisteredOnRoot bool - containerFilters []FilterFunction - doNotRecover bool // default is true - recoverHandleFunc RecoverHandleFunction - serviceErrorHandleFunc ServiceErrorHandleFunction - router RouteSelector // default is a CurlyRouter (RouterJSR311 is a slower alternative) - contentEncodingEnabled bool // default is false -} - -// NewContainer creates a new Container using a new ServeMux and default router (CurlyRouter) -func NewContainer() *Container { - return &Container{ - webServices: []*WebService{}, - ServeMux: http.NewServeMux(), - isRegisteredOnRoot: false, - containerFilters: []FilterFunction{}, - doNotRecover: true, - recoverHandleFunc: logStackOnRecover, - serviceErrorHandleFunc: writeServiceError, - router: CurlyRouter{}, - contentEncodingEnabled: false} -} - -// RecoverHandleFunction declares functions that can be used to handle a panic situation. -// The first argument is what recover() returns. The second must be used to communicate an error response. -type RecoverHandleFunction func(interface{}, http.ResponseWriter) - -// RecoverHandler changes the default function (logStackOnRecover) to be called -// when a panic is detected. DoNotRecover must be have its default value (=false). -func (c *Container) RecoverHandler(handler RecoverHandleFunction) { - c.recoverHandleFunc = handler -} - -// ServiceErrorHandleFunction declares functions that can be used to handle a service error situation. -// The first argument is the service error, the second is the request that resulted in the error and -// the third must be used to communicate an error response. -type ServiceErrorHandleFunction func(ServiceError, *Request, *Response) - -// ServiceErrorHandler changes the default function (writeServiceError) to be called -// when a ServiceError is detected. -func (c *Container) ServiceErrorHandler(handler ServiceErrorHandleFunction) { - c.serviceErrorHandleFunc = handler -} - -// DoNotRecover controls whether panics will be caught to return HTTP 500. -// If set to true, Route functions are responsible for handling any error situation. -// Default value is true. -func (c *Container) DoNotRecover(doNot bool) { - c.doNotRecover = doNot -} - -// Router changes the default Router (currently CurlyRouter) -func (c *Container) Router(aRouter RouteSelector) { - c.router = aRouter -} - -// EnableContentEncoding (default=false) allows for GZIP or DEFLATE encoding of responses. -func (c *Container) EnableContentEncoding(enabled bool) { - c.contentEncodingEnabled = enabled -} - -// Add a WebService to the Container. It will detect duplicate root paths and exit in that case. -func (c *Container) Add(service *WebService) *Container { - c.webServicesLock.Lock() - defer c.webServicesLock.Unlock() - - // if rootPath was not set then lazy initialize it - if len(service.rootPath) == 0 { - service.Path("/") - } - - // cannot have duplicate root paths - for _, each := range c.webServices { - if each.RootPath() == service.RootPath() { - log.Printf("[restful] WebService with duplicate root path detected:['%v']", each) - os.Exit(1) - } - } - - // If not registered on root then add specific mapping - if !c.isRegisteredOnRoot { - c.isRegisteredOnRoot = c.addHandler(service, c.ServeMux) - } - c.webServices = append(c.webServices, service) - return c -} - -// addHandler may set a new HandleFunc for the serveMux -// this function must run inside the critical region protected by the webServicesLock. -// returns true if the function was registered on root ("/") -func (c *Container) addHandler(service *WebService, serveMux *http.ServeMux) bool { - pattern := fixedPrefixPath(service.RootPath()) - // check if root path registration is needed - if "/" == pattern || "" == pattern { - serveMux.HandleFunc("/", c.dispatch) - return true - } - // detect if registration already exists - alreadyMapped := false - for _, each := range c.webServices { - if each.RootPath() == service.RootPath() { - alreadyMapped = true - break - } - } - if !alreadyMapped { - serveMux.HandleFunc(pattern, c.dispatch) - if !strings.HasSuffix(pattern, "/") { - serveMux.HandleFunc(pattern+"/", c.dispatch) - } - } - return false -} - -func (c *Container) Remove(ws *WebService) error { - if c.ServeMux == http.DefaultServeMux { - errMsg := fmt.Sprintf("[restful] cannot remove a WebService from a Container using the DefaultServeMux: ['%v']", ws) - log.Print(errMsg) - return errors.New(errMsg) - } - c.webServicesLock.Lock() - defer c.webServicesLock.Unlock() - // build a new ServeMux and re-register all WebServices - newServeMux := http.NewServeMux() - newServices := []*WebService{} - newIsRegisteredOnRoot := false - for _, each := range c.webServices { - if each.rootPath != ws.rootPath { - // If not registered on root then add specific mapping - if !newIsRegisteredOnRoot { - newIsRegisteredOnRoot = c.addHandler(each, newServeMux) - } - newServices = append(newServices, each) - } - } - c.webServices, c.ServeMux, c.isRegisteredOnRoot = newServices, newServeMux, newIsRegisteredOnRoot - return nil -} - -// logStackOnRecover is the default RecoverHandleFunction and is called -// when DoNotRecover is false and the recoverHandleFunc is not set for the container. -// Default implementation logs the stacktrace and writes the stacktrace on the response. -// This may be a security issue as it exposes sourcecode information. -func logStackOnRecover(panicReason interface{}, httpWriter http.ResponseWriter) { - var buffer bytes.Buffer - buffer.WriteString(fmt.Sprintf("[restful] recover from panic situation: - %v\r\n", panicReason)) - for i := 2; ; i += 1 { - _, file, line, ok := runtime.Caller(i) - if !ok { - break - } - buffer.WriteString(fmt.Sprintf(" %s:%d\r\n", file, line)) - } - log.Print(buffer.String()) - httpWriter.WriteHeader(http.StatusInternalServerError) - httpWriter.Write(buffer.Bytes()) -} - -// writeServiceError is the default ServiceErrorHandleFunction and is called -// when a ServiceError is returned during route selection. Default implementation -// calls resp.WriteErrorString(err.Code, err.Message) -func writeServiceError(err ServiceError, req *Request, resp *Response) { - resp.WriteErrorString(err.Code, err.Message) -} - -// Dispatch the incoming Http Request to a matching WebService. -func (c *Container) Dispatch(httpWriter http.ResponseWriter, httpRequest *http.Request) { - if httpWriter == nil { - panic("httpWriter cannot be nil") - } - if httpRequest == nil { - panic("httpRequest cannot be nil") - } - c.dispatch(httpWriter, httpRequest) -} - -// Dispatch the incoming Http Request to a matching WebService. -func (c *Container) dispatch(httpWriter http.ResponseWriter, httpRequest *http.Request) { - writer := httpWriter - - // CompressingResponseWriter should be closed after all operations are done - defer func() { - if compressWriter, ok := writer.(*CompressingResponseWriter); ok { - compressWriter.Close() - } - }() - - // Instal panic recovery unless told otherwise - if !c.doNotRecover { // catch all for 500 response - defer func() { - if r := recover(); r != nil { - c.recoverHandleFunc(r, writer) - return - } - }() - } - - // Detect if compression is needed - // assume without compression, test for override - if c.contentEncodingEnabled { - doCompress, encoding := wantsCompressedResponse(httpRequest) - if doCompress { - var err error - writer, err = NewCompressingResponseWriter(httpWriter, encoding) - if err != nil { - log.Print("[restful] unable to install compressor: ", err) - httpWriter.WriteHeader(http.StatusInternalServerError) - return - } - } - } - // Find best match Route ; err is non nil if no match was found - var webService *WebService - var route *Route - var err error - func() { - c.webServicesLock.RLock() - defer c.webServicesLock.RUnlock() - webService, route, err = c.router.SelectRoute( - c.webServices, - httpRequest) - }() - if err != nil { - // a non-200 response has already been written - // run container filters anyway ; they should not touch the response... - chain := FilterChain{Filters: c.containerFilters, Target: func(req *Request, resp *Response) { - switch err.(type) { - case ServiceError: - ser := err.(ServiceError) - c.serviceErrorHandleFunc(ser, req, resp) - } - // TODO - }} - chain.ProcessFilter(NewRequest(httpRequest), NewResponse(writer)) - return - } - wrappedRequest, wrappedResponse := route.wrapRequestResponse(writer, httpRequest) - // pass through filters (if any) - if len(c.containerFilters)+len(webService.filters)+len(route.Filters) > 0 { - // compose filter chain - allFilters := []FilterFunction{} - allFilters = append(allFilters, c.containerFilters...) - allFilters = append(allFilters, webService.filters...) - allFilters = append(allFilters, route.Filters...) - chain := FilterChain{Filters: allFilters, Target: func(req *Request, resp *Response) { - // handle request by route after passing all filters - route.Function(wrappedRequest, wrappedResponse) - }} - chain.ProcessFilter(wrappedRequest, wrappedResponse) - } else { - // no filters, handle request by route - route.Function(wrappedRequest, wrappedResponse) - } -} - -// fixedPrefixPath returns the fixed part of the partspec ; it may include template vars {} -func fixedPrefixPath(pathspec string) string { - varBegin := strings.Index(pathspec, "{") - if -1 == varBegin { - return pathspec - } - return pathspec[:varBegin] -} - -// ServeHTTP implements net/http.Handler therefore a Container can be a Handler in a http.Server -func (c *Container) ServeHTTP(httpwriter http.ResponseWriter, httpRequest *http.Request) { - c.ServeMux.ServeHTTP(httpwriter, httpRequest) -} - -// Handle registers the handler for the given pattern. If a handler already exists for pattern, Handle panics. -func (c *Container) Handle(pattern string, handler http.Handler) { - c.ServeMux.Handle(pattern, handler) -} - -// HandleWithFilter registers the handler for the given pattern. -// Container's filter chain is applied for handler. -// If a handler already exists for pattern, HandleWithFilter panics. -func (c *Container) HandleWithFilter(pattern string, handler http.Handler) { - f := func(httpResponse http.ResponseWriter, httpRequest *http.Request) { - if len(c.containerFilters) == 0 { - handler.ServeHTTP(httpResponse, httpRequest) - return - } - - chain := FilterChain{Filters: c.containerFilters, Target: func(req *Request, resp *Response) { - handler.ServeHTTP(httpResponse, httpRequest) - }} - chain.ProcessFilter(NewRequest(httpRequest), NewResponse(httpResponse)) - } - - c.Handle(pattern, http.HandlerFunc(f)) -} - -// Filter appends a container FilterFunction. These are called before dispatching -// a http.Request to a WebService from the container -func (c *Container) Filter(filter FilterFunction) { - c.containerFilters = append(c.containerFilters, filter) -} - -// RegisteredWebServices returns the collections of added WebServices -func (c *Container) RegisteredWebServices() []*WebService { - c.webServicesLock.RLock() - defer c.webServicesLock.RUnlock() - result := make([]*WebService, len(c.webServices)) - for ix := range c.webServices { - result[ix] = c.webServices[ix] - } - return result -} - -// computeAllowedMethods returns a list of HTTP methods that are valid for a Request -func (c *Container) computeAllowedMethods(req *Request) []string { - // Go through all RegisteredWebServices() and all its Routes to collect the options - methods := []string{} - requestPath := req.Request.URL.Path - for _, ws := range c.RegisteredWebServices() { - matches := ws.pathExpr.Matcher.FindStringSubmatch(requestPath) - if matches != nil { - finalMatch := matches[len(matches)-1] - for _, rt := range ws.Routes() { - matches := rt.pathExpr.Matcher.FindStringSubmatch(finalMatch) - if matches != nil { - lastMatch := matches[len(matches)-1] - if lastMatch == "" || lastMatch == "/" { // do not include if value is neither empty nor ‘/’. - methods = append(methods, rt.Method) - } - } - } - } - } - // methods = append(methods, "OPTIONS") not sure about this - return methods -} - -// newBasicRequestResponse creates a pair of Request,Response from its http versions. -// It is basic because no parameter or (produces) content-type information is given. -func newBasicRequestResponse(httpWriter http.ResponseWriter, httpRequest *http.Request) (*Request, *Response) { - resp := NewResponse(httpWriter) - resp.requestAccept = httpRequest.Header.Get(HEADER_Accept) - return NewRequest(httpRequest), resp -} diff --git a/vendor/github.com/emicklei/go-restful/container_test.go b/vendor/github.com/emicklei/go-restful/container_test.go deleted file mode 100644 index 491c793ab3..0000000000 --- a/vendor/github.com/emicklei/go-restful/container_test.go +++ /dev/null @@ -1,83 +0,0 @@ -package restful - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -// go test -v -test.run TestContainer_computeAllowedMethods ...restful -func TestContainer_computeAllowedMethods(t *testing.T) { - wc := NewContainer() - ws1 := new(WebService).Path("/users") - ws1.Route(ws1.GET("{i}").To(dummy)) - ws1.Route(ws1.POST("{i}").To(dummy)) - wc.Add(ws1) - httpRequest, _ := http.NewRequest("GET", "http://api.his.com/users/1", nil) - rreq := Request{Request: httpRequest} - m := wc.computeAllowedMethods(&rreq) - if len(m) != 2 { - t.Errorf("got %d expected 2 methods, %v", len(m), m) - } -} - -func TestContainer_HandleWithFilter(t *testing.T) { - prefilterCalled := false - postfilterCalled := false - httpHandlerCalled := false - - wc := NewContainer() - wc.Filter(func(request *Request, response *Response, chain *FilterChain) { - prefilterCalled = true - chain.ProcessFilter(request, response) - }) - wc.HandleWithFilter("/", http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - httpHandlerCalled = true - w.Write([]byte("ok")) - })) - wc.Filter(func(request *Request, response *Response, chain *FilterChain) { - postfilterCalled = true - chain.ProcessFilter(request, response) - }) - - recorder := httptest.NewRecorder() - request, _ := http.NewRequest("GET", "/", nil) - wc.ServeHTTP(recorder, request) - if recorder.Code != http.StatusOK { - t.Errorf("unexpected code %d", recorder.Code) - } - if recorder.Body.String() != "ok" { - t.Errorf("unexpected body %s", recorder.Body.String()) - } - if !prefilterCalled { - t.Errorf("filter added before calling HandleWithFilter wasn't called") - } - if !postfilterCalled { - t.Errorf("filter added after calling HandleWithFilter wasn't called") - } - if !httpHandlerCalled { - t.Errorf("handler added by calling HandleWithFilter wasn't called") - } -} - -func TestContainerAddAndRemove(t *testing.T) { - ws1 := new(WebService).Path("/") - ws2 := new(WebService).Path("/users") - wc := NewContainer() - wc.Add(ws1) - wc.Add(ws2) - wc.Remove(ws2) - if len(wc.webServices) != 1 { - t.Errorf("expected one webservices") - } - if !wc.isRegisteredOnRoot { - t.Errorf("expected on root registered") - } - wc.Remove(ws1) - if len(wc.webServices) > 0 { - t.Errorf("expected zero webservices") - } - if wc.isRegisteredOnRoot { - t.Errorf("expected not on root registered") - } -} diff --git a/vendor/github.com/emicklei/go-restful/cors_filter.go b/vendor/github.com/emicklei/go-restful/cors_filter.go deleted file mode 100644 index 1efeef072d..0000000000 --- a/vendor/github.com/emicklei/go-restful/cors_filter.go +++ /dev/null @@ -1,202 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "regexp" - "strconv" - "strings" -) - -// CrossOriginResourceSharing is used to create a Container Filter that implements CORS. -// Cross-origin resource sharing (CORS) is a mechanism that allows JavaScript on a web page -// to make XMLHttpRequests to another domain, not the domain the JavaScript originated from. -// -// http://en.wikipedia.org/wiki/Cross-origin_resource_sharing -// http://enable-cors.org/server.html -// http://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request -type CrossOriginResourceSharing struct { - ExposeHeaders []string // list of Header names - AllowedHeaders []string // list of Header names - AllowedDomains []string // list of allowed values for Http Origin. An allowed value can be a regular expression to support subdomain matching. If empty all are allowed. - AllowedMethods []string - MaxAge int // number of seconds before requiring new Options request - CookiesAllowed bool - Container *Container - - allowedOriginPatterns []*regexp.Regexp // internal field for origin regexp check. -} - -// Filter is a filter function that implements the CORS flow as documented on http://enable-cors.org/server.html -// and http://www.html5rocks.com/static/images/cors_server_flowchart.png -func (c CrossOriginResourceSharing) Filter(req *Request, resp *Response, chain *FilterChain) { - origin := req.Request.Header.Get(HEADER_Origin) - if len(origin) == 0 { - if trace { - traceLogger.Print("no Http header Origin set") - } - chain.ProcessFilter(req, resp) - return - } - if !c.isOriginAllowed(origin) { // check whether this origin is allowed - if trace { - traceLogger.Printf("HTTP Origin:%s is not part of %v, neither matches any part of %v", origin, c.AllowedDomains, c.allowedOriginPatterns) - } - chain.ProcessFilter(req, resp) - return - } - if req.Request.Method != "OPTIONS" { - c.doActualRequest(req, resp) - chain.ProcessFilter(req, resp) - return - } - if acrm := req.Request.Header.Get(HEADER_AccessControlRequestMethod); acrm != "" { - c.doPreflightRequest(req, resp) - } else { - c.doActualRequest(req, resp) - chain.ProcessFilter(req, resp) - return - } -} - -func (c CrossOriginResourceSharing) doActualRequest(req *Request, resp *Response) { - c.setOptionsHeaders(req, resp) - // continue processing the response -} - -func (c *CrossOriginResourceSharing) doPreflightRequest(req *Request, resp *Response) { - if len(c.AllowedMethods) == 0 { - if c.Container == nil { - c.AllowedMethods = DefaultContainer.computeAllowedMethods(req) - } else { - c.AllowedMethods = c.Container.computeAllowedMethods(req) - } - } - - acrm := req.Request.Header.Get(HEADER_AccessControlRequestMethod) - if !c.isValidAccessControlRequestMethod(acrm, c.AllowedMethods) { - if trace { - traceLogger.Printf("Http header %s:%s is not in %v", - HEADER_AccessControlRequestMethod, - acrm, - c.AllowedMethods) - } - return - } - acrhs := req.Request.Header.Get(HEADER_AccessControlRequestHeaders) - if len(acrhs) > 0 { - for _, each := range strings.Split(acrhs, ",") { - if !c.isValidAccessControlRequestHeader(strings.Trim(each, " ")) { - if trace { - traceLogger.Printf("Http header %s:%s is not in %v", - HEADER_AccessControlRequestHeaders, - acrhs, - c.AllowedHeaders) - } - return - } - } - } - resp.AddHeader(HEADER_AccessControlAllowMethods, strings.Join(c.AllowedMethods, ",")) - resp.AddHeader(HEADER_AccessControlAllowHeaders, acrhs) - c.setOptionsHeaders(req, resp) - - // return http 200 response, no body -} - -func (c CrossOriginResourceSharing) setOptionsHeaders(req *Request, resp *Response) { - c.checkAndSetExposeHeaders(resp) - c.setAllowOriginHeader(req, resp) - c.checkAndSetAllowCredentials(resp) - if c.MaxAge > 0 { - resp.AddHeader(HEADER_AccessControlMaxAge, strconv.Itoa(c.MaxAge)) - } -} - -func (c CrossOriginResourceSharing) isOriginAllowed(origin string) bool { - if len(origin) == 0 { - return false - } - if len(c.AllowedDomains) == 0 { - return true - } - - allowed := false - for _, domain := range c.AllowedDomains { - if domain == origin { - allowed = true - break - } - } - - if !allowed { - if len(c.allowedOriginPatterns) == 0 { - // compile allowed domains to allowed origin patterns - allowedOriginRegexps, err := compileRegexps(c.AllowedDomains) - if err != nil { - return false - } - c.allowedOriginPatterns = allowedOriginRegexps - } - - for _, pattern := range c.allowedOriginPatterns { - if allowed = pattern.MatchString(origin); allowed { - break - } - } - } - - return allowed -} - -func (c CrossOriginResourceSharing) setAllowOriginHeader(req *Request, resp *Response) { - origin := req.Request.Header.Get(HEADER_Origin) - if c.isOriginAllowed(origin) { - resp.AddHeader(HEADER_AccessControlAllowOrigin, origin) - } -} - -func (c CrossOriginResourceSharing) checkAndSetExposeHeaders(resp *Response) { - if len(c.ExposeHeaders) > 0 { - resp.AddHeader(HEADER_AccessControlExposeHeaders, strings.Join(c.ExposeHeaders, ",")) - } -} - -func (c CrossOriginResourceSharing) checkAndSetAllowCredentials(resp *Response) { - if c.CookiesAllowed { - resp.AddHeader(HEADER_AccessControlAllowCredentials, "true") - } -} - -func (c CrossOriginResourceSharing) isValidAccessControlRequestMethod(method string, allowedMethods []string) bool { - for _, each := range allowedMethods { - if each == method { - return true - } - } - return false -} - -func (c CrossOriginResourceSharing) isValidAccessControlRequestHeader(header string) bool { - for _, each := range c.AllowedHeaders { - if strings.ToLower(each) == strings.ToLower(header) { - return true - } - } - return false -} - -// Take a list of strings and compile them into a list of regular expressions. -func compileRegexps(regexpStrings []string) ([]*regexp.Regexp, error) { - regexps := []*regexp.Regexp{} - for _, regexpStr := range regexpStrings { - r, err := regexp.Compile(regexpStr) - if err != nil { - return regexps, err - } - regexps = append(regexps, r) - } - return regexps, nil -} diff --git a/vendor/github.com/emicklei/go-restful/cors_filter_test.go b/vendor/github.com/emicklei/go-restful/cors_filter_test.go deleted file mode 100644 index 09c5d3300e..0000000000 --- a/vendor/github.com/emicklei/go-restful/cors_filter_test.go +++ /dev/null @@ -1,129 +0,0 @@ -package restful - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -// go test -v -test.run TestCORSFilter_Preflight ...restful -// http://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request -func TestCORSFilter_Preflight(t *testing.T) { - tearDown() - ws := new(WebService) - ws.Route(ws.PUT("/cors").To(dummy)) - Add(ws) - - cors := CrossOriginResourceSharing{ - ExposeHeaders: []string{"X-Custom-Header"}, - AllowedHeaders: []string{"X-Custom-Header", "X-Additional-Header"}, - CookiesAllowed: true, - Container: DefaultContainer} - Filter(cors.Filter) - - // Preflight - httpRequest, _ := http.NewRequest("OPTIONS", "http://api.alice.com/cors", nil) - httpRequest.Method = "OPTIONS" - httpRequest.Header.Set(HEADER_Origin, "http://api.bob.com") - httpRequest.Header.Set(HEADER_AccessControlRequestMethod, "PUT") - httpRequest.Header.Set(HEADER_AccessControlRequestHeaders, "X-Custom-Header, X-Additional-Header") - - httpWriter := httptest.NewRecorder() - DefaultContainer.Dispatch(httpWriter, httpRequest) - - actual := httpWriter.Header().Get(HEADER_AccessControlAllowOrigin) - if "http://api.bob.com" != actual { - t.Fatal("expected: http://api.bob.com but got:" + actual) - } - actual = httpWriter.Header().Get(HEADER_AccessControlAllowMethods) - if "PUT" != actual { - t.Fatal("expected: PUT but got:" + actual) - } - actual = httpWriter.Header().Get(HEADER_AccessControlAllowHeaders) - if "X-Custom-Header, X-Additional-Header" != actual { - t.Fatal("expected: X-Custom-Header, X-Additional-Header but got:" + actual) - } - - if !cors.isOriginAllowed("somewhere") { - t.Fatal("origin expected to be allowed") - } - cors.AllowedDomains = []string{"overthere.com"} - if cors.isOriginAllowed("somewhere") { - t.Fatal("origin [somewhere] expected NOT to be allowed") - } - if !cors.isOriginAllowed("overthere.com") { - t.Fatal("origin [overthere] expected to be allowed") - } - -} - -// go test -v -test.run TestCORSFilter_Actual ...restful -// http://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request -func TestCORSFilter_Actual(t *testing.T) { - tearDown() - ws := new(WebService) - ws.Route(ws.PUT("/cors").To(dummy)) - Add(ws) - - cors := CrossOriginResourceSharing{ - ExposeHeaders: []string{"X-Custom-Header"}, - AllowedHeaders: []string{"X-Custom-Header", "X-Additional-Header"}, - CookiesAllowed: true, - Container: DefaultContainer} - Filter(cors.Filter) - - // Actual - httpRequest, _ := http.NewRequest("PUT", "http://api.alice.com/cors", nil) - httpRequest.Header.Set(HEADER_Origin, "http://api.bob.com") - httpRequest.Header.Set("X-Custom-Header", "value") - - httpWriter := httptest.NewRecorder() - DefaultContainer.Dispatch(httpWriter, httpRequest) - actual := httpWriter.Header().Get(HEADER_AccessControlAllowOrigin) - if "http://api.bob.com" != actual { - t.Fatal("expected: http://api.bob.com but got:" + actual) - } - if httpWriter.Body.String() != "dummy" { - t.Fatal("expected: dummy but got:" + httpWriter.Body.String()) - } -} - -var allowedDomainInput = []struct { - domains []string - origin string - allowed bool -}{ - {[]string{}, "http://anything.com", true}, - {[]string{"example.com"}, "example.com", true}, - {[]string{"example.com"}, "not-allowed", false}, - {[]string{"not-matching.com", "example.com"}, "example.com", true}, - {[]string{".*"}, "example.com", true}, -} - -// go test -v -test.run TestCORSFilter_AllowedDomains ...restful -func TestCORSFilter_AllowedDomains(t *testing.T) { - for _, each := range allowedDomainInput { - tearDown() - ws := new(WebService) - ws.Route(ws.PUT("/cors").To(dummy)) - Add(ws) - - cors := CrossOriginResourceSharing{ - AllowedDomains: each.domains, - CookiesAllowed: true, - Container: DefaultContainer} - Filter(cors.Filter) - - httpRequest, _ := http.NewRequest("PUT", "http://api.his.com/cors", nil) - httpRequest.Header.Set(HEADER_Origin, each.origin) - httpWriter := httptest.NewRecorder() - DefaultContainer.Dispatch(httpWriter, httpRequest) - actual := httpWriter.Header().Get(HEADER_AccessControlAllowOrigin) - if actual != each.origin && each.allowed { - t.Fatal("expected to be accepted") - } - if actual == each.origin && !each.allowed { - t.Fatal("did not expect to be accepted") - } - } -} diff --git a/vendor/github.com/emicklei/go-restful/coverage.sh b/vendor/github.com/emicklei/go-restful/coverage.sh deleted file mode 100644 index e27dbf1a91..0000000000 --- a/vendor/github.com/emicklei/go-restful/coverage.sh +++ /dev/null @@ -1,2 +0,0 @@ -go test -coverprofile=coverage.out -go tool cover -html=coverage.out \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/curly.go b/vendor/github.com/emicklei/go-restful/curly.go deleted file mode 100644 index 79f1f5aa20..0000000000 --- a/vendor/github.com/emicklei/go-restful/curly.go +++ /dev/null @@ -1,164 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "net/http" - "regexp" - "sort" - "strings" -) - -// CurlyRouter expects Routes with paths that contain zero or more parameters in curly brackets. -type CurlyRouter struct{} - -// SelectRoute is part of the Router interface and returns the best match -// for the WebService and its Route for the given Request. -func (c CurlyRouter) SelectRoute( - webServices []*WebService, - httpRequest *http.Request) (selectedService *WebService, selected *Route, err error) { - - requestTokens := tokenizePath(httpRequest.URL.Path) - - detectedService := c.detectWebService(requestTokens, webServices) - if detectedService == nil { - if trace { - traceLogger.Printf("no WebService was found to match URL path:%s\n", httpRequest.URL.Path) - } - return nil, nil, NewError(http.StatusNotFound, "404: Page Not Found") - } - candidateRoutes := c.selectRoutes(detectedService, requestTokens) - if len(candidateRoutes) == 0 { - if trace { - traceLogger.Printf("no Route in WebService with path %s was found to match URL path:%s\n", detectedService.rootPath, httpRequest.URL.Path) - } - return detectedService, nil, NewError(http.StatusNotFound, "404: Page Not Found") - } - selectedRoute, err := c.detectRoute(candidateRoutes, httpRequest) - if selectedRoute == nil { - return detectedService, nil, err - } - return detectedService, selectedRoute, nil -} - -// selectRoutes return a collection of Route from a WebService that matches the path tokens from the request. -func (c CurlyRouter) selectRoutes(ws *WebService, requestTokens []string) sortableCurlyRoutes { - candidates := sortableCurlyRoutes{} - for _, each := range ws.routes { - matches, paramCount, staticCount := c.matchesRouteByPathTokens(each.pathParts, requestTokens) - if matches { - candidates.add(curlyRoute{each, paramCount, staticCount}) // TODO make sure Routes() return pointers? - } - } - sort.Sort(sort.Reverse(candidates)) - return candidates -} - -// matchesRouteByPathTokens computes whether it matches, howmany parameters do match and what the number of static path elements are. -func (c CurlyRouter) matchesRouteByPathTokens(routeTokens, requestTokens []string) (matches bool, paramCount int, staticCount int) { - if len(routeTokens) < len(requestTokens) { - // proceed in matching only if last routeToken is wildcard - count := len(routeTokens) - if count == 0 || !strings.HasSuffix(routeTokens[count-1], "*}") { - return false, 0, 0 - } - // proceed - } - for i, routeToken := range routeTokens { - if i == len(requestTokens) { - // reached end of request path - return false, 0, 0 - } - requestToken := requestTokens[i] - if strings.HasPrefix(routeToken, "{") { - paramCount++ - if colon := strings.Index(routeToken, ":"); colon != -1 { - // match by regex - matchesToken, matchesRemainder := c.regularMatchesPathToken(routeToken, colon, requestToken) - if !matchesToken { - return false, 0, 0 - } - if matchesRemainder { - break - } - } - } else { // no { prefix - if requestToken != routeToken { - return false, 0, 0 - } - staticCount++ - } - } - return true, paramCount, staticCount -} - -// regularMatchesPathToken tests whether the regular expression part of routeToken matches the requestToken or all remaining tokens -// format routeToken is {someVar:someExpression}, e.g. {zipcode:[\d][\d][\d][\d][A-Z][A-Z]} -func (c CurlyRouter) regularMatchesPathToken(routeToken string, colon int, requestToken string) (matchesToken bool, matchesRemainder bool) { - regPart := routeToken[colon+1 : len(routeToken)-1] - if regPart == "*" { - if trace { - traceLogger.Printf("wildcard parameter detected in route token %s that matches %s\n", routeToken, requestToken) - } - return true, true - } - matched, err := regexp.MatchString(regPart, requestToken) - return (matched && err == nil), false -} - -var jsr311Router = RouterJSR311{} - -// detectRoute selectes from a list of Route the first match by inspecting both the Accept and Content-Type -// headers of the Request. See also RouterJSR311 in jsr311.go -func (c CurlyRouter) detectRoute(candidateRoutes sortableCurlyRoutes, httpRequest *http.Request) (*Route, error) { - // tracing is done inside detectRoute - return jsr311Router.detectRoute(candidateRoutes.routes(), httpRequest) -} - -// detectWebService returns the best matching webService given the list of path tokens. -// see also computeWebserviceScore -func (c CurlyRouter) detectWebService(requestTokens []string, webServices []*WebService) *WebService { - var best *WebService - score := -1 - for _, each := range webServices { - matches, eachScore := c.computeWebserviceScore(requestTokens, each.pathExpr.tokens) - if matches && (eachScore > score) { - best = each - score = eachScore - } - } - return best -} - -// computeWebserviceScore returns whether tokens match and -// the weighted score of the longest matching consecutive tokens from the beginning. -func (c CurlyRouter) computeWebserviceScore(requestTokens []string, tokens []string) (bool, int) { - if len(tokens) > len(requestTokens) { - return false, 0 - } - score := 0 - for i := 0; i < len(tokens); i++ { - each := requestTokens[i] - other := tokens[i] - if len(each) == 0 && len(other) == 0 { - score++ - continue - } - if len(other) > 0 && strings.HasPrefix(other, "{") { - // no empty match - if len(each) == 0 { - return false, score - } - score += 1 - } else { - // not a parameter - if each != other { - return false, score - } - score += (len(tokens) - i) * 10 //fuzzy - } - } - return true, score -} diff --git a/vendor/github.com/emicklei/go-restful/curly_route.go b/vendor/github.com/emicklei/go-restful/curly_route.go deleted file mode 100644 index 296f94650e..0000000000 --- a/vendor/github.com/emicklei/go-restful/curly_route.go +++ /dev/null @@ -1,52 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -// curlyRoute exits for sorting Routes by the CurlyRouter based on number of parameters and number of static path elements. -type curlyRoute struct { - route Route - paramCount int - staticCount int -} - -type sortableCurlyRoutes []curlyRoute - -func (s *sortableCurlyRoutes) add(route curlyRoute) { - *s = append(*s, route) -} - -func (s sortableCurlyRoutes) routes() (routes []Route) { - for _, each := range s { - routes = append(routes, each.route) // TODO change return type - } - return routes -} - -func (s sortableCurlyRoutes) Len() int { - return len(s) -} -func (s sortableCurlyRoutes) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} -func (s sortableCurlyRoutes) Less(i, j int) bool { - ci := s[i] - cj := s[j] - - // primary key - if ci.staticCount < cj.staticCount { - return true - } - if ci.staticCount > cj.staticCount { - return false - } - // secundary key - if ci.paramCount < cj.paramCount { - return true - } - if ci.paramCount > cj.paramCount { - return false - } - return ci.route.Path < cj.route.Path -} diff --git a/vendor/github.com/emicklei/go-restful/curly_test.go b/vendor/github.com/emicklei/go-restful/curly_test.go deleted file mode 100644 index bec017ca76..0000000000 --- a/vendor/github.com/emicklei/go-restful/curly_test.go +++ /dev/null @@ -1,231 +0,0 @@ -package restful - -import ( - "io" - "net/http" - "testing" -) - -var requestPaths = []struct { - // url with path (1) is handled by service with root (2) and remainder has value final (3) - path, root string -}{ - {"/", "/"}, - {"/p", "/p"}, - {"/p/x", "/p/{q}"}, - {"/q/x", "/q"}, - {"/p/x/", "/p/{q}"}, - {"/p/x/y", "/p/{q}"}, - {"/q/x/y", "/q"}, - {"/z/q", "/{p}/q"}, - {"/a/b/c/q", "/"}, -} - -// go test -v -test.run TestCurlyDetectWebService ...restful -func TestCurlyDetectWebService(t *testing.T) { - ws1 := new(WebService).Path("/") - ws2 := new(WebService).Path("/p") - ws3 := new(WebService).Path("/q") - ws4 := new(WebService).Path("/p/q") - ws5 := new(WebService).Path("/p/{q}") - ws7 := new(WebService).Path("/{p}/q") - var wss = []*WebService{ws1, ws2, ws3, ws4, ws5, ws7} - - for _, each := range wss { - t.Logf("path=%s,toks=%v\n", each.pathExpr.Source, each.pathExpr.tokens) - } - - router := CurlyRouter{} - - ok := true - for i, fixture := range requestPaths { - requestTokens := tokenizePath(fixture.path) - who := router.detectWebService(requestTokens, wss) - if who != nil && who.RootPath() != fixture.root { - t.Logf("[line:%v] Unexpected dispatcher, expected:%v, actual:%v", i, fixture.root, who.RootPath()) - ok = false - } - } - if !ok { - t.Fail() - } -} - -var serviceDetects = []struct { - path string - found bool - root string -}{ - {"/a/b", true, "/{p}/{q}/{r}"}, - {"/p/q", true, "/p/q"}, - {"/q/p", true, "/q"}, - {"/", true, "/"}, - {"/p/q/r", true, "/p/q"}, -} - -// go test -v -test.run Test_detectWebService ...restful -func Test_detectWebService(t *testing.T) { - router := CurlyRouter{} - ws1 := new(WebService).Path("/") - ws2 := new(WebService).Path("/p") - ws3 := new(WebService).Path("/q") - ws4 := new(WebService).Path("/p/q") - ws5 := new(WebService).Path("/p/{q}") - ws6 := new(WebService).Path("/p/{q}/") - ws7 := new(WebService).Path("/{p}/q") - ws8 := new(WebService).Path("/{p}/{q}/{r}") - var wss = []*WebService{ws8, ws7, ws6, ws5, ws4, ws3, ws2, ws1} - for _, fix := range serviceDetects { - requestPath := fix.path - requestTokens := tokenizePath(requestPath) - for _, ws := range wss { - serviceTokens := ws.pathExpr.tokens - matches, score := router.computeWebserviceScore(requestTokens, serviceTokens) - t.Logf("req=%s,toks:%v,ws=%s,toks:%v,score=%d,matches=%v", requestPath, requestTokens, ws.RootPath(), serviceTokens, score, matches) - } - best := router.detectWebService(requestTokens, wss) - if best != nil { - if fix.found { - t.Logf("best=%s", best.RootPath()) - } else { - t.Fatalf("should have found:%s", fix.root) - } - } - } -} - -var routeMatchers = []struct { - route string - path string - matches bool - paramCount int - staticCount int -}{ - // route, request-path - {"/a", "/a", true, 0, 1}, - {"/a", "/b", false, 0, 0}, - {"/a", "/b", false, 0, 0}, - {"/a/{b}/c/", "/a/2/c", true, 1, 2}, - {"/{a}/{b}/{c}/", "/a/b", false, 0, 0}, - {"/{x:*}", "/", false, 0, 0}, - {"/{x:*}", "/a", true, 1, 0}, - {"/{x:*}", "/a/b", true, 1, 0}, - {"/a/{x:*}", "/a/b", true, 1, 1}, - {"/a/{x:[A-Z][A-Z]}", "/a/ZX", true, 1, 1}, - {"/basepath/{resource:*}", "/basepath/some/other/location/test.xml", true, 1, 1}, -} - -// clear && go test -v -test.run Test_matchesRouteByPathTokens ...restful -func Test_matchesRouteByPathTokens(t *testing.T) { - router := CurlyRouter{} - for i, each := range routeMatchers { - routeToks := tokenizePath(each.route) - reqToks := tokenizePath(each.path) - matches, pCount, sCount := router.matchesRouteByPathTokens(routeToks, reqToks) - if matches != each.matches { - t.Fatalf("[%d] unexpected matches outcome route:%s, path:%s, matches:%v", i, each.route, each.path, matches) - } - if pCount != each.paramCount { - t.Fatalf("[%d] unexpected paramCount got:%d want:%d ", i, pCount, each.paramCount) - } - if sCount != each.staticCount { - t.Fatalf("[%d] unexpected staticCount got:%d want:%d ", i, sCount, each.staticCount) - } - } -} - -// clear && go test -v -test.run TestExtractParameters_Wildcard1 ...restful -func TestExtractParameters_Wildcard1(t *testing.T) { - params := doExtractParams("/fixed/{var:*}", 2, "/fixed/remainder", t) - if params["var"] != "remainder" { - t.Errorf("parameter mismatch var: %s", params["var"]) - } -} - -// clear && go test -v -test.run TestExtractParameters_Wildcard2 ...restful -func TestExtractParameters_Wildcard2(t *testing.T) { - params := doExtractParams("/fixed/{var:*}", 2, "/fixed/remain/der", t) - if params["var"] != "remain/der" { - t.Errorf("parameter mismatch var: %s", params["var"]) - } -} - -// clear && go test -v -test.run TestExtractParameters_Wildcard3 ...restful -func TestExtractParameters_Wildcard3(t *testing.T) { - params := doExtractParams("/static/{var:*}", 2, "/static/test/sub/hi.html", t) - if params["var"] != "test/sub/hi.html" { - t.Errorf("parameter mismatch var: %s", params["var"]) - } -} - -// clear && go test -v -test.run TestCurly_ISSUE_34 ...restful -func TestCurly_ISSUE_34(t *testing.T) { - ws1 := new(WebService).Path("/") - ws1.Route(ws1.GET("/{type}/{id}").To(curlyDummy)) - ws1.Route(ws1.GET("/network/{id}").To(curlyDummy)) - croutes := CurlyRouter{}.selectRoutes(ws1, tokenizePath("/network/12")) - if len(croutes) != 2 { - t.Fatal("expected 2 routes") - } - if got, want := croutes[0].route.Path, "/network/{id}"; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -// clear && go test -v -test.run TestCurly_ISSUE_34_2 ...restful -func TestCurly_ISSUE_34_2(t *testing.T) { - ws1 := new(WebService) - ws1.Route(ws1.GET("/network/{id}").To(curlyDummy)) - ws1.Route(ws1.GET("/{type}/{id}").To(curlyDummy)) - croutes := CurlyRouter{}.selectRoutes(ws1, tokenizePath("/network/12")) - if len(croutes) != 2 { - t.Fatal("expected 2 routes") - } - if got, want := croutes[0].route.Path, "/network/{id}"; got != want { - t.Errorf("got %v want %v", got, want) - } -} - -// clear && go test -v -test.run TestCurly_JsonHtml ...restful -func TestCurly_JsonHtml(t *testing.T) { - ws1 := new(WebService) - ws1.Path("/") - ws1.Route(ws1.GET("/some.html").To(curlyDummy).Consumes("*/*").Produces("text/html")) - req, _ := http.NewRequest("GET", "/some.html", nil) - req.Header.Set("Accept", "application/json") - _, route, err := CurlyRouter{}.SelectRoute([]*WebService{ws1}, req) - if err == nil { - t.Error("error expected") - } - if route != nil { - t.Error("no route expected") - } -} - -// go test -v -test.run TestCurly_ISSUE_137 ...restful -func TestCurly_ISSUE_137(t *testing.T) { - ws1 := new(WebService) - ws1.Route(ws1.GET("/hello").To(curlyDummy)) - ws1.Path("/") - req, _ := http.NewRequest("GET", "/", nil) - _, route, _ := CurlyRouter{}.SelectRoute([]*WebService{ws1}, req) - t.Log(route) - if route != nil { - t.Error("no route expected") - } -} - -// go test -v -test.run TestCurly_ISSUE_137_2 ...restful -func TestCurly_ISSUE_137_2(t *testing.T) { - ws1 := new(WebService) - ws1.Route(ws1.GET("/hello").To(curlyDummy)) - ws1.Path("/") - req, _ := http.NewRequest("GET", "/hello/bob", nil) - _, route, _ := CurlyRouter{}.SelectRoute([]*WebService{ws1}, req) - t.Log(route) - if route != nil { - t.Errorf("no route expected, got %v", route) - } -} - -func curlyDummy(req *Request, resp *Response) { io.WriteString(resp.ResponseWriter, "curlyDummy") } diff --git a/vendor/github.com/emicklei/go-restful/doc.go b/vendor/github.com/emicklei/go-restful/doc.go deleted file mode 100644 index f7c16b01fe..0000000000 --- a/vendor/github.com/emicklei/go-restful/doc.go +++ /dev/null @@ -1,185 +0,0 @@ -/* -Package restful , a lean package for creating REST-style WebServices without magic. - -WebServices and Routes - -A WebService has a collection of Route objects that dispatch incoming Http Requests to a function calls. -Typically, a WebService has a root path (e.g. /users) and defines common MIME types for its routes. -WebServices must be added to a container (see below) in order to handler Http requests from a server. - -A Route is defined by a HTTP method, an URL path and (optionally) the MIME types it consumes (Content-Type) and produces (Accept). -This package has the logic to find the best matching Route and if found, call its Function. - - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes(restful.MIME_JSON, restful.MIME_XML). - Produces(restful.MIME_JSON, restful.MIME_XML) - - ws.Route(ws.GET("/{user-id}").To(u.findUser)) // u is a UserResource - - ... - - // GET http://localhost:8080/users/1 - func (u UserResource) findUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - ... - } - -The (*Request, *Response) arguments provide functions for reading information from the request and writing information back to the response. - -See the example https://github.com/emicklei/go-restful/blob/master/examples/restful-user-resource.go with a full implementation. - -Regular expression matching Routes - -A Route parameter can be specified using the format "uri/{var[:regexp]}" or the special version "uri/{var:*}" for matching the tail of the path. -For example, /persons/{name:[A-Z][A-Z]} can be used to restrict values for the parameter "name" to only contain capital alphabetic characters. -Regular expressions must use the standard Go syntax as described in the regexp package. (https://code.google.com/p/re2/wiki/Syntax) -This feature requires the use of a CurlyRouter. - -Containers - -A Container holds a collection of WebServices, Filters and a http.ServeMux for multiplexing http requests. -Using the statements "restful.Add(...) and restful.Filter(...)" will register WebServices and Filters to the Default Container. -The Default container of go-restful uses the http.DefaultServeMux. -You can create your own Container and create a new http.Server for that particular container. - - container := restful.NewContainer() - server := &http.Server{Addr: ":8081", Handler: container} - -Filters - -A filter dynamically intercepts requests and responses to transform or use the information contained in the requests or responses. -You can use filters to perform generic logging, measurement, authentication, redirect, set response headers etc. -In the restful package there are three hooks into the request,response flow where filters can be added. -Each filter must define a FilterFunction: - - func (req *restful.Request, resp *restful.Response, chain *restful.FilterChain) - -Use the following statement to pass the request,response pair to the next filter or RouteFunction - - chain.ProcessFilter(req, resp) - -Container Filters - -These are processed before any registered WebService. - - // install a (global) filter for the default container (processed before any webservice) - restful.Filter(globalLogging) - -WebService Filters - -These are processed before any Route of a WebService. - - // install a webservice filter (processed before any route) - ws.Filter(webserviceLogging).Filter(measureTime) - - -Route Filters - -These are processed before calling the function associated with the Route. - - // install 2 chained route filters (processed before calling findUser) - ws.Route(ws.GET("/{user-id}").Filter(routeLogging).Filter(NewCountFilter().routeCounter).To(findUser)) - -See the example https://github.com/emicklei/go-restful/blob/master/examples/restful-filters.go with full implementations. - -Response Encoding - -Two encodings are supported: gzip and deflate. To enable this for all responses: - - restful.DefaultContainer.EnableContentEncoding(true) - -If a Http request includes the Accept-Encoding header then the response content will be compressed using the specified encoding. -Alternatively, you can create a Filter that performs the encoding and install it per WebService or Route. - -See the example https://github.com/emicklei/go-restful/blob/master/examples/restful-encoding-filter.go - -OPTIONS support - -By installing a pre-defined container filter, your Webservice(s) can respond to the OPTIONS Http request. - - Filter(OPTIONSFilter()) - -CORS - -By installing the filter of a CrossOriginResourceSharing (CORS), your WebService(s) can handle CORS requests. - - cors := CrossOriginResourceSharing{ExposeHeaders: []string{"X-My-Header"}, CookiesAllowed: false, Container: DefaultContainer} - Filter(cors.Filter) - -Error Handling - -Unexpected things happen. If a request cannot be processed because of a failure, your service needs to tell via the response what happened and why. -For this reason HTTP status codes exist and it is important to use the correct code in every exceptional situation. - - 400: Bad Request - -If path or query parameters are not valid (content or type) then use http.StatusBadRequest. - - 404: Not Found - -Despite a valid URI, the resource requested may not be available - - 500: Internal Server Error - -If the application logic could not process the request (or write the response) then use http.StatusInternalServerError. - - 405: Method Not Allowed - -The request has a valid URL but the method (GET,PUT,POST,...) is not allowed. - - 406: Not Acceptable - -The request does not have or has an unknown Accept Header set for this operation. - - 415: Unsupported Media Type - -The request does not have or has an unknown Content-Type Header set for this operation. - -ServiceError - -In addition to setting the correct (error) Http status code, you can choose to write a ServiceError message on the response. - -Performance options - -This package has several options that affect the performance of your service. It is important to understand them and how you can change it. - - restful.DefaultContainer.DoNotRecover(false) - -DoNotRecover controls whether panics will be caught to return HTTP 500. -If set to false, the container will recover from panics. -Default value is true - - restful.SetCompressorProvider(NewBoundedCachedCompressors(20, 20)) - -If content encoding is enabled then the default strategy for getting new gzip/zlib writers and readers is to use a sync.Pool. -Because writers are expensive structures, performance is even more improved when using a preloaded cache. You can also inject your own implementation. - -Trouble shooting - -This package has the means to produce detail logging of the complete Http request matching process and filter invocation. -Enabling this feature requires you to set an implementation of restful.StdLogger (e.g. log.Logger) instance such as: - - restful.TraceLogger(log.New(os.Stdout, "[restful] ", log.LstdFlags|log.Lshortfile)) - -Logging - -The restful.SetLogger() method allows you to override the logger used by the package. By default restful -uses the standard library `log` package and logs to stdout. Different logging packages are supported as -long as they conform to `StdLogger` interface defined in the `log` sub-package, writing an adapter for your -preferred package is simple. - -Resources - -[project]: https://github.com/emicklei/go-restful - -[examples]: https://github.com/emicklei/go-restful/blob/master/examples - -[design]: http://ernestmicklei.com/2012/11/11/go-restful-api-design/ - -[showcases]: https://github.com/emicklei/mora, https://github.com/emicklei/landskape - -(c) 2012-2015, http://ernestmicklei.com. MIT License -*/ -package restful diff --git a/vendor/github.com/emicklei/go-restful/doc_examples_test.go b/vendor/github.com/emicklei/go-restful/doc_examples_test.go deleted file mode 100644 index 0af636e553..0000000000 --- a/vendor/github.com/emicklei/go-restful/doc_examples_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package restful - -import "net/http" - -func ExampleOPTIONSFilter() { - // Install the OPTIONS filter on the default Container - Filter(OPTIONSFilter()) -} -func ExampleContainer_OPTIONSFilter() { - // Install the OPTIONS filter on a Container - myContainer := new(Container) - myContainer.Filter(myContainer.OPTIONSFilter) -} - -func ExampleContainer() { - // The Default container of go-restful uses the http.DefaultServeMux. - // You can create your own Container using restful.NewContainer() and create a new http.Server for that particular container - - ws := new(WebService) - wsContainer := NewContainer() - wsContainer.Add(ws) - server := &http.Server{Addr: ":8080", Handler: wsContainer} - server.ListenAndServe() -} - -func ExampleCrossOriginResourceSharing() { - // To install this filter on the Default Container use: - cors := CrossOriginResourceSharing{ExposeHeaders: []string{"X-My-Header"}, CookiesAllowed: false, Container: DefaultContainer} - Filter(cors.Filter) -} - -func ExampleServiceError() { - resp := new(Response) - resp.WriteEntity(NewError(http.StatusBadRequest, "Non-integer {id} path parameter")) -} - -func ExampleBoundedCachedCompressors() { - // Register a compressor provider (gzip/deflate read/write) that uses - // a bounded cache with a maximum of 20 writers and 20 readers. - SetCompressorProvider(NewBoundedCachedCompressors(20, 20)) -} diff --git a/vendor/github.com/emicklei/go-restful/entity_accessors.go b/vendor/github.com/emicklei/go-restful/entity_accessors.go deleted file mode 100644 index 6ecf6c7f89..0000000000 --- a/vendor/github.com/emicklei/go-restful/entity_accessors.go +++ /dev/null @@ -1,163 +0,0 @@ -package restful - -// Copyright 2015 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "encoding/json" - "encoding/xml" - "strings" - "sync" -) - -// EntityReaderWriter can read and write values using an encoding such as JSON,XML. -type EntityReaderWriter interface { - // Read a serialized version of the value from the request. - // The Request may have a decompressing reader. Depends on Content-Encoding. - Read(req *Request, v interface{}) error - - // Write a serialized version of the value on the response. - // The Response may have a compressing writer. Depends on Accept-Encoding. - // status should be a valid Http Status code - Write(resp *Response, status int, v interface{}) error -} - -// entityAccessRegistry is a singleton -var entityAccessRegistry = &entityReaderWriters{ - protection: new(sync.RWMutex), - accessors: map[string]EntityReaderWriter{}, -} - -// entityReaderWriters associates MIME to an EntityReaderWriter -type entityReaderWriters struct { - protection *sync.RWMutex - accessors map[string]EntityReaderWriter -} - -func init() { - RegisterEntityAccessor(MIME_JSON, NewEntityAccessorJSON(MIME_JSON)) - RegisterEntityAccessor(MIME_XML, NewEntityAccessorXML(MIME_XML)) -} - -// RegisterEntityAccessor add/overrides the ReaderWriter for encoding content with this MIME type. -func RegisterEntityAccessor(mime string, erw EntityReaderWriter) { - entityAccessRegistry.protection.Lock() - defer entityAccessRegistry.protection.Unlock() - entityAccessRegistry.accessors[mime] = erw -} - -// NewEntityAccessorJSON returns a new EntityReaderWriter for accessing JSON content. -// This package is already initialized with such an accessor using the MIME_JSON contentType. -func NewEntityAccessorJSON(contentType string) EntityReaderWriter { - return entityJSONAccess{ContentType: contentType} -} - -// NewEntityAccessorXML returns a new EntityReaderWriter for accessing XML content. -// This package is already initialized with such an accessor using the MIME_XML contentType. -func NewEntityAccessorXML(contentType string) EntityReaderWriter { - return entityXMLAccess{ContentType: contentType} -} - -// accessorAt returns the registered ReaderWriter for this MIME type. -func (r *entityReaderWriters) accessorAt(mime string) (EntityReaderWriter, bool) { - r.protection.RLock() - defer r.protection.RUnlock() - er, ok := r.accessors[mime] - if !ok { - // retry with reverse lookup - // more expensive but we are in an exceptional situation anyway - for k, v := range r.accessors { - if strings.Contains(mime, k) { - return v, true - } - } - } - return er, ok -} - -// entityXMLAccess is a EntityReaderWriter for XML encoding -type entityXMLAccess struct { - // This is used for setting the Content-Type header when writing - ContentType string -} - -// Read unmarshalls the value from XML -func (e entityXMLAccess) Read(req *Request, v interface{}) error { - return xml.NewDecoder(req.Request.Body).Decode(v) -} - -// Write marshalls the value to JSON and set the Content-Type Header. -func (e entityXMLAccess) Write(resp *Response, status int, v interface{}) error { - return writeXML(resp, status, e.ContentType, v) -} - -// writeXML marshalls the value to JSON and set the Content-Type Header. -func writeXML(resp *Response, status int, contentType string, v interface{}) error { - if v == nil { - resp.WriteHeader(status) - // do not write a nil representation - return nil - } - if resp.prettyPrint { - // pretty output must be created and written explicitly - output, err := xml.MarshalIndent(v, " ", " ") - if err != nil { - return err - } - resp.Header().Set(HEADER_ContentType, contentType) - resp.WriteHeader(status) - _, err = resp.Write([]byte(xml.Header)) - if err != nil { - return err - } - _, err = resp.Write(output) - return err - } - // not-so-pretty - resp.Header().Set(HEADER_ContentType, contentType) - resp.WriteHeader(status) - return xml.NewEncoder(resp).Encode(v) -} - -// entityJSONAccess is a EntityReaderWriter for JSON encoding -type entityJSONAccess struct { - // This is used for setting the Content-Type header when writing - ContentType string -} - -// Read unmarshalls the value from JSON -func (e entityJSONAccess) Read(req *Request, v interface{}) error { - decoder := json.NewDecoder(req.Request.Body) - decoder.UseNumber() - return decoder.Decode(v) -} - -// Write marshalls the value to JSON and set the Content-Type Header. -func (e entityJSONAccess) Write(resp *Response, status int, v interface{}) error { - return writeJSON(resp, status, e.ContentType, v) -} - -// write marshalls the value to JSON and set the Content-Type Header. -func writeJSON(resp *Response, status int, contentType string, v interface{}) error { - if v == nil { - resp.WriteHeader(status) - // do not write a nil representation - return nil - } - if resp.prettyPrint { - // pretty output must be created and written explicitly - output, err := json.MarshalIndent(v, " ", " ") - if err != nil { - return err - } - resp.Header().Set(HEADER_ContentType, contentType) - resp.WriteHeader(status) - _, err = resp.Write(output) - return err - } - // not-so-pretty - resp.Header().Set(HEADER_ContentType, contentType) - resp.WriteHeader(status) - return json.NewEncoder(resp).Encode(v) -} diff --git a/vendor/github.com/emicklei/go-restful/entity_accessors_test.go b/vendor/github.com/emicklei/go-restful/entity_accessors_test.go deleted file mode 100644 index d1c1e1585f..0000000000 --- a/vendor/github.com/emicklei/go-restful/entity_accessors_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package restful - -import ( - "bytes" - "fmt" - "io" - "net/http" - "net/http/httptest" - "reflect" - "testing" -) - -type keyvalue struct { - readCalled bool - writeCalled bool -} - -func (kv *keyvalue) Read(req *Request, v interface{}) error { - //t := reflect.TypeOf(v) - //rv := reflect.ValueOf(v) - kv.readCalled = true - return nil -} - -func (kv *keyvalue) Write(resp *Response, status int, v interface{}) error { - t := reflect.TypeOf(v) - rv := reflect.ValueOf(v) - for ix := 0; ix < t.NumField(); ix++ { - sf := t.Field(ix) - io.WriteString(resp, sf.Name) - io.WriteString(resp, "=") - io.WriteString(resp, fmt.Sprintf("%v\n", rv.Field(ix).Interface())) - } - kv.writeCalled = true - return nil -} - -// go test -v -test.run TestKeyValueEncoding ...restful -func TestKeyValueEncoding(t *testing.T) { - type Book struct { - Title string - Author string - PublishedYear int - } - kv := new(keyvalue) - RegisterEntityAccessor("application/kv", kv) - b := Book{"Singing for Dummies", "john doe", 2015} - - // Write - httpWriter := httptest.NewRecorder() - // Accept Produces - resp := Response{ResponseWriter: httpWriter, requestAccept: "application/kv,*/*;q=0.8", routeProduces: []string{"application/kv"}, prettyPrint: true} - resp.WriteEntity(b) - t.Log(string(httpWriter.Body.Bytes())) - if !kv.writeCalled { - t.Error("Write never called") - } - - // Read - bodyReader := bytes.NewReader(httpWriter.Body.Bytes()) - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/kv; charset=UTF-8") - request := NewRequest(httpRequest) - var bb Book - request.ReadEntity(&bb) - if !kv.readCalled { - t.Error("Read never called") - } -} diff --git a/vendor/github.com/emicklei/go-restful/examples/google_app_engine/app.yaml b/vendor/github.com/emicklei/go-restful/examples/google_app_engine/app.yaml deleted file mode 100644 index 362db6b078..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/google_app_engine/app.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# -# Include your application ID here -# -application: -version: 1 -runtime: go -api_version: go1 - -handlers: -# -# Regex for all swagger files to make as static content. -# You should create the folder static/swagger and copy -# swagger-ui into it. -# -- url: /apidocs/(.*?)/(.*\.(js|html|css)) - static_files: static/swagger/\1/\2 - upload: static/swagger/(.*?)/(.*\.(js|html|css)) - -- url: /.* - script: _go_app diff --git a/vendor/github.com/emicklei/go-restful/examples/google_app_engine/datastore/app.yaml b/vendor/github.com/emicklei/go-restful/examples/google_app_engine/datastore/app.yaml deleted file mode 100644 index 1ac9dca28f..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/google_app_engine/datastore/app.yaml +++ /dev/null @@ -1,18 +0,0 @@ -application: -version: 1 -runtime: go -api_version: go1 - -handlers: -# Regex for all swagger files to make as static content. -# You should create the folder static/swagger and copy -# swagger-ui into it. -# -- url: /apidocs/(.*?)/(.*\.(js|html|css)) - static_files: static/swagger/\1/\2 - upload: static/swagger/(.*?)/(.*\.(js|html|css)) - -# Catch all. -- url: /.* - script: _go_app - login: required diff --git a/vendor/github.com/emicklei/go-restful/examples/google_app_engine/datastore/main.go b/vendor/github.com/emicklei/go-restful/examples/google_app_engine/datastore/main.go deleted file mode 100644 index 33e5b2ea68..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/google_app_engine/datastore/main.go +++ /dev/null @@ -1,267 +0,0 @@ -package main - -import ( - "net/http" - "time" - - "github.com/emicklei/go-restful" - "github.com/emicklei/go-restful-swagger12" - "google.golang.org/appengine" - "google.golang.org/appengine/datastore" - "google.golang.org/appengine/user" -) - -// This example demonstrates a reasonably complete suite of RESTful operations backed -// by DataStore on Google App Engine. - -// Our simple example struct. -type Profile struct { - LastModified time.Time `json:"-" xml:"-"` - Email string `json:"-" xml:"-"` - FirstName string `json:"first_name" xml:"first-name"` - NickName string `json:"nick_name" xml:"nick-name"` - LastName string `json:"last_name" xml:"last-name"` -} - -type ProfileApi struct { - Path string -} - -func gaeUrl() string { - if appengine.IsDevAppServer() { - return "http://localhost:8080" - } else { - // Include your URL on App Engine here. - // I found no way to get AppID without appengine.Context and this always - // based on a http.Request. - return "http://federatedservices.appspot.com" - } -} - -func init() { - u := ProfileApi{Path: "/profiles"} - u.register() - - // Optionally, you can install the Swagger Service which provides a nice Web UI on your REST API - // You need to download the Swagger HTML5 assets and change the FilePath location in the config below. - // Open .appspot.com/apidocs and enter - // Place the Swagger UI files into a folder called static/swagger if you wish to use Swagger - // http://.appspot.com/apidocs.json in the api input field. - // For testing, you can use http://localhost:8080/apidocs.json - config := swagger.Config{ - // You control what services are visible - WebServices: restful.RegisteredWebServices(), - WebServicesUrl: gaeUrl(), - ApiPath: "/apidocs.json", - - // Optionally, specify where the UI is located - SwaggerPath: "/apidocs/", - - // GAE support static content which is configured in your app.yaml. - // This example expect the swagger-ui in static/swagger so you should place it there :) - SwaggerFilePath: "static/swagger"} - swagger.InstallSwaggerService(config) -} - -func (u ProfileApi) register() { - ws := new(restful.WebService) - - ws. - Path(u.Path). - // You can specify consumes and produces per route as well. - Consumes(restful.MIME_JSON, restful.MIME_XML). - Produces(restful.MIME_JSON, restful.MIME_XML) - - ws.Route(ws.POST("").To(u.insert). - // Swagger documentation. - Doc("insert a new profile"). - Param(ws.BodyParameter("Profile", "representation of a profile").DataType("main.Profile")). - Reads(Profile{})) - - ws.Route(ws.GET("/{profile-id}").To(u.read). - // Swagger documentation. - Doc("read a profile"). - Param(ws.PathParameter("profile-id", "identifier for a profile").DataType("string")). - Writes(Profile{})) - - ws.Route(ws.PUT("/{profile-id}").To(u.update). - // Swagger documentation. - Doc("update an existing profile"). - Param(ws.PathParameter("profile-id", "identifier for a profile").DataType("string")). - Param(ws.BodyParameter("Profile", "representation of a profile").DataType("main.Profile")). - Reads(Profile{})) - - ws.Route(ws.DELETE("/{profile-id}").To(u.remove). - // Swagger documentation. - Doc("remove a profile"). - Param(ws.PathParameter("profile-id", "identifier for a profile").DataType("string"))) - - restful.Add(ws) -} - -// POST http://localhost:8080/profiles -// {"first_name": "Ivan", "nick_name": "Socks", "last_name": "Hawkes"} -// -func (u *ProfileApi) insert(r *restful.Request, w *restful.Response) { - c := appengine.NewContext(r.Request) - - // Marshall the entity from the request into a struct. - p := new(Profile) - err := r.ReadEntity(&p) - if err != nil { - w.WriteError(http.StatusNotAcceptable, err) - return - } - - // Ensure we start with a sensible value for this field. - p.LastModified = time.Now() - - // The profile belongs to this user. - p.Email = user.Current(c).String() - - k, err := datastore.Put(c, datastore.NewIncompleteKey(c, "profiles", nil), p) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - // Let them know the location of the newly created resource. - // TODO: Use a safe Url path append function. - w.AddHeader("Location", u.Path+"/"+k.Encode()) - - // Return the resultant entity. - w.WriteHeader(http.StatusCreated) - w.WriteEntity(p) -} - -// GET http://localhost:8080/profiles/ahdkZXZ-ZmVkZXJhdGlvbi1zZXJ2aWNlc3IVCxIIcHJvZmlsZXMYgICAgICAgAoM -// -func (u ProfileApi) read(r *restful.Request, w *restful.Response) { - c := appengine.NewContext(r.Request) - - // Decode the request parameter to determine the key for the entity. - k, err := datastore.DecodeKey(r.PathParameter("profile-id")) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - // Retrieve the entity from the datastore. - p := Profile{} - if err := datastore.Get(c, k, &p); err != nil { - if err.Error() == "datastore: no such entity" { - http.Error(w, err.Error(), http.StatusNotFound) - } else { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - return - } - - // Check we own the profile before allowing them to view it. - // Optionally, return a 404 instead to help prevent guessing ids. - // TODO: Allow admins access. - if p.Email != user.Current(c).String() { - http.Error(w, "You do not have access to this resource", http.StatusForbidden) - return - } - - w.WriteEntity(p) -} - -// PUT http://localhost:8080/profiles/ahdkZXZ-ZmVkZXJhdGlvbi1zZXJ2aWNlc3IVCxIIcHJvZmlsZXMYgICAgICAgAoM -// {"first_name": "Ivan", "nick_name": "Socks", "last_name": "Hawkes"} -// -func (u *ProfileApi) update(r *restful.Request, w *restful.Response) { - c := appengine.NewContext(r.Request) - - // Decode the request parameter to determine the key for the entity. - k, err := datastore.DecodeKey(r.PathParameter("profile-id")) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - // Marshall the entity from the request into a struct. - p := new(Profile) - err = r.ReadEntity(&p) - if err != nil { - w.WriteError(http.StatusNotAcceptable, err) - return - } - - // Retrieve the old entity from the datastore. - old := Profile{} - if err := datastore.Get(c, k, &old); err != nil { - if err.Error() == "datastore: no such entity" { - http.Error(w, err.Error(), http.StatusNotFound) - } else { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - return - } - - // Check we own the profile before allowing them to update it. - // Optionally, return a 404 instead to help prevent guessing ids. - // TODO: Allow admins access. - if old.Email != user.Current(c).String() { - http.Error(w, "You do not have access to this resource", http.StatusForbidden) - return - } - - // Since the whole entity is re-written, we need to assign any invariant fields again - // e.g. the owner of the entity. - p.Email = user.Current(c).String() - - // Keep track of the last modification date. - p.LastModified = time.Now() - - // Attempt to overwrite the old entity. - _, err = datastore.Put(c, k, p) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - - // Let them know it succeeded. - w.WriteHeader(http.StatusNoContent) -} - -// DELETE http://localhost:8080/profiles/ahdkZXZ-ZmVkZXJhdGlvbi1zZXJ2aWNlc3IVCxIIcHJvZmlsZXMYgICAgICAgAoM -// -func (u *ProfileApi) remove(r *restful.Request, w *restful.Response) { - c := appengine.NewContext(r.Request) - - // Decode the request parameter to determine the key for the entity. - k, err := datastore.DecodeKey(r.PathParameter("profile-id")) - if err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - - // Retrieve the old entity from the datastore. - old := Profile{} - if err := datastore.Get(c, k, &old); err != nil { - if err.Error() == "datastore: no such entity" { - http.Error(w, err.Error(), http.StatusNotFound) - } else { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - return - } - - // Check we own the profile before allowing them to delete it. - // Optionally, return a 404 instead to help prevent guessing ids. - // TODO: Allow admins access. - if old.Email != user.Current(c).String() { - http.Error(w, "You do not have access to this resource", http.StatusForbidden) - return - } - - // Delete the entity. - if err := datastore.Delete(c, k); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } - - // Success notification. - w.WriteHeader(http.StatusNoContent) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/google_app_engine/restful-appstats-integration.go b/vendor/github.com/emicklei/go-restful/examples/google_app_engine/restful-appstats-integration.go deleted file mode 100644 index a871133b02..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/google_app_engine/restful-appstats-integration.go +++ /dev/null @@ -1,12 +0,0 @@ -package main - -import ( - "github.com/mjibson/appstats" -) - -func stats(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - c := appstats.NewContext(req.Request) - chain.ProcessFilter(req, resp) - c.Stats.Status = resp.StatusCode() - c.Save() -} diff --git a/vendor/github.com/emicklei/go-restful/examples/google_app_engine/restful-user-service.go b/vendor/github.com/emicklei/go-restful/examples/google_app_engine/restful-user-service.go deleted file mode 100644 index e1b462c3e9..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/google_app_engine/restful-user-service.go +++ /dev/null @@ -1,162 +0,0 @@ -package main - -import ( - "net/http" - - "github.com/emicklei/go-restful" - "github.com/emicklei/go-restful-swagger12" - "google.golang.org/appengine" - "google.golang.org/appengine/memcache" -) - -// This example is functionally the same as ../restful-user-service.go -// but it`s supposed to run on Goole App Engine (GAE) -// -// contributed by ivanhawkes - -type User struct { - Id, Name string -} - -type UserService struct { - // normally one would use DAO (data access object) - // but in this example we simple use memcache. -} - -func (u UserService) Register() { - ws := new(restful.WebService) - - ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) // you can specify this per route as well - - ws.Route(ws.GET("/{user-id}").To(u.findUser). - // docs - Doc("get a user"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")). - Writes(User{})) // on the response - - ws.Route(ws.PATCH("").To(u.updateUser). - // docs - Doc("update a user"). - Reads(User{})) // from the request - - ws.Route(ws.PUT("/{user-id}").To(u.createUser). - // docs - Doc("create a user"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")). - Reads(User{})) // from the request - - ws.Route(ws.DELETE("/{user-id}").To(u.removeUser). - // docs - Doc("delete a user"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string"))) - - restful.Add(ws) -} - -// GET http://localhost:8080/users/1 -// -func (u UserService) findUser(request *restful.Request, response *restful.Response) { - c := appengine.NewContext(request.Request) - id := request.PathParameter("user-id") - usr := new(User) - _, err := memcache.Gob.Get(c, id, &usr) - if err != nil || len(usr.Id) == 0 { - response.WriteErrorString(http.StatusNotFound, "User could not be found.") - } else { - response.WriteEntity(usr) - } -} - -// PATCH http://localhost:8080/users -// 1Melissa Raspberry -// -func (u *UserService) updateUser(request *restful.Request, response *restful.Response) { - c := appengine.NewContext(request.Request) - usr := new(User) - err := request.ReadEntity(&usr) - if err == nil { - item := &memcache.Item{ - Key: usr.Id, - Object: &usr, - } - err = memcache.Gob.Set(c, item) - if err != nil { - response.WriteError(http.StatusInternalServerError, err) - return - } - response.WriteEntity(usr) - } else { - response.WriteError(http.StatusInternalServerError, err) - } -} - -// PUT http://localhost:8080/users/1 -// 1Melissa -// -func (u *UserService) createUser(request *restful.Request, response *restful.Response) { - c := appengine.NewContext(request.Request) - usr := User{Id: request.PathParameter("user-id")} - err := request.ReadEntity(&usr) - if err == nil { - item := &memcache.Item{ - Key: usr.Id, - Object: &usr, - } - err = memcache.Gob.Add(c, item) - if err != nil { - response.WriteError(http.StatusInternalServerError, err) - return - } - response.WriteHeader(http.StatusCreated) - response.WriteEntity(usr) - } else { - response.WriteError(http.StatusInternalServerError, err) - } -} - -// DELETE http://localhost:8080/users/1 -// -func (u *UserService) removeUser(request *restful.Request, response *restful.Response) { - c := appengine.NewContext(request.Request) - id := request.PathParameter("user-id") - err := memcache.Delete(c, id) - if err != nil { - response.WriteError(http.StatusInternalServerError, err) - } -} - -func getGaeURL() string { - if appengine.IsDevAppServer() { - return "http://localhost:8080" - } else { - /** - * Include your URL on App Engine here. - * I found no way to get AppID without appengine.Context and this always - * based on a http.Request. - */ - return "http://.appspot.com" - } -} - -func init() { - u := UserService{} - u.Register() - - // Optionally, you can install the Swagger Service which provides a nice Web UI on your REST API - // You need to download the Swagger HTML5 assets and change the FilePath location in the config below. - // Open .appspot.com/apidocs and enter http://.appspot.com/apidocs.json in the api input field. - config := swagger.Config{ - WebServices: restful.RegisteredWebServices(), // you control what services are visible - WebServicesUrl: getGaeURL(), - ApiPath: "/apidocs.json", - - // Optionally, specify where the UI is located - SwaggerPath: "/apidocs/", - // GAE support static content which is configured in your app.yaml. - // This example expect the swagger-ui in static/swagger so you should place it there :) - SwaggerFilePath: "static/swagger"} - swagger.InstallSwaggerService(config) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/home.html b/vendor/github.com/emicklei/go-restful/examples/home.html deleted file mode 100644 index e5d49b42ca..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/home.html +++ /dev/null @@ -1,7 +0,0 @@ - - - - -

{{.Text}}

- - \ No newline at end of file diff --git a/vendor/github.com/emicklei/go-restful/examples/msgpack/msgpack_entity.go b/vendor/github.com/emicklei/go-restful/examples/msgpack/msgpack_entity.go deleted file mode 100644 index 330e45896e..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/msgpack/msgpack_entity.go +++ /dev/null @@ -1,34 +0,0 @@ -package restPack - -import ( - restful "github.com/emicklei/go-restful" - "gopkg.in/vmihailenco/msgpack.v2" -) - -const MIME_MSGPACK = "application/x-msgpack" // Accept or Content-Type used in Consumes() and/or Produces() - -// NewEntityAccessorMPack returns a new EntityReaderWriter for accessing MessagePack content. -// This package is not initialized with such an accessor using the MIME_MSGPACK contentType. -func NewEntityAccessorMsgPack() restful.EntityReaderWriter { - return entityMsgPackAccess{} -} - -// entityOctetAccess is a EntityReaderWriter for Octet encoding -type entityMsgPackAccess struct { -} - -// Read unmarshalls the value from byte slice and using msgpack to unmarshal -func (e entityMsgPackAccess) Read(req *restful.Request, v interface{}) error { - return msgpack.NewDecoder(req.Request.Body).Decode(v) -} - -// Write marshals the value to byte slice and set the Content-Type Header. -func (e entityMsgPackAccess) Write(resp *restful.Response, status int, v interface{}) error { - if v == nil { - resp.WriteHeader(status) - // do not write a nil representation - return nil - } - resp.WriteHeader(status) - return msgpack.NewEncoder(resp).Encode(v) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/msgpack/msgpack_entity_test.go b/vendor/github.com/emicklei/go-restful/examples/msgpack/msgpack_entity_test.go deleted file mode 100644 index 6eb4746575..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/msgpack/msgpack_entity_test.go +++ /dev/null @@ -1,160 +0,0 @@ -package restPack - -import ( - "bytes" - "errors" - "log" - "net/http" - "net/http/httptest" - "reflect" - "testing" - "time" - - "io/ioutil" - - restful "github.com/emicklei/go-restful" -) - -func TestMsgPack(t *testing.T) { - - // register msg pack entity - restful.RegisterEntityAccessor(MIME_MSGPACK, NewEntityAccessorMsgPack()) - type Tool struct { - Name string - Vendor string - } - - // Write - httpWriter := httptest.NewRecorder() - mpack := &Tool{Name: "json", Vendor: "apple"} - resp := restful.NewResponse(httpWriter) - resp.SetRequestAccepts("application/x-msgpack,*/*;q=0.8") - - err := resp.WriteEntity(mpack) - if err != nil { - t.Errorf("err %v", err) - } - - // Read - bodyReader := bytes.NewReader(httpWriter.Body.Bytes()) - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", MIME_MSGPACK) - request := restful.NewRequest(httpRequest) - readMsgPack := new(Tool) - err = request.ReadEntity(&readMsgPack) - if err != nil { - t.Errorf("err %v", err) - } - if equal := reflect.DeepEqual(mpack, readMsgPack); !equal { - t.Fatalf("should not be error") - } -} - -func TestWithWebService(t *testing.T) { - serverURL := "http://127.0.0.1:8090" - go func() { - runRestfulMsgPackRouterServer() - }() - if err := waitForServerUp(serverURL); err != nil { - t.Errorf("%v", err) - } - - // send a post request - userData := user{Id: "0001", Name: "Tony"} - msgPackData, err := msgpack.Marshal(userData) - req, err := http.NewRequest("POST", serverURL+"/test/msgpack", bytes.NewBuffer(msgPackData)) - req.Header.Set("Content-Type", MIME_MSGPACK) - - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - t.Errorf("unexpected error in sending req: %v", err) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("unexpected response: %v, expected: %v", resp.StatusCode, http.StatusOK) - } - - ur := &userResponse{} - expectMsgPackDocument(t, resp, ur) - if ur.Status != statusActive { - t.Fatalf("should not error") - } - log.Printf("user response:%v", ur) -} - -func expectMsgPackDocument(t *testing.T, r *http.Response, doc interface{}) { - data, err := ioutil.ReadAll(r.Body) - defer r.Body.Close() - if err != nil { - t.Errorf("ExpectMsgPackDocument: unable to read response body :%v", err) - return - } - // put the body back for re-reads - r.Body = ioutil.NopCloser(bytes.NewReader(data)) - - err = msgpack.Unmarshal(data, doc) - if err != nil { - t.Errorf("ExpectMsgPackDocument: unable to unmarshal MsgPack:%v", err) - } -} - -func runRestfulMsgPackRouterServer() { - - container := restful.NewContainer() - register(container) - - log.Print("start listening on localhost:8090") - server := &http.Server{Addr: ":8090", Handler: container} - log.Fatal(server.ListenAndServe()) -} - -func waitForServerUp(serverURL string) error { - for start := time.Now(); time.Since(start) < time.Minute; time.Sleep(5 * time.Second) { - _, err := http.Get(serverURL + "/") - if err == nil { - return nil - } - } - return errors.New("waiting for server timed out") -} - -var ( - statusActive = "active" -) - -type user struct { - Id, Name string -} - -type userResponse struct { - Status string -} - -func register(container *restful.Container) { - restful.RegisterEntityAccessor(MIME_MSGPACK, NewEntityAccessorMsgPack()) - ws := new(restful.WebService) - ws. - Path("/test"). - Consumes(restful.MIME_JSON, MIME_MSGPACK). - Produces(restful.MIME_JSON, MIME_MSGPACK) - // route user api - ws.Route(ws.POST("/msgpack"). - To(do). - Reads(user{}). - Writes(userResponse{})) - container.Add(ws) -} - -func do(request *restful.Request, response *restful.Response) { - u := &user{} - err := request.ReadEntity(u) - if err != nil { - log.Printf("should be no error, got:%v", err) - } - log.Printf("got:%v", u) - - ur := &userResponse{Status: statusActive} - - response.SetRequestAccepts(MIME_MSGPACK) - response.WriteEntity(ur) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-CORS-filter.go b/vendor/github.com/emicklei/go-restful/examples/restful-CORS-filter.go deleted file mode 100644 index d682d43e90..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-CORS-filter.go +++ /dev/null @@ -1,68 +0,0 @@ -package main - -import ( - "io" - "log" - "net/http" - - "github.com/emicklei/go-restful" -) - -// Cross-origin resource sharing (CORS) is a mechanism that allows JavaScript on a web page -// to make XMLHttpRequests to another domain, not the domain the JavaScript originated from. -// -// http://en.wikipedia.org/wiki/Cross-origin_resource_sharing -// http://enable-cors.org/server.html -// -// GET http://localhost:8080/users -// -// GET http://localhost:8080/users/1 -// -// PUT http://localhost:8080/users/1 -// -// DELETE http://localhost:8080/users/1 -// -// OPTIONS http://localhost:8080/users/1 with Header "Origin" set to some domain and - -type UserResource struct{} - -func (u UserResource) RegisterTo(container *restful.Container) { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes("*/*"). - Produces("*/*") - - ws.Route(ws.GET("/{user-id}").To(u.nop)) - ws.Route(ws.POST("").To(u.nop)) - ws.Route(ws.PUT("/{user-id}").To(u.nop)) - ws.Route(ws.DELETE("/{user-id}").To(u.nop)) - - container.Add(ws) -} - -func (u UserResource) nop(request *restful.Request, response *restful.Response) { - io.WriteString(response.ResponseWriter, "this would be a normal response") -} - -func main() { - wsContainer := restful.NewContainer() - u := UserResource{} - u.RegisterTo(wsContainer) - - // Add container filter to enable CORS - cors := restful.CrossOriginResourceSharing{ - ExposeHeaders: []string{"X-My-Header"}, - AllowedHeaders: []string{"Content-Type", "Accept"}, - AllowedMethods: []string{"GET", "POST"}, - CookiesAllowed: false, - Container: wsContainer} - wsContainer.Filter(cors.Filter) - - // Add container filter to respond to OPTIONS - wsContainer.Filter(wsContainer.OPTIONSFilter) - - log.Print("start listening on localhost:8080") - server := &http.Server{Addr: ":8080", Handler: wsContainer} - log.Fatal(server.ListenAndServe()) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-NCSA-logging.go b/vendor/github.com/emicklei/go-restful/examples/restful-NCSA-logging.go deleted file mode 100644 index 7066b96d63..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-NCSA-logging.go +++ /dev/null @@ -1,54 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "log" - "net/http" - "os" - "strings" - "time" -) - -// This example shows how to create a filter that produces log lines -// according to the Common Log Format, also known as the NCSA standard. -// -// kindly contributed by leehambley -// -// GET http://localhost:8080/ping - -var logger *log.Logger = log.New(os.Stdout, "", 0) - -func NCSACommonLogFormatLogger() restful.FilterFunction { - return func(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - var username = "-" - if req.Request.URL.User != nil { - if name := req.Request.URL.User.Username(); name != "" { - username = name - } - } - chain.ProcessFilter(req, resp) - logger.Printf("%s - %s [%s] \"%s %s %s\" %d %d", - strings.Split(req.Request.RemoteAddr, ":")[0], - username, - time.Now().Format("02/Jan/2006:15:04:05 -0700"), - req.Request.Method, - req.Request.URL.RequestURI(), - req.Request.Proto, - resp.StatusCode(), - resp.ContentLength(), - ) - } -} - -func main() { - ws := new(restful.WebService) - ws.Filter(NCSACommonLogFormatLogger()) - ws.Route(ws.GET("/ping").To(hello)) - restful.Add(ws) - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func hello(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "pong") -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-basic-authentication.go b/vendor/github.com/emicklei/go-restful/examples/restful-basic-authentication.go deleted file mode 100644 index f4fd5ce183..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-basic-authentication.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "log" - "net/http" -) - -// This example shows how to create a (Route) Filter that performs Basic Authentication on the Http request. -// -// GET http://localhost:8080/secret -// and use admin,admin for the credentials - -func main() { - ws := new(restful.WebService) - ws.Route(ws.GET("/secret").Filter(basicAuthenticate).To(secret)) - restful.Add(ws) - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func basicAuthenticate(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - // usr/pwd = admin/admin - u, p, ok := req.Request.BasicAuth() - if !ok || u != "admin" || p != "admin" { - resp.AddHeader("WWW-Authenticate", "Basic realm=Protected Area") - resp.WriteErrorString(401, "401: Not Authorized") - return - } - chain.ProcessFilter(req, resp) -} - -func secret(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "42") -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-cpuprofiler-service.go b/vendor/github.com/emicklei/go-restful/examples/restful-cpuprofiler-service.go deleted file mode 100644 index 9148213cf0..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-cpuprofiler-service.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "log" - "os" - "runtime/pprof" -) - -// ProfilingService is a WebService that can start/stop a CPU profile and write results to a file -// GET /{rootPath}/start will activate CPU profiling -// GET /{rootPath}/stop will stop profiling -// -// NewProfileService("/profiler", "ace.prof").AddWebServiceTo(restful.DefaultContainer) -// -type ProfilingService struct { - rootPath string // the base (root) of the service, e.g. /profiler - cpuprofile string // the output filename to write profile results, e.g. myservice.prof - cpufile *os.File // if not nil, then profiling is active -} - -func NewProfileService(rootPath string, outputFilename string) *ProfilingService { - ps := new(ProfilingService) - ps.rootPath = rootPath - ps.cpuprofile = outputFilename - return ps -} - -// Add this ProfileService to a restful Container -func (p ProfilingService) AddWebServiceTo(container *restful.Container) { - ws := new(restful.WebService) - ws.Path(p.rootPath).Consumes("*/*").Produces(restful.MIME_JSON) - ws.Route(ws.GET("/start").To(p.startProfiler)) - ws.Route(ws.GET("/stop").To(p.stopProfiler)) - container.Add(ws) -} - -func (p *ProfilingService) startProfiler(req *restful.Request, resp *restful.Response) { - if p.cpufile != nil { - io.WriteString(resp.ResponseWriter, "[restful] CPU profiling already running") - return // error? - } - cpufile, err := os.Create(p.cpuprofile) - if err != nil { - log.Fatal(err) - } - // remember for close - p.cpufile = cpufile - pprof.StartCPUProfile(cpufile) - io.WriteString(resp.ResponseWriter, "[restful] CPU profiling started, writing on:"+p.cpuprofile) -} - -func (p *ProfilingService) stopProfiler(req *restful.Request, resp *restful.Response) { - if p.cpufile == nil { - io.WriteString(resp.ResponseWriter, "[restful] CPU profiling not active") - return // error? - } - pprof.StopCPUProfile() - p.cpufile.Close() - p.cpufile = nil - io.WriteString(resp.ResponseWriter, "[restful] CPU profiling stopped, closing:"+p.cpuprofile) -} - -func main() {} // exists for example compilation only diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-curly-router.go b/vendor/github.com/emicklei/go-restful/examples/restful-curly-router.go deleted file mode 100644 index 1bddb34af1..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-curly-router.go +++ /dev/null @@ -1,107 +0,0 @@ -package main - -import ( - "log" - "net/http" - - "github.com/emicklei/go-restful" -) - -// This example has the same service definition as restful-user-resource -// but uses a different router (CurlyRouter) that does not use regular expressions -// -// POST http://localhost:8080/users -// 1Melissa Raspberry -// -// GET http://localhost:8080/users/1 -// -// PUT http://localhost:8080/users/1 -// 1Melissa -// -// DELETE http://localhost:8080/users/1 -// - -type User struct { - Id, Name string -} - -type UserResource struct { - // normally one would use DAO (data access object) - users map[string]User -} - -func (u UserResource) Register(container *restful.Container) { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) // you can specify this per route as well - - ws.Route(ws.GET("/{user-id}").To(u.findUser)) - ws.Route(ws.POST("").To(u.updateUser)) - ws.Route(ws.PUT("/{user-id}").To(u.createUser)) - ws.Route(ws.DELETE("/{user-id}").To(u.removeUser)) - - container.Add(ws) -} - -// GET http://localhost:8080/users/1 -// -func (u UserResource) findUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - usr := u.users[id] - if len(usr.Id) == 0 { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusNotFound, "User could not be found.") - } else { - response.WriteEntity(usr) - } -} - -// POST http://localhost:8080/users -// 1Melissa Raspberry -// -func (u *UserResource) updateUser(request *restful.Request, response *restful.Response) { - usr := new(User) - err := request.ReadEntity(&usr) - if err == nil { - u.users[usr.Id] = *usr - response.WriteEntity(usr) - } else { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusInternalServerError, err.Error()) - } -} - -// PUT http://localhost:8080/users/1 -// 1Melissa -// -func (u *UserResource) createUser(request *restful.Request, response *restful.Response) { - usr := User{Id: request.PathParameter("user-id")} - err := request.ReadEntity(&usr) - if err == nil { - u.users[usr.Id] = usr - response.WriteHeaderAndEntity(http.StatusCreated, usr) - } else { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusInternalServerError, err.Error()) - } -} - -// DELETE http://localhost:8080/users/1 -// -func (u *UserResource) removeUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - delete(u.users, id) -} - -func main() { - wsContainer := restful.NewContainer() - wsContainer.Router(restful.CurlyRouter{}) - u := UserResource{map[string]User{}} - u.Register(wsContainer) - - log.Print("start listening on localhost:8080") - server := &http.Server{Addr: ":8080", Handler: wsContainer} - log.Fatal(server.ListenAndServe()) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-curly-router_test.go b/vendor/github.com/emicklei/go-restful/examples/restful-curly-router_test.go deleted file mode 100644 index 87aed068a7..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-curly-router_test.go +++ /dev/null @@ -1,149 +0,0 @@ -package main - -import ( - "bytes" - "errors" - "log" - "net/http" - "testing" - "time" - - "github.com/emicklei/go-restful" -) - -type User struct { - Id, Name string -} - -type UserResource struct { - users map[string]User -} - -func (u UserResource) Register(container *restful.Container) { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) - - ws.Route(ws.GET("/{user-id}").To(u.findUser)) - ws.Route(ws.POST("").To(u.updateUser)) - ws.Route(ws.PUT("/{user-id}").To(u.createUser)) - ws.Route(ws.DELETE("/{user-id}").To(u.removeUser)) - - container.Add(ws) -} - -// GET http://localhost:8090/users/1 -// -func (u UserResource) findUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - usr := u.users[id] - if len(usr.Id) == 0 { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusNotFound, "User could not be found.") - } else { - response.WriteEntity(usr) - } -} - -// POST http://localhost:8090/users -// 1Melissa Raspberry -// -func (u *UserResource) updateUser(request *restful.Request, response *restful.Response) { - usr := new(User) - err := request.ReadEntity(&usr) - if err == nil { - u.users[usr.Id] = *usr - response.WriteEntity(usr) - } else { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusInternalServerError, err.Error()) - } -} - -// PUT http://localhost:8090/users/1 -// 1Melissa -// -func (u *UserResource) createUser(request *restful.Request, response *restful.Response) { - usr := User{Id: request.PathParameter("user-id")} - err := request.ReadEntity(&usr) - if err == nil { - u.users[usr.Id] = usr - response.WriteHeader(http.StatusCreated) - response.WriteEntity(usr) - } else { - response.AddHeader("Content-Type", "text/plain") - response.WriteErrorString(http.StatusInternalServerError, err.Error()) - } -} - -// DELETE http://localhost:8090/users/1 -// -func (u *UserResource) removeUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - delete(u.users, id) -} - -func RunRestfulCurlyRouterServer() { - wsContainer := restful.NewContainer() - wsContainer.Router(restful.CurlyRouter{}) - u := UserResource{map[string]User{}} - u.Register(wsContainer) - - log.Print("start listening on localhost:8090") - server := &http.Server{Addr: ":8090", Handler: wsContainer} - log.Fatal(server.ListenAndServe()) -} - -func waitForServerUp(serverURL string) error { - for start := time.Now(); time.Since(start) < time.Minute; time.Sleep(5 * time.Second) { - _, err := http.Get(serverURL + "/") - if err == nil { - return nil - } - } - return errors.New("waiting for server timed out") -} - -func TestServer(t *testing.T) { - serverURL := "http://localhost:8090" - go func() { - RunRestfulCurlyRouterServer() - }() - if err := waitForServerUp(serverURL); err != nil { - t.Errorf("%v", err) - } - - // GET should give a 405 - resp, err := http.Get(serverURL + "/users/") - if err != nil { - t.Errorf("unexpected error in GET /users/: %v", err) - } - if resp.StatusCode != http.StatusMethodNotAllowed { - t.Errorf("unexpected response: %v, expected: %v", resp.StatusCode, http.StatusOK) - } - - // Send a POST request. - var jsonStr = []byte(`{"id":"1","name":"user1"}`) - req, err := http.NewRequest("POST", serverURL+"/users/", bytes.NewBuffer(jsonStr)) - req.Header.Set("Content-Type", restful.MIME_JSON) - - client := &http.Client{} - resp, err = client.Do(req) - if err != nil { - t.Errorf("unexpected error in sending req: %v", err) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("unexpected response: %v, expected: %v", resp.StatusCode, http.StatusOK) - } - - // Test that GET works. - resp, err = http.Get(serverURL + "/users/1") - if err != nil { - t.Errorf("unexpected error in GET /users/1: %v", err) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("unexpected response: %v, expected: %v", resp.StatusCode, http.StatusOK) - } -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-encoding-filter.go b/vendor/github.com/emicklei/go-restful/examples/restful-encoding-filter.go deleted file mode 100644 index 177d5a9945..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-encoding-filter.go +++ /dev/null @@ -1,61 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "log" - "net/http" -) - -type User struct { - Id, Name string -} - -type UserList struct { - Users []User -} - -// -// This example shows how to use the CompressingResponseWriter by a Filter -// such that encoding can be enabled per WebService or per Route (instead of per container) -// Using restful.DefaultContainer.EnableContentEncoding(true) will encode all responses served by WebServices in the DefaultContainer. -// -// Set Accept-Encoding to gzip or deflate -// GET http://localhost:8080/users/42 -// and look at the response headers - -func main() { - restful.Add(NewUserService()) - log.Print("start listening on localhost:8080") - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func NewUserService() *restful.WebService { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) - - // install a response encoding filter - ws.Route(ws.GET("/{user-id}").Filter(encodingFilter).To(findUser)) - return ws -} - -// Route Filter (defines FilterFunction) -func encodingFilter(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - log.Printf("[encoding-filter] %s,%s\n", req.Request.Method, req.Request.URL) - // wrap responseWriter into a compressing one - compress, _ := restful.NewCompressingResponseWriter(resp.ResponseWriter, restful.ENCODING_GZIP) - resp.ResponseWriter = compress - defer func() { - compress.Close() - }() - chain.ProcessFilter(req, resp) -} - -// GET http://localhost:8080/users/42 -// -func findUser(request *restful.Request, response *restful.Response) { - log.Print("findUser") - response.WriteEntity(User{"42", "Gandalf"}) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-filters.go b/vendor/github.com/emicklei/go-restful/examples/restful-filters.go deleted file mode 100644 index aaadb9d23b..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-filters.go +++ /dev/null @@ -1,114 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "log" - "net/http" - "time" -) - -type User struct { - Id, Name string -} - -type UserList struct { - Users []User -} - -// This example show how to create and use the three different Filters (Container,WebService and Route) -// When applied to the restful.DefaultContainer, we refer to them as a global filter. -// -// GET http://localhost:8080/users/42 -// and see the logging per filter (try repeating this request) - -func main() { - // install a global (=DefaultContainer) filter (processed before any webservice in the DefaultContainer) - restful.Filter(globalLogging) - - restful.Add(NewUserService()) - log.Print("start listening on localhost:8080") - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func NewUserService() *restful.WebService { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) - - // install a webservice filter (processed before any route) - ws.Filter(webserviceLogging).Filter(measureTime) - - // install a counter filter - ws.Route(ws.GET("").Filter(NewCountFilter().routeCounter).To(getAllUsers)) - - // install 2 chained route filters (processed before calling findUser) - ws.Route(ws.GET("/{user-id}").Filter(routeLogging).Filter(NewCountFilter().routeCounter).To(findUser)) - return ws -} - -// Global Filter -func globalLogging(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - log.Printf("[global-filter (logger)] %s,%s\n", req.Request.Method, req.Request.URL) - chain.ProcessFilter(req, resp) -} - -// WebService Filter -func webserviceLogging(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - log.Printf("[webservice-filter (logger)] %s,%s\n", req.Request.Method, req.Request.URL) - chain.ProcessFilter(req, resp) -} - -// WebService (post-process) Filter (as a struct that defines a FilterFunction) -func measureTime(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - now := time.Now() - chain.ProcessFilter(req, resp) - log.Printf("[webservice-filter (timer)] %v\n", time.Now().Sub(now)) -} - -// Route Filter (defines FilterFunction) -func routeLogging(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - log.Printf("[route-filter (logger)] %s,%s\n", req.Request.Method, req.Request.URL) - chain.ProcessFilter(req, resp) -} - -// Route Filter (as a struct that defines a FilterFunction) -// CountFilter implements a FilterFunction for counting requests. -type CountFilter struct { - count int - counter chan int // for go-routine safe count increments -} - -// NewCountFilter creates and initializes a new CountFilter. -func NewCountFilter() *CountFilter { - c := new(CountFilter) - c.counter = make(chan int) - go func() { - for { - c.count += <-c.counter - } - }() - return c -} - -// routeCounter increments the count of the filter (through a channel) -func (c *CountFilter) routeCounter(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - c.counter <- 1 - log.Printf("[route-filter (counter)] count:%d", c.count) - chain.ProcessFilter(req, resp) -} - -// GET http://localhost:8080/users -// -func getAllUsers(request *restful.Request, response *restful.Response) { - log.Print("getAllUsers") - response.WriteEntity(UserList{[]User{{"42", "Gandalf"}, {"3.14", "Pi"}}}) -} - -// GET http://localhost:8080/users/42 -// -func findUser(request *restful.Request, response *restful.Response) { - log.Print("findUser") - response.WriteEntity(User{"42", "Gandalf"}) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-form-handling.go b/vendor/github.com/emicklei/go-restful/examples/restful-form-handling.go deleted file mode 100644 index e85608c9b0..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-form-handling.go +++ /dev/null @@ -1,63 +0,0 @@ -package main - -import ( - "fmt" - "github.com/emicklei/go-restful" - "github.com/gorilla/schema" - "io" - "log" - "net/http" -) - -// This example shows how to handle a POST of a HTML form that uses the standard x-www-form-urlencoded content-type. -// It uses the gorilla web tool kit schema package to decode the form data into a struct. -// -// GET http://localhost:8080/profiles -// - -type Profile struct { - Name string - Age int -} - -var decoder *schema.Decoder - -func main() { - decoder = schema.NewDecoder() - ws := new(restful.WebService) - ws.Route(ws.POST("/profiles").Consumes("application/x-www-form-urlencoded").To(postAdddress)) - ws.Route(ws.GET("/profiles").To(addresssForm)) - restful.Add(ws) - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func postAdddress(req *restful.Request, resp *restful.Response) { - err := req.Request.ParseForm() - if err != nil { - resp.WriteErrorString(http.StatusBadRequest, err.Error()) - return - } - p := new(Profile) - err = decoder.Decode(p, req.Request.PostForm) - if err != nil { - resp.WriteErrorString(http.StatusBadRequest, err.Error()) - return - } - io.WriteString(resp.ResponseWriter, fmt.Sprintf("Name=%s, Age=%d", p.Name, p.Age)) -} - -func addresssForm(req *restful.Request, resp *restful.Response) { - io.WriteString(resp.ResponseWriter, - ` - -

Enter Profile

-
- - - - - -
- - `) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-hello-world.go b/vendor/github.com/emicklei/go-restful/examples/restful-hello-world.go deleted file mode 100644 index bf987b8053..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-hello-world.go +++ /dev/null @@ -1,23 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "log" - "net/http" -) - -// This example shows the minimal code needed to get a restful.WebService working. -// -// GET http://localhost:8080/hello - -func main() { - ws := new(restful.WebService) - ws.Route(ws.GET("/hello").To(hello)) - restful.Add(ws) - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func hello(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "world") -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-html-template.go b/vendor/github.com/emicklei/go-restful/examples/restful-html-template.go deleted file mode 100644 index d76d9d1e47..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-html-template.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -import ( - "log" - "net/http" - "text/template" - - "github.com/emicklei/go-restful" -) - -// This example shows how to serve a HTML page using the standard Go template engine. -// -// GET http://localhost:8080/ - -func main() { - ws := new(restful.WebService) - ws.Route(ws.GET("/").To(home)) - restful.Add(ws) - print("open browser on http://localhost:8080/\n") - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -type Message struct { - Text string -} - -func home(req *restful.Request, resp *restful.Response) { - p := &Message{"restful-html-template demo"} - // you might want to cache compiled templates - t, err := template.ParseFiles("home.html") - if err != nil { - log.Fatalf("Template gave: %s", err) - } - t.Execute(resp.ResponseWriter, p) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-multi-containers.go b/vendor/github.com/emicklei/go-restful/examples/restful-multi-containers.go deleted file mode 100644 index 3056d3ea22..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-multi-containers.go +++ /dev/null @@ -1,43 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "log" - "net/http" -) - -// This example shows how to have a program with 2 WebServices containers -// each having a http server listening on its own port. -// -// The first "hello" is added to the restful.DefaultContainer (and uses DefaultServeMux) -// For the second "hello", a new container and ServeMux is created -// and requires a new http.Server with the container being the Handler. -// This first server is spawn in its own go-routine such that the program proceeds to create the second. -// -// GET http://localhost:8080/hello -// GET http://localhost:8081/hello - -func main() { - ws := new(restful.WebService) - ws.Route(ws.GET("/hello").To(hello)) - restful.Add(ws) - go func() { - log.Fatal(http.ListenAndServe(":8080", nil)) - }() - - container2 := restful.NewContainer() - ws2 := new(restful.WebService) - ws2.Route(ws2.GET("/hello").To(hello2)) - container2.Add(ws2) - server := &http.Server{Addr: ":8081", Handler: container2} - log.Fatal(server.ListenAndServe()) -} - -func hello(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "default world") -} - -func hello2(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "second world") -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-no-cache-filter.go b/vendor/github.com/emicklei/go-restful/examples/restful-no-cache-filter.go deleted file mode 100644 index 8e4540f46f..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-no-cache-filter.go +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "io" - "log" - "net/http" - - "github.com/emicklei/go-restful" -) - -// This example shows how to use a WebService filter that passed the Http headers to disable browser cacheing. -// -// GET http://localhost:8080/hello - -func main() { - ws := new(restful.WebService) - ws.Filter(restful.NoBrowserCacheFilter) - ws.Route(ws.GET("/hello").To(hello)) - restful.Add(ws) - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func hello(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "world") -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-options-filter.go b/vendor/github.com/emicklei/go-restful/examples/restful-options-filter.go deleted file mode 100644 index 79ccce5580..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-options-filter.go +++ /dev/null @@ -1,51 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "log" - "net/http" -) - -// This example shows how to use the OPTIONSFilter on a Container -// -// OPTIONS http://localhost:8080/users -// -// OPTIONS http://localhost:8080/users/1 - -type UserResource struct{} - -func (u UserResource) RegisterTo(container *restful.Container) { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes("*/*"). - Produces("*/*") - - ws.Route(ws.GET("/{user-id}").To(u.nop)) - ws.Route(ws.POST("").To(u.nop)) - ws.Route(ws.PUT("/{user-id}").To(u.nop)) - ws.Route(ws.DELETE("/{user-id}").To(u.nop)) - - container.Add(ws) -} - -func (u UserResource) nop(request *restful.Request, response *restful.Response) { - io.WriteString(response.ResponseWriter, "this would be a normal response") -} - -func main() { - wsContainer := restful.NewContainer() - u := UserResource{} - u.RegisterTo(wsContainer) - - // Add container filter to respond to OPTIONS - wsContainer.Filter(wsContainer.OPTIONSFilter) - - // For use on the default container, you can write - // restful.Filter(restful.OPTIONSFilter()) - - log.Print("start listening on localhost:8080") - server := &http.Server{Addr: ":8080", Handler: wsContainer} - log.Fatal(server.ListenAndServe()) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-path-tail.go b/vendor/github.com/emicklei/go-restful/examples/restful-path-tail.go deleted file mode 100644 index f30d6716ae..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-path-tail.go +++ /dev/null @@ -1,27 +0,0 @@ -package main - -import ( - . "github.com/emicklei/go-restful" - "io" - "log" - "net/http" -) - -// This example shows how to create a Route matching the "tail" of a path. -// Requires the use of a CurlyRouter and the star "*" path parameter pattern. -// -// GET http://localhost:8080/basepath/some/other/location/test.xml - -func main() { - DefaultContainer.Router(CurlyRouter{}) - ws := new(WebService) - ws.Route(ws.GET("/basepath/{resource:*}").To(staticFromPathParam)) - Add(ws) - - println("[go-restful] serve path tails from http://localhost:8080/basepath") - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func staticFromPathParam(req *Request, resp *Response) { - io.WriteString(resp, "Tail="+req.PathParameter("resource")) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-pre-post-filters.go b/vendor/github.com/emicklei/go-restful/examples/restful-pre-post-filters.go deleted file mode 100644 index 0b55f14930..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-pre-post-filters.go +++ /dev/null @@ -1,98 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "io" - "log" - "net/http" -) - -// This example shows how the different types of filters are called in the request-response flow. -// The call chain is logged on the console when sending an http request. -// -// GET http://localhost:8080/1 -// GET http://localhost:8080/2 - -var indentLevel int - -func container_filter_A(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - log.Printf("url path:%v\n", req.Request.URL) - trace("container_filter_A: before", 1) - chain.ProcessFilter(req, resp) - trace("container_filter_A: after", -1) -} - -func container_filter_B(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - trace("container_filter_B: before", 1) - chain.ProcessFilter(req, resp) - trace("container_filter_B: after", -1) -} - -func service_filter_A(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - trace("service_filter_A: before", 1) - chain.ProcessFilter(req, resp) - trace("service_filter_A: after", -1) -} - -func service_filter_B(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - trace("service_filter_B: before", 1) - chain.ProcessFilter(req, resp) - trace("service_filter_B: after", -1) -} - -func route_filter_A(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - trace("route_filter_A: before", 1) - chain.ProcessFilter(req, resp) - trace("route_filter_A: after", -1) -} - -func route_filter_B(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - trace("route_filter_B: before", 1) - chain.ProcessFilter(req, resp) - trace("route_filter_B: after", -1) -} - -func trace(what string, delta int) { - indented := what - if delta < 0 { - indentLevel += delta - } - for t := 0; t < indentLevel; t++ { - indented = "." + indented - } - log.Printf("%s", indented) - if delta > 0 { - indentLevel += delta - } -} - -func main() { - restful.Filter(container_filter_A) - restful.Filter(container_filter_B) - - ws1 := new(restful.WebService) - ws1.Path("/1") - ws1.Filter(service_filter_A) - ws1.Filter(service_filter_B) - ws1.Route(ws1.GET("").To(doit1).Filter(route_filter_A).Filter(route_filter_B)) - - ws2 := new(restful.WebService) - ws2.Path("/2") - ws2.Filter(service_filter_A) - ws2.Filter(service_filter_B) - ws2.Route(ws2.GET("").To(doit2).Filter(route_filter_A).Filter(route_filter_B)) - - restful.Add(ws1) - restful.Add(ws2) - - log.Print("go-restful example listing on http://localhost:8080/1 and http://localhost:8080/2") - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func doit1(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "nothing to see in 1") -} - -func doit2(req *restful.Request, resp *restful.Response) { - io.WriteString(resp, "nothing to see in 2") -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-resource-functions.go b/vendor/github.com/emicklei/go-restful/examples/restful-resource-functions.go deleted file mode 100644 index 09e6e56637..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-resource-functions.go +++ /dev/null @@ -1,63 +0,0 @@ -package main - -import ( - "github.com/emicklei/go-restful" - "log" - "net/http" -) - -// This example shows how to use methods as RouteFunctions for WebServices. -// The ProductResource has a Register() method that creates and initializes -// a WebService to expose its methods as REST operations. -// The WebService is added to the restful.DefaultContainer. -// A ProductResource is typically created using some data access object. -// -// GET http://localhost:8080/products/1 -// POST http://localhost:8080/products -// 1The First - -type Product struct { - Id, Title string -} - -type ProductResource struct { - // typically reference a DAO (data-access-object) -} - -func (p ProductResource) getOne(req *restful.Request, resp *restful.Response) { - id := req.PathParameter("id") - log.Println("getting product with id:" + id) - resp.WriteEntity(Product{Id: id, Title: "test"}) -} - -func (p ProductResource) postOne(req *restful.Request, resp *restful.Response) { - updatedProduct := new(Product) - err := req.ReadEntity(updatedProduct) - if err != nil { // bad request - resp.WriteErrorString(http.StatusBadRequest, err.Error()) - return - } - log.Println("updating product with id:" + updatedProduct.Id) -} - -func (p ProductResource) Register() { - ws := new(restful.WebService) - ws.Path("/products") - ws.Consumes(restful.MIME_XML) - ws.Produces(restful.MIME_XML) - - ws.Route(ws.GET("/{id}").To(p.getOne). - Doc("get the product by its id"). - Param(ws.PathParameter("id", "identifier of the product").DataType("string"))) - - ws.Route(ws.POST("").To(p.postOne). - Doc("update or create a product"). - Param(ws.BodyParameter("Product", "a Product (XML)").DataType("main.Product"))) - - restful.Add(ws) -} - -func main() { - ProductResource{}.Register() - log.Fatal(http.ListenAndServe(":8080", nil)) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-route_test.go b/vendor/github.com/emicklei/go-restful/examples/restful-route_test.go deleted file mode 100644 index 20c366bf91..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-route_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package main - -import ( - "net/http" - "net/http/httptest" - "strings" - "testing" - - "github.com/emicklei/go-restful" -) - -var ( - Result string -) - -func TestRouteExtractParameter(t *testing.T) { - // setup service - ws := new(restful.WebService) - ws.Consumes(restful.MIME_XML) - ws.Route(ws.GET("/test/{param}").To(DummyHandler)) - restful.Add(ws) - - // setup request + writer - bodyReader := strings.NewReader("42") - httpRequest, _ := http.NewRequest("GET", "/test/THIS", bodyReader) - httpRequest.Header.Set("Content-Type", restful.MIME_XML) - httpWriter := httptest.NewRecorder() - - // run - restful.DefaultContainer.ServeHTTP(httpWriter, httpRequest) - - if Result != "THIS" { - t.Fatalf("Result is actually: %s", Result) - } -} - -func DummyHandler(rq *restful.Request, rp *restful.Response) { - Result = rq.PathParameter("param") -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-routefunction_test.go b/vendor/github.com/emicklei/go-restful/examples/restful-routefunction_test.go deleted file mode 100644 index 957c055507..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-routefunction_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/emicklei/go-restful" -) - -// This example show how to test one particular RouteFunction (getIt) -// It uses the httptest.ResponseRecorder to capture output - -func getIt(req *restful.Request, resp *restful.Response) { - resp.WriteHeader(204) -} - -func TestCallFunction(t *testing.T) { - httpReq, _ := http.NewRequest("GET", "/", nil) - req := restful.NewRequest(httpReq) - - recorder := new(httptest.ResponseRecorder) - resp := restful.NewResponse(recorder) - - getIt(req, resp) - if recorder.Code != 204 { - t.Fatalf("Missing or wrong status code:%d", recorder.Code) - } -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-serve-static.go b/vendor/github.com/emicklei/go-restful/examples/restful-serve-static.go deleted file mode 100644 index 34faf60782..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-serve-static.go +++ /dev/null @@ -1,47 +0,0 @@ -package main - -import ( - "fmt" - "net/http" - "path" - - "github.com/emicklei/go-restful" -) - -// This example shows how to define methods that serve static files -// It uses the standard http.ServeFile method -// -// GET http://localhost:8080/static/test.xml -// GET http://localhost:8080/static/ -// -// GET http://localhost:8080/static?resource=subdir/test.xml - -var rootdir = "/tmp" - -func main() { - restful.DefaultContainer.Router(restful.CurlyRouter{}) - - ws := new(restful.WebService) - ws.Route(ws.GET("/static/{subpath:*}").To(staticFromPathParam)) - ws.Route(ws.GET("/static").To(staticFromQueryParam)) - restful.Add(ws) - - println("[go-restful] serving files on http://localhost:8080/static from local /tmp") - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func staticFromPathParam(req *restful.Request, resp *restful.Response) { - actual := path.Join(rootdir, req.PathParameter("subpath")) - fmt.Printf("serving %s ... (from %s)\n", actual, req.PathParameter("subpath")) - http.ServeFile( - resp.ResponseWriter, - req.Request, - actual) -} - -func staticFromQueryParam(req *restful.Request, resp *restful.Response) { - http.ServeFile( - resp.ResponseWriter, - req.Request, - path.Join(rootdir, req.QueryParameter("resource"))) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-swagger.go b/vendor/github.com/emicklei/go-restful/examples/restful-swagger.go deleted file mode 100644 index ecbd71b200..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-swagger.go +++ /dev/null @@ -1,61 +0,0 @@ -package main - -import ( - "log" - "net/http" - - "github.com/emicklei/go-restful" - "github.com/emicklei/go-restful-swagger12" -) - -type Book struct { - Title string - Author string -} - -func main() { - ws := new(restful.WebService) - ws.Path("/books") - ws.Consumes(restful.MIME_JSON, restful.MIME_XML) - ws.Produces(restful.MIME_JSON, restful.MIME_XML) - restful.Add(ws) - - ws.Route(ws.GET("/{medium}").To(noop). - Doc("Search all books"). - Param(ws.PathParameter("medium", "digital or paperback").DataType("string")). - Param(ws.QueryParameter("language", "en,nl,de").DataType("string")). - Param(ws.HeaderParameter("If-Modified-Since", "last known timestamp").DataType("datetime")). - Do(returns200, returns500)) - - ws.Route(ws.PUT("/{medium}").To(noop). - Doc("Add a new book"). - Param(ws.PathParameter("medium", "digital or paperback").DataType("string")). - Reads(Book{})) - - // You can install the Swagger Service which provides a nice Web UI on your REST API - // You need to download the Swagger HTML5 assets and change the FilePath location in the config below. - // Open http://localhost:8080/apidocs and enter http://localhost:8080/apidocs.json in the api input field. - config := swagger.Config{ - WebServices: restful.DefaultContainer.RegisteredWebServices(), // you control what services are visible - WebServicesUrl: "http://localhost:8080", - ApiPath: "/apidocs.json", - - // Optionally, specify where the UI is located - SwaggerPath: "/apidocs/", - SwaggerFilePath: "/Users/emicklei/xProjects/swagger-ui/dist"} - swagger.RegisterSwaggerService(config, restful.DefaultContainer) - - log.Print("start listening on localhost:8080") - server := &http.Server{Addr: ":8080", Handler: restful.DefaultContainer} - log.Fatal(server.ListenAndServe()) -} - -func noop(req *restful.Request, resp *restful.Response) {} - -func returns200(b *restful.RouteBuilder) { - b.Returns(http.StatusOK, "OK", Book{}) -} - -func returns500(b *restful.RouteBuilder) { - b.Returns(http.StatusInternalServerError, "Bummer, something went wrong", nil) -} diff --git a/vendor/github.com/emicklei/go-restful/examples/restful-user-resource.go b/vendor/github.com/emicklei/go-restful/examples/restful-user-resource.go deleted file mode 100644 index 118d2f0ba2..0000000000 --- a/vendor/github.com/emicklei/go-restful/examples/restful-user-resource.go +++ /dev/null @@ -1,170 +0,0 @@ -package main - -import ( - "log" - "net/http" - - "github.com/emicklei/go-restful" - restfulspec "github.com/emicklei/go-restful-openapi" - "github.com/go-openapi/spec" -) - -// UserResource is the REST layer to the User domain -type UserResource struct { - // normally one would use DAO (data access object) - users map[string]User -} - -// WebService creates a new service that can handle REST requests for User resources. -func (u UserResource) WebService() *restful.WebService { - ws := new(restful.WebService) - ws. - Path("/users"). - Consumes(restful.MIME_XML, restful.MIME_JSON). - Produces(restful.MIME_JSON, restful.MIME_XML) // you can specify this per route as well - - tags := []string{"users"} - - ws.Route(ws.GET("/").To(u.findAllUsers). - // docs - Doc("get all users"). - Metadata(restfulspec.KeyOpenAPITags, tags). - Writes([]User{}). - Returns(200, "OK", []User{})) - - ws.Route(ws.GET("/{user-id}").To(u.findUser). - // docs - Doc("get a user"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("integer").DefaultValue("1")). - Metadata(restfulspec.KeyOpenAPITags, tags). - Writes(User{}). // on the response - Returns(200, "OK", User{}). - Returns(404, "Not Found", nil)) - - ws.Route(ws.PUT("/{user-id}").To(u.updateUser). - // docs - Doc("update a user"). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")). - Metadata(restfulspec.KeyOpenAPITags, tags). - Reads(User{})) // from the request - - ws.Route(ws.PUT("").To(u.createUser). - // docs - Doc("create a user"). - Metadata(restfulspec.KeyOpenAPITags, tags). - Reads(User{})) // from the request - - ws.Route(ws.DELETE("/{user-id}").To(u.removeUser). - // docs - Doc("delete a user"). - Metadata(restfulspec.KeyOpenAPITags, tags). - Param(ws.PathParameter("user-id", "identifier of the user").DataType("string"))) - - return ws -} - -// GET http://localhost:8080/users -// -func (u UserResource) findAllUsers(request *restful.Request, response *restful.Response) { - list := []User{} - for _, each := range u.users { - list = append(list, each) - } - response.WriteEntity(list) -} - -// GET http://localhost:8080/users/1 -// -func (u UserResource) findUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - usr := u.users[id] - if len(usr.ID) == 0 { - response.WriteErrorString(http.StatusNotFound, "User could not be found.") - } else { - response.WriteEntity(usr) - } -} - -// PUT http://localhost:8080/users/1 -// 1Melissa Raspberry -// -func (u *UserResource) updateUser(request *restful.Request, response *restful.Response) { - usr := new(User) - err := request.ReadEntity(&usr) - if err == nil { - u.users[usr.ID] = *usr - response.WriteEntity(usr) - } else { - response.WriteError(http.StatusInternalServerError, err) - } -} - -// PUT http://localhost:8080/users/1 -// 1Melissa -// -func (u *UserResource) createUser(request *restful.Request, response *restful.Response) { - usr := User{ID: request.PathParameter("user-id")} - err := request.ReadEntity(&usr) - if err == nil { - u.users[usr.ID] = usr - response.WriteHeaderAndEntity(http.StatusCreated, usr) - } else { - response.WriteError(http.StatusInternalServerError, err) - } -} - -// DELETE http://localhost:8080/users/1 -// -func (u *UserResource) removeUser(request *restful.Request, response *restful.Response) { - id := request.PathParameter("user-id") - delete(u.users, id) -} - -func main() { - u := UserResource{map[string]User{}} - restful.DefaultContainer.Add(u.WebService()) - - config := restfulspec.Config{ - WebServices: restful.RegisteredWebServices(), // you control what services are visible - WebServicesURL: "http://localhost:8080", - APIPath: "/apidocs.json", - PostBuildSwaggerObjectHandler: enrichSwaggerObject} - restful.DefaultContainer.Add(restfulspec.NewOpenAPIService(config)) - - // Optionally, you can install the Swagger Service which provides a nice Web UI on your REST API - // You need to download the Swagger HTML5 assets and change the FilePath location in the config below. - // Open http://localhost:8080/apidocs/?url=http://localhost:8080/apidocs.json - http.Handle("/apidocs/", http.StripPrefix("/apidocs/", http.FileServer(http.Dir("/Users/emicklei/Projects/swagger-ui/dist")))) - - log.Printf("start listening on localhost:8080") - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func enrichSwaggerObject(swo *spec.Swagger) { - swo.Info = &spec.Info{ - InfoProps: spec.InfoProps{ - Title: "UserService", - Description: "Resource for managing Users", - Contact: &spec.ContactInfo{ - Name: "john", - Email: "john@doe.rp", - URL: "http://johndoe.org", - }, - License: &spec.License{ - Name: "MIT", - URL: "http://mit.org", - }, - Version: "1.0.0", - }, - } - swo.Tags = []spec.Tag{spec.Tag{TagProps: spec.TagProps{ - Name: "users", - Description: "Managing users"}}} -} - -// User is just a sample type -type User struct { - ID string `json:"id" description:"identifier of the user"` - Name string `json:"name" description:"name of the user" default:"john"` - Age int `json:"age" description:"age of the user" default:"21"` -} diff --git a/vendor/github.com/emicklei/go-restful/filter.go b/vendor/github.com/emicklei/go-restful/filter.go deleted file mode 100644 index c23bfb591a..0000000000 --- a/vendor/github.com/emicklei/go-restful/filter.go +++ /dev/null @@ -1,35 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -// FilterChain is a request scoped object to process one or more filters before calling the target RouteFunction. -type FilterChain struct { - Filters []FilterFunction // ordered list of FilterFunction - Index int // index into filters that is currently in progress - Target RouteFunction // function to call after passing all filters -} - -// ProcessFilter passes the request,response pair through the next of Filters. -// Each filter can decide to proceed to the next Filter or handle the Response itself. -func (f *FilterChain) ProcessFilter(request *Request, response *Response) { - if f.Index < len(f.Filters) { - f.Index++ - f.Filters[f.Index-1](request, response, f) - } else { - f.Target(request, response) - } -} - -// FilterFunction definitions must call ProcessFilter on the FilterChain to pass on the control and eventually call the RouteFunction -type FilterFunction func(*Request, *Response, *FilterChain) - -// NoBrowserCacheFilter is a filter function to set HTTP headers that disable browser caching -// See examples/restful-no-cache-filter.go for usage -func NoBrowserCacheFilter(req *Request, resp *Response, chain *FilterChain) { - resp.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1. - resp.Header().Set("Pragma", "no-cache") // HTTP 1.0. - resp.Header().Set("Expires", "0") // Proxies. - chain.ProcessFilter(req, resp) -} diff --git a/vendor/github.com/emicklei/go-restful/filter_test.go b/vendor/github.com/emicklei/go-restful/filter_test.go deleted file mode 100644 index fadfb570f6..0000000000 --- a/vendor/github.com/emicklei/go-restful/filter_test.go +++ /dev/null @@ -1,141 +0,0 @@ -package restful - -import ( - "io" - "net/http" - "net/http/httptest" - "testing" -) - -func setupServices(addGlobalFilter bool, addServiceFilter bool, addRouteFilter bool) { - if addGlobalFilter { - Filter(globalFilter) - } - Add(newTestService(addServiceFilter, addRouteFilter)) -} - -func tearDown() { - DefaultContainer.webServices = []*WebService{} - DefaultContainer.isRegisteredOnRoot = true // this allows for setupServices multiple times - DefaultContainer.containerFilters = []FilterFunction{} -} - -func newTestService(addServiceFilter bool, addRouteFilter bool) *WebService { - ws := new(WebService).Path("") - if addServiceFilter { - ws.Filter(serviceFilter) - } - rb := ws.GET("/foo").To(foo) - if addRouteFilter { - rb.Filter(routeFilter) - } - ws.Route(rb) - ws.Route(ws.GET("/bar").To(bar)) - return ws -} - -func foo(req *Request, resp *Response) { - io.WriteString(resp.ResponseWriter, "foo") -} - -func bar(req *Request, resp *Response) { - io.WriteString(resp.ResponseWriter, "bar") -} - -func fail(req *Request, resp *Response) { - http.Error(resp.ResponseWriter, "something failed", http.StatusInternalServerError) -} - -func globalFilter(req *Request, resp *Response, chain *FilterChain) { - io.WriteString(resp.ResponseWriter, "global-") - chain.ProcessFilter(req, resp) -} - -func serviceFilter(req *Request, resp *Response, chain *FilterChain) { - io.WriteString(resp.ResponseWriter, "service-") - chain.ProcessFilter(req, resp) -} - -func routeFilter(req *Request, resp *Response, chain *FilterChain) { - io.WriteString(resp.ResponseWriter, "route-") - chain.ProcessFilter(req, resp) -} - -func TestNoFilter(t *testing.T) { - tearDown() - setupServices(false, false, false) - actual := sendIt("http://example.com/foo") - if "foo" != actual { - t.Fatal("expected: foo but got:" + actual) - } -} - -func TestGlobalFilter(t *testing.T) { - tearDown() - setupServices(true, false, false) - actual := sendIt("http://example.com/foo") - if "global-foo" != actual { - t.Fatal("expected: global-foo but got:" + actual) - } -} - -func TestWebServiceFilter(t *testing.T) { - tearDown() - setupServices(true, true, false) - actual := sendIt("http://example.com/foo") - if "global-service-foo" != actual { - t.Fatal("expected: global-service-foo but got:" + actual) - } -} - -func TestRouteFilter(t *testing.T) { - tearDown() - setupServices(true, true, true) - actual := sendIt("http://example.com/foo") - if "global-service-route-foo" != actual { - t.Fatal("expected: global-service-route-foo but got:" + actual) - } -} - -func TestRouteFilterOnly(t *testing.T) { - tearDown() - setupServices(false, false, true) - actual := sendIt("http://example.com/foo") - if "route-foo" != actual { - t.Fatal("expected: route-foo but got:" + actual) - } -} - -func TestBar(t *testing.T) { - tearDown() - setupServices(false, true, false) - actual := sendIt("http://example.com/bar") - if "service-bar" != actual { - t.Fatal("expected: service-bar but got:" + actual) - } -} - -func TestAllFiltersBar(t *testing.T) { - tearDown() - setupServices(true, true, true) - actual := sendIt("http://example.com/bar") - if "global-service-bar" != actual { - t.Fatal("expected: global-service-bar but got:" + actual) - } -} - -func sendIt(address string) string { - httpRequest, _ := http.NewRequest("GET", address, nil) - httpRequest.Header.Set("Accept", "*/*") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - return httpWriter.Body.String() -} - -func sendItTo(address string, container *Container) string { - httpRequest, _ := http.NewRequest("GET", address, nil) - httpRequest.Header.Set("Accept", "*/*") - httpWriter := httptest.NewRecorder() - container.dispatch(httpWriter, httpRequest) - return httpWriter.Body.String() -} diff --git a/vendor/github.com/emicklei/go-restful/jsr311.go b/vendor/github.com/emicklei/go-restful/jsr311.go deleted file mode 100644 index 9e81224164..0000000000 --- a/vendor/github.com/emicklei/go-restful/jsr311.go +++ /dev/null @@ -1,268 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "errors" - "fmt" - "net/http" - "sort" -) - -// RouterJSR311 implements the flow for matching Requests to Routes (and consequently Resource Functions) -// as specified by the JSR311 http://jsr311.java.net/nonav/releases/1.1/spec/spec.html. -// RouterJSR311 implements the Router interface. -// Concept of locators is not implemented. -type RouterJSR311 struct{} - -// SelectRoute is part of the Router interface and returns the best match -// for the WebService and its Route for the given Request. -func (r RouterJSR311) SelectRoute( - webServices []*WebService, - httpRequest *http.Request) (selectedService *WebService, selectedRoute *Route, err error) { - - // Identify the root resource class (WebService) - dispatcher, finalMatch, err := r.detectDispatcher(httpRequest.URL.Path, webServices) - if err != nil { - return nil, nil, NewError(http.StatusNotFound, "") - } - // Obtain the set of candidate methods (Routes) - routes := r.selectRoutes(dispatcher, finalMatch) - if len(routes) == 0 { - return dispatcher, nil, NewError(http.StatusNotFound, "404: Page Not Found") - } - - // Identify the method (Route) that will handle the request - route, ok := r.detectRoute(routes, httpRequest) - return dispatcher, route, ok -} - -// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2 -func (r RouterJSR311) detectRoute(routes []Route, httpRequest *http.Request) (*Route, error) { - ifOk := []Route{} - for _, each := range routes { - ok := true - for _, fn := range each.If { - if !fn(httpRequest) { - ok = false - break - } - } - if ok { - ifOk = append(ifOk, each) - } - } - if len(ifOk) == 0 { - if trace { - traceLogger.Printf("no Route found (from %d) that passes conditional checks", len(routes)) - } - return nil, NewError(http.StatusNotFound, "404: Not Found") - } - - // http method - methodOk := []Route{} - for _, each := range ifOk { - if httpRequest.Method == each.Method { - methodOk = append(methodOk, each) - } - } - if len(methodOk) == 0 { - if trace { - traceLogger.Printf("no Route found (in %d routes) that matches HTTP method %s\n", len(routes), httpRequest.Method) - } - return nil, NewError(http.StatusMethodNotAllowed, "405: Method Not Allowed") - } - inputMediaOk := methodOk - - // content-type - contentType := httpRequest.Header.Get(HEADER_ContentType) - inputMediaOk = []Route{} - for _, each := range methodOk { - if each.matchesContentType(contentType) { - inputMediaOk = append(inputMediaOk, each) - } - } - if len(inputMediaOk) == 0 { - if trace { - traceLogger.Printf("no Route found (from %d) that matches HTTP Content-Type: %s\n", len(methodOk), contentType) - } - return nil, NewError(http.StatusUnsupportedMediaType, "415: Unsupported Media Type") - } - - // accept - outputMediaOk := []Route{} - accept := httpRequest.Header.Get(HEADER_Accept) - if len(accept) == 0 { - accept = "*/*" - } - for _, each := range inputMediaOk { - if each.matchesAccept(accept) { - outputMediaOk = append(outputMediaOk, each) - } - } - if len(outputMediaOk) == 0 { - if trace { - traceLogger.Printf("no Route found (from %d) that matches HTTP Accept: %s\n", len(inputMediaOk), accept) - } - return nil, NewError(http.StatusNotAcceptable, "406: Not Acceptable") - } - // return r.bestMatchByMedia(outputMediaOk, contentType, accept), nil - return &outputMediaOk[0], nil -} - -// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2 -// n/m > n/* > */* -func (r RouterJSR311) bestMatchByMedia(routes []Route, contentType string, accept string) *Route { - // TODO - return &routes[0] -} - -// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2 (step 2) -func (r RouterJSR311) selectRoutes(dispatcher *WebService, pathRemainder string) []Route { - filtered := &sortableRouteCandidates{} - for _, each := range dispatcher.Routes() { - pathExpr := each.pathExpr - matches := pathExpr.Matcher.FindStringSubmatch(pathRemainder) - if matches != nil { - lastMatch := matches[len(matches)-1] - if len(lastMatch) == 0 || lastMatch == "/" { // do not include if value is neither empty nor ‘/’. - filtered.candidates = append(filtered.candidates, - routeCandidate{each, len(matches) - 1, pathExpr.LiteralCount, pathExpr.VarCount}) - } - } - } - if len(filtered.candidates) == 0 { - if trace { - traceLogger.Printf("WebService on path %s has no routes that match URL path remainder:%s\n", dispatcher.rootPath, pathRemainder) - } - return []Route{} - } - sort.Sort(sort.Reverse(filtered)) - - // select other routes from candidates whoes expression matches rmatch - matchingRoutes := []Route{filtered.candidates[0].route} - for c := 1; c < len(filtered.candidates); c++ { - each := filtered.candidates[c] - if each.route.pathExpr.Matcher.MatchString(pathRemainder) { - matchingRoutes = append(matchingRoutes, each.route) - } - } - return matchingRoutes -} - -// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2 (step 1) -func (r RouterJSR311) detectDispatcher(requestPath string, dispatchers []*WebService) (*WebService, string, error) { - filtered := &sortableDispatcherCandidates{} - for _, each := range dispatchers { - matches := each.pathExpr.Matcher.FindStringSubmatch(requestPath) - if matches != nil { - filtered.candidates = append(filtered.candidates, - dispatcherCandidate{each, matches[len(matches)-1], len(matches), each.pathExpr.LiteralCount, each.pathExpr.VarCount}) - } - } - if len(filtered.candidates) == 0 { - if trace { - traceLogger.Printf("no WebService was found to match URL path:%s\n", requestPath) - } - return nil, "", errors.New("not found") - } - sort.Sort(sort.Reverse(filtered)) - return filtered.candidates[0].dispatcher, filtered.candidates[0].finalMatch, nil -} - -// Types and functions to support the sorting of Routes - -type routeCandidate struct { - route Route - matchesCount int // the number of capturing groups - literalCount int // the number of literal characters (means those not resulting from template variable substitution) - nonDefaultCount int // the number of capturing groups with non-default regular expressions (i.e. not ‘([^ /]+?)’) -} - -func (r routeCandidate) expressionToMatch() string { - return r.route.pathExpr.Source -} - -func (r routeCandidate) String() string { - return fmt.Sprintf("(m=%d,l=%d,n=%d)", r.matchesCount, r.literalCount, r.nonDefaultCount) -} - -type sortableRouteCandidates struct { - candidates []routeCandidate -} - -func (rcs *sortableRouteCandidates) Len() int { - return len(rcs.candidates) -} -func (rcs *sortableRouteCandidates) Swap(i, j int) { - rcs.candidates[i], rcs.candidates[j] = rcs.candidates[j], rcs.candidates[i] -} -func (rcs *sortableRouteCandidates) Less(i, j int) bool { - ci := rcs.candidates[i] - cj := rcs.candidates[j] - // primary key - if ci.literalCount < cj.literalCount { - return true - } - if ci.literalCount > cj.literalCount { - return false - } - // secundary key - if ci.matchesCount < cj.matchesCount { - return true - } - if ci.matchesCount > cj.matchesCount { - return false - } - // tertiary key - if ci.nonDefaultCount < cj.nonDefaultCount { - return true - } - if ci.nonDefaultCount > cj.nonDefaultCount { - return false - } - // quaternary key ("source" is interpreted as Path) - return ci.route.Path < cj.route.Path -} - -// Types and functions to support the sorting of Dispatchers - -type dispatcherCandidate struct { - dispatcher *WebService - finalMatch string - matchesCount int // the number of capturing groups - literalCount int // the number of literal characters (means those not resulting from template variable substitution) - nonDefaultCount int // the number of capturing groups with non-default regular expressions (i.e. not ‘([^ /]+?)’) -} -type sortableDispatcherCandidates struct { - candidates []dispatcherCandidate -} - -func (dc *sortableDispatcherCandidates) Len() int { - return len(dc.candidates) -} -func (dc *sortableDispatcherCandidates) Swap(i, j int) { - dc.candidates[i], dc.candidates[j] = dc.candidates[j], dc.candidates[i] -} -func (dc *sortableDispatcherCandidates) Less(i, j int) bool { - ci := dc.candidates[i] - cj := dc.candidates[j] - // primary key - if ci.matchesCount < cj.matchesCount { - return true - } - if ci.matchesCount > cj.matchesCount { - return false - } - // secundary key - if ci.literalCount < cj.literalCount { - return true - } - if ci.literalCount > cj.literalCount { - return false - } - // tertiary key - return ci.nonDefaultCount < cj.nonDefaultCount -} diff --git a/vendor/github.com/emicklei/go-restful/jsr311_test.go b/vendor/github.com/emicklei/go-restful/jsr311_test.go deleted file mode 100644 index ecde60366e..0000000000 --- a/vendor/github.com/emicklei/go-restful/jsr311_test.go +++ /dev/null @@ -1,251 +0,0 @@ -package restful - -import ( - "io" - "net/http" - "sort" - "testing" -) - -// -// Step 1 tests -// -var paths = []struct { - // url with path (1) is handled by service with root (2) and last capturing group has value final (3) - path, root, final string -}{ - {"/", "/", "/"}, - {"/p", "/p", ""}, - {"/p/x", "/p/{q}", ""}, - {"/q/x", "/q", "/x"}, - {"/p/x/", "/p/{q}", "/"}, - {"/p/x/y", "/p/{q}", "/y"}, - {"/q/x/y", "/q", "/x/y"}, - {"/z/q", "/{p}/q", ""}, - {"/a/b/c/q", "/", "/a/b/c/q"}, -} - -func TestDetectDispatcher(t *testing.T) { - ws1 := new(WebService).Path("/") - ws2 := new(WebService).Path("/p") - ws3 := new(WebService).Path("/q") - ws4 := new(WebService).Path("/p/q") - ws5 := new(WebService).Path("/p/{q}") - ws6 := new(WebService).Path("/p/{q}/") - ws7 := new(WebService).Path("/{p}/q") - var dispatchers = []*WebService{ws1, ws2, ws3, ws4, ws5, ws6, ws7} - - wc := NewContainer() - for _, each := range dispatchers { - wc.Add(each) - } - - router := RouterJSR311{} - - ok := true - for i, fixture := range paths { - who, final, err := router.detectDispatcher(fixture.path, dispatchers) - if err != nil { - t.Logf("error in detection:%v", err) - ok = false - } - if who.RootPath() != fixture.root { - t.Logf("[line:%v] Unexpected dispatcher, expected:%v, actual:%v", i, fixture.root, who.RootPath()) - ok = false - } - if final != fixture.final { - t.Logf("[line:%v] Unexpected final, expected:%v, actual:%v", i, fixture.final, final) - ok = false - } - } - if !ok { - t.Fail() - } -} - -// -// Step 2 tests -// - -// go test -v -test.run TestISSUE_179 ...restful -func TestISSUE_179(t *testing.T) { - ws1 := new(WebService) - ws1.Route(ws1.GET("/v1/category/{param:*}").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/v1/category/sub/sub") - t.Logf("%v", routes) -} - -// go test -v -test.run TestISSUE_30 ...restful -func TestISSUE_30(t *testing.T) { - ws1 := new(WebService).Path("/users") - ws1.Route(ws1.GET("/{id}").To(dummy)) - ws1.Route(ws1.POST("/login").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/login") - if len(routes) != 2 { - t.Fatal("expected 2 routes") - } - if routes[0].Path != "/users/login" { - t.Error("first is", routes[0].Path) - t.Logf("routes:%v", routes) - } -} - -// go test -v -test.run TestISSUE_34 ...restful -func TestISSUE_34(t *testing.T) { - ws1 := new(WebService).Path("/") - ws1.Route(ws1.GET("/{type}/{id}").To(dummy)) - ws1.Route(ws1.GET("/network/{id}").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/network/12") - if len(routes) != 2 { - t.Fatal("expected 2 routes") - } - if routes[0].Path != "/network/{id}" { - t.Error("first is", routes[0].Path) - t.Logf("routes:%v", routes) - } -} - -// go test -v -test.run TestISSUE_34_2 ...restful -func TestISSUE_34_2(t *testing.T) { - ws1 := new(WebService).Path("/") - // change the registration order - ws1.Route(ws1.GET("/network/{id}").To(dummy)) - ws1.Route(ws1.GET("/{type}/{id}").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/network/12") - if len(routes) != 2 { - t.Fatal("expected 2 routes") - } - if routes[0].Path != "/network/{id}" { - t.Error("first is", routes[0].Path) - } -} - -// go test -v -test.run TestISSUE_137 ...restful -func TestISSUE_137(t *testing.T) { - ws1 := new(WebService) - ws1.Route(ws1.GET("/hello").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/") - t.Log(routes) - if len(routes) > 0 { - t.Error("no route expected") - } -} - -func TestSelectRoutesSlash(t *testing.T) { - ws1 := new(WebService).Path("/") - ws1.Route(ws1.GET("").To(dummy)) - ws1.Route(ws1.GET("/").To(dummy)) - ws1.Route(ws1.GET("/u").To(dummy)) - ws1.Route(ws1.POST("/u").To(dummy)) - ws1.Route(ws1.POST("/u/v").To(dummy)) - ws1.Route(ws1.POST("/u/{w}").To(dummy)) - ws1.Route(ws1.POST("/u/{w}/z").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/u") - checkRoutesContains(routes, "/u", t) - checkRoutesContainsNo(routes, "/u/v", t) - checkRoutesContainsNo(routes, "/", t) - checkRoutesContainsNo(routes, "/u/{w}/z", t) -} -func TestSelectRoutesU(t *testing.T) { - ws1 := new(WebService).Path("/u") - ws1.Route(ws1.GET("").To(dummy)) - ws1.Route(ws1.GET("/").To(dummy)) - ws1.Route(ws1.GET("/v").To(dummy)) - ws1.Route(ws1.POST("/{w}").To(dummy)) - ws1.Route(ws1.POST("/{w}/z").To(dummy)) // so full path = /u/{w}/z - routes := RouterJSR311{}.selectRoutes(ws1, "/v") // test against /u/v - checkRoutesContains(routes, "/u/{w}", t) -} - -func TestSelectRoutesUsers1(t *testing.T) { - ws1 := new(WebService).Path("/users") - ws1.Route(ws1.POST("").To(dummy)) - ws1.Route(ws1.POST("/").To(dummy)) - ws1.Route(ws1.PUT("/{id}").To(dummy)) - routes := RouterJSR311{}.selectRoutes(ws1, "/1") - checkRoutesContains(routes, "/users/{id}", t) -} -func checkRoutesContains(routes []Route, path string, t *testing.T) { - if !containsRoutePath(routes, path, t) { - for _, r := range routes { - t.Logf("route %v %v", r.Method, r.Path) - } - t.Fatalf("routes should include [%v]:", path) - } -} -func checkRoutesContainsNo(routes []Route, path string, t *testing.T) { - if containsRoutePath(routes, path, t) { - for _, r := range routes { - t.Logf("route %v %v", r.Method, r.Path) - } - t.Fatalf("routes should not include [%v]:", path) - } -} -func containsRoutePath(routes []Route, path string, t *testing.T) bool { - for _, each := range routes { - if each.Path == path { - return true - } - } - return false -} - -// go test -v -test.run TestSortableRouteCandidates ...restful -func TestSortableRouteCandidates(t *testing.T) { - fixture := &sortableRouteCandidates{} - r1 := routeCandidate{matchesCount: 0, literalCount: 0, nonDefaultCount: 0} - r2 := routeCandidate{matchesCount: 0, literalCount: 0, nonDefaultCount: 1} - r3 := routeCandidate{matchesCount: 0, literalCount: 1, nonDefaultCount: 1} - r4 := routeCandidate{matchesCount: 1, literalCount: 1, nonDefaultCount: 0} - r5 := routeCandidate{matchesCount: 1, literalCount: 0, nonDefaultCount: 0} - fixture.candidates = append(fixture.candidates, r5, r4, r3, r2, r1) - sort.Sort(sort.Reverse(fixture)) - first := fixture.candidates[0] - if first.matchesCount != 1 && first.literalCount != 1 && first.nonDefaultCount != 0 { - t.Fatal("expected r4") - } - last := fixture.candidates[len(fixture.candidates)-1] - if last.matchesCount != 0 && last.literalCount != 0 && last.nonDefaultCount != 0 { - t.Fatal("expected r1") - } -} - -func TestDetectRouteReturns404IfNoRoutePassesConditions(t *testing.T) { - called := false - shouldNotBeCalledButWas := false - - routes := []Route{ - new(RouteBuilder).To(dummy). - If(func(req *http.Request) bool { return false }). - Build(), - - // check that condition functions are called in order - new(RouteBuilder). - To(dummy). - If(func(req *http.Request) bool { return true }). - If(func(req *http.Request) bool { called = true; return false }). - Build(), - - // check that condition functions short circuit - new(RouteBuilder). - To(dummy). - If(func(req *http.Request) bool { return false }). - If(func(req *http.Request) bool { shouldNotBeCalledButWas = true; return false }). - Build(), - } - - _, err := RouterJSR311{}.detectRoute(routes, (*http.Request)(nil)) - if se := err.(ServiceError); se.Code != 404 { - t.Fatalf("expected 404, got %d", se.Code) - } - - if !called { - t.Fatal("expected condition function to get called, but it wasn't") - } - - if shouldNotBeCalledButWas { - t.Fatal("expected condition function to not be called, but it was") - } -} - -func dummy(req *Request, resp *Response) { io.WriteString(resp.ResponseWriter, "dummy") } diff --git a/vendor/github.com/emicklei/go-restful/log/log.go b/vendor/github.com/emicklei/go-restful/log/log.go deleted file mode 100644 index 6cd44c7a5d..0000000000 --- a/vendor/github.com/emicklei/go-restful/log/log.go +++ /dev/null @@ -1,34 +0,0 @@ -package log - -import ( - stdlog "log" - "os" -) - -// StdLogger corresponds to a minimal subset of the interface satisfied by stdlib log.Logger -type StdLogger interface { - Print(v ...interface{}) - Printf(format string, v ...interface{}) -} - -var Logger StdLogger - -func init() { - // default Logger - SetLogger(stdlog.New(os.Stderr, "[restful] ", stdlog.LstdFlags|stdlog.Lshortfile)) -} - -// SetLogger sets the logger for this package -func SetLogger(customLogger StdLogger) { - Logger = customLogger -} - -// Print delegates to the Logger -func Print(v ...interface{}) { - Logger.Print(v...) -} - -// Printf delegates to the Logger -func Printf(format string, v ...interface{}) { - Logger.Printf(format, v...) -} diff --git a/vendor/github.com/emicklei/go-restful/logger.go b/vendor/github.com/emicklei/go-restful/logger.go deleted file mode 100644 index 6595df0029..0000000000 --- a/vendor/github.com/emicklei/go-restful/logger.go +++ /dev/null @@ -1,32 +0,0 @@ -package restful - -// Copyright 2014 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. -import ( - "github.com/emicklei/go-restful/log" -) - -var trace bool = false -var traceLogger log.StdLogger - -func init() { - traceLogger = log.Logger // use the package logger by default -} - -// TraceLogger enables detailed logging of Http request matching and filter invocation. Default no logger is set. -// You may call EnableTracing() directly to enable trace logging to the package-wide logger. -func TraceLogger(logger log.StdLogger) { - traceLogger = logger - EnableTracing(logger != nil) -} - -// SetLogger exposes the setter for the global logger on the top-level package -func SetLogger(customLogger log.StdLogger) { - log.SetLogger(customLogger) -} - -// EnableTracing can be used to Trace logging on and off. -func EnableTracing(enabled bool) { - trace = enabled -} diff --git a/vendor/github.com/emicklei/go-restful/mime.go b/vendor/github.com/emicklei/go-restful/mime.go deleted file mode 100644 index d7ea2b6157..0000000000 --- a/vendor/github.com/emicklei/go-restful/mime.go +++ /dev/null @@ -1,45 +0,0 @@ -package restful - -import ( - "strconv" - "strings" -) - -type mime struct { - media string - quality float64 -} - -// insertMime adds a mime to a list and keeps it sorted by quality. -func insertMime(l []mime, e mime) []mime { - for i, each := range l { - // if current mime has lower quality then insert before - if e.quality > each.quality { - left := append([]mime{}, l[0:i]...) - return append(append(left, e), l[i:]...) - } - } - return append(l, e) -} - -// sortedMimes returns a list of mime sorted (desc) by its specified quality. -func sortedMimes(accept string) (sorted []mime) { - for _, each := range strings.Split(accept, ",") { - typeAndQuality := strings.Split(strings.Trim(each, " "), ";") - if len(typeAndQuality) == 1 { - sorted = insertMime(sorted, mime{typeAndQuality[0], 1.0}) - } else { - // take factor - parts := strings.Split(typeAndQuality[1], "=") - if len(parts) == 2 { - f, err := strconv.ParseFloat(parts[1], 64) - if err != nil { - traceLogger.Printf("unable to parse quality in %s, %v", each, err) - } else { - sorted = insertMime(sorted, mime{typeAndQuality[0], f}) - } - } - } - } - return -} diff --git a/vendor/github.com/emicklei/go-restful/mime_test.go b/vendor/github.com/emicklei/go-restful/mime_test.go deleted file mode 100644 index a910bb1005..0000000000 --- a/vendor/github.com/emicklei/go-restful/mime_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package restful - -import ( - "fmt" - "testing" -) - -// go test -v -test.run TestSortMimes ...restful -func TestSortMimes(t *testing.T) { - accept := "text/html; q=0.8, text/plain, image/gif, */*; q=0.01, image/jpeg" - result := sortedMimes(accept) - got := fmt.Sprintf("%v", result) - want := "[{text/plain 1} {image/gif 1} {image/jpeg 1} {text/html 0.8} {*/* 0.01}]" - if got != want { - t.Errorf("bad sort order of mime types:%s", got) - } -} diff --git a/vendor/github.com/emicklei/go-restful/options_filter.go b/vendor/github.com/emicklei/go-restful/options_filter.go deleted file mode 100644 index 5c1b34251c..0000000000 --- a/vendor/github.com/emicklei/go-restful/options_filter.go +++ /dev/null @@ -1,34 +0,0 @@ -package restful - -import "strings" - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -// OPTIONSFilter is a filter function that inspects the Http Request for the OPTIONS method -// and provides the response with a set of allowed methods for the request URL Path. -// As for any filter, you can also install it for a particular WebService within a Container. -// Note: this filter is not needed when using CrossOriginResourceSharing (for CORS). -func (c *Container) OPTIONSFilter(req *Request, resp *Response, chain *FilterChain) { - if "OPTIONS" != req.Request.Method { - chain.ProcessFilter(req, resp) - return - } - - archs := req.Request.Header.Get(HEADER_AccessControlRequestHeaders) - methods := strings.Join(c.computeAllowedMethods(req), ",") - origin := req.Request.Header.Get(HEADER_Origin) - - resp.AddHeader(HEADER_Allow, methods) - resp.AddHeader(HEADER_AccessControlAllowOrigin, origin) - resp.AddHeader(HEADER_AccessControlAllowHeaders, archs) - resp.AddHeader(HEADER_AccessControlAllowMethods, methods) -} - -// OPTIONSFilter is a filter function that inspects the Http Request for the OPTIONS method -// and provides the response with a set of allowed methods for the request URL Path. -// Note: this filter is not needed when using CrossOriginResourceSharing (for CORS). -func OPTIONSFilter() FilterFunction { - return DefaultContainer.OPTIONSFilter -} diff --git a/vendor/github.com/emicklei/go-restful/options_filter_test.go b/vendor/github.com/emicklei/go-restful/options_filter_test.go deleted file mode 100644 index f0fceb834e..0000000000 --- a/vendor/github.com/emicklei/go-restful/options_filter_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package restful - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -// go test -v -test.run TestOptionsFilter ...restful -func TestOptionsFilter(t *testing.T) { - tearDown() - ws := new(WebService) - ws.Route(ws.GET("/candy/{kind}").To(dummy)) - ws.Route(ws.DELETE("/candy/{kind}").To(dummy)) - ws.Route(ws.POST("/candies").To(dummy)) - Add(ws) - Filter(OPTIONSFilter()) - - httpRequest, _ := http.NewRequest("OPTIONS", "http://here.io/candy/gum", nil) - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - actual := httpWriter.Header().Get(HEADER_Allow) - if "GET,DELETE" != actual { - t.Fatal("expected: GET,DELETE but got:" + actual) - } - - httpRequest, _ = http.NewRequest("OPTIONS", "http://here.io/candies", nil) - httpWriter = httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - actual = httpWriter.Header().Get(HEADER_Allow) - if "POST" != actual { - t.Fatal("expected: POST but got:" + actual) - } -} diff --git a/vendor/github.com/emicklei/go-restful/parameter.go b/vendor/github.com/emicklei/go-restful/parameter.go deleted file mode 100644 index e11c8162a7..0000000000 --- a/vendor/github.com/emicklei/go-restful/parameter.go +++ /dev/null @@ -1,114 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -const ( - // PathParameterKind = indicator of Request parameter type "path" - PathParameterKind = iota - - // QueryParameterKind = indicator of Request parameter type "query" - QueryParameterKind - - // BodyParameterKind = indicator of Request parameter type "body" - BodyParameterKind - - // HeaderParameterKind = indicator of Request parameter type "header" - HeaderParameterKind - - // FormParameterKind = indicator of Request parameter type "form" - FormParameterKind -) - -// Parameter is for documententing the parameter used in a Http Request -// ParameterData kinds are Path,Query and Body -type Parameter struct { - data *ParameterData -} - -// ParameterData represents the state of a Parameter. -// It is made public to make it accessible to e.g. the Swagger package. -type ParameterData struct { - Name, Description, DataType, DataFormat string - Kind int - Required bool - AllowableValues map[string]string - AllowMultiple bool - DefaultValue string -} - -// Data returns the state of the Parameter -func (p *Parameter) Data() ParameterData { - return *p.data -} - -// Kind returns the parameter type indicator (see const for valid values) -func (p *Parameter) Kind() int { - return p.data.Kind -} - -func (p *Parameter) bePath() *Parameter { - p.data.Kind = PathParameterKind - return p -} -func (p *Parameter) beQuery() *Parameter { - p.data.Kind = QueryParameterKind - return p -} -func (p *Parameter) beBody() *Parameter { - p.data.Kind = BodyParameterKind - return p -} - -func (p *Parameter) beHeader() *Parameter { - p.data.Kind = HeaderParameterKind - return p -} - -func (p *Parameter) beForm() *Parameter { - p.data.Kind = FormParameterKind - return p -} - -// Required sets the required field and returns the receiver -func (p *Parameter) Required(required bool) *Parameter { - p.data.Required = required - return p -} - -// AllowMultiple sets the allowMultiple field and returns the receiver -func (p *Parameter) AllowMultiple(multiple bool) *Parameter { - p.data.AllowMultiple = multiple - return p -} - -// AllowableValues sets the allowableValues field and returns the receiver -func (p *Parameter) AllowableValues(values map[string]string) *Parameter { - p.data.AllowableValues = values - return p -} - -// DataType sets the dataType field and returns the receiver -func (p *Parameter) DataType(typeName string) *Parameter { - p.data.DataType = typeName - return p -} - -// DataFormat sets the dataFormat field for Swagger UI -func (p *Parameter) DataFormat(formatName string) *Parameter { - p.data.DataFormat = formatName - return p -} - -// DefaultValue sets the default value field and returns the receiver -func (p *Parameter) DefaultValue(stringRepresentation string) *Parameter { - p.data.DefaultValue = stringRepresentation - return p -} - -// Description sets the description value field and returns the receiver -func (p *Parameter) Description(doc string) *Parameter { - p.data.Description = doc - return p -} diff --git a/vendor/github.com/emicklei/go-restful/path_expression.go b/vendor/github.com/emicklei/go-restful/path_expression.go deleted file mode 100644 index a921e6f224..0000000000 --- a/vendor/github.com/emicklei/go-restful/path_expression.go +++ /dev/null @@ -1,69 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "bytes" - "fmt" - "regexp" - "strings" -) - -// PathExpression holds a compiled path expression (RegExp) needed to match against -// Http request paths and to extract path parameter values. -type pathExpression struct { - LiteralCount int // the number of literal characters (means those not resulting from template variable substitution) - VarCount int // the number of named parameters (enclosed by {}) in the path - Matcher *regexp.Regexp - Source string // Path as defined by the RouteBuilder - tokens []string -} - -// NewPathExpression creates a PathExpression from the input URL path. -// Returns an error if the path is invalid. -func newPathExpression(path string) (*pathExpression, error) { - expression, literalCount, varCount, tokens := templateToRegularExpression(path) - compiled, err := regexp.Compile(expression) - if err != nil { - return nil, err - } - return &pathExpression{literalCount, varCount, compiled, expression, tokens}, nil -} - -// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-370003.7.3 -func templateToRegularExpression(template string) (expression string, literalCount int, varCount int, tokens []string) { - var buffer bytes.Buffer - buffer.WriteString("^") - //tokens = strings.Split(template, "/") - tokens = tokenizePath(template) - for _, each := range tokens { - if each == "" { - continue - } - buffer.WriteString("/") - if strings.HasPrefix(each, "{") { - // check for regular expression in variable - colon := strings.Index(each, ":") - if colon != -1 { - // extract expression - paramExpr := strings.TrimSpace(each[colon+1 : len(each)-1]) - if paramExpr == "*" { // special case - buffer.WriteString("(.*)") - } else { - buffer.WriteString(fmt.Sprintf("(%s)", paramExpr)) // between colon and closing moustache - } - } else { - // plain var - buffer.WriteString("([^/]+?)") - } - varCount += 1 - } else { - literalCount += len(each) - encoded := each // TODO URI encode - buffer.WriteString(regexp.QuoteMeta(encoded)) - } - } - return strings.TrimRight(buffer.String(), "/") + "(/.*)?$", literalCount, varCount, tokens -} diff --git a/vendor/github.com/emicklei/go-restful/path_expression_test.go b/vendor/github.com/emicklei/go-restful/path_expression_test.go deleted file mode 100644 index 334fcef739..0000000000 --- a/vendor/github.com/emicklei/go-restful/path_expression_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package restful - -import "testing" - -var tempregexs = []struct { - template, regex string - literalCount, varCount int -}{ - {"", "^(/.*)?$", 0, 0}, - {"/a/{b}/c/", "^/a/([^/]+?)/c(/.*)?$", 2, 1}, - {"/{a}/{b}/{c-d-e}/", "^/([^/]+?)/([^/]+?)/([^/]+?)(/.*)?$", 0, 3}, - {"/{p}/abcde", "^/([^/]+?)/abcde(/.*)?$", 5, 1}, - {"/a/{b:*}", "^/a/(.*)(/.*)?$", 1, 1}, - {"/a/{b:[a-z]+}", "^/a/([a-z]+)(/.*)?$", 1, 1}, -} - -func TestTemplateToRegularExpression(t *testing.T) { - ok := true - for i, fixture := range tempregexs { - actual, lCount, vCount, _ := templateToRegularExpression(fixture.template) - if actual != fixture.regex { - t.Logf("regex mismatch, expected:%v , actual:%v, line:%v\n", fixture.regex, actual, i) // 11 = where the data starts - ok = false - } - if lCount != fixture.literalCount { - t.Logf("literal count mismatch, expected:%v , actual:%v, line:%v\n", fixture.literalCount, lCount, i) - ok = false - } - if vCount != fixture.varCount { - t.Logf("variable count mismatch, expected:%v , actual:%v, line:%v\n", fixture.varCount, vCount, i) - ok = false - } - } - if !ok { - t.Fatal("one or more expression did not match") - } -} diff --git a/vendor/github.com/emicklei/go-restful/request.go b/vendor/github.com/emicklei/go-restful/request.go deleted file mode 100644 index 8c23af12c0..0000000000 --- a/vendor/github.com/emicklei/go-restful/request.go +++ /dev/null @@ -1,113 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "compress/zlib" - "net/http" -) - -var defaultRequestContentType string - -// Request is a wrapper for a http Request that provides convenience methods -type Request struct { - Request *http.Request - pathParameters map[string]string - attributes map[string]interface{} // for storing request-scoped values - selectedRoutePath string // root path + route path that matched the request, e.g. /meetings/{id}/attendees -} - -func NewRequest(httpRequest *http.Request) *Request { - return &Request{ - Request: httpRequest, - pathParameters: map[string]string{}, - attributes: map[string]interface{}{}, - } // empty parameters, attributes -} - -// If ContentType is missing or */* is given then fall back to this type, otherwise -// a "Unable to unmarshal content of type:" response is returned. -// Valid values are restful.MIME_JSON and restful.MIME_XML -// Example: -// restful.DefaultRequestContentType(restful.MIME_JSON) -func DefaultRequestContentType(mime string) { - defaultRequestContentType = mime -} - -// PathParameter accesses the Path parameter value by its name -func (r *Request) PathParameter(name string) string { - return r.pathParameters[name] -} - -// PathParameters accesses the Path parameter values -func (r *Request) PathParameters() map[string]string { - return r.pathParameters -} - -// QueryParameter returns the (first) Query parameter value by its name -func (r *Request) QueryParameter(name string) string { - return r.Request.FormValue(name) -} - -// BodyParameter parses the body of the request (once for typically a POST or a PUT) and returns the value of the given name or an error. -func (r *Request) BodyParameter(name string) (string, error) { - err := r.Request.ParseForm() - if err != nil { - return "", err - } - return r.Request.PostFormValue(name), nil -} - -// HeaderParameter returns the HTTP Header value of a Header name or empty if missing -func (r *Request) HeaderParameter(name string) string { - return r.Request.Header.Get(name) -} - -// ReadEntity checks the Accept header and reads the content into the entityPointer. -func (r *Request) ReadEntity(entityPointer interface{}) (err error) { - contentType := r.Request.Header.Get(HEADER_ContentType) - contentEncoding := r.Request.Header.Get(HEADER_ContentEncoding) - - // check if the request body needs decompression - if ENCODING_GZIP == contentEncoding { - gzipReader := currentCompressorProvider.AcquireGzipReader() - defer currentCompressorProvider.ReleaseGzipReader(gzipReader) - gzipReader.Reset(r.Request.Body) - r.Request.Body = gzipReader - } else if ENCODING_DEFLATE == contentEncoding { - zlibReader, err := zlib.NewReader(r.Request.Body) - if err != nil { - return err - } - r.Request.Body = zlibReader - } - - // lookup the EntityReader, use defaultRequestContentType if needed and provided - entityReader, ok := entityAccessRegistry.accessorAt(contentType) - if !ok { - if len(defaultRequestContentType) != 0 { - entityReader, ok = entityAccessRegistry.accessorAt(defaultRequestContentType) - } - if !ok { - return NewError(http.StatusBadRequest, "Unable to unmarshal content of type:"+contentType) - } - } - return entityReader.Read(r, entityPointer) -} - -// SetAttribute adds or replaces the attribute with the given value. -func (r *Request) SetAttribute(name string, value interface{}) { - r.attributes[name] = value -} - -// Attribute returns the value associated to the given name. Returns nil if absent. -func (r Request) Attribute(name string) interface{} { - return r.attributes[name] -} - -// SelectedRoutePath root path + route path that matched the request, e.g. /meetings/{id}/attendees -func (r Request) SelectedRoutePath() string { - return r.selectedRoutePath -} diff --git a/vendor/github.com/emicklei/go-restful/request_test.go b/vendor/github.com/emicklei/go-restful/request_test.go deleted file mode 100644 index 31f5096594..0000000000 --- a/vendor/github.com/emicklei/go-restful/request_test.go +++ /dev/null @@ -1,141 +0,0 @@ -package restful - -import ( - "encoding/json" - "net/http" - "net/url" - "strconv" - "strings" - "testing" -) - -func TestQueryParameter(t *testing.T) { - hreq := http.Request{Method: "GET"} - hreq.URL, _ = url.Parse("http://www.google.com/search?q=foo&q=bar") - rreq := Request{Request: &hreq} - if rreq.QueryParameter("q") != "foo" { - t.Errorf("q!=foo %#v", rreq) - } -} - -type Anything map[string]interface{} - -type Number struct { - ValueFloat float64 - ValueInt int64 -} - -type Sample struct { - Value string -} - -func TestReadEntityJson(t *testing.T) { - bodyReader := strings.NewReader(`{"Value" : "42"}`) - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/json") - request := &Request{Request: httpRequest} - sam := new(Sample) - request.ReadEntity(sam) - if sam.Value != "42" { - t.Fatal("read failed") - } -} - -func TestReadEntityJsonCharset(t *testing.T) { - bodyReader := strings.NewReader(`{"Value" : "42"}`) - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/json; charset=UTF-8") - request := NewRequest(httpRequest) - sam := new(Sample) - request.ReadEntity(sam) - if sam.Value != "42" { - t.Fatal("read failed") - } -} - -func TestReadEntityJsonNumber(t *testing.T) { - bodyReader := strings.NewReader(`{"Value" : 4899710515899924123}`) - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/json") - request := &Request{Request: httpRequest} - any := make(Anything) - request.ReadEntity(&any) - number, ok := any["Value"].(json.Number) - if !ok { - t.Fatal("read failed") - } - vint, err := number.Int64() - if err != nil { - t.Fatal("convert failed") - } - if vint != 4899710515899924123 { - t.Fatal("read failed") - } - vfloat, err := number.Float64() - if err != nil { - t.Fatal("convert failed") - } - // match the default behaviour - vstring := strconv.FormatFloat(vfloat, 'e', 15, 64) - if vstring != "4.899710515899924e+18" { - t.Fatal("convert float64 failed") - } -} - -func TestReadEntityJsonLong(t *testing.T) { - bodyReader := strings.NewReader(`{"ValueFloat" : 4899710515899924123, "ValueInt": 4899710515899924123}`) - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/json") - request := &Request{Request: httpRequest} - number := new(Number) - request.ReadEntity(&number) - if number.ValueInt != 4899710515899924123 { - t.Fatal("read failed") - } - // match the default behaviour - vstring := strconv.FormatFloat(number.ValueFloat, 'e', 15, 64) - if vstring != "4.899710515899924e+18" { - t.Fatal("convert float64 failed") - } -} - -func TestBodyParameter(t *testing.T) { - bodyReader := strings.NewReader(`value1=42&value2=43`) - httpRequest, _ := http.NewRequest("POST", "/test?value1=44", bodyReader) // POST and PUT body parameters take precedence over URL query string - httpRequest.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") - request := NewRequest(httpRequest) - v1, err := request.BodyParameter("value1") - if err != nil { - t.Error(err) - } - v2, err := request.BodyParameter("value2") - if err != nil { - t.Error(err) - } - if v1 != "42" || v2 != "43" { - t.Fatal("read failed") - } -} - -func TestReadEntityUnkown(t *testing.T) { - bodyReader := strings.NewReader("?") - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - httpRequest.Header.Set("Content-Type", "application/rubbish") - request := NewRequest(httpRequest) - sam := new(Sample) - err := request.ReadEntity(sam) - if err == nil { - t.Fatal("read should be in error") - } -} - -func TestSetAttribute(t *testing.T) { - bodyReader := strings.NewReader("?") - httpRequest, _ := http.NewRequest("GET", "/test", bodyReader) - request := NewRequest(httpRequest) - request.SetAttribute("go", "there") - there := request.Attribute("go") - if there != "there" { - t.Fatalf("missing request attribute:%v", there) - } -} diff --git a/vendor/github.com/emicklei/go-restful/response.go b/vendor/github.com/emicklei/go-restful/response.go deleted file mode 100644 index 4d987d130b..0000000000 --- a/vendor/github.com/emicklei/go-restful/response.go +++ /dev/null @@ -1,250 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "bufio" - "errors" - "net" - "net/http" -) - -// DefaultResponseMimeType is DEPRECATED, use DefaultResponseContentType(mime) -var DefaultResponseMimeType string - -//PrettyPrintResponses controls the indentation feature of XML and JSON serialization -var PrettyPrintResponses = true - -// Response is a wrapper on the actual http ResponseWriter -// It provides several convenience methods to prepare and write response content. -type Response struct { - http.ResponseWriter - requestAccept string // mime-type what the Http Request says it wants to receive - routeProduces []string // mime-types what the Route says it can produce - statusCode int // HTTP status code that has been written explicitly (if zero then net/http has written 200) - contentLength int // number of bytes written for the response body - prettyPrint bool // controls the indentation feature of XML and JSON serialization. It is initialized using var PrettyPrintResponses. - err error // err property is kept when WriteError is called - hijacker http.Hijacker // if underlying ResponseWriter supports it -} - -// NewResponse creates a new response based on a http ResponseWriter. -func NewResponse(httpWriter http.ResponseWriter) *Response { - hijacker, _ := httpWriter.(http.Hijacker) - return &Response{ResponseWriter: httpWriter, routeProduces: []string{}, statusCode: http.StatusOK, prettyPrint: PrettyPrintResponses, hijacker: hijacker} -} - -// DefaultResponseContentType set a default. -// If Accept header matching fails, fall back to this type. -// Valid values are restful.MIME_JSON and restful.MIME_XML -// Example: -// restful.DefaultResponseContentType(restful.MIME_JSON) -func DefaultResponseContentType(mime string) { - DefaultResponseMimeType = mime -} - -// InternalServerError writes the StatusInternalServerError header. -// DEPRECATED, use WriteErrorString(http.StatusInternalServerError,reason) -func (r Response) InternalServerError() Response { - r.WriteHeader(http.StatusInternalServerError) - return r -} - -// Hijack implements the http.Hijacker interface. This expands -// the Response to fulfill http.Hijacker if the underlying -// http.ResponseWriter supports it. -func (r *Response) Hijack() (net.Conn, *bufio.ReadWriter, error) { - if r.hijacker == nil { - return nil, nil, errors.New("http.Hijacker not implemented by underlying http.ResponseWriter") - } - return r.hijacker.Hijack() -} - -// PrettyPrint changes whether this response must produce pretty (line-by-line, indented) JSON or XML output. -func (r *Response) PrettyPrint(bePretty bool) { - r.prettyPrint = bePretty -} - -// AddHeader is a shortcut for .Header().Add(header,value) -func (r Response) AddHeader(header string, value string) Response { - r.Header().Add(header, value) - return r -} - -// SetRequestAccepts tells the response what Mime-type(s) the HTTP request said it wants to accept. Exposed for testing. -func (r *Response) SetRequestAccepts(mime string) { - r.requestAccept = mime -} - -// EntityWriter returns the registered EntityWriter that the entity (requested resource) -// can write according to what the request wants (Accept) and what the Route can produce or what the restful defaults say. -// If called before WriteEntity and WriteHeader then a false return value can be used to write a 406: Not Acceptable. -func (r *Response) EntityWriter() (EntityReaderWriter, bool) { - sorted := sortedMimes(r.requestAccept) - for _, eachAccept := range sorted { - for _, eachProduce := range r.routeProduces { - if eachProduce == eachAccept.media { - if w, ok := entityAccessRegistry.accessorAt(eachAccept.media); ok { - return w, true - } - } - } - if eachAccept.media == "*/*" { - for _, each := range r.routeProduces { - if w, ok := entityAccessRegistry.accessorAt(each); ok { - return w, true - } - } - } - } - // if requestAccept is empty - writer, ok := entityAccessRegistry.accessorAt(r.requestAccept) - if !ok { - // if not registered then fallback to the defaults (if set) - if DefaultResponseMimeType == MIME_JSON { - return entityAccessRegistry.accessorAt(MIME_JSON) - } - if DefaultResponseMimeType == MIME_XML { - return entityAccessRegistry.accessorAt(MIME_XML) - } - // Fallback to whatever the route says it can produce. - // https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html - for _, each := range r.routeProduces { - if w, ok := entityAccessRegistry.accessorAt(each); ok { - return w, true - } - } - if trace { - traceLogger.Printf("no registered EntityReaderWriter found for %s", r.requestAccept) - } - } - return writer, ok -} - -// WriteEntity calls WriteHeaderAndEntity with Http Status OK (200) -func (r *Response) WriteEntity(value interface{}) error { - return r.WriteHeaderAndEntity(http.StatusOK, value) -} - -// WriteHeaderAndEntity marshals the value using the representation denoted by the Accept Header and the registered EntityWriters. -// If no Accept header is specified (or */*) then respond with the Content-Type as specified by the first in the Route.Produces. -// If an Accept header is specified then respond with the Content-Type as specified by the first in the Route.Produces that is matched with the Accept header. -// If the value is nil then no response is send except for the Http status. You may want to call WriteHeader(http.StatusNotFound) instead. -// If there is no writer available that can represent the value in the requested MIME type then Http Status NotAcceptable is written. -// Current implementation ignores any q-parameters in the Accept Header. -// Returns an error if the value could not be written on the response. -func (r *Response) WriteHeaderAndEntity(status int, value interface{}) error { - writer, ok := r.EntityWriter() - if !ok { - r.WriteHeader(http.StatusNotAcceptable) - return nil - } - return writer.Write(r, status, value) -} - -// WriteAsXml is a convenience method for writing a value in xml (requires Xml tags on the value) -// It uses the standard encoding/xml package for marshalling the value ; not using a registered EntityReaderWriter. -func (r *Response) WriteAsXml(value interface{}) error { - return writeXML(r, http.StatusOK, MIME_XML, value) -} - -// WriteHeaderAndXml is a convenience method for writing a status and value in xml (requires Xml tags on the value) -// It uses the standard encoding/xml package for marshalling the value ; not using a registered EntityReaderWriter. -func (r *Response) WriteHeaderAndXml(status int, value interface{}) error { - return writeXML(r, status, MIME_XML, value) -} - -// WriteAsJson is a convenience method for writing a value in json. -// It uses the standard encoding/json package for marshalling the value ; not using a registered EntityReaderWriter. -func (r *Response) WriteAsJson(value interface{}) error { - return writeJSON(r, http.StatusOK, MIME_JSON, value) -} - -// WriteJson is a convenience method for writing a value in Json with a given Content-Type. -// It uses the standard encoding/json package for marshalling the value ; not using a registered EntityReaderWriter. -func (r *Response) WriteJson(value interface{}, contentType string) error { - return writeJSON(r, http.StatusOK, contentType, value) -} - -// WriteHeaderAndJson is a convenience method for writing the status and a value in Json with a given Content-Type. -// It uses the standard encoding/json package for marshalling the value ; not using a registered EntityReaderWriter. -func (r *Response) WriteHeaderAndJson(status int, value interface{}, contentType string) error { - return writeJSON(r, status, contentType, value) -} - -// WriteError write the http status and the error string on the response. -func (r *Response) WriteError(httpStatus int, err error) error { - r.err = err - return r.WriteErrorString(httpStatus, err.Error()) -} - -// WriteServiceError is a convenience method for a responding with a status and a ServiceError -func (r *Response) WriteServiceError(httpStatus int, err ServiceError) error { - r.err = err - return r.WriteHeaderAndEntity(httpStatus, err) -} - -// WriteErrorString is a convenience method for an error status with the actual error -func (r *Response) WriteErrorString(httpStatus int, errorReason string) error { - if r.err == nil { - // if not called from WriteError - r.err = errors.New(errorReason) - } - r.WriteHeader(httpStatus) - if _, err := r.Write([]byte(errorReason)); err != nil { - return err - } - return nil -} - -// Flush implements http.Flusher interface, which sends any buffered data to the client. -func (r *Response) Flush() { - if f, ok := r.ResponseWriter.(http.Flusher); ok { - f.Flush() - } else if trace { - traceLogger.Printf("ResponseWriter %v doesn't support Flush", r) - } -} - -// WriteHeader is overridden to remember the Status Code that has been written. -// Changes to the Header of the response have no effect after this. -func (r *Response) WriteHeader(httpStatus int) { - r.statusCode = httpStatus - r.ResponseWriter.WriteHeader(httpStatus) -} - -// StatusCode returns the code that has been written using WriteHeader. -func (r Response) StatusCode() int { - if 0 == r.statusCode { - // no status code has been written yet; assume OK - return http.StatusOK - } - return r.statusCode -} - -// Write writes the data to the connection as part of an HTTP reply. -// Write is part of http.ResponseWriter interface. -func (r *Response) Write(bytes []byte) (int, error) { - written, err := r.ResponseWriter.Write(bytes) - r.contentLength += written - return written, err -} - -// ContentLength returns the number of bytes written for the response content. -// Note that this value is only correct if all data is written through the Response using its Write* methods. -// Data written directly using the underlying http.ResponseWriter is not accounted for. -func (r Response) ContentLength() int { - return r.contentLength -} - -// CloseNotify is part of http.CloseNotifier interface -func (r Response) CloseNotify() <-chan bool { - return r.ResponseWriter.(http.CloseNotifier).CloseNotify() -} - -// Error returns the err created by WriteError -func (r Response) Error() error { - return r.err -} diff --git a/vendor/github.com/emicklei/go-restful/response_test.go b/vendor/github.com/emicklei/go-restful/response_test.go deleted file mode 100644 index 0587c40b40..0000000000 --- a/vendor/github.com/emicklei/go-restful/response_test.go +++ /dev/null @@ -1,213 +0,0 @@ -package restful - -import ( - "errors" - "net/http" - "net/http/httptest" - "strings" - "testing" -) - -func TestWriteHeader(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "*/*", routeProduces: []string{"*/*"}, prettyPrint: true} - resp.WriteHeader(123) - if resp.StatusCode() != 123 { - t.Errorf("Unexpected status code:%d", resp.StatusCode()) - } -} - -func TestNoWriteHeader(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "*/*", routeProduces: []string{"*/*"}, prettyPrint: true} - if resp.StatusCode() != http.StatusOK { - t.Errorf("Unexpected status code:%d", resp.StatusCode()) - } -} - -type food struct { - Kind string -} - -// go test -v -test.run TestMeasureContentLengthXml ...restful -func TestMeasureContentLengthXml(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "*/*", routeProduces: []string{"*/*"}, prettyPrint: true} - resp.WriteAsXml(food{"apple"}) - if resp.ContentLength() != 76 { - t.Errorf("Incorrect measured length:%d", resp.ContentLength()) - } -} - -// go test -v -test.run TestMeasureContentLengthJson ...restful -func TestMeasureContentLengthJson(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "*/*", routeProduces: []string{"*/*"}, prettyPrint: true} - resp.WriteAsJson(food{"apple"}) - if resp.ContentLength() != 22 { - t.Errorf("Incorrect measured length:%d", resp.ContentLength()) - } -} - -// go test -v -test.run TestMeasureContentLengthJsonNotPretty ...restful -func TestMeasureContentLengthJsonNotPretty(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "*/*", routeProduces: []string{"*/*"}} - resp.WriteAsJson(food{"apple"}) - if resp.ContentLength() != 17 { // 16+1 using the Encoder directly yields another /n - t.Errorf("Incorrect measured length:%d", resp.ContentLength()) - } -} - -// go test -v -test.run TestMeasureContentLengthWriteErrorString ...restful -func TestMeasureContentLengthWriteErrorString(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "*/*", routeProduces: []string{"*/*"}, prettyPrint: true} - resp.WriteErrorString(404, "Invalid") - if resp.ContentLength() != len("Invalid") { - t.Errorf("Incorrect measured length:%d", resp.ContentLength()) - } -} - -// go test -v -test.run TestStatusIsPassedToResponse ...restful -func TestStatusIsPassedToResponse(t *testing.T) { - for _, each := range []struct { - write, read int - }{ - {write: 204, read: 204}, - {write: 304, read: 304}, - {write: 200, read: 200}, - {write: 400, read: 400}, - } { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "*/*", routeProduces: []string{"*/*"}, prettyPrint: true} - resp.WriteHeader(each.write) - if got, want := httpWriter.Code, each.read; got != want { - t.Errorf("got %v want %v", got, want) - } - } -} - -// go test -v -test.run TestStatusCreatedAndContentTypeJson_Issue54 ...restful -func TestStatusCreatedAndContentTypeJson_Issue54(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "application/json", routeProduces: []string{"application/json"}, prettyPrint: true} - resp.WriteHeader(201) - resp.WriteAsJson(food{"Juicy"}) - if httpWriter.HeaderMap.Get("Content-Type") != "application/json" { - t.Errorf("Expected content type json but got:%s", httpWriter.HeaderMap.Get("Content-Type")) - } - if httpWriter.Code != 201 { - t.Errorf("Expected status 201 but got:%d", httpWriter.Code) - } -} - -type errorOnWriteRecorder struct { - *httptest.ResponseRecorder -} - -func (e errorOnWriteRecorder) Write(bytes []byte) (int, error) { - return 0, errors.New("fail") -} - -// go test -v -test.run TestLastWriteErrorCaught ...restful -func TestLastWriteErrorCaught(t *testing.T) { - httpWriter := errorOnWriteRecorder{httptest.NewRecorder()} - resp := Response{ResponseWriter: httpWriter, requestAccept: "application/json", routeProduces: []string{"application/json"}, prettyPrint: true} - err := resp.WriteAsJson(food{"Juicy"}) - if err.Error() != "fail" { - t.Errorf("Unexpected error message:%v", err) - } -} - -// go test -v -test.run TestAcceptStarStar_Issue83 ...restful -func TestAcceptStarStar_Issue83(t *testing.T) { - httpWriter := httptest.NewRecorder() - // Accept Produces - resp := Response{ResponseWriter: httpWriter, requestAccept: "application/bogus,*/*;q=0.8", routeProduces: []string{"application/json"}, prettyPrint: true} - resp.WriteEntity(food{"Juicy"}) - ct := httpWriter.Header().Get("Content-Type") - if "application/json" != ct { - t.Errorf("Unexpected content type:%s", ct) - } -} - -// go test -v -test.run TestAcceptSkipStarStar_Issue83 ...restful -func TestAcceptSkipStarStar_Issue83(t *testing.T) { - httpWriter := httptest.NewRecorder() - // Accept Produces - resp := Response{ResponseWriter: httpWriter, requestAccept: " application/xml ,*/* ; q=0.8", routeProduces: []string{"application/json", "application/xml"}, prettyPrint: true} - resp.WriteEntity(food{"Juicy"}) - ct := httpWriter.Header().Get("Content-Type") - if "application/xml" != ct { - t.Errorf("Unexpected content type:%s", ct) - } -} - -// go test -v -test.run TestAcceptXmlBeforeStarStar_Issue83 ...restful -func TestAcceptXmlBeforeStarStar_Issue83(t *testing.T) { - httpWriter := httptest.NewRecorder() - // Accept Produces - resp := Response{ResponseWriter: httpWriter, requestAccept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", routeProduces: []string{"application/json"}, prettyPrint: true} - resp.WriteEntity(food{"Juicy"}) - ct := httpWriter.Header().Get("Content-Type") - if "application/json" != ct { - t.Errorf("Unexpected content type:%s", ct) - } -} - -// go test -v -test.run TestWriteHeaderNoContent_Issue124 ...restful -func TestWriteHeaderNoContent_Issue124(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "text/plain", routeProduces: []string{"text/plain"}, prettyPrint: true} - resp.WriteHeader(http.StatusNoContent) - if httpWriter.Code != http.StatusNoContent { - t.Errorf("got %d want %d", httpWriter.Code, http.StatusNoContent) - } -} - -// go test -v -test.run TestStatusCreatedAndContentTypeJson_Issue163 ...restful -func TestStatusCreatedAndContentTypeJson_Issue163(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "application/json", routeProduces: []string{"application/json"}, prettyPrint: true} - resp.WriteHeader(http.StatusNotModified) - if httpWriter.Code != http.StatusNotModified { - t.Errorf("Got %d want %d", httpWriter.Code, http.StatusNotModified) - } -} - -func TestWriteHeaderAndEntity_Issue235(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "application/json", routeProduces: []string{"application/json"}, prettyPrint: true} - var pong = struct { - Foo string `json:"foo"` - }{Foo: "123"} - resp.WriteHeaderAndEntity(404, pong) - if httpWriter.Code != http.StatusNotFound { - t.Errorf("got %d want %d", httpWriter.Code, http.StatusNoContent) - } - if got, want := httpWriter.Header().Get("Content-Type"), "application/json"; got != want { - t.Errorf("got %v want %v", got, want) - } - if !strings.HasPrefix(httpWriter.Body.String(), "{") { - t.Errorf("expected pong struct in json:%s", httpWriter.Body.String()) - } -} - -func TestWriteEntityNoAcceptMatchWithProduces(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "application/bogus", routeProduces: []string{"application/json"}, prettyPrint: true} - resp.WriteEntity("done") - if httpWriter.Code != http.StatusOK { - t.Errorf("got %d want %d", httpWriter.Code, http.StatusOK) - } -} - -func TestWriteEntityNoAcceptMatchNoProduces(t *testing.T) { - httpWriter := httptest.NewRecorder() - resp := Response{ResponseWriter: httpWriter, requestAccept: "application/bogus", routeProduces: []string{}, prettyPrint: true} - resp.WriteEntity("done") - if httpWriter.Code != http.StatusNotAcceptable { - t.Errorf("got %d want %d", httpWriter.Code, http.StatusNotAcceptable) - } -} diff --git a/vendor/github.com/emicklei/go-restful/route.go b/vendor/github.com/emicklei/go-restful/route.go deleted file mode 100644 index 9d5b156e0f..0000000000 --- a/vendor/github.com/emicklei/go-restful/route.go +++ /dev/null @@ -1,192 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "bytes" - "net/http" - "strings" -) - -// RouteFunction declares the signature of a function that can be bound to a Route. -type RouteFunction func(*Request, *Response) - -// RouteSelectionConditionFunction declares the signature of a function that -// can be used to add extra conditional logic when selecting whether the route -// matches the HTTP request. -type RouteSelectionConditionFunction func(httpRequest *http.Request) bool - -// Route binds a HTTP Method,Path,Consumes combination to a RouteFunction. -type Route struct { - Method string - Produces []string - Consumes []string - Path string // webservice root path + described path - Function RouteFunction - Filters []FilterFunction - If []RouteSelectionConditionFunction - - // cached values for dispatching - relativePath string - pathParts []string - pathExpr *pathExpression // cached compilation of relativePath as RegExp - - // documentation - Doc string - Notes string - Operation string - ParameterDocs []*Parameter - ResponseErrors map[int]ResponseError - ReadSample, WriteSample interface{} // structs that model an example request or response payload - - // Extra information used to store custom information about the route. - Metadata map[string]interface{} -} - -// Initialize for Route -func (r *Route) postBuild() { - r.pathParts = tokenizePath(r.Path) -} - -// Create Request and Response from their http versions -func (r *Route) wrapRequestResponse(httpWriter http.ResponseWriter, httpRequest *http.Request) (*Request, *Response) { - params := r.extractParameters(httpRequest.URL.Path) - wrappedRequest := NewRequest(httpRequest) - wrappedRequest.pathParameters = params - wrappedRequest.selectedRoutePath = r.Path - wrappedResponse := NewResponse(httpWriter) - wrappedResponse.requestAccept = httpRequest.Header.Get(HEADER_Accept) - wrappedResponse.routeProduces = r.Produces - return wrappedRequest, wrappedResponse -} - -// dispatchWithFilters call the function after passing through its own filters -func (r *Route) dispatchWithFilters(wrappedRequest *Request, wrappedResponse *Response) { - if len(r.Filters) > 0 { - chain := FilterChain{Filters: r.Filters, Target: r.Function} - chain.ProcessFilter(wrappedRequest, wrappedResponse) - } else { - // unfiltered - r.Function(wrappedRequest, wrappedResponse) - } -} - -// Return whether the mimeType matches to what this Route can produce. -func (r Route) matchesAccept(mimeTypesWithQuality string) bool { - parts := strings.Split(mimeTypesWithQuality, ",") - for _, each := range parts { - var withoutQuality string - if strings.Contains(each, ";") { - withoutQuality = strings.Split(each, ";")[0] - } else { - withoutQuality = each - } - // trim before compare - withoutQuality = strings.Trim(withoutQuality, " ") - if withoutQuality == "*/*" { - return true - } - for _, producibleType := range r.Produces { - if producibleType == "*/*" || producibleType == withoutQuality { - return true - } - } - } - return false -} - -// Return whether this Route can consume content with a type specified by mimeTypes (can be empty). -func (r Route) matchesContentType(mimeTypes string) bool { - - if len(r.Consumes) == 0 { - // did not specify what it can consume ; any media type (“*/*”) is assumed - return true - } - - if len(mimeTypes) == 0 { - // idempotent methods with (most-likely or guaranteed) empty content match missing Content-Type - m := r.Method - if m == "GET" || m == "HEAD" || m == "OPTIONS" || m == "DELETE" || m == "TRACE" { - return true - } - // proceed with default - mimeTypes = MIME_OCTET - } - - parts := strings.Split(mimeTypes, ",") - for _, each := range parts { - var contentType string - if strings.Contains(each, ";") { - contentType = strings.Split(each, ";")[0] - } else { - contentType = each - } - // trim before compare - contentType = strings.Trim(contentType, " ") - for _, consumeableType := range r.Consumes { - if consumeableType == "*/*" || consumeableType == contentType { - return true - } - } - } - return false -} - -// Extract the parameters from the request url path -func (r Route) extractParameters(urlPath string) map[string]string { - urlParts := tokenizePath(urlPath) - pathParameters := map[string]string{} - for i, key := range r.pathParts { - var value string - if i >= len(urlParts) { - value = "" - } else { - value = urlParts[i] - } - if strings.HasPrefix(key, "{") { // path-parameter - if colon := strings.Index(key, ":"); colon != -1 { - // extract by regex - regPart := key[colon+1 : len(key)-1] - keyPart := key[1:colon] - if regPart == "*" { - pathParameters[keyPart] = untokenizePath(i, urlParts) - break - } else { - pathParameters[keyPart] = value - } - } else { - // without enclosing {} - pathParameters[key[1:len(key)-1]] = value - } - } - } - return pathParameters -} - -// Untokenize back into an URL path using the slash separator -func untokenizePath(offset int, parts []string) string { - var buffer bytes.Buffer - for p := offset; p < len(parts); p++ { - buffer.WriteString(parts[p]) - // do not end - if p < len(parts)-1 { - buffer.WriteString("/") - } - } - return buffer.String() -} - -// Tokenize an URL path using the slash separator ; the result does not have empty tokens -func tokenizePath(path string) []string { - if "/" == path { - return []string{} - } - return strings.Split(strings.Trim(path, "/"), "/") -} - -// for debugging -func (r Route) String() string { - return r.Method + " " + r.Path -} diff --git a/vendor/github.com/emicklei/go-restful/route_builder.go b/vendor/github.com/emicklei/go-restful/route_builder.go deleted file mode 100644 index 83db02b7c6..0000000000 --- a/vendor/github.com/emicklei/go-restful/route_builder.go +++ /dev/null @@ -1,310 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "fmt" - "os" - "reflect" - "runtime" - "strings" - "sync/atomic" - - "github.com/emicklei/go-restful/log" -) - -// RouteBuilder is a helper to construct Routes. -type RouteBuilder struct { - rootPath string - currentPath string - produces []string - consumes []string - httpMethod string // required - function RouteFunction // required - filters []FilterFunction - conditions []RouteSelectionConditionFunction - - typeNameHandleFunc TypeNameHandleFunction // required - - // documentation - doc string - notes string - operation string - readSample, writeSample interface{} - parameters []*Parameter - errorMap map[int]ResponseError - metadata map[string]interface{} -} - -// Do evaluates each argument with the RouteBuilder itself. -// This allows you to follow DRY principles without breaking the fluent programming style. -// Example: -// ws.Route(ws.DELETE("/{name}").To(t.deletePerson).Do(Returns200, Returns500)) -// -// func Returns500(b *RouteBuilder) { -// b.Returns(500, "Internal Server Error", restful.ServiceError{}) -// } -func (b *RouteBuilder) Do(oneArgBlocks ...func(*RouteBuilder)) *RouteBuilder { - for _, each := range oneArgBlocks { - each(b) - } - return b -} - -// To bind the route to a function. -// If this route is matched with the incoming Http Request then call this function with the *Request,*Response pair. Required. -func (b *RouteBuilder) To(function RouteFunction) *RouteBuilder { - b.function = function - return b -} - -// Method specifies what HTTP method to match. Required. -func (b *RouteBuilder) Method(method string) *RouteBuilder { - b.httpMethod = method - return b -} - -// Produces specifies what MIME types can be produced ; the matched one will appear in the Content-Type Http header. -func (b *RouteBuilder) Produces(mimeTypes ...string) *RouteBuilder { - b.produces = mimeTypes - return b -} - -// Consumes specifies what MIME types can be consumes ; the Accept Http header must matched any of these -func (b *RouteBuilder) Consumes(mimeTypes ...string) *RouteBuilder { - b.consumes = mimeTypes - return b -} - -// Path specifies the relative (w.r.t WebService root path) URL path to match. Default is "/". -func (b *RouteBuilder) Path(subPath string) *RouteBuilder { - b.currentPath = subPath - return b -} - -// Doc tells what this route is all about. Optional. -func (b *RouteBuilder) Doc(documentation string) *RouteBuilder { - b.doc = documentation - return b -} - -// Notes is a verbose explanation of the operation behavior. Optional. -func (b *RouteBuilder) Notes(notes string) *RouteBuilder { - b.notes = notes - return b -} - -// Reads tells what resource type will be read from the request payload. Optional. -// A parameter of type "body" is added ,required is set to true and the dataType is set to the qualified name of the sample's type. -func (b *RouteBuilder) Reads(sample interface{}) *RouteBuilder { - fn := b.typeNameHandleFunc - if fn == nil { - fn = reflectTypeName - } - typeAsName := fn(sample) - - b.readSample = sample - bodyParameter := &Parameter{&ParameterData{Name: "body"}} - bodyParameter.beBody() - bodyParameter.Required(true) - bodyParameter.DataType(typeAsName) - b.Param(bodyParameter) - return b -} - -// ParameterNamed returns a Parameter already known to the RouteBuilder. Returns nil if not. -// Use this to modify or extend information for the Parameter (through its Data()). -func (b RouteBuilder) ParameterNamed(name string) (p *Parameter) { - for _, each := range b.parameters { - if each.Data().Name == name { - return each - } - } - return p -} - -// Writes tells what resource type will be written as the response payload. Optional. -func (b *RouteBuilder) Writes(sample interface{}) *RouteBuilder { - b.writeSample = sample - return b -} - -// Param allows you to document the parameters of the Route. It adds a new Parameter (does not check for duplicates). -func (b *RouteBuilder) Param(parameter *Parameter) *RouteBuilder { - if b.parameters == nil { - b.parameters = []*Parameter{} - } - b.parameters = append(b.parameters, parameter) - return b -} - -// Operation allows you to document what the actual method/function call is of the Route. -// Unless called, the operation name is derived from the RouteFunction set using To(..). -func (b *RouteBuilder) Operation(name string) *RouteBuilder { - b.operation = name - return b -} - -// ReturnsError is deprecated, use Returns instead. -func (b *RouteBuilder) ReturnsError(code int, message string, model interface{}) *RouteBuilder { - log.Print("ReturnsError is deprecated, use Returns instead.") - return b.Returns(code, message, model) -} - -// Returns allows you to document what responses (errors or regular) can be expected. -// The model parameter is optional ; either pass a struct instance or use nil if not applicable. -func (b *RouteBuilder) Returns(code int, message string, model interface{}) *RouteBuilder { - err := ResponseError{ - Code: code, - Message: message, - Model: model, - IsDefault: false, - } - // lazy init because there is no NewRouteBuilder (yet) - if b.errorMap == nil { - b.errorMap = map[int]ResponseError{} - } - b.errorMap[code] = err - return b -} - -// DefaultReturns is a special Returns call that sets the default of the response ; the code is zero. -func (b *RouteBuilder) DefaultReturns(message string, model interface{}) *RouteBuilder { - b.Returns(0, message, model) - // Modify the ResponseError just added/updated - re := b.errorMap[0] - // errorMap is initialized - b.errorMap[0] = ResponseError{ - Code: re.Code, - Message: re.Message, - Model: re.Model, - IsDefault: true, - } - return b -} - -// Metadata adds or updates a key=value pair to the metadata map. -func (b *RouteBuilder) Metadata(key string, value interface{}) *RouteBuilder { - if b.metadata == nil { - b.metadata = map[string]interface{}{} - } - b.metadata[key] = value - return b -} - -// ResponseError represents a response; not necessarily an error. -type ResponseError struct { - Code int - Message string - Model interface{} - IsDefault bool -} - -func (b *RouteBuilder) servicePath(path string) *RouteBuilder { - b.rootPath = path - return b -} - -// Filter appends a FilterFunction to the end of filters for this Route to build. -func (b *RouteBuilder) Filter(filter FilterFunction) *RouteBuilder { - b.filters = append(b.filters, filter) - return b -} - -// If sets a condition function that controls matching the Route based on custom logic. -// The condition function is provided the HTTP request and should return true if the route -// should be considered. -// -// Efficiency note: the condition function is called before checking the method, produces, and -// consumes criteria, so that the correct HTTP status code can be returned. -// -// Lifecycle note: no filter functions have been called prior to calling the condition function, -// so the condition function should not depend on any context that might be set up by container -// or route filters. -func (b *RouteBuilder) If(condition RouteSelectionConditionFunction) *RouteBuilder { - b.conditions = append(b.conditions, condition) - return b -} - -// If no specific Route path then set to rootPath -// If no specific Produces then set to rootProduces -// If no specific Consumes then set to rootConsumes -func (b *RouteBuilder) copyDefaults(rootProduces, rootConsumes []string) { - if len(b.produces) == 0 { - b.produces = rootProduces - } - if len(b.consumes) == 0 { - b.consumes = rootConsumes - } -} - -// typeNameHandler sets the function that will convert types to strings in the parameter -// and model definitions. -func (b *RouteBuilder) typeNameHandler(handler TypeNameHandleFunction) *RouteBuilder { - b.typeNameHandleFunc = handler - return b -} - -// Build creates a new Route using the specification details collected by the RouteBuilder -func (b *RouteBuilder) Build() Route { - pathExpr, err := newPathExpression(b.currentPath) - if err != nil { - log.Printf("[restful] Invalid path:%s because:%v", b.currentPath, err) - os.Exit(1) - } - if b.function == nil { - log.Printf("[restful] No function specified for route:" + b.currentPath) - os.Exit(1) - } - operationName := b.operation - if len(operationName) == 0 && b.function != nil { - // extract from definition - operationName = nameOfFunction(b.function) - } - route := Route{ - Method: b.httpMethod, - Path: concatPath(b.rootPath, b.currentPath), - Produces: b.produces, - Consumes: b.consumes, - Function: b.function, - Filters: b.filters, - If: b.conditions, - relativePath: b.currentPath, - pathExpr: pathExpr, - Doc: b.doc, - Notes: b.notes, - Operation: operationName, - ParameterDocs: b.parameters, - ResponseErrors: b.errorMap, - ReadSample: b.readSample, - WriteSample: b.writeSample, - Metadata: b.metadata} - route.postBuild() - return route -} - -func concatPath(path1, path2 string) string { - return strings.TrimRight(path1, "/") + "/" + strings.TrimLeft(path2, "/") -} - -var anonymousFuncCount int32 - -// nameOfFunction returns the short name of the function f for documentation. -// It uses a runtime feature for debugging ; its value may change for later Go versions. -func nameOfFunction(f interface{}) string { - fun := runtime.FuncForPC(reflect.ValueOf(f).Pointer()) - tokenized := strings.Split(fun.Name(), ".") - last := tokenized[len(tokenized)-1] - last = strings.TrimSuffix(last, ")·fm") // < Go 1.5 - last = strings.TrimSuffix(last, ")-fm") // Go 1.5 - last = strings.TrimSuffix(last, "·fm") // < Go 1.5 - last = strings.TrimSuffix(last, "-fm") // Go 1.5 - if last == "func1" { // this could mean conflicts in API docs - val := atomic.AddInt32(&anonymousFuncCount, 1) - last = "func" + fmt.Sprintf("%d", val) - atomic.StoreInt32(&anonymousFuncCount, val) - } - return last -} diff --git a/vendor/github.com/emicklei/go-restful/route_builder_test.go b/vendor/github.com/emicklei/go-restful/route_builder_test.go deleted file mode 100644 index 25881d5eb8..0000000000 --- a/vendor/github.com/emicklei/go-restful/route_builder_test.go +++ /dev/null @@ -1,76 +0,0 @@ -package restful - -import ( - "testing" - "time" -) - -func TestRouteBuilder_PathParameter(t *testing.T) { - p := &Parameter{&ParameterData{Name: "name", Description: "desc"}} - p.AllowMultiple(true) - p.DataType("int") - p.Required(true) - values := map[string]string{"a": "b"} - p.AllowableValues(values) - p.bePath() - - b := new(RouteBuilder) - b.function = dummy - b.Param(p) - r := b.Build() - if !r.ParameterDocs[0].Data().AllowMultiple { - t.Error("AllowMultiple invalid") - } - if r.ParameterDocs[0].Data().DataType != "int" { - t.Error("dataType invalid") - } - if !r.ParameterDocs[0].Data().Required { - t.Error("required invalid") - } - if r.ParameterDocs[0].Data().Kind != PathParameterKind { - t.Error("kind invalid") - } - if r.ParameterDocs[0].Data().AllowableValues["a"] != "b" { - t.Error("allowableValues invalid") - } - if b.ParameterNamed("name") == nil { - t.Error("access to parameter failed") - } -} - -func TestRouteBuilder(t *testing.T) { - json := "application/json" - b := new(RouteBuilder) - b.To(dummy) - b.Path("/routes").Method("HEAD").Consumes(json).Produces(json).Metadata("test", "test-value").DefaultReturns("default", time.Now()) - r := b.Build() - if r.Path != "/routes" { - t.Error("path invalid") - } - if r.Produces[0] != json { - t.Error("produces invalid") - } - if r.Consumes[0] != json { - t.Error("consumes invalid") - } - if r.Operation != "dummy" { - t.Error("Operation not set") - } - if r.Metadata["test"] != "test-value" { - t.Errorf("Metadata not set") - } - if _, ok := r.ResponseErrors[0]; !ok { - t.Fatal("expected default response") - } -} - -func TestAnonymousFuncNaming(t *testing.T) { - f1 := func() {} - f2 := func() {} - if got, want := nameOfFunction(f1), "func1"; got != want { - t.Errorf("got %v want %v", got, want) - } - if got, want := nameOfFunction(f2), "func2"; got != want { - t.Errorf("got %v want %v", got, want) - } -} diff --git a/vendor/github.com/emicklei/go-restful/route_test.go b/vendor/github.com/emicklei/go-restful/route_test.go deleted file mode 100644 index 6a104aff8e..0000000000 --- a/vendor/github.com/emicklei/go-restful/route_test.go +++ /dev/null @@ -1,127 +0,0 @@ -package restful - -import ( - "testing" -) - -// accept should match produces -func TestMatchesAcceptPlainTextWhenProducePlainTextAsLast(t *testing.T) { - r := Route{Produces: []string{"application/json", "text/plain"}} - if !r.matchesAccept("text/plain") { - t.Errorf("accept should match text/plain") - } -} - -// accept should match produces -func TestMatchesAcceptStar(t *testing.T) { - r := Route{Produces: []string{"application/xml"}} - if !r.matchesAccept("*/*") { - t.Errorf("accept should match star") - } -} - -// accept should match produces -func TestMatchesAcceptIE(t *testing.T) { - r := Route{Produces: []string{"application/xml"}} - if !r.matchesAccept("text/html, application/xhtml+xml, */*") { - t.Errorf("accept should match star") - } -} - -// accept should match produces -func TestMatchesAcceptXml(t *testing.T) { - r := Route{Produces: []string{"application/xml"}} - if r.matchesAccept("application/json") { - t.Errorf("accept should not match json") - } - if !r.matchesAccept("application/xml") { - t.Errorf("accept should match xml") - } -} - -// accept should match produces -func TestMatchesAcceptAny(t *testing.T) { - r := Route{Produces: []string{"*/*"}} - if !r.matchesAccept("application/json") { - t.Errorf("accept should match json") - } - if !r.matchesAccept("application/xml") { - t.Errorf("accept should match xml") - } -} - -// content type should match consumes -func TestMatchesContentTypeXml(t *testing.T) { - r := Route{Consumes: []string{"application/xml"}} - if r.matchesContentType("application/json") { - t.Errorf("accept should not match json") - } - if !r.matchesContentType("application/xml") { - t.Errorf("accept should match xml") - } -} - -// content type should match consumes -func TestMatchesContentTypeCharsetInformation(t *testing.T) { - r := Route{Consumes: []string{"application/json"}} - if !r.matchesContentType("application/json; charset=UTF-8") { - t.Errorf("matchesContentType should ignore charset information") - } -} - -func TestMatchesPath_OneParam(t *testing.T) { - params := doExtractParams("/from/{source}", 2, "/from/here", t) - if params["source"] != "here" { - t.Errorf("parameter mismatch here") - } -} - -func TestMatchesPath_Slash(t *testing.T) { - params := doExtractParams("/", 0, "/", t) - if len(params) != 0 { - t.Errorf("expected empty parameters") - } -} - -func TestMatchesPath_SlashNonVar(t *testing.T) { - params := doExtractParams("/any", 1, "/any", t) - if len(params) != 0 { - t.Errorf("expected empty parameters") - } -} - -func TestMatchesPath_TwoVars(t *testing.T) { - params := doExtractParams("/from/{source}/to/{destination}", 4, "/from/AMS/to/NY", t) - if params["source"] != "AMS" { - t.Errorf("parameter mismatch AMS") - } -} - -func TestMatchesPath_VarOnFront(t *testing.T) { - params := doExtractParams("{what}/from/{source}/", 3, "who/from/SOS/", t) - if params["source"] != "SOS" { - t.Errorf("parameter mismatch SOS") - } -} - -func TestExtractParameters_EmptyValue(t *testing.T) { - params := doExtractParams("/fixed/{var}", 2, "/fixed/", t) - if params["var"] != "" { - t.Errorf("parameter mismatch var") - } -} - -func TestTokenizePath(t *testing.T) { - if len(tokenizePath("/")) != 0 { - t.Errorf("not empty path tokens") - } -} - -func doExtractParams(routePath string, size int, urlPath string, t *testing.T) map[string]string { - r := Route{Path: routePath} - r.postBuild() - if len(r.pathParts) != size { - t.Fatalf("len not %v %v, but %v", size, r.pathParts, len(r.pathParts)) - } - return r.extractParameters(urlPath) -} diff --git a/vendor/github.com/emicklei/go-restful/router.go b/vendor/github.com/emicklei/go-restful/router.go deleted file mode 100644 index 9b32fb6753..0000000000 --- a/vendor/github.com/emicklei/go-restful/router.go +++ /dev/null @@ -1,18 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import "net/http" - -// A RouteSelector finds the best matching Route given the input HTTP Request -type RouteSelector interface { - - // SelectRoute finds a Route given the input HTTP Request and a list of WebServices. - // It returns a selected Route and its containing WebService or an error indicating - // a problem. - SelectRoute( - webServices []*WebService, - httpRequest *http.Request) (selectedService *WebService, selected *Route, err error) -} diff --git a/vendor/github.com/emicklei/go-restful/service_error.go b/vendor/github.com/emicklei/go-restful/service_error.go deleted file mode 100644 index 62d1108bbd..0000000000 --- a/vendor/github.com/emicklei/go-restful/service_error.go +++ /dev/null @@ -1,23 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import "fmt" - -// ServiceError is a transport object to pass information about a non-Http error occurred in a WebService while processing a request. -type ServiceError struct { - Code int - Message string -} - -// NewError returns a ServiceError using the code and reason -func NewError(code int, message string) ServiceError { - return ServiceError{Code: code, Message: message} -} - -// Error returns a text representation of the service error -func (s ServiceError) Error() string { - return fmt.Sprintf("[ServiceError:%v] %v", s.Code, s.Message) -} diff --git a/vendor/github.com/emicklei/go-restful/tracer_test.go b/vendor/github.com/emicklei/go-restful/tracer_test.go deleted file mode 100644 index 60c1e9fc09..0000000000 --- a/vendor/github.com/emicklei/go-restful/tracer_test.go +++ /dev/null @@ -1,18 +0,0 @@ -package restful - -import "testing" - -// Use like this: -// -// TraceLogger(testLogger{t}) -type testLogger struct { - t *testing.T -} - -func (l testLogger) Print(v ...interface{}) { - l.t.Log(v...) -} - -func (l testLogger) Printf(format string, v ...interface{}) { - l.t.Logf(format, v...) -} diff --git a/vendor/github.com/emicklei/go-restful/web_service.go b/vendor/github.com/emicklei/go-restful/web_service.go deleted file mode 100644 index 094c0a02ab..0000000000 --- a/vendor/github.com/emicklei/go-restful/web_service.go +++ /dev/null @@ -1,290 +0,0 @@ -package restful - -import ( - "errors" - "os" - "reflect" - "sync" - - "github.com/emicklei/go-restful/log" -) - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -// WebService holds a collection of Route values that bind a Http Method + URL Path to a function. -type WebService struct { - rootPath string - pathExpr *pathExpression // cached compilation of rootPath as RegExp - routes []Route - produces []string - consumes []string - pathParameters []*Parameter - filters []FilterFunction - documentation string - apiVersion string - - typeNameHandleFunc TypeNameHandleFunction - - dynamicRoutes bool - - // protects 'routes' if dynamic routes are enabled - routesLock sync.RWMutex -} - -func (w *WebService) SetDynamicRoutes(enable bool) { - w.dynamicRoutes = enable -} - -// TypeNameHandleFunction declares functions that can handle translating the name of a sample object -// into the restful documentation for the service. -type TypeNameHandleFunction func(sample interface{}) string - -// TypeNameHandler sets the function that will convert types to strings in the parameter -// and model definitions. If not set, the web service will invoke -// reflect.TypeOf(object).String(). -func (w *WebService) TypeNameHandler(handler TypeNameHandleFunction) *WebService { - w.typeNameHandleFunc = handler - return w -} - -// reflectTypeName is the default TypeNameHandleFunction and for a given object -// returns the name that Go identifies it with (e.g. "string" or "v1.Object") via -// the reflection API. -func reflectTypeName(sample interface{}) string { - return reflect.TypeOf(sample).String() -} - -// compilePathExpression ensures that the path is compiled into a RegEx for those routers that need it. -func (w *WebService) compilePathExpression() { - compiled, err := newPathExpression(w.rootPath) - if err != nil { - log.Printf("[restful] invalid path:%s because:%v", w.rootPath, err) - os.Exit(1) - } - w.pathExpr = compiled -} - -// ApiVersion sets the API version for documentation purposes. -func (w *WebService) ApiVersion(apiVersion string) *WebService { - w.apiVersion = apiVersion - return w -} - -// Version returns the API version for documentation purposes. -func (w *WebService) Version() string { return w.apiVersion } - -// Path specifies the root URL template path of the WebService. -// All Routes will be relative to this path. -func (w *WebService) Path(root string) *WebService { - w.rootPath = root - if len(w.rootPath) == 0 { - w.rootPath = "/" - } - w.compilePathExpression() - return w -} - -// Param adds a PathParameter to document parameters used in the root path. -func (w *WebService) Param(parameter *Parameter) *WebService { - if w.pathParameters == nil { - w.pathParameters = []*Parameter{} - } - w.pathParameters = append(w.pathParameters, parameter) - return w -} - -// PathParameter creates a new Parameter of kind Path for documentation purposes. -// It is initialized as required with string as its DataType. -func (w *WebService) PathParameter(name, description string) *Parameter { - return PathParameter(name, description) -} - -// PathParameter creates a new Parameter of kind Path for documentation purposes. -// It is initialized as required with string as its DataType. -func PathParameter(name, description string) *Parameter { - p := &Parameter{&ParameterData{Name: name, Description: description, Required: true, DataType: "string"}} - p.bePath() - return p -} - -// QueryParameter creates a new Parameter of kind Query for documentation purposes. -// It is initialized as not required with string as its DataType. -func (w *WebService) QueryParameter(name, description string) *Parameter { - return QueryParameter(name, description) -} - -// QueryParameter creates a new Parameter of kind Query for documentation purposes. -// It is initialized as not required with string as its DataType. -func QueryParameter(name, description string) *Parameter { - p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}} - p.beQuery() - return p -} - -// BodyParameter creates a new Parameter of kind Body for documentation purposes. -// It is initialized as required without a DataType. -func (w *WebService) BodyParameter(name, description string) *Parameter { - return BodyParameter(name, description) -} - -// BodyParameter creates a new Parameter of kind Body for documentation purposes. -// It is initialized as required without a DataType. -func BodyParameter(name, description string) *Parameter { - p := &Parameter{&ParameterData{Name: name, Description: description, Required: true}} - p.beBody() - return p -} - -// HeaderParameter creates a new Parameter of kind (Http) Header for documentation purposes. -// It is initialized as not required with string as its DataType. -func (w *WebService) HeaderParameter(name, description string) *Parameter { - return HeaderParameter(name, description) -} - -// HeaderParameter creates a new Parameter of kind (Http) Header for documentation purposes. -// It is initialized as not required with string as its DataType. -func HeaderParameter(name, description string) *Parameter { - p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}} - p.beHeader() - return p -} - -// FormParameter creates a new Parameter of kind Form (using application/x-www-form-urlencoded) for documentation purposes. -// It is initialized as required with string as its DataType. -func (w *WebService) FormParameter(name, description string) *Parameter { - return FormParameter(name, description) -} - -// FormParameter creates a new Parameter of kind Form (using application/x-www-form-urlencoded) for documentation purposes. -// It is initialized as required with string as its DataType. -func FormParameter(name, description string) *Parameter { - p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}} - p.beForm() - return p -} - -// Route creates a new Route using the RouteBuilder and add to the ordered list of Routes. -func (w *WebService) Route(builder *RouteBuilder) *WebService { - w.routesLock.Lock() - defer w.routesLock.Unlock() - builder.copyDefaults(w.produces, w.consumes) - w.routes = append(w.routes, builder.Build()) - return w -} - -// RemoveRoute removes the specified route, looks for something that matches 'path' and 'method' -func (w *WebService) RemoveRoute(path, method string) error { - if !w.dynamicRoutes { - return errors.New("dynamic routes are not enabled.") - } - w.routesLock.Lock() - defer w.routesLock.Unlock() - newRoutes := make([]Route, (len(w.routes) - 1)) - current := 0 - for ix := range w.routes { - if w.routes[ix].Method == method && w.routes[ix].Path == path { - continue - } - newRoutes[current] = w.routes[ix] - current = current + 1 - } - w.routes = newRoutes - return nil -} - -// Method creates a new RouteBuilder and initialize its http method -func (w *WebService) Method(httpMethod string) *RouteBuilder { - return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method(httpMethod) -} - -// Produces specifies that this WebService can produce one or more MIME types. -// Http requests must have one of these values set for the Accept header. -func (w *WebService) Produces(contentTypes ...string) *WebService { - w.produces = contentTypes - return w -} - -// Consumes specifies that this WebService can consume one or more MIME types. -// Http requests must have one of these values set for the Content-Type header. -func (w *WebService) Consumes(accepts ...string) *WebService { - w.consumes = accepts - return w -} - -// Routes returns the Routes associated with this WebService -func (w *WebService) Routes() []Route { - if !w.dynamicRoutes { - return w.routes - } - // Make a copy of the array to prevent concurrency problems - w.routesLock.RLock() - defer w.routesLock.RUnlock() - result := make([]Route, len(w.routes)) - for ix := range w.routes { - result[ix] = w.routes[ix] - } - return result -} - -// RootPath returns the RootPath associated with this WebService. Default "/" -func (w *WebService) RootPath() string { - return w.rootPath -} - -// PathParameters return the path parameter names for (shared among its Routes) -func (w *WebService) PathParameters() []*Parameter { - return w.pathParameters -} - -// Filter adds a filter function to the chain of filters applicable to all its Routes -func (w *WebService) Filter(filter FilterFunction) *WebService { - w.filters = append(w.filters, filter) - return w -} - -// Doc is used to set the documentation of this service. -func (w *WebService) Doc(plainText string) *WebService { - w.documentation = plainText - return w -} - -// Documentation returns it. -func (w *WebService) Documentation() string { - return w.documentation -} - -/* - Convenience methods -*/ - -// HEAD is a shortcut for .Method("HEAD").Path(subPath) -func (w *WebService) HEAD(subPath string) *RouteBuilder { - return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("HEAD").Path(subPath) -} - -// GET is a shortcut for .Method("GET").Path(subPath) -func (w *WebService) GET(subPath string) *RouteBuilder { - return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("GET").Path(subPath) -} - -// POST is a shortcut for .Method("POST").Path(subPath) -func (w *WebService) POST(subPath string) *RouteBuilder { - return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("POST").Path(subPath) -} - -// PUT is a shortcut for .Method("PUT").Path(subPath) -func (w *WebService) PUT(subPath string) *RouteBuilder { - return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("PUT").Path(subPath) -} - -// PATCH is a shortcut for .Method("PATCH").Path(subPath) -func (w *WebService) PATCH(subPath string) *RouteBuilder { - return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("PATCH").Path(subPath) -} - -// DELETE is a shortcut for .Method("DELETE").Path(subPath) -func (w *WebService) DELETE(subPath string) *RouteBuilder { - return new(RouteBuilder).typeNameHandler(w.typeNameHandleFunc).servicePath(w.rootPath).Method("DELETE").Path(subPath) -} diff --git a/vendor/github.com/emicklei/go-restful/web_service_container.go b/vendor/github.com/emicklei/go-restful/web_service_container.go deleted file mode 100644 index c9d31b06c4..0000000000 --- a/vendor/github.com/emicklei/go-restful/web_service_container.go +++ /dev/null @@ -1,39 +0,0 @@ -package restful - -// Copyright 2013 Ernest Micklei. All rights reserved. -// Use of this source code is governed by a license -// that can be found in the LICENSE file. - -import ( - "net/http" -) - -// DefaultContainer is a restful.Container that uses http.DefaultServeMux -var DefaultContainer *Container - -func init() { - DefaultContainer = NewContainer() - DefaultContainer.ServeMux = http.DefaultServeMux -} - -// If set the true then panics will not be caught to return HTTP 500. -// In that case, Route functions are responsible for handling any error situation. -// Default value is false = recover from panics. This has performance implications. -// OBSOLETE ; use restful.DefaultContainer.DoNotRecover(true) -var DoNotRecover = false - -// Add registers a new WebService add it to the DefaultContainer. -func Add(service *WebService) { - DefaultContainer.Add(service) -} - -// Filter appends a container FilterFunction from the DefaultContainer. -// These are called before dispatching a http.Request to a WebService. -func Filter(filter FilterFunction) { - DefaultContainer.Filter(filter) -} - -// RegisteredWebServices returns the collections of WebServices from the DefaultContainer -func RegisteredWebServices() []*WebService { - return DefaultContainer.RegisteredWebServices() -} diff --git a/vendor/github.com/emicklei/go-restful/web_service_test.go b/vendor/github.com/emicklei/go-restful/web_service_test.go deleted file mode 100644 index 734938134f..0000000000 --- a/vendor/github.com/emicklei/go-restful/web_service_test.go +++ /dev/null @@ -1,343 +0,0 @@ -package restful - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -const ( - pathGetFriends = "/get/{userId}/friends" -) - -func TestParameter(t *testing.T) { - p := &Parameter{&ParameterData{Name: "name", Description: "desc"}} - p.AllowMultiple(true) - p.DataType("int") - p.Required(true) - values := map[string]string{"a": "b"} - p.AllowableValues(values) - p.bePath() - - ws := new(WebService) - ws.Param(p) - if ws.pathParameters[0].Data().Name != "name" { - t.Error("path parameter (or name) invalid") - } -} -func TestWebService_CanCreateParameterKinds(t *testing.T) { - ws := new(WebService) - if ws.BodyParameter("b", "b").Kind() != BodyParameterKind { - t.Error("body parameter expected") - } - if ws.PathParameter("p", "p").Kind() != PathParameterKind { - t.Error("path parameter expected") - } - if ws.QueryParameter("q", "q").Kind() != QueryParameterKind { - t.Error("query parameter expected") - } -} - -func TestCapturePanic(t *testing.T) { - tearDown() - Add(newPanicingService()) - httpRequest, _ := http.NewRequest("GET", "http://here.com/fire", nil) - httpRequest.Header.Set("Accept", "*/*") - httpWriter := httptest.NewRecorder() - // override the default here - DefaultContainer.DoNotRecover(false) - DefaultContainer.dispatch(httpWriter, httpRequest) - if 500 != httpWriter.Code { - t.Error("500 expected on fire") - } -} - -func TestCapturePanicWithEncoded(t *testing.T) { - tearDown() - Add(newPanicingService()) - DefaultContainer.EnableContentEncoding(true) - httpRequest, _ := http.NewRequest("GET", "http://here.com/fire", nil) - httpRequest.Header.Set("Accept", "*/*") - httpRequest.Header.Set("Accept-Encoding", "gzip") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 500 != httpWriter.Code { - t.Error("500 expected on fire, got", httpWriter.Code) - } -} - -func TestNotFound(t *testing.T) { - tearDown() - httpRequest, _ := http.NewRequest("GET", "http://here.com/missing", nil) - httpRequest.Header.Set("Accept", "*/*") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 404 != httpWriter.Code { - t.Error("404 expected on missing") - } -} - -func TestMethodNotAllowed(t *testing.T) { - tearDown() - Add(newGetOnlyService()) - httpRequest, _ := http.NewRequest("POST", "http://here.com/get", nil) - httpRequest.Header.Set("Accept", "*/*") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 405 != httpWriter.Code { - t.Error("405 expected method not allowed") - } -} - -func TestSelectedRoutePath_Issue100(t *testing.T) { - tearDown() - Add(newSelectedRouteTestingService()) - httpRequest, _ := http.NewRequest("GET", "http://here.com/get/232452/friends", nil) - httpRequest.Header.Set("Accept", "*/*") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if http.StatusOK != httpWriter.Code { - t.Error(http.StatusOK, "expected,", httpWriter.Code, "received.") - } -} - -func TestContentType415_Issue170(t *testing.T) { - tearDown() - Add(newGetOnlyJsonOnlyService()) - httpRequest, _ := http.NewRequest("GET", "http://here.com/get", nil) - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 200 != httpWriter.Code { - t.Errorf("Expected 200, got %d", httpWriter.Code) - } -} - -func TestNoContentTypePOST(t *testing.T) { - tearDown() - Add(newPostNoConsumesService()) - httpRequest, _ := http.NewRequest("POST", "http://here.com/post", nil) - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 204 != httpWriter.Code { - t.Errorf("Expected 204, got %d", httpWriter.Code) - } -} - -func TestContentType415_POST_Issue170(t *testing.T) { - tearDown() - Add(newPostOnlyJsonOnlyService()) - httpRequest, _ := http.NewRequest("POST", "http://here.com/post", nil) - httpRequest.Header.Set("Content-Type", "application/json") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 200 != httpWriter.Code { - t.Errorf("Expected 200, got %d", httpWriter.Code) - } -} - -// go test -v -test.run TestContentType406PlainJson ...restful -func TestContentType406PlainJson(t *testing.T) { - tearDown() - TraceLogger(testLogger{t}) - Add(newGetPlainTextOrJsonService()) - httpRequest, _ := http.NewRequest("GET", "http://here.com/get", nil) - httpRequest.Header.Set("Accept", "text/plain") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 200; got != want { - t.Errorf("got %v, want %v", got, want) - } -} - -func TestRemoveRoute(t *testing.T) { - tearDown() - TraceLogger(testLogger{t}) - ws := newGetPlainTextOrJsonService() - Add(ws) - httpRequest, _ := http.NewRequest("GET", "http://here.com/get", nil) - httpRequest.Header.Set("Accept", "text/plain") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 200; got != want { - t.Errorf("got %v, want %v", got, want) - } - - // dynamic apis are disabled, should error and do nothing - if err := ws.RemoveRoute("/get", "GET"); err == nil { - t.Error("unexpected non-error") - } - - httpWriter = httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 200; got != want { - t.Errorf("got %v, want %v", got, want) - } - - ws.SetDynamicRoutes(true) - if err := ws.RemoveRoute("/get", "GET"); err != nil { - t.Errorf("unexpected error %v", err) - } - - httpWriter = httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 404; got != want { - t.Errorf("got %v, want %v", got, want) - } -} -func TestRemoveLastRoute(t *testing.T) { - tearDown() - TraceLogger(testLogger{t}) - ws := newGetPlainTextOrJsonServiceMultiRoute() - Add(ws) - httpRequest, _ := http.NewRequest("GET", "http://here.com/get", nil) - httpRequest.Header.Set("Accept", "text/plain") - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 200; got != want { - t.Errorf("got %v, want %v", got, want) - } - - // dynamic apis are disabled, should error and do nothing - if err := ws.RemoveRoute("/get", "GET"); err == nil { - t.Error("unexpected non-error") - } - - httpWriter = httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 200; got != want { - t.Errorf("got %v, want %v", got, want) - } - - ws.SetDynamicRoutes(true) - if err := ws.RemoveRoute("/get", "GET"); err != nil { - t.Errorf("unexpected error %v", err) - } - - httpWriter = httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if got, want := httpWriter.Code, 404; got != want { - t.Errorf("got %v, want %v", got, want) - } -} - -// go test -v -test.run TestContentTypeOctet_Issue170 ...restful -func TestContentTypeOctet_Issue170(t *testing.T) { - tearDown() - Add(newGetConsumingOctetStreamService()) - // with content-type - httpRequest, _ := http.NewRequest("GET", "http://here.com/get", nil) - httpRequest.Header.Set("Content-Type", MIME_OCTET) - httpWriter := httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 200 != httpWriter.Code { - t.Errorf("Expected 200, got %d", httpWriter.Code) - } - // without content-type - httpRequest, _ = http.NewRequest("GET", "http://here.com/get", nil) - httpWriter = httptest.NewRecorder() - DefaultContainer.dispatch(httpWriter, httpRequest) - if 200 != httpWriter.Code { - t.Errorf("Expected 200, got %d", httpWriter.Code) - } -} - -type exampleBody struct{} - -func TestParameterDataTypeDefaults(t *testing.T) { - tearDown() - ws := new(WebService) - route := ws.POST("/post").Reads(&exampleBody{}) - if route.parameters[0].data.DataType != "*restful.exampleBody" { - t.Errorf("body parameter incorrect name: %#v", route.parameters[0].data) - } -} - -func TestParameterDataTypeCustomization(t *testing.T) { - tearDown() - ws := new(WebService) - ws.TypeNameHandler(func(sample interface{}) string { - return "my.custom.type.name" - }) - route := ws.POST("/post").Reads(&exampleBody{}) - if route.parameters[0].data.DataType != "my.custom.type.name" { - t.Errorf("body parameter incorrect name: %#v", route.parameters[0].data) - } -} - -func newPanicingService() *WebService { - ws := new(WebService).Path("") - ws.Route(ws.GET("/fire").To(doPanic)) - return ws -} - -func newGetOnlyService() *WebService { - ws := new(WebService).Path("") - ws.Route(ws.GET("/get").To(doPanic)) - return ws -} - -func newPostOnlyJsonOnlyService() *WebService { - ws := new(WebService).Path("") - ws.Consumes("application/json") - ws.Route(ws.POST("/post").To(doNothing)) - return ws -} - -func newGetOnlyJsonOnlyService() *WebService { - ws := new(WebService).Path("") - ws.Consumes("application/json") - ws.Route(ws.GET("/get").To(doNothing)) - return ws -} - -func newGetPlainTextOrJsonService() *WebService { - ws := new(WebService).Path("") - ws.Produces("text/plain", "application/json") - ws.Route(ws.GET("/get").To(doNothing)) - return ws -} - -func newGetPlainTextOrJsonServiceMultiRoute() *WebService { - ws := new(WebService).Path("") - ws.Produces("text/plain", "application/json") - ws.Route(ws.GET("/get").To(doNothing)) - ws.Route(ws.GET("/status").To(doNothing)) - return ws -} - -func newGetConsumingOctetStreamService() *WebService { - ws := new(WebService).Path("") - ws.Consumes("application/octet-stream") - ws.Route(ws.GET("/get").To(doNothing)) - return ws -} - -func newPostNoConsumesService() *WebService { - ws := new(WebService).Path("") - ws.Route(ws.POST("/post").To(return204)) - return ws -} - -func newSelectedRouteTestingService() *WebService { - ws := new(WebService).Path("") - ws.Route(ws.GET(pathGetFriends).To(selectedRouteChecker)) - return ws -} - -func selectedRouteChecker(req *Request, resp *Response) { - if req.SelectedRoutePath() != pathGetFriends { - resp.InternalServerError() - } -} - -func doPanic(req *Request, resp *Response) { - println("lightning...") - panic("fire") -} - -func doNothing(req *Request, resp *Response) { -} - -func return204(req *Request, resp *Response) { - resp.WriteHeader(204) -} diff --git a/vendor/github.com/go-openapi/jsonpointer/.gitignore b/vendor/github.com/go-openapi/jsonpointer/.gitignore deleted file mode 100644 index 769c244007..0000000000 --- a/vendor/github.com/go-openapi/jsonpointer/.gitignore +++ /dev/null @@ -1 +0,0 @@ -secrets.yml diff --git a/vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md deleted file mode 100644 index 9322b065e3..0000000000 --- a/vendor/github.com/go-openapi/jsonpointer/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +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, gender identity and expression, level of experience, -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 ivan+abuse@flanders.co.nz. 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 [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/go-openapi/jsonpointer/LICENSE b/vendor/github.com/go-openapi/jsonpointer/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/vendor/github.com/go-openapi/jsonpointer/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/go-openapi/jsonpointer/README.md b/vendor/github.com/go-openapi/jsonpointer/README.md deleted file mode 100644 index 813788aff1..0000000000 --- a/vendor/github.com/go-openapi/jsonpointer/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# gojsonpointer [![Build Status](https://travis-ci.org/go-openapi/jsonpointer.svg?branch=master)](https://travis-ci.org/go-openapi/jsonpointer) [![codecov](https://codecov.io/gh/go-openapi/jsonpointer/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonpointer) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) - -[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonpointer/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/jsonpointer?status.svg)](http://godoc.org/github.com/go-openapi/jsonpointer) -An implementation of JSON Pointer - Go language - -## Status -Completed YES - -Tested YES - -## References -http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 - -### Note -The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array, the reference token MUST contain either...' is not implemented. diff --git a/vendor/github.com/go-openapi/jsonpointer/pointer.go b/vendor/github.com/go-openapi/jsonpointer/pointer.go deleted file mode 100644 index fe2d6ee574..0000000000 --- a/vendor/github.com/go-openapi/jsonpointer/pointer.go +++ /dev/null @@ -1,390 +0,0 @@ -// Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// author sigu-399 -// author-github https://github.com/sigu-399 -// author-mail sigu.399@gmail.com -// -// repository-name jsonpointer -// repository-desc An implementation of JSON Pointer - Go language -// -// description Main and unique file. -// -// created 25-02-2013 - -package jsonpointer - -import ( - "errors" - "fmt" - "reflect" - "strconv" - "strings" - - "github.com/go-openapi/swag" -) - -const ( - emptyPointer = `` - pointerSeparator = `/` - - invalidStart = `JSON pointer must be empty or start with a "` + pointerSeparator -) - -var jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem() -var jsonSetableType = reflect.TypeOf(new(JSONSetable)).Elem() - -// JSONPointable is an interface for structs to implement when they need to customize the -// json pointer process -type JSONPointable interface { - JSONLookup(string) (interface{}, error) -} - -// JSONSetable is an interface for structs to implement when they need to customize the -// json pointer process -type JSONSetable interface { - JSONSet(string, interface{}) error -} - -// New creates a new json pointer for the given string -func New(jsonPointerString string) (Pointer, error) { - - var p Pointer - err := p.parse(jsonPointerString) - return p, err - -} - -// Pointer the json pointer reprsentation -type Pointer struct { - referenceTokens []string -} - -// "Constructor", parses the given string JSON pointer -func (p *Pointer) parse(jsonPointerString string) error { - - var err error - - if jsonPointerString != emptyPointer { - if !strings.HasPrefix(jsonPointerString, pointerSeparator) { - err = errors.New(invalidStart) - } else { - referenceTokens := strings.Split(jsonPointerString, pointerSeparator) - for _, referenceToken := range referenceTokens[1:] { - p.referenceTokens = append(p.referenceTokens, referenceToken) - } - } - } - - return err -} - -// Get uses the pointer to retrieve a value from a JSON document -func (p *Pointer) Get(document interface{}) (interface{}, reflect.Kind, error) { - return p.get(document, swag.DefaultJSONNameProvider) -} - -// Set uses the pointer to set a value from a JSON document -func (p *Pointer) Set(document interface{}, value interface{}) (interface{}, error) { - return document, p.set(document, value, swag.DefaultJSONNameProvider) -} - -// GetForToken gets a value for a json pointer token 1 level deep -func GetForToken(document interface{}, decodedToken string) (interface{}, reflect.Kind, error) { - return getSingleImpl(document, decodedToken, swag.DefaultJSONNameProvider) -} - -// SetForToken gets a value for a json pointer token 1 level deep -func SetForToken(document interface{}, decodedToken string, value interface{}) (interface{}, error) { - return document, setSingleImpl(document, value, decodedToken, swag.DefaultJSONNameProvider) -} - -func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) { - rValue := reflect.Indirect(reflect.ValueOf(node)) - kind := rValue.Kind() - - switch kind { - - case reflect.Struct: - if rValue.Type().Implements(jsonPointableType) { - r, err := node.(JSONPointable).JSONLookup(decodedToken) - if err != nil { - return nil, kind, err - } - return r, kind, nil - } - nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) - if !ok { - return nil, kind, fmt.Errorf("object has no field %q", decodedToken) - } - fld := rValue.FieldByName(nm) - return fld.Interface(), kind, nil - - case reflect.Map: - kv := reflect.ValueOf(decodedToken) - mv := rValue.MapIndex(kv) - - if mv.IsValid() && !swag.IsZero(mv) { - return mv.Interface(), kind, nil - } - return nil, kind, fmt.Errorf("object has no key %q", decodedToken) - - case reflect.Slice: - tokenIndex, err := strconv.Atoi(decodedToken) - if err != nil { - return nil, kind, err - } - sLength := rValue.Len() - if tokenIndex < 0 || tokenIndex >= sLength { - return nil, kind, fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength-1, tokenIndex) - } - - elem := rValue.Index(tokenIndex) - return elem.Interface(), kind, nil - - default: - return nil, kind, fmt.Errorf("invalid token reference %q", decodedToken) - } - -} - -func setSingleImpl(node, data interface{}, decodedToken string, nameProvider *swag.NameProvider) error { - rValue := reflect.Indirect(reflect.ValueOf(node)) - switch rValue.Kind() { - - case reflect.Struct: - if ns, ok := node.(JSONSetable); ok { // pointer impl - return ns.JSONSet(decodedToken, data) - } - - if rValue.Type().Implements(jsonSetableType) { - return node.(JSONSetable).JSONSet(decodedToken, data) - } - - nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) - if !ok { - return fmt.Errorf("object has no field %q", decodedToken) - } - fld := rValue.FieldByName(nm) - if fld.IsValid() { - fld.Set(reflect.ValueOf(data)) - } - return nil - - case reflect.Map: - kv := reflect.ValueOf(decodedToken) - rValue.SetMapIndex(kv, reflect.ValueOf(data)) - return nil - - case reflect.Slice: - tokenIndex, err := strconv.Atoi(decodedToken) - if err != nil { - return err - } - sLength := rValue.Len() - if tokenIndex < 0 || tokenIndex >= sLength { - return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex) - } - - elem := rValue.Index(tokenIndex) - if !elem.CanSet() { - return fmt.Errorf("can't set slice index %s to %v", decodedToken, data) - } - elem.Set(reflect.ValueOf(data)) - return nil - - default: - return fmt.Errorf("invalid token reference %q", decodedToken) - } - -} - -func (p *Pointer) get(node interface{}, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) { - - if nameProvider == nil { - nameProvider = swag.DefaultJSONNameProvider - } - - kind := reflect.Invalid - - // Full document when empty - if len(p.referenceTokens) == 0 { - return node, kind, nil - } - - for _, token := range p.referenceTokens { - - decodedToken := Unescape(token) - - r, knd, err := getSingleImpl(node, decodedToken, nameProvider) - if err != nil { - return nil, knd, err - } - node, kind = r, knd - - } - - rValue := reflect.ValueOf(node) - kind = rValue.Kind() - - return node, kind, nil -} - -func (p *Pointer) set(node, data interface{}, nameProvider *swag.NameProvider) error { - knd := reflect.ValueOf(node).Kind() - - if knd != reflect.Ptr && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array { - return fmt.Errorf("only structs, pointers, maps and slices are supported for setting values") - } - - if nameProvider == nil { - nameProvider = swag.DefaultJSONNameProvider - } - - // Full document when empty - if len(p.referenceTokens) == 0 { - return nil - } - - lastI := len(p.referenceTokens) - 1 - for i, token := range p.referenceTokens { - isLastToken := i == lastI - decodedToken := Unescape(token) - - if isLastToken { - - return setSingleImpl(node, data, decodedToken, nameProvider) - } - - rValue := reflect.Indirect(reflect.ValueOf(node)) - kind := rValue.Kind() - - switch kind { - - case reflect.Struct: - if rValue.Type().Implements(jsonPointableType) { - r, err := node.(JSONPointable).JSONLookup(decodedToken) - if err != nil { - return err - } - fld := reflect.ValueOf(r) - if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { - node = fld.Addr().Interface() - continue - } - node = r - continue - } - nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) - if !ok { - return fmt.Errorf("object has no field %q", decodedToken) - } - fld := rValue.FieldByName(nm) - if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { - node = fld.Addr().Interface() - continue - } - node = fld.Interface() - - case reflect.Map: - kv := reflect.ValueOf(decodedToken) - mv := rValue.MapIndex(kv) - - if !mv.IsValid() { - return fmt.Errorf("object has no key %q", decodedToken) - } - if mv.CanAddr() && mv.Kind() != reflect.Interface && mv.Kind() != reflect.Map && mv.Kind() != reflect.Slice && mv.Kind() != reflect.Ptr { - node = mv.Addr().Interface() - continue - } - node = mv.Interface() - - case reflect.Slice: - tokenIndex, err := strconv.Atoi(decodedToken) - if err != nil { - return err - } - sLength := rValue.Len() - if tokenIndex < 0 || tokenIndex >= sLength { - return fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex) - } - - elem := rValue.Index(tokenIndex) - if elem.CanAddr() && elem.Kind() != reflect.Interface && elem.Kind() != reflect.Map && elem.Kind() != reflect.Slice && elem.Kind() != reflect.Ptr { - node = elem.Addr().Interface() - continue - } - node = elem.Interface() - - default: - return fmt.Errorf("invalid token reference %q", decodedToken) - } - - } - - return nil -} - -// DecodedTokens returns the decoded tokens -func (p *Pointer) DecodedTokens() []string { - result := make([]string, 0, len(p.referenceTokens)) - for _, t := range p.referenceTokens { - result = append(result, Unescape(t)) - } - return result -} - -// IsEmpty returns true if this is an empty json pointer -// this indicates that it points to the root document -func (p *Pointer) IsEmpty() bool { - return len(p.referenceTokens) == 0 -} - -// Pointer to string representation function -func (p *Pointer) String() string { - - if len(p.referenceTokens) == 0 { - return emptyPointer - } - - pointerString := pointerSeparator + strings.Join(p.referenceTokens, pointerSeparator) - - return pointerString -} - -// Specific JSON pointer encoding here -// ~0 => ~ -// ~1 => / -// ... and vice versa - -const ( - encRefTok0 = `~0` - encRefTok1 = `~1` - decRefTok0 = `~` - decRefTok1 = `/` -) - -// Unescape unescapes a json pointer reference token string to the original representation -func Unescape(token string) string { - step1 := strings.Replace(token, encRefTok1, decRefTok1, -1) - step2 := strings.Replace(step1, encRefTok0, decRefTok0, -1) - return step2 -} - -// Escape escapes a pointer reference token string -func Escape(token string) string { - step1 := strings.Replace(token, decRefTok0, encRefTok0, -1) - step2 := strings.Replace(step1, decRefTok1, encRefTok1, -1) - return step2 -} diff --git a/vendor/github.com/go-openapi/jsonpointer/pointer_test.go b/vendor/github.com/go-openapi/jsonpointer/pointer_test.go deleted file mode 100644 index eabd586036..0000000000 --- a/vendor/github.com/go-openapi/jsonpointer/pointer_test.go +++ /dev/null @@ -1,573 +0,0 @@ -// Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// author sigu-399 -// author-github https://github.com/sigu-399 -// author-mail sigu.399@gmail.com -// -// repository-name jsonpointer -// repository-desc An implementation of JSON Pointer - Go language -// -// description Automated tests on package. -// -// created 03-03-2013 - -package jsonpointer - -import ( - "encoding/json" - "fmt" - "strconv" - "testing" - - "github.com/stretchr/testify/assert" -) - -const ( - TestDocumentNBItems = 11 - TestNodeObjNBItems = 4 - TestDocumentString = `{ -"foo": ["bar", "baz"], -"obj": { "a":1, "b":2, "c":[3,4], "d":[ {"e":9}, {"f":[50,51]} ] }, -"": 0, -"a/b": 1, -"c%d": 2, -"e^f": 3, -"g|h": 4, -"i\\j": 5, -"k\"l": 6, -" ": 7, -"m~n": 8 -}` -) - -var testDocumentJSON interface{} - -type testStructJSON struct { - Foo []string `json:"foo"` - Obj struct { - A int `json:"a"` - B int `json:"b"` - C []int `json:"c"` - D []struct { - E int `json:"e"` - F []int `json:"f"` - } `json:"d"` - } `json:"obj"` -} - -type aliasedMap map[string]interface{} - -var testStructJSONDoc testStructJSON -var testStructJSONPtr *testStructJSON - -func init() { - json.Unmarshal([]byte(TestDocumentString), &testDocumentJSON) - json.Unmarshal([]byte(TestDocumentString), &testStructJSONDoc) - testStructJSONPtr = &testStructJSONDoc -} - -func TestEscaping(t *testing.T) { - - ins := []string{`/`, `/`, `/a~1b`, `/a~1b`, `/c%d`, `/e^f`, `/g|h`, `/i\j`, `/k"l`, `/ `, `/m~0n`} - outs := []float64{0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8} - - for i := range ins { - p, err := New(ins[i]) - if assert.NoError(t, err, "input: %v", ins[i]) { - result, _, err := p.Get(testDocumentJSON) - if assert.NoError(t, err, "input: %v", ins[i]) { - assert.Equal(t, outs[i], result, "input: %v", ins[i]) - } - } - } - -} - -func TestFullDocument(t *testing.T) { - - in := `` - - p, err := New(in) - if err != nil { - t.Errorf("New(%v) error %v", in, err.Error()) - } - - result, _, err := p.Get(testDocumentJSON) - if err != nil { - t.Errorf("Get(%v) error %v", in, err.Error()) - } - - if len(result.(map[string]interface{})) != TestDocumentNBItems { - t.Errorf("Get(%v) = %v, expect full document", in, result) - } - - result, _, err = p.get(testDocumentJSON, nil) - if err != nil { - t.Errorf("Get(%v) error %v", in, err.Error()) - } - - if len(result.(map[string]interface{})) != TestDocumentNBItems { - t.Errorf("Get(%v) = %v, expect full document", in, result) - } -} - -func TestDecodedTokens(t *testing.T) { - p, err := New("/obj/a~1b") - assert.NoError(t, err) - assert.Equal(t, []string{"obj", "a/b"}, p.DecodedTokens()) -} - -func TestIsEmpty(t *testing.T) { - p, err := New("") - assert.NoError(t, err) - assert.True(t, p.IsEmpty()) - p, err = New("/obj") - assert.NoError(t, err) - assert.False(t, p.IsEmpty()) -} - -func TestGetSingle(t *testing.T) { - in := `/obj` - - _, err := New(in) - assert.NoError(t, err) - result, _, err := GetForToken(testDocumentJSON, "obj") - assert.NoError(t, err) - assert.Len(t, result, TestNodeObjNBItems) - - result, _, err = GetForToken(testStructJSONDoc, "Obj") - assert.Error(t, err) - assert.Nil(t, result) - - result, _, err = GetForToken(testStructJSONDoc, "Obj2") - assert.Error(t, err) - assert.Nil(t, result) -} - -type pointableImpl struct { - a string -} - -func (p pointableImpl) JSONLookup(token string) (interface{}, error) { - if token == "some" { - return p.a, nil - } - return nil, fmt.Errorf("object has no field %q", token) -} - -func TestPointableInterface(t *testing.T) { - p := &pointableImpl{"hello"} - - result, _, err := GetForToken(p, "some") - assert.NoError(t, err) - assert.Equal(t, p.a, result) - - result, _, err = GetForToken(p, "something") - assert.Error(t, err) - assert.Nil(t, result) -} - -func TestGetNode(t *testing.T) { - - in := `/obj` - - p, err := New(in) - assert.NoError(t, err) - result, _, err := p.Get(testDocumentJSON) - assert.NoError(t, err) - assert.Len(t, result, TestNodeObjNBItems) - - result, _, err = p.Get(aliasedMap(testDocumentJSON.(map[string]interface{}))) - assert.NoError(t, err) - assert.Len(t, result, TestNodeObjNBItems) - - result, _, err = p.Get(testStructJSONDoc) - assert.NoError(t, err) - assert.Equal(t, testStructJSONDoc.Obj, result) - - result, _, err = p.Get(testStructJSONPtr) - assert.NoError(t, err) - assert.Equal(t, testStructJSONDoc.Obj, result) -} - -func TestArray(t *testing.T) { - - ins := []string{`/foo/0`, `/foo/0`, `/foo/1`} - outs := []string{"bar", "bar", "baz"} - - for i := range ins { - p, err := New(ins[i]) - assert.NoError(t, err) - - result, _, err := p.Get(testStructJSONDoc) - assert.NoError(t, err) - assert.Equal(t, outs[i], result) - - result, _, err = p.Get(testStructJSONPtr) - assert.NoError(t, err) - assert.Equal(t, outs[i], result) - - result, _, err = p.Get(testDocumentJSON) - assert.NoError(t, err) - assert.Equal(t, outs[i], result) - } -} - -func TestOtherThings(t *testing.T) { - _, err := New("abc") - assert.Error(t, err) - - p, err := New("") - assert.NoError(t, err) - assert.Equal(t, "", p.String()) - - p, err = New("/obj/a") - assert.Equal(t, "/obj/a", p.String()) - - s := Escape("m~n") - assert.Equal(t, "m~0n", s) - s = Escape("m/n") - assert.Equal(t, "m~1n", s) - - p, err = New("/foo/3") - assert.NoError(t, err) - _, _, err = p.Get(testDocumentJSON) - assert.Error(t, err) - - p, err = New("/foo/a") - assert.NoError(t, err) - _, _, err = p.Get(testDocumentJSON) - assert.Error(t, err) - - p, err = New("/notthere") - assert.NoError(t, err) - _, _, err = p.Get(testDocumentJSON) - assert.Error(t, err) - - p, err = New("/invalid") - assert.NoError(t, err) - _, _, err = p.Get(1234) - assert.Error(t, err) - - p, err = New("/foo/1") - assert.NoError(t, err) - expected := "hello" - bbb := testDocumentJSON.(map[string]interface{})["foo"] - bbb.([]interface{})[1] = "hello" - - v, _, err := p.Get(testDocumentJSON) - assert.NoError(t, err) - assert.Equal(t, expected, v) - - esc := Escape("a/") - assert.Equal(t, "a~1", esc) - unesc := Unescape(esc) - assert.Equal(t, "a/", unesc) - - unesc = Unescape("~01") - assert.Equal(t, "~1", unesc) - assert.Equal(t, "~0~1", Escape("~/")) - assert.Equal(t, "~/", Unescape("~0~1")) -} - -func TestObject(t *testing.T) { - - ins := []string{`/obj/a`, `/obj/b`, `/obj/c/0`, `/obj/c/1`, `/obj/c/1`, `/obj/d/1/f/0`} - outs := []float64{1, 2, 3, 4, 4, 50} - - for i := range ins { - - p, err := New(ins[i]) - assert.NoError(t, err) - - result, _, err := p.Get(testDocumentJSON) - assert.NoError(t, err) - assert.Equal(t, outs[i], result) - - result, _, err = p.Get(testStructJSONDoc) - assert.NoError(t, err) - assert.EqualValues(t, outs[i], result) - - result, _, err = p.Get(testStructJSONPtr) - assert.NoError(t, err) - assert.EqualValues(t, outs[i], result) - } -} - -type setJsonDocEle struct { - B int `json:"b"` - C int `json:"c"` -} -type setJsonDoc struct { - A []struct { - B int `json:"b"` - C int `json:"c"` - } `json:"a"` - D int `json:"d"` -} - -type settableDoc struct { - Coll settableColl - Int settableInt -} - -func (s settableDoc) MarshalJSON() ([]byte, error) { - var res struct { - A settableColl `json:"a"` - D settableInt `json:"d"` - } - res.A = s.Coll - res.D = s.Int - return json.Marshal(res) -} -func (s *settableDoc) UnmarshalJSON(data []byte) error { - var res struct { - A settableColl `json:"a"` - D settableInt `json:"d"` - } - - if err := json.Unmarshal(data, &res); err != nil { - return err - } - s.Coll = res.A - s.Int = res.D - return nil -} - -// JSONLookup implements an interface to customize json pointer lookup -func (s settableDoc) JSONLookup(token string) (interface{}, error) { - switch token { - case "a": - return &s.Coll, nil - case "d": - return &s.Int, nil - default: - return nil, fmt.Errorf("%s is not a known field", token) - } -} - -// JSONLookup implements an interface to customize json pointer lookup -func (s *settableDoc) JSONSet(token string, data interface{}) error { - switch token { - case "a": - switch dt := data.(type) { - case settableColl: - s.Coll = dt - return nil - case *settableColl: - if dt != nil { - s.Coll = *dt - } else { - s.Coll = settableColl{} - } - return nil - case []settableCollItem: - s.Coll.Items = dt - return nil - } - case "d": - switch dt := data.(type) { - case settableInt: - s.Int = dt - return nil - case int: - s.Int.Value = dt - return nil - case int8: - s.Int.Value = int(dt) - return nil - case int16: - s.Int.Value = int(dt) - return nil - case int32: - s.Int.Value = int(dt) - return nil - case int64: - s.Int.Value = int(dt) - return nil - default: - return fmt.Errorf("invalid type %T for %s", data, token) - } - } - return fmt.Errorf("%s is not a known field", token) -} - -type settableColl struct { - Items []settableCollItem -} - -func (s settableColl) MarshalJSON() ([]byte, error) { - return json.Marshal(s.Items) -} -func (s *settableColl) UnmarshalJSON(data []byte) error { - return json.Unmarshal(data, &s.Items) -} - -// JSONLookup implements an interface to customize json pointer lookup -func (s settableColl) JSONLookup(token string) (interface{}, error) { - if tok, err := strconv.Atoi(token); err == nil { - return &s.Items[tok], nil - } - return nil, fmt.Errorf("%s is not a valid index", token) -} - -// JSONLookup implements an interface to customize json pointer lookup -func (s *settableColl) JSONSet(token string, data interface{}) error { - if _, err := strconv.Atoi(token); err == nil { - _, err := SetForToken(s.Items, token, data) - return err - } - return fmt.Errorf("%s is not a valid index", token) -} - -type settableCollItem struct { - B int `json:"b"` - C int `json:"c"` -} - -type settableInt struct { - Value int -} - -func (s settableInt) MarshalJSON() ([]byte, error) { - return json.Marshal(s.Value) -} -func (s *settableInt) UnmarshalJSON(data []byte) error { - return json.Unmarshal(data, &s.Value) -} - -func TestSetNode(t *testing.T) { - - jsonText := `{"a":[{"b": 1, "c": 2}], "d": 3}` - - var jsonDocument interface{} - if assert.NoError(t, json.Unmarshal([]byte(jsonText), &jsonDocument)) { - in := "/a/0/c" - p, err := New(in) - if assert.NoError(t, err) { - - _, err = p.Set(jsonDocument, 999) - assert.NoError(t, err) - - firstNode := jsonDocument.(map[string]interface{}) - assert.Len(t, firstNode, 2) - - sliceNode := firstNode["a"].([]interface{}) - assert.Len(t, sliceNode, 1) - - changedNode := sliceNode[0].(map[string]interface{}) - chNodeVI := changedNode["c"] - if assert.IsType(t, 0, chNodeVI) { - changedNodeValue := chNodeVI.(int) - if assert.Equal(t, 999, changedNodeValue) { - assert.Len(t, sliceNode, 1) - } - } - } - - v, err := New("/a/0") - if assert.NoError(t, err) { - _, err = v.Set(jsonDocument, map[string]interface{}{"b": 3, "c": 8}) - if assert.NoError(t, err) { - firstNode := jsonDocument.(map[string]interface{}) - assert.Len(t, firstNode, 2) - - sliceNode := firstNode["a"].([]interface{}) - assert.Len(t, sliceNode, 1) - changedNode := sliceNode[0].(map[string]interface{}) - assert.Equal(t, 3, changedNode["b"]) - assert.Equal(t, 8, changedNode["c"]) - } - } - } - - var structDoc setJsonDoc - if assert.NoError(t, json.Unmarshal([]byte(jsonText), &structDoc)) { - g, err := New("/a") - if assert.NoError(t, err) { - _, err = g.Set(&structDoc, []struct { - B int `json:"b"` - C int `json:"c"` - }{{B: 4, C: 7}}) - - if assert.NoError(t, err) { - assert.Len(t, structDoc.A, 1) - changedNode := structDoc.A[0] - assert.Equal(t, 4, changedNode.B) - assert.Equal(t, 7, changedNode.C) - } - } - - v, err := New("/a/0") - if assert.NoError(t, err) { - _, err = v.Set(structDoc, struct { - B int `json:"b"` - C int `json:"c"` - }{B: 3, C: 8}) - - if assert.NoError(t, err) { - assert.Len(t, structDoc.A, 1) - changedNode := structDoc.A[0] - assert.Equal(t, 3, changedNode.B) - assert.Equal(t, 8, changedNode.C) - } - } - - p, err := New("/a/0/c") - if assert.NoError(t, err) { - _, err = p.Set(&structDoc, 999) - assert.NoError(t, err) - if assert.Len(t, structDoc.A, 1) { - assert.Equal(t, 999, structDoc.A[0].C) - } - } - } - - var setDoc settableDoc - if assert.NoError(t, json.Unmarshal([]byte(jsonText), &setDoc)) { - g, err := New("/a") - if assert.NoError(t, err) { - _, err = g.Set(&setDoc, []settableCollItem{{B: 4, C: 7}}) - - if assert.NoError(t, err) { - assert.Len(t, setDoc.Coll.Items, 1) - changedNode := setDoc.Coll.Items[0] - assert.Equal(t, 4, changedNode.B) - assert.Equal(t, 7, changedNode.C) - } - } - - v, err := New("/a/0") - if assert.NoError(t, err) { - _, err = v.Set(setDoc, settableCollItem{B: 3, C: 8}) - - if assert.NoError(t, err) { - assert.Len(t, setDoc.Coll.Items, 1) - changedNode := setDoc.Coll.Items[0] - assert.Equal(t, 3, changedNode.B) - assert.Equal(t, 8, changedNode.C) - } - } - - p, err := New("/a/0/c") - if assert.NoError(t, err) { - _, err = p.Set(setDoc, 999) - assert.NoError(t, err) - if assert.Len(t, setDoc.Coll.Items, 1) { - assert.Equal(t, 999, setDoc.Coll.Items[0].C) - } - } - } -} diff --git a/vendor/github.com/go-openapi/jsonreference/.gitignore b/vendor/github.com/go-openapi/jsonreference/.gitignore deleted file mode 100644 index 769c244007..0000000000 --- a/vendor/github.com/go-openapi/jsonreference/.gitignore +++ /dev/null @@ -1 +0,0 @@ -secrets.yml diff --git a/vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md deleted file mode 100644 index 9322b065e3..0000000000 --- a/vendor/github.com/go-openapi/jsonreference/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +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, gender identity and expression, level of experience, -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 ivan+abuse@flanders.co.nz. 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 [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/go-openapi/jsonreference/LICENSE b/vendor/github.com/go-openapi/jsonreference/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/vendor/github.com/go-openapi/jsonreference/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/go-openapi/jsonreference/README.md b/vendor/github.com/go-openapi/jsonreference/README.md deleted file mode 100644 index 66345f4c61..0000000000 --- a/vendor/github.com/go-openapi/jsonreference/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# gojsonreference [![Build Status](https://travis-ci.org/go-openapi/jsonreference.svg?branch=master)](https://travis-ci.org/go-openapi/jsonreference) [![codecov](https://codecov.io/gh/go-openapi/jsonreference/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonreference) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) - -[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonreference/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/jsonreference?status.svg)](http://godoc.org/github.com/go-openapi/jsonreference) -An implementation of JSON Reference - Go language - -## Status -Work in progress ( 90% done ) - -## Dependencies -https://github.com/go-openapi/jsonpointer - -## References -http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 - -http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03 diff --git a/vendor/github.com/go-openapi/jsonreference/reference.go b/vendor/github.com/go-openapi/jsonreference/reference.go deleted file mode 100644 index 3bc0a6e26f..0000000000 --- a/vendor/github.com/go-openapi/jsonreference/reference.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// author sigu-399 -// author-github https://github.com/sigu-399 -// author-mail sigu.399@gmail.com -// -// repository-name jsonreference -// repository-desc An implementation of JSON Reference - Go language -// -// description Main and unique file. -// -// created 26-02-2013 - -package jsonreference - -import ( - "errors" - "net/url" - "strings" - - "github.com/PuerkitoBio/purell" - "github.com/go-openapi/jsonpointer" -) - -const ( - fragmentRune = `#` -) - -// New creates a new reference for the given string -func New(jsonReferenceString string) (Ref, error) { - - var r Ref - err := r.parse(jsonReferenceString) - return r, err - -} - -// MustCreateRef parses the ref string and panics when it's invalid. -// Use the New method for a version that returns an error -func MustCreateRef(ref string) Ref { - r, err := New(ref) - if err != nil { - panic(err) - } - return r -} - -// Ref represents a json reference object -type Ref struct { - referenceURL *url.URL - referencePointer jsonpointer.Pointer - - HasFullURL bool - HasURLPathOnly bool - HasFragmentOnly bool - HasFileScheme bool - HasFullFilePath bool -} - -// GetURL gets the URL for this reference -func (r *Ref) GetURL() *url.URL { - return r.referenceURL -} - -// GetPointer gets the json pointer for this reference -func (r *Ref) GetPointer() *jsonpointer.Pointer { - return &r.referencePointer -} - -// String returns the best version of the url for this reference -func (r *Ref) String() string { - - if r.referenceURL != nil { - return r.referenceURL.String() - } - - if r.HasFragmentOnly { - return fragmentRune + r.referencePointer.String() - } - - return r.referencePointer.String() -} - -// IsRoot returns true if this reference is a root document -func (r *Ref) IsRoot() bool { - return r.referenceURL != nil && - !r.IsCanonical() && - !r.HasURLPathOnly && - r.referenceURL.Fragment == "" -} - -// IsCanonical returns true when this pointer starts with http(s):// or file:// -func (r *Ref) IsCanonical() bool { - return (r.HasFileScheme && r.HasFullFilePath) || (!r.HasFileScheme && r.HasFullURL) -} - -// "Constructor", parses the given string JSON reference -func (r *Ref) parse(jsonReferenceString string) error { - - parsed, err := url.Parse(jsonReferenceString) - if err != nil { - return err - } - - r.referenceURL, _ = url.Parse(purell.NormalizeURL(parsed, purell.FlagsSafe|purell.FlagRemoveDuplicateSlashes)) - refURL := r.referenceURL - - if refURL.Scheme != "" && refURL.Host != "" { - r.HasFullURL = true - } else { - if refURL.Path != "" { - r.HasURLPathOnly = true - } else if refURL.RawQuery == "" && refURL.Fragment != "" { - r.HasFragmentOnly = true - } - } - - r.HasFileScheme = refURL.Scheme == "file" - r.HasFullFilePath = strings.HasPrefix(refURL.Path, "/") - - // invalid json-pointer error means url has no json-pointer fragment. simply ignore error - r.referencePointer, _ = jsonpointer.New(refURL.Fragment) - - return nil -} - -// Inherits creates a new reference from a parent and a child -// If the child cannot inherit from the parent, an error is returned -func (r *Ref) Inherits(child Ref) (*Ref, error) { - childURL := child.GetURL() - parentURL := r.GetURL() - if childURL == nil { - return nil, errors.New("child url is nil") - } - if parentURL == nil { - return &child, nil - } - - ref, err := New(parentURL.ResolveReference(childURL).String()) - if err != nil { - return nil, err - } - return &ref, nil -} diff --git a/vendor/github.com/go-openapi/jsonreference/reference_test.go b/vendor/github.com/go-openapi/jsonreference/reference_test.go deleted file mode 100644 index 499c634c58..0000000000 --- a/vendor/github.com/go-openapi/jsonreference/reference_test.go +++ /dev/null @@ -1,420 +0,0 @@ -// Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// author sigu-399 -// author-github https://github.com/sigu-399 -// author-mail sigu.399@gmail.com -// -// repository-name jsonreference -// repository-desc An implementation of JSON Reference - Go language -// -// description Automated tests on package. -// -// created 03-03-2013 - -package jsonreference - -import ( - "testing" - - "github.com/go-openapi/jsonpointer" - "github.com/stretchr/testify/assert" -) - -func TestIsRoot(t *testing.T) { - in := "#" - r1, err := New(in) - assert.NoError(t, err) - assert.True(t, r1.IsRoot()) - - in = "#/ok" - r1 = MustCreateRef(in) - assert.False(t, r1.IsRoot()) - - assert.Panics(t, assert.PanicTestFunc(func() { - MustCreateRef("%2") - })) -} - -func TestFull(t *testing.T) { - - in := "http://host/path/a/b/c#/f/a/b" - - r1, err := New(in) - if err != nil { - t.Errorf("New(%v) error %s", in, err.Error()) - } - - if in != r1.String() { - t.Errorf("New(%v) = %v, expect %v", in, r1.String(), in) - } - - if r1.HasFragmentOnly != false { - t.Errorf("New(%v)::HasFragmentOnly %v expect %v", in, r1.HasFragmentOnly, false) - } - - if r1.HasFullURL != true { - t.Errorf("New(%v)::HasFullURL %v expect %v", in, r1.HasFullURL, true) - } - - if r1.HasURLPathOnly != false { - t.Errorf("New(%v)::HasURLPathOnly %v expect %v", in, r1.HasURLPathOnly, false) - } - - if r1.HasFileScheme != false { - t.Errorf("New(%v)::HasFileScheme %v expect %v", in, r1.HasFileScheme, false) - } - - if r1.GetPointer().String() != "/f/a/b" { - t.Errorf("New(%v)::GetPointer() %v expect %v", in, r1.GetPointer().String(), "/f/a/b") - } -} - -func TestFullURL(t *testing.T) { - - in := "http://host/path/a/b/c" - - r1, err := New(in) - if err != nil { - t.Errorf("New(%v) error %s", in, err.Error()) - } - - if in != r1.String() { - t.Errorf("New(%v) = %v, expect %v", in, r1.String(), in) - } - - if r1.HasFragmentOnly != false { - t.Errorf("New(%v)::HasFragmentOnly %v expect %v", in, r1.HasFragmentOnly, false) - } - - if r1.HasFullURL != true { - t.Errorf("New(%v)::HasFullURL %v expect %v", in, r1.HasFullURL, true) - } - - if r1.HasURLPathOnly != false { - t.Errorf("New(%v)::HasURLPathOnly %v expect %v", in, r1.HasURLPathOnly, false) - } - - if r1.HasFileScheme != false { - t.Errorf("New(%v)::HasFileScheme %v expect %v", in, r1.HasFileScheme, false) - } - - if r1.GetPointer().String() != "" { - t.Errorf("New(%v)::GetPointer() %v expect %v", in, r1.GetPointer().String(), "") - } -} - -func TestFragmentOnly(t *testing.T) { - - in := "#/fragment/only" - - r1, err := New(in) - if err != nil { - t.Errorf("New(%v) error %s", in, err.Error()) - } - - if in != r1.String() { - t.Errorf("New(%v) = %v, expect %v", in, r1.String(), in) - } - - if r1.HasFragmentOnly != true { - t.Errorf("New(%v)::HasFragmentOnly %v expect %v", in, r1.HasFragmentOnly, true) - } - - if r1.HasFullURL != false { - t.Errorf("New(%v)::HasFullURL %v expect %v", in, r1.HasFullURL, false) - } - - if r1.HasURLPathOnly != false { - t.Errorf("New(%v)::HasURLPathOnly %v expect %v", in, r1.HasURLPathOnly, false) - } - - if r1.HasFileScheme != false { - t.Errorf("New(%v)::HasFileScheme %v expect %v", in, r1.HasFileScheme, false) - } - - if r1.GetPointer().String() != "/fragment/only" { - t.Errorf("New(%v)::GetPointer() %v expect %v", in, r1.GetPointer().String(), "/fragment/only") - } - - p, _ := jsonpointer.New(r1.referenceURL.Fragment) - r2 := Ref{referencePointer: p, HasFragmentOnly: true} - assert.Equal(t, r2.String(), in) - - r3 := Ref{referencePointer: p, HasFragmentOnly: false} - assert.Equal(t, r3.String(), in[1:]) -} - -func TestURLPathOnly(t *testing.T) { - - in := "/documents/document.json" - - r1, err := New(in) - if err != nil { - t.Errorf("New(%v) error %s", in, err.Error()) - } - - if in != r1.String() { - t.Errorf("New(%v) = %v, expect %v", in, r1.String(), in) - } - - if r1.HasFragmentOnly != false { - t.Errorf("New(%v)::HasFragmentOnly %v expect %v", in, r1.HasFragmentOnly, false) - } - - if r1.HasFullURL != false { - t.Errorf("New(%v)::HasFullURL %v expect %v", in, r1.HasFullURL, false) - } - - if r1.HasURLPathOnly != true { - t.Errorf("New(%v)::HasURLPathOnly %v expect %v", in, r1.HasURLPathOnly, true) - } - - if r1.HasFileScheme != false { - t.Errorf("New(%v)::HasFileScheme %v expect %v", in, r1.HasFileScheme, false) - } - - if r1.GetPointer().String() != "" { - t.Errorf("New(%v)::GetPointer() %v expect %v", in, r1.GetPointer().String(), "") - } -} - -func TestURLRelativePathOnly(t *testing.T) { - - in := "document.json" - - r1, err := New(in) - if err != nil { - t.Errorf("New(%v) error %s", in, err.Error()) - } - - if in != r1.String() { - t.Errorf("New(%v) = %v, expect %v", in, r1.String(), in) - } - - if r1.HasFragmentOnly != false { - t.Errorf("New(%v)::HasFragmentOnly %v expect %v", in, r1.HasFragmentOnly, false) - } - - if r1.HasFullURL != false { - t.Errorf("New(%v)::HasFullURL %v expect %v", in, r1.HasFullURL, false) - } - - if r1.HasURLPathOnly != true { - t.Errorf("New(%v)::HasURLPathOnly %v expect %v", in, r1.HasURLPathOnly, true) - } - - if r1.HasFileScheme != false { - t.Errorf("New(%v)::HasFileScheme %v expect %v", in, r1.HasFileScheme, false) - } - - if r1.GetPointer().String() != "" { - t.Errorf("New(%v)::GetPointer() %v expect %v", in, r1.GetPointer().String(), "") - } -} - -func TestInheritsInValid(t *testing.T) { - in1 := "http://www.test.com/doc.json" - in2 := "#/a/b" - - r1, _ := New(in1) - r2 := Ref{} - result, err := r1.Inherits(r2) - assert.Error(t, err) - assert.Nil(t, result) - - r1 = Ref{} - r2, _ = New(in2) - result, err = r1.Inherits(r2) - assert.NoError(t, err) - assert.Equal(t, r2, *result) -} - -func TestInheritsValid(t *testing.T) { - - in1 := "http://www.test.com/doc.json" - in2 := "#/a/b" - out := in1 + in2 - - r1, _ := New(in1) - r2, _ := New(in2) - - result, err := r1.Inherits(r2) - if err != nil { - t.Errorf("Inherits(%s,%s) error %s", r1.String(), r2.String(), err.Error()) - } - - if result.String() != out { - t.Errorf("Inherits(%s,%s) = %s, expect %s", r1.String(), r2.String(), result.String(), out) - } - - if result.GetPointer().String() != "/a/b" { - t.Errorf("result(%v)::GetPointer() %v expect %v", result.String(), result.GetPointer().String(), "/a/b") - } -} - -func TestInheritsDifferentHost(t *testing.T) { - - in1 := "http://www.test.com/doc.json" - in2 := "http://www.test2.com/doc.json#bla" - - r1, _ := New(in1) - r2, _ := New(in2) - - result, err := r1.Inherits(r2) - - if err != nil { - t.Errorf("Inherits(%s,%s) should not fail. Error: %s", r1.String(), r2.String(), err.Error()) - } - - if result.String() != in2 { - t.Errorf("Inherits(%s,%s) should be %s but is %s", in1, in2, in2, result) - } - - if result.GetPointer().String() != "" { - t.Errorf("result(%v)::GetPointer() %v expect %v", result.String(), result.GetPointer().String(), "") - } -} - -func TestFileScheme(t *testing.T) { - - in1 := "file:///Users/mac/1.json#a" - in2 := "file:///Users/mac/2.json#b" - - r1, _ := New(in1) - r2, _ := New(in2) - - if r1.HasFragmentOnly != false { - t.Errorf("New(%v)::HasFragmentOnly %v expect %v", in1, r1.HasFragmentOnly, false) - } - - if r1.HasFileScheme != true { - t.Errorf("New(%v)::HasFileScheme %v expect %v", in1, r1.HasFileScheme, true) - } - - if r1.HasFullFilePath != true { - t.Errorf("New(%v)::HasFullFilePath %v expect %v", in1, r1.HasFullFilePath, true) - } - - if r1.IsCanonical() != true { - t.Errorf("New(%v)::IsCanonical %v expect %v", in1, r1.IsCanonical, true) - } - - result, err := r1.Inherits(r2) - if err != nil { - t.Errorf("Inherits(%s,%s) should not fail. Error: %s", r1.String(), r2.String(), err.Error()) - } - if result.String() != in2 { - t.Errorf("Inherits(%s,%s) should be %s but is %s", in1, in2, in2, result) - } - - if result.GetPointer().String() != "" { - t.Errorf("result(%v)::GetPointer() %v expect %v", result.String(), result.GetPointer().String(), "") - } -} - -func TestReferenceResolution(t *testing.T) { - - // 5.4. Reference Resolution Examples - // http://tools.ietf.org/html/rfc3986#section-5.4 - - base := "http://a/b/c/d;p?q" - baseRef, err := New(base) - - if err != nil { - t.Errorf("New(%s) failed error: %s", base, err.Error()) - } - if baseRef.String() != base { - t.Errorf("New(%s) %s expected %s", base, baseRef.String(), base) - } - - checks := []string{ - // 5.4.1. Normal Examples - // http://tools.ietf.org/html/rfc3986#section-5.4.1 - - "g:h", "g:h", - "g", "http://a/b/c/g", - "./g", "http://a/b/c/g", - "g/", "http://a/b/c/g/", - "/g", "http://a/g", - "//g", "http://g", - "?y", "http://a/b/c/d;p?y", - "g?y", "http://a/b/c/g?y", - "#s", "http://a/b/c/d;p?q#s", - "g#s", "http://a/b/c/g#s", - "g?y#s", "http://a/b/c/g?y#s", - ";x", "http://a/b/c/;x", - "g;x", "http://a/b/c/g;x", - "g;x?y#s", "http://a/b/c/g;x?y#s", - "", "http://a/b/c/d;p?q", - ".", "http://a/b/c/", - "./", "http://a/b/c/", - "..", "http://a/b/", - "../", "http://a/b/", - "../g", "http://a/b/g", - "../..", "http://a/", - "../../", "http://a/", - "../../g", "http://a/g", - - // 5.4.2. Abnormal Examples - // http://tools.ietf.org/html/rfc3986#section-5.4.2 - - "../../../g", "http://a/g", - "../../../../g", "http://a/g", - - "/./g", "http://a/g", - "/../g", "http://a/g", - "g.", "http://a/b/c/g.", - ".g", "http://a/b/c/.g", - "g..", "http://a/b/c/g..", - "..g", "http://a/b/c/..g", - - "./../g", "http://a/b/g", - "./g/.", "http://a/b/c/g/", - "g/./h", "http://a/b/c/g/h", - "g/../h", "http://a/b/c/h", - "g;x=1/./y", "http://a/b/c/g;x=1/y", - "g;x=1/../y", "http://a/b/c/y", - - "g?y/./x", "http://a/b/c/g?y/./x", - "g?y/../x", "http://a/b/c/g?y/../x", - "g#s/./x", "http://a/b/c/g#s/./x", - "g#s/../x", "http://a/b/c/g#s/../x", - - "http:g", "http:g", // for strict parsers - //"http:g", "http://a/b/c/g", // for backward compatibility - - } - for i := 0; i < len(checks); i += 2 { - child := checks[i] - expected := checks[i+1] - // fmt.Printf("%d: %v -> %v\n", i/2, child, expected) - - childRef, e := New(child) - if e != nil { - t.Errorf("%d: New(%s) failed error: %s", i/2, child, e.Error()) - } - - res, e := baseRef.Inherits(childRef) - if res == nil { - t.Errorf("%d: Inherits(%s, %s) nil not expected", i/2, base, child) - } - if e != nil { - t.Errorf("%d: Inherits(%s) failed error: %s", i/2, child, e.Error()) - } - if res.String() != expected { - t.Errorf("%d: Inherits(%s, %s) %s expected %s", i/2, base, child, res.String(), expected) - } - } -} diff --git a/vendor/github.com/go-openapi/spec/.gitignore b/vendor/github.com/go-openapi/spec/.gitignore deleted file mode 100644 index dd91ed6a04..0000000000 --- a/vendor/github.com/go-openapi/spec/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -secrets.yml -coverage.out diff --git a/vendor/github.com/go-openapi/spec/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/spec/CODE_OF_CONDUCT.md deleted file mode 100644 index 9322b065e3..0000000000 --- a/vendor/github.com/go-openapi/spec/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +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, gender identity and expression, level of experience, -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 ivan+abuse@flanders.co.nz. 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 [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/go-openapi/spec/LICENSE b/vendor/github.com/go-openapi/spec/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/vendor/github.com/go-openapi/spec/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/go-openapi/spec/README.md b/vendor/github.com/go-openapi/spec/README.md deleted file mode 100644 index 1d1622082f..0000000000 --- a/vendor/github.com/go-openapi/spec/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# OAI object model [![Build Status](https://travis-ci.org/go-openapi/spec.svg?branch=master)](https://travis-ci.org/go-openapi/spec) [![codecov](https://codecov.io/gh/go-openapi/spec/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/spec) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) - -[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/spec/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/spec?status.svg)](http://godoc.org/github.com/go-openapi/spec) - -The object model for OpenAPI specification documents diff --git a/vendor/github.com/go-openapi/spec/auth_test.go b/vendor/github.com/go-openapi/spec/auth_test.go deleted file mode 100644 index 5449fdec90..0000000000 --- a/vendor/github.com/go-openapi/spec/auth_test.go +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "testing" -) - -func TestSerialization_AuthSerialization(t *testing.T) { - assertSerializeJSON(t, BasicAuth(), `{"type":"basic"}`) - - assertSerializeJSON(t, APIKeyAuth("api-key", "header"), `{"type":"apiKey","name":"api-key","in":"header"}`) - - assertSerializeJSON( - t, - OAuth2Implicit("http://foo.com/authorization"), - `{"type":"oauth2","flow":"implicit","authorizationUrl":"http://foo.com/authorization"}`) - - assertSerializeJSON( - t, - OAuth2Password("http://foo.com/token"), - `{"type":"oauth2","flow":"password","tokenUrl":"http://foo.com/token"}`) - - assertSerializeJSON(t, - OAuth2Application("http://foo.com/token"), - `{"type":"oauth2","flow":"application","tokenUrl":"http://foo.com/token"}`) - - assertSerializeJSON( - t, - OAuth2AccessToken("http://foo.com/authorization", "http://foo.com/token"), - `{"type":"oauth2","flow":"accessCode","authorizationUrl":"http://foo.com/authorization","tokenUrl":"http://foo.com/token"}`) - - auth1 := OAuth2Implicit("http://foo.com/authorization") - auth1.AddScope("email", "read your email") - assertSerializeJSON( - t, - auth1, - `{"type":"oauth2","flow":"implicit","authorizationUrl":"http://foo.com/authorization","scopes":{"email":"read your email"}}`) - - auth2 := OAuth2Password("http://foo.com/authorization") - auth2.AddScope("email", "read your email") - assertSerializeJSON( - t, - auth2, - `{"type":"oauth2","flow":"password","tokenUrl":"http://foo.com/authorization","scopes":{"email":"read your email"}}`) - - auth3 := OAuth2Application("http://foo.com/token") - auth3.AddScope("email", "read your email") - assertSerializeJSON( - t, - auth3, - `{"type":"oauth2","flow":"application","tokenUrl":"http://foo.com/token","scopes":{"email":"read your email"}}`) - - auth4 := OAuth2AccessToken("http://foo.com/authorization", "http://foo.com/token") - auth4.AddScope("email", "read your email") - assertSerializeJSON( - t, - auth4, - `{"type":"oauth2","flow":"accessCode","authorizationUrl":"http://foo.com/authorization","tokenUrl":"http://foo.com/token","scopes":{"email":"read your email"}}`) -} - -func TestSerialization_AuthDeserialization(t *testing.T) { - - assertParsesJSON(t, `{"type":"basic"}`, BasicAuth()) - - assertParsesJSON( - t, - `{"in":"header","name":"api-key","type":"apiKey"}`, - APIKeyAuth("api-key", "header")) - - assertParsesJSON( - t, - `{"authorizationUrl":"http://foo.com/authorization","flow":"implicit","type":"oauth2"}`, - OAuth2Implicit("http://foo.com/authorization")) - - assertParsesJSON( - t, - `{"flow":"password","tokenUrl":"http://foo.com/token","type":"oauth2"}`, - OAuth2Password("http://foo.com/token")) - - assertParsesJSON( - t, - `{"flow":"application","tokenUrl":"http://foo.com/token","type":"oauth2"}`, - OAuth2Application("http://foo.com/token")) - - assertParsesJSON( - t, - `{"authorizationUrl":"http://foo.com/authorization","flow":"accessCode","tokenUrl":"http://foo.com/token","type":"oauth2"}`, - OAuth2AccessToken("http://foo.com/authorization", "http://foo.com/token")) - - auth1 := OAuth2Implicit("http://foo.com/authorization") - auth1.AddScope("email", "read your email") - assertParsesJSON(t, - `{"authorizationUrl":"http://foo.com/authorization","flow":"implicit","scopes":{"email":"read your email"},"type":"oauth2"}`, - auth1) - - auth2 := OAuth2Password("http://foo.com/token") - auth2.AddScope("email", "read your email") - assertParsesJSON(t, - `{"flow":"password","scopes":{"email":"read your email"},"tokenUrl":"http://foo.com/token","type":"oauth2"}`, - auth2) - - auth3 := OAuth2Application("http://foo.com/token") - auth3.AddScope("email", "read your email") - assertParsesJSON(t, - `{"flow":"application","scopes":{"email":"read your email"},"tokenUrl":"http://foo.com/token","type":"oauth2"}`, - auth3) - - auth4 := OAuth2AccessToken("http://foo.com/authorization", "http://foo.com/token") - auth4.AddScope("email", "read your email") - assertParsesJSON( - t, - `{"authorizationUrl":"http://foo.com/authorization","flow":"accessCode","scopes":{"email":"read your email"},"tokenUrl":"http://foo.com/token","type":"oauth2"}`, - auth4) - -} diff --git a/vendor/github.com/go-openapi/spec/bindata.go b/vendor/github.com/go-openapi/spec/bindata.go deleted file mode 100644 index 9afb5df194..0000000000 --- a/vendor/github.com/go-openapi/spec/bindata.go +++ /dev/null @@ -1,260 +0,0 @@ -// Code generated by go-bindata. -// sources: -// schemas/jsonschema-draft-04.json -// schemas/v2/schema.json -// DO NOT EDIT! - -package spec - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -func (fi bindataFileInfo) Name() string { - return fi.name -} -func (fi bindataFileInfo) Size() int64 { - return fi.size -} -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} -func (fi bindataFileInfo) IsDir() bool { - return false -} -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _jsonschemaDraft04JSON = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x57\x3b\x6f\xdb\x3e\x10\xdf\xf3\x29\x08\x26\x63\xf2\x97\xff\x40\x27\x6f\x45\xbb\x18\x68\xd1\x0c\xdd\x0c\x0f\xb4\x75\xb2\x19\x50\xa4\x42\x51\x81\x0d\x43\xdf\xbd\xa0\xa8\x07\x29\x91\x92\x2d\xbb\x8d\x97\x28\xbc\xd7\xef\x8e\xf7\xe2\xf9\x01\x21\x84\x30\x8d\xf1\x12\xe1\x83\x52\xd9\x32\x8a\xde\x72\xc1\x5f\xf2\xdd\x01\x52\xf2\x9f\x90\xfb\x28\x96\x24\x51\x2f\x8b\x2f\x91\x39\x7b\xc4\xcf\x46\xe8\xc9\xfc\x3f\x43\x32\x86\x7c\x27\x69\xa6\xa8\xe0\x5a\xfa\x9b\x90\x80\x0c\x0b\x4a\x41\x91\x5a\x45\xc7\x9d\x50\x4e\x35\x73\x8e\x97\xc8\x20\xae\x08\x86\xed\xab\x94\xe4\xe4\x10\x2a\xa2\x3a\x65\xa0\x95\x93\x8a\xfc\xec\x12\x53\xca\x57\x0a\x52\xad\xef\xff\x1e\x89\xd6\xe7\x67\x84\x9f\x24\x24\x5a\xc5\x23\x46\x65\xcb\x54\x76\xfc\x38\x13\x39\x55\xf4\x03\x56\x5c\xc1\x1e\x64\x18\x04\xad\x19\x86\x30\x68\x5a\xa4\x78\x89\x16\x97\xe8\xff\x0e\x09\x29\x98\x5a\x0c\xed\x10\xc6\x7e\x69\xa8\x6b\x07\x76\x64\x45\x2e\xea\x63\x45\xe5\xb3\x66\x8e\x8d\x4e\x0d\x01\x95\x68\xe3\x85\x91\xd3\x34\x63\xf0\xfb\x94\x41\x3e\x34\x0d\xbc\x72\x60\xdd\x46\x1a\xe1\xad\x10\x0c\x08\xd7\x9f\xad\xe3\x08\xf3\x82\x31\xf3\x37\xdd\x9a\x13\xb1\x7d\x83\x9d\xd2\x5f\xb9\x92\x94\xef\x71\xc8\x7e\x45\x9d\x73\xcf\xd6\x65\x36\x7c\x8d\xa9\xf2\xf2\x94\x28\x38\x7d\x2f\xa0\xa1\x2a\x59\x40\x07\xf3\xc1\x02\xdb\xda\x68\x1c\x33\xa7\x99\x14\x19\x48\x45\x7b\xd1\x33\x45\x17\xf0\xa6\x46\xd9\x03\x92\x08\x99\x12\x7d\x57\xb8\x90\x14\x7b\x63\xd5\x15\xe5\xbd\x35\x2b\xaa\x18\x4c\xea\xf5\x8a\xba\xf5\x3e\x4b\x41\x93\xa5\x67\xfb\x38\x2d\x98\xa2\x19\x83\x2a\xf7\x03\x6a\x9b\x74\x0b\x56\x5e\x8f\x02\xc7\x1d\x2b\x72\xfa\x01\x3f\x5b\x16\xf7\xc6\x6d\xfb\xe4\x58\xb3\x8c\x1b\xf7\x0a\x77\x86\xa6\xb4\xb4\xf5\xe4\x92\xbb\xa0\x24\x84\xe5\x01\x84\xad\x13\x37\x21\x9c\xd2\x72\x0b\x42\x72\xfc\x01\x7c\xaf\x0e\xbd\x9e\x3b\xd5\xbc\x1c\x1f\xaf\xd6\xd0\xb6\x52\xb7\xdf\x12\xa5\x40\x4e\xe7\x68\xb0\x78\x24\xec\xe1\xe8\x0f\x26\x89\xe3\x0a\x0a\x61\x4d\x23\xe9\xf7\x70\x7e\x32\x3d\xdc\x39\xd6\xbf\xf3\x30\xd0\xfd\xf6\x55\xb3\x79\x27\x96\xfe\x6d\x82\x37\x73\xf6\x8f\x36\x3a\x03\xa4\x6d\x7d\x1c\x9e\x73\x35\xf6\x18\xbf\x15\x76\x4a\x8e\x2b\xcf\x00\xbf\x2a\x99\xae\x55\xe0\xcf\x25\x77\x68\xfc\x95\xba\x79\x75\x06\xcb\x5c\x77\x67\x69\xf1\xfb\x2c\xe1\xbd\xa0\x12\xe2\x31\x45\xf6\x30\x0f\x14\xc8\xab\x7f\x60\x4e\x27\xe0\x3f\xaf\x92\xd0\x6a\x8a\x82\xdb\xc0\xa4\xbb\x63\x65\x34\x0d\x28\xb0\x6b\x7c\x1e\x1e\xd3\x51\xc7\x6e\xf4\x33\x60\xc5\x90\x01\x8f\x81\xef\xee\x88\x68\x90\x69\x23\xb9\x8a\x2e\x69\x98\x7d\xa6\x91\x32\x1a\xc8\x6e\x9c\x13\x7f\x10\xea\xcd\xfd\x4e\xef\xa6\xb1\x25\xd9\xde\x22\x8d\xfa\x59\x63\xc5\x0d\x80\xf5\x28\xf1\xd6\xb9\x37\x9e\xa3\xee\xb5\x4c\xbe\x37\xe0\x55\xc6\x27\x82\x75\x49\xd0\xda\xe0\xb9\x1d\xca\xbf\x5b\xd4\xcf\xbf\x0b\x47\xac\x2d\x59\x07\xfe\x7a\x49\xc1\x61\xa6\x24\x17\x2a\xf0\xbe\x2e\xdb\x17\x7f\xa0\x3c\x7d\x4b\xf3\xba\xdb\xc3\xed\x06\xee\xdb\x5e\xd7\xdd\x42\x5c\x47\xb2\xb3\x68\x75\x8c\xf2\xe1\x4f\x00\x00\x00\xff\xff\x4e\x9b\x8d\xdf\x17\x11\x00\x00") - -func jsonschemaDraft04JSONBytes() ([]byte, error) { - return bindataRead( - _jsonschemaDraft04JSON, - "jsonschema-draft-04.json", - ) -} - -func jsonschemaDraft04JSON() (*asset, error) { - bytes, err := jsonschemaDraft04JSONBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "jsonschema-draft-04.json", size: 4375, mode: os.FileMode(420), modTime: time.Unix(1482389892, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _v2SchemaJSON = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\x5d\x4f\x93\xdb\x36\xb2\xbf\xfb\x53\xa0\x14\x57\xd9\xae\xd8\x92\xe3\xf7\x2e\xcf\x97\xd4\xbc\xd8\x49\x66\x37\x5e\x4f\x79\x26\xbb\x87\x78\x5c\x05\x91\x2d\x09\x09\x09\x30\x00\x38\x33\x5a\xef\x7c\xf7\x2d\xf0\x9f\x08\x02\x20\x41\x8a\xd2\xc8\x0e\x0f\xa9\x78\x28\xa0\xd1\xdd\x68\x34\x7e\xdd\xf8\xf7\xf9\x11\x42\x33\x49\x64\x04\xb3\xd7\x68\x76\x86\xfe\x76\xf9\xfe\x1f\xe8\x32\xd8\x40\x8c\xd1\x8a\x71\x74\x79\x8b\xd7\x6b\xe0\xe8\xd5\xfc\x25\x3a\xbb\x38\x9f\xcf\x9e\xab\x0a\x24\x54\xa5\x37\x52\x26\xaf\x17\x0b\x91\x17\x99\x13\xb6\xb8\x79\xb5\x10\x59\xdd\xf9\xef\x82\xd1\x6f\xf2\xc2\x8f\xf3\x4f\xb5\x1a\xea\xc7\x17\x45\x41\xc6\xd7\x8b\x90\xe3\x95\x7c\xf1\xf2\x7f\x8b\xca\x45\x3d\xb9\x4d\x32\xa6\xd8\xf2\x77\x08\x64\xfe\x8d\xc3\x9f\x29\xe1\xa0\x9a\xff\xed\x11\x42\x08\xcd\x8a\xd6\xb3\x9f\x15\x67\x74\xc5\xca\x7f\x27\x58\x6e\xc4\xec\x11\x42\xd7\x59\x5d\x1c\x86\x44\x12\x46\x71\x74\xc1\x59\x02\x5c\x12\x10\xb3\xd7\x68\x85\x23\x01\x59\x81\x04\x4b\x09\x9c\x6a\xbf\x7e\xce\x49\x7d\xba\x7b\x51\xfd\xa1\x44\xe2\xb0\x52\xac\x7d\xb3\x08\x61\x45\x68\x46\x56\x2c\x6e\x80\x86\x8c\xbf\xbd\x93\x40\x05\x61\x74\x96\x95\xbe\x7f\x84\xd0\x7d\x4e\xde\x42\xb7\xe4\xbe\x46\xbb\x14\x5b\x48\x4e\xe8\xba\x90\x05\xa1\x19\xd0\x34\xae\xc4\xce\xbe\xbc\x9a\xbf\x9c\x15\x7f\x5d\x57\xc5\x42\x10\x01\x27\x89\xe2\x48\x51\xb9\xda\x40\xd5\x87\x37\xc0\x15\x5f\x88\xad\x90\xdc\x10\x81\x42\x16\xa4\x31\x50\x39\x2f\x38\xad\xab\xb0\x53\xd8\xac\x94\x56\x6f\xc3\x84\xf4\x11\xa4\x50\xb3\xfa\xe9\xd3\x6f\x9f\x3e\xdf\x2f\xd0\xeb\x8f\x1f\x3f\x7e\xbc\xfe\xf6\xe9\xf7\xaf\x5f\x7f\xfc\x18\x7e\xfb\xec\xfb\xc7\xb3\x36\x79\x54\x43\xe8\x29\xc5\x31\x20\xc6\x11\x49\x9e\xe5\x12\x41\x66\xa0\xe8\xed\x1d\x8e\x93\x08\x5e\xa3\x27\x3b\xc3\x7c\xa2\x73\xba\xc4\x02\x2e\xb0\xdc\xf4\xe5\x76\xd1\xca\x96\xa2\x8a\x94\xcd\x21\xc9\x6c\xec\x2c\x70\x42\x9e\x34\x74\x9d\x19\x7c\xcd\x20\x9c\xea\x2e\x0a\xfe\x42\x84\xd4\x29\x04\x8c\x8a\xb4\x41\xa2\xc1\xdc\x19\x8a\x88\x90\x4a\x49\xef\xce\xdf\xbd\x45\x4a\x52\x81\x70\x10\x40\x22\x21\x44\xcb\x6d\xc5\xec\x4e\x3c\x1c\x45\xef\x57\x9a\xb5\x7d\xae\xfe\xe5\xe4\x31\x86\x90\xe0\xab\x6d\x02\x3b\x2e\xcb\x11\x90\xd9\xa8\xc6\x77\xc2\x59\x98\x06\xfd\xf9\x2e\x78\x45\x01\xa6\xa8\xa0\x71\x5c\xbe\x33\xa7\xd2\xd9\x5f\x95\xef\xd9\xd5\xac\xfd\xdc\x5d\xbf\x5e\xb8\xd1\x3e\xc7\x31\x48\xe0\x5e\x4c\x14\x65\xdf\xb8\xa8\x71\x10\x09\xa3\xc2\xc7\x02\xcb\xa2\x4e\x5a\x02\x82\x94\x13\xb9\xf5\x30\xe6\xb2\xa4\xb5\xfe\x9b\x3e\x7a\xb2\x55\xd2\xa8\x4a\xbc\x16\xb6\x71\x8e\x39\xc7\xdb\x9d\xe1\x10\x09\x71\xbd\x9c\xb3\x41\x89\xd7\xa5\x89\xdc\x57\xb5\x53\x4a\xfe\x4c\xe1\xbc\xa0\x21\x79\x0a\x1a\x0f\x70\xa7\x5c\x08\x8e\xde\xb0\xc0\x43\x24\xad\x74\x63\x0e\xb1\xd9\x90\xe1\xb0\x2d\x13\xa7\x6d\x78\xfd\x04\x14\x38\x8e\x90\xaa\xce\x63\xac\x3e\x23\xbc\x64\xa9\xb4\xf8\x03\x63\xde\xcd\xbe\x16\x13\x4a\x55\xac\x82\x12\xc6\xac\xd4\x35\xf7\x22\xd4\x3a\xff\x22\x73\x0e\x6e\x51\xa0\x75\x1e\xae\x8f\xe8\x5d\xc7\x59\xe6\xe4\x9a\x18\x8d\xd6\x1c\x53\x84\x4d\xb7\x67\x28\x37\x09\x84\x69\x88\x12\x0e\x01\x11\x80\x32\xa2\xf5\xb9\xaa\xc6\xd9\x73\x53\xab\xfb\xb4\x2e\x20\xc6\x54\x92\xa0\x9a\xf3\x69\x1a\x2f\x81\x77\x37\xae\x53\x1a\xce\x40\xc4\xa8\x82\x1c\xb5\xef\xda\x24\x7d\xb9\x61\x69\x14\xa2\x25\xa0\x90\xac\x56\xc0\x81\x4a\xb4\xe2\x2c\xce\x4a\x64\x7a\x9a\x23\xf4\x13\x91\x3f\xa7\x4b\xf4\x63\x84\x6f\x18\x87\x10\xbd\xc3\xfc\x8f\x90\xdd\x52\x44\x04\xc2\x51\xc4\x6e\x21\x74\x48\x21\x81\xc7\xe2\xfd\xea\x12\xf8\x0d\x09\xf6\xe9\x47\x35\xaf\x67\xc4\x14\xf7\x22\x27\x97\xe1\xe2\x76\x2d\x06\x8c\x4a\x1c\x48\x3f\x73\x2d\x0b\x5b\x29\x45\x24\x00\x2a\x0c\x11\xec\x94\xca\xc2\xa6\xc1\x37\x21\x43\x83\x3b\x5f\x97\xf1\x43\x5e\x53\x73\x19\xa5\x36\xd8\x2d\x05\x2e\x34\x0b\xeb\x39\xfc\x1d\x63\x51\x01\xbd\x3d\xbb\x90\x84\x40\x25\x59\x6d\x09\x5d\xa3\x1c\x37\xe6\x5c\x16\x9a\x40\x09\x70\xc1\xe8\x82\xf1\x35\xa6\xe4\xdf\x99\x5c\x8e\x9e\x4d\x79\xb4\x27\x2f\xbf\x7e\xf8\x05\x25\x8c\x50\xa9\x98\x29\x90\x62\x60\xea\x75\xae\x13\xca\xbf\x2b\x1a\x29\x27\x76\xd6\x20\xc6\x64\x5f\xe6\x32\x1a\x08\x87\x21\x07\x21\xbc\xb4\xe4\xe0\x32\x67\xa6\xcd\xf3\x1e\xcd\xd9\x6b\xb6\x6f\x8e\x27\xa7\xed\xdb\xe7\xbc\xcc\x1a\x07\xce\x6f\x87\x33\xf0\xba\x51\x17\x22\x66\x78\x79\x8e\xce\xe5\x13\x81\x80\x06\x2c\xe5\x78\x0d\xa1\xb2\xb8\x54\xa8\x79\x09\xbd\xbf\x3c\x47\x01\x8b\x13\x2c\xc9\x32\xaa\xaa\x1d\xd5\xee\xab\x36\xbd\x6c\xfd\x54\x6c\xc8\x08\x01\x3c\xbd\xe7\x07\x88\xb0\x24\x37\x79\x90\x28\x4a\x1d\x10\x1a\x92\x1b\x12\xa6\x38\x42\x40\xc3\x4c\x43\x62\x8e\xae\x36\xb0\x45\x71\x2a\xa4\x9a\x23\x79\x59\xb1\xa8\xf2\xa4\x0c\x60\x9f\xcc\x8d\x40\xf5\x80\xca\xa8\x99\xc3\xa7\x85\x1f\x31\x25\xa9\x82\xc5\x6d\xbd\xd8\x36\x76\x7c\x02\x28\x97\xf6\x1d\x74\x3b\x11\x7e\x91\xae\x32\xf8\x6c\xf4\xe6\x7b\x9a\xa5\x1f\x62\xc6\x21\xcf\x9a\xe5\xed\x8b\x02\xf3\x2c\x33\x33\xdf\x00\xca\xc9\x09\xb4\x04\xf5\xa5\x08\xd7\xc3\x02\x18\x66\xf1\xab\x1e\x83\x37\x4c\xcd\x12\xc1\x1d\x50\xf6\xaa\xbd\xfe\xe2\x73\x48\x38\x08\xa0\x32\x9b\x18\x44\x86\x0b\x6a\xc1\xaa\x26\x96\x2d\x96\x3c\xa0\x54\x65\x73\x87\x15\xca\x15\xe5\xf5\x94\x46\x9f\x33\x1a\x0c\x9a\xb1\x5a\xd9\x6a\x95\xcd\xcb\x7e\xec\x9a\xc5\x94\x3b\x37\x26\x31\xd7\xfc\xe4\x1f\x13\x8c\x31\x75\x9c\xba\xf7\x87\x3c\xa1\xb7\x4f\x17\x1b\x09\x82\x98\xc4\x70\x95\xd3\xe8\x4c\x48\x5a\xa6\xd6\x2a\x3d\x56\x42\x80\x9f\xaf\xae\x2e\x50\x0c\x42\xe0\x35\x34\x3c\x8a\x62\x03\x37\xba\xb2\x27\x04\xda\x25\x8d\x06\xe2\xa0\x13\x8a\xf3\xf5\xec\x10\x72\x67\x88\x90\x3d\x4b\x64\xeb\xaa\xda\x8f\xf7\x5a\x75\x47\x9a\xa8\x51\x70\x26\xd2\x38\xc6\x7c\xbb\x57\xfc\xbd\xe4\x04\x56\xa8\xa0\x54\x9a\x45\xd5\xf7\x0f\x16\xfc\x57\x1c\x3c\xdf\x23\xba\x77\x38\xda\x16\x4b\x31\x53\x6a\x4d\x9a\x15\x63\xe7\xe1\x18\x69\x9f\x22\xe0\x24\xbb\x94\x4b\x97\xee\x2d\xf9\x70\x87\x72\x7b\xe6\xc4\x33\x2a\x66\x5e\x1c\x35\x72\xe3\x2d\xda\x73\xe4\xc7\x51\x6d\xa4\xa1\x2a\x4f\xde\x94\xcb\xb2\x3e\x31\x48\xae\x82\xce\xc9\xc8\x65\xcd\xc3\xb7\x34\xb6\x2b\xdf\x58\x65\x78\x6e\x73\xac\x5e\x24\x0d\x3f\xdc\x70\x23\xc6\xda\x52\x0b\x2d\x63\x7d\xa9\x49\x2d\x54\x48\x28\xc0\x12\x9c\xe3\x63\xc9\x58\x04\x98\x36\x07\xc8\x0a\xa7\x91\xd4\xf0\xbc\xc1\xa8\xb9\x70\xd0\xc6\xa9\xb6\x78\x80\x5a\xa3\xb4\x2c\xf4\x18\x0b\x8a\x9d\xd0\xb4\x55\x10\xee\x0d\xc5\xd6\xe0\x99\x93\xdc\xa1\x04\xbb\xf1\xa7\x23\xd1\xd1\x97\x8c\x87\x13\x0a\x21\x02\xe9\x99\x25\xed\x20\xc5\x92\x66\x3c\x32\x9c\xd6\x06\xb0\x31\x5c\x86\x29\x0a\xcb\x60\x33\x12\xa5\x91\xfc\x96\x75\xd0\x59\xd7\x13\xbd\xd3\x23\x79\xdd\x2a\x90\xa6\x38\x06\x91\x39\x7f\x20\x72\x03\x1c\x2d\x01\x61\xba\x45\x37\x38\x22\x61\x8e\x71\x85\xc4\x32\x15\x28\x60\x61\x16\xb8\x3d\x29\xdc\x4d\x3d\x2f\x12\x13\x7d\xc8\x7e\x37\xee\xa8\x7f\xfa\xdb\xcb\x17\xff\x77\xfd\xf9\x7f\xee\x9f\x3d\xfe\xcf\xa7\xa7\x45\xfb\xcf\x1e\xf7\xf3\xe0\xff\xc4\x51\x0a\x8e\x4c\xcb\x01\xdc\x0a\x65\xb2\x01\x83\xed\x3d\xe4\xa9\xa3\x4e\x2d\x59\xc5\xe8\x2f\x48\x7d\x5a\x6e\x37\xbf\x5c\x9f\x35\x13\x64\x14\xfa\xef\x0b\x68\xa6\x0d\xb4\x8e\xf1\xa8\xff\xbb\x60\xf4\x03\x64\xab\x5b\x81\x65\x51\xe6\xda\xca\xfa\xf0\xb0\xac\x3e\x9c\xca\x26\x0e\x1d\xdb\x57\x5b\xbb\xb4\x9a\xa6\xb6\x9b\x1a\x6b\xd1\x9a\x9e\x7e\x33\x9a\xec\x41\x69\x45\x22\xb8\xb4\x51\xeb\x04\x77\xca\x6f\x7b\x7b\xc8\xb2\xb0\x95\x92\x25\x5b\xd0\x42\xaa\x2a\xdd\x32\x78\x4f\x0c\xab\x68\x46\x6c\xea\x6d\xf4\x5c\x5e\xde\xc4\xac\xa5\xf9\xd1\x00\x9f\x7d\x98\x65\x24\xbd\xc7\x97\xd4\xb3\x3a\xa8\x2b\xa0\x34\x76\xf9\x65\x5f\x2d\x25\x95\x1b\xcf\xd6\xf4\x9b\x5f\x09\x95\xb0\x36\x3f\xdb\xd0\x39\x2a\x93\x1c\x9d\x03\xa2\x4a\xca\xf5\xf6\x10\xb6\x94\x89\x0b\x6a\x70\x12\x13\x49\x6e\x40\xe4\x29\x12\x2b\xbd\x80\x45\x11\x04\xaa\xc2\x8f\x56\x9e\x5c\x6b\xec\x8d\x5a\x0e\x14\x59\x06\x2b\x1e\x24\xcb\xc2\x56\x4a\x31\xbe\x23\x71\x1a\xfb\x51\x2a\x0b\x3b\x1c\x48\x10\xa5\x82\xdc\xc0\xbb\x3e\x24\x8d\x5a\x76\x2e\x09\xed\xc1\x65\x51\xb8\x83\xcb\x3e\x24\x8d\x5a\x2e\x5d\xfe\x02\x74\x2d\x3d\xf1\xef\xae\xb8\x4b\xe6\x5e\xd4\xaa\xe2\x2e\x5c\x5e\xec\x0e\xf5\x5b\x0c\xcb\x0a\xbb\xa4\x3c\xf7\x1f\x2a\x55\x69\x97\x8c\x7d\x68\x95\xa5\xad\xb4\xf4\x9c\xa5\x07\xb9\x7a\x05\xbb\xad\x50\x6f\xfb\xa0\x4e\x9b\x48\x23\x49\x92\x28\x87\x19\x3e\x32\xee\xca\x3b\x46\x7e\x7f\x18\x64\xcc\xcc\x0f\x34\xe9\x36\x8b\xb7\x6c\xa8\xa5\x5b\x54\x4c\x54\x5b\x15\x3a\xf1\x6c\x2d\xfe\x96\xc8\x0d\xba\x7b\x81\x88\xc8\x23\xab\xee\x7d\x3b\x92\xa7\x60\x29\xe3\xdc\xff\xb8\x64\xe1\xf6\xa2\x5a\x59\xdc\x6f\xeb\x45\x7d\x6a\xd1\x76\x1e\xea\xb8\xf1\xfa\x14\xd3\x36\x63\xe5\xd7\xf3\xe4\xbe\x25\xbd\x5e\x05\xeb\x73\x74\xb5\x21\x2a\x2e\x4e\xa3\x30\xdf\xbf\x43\x28\x2a\xd1\xa5\x2a\x9d\x8a\xfd\x76\xd8\x8d\xbc\x67\x65\xc7\xb8\x03\x45\xec\xa3\xb0\x37\x8a\x70\x4c\x68\x91\x51\x8e\x58\x80\xed\x4a\xf3\x81\x62\xca\x96\xbb\xf1\x52\xcd\x80\xfb\xe4\x4a\x5d\x6c\xdf\x6e\x20\x4b\x80\x30\x8e\x28\x93\xf9\xe9\x8d\x8a\x6d\xd5\x59\x65\x7b\xaa\x44\x9e\xc0\xc2\xd1\x7c\x40\x26\xd6\x1a\xce\xf9\xc5\x69\x7b\x6c\xec\xc8\x71\x7b\xe5\x21\x2e\xd3\xe5\x65\x93\x91\x53\x0b\x7b\x3a\xc7\xfa\x17\x6a\x01\xa7\x33\xd0\xf4\x40\x0f\x39\x87\xda\xe4\x54\x87\x3a\xd5\xe3\xc7\xa6\x8e\x20\xd4\x11\xb2\x4e\xb1\xe9\x14\x9b\x4e\xb1\xe9\x14\x9b\xfe\x15\x63\xd3\x47\xf5\xff\x97\x38\xe9\xcf\x14\xf8\x76\x82\x49\x13\x4c\xaa\x7d\xcd\x6c\x62\x42\x49\x87\x43\x49\x19\x33\x6f\xe3\x44\x6e\x9b\xab\x8a\x3e\x86\xaa\x99\x52\x1b\x5b\x59\x33\x02\x09\xa0\x21\xa1\x6b\x84\x6b\x66\xbb\xdc\x16\x0c\xd3\x68\xab\xec\x36\x4b\xd8\x60\x8a\x40\x31\x85\x6e\x14\x57\x13\xc2\xfb\x92\x10\xde\xbf\x88\xdc\xbc\x53\x5e\x7f\x82\x7a\x13\xd4\x9b\xa0\xde\x04\xf5\x90\x01\xf5\x94\xcb\x7b\x83\x25\x9e\xd0\xde\x84\xf6\x6a\x5f\x4b\xb3\x98\x00\xdf\x04\xf8\x6c\xbc\x7f\x19\x80\xaf\xf1\x71\x45\x22\x98\x40\xe0\x04\x02\x27\x10\xd8\x29\xf5\x04\x02\xff\x4a\x20\x30\xc1\x72\xf3\x65\x02\x40\xd7\xc1\xd1\xe2\x6b\xf1\xa9\x7b\xfb\xe4\x20\xc0\x68\x9d\xd4\xb4\xd3\x96\xb5\xa6\xd1\x41\x20\xe6\x89\xc3\x48\x65\x58\x13\x84\x9c\x56\x56\x3b\x0c\xe0\x6b\x83\x5c\x13\xd2\x9a\x90\xd6\x84\xb4\x26\xa4\x85\x0c\xa4\x45\x19\xfd\xff\x63\x6c\x52\xb5\x1f\x1e\x19\x74\x3a\xcd\xb9\x69\xce\xa6\x3a\x0f\x7a\x2d\x19\xc7\x81\x14\x5d\xcb\xd5\x03\xc9\x39\xd0\xb0\xd1\xb3\xcd\xfb\x7a\x2d\x5d\x3a\x48\xe1\xfa\x2e\xe6\x81\x42\x18\x86\xd6\xc1\xbe\xb1\x23\xd3\xf7\x34\xed\x19\x0a\x0b\xc4\x48\x44\xfd\x22\x50\xb6\x42\x58\xbb\xe5\x3d\xa7\x73\xd4\x8b\xc4\x8c\x70\x61\xec\x73\xee\xc3\x81\x8b\xf5\xe2\xd7\x52\x3e\xcf\xeb\xeb\x17\x3b\x71\x16\xda\x7d\xb8\xde\xf0\x7a\x8f\x06\x2d\xa7\x40\x7b\xc1\x9d\x41\x4d\xb6\x61\xa2\x4e\x9f\x3d\xa0\xc5\xae\xe3\x1c\x1d\x40\x6c\x48\x8b\x63\xa0\xb5\x01\xed\x8e\x02\xe9\x86\xc8\x3b\x06\xee\xdb\x4b\xde\xbd\xc0\xa1\x6f\xcb\xda\xfc\xc2\x44\x16\x87\x9c\x17\x31\xd3\x30\x20\x39\x42\xcb\x6f\xf2\xf1\xf4\x72\x10\xf8\x1c\xa0\xf3\xbd\x10\xea\x21\x35\x7d\xe8\x86\xdb\x15\xed\x81\x81\x07\x28\xbb\x13\x28\xc7\xf8\xce\x7d\x8d\xc2\x31\xb4\x7e\x94\xd6\xdb\x55\xef\x4a\xfb\xed\xc3\x40\x3e\xeb\x9f\xe9\x99\x0f\xdf\x08\x65\x88\x27\x73\x86\x31\x9d\x47\xdf\x55\x19\xba\x3d\xee\x15\x0a\xcd\x8c\xaa\x5e\xb9\xf6\x57\x33\x73\x5a\xa1\x89\x7b\x3b\xa0\xb2\xa4\xc2\xf6\xc1\x53\xb5\x00\xca\x23\xe5\xf4\x60\x6a\xb4\x2d\x74\xea\x4e\xed\x3b\xe3\x47\xfb\xed\x82\x3d\x19\xd4\x3b\x6b\xaf\xae\x2b\x2f\x57\xb3\x82\x68\xcb\xed\x88\x2e\xe1\x5c\xd7\x26\xfa\x0a\x65\xe7\xce\x11\x33\xb4\xdd\x66\xe3\x37\xf6\xfa\x70\xd6\x4f\xa1\x21\x51\xd8\x3c\x26\x14\x4b\xc6\x87\x44\x27\x1c\x70\xf8\x9e\x46\xce\xab\x21\x07\x5f\xc1\x76\x17\x1b\x77\xb4\xda\x75\xa0\x0a\x3a\x30\xe1\xf8\x97\x32\x16\x2b\x00\x75\x85\xee\x62\x46\xef\xd3\x85\xb5\x6b\x60\xbe\xf2\x30\x7a\x8c\x0b\x4b\xa6\xd0\xf9\x64\x42\xe7\x07\x41\x41\xe3\x2c\x5d\xf9\x6d\xe9\x39\x98\x3b\x3b\x5d\x67\xd4\x5c\xed\xf2\xf0\x48\x7b\xbd\x2d\x31\xdd\x3f\x34\xad\x44\x76\x51\x9a\x56\x22\xa7\x95\xc8\x69\x25\xf2\xe1\x56\x22\x1f\x00\x32\x6a\x73\x92\xed\xe1\xc6\x7d\x9f\x49\x2c\x69\x7e\xc8\x31\x4c\x0c\xb4\xf2\x54\x3b\x79\x3b\x9e\x4d\xb4\xd1\x18\x3e\x5f\x9a\x93\xa2\x11\xc3\xda\x27\x0b\xaf\x37\x2e\x5c\x37\xfb\xeb\x9a\xd6\xc3\xac\xc3\xcc\xf8\x1e\x5b\x9d\xac\x22\x64\xb7\xed\x26\xb8\xf3\xb9\x3c\xbb\x1f\xe2\xb0\x22\x77\x43\x6a\x62\x29\x39\x59\xa6\xe6\xe5\xcd\x7b\x83\xc0\x5b\x8e\x93\x64\xac\xeb\xca\x4f\x65\xac\x4a\xbc\x1e\xcd\x82\xfa\x3c\x70\x36\xb6\xb5\xed\x79\xef\xec\x68\x00\xff\x54\xfa\xb5\xe3\xf1\xdb\xe1\xbe\xce\x76\x17\xaf\x57\xb6\x6b\x89\x05\x09\xce\x52\xb9\x01\x2a\x49\xbe\xd9\xf4\xd2\xb8\x7a\xbf\x91\x02\xf3\x22\x8c\x13\xf2\x77\xd8\x8e\x43\x8b\xe1\x54\x6e\x5e\x9d\xc7\x49\x44\x02\x22\xc7\xa4\x79\x81\x85\xb8\x65\x3c\x1c\x93\xe6\x59\xa2\xf8\x1c\x51\x95\x05\xd9\x20\x00\x21\x7e\x60\x21\x58\xa9\x56\xff\xbe\xb6\x5a\x5e\x5b\x3f\x1f\xd6\xd3\x3c\xc4\x4d\xba\x99\xb4\x63\x6e\x7d\x3e\x3d\x57\xd2\x18\x5f\x47\xe8\xc3\x06\x8a\x68\x6c\x7f\x3b\x72\x0f\xe7\xe2\x77\x77\xf1\xd0\x99\xab\xdf\x2e\xfe\xd6\xbb\xcd\x1a\xb9\x90\xd1\xaf\xf2\x38\x3d\xdb\x74\xf8\xeb\xe3\xda\xe8\x2a\x62\xb7\xda\x1b\x07\xa9\xdc\x30\x5e\xbc\x68\xfb\x6b\x9f\x97\xf1\xc6\xb1\xd8\x5c\x29\x1e\x49\x30\xc5\xf7\xde\xad\x91\x42\xf9\xdd\xed\x89\x80\x25\xbe\x37\xd7\xe7\x32\x5c\xe6\x35\xac\xd4\x0c\x2d\xf7\x90\xc4\xe3\xf5\xe3\x2f\x7f\x54\x18\x88\xe3\x61\x47\x85\x64\x7f\xc0\xd7\x3f\x1a\x92\x42\xe9\xc7\x1e\x0d\x95\x76\xa7\x51\xa0\x8f\x02\x1b\x46\x9e\x06\x42\xd1\xf2\x01\x07\x02\xde\xe9\x7d\x1a\x0b\xa7\x32\x16\xcc\xc0\xee\xc4\x90\xd2\x5f\x6f\x98\x54\x5d\xf2\x95\xe1\xa7\x69\x10\x3a\x06\xe1\x65\xb3\x17\x47\x58\x78\xd0\x45\xd6\x5b\xd5\x5f\x25\x1d\x71\x49\xa6\x7a\x64\xda\xd0\x6f\xc7\x3a\x4c\xe3\x09\xc0\x6e\x96\x2c\xa7\xa7\x77\x34\x10\x05\x08\x21\x44\x92\x65\x77\xdf\x20\x5c\xbc\xe7\x97\x3f\xf4\x1a\x45\xd6\xe7\x27\x4a\xde\x74\x27\x66\x11\x7d\x70\xba\xd3\x78\xf9\x1e\x0d\xca\xc8\x39\xde\x7c\xb3\xa6\xe1\xbc\xd7\xc1\x6a\x6f\xb3\x0e\x52\xbe\xe4\x98\x8a\x15\x70\x94\x70\x26\x59\xc0\xa2\xf2\x1c\xfb\xd9\xc5\xf9\xbc\xd5\x92\x9c\xa3\xdf\xe6\x1e\xb3\x0d\x49\xba\x87\x50\x5f\x84\xfe\xe9\xd6\xf8\xbb\xe6\xf0\x7a\xeb\xa6\x65\x3b\x86\x8b\x79\x93\xf5\x59\x20\x6e\xb4\xa7\x44\xf4\x3f\xa5\xfe\x67\x42\x12\xdb\xd3\xe7\xbb\xa5\xa3\x8c\x5c\x2b\x97\xbb\xbb\x7f\x8e\xc5\x6e\xed\x43\x5c\xbf\x74\xc8\x8f\xff\xe6\xd6\xbe\x91\xb6\xf5\x95\xe4\xed\x93\xc4\xa8\x5b\xf9\x76\x4d\x35\xb7\xd8\x8c\xb6\x7d\xaf\x72\xe0\xb6\xbd\x01\x63\x9e\x76\xab\x1a\x32\x76\xe4\x8c\x76\xc2\xad\x6c\xa2\x65\xf7\xcf\xf8\xa7\xda\x2a\xb9\x8c\x3d\x3c\xa3\x9d\x64\x33\xe5\x1a\xb5\x2d\xfb\x86\xa2\x5a\x7f\x19\x5b\x7f\xc6\x3f\xd1\x53\xd3\xe2\x41\x5b\xd3\x4f\xf0\xec\xb0\x42\x73\x43\xd2\x68\x27\xd3\x6a\x6a\x34\xf6\x4e\x1e\x52\x8b\x87\x6c\xcc\xae\x44\xfb\x9e\xa7\x51\x4f\x9d\x55\x03\x81\x8e\x67\xfc\xb4\x69\xf0\x3a\x18\xf2\x40\xd0\xf6\xa8\x34\xe3\xc9\x98\xaf\xf6\xda\x24\xd3\xeb\x60\xb9\x0e\xd3\x1f\xa9\xff\xee\x1f\xfd\x37\x00\x00\xff\xff\x69\x5d\x0a\x6a\x39\x9d\x00\x00") - -func v2SchemaJSONBytes() ([]byte, error) { - return bindataRead( - _v2SchemaJSON, - "v2/schema.json", - ) -} - -func v2SchemaJSON() (*asset, error) { - bytes, err := v2SchemaJSONBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "v2/schema.json", size: 40249, mode: os.FileMode(420), modTime: time.Unix(1482389892, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - cannonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[cannonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "jsonschema-draft-04.json": jsonschemaDraft04JSON, - "v2/schema.json": v2SchemaJSON, -} - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - cannonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(cannonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} -var _bintree = &bintree{nil, map[string]*bintree{ - "jsonschema-draft-04.json": &bintree{jsonschemaDraft04JSON, map[string]*bintree{}}, - "v2": &bintree{nil, map[string]*bintree{ - "schema.json": &bintree{v2SchemaJSON, map[string]*bintree{}}, - }}, -}} - -// RestoreAsset restores an asset under the given directory -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) - if err != nil { - return err - } - return nil -} - -// RestoreAssets restores an asset under the given directory recursively -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - cannonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) -} - diff --git a/vendor/github.com/go-openapi/spec/contact_info.go b/vendor/github.com/go-openapi/spec/contact_info.go deleted file mode 100644 index f285970aa1..0000000000 --- a/vendor/github.com/go-openapi/spec/contact_info.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -// ContactInfo contact information for the exposed API. -// -// For more information: http://goo.gl/8us55a#contactObject -type ContactInfo struct { - Name string `json:"name,omitempty"` - URL string `json:"url,omitempty"` - Email string `json:"email,omitempty"` -} diff --git a/vendor/github.com/go-openapi/spec/contact_info_test.go b/vendor/github.com/go-openapi/spec/contact_info_test.go deleted file mode 100644 index 5e644d0f0e..0000000000 --- a/vendor/github.com/go-openapi/spec/contact_info_test.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "testing" -) - -var contactInfoJSON = `{"name":"wordnik api team","url":"http://developer.wordnik.com","email":"some@mailayada.dkdkd"}` -var contactInfoYAML = `name: wordnik api team -url: http://developer.wordnik.com -email: some@mailayada.dkdkd -` -var contactInfo = ContactInfo{ - Name: "wordnik api team", - URL: "http://developer.wordnik.com", - Email: "some@mailayada.dkdkd", -} - -func TestIntegrationContactInfo(t *testing.T) { - assertSerializeJSON(t, contactInfo, contactInfoJSON) - assertSerializeYAML(t, contactInfo, contactInfoYAML) - assertParsesJSON(t, contactInfoJSON, contactInfo) - assertParsesYAML(t, contactInfoYAML, contactInfo) -} diff --git a/vendor/github.com/go-openapi/spec/expander.go b/vendor/github.com/go-openapi/spec/expander.go deleted file mode 100644 index 7af80691fb..0000000000 --- a/vendor/github.com/go-openapi/spec/expander.go +++ /dev/null @@ -1,908 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "fmt" - "log" - "net/url" - "os" - "path/filepath" - "reflect" - "strings" - "sync" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" -) - -var ( - // Debug enables logging when SWAGGER_DEBUG env var is not empty - Debug = os.Getenv("SWAGGER_DEBUG") != "" -) - -// ExpandOptions provides options for expand. -type ExpandOptions struct { - RelativeBase string - SkipSchemas bool - ContinueOnError bool -} - -// ResolutionCache a cache for resolving urls -type ResolutionCache interface { - Get(string) (interface{}, bool) - Set(string, interface{}) -} - -type simpleCache struct { - lock sync.Mutex - store map[string]interface{} -} - -var resCache ResolutionCache - -func init() { - resCache = initResolutionCache() -} - -func initResolutionCache() ResolutionCache { - return &simpleCache{store: map[string]interface{}{ - "http://swagger.io/v2/schema.json": MustLoadSwagger20Schema(), - "http://json-schema.org/draft-04/schema": MustLoadJSONSchemaDraft04(), - }} -} - -func (s *simpleCache) Get(uri string) (interface{}, bool) { - debugLog("getting %q from resolution cache", uri) - s.lock.Lock() - v, ok := s.store[uri] - debugLog("got %q from resolution cache: %t", uri, ok) - - s.lock.Unlock() - return v, ok -} - -func (s *simpleCache) Set(uri string, data interface{}) { - s.lock.Lock() - s.store[uri] = data - s.lock.Unlock() -} - -// ResolveRefWithBase resolves a reference against a context root with preservation of base path -func ResolveRefWithBase(root interface{}, ref *Ref, opts *ExpandOptions) (*Schema, error) { - resolver, err := defaultSchemaLoader(root, nil, opts, nil) - if err != nil { - return nil, err - } - - result := new(Schema) - if err := resolver.Resolve(ref, result); err != nil { - return nil, err - } - return result, nil -} - -// ResolveRef resolves a reference against a context root -func ResolveRef(root interface{}, ref *Ref) (*Schema, error) { - return ResolveRefWithBase(root, ref, nil) -} - -// ResolveParameter resolves a paramter reference against a context root -func ResolveParameter(root interface{}, ref Ref) (*Parameter, error) { - return ResolveParameterWithBase(root, ref, nil) -} - -// ResolveParameterWithBase resolves a paramter reference against a context root and base path -func ResolveParameterWithBase(root interface{}, ref Ref, opts *ExpandOptions) (*Parameter, error) { - resolver, err := defaultSchemaLoader(root, nil, opts, nil) - if err != nil { - return nil, err - } - - result := new(Parameter) - if err := resolver.Resolve(&ref, result); err != nil { - return nil, err - } - return result, nil -} - -// ResolveResponse resolves response a reference against a context root -func ResolveResponse(root interface{}, ref Ref) (*Response, error) { - return ResolveResponseWithBase(root, ref, nil) -} - -// ResolveResponseWithBase resolves response a reference against a context root and base path -func ResolveResponseWithBase(root interface{}, ref Ref, opts *ExpandOptions) (*Response, error) { - resolver, err := defaultSchemaLoader(root, nil, opts, nil) - if err != nil { - return nil, err - } - - result := new(Response) - if err := resolver.Resolve(&ref, result); err != nil { - return nil, err - } - return result, nil -} - -// ResolveItems resolves header and parameter items reference against a context root and base path -func ResolveItems(root interface{}, ref Ref, opts *ExpandOptions) (*Items, error) { - resolver, err := defaultSchemaLoader(root, nil, opts, nil) - if err != nil { - return nil, err - } - - result := new(Items) - if err := resolver.Resolve(&ref, result); err != nil { - return nil, err - } - return result, nil -} - -// ResolvePathItem resolves response a path item against a context root and base path -func ResolvePathItem(root interface{}, ref Ref, opts *ExpandOptions) (*PathItem, error) { - resolver, err := defaultSchemaLoader(root, nil, opts, nil) - if err != nil { - return nil, err - } - - result := new(PathItem) - if err := resolver.Resolve(&ref, result); err != nil { - return nil, err - } - return result, nil -} - -type schemaLoader struct { - loadingRef *Ref - startingRef *Ref - currentRef *Ref - root interface{} - options *ExpandOptions - cache ResolutionCache - loadDoc func(string) (json.RawMessage, error) -} - -var idPtr, _ = jsonpointer.New("/id") -var refPtr, _ = jsonpointer.New("/$ref") - -// PathLoader function to use when loading remote refs -var PathLoader func(string) (json.RawMessage, error) - -func init() { - PathLoader = func(path string) (json.RawMessage, error) { - data, err := swag.LoadFromFileOrHTTP(path) - if err != nil { - return nil, err - } - return json.RawMessage(data), nil - } -} - -func defaultSchemaLoader( - root interface{}, - ref *Ref, - expandOptions *ExpandOptions, - cache ResolutionCache) (*schemaLoader, error) { - - if cache == nil { - cache = resCache - } - if expandOptions == nil { - expandOptions = &ExpandOptions{} - } - - var ptr *jsonpointer.Pointer - if ref != nil { - ptr = ref.GetPointer() - } - - currentRef := nextRef(root, ref, ptr) - - return &schemaLoader{ - loadingRef: ref, - startingRef: ref, - currentRef: currentRef, - root: root, - options: expandOptions, - cache: cache, - loadDoc: func(path string) (json.RawMessage, error) { - debugLog("fetching document at %q", path) - return PathLoader(path) - }, - }, nil -} - -func idFromNode(node interface{}) (*Ref, error) { - if idValue, _, err := idPtr.Get(node); err == nil { - if refStr, ok := idValue.(string); ok && refStr != "" { - idRef, err := NewRef(refStr) - if err != nil { - return nil, err - } - return &idRef, nil - } - } - return nil, nil -} - -func nextRef(startingNode interface{}, startingRef *Ref, ptr *jsonpointer.Pointer) *Ref { - if startingRef == nil { - return nil - } - - if ptr == nil { - return startingRef - } - - ret := startingRef - var idRef *Ref - node := startingNode - - for _, tok := range ptr.DecodedTokens() { - node, _, _ = jsonpointer.GetForToken(node, tok) - if node == nil { - break - } - - idRef, _ = idFromNode(node) - if idRef != nil { - nw, err := ret.Inherits(*idRef) - if err != nil { - break - } - ret = nw - } - - refRef, _, _ := refPtr.Get(node) - if refRef != nil { - var rf Ref - switch value := refRef.(type) { - case string: - rf, _ = NewRef(value) - } - nw, err := ret.Inherits(rf) - if err != nil { - break - } - nwURL := nw.GetURL() - if nwURL.Scheme == "file" || (nwURL.Scheme == "" && nwURL.Host == "") { - nwpt := filepath.ToSlash(nwURL.Path) - if filepath.IsAbs(nwpt) { - _, err := os.Stat(nwpt) - if err != nil { - nwURL.Path = filepath.Join(".", nwpt) - } - } - } - - ret = nw - } - - } - - return ret -} - -func debugLog(msg string, args ...interface{}) { - if Debug { - log.Printf(msg, args...) - } -} - -func normalizeFileRef(ref *Ref, relativeBase string) *Ref { - refURL := ref.GetURL() - debugLog("normalizing %s against %s (%s)", ref.String(), relativeBase, refURL.String()) - if strings.HasPrefix(refURL.String(), "#") { - return ref - } - - if refURL.Scheme == "file" || (refURL.Scheme == "" && refURL.Host == "") { - filePath := refURL.Path - debugLog("normalizing file path: %s", filePath) - - if !filepath.IsAbs(filepath.FromSlash(filePath)) && len(relativeBase) != 0 { - debugLog("joining %s with %s", relativeBase, filePath) - if fi, err := os.Stat(filepath.FromSlash(relativeBase)); err == nil { - if !fi.IsDir() { - relativeBase = filepath.Dir(filepath.FromSlash(relativeBase)) - } - } - filePath = filepath.Join(filepath.FromSlash(relativeBase), filepath.FromSlash(filePath)) - } - if !filepath.IsAbs(filepath.FromSlash(filePath)) { - pwd, err := os.Getwd() - if err == nil { - debugLog("joining cwd %s with %s", pwd, filePath) - filePath = filepath.Join(pwd, filepath.FromSlash(filePath)) - } - } - - debugLog("cleaning %s", filePath) - filePath = filepath.Clean(filepath.FromSlash(filePath)) - _, err := os.Stat(filepath.FromSlash(filePath)) - if err == nil { - debugLog("rewriting url %s to scheme \"\" path %s", refURL.String(), filePath) - slp := filepath.FromSlash(filePath) - if filepath.IsAbs(slp) && filepath.Separator == '\\' && len(slp) > 1 && slp[1] == ':' && ('a' <= slp[0] && slp[0] <= 'z' || 'A' <= slp[0] && slp[0] <= 'Z') { - slp = slp[2:] - } - refURL.Scheme = "" - refURL.Path = filepath.ToSlash(slp) - debugLog("new url with joined filepath: %s", refURL.String()) - *ref = MustCreateRef(refURL.String()) - } - } - - debugLog("refurl: %s", ref.GetURL().String()) - return ref -} - -func (r *schemaLoader) resolveRef(currentRef, ref *Ref, node, target interface{}) error { - tgt := reflect.ValueOf(target) - if tgt.Kind() != reflect.Ptr { - return fmt.Errorf("resolve ref: target needs to be a pointer") - } - - oldRef := currentRef - if currentRef != nil { - debugLog("resolve ref current %s new %s", currentRef.String(), ref.String()) - nextRef := nextRef(node, ref, currentRef.GetPointer()) - if nextRef == nil || nextRef.GetURL() == nil { - return nil - } - var err error - currentRef, err = currentRef.Inherits(*nextRef) - debugLog("resolved ref current %s", currentRef.String()) - if err != nil { - return err - } - } - - if currentRef == nil { - currentRef = ref - } - - refURL := currentRef.GetURL() - if refURL == nil { - return nil - } - if currentRef.IsRoot() { - nv := reflect.ValueOf(node) - reflect.Indirect(tgt).Set(reflect.Indirect(nv)) - return nil - } - - if strings.HasPrefix(refURL.String(), "#") { - res, _, err := ref.GetPointer().Get(node) - if err != nil { - res, _, err = ref.GetPointer().Get(r.root) - if err != nil { - return err - } - } - rv := reflect.Indirect(reflect.ValueOf(res)) - tgtType := reflect.Indirect(tgt).Type() - if rv.Type().AssignableTo(tgtType) { - reflect.Indirect(tgt).Set(reflect.Indirect(reflect.ValueOf(res))) - } else { - if err := swag.DynamicJSONToStruct(rv.Interface(), target); err != nil { - return err - } - } - - return nil - } - - relativeBase := "" - if r.options != nil && r.options.RelativeBase != "" { - relativeBase = r.options.RelativeBase - } - normalizeFileRef(currentRef, relativeBase) - debugLog("current ref normalized file: %s", currentRef.String()) - normalizeFileRef(ref, relativeBase) - debugLog("ref normalized file: %s", currentRef.String()) - - data, _, _, err := r.load(currentRef.GetURL()) - if err != nil { - return err - } - - if ((oldRef == nil && currentRef != nil) || - (oldRef != nil && currentRef == nil) || - oldRef.String() != currentRef.String()) && - ((oldRef == nil && ref != nil) || - (oldRef != nil && ref == nil) || - (oldRef.String() != ref.String())) { - - return r.resolveRef(currentRef, ref, data, target) - } - - var res interface{} - if currentRef.String() != "" { - res, _, err = currentRef.GetPointer().Get(data) - if err != nil { - if strings.HasPrefix(ref.String(), "#") { - if r.loadingRef != nil { - rr, er := r.loadingRef.Inherits(*ref) - if er != nil { - return er - } - refURL = rr.GetURL() - - data, _, _, err = r.load(refURL) - if err != nil { - return err - } - } else { - data = r.root - } - } - - res, _, err = ref.GetPointer().Get(data) - if err != nil { - return err - } - } - } else { - res = data - } - - if err := swag.DynamicJSONToStruct(res, target); err != nil { - return err - } - - return nil -} - -func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error) { - debugLog("loading schema from url: %s", refURL) - toFetch := *refURL - toFetch.Fragment = "" - - data, fromCache := r.cache.Get(toFetch.String()) - if !fromCache { - b, err := r.loadDoc(toFetch.String()) - if err != nil { - return nil, url.URL{}, false, err - } - - if err := json.Unmarshal(b, &data); err != nil { - return nil, url.URL{}, false, err - } - r.cache.Set(toFetch.String(), data) - } - - return data, toFetch, fromCache, nil -} - -func (r *schemaLoader) Resolve(ref *Ref, target interface{}) error { - return r.resolveRef(r.currentRef, ref, r.root, target) -} - -func (r *schemaLoader) reset() { - ref := r.startingRef - - var ptr *jsonpointer.Pointer - if ref != nil { - ptr = ref.GetPointer() - } - - r.currentRef = nextRef(r.root, ref, ptr) -} - -// ExpandSpec expands the references in a swagger spec -func ExpandSpec(spec *Swagger, options *ExpandOptions) error { - resolver, err := defaultSchemaLoader(spec, nil, options, nil) - // Just in case this ever returns an error. - if shouldStopOnError(err, resolver.options) { - return err - } - - if options == nil || !options.SkipSchemas { - for key, definition := range spec.Definitions { - var def *Schema - var err error - if def, err = expandSchema(definition, []string{"#/definitions/" + key}, resolver); shouldStopOnError(err, resolver.options) { - return err - } - resolver.reset() - spec.Definitions[key] = *def - } - } - - for key, parameter := range spec.Parameters { - if err := expandParameter(¶meter, resolver); shouldStopOnError(err, resolver.options) { - return err - } - spec.Parameters[key] = parameter - } - - for key, response := range spec.Responses { - if err := expandResponse(&response, resolver); shouldStopOnError(err, resolver.options) { - return err - } - spec.Responses[key] = response - } - - if spec.Paths != nil { - for key, path := range spec.Paths.Paths { - if err := expandPathItem(&path, resolver); shouldStopOnError(err, resolver.options) { - return err - } - spec.Paths.Paths[key] = path - } - } - - return nil -} - -func shouldStopOnError(err error, opts *ExpandOptions) bool { - if err != nil && !opts.ContinueOnError { - return true - } - - if err != nil { - log.Println(err) - } - - return false -} - -// ExpandSchema expands the refs in the schema object -func ExpandSchema(schema *Schema, root interface{}, cache ResolutionCache) error { - return ExpandSchemaWithBasePath(schema, root, cache, nil) -} - -// ExpandSchemaWithBasePath expands the refs in the schema object, base path configured through expand options -func ExpandSchemaWithBasePath(schema *Schema, root interface{}, cache ResolutionCache, opts *ExpandOptions) error { - if schema == nil { - return nil - } - if root == nil { - root = schema - } - - nrr, _ := NewRef(schema.ID) - var rrr *Ref - if nrr.String() != "" { - switch rt := root.(type) { - case *Schema: - rid, _ := NewRef(rt.ID) - rrr, _ = rid.Inherits(nrr) - case *Swagger: - rid, _ := NewRef(rt.ID) - rrr, _ = rid.Inherits(nrr) - } - } - - resolver, err := defaultSchemaLoader(root, rrr, opts, cache) - if err != nil { - return err - } - - refs := []string{""} - if rrr != nil { - refs[0] = rrr.String() - } - var s *Schema - if s, err = expandSchema(*schema, refs, resolver); err != nil { - return err - } - *schema = *s - return nil -} - -func expandItems(target Schema, parentRefs []string, resolver *schemaLoader) (*Schema, error) { - if target.Items != nil { - if target.Items.Schema != nil { - t, err := expandSchema(*target.Items.Schema, parentRefs, resolver) - if err != nil { - if target.Items.Schema.ID == "" { - target.Items.Schema.ID = target.ID - if err != nil { - t, err = expandSchema(*target.Items.Schema, parentRefs, resolver) - if err != nil { - return nil, err - } - } - } - } - *target.Items.Schema = *t - } - for i := range target.Items.Schemas { - t, err := expandSchema(target.Items.Schemas[i], parentRefs, resolver) - if err != nil { - return nil, err - } - target.Items.Schemas[i] = *t - } - } - return &target, nil -} - -func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader) (*Schema, error) { - if target.Ref.String() == "" && target.Ref.IsRoot() { - debugLog("skipping expand schema for no ref and root: %v", resolver.root) - - return resolver.root.(*Schema), nil - } - - var t *Schema - var basePath string - b, _ := json.Marshal(target) - debugLog("Target is: %s", string(b)) - for target.Ref.String() != "" { - if swag.ContainsStringsCI(parentRefs, target.Ref.String()) { - return &target, nil - } - basePath = target.Ref.RemoteURI() - debugLog("\n\n\n\n\nbasePath: %s", basePath) - b, _ := json.Marshal(target) - debugLog("calling Resolve with target: %s", string(b)) - if err := resolver.Resolve(&target.Ref, &t); shouldStopOnError(err, resolver.options) { - return &target, err - } - - if swag.ContainsStringsCI(parentRefs, target.Ref.String()) { - debugLog("ref already exists in parent") - return &target, nil - } - parentRefs = append(parentRefs, target.Ref.String()) - if t != nil { - target = *t - } - } - if target.Ref.String() == "" { - b, _ := json.Marshal(target) - debugLog("before: %s", string(b)) - modifyRefs(&target, basePath) - b, _ = json.Marshal(target) - debugLog("after: %s", string(b)) - } - t, err := expandItems(target, parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return &target, err - } - if t != nil { - target = *t - } - - resolver.reset() - - for i := range target.AllOf { - t, err := expandSchema(target.AllOf[i], parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return &target, err - } - if t != nil { - target.AllOf[i] = *t - } - } - for i := range target.AnyOf { - t, err := expandSchema(target.AnyOf[i], parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return &target, err - } - target.AnyOf[i] = *t - } - for i := range target.OneOf { - t, err := expandSchema(target.OneOf[i], parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return &target, err - } - if t != nil { - target.OneOf[i] = *t - } - } - if target.Not != nil { - t, err := expandSchema(*target.Not, parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return &target, err - } - if t != nil { - *target.Not = *t - } - } - for k := range target.Properties { - t, err := expandSchema(target.Properties[k], parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return &target, err - } - if t != nil { - target.Properties[k] = *t - } - } - if target.AdditionalProperties != nil && target.AdditionalProperties.Schema != nil { - t, err := expandSchema(*target.AdditionalProperties.Schema, parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return &target, err - } - if t != nil { - *target.AdditionalProperties.Schema = *t - } - } - for k := range target.PatternProperties { - t, err := expandSchema(target.PatternProperties[k], parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return &target, err - } - if t != nil { - target.PatternProperties[k] = *t - } - } - for k := range target.Dependencies { - if target.Dependencies[k].Schema != nil { - t, err := expandSchema(*target.Dependencies[k].Schema, parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return &target, err - } - if t != nil { - *target.Dependencies[k].Schema = *t - } - } - } - if target.AdditionalItems != nil && target.AdditionalItems.Schema != nil { - t, err := expandSchema(*target.AdditionalItems.Schema, parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return &target, err - } - if t != nil { - *target.AdditionalItems.Schema = *t - } - } - for k := range target.Definitions { - t, err := expandSchema(target.Definitions[k], parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return &target, err - } - if t != nil { - target.Definitions[k] = *t - } - } - return &target, nil -} - -func expandPathItem(pathItem *PathItem, resolver *schemaLoader) error { - if pathItem == nil { - return nil - } - - if pathItem.Ref.String() != "" { - if err := resolver.Resolve(&pathItem.Ref, &pathItem); err != nil { - return err - } - resolver.reset() - pathItem.Ref = Ref{} - } - - for idx := range pathItem.Parameters { - if err := expandParameter(&(pathItem.Parameters[idx]), resolver); shouldStopOnError(err, resolver.options) { - return err - } - } - if err := expandOperation(pathItem.Get, resolver); shouldStopOnError(err, resolver.options) { - return err - } - if err := expandOperation(pathItem.Head, resolver); shouldStopOnError(err, resolver.options) { - return err - } - if err := expandOperation(pathItem.Options, resolver); shouldStopOnError(err, resolver.options) { - return err - } - if err := expandOperation(pathItem.Put, resolver); shouldStopOnError(err, resolver.options) { - return err - } - if err := expandOperation(pathItem.Post, resolver); shouldStopOnError(err, resolver.options) { - return err - } - if err := expandOperation(pathItem.Patch, resolver); shouldStopOnError(err, resolver.options) { - return err - } - if err := expandOperation(pathItem.Delete, resolver); shouldStopOnError(err, resolver.options) { - return err - } - return nil -} - -func expandOperation(op *Operation, resolver *schemaLoader) error { - if op == nil { - return nil - } - - for i, param := range op.Parameters { - if err := expandParameter(¶m, resolver); shouldStopOnError(err, resolver.options) { - return err - } - op.Parameters[i] = param - } - - if op.Responses != nil { - responses := op.Responses - if err := expandResponse(responses.Default, resolver); shouldStopOnError(err, resolver.options) { - return err - } - for code, response := range responses.StatusCodeResponses { - if err := expandResponse(&response, resolver); shouldStopOnError(err, resolver.options) { - return err - } - responses.StatusCodeResponses[code] = response - } - } - return nil -} - -func expandResponse(response *Response, resolver *schemaLoader) error { - if response == nil { - return nil - } - - var parentRefs []string - - if response.Ref.String() != "" { - parentRefs = append(parentRefs, response.Ref.String()) - if err := resolver.Resolve(&response.Ref, response); shouldStopOnError(err, resolver.options) { - return err - } - resolver.reset() - response.Ref = Ref{} - } - - if !resolver.options.SkipSchemas && response.Schema != nil { - parentRefs = append(parentRefs, response.Schema.Ref.String()) - debugLog("response ref: %s", response.Schema.Ref) - if err := resolver.Resolve(&response.Schema.Ref, &response.Schema); shouldStopOnError(err, resolver.options) { - return err - } - s, err := expandSchema(*response.Schema, parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return err - } - resolver.reset() - *response.Schema = *s - } - return nil -} - -func expandParameter(parameter *Parameter, resolver *schemaLoader) error { - if parameter == nil { - return nil - } - - var parentRefs []string - - if parameter.Ref.String() != "" { - parentRefs = append(parentRefs, parameter.Ref.String()) - if err := resolver.Resolve(¶meter.Ref, parameter); shouldStopOnError(err, resolver.options) { - return err - } - resolver.reset() - parameter.Ref = Ref{} - } - if !resolver.options.SkipSchemas && parameter.Schema != nil { - parentRefs = append(parentRefs, parameter.Schema.Ref.String()) - if err := resolver.Resolve(¶meter.Schema.Ref, ¶meter.Schema); shouldStopOnError(err, resolver.options) { - return err - } - s, err := expandSchema(*parameter.Schema, parentRefs, resolver) - if shouldStopOnError(err, resolver.options) { - return err - } - resolver.reset() - *parameter.Schema = *s - } - return nil -} diff --git a/vendor/github.com/go-openapi/spec/expander_test.go b/vendor/github.com/go-openapi/spec/expander_test.go deleted file mode 100644 index 09c8573cfa..0000000000 --- a/vendor/github.com/go-openapi/spec/expander_test.go +++ /dev/null @@ -1,1162 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "io/ioutil" - "net/http" - "net/http/httptest" - "testing" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" - "github.com/stretchr/testify/assert" -) - -func jsonDoc(path string) (json.RawMessage, error) { - data, err := swag.LoadFromFileOrHTTP(path) - if err != nil { - return nil, err - } - return json.RawMessage(data), nil -} - -func TestExpandsKnownRef(t *testing.T) { - schema := RefProperty("http://json-schema.org/draft-04/schema#") - if assert.NoError(t, ExpandSchema(schema, nil, nil)) { - assert.Equal(t, "Core schema meta-schema", schema.Description) - } -} - -func TestExpandResponseSchema(t *testing.T) { - fp := "./fixtures/local_expansion/spec.json" - b, err := jsonDoc(fp) - if assert.NoError(t, err) { - var spec Swagger - if err := json.Unmarshal(b, &spec); assert.NoError(t, err) { - err := ExpandSpec(&spec, &ExpandOptions{RelativeBase: fp}) - if assert.NoError(t, err) { - sch := spec.Paths.Paths["/item"].Get.Responses.StatusCodeResponses[200].Schema - if assert.NotNil(t, sch) { - assert.Empty(t, sch.Ref.String()) - assert.Contains(t, sch.Type, "object") - assert.Len(t, sch.Properties, 2) - } - } - } - } -} - -func TestSpecExpansion(t *testing.T) { - spec := new(Swagger) - // resolver, err := defaultSchemaLoader(spec, nil, nil) - // assert.NoError(t, err) - - err := ExpandSpec(spec, nil) - assert.NoError(t, err) - - specDoc, err := jsonDoc("fixtures/expansion/all-the-things.json") - assert.NoError(t, err) - - spec = new(Swagger) - err = json.Unmarshal(specDoc, spec) - assert.NoError(t, err) - - pet := spec.Definitions["pet"] - errorModel := spec.Definitions["errorModel"] - petResponse := spec.Responses["petResponse"] - petResponse.Schema = &pet - stringResponse := spec.Responses["stringResponse"] - tagParam := spec.Parameters["tag"] - idParam := spec.Parameters["idParam"] - - err = ExpandSpec(spec, nil) - assert.NoError(t, err) - - assert.Equal(t, tagParam, spec.Parameters["query"]) - assert.Equal(t, petResponse, spec.Responses["petResponse"]) - assert.Equal(t, petResponse, spec.Responses["anotherPet"]) - assert.Equal(t, pet, *spec.Responses["petResponse"].Schema) - assert.Equal(t, stringResponse, *spec.Paths.Paths["/"].Get.Responses.Default) - assert.Equal(t, petResponse, spec.Paths.Paths["/"].Get.Responses.StatusCodeResponses[200]) - assert.Equal(t, pet, *spec.Paths.Paths["/pets"].Get.Responses.StatusCodeResponses[200].Schema.Items.Schema) - assert.Equal(t, errorModel, *spec.Paths.Paths["/pets"].Get.Responses.Default.Schema) - assert.Equal(t, pet, spec.Definitions["petInput"].AllOf[0]) - assert.Equal(t, spec.Definitions["petInput"], *spec.Paths.Paths["/pets"].Post.Parameters[0].Schema) - assert.Equal(t, petResponse, spec.Paths.Paths["/pets"].Post.Responses.StatusCodeResponses[200]) - assert.Equal(t, errorModel, *spec.Paths.Paths["/pets"].Post.Responses.Default.Schema) - pi := spec.Paths.Paths["/pets/{id}"] - assert.Equal(t, idParam, pi.Get.Parameters[0]) - assert.Equal(t, petResponse, pi.Get.Responses.StatusCodeResponses[200]) - assert.Equal(t, errorModel, *pi.Get.Responses.Default.Schema) - assert.Equal(t, idParam, pi.Delete.Parameters[0]) - assert.Equal(t, errorModel, *pi.Delete.Responses.Default.Schema) -} - -func TestResponseExpansion(t *testing.T) { - specDoc, err := jsonDoc("fixtures/expansion/all-the-things.json") - assert.NoError(t, err) - - spec := new(Swagger) - err = json.Unmarshal(specDoc, spec) - assert.NoError(t, err) - - resolver, err := defaultSchemaLoader(spec, nil, nil, nil) - assert.NoError(t, err) - - resp := spec.Responses["anotherPet"] - expected := spec.Responses["petResponse"] - - err = expandResponse(&resp, resolver) - assert.NoError(t, err) - assert.Equal(t, expected, resp) - - resp2 := spec.Paths.Paths["/"].Get.Responses.Default - expected = spec.Responses["stringResponse"] - - err = expandResponse(resp2, resolver) - assert.NoError(t, err) - assert.Equal(t, expected, *resp2) - - resp = spec.Paths.Paths["/"].Get.Responses.StatusCodeResponses[200] - expected = spec.Responses["petResponse"] - - err = expandResponse(&resp, resolver) - assert.NoError(t, err) - // assert.Equal(t, expected, resp) -} - -func TestIssue3(t *testing.T) { - spec := new(Swagger) - specDoc, err := jsonDoc("fixtures/expansion/overflow.json") - assert.NoError(t, err) - - err = json.Unmarshal(specDoc, spec) - assert.NoError(t, err) - - assert.NotPanics(t, func() { - err = ExpandSpec(spec, nil) - assert.NoError(t, err) - }, "Calling expand spec with circular refs, should not panic!") -} - -func TestParameterExpansion(t *testing.T) { - paramDoc, err := jsonDoc("fixtures/expansion/params.json") - assert.NoError(t, err) - - spec := new(Swagger) - err = json.Unmarshal(paramDoc, spec) - assert.NoError(t, err) - - resolver, err := defaultSchemaLoader(spec, nil, nil, nil) - assert.NoError(t, err) - - param := spec.Parameters["query"] - expected := spec.Parameters["tag"] - - err = expandParameter(¶m, resolver) - assert.NoError(t, err) - assert.Equal(t, expected, param) - - param = spec.Paths.Paths["/cars/{id}"].Parameters[0] - expected = spec.Parameters["id"] - - err = expandParameter(¶m, resolver) - assert.NoError(t, err) - assert.Equal(t, expected, param) -} - -func TestCircularRefsExpansion(t *testing.T) { - carsDoc, err := jsonDoc("fixtures/expansion/circularRefs.json") - assert.NoError(t, err) - - spec := new(Swagger) - err = json.Unmarshal(carsDoc, spec) - assert.NoError(t, err) - - resolver, err := defaultSchemaLoader(spec, nil, nil, nil) - assert.NoError(t, err) - schema := spec.Definitions["car"] - - assert.NotPanics(t, func() { - _, err = expandSchema(schema, []string{"#/definitions/car"}, resolver) - assert.NoError(t, err) - }, "Calling expand schema with circular refs, should not panic!") -} - -func TestContinueOnErrorExpansion(t *testing.T) { - missingRefDoc, err := jsonDoc("fixtures/expansion/missingRef.json") - assert.NoError(t, err) - - testCase := struct { - Input *Swagger `json:"input"` - Expected *Swagger `json:"expected"` - }{} - err = json.Unmarshal(missingRefDoc, &testCase) - assert.NoError(t, err) - - opts := &ExpandOptions{ - ContinueOnError: true, - } - err = ExpandSpec(testCase.Input, opts) - assert.NoError(t, err) - assert.Equal(t, testCase.Input, testCase.Expected, "Should continue expanding spec when a definition can't be found.") - - doc, err := jsonDoc("fixtures/expansion/missingItemRef.json") - spec := new(Swagger) - err = json.Unmarshal(doc, spec) - assert.NoError(t, err) - - assert.NotPanics(t, func() { - err = ExpandSpec(spec, opts) - assert.NoError(t, err) - }, "Array of missing refs should not cause a panic, and continue to expand spec.") -} - -func TestIssue415(t *testing.T) { - doc, err := jsonDoc("fixtures/expansion/clickmeter.json") - assert.NoError(t, err) - - spec := new(Swagger) - err = json.Unmarshal(doc, spec) - assert.NoError(t, err) - - assert.NotPanics(t, func() { - err = ExpandSpec(spec, nil) - assert.NoError(t, err) - }, "Calling expand spec with response schemas that have circular refs, should not panic!") -} - -func TestCircularSpecExpansion(t *testing.T) { - doc, err := jsonDoc("fixtures/expansion/circularSpec.json") - assert.NoError(t, err) - - spec := new(Swagger) - err = json.Unmarshal(doc, spec) - assert.NoError(t, err) - - assert.NotPanics(t, func() { - err = ExpandSpec(spec, nil) - assert.NoError(t, err) - }, "Calling expand spec with circular refs, should not panic!") -} - -func TestItemsExpansion(t *testing.T) { - carsDoc, err := jsonDoc("fixtures/expansion/schemas2.json") - assert.NoError(t, err) - - spec := new(Swagger) - err = json.Unmarshal(carsDoc, spec) - assert.NoError(t, err) - - resolver, err := defaultSchemaLoader(spec, nil, nil, nil) - assert.NoError(t, err) - - schema := spec.Definitions["car"] - oldBrand := schema.Properties["brand"] - assert.NotEmpty(t, oldBrand.Items.Schema.Ref.String()) - assert.NotEqual(t, spec.Definitions["brand"], oldBrand) - - _, err = expandSchema(schema, []string{"#/definitions/car"}, resolver) - assert.NoError(t, err) - - newBrand := schema.Properties["brand"] - assert.Empty(t, newBrand.Items.Schema.Ref.String()) - assert.Equal(t, spec.Definitions["brand"], *newBrand.Items.Schema) - - schema = spec.Definitions["truck"] - assert.NotEmpty(t, schema.Items.Schema.Ref.String()) - - s, err := expandSchema(schema, []string{"#/definitions/truck"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.Items.Schema.Ref.String()) - assert.Equal(t, spec.Definitions["car"], *schema.Items.Schema) - - sch := new(Schema) - _, err = expandSchema(*sch, []string{""}, resolver) - assert.NoError(t, err) - - schema = spec.Definitions["batch"] - s, err = expandSchema(schema, []string{"#/definitions/batch"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.Items.Schema.Items.Schema.Ref.String()) - assert.Equal(t, *schema.Items.Schema.Items.Schema, spec.Definitions["brand"]) - - schema = spec.Definitions["batch2"] - s, err = expandSchema(schema, []string{"#/definitions/batch2"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.Items.Schemas[0].Items.Schema.Ref.String()) - assert.Empty(t, schema.Items.Schemas[1].Items.Schema.Ref.String()) - assert.Equal(t, *schema.Items.Schemas[0].Items.Schema, spec.Definitions["brand"]) - assert.Equal(t, *schema.Items.Schemas[1].Items.Schema, spec.Definitions["tag"]) - - schema = spec.Definitions["allofBoth"] - s, err = expandSchema(schema, []string{"#/definitions/allofBoth"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.AllOf[0].Items.Schema.Ref.String()) - assert.Empty(t, schema.AllOf[1].Items.Schema.Ref.String()) - assert.Equal(t, *schema.AllOf[0].Items.Schema, spec.Definitions["brand"]) - assert.Equal(t, *schema.AllOf[1].Items.Schema, spec.Definitions["tag"]) - - schema = spec.Definitions["anyofBoth"] - s, err = expandSchema(schema, []string{"#/definitions/anyofBoth"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.AnyOf[0].Items.Schema.Ref.String()) - assert.Empty(t, schema.AnyOf[1].Items.Schema.Ref.String()) - assert.Equal(t, *schema.AnyOf[0].Items.Schema, spec.Definitions["brand"]) - assert.Equal(t, *schema.AnyOf[1].Items.Schema, spec.Definitions["tag"]) - - schema = spec.Definitions["oneofBoth"] - s, err = expandSchema(schema, []string{"#/definitions/oneofBoth"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.OneOf[0].Items.Schema.Ref.String()) - assert.Empty(t, schema.OneOf[1].Items.Schema.Ref.String()) - assert.Equal(t, *schema.OneOf[0].Items.Schema, spec.Definitions["brand"]) - assert.Equal(t, *schema.OneOf[1].Items.Schema, spec.Definitions["tag"]) - - schema = spec.Definitions["notSomething"] - s, err = expandSchema(schema, []string{"#/definitions/notSomething"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.Not.Items.Schema.Ref.String()) - assert.Equal(t, *schema.Not.Items.Schema, spec.Definitions["tag"]) - - schema = spec.Definitions["withAdditional"] - s, err = expandSchema(schema, []string{"#/definitions/withAdditional"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.AdditionalProperties.Schema.Items.Schema.Ref.String()) - assert.Equal(t, *schema.AdditionalProperties.Schema.Items.Schema, spec.Definitions["tag"]) - - schema = spec.Definitions["withAdditionalItems"] - s, err = expandSchema(schema, []string{"#/definitions/withAdditionalItems"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.AdditionalItems.Schema.Items.Schema.Ref.String()) - assert.Equal(t, *schema.AdditionalItems.Schema.Items.Schema, spec.Definitions["tag"]) - - schema = spec.Definitions["withPattern"] - s, err = expandSchema(schema, []string{"#/definitions/withPattern"}, resolver) - schema = *s - assert.NoError(t, err) - prop := schema.PatternProperties["^x-ab"] - assert.Empty(t, prop.Items.Schema.Ref.String()) - assert.Equal(t, *prop.Items.Schema, spec.Definitions["tag"]) - - schema = spec.Definitions["deps"] - s, err = expandSchema(schema, []string{"#/definitions/deps"}, resolver) - schema = *s - assert.NoError(t, err) - prop2 := schema.Dependencies["something"] - assert.Empty(t, prop2.Schema.Items.Schema.Ref.String()) - assert.Equal(t, *prop2.Schema.Items.Schema, spec.Definitions["tag"]) - - schema = spec.Definitions["defined"] - s, err = expandSchema(schema, []string{"#/definitions/defined"}, resolver) - schema = *s - assert.NoError(t, err) - prop = schema.Definitions["something"] - assert.Empty(t, prop.Items.Schema.Ref.String()) - assert.Equal(t, *prop.Items.Schema, spec.Definitions["tag"]) -} - -func TestSchemaExpansion(t *testing.T) { - carsDoc, err := jsonDoc("fixtures/expansion/schemas1.json") - assert.NoError(t, err) - - spec := new(Swagger) - err = json.Unmarshal(carsDoc, spec) - assert.NoError(t, err) - - resolver, err := defaultSchemaLoader(spec, nil, nil, nil) - assert.NoError(t, err) - - schema := spec.Definitions["car"] - oldBrand := schema.Properties["brand"] - assert.NotEmpty(t, oldBrand.Ref.String()) - assert.NotEqual(t, spec.Definitions["brand"], oldBrand) - - s, err := expandSchema(schema, []string{"#/definitions/car"}, resolver) - schema = *s - assert.NoError(t, err) - - newBrand := schema.Properties["brand"] - assert.Empty(t, newBrand.Ref.String()) - assert.Equal(t, spec.Definitions["brand"], newBrand) - - schema = spec.Definitions["truck"] - assert.NotEmpty(t, schema.Ref.String()) - - s, err = expandSchema(schema, []string{"#/definitions/truck"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.Ref.String()) - assert.Equal(t, spec.Definitions["car"], schema) - - sch := new(Schema) - _, err = expandSchema(*sch, []string{""}, resolver) - assert.NoError(t, err) - - schema = spec.Definitions["batch"] - s, err = expandSchema(schema, []string{"#/definitions/batch"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.Items.Schema.Ref.String()) - assert.Equal(t, *schema.Items.Schema, spec.Definitions["brand"]) - - schema = spec.Definitions["batch2"] - s, err = expandSchema(schema, []string{"#/definitions/batch2"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.Items.Schemas[0].Ref.String()) - assert.Empty(t, schema.Items.Schemas[1].Ref.String()) - assert.Equal(t, schema.Items.Schemas[0], spec.Definitions["brand"]) - assert.Equal(t, schema.Items.Schemas[1], spec.Definitions["tag"]) - - schema = spec.Definitions["allofBoth"] - s, err = expandSchema(schema, []string{"#/definitions/allofBoth"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.AllOf[0].Ref.String()) - assert.Empty(t, schema.AllOf[1].Ref.String()) - assert.Equal(t, schema.AllOf[0], spec.Definitions["brand"]) - assert.Equal(t, schema.AllOf[1], spec.Definitions["tag"]) - - schema = spec.Definitions["anyofBoth"] - s, err = expandSchema(schema, []string{"#/definitions/anyofBoth"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.AnyOf[0].Ref.String()) - assert.Empty(t, schema.AnyOf[1].Ref.String()) - assert.Equal(t, schema.AnyOf[0], spec.Definitions["brand"]) - assert.Equal(t, schema.AnyOf[1], spec.Definitions["tag"]) - - schema = spec.Definitions["oneofBoth"] - s, err = expandSchema(schema, []string{"#/definitions/oneofBoth"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.OneOf[0].Ref.String()) - assert.Empty(t, schema.OneOf[1].Ref.String()) - assert.Equal(t, schema.OneOf[0], spec.Definitions["brand"]) - assert.Equal(t, schema.OneOf[1], spec.Definitions["tag"]) - - schema = spec.Definitions["notSomething"] - s, err = expandSchema(schema, []string{"#/definitions/notSomething"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.Not.Ref.String()) - assert.Equal(t, *schema.Not, spec.Definitions["tag"]) - - schema = spec.Definitions["withAdditional"] - s, err = expandSchema(schema, []string{"#/definitions/withAdditional"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.AdditionalProperties.Schema.Ref.String()) - assert.Equal(t, *schema.AdditionalProperties.Schema, spec.Definitions["tag"]) - - schema = spec.Definitions["withAdditionalItems"] - s, err = expandSchema(schema, []string{"#/definitions/withAdditionalItems"}, resolver) - schema = *s - assert.NoError(t, err) - assert.Empty(t, schema.AdditionalItems.Schema.Ref.String()) - assert.Equal(t, *schema.AdditionalItems.Schema, spec.Definitions["tag"]) - - schema = spec.Definitions["withPattern"] - s, err = expandSchema(schema, []string{"#/definitions/withPattern"}, resolver) - schema = *s - assert.NoError(t, err) - prop := schema.PatternProperties["^x-ab"] - assert.Empty(t, prop.Ref.String()) - assert.Equal(t, prop, spec.Definitions["tag"]) - - schema = spec.Definitions["deps"] - s, err = expandSchema(schema, []string{"#/definitions/deps"}, resolver) - schema = *s - assert.NoError(t, err) - prop2 := schema.Dependencies["something"] - assert.Empty(t, prop2.Schema.Ref.String()) - assert.Equal(t, *prop2.Schema, spec.Definitions["tag"]) - - schema = spec.Definitions["defined"] - s, err = expandSchema(schema, []string{"#/definitions/defined"}, resolver) - schema = *s - assert.NoError(t, err) - prop = schema.Definitions["something"] - assert.Empty(t, prop.Ref.String()) - assert.Equal(t, prop, spec.Definitions["tag"]) - -} - -func TestDefaultResolutionCache(t *testing.T) { - - cache := initResolutionCache() - - sch, ok := cache.Get("not there") - assert.False(t, ok) - assert.Nil(t, sch) - - sch, ok = cache.Get("http://swagger.io/v2/schema.json") - assert.True(t, ok) - assert.Equal(t, swaggerSchema, sch) - - sch, ok = cache.Get("http://json-schema.org/draft-04/schema") - assert.True(t, ok) - assert.Equal(t, jsonSchema, sch) - - cache.Set("something", "here") - sch, ok = cache.Get("something") - assert.True(t, ok) - assert.Equal(t, "here", sch) -} - -func resolutionContextServer() *httptest.Server { - var servedAt string - server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { - // fmt.Println("got a request for", req.URL.String()) - if req.URL.Path == "/resolution.json" { - - b, _ := ioutil.ReadFile("fixtures/specs/resolution.json") - var ctnt map[string]interface{} - json.Unmarshal(b, &ctnt) - ctnt["id"] = servedAt - - rw.Header().Set("Content-Type", "application/json") - rw.WriteHeader(200) - bb, _ := json.Marshal(ctnt) - rw.Write(bb) - return - } - if req.URL.Path == "/resolution2.json" { - b, _ := ioutil.ReadFile("fixtures/specs/resolution2.json") - var ctnt map[string]interface{} - json.Unmarshal(b, &ctnt) - ctnt["id"] = servedAt - - rw.Header().Set("Content-Type", "application/json") - rw.WriteHeader(200) - bb, _ := json.Marshal(ctnt) - rw.Write(bb) - return - } - - if req.URL.Path == "/boolProp.json" { - rw.Header().Set("Content-Type", "application/json") - rw.WriteHeader(200) - b, _ := json.Marshal(map[string]interface{}{ - "type": "boolean", - }) - _, _ = rw.Write(b) - return - } - - if req.URL.Path == "/deeper/stringProp.json" { - rw.Header().Set("Content-Type", "application/json") - rw.WriteHeader(200) - b, _ := json.Marshal(map[string]interface{}{ - "type": "string", - }) - rw.Write(b) - return - } - - if req.URL.Path == "/deeper/arrayProp.json" { - rw.Header().Set("Content-Type", "application/json") - rw.WriteHeader(200) - b, _ := json.Marshal(map[string]interface{}{ - "type": "array", - "items": map[string]interface{}{ - "type": "file", - }, - }) - rw.Write(b) - return - } - - rw.WriteHeader(http.StatusNotFound) - })) - servedAt = server.URL - return server -} - -func TestResolveRemoteRef_RootSame(t *testing.T) { - specs := "fixtures/specs" - fileserver := http.FileServer(http.Dir(specs)) - server := httptest.NewServer(fileserver) - defer server.Close() - - rootDoc := new(Swagger) - b, err := ioutil.ReadFile("fixtures/specs/refed.json") - if assert.NoError(t, err) && assert.NoError(t, json.Unmarshal(b, rootDoc)) { - var result_0 Swagger - ref_0, _ := NewRef(server.URL + "/refed.json#") - resolver_0, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - if assert.NoError(t, resolver_0.Resolve(&ref_0, &result_0)) { - assertSpecs(t, result_0, *rootDoc) - } - - var result_1 Swagger - ref_1, _ := NewRef("./refed.json") - resolver_1, _ := defaultSchemaLoader(rootDoc, nil, &ExpandOptions{ - RelativeBase: (specs), - }, nil) - if assert.NoError(t, resolver_1.Resolve(&ref_1, &result_1)) { - assertSpecs(t, result_1, *rootDoc) - } - } -} - -func TestResolveRemoteRef_FromFragment(t *testing.T) { - specs := "fixtures/specs" - fileserver := http.FileServer(http.Dir(specs)) - server := httptest.NewServer(fileserver) - defer server.Close() - - rootDoc := new(Swagger) - b, err := ioutil.ReadFile("fixtures/specs/refed.json") - if assert.NoError(t, err) && assert.NoError(t, json.Unmarshal(b, rootDoc)) { - var tgt Schema - ref, err := NewRef(server.URL + "/refed.json#/definitions/pet") - if assert.NoError(t, err) { - resolver := &schemaLoader{root: rootDoc, cache: initResolutionCache(), loadDoc: jsonDoc} - if assert.NoError(t, resolver.Resolve(&ref, &tgt)) { - assert.Equal(t, []string{"id", "name"}, tgt.Required) - } - } - } -} - -func TestResolveRemoteRef_FromInvalidFragment(t *testing.T) { - specs := "fixtures/specs" - fileserver := http.FileServer(http.Dir(specs)) - server := httptest.NewServer(fileserver) - defer server.Close() - - rootDoc := new(Swagger) - b, err := ioutil.ReadFile("fixtures/specs/refed.json") - if assert.NoError(t, err) && assert.NoError(t, json.Unmarshal(b, rootDoc)) { - var tgt Schema - ref, err := NewRef(server.URL + "/refed.json#/definitions/NotThere") - if assert.NoError(t, err) { - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - assert.Error(t, resolver.Resolve(&ref, &tgt)) - } - } -} - -func TestResolveRemoteRef_WithResolutionContext(t *testing.T) { - server := resolutionContextServer() - defer server.Close() - - rootDoc := new(Swagger) - b, err := ioutil.ReadFile("fixtures/specs/refed.json") - if assert.NoError(t, err) && assert.NoError(t, json.Unmarshal(b, rootDoc)) { - var tgt Schema - ref, err := NewRef(server.URL + "/resolution.json#/definitions/bool") - if assert.NoError(t, err) { - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - if assert.NoError(t, resolver.Resolve(&ref, &tgt)) { - assert.Equal(t, StringOrArray([]string{"boolean"}), tgt.Type) - } - } - } -} - -func TestResolveRemoteRef_WithNestedResolutionContext(t *testing.T) { - server := resolutionContextServer() - defer server.Close() - - rootDoc := new(Swagger) - b, err := ioutil.ReadFile("fixtures/specs/refed.json") - if assert.NoError(t, err) && assert.NoError(t, json.Unmarshal(b, rootDoc)) { - var tgt Schema - ref, err := NewRef(server.URL + "/resolution.json#/items/items") - if assert.NoError(t, err) { - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - if assert.NoError(t, resolver.Resolve(&ref, &tgt)) { - assert.Equal(t, StringOrArray([]string{"string"}), tgt.Type) - } - } - } -} - -func TestResolveRemoteRef_WithNestedResolutionContextWithFragment(t *testing.T) { - server := resolutionContextServer() - defer server.Close() - - rootDoc := new(Swagger) - b, err := ioutil.ReadFile("fixtures/specs/refed.json") - if assert.NoError(t, err) && assert.NoError(t, json.Unmarshal(b, rootDoc)) { - var tgt Schema - ref, err := NewRef(server.URL + "/resolution2.json#/items/items") - if assert.NoError(t, err) { - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - if assert.NoError(t, resolver.Resolve(&ref, &tgt)) { - assert.Equal(t, StringOrArray([]string{"file"}), tgt.Type) - } - } - } -} - -func TestResolveRemoteRef_ToParameter(t *testing.T) { - specs := "fixtures/specs" - fileserver := http.FileServer(http.Dir(specs)) - server := httptest.NewServer(fileserver) - defer server.Close() - - rootDoc := new(Swagger) - b, err := ioutil.ReadFile("fixtures/specs/refed.json") - if assert.NoError(t, err) && assert.NoError(t, json.Unmarshal(b, rootDoc)) { - var tgt Parameter - ref, err := NewRef(server.URL + "/refed.json#/parameters/idParam") - if assert.NoError(t, err) { - - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - if assert.NoError(t, resolver.Resolve(&ref, &tgt)) { - assert.Equal(t, "id", tgt.Name) - assert.Equal(t, "path", tgt.In) - assert.Equal(t, "ID of pet to fetch", tgt.Description) - assert.True(t, tgt.Required) - assert.Equal(t, "integer", tgt.Type) - assert.Equal(t, "int64", tgt.Format) - } - } - } -} - -func TestResolveRemoteRef_ToPathItem(t *testing.T) { - specs := "fixtures/specs" - fileserver := http.FileServer(http.Dir(specs)) - server := httptest.NewServer(fileserver) - defer server.Close() - - rootDoc := new(Swagger) - b, err := ioutil.ReadFile("fixtures/specs/refed.json") - if assert.NoError(t, err) && assert.NoError(t, json.Unmarshal(b, rootDoc)) { - var tgt PathItem - ref, err := NewRef(server.URL + "/refed.json#/paths/" + jsonpointer.Escape("/pets/{id}")) - if assert.NoError(t, err) { - - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - if assert.NoError(t, resolver.Resolve(&ref, &tgt)) { - assert.Equal(t, rootDoc.Paths.Paths["/pets/{id}"].Get, tgt.Get) - } - } - } -} - -func TestResolveRemoteRef_ToResponse(t *testing.T) { - specs := "fixtures/specs" - fileserver := http.FileServer(http.Dir(specs)) - server := httptest.NewServer(fileserver) - defer server.Close() - - rootDoc := new(Swagger) - b, err := ioutil.ReadFile("fixtures/specs/refed.json") - if assert.NoError(t, err) && assert.NoError(t, json.Unmarshal(b, rootDoc)) { - var tgt Response - ref, err := NewRef(server.URL + "/refed.json#/responses/petResponse") - if assert.NoError(t, err) { - - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - if assert.NoError(t, resolver.Resolve(&ref, &tgt)) { - assert.Equal(t, rootDoc.Responses["petResponse"], tgt) - } - } - } -} - -func TestResolveLocalRef_SameRoot(t *testing.T) { - rootDoc := new(Swagger) - json.Unmarshal(PetStoreJSONMessage, rootDoc) - - result := new(Swagger) - ref, _ := NewRef("#") - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - err := resolver.Resolve(&ref, result) - if assert.NoError(t, err) { - assert.Equal(t, rootDoc, result) - } -} - -func TestResolveLocalRef_FromFragment(t *testing.T) { - rootDoc := new(Swagger) - json.Unmarshal(PetStoreJSONMessage, rootDoc) - - var tgt Schema - ref, err := NewRef("#/definitions/Category") - if assert.NoError(t, err) { - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - err := resolver.Resolve(&ref, &tgt) - if assert.NoError(t, err) { - assert.Equal(t, "Category", tgt.ID) - } - } -} - -func TestResolveLocalRef_FromInvalidFragment(t *testing.T) { - rootDoc := new(Swagger) - json.Unmarshal(PetStoreJSONMessage, rootDoc) - - var tgt Schema - ref, err := NewRef("#/definitions/NotThere") - if assert.NoError(t, err) { - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - err := resolver.Resolve(&ref, &tgt) - assert.Error(t, err) - } -} - -func TestResolveLocalRef_Parameter(t *testing.T) { - rootDoc := new(Swagger) - b, err := ioutil.ReadFile("fixtures/specs/refed.json") - if assert.NoError(t, err) && assert.NoError(t, json.Unmarshal(b, rootDoc)) { - var tgt Parameter - ref, err := NewRef("#/parameters/idParam") - if assert.NoError(t, err) { - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - if assert.NoError(t, resolver.Resolve(&ref, &tgt)) { - assert.Equal(t, "id", tgt.Name) - assert.Equal(t, "path", tgt.In) - assert.Equal(t, "ID of pet to fetch", tgt.Description) - assert.True(t, tgt.Required) - assert.Equal(t, "integer", tgt.Type) - assert.Equal(t, "int64", tgt.Format) - } - } - } -} - -func TestResolveLocalRef_PathItem(t *testing.T) { - rootDoc := new(Swagger) - b, err := ioutil.ReadFile("fixtures/specs/refed.json") - if assert.NoError(t, err) && assert.NoError(t, json.Unmarshal(b, rootDoc)) { - var tgt PathItem - ref, err := NewRef("#/paths/" + jsonpointer.Escape("/pets/{id}")) - if assert.NoError(t, err) { - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - if assert.NoError(t, resolver.Resolve(&ref, &tgt)) { - assert.Equal(t, rootDoc.Paths.Paths["/pets/{id}"].Get, tgt.Get) - } - } - } -} - -func TestResolveLocalRef_Response(t *testing.T) { - rootDoc := new(Swagger) - b, err := ioutil.ReadFile("fixtures/specs/refed.json") - if assert.NoError(t, err) && assert.NoError(t, json.Unmarshal(b, rootDoc)) { - var tgt Response - ref, err := NewRef("#/responses/petResponse") - if assert.NoError(t, err) { - resolver, _ := defaultSchemaLoader(rootDoc, nil, nil, nil) - if assert.NoError(t, resolver.Resolve(&ref, &tgt)) { - assert.Equal(t, rootDoc.Responses["petResponse"], tgt) - } - } - } -} - -// PetStoreJSONMessage json raw message for Petstore20 -var PetStoreJSONMessage = json.RawMessage([]byte(PetStore20)) - -// PetStore20 json doc for swagger 2.0 pet store -const PetStore20 = `{ - "swagger": "2.0", - "info": { - "version": "1.0.0", - "title": "Swagger Petstore", - "contact": { - "name": "Wordnik API Team", - "url": "http://developer.wordnik.com" - }, - "license": { - "name": "Creative Commons 4.0 International", - "url": "http://creativecommons.org/licenses/by/4.0/" - } - }, - "host": "petstore.swagger.wordnik.com", - "basePath": "/api", - "schemes": [ - "http" - ], - "paths": { - "/pets": { - "get": { - "security": [ - { - "basic": [] - } - ], - "tags": [ "Pet Operations" ], - "operationId": "getAllPets", - "parameters": [ - { - "name": "status", - "in": "query", - "description": "The status to filter by", - "type": "string" - }, - { - "name": "limit", - "in": "query", - "description": "The maximum number of results to return", - "type": "integer", - "format": "int64" - } - ], - "summary": "Finds all pets in the system", - "responses": { - "200": { - "description": "Pet response", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "default": { - "description": "Unexpected error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - }, - "post": { - "security": [ - { - "basic": [] - } - ], - "tags": [ "Pet Operations" ], - "operationId": "createPet", - "summary": "Creates a new pet", - "consumes": ["application/x-yaml"], - "produces": ["application/x-yaml"], - "parameters": [ - { - "name": "pet", - "in": "body", - "description": "The Pet to create", - "required": true, - "schema": { - "$ref": "#/definitions/newPet" - } - } - ], - "responses": { - "200": { - "description": "Created Pet response", - "schema": { - "$ref": "#/definitions/Pet" - } - }, - "default": { - "description": "Unexpected error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - }, - "/pets/{id}": { - "delete": { - "security": [ - { - "apiKey": [] - } - ], - "description": "Deletes the Pet by id", - "operationId": "deletePet", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "ID of pet to delete", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "204": { - "description": "pet deleted" - }, - "default": { - "description": "unexpected error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - }, - "get": { - "tags": [ "Pet Operations" ], - "operationId": "getPetById", - "summary": "Finds the pet by id", - "responses": { - "200": { - "description": "Pet response", - "schema": { - "$ref": "#/definitions/Pet" - } - }, - "default": { - "description": "Unexpected error", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - }, - "parameters": [ - { - "name": "id", - "in": "path", - "description": "ID of pet", - "required": true, - "type": "integer", - "format": "int64" - } - ] - } - }, - "definitions": { - "Category": { - "id": "Category", - "properties": { - "id": { - "format": "int64", - "type": "integer" - }, - "name": { - "type": "string" - } - } - }, - "Pet": { - "id": "Pet", - "properties": { - "category": { - "$ref": "#/definitions/Category" - }, - "id": { - "description": "unique identifier for the pet", - "format": "int64", - "maximum": 100.0, - "minimum": 0.0, - "type": "integer" - }, - "name": { - "type": "string" - }, - "photoUrls": { - "items": { - "type": "string" - }, - "type": "array" - }, - "status": { - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ], - "type": "string" - }, - "tags": { - "items": { - "$ref": "#/definitions/Tag" - }, - "type": "array" - } - }, - "required": [ - "id", - "name" - ] - }, - "newPet": { - "anyOf": [ - { - "$ref": "#/definitions/Pet" - }, - { - "required": [ - "name" - ] - } - ] - }, - "Tag": { - "id": "Tag", - "properties": { - "id": { - "format": "int64", - "type": "integer" - }, - "name": { - "type": "string" - } - } - }, - "Error": { - "required": [ - "code", - "message" - ], - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - } - } - } - }, - "consumes": [ - "application/json", - "application/xml" - ], - "produces": [ - "application/json", - "application/xml", - "text/plain", - "text/html" - ], - "securityDefinitions": { - "basic": { - "type": "basic" - }, - "apiKey": { - "type": "apiKey", - "in": "header", - "name": "X-API-KEY" - } - } -} -` diff --git a/vendor/github.com/go-openapi/spec/external_docs.go b/vendor/github.com/go-openapi/spec/external_docs.go deleted file mode 100644 index 88add91b2b..0000000000 --- a/vendor/github.com/go-openapi/spec/external_docs.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -// ExternalDocumentation allows referencing an external resource for -// extended documentation. -// -// For more information: http://goo.gl/8us55a#externalDocumentationObject -type ExternalDocumentation struct { - Description string `json:"description,omitempty"` - URL string `json:"url,omitempty"` -} diff --git a/vendor/github.com/go-openapi/spec/external_docs_test.go b/vendor/github.com/go-openapi/spec/external_docs_test.go deleted file mode 100644 index 14c5ef1561..0000000000 --- a/vendor/github.com/go-openapi/spec/external_docs_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "testing" -) - -func TestIntegrationExternalDocs(t *testing.T) { - var extDocs = ExternalDocumentation{"the name", "the url"} - const extDocsYAML = "description: the name\nurl: the url\n" - const extDocsJSON = `{"description":"the name","url":"the url"}` - assertSerializeJSON(t, extDocs, extDocsJSON) - assertSerializeYAML(t, extDocs, extDocsYAML) - assertParsesJSON(t, extDocsJSON, extDocs) - assertParsesYAML(t, extDocsYAML, extDocs) -} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/all-the-things.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/all-the-things.json deleted file mode 100644 index 42e6f24e07..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/all-the-things.json +++ /dev/null @@ -1,254 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "version": "1.0.0", - "title": "Swagger Petstore", - "description": "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", - "termsOfService": "http://helloreverb.com/terms/", - "contact": { - "name": "Wordnik API Team" - }, - "license": { - "name": "MIT" - } - }, - "host": "petstore.swagger.wordnik.com", - "basePath": "/api", - "schemes": [ - "http" - ], - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": { - "idParam": { - "name": "id", - "in": "path", - "description": "ID of pet to fetch", - "required": true, - "type": "integer", - "format": "int64" - }, - "tag": { - "type": "string", - "in": "query", - "required": false - }, - "query": { - "$ref": "#/parameters/tag" - } - }, - "responses": { - "petResponse": { - "description": "pet response", - "schema": { - "$ref": "#/definitions/pet" - } - }, - "stringResponse": { - "descripion": "string response", - "schema": { - "type": "string" - } - }, - "anotherPet": { - "$ref": "#/responses/petResponse" - } - }, - "paths": { - "/": { - "get": { - "operationId": "indexStuff", - "responses": { - "default": { - "$ref": "#/responses/stringResponse" - }, - "200": { - "$ref": "#/responses/anotherPet" - } - } - } - }, - "/pets": { - "get": { - "description": "Returns all pets from the system that the user has access to", - "operationId": "findPets", - "produces": [ - "application/json", - "application/xml", - "text/xml", - "text/html" - ], - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "tags to filter by", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "csv" - }, - { - "name": "limit", - "in": "query", - "description": "maximum number of results to return", - "required": false, - "type": "integer", - "format": "int32" - } - ], - "responses": { - "200": { - "description": "pet response", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/pet" - } - } - }, - "default": { - "description": "unexpected error", - "schema": { - "$ref": "#/definitions/errorModel" - } - } - } - }, - "post": { - "description": "Creates a new pet in the store. Duplicates are allowed", - "operationId": "addPet", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "pet", - "in": "body", - "description": "Pet to add to the store", - "required": true, - "schema": { - "$ref": "#/definitions/petInput" - } - } - ], - "responses": { - "200": { "$ref": "#/responses/petResponse" }, - "default": { - "description": "unexpected error", - "schema": { - "$ref": "#/definitions/errorModel" - } - } - } - } - }, - "/pets/{id}": { - "get": { - "description": "Returns a user based on a single ID, if the user does not have access to the pet", - "operationId": "findPetById", - "produces": [ - "application/json", - "application/xml", - "text/xml", - "text/html" - ], - "parameters": [ - { - "$ref": "#/parameters/idParam" - } - ], - "responses": { - "200": { - "$ref": "#/responses/petResponse" - }, - "default": { - "description": "unexpected error", - "schema": { - "$ref": "#/definitions/errorModel" - } - } - } - }, - "delete": { - "description": "deletes a single pet based on the ID supplied", - "operationId": "deletePet", - "parameters": [ - { - "$ref": "#/parameters/idParam" - } - ], - "responses": { - "204": { - "description": "pet deleted" - }, - "default": { - "description": "unexpected error", - "schema": { - "$ref": "#/definitions/errorModel" - } - } - } - } - } - }, - "definitions": { - "pet": { - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "tag": { - "type": "string" - } - } - }, - "petInput": { - "allOf": [ - { - "$ref": "#/definitions/pet" - }, - { - "required": [ - "name" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64" - } - } - } - ] - }, - "errorModel": { - "required": [ - "code", - "message" - ], - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - } - } - } - } -} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/circularRefs.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/circularRefs.json deleted file mode 100644 index f501aa1433..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/circularRefs.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "definitions": { - "brand": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } - }, - "category": { - "type": "object", - "properties": { - "children": { - "type": "array", - "items": { - "$ref": "#/definitions/category" - } - } - } - }, - "car": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "make": { - "type": "string" - }, - "similar": { - "items": { - "$ref": "#/definitions/car" - } - }, - "notSimilar": { - "additionalProperties": { - "$ref": "#/definitions/car" - } - }, - "oneCar": { - "$ref": "#/definitions/car" - }, - "category": { - "$ref": "#/definitions/category" - }, - "brand": { - "$ref": "#/definitions/brand" - } - } - } - } -} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.json deleted file mode 100644 index 7b39b999b8..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.json +++ /dev/null @@ -1 +0,0 @@ -{"swagger":"2.0","info":{"title":"Swagger Sample","description":"Sample API Playground.","version":"1.0.0"},"basePath":"/v1","schemes":["http"],"consumes":["application/vdn.sample.v1+json"],"produces":["application/vdn.sample.v1+json"],"paths":{"/books":{"get":{"summary":"List all books","operationId":"listBooks","tags":["books"],"responses":{"200":{"headers":{"Link":{"type":"string"}},"description":"An array of books","schema":{"type":"array","items":{"$ref":"#/definitions/Book"}}},"default":{"description":"generic error response","schema":{"$ref":"#/definitions/Error"}}}}}},"definitions":{"Book":{"type":"object","required":["title","summary"],"properties":{"title":{"type":"string","example":"Winnie the Pooh"},"summary":{"type":"string","example":"Famous children's book"},"related_books":{"type":"array","items":{"$ref":"#/definitions/Book"}}}},"Error":{"type":"object","readOnly":true,"properties":{"code":{"type":"integer","format":"int64","example":400},"message":{"type":"string","example":"Unexpected error"}},"required":["message"]}}} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.yaml b/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.yaml deleted file mode 100644 index d43bd4640c..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/circularSpec.yaml +++ /dev/null @@ -1,67 +0,0 @@ ---- -swagger: "2.0" -info: - title: Swagger Sample - description: Sample API Playground. - version: 1.0.0 -basePath: /v1 -schemes: -- http -consumes: -- application/vdn.sample.v1+json -produces: -- application/vdn.sample.v1+json - -paths: - /books: - get: - summary: List all books - operationId: listBooks - tags: - - books - responses: - 200: - headers: - Link: - type: string - description: An array of books - schema: - type: array - items: - $ref: "#/definitions/Book" - default: - description: generic error response - schema: - $ref: "#/definitions/Error" - -definitions: - Book: - type: object - required: - - title - - summary - properties: - title: - type: string - example: Winnie the Pooh - summary: - type: string - example: Famous children's book - related_books: - type: array - items: - $ref: "#/definitions/Book" - - Error: - type: object - readOnly: true - properties: - code: - type: integer - format: int64 - example: 400 - message: - type: string - example: Unexpected error - required: - - message diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.json deleted file mode 100644 index 27e819aa52..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.json +++ /dev/null @@ -1 +0,0 @@ -{"swagger":"2.0","schemes":["http","https"],"host":"apiv2.clickmeter.com:80","info":{"contact":{"email":"api@clickmeter.com","name":"Api Support","url":"http://www.clickmeter.com/api"},"description":"Api dashboard for ClickMeter API","title":"ClickMeter","version":"v2","x-logo":{"url":"https://s3.amazonaws.com/clickmeter.com/Web/static/cmlogo.svg"},"x-origin":{"format":"swagger","url":"http://api.v2.clickmeter.com.s3.amazonaws.com/docs/api-docs-v2.json","version":"2.0"},"x-providerName":"clickmeter.com"},"securityDefinitions":{"api_key":{"description":"API Key Authentication","in":"header","name":"X-Clickmeter-AuthKey","type":"apiKey"}},"security":[{"api_key":[]}],"paths":{"/account":{"get":{"consumes":[],"deprecated":false,"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.User"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve current account data","tags":["Account"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.User"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.User"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Update current account data","tags":["Account"]}},"/account/domainwhitelist":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.DomainWhitelistEntry]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve list of a domains allowed to redirect in DDU mode","tags":["Account"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The entry to add","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Create an domain entry","tags":["Account"]}},"/account/domainwhitelist/{whitelistId}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the domain to delete","in":"path","name":"whitelistId","required":true,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete an domain entry","tags":["Account"]}},"/account/guests":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve list of a guest","tags":["Account"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Guest object to create","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Guest"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Guest"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Create a guest","tags":["Account"]}},"/account/guests/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve count of guests","tags":["Account"]}},"/account/guests/{guestId}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete a guest","tags":["Account"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Guest"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a guest","tags":["Account"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"},{"description":"Guest object with field updated","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Guest"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Guest"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Update a guest","tags":["Account"]}},"/account/guests/{guestId}/permissions":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"},{"description":"Can be \"datapoint\" or \"group\"","enum":["datapoint","group"],"in":"query","name":"entityType","required":false,"type":"string"},{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Can be \"w\" or \"r\"","enum":["r","w"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Optional id of the datapoint/group entity to filter by","format":"int64","in":"query","name":"entityId","required":false,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Grants.Grant]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve permissions for a guest","tags":["Account"]}},"/account/guests/{guestId}/permissions/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"},{"description":"Can be \"datapoint\" or \"group\"","enum":["datapoint","group"],"in":"query","name":"entityType","required":false,"type":"string"},{"description":"Can be \"w\" or \"r\"","enum":["r","w"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Optional id of the datapoint/group entity to filter by","format":"int64","in":"query","name":"entityId","required":false,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve count of the permissions for a guest","tags":["Account"]}},"/account/guests/{guestId}/{type}/permissions/patch":{"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"},{"description":"Can be \"datapoint\" or \"group\"","enum":["datapoint","group"],"in":"path","name":"type","required":true,"type":"string"},{"description":"The patch permission request","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.PermissionPatchRequest"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Change the permission on a shared object","tags":["Account"]},"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the guest","format":"int64","in":"path","name":"guestId","required":true,"type":"integer"},{"description":"Can be \"datapoint\" or \"group\"","enum":["datapoint","group"],"in":"path","name":"type","required":true,"type":"string"},{"description":"The patch permission request","in":"body","name":"body","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.PermissionPatchRequest"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Change the permission on a shared object","tags":["Account"]}},"/account/ipblacklist":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.IpBlacklistEntry]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve list of a ip to exclude from event tracking","tags":["Account"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The entry to add","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Create an ip blacklist entry","tags":["Account"]}},"/account/ipblacklist/{blacklistId}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the ip to delete","in":"path","name":"blacklistId","required":true,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete an ip blacklist entry","tags":["Account"]}},"/account/plan":{"get":{"consumes":[],"deprecated":false,"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Plan"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve current account plan","tags":["Account"]}},"/aggregated":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"If using \"yesterday\" or \"today\" timeframe you can ask for the hourly detail","in":"query","name":"hourly","required":false,"type":"boolean"},{"description":"","in":"query","name":"onlyFavorites","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this customer for a timeframe","tags":["Aggregated"]}},"/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["week","month"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this customer for a timeframe grouped by some temporal entity (day/week/month)","tags":["Aggregated"]}},"/aggregated/summary/conversions":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of conversion (\"deleted\"/\"active\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about a subset of conversions for a timeframe with conversions data","tags":["Aggregated"]}},"/aggregated/summary/datapoints":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"Type of datapoint (\"tl\"/\"tp\")","enum":["tp","tl"],"in":"query","name":"type","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of datapoint (\"deleted\"/\"active\"/\"paused\"/\"spam\")","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the datapoint marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Filter by this group id","format":"int64","in":"query","name":"groupId","required":false,"type":"integer"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about a subset of datapoints for a timeframe with datapoints data","tags":["Aggregated"]}},"/aggregated/summary/groups":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of group (\"deleted\"/\"active\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the group marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about a subset of groups for a timeframe with groups data","tags":["Aggregated"]}},"/clickstream":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Filter by this group id (mutually exclusive with \"datapoint\" and \"conversion\")","format":"int64","in":"query","name":"group","required":false,"type":"integer"},{"description":"Filter by this datapoint id (mutually exclusive with \"group\" and \"conversion\")","format":"int64","in":"query","name":"datapoint","required":false,"type":"integer"},{"description":"Filter by this conversion id (mutually exclusive with \"datapoint\" and \"group\")","format":"int64","in":"query","name":"conversion","required":false,"type":"integer"},{"default":50,"description":"Limit results to this number","format":"int32","in":"query","name":"pageSize","required":false,"type":"integer"},{"description":"Filter event type (\"spiders\"/\"uniques\"/\"nonuniques\"/\"conversions\")","enum":["","spiders","uniques","nonuniques","conversions"],"in":"query","name":"filter","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.ClickStream.Hit]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve the latest list of events of this account. Limited to last 100.","tags":["ClickStream"]}},"/conversions":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Status of conversion (\"deleted\"/\"active\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude conversions created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude conversions created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a list of conversions","tags":["Conversions"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The body of the conversion","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Conversions.Conversion"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Create a conversion","tags":["Conversions"]}},"/conversions/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of conversion (\"deleted\"/\"active\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["week","month"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this customer for a timeframe related to a subset of conversions grouped by some temporal entity (day/week/month)","tags":["Conversions"]}},"/conversions/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Status of conversion (\"deleted\"/\"active\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude conversions created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude conversions created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a count of conversions","tags":["Conversions"]}},"/conversions/{conversionId}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Delete conversion specified by id","tags":["Conversions"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Conversions.Conversion"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve conversion specified by id","tags":["Conversions"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Updated body of the conversion","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Conversions.Conversion"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Update conversion specified by id","tags":["Conversions"]}},"/conversions/{conversionId}/aggregated":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Filter by this tag name","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the datapoint marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"},{"description":"If using \"yesterday\" or \"today\" timeframe you can ask for the hourly detail","in":"query","name":"hourly","required":false,"type":"boolean"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this conversion for a timeframe","tags":["Conversions"]}},"/conversions/{conversionId}/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["week","month"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this conversion for a timeframe grouped by some temporal entity (day/week/month)","tags":["Conversions"]}},"/conversions/{conversionId}/datapoints":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Type of datapoint (\"tl\"/\"tp\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of datapoint (\"deleted\"/\"active\"/\"paused\"/\"spam\")","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter by this tag name","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a list of datapoints connected to this conversion","tags":["Conversions"]}},"/conversions/{conversionId}/datapoints/batch/patch":{"put":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Patch requests","in":"body","name":"data","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.PatchBodyBatch"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Modify the association between a conversion and multiple datapoints","tags":["Conversions"]}},"/conversions/{conversionId}/datapoints/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Type of datapoint (\"tl\"/\"tp\")","in":"query","name":"type","required":false,"type":"string"},{"description":"Status of datapoint (\"deleted\"/\"active\"/\"paused\"/\"spam\")","in":"query","name":"status","required":false,"type":"string"},{"description":"Filter by this tag name","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a count of datapoints connected to this conversion","tags":["Conversions"]}},"/conversions/{conversionId}/datapoints/patch":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Patch request","in":"body","name":"data","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.ConversionPatchBody"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Modify the association between a conversion and a datapoint","tags":["Conversions"]}},"/conversions/{conversionId}/hits":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Offset where to start from (it's the lastKey field in the response object)","in":"query","name":"offset","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Filter event type (\"spiders\"/\"uniques\"/\"nonuniques\"/\"conversions\")","enum":["spiders","uniques","nonuniques","conversions"],"in":"query","name":"filter","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitListPage"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve the list of events related to this conversion.","tags":["Conversions"]}},"/conversions/{conversionId}/notes":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Patch requests","in":"body","name":"note","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.GenericTextPatch"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Fast patch the \"notes\" field of a conversion","tags":["Conversions"]}},"/conversions/{conversionId}/reports":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the conversion","format":"int64","in":"path","name":"conversionId","required":true,"type":"integer"},{"description":"Type of the report.","enum":["datapoints","groups","browsers","browsersfamilies","platforms","cities","countries","keywords","referrers","convparameters","destinations","languages","params"],"in":"query","name":"type","required":true,"type":"string"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","beginning","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Type of the event you want to filter this report with. By default no filter is applied.","enum":["clicks","views"],"in":"query","name":"hittype","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Tops.Top"}},"401":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a top report connected to this conversion","tags":["Conversions"]}},"/datapoints":{"get":{"consumes":[],"deprecated":false,"parameters":[{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Type of the datapoint (\"tp\"/\"tl\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Filter fields by favourite status","in":"query","name":"onlyFavorites","required":false,"type":"boolean"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the datapoints associated to the user","tags":["DataPoints"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The body of the datapoint","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.Datapoint"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Create a datapoint","tags":["DataPoints"]}},"/datapoints/aggregated":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"Type of datapoint (\"tl\"/\"tp\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"If using \"yesterday\" or \"today\" timeframe you can ask for the hourly detail","in":"query","name":"hourly","required":false,"type":"boolean"},{"description":"Status of datapoint (\"deleted\"/\"active\"/\"paused\"/\"spam\")","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the datapoint is marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this customer for a timeframe by groups","tags":["DataPoints"]}},"/datapoints/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Type of datapoint (\"tl\"/\"tp\")","enum":["tp","tl"],"in":"query","name":"type","required":true,"type":"string"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of datapoint (\"deleted\"/\"active\"/\"paused\"/\"spam\")","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the datapoint is marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["week","month"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about all datapoints of this customer for a timeframe grouped by some temporal entity (day/week/month)","tags":["DataPoints"]}},"/datapoints/batch":{"delete":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"A json containing the datapoints to delete.","in":"body","name":"batch","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.DeleteBatch"}}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Delete multiple datapoints","tags":["DataPoints"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"A json containing the datapoints to update.","in":"body","name":"batch","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.DatapointsBatch"}}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Update multiple datapoints","tags":["DataPoints"]},"put":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"A json containing the datapoints to create.","in":"body","name":"batch","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.DatapointsBatch"}}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Create multiple datapoints","tags":["DataPoints"]}},"/datapoints/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Type of the datapoint (\"tp\"/\"tl\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Filter fields by favourite status","in":"query","name":"onlyFavorites","required":false,"type":"boolean"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Count the datapoints associated to the user","tags":["DataPoints"]}},"/datapoints/{id}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Delete a datapoint","tags":["DataPoints"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.Datapoint"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Get a datapoint","tags":["DataPoints"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"The body of the datapoint","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.Datapoint"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Update a datapoint","tags":["DataPoints"]}},"/datapoints/{id}/aggregated":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"If using \"yesterday\" or \"today\" timeframe you can ask for the hourly detail","in":"query","name":"hourly","required":false,"type":"boolean"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this datapoint for a timeframe","tags":["DataPoints"]}},"/datapoints/{id}/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["week","month"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this datapoint for a timeframe grouped by some temporal entity (day/week/month)","tags":["DataPoints"]}},"/datapoints/{id}/favourite":{"put":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Fast switch the \"favourite\" field of a datapoint","tags":["DataPoints"]}},"/datapoints/{id}/hits":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Offset where to start from (it's the lastKey field in the response object)","in":"query","name":"offset","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Filter event type (\"spiders\"/\"uniques\"/\"nonuniques\"/\"conversions\")","enum":["spiders","uniques","nonuniques","conversions"],"in":"query","name":"filter","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitListPage"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve the list of events related to this datapoint.","tags":["DataPoints"]}},"/datapoints/{id}/notes":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Patch requests","in":"body","name":"note","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.GenericTextPatch"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Fast patch the \"notes\" field of a datapoint","tags":["DataPoints"]}},"/datapoints/{id}/reports":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the datapoint","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Type of the report.","enum":["browsers","browsersfamilies","platforms","cities","countries","isps","ips","oss","ossfamilies","keywords","referrers","destinations","languages","params"],"in":"query","name":"type","required":true,"type":"string"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","beginning","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Tops.Top"}},"401":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a top report connected to this datapoint","tags":["DataPoints"]}},"/domains":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"default":"system","description":"Type of domain (\"system\"/\"go\"/\"personal\"/\"dedicated\"). If not specified default is \"system\"","enum":["system","go","personal","dedicated"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Filter domains with this anmen","in":"query","name":"name","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a list of domains","tags":["Domains"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The domain to create","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Domains.Domain"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Create a domain","tags":["Domains"]}},"/domains/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"default":"system","description":"Type of domain (\"system\"/\"go\"/\"personal\"/\"dedicated\"). If not specified default is \"system\"","enum":["system","go","personal","dedicated"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Filter domains with this anmen","in":"query","name":"name","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve count of domains","tags":["Domains"]}},"/domains/{id}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of domain","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete a domain","tags":["Domains"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of domain","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Domains.Domain"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Get a domain","tags":["Domains"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of domain","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"The domain to update","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Domains.Domain"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Update a domain","tags":["Domains"]}},"/groups":{"get":{"consumes":[],"deprecated":false,"parameters":[{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Status of the group","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude groups created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude groups created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"},{"description":"Write permission","in":"query","name":"write","required":false,"type":"boolean"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the groups associated to the user.","tags":["Groups"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The body of the group","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Groups.Group"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Create a group","tags":["Groups"]}},"/groups/aggregated":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"If using \"yesterday\" or \"today\" timeframe you can ask for the hourly detail","in":"query","name":"hourly","required":false,"type":"boolean"},{"description":"Status of group (\"deleted\"/\"active\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the group is marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this customer for a timeframe by groups","tags":["Groups"]}},"/groups/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of group (\"deleted\"/\"active\")","in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the group is marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["deleted","active"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about all groups of this customer for a timeframe grouped by some temporal entity (day/week/month)","tags":["Groups"]}},"/groups/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Status of the datapoint","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude groups created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude groups created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"},{"description":"Write permission","in":"query","name":"write","required":false,"type":"boolean"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Count the groups associated to the user.","tags":["Groups"]}},"/groups/{id}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Delete group specified by id","tags":["Groups"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Groups.Group"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Get a group","tags":["Groups"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"The body of the group","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Groups.Group"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Update a group","tags":["Groups"]}},"/groups/{id}/aggregated":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"If using \"yesterday\" or \"today\" timeframe you can ask for the hourly detail","in":"query","name":"hourly","required":false,"type":"boolean"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this group for a timeframe","tags":["Groups"]}},"/groups/{id}/aggregated/list":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"The temporal entity you want to group by (\"week\"/\"month\"). If unspecified is \"day\".","enum":["week","month"],"in":"query","name":"groupBy","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about this group for a timeframe grouped by some temporal entity (day/week/month)","tags":["Groups"]}},"/groups/{id}/aggregated/summary":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Filter by this group id","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["today","yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","last12months","lastyear","currentyear","beginning","custom"],"in":"query","name":"timeFrame","required":true,"type":"string"},{"description":"Type of datapoint (\"tl\"/\"tp\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Status of datapoint (\"deleted\"/\"active\"/\"paused\"/\"spam\")","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tag","required":false,"type":"string"},{"description":"Is the datapoint marked as favourite","in":"query","name":"favourite","required":false,"type":"boolean"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"default":0,"description":"Offset where to start from","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve statistics about a subset of datapoints for a timeframe with datapoints data","tags":["Groups"]}},"/groups/{id}/datapoints":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Type of the datapoint (\"tp\"/\"tl\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Filter fields by favourite status","in":"query","name":"onlyFavorites","required":false,"type":"boolean"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the datapoints associated to the user in this group.","tags":["Groups"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"The body of the datapoint","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.Datapoint"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Create a datapoint in this group","tags":["Groups"]}},"/groups/{id}/datapoints/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Type of the datapoint (\"tp\"/\"tl\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Filter fields by favourite status","in":"query","name":"onlyFavorites","required":false,"type":"boolean"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Count the datapoints associated to the user in this group.","tags":["Groups"]}},"/groups/{id}/favourite":{"put":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Fast switch the \"favourite\" field of a group","tags":["Groups"]}},"/groups/{id}/hits":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Limit results to this number","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Offset where to start from (it's the lastKey field in the response object)","in":"query","name":"offset","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Filter event type (\"spiders\"/\"uniques\"/\"nonuniques\"/\"conversions\")","enum":["spiders","uniques","nonuniques","conversions"],"in":"query","name":"filter","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitListPage"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve the list of events related to this group.","tags":["Groups"]}},"/groups/{id}/notes":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Patch requests","in":"body","name":"note","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.GenericTextPatch"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Fast patch the \"notes\" field of a group","tags":["Groups"]}},"/groups/{id}/reports":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Type of the report.","enum":["browsers","browsersfamilies","platforms","cities","countries","isps","ips","oss","ossfamilies","keywords","referrers","destinations","languages","params"],"in":"query","name":"type","required":true,"type":"string"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","beginning","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Type of the event you want to filter this report with. By default no filter is applied.","enum":["clicks","views"],"in":"query","name":"hittype","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Tops.Top"}},"401":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a top report connected to this group","tags":["Groups"]}},"/hits":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Limit results to this number","format":"int32","in":"query","name":"limit","required":false,"type":"integer"},{"description":"Offset where to start from (it's the lastKey field in the response object)","in":"query","name":"offset","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"},{"description":"Filter event type (\"spiders\"/\"uniques\"/\"nonuniques\"/\"conversions\")","enum":["spiders","uniques","nonuniques","conversions"],"in":"query","name":"filter","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitListPage"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve the list of events related to this account.","tags":["Hits"]}},"/me":{"get":{"consumes":[],"deprecated":false,"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.User"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve current account data","tags":["Me"]}},"/me/plan":{"get":{"consumes":[],"deprecated":false,"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Accounting.Plan"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve current account plan","tags":["Me"]}},"/reports":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Type of the report.","enum":["browsers","browsersfamilies","platforms","cities","countries","isps","ips","oss","ossfamilies","keywords","referrers","destinations","languages","params"],"in":"query","name":"type","required":true,"type":"string"},{"description":"Timeframe of the request. See list at $timeframeList","enum":["yesterday","last7","last30","lastmonth","currentmonth","previousmonth","last90","last120","last180","beginning","custom"],"in":"query","name":"timeframe","required":true,"type":"string"},{"description":"Type of the event you want to filter this report with. By default no filter is applied.","in":"query","name":"hittype","required":false,"type":"string"},{"description":"Filter by this group id (mutually exclusive with \"datapoint\" and \"conversion\")","format":"int64","in":"query","name":"group","required":false,"type":"integer"},{"description":"Filter by this datapoint id (mutually exclusive with \"group\" and \"conversion\")","format":"int64","in":"query","name":"datapoint","required":false,"type":"integer"},{"description":"Filter by this conversion id (mutually exclusive with \"datapoint\" and \"group\")","format":"int64","in":"query","name":"conversion","required":false,"type":"integer"},{"description":"If using a \"custom\" timeFrame you can specify the starting day (YYYYMMDD)","in":"query","name":"fromDay","required":false,"type":"string"},{"description":"If using a \"custom\" timeFrame you can specify the ending day (YYYYMMDD)","in":"query","name":"toDay","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Tops.Top"}},"401":{"description":"Forbidden"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a top report","tags":["Reports"]}},"/retargeting":{"get":{"consumes":[],"deprecated":false,"parameters":[{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the retargeting scripts associated to the user","tags":["Retargeting"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The body of the retargeting script","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Retargeting.RetargetingScript"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Creates a retargeting script","tags":["Retargeting"]}},"/retargeting/count":{"get":{"consumes":[],"deprecated":false,"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve count of retargeting scripts","tags":["Retargeting"]}},"/retargeting/{id}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the retargeting script","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Deletes a retargeting script (and remove associations)","tags":["Retargeting"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"The id of the retargeting script","format":"int64","in":"path","name":"id","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Retargeting.RetargetingScript"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Get a retargeting script object","tags":["Retargeting"]},"post":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The id of the retargeting script","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"The body of the retargeting script","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Retargeting.RetargetingScript"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Updates a retargeting script","tags":["Retargeting"]}},"/retargeting/{id}/datapoints":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the retargeting script","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Filter fields by favourite status","in":"query","name":"onlyFavorites","required":false,"type":"boolean"},{"description":"Field to sort by","in":"query","name":"sortBy","required":false,"type":"string"},{"description":"Direction of sort \"asc\" or \"desc\"","enum":["asc","desc"],"in":"query","name":"sortDirection","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the datapoints associated to the retargeting script.","tags":["Retargeting"]}},"/retargeting/{id}/datapoints/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the group","format":"int64","in":"path","name":"id","required":true,"type":"integer"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"A comma separated list of tags you want to filter with.","in":"query","name":"tags","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Filter fields by favourite status","in":"query","name":"onlyFavorites","required":false,"type":"boolean"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Count the datapoints associated to the retargeting script.","tags":["Retargeting"]}},"/tags":{"get":{"consumes":[],"deprecated":false,"parameters":[{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Name of the tag","in":"query","name":"name","required":false,"type":"string"},{"description":"Comma separated list of datapoints id to filter by","in":"query","name":"datapoints","required":false,"type":"string"},{"description":"Comma separated list of groups id to filter by","in":"query","name":"groups","required":false,"type":"string"},{"description":"Type of entity related to the tag","enum":["tp","tl","dp","gr"],"in":"query","name":"type","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the groups associated to the user filtered by this tag.","tags":["Tags"]},"post":{"consumes":["application/json","text/json","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"The body of the tag","in":"body","name":"value","required":true,"schema":{"$ref":"#/definitions/Api.Core.Dto.Tags.Tag"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Create a tag","tags":["Tags"]}},"/tags/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Name of the tag","in":"query","name":"name","required":false,"type":"string"},{"description":"Comma separated list of datapoints id to filter by","in":"query","name":"datapoints","required":false,"type":"string"},{"description":"Comma separated list of groups id to filter by","in":"query","name":"groups","required":false,"type":"string"},{"description":"Type of entity related to the tag","enum":["tp","tl","dp","gr"],"in":"query","name":"type","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/System.Object"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the groups associated to the user filtered by this tag.","tags":["Tags"]}},"/tags/{tagId}":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/System.Object"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete a tag","tags":["Tags"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Dto.Tags.Tag"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Retrieve a tag","tags":["Tags"]}},"/tags/{tagId}/datapoints":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete the association of this tag with all datapoints","tags":["Tags"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag.","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Type of the datapoint (\"tp\"/\"tl\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the datapoints associated to the user filtered by this tag","tags":["Tags"]}},"/tags/{tagId}/datapoints/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag.","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"description":"Type of the datapoint (\"tp\"/\"tl\")","enum":["tp","tl"],"in":"query","name":"type","required":false,"type":"string"},{"description":"Status of the datapoint","enum":["deleted","active","paused","spam"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude datapoints created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude datapoints created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Count the datapoints associated to the user filtered by this tag","tags":["Tags"]}},"/tags/{tagId}/datapoints/patch":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"description":"The body patch","in":"body","name":"data","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.PatchBody"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Associate/Deassociate a tag with a datapoint","tags":["Tags"]}},"/tags/{tagId}/groups":{"delete":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Delete the association of this tag with all groups","tags":["Tags"]},"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag.","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"default":0,"description":"Where to start when retrieving elements. Default is 0 if not specified.","format":"int32","in":"query","minLength":0,"name":"offset","required":false,"type":"integer"},{"default":20,"description":"Maximum elements to retrieve. Default to 20 if not specified.","format":"int32","in":"query","maxLength":0,"minLength":0,"name":"limit","required":false,"type":"integer"},{"description":"Status of the datapoint","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude groups created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude groups created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"List of all the groups associated to the user filtered by this tag.","tags":["Tags"]}},"/tags/{tagId}/groups/count":{"get":{"consumes":[],"deprecated":false,"parameters":[{"description":"Id of the tag.","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"description":"Status of the datapoint","enum":["deleted","active"],"in":"query","name":"status","required":false,"type":"string"},{"description":"Filter fields by this pattern","in":"query","name":"textSearch","required":false,"type":"string"},{"description":"Exclude groups created before this date (YYYYMMDD)","in":"query","name":"createdAfter","required":false,"type":"string"},{"description":"Exclude groups created after this date (YYYYMMDD)","in":"query","name":"createdBefore","required":false,"type":"string"}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.CountResponce"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Count the groups associated to the user filtered by this tag","tags":["Tags"]}},"/tags/{tagId}/groups/patch":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"description":"The body patch","in":"body","name":"data","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.PatchBody"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"404":{"description":"Not found"},"500":{"description":"Internal Server Error"}},"summary":"Associate/Deassociate a tag with a group","tags":["Tags"]}},"/tags/{tagId}/name":{"put":{"consumes":["application/json","text/json","application/xml","text/xml","application/x-www-form-urlencoded"],"deprecated":false,"parameters":[{"description":"Id of the tag","format":"int64","in":"path","name":"tagId","required":true,"type":"integer"},{"description":"The body patch","in":"body","name":"data","required":true,"schema":{"$ref":"#/definitions/Api.Core.Requests.GenericTextPatch"}}],"produces":["application/json","text/json","application/xml","text/xml"],"responses":{"200":{"description":"","schema":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"}},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"summary":"Fast patch a tag name","tags":["Tags"]}}},"definitions":{"Api.Core.Dto.Accounting.ConversionOptions":{"properties":{"hideComCost":{"type":"boolean"},"hideCost":{"type":"boolean"},"hideCount":{"type":"boolean"},"hideParams":{"type":"boolean"},"hideValue":{"type":"boolean"},"percentCommission":{"format":"int32","type":"integer"},"percentValue":{"format":"int32","type":"integer"}},"type":"object"},"Api.Core.Dto.Accounting.DomainWhitelistEntry":{"properties":{"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"Api.Core.Dto.Accounting.ExtendedGrants":{"properties":{"allowAllGrants":{"type":"boolean"},"allowGroupCreation":{"type":"boolean"}},"type":"object"},"Api.Core.Dto.Accounting.Guest":{"properties":{"apiKey":{"type":"string"},"conversionOptions":{"$ref":"#/definitions/Api.Core.Dto.Accounting.ConversionOptions"},"creationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"currentGrant":{"$ref":"#/definitions/Api.Core.Dto.Grants.Grant"},"dateFormat":{"type":"string"},"decimalSeparator":{"type":"string"},"email":{"type":"string"},"extendedGrants":{"$ref":"#/definitions/Api.Core.Dto.Accounting.ExtendedGrants"},"groupGrants":{"format":"int64","type":"integer"},"hitOptions":{"$ref":"#/definitions/Api.Core.Dto.Accounting.HitOptions"},"id":{"format":"int64","type":"integer"},"key":{"type":"string"},"language":{"type":"string"},"loginCount":{"format":"int32","type":"integer"},"name":{"type":"string"},"notes":{"type":"string"},"numberGroupSeparator":{"type":"string"},"password":{"type":"string"},"timeFormat":{"enum":["AmPm","H24"],"type":"string"},"timeZone":{"format":"int32","type":"integer"},"timeframeMinDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"timezonename":{"type":"string"},"tlGrants":{"format":"int64","type":"integer"},"tpGrants":{"format":"int64","type":"integer"},"userName":{"type":"string"}},"type":"object"},"Api.Core.Dto.Accounting.HitOptions":{"properties":{"hideReferrer":{"type":"boolean"}},"type":"object"},"Api.Core.Dto.Accounting.IpBlacklistEntry":{"properties":{"id":{"type":"string"},"ip":{"type":"string"}},"type":"object"},"Api.Core.Dto.Accounting.Plan":{"properties":{"allowedPersonalDomains":{"format":"int32","type":"integer"},"allowedPersonalUrls":{"format":"int32","type":"integer"},"billingPeriodEnd":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"billingPeriodStart":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"bonusMonthlyEvents":{"format":"int64","type":"integer"},"maximumDatapoints":{"format":"int64","type":"integer"},"maximumGuests":{"format":"int64","type":"integer"},"monthlyEvents":{"format":"int64","type":"integer"},"name":{"type":"string"},"price":{"format":"double","type":"number"},"profileId":{"format":"int64","type":"integer"},"recurring":{"type":"boolean"},"recurringPeriod":{"format":"int32","type":"integer"},"usedDatapoints":{"format":"int64","type":"integer"},"usedMonthlyEvents":{"format":"int64","type":"integer"}},"type":"object"},"Api.Core.Dto.Accounting.User":{"properties":{"boGoVal":{"type":"string"},"bonusClicks":{"format":"int64","type":"integer"},"companyName":{"type":"string"},"companyRole":{"type":"string"},"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"phone":{"type":"string"},"redirectOnly":{"type":"boolean"},"registrationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"timeframeMinDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"timezone":{"format":"int32","type":"integer"},"timezonename":{"type":"string"}},"type":"object"},"Api.Core.Dto.Aggregated.AggregatedResult":{"properties":{"activityDay":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"commissionsCost":{"format":"double","type":"number"},"conversionsCost":{"format":"double","type":"number"},"conversionsValue":{"format":"double","type":"number"},"convertedClicks":{"format":"int64","type":"integer"},"entityData":{"$ref":"#/definitions/System.Object"},"entityId":{"type":"string"},"fromDay":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"hourlyBreakDown":{"additionalProperties":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"},"type":"object"},"lastHitDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"spiderHitsCount":{"format":"int64","type":"integer"},"toDay":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"totalClicks":{"format":"int64","type":"integer"},"totalViews":{"format":"int64","type":"integer"},"uniqueClicks":{"format":"int64","type":"integer"},"uniqueConversions":{"format":"int64","type":"integer"},"uniqueViews":{"format":"int64","type":"integer"}},"type":"object"},"Api.Core.Dto.Aggregated.AggregatedSummaryResult":{"properties":{"count":{"format":"int64","type":"integer"},"limit":{"format":"int32","type":"integer"},"offset":{"format":"int64","type":"integer"},"result":{"items":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"},"type":"array"}},"type":"object"},"Api.Core.Dto.ClickStream.Hit":{"properties":{"accessTime":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"browser":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitBrowserInfo"},"clientLanguage":{"type":"string"},"conversion1":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo"},"conversion2":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo"},"conversion3":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo"},"conversion4":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo"},"conversion5":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo"},"conversions":{"items":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo"},"type":"array"},"entity":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitDatapointInfo"},"ip":{"type":"string"},"isProxy":{"type":"string"},"isSpider":{"type":"string"},"isUnique":{"type":"string"},"location":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitLocationInfo"},"org":{"type":"string"},"os":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitOsInfo"},"queryParams":{"type":"string"},"realDestinationUrl":{"type":"string"},"referer":{"type":"string"},"source":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.HitSource"},"type":{"type":"string"}},"type":"object"},"Api.Core.Dto.ClickStream.HitBrowserInfo":{"properties":{"browserType":{"type":"string"},"familyId":{"format":"int64","type":"integer"},"familyName":{"type":"string"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"}},"type":"object"},"Api.Core.Dto.ClickStream.HitConversionInfo":{"properties":{"accessTime":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"comcost":{"format":"double","type":"number"},"cost":{"format":"double","type":"number"},"date":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"parameter":{"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"Api.Core.Dto.ClickStream.HitDatapointInfo":{"properties":{"creationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"datapointFavourite":{"type":"boolean"},"datapointId":{"format":"int64","type":"integer"},"datapointName":{"type":"string"},"datapointTitle":{"type":"string"},"datapointType":{"type":"string"},"destinationUrl":{"type":"string"},"groupId":{"format":"int64","type":"integer"},"groupName":{"type":"string"},"isABTest":{"type":"boolean"},"isPrivateShared":{"type":"boolean"},"isPublic":{"type":"boolean"},"notes":{"type":"string"},"status":{"enum":["Active","Paused","Abuse","Deleted"],"type":"string"},"tags":{"items":{"$ref":"#/definitions/Api.Core.Dto.Tags.Tag"},"type":"array"},"trackingCode":{"type":"string"}},"type":"object"},"Api.Core.Dto.ClickStream.HitListPage":{"properties":{"hits":{"items":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.Hit"},"type":"array"},"lastKey":{"type":"string"}},"type":"object"},"Api.Core.Dto.ClickStream.HitLocationInfo":{"properties":{"areacode":{"type":"string"},"city":{"type":"string"},"country":{"type":"string"},"latitude":{"format":"double","type":"number"},"longitude":{"format":"double","type":"number"},"metrocode":{"type":"string"},"organization":{"type":"string"},"postalcode":{"type":"string"},"region":{"type":"string"},"regionName":{"type":"string"}},"type":"object"},"Api.Core.Dto.ClickStream.HitOsInfo":{"properties":{"familyId":{"format":"int64","type":"integer"},"familyName":{"type":"string"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"}},"type":"object"},"Api.Core.Dto.ClickStream.HitSource":{"properties":{"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"param":{"type":"string"}},"type":"object"},"Api.Core.Dto.Conversions.Conversion":{"properties":{"code":{"type":"string"},"creationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"deleted":{"type":"boolean"},"description":{"type":"string"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"protocol":{"enum":["Http","Https"],"type":"string"},"value":{"format":"double","type":"number"}},"type":"object"},"Api.Core.Dto.Datapoints.BrowserBaseDestinationItem":{"properties":{"emailDestinationUrl":{"type":"string"},"mobileDestinationUrl":{"type":"string"},"spidersDestinationUrl":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.Datapoint":{"properties":{"creationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"encodeIp":{"type":"boolean"},"fifthConversionId":{"format":"int64","type":"integer"},"fifthConversionName":{"type":"string"},"firstConversionId":{"format":"int64","type":"integer"},"firstConversionName":{"type":"string"},"fourthConversionId":{"format":"int64","type":"integer"},"fourthConversionName":{"type":"string"},"groupId":{"format":"int64","type":"integer"},"groupName":{"type":"string"},"id":{"format":"int64","type":"integer"},"isPublic":{"type":"boolean"},"isSecured":{"type":"boolean"},"lightTracking":{"type":"boolean"},"name":{"type":"string"},"notes":{"type":"string"},"preferred":{"type":"boolean"},"redirectOnly":{"type":"boolean"},"secondConversionId":{"format":"int64","type":"integer"},"secondConversionName":{"type":"string"},"status":{"enum":["Active","Paused","Abuse","Deleted"],"type":"string"},"tags":{"items":{"$ref":"#/definitions/Api.Core.Dto.Tags.Tag"},"type":"array"},"thirdConversionId":{"format":"int64","type":"integer"},"thirdConversionName":{"type":"string"},"title":{"type":"string"},"trackingCode":{"type":"string"},"type":{"enum":["TrackingLink","TrackingPixel"],"type":"string"},"typeTL":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.TrackingLinkSpecifics"},"typeTP":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.TrackingPixelSpecifics"},"writePermited":{"type":"boolean"}},"type":"object"},"Api.Core.Dto.Datapoints.DatapointRetargetingInfo":{"properties":{"id":{"format":"int64","type":"integer"},"name":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.MultipleDestinationItem":{"properties":{"url":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.TrackingLinkSpecifics":{"properties":{"appendQuery":{"type":"boolean"},"browserDestinationItem":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.BrowserBaseDestinationItem"},"destinationMode":{"enum":["Simple","RandomDestination","DestinationByLanguage","SpilloverDestination","DynamicUrl","BrowserDestination","DestinationByNation","UniqueDestination","SequentialDestination","WeightedDestination"],"type":"string"},"domainId":{"format":"int32","type":"integer"},"encodeUrl":{"type":"boolean"},"expirationClicks":{"format":"int64","type":"integer"},"expirationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"firstUrl":{"type":"string"},"goDomainId":{"format":"int32","type":"integer"},"hideUrl":{"type":"boolean"},"hideUrlTitle":{"type":"string"},"isABTest":{"type":"boolean"},"password":{"type":"string"},"pauseAfterClicksExpiration":{"type":"boolean"},"pauseAfterDateExpiration":{"type":"boolean"},"randomDestinationItems":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.MultipleDestinationItem"},"type":"array"},"redirectType":{"enum":["PermanentRedirect","TemporaryRedirect"],"type":"string"},"referrerClean":{"enum":["None","Clean","Myself"],"type":"string"},"scripts":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.DatapointRetargetingInfo"},"type":"array"},"sequentialDestinationItems":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.MultipleDestinationItem"},"type":"array"},"spilloverDestinationItems":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.MultipleDestinationItem"},"type":"array"},"uniqueDestinationItem":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.UniqueDestinationItem"},"url":{"type":"string"},"urlAfterClicksExpiration":{"type":"string"},"urlAfterDateExpiration":{"type":"string"},"urlsByLanguage":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.UrlByLanguageItem"},"type":"array"},"urlsByNation":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.UrlByNationItem"},"type":"array"},"weightedDestinationItems":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.WeightedDestinationItem"},"type":"array"}},"type":"object"},"Api.Core.Dto.Datapoints.TrackingPixelSpecifics":{"properties":{"parameterNote":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.UniqueDestinationItem":{"properties":{"firstDestinationUrl":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.UrlByLanguageItem":{"properties":{"languageCode":{"type":"string"},"url":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.UrlByNationItem":{"properties":{"nation":{"type":"string"},"url":{"type":"string"}},"type":"object"},"Api.Core.Dto.Datapoints.WeightedDestinationItem":{"properties":{"url":{"type":"string"},"weight":{"format":"int32","type":"integer"}},"type":"object"},"Api.Core.Dto.Domains.Domain":{"properties":{"custom404":{"type":"string"},"customHomepage":{"type":"string"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"type":{"enum":["System","Go","Dedicated","Personal"],"type":"string"}},"type":"object"},"Api.Core.Dto.EntityUriLong":{"properties":{"id":{"format":"int64","type":"integer"},"uri":{"type":"string"}},"type":"object"},"Api.Core.Dto.Grants.Grant":{"properties":{"DatapointType":{"type":"string"},"Entity":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"},"EntityName":{"type":"string"},"EntityType":{"type":"string"},"Type":{"type":"string"}},"type":"object"},"Api.Core.Dto.Groups.Group":{"properties":{"creationDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"isPublic":{"type":"boolean"},"name":{"type":"string"},"notes":{"type":"string"},"preferred":{"type":"boolean"},"redirectOnly":{"type":"boolean"},"tags":{"items":{"$ref":"#/definitions/Api.Core.Dto.Tags.Tag"},"type":"array"},"writePermited":{"type":"boolean"}},"type":"object"},"Api.Core.Dto.Retargeting.RetargetingScript":{"properties":{"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"script":{"type":"string"}},"type":"object"},"Api.Core.Dto.Tags.Tag":{"properties":{"datapoints":{"items":{"format":"int64","type":"integer"},"type":"array"},"groups":{"items":{"format":"int64","type":"integer"},"type":"array"},"id":{"format":"int64","type":"integer"},"name":{"type":"string"}},"type":"object"},"Api.Core.Dto.Tops.Top":{"properties":{"createdAt":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"data":{"items":{"$ref":"#/definitions/Api.Core.Dto.Tops.TopItem"},"type":"array"},"key":{"type":"string"}},"type":"object"},"Api.Core.Dto.Tops.TopItem":{"properties":{"entityData":{"$ref":"#/definitions/System.Object"},"id":{"type":"string"},"lastHitDate":{"description":" (A date in \"YmdHis\" format)","example":"20120203120530","type":"string"},"spiderClicks":{"format":"int64","type":"integer"},"spiderHits":{"format":"int64","type":"integer"},"spiderViews":{"format":"int64","type":"integer"},"totalClicks":{"format":"int64","type":"integer"},"totalCommissionsCost":{"format":"double","type":"number"},"totalConversions":{"format":"int64","type":"integer"},"totalConversionsCost":{"format":"double","type":"number"},"totalConversionsValue":{"format":"double","type":"number"},"totalHits":{"format":"int64","type":"integer"},"totalViews":{"format":"int64","type":"integer"},"uniqueClicks":{"format":"int64","type":"integer"},"uniqueHits":{"format":"int64","type":"integer"},"uniqueViews":{"format":"int64","type":"integer"}},"type":"object"},"Api.Core.Requests.ConversionPatchBody":{"properties":{"Action":{"type":"string"},"Id":{"format":"int64","type":"integer"},"ReplaceId":{"format":"int64","type":"integer"}},"type":"object"},"Api.Core.Requests.DatapointsBatch":{"properties":{"List":{"items":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.Datapoint"},"type":"array"}},"type":"object"},"Api.Core.Requests.DeleteBatch":{"properties":{"Entities":{"items":{"$ref":"#/definitions/Api.Core.Dto.EntityUriLong"},"type":"array"}},"type":"object"},"Api.Core.Requests.GenericTextPatch":{"properties":{"Text":{"type":"string"}},"type":"object"},"Api.Core.Requests.PatchBody":{"properties":{"Action":{"type":"string"},"Id":{"format":"int64","type":"integer"}},"type":"object"},"Api.Core.Requests.PatchBodyBatch":{"properties":{"PatchRequests":{"items":{"$ref":"#/definitions/Api.Core.Requests.PatchBody"},"type":"array"}},"type":"object"},"Api.Core.Requests.PermissionPatchRequest":{"properties":{"Action":{"type":"string"},"Id":{"format":"int64","type":"integer"},"Verb":{"type":"string"}},"type":"object"},"Api.Core.Responses.CountResponce":{"properties":{"count":{"format":"int64","type":"integer"}},"type":"object"},"Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.DomainWhitelistEntry]":{"properties":{"entities":{"items":{"$ref":"#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry"},"type":"array"}},"type":"object"},"Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.IpBlacklistEntry]":{"properties":{"entities":{"items":{"$ref":"#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry"},"type":"array"}},"type":"object"},"Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]":{"properties":{"entities":{"items":{"$ref":"#/definitions/Api.Core.Dto.Aggregated.AggregatedResult"},"type":"array"}},"type":"object"},"Api.Core.Responses.EntitiesResponse[Api.Core.Dto.ClickStream.Hit]":{"properties":{"entities":{"items":{"$ref":"#/definitions/Api.Core.Dto.ClickStream.Hit"},"type":"array"}},"type":"object"},"Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Grants.Grant]":{"properties":{"entities":{"items":{"$ref":"#/definitions/Api.Core.Dto.Grants.Grant"},"type":"array"}},"type":"object"},"Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]":{"properties":{"entities":{"items":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"},"type":"array"}},"type":"object"},"Api.Core.Responses.EntityUri[System.Int64]":{"properties":{"id":{"format":"int64","type":"integer"},"uri":{"type":"string"}},"type":"object"},"Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]":{"properties":{"entityData":{"$ref":"#/definitions/Api.Core.Dto.Datapoints.Datapoint"},"errors":{"items":{"$ref":"#/definitions/ClickMeter.Infrastructure.Validation.ValidationFailure"},"type":"array"},"result":{"$ref":"#/definitions/Api.Core.Responses.EntityUri[System.Int64]"},"status":{"type":"string"}},"type":"object"},"ClickMeter.Infrastructure.Validation.ValidationFailure":{"properties":{"code":{"$ref":"#/definitions/System.Object"},"errorMessage":{"type":"string"},"errorValue":{"$ref":"#/definitions/System.Object"},"property":{"type":"string"}},"type":"object"},"System.Object":{"properties":{},"type":"object"}}} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.yaml b/vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.yaml deleted file mode 100644 index 0ce32b1a92..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/clickmeter.yaml +++ /dev/null @@ -1,6461 +0,0 @@ -swagger: '2.0' -schemes: - - http - - https -host: 'apiv2.clickmeter.com:80' -info: - contact: - email: api@clickmeter.com - name: Api Support - url: 'http://www.clickmeter.com/api' - description: Api dashboard for ClickMeter API - title: ClickMeter - version: v2 - x-logo: - url: 'https://s3.amazonaws.com/clickmeter.com/Web/static/cmlogo.svg' - x-origin: - format: swagger - url: 'http://api.v2.clickmeter.com.s3.amazonaws.com/docs/api-docs-v2.json' - version: '2.0' - x-providerName: clickmeter.com -securityDefinitions: - api_key: - description: API Key Authentication - in: header - name: X-Clickmeter-AuthKey - type: apiKey -security: - - api_key: [] -paths: - /account: - get: - consumes: [] - deprecated: false - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.User' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve current account data - tags: - - Account - post: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.User' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.User' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Update current account data - tags: - - Account - /account/domainwhitelist: - get: - consumes: [] - deprecated: false - parameters: - - description: Offset where to start from - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.DomainWhitelistEntry]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve list of a domains allowed to redirect in DDU mode - tags: - - Account - post: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: The entry to add - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Create an domain entry - tags: - - Account - '/account/domainwhitelist/{whitelistId}': - delete: - consumes: [] - deprecated: false - parameters: - - description: The id of the domain to delete - in: path - name: whitelistId - required: true - type: string - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Delete an domain entry - tags: - - Account - /account/guests: - get: - consumes: [] - deprecated: false - parameters: - - description: Offset where to start from - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: Field to sort by - in: query - name: sortBy - required: false - type: string - - description: 'Direction of sort "asc" or "desc"' - enum: - - asc - - desc - in: query - name: sortDirection - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve list of a guest - tags: - - Account - post: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Guest object to create - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.Guest' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.Guest' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Create a guest - tags: - - Account - /account/guests/count: - get: - consumes: [] - deprecated: false - parameters: - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.CountResponce' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve count of guests - tags: - - Account - '/account/guests/{guestId}': - delete: - consumes: [] - deprecated: false - parameters: - - description: Id of the guest - format: int64 - in: path - name: guestId - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Delete a guest - tags: - - Account - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the guest - format: int64 - in: path - name: guestId - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.Guest' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve a guest - tags: - - Account - post: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of the guest - format: int64 - in: path - name: guestId - required: true - type: integer - - description: Guest object with field updated - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.Guest' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.Guest' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Update a guest - tags: - - Account - '/account/guests/{guestId}/permissions': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the guest - format: int64 - in: path - name: guestId - required: true - type: integer - - description: 'Can be "datapoint" or "group"' - enum: - - datapoint - - group - in: query - name: entityType - required: false - type: string - - description: Offset where to start from - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: 'Can be "w" or "r"' - enum: - - r - - w - in: query - name: type - required: false - type: string - - description: Optional id of the datapoint/group entity to filter by - format: int64 - in: query - name: entityId - required: false - type: integer - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Grants.Grant]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve permissions for a guest - tags: - - Account - '/account/guests/{guestId}/permissions/count': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the guest - format: int64 - in: path - name: guestId - required: true - type: integer - - description: 'Can be "datapoint" or "group"' - enum: - - datapoint - - group - in: query - name: entityType - required: false - type: string - - description: 'Can be "w" or "r"' - enum: - - r - - w - in: query - name: type - required: false - type: string - - description: Optional id of the datapoint/group entity to filter by - format: int64 - in: query - name: entityId - required: false - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.CountResponce' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve count of the permissions for a guest - tags: - - Account - '/account/guests/{guestId}/{type}/permissions/patch': - post: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of the guest - format: int64 - in: path - name: guestId - required: true - type: integer - - description: 'Can be "datapoint" or "group"' - enum: - - datapoint - - group - in: path - name: type - required: true - type: string - - description: The patch permission request - in: body - name: body - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.PermissionPatchRequest' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Change the permission on a shared object - tags: - - Account - put: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of the guest - format: int64 - in: path - name: guestId - required: true - type: integer - - description: 'Can be "datapoint" or "group"' - enum: - - datapoint - - group - in: path - name: type - required: true - type: string - - description: The patch permission request - in: body - name: body - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.PermissionPatchRequest' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Change the permission on a shared object - tags: - - Account - /account/ipblacklist: - get: - consumes: [] - deprecated: false - parameters: - - description: Offset where to start from - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.IpBlacklistEntry]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve list of a ip to exclude from event tracking - tags: - - Account - post: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: The entry to add - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Create an ip blacklist entry - tags: - - Account - '/account/ipblacklist/{blacklistId}': - delete: - consumes: [] - deprecated: false - parameters: - - description: The id of the ip to delete - in: path - name: blacklistId - required: true - type: string - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Delete an ip blacklist entry - tags: - - Account - /account/plan: - get: - consumes: [] - deprecated: false - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.Plan' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve current account plan - tags: - - Account - /aggregated: - get: - consumes: [] - deprecated: false - parameters: - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'If using "yesterday" or "today" timeframe you can ask for the hourly detail' - in: query - name: hourly - required: false - type: boolean - - description: '' - in: query - name: onlyFavorites - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about this customer for a timeframe - tags: - - Aggregated - /aggregated/list: - get: - consumes: [] - deprecated: false - parameters: - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' - enum: - - week - - month - in: query - name: groupBy - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about this customer for a timeframe grouped by some temporal entity (day/week/month) - tags: - - Aggregated - /aggregated/summary/conversions: - get: - consumes: [] - deprecated: false - parameters: - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'Status of conversion ("deleted"/"active")' - enum: - - deleted - - active - in: query - name: status - required: false - type: string - - description: Field to sort by - in: query - name: sortBy - required: false - type: string - - description: 'Direction of sort "asc" or "desc"' - enum: - - asc - - desc - in: query - name: sortDirection - required: false - type: string - - description: Offset where to start from - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about a subset of conversions for a timeframe with conversions data - tags: - - Aggregated - /aggregated/summary/datapoints: - get: - consumes: [] - deprecated: false - parameters: - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'Type of datapoint ("tl"/"tp")' - enum: - - tp - - tl - in: query - name: type - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'Status of datapoint ("deleted"/"active"/"paused"/"spam")' - enum: - - deleted - - active - - paused - - spam - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tag - required: false - type: string - - description: Is the datapoint marked as favourite - in: query - name: favourite - required: false - type: boolean - - description: Field to sort by - in: query - name: sortBy - required: false - type: string - - description: 'Direction of sort "asc" or "desc"' - enum: - - asc - - desc - in: query - name: sortDirection - required: false - type: string - - description: Offset where to start from - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: Filter by this group id - format: int64 - in: query - name: groupId - required: false - type: integer - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about a subset of datapoints for a timeframe with datapoints data - tags: - - Aggregated - /aggregated/summary/groups: - get: - consumes: [] - deprecated: false - parameters: - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'Status of group ("deleted"/"active")' - enum: - - deleted - - active - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tag - required: false - type: string - - description: Is the group marked as favourite - in: query - name: favourite - required: false - type: boolean - - description: Field to sort by - in: query - name: sortBy - required: false - type: string - - description: 'Direction of sort "asc" or "desc"' - enum: - - asc - - desc - in: query - name: sortDirection - required: false - type: string - - description: Offset where to start from - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about a subset of groups for a timeframe with groups data - tags: - - Aggregated - /clickstream: - get: - consumes: [] - deprecated: false - parameters: - - description: 'Filter by this group id (mutually exclusive with "datapoint" and "conversion")' - format: int64 - in: query - name: group - required: false - type: integer - - description: 'Filter by this datapoint id (mutually exclusive with "group" and "conversion")' - format: int64 - in: query - name: datapoint - required: false - type: integer - - description: 'Filter by this conversion id (mutually exclusive with "datapoint" and "group")' - format: int64 - in: query - name: conversion - required: false - type: integer - - default: 50 - description: Limit results to this number - format: int32 - in: query - name: pageSize - required: false - type: integer - - description: 'Filter event type ("spiders"/"uniques"/"nonuniques"/"conversions")' - enum: - - '' - - spiders - - uniques - - nonuniques - - conversions - in: query - name: filter - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.ClickStream.Hit]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve the latest list of events of this account. Limited to last 100. - tags: - - ClickStream - /conversions: - get: - consumes: [] - deprecated: false - parameters: - - description: Offset where to start from - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: 'Status of conversion ("deleted"/"active")' - enum: - - deleted - - active - in: query - name: status - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Exclude conversions created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude conversions created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve a list of conversions - tags: - - Conversions - post: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: The body of the conversion - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Conversions.Conversion' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Create a conversion - tags: - - Conversions - /conversions/aggregated/list: - get: - consumes: [] - deprecated: false - parameters: - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'Status of conversion ("deleted"/"active")' - enum: - - deleted - - active - in: query - name: status - required: false - type: string - - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' - enum: - - week - - month - in: query - name: groupBy - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about this customer for a timeframe related to a subset of conversions grouped by some temporal entity (day/week/month) - tags: - - Conversions - /conversions/count: - get: - consumes: [] - deprecated: false - parameters: - - description: 'Status of conversion ("deleted"/"active")' - enum: - - deleted - - active - in: query - name: status - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Exclude conversions created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude conversions created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.CountResponce' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve a count of conversions - tags: - - Conversions - '/conversions/{conversionId}': - delete: - consumes: [] - deprecated: false - parameters: - - description: Id of the conversion - format: int64 - in: path - name: conversionId - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Delete conversion specified by id - tags: - - Conversions - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the conversion - format: int64 - in: path - name: conversionId - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Conversions.Conversion' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Retrieve conversion specified by id - tags: - - Conversions - post: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of the conversion - format: int64 - in: path - name: conversionId - required: true - type: integer - - description: Updated body of the conversion - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Conversions.Conversion' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Update conversion specified by id - tags: - - Conversions - '/conversions/{conversionId}/aggregated': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the conversion - format: int64 - in: path - name: conversionId - required: true - type: integer - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: Filter by this tag name - in: query - name: tag - required: false - type: string - - description: Is the datapoint marked as favourite - in: query - name: favourite - required: false - type: boolean - - description: 'If using "yesterday" or "today" timeframe you can ask for the hourly detail' - in: query - name: hourly - required: false - type: boolean - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about this conversion for a timeframe - tags: - - Conversions - '/conversions/{conversionId}/aggregated/list': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the conversion - format: int64 - in: path - name: conversionId - required: true - type: integer - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' - enum: - - week - - month - in: query - name: groupBy - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about this conversion for a timeframe grouped by some temporal entity (day/week/month) - tags: - - Conversions - '/conversions/{conversionId}/datapoints': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the conversion - format: int64 - in: path - name: conversionId - required: true - type: integer - - description: Offset where to start from - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: 'Type of datapoint ("tl"/"tp")' - enum: - - tp - - tl - in: query - name: type - required: false - type: string - - description: 'Status of datapoint ("deleted"/"active"/"paused"/"spam")' - enum: - - deleted - - active - - paused - - spam - in: query - name: status - required: false - type: string - - description: Filter by this tag name - in: query - name: tags - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Exclude datapoints created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude datapoints created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve a list of datapoints connected to this conversion - tags: - - Conversions - '/conversions/{conversionId}/datapoints/batch/patch': - put: - consumes: - - application/json - - text/json - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of the conversion - format: int64 - in: path - name: conversionId - required: true - type: integer - - description: Patch requests - in: body - name: data - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.PatchBodyBatch' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Modify the association between a conversion and multiple datapoints - tags: - - Conversions - '/conversions/{conversionId}/datapoints/count': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the conversion - format: int64 - in: path - name: conversionId - required: true - type: integer - - description: 'Type of datapoint ("tl"/"tp")' - in: query - name: type - required: false - type: string - - description: 'Status of datapoint ("deleted"/"active"/"paused"/"spam")' - in: query - name: status - required: false - type: string - - description: Filter by this tag name - in: query - name: tags - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Exclude datapoints created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude datapoints created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.CountResponce' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve a count of datapoints connected to this conversion - tags: - - Conversions - '/conversions/{conversionId}/datapoints/patch': - put: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of the conversion - format: int64 - in: path - name: conversionId - required: true - type: integer - - description: Patch request - in: body - name: data - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.ConversionPatchBody' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Modify the association between a conversion and a datapoint - tags: - - Conversions - '/conversions/{conversionId}/hits': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the conversion - format: int64 - in: path - name: conversionId - required: true - type: integer - - description: Timeframe of the request. See list at $timeframeList - enum: - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - custom - in: query - name: timeframe - required: true - type: string - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: "Offset where to start from (it's the lastKey field in the response object)" - in: query - name: offset - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'Filter event type ("spiders"/"uniques"/"nonuniques"/"conversions")' - enum: - - spiders - - uniques - - nonuniques - - conversions - in: query - name: filter - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitListPage' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve the list of events related to this conversion. - tags: - - Conversions - '/conversions/{conversionId}/notes': - put: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of the conversion - format: int64 - in: path - name: conversionId - required: true - type: integer - - description: Patch requests - in: body - name: note - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.GenericTextPatch' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '403': - description: Forbidden - '404': - description: Not found - '500': - description: Internal Server Error - summary: 'Fast patch the "notes" field of a conversion' - tags: - - Conversions - '/conversions/{conversionId}/reports': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the conversion - format: int64 - in: path - name: conversionId - required: true - type: integer - - description: Type of the report. - enum: - - datapoints - - groups - - browsers - - browsersfamilies - - platforms - - cities - - countries - - keywords - - referrers - - convparameters - - destinations - - languages - - params - in: query - name: type - required: true - type: string - - description: Timeframe of the request. See list at $timeframeList - enum: - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - beginning - - custom - in: query - name: timeframe - required: true - type: string - - description: Type of the event you want to filter this report with. By default no filter is applied. - enum: - - clicks - - views - in: query - name: hittype - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Tops.Top' - '401': - description: Forbidden - '404': - description: Not found - '500': - description: Internal Server Error - summary: Retrieve a top report connected to this conversion - tags: - - Conversions - /datapoints: - get: - consumes: [] - deprecated: false - parameters: - - default: 0 - description: Where to start when retrieving elements. Default is 0 if not specified. - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - default: 20 - description: Maximum elements to retrieve. Default to 20 if not specified. - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: 'Type of the datapoint ("tp"/"tl")' - enum: - - tp - - tl - in: query - name: type - required: false - type: string - - description: Status of the datapoint - enum: - - deleted - - active - - paused - - spam - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tags - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Filter fields by favourite status - in: query - name: onlyFavorites - required: false - type: boolean - - description: Field to sort by - in: query - name: sortBy - required: false - type: string - - description: 'Direction of sort "asc" or "desc"' - enum: - - asc - - desc - in: query - name: sortDirection - required: false - type: string - - description: Exclude datapoints created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude datapoints created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: List of all the datapoints associated to the user - tags: - - DataPoints - post: - consumes: - - application/json - - text/json - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: The body of the datapoint - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Datapoints.Datapoint' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Create a datapoint - tags: - - DataPoints - /datapoints/aggregated: - get: - consumes: [] - deprecated: false - parameters: - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'Type of datapoint ("tl"/"tp")' - enum: - - tp - - tl - in: query - name: type - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'If using "yesterday" or "today" timeframe you can ask for the hourly detail' - in: query - name: hourly - required: false - type: boolean - - description: 'Status of datapoint ("deleted"/"active"/"paused"/"spam")' - enum: - - deleted - - active - - paused - - spam - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tag - required: false - type: string - - description: Is the datapoint is marked as favourite - in: query - name: favourite - required: false - type: boolean - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about this customer for a timeframe by groups - tags: - - DataPoints - /datapoints/aggregated/list: - get: - consumes: [] - deprecated: false - parameters: - - description: 'Type of datapoint ("tl"/"tp")' - enum: - - tp - - tl - in: query - name: type - required: true - type: string - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'Status of datapoint ("deleted"/"active"/"paused"/"spam")' - enum: - - deleted - - active - - paused - - spam - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tag - required: false - type: string - - description: Is the datapoint is marked as favourite - in: query - name: favourite - required: false - type: boolean - - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' - enum: - - week - - month - in: query - name: groupBy - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about all datapoints of this customer for a timeframe grouped by some temporal entity (day/week/month) - tags: - - DataPoints - /datapoints/batch: - delete: - consumes: - - application/json - - text/json - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: A json containing the datapoints to delete. - in: body - name: batch - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.DeleteBatch' - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Delete multiple datapoints - tags: - - DataPoints - post: - consumes: - - application/json - - text/json - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: A json containing the datapoints to update. - in: body - name: batch - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.DatapointsBatch' - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Update multiple datapoints - tags: - - DataPoints - put: - consumes: - - application/json - - text/json - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: A json containing the datapoints to create. - in: body - name: batch - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.DatapointsBatch' - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Create multiple datapoints - tags: - - DataPoints - /datapoints/count: - get: - consumes: [] - deprecated: false - parameters: - - description: 'Type of the datapoint ("tp"/"tl")' - enum: - - tp - - tl - in: query - name: type - required: false - type: string - - description: Status of the datapoint - enum: - - deleted - - active - - paused - - spam - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tags - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Filter fields by favourite status - in: query - name: onlyFavorites - required: false - type: boolean - - description: Exclude datapoints created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude datapoints created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.CountResponce' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Count the datapoints associated to the user - tags: - - DataPoints - '/datapoints/{id}': - delete: - consumes: [] - deprecated: false - parameters: - - description: The id of the datapoint - format: int64 - in: path - name: id - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Delete a datapoint - tags: - - DataPoints - get: - consumes: [] - deprecated: false - parameters: - - description: The id of the datapoint - format: int64 - in: path - name: id - required: true - type: integer - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Datapoints.Datapoint' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Get a datapoint - tags: - - DataPoints - post: - consumes: - - application/json - - text/json - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: The id of the datapoint - format: int64 - in: path - name: id - required: true - type: integer - - description: The body of the datapoint - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Datapoints.Datapoint' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Update a datapoint - tags: - - DataPoints - '/datapoints/{id}/aggregated': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the datapoint - format: int64 - in: path - name: id - required: true - type: integer - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'If using "yesterday" or "today" timeframe you can ask for the hourly detail' - in: query - name: hourly - required: false - type: boolean - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about this datapoint for a timeframe - tags: - - DataPoints - '/datapoints/{id}/aggregated/list': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the datapoint - format: int64 - in: path - name: id - required: true - type: integer - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' - enum: - - week - - month - in: query - name: groupBy - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about this datapoint for a timeframe grouped by some temporal entity (day/week/month) - tags: - - DataPoints - '/datapoints/{id}/favourite': - put: - consumes: [] - deprecated: false - parameters: - - description: Id of the datapoint - format: int64 - in: path - name: id - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '403': - description: Forbidden - '404': - description: Not found - '500': - description: Internal Server Error - summary: 'Fast switch the "favourite" field of a datapoint' - tags: - - DataPoints - '/datapoints/{id}/hits': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the datapoint - format: int64 - in: path - name: id - required: true - type: integer - - description: Timeframe of the request. See list at $timeframeList - enum: - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - custom - in: query - name: timeframe - required: true - type: string - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: "Offset where to start from (it's the lastKey field in the response object)" - in: query - name: offset - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'Filter event type ("spiders"/"uniques"/"nonuniques"/"conversions")' - enum: - - spiders - - uniques - - nonuniques - - conversions - in: query - name: filter - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitListPage' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve the list of events related to this datapoint. - tags: - - DataPoints - '/datapoints/{id}/notes': - put: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of the datapoint - format: int64 - in: path - name: id - required: true - type: integer - - description: Patch requests - in: body - name: note - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.GenericTextPatch' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '403': - description: Forbidden - '404': - description: Not found - '500': - description: Internal Server Error - summary: 'Fast patch the "notes" field of a datapoint' - tags: - - DataPoints - '/datapoints/{id}/reports': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the datapoint - format: int64 - in: path - name: id - required: true - type: integer - - description: Type of the report. - enum: - - browsers - - browsersfamilies - - platforms - - cities - - countries - - isps - - ips - - oss - - ossfamilies - - keywords - - referrers - - destinations - - languages - - params - in: query - name: type - required: true - type: string - - description: Timeframe of the request. See list at $timeframeList - enum: - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - beginning - - custom - in: query - name: timeframe - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Tops.Top' - '401': - description: Forbidden - '404': - description: Not found - '500': - description: Internal Server Error - summary: Retrieve a top report connected to this datapoint - tags: - - DataPoints - /domains: - get: - consumes: [] - deprecated: false - parameters: - - description: Offset where to start from - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - default: system - description: 'Type of domain ("system"/"go"/"personal"/"dedicated"). If not specified default is "system"' - enum: - - system - - go - - personal - - dedicated - in: query - name: type - required: false - type: string - - description: Filter domains with this anmen - in: query - name: name - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve a list of domains - tags: - - Domains - post: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: The domain to create - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Domains.Domain' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Create a domain - tags: - - Domains - /domains/count: - get: - consumes: [] - deprecated: false - parameters: - - default: system - description: 'Type of domain ("system"/"go"/"personal"/"dedicated"). If not specified default is "system"' - enum: - - system - - go - - personal - - dedicated - in: query - name: type - required: false - type: string - - description: Filter domains with this anmen - in: query - name: name - required: false - type: string - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.CountResponce' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve count of domains - tags: - - Domains - '/domains/{id}': - delete: - consumes: [] - deprecated: false - parameters: - - description: Id of domain - format: int64 - in: path - name: id - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Delete a domain - tags: - - Domains - get: - consumes: [] - deprecated: false - parameters: - - description: Id of domain - format: int64 - in: path - name: id - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Domains.Domain' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Get a domain - tags: - - Domains - post: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of domain - format: int64 - in: path - name: id - required: true - type: integer - - description: The domain to update - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Domains.Domain' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Update a domain - tags: - - Domains - /groups: - get: - consumes: [] - deprecated: false - parameters: - - default: 0 - description: Where to start when retrieving elements. Default is 0 if not specified. - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - default: 20 - description: Maximum elements to retrieve. Default to 20 if not specified. - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: Status of the group - enum: - - deleted - - active - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tags - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Exclude groups created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude groups created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - - description: Write permission - in: query - name: write - required: false - type: boolean - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: List of all the groups associated to the user. - tags: - - Groups - post: - consumes: - - application/json - - text/json - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: The body of the group - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Groups.Group' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Create a group - tags: - - Groups - /groups/aggregated: - get: - consumes: [] - deprecated: false - parameters: - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'If using "yesterday" or "today" timeframe you can ask for the hourly detail' - in: query - name: hourly - required: false - type: boolean - - description: 'Status of group ("deleted"/"active")' - enum: - - deleted - - active - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tag - required: false - type: string - - description: Is the group is marked as favourite - in: query - name: favourite - required: false - type: boolean - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about this customer for a timeframe by groups - tags: - - Groups - /groups/aggregated/list: - get: - consumes: [] - deprecated: false - parameters: - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'Status of group ("deleted"/"active")' - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tag - required: false - type: string - - description: Is the group is marked as favourite - in: query - name: favourite - required: false - type: boolean - - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' - enum: - - deleted - - active - in: query - name: groupBy - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about all groups of this customer for a timeframe grouped by some temporal entity (day/week/month) - tags: - - Groups - /groups/count: - get: - consumes: [] - deprecated: false - parameters: - - description: Status of the datapoint - enum: - - deleted - - active - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tags - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Exclude groups created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude groups created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - - description: Write permission - in: query - name: write - required: false - type: boolean - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.CountResponce' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Count the groups associated to the user. - tags: - - Groups - '/groups/{id}': - delete: - consumes: [] - deprecated: false - parameters: - - description: Id of the group - format: int64 - in: path - name: id - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Delete group specified by id - tags: - - Groups - get: - consumes: [] - deprecated: false - parameters: - - description: The id of the group - format: int64 - in: path - name: id - required: true - type: integer - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Groups.Group' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Get a group - tags: - - Groups - post: - consumes: - - application/json - - text/json - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: The id of the group - format: int64 - in: path - name: id - required: true - type: integer - - description: The body of the group - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Groups.Group' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Update a group - tags: - - Groups - '/groups/{id}/aggregated': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the group - format: int64 - in: path - name: id - required: true - type: integer - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'If using "yesterday" or "today" timeframe you can ask for the hourly detail' - in: query - name: hourly - required: false - type: boolean - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about this group for a timeframe - tags: - - Groups - '/groups/{id}/aggregated/list': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the group - format: int64 - in: path - name: id - required: true - type: integer - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'The temporal entity you want to group by ("week"/"month"). If unspecified is "day".' - enum: - - week - - month - in: query - name: groupBy - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about this group for a timeframe grouped by some temporal entity (day/week/month) - tags: - - Groups - '/groups/{id}/aggregated/summary': - get: - consumes: [] - deprecated: false - parameters: - - description: Filter by this group id - format: int64 - in: path - name: id - required: true - type: integer - - description: Timeframe of the request. See list at $timeframeList - enum: - - today - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - last12months - - lastyear - - currentyear - - beginning - - custom - in: query - name: timeFrame - required: true - type: string - - description: 'Type of datapoint ("tl"/"tp")' - enum: - - tp - - tl - in: query - name: type - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'Status of datapoint ("deleted"/"active"/"paused"/"spam")' - enum: - - deleted - - active - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tag - required: false - type: string - - description: Is the datapoint marked as favourite - in: query - name: favourite - required: false - type: boolean - - description: Field to sort by - in: query - name: sortBy - required: false - type: string - - description: 'Direction of sort "asc" or "desc"' - enum: - - asc - - desc - in: query - name: sortDirection - required: false - type: string - - default: 0 - description: Offset where to start from - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - default: 20 - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedSummaryResult' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve statistics about a subset of datapoints for a timeframe with datapoints data - tags: - - Groups - '/groups/{id}/datapoints': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the group - format: int64 - in: path - name: id - required: true - type: integer - - default: 0 - description: Where to start when retrieving elements. Default is 0 if not specified. - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - default: 20 - description: Maximum elements to retrieve. Default to 20 if not specified. - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: 'Type of the datapoint ("tp"/"tl")' - enum: - - tp - - tl - in: query - name: type - required: false - type: string - - description: Status of the datapoint - enum: - - deleted - - active - - paused - - spam - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tags - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Filter fields by favourite status - in: query - name: onlyFavorites - required: false - type: boolean - - description: Field to sort by - in: query - name: sortBy - required: false - type: string - - description: 'Direction of sort "asc" or "desc"' - enum: - - asc - - desc - in: query - name: sortDirection - required: false - type: string - - description: Exclude datapoints created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude datapoints created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: List of all the datapoints associated to the user in this group. - tags: - - Groups - post: - consumes: - - application/json - - text/json - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: The id of the group - format: int64 - in: path - name: id - required: true - type: integer - - description: The body of the datapoint - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Datapoints.Datapoint' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Create a datapoint in this group - tags: - - Groups - '/groups/{id}/datapoints/count': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the group - format: int64 - in: path - name: id - required: true - type: integer - - description: 'Type of the datapoint ("tp"/"tl")' - enum: - - tp - - tl - in: query - name: type - required: false - type: string - - description: Status of the datapoint - enum: - - deleted - - active - - paused - - spam - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tags - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Filter fields by favourite status - in: query - name: onlyFavorites - required: false - type: boolean - - description: Exclude datapoints created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude datapoints created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.CountResponce' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Count the datapoints associated to the user in this group. - tags: - - Groups - '/groups/{id}/favourite': - put: - consumes: [] - deprecated: false - parameters: - - description: Id of the group - format: int64 - in: path - name: id - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '403': - description: Forbidden - '404': - description: Not found - '500': - description: Internal Server Error - summary: 'Fast switch the "favourite" field of a group' - tags: - - Groups - '/groups/{id}/hits': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the group - format: int64 - in: path - name: id - required: true - type: integer - - description: Timeframe of the request. See list at $timeframeList - enum: - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - custom - in: query - name: timeframe - required: true - type: string - - description: Limit results to this number - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: "Offset where to start from (it's the lastKey field in the response object)" - in: query - name: offset - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'Filter event type ("spiders"/"uniques"/"nonuniques"/"conversions")' - enum: - - spiders - - uniques - - nonuniques - - conversions - in: query - name: filter - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitListPage' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve the list of events related to this group. - tags: - - Groups - '/groups/{id}/notes': - put: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of the group - format: int64 - in: path - name: id - required: true - type: integer - - description: Patch requests - in: body - name: note - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.GenericTextPatch' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '403': - description: Forbidden - '404': - description: Not found - '500': - description: Internal Server Error - summary: 'Fast patch the "notes" field of a group' - tags: - - Groups - '/groups/{id}/reports': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the group - format: int64 - in: path - name: id - required: true - type: integer - - description: Type of the report. - enum: - - browsers - - browsersfamilies - - platforms - - cities - - countries - - isps - - ips - - oss - - ossfamilies - - keywords - - referrers - - destinations - - languages - - params - in: query - name: type - required: true - type: string - - description: Timeframe of the request. See list at $timeframeList - enum: - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - beginning - - custom - in: query - name: timeframe - required: true - type: string - - description: Type of the event you want to filter this report with. By default no filter is applied. - enum: - - clicks - - views - in: query - name: hittype - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Tops.Top' - '401': - description: Forbidden - '404': - description: Not found - '500': - description: Internal Server Error - summary: Retrieve a top report connected to this group - tags: - - Groups - /hits: - get: - consumes: [] - deprecated: false - parameters: - - description: Timeframe of the request. See list at $timeframeList - enum: - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - custom - in: query - name: timeframe - required: true - type: string - - description: Limit results to this number - format: int32 - in: query - name: limit - required: false - type: integer - - description: "Offset where to start from (it's the lastKey field in the response object)" - in: query - name: offset - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - - description: 'Filter event type ("spiders"/"uniques"/"nonuniques"/"conversions")' - enum: - - spiders - - uniques - - nonuniques - - conversions - in: query - name: filter - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitListPage' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve the list of events related to this account. - tags: - - Hits - /me: - get: - consumes: [] - deprecated: false - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.User' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve current account data - tags: - - Me - /me/plan: - get: - consumes: [] - deprecated: false - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Accounting.Plan' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve current account plan - tags: - - Me - /reports: - get: - consumes: [] - deprecated: false - parameters: - - description: Type of the report. - enum: - - browsers - - browsersfamilies - - platforms - - cities - - countries - - isps - - ips - - oss - - ossfamilies - - keywords - - referrers - - destinations - - languages - - params - in: query - name: type - required: true - type: string - - description: Timeframe of the request. See list at $timeframeList - enum: - - yesterday - - last7 - - last30 - - lastmonth - - currentmonth - - previousmonth - - last90 - - last120 - - last180 - - beginning - - custom - in: query - name: timeframe - required: true - type: string - - description: Type of the event you want to filter this report with. By default no filter is applied. - in: query - name: hittype - required: false - type: string - - description: 'Filter by this group id (mutually exclusive with "datapoint" and "conversion")' - format: int64 - in: query - name: group - required: false - type: integer - - description: 'Filter by this datapoint id (mutually exclusive with "group" and "conversion")' - format: int64 - in: query - name: datapoint - required: false - type: integer - - description: 'Filter by this conversion id (mutually exclusive with "datapoint" and "group")' - format: int64 - in: query - name: conversion - required: false - type: integer - - description: 'If using a "custom" timeFrame you can specify the starting day (YYYYMMDD)' - in: query - name: fromDay - required: false - type: string - - description: 'If using a "custom" timeFrame you can specify the ending day (YYYYMMDD)' - in: query - name: toDay - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Tops.Top' - '401': - description: Forbidden - '404': - description: Not found - '500': - description: Internal Server Error - summary: Retrieve a top report - tags: - - Reports - /retargeting: - get: - consumes: [] - deprecated: false - parameters: - - default: 0 - description: Where to start when retrieving elements. Default is 0 if not specified. - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - default: 20 - description: Maximum elements to retrieve. Default to 20 if not specified. - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: List of all the retargeting scripts associated to the user - tags: - - Retargeting - post: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: The body of the retargeting script - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Retargeting.RetargetingScript' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Creates a retargeting script - tags: - - Retargeting - /retargeting/count: - get: - consumes: [] - deprecated: false - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.CountResponce' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve count of retargeting scripts - tags: - - Retargeting - '/retargeting/{id}': - delete: - consumes: [] - deprecated: false - parameters: - - description: The id of the retargeting script - format: int64 - in: path - name: id - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Deletes a retargeting script (and remove associations) - tags: - - Retargeting - get: - consumes: [] - deprecated: false - parameters: - - description: The id of the retargeting script - format: int64 - in: path - name: id - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Retargeting.RetargetingScript' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Get a retargeting script object - tags: - - Retargeting - post: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: The id of the retargeting script - format: int64 - in: path - name: id - required: true - type: integer - - description: The body of the retargeting script - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Retargeting.RetargetingScript' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Updates a retargeting script - tags: - - Retargeting - '/retargeting/{id}/datapoints': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the retargeting script - format: int64 - in: path - name: id - required: true - type: integer - - default: 0 - description: Where to start when retrieving elements. Default is 0 if not specified. - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - default: 20 - description: Maximum elements to retrieve. Default to 20 if not specified. - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: Status of the datapoint - enum: - - deleted - - active - - paused - - spam - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tags - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Filter fields by favourite status - in: query - name: onlyFavorites - required: false - type: boolean - - description: Field to sort by - in: query - name: sortBy - required: false - type: string - - description: 'Direction of sort "asc" or "desc"' - enum: - - asc - - desc - in: query - name: sortDirection - required: false - type: string - - description: Exclude datapoints created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude datapoints created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: List of all the datapoints associated to the retargeting script. - tags: - - Retargeting - '/retargeting/{id}/datapoints/count': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the group - format: int64 - in: path - name: id - required: true - type: integer - - description: Status of the datapoint - enum: - - deleted - - active - - paused - - spam - in: query - name: status - required: false - type: string - - description: A comma separated list of tags you want to filter with. - in: query - name: tags - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Filter fields by favourite status - in: query - name: onlyFavorites - required: false - type: boolean - - description: Exclude datapoints created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude datapoints created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.CountResponce' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Count the datapoints associated to the retargeting script. - tags: - - Retargeting - /tags: - get: - consumes: [] - deprecated: false - parameters: - - default: 0 - description: Where to start when retrieving elements. Default is 0 if not specified. - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - default: 20 - description: Maximum elements to retrieve. Default to 20 if not specified. - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: Name of the tag - in: query - name: name - required: false - type: string - - description: Comma separated list of datapoints id to filter by - in: query - name: datapoints - required: false - type: string - - description: Comma separated list of groups id to filter by - in: query - name: groups - required: false - type: string - - description: Type of entity related to the tag - enum: - - tp - - tl - - dp - - gr - in: query - name: type - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: List of all the groups associated to the user filtered by this tag. - tags: - - Tags - post: - consumes: - - application/json - - text/json - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: The body of the tag - in: body - name: value - required: true - schema: - $ref: '#/definitions/Api.Core.Dto.Tags.Tag' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Create a tag - tags: - - Tags - /tags/count: - get: - consumes: [] - deprecated: false - parameters: - - description: Name of the tag - in: query - name: name - required: false - type: string - - description: Comma separated list of datapoints id to filter by - in: query - name: datapoints - required: false - type: string - - description: Comma separated list of groups id to filter by - in: query - name: groups - required: false - type: string - - description: Type of entity related to the tag - enum: - - tp - - tl - - dp - - gr - in: query - name: type - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/System.Object' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: List of all the groups associated to the user filtered by this tag. - tags: - - Tags - '/tags/{tagId}': - delete: - consumes: [] - deprecated: false - parameters: - - description: Id of the tag - format: int64 - in: path - name: tagId - required: true - type: integer - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/System.Object' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Delete a tag - tags: - - Tags - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the tag - format: int64 - in: path - name: tagId - required: true - type: integer - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Dto.Tags.Tag' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Retrieve a tag - tags: - - Tags - '/tags/{tagId}/datapoints': - delete: - consumes: [] - deprecated: false - parameters: - - description: Id of the tag - format: int64 - in: path - name: tagId - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Delete the association of this tag with all datapoints - tags: - - Tags - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the tag. - format: int64 - in: path - name: tagId - required: true - type: integer - - default: 0 - description: Where to start when retrieving elements. Default is 0 if not specified. - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - default: 20 - description: Maximum elements to retrieve. Default to 20 if not specified. - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: 'Type of the datapoint ("tp"/"tl")' - enum: - - tp - - tl - in: query - name: type - required: false - type: string - - description: Status of the datapoint - enum: - - deleted - - active - - paused - - spam - in: query - name: status - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Exclude datapoints created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude datapoints created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: List of all the datapoints associated to the user filtered by this tag - tags: - - Tags - '/tags/{tagId}/datapoints/count': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the tag. - format: int64 - in: path - name: tagId - required: true - type: integer - - description: 'Type of the datapoint ("tp"/"tl")' - enum: - - tp - - tl - in: query - name: type - required: false - type: string - - description: Status of the datapoint - enum: - - deleted - - active - - paused - - spam - in: query - name: status - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Exclude datapoints created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude datapoints created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.CountResponce' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Count the datapoints associated to the user filtered by this tag - tags: - - Tags - '/tags/{tagId}/datapoints/patch': - put: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of the tag - format: int64 - in: path - name: tagId - required: true - type: integer - - description: The body patch - in: body - name: data - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.PatchBody' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Associate/Deassociate a tag with a datapoint - tags: - - Tags - '/tags/{tagId}/groups': - delete: - consumes: [] - deprecated: false - parameters: - - description: Id of the tag - format: int64 - in: path - name: tagId - required: true - type: integer - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Delete the association of this tag with all groups - tags: - - Tags - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the tag. - format: int64 - in: path - name: tagId - required: true - type: integer - - default: 0 - description: Where to start when retrieving elements. Default is 0 if not specified. - format: int32 - in: query - minLength: 0 - name: offset - required: false - type: integer - - default: 20 - description: Maximum elements to retrieve. Default to 20 if not specified. - format: int32 - in: query - maxLength: 0 - minLength: 0 - name: limit - required: false - type: integer - - description: Status of the datapoint - enum: - - deleted - - active - in: query - name: status - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Exclude groups created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude groups created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: List of all the groups associated to the user filtered by this tag. - tags: - - Tags - '/tags/{tagId}/groups/count': - get: - consumes: [] - deprecated: false - parameters: - - description: Id of the tag. - format: int64 - in: path - name: tagId - required: true - type: integer - - description: Status of the datapoint - enum: - - deleted - - active - in: query - name: status - required: false - type: string - - description: Filter fields by this pattern - in: query - name: textSearch - required: false - type: string - - description: Exclude groups created before this date (YYYYMMDD) - in: query - name: createdAfter - required: false - type: string - - description: Exclude groups created after this date (YYYYMMDD) - in: query - name: createdBefore - required: false - type: string - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.CountResponce' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Count the groups associated to the user filtered by this tag - tags: - - Tags - '/tags/{tagId}/groups/patch': - put: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of the tag - format: int64 - in: path - name: tagId - required: true - type: integer - - description: The body patch - in: body - name: data - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.PatchBody' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '404': - description: Not found - '500': - description: Internal Server Error - summary: Associate/Deassociate a tag with a group - tags: - - Tags - '/tags/{tagId}/name': - put: - consumes: - - application/json - - text/json - - application/xml - - text/xml - - application/x-www-form-urlencoded - deprecated: false - parameters: - - description: Id of the tag - format: int64 - in: path - name: tagId - required: true - type: integer - - description: The body patch - in: body - name: data - required: true - schema: - $ref: '#/definitions/Api.Core.Requests.GenericTextPatch' - produces: - - application/json - - text/json - - application/xml - - text/xml - responses: - '200': - description: '' - schema: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - '401': - description: Unauthorized - '500': - description: Internal Server Error - summary: Fast patch a tag name - tags: - - Tags -definitions: - Api.Core.Dto.Accounting.ConversionOptions: - properties: - hideComCost: - type: boolean - hideCost: - type: boolean - hideCount: - type: boolean - hideParams: - type: boolean - hideValue: - type: boolean - percentCommission: - format: int32 - type: integer - percentValue: - format: int32 - type: integer - type: object - Api.Core.Dto.Accounting.DomainWhitelistEntry: - properties: - id: - type: string - name: - type: string - type: object - Api.Core.Dto.Accounting.ExtendedGrants: - properties: - allowAllGrants: - type: boolean - allowGroupCreation: - type: boolean - type: object - Api.Core.Dto.Accounting.Guest: - properties: - apiKey: - type: string - conversionOptions: - $ref: '#/definitions/Api.Core.Dto.Accounting.ConversionOptions' - creationDate: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - currentGrant: - $ref: '#/definitions/Api.Core.Dto.Grants.Grant' - dateFormat: - type: string - decimalSeparator: - type: string - email: - type: string - extendedGrants: - $ref: '#/definitions/Api.Core.Dto.Accounting.ExtendedGrants' - groupGrants: - format: int64 - type: integer - hitOptions: - $ref: '#/definitions/Api.Core.Dto.Accounting.HitOptions' - id: - format: int64 - type: integer - key: - type: string - language: - type: string - loginCount: - format: int32 - type: integer - name: - type: string - notes: - type: string - numberGroupSeparator: - type: string - password: - type: string - timeFormat: - enum: - - AmPm - - H24 - type: string - timeZone: - format: int32 - type: integer - timeframeMinDate: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - timezonename: - type: string - tlGrants: - format: int64 - type: integer - tpGrants: - format: int64 - type: integer - userName: - type: string - type: object - Api.Core.Dto.Accounting.HitOptions: - properties: - hideReferrer: - type: boolean - type: object - Api.Core.Dto.Accounting.IpBlacklistEntry: - properties: - id: - type: string - ip: - type: string - type: object - Api.Core.Dto.Accounting.Plan: - properties: - allowedPersonalDomains: - format: int32 - type: integer - allowedPersonalUrls: - format: int32 - type: integer - billingPeriodEnd: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - billingPeriodStart: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - bonusMonthlyEvents: - format: int64 - type: integer - maximumDatapoints: - format: int64 - type: integer - maximumGuests: - format: int64 - type: integer - monthlyEvents: - format: int64 - type: integer - name: - type: string - price: - format: double - type: number - profileId: - format: int64 - type: integer - recurring: - type: boolean - recurringPeriod: - format: int32 - type: integer - usedDatapoints: - format: int64 - type: integer - usedMonthlyEvents: - format: int64 - type: integer - type: object - Api.Core.Dto.Accounting.User: - properties: - boGoVal: - type: string - bonusClicks: - format: int64 - type: integer - companyName: - type: string - companyRole: - type: string - email: - type: string - firstName: - type: string - lastName: - type: string - phone: - type: string - redirectOnly: - type: boolean - registrationDate: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - timeframeMinDate: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - timezone: - format: int32 - type: integer - timezonename: - type: string - type: object - Api.Core.Dto.Aggregated.AggregatedResult: - properties: - activityDay: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - commissionsCost: - format: double - type: number - conversionsCost: - format: double - type: number - conversionsValue: - format: double - type: number - convertedClicks: - format: int64 - type: integer - entityData: - $ref: '#/definitions/System.Object' - entityId: - type: string - fromDay: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - hourlyBreakDown: - additionalProperties: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' - type: object - lastHitDate: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - spiderHitsCount: - format: int64 - type: integer - toDay: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - totalClicks: - format: int64 - type: integer - totalViews: - format: int64 - type: integer - uniqueClicks: - format: int64 - type: integer - uniqueConversions: - format: int64 - type: integer - uniqueViews: - format: int64 - type: integer - type: object - Api.Core.Dto.Aggregated.AggregatedSummaryResult: - properties: - count: - format: int64 - type: integer - limit: - format: int32 - type: integer - offset: - format: int64 - type: integer - result: - items: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' - type: array - type: object - Api.Core.Dto.ClickStream.Hit: - properties: - accessTime: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - browser: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitBrowserInfo' - clientLanguage: - type: string - conversion1: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo' - conversion2: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo' - conversion3: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo' - conversion4: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo' - conversion5: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo' - conversions: - items: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitConversionInfo' - type: array - entity: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitDatapointInfo' - ip: - type: string - isProxy: - type: string - isSpider: - type: string - isUnique: - type: string - location: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitLocationInfo' - org: - type: string - os: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitOsInfo' - queryParams: - type: string - realDestinationUrl: - type: string - referer: - type: string - source: - $ref: '#/definitions/Api.Core.Dto.ClickStream.HitSource' - type: - type: string - type: object - Api.Core.Dto.ClickStream.HitBrowserInfo: - properties: - browserType: - type: string - familyId: - format: int64 - type: integer - familyName: - type: string - id: - format: int64 - type: integer - name: - type: string - type: object - Api.Core.Dto.ClickStream.HitConversionInfo: - properties: - accessTime: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - comcost: - format: double - type: number - cost: - format: double - type: number - date: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - deleted: - type: boolean - id: - format: int64 - type: integer - name: - type: string - parameter: - type: string - value: - format: double - type: number - type: object - Api.Core.Dto.ClickStream.HitDatapointInfo: - properties: - creationDate: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - datapointFavourite: - type: boolean - datapointId: - format: int64 - type: integer - datapointName: - type: string - datapointTitle: - type: string - datapointType: - type: string - destinationUrl: - type: string - groupId: - format: int64 - type: integer - groupName: - type: string - isABTest: - type: boolean - isPrivateShared: - type: boolean - isPublic: - type: boolean - notes: - type: string - status: - enum: - - Active - - Paused - - Abuse - - Deleted - type: string - tags: - items: - $ref: '#/definitions/Api.Core.Dto.Tags.Tag' - type: array - trackingCode: - type: string - type: object - Api.Core.Dto.ClickStream.HitListPage: - properties: - hits: - items: - $ref: '#/definitions/Api.Core.Dto.ClickStream.Hit' - type: array - lastKey: - type: string - type: object - Api.Core.Dto.ClickStream.HitLocationInfo: - properties: - areacode: - type: string - city: - type: string - country: - type: string - latitude: - format: double - type: number - longitude: - format: double - type: number - metrocode: - type: string - organization: - type: string - postalcode: - type: string - region: - type: string - regionName: - type: string - type: object - Api.Core.Dto.ClickStream.HitOsInfo: - properties: - familyId: - format: int64 - type: integer - familyName: - type: string - id: - format: int64 - type: integer - name: - type: string - type: object - Api.Core.Dto.ClickStream.HitSource: - properties: - id: - format: int64 - type: integer - name: - type: string - param: - type: string - type: object - Api.Core.Dto.Conversions.Conversion: - properties: - code: - type: string - creationDate: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - deleted: - type: boolean - description: - type: string - id: - format: int64 - type: integer - name: - type: string - protocol: - enum: - - Http - - Https - type: string - value: - format: double - type: number - type: object - Api.Core.Dto.Datapoints.BrowserBaseDestinationItem: - properties: - emailDestinationUrl: - type: string - mobileDestinationUrl: - type: string - spidersDestinationUrl: - type: string - type: object - Api.Core.Dto.Datapoints.Datapoint: - properties: - creationDate: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - encodeIp: - type: boolean - fifthConversionId: - format: int64 - type: integer - fifthConversionName: - type: string - firstConversionId: - format: int64 - type: integer - firstConversionName: - type: string - fourthConversionId: - format: int64 - type: integer - fourthConversionName: - type: string - groupId: - format: int64 - type: integer - groupName: - type: string - id: - format: int64 - type: integer - isPublic: - type: boolean - isSecured: - type: boolean - lightTracking: - type: boolean - name: - type: string - notes: - type: string - preferred: - type: boolean - redirectOnly: - type: boolean - secondConversionId: - format: int64 - type: integer - secondConversionName: - type: string - status: - enum: - - Active - - Paused - - Abuse - - Deleted - type: string - tags: - items: - $ref: '#/definitions/Api.Core.Dto.Tags.Tag' - type: array - thirdConversionId: - format: int64 - type: integer - thirdConversionName: - type: string - title: - type: string - trackingCode: - type: string - type: - enum: - - TrackingLink - - TrackingPixel - type: string - typeTL: - $ref: '#/definitions/Api.Core.Dto.Datapoints.TrackingLinkSpecifics' - typeTP: - $ref: '#/definitions/Api.Core.Dto.Datapoints.TrackingPixelSpecifics' - writePermited: - type: boolean - type: object - Api.Core.Dto.Datapoints.DatapointRetargetingInfo: - properties: - id: - format: int64 - type: integer - name: - type: string - type: object - Api.Core.Dto.Datapoints.MultipleDestinationItem: - properties: - url: - type: string - type: object - Api.Core.Dto.Datapoints.TrackingLinkSpecifics: - properties: - appendQuery: - type: boolean - browserDestinationItem: - $ref: '#/definitions/Api.Core.Dto.Datapoints.BrowserBaseDestinationItem' - destinationMode: - enum: - - Simple - - RandomDestination - - DestinationByLanguage - - SpilloverDestination - - DynamicUrl - - BrowserDestination - - DestinationByNation - - UniqueDestination - - SequentialDestination - - WeightedDestination - type: string - domainId: - format: int32 - type: integer - encodeUrl: - type: boolean - expirationClicks: - format: int64 - type: integer - expirationDate: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - firstUrl: - type: string - goDomainId: - format: int32 - type: integer - hideUrl: - type: boolean - hideUrlTitle: - type: string - isABTest: - type: boolean - password: - type: string - pauseAfterClicksExpiration: - type: boolean - pauseAfterDateExpiration: - type: boolean - randomDestinationItems: - items: - $ref: '#/definitions/Api.Core.Dto.Datapoints.MultipleDestinationItem' - type: array - redirectType: - enum: - - PermanentRedirect - - TemporaryRedirect - type: string - referrerClean: - enum: - - None - - Clean - - Myself - type: string - scripts: - items: - $ref: '#/definitions/Api.Core.Dto.Datapoints.DatapointRetargetingInfo' - type: array - sequentialDestinationItems: - items: - $ref: '#/definitions/Api.Core.Dto.Datapoints.MultipleDestinationItem' - type: array - spilloverDestinationItems: - items: - $ref: '#/definitions/Api.Core.Dto.Datapoints.MultipleDestinationItem' - type: array - uniqueDestinationItem: - $ref: '#/definitions/Api.Core.Dto.Datapoints.UniqueDestinationItem' - url: - type: string - urlAfterClicksExpiration: - type: string - urlAfterDateExpiration: - type: string - urlsByLanguage: - items: - $ref: '#/definitions/Api.Core.Dto.Datapoints.UrlByLanguageItem' - type: array - urlsByNation: - items: - $ref: '#/definitions/Api.Core.Dto.Datapoints.UrlByNationItem' - type: array - weightedDestinationItems: - items: - $ref: '#/definitions/Api.Core.Dto.Datapoints.WeightedDestinationItem' - type: array - type: object - Api.Core.Dto.Datapoints.TrackingPixelSpecifics: - properties: - parameterNote: - type: string - type: object - Api.Core.Dto.Datapoints.UniqueDestinationItem: - properties: - firstDestinationUrl: - type: string - type: object - Api.Core.Dto.Datapoints.UrlByLanguageItem: - properties: - languageCode: - type: string - url: - type: string - type: object - Api.Core.Dto.Datapoints.UrlByNationItem: - properties: - nation: - type: string - url: - type: string - type: object - Api.Core.Dto.Datapoints.WeightedDestinationItem: - properties: - url: - type: string - weight: - format: int32 - type: integer - type: object - Api.Core.Dto.Domains.Domain: - properties: - custom404: - type: string - customHomepage: - type: string - id: - format: int64 - type: integer - name: - type: string - type: - enum: - - System - - Go - - Dedicated - - Personal - type: string - type: object - Api.Core.Dto.EntityUriLong: - properties: - id: - format: int64 - type: integer - uri: - type: string - type: object - Api.Core.Dto.Grants.Grant: - properties: - DatapointType: - type: string - Entity: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - EntityName: - type: string - EntityType: - type: string - Type: - type: string - type: object - Api.Core.Dto.Groups.Group: - properties: - creationDate: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - deleted: - type: boolean - id: - format: int64 - type: integer - isPublic: - type: boolean - name: - type: string - notes: - type: string - preferred: - type: boolean - redirectOnly: - type: boolean - tags: - items: - $ref: '#/definitions/Api.Core.Dto.Tags.Tag' - type: array - writePermited: - type: boolean - type: object - Api.Core.Dto.Retargeting.RetargetingScript: - properties: - id: - format: int64 - type: integer - name: - type: string - script: - type: string - type: object - Api.Core.Dto.Tags.Tag: - properties: - datapoints: - items: - format: int64 - type: integer - type: array - groups: - items: - format: int64 - type: integer - type: array - id: - format: int64 - type: integer - name: - type: string - type: object - Api.Core.Dto.Tops.Top: - properties: - createdAt: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - data: - items: - $ref: '#/definitions/Api.Core.Dto.Tops.TopItem' - type: array - key: - type: string - type: object - Api.Core.Dto.Tops.TopItem: - properties: - entityData: - $ref: '#/definitions/System.Object' - id: - type: string - lastHitDate: - description: ' (A date in "YmdHis" format)' - example: '20120203120530' - type: string - spiderClicks: - format: int64 - type: integer - spiderHits: - format: int64 - type: integer - spiderViews: - format: int64 - type: integer - totalClicks: - format: int64 - type: integer - totalCommissionsCost: - format: double - type: number - totalConversions: - format: int64 - type: integer - totalConversionsCost: - format: double - type: number - totalConversionsValue: - format: double - type: number - totalHits: - format: int64 - type: integer - totalViews: - format: int64 - type: integer - uniqueClicks: - format: int64 - type: integer - uniqueHits: - format: int64 - type: integer - uniqueViews: - format: int64 - type: integer - type: object - Api.Core.Requests.ConversionPatchBody: - properties: - Action: - type: string - Id: - format: int64 - type: integer - ReplaceId: - format: int64 - type: integer - type: object - Api.Core.Requests.DatapointsBatch: - properties: - List: - items: - $ref: '#/definitions/Api.Core.Dto.Datapoints.Datapoint' - type: array - type: object - Api.Core.Requests.DeleteBatch: - properties: - Entities: - items: - $ref: '#/definitions/Api.Core.Dto.EntityUriLong' - type: array - type: object - Api.Core.Requests.GenericTextPatch: - properties: - Text: - type: string - type: object - Api.Core.Requests.PatchBody: - properties: - Action: - type: string - Id: - format: int64 - type: integer - type: object - Api.Core.Requests.PatchBodyBatch: - properties: - PatchRequests: - items: - $ref: '#/definitions/Api.Core.Requests.PatchBody' - type: array - type: object - Api.Core.Requests.PermissionPatchRequest: - properties: - Action: - type: string - Id: - format: int64 - type: integer - Verb: - type: string - type: object - Api.Core.Responses.CountResponce: - properties: - count: - format: int64 - type: integer - type: object - 'Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.DomainWhitelistEntry]': - properties: - entities: - items: - $ref: '#/definitions/Api.Core.Dto.Accounting.DomainWhitelistEntry' - type: array - type: object - 'Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Accounting.IpBlacklistEntry]': - properties: - entities: - items: - $ref: '#/definitions/Api.Core.Dto.Accounting.IpBlacklistEntry' - type: array - type: object - 'Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Aggregated.AggregatedResult]': - properties: - entities: - items: - $ref: '#/definitions/Api.Core.Dto.Aggregated.AggregatedResult' - type: array - type: object - 'Api.Core.Responses.EntitiesResponse[Api.Core.Dto.ClickStream.Hit]': - properties: - entities: - items: - $ref: '#/definitions/Api.Core.Dto.ClickStream.Hit' - type: array - type: object - 'Api.Core.Responses.EntitiesResponse[Api.Core.Dto.Grants.Grant]': - properties: - entities: - items: - $ref: '#/definitions/Api.Core.Dto.Grants.Grant' - type: array - type: object - 'Api.Core.Responses.EntitiesResponse[Api.Core.Responses.EntityUri[System.Int64]]': - properties: - entities: - items: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - type: array - type: object - 'Api.Core.Responses.EntityUri[System.Int64]': - properties: - id: - format: int64 - type: integer - uri: - type: string - type: object - 'Api.Core.Responses.ModifyBatchItemResponce[Api.Core.Dto.Datapoints.Datapoint,System.Int64]': - properties: - entityData: - $ref: '#/definitions/Api.Core.Dto.Datapoints.Datapoint' - errors: - items: - $ref: '#/definitions/ClickMeter.Infrastructure.Validation.ValidationFailure' - type: array - result: - $ref: '#/definitions/Api.Core.Responses.EntityUri[System.Int64]' - status: - type: string - type: object - ClickMeter.Infrastructure.Validation.ValidationFailure: - properties: - code: - $ref: '#/definitions/System.Object' - errorMessage: - type: string - errorValue: - $ref: '#/definitions/System.Object' - property: - type: string - type: object - System.Object: - properties: {} - type: object diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/invalid-refs.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/invalid-refs.json deleted file mode 100644 index d636d45895..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/invalid-refs.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "version": "1.0.0", - "title": "Swagger Petstore", - "contact": { - "name": "wordnik api team", - "url": "http://developer.wordnik.com" - }, - "license": { - "name": "Creative Commons 4.0 International", - "url": "http://creativecommons.org/licenses/by/4.0/" - } - }, - "host": "petstore.swagger.wordnik.com", - "basePath": "/api", - "schemes": [ - "http" - ], - "paths": { - "/pets": { - "get": { - "tags": [ "Pet Operations" ], - "summary": "finds pets in the system", - "responses": { - "200": { - "description": "pet response", - "schema": { - "type": "array", - "items": { - "$ref": "NotCorrectRef" - } - }, - "headers": { - "x-expires": { - "type": "string" - } - } - }, - "default": { - "description": "unexpected error", - "schema": { - "$ref": "NotCorrectRef" - } - } - } - } - } - }, - "definitions": { - "Pet": { - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "tag": { - "type": "string" - } - } - }, - "Error": { - "required": [ - "code", - "message" - ], - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - } - } - } - } -} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/missingItemRef.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/missingItemRef.json deleted file mode 100644 index f3908d52f0..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/missingItemRef.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "version": "2.1.0", - "title": "Missing Item API" - }, - "host": "item.com", - "basePath": "/missing/ref", - "schemes": [ - "http" - ], - "paths": { - "/employees": { - "get": { - "operationId": "LIST-Employees", - "summary": "List Employee Types", - "responses": { - "200": { - "description": "", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/employees-output" - } - } - } - } - } - } - } -} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/missingRef.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/missingRef.json deleted file mode 100644 index d59794696a..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/missingRef.json +++ /dev/null @@ -1,165 +0,0 @@ -{ - "input": { - "swagger": "2.0", - "info": { - "version": "1.0", - "title": "Continue On Error" - }, - "paths": { - "/todos": { - "get": { - "responses": { - "200": { - "description": "List Todos", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/todo-full" - } - } - }, - "404": { - "$ref": "#/responses/404" - } - } - } - } - }, - "definitions": { - "todo-partial": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "completed": { - "type": "boolean" - } - } - }, - "todo-full": { - "allOf": [ - { - "$ref": "#/definitions/todo-partial" - }, - { - "type": "object", - "properties": { - "id": { - "type": "integer" - }, - "completed_at": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "updated_at": { - "type": "string" - } - } - } - ] - } - } - }, - "expected": { - "swagger": "2.0", - "info": { - "title": "Continue On Error", - "version": "1.0" - }, - "paths": { - "/todos": { - "get": { - "responses": { - "200": { - "description": "List Todos", - "schema": { - "type": "array", - "items": { - "allOf": [ - { - "type": "object", - "properties": { - "completed": { - "type": "boolean" - }, - "name": { - "type": "string" - } - } - }, - { - "type": "object", - "properties": { - "completed_at": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "updated_at": { - "type": "string" - } - } - } - ] - } - } - }, - "404": {} - } - } - } - }, - "definitions": { - "todo-full": { - "allOf": [ - { - "type": "object", - "properties": { - "completed": { - "type": "boolean" - }, - "name": { - "type": "string" - } - } - }, - { - "type": "object", - "properties": { - "completed_at": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "updated_at": { - "type": "string" - } - } - } - ] - }, - "todo-partial": { - "type": "object", - "properties": { - "completed": { - "type": "boolean" - }, - "name": { - "type": "string" - } - } - } - } - } -} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/overflow.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/overflow.json deleted file mode 100644 index 5a2a9f3dd0..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/overflow.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "Swagger Sample", - "description": "Sample API Playground.", - "version": "1.0.0" - }, - "basePath": "/v1", - "schemes": [ - "http" - ], - "consumes": [ - "application/vdn.sample.v1+json" - ], - "produces": [ - "application/vdn.sample.v1+json" - ], - "paths": { - "/books": { - "get": { - "summary": "List all books", - "operationId": "listBooks", - "tags": [ - "books" - ], - "responses": { - "200": { - "headers": { - "Link": { - "type": "string" - } - }, - "description": "An array of books", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Book" - } - } - }, - "default": { - "description": "generic error response", - "schema": { - "$ref": "#/definitions/Error" - } - } - } - } - } - }, - "definitions": { - "Store": { - "type": "object", - "properties": { - "title": { - "type": "string", - "example": "Book Shop" - }, - "categories": { - "type": "array", - "items": { - "$ref": "#/definitions/Category" - } - } - } - }, - "Category": { - "type": "object", - "properties": { - "title": { - "type": "string", - "example": "Drama" - }, - "books": { - "type": "array", - "items": { - "$ref": "#/definitions/Book" - } - } - } - }, - "Book": { - "type": "object", - "required": [ - "title", - "summary" - ], - "properties": { - "title": { - "type": "string", - "example": "Winnie the Pooh" - }, - "summary": { - "type": "string", - "example": "Famous children's book" - }, - "related_books": { - "type": "array", - "items": { - "$ref": "#/definitions/Book" - } - } - } - }, - "Error": { - "type": "object", - "readOnly": true, - "properties": { - "code": { - "type": "integer", - "format": "int64", - "example": 400 - }, - "message": { - "type": "string", - "example": "Unexpected error" - } - }, - "required": [ - "message" - ] - } - } -} diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/params.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/params.json deleted file mode 100644 index 76e7b418e3..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/params.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "parameters": { - "id": { - "type": "integer", - "format": "int64", - "in": "path", - "required": true - }, - "tag": { - "type": "string", - "in": "query", - "required": false - }, - "query": { - "$ref": "#/parameters/tag" - } - }, - "paths": { - "/cars/{id}": { - "parameters": [ - { "$ref": "#/parameters/id"} - ] - } - } -} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/schemas1.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/schemas1.json deleted file mode 100644 index e53a412ef0..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/schemas1.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "definitions": { - "car": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "make": { - "type": "string" - }, - "brand": { - "$ref": "#/definitions/brand" - } - } - }, - "tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "value": { - "type": "string" - } - } - }, - "brand": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - } - }, - "truck": { - "$ref": "#/definitions/car" - }, - "batch": { - "items": { - "$ref": "#/definitions/brand" - } - }, - "batch2": { - "items": [ - { - "$ref": "#/definitions/brand" - }, - { - "$ref": "#/definitions/tag" - } - ] - }, - "allofBoth": { - "allOf": [ - { - "$ref": "#/definitions/brand" - }, - { - "$ref": "#/definitions/tag" - } - ] - }, - "anyofBoth": { - "anyOf": [ - { - "$ref": "#/definitions/brand" - }, - { - "$ref": "#/definitions/tag" - } - ] - }, - "oneofBoth": { - "oneOf": [ - { - "$ref": "#/definitions/brand" - }, - { - "$ref": "#/definitions/tag" - } - ] - }, - "notSomething": { - "not": { - "$ref": "#/definitions/tag" - } - }, - "withAdditional": { - "additionalProperties": { - "$ref": "#/definitions/tag" - } - }, - "withPattern": { - "patternProperties": { - "^x-ab": { - "$ref": "#/definitions/tag" - } - } - }, - "withAdditionalItems": { - "additionalItems": { - "$ref": "#/definitions/tag" - } - }, - "deps": { - "dependencies": { - "something": { - "$ref": "#/definitions/tag" - } - } - }, - "defined": { - "definitions": { - "something": { - "$ref": "#/definitions/tag" - } - } - } - } -} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/expansion/schemas2.json b/vendor/github.com/go-openapi/spec/fixtures/expansion/schemas2.json deleted file mode 100644 index fe885fd98a..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/expansion/schemas2.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "definitions": { - "car": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "make": { - "type": "string" - }, - "brand": { - "items": { - "$ref": "#/definitions/brand" - } - } - } - }, - "tag": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "value": { - "type": "string" - } - } - }, - "brand": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - } - }, - "truck": { - "items": { - "$ref": "#/definitions/car" - } - }, - "batch": { - "items": { - "items": { - "$ref": "#/definitions/brand" - } - } - }, - "batch2": { - "items": [ - { - "items": { - "$ref": "#/definitions/brand" - } - }, - { - "items": { - "$ref": "#/definitions/tag" - } - } - ] - }, - "allofBoth": { - "allOf": [ - { - "items": { - "$ref": "#/definitions/brand" - } - }, - { - "items": { - "$ref": "#/definitions/tag" - } - } - ] - }, - "anyofBoth": { - "anyOf": [ - { - "items": { - "$ref": "#/definitions/brand" - } - }, - { - "items": { - "$ref": "#/definitions/tag" - } - } - ] - }, - "oneofBoth": { - "oneOf": [ - { - "items": { - "$ref": "#/definitions/brand" - } - }, - { - "items": { - "$ref": "#/definitions/tag" - } - } - ] - }, - "notSomething": { - "not": { - "items": { - "$ref": "#/definitions/tag" - } - } - }, - "withAdditional": { - "additionalProperties": { - "items": { - "$ref": "#/definitions/tag" - } - } - }, - "withPattern": { - "patternProperties": { - "^x-ab": { - "items": { - "$ref": "#/definitions/tag" - } - } - } - }, - "withAdditionalItems": { - "additionalItems": { - "items": { - "$ref": "#/definitions/tag" - } - } - }, - "deps": { - "dependencies": { - "something": { - "items": { - "$ref": "#/definitions/tag" - } - } - } - }, - "defined": { - "definitions": { - "something": { - "items": { - "$ref": "#/definitions/tag" - } - } - } - } - } -} diff --git a/vendor/github.com/go-openapi/spec/fixtures/local_expansion/item.json b/vendor/github.com/go-openapi/spec/fixtures/local_expansion/item.json deleted file mode 100644 index f042fdd7a8..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/local_expansion/item.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "properties": { - "id": { - "format": "int64", - "readOnly": true, - "type": "integer" - }, - "title": { - "maxLength": 80, - "minLength": 2, - "type": "string" - } - }, - "required": [ - "title" - ], - "type": "object" -} diff --git a/vendor/github.com/go-openapi/spec/fixtures/local_expansion/spec.json b/vendor/github.com/go-openapi/spec/fixtures/local_expansion/spec.json deleted file mode 100644 index 5c653bca8e..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/local_expansion/spec.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "basePath": "/v1", - "consumes": [ - "application/json" - ], - "host": "item.api.local", - "info": { - "description": "Item API", - "title": "Item API", - "version": "1.0.0" - }, - "paths": { - "/item": { - "get": { - "operationId": "GetItem", - "responses": { - "200": { - "description": "item detail response", - "schema": { - "$ref": "item.json" - } - } - } - } - } - }, - "produces": [ - "application/json" - ], - "schemes": [ - "http" - ], - "security": [ - { - "key": [] - } - ], - "securityDefinitions": { - "key": { - "in": "header", - "name": "x-item-token", - "type": "apiKey" - } - }, - "swagger": "2.0" -} diff --git a/vendor/github.com/go-openapi/spec/fixtures/specs/deeper/arrayProp.json b/vendor/github.com/go-openapi/spec/fixtures/specs/deeper/arrayProp.json deleted file mode 100644 index 8f8dbf6baa..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/specs/deeper/arrayProp.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type":"array", - "items": { - "type": "string" - } -} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/specs/deeper/stringProp.json b/vendor/github.com/go-openapi/spec/fixtures/specs/deeper/stringProp.json deleted file mode 100644 index 169a0d70f6..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/specs/deeper/stringProp.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "string" -} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/specs/refed.json b/vendor/github.com/go-openapi/spec/fixtures/specs/refed.json deleted file mode 100644 index 142be8bb96..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/specs/refed.json +++ /dev/null @@ -1,224 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "version": "1.0.0", - "title": "Swagger Petstore", - "description": "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", - "termsOfService": "http://helloreverb.com/terms/", - "contact": { - "name": "Wordnik API Team" - }, - "license": { - "name": "MIT" - } - }, - "host": "petstore.swagger.wordnik.com", - "basePath": "/api", - "schemes": [ - "http" - ], - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "parameters": { - "idParam": { - "name": "id", - "in": "path", - "description": "ID of pet to fetch", - "required": true, - "type": "integer", - "format": "int64" - } - }, - "responses": { - "petResponse": { - "description": "pet response", - "schema": { - "$ref": "#/definitions/pet" - } - } - }, - "paths": { - "/pets": { - "get": { - "description": "Returns all pets from the system that the user has access to", - "operationId": "findPets", - "produces": [ - "application/json", - "application/xml", - "text/xml", - "text/html" - ], - "parameters": [ - { - "name": "tags", - "in": "query", - "description": "tags to filter by", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "csv" - }, - { - "name": "limit", - "in": "query", - "description": "maximum number of results to return", - "required": false, - "type": "integer", - "format": "int32" - } - ], - "responses": { - "200": { - "description": "pet response", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/pet" - } - } - }, - "default": { - "description": "unexpected error", - "schema": { - "$ref": "#/definitions/errorModel" - } - } - } - }, - "post": { - "description": "Creates a new pet in the store. Duplicates are allowed", - "operationId": "addPet", - "produces": [ - "application/json" - ], - "parameters": [ - { - "name": "pet", - "in": "body", - "description": "Pet to add to the store", - "required": true, - "schema": { - "$ref": "#/definitions/petInput" - } - } - ], - "responses": { - "200": { "$ref": "#/responses/petResponse" }, - "default": { - "description": "unexpected error", - "schema": { - "$ref": "#/definitions/errorModel" - } - } - } - } - }, - "/pets/{id}": { - "get": { - "description": "Returns a user based on a single ID, if the user does not have access to the pet", - "operationId": "findPetById", - "produces": [ - "application/json", - "application/xml", - "text/xml", - "text/html" - ], - "parameters": [ - { - "$ref": "#/parameters/idParam" - } - ], - "responses": { - "200": { - "$ref": "#/responses/petResponse" - }, - "default": { - "description": "unexpected error", - "schema": { - "$ref": "#/definitions/errorModel" - } - } - } - }, - "delete": { - "description": "deletes a single pet based on the ID supplied", - "operationId": "deletePet", - "parameters": [ - { - "$ref": "#/parameters/idParam" - } - ], - "responses": { - "204": { - "description": "pet deleted" - }, - "default": { - "description": "unexpected error", - "schema": { - "$ref": "#/definitions/errorModel" - } - } - } - } - } - }, - "definitions": { - "pet": { - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "tag": { - "type": "string" - } - } - }, - "petInput": { - "allOf": [ - { - "$ref": "pet" - }, - { - "required": [ - "name" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64" - } - } - } - ] - }, - "errorModel": { - "required": [ - "code", - "message" - ], - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - } - } - } - } -} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/specs/resolution.json b/vendor/github.com/go-openapi/spec/fixtures/specs/resolution.json deleted file mode 100644 index 43cabe858d..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/specs/resolution.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "id": "http://localhost:1234", - "items": { - "id": "deeper/", - "items": { - "$ref": "stringProp.json" - } - }, - "definitions": { - "bool": { - "$ref": "boolProp.json" - } - } -} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/fixtures/specs/resolution2.json b/vendor/github.com/go-openapi/spec/fixtures/specs/resolution2.json deleted file mode 100644 index 5d7a00560d..0000000000 --- a/vendor/github.com/go-openapi/spec/fixtures/specs/resolution2.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "id": "http://localhost:1234", - "items": { - "id": "deeper/", - "items": { - "$ref": "arrayProp.json#/items" - } - } -} \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/header.go b/vendor/github.com/go-openapi/spec/header.go deleted file mode 100644 index 85c4d454c1..0000000000 --- a/vendor/github.com/go-openapi/spec/header.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "strings" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" -) - -type HeaderProps struct { - Description string `json:"description,omitempty"` -} - -// Header describes a header for a response of the API -// -// For more information: http://goo.gl/8us55a#headerObject -type Header struct { - CommonValidations - SimpleSchema - VendorExtensible - HeaderProps -} - -// ResponseHeader creates a new header instance for use in a response -func ResponseHeader() *Header { - return new(Header) -} - -// WithDescription sets the description on this response, allows for chaining -func (h *Header) WithDescription(description string) *Header { - h.Description = description - return h -} - -// Typed a fluent builder method for the type of parameter -func (h *Header) Typed(tpe, format string) *Header { - h.Type = tpe - h.Format = format - return h -} - -// CollectionOf a fluent builder method for an array item -func (h *Header) CollectionOf(items *Items, format string) *Header { - h.Type = "array" - h.Items = items - h.CollectionFormat = format - return h -} - -// WithDefault sets the default value on this item -func (h *Header) WithDefault(defaultValue interface{}) *Header { - h.Default = defaultValue - return h -} - -// WithMaxLength sets a max length value -func (h *Header) WithMaxLength(max int64) *Header { - h.MaxLength = &max - return h -} - -// WithMinLength sets a min length value -func (h *Header) WithMinLength(min int64) *Header { - h.MinLength = &min - return h -} - -// WithPattern sets a pattern value -func (h *Header) WithPattern(pattern string) *Header { - h.Pattern = pattern - return h -} - -// WithMultipleOf sets a multiple of value -func (h *Header) WithMultipleOf(number float64) *Header { - h.MultipleOf = &number - return h -} - -// WithMaximum sets a maximum number value -func (h *Header) WithMaximum(max float64, exclusive bool) *Header { - h.Maximum = &max - h.ExclusiveMaximum = exclusive - return h -} - -// WithMinimum sets a minimum number value -func (h *Header) WithMinimum(min float64, exclusive bool) *Header { - h.Minimum = &min - h.ExclusiveMinimum = exclusive - return h -} - -// WithEnum sets a the enum values (replace) -func (h *Header) WithEnum(values ...interface{}) *Header { - h.Enum = append([]interface{}{}, values...) - return h -} - -// WithMaxItems sets the max items -func (h *Header) WithMaxItems(size int64) *Header { - h.MaxItems = &size - return h -} - -// WithMinItems sets the min items -func (h *Header) WithMinItems(size int64) *Header { - h.MinItems = &size - return h -} - -// UniqueValues dictates that this array can only have unique items -func (h *Header) UniqueValues() *Header { - h.UniqueItems = true - return h -} - -// AllowDuplicates this array can have duplicates -func (h *Header) AllowDuplicates() *Header { - h.UniqueItems = false - return h -} - -// MarshalJSON marshal this to JSON -func (h Header) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(h.CommonValidations) - if err != nil { - return nil, err - } - b2, err := json.Marshal(h.SimpleSchema) - if err != nil { - return nil, err - } - b3, err := json.Marshal(h.HeaderProps) - if err != nil { - return nil, err - } - return swag.ConcatJSON(b1, b2, b3), nil -} - -// UnmarshalJSON marshal this from JSON -func (h *Header) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &h.CommonValidations); err != nil { - return err - } - if err := json.Unmarshal(data, &h.SimpleSchema); err != nil { - return err - } - if err := json.Unmarshal(data, &h.VendorExtensible); err != nil { - return err - } - if err := json.Unmarshal(data, &h.HeaderProps); err != nil { - return err - } - return nil -} - -// JSONLookup look up a value by the json property name -func (p Header) JSONLookup(token string) (interface{}, error) { - if ex, ok := p.Extensions[token]; ok { - return &ex, nil - } - - r, _, err := jsonpointer.GetForToken(p.CommonValidations, token) - if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { - return nil, err - } - if r != nil { - return r, nil - } - r, _, err = jsonpointer.GetForToken(p.SimpleSchema, token) - if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { - return nil, err - } - if r != nil { - return r, nil - } - r, _, err = jsonpointer.GetForToken(p.HeaderProps, token) - return r, err -} diff --git a/vendor/github.com/go-openapi/spec/header_test.go b/vendor/github.com/go-openapi/spec/header_test.go deleted file mode 100644 index a07d174fd4..0000000000 --- a/vendor/github.com/go-openapi/spec/header_test.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -func float64Ptr(f float64) *float64 { - return &f -} -func int64Ptr(f int64) *int64 { - return &f -} - -var header = Header{ - VendorExtensible: VendorExtensible{Extensions: map[string]interface{}{ - "x-framework": "swagger-go", - }}, - HeaderProps: HeaderProps{Description: "the description of this header"}, - SimpleSchema: SimpleSchema{ - Items: &Items{ - Refable: Refable{Ref: MustCreateRef("Cat")}, - }, - Type: "string", - Format: "date", - Default: "8", - }, - CommonValidations: CommonValidations{ - Maximum: float64Ptr(100), - ExclusiveMaximum: true, - ExclusiveMinimum: true, - Minimum: float64Ptr(5), - MaxLength: int64Ptr(100), - MinLength: int64Ptr(5), - Pattern: "\\w{1,5}\\w+", - MaxItems: int64Ptr(100), - MinItems: int64Ptr(5), - UniqueItems: true, - MultipleOf: float64Ptr(5), - Enum: []interface{}{"hello", "world"}, - }, -} - -var headerJSON = `{ - "items": { - "$ref": "Cat" - }, - "x-framework": "swagger-go", - "description": "the description of this header", - "maximum": 100, - "minimum": 5, - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "maxLength": 100, - "minLength": 5, - "pattern": "\\w{1,5}\\w+", - "maxItems": 100, - "minItems": 5, - "uniqueItems": true, - "multipleOf": 5, - "enum": ["hello", "world"], - "type": "string", - "format": "date", - "default": "8" -}` - -func TestIntegrationHeader(t *testing.T) { - var actual Header - if assert.NoError(t, json.Unmarshal([]byte(headerJSON), &actual)) { - assert.EqualValues(t, actual, header) - } - - assertParsesJSON(t, headerJSON, header) -} diff --git a/vendor/github.com/go-openapi/spec/info.go b/vendor/github.com/go-openapi/spec/info.go deleted file mode 100644 index fb8b7c4ac5..0000000000 --- a/vendor/github.com/go-openapi/spec/info.go +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "strings" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" -) - -// Extensions vendor specific extensions -type Extensions map[string]interface{} - -// Add adds a value to these extensions -func (e Extensions) Add(key string, value interface{}) { - realKey := strings.ToLower(key) - e[realKey] = value -} - -// GetString gets a string value from the extensions -func (e Extensions) GetString(key string) (string, bool) { - if v, ok := e[strings.ToLower(key)]; ok { - str, ok := v.(string) - return str, ok - } - return "", false -} - -// GetBool gets a string value from the extensions -func (e Extensions) GetBool(key string) (bool, bool) { - if v, ok := e[strings.ToLower(key)]; ok { - str, ok := v.(bool) - return str, ok - } - return false, false -} - -// GetStringSlice gets a string value from the extensions -func (e Extensions) GetStringSlice(key string) ([]string, bool) { - if v, ok := e[strings.ToLower(key)]; ok { - arr, ok := v.([]interface{}) - if !ok { - return nil, false - } - var strs []string - for _, iface := range arr { - str, ok := iface.(string) - if !ok { - return nil, false - } - strs = append(strs, str) - } - return strs, ok - } - return nil, false -} - -// VendorExtensible composition block. -type VendorExtensible struct { - Extensions Extensions -} - -// AddExtension adds an extension to this extensible object -func (v *VendorExtensible) AddExtension(key string, value interface{}) { - if value == nil { - return - } - if v.Extensions == nil { - v.Extensions = make(map[string]interface{}) - } - v.Extensions.Add(key, value) -} - -// MarshalJSON marshals the extensions to json -func (v VendorExtensible) MarshalJSON() ([]byte, error) { - toser := make(map[string]interface{}) - for k, v := range v.Extensions { - lk := strings.ToLower(k) - if strings.HasPrefix(lk, "x-") { - toser[k] = v - } - } - return json.Marshal(toser) -} - -// UnmarshalJSON for this extensible object -func (v *VendorExtensible) UnmarshalJSON(data []byte) error { - var d map[string]interface{} - if err := json.Unmarshal(data, &d); err != nil { - return err - } - for k, vv := range d { - lk := strings.ToLower(k) - if strings.HasPrefix(lk, "x-") { - if v.Extensions == nil { - v.Extensions = map[string]interface{}{} - } - v.Extensions[k] = vv - } - } - return nil -} - -// InfoProps the properties for an info definition -type InfoProps struct { - Description string `json:"description,omitempty"` - Title string `json:"title,omitempty"` - TermsOfService string `json:"termsOfService,omitempty"` - Contact *ContactInfo `json:"contact,omitempty"` - License *License `json:"license,omitempty"` - Version string `json:"version,omitempty"` -} - -// Info object provides metadata about the API. -// The metadata can be used by the clients if needed, and can be presented in the Swagger-UI for convenience. -// -// For more information: http://goo.gl/8us55a#infoObject -type Info struct { - VendorExtensible - InfoProps -} - -// JSONLookup look up a value by the json property name -func (i Info) JSONLookup(token string) (interface{}, error) { - if ex, ok := i.Extensions[token]; ok { - return &ex, nil - } - r, _, err := jsonpointer.GetForToken(i.InfoProps, token) - return r, err -} - -// MarshalJSON marshal this to JSON -func (i Info) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(i.InfoProps) - if err != nil { - return nil, err - } - b2, err := json.Marshal(i.VendorExtensible) - if err != nil { - return nil, err - } - return swag.ConcatJSON(b1, b2), nil -} - -// UnmarshalJSON marshal this from JSON -func (i *Info) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &i.InfoProps); err != nil { - return err - } - if err := json.Unmarshal(data, &i.VendorExtensible); err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/go-openapi/spec/info_test.go b/vendor/github.com/go-openapi/spec/info_test.go deleted file mode 100644 index fc40c16303..0000000000 --- a/vendor/github.com/go-openapi/spec/info_test.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -var infoJSON = `{ - "description": "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", - "title": "Swagger Sample API", - "termsOfService": "http://helloreverb.com/terms/", - "contact": { - "name": "wordnik api team", - "url": "http://developer.wordnik.com" - }, - "license": { - "name": "Creative Commons 4.0 International", - "url": "http://creativecommons.org/licenses/by/4.0/" - }, - "version": "1.0.9-abcd", - "x-framework": "go-swagger" -}` - -var info = Info{ - InfoProps: InfoProps{ - Version: "1.0.9-abcd", - Title: "Swagger Sample API", - Description: "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", - TermsOfService: "http://helloreverb.com/terms/", - Contact: &ContactInfo{Name: "wordnik api team", URL: "http://developer.wordnik.com"}, - License: &License{Name: "Creative Commons 4.0 International", URL: "http://creativecommons.org/licenses/by/4.0/"}, - }, - VendorExtensible: VendorExtensible{map[string]interface{}{"x-framework": "go-swagger"}}, -} - -func TestIntegrationInfo_Serialize(t *testing.T) { - b, err := json.MarshalIndent(info, "", "\t") - if assert.NoError(t, err) { - assert.Equal(t, infoJSON, string(b)) - } -} - -func TestIntegrationInfo_Deserialize(t *testing.T) { - actual := Info{} - err := json.Unmarshal([]byte(infoJSON), &actual) - if assert.NoError(t, err) { - assert.EqualValues(t, info, actual) - } -} diff --git a/vendor/github.com/go-openapi/spec/items.go b/vendor/github.com/go-openapi/spec/items.go deleted file mode 100644 index 07ac88e669..0000000000 --- a/vendor/github.com/go-openapi/spec/items.go +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "strings" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" -) - -type SimpleSchema struct { - Type string `json:"type,omitempty"` - Format string `json:"format,omitempty"` - Items *Items `json:"items,omitempty"` - CollectionFormat string `json:"collectionFormat,omitempty"` - Default interface{} `json:"default,omitempty"` -} - -func (s *SimpleSchema) TypeName() string { - if s.Format != "" { - return s.Format - } - return s.Type -} - -func (s *SimpleSchema) ItemsTypeName() string { - if s.Items == nil { - return "" - } - return s.Items.TypeName() -} - -type CommonValidations struct { - Maximum *float64 `json:"maximum,omitempty"` - ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` - Minimum *float64 `json:"minimum,omitempty"` - ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` - MaxLength *int64 `json:"maxLength,omitempty"` - MinLength *int64 `json:"minLength,omitempty"` - Pattern string `json:"pattern,omitempty"` - MaxItems *int64 `json:"maxItems,omitempty"` - MinItems *int64 `json:"minItems,omitempty"` - UniqueItems bool `json:"uniqueItems,omitempty"` - MultipleOf *float64 `json:"multipleOf,omitempty"` - Enum []interface{} `json:"enum,omitempty"` -} - -// Items a limited subset of JSON-Schema's items object. -// It is used by parameter definitions that are not located in "body". -// -// For more information: http://goo.gl/8us55a#items-object -type Items struct { - Refable - CommonValidations - SimpleSchema - VendorExtensible -} - -// NewItems creates a new instance of items -func NewItems() *Items { - return &Items{} -} - -// Typed a fluent builder method for the type of item -func (i *Items) Typed(tpe, format string) *Items { - i.Type = tpe - i.Format = format - return i -} - -// CollectionOf a fluent builder method for an array item -func (i *Items) CollectionOf(items *Items, format string) *Items { - i.Type = "array" - i.Items = items - i.CollectionFormat = format - return i -} - -// WithDefault sets the default value on this item -func (i *Items) WithDefault(defaultValue interface{}) *Items { - i.Default = defaultValue - return i -} - -// WithMaxLength sets a max length value -func (i *Items) WithMaxLength(max int64) *Items { - i.MaxLength = &max - return i -} - -// WithMinLength sets a min length value -func (i *Items) WithMinLength(min int64) *Items { - i.MinLength = &min - return i -} - -// WithPattern sets a pattern value -func (i *Items) WithPattern(pattern string) *Items { - i.Pattern = pattern - return i -} - -// WithMultipleOf sets a multiple of value -func (i *Items) WithMultipleOf(number float64) *Items { - i.MultipleOf = &number - return i -} - -// WithMaximum sets a maximum number value -func (i *Items) WithMaximum(max float64, exclusive bool) *Items { - i.Maximum = &max - i.ExclusiveMaximum = exclusive - return i -} - -// WithMinimum sets a minimum number value -func (i *Items) WithMinimum(min float64, exclusive bool) *Items { - i.Minimum = &min - i.ExclusiveMinimum = exclusive - return i -} - -// WithEnum sets a the enum values (replace) -func (i *Items) WithEnum(values ...interface{}) *Items { - i.Enum = append([]interface{}{}, values...) - return i -} - -// WithMaxItems sets the max items -func (i *Items) WithMaxItems(size int64) *Items { - i.MaxItems = &size - return i -} - -// WithMinItems sets the min items -func (i *Items) WithMinItems(size int64) *Items { - i.MinItems = &size - return i -} - -// UniqueValues dictates that this array can only have unique items -func (i *Items) UniqueValues() *Items { - i.UniqueItems = true - return i -} - -// AllowDuplicates this array can have duplicates -func (i *Items) AllowDuplicates() *Items { - i.UniqueItems = false - return i -} - -// UnmarshalJSON hydrates this items instance with the data from JSON -func (i *Items) UnmarshalJSON(data []byte) error { - var validations CommonValidations - if err := json.Unmarshal(data, &validations); err != nil { - return err - } - var ref Refable - if err := json.Unmarshal(data, &ref); err != nil { - return err - } - var simpleSchema SimpleSchema - if err := json.Unmarshal(data, &simpleSchema); err != nil { - return err - } - var vendorExtensible VendorExtensible - if err := json.Unmarshal(data, &vendorExtensible); err != nil { - return err - } - i.Refable = ref - i.CommonValidations = validations - i.SimpleSchema = simpleSchema - i.VendorExtensible = vendorExtensible - return nil -} - -// MarshalJSON converts this items object to JSON -func (i Items) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(i.CommonValidations) - if err != nil { - return nil, err - } - b2, err := json.Marshal(i.SimpleSchema) - if err != nil { - return nil, err - } - b3, err := json.Marshal(i.Refable) - if err != nil { - return nil, err - } - b4, err := json.Marshal(i.VendorExtensible) - if err != nil { - return nil, err - } - return swag.ConcatJSON(b4, b3, b1, b2), nil -} - -// JSONLookup look up a value by the json property name -func (p Items) JSONLookup(token string) (interface{}, error) { - if token == "$ref" { - return &p.Ref, nil - } - - r, _, err := jsonpointer.GetForToken(p.CommonValidations, token) - if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { - return nil, err - } - if r != nil { - return r, nil - } - r, _, err = jsonpointer.GetForToken(p.SimpleSchema, token) - return r, err -} diff --git a/vendor/github.com/go-openapi/spec/items_test.go b/vendor/github.com/go-openapi/spec/items_test.go deleted file mode 100644 index 2f9ac11b43..0000000000 --- a/vendor/github.com/go-openapi/spec/items_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -var items = Items{ - Refable: Refable{Ref: MustCreateRef("Dog")}, - CommonValidations: CommonValidations{ - Maximum: float64Ptr(100), - ExclusiveMaximum: true, - ExclusiveMinimum: true, - Minimum: float64Ptr(5), - MaxLength: int64Ptr(100), - MinLength: int64Ptr(5), - Pattern: "\\w{1,5}\\w+", - MaxItems: int64Ptr(100), - MinItems: int64Ptr(5), - UniqueItems: true, - MultipleOf: float64Ptr(5), - Enum: []interface{}{"hello", "world"}, - }, - SimpleSchema: SimpleSchema{ - Type: "string", - Format: "date", - Items: &Items{ - Refable: Refable{Ref: MustCreateRef("Cat")}, - }, - CollectionFormat: "csv", - Default: "8", - }, -} - -var itemsJSON = `{ - "items": { - "$ref": "Cat" - }, - "$ref": "Dog", - "maximum": 100, - "minimum": 5, - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "maxLength": 100, - "minLength": 5, - "pattern": "\\w{1,5}\\w+", - "maxItems": 100, - "minItems": 5, - "uniqueItems": true, - "multipleOf": 5, - "enum": ["hello", "world"], - "type": "string", - "format": "date", - "collectionFormat": "csv", - "default": "8" -}` - -func TestIntegrationItems(t *testing.T) { - var actual Items - if assert.NoError(t, json.Unmarshal([]byte(itemsJSON), &actual)) { - assert.EqualValues(t, actual, items) - } - - assertParsesJSON(t, itemsJSON, items) -} diff --git a/vendor/github.com/go-openapi/spec/license.go b/vendor/github.com/go-openapi/spec/license.go deleted file mode 100644 index f20961b4fd..0000000000 --- a/vendor/github.com/go-openapi/spec/license.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -// License information for the exposed API. -// -// For more information: http://goo.gl/8us55a#licenseObject -type License struct { - Name string `json:"name,omitempty"` - URL string `json:"url,omitempty"` -} diff --git a/vendor/github.com/go-openapi/spec/license_test.go b/vendor/github.com/go-openapi/spec/license_test.go deleted file mode 100644 index 8ed51a3529..0000000000 --- a/vendor/github.com/go-openapi/spec/license_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import "testing" - -func TestIntegrationLicense(t *testing.T) { - license := License{"the name", "the url"} - const licenseJSON = `{"name":"the name","url":"the url"}` - const licenseYAML = "name: the name\nurl: the url\n" - - assertSerializeJSON(t, license, licenseJSON) - assertSerializeYAML(t, license, licenseYAML) - assertParsesJSON(t, licenseJSON, license) - assertParsesYAML(t, licenseYAML, license) -} diff --git a/vendor/github.com/go-openapi/spec/operation.go b/vendor/github.com/go-openapi/spec/operation.go deleted file mode 100644 index de1db6f020..0000000000 --- a/vendor/github.com/go-openapi/spec/operation.go +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" -) - -type OperationProps struct { - Description string `json:"description,omitempty"` - Consumes []string `json:"consumes,omitempty"` - Produces []string `json:"produces,omitempty"` - Schemes []string `json:"schemes,omitempty"` // the scheme, when present must be from [http, https, ws, wss] - Tags []string `json:"tags,omitempty"` - Summary string `json:"summary,omitempty"` - ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` - ID string `json:"operationId,omitempty"` - Deprecated bool `json:"deprecated,omitempty"` - Security []map[string][]string `json:"security,omitempty"` - Parameters []Parameter `json:"parameters,omitempty"` - Responses *Responses `json:"responses,omitempty"` -} - -// Operation describes a single API operation on a path. -// -// For more information: http://goo.gl/8us55a#operationObject -type Operation struct { - VendorExtensible - OperationProps -} - -// SuccessResponse gets a success response model -func (o *Operation) SuccessResponse() (*Response, int, bool) { - if o.Responses == nil { - return nil, 0, false - } - - for k, v := range o.Responses.StatusCodeResponses { - if k/100 == 2 { - return &v, k, true - } - } - - return o.Responses.Default, 0, false -} - -// JSONLookup look up a value by the json property name -func (o Operation) JSONLookup(token string) (interface{}, error) { - if ex, ok := o.Extensions[token]; ok { - return &ex, nil - } - r, _, err := jsonpointer.GetForToken(o.OperationProps, token) - return r, err -} - -// UnmarshalJSON hydrates this items instance with the data from JSON -func (o *Operation) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &o.OperationProps); err != nil { - return err - } - if err := json.Unmarshal(data, &o.VendorExtensible); err != nil { - return err - } - return nil -} - -// MarshalJSON converts this items object to JSON -func (o Operation) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(o.OperationProps) - if err != nil { - return nil, err - } - b2, err := json.Marshal(o.VendorExtensible) - if err != nil { - return nil, err - } - concated := swag.ConcatJSON(b1, b2) - return concated, nil -} - -// NewOperation creates a new operation instance. -// It expects an ID as parameter but not passing an ID is also valid. -func NewOperation(id string) *Operation { - op := new(Operation) - op.ID = id - return op -} - -// WithID sets the ID property on this operation, allows for chaining. -func (o *Operation) WithID(id string) *Operation { - o.ID = id - return o -} - -// WithDescription sets the description on this operation, allows for chaining -func (o *Operation) WithDescription(description string) *Operation { - o.Description = description - return o -} - -// WithSummary sets the summary on this operation, allows for chaining -func (o *Operation) WithSummary(summary string) *Operation { - o.Summary = summary - return o -} - -// WithExternalDocs sets/removes the external docs for/from this operation. -// When you pass empty strings as params the external documents will be removed. -// When you pass non-empty string as one value then those values will be used on the external docs object. -// So when you pass a non-empty description, you should also pass the url and vice versa. -func (o *Operation) WithExternalDocs(description, url string) *Operation { - if description == "" && url == "" { - o.ExternalDocs = nil - return o - } - - if o.ExternalDocs == nil { - o.ExternalDocs = &ExternalDocumentation{} - } - o.ExternalDocs.Description = description - o.ExternalDocs.URL = url - return o -} - -// Deprecate marks the operation as deprecated -func (o *Operation) Deprecate() *Operation { - o.Deprecated = true - return o -} - -// Undeprecate marks the operation as not deprected -func (o *Operation) Undeprecate() *Operation { - o.Deprecated = false - return o -} - -// WithConsumes adds media types for incoming body values -func (o *Operation) WithConsumes(mediaTypes ...string) *Operation { - o.Consumes = append(o.Consumes, mediaTypes...) - return o -} - -// WithProduces adds media types for outgoing body values -func (o *Operation) WithProduces(mediaTypes ...string) *Operation { - o.Produces = append(o.Produces, mediaTypes...) - return o -} - -// WithTags adds tags for this operation -func (o *Operation) WithTags(tags ...string) *Operation { - o.Tags = append(o.Tags, tags...) - return o -} - -// AddParam adds a parameter to this operation, when a parameter for that location -// and with that name already exists it will be replaced -func (o *Operation) AddParam(param *Parameter) *Operation { - if param == nil { - return o - } - - for i, p := range o.Parameters { - if p.Name == param.Name && p.In == param.In { - params := append(o.Parameters[:i], *param) - params = append(params, o.Parameters[i+1:]...) - o.Parameters = params - return o - } - } - - o.Parameters = append(o.Parameters, *param) - return o -} - -// RemoveParam removes a parameter from the operation -func (o *Operation) RemoveParam(name, in string) *Operation { - for i, p := range o.Parameters { - if p.Name == name && p.In == name { - o.Parameters = append(o.Parameters[:i], o.Parameters[i+1:]...) - return o - } - } - return o -} - -// SecuredWith adds a security scope to this operation. -func (o *Operation) SecuredWith(name string, scopes ...string) *Operation { - o.Security = append(o.Security, map[string][]string{name: scopes}) - return o -} - -// WithDefaultResponse adds a default response to the operation. -// Passing a nil value will remove the response -func (o *Operation) WithDefaultResponse(response *Response) *Operation { - return o.RespondsWith(0, response) -} - -// RespondsWith adds a status code response to the operation. -// When the code is 0 the value of the response will be used as default response value. -// When the value of the response is nil it will be removed from the operation -func (o *Operation) RespondsWith(code int, response *Response) *Operation { - if o.Responses == nil { - o.Responses = new(Responses) - } - if code == 0 { - o.Responses.Default = response - return o - } - if response == nil { - delete(o.Responses.StatusCodeResponses, code) - return o - } - if o.Responses.StatusCodeResponses == nil { - o.Responses.StatusCodeResponses = make(map[int]Response) - } - o.Responses.StatusCodeResponses[code] = *response - return o -} diff --git a/vendor/github.com/go-openapi/spec/operation_test.go b/vendor/github.com/go-openapi/spec/operation_test.go deleted file mode 100644 index 113bf6c065..0000000000 --- a/vendor/github.com/go-openapi/spec/operation_test.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -var operation = Operation{ - VendorExtensible: VendorExtensible{ - Extensions: map[string]interface{}{ - "x-framework": "go-swagger", - }, - }, - OperationProps: OperationProps{ - Description: "operation description", - Consumes: []string{"application/json", "application/x-yaml"}, - Produces: []string{"application/json", "application/x-yaml"}, - Schemes: []string{"http", "https"}, - Tags: []string{"dogs"}, - Summary: "the summary of the operation", - ID: "sendCat", - Deprecated: true, - Security: []map[string][]string{ - map[string][]string{ - "apiKey": []string{}, - }, - }, - Parameters: []Parameter{ - Parameter{Refable: Refable{Ref: MustCreateRef("Cat")}}, - }, - Responses: &Responses{ - ResponsesProps: ResponsesProps{ - Default: &Response{ - ResponseProps: ResponseProps{ - Description: "void response", - }, - }, - }, - }, - }, -} - -var operationJSON = `{ - "description": "operation description", - "x-framework": "go-swagger", - "consumes": [ "application/json", "application/x-yaml" ], - "produces": [ "application/json", "application/x-yaml" ], - "schemes": ["http", "https"], - "tags": ["dogs"], - "summary": "the summary of the operation", - "operationId": "sendCat", - "deprecated": true, - "security": [ { "apiKey": [] } ], - "parameters": [{"$ref":"Cat"}], - "responses": { - "default": { - "description": "void response" - } - } -}` - -func TestIntegrationOperation(t *testing.T) { - var actual Operation - if assert.NoError(t, json.Unmarshal([]byte(operationJSON), &actual)) { - assert.EqualValues(t, actual, operation) - } - - assertParsesJSON(t, operationJSON, operation) -} diff --git a/vendor/github.com/go-openapi/spec/parameter.go b/vendor/github.com/go-openapi/spec/parameter.go deleted file mode 100644 index 71aee1e806..0000000000 --- a/vendor/github.com/go-openapi/spec/parameter.go +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "strings" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" -) - -// QueryParam creates a query parameter -func QueryParam(name string) *Parameter { - return &Parameter{ParamProps: ParamProps{Name: name, In: "query"}} -} - -// HeaderParam creates a header parameter, this is always required by default -func HeaderParam(name string) *Parameter { - return &Parameter{ParamProps: ParamProps{Name: name, In: "header", Required: true}} -} - -// PathParam creates a path parameter, this is always required -func PathParam(name string) *Parameter { - return &Parameter{ParamProps: ParamProps{Name: name, In: "path", Required: true}} -} - -// BodyParam creates a body parameter -func BodyParam(name string, schema *Schema) *Parameter { - return &Parameter{ParamProps: ParamProps{Name: name, In: "body", Schema: schema}, SimpleSchema: SimpleSchema{Type: "object"}} -} - -// FormDataParam creates a body parameter -func FormDataParam(name string) *Parameter { - return &Parameter{ParamProps: ParamProps{Name: name, In: "formData"}} -} - -// FileParam creates a body parameter -func FileParam(name string) *Parameter { - return &Parameter{ParamProps: ParamProps{Name: name, In: "formData"}, SimpleSchema: SimpleSchema{Type: "file"}} -} - -// SimpleArrayParam creates a param for a simple array (string, int, date etc) -func SimpleArrayParam(name, tpe, fmt string) *Parameter { - return &Parameter{ParamProps: ParamProps{Name: name}, SimpleSchema: SimpleSchema{Type: "array", CollectionFormat: "csv", Items: &Items{SimpleSchema: SimpleSchema{Type: "string", Format: fmt}}}} -} - -// ParamRef creates a parameter that's a json reference -func ParamRef(uri string) *Parameter { - p := new(Parameter) - p.Ref = MustCreateRef(uri) - return p -} - -type ParamProps struct { - Description string `json:"description,omitempty"` - Name string `json:"name,omitempty"` - In string `json:"in,omitempty"` - Required bool `json:"required,omitempty"` - Schema *Schema `json:"schema,omitempty"` // when in == "body" - AllowEmptyValue bool `json:"allowEmptyValue,omitempty"` // when in == "query" || "formData" -} - -// Parameter a unique parameter is defined by a combination of a [name](#parameterName) and [location](#parameterIn). -// -// There are five possible parameter types. -// * Path - Used together with [Path Templating](#pathTemplating), where the parameter value is actually part of the operation's URL. This does not include the host or base path of the API. For example, in `/items/{itemId}`, the path parameter is `itemId`. -// * Query - Parameters that are appended to the URL. For example, in `/items?id=###`, the query parameter is `id`. -// * Header - Custom headers that are expected as part of the request. -// * Body - The payload that's appended to the HTTP request. Since there can only be one payload, there can only be *one* body parameter. The name of the body parameter has no effect on the parameter itself and is used for documentation purposes only. Since Form parameters are also in the payload, body and form parameters cannot exist together for the same operation. -// * Form - Used to describe the payload of an HTTP request when either `application/x-www-form-urlencoded` or `multipart/form-data` are used as the content type of the request (in Swagger's definition, the [`consumes`](#operationConsumes) property of an operation). This is the only parameter type that can be used to send files, thus supporting the `file` type. Since form parameters are sent in the payload, they cannot be declared together with a body parameter for the same operation. Form parameters have a different format based on the content-type used (for further details, consult http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4): -// * `application/x-www-form-urlencoded` - Similar to the format of Query parameters but as a payload. For example, `foo=1&bar=swagger` - both `foo` and `bar` are form parameters. This is normally used for simple parameters that are being transferred. -// * `multipart/form-data` - each parameter takes a section in the payload with an internal header. For example, for the header `Content-Disposition: form-data; name="submit-name"` the name of the parameter is `submit-name`. This type of form parameters is more commonly used for file transfers. -// -// For more information: http://goo.gl/8us55a#parameterObject -type Parameter struct { - Refable - CommonValidations - SimpleSchema - VendorExtensible - ParamProps -} - -// JSONLookup look up a value by the json property name -func (p Parameter) JSONLookup(token string) (interface{}, error) { - if ex, ok := p.Extensions[token]; ok { - return &ex, nil - } - if token == "$ref" { - return &p.Ref, nil - } - - r, _, err := jsonpointer.GetForToken(p.CommonValidations, token) - if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { - return nil, err - } - if r != nil { - return r, nil - } - r, _, err = jsonpointer.GetForToken(p.SimpleSchema, token) - if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { - return nil, err - } - if r != nil { - return r, nil - } - r, _, err = jsonpointer.GetForToken(p.ParamProps, token) - return r, err -} - -// WithDescription a fluent builder method for the description of the parameter -func (p *Parameter) WithDescription(description string) *Parameter { - p.Description = description - return p -} - -// Named a fluent builder method to override the name of the parameter -func (p *Parameter) Named(name string) *Parameter { - p.Name = name - return p -} - -// WithLocation a fluent builder method to override the location of the parameter -func (p *Parameter) WithLocation(in string) *Parameter { - p.In = in - return p -} - -// Typed a fluent builder method for the type of the parameter value -func (p *Parameter) Typed(tpe, format string) *Parameter { - p.Type = tpe - p.Format = format - return p -} - -// CollectionOf a fluent builder method for an array parameter -func (p *Parameter) CollectionOf(items *Items, format string) *Parameter { - p.Type = "array" - p.Items = items - p.CollectionFormat = format - return p -} - -// WithDefault sets the default value on this parameter -func (p *Parameter) WithDefault(defaultValue interface{}) *Parameter { - p.AsOptional() // with default implies optional - p.Default = defaultValue - return p -} - -// AllowsEmptyValues flags this parameter as being ok with empty values -func (p *Parameter) AllowsEmptyValues() *Parameter { - p.AllowEmptyValue = true - return p -} - -// NoEmptyValues flags this parameter as not liking empty values -func (p *Parameter) NoEmptyValues() *Parameter { - p.AllowEmptyValue = false - return p -} - -// AsOptional flags this parameter as optional -func (p *Parameter) AsOptional() *Parameter { - p.Required = false - return p -} - -// AsRequired flags this parameter as required -func (p *Parameter) AsRequired() *Parameter { - if p.Default != nil { // with a default required makes no sense - return p - } - p.Required = true - return p -} - -// WithMaxLength sets a max length value -func (p *Parameter) WithMaxLength(max int64) *Parameter { - p.MaxLength = &max - return p -} - -// WithMinLength sets a min length value -func (p *Parameter) WithMinLength(min int64) *Parameter { - p.MinLength = &min - return p -} - -// WithPattern sets a pattern value -func (p *Parameter) WithPattern(pattern string) *Parameter { - p.Pattern = pattern - return p -} - -// WithMultipleOf sets a multiple of value -func (p *Parameter) WithMultipleOf(number float64) *Parameter { - p.MultipleOf = &number - return p -} - -// WithMaximum sets a maximum number value -func (p *Parameter) WithMaximum(max float64, exclusive bool) *Parameter { - p.Maximum = &max - p.ExclusiveMaximum = exclusive - return p -} - -// WithMinimum sets a minimum number value -func (p *Parameter) WithMinimum(min float64, exclusive bool) *Parameter { - p.Minimum = &min - p.ExclusiveMinimum = exclusive - return p -} - -// WithEnum sets a the enum values (replace) -func (p *Parameter) WithEnum(values ...interface{}) *Parameter { - p.Enum = append([]interface{}{}, values...) - return p -} - -// WithMaxItems sets the max items -func (p *Parameter) WithMaxItems(size int64) *Parameter { - p.MaxItems = &size - return p -} - -// WithMinItems sets the min items -func (p *Parameter) WithMinItems(size int64) *Parameter { - p.MinItems = &size - return p -} - -// UniqueValues dictates that this array can only have unique items -func (p *Parameter) UniqueValues() *Parameter { - p.UniqueItems = true - return p -} - -// AllowDuplicates this array can have duplicates -func (p *Parameter) AllowDuplicates() *Parameter { - p.UniqueItems = false - return p -} - -// UnmarshalJSON hydrates this items instance with the data from JSON -func (p *Parameter) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &p.CommonValidations); err != nil { - return err - } - if err := json.Unmarshal(data, &p.Refable); err != nil { - return err - } - if err := json.Unmarshal(data, &p.SimpleSchema); err != nil { - return err - } - if err := json.Unmarshal(data, &p.VendorExtensible); err != nil { - return err - } - if err := json.Unmarshal(data, &p.ParamProps); err != nil { - return err - } - return nil -} - -// MarshalJSON converts this items object to JSON -func (p Parameter) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(p.CommonValidations) - if err != nil { - return nil, err - } - b2, err := json.Marshal(p.SimpleSchema) - if err != nil { - return nil, err - } - b3, err := json.Marshal(p.Refable) - if err != nil { - return nil, err - } - b4, err := json.Marshal(p.VendorExtensible) - if err != nil { - return nil, err - } - b5, err := json.Marshal(p.ParamProps) - if err != nil { - return nil, err - } - return swag.ConcatJSON(b3, b1, b2, b4, b5), nil -} diff --git a/vendor/github.com/go-openapi/spec/parameters_test.go b/vendor/github.com/go-openapi/spec/parameters_test.go deleted file mode 100644 index 424f663329..0000000000 --- a/vendor/github.com/go-openapi/spec/parameters_test.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -var parameter = Parameter{ - VendorExtensible: VendorExtensible{Extensions: map[string]interface{}{ - "x-framework": "swagger-go", - }}, - Refable: Refable{Ref: MustCreateRef("Dog")}, - CommonValidations: CommonValidations{ - Maximum: float64Ptr(100), - ExclusiveMaximum: true, - ExclusiveMinimum: true, - Minimum: float64Ptr(5), - MaxLength: int64Ptr(100), - MinLength: int64Ptr(5), - Pattern: "\\w{1,5}\\w+", - MaxItems: int64Ptr(100), - MinItems: int64Ptr(5), - UniqueItems: true, - MultipleOf: float64Ptr(5), - Enum: []interface{}{"hello", "world"}, - }, - SimpleSchema: SimpleSchema{ - Type: "string", - Format: "date", - CollectionFormat: "csv", - Items: &Items{ - Refable: Refable{Ref: MustCreateRef("Cat")}, - }, - Default: "8", - }, - ParamProps: ParamProps{ - Name: "param-name", - In: "header", - Required: true, - Schema: &Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}, - Description: "the description of this parameter", - }, -} - -var parameterJSON = `{ - "items": { - "$ref": "Cat" - }, - "x-framework": "swagger-go", - "$ref": "Dog", - "description": "the description of this parameter", - "maximum": 100, - "minimum": 5, - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "maxLength": 100, - "minLength": 5, - "pattern": "\\w{1,5}\\w+", - "maxItems": 100, - "minItems": 5, - "uniqueItems": true, - "multipleOf": 5, - "enum": ["hello", "world"], - "type": "string", - "format": "date", - "name": "param-name", - "in": "header", - "required": true, - "schema": { - "type": "string" - }, - "collectionFormat": "csv", - "default": "8" -}` - -func TestIntegrationParameter(t *testing.T) { - var actual Parameter - if assert.NoError(t, json.Unmarshal([]byte(parameterJSON), &actual)) { - assert.EqualValues(t, actual, parameter) - } - - assertParsesJSON(t, parameterJSON, parameter) -} - -func TestParameterSerialization(t *testing.T) { - items := &Items{ - SimpleSchema: SimpleSchema{Type: "string"}, - } - - intItems := &Items{ - SimpleSchema: SimpleSchema{Type: "int", Format: "int32"}, - } - - assertSerializeJSON(t, QueryParam("").Typed("string", ""), `{"type":"string","in":"query"}`) - - assertSerializeJSON(t, - QueryParam("").CollectionOf(items, "multi"), - `{"type":"array","items":{"type":"string"},"collectionFormat":"multi","in":"query"}`) - - assertSerializeJSON(t, PathParam("").Typed("string", ""), `{"type":"string","in":"path","required":true}`) - - assertSerializeJSON(t, - PathParam("").CollectionOf(items, "multi"), - `{"type":"array","items":{"type":"string"},"collectionFormat":"multi","in":"path","required":true}`) - - assertSerializeJSON(t, - PathParam("").CollectionOf(intItems, "multi"), - `{"type":"array","items":{"type":"int","format":"int32"},"collectionFormat":"multi","in":"path","required":true}`) - - assertSerializeJSON(t, HeaderParam("").Typed("string", ""), `{"type":"string","in":"header","required":true}`) - - assertSerializeJSON(t, - HeaderParam("").CollectionOf(items, "multi"), - `{"type":"array","items":{"type":"string"},"collectionFormat":"multi","in":"header","required":true}`) - schema := &Schema{SchemaProps: SchemaProps{ - Properties: map[string]Schema{ - "name": Schema{SchemaProps: SchemaProps{ - Type: []string{"string"}, - }}, - }, - }} - - refSchema := &Schema{ - SchemaProps: SchemaProps{Ref: MustCreateRef("Cat")}, - } - - assertSerializeJSON(t, - BodyParam("", schema), - `{"type":"object","in":"body","schema":{"properties":{"name":{"type":"string"}}}}`) - - assertSerializeJSON(t, - BodyParam("", refSchema), - `{"type":"object","in":"body","schema":{"$ref":"Cat"}}`) - - // array body param - assertSerializeJSON(t, - BodyParam("", ArrayProperty(RefProperty("Cat"))), - `{"type":"object","in":"body","schema":{"type":"array","items":{"$ref":"Cat"}}}`) - -} diff --git a/vendor/github.com/go-openapi/spec/path_item.go b/vendor/github.com/go-openapi/spec/path_item.go deleted file mode 100644 index 9ab3ec5383..0000000000 --- a/vendor/github.com/go-openapi/spec/path_item.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" -) - -// pathItemProps the path item specific properties -type PathItemProps struct { - Get *Operation `json:"get,omitempty"` - Put *Operation `json:"put,omitempty"` - Post *Operation `json:"post,omitempty"` - Delete *Operation `json:"delete,omitempty"` - Options *Operation `json:"options,omitempty"` - Head *Operation `json:"head,omitempty"` - Patch *Operation `json:"patch,omitempty"` - Parameters []Parameter `json:"parameters,omitempty"` -} - -// PathItem describes the operations available on a single path. -// A Path Item may be empty, due to [ACL constraints](http://goo.gl/8us55a#securityFiltering). -// The path itself is still exposed to the documentation viewer but they will -// not know which operations and parameters are available. -// -// For more information: http://goo.gl/8us55a#pathItemObject -type PathItem struct { - Refable - VendorExtensible - PathItemProps -} - -// JSONLookup look up a value by the json property name -func (p PathItem) JSONLookup(token string) (interface{}, error) { - if ex, ok := p.Extensions[token]; ok { - return &ex, nil - } - if token == "$ref" { - return &p.Ref, nil - } - r, _, err := jsonpointer.GetForToken(p.PathItemProps, token) - return r, err -} - -// UnmarshalJSON hydrates this items instance with the data from JSON -func (p *PathItem) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &p.Refable); err != nil { - return err - } - if err := json.Unmarshal(data, &p.VendorExtensible); err != nil { - return err - } - if err := json.Unmarshal(data, &p.PathItemProps); err != nil { - return err - } - return nil -} - -// MarshalJSON converts this items object to JSON -func (p PathItem) MarshalJSON() ([]byte, error) { - b3, err := json.Marshal(p.Refable) - if err != nil { - return nil, err - } - b4, err := json.Marshal(p.VendorExtensible) - if err != nil { - return nil, err - } - b5, err := json.Marshal(p.PathItemProps) - if err != nil { - return nil, err - } - concated := swag.ConcatJSON(b3, b4, b5) - return concated, nil -} diff --git a/vendor/github.com/go-openapi/spec/path_item_test.go b/vendor/github.com/go-openapi/spec/path_item_test.go deleted file mode 100644 index ea77e6a9b3..0000000000 --- a/vendor/github.com/go-openapi/spec/path_item_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -var pathItem = PathItem{ - Refable: Refable{Ref: MustCreateRef("Dog")}, - VendorExtensible: VendorExtensible{ - Extensions: map[string]interface{}{ - "x-framework": "go-swagger", - }, - }, - PathItemProps: PathItemProps{ - Get: &Operation{ - OperationProps: OperationProps{Description: "get operation description"}, - }, - Put: &Operation{ - OperationProps: OperationProps{Description: "put operation description"}, - }, - Post: &Operation{ - OperationProps: OperationProps{Description: "post operation description"}, - }, - Delete: &Operation{ - OperationProps: OperationProps{Description: "delete operation description"}, - }, - Options: &Operation{ - OperationProps: OperationProps{Description: "options operation description"}, - }, - Head: &Operation{ - OperationProps: OperationProps{Description: "head operation description"}, - }, - Patch: &Operation{ - OperationProps: OperationProps{Description: "patch operation description"}, - }, - Parameters: []Parameter{ - Parameter{ - ParamProps: ParamProps{In: "path"}, - }, - }, - }, -} - -var pathItemJSON = `{ - "$ref": "Dog", - "x-framework": "go-swagger", - "get": { "description": "get operation description" }, - "put": { "description": "put operation description" }, - "post": { "description": "post operation description" }, - "delete": { "description": "delete operation description" }, - "options": { "description": "options operation description" }, - "head": { "description": "head operation description" }, - "patch": { "description": "patch operation description" }, - "parameters": [{"in":"path"}] -}` - -func TestIntegrationPathItem(t *testing.T) { - var actual PathItem - if assert.NoError(t, json.Unmarshal([]byte(pathItemJSON), &actual)) { - assert.EqualValues(t, actual, pathItem) - } - - assertParsesJSON(t, pathItemJSON, pathItem) -} diff --git a/vendor/github.com/go-openapi/spec/paths.go b/vendor/github.com/go-openapi/spec/paths.go deleted file mode 100644 index 9dc82a2901..0000000000 --- a/vendor/github.com/go-openapi/spec/paths.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "fmt" - "strings" - - "github.com/go-openapi/swag" -) - -// Paths holds the relative paths to the individual endpoints. -// The path is appended to the [`basePath`](http://goo.gl/8us55a#swaggerBasePath) in order -// to construct the full URL. -// The Paths may be empty, due to [ACL constraints](http://goo.gl/8us55a#securityFiltering). -// -// For more information: http://goo.gl/8us55a#pathsObject -type Paths struct { - VendorExtensible - Paths map[string]PathItem `json:"-"` // custom serializer to flatten this, each entry must start with "/" -} - -// JSONLookup look up a value by the json property name -func (p Paths) JSONLookup(token string) (interface{}, error) { - if pi, ok := p.Paths[token]; ok { - return &pi, nil - } - if ex, ok := p.Extensions[token]; ok { - return &ex, nil - } - return nil, fmt.Errorf("object has no field %q", token) -} - -// UnmarshalJSON hydrates this items instance with the data from JSON -func (p *Paths) UnmarshalJSON(data []byte) error { - var res map[string]json.RawMessage - if err := json.Unmarshal(data, &res); err != nil { - return err - } - for k, v := range res { - if strings.HasPrefix(strings.ToLower(k), "x-") { - if p.Extensions == nil { - p.Extensions = make(map[string]interface{}) - } - var d interface{} - if err := json.Unmarshal(v, &d); err != nil { - return err - } - p.Extensions[k] = d - } - if strings.HasPrefix(k, "/") { - if p.Paths == nil { - p.Paths = make(map[string]PathItem) - } - var pi PathItem - if err := json.Unmarshal(v, &pi); err != nil { - return err - } - p.Paths[k] = pi - } - } - return nil -} - -// MarshalJSON converts this items object to JSON -func (p Paths) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(p.VendorExtensible) - if err != nil { - return nil, err - } - - pths := make(map[string]PathItem) - for k, v := range p.Paths { - if strings.HasPrefix(k, "/") { - pths[k] = v - } - } - b2, err := json.Marshal(pths) - if err != nil { - return nil, err - } - concated := swag.ConcatJSON(b1, b2) - return concated, nil -} diff --git a/vendor/github.com/go-openapi/spec/paths_test.go b/vendor/github.com/go-openapi/spec/paths_test.go deleted file mode 100644 index 5ccfd4a0aa..0000000000 --- a/vendor/github.com/go-openapi/spec/paths_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -var paths = Paths{ - VendorExtensible: VendorExtensible{Extensions: map[string]interface{}{"x-framework": "go-swagger"}}, - Paths: map[string]PathItem{ - "/": PathItem{ - Refable: Refable{Ref: MustCreateRef("cats")}, - }, - }, -} - -var pathsJSON = `{"x-framework":"go-swagger","/":{"$ref":"cats"}}` - -func TestIntegrationPaths(t *testing.T) { - var actual Paths - if assert.NoError(t, json.Unmarshal([]byte(pathsJSON), &actual)) { - assert.EqualValues(t, actual, paths) - } - - assertParsesJSON(t, pathsJSON, paths) - -} diff --git a/vendor/github.com/go-openapi/spec/properties_test.go b/vendor/github.com/go-openapi/spec/properties_test.go deleted file mode 100644 index 90bd32c9e9..0000000000 --- a/vendor/github.com/go-openapi/spec/properties_test.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "testing" -) - -func TestPropertySerialization(t *testing.T) { - strProp := StringProperty() - strProp.Enum = append(strProp.Enum, "a", "b") - - prop := &Schema{SchemaProps: SchemaProps{ - Items: &SchemaOrArray{Schemas: []Schema{ - Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}, - Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}, - }}, - }} - - var propSerData = []struct { - Schema *Schema - JSON string - }{ - {BooleanProperty(), `{"type":"boolean"}`}, - {DateProperty(), `{"type":"string","format":"date"}`}, - {DateTimeProperty(), `{"type":"string","format":"date-time"}`}, - {Float64Property(), `{"type":"number","format":"double"}`}, - {Float32Property(), `{"type":"number","format":"float"}`}, - {Int32Property(), `{"type":"integer","format":"int32"}`}, - {Int64Property(), `{"type":"integer","format":"int64"}`}, - {MapProperty(StringProperty()), `{"type":"object","additionalProperties":{"type":"string"}}`}, - {MapProperty(Int32Property()), `{"type":"object","additionalProperties":{"type":"integer","format":"int32"}}`}, - {RefProperty("Dog"), `{"$ref":"Dog"}`}, - {StringProperty(), `{"type":"string"}`}, - {strProp, `{"type":"string","enum":["a","b"]}`}, - {ArrayProperty(StringProperty()), `{"type":"array","items":{"type":"string"}}`}, - {prop, `{"items":[{"type":"string"},{"type":"string"}]}`}, - } - - for _, v := range propSerData { - t.Log("roundtripping for", v.JSON) - assertSerializeJSON(t, v.Schema, v.JSON) - assertParsesJSON(t, v.JSON, v.Schema) - } - -} diff --git a/vendor/github.com/go-openapi/spec/ref.go b/vendor/github.com/go-openapi/spec/ref.go deleted file mode 100644 index 4833b87e2f..0000000000 --- a/vendor/github.com/go-openapi/spec/ref.go +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "net/http" - "os" - "path/filepath" - - "github.com/go-openapi/jsonreference" -) - -// Refable is a struct for things that accept a $ref property -type Refable struct { - Ref Ref -} - -// MarshalJSON marshals the ref to json -func (r Refable) MarshalJSON() ([]byte, error) { - return r.Ref.MarshalJSON() -} - -// UnmarshalJSON unmarshalss the ref from json -func (r *Refable) UnmarshalJSON(d []byte) error { - return json.Unmarshal(d, &r.Ref) -} - -// Ref represents a json reference that is potentially resolved -type Ref struct { - jsonreference.Ref -} - -// RemoteURI gets the remote uri part of the ref -func (r *Ref) RemoteURI() string { - if r.String() == "" { - return r.String() - } - - u := *r.GetURL() - u.Fragment = "" - return u.String() -} - -// IsValidURI returns true when the url the ref points to can be found -func (r *Ref) IsValidURI(basepaths ...string) bool { - if r.String() == "" { - return true - } - - v := r.RemoteURI() - if v == "" { - return true - } - - if r.HasFullURL { - rr, err := http.Get(v) - if err != nil { - return false - } - - return rr.StatusCode/100 == 2 - } - - if !(r.HasFileScheme || r.HasFullFilePath || r.HasURLPathOnly) { - return false - } - - // check for local file - pth := v - if r.HasURLPathOnly { - base := "." - if len(basepaths) > 0 { - base = filepath.Dir(filepath.Join(basepaths...)) - } - p, e := filepath.Abs(filepath.ToSlash(filepath.Join(base, pth))) - if e != nil { - return false - } - pth = p - } - - fi, err := os.Stat(filepath.ToSlash(pth)) - if err != nil { - return false - } - - return !fi.IsDir() -} - -// Inherits creates a new reference from a parent and a child -// If the child cannot inherit from the parent, an error is returned -func (r *Ref) Inherits(child Ref) (*Ref, error) { - ref, err := r.Ref.Inherits(child.Ref) - if err != nil { - return nil, err - } - return &Ref{Ref: *ref}, nil -} - -// NewRef creates a new instance of a ref object -// returns an error when the reference uri is an invalid uri -func NewRef(refURI string) (Ref, error) { - ref, err := jsonreference.New(refURI) - if err != nil { - return Ref{}, err - } - return Ref{Ref: ref}, nil -} - -// MustCreateRef creates a ref object but panics when refURI is invalid. -// Use the NewRef method for a version that returns an error. -func MustCreateRef(refURI string) Ref { - return Ref{Ref: jsonreference.MustCreateRef(refURI)} -} - -// MarshalJSON marshals this ref into a JSON object -func (r Ref) MarshalJSON() ([]byte, error) { - str := r.String() - if str == "" { - if r.IsRoot() { - return []byte(`{"$ref":""}`), nil - } - return []byte("{}"), nil - } - v := map[string]interface{}{"$ref": str} - return json.Marshal(v) -} - -// UnmarshalJSON unmarshals this ref from a JSON object -func (r *Ref) UnmarshalJSON(d []byte) error { - var v map[string]interface{} - if err := json.Unmarshal(d, &v); err != nil { - return err - } - - if v == nil { - return nil - } - - if vv, ok := v["$ref"]; ok { - if str, ok := vv.(string); ok { - ref, err := jsonreference.New(str) - if err != nil { - return err - } - *r = Ref{Ref: ref} - } - } - - return nil -} diff --git a/vendor/github.com/go-openapi/spec/refmodifier.go b/vendor/github.com/go-openapi/spec/refmodifier.go deleted file mode 100644 index 8482608ea7..0000000000 --- a/vendor/github.com/go-openapi/spec/refmodifier.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2017 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "fmt" -) - -func modifyItemsRefs(target *Schema, basePath string) { - if target.Items != nil { - if target.Items.Schema != nil { - modifyRefs(target.Items.Schema, basePath) - } - for i := range target.Items.Schemas { - s := target.Items.Schemas[i] - modifyRefs(&s, basePath) - target.Items.Schemas[i] = s - } - } -} - -func modifyRefs(target *Schema, basePath string) { - if target.Ref.String() != "" { - if target.Ref.RemoteURI() == basePath { - return - } - newURL := fmt.Sprintf("%s%s", basePath, target.Ref.String()) - target.Ref, _ = NewRef(newURL) - } - - modifyItemsRefs(target, basePath) - for i := range target.AllOf { - modifyRefs(&target.AllOf[i], basePath) - } - for i := range target.AnyOf { - modifyRefs(&target.AnyOf[i], basePath) - } - for i := range target.OneOf { - modifyRefs(&target.OneOf[i], basePath) - } - if target.Not != nil { - modifyRefs(target.Not, basePath) - } - for k := range target.Properties { - s := target.Properties[k] - modifyRefs(&s, basePath) - target.Properties[k] = s - } - if target.AdditionalProperties != nil && target.AdditionalProperties.Schema != nil { - modifyRefs(target.AdditionalProperties.Schema, basePath) - } - for k := range target.PatternProperties { - s := target.PatternProperties[k] - modifyRefs(&s, basePath) - target.PatternProperties[k] = s - } - for k := range target.Dependencies { - if target.Dependencies[k].Schema != nil { - modifyRefs(target.Dependencies[k].Schema, basePath) - } - } - if target.AdditionalItems != nil && target.AdditionalItems.Schema != nil { - modifyRefs(target.AdditionalItems.Schema, basePath) - } - for k := range target.Definitions { - s := target.Definitions[k] - modifyRefs(&s, basePath) - target.Definitions[k] = s - } -} diff --git a/vendor/github.com/go-openapi/spec/refmodifier_test.go b/vendor/github.com/go-openapi/spec/refmodifier_test.go deleted file mode 100644 index c456cb43fe..0000000000 --- a/vendor/github.com/go-openapi/spec/refmodifier_test.go +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright 2017 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -var testJsonSchema = `{ - "id": "http://json-schema.org/draft-04/schema#", - "$schema": "http://json-schema.org/draft-04/schema#", - "description": "Core schema meta-schema", - "definitions": { - "schemaArray": { - "type": "array", - "minItems": 1, - "items": { "$ref": "#" } - }, - "positiveInteger": { - "type": "integer", - "minimum": 0 - }, - "positiveIntegerDefault0": { - "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ] - }, - "simpleTypes": { - "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ] - }, - "stringArray": { - "type": "array", - "items": { "type": "string" }, - "minItems": 1, - "uniqueItems": true - } - }, - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uri" - }, - "$schema": { - "type": "string", - "format": "uri" - }, - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "default": {}, - "multipleOf": { - "type": "number", - "minimum": 0, - "exclusiveMinimum": true - }, - "maximum": { - "type": "number" - }, - "exclusiveMaximum": { - "type": "boolean", - "default": false - }, - "minimum": { - "type": "number" - }, - "exclusiveMinimum": { - "type": "boolean", - "default": false - }, - "maxLength": { "$ref": "#/definitions/positiveInteger" }, - "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" }, - "pattern": { - "type": "string", - "format": "regex" - }, - "additionalItems": { - "anyOf": [ - { "type": "boolean" }, - { "$ref": "#" } - ], - "default": {} - }, - "items": { - "anyOf": [ - { "$ref": "#" }, - { "$ref": "#/definitions/schemaArray" } - ], - "default": {} - }, - "maxItems": { "$ref": "#/definitions/positiveInteger" }, - "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" }, - "uniqueItems": { - "type": "boolean", - "default": false - }, - "maxProperties": { "$ref": "#/definitions/positiveInteger" }, - "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" }, - "required": { "$ref": "#/definitions/stringArray" }, - "additionalProperties": { - "anyOf": [ - { "type": "boolean" }, - { "$ref": "#" } - ], - "default": {} - }, - "definitions": { - "type": "object", - "additionalProperties": { "$ref": "#" }, - "default": {} - }, - "properties": { - "type": "object", - "additionalProperties": { "$ref": "#" }, - "default": {} - }, - "patternProperties": { - "type": "object", - "additionalProperties": { "$ref": "#" }, - "default": {} - }, - "dependencies": { - "type": "object", - "additionalProperties": { - "anyOf": [ - { "$ref": "#" }, - { "$ref": "#/definitions/stringArray" } - ] - } - }, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true - }, - "type": { - "anyOf": [ - { "$ref": "#/definitions/simpleTypes" }, - { - "type": "array", - "items": { "$ref": "#/definitions/simpleTypes" }, - "minItems": 1, - "uniqueItems": true - } - ] - }, - "allOf": { "$ref": "#/definitions/schemaArray" }, - "anyOf": { "$ref": "#/definitions/schemaArray" }, - "oneOf": { "$ref": "#/definitions/schemaArray" }, - "not": { "$ref": "#" } - }, - "dependencies": { - "exclusiveMaximum": [ "maximum" ], - "exclusiveMinimum": [ "minimum" ] - }, - "default": {} -} -` - -var modifiedTestJsonSchema = `{ - "id": "http://json-schema.org/draft-04/schema#", - "$schema": "http://json-schema.org/draft-04/schema", - "description": "Core schema meta-schema", - "definitions": { - "schemaArray": { - "type": "array", - "minItems": 1, - "items": { "$ref": "" } - }, - "positiveInteger": { - "type": "integer", - "minimum": 0 - }, - "positiveIntegerDefault0": { - "allOf": [ { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" }, { "default": 0 } ] - }, - "simpleTypes": { - "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ] - }, - "stringArray": { - "type": "array", - "items": { "type": "string" }, - "minItems": 1, - "uniqueItems": true - } - }, - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uri" - }, - "$schema": { - "type": "string", - "format": "uri" - }, - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "default": {}, - "multipleOf": { - "type": "number", - "minimum": 0, - "exclusiveMinimum": true - }, - "maximum": { - "type": "number" - }, - "exclusiveMaximum": { - "type": "boolean", - "default": false - }, - "minimum": { - "type": "number" - }, - "exclusiveMinimum": { - "type": "boolean", - "default": false - }, - "maxLength": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" }, - "minLength": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" }, - "pattern": { - "type": "string", - "format": "regex" - }, - "additionalItems": { - "anyOf": [ - { "type": "boolean" }, - { "$ref": "" } - ], - "default": {} - }, - "items": { - "anyOf": [ - { "$ref": "" }, - { "$ref": "http://json-schema.org/draft-04/schema#/definitions/schemaArray" } - ], - "default": {} - }, - "maxItems": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" }, - "minItems": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" }, - "uniqueItems": { - "type": "boolean", - "default": false - }, - "maxProperties": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" }, - "minProperties": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" }, - "required": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" }, - "additionalProperties": { - "anyOf": [ - { "type": "boolean" }, - { "$ref": "" } - ], - "default": {} - }, - "definitions": { - "type": "object", - "additionalProperties": { "$ref": "" }, - "default": {} - }, - "properties": { - "type": "object", - "additionalProperties": { "$ref": "" }, - "default": {} - }, - "patternProperties": { - "type": "object", - "additionalProperties": { "$ref": "" }, - "default": {} - }, - "dependencies": { - "type": "object", - "additionalProperties": { - "anyOf": [ - { "$ref": "" }, - { "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" } - ] - } - }, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true - }, - "type": { - "anyOf": [ - { "$ref": "http://json-schema.org/draft-04/schema#/definitions/simpleTypes" }, - { - "type": "array", - "items": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/simpleTypes" }, - "minItems": 1, - "uniqueItems": true - } - ] - }, - "allOf": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/schemaArray" }, - "anyOf": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/schemaArray" }, - "oneOf": { "$ref": "http://json-schema.org/draft-04/schema#/definitions/schemaArray" }, - "not": { "$ref": "" } - }, - "dependencies": { - "exclusiveMaximum": [ "maximum" ], - "exclusiveMinimum": [ "minimum" ] - }, - "default": {} -} -` - -func TestRefModifier(t *testing.T) { - sch := Schema{} - assert.NoError(t, json.Unmarshal([]byte(testJsonSchema), &sch)) - modifyRefs(&sch, "http://json-schema.org/draft-04/schema") - b, err := sch.MarshalJSON() - assert.NoError(t, err) - assert.JSONEq(t, modifiedTestJsonSchema, string(b)) -} diff --git a/vendor/github.com/go-openapi/spec/response.go b/vendor/github.com/go-openapi/spec/response.go deleted file mode 100644 index a32b039eaf..0000000000 --- a/vendor/github.com/go-openapi/spec/response.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" -) - -// ResponseProps properties specific to a response -type ResponseProps struct { - Description string `json:"description,omitempty"` - Schema *Schema `json:"schema,omitempty"` - Headers map[string]Header `json:"headers,omitempty"` - Examples map[string]interface{} `json:"examples,omitempty"` -} - -// Response describes a single response from an API Operation. -// -// For more information: http://goo.gl/8us55a#responseObject -type Response struct { - Refable - ResponseProps - VendorExtensible -} - -// JSONLookup look up a value by the json property name -func (p Response) JSONLookup(token string) (interface{}, error) { - if ex, ok := p.Extensions[token]; ok { - return &ex, nil - } - if token == "$ref" { - return &p.Ref, nil - } - r, _, err := jsonpointer.GetForToken(p.ResponseProps, token) - return r, err -} - -// UnmarshalJSON hydrates this items instance with the data from JSON -func (r *Response) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &r.ResponseProps); err != nil { - return err - } - if err := json.Unmarshal(data, &r.Refable); err != nil { - return err - } - if err := json.Unmarshal(data, &r.VendorExtensible); err != nil { - return err - } - return nil -} - -// MarshalJSON converts this items object to JSON -func (r Response) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(r.ResponseProps) - if err != nil { - return nil, err - } - b2, err := json.Marshal(r.Refable) - if err != nil { - return nil, err - } - b3, err := json.Marshal(r.VendorExtensible) - if err != nil { - return nil, err - } - return swag.ConcatJSON(b1, b2, b3), nil -} - -// NewResponse creates a new response instance -func NewResponse() *Response { - return new(Response) -} - -// ResponseRef creates a response as a json reference -func ResponseRef(url string) *Response { - resp := NewResponse() - resp.Ref = MustCreateRef(url) - return resp -} - -// WithDescription sets the description on this response, allows for chaining -func (r *Response) WithDescription(description string) *Response { - r.Description = description - return r -} - -// WithSchema sets the schema on this response, allows for chaining. -// Passing a nil argument removes the schema from this response -func (r *Response) WithSchema(schema *Schema) *Response { - r.Schema = schema - return r -} - -// AddHeader adds a header to this response -func (r *Response) AddHeader(name string, header *Header) *Response { - if header == nil { - return r.RemoveHeader(name) - } - if r.Headers == nil { - r.Headers = make(map[string]Header) - } - r.Headers[name] = *header - return r -} - -// RemoveHeader removes a header from this response -func (r *Response) RemoveHeader(name string) *Response { - delete(r.Headers, name) - return r -} - -// AddExample adds an example to this response -func (r *Response) AddExample(mediaType string, example interface{}) *Response { - if r.Examples == nil { - r.Examples = make(map[string]interface{}) - } - r.Examples[mediaType] = example - return r -} diff --git a/vendor/github.com/go-openapi/spec/response_test.go b/vendor/github.com/go-openapi/spec/response_test.go deleted file mode 100644 index 2a3ca40935..0000000000 --- a/vendor/github.com/go-openapi/spec/response_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2017 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -var response = Response{ - Refable: Refable{Ref: MustCreateRef("Dog")}, - VendorExtensible: VendorExtensible{ - Extensions: map[string]interface{}{ - "x-go-name": "PutDogExists", - }, - }, - ResponseProps: ResponseProps{ - Description: "Dog exists", - Schema: &Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}, - }, -} - -var responseJSON = `{ - "$ref": "Dog", - "x-go-name": "PutDogExists", - "description": "Dog exists", - "schema": { - "type": "string" - } -}` - -func TestIntegrationResponse(t *testing.T) { - var actual Response - if assert.NoError(t, json.Unmarshal([]byte(responseJSON), &actual)) { - assert.EqualValues(t, actual, response) - } - - assertParsesJSON(t, responseJSON, response) -} diff --git a/vendor/github.com/go-openapi/spec/responses.go b/vendor/github.com/go-openapi/spec/responses.go deleted file mode 100644 index 3ab06697f2..0000000000 --- a/vendor/github.com/go-openapi/spec/responses.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "fmt" - "reflect" - "strconv" - - "github.com/go-openapi/swag" -) - -// Responses is a container for the expected responses of an operation. -// The container maps a HTTP response code to the expected response. -// It is not expected from the documentation to necessarily cover all possible HTTP response codes, -// since they may not be known in advance. However, it is expected from the documentation to cover -// a successful operation response and any known errors. -// -// The `default` can be used a default response object for all HTTP codes that are not covered -// individually by the specification. -// -// The `Responses Object` MUST contain at least one response code, and it SHOULD be the response -// for a successful operation call. -// -// For more information: http://goo.gl/8us55a#responsesObject -type Responses struct { - VendorExtensible - ResponsesProps -} - -// JSONLookup implements an interface to customize json pointer lookup -func (r Responses) JSONLookup(token string) (interface{}, error) { - if token == "default" { - return r.Default, nil - } - if ex, ok := r.Extensions[token]; ok { - return &ex, nil - } - if i, err := strconv.Atoi(token); err == nil { - if scr, ok := r.StatusCodeResponses[i]; ok { - return scr, nil - } - } - return nil, fmt.Errorf("object has no field %q", token) -} - -// UnmarshalJSON hydrates this items instance with the data from JSON -func (r *Responses) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &r.ResponsesProps); err != nil { - return err - } - if err := json.Unmarshal(data, &r.VendorExtensible); err != nil { - return err - } - if reflect.DeepEqual(ResponsesProps{}, r.ResponsesProps) { - r.ResponsesProps = ResponsesProps{} - } - return nil -} - -// MarshalJSON converts this items object to JSON -func (r Responses) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(r.ResponsesProps) - if err != nil { - return nil, err - } - b2, err := json.Marshal(r.VendorExtensible) - if err != nil { - return nil, err - } - concated := swag.ConcatJSON(b1, b2) - return concated, nil -} - -type ResponsesProps struct { - Default *Response - StatusCodeResponses map[int]Response -} - -func (r ResponsesProps) MarshalJSON() ([]byte, error) { - toser := map[string]Response{} - if r.Default != nil { - toser["default"] = *r.Default - } - for k, v := range r.StatusCodeResponses { - toser[strconv.Itoa(k)] = v - } - return json.Marshal(toser) -} - -func (r *ResponsesProps) UnmarshalJSON(data []byte) error { - var res map[string]Response - if err := json.Unmarshal(data, &res); err != nil { - return nil - } - if v, ok := res["default"]; ok { - r.Default = &v - delete(res, "default") - } - for k, v := range res { - if nk, err := strconv.Atoi(k); err == nil { - if r.StatusCodeResponses == nil { - r.StatusCodeResponses = map[int]Response{} - } - r.StatusCodeResponses[nk] = v - } - } - return nil -} diff --git a/vendor/github.com/go-openapi/spec/schema.go b/vendor/github.com/go-openapi/spec/schema.go deleted file mode 100644 index 1cdcc163f1..0000000000 --- a/vendor/github.com/go-openapi/spec/schema.go +++ /dev/null @@ -1,628 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "fmt" - "net/url" - "strings" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" -) - -// BooleanProperty creates a boolean property -func BooleanProperty() *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"boolean"}}} -} - -// BoolProperty creates a boolean property -func BoolProperty() *Schema { return BooleanProperty() } - -// StringProperty creates a string property -func StringProperty() *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}}} -} - -// CharProperty creates a string property -func CharProperty() *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}}} -} - -// Float64Property creates a float64/double property -func Float64Property() *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"number"}, Format: "double"}} -} - -// Float32Property creates a float32/float property -func Float32Property() *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"number"}, Format: "float"}} -} - -// Int8Property creates an int8 property -func Int8Property() *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int8"}} -} - -// Int16Property creates an int16 property -func Int16Property() *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int16"}} -} - -// Int32Property creates an int32 property -func Int32Property() *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int32"}} -} - -// Int64Property creates an int64 property -func Int64Property() *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int64"}} -} - -// StrFmtProperty creates a property for the named string format -func StrFmtProperty(format string) *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}, Format: format}} -} - -// DateProperty creates a date property -func DateProperty() *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}, Format: "date"}} -} - -// DateTimeProperty creates a date time property -func DateTimeProperty() *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}, Format: "date-time"}} -} - -// MapProperty creates a map property -func MapProperty(property *Schema) *Schema { - return &Schema{SchemaProps: SchemaProps{Type: []string{"object"}, AdditionalProperties: &SchemaOrBool{Allows: true, Schema: property}}} -} - -// RefProperty creates a ref property -func RefProperty(name string) *Schema { - return &Schema{SchemaProps: SchemaProps{Ref: MustCreateRef(name)}} -} - -// RefSchema creates a ref property -func RefSchema(name string) *Schema { - return &Schema{SchemaProps: SchemaProps{Ref: MustCreateRef(name)}} -} - -// ArrayProperty creates an array property -func ArrayProperty(items *Schema) *Schema { - if items == nil { - return &Schema{SchemaProps: SchemaProps{Type: []string{"array"}}} - } - return &Schema{SchemaProps: SchemaProps{Items: &SchemaOrArray{Schema: items}, Type: []string{"array"}}} -} - -// ComposedSchema creates a schema with allOf -func ComposedSchema(schemas ...Schema) *Schema { - s := new(Schema) - s.AllOf = schemas - return s -} - -// SchemaURL represents a schema url -type SchemaURL string - -// MarshalJSON marshal this to JSON -func (r SchemaURL) MarshalJSON() ([]byte, error) { - if r == "" { - return []byte("{}"), nil - } - v := map[string]interface{}{"$schema": string(r)} - return json.Marshal(v) -} - -// UnmarshalJSON unmarshal this from JSON -func (r *SchemaURL) UnmarshalJSON(data []byte) error { - var v map[string]interface{} - if err := json.Unmarshal(data, &v); err != nil { - return err - } - if v == nil { - return nil - } - if vv, ok := v["$schema"]; ok { - if str, ok := vv.(string); ok { - u, err := url.Parse(str) - if err != nil { - return err - } - - *r = SchemaURL(u.String()) - } - } - return nil -} - -// type ExtraSchemaProps map[string]interface{} - -// // JSONSchema represents a structure that is a json schema draft 04 -// type JSONSchema struct { -// SchemaProps -// ExtraSchemaProps -// } - -// // MarshalJSON marshal this to JSON -// func (s JSONSchema) MarshalJSON() ([]byte, error) { -// b1, err := json.Marshal(s.SchemaProps) -// if err != nil { -// return nil, err -// } -// b2, err := s.Ref.MarshalJSON() -// if err != nil { -// return nil, err -// } -// b3, err := s.Schema.MarshalJSON() -// if err != nil { -// return nil, err -// } -// b4, err := json.Marshal(s.ExtraSchemaProps) -// if err != nil { -// return nil, err -// } -// return swag.ConcatJSON(b1, b2, b3, b4), nil -// } - -// // UnmarshalJSON marshal this from JSON -// func (s *JSONSchema) UnmarshalJSON(data []byte) error { -// var sch JSONSchema -// if err := json.Unmarshal(data, &sch.SchemaProps); err != nil { -// return err -// } -// if err := json.Unmarshal(data, &sch.Ref); err != nil { -// return err -// } -// if err := json.Unmarshal(data, &sch.Schema); err != nil { -// return err -// } -// if err := json.Unmarshal(data, &sch.ExtraSchemaProps); err != nil { -// return err -// } -// *s = sch -// return nil -// } - -type SchemaProps struct { - ID string `json:"id,omitempty"` - Ref Ref `json:"-"` - Schema SchemaURL `json:"-"` - Description string `json:"description,omitempty"` - Type StringOrArray `json:"type,omitempty"` - Format string `json:"format,omitempty"` - Title string `json:"title,omitempty"` - Default interface{} `json:"default,omitempty"` - Maximum *float64 `json:"maximum,omitempty"` - ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` - Minimum *float64 `json:"minimum,omitempty"` - ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` - MaxLength *int64 `json:"maxLength,omitempty"` - MinLength *int64 `json:"minLength,omitempty"` - Pattern string `json:"pattern,omitempty"` - MaxItems *int64 `json:"maxItems,omitempty"` - MinItems *int64 `json:"minItems,omitempty"` - UniqueItems bool `json:"uniqueItems,omitempty"` - MultipleOf *float64 `json:"multipleOf,omitempty"` - Enum []interface{} `json:"enum,omitempty"` - MaxProperties *int64 `json:"maxProperties,omitempty"` - MinProperties *int64 `json:"minProperties,omitempty"` - Required []string `json:"required,omitempty"` - Items *SchemaOrArray `json:"items,omitempty"` - AllOf []Schema `json:"allOf,omitempty"` - OneOf []Schema `json:"oneOf,omitempty"` - AnyOf []Schema `json:"anyOf,omitempty"` - Not *Schema `json:"not,omitempty"` - Properties map[string]Schema `json:"properties,omitempty"` - AdditionalProperties *SchemaOrBool `json:"additionalProperties,omitempty"` - PatternProperties map[string]Schema `json:"patternProperties,omitempty"` - Dependencies Dependencies `json:"dependencies,omitempty"` - AdditionalItems *SchemaOrBool `json:"additionalItems,omitempty"` - Definitions Definitions `json:"definitions,omitempty"` -} - -type SwaggerSchemaProps struct { - Discriminator string `json:"discriminator,omitempty"` - ReadOnly bool `json:"readOnly,omitempty"` - XML *XMLObject `json:"xml,omitempty"` - ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` - Example interface{} `json:"example,omitempty"` -} - -// Schema the schema object allows the definition of input and output data types. -// These types can be objects, but also primitives and arrays. -// This object is based on the [JSON Schema Specification Draft 4](http://json-schema.org/) -// and uses a predefined subset of it. -// On top of this subset, there are extensions provided by this specification to allow for more complete documentation. -// -// For more information: http://goo.gl/8us55a#schemaObject -type Schema struct { - VendorExtensible - SchemaProps - SwaggerSchemaProps - ExtraProps map[string]interface{} `json:"-"` -} - -// JSONLookup implements an interface to customize json pointer lookup -func (s Schema) JSONLookup(token string) (interface{}, error) { - if ex, ok := s.Extensions[token]; ok { - return &ex, nil - } - - if ex, ok := s.ExtraProps[token]; ok { - return &ex, nil - } - - r, _, err := jsonpointer.GetForToken(s.SchemaProps, token) - if r != nil || (err != nil && !strings.HasPrefix(err.Error(), "object has no field")) { - return r, err - } - r, _, err = jsonpointer.GetForToken(s.SwaggerSchemaProps, token) - return r, err -} - -// WithID sets the id for this schema, allows for chaining -func (s *Schema) WithID(id string) *Schema { - s.ID = id - return s -} - -// WithTitle sets the title for this schema, allows for chaining -func (s *Schema) WithTitle(title string) *Schema { - s.Title = title - return s -} - -// WithDescription sets the description for this schema, allows for chaining -func (s *Schema) WithDescription(description string) *Schema { - s.Description = description - return s -} - -// WithProperties sets the properties for this schema -func (s *Schema) WithProperties(schemas map[string]Schema) *Schema { - s.Properties = schemas - return s -} - -// SetProperty sets a property on this schema -func (s *Schema) SetProperty(name string, schema Schema) *Schema { - if s.Properties == nil { - s.Properties = make(map[string]Schema) - } - s.Properties[name] = schema - return s -} - -// WithAllOf sets the all of property -func (s *Schema) WithAllOf(schemas ...Schema) *Schema { - s.AllOf = schemas - return s -} - -// WithMaxProperties sets the max number of properties an object can have -func (s *Schema) WithMaxProperties(max int64) *Schema { - s.MaxProperties = &max - return s -} - -// WithMinProperties sets the min number of properties an object must have -func (s *Schema) WithMinProperties(min int64) *Schema { - s.MinProperties = &min - return s -} - -// Typed sets the type of this schema for a single value item -func (s *Schema) Typed(tpe, format string) *Schema { - s.Type = []string{tpe} - s.Format = format - return s -} - -// AddType adds a type with potential format to the types for this schema -func (s *Schema) AddType(tpe, format string) *Schema { - s.Type = append(s.Type, tpe) - if format != "" { - s.Format = format - } - return s -} - -// CollectionOf a fluent builder method for an array parameter -func (s *Schema) CollectionOf(items Schema) *Schema { - s.Type = []string{"array"} - s.Items = &SchemaOrArray{Schema: &items} - return s -} - -// WithDefault sets the default value on this parameter -func (s *Schema) WithDefault(defaultValue interface{}) *Schema { - s.Default = defaultValue - return s -} - -// WithRequired flags this parameter as required -func (s *Schema) WithRequired(items ...string) *Schema { - s.Required = items - return s -} - -// AddRequired adds field names to the required properties array -func (s *Schema) AddRequired(items ...string) *Schema { - s.Required = append(s.Required, items...) - return s -} - -// WithMaxLength sets a max length value -func (s *Schema) WithMaxLength(max int64) *Schema { - s.MaxLength = &max - return s -} - -// WithMinLength sets a min length value -func (s *Schema) WithMinLength(min int64) *Schema { - s.MinLength = &min - return s -} - -// WithPattern sets a pattern value -func (s *Schema) WithPattern(pattern string) *Schema { - s.Pattern = pattern - return s -} - -// WithMultipleOf sets a multiple of value -func (s *Schema) WithMultipleOf(number float64) *Schema { - s.MultipleOf = &number - return s -} - -// WithMaximum sets a maximum number value -func (s *Schema) WithMaximum(max float64, exclusive bool) *Schema { - s.Maximum = &max - s.ExclusiveMaximum = exclusive - return s -} - -// WithMinimum sets a minimum number value -func (s *Schema) WithMinimum(min float64, exclusive bool) *Schema { - s.Minimum = &min - s.ExclusiveMinimum = exclusive - return s -} - -// WithEnum sets a the enum values (replace) -func (s *Schema) WithEnum(values ...interface{}) *Schema { - s.Enum = append([]interface{}{}, values...) - return s -} - -// WithMaxItems sets the max items -func (s *Schema) WithMaxItems(size int64) *Schema { - s.MaxItems = &size - return s -} - -// WithMinItems sets the min items -func (s *Schema) WithMinItems(size int64) *Schema { - s.MinItems = &size - return s -} - -// UniqueValues dictates that this array can only have unique items -func (s *Schema) UniqueValues() *Schema { - s.UniqueItems = true - return s -} - -// AllowDuplicates this array can have duplicates -func (s *Schema) AllowDuplicates() *Schema { - s.UniqueItems = false - return s -} - -// AddToAllOf adds a schema to the allOf property -func (s *Schema) AddToAllOf(schemas ...Schema) *Schema { - s.AllOf = append(s.AllOf, schemas...) - return s -} - -// WithDiscriminator sets the name of the discriminator field -func (s *Schema) WithDiscriminator(discriminator string) *Schema { - s.Discriminator = discriminator - return s -} - -// AsReadOnly flags this schema as readonly -func (s *Schema) AsReadOnly() *Schema { - s.ReadOnly = true - return s -} - -// AsWritable flags this schema as writeable (not read-only) -func (s *Schema) AsWritable() *Schema { - s.ReadOnly = false - return s -} - -// WithExample sets the example for this schema -func (s *Schema) WithExample(example interface{}) *Schema { - s.Example = example - return s -} - -// WithExternalDocs sets/removes the external docs for/from this schema. -// When you pass empty strings as params the external documents will be removed. -// When you pass non-empty string as one value then those values will be used on the external docs object. -// So when you pass a non-empty description, you should also pass the url and vice versa. -func (s *Schema) WithExternalDocs(description, url string) *Schema { - if description == "" && url == "" { - s.ExternalDocs = nil - return s - } - - if s.ExternalDocs == nil { - s.ExternalDocs = &ExternalDocumentation{} - } - s.ExternalDocs.Description = description - s.ExternalDocs.URL = url - return s -} - -// WithXMLName sets the xml name for the object -func (s *Schema) WithXMLName(name string) *Schema { - if s.XML == nil { - s.XML = new(XMLObject) - } - s.XML.Name = name - return s -} - -// WithXMLNamespace sets the xml namespace for the object -func (s *Schema) WithXMLNamespace(namespace string) *Schema { - if s.XML == nil { - s.XML = new(XMLObject) - } - s.XML.Namespace = namespace - return s -} - -// WithXMLPrefix sets the xml prefix for the object -func (s *Schema) WithXMLPrefix(prefix string) *Schema { - if s.XML == nil { - s.XML = new(XMLObject) - } - s.XML.Prefix = prefix - return s -} - -// AsXMLAttribute flags this object as xml attribute -func (s *Schema) AsXMLAttribute() *Schema { - if s.XML == nil { - s.XML = new(XMLObject) - } - s.XML.Attribute = true - return s -} - -// AsXMLElement flags this object as an xml node -func (s *Schema) AsXMLElement() *Schema { - if s.XML == nil { - s.XML = new(XMLObject) - } - s.XML.Attribute = false - return s -} - -// AsWrappedXML flags this object as wrapped, this is mostly useful for array types -func (s *Schema) AsWrappedXML() *Schema { - if s.XML == nil { - s.XML = new(XMLObject) - } - s.XML.Wrapped = true - return s -} - -// AsUnwrappedXML flags this object as an xml node -func (s *Schema) AsUnwrappedXML() *Schema { - if s.XML == nil { - s.XML = new(XMLObject) - } - s.XML.Wrapped = false - return s -} - -// MarshalJSON marshal this to JSON -func (s Schema) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(s.SchemaProps) - if err != nil { - return nil, fmt.Errorf("schema props %v", err) - } - b2, err := json.Marshal(s.VendorExtensible) - if err != nil { - return nil, fmt.Errorf("vendor props %v", err) - } - b3, err := s.Ref.MarshalJSON() - if err != nil { - return nil, fmt.Errorf("ref prop %v", err) - } - b4, err := s.Schema.MarshalJSON() - if err != nil { - return nil, fmt.Errorf("schema prop %v", err) - } - b5, err := json.Marshal(s.SwaggerSchemaProps) - if err != nil { - return nil, fmt.Errorf("common validations %v", err) - } - var b6 []byte - if s.ExtraProps != nil { - jj, err := json.Marshal(s.ExtraProps) - if err != nil { - return nil, fmt.Errorf("extra props %v", err) - } - b6 = jj - } - return swag.ConcatJSON(b1, b2, b3, b4, b5, b6), nil -} - -// UnmarshalJSON marshal this from JSON -func (s *Schema) UnmarshalJSON(data []byte) error { - var sch Schema - if err := json.Unmarshal(data, &sch.SchemaProps); err != nil { - return err - } - if err := json.Unmarshal(data, &sch.Ref); err != nil { - return err - } - if err := json.Unmarshal(data, &sch.Schema); err != nil { - return err - } - if err := json.Unmarshal(data, &sch.SwaggerSchemaProps); err != nil { - return err - } - - var d map[string]interface{} - if err := json.Unmarshal(data, &d); err != nil { - return err - } - - delete(d, "$ref") - delete(d, "$schema") - for _, pn := range swag.DefaultJSONNameProvider.GetJSONNames(s) { - delete(d, pn) - } - - for k, vv := range d { - lk := strings.ToLower(k) - if strings.HasPrefix(lk, "x-") { - if sch.Extensions == nil { - sch.Extensions = map[string]interface{}{} - } - sch.Extensions[k] = vv - continue - } - if sch.ExtraProps == nil { - sch.ExtraProps = map[string]interface{}{} - } - sch.ExtraProps[k] = vv - } - - *s = sch - - return nil -} diff --git a/vendor/github.com/go-openapi/spec/schema_test.go b/vendor/github.com/go-openapi/spec/schema_test.go deleted file mode 100644 index 2e49fbc159..0000000000 --- a/vendor/github.com/go-openapi/spec/schema_test.go +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -var schema = Schema{ - VendorExtensible: VendorExtensible{Extensions: map[string]interface{}{"x-framework": "go-swagger"}}, - SchemaProps: SchemaProps{ - Ref: MustCreateRef("Cat"), - Type: []string{"string"}, - Format: "date", - Description: "the description of this schema", - Title: "the title", - Default: "blah", - Maximum: float64Ptr(100), - ExclusiveMaximum: true, - ExclusiveMinimum: true, - Minimum: float64Ptr(5), - MaxLength: int64Ptr(100), - MinLength: int64Ptr(5), - Pattern: "\\w{1,5}\\w+", - MaxItems: int64Ptr(100), - MinItems: int64Ptr(5), - UniqueItems: true, - MultipleOf: float64Ptr(5), - Enum: []interface{}{"hello", "world"}, - MaxProperties: int64Ptr(5), - MinProperties: int64Ptr(1), - Required: []string{"id", "name"}, - Items: &SchemaOrArray{Schema: &Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}}, - AllOf: []Schema{Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}}, - Properties: map[string]Schema{ - "id": Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int64"}}, - "name": Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}, - }, - AdditionalProperties: &SchemaOrBool{Allows: true, Schema: &Schema{SchemaProps: SchemaProps{ - Type: []string{"integer"}, - Format: "int32", - }}}, - }, - SwaggerSchemaProps: SwaggerSchemaProps{ - Discriminator: "not this", - ReadOnly: true, - XML: &XMLObject{"sch", "io", "sw", true, true}, - ExternalDocs: &ExternalDocumentation{ - Description: "the documentation etc", - URL: "http://readthedocs.org/swagger", - }, - Example: []interface{}{ - map[string]interface{}{ - "id": 1, - "name": "a book", - }, - map[string]interface{}{ - "id": 2, - "name": "the thing", - }, - }, - }, -} - -var schemaJSON = `{ - "x-framework": "go-swagger", - "$ref": "Cat", - "description": "the description of this schema", - "maximum": 100, - "minimum": 5, - "exclusiveMaximum": true, - "exclusiveMinimum": true, - "maxLength": 100, - "minLength": 5, - "pattern": "\\w{1,5}\\w+", - "maxItems": 100, - "minItems": 5, - "uniqueItems": true, - "multipleOf": 5, - "enum": ["hello", "world"], - "type": "string", - "format": "date", - "title": "the title", - "default": "blah", - "maxProperties": 5, - "minProperties": 1, - "required": ["id", "name"], - "items": { - "type": "string" - }, - "allOf": [ - { - "type": "string" - } - ], - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - }, - "discriminator": "not this", - "readOnly": true, - "xml": { - "name": "sch", - "namespace": "io", - "prefix": "sw", - "wrapped": true, - "attribute": true - }, - "externalDocs": { - "description": "the documentation etc", - "url": "http://readthedocs.org/swagger" - }, - "example": [ - { - "id": 1, - "name": "a book" - }, - { - "id": 2, - "name": "the thing" - } - ], - "additionalProperties": { - "type": "integer", - "format": "int32" - } -} -` - -func TestSchema(t *testing.T) { - - expected := map[string]interface{}{} - json.Unmarshal([]byte(schemaJSON), &expected) - b, err := json.Marshal(schema) - if assert.NoError(t, err) { - var actual map[string]interface{} - json.Unmarshal(b, &actual) - assert.Equal(t, expected, actual) - } - - actual2 := Schema{} - if assert.NoError(t, json.Unmarshal([]byte(schemaJSON), &actual2)) { - assert.Equal(t, schema.Ref, actual2.Ref) - assert.Equal(t, schema.Description, actual2.Description) - assert.Equal(t, schema.Maximum, actual2.Maximum) - assert.Equal(t, schema.Minimum, actual2.Minimum) - assert.Equal(t, schema.ExclusiveMinimum, actual2.ExclusiveMinimum) - assert.Equal(t, schema.ExclusiveMaximum, actual2.ExclusiveMaximum) - assert.Equal(t, schema.MaxLength, actual2.MaxLength) - assert.Equal(t, schema.MinLength, actual2.MinLength) - assert.Equal(t, schema.Pattern, actual2.Pattern) - assert.Equal(t, schema.MaxItems, actual2.MaxItems) - assert.Equal(t, schema.MinItems, actual2.MinItems) - assert.True(t, actual2.UniqueItems) - assert.Equal(t, schema.MultipleOf, actual2.MultipleOf) - assert.Equal(t, schema.Enum, actual2.Enum) - assert.Equal(t, schema.Type, actual2.Type) - assert.Equal(t, schema.Format, actual2.Format) - assert.Equal(t, schema.Title, actual2.Title) - assert.Equal(t, schema.MaxProperties, actual2.MaxProperties) - assert.Equal(t, schema.MinProperties, actual2.MinProperties) - assert.Equal(t, schema.Required, actual2.Required) - assert.Equal(t, schema.Items, actual2.Items) - assert.Equal(t, schema.AllOf, actual2.AllOf) - assert.Equal(t, schema.Properties, actual2.Properties) - assert.Equal(t, schema.Discriminator, actual2.Discriminator) - assert.Equal(t, schema.ReadOnly, actual2.ReadOnly) - assert.Equal(t, schema.XML, actual2.XML) - assert.Equal(t, schema.ExternalDocs, actual2.ExternalDocs) - assert.Equal(t, schema.AdditionalProperties, actual2.AdditionalProperties) - assert.Equal(t, schema.Extensions, actual2.Extensions) - examples := actual2.Example.([]interface{}) - expEx := schema.Example.([]interface{}) - ex1 := examples[0].(map[string]interface{}) - ex2 := examples[1].(map[string]interface{}) - exp1 := expEx[0].(map[string]interface{}) - exp2 := expEx[1].(map[string]interface{}) - - assert.EqualValues(t, exp1["id"], ex1["id"]) - assert.Equal(t, exp1["name"], ex1["name"]) - assert.EqualValues(t, exp2["id"], ex2["id"]) - assert.Equal(t, exp2["name"], ex2["name"]) - } - -} diff --git a/vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json b/vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json deleted file mode 100644 index 85eb502a68..0000000000 --- a/vendor/github.com/go-openapi/spec/schemas/jsonschema-draft-04.json +++ /dev/null @@ -1,150 +0,0 @@ -{ - "id": "http://json-schema.org/draft-04/schema#", - "$schema": "http://json-schema.org/draft-04/schema#", - "description": "Core schema meta-schema", - "definitions": { - "schemaArray": { - "type": "array", - "minItems": 1, - "items": { "$ref": "#" } - }, - "positiveInteger": { - "type": "integer", - "minimum": 0 - }, - "positiveIntegerDefault0": { - "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ] - }, - "simpleTypes": { - "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ] - }, - "stringArray": { - "type": "array", - "items": { "type": "string" }, - "minItems": 1, - "uniqueItems": true - } - }, - "type": "object", - "properties": { - "id": { - "type": "string", - "format": "uri" - }, - "$schema": { - "type": "string", - "format": "uri" - }, - "title": { - "type": "string" - }, - "description": { - "type": "string" - }, - "default": {}, - "multipleOf": { - "type": "number", - "minimum": 0, - "exclusiveMinimum": true - }, - "maximum": { - "type": "number" - }, - "exclusiveMaximum": { - "type": "boolean", - "default": false - }, - "minimum": { - "type": "number" - }, - "exclusiveMinimum": { - "type": "boolean", - "default": false - }, - "maxLength": { "$ref": "#/definitions/positiveInteger" }, - "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" }, - "pattern": { - "type": "string", - "format": "regex" - }, - "additionalItems": { - "anyOf": [ - { "type": "boolean" }, - { "$ref": "#" } - ], - "default": {} - }, - "items": { - "anyOf": [ - { "$ref": "#" }, - { "$ref": "#/definitions/schemaArray" } - ], - "default": {} - }, - "maxItems": { "$ref": "#/definitions/positiveInteger" }, - "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" }, - "uniqueItems": { - "type": "boolean", - "default": false - }, - "maxProperties": { "$ref": "#/definitions/positiveInteger" }, - "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" }, - "required": { "$ref": "#/definitions/stringArray" }, - "additionalProperties": { - "anyOf": [ - { "type": "boolean" }, - { "$ref": "#" } - ], - "default": {} - }, - "definitions": { - "type": "object", - "additionalProperties": { "$ref": "#" }, - "default": {} - }, - "properties": { - "type": "object", - "additionalProperties": { "$ref": "#" }, - "default": {} - }, - "patternProperties": { - "type": "object", - "additionalProperties": { "$ref": "#" }, - "default": {} - }, - "dependencies": { - "type": "object", - "additionalProperties": { - "anyOf": [ - { "$ref": "#" }, - { "$ref": "#/definitions/stringArray" } - ] - } - }, - "enum": { - "type": "array", - "minItems": 1, - "uniqueItems": true - }, - "type": { - "anyOf": [ - { "$ref": "#/definitions/simpleTypes" }, - { - "type": "array", - "items": { "$ref": "#/definitions/simpleTypes" }, - "minItems": 1, - "uniqueItems": true - } - ] - }, - "allOf": { "$ref": "#/definitions/schemaArray" }, - "anyOf": { "$ref": "#/definitions/schemaArray" }, - "oneOf": { "$ref": "#/definitions/schemaArray" }, - "not": { "$ref": "#" } - }, - "dependencies": { - "exclusiveMaximum": [ "maximum" ], - "exclusiveMinimum": [ "minimum" ] - }, - "default": {} -} diff --git a/vendor/github.com/go-openapi/spec/schemas/v2/README.md b/vendor/github.com/go-openapi/spec/schemas/v2/README.md deleted file mode 100644 index 32c1b929b2..0000000000 --- a/vendor/github.com/go-openapi/spec/schemas/v2/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Swagger 2.0 specification schema - -This folder contains the Swagger 2.0 specification schema files maintained here: - -https://github.com/reverb/swagger-spec/blob/master/schemas/v2.0 \ No newline at end of file diff --git a/vendor/github.com/go-openapi/spec/schemas/v2/schema.json b/vendor/github.com/go-openapi/spec/schemas/v2/schema.json deleted file mode 100644 index 4dfccd07be..0000000000 --- a/vendor/github.com/go-openapi/spec/schemas/v2/schema.json +++ /dev/null @@ -1,1607 +0,0 @@ -{ - "title": "A JSON Schema for Swagger 2.0 API.", - "id": "http://swagger.io/v2/schema.json#", - "$schema": "http://json-schema.org/draft-04/schema#", - "type": "object", - "required": [ - "swagger", - "info", - "paths" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "swagger": { - "type": "string", - "enum": [ - "2.0" - ], - "description": "The Swagger version of this document." - }, - "info": { - "$ref": "#/definitions/info" - }, - "host": { - "type": "string", - "pattern": "^[^{}/ :\\\\]+(?::\\d+)?$", - "description": "The host (name or ip) of the API. Example: 'swagger.io'" - }, - "basePath": { - "type": "string", - "pattern": "^/", - "description": "The base path to the API. Example: '/api'." - }, - "schemes": { - "$ref": "#/definitions/schemesList" - }, - "consumes": { - "description": "A list of MIME types accepted by the API.", - "allOf": [ - { - "$ref": "#/definitions/mediaTypeList" - } - ] - }, - "produces": { - "description": "A list of MIME types the API can produce.", - "allOf": [ - { - "$ref": "#/definitions/mediaTypeList" - } - ] - }, - "paths": { - "$ref": "#/definitions/paths" - }, - "definitions": { - "$ref": "#/definitions/definitions" - }, - "parameters": { - "$ref": "#/definitions/parameterDefinitions" - }, - "responses": { - "$ref": "#/definitions/responseDefinitions" - }, - "security": { - "$ref": "#/definitions/security" - }, - "securityDefinitions": { - "$ref": "#/definitions/securityDefinitions" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/tag" - }, - "uniqueItems": true - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - } - }, - "definitions": { - "info": { - "type": "object", - "description": "General information about the API.", - "required": [ - "version", - "title" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "title": { - "type": "string", - "description": "A unique and precise title of the API." - }, - "version": { - "type": "string", - "description": "A semantic version number of the API." - }, - "description": { - "type": "string", - "description": "A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed." - }, - "termsOfService": { - "type": "string", - "description": "The terms of service for the API." - }, - "contact": { - "$ref": "#/definitions/contact" - }, - "license": { - "$ref": "#/definitions/license" - } - } - }, - "contact": { - "type": "object", - "description": "Contact information for the owners of the API.", - "additionalProperties": false, - "properties": { - "name": { - "type": "string", - "description": "The identifying name of the contact person/organization." - }, - "url": { - "type": "string", - "description": "The URL pointing to the contact information.", - "format": "uri" - }, - "email": { - "type": "string", - "description": "The email address of the contact person/organization.", - "format": "email" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "license": { - "type": "object", - "required": [ - "name" - ], - "additionalProperties": false, - "properties": { - "name": { - "type": "string", - "description": "The name of the license type. It's encouraged to use an OSI compatible license." - }, - "url": { - "type": "string", - "description": "The URL pointing to the license.", - "format": "uri" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "paths": { - "type": "object", - "description": "Relative paths to the individual endpoints. They must be relative to the 'basePath'.", - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - }, - "^/": { - "$ref": "#/definitions/pathItem" - } - }, - "additionalProperties": false - }, - "definitions": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schema" - }, - "description": "One or more JSON objects describing the schemas being consumed and produced by the API." - }, - "parameterDefinitions": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/parameter" - }, - "description": "One or more JSON representations for parameters" - }, - "responseDefinitions": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/response" - }, - "description": "One or more JSON representations for parameters" - }, - "externalDocs": { - "type": "object", - "additionalProperties": false, - "description": "information about external documentation", - "required": [ - "url" - ], - "properties": { - "description": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "examples": { - "type": "object", - "additionalProperties": true - }, - "mimeType": { - "type": "string", - "description": "The MIME type of the HTTP message." - }, - "operation": { - "type": "object", - "required": [ - "responses" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - }, - "summary": { - "type": "string", - "description": "A brief summary of the operation." - }, - "description": { - "type": "string", - "description": "A longer description of the operation, GitHub Flavored Markdown is allowed." - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - }, - "operationId": { - "type": "string", - "description": "A unique identifier of the operation." - }, - "produces": { - "description": "A list of MIME types the API can produce.", - "allOf": [ - { - "$ref": "#/definitions/mediaTypeList" - } - ] - }, - "consumes": { - "description": "A list of MIME types the API can consume.", - "allOf": [ - { - "$ref": "#/definitions/mediaTypeList" - } - ] - }, - "parameters": { - "$ref": "#/definitions/parametersList" - }, - "responses": { - "$ref": "#/definitions/responses" - }, - "schemes": { - "$ref": "#/definitions/schemesList" - }, - "deprecated": { - "type": "boolean", - "default": false - }, - "security": { - "$ref": "#/definitions/security" - } - } - }, - "pathItem": { - "type": "object", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "$ref": { - "type": "string" - }, - "get": { - "$ref": "#/definitions/operation" - }, - "put": { - "$ref": "#/definitions/operation" - }, - "post": { - "$ref": "#/definitions/operation" - }, - "delete": { - "$ref": "#/definitions/operation" - }, - "options": { - "$ref": "#/definitions/operation" - }, - "head": { - "$ref": "#/definitions/operation" - }, - "patch": { - "$ref": "#/definitions/operation" - }, - "parameters": { - "$ref": "#/definitions/parametersList" - } - } - }, - "responses": { - "type": "object", - "description": "Response objects names can either be any valid HTTP status code or 'default'.", - "minProperties": 1, - "additionalProperties": false, - "patternProperties": { - "^([0-9]{3})$|^(default)$": { - "$ref": "#/definitions/responseValue" - }, - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "not": { - "type": "object", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - } - }, - "responseValue": { - "oneOf": [ - { - "$ref": "#/definitions/response" - }, - { - "$ref": "#/definitions/jsonReference" - } - ] - }, - "response": { - "type": "object", - "required": [ - "description" - ], - "properties": { - "description": { - "type": "string" - }, - "schema": { - "oneOf": [ - { - "$ref": "#/definitions/schema" - }, - { - "$ref": "#/definitions/fileSchema" - } - ] - }, - "headers": { - "$ref": "#/definitions/headers" - }, - "examples": { - "$ref": "#/definitions/examples" - } - }, - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "headers": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/header" - } - }, - "header": { - "type": "object", - "additionalProperties": false, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "string", - "number", - "integer", - "boolean", - "array" - ] - }, - "format": { - "type": "string" - }, - "items": { - "$ref": "#/definitions/primitivesItems" - }, - "collectionFormat": { - "$ref": "#/definitions/collectionFormat" - }, - "default": { - "$ref": "#/definitions/default" - }, - "maximum": { - "$ref": "#/definitions/maximum" - }, - "exclusiveMaximum": { - "$ref": "#/definitions/exclusiveMaximum" - }, - "minimum": { - "$ref": "#/definitions/minimum" - }, - "exclusiveMinimum": { - "$ref": "#/definitions/exclusiveMinimum" - }, - "maxLength": { - "$ref": "#/definitions/maxLength" - }, - "minLength": { - "$ref": "#/definitions/minLength" - }, - "pattern": { - "$ref": "#/definitions/pattern" - }, - "maxItems": { - "$ref": "#/definitions/maxItems" - }, - "minItems": { - "$ref": "#/definitions/minItems" - }, - "uniqueItems": { - "$ref": "#/definitions/uniqueItems" - }, - "enum": { - "$ref": "#/definitions/enum" - }, - "multipleOf": { - "$ref": "#/definitions/multipleOf" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "vendorExtension": { - "description": "Any property starting with x- is valid.", - "additionalProperties": true, - "additionalItems": true - }, - "bodyParameter": { - "type": "object", - "required": [ - "name", - "in", - "schema" - ], - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "description": { - "type": "string", - "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." - }, - "name": { - "type": "string", - "description": "The name of the parameter." - }, - "in": { - "type": "string", - "description": "Determines the location of the parameter.", - "enum": [ - "body" - ] - }, - "required": { - "type": "boolean", - "description": "Determines whether or not this parameter is required or optional.", - "default": false - }, - "schema": { - "$ref": "#/definitions/schema" - } - }, - "additionalProperties": false - }, - "headerParameterSubSchema": { - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "required": { - "type": "boolean", - "description": "Determines whether or not this parameter is required or optional.", - "default": false - }, - "in": { - "type": "string", - "description": "Determines the location of the parameter.", - "enum": [ - "header" - ] - }, - "description": { - "type": "string", - "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." - }, - "name": { - "type": "string", - "description": "The name of the parameter." - }, - "type": { - "type": "string", - "enum": [ - "string", - "number", - "boolean", - "integer", - "array" - ] - }, - "format": { - "type": "string" - }, - "items": { - "$ref": "#/definitions/primitivesItems" - }, - "collectionFormat": { - "$ref": "#/definitions/collectionFormat" - }, - "default": { - "$ref": "#/definitions/default" - }, - "maximum": { - "$ref": "#/definitions/maximum" - }, - "exclusiveMaximum": { - "$ref": "#/definitions/exclusiveMaximum" - }, - "minimum": { - "$ref": "#/definitions/minimum" - }, - "exclusiveMinimum": { - "$ref": "#/definitions/exclusiveMinimum" - }, - "maxLength": { - "$ref": "#/definitions/maxLength" - }, - "minLength": { - "$ref": "#/definitions/minLength" - }, - "pattern": { - "$ref": "#/definitions/pattern" - }, - "maxItems": { - "$ref": "#/definitions/maxItems" - }, - "minItems": { - "$ref": "#/definitions/minItems" - }, - "uniqueItems": { - "$ref": "#/definitions/uniqueItems" - }, - "enum": { - "$ref": "#/definitions/enum" - }, - "multipleOf": { - "$ref": "#/definitions/multipleOf" - } - } - }, - "queryParameterSubSchema": { - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "required": { - "type": "boolean", - "description": "Determines whether or not this parameter is required or optional.", - "default": false - }, - "in": { - "type": "string", - "description": "Determines the location of the parameter.", - "enum": [ - "query" - ] - }, - "description": { - "type": "string", - "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." - }, - "name": { - "type": "string", - "description": "The name of the parameter." - }, - "allowEmptyValue": { - "type": "boolean", - "default": false, - "description": "allows sending a parameter by name only or with an empty value." - }, - "type": { - "type": "string", - "enum": [ - "string", - "number", - "boolean", - "integer", - "array" - ] - }, - "format": { - "type": "string" - }, - "items": { - "$ref": "#/definitions/primitivesItems" - }, - "collectionFormat": { - "$ref": "#/definitions/collectionFormatWithMulti" - }, - "default": { - "$ref": "#/definitions/default" - }, - "maximum": { - "$ref": "#/definitions/maximum" - }, - "exclusiveMaximum": { - "$ref": "#/definitions/exclusiveMaximum" - }, - "minimum": { - "$ref": "#/definitions/minimum" - }, - "exclusiveMinimum": { - "$ref": "#/definitions/exclusiveMinimum" - }, - "maxLength": { - "$ref": "#/definitions/maxLength" - }, - "minLength": { - "$ref": "#/definitions/minLength" - }, - "pattern": { - "$ref": "#/definitions/pattern" - }, - "maxItems": { - "$ref": "#/definitions/maxItems" - }, - "minItems": { - "$ref": "#/definitions/minItems" - }, - "uniqueItems": { - "$ref": "#/definitions/uniqueItems" - }, - "enum": { - "$ref": "#/definitions/enum" - }, - "multipleOf": { - "$ref": "#/definitions/multipleOf" - } - } - }, - "formDataParameterSubSchema": { - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "required": { - "type": "boolean", - "description": "Determines whether or not this parameter is required or optional.", - "default": false - }, - "in": { - "type": "string", - "description": "Determines the location of the parameter.", - "enum": [ - "formData" - ] - }, - "description": { - "type": "string", - "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." - }, - "name": { - "type": "string", - "description": "The name of the parameter." - }, - "allowEmptyValue": { - "type": "boolean", - "default": false, - "description": "allows sending a parameter by name only or with an empty value." - }, - "type": { - "type": "string", - "enum": [ - "string", - "number", - "boolean", - "integer", - "array", - "file" - ] - }, - "format": { - "type": "string" - }, - "items": { - "$ref": "#/definitions/primitivesItems" - }, - "collectionFormat": { - "$ref": "#/definitions/collectionFormatWithMulti" - }, - "default": { - "$ref": "#/definitions/default" - }, - "maximum": { - "$ref": "#/definitions/maximum" - }, - "exclusiveMaximum": { - "$ref": "#/definitions/exclusiveMaximum" - }, - "minimum": { - "$ref": "#/definitions/minimum" - }, - "exclusiveMinimum": { - "$ref": "#/definitions/exclusiveMinimum" - }, - "maxLength": { - "$ref": "#/definitions/maxLength" - }, - "minLength": { - "$ref": "#/definitions/minLength" - }, - "pattern": { - "$ref": "#/definitions/pattern" - }, - "maxItems": { - "$ref": "#/definitions/maxItems" - }, - "minItems": { - "$ref": "#/definitions/minItems" - }, - "uniqueItems": { - "$ref": "#/definitions/uniqueItems" - }, - "enum": { - "$ref": "#/definitions/enum" - }, - "multipleOf": { - "$ref": "#/definitions/multipleOf" - } - } - }, - "pathParameterSubSchema": { - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "required": [ - "required" - ], - "properties": { - "required": { - "type": "boolean", - "enum": [ - true - ], - "description": "Determines whether or not this parameter is required or optional." - }, - "in": { - "type": "string", - "description": "Determines the location of the parameter.", - "enum": [ - "path" - ] - }, - "description": { - "type": "string", - "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." - }, - "name": { - "type": "string", - "description": "The name of the parameter." - }, - "type": { - "type": "string", - "enum": [ - "string", - "number", - "boolean", - "integer", - "array" - ] - }, - "format": { - "type": "string" - }, - "items": { - "$ref": "#/definitions/primitivesItems" - }, - "collectionFormat": { - "$ref": "#/definitions/collectionFormat" - }, - "default": { - "$ref": "#/definitions/default" - }, - "maximum": { - "$ref": "#/definitions/maximum" - }, - "exclusiveMaximum": { - "$ref": "#/definitions/exclusiveMaximum" - }, - "minimum": { - "$ref": "#/definitions/minimum" - }, - "exclusiveMinimum": { - "$ref": "#/definitions/exclusiveMinimum" - }, - "maxLength": { - "$ref": "#/definitions/maxLength" - }, - "minLength": { - "$ref": "#/definitions/minLength" - }, - "pattern": { - "$ref": "#/definitions/pattern" - }, - "maxItems": { - "$ref": "#/definitions/maxItems" - }, - "minItems": { - "$ref": "#/definitions/minItems" - }, - "uniqueItems": { - "$ref": "#/definitions/uniqueItems" - }, - "enum": { - "$ref": "#/definitions/enum" - }, - "multipleOf": { - "$ref": "#/definitions/multipleOf" - } - } - }, - "nonBodyParameter": { - "type": "object", - "required": [ - "name", - "in", - "type" - ], - "oneOf": [ - { - "$ref": "#/definitions/headerParameterSubSchema" - }, - { - "$ref": "#/definitions/formDataParameterSubSchema" - }, - { - "$ref": "#/definitions/queryParameterSubSchema" - }, - { - "$ref": "#/definitions/pathParameterSubSchema" - } - ] - }, - "parameter": { - "oneOf": [ - { - "$ref": "#/definitions/bodyParameter" - }, - { - "$ref": "#/definitions/nonBodyParameter" - } - ] - }, - "schema": { - "type": "object", - "description": "A deterministic version of a JSON Schema object.", - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "$ref": { - "type": "string" - }, - "format": { - "type": "string" - }, - "title": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/title" - }, - "description": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/description" - }, - "default": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/default" - }, - "multipleOf": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" - }, - "maximum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" - }, - "exclusiveMaximum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" - }, - "minimum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" - }, - "exclusiveMinimum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" - }, - "maxLength": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" - }, - "minLength": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" - }, - "pattern": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" - }, - "maxItems": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" - }, - "minItems": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" - }, - "uniqueItems": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" - }, - "maxProperties": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" - }, - "minProperties": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" - }, - "required": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" - }, - "enum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" - }, - "additionalProperties": { - "anyOf": [ - { - "$ref": "#/definitions/schema" - }, - { - "type": "boolean" - } - ], - "default": {} - }, - "type": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/type" - }, - "items": { - "anyOf": [ - { - "$ref": "#/definitions/schema" - }, - { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/schema" - } - } - ], - "default": {} - }, - "allOf": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/schema" - } - }, - "properties": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schema" - }, - "default": {} - }, - "discriminator": { - "type": "string" - }, - "readOnly": { - "type": "boolean", - "default": false - }, - "xml": { - "$ref": "#/definitions/xml" - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - }, - "example": {} - }, - "additionalProperties": false - }, - "fileSchema": { - "type": "object", - "description": "A deterministic version of a JSON Schema object.", - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "required": [ - "type" - ], - "properties": { - "format": { - "type": "string" - }, - "title": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/title" - }, - "description": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/description" - }, - "default": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/default" - }, - "required": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" - }, - "type": { - "type": "string", - "enum": [ - "file" - ] - }, - "readOnly": { - "type": "boolean", - "default": false - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - }, - "example": {} - }, - "additionalProperties": false - }, - "primitivesItems": { - "type": "object", - "additionalProperties": false, - "properties": { - "type": { - "type": "string", - "enum": [ - "string", - "number", - "integer", - "boolean", - "array" - ] - }, - "format": { - "type": "string" - }, - "items": { - "$ref": "#/definitions/primitivesItems" - }, - "collectionFormat": { - "$ref": "#/definitions/collectionFormat" - }, - "default": { - "$ref": "#/definitions/default" - }, - "maximum": { - "$ref": "#/definitions/maximum" - }, - "exclusiveMaximum": { - "$ref": "#/definitions/exclusiveMaximum" - }, - "minimum": { - "$ref": "#/definitions/minimum" - }, - "exclusiveMinimum": { - "$ref": "#/definitions/exclusiveMinimum" - }, - "maxLength": { - "$ref": "#/definitions/maxLength" - }, - "minLength": { - "$ref": "#/definitions/minLength" - }, - "pattern": { - "$ref": "#/definitions/pattern" - }, - "maxItems": { - "$ref": "#/definitions/maxItems" - }, - "minItems": { - "$ref": "#/definitions/minItems" - }, - "uniqueItems": { - "$ref": "#/definitions/uniqueItems" - }, - "enum": { - "$ref": "#/definitions/enum" - }, - "multipleOf": { - "$ref": "#/definitions/multipleOf" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "security": { - "type": "array", - "items": { - "$ref": "#/definitions/securityRequirement" - }, - "uniqueItems": true - }, - "securityRequirement": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - } - }, - "xml": { - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - }, - "prefix": { - "type": "string" - }, - "attribute": { - "type": "boolean", - "default": false - }, - "wrapped": { - "type": "boolean", - "default": false - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "tag": { - "type": "object", - "additionalProperties": false, - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "securityDefinitions": { - "type": "object", - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/basicAuthenticationSecurity" - }, - { - "$ref": "#/definitions/apiKeySecurity" - }, - { - "$ref": "#/definitions/oauth2ImplicitSecurity" - }, - { - "$ref": "#/definitions/oauth2PasswordSecurity" - }, - { - "$ref": "#/definitions/oauth2ApplicationSecurity" - }, - { - "$ref": "#/definitions/oauth2AccessCodeSecurity" - } - ] - } - }, - "basicAuthenticationSecurity": { - "type": "object", - "additionalProperties": false, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "basic" - ] - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "apiKeySecurity": { - "type": "object", - "additionalProperties": false, - "required": [ - "type", - "name", - "in" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "apiKey" - ] - }, - "name": { - "type": "string" - }, - "in": { - "type": "string", - "enum": [ - "header", - "query" - ] - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "oauth2ImplicitSecurity": { - "type": "object", - "additionalProperties": false, - "required": [ - "type", - "flow", - "authorizationUrl" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "oauth2" - ] - }, - "flow": { - "type": "string", - "enum": [ - "implicit" - ] - }, - "scopes": { - "$ref": "#/definitions/oauth2Scopes" - }, - "authorizationUrl": { - "type": "string", - "format": "uri" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "oauth2PasswordSecurity": { - "type": "object", - "additionalProperties": false, - "required": [ - "type", - "flow", - "tokenUrl" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "oauth2" - ] - }, - "flow": { - "type": "string", - "enum": [ - "password" - ] - }, - "scopes": { - "$ref": "#/definitions/oauth2Scopes" - }, - "tokenUrl": { - "type": "string", - "format": "uri" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "oauth2ApplicationSecurity": { - "type": "object", - "additionalProperties": false, - "required": [ - "type", - "flow", - "tokenUrl" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "oauth2" - ] - }, - "flow": { - "type": "string", - "enum": [ - "application" - ] - }, - "scopes": { - "$ref": "#/definitions/oauth2Scopes" - }, - "tokenUrl": { - "type": "string", - "format": "uri" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "oauth2AccessCodeSecurity": { - "type": "object", - "additionalProperties": false, - "required": [ - "type", - "flow", - "authorizationUrl", - "tokenUrl" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "oauth2" - ] - }, - "flow": { - "type": "string", - "enum": [ - "accessCode" - ] - }, - "scopes": { - "$ref": "#/definitions/oauth2Scopes" - }, - "authorizationUrl": { - "type": "string", - "format": "uri" - }, - "tokenUrl": { - "type": "string", - "format": "uri" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "oauth2Scopes": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "mediaTypeList": { - "type": "array", - "items": { - "$ref": "#/definitions/mimeType" - }, - "uniqueItems": true - }, - "parametersList": { - "type": "array", - "description": "The parameters needed to send a valid API call.", - "additionalItems": false, - "items": { - "oneOf": [ - { - "$ref": "#/definitions/parameter" - }, - { - "$ref": "#/definitions/jsonReference" - } - ] - }, - "uniqueItems": true - }, - "schemesList": { - "type": "array", - "description": "The transfer protocol of the API.", - "items": { - "type": "string", - "enum": [ - "http", - "https", - "ws", - "wss" - ] - }, - "uniqueItems": true - }, - "collectionFormat": { - "type": "string", - "enum": [ - "csv", - "ssv", - "tsv", - "pipes" - ], - "default": "csv" - }, - "collectionFormatWithMulti": { - "type": "string", - "enum": [ - "csv", - "ssv", - "tsv", - "pipes", - "multi" - ], - "default": "csv" - }, - "title": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/title" - }, - "description": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/description" - }, - "default": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/default" - }, - "multipleOf": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" - }, - "maximum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" - }, - "exclusiveMaximum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" - }, - "minimum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" - }, - "exclusiveMinimum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" - }, - "maxLength": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" - }, - "minLength": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" - }, - "pattern": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" - }, - "maxItems": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" - }, - "minItems": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" - }, - "uniqueItems": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" - }, - "enum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" - }, - "jsonReference": { - "type": "object", - "required": [ - "$ref" - ], - "additionalProperties": false, - "properties": { - "$ref": { - "type": "string" - } - } - } - } -} diff --git a/vendor/github.com/go-openapi/spec/security_scheme.go b/vendor/github.com/go-openapi/spec/security_scheme.go deleted file mode 100644 index 22d4f10af2..0000000000 --- a/vendor/github.com/go-openapi/spec/security_scheme.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" -) - -const ( - basic = "basic" - apiKey = "apiKey" - oauth2 = "oauth2" - implicit = "implicit" - password = "password" - application = "application" - accessCode = "accessCode" -) - -// BasicAuth creates a basic auth security scheme -func BasicAuth() *SecurityScheme { - return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{Type: basic}} -} - -// APIKeyAuth creates an api key auth security scheme -func APIKeyAuth(fieldName, valueSource string) *SecurityScheme { - return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{Type: apiKey, Name: fieldName, In: valueSource}} -} - -// OAuth2Implicit creates an implicit flow oauth2 security scheme -func OAuth2Implicit(authorizationURL string) *SecurityScheme { - return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{ - Type: oauth2, - Flow: implicit, - AuthorizationURL: authorizationURL, - }} -} - -// OAuth2Password creates a password flow oauth2 security scheme -func OAuth2Password(tokenURL string) *SecurityScheme { - return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{ - Type: oauth2, - Flow: password, - TokenURL: tokenURL, - }} -} - -// OAuth2Application creates an application flow oauth2 security scheme -func OAuth2Application(tokenURL string) *SecurityScheme { - return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{ - Type: oauth2, - Flow: application, - TokenURL: tokenURL, - }} -} - -// OAuth2AccessToken creates an access token flow oauth2 security scheme -func OAuth2AccessToken(authorizationURL, tokenURL string) *SecurityScheme { - return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{ - Type: oauth2, - Flow: accessCode, - AuthorizationURL: authorizationURL, - TokenURL: tokenURL, - }} -} - -type SecuritySchemeProps struct { - Description string `json:"description,omitempty"` - Type string `json:"type"` - Name string `json:"name,omitempty"` // api key - In string `json:"in,omitempty"` // api key - Flow string `json:"flow,omitempty"` // oauth2 - AuthorizationURL string `json:"authorizationUrl,omitempty"` // oauth2 - TokenURL string `json:"tokenUrl,omitempty"` // oauth2 - Scopes map[string]string `json:"scopes,omitempty"` // oauth2 -} - -// AddScope adds a scope to this security scheme -func (s *SecuritySchemeProps) AddScope(scope, description string) { - if s.Scopes == nil { - s.Scopes = make(map[string]string) - } - s.Scopes[scope] = description -} - -// SecurityScheme allows the definition of a security scheme that can be used by the operations. -// Supported schemes are basic authentication, an API key (either as a header or as a query parameter) -// and OAuth2's common flows (implicit, password, application and access code). -// -// For more information: http://goo.gl/8us55a#securitySchemeObject -type SecurityScheme struct { - VendorExtensible - SecuritySchemeProps -} - -// JSONLookup implements an interface to customize json pointer lookup -func (s SecurityScheme) JSONLookup(token string) (interface{}, error) { - if ex, ok := s.Extensions[token]; ok { - return &ex, nil - } - - r, _, err := jsonpointer.GetForToken(s.SecuritySchemeProps, token) - return r, err -} - -// MarshalJSON marshal this to JSON -func (s SecurityScheme) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(s.SecuritySchemeProps) - if err != nil { - return nil, err - } - b2, err := json.Marshal(s.VendorExtensible) - if err != nil { - return nil, err - } - return swag.ConcatJSON(b1, b2), nil -} - -// UnmarshalJSON marshal this from JSON -func (s *SecurityScheme) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &s.SecuritySchemeProps); err != nil { - return err - } - if err := json.Unmarshal(data, &s.VendorExtensible); err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/go-openapi/spec/spec.go b/vendor/github.com/go-openapi/spec/spec.go deleted file mode 100644 index 0bb045bc06..0000000000 --- a/vendor/github.com/go-openapi/spec/spec.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import "encoding/json" - -//go:generate curl -L --progress -o ./schemas/v2/schema.json http://swagger.io/v2/schema.json -//go:generate curl -L --progress -o ./schemas/jsonschema-draft-04.json http://json-schema.org/draft-04/schema -//go:generate go-bindata -pkg=spec -prefix=./schemas -ignore=.*\.md ./schemas/... -//go:generate perl -pi -e s,Json,JSON,g bindata.go - -const ( - // SwaggerSchemaURL the url for the swagger 2.0 schema to validate specs - SwaggerSchemaURL = "http://swagger.io/v2/schema.json#" - // JSONSchemaURL the url for the json schema schema - JSONSchemaURL = "http://json-schema.org/draft-04/schema#" -) - -var ( - jsonSchema *Schema - swaggerSchema *Schema -) - -func init() { - jsonSchema = MustLoadJSONSchemaDraft04() - swaggerSchema = MustLoadSwagger20Schema() -} - -// MustLoadJSONSchemaDraft04 panics when Swagger20Schema returns an error -func MustLoadJSONSchemaDraft04() *Schema { - d, e := JSONSchemaDraft04() - if e != nil { - panic(e) - } - return d -} - -// JSONSchemaDraft04 loads the json schema document for json shema draft04 -func JSONSchemaDraft04() (*Schema, error) { - b, err := Asset("jsonschema-draft-04.json") - if err != nil { - return nil, err - } - - schema := new(Schema) - if err := json.Unmarshal(b, schema); err != nil { - return nil, err - } - return schema, nil -} - -// MustLoadSwagger20Schema panics when Swagger20Schema returns an error -func MustLoadSwagger20Schema() *Schema { - d, e := Swagger20Schema() - if e != nil { - panic(e) - } - return d -} - -// Swagger20Schema loads the swagger 2.0 schema from the embedded assets -func Swagger20Schema() (*Schema, error) { - - b, err := Asset("v2/schema.json") - if err != nil { - return nil, err - } - - schema := new(Schema) - if err := json.Unmarshal(b, schema); err != nil { - return nil, err - } - return schema, nil -} diff --git a/vendor/github.com/go-openapi/spec/structs_test.go b/vendor/github.com/go-openapi/spec/structs_test.go deleted file mode 100644 index bfa59ee03a..0000000000 --- a/vendor/github.com/go-openapi/spec/structs_test.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "reflect" - "testing" - - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v2" -) - -func assertSerializeJSON(t testing.TB, actual interface{}, expected string) bool { - ser, err := json.Marshal(actual) - if err != nil { - return assert.Fail(t, "unable to marshal to json (%s): %#v", err, actual) - } - return assert.Equal(t, string(ser), expected) -} - -func assertParsesJSON(t testing.TB, actual string, expected interface{}) bool { - tpe := reflect.TypeOf(expected) - var pointed bool - if tpe.Kind() == reflect.Ptr { - tpe = tpe.Elem() - pointed = true - } - - parsed := reflect.New(tpe) - err := json.Unmarshal([]byte(actual), parsed.Interface()) - if err != nil { - return assert.Fail(t, "unable to unmarshal from json (%s): %s", err, actual) - } - act := parsed.Interface() - if !pointed { - act = reflect.Indirect(parsed).Interface() - } - return assert.Equal(t, act, expected) -} - -func assertSerializeYAML(t testing.TB, actual interface{}, expected string) bool { - ser, err := yaml.Marshal(actual) - if err != nil { - return assert.Fail(t, "unable to marshal to yaml (%s): %#v", err, actual) - } - return assert.Equal(t, string(ser), expected) -} - -func assertParsesYAML(t testing.TB, actual string, expected interface{}) bool { - tpe := reflect.TypeOf(expected) - var pointed bool - if tpe.Kind() == reflect.Ptr { - tpe = tpe.Elem() - pointed = true - } - parsed := reflect.New(tpe) - err := yaml.Unmarshal([]byte(actual), parsed.Interface()) - if err != nil { - return assert.Fail(t, "unable to unmarshal from yaml (%s): %s", err, actual) - } - act := parsed.Interface() - if !pointed { - act = reflect.Indirect(parsed).Interface() - } - return assert.EqualValues(t, act, expected) -} - -func TestSerialization_SerializeJSON(t *testing.T) { - assertSerializeJSON(t, []string{"hello"}, "[\"hello\"]") - assertSerializeJSON(t, []string{"hello", "world", "and", "stuff"}, "[\"hello\",\"world\",\"and\",\"stuff\"]") - assertSerializeJSON(t, StringOrArray(nil), "null") - assertSerializeJSON(t, SchemaOrArray{Schemas: []Schema{Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}}}, "[{\"type\":\"string\"}]") - assertSerializeJSON(t, SchemaOrArray{ - Schemas: []Schema{ - Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}, - Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}, - }}, "[{\"type\":\"string\"},{\"type\":\"string\"}]") - assertSerializeJSON(t, SchemaOrArray{}, "null") -} - -func TestSerialization_DeserializeJSON(t *testing.T) { - // String - assertParsesJSON(t, "\"hello\"", StringOrArray([]string{"hello"})) - assertParsesJSON(t, "[\"hello\",\"world\",\"and\",\"stuff\"]", StringOrArray([]string{"hello", "world", "and", "stuff"})) - assertParsesJSON(t, "[\"hello\",\"world\",null,\"stuff\"]", StringOrArray([]string{"hello", "world", "", "stuff"})) - assertParsesJSON(t, "null", StringOrArray(nil)) - - // Schema - assertParsesJSON(t, "{\"type\":\"string\"}", SchemaOrArray{Schema: &Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}}) - assertParsesJSON(t, "[{\"type\":\"string\"},{\"type\":\"string\"}]", &SchemaOrArray{ - Schemas: []Schema{ - Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}, - Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}, - }, - }) - assertParsesJSON(t, "null", SchemaOrArray{}) -} diff --git a/vendor/github.com/go-openapi/spec/swagger.go b/vendor/github.com/go-openapi/spec/swagger.go deleted file mode 100644 index 23780c78a2..0000000000 --- a/vendor/github.com/go-openapi/spec/swagger.go +++ /dev/null @@ -1,317 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "fmt" - "strconv" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" -) - -// Swagger this is the root document object for the API specification. -// It combines what previously was the Resource Listing and API Declaration (version 1.2 and earlier) together into one document. -// -// For more information: http://goo.gl/8us55a#swagger-object- -type Swagger struct { - VendorExtensible - SwaggerProps -} - -// JSONLookup look up a value by the json property name -func (s Swagger) JSONLookup(token string) (interface{}, error) { - if ex, ok := s.Extensions[token]; ok { - return &ex, nil - } - r, _, err := jsonpointer.GetForToken(s.SwaggerProps, token) - return r, err -} - -// MarshalJSON marshals this swagger structure to json -func (s Swagger) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(s.SwaggerProps) - if err != nil { - return nil, err - } - b2, err := json.Marshal(s.VendorExtensible) - if err != nil { - return nil, err - } - return swag.ConcatJSON(b1, b2), nil -} - -// UnmarshalJSON unmarshals a swagger spec from json -func (s *Swagger) UnmarshalJSON(data []byte) error { - var sw Swagger - if err := json.Unmarshal(data, &sw.SwaggerProps); err != nil { - return err - } - if err := json.Unmarshal(data, &sw.VendorExtensible); err != nil { - return err - } - *s = sw - return nil -} - -type SwaggerProps struct { - ID string `json:"id,omitempty"` - Consumes []string `json:"consumes,omitempty"` - Produces []string `json:"produces,omitempty"` - Schemes []string `json:"schemes,omitempty"` // the scheme, when present must be from [http, https, ws, wss] - Swagger string `json:"swagger,omitempty"` - Info *Info `json:"info,omitempty"` - Host string `json:"host,omitempty"` - BasePath string `json:"basePath,omitempty"` // must start with a leading "/" - Paths *Paths `json:"paths"` // required - Definitions Definitions `json:"definitions,omitempty"` - Parameters map[string]Parameter `json:"parameters,omitempty"` - Responses map[string]Response `json:"responses,omitempty"` - SecurityDefinitions SecurityDefinitions `json:"securityDefinitions,omitempty"` - Security []map[string][]string `json:"security,omitempty"` - Tags []Tag `json:"tags,omitempty"` - ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` -} - -// Dependencies represent a dependencies property -type Dependencies map[string]SchemaOrStringArray - -// SchemaOrBool represents a schema or boolean value, is biased towards true for the boolean property -type SchemaOrBool struct { - Allows bool - Schema *Schema -} - -// JSONLookup implements an interface to customize json pointer lookup -func (s SchemaOrBool) JSONLookup(token string) (interface{}, error) { - if token == "allows" { - return s.Allows, nil - } - r, _, err := jsonpointer.GetForToken(s.Schema, token) - return r, err -} - -var jsTrue = []byte("true") -var jsFalse = []byte("false") - -// MarshalJSON convert this object to JSON -func (s SchemaOrBool) MarshalJSON() ([]byte, error) { - if s.Schema != nil { - return json.Marshal(s.Schema) - } - - if s.Schema == nil && !s.Allows { - return jsFalse, nil - } - return jsTrue, nil -} - -// UnmarshalJSON converts this bool or schema object from a JSON structure -func (s *SchemaOrBool) UnmarshalJSON(data []byte) error { - var nw SchemaOrBool - if len(data) >= 4 { - if data[0] == '{' { - var sch Schema - if err := json.Unmarshal(data, &sch); err != nil { - return err - } - nw.Schema = &sch - } - nw.Allows = !(data[0] == 'f' && data[1] == 'a' && data[2] == 'l' && data[3] == 's' && data[4] == 'e') - } - *s = nw - return nil -} - -// SchemaOrStringArray represents a schema or a string array -type SchemaOrStringArray struct { - Schema *Schema - Property []string -} - -// JSONLookup implements an interface to customize json pointer lookup -func (s SchemaOrStringArray) JSONLookup(token string) (interface{}, error) { - r, _, err := jsonpointer.GetForToken(s.Schema, token) - return r, err -} - -// MarshalJSON converts this schema object or array into JSON structure -func (s SchemaOrStringArray) MarshalJSON() ([]byte, error) { - if len(s.Property) > 0 { - return json.Marshal(s.Property) - } - if s.Schema != nil { - return json.Marshal(s.Schema) - } - return []byte("null"), nil -} - -// UnmarshalJSON converts this schema object or array from a JSON structure -func (s *SchemaOrStringArray) UnmarshalJSON(data []byte) error { - var first byte - if len(data) > 1 { - first = data[0] - } - var nw SchemaOrStringArray - if first == '{' { - var sch Schema - if err := json.Unmarshal(data, &sch); err != nil { - return err - } - nw.Schema = &sch - } - if first == '[' { - if err := json.Unmarshal(data, &nw.Property); err != nil { - return err - } - } - *s = nw - return nil -} - -// Definitions contains the models explicitly defined in this spec -// An object to hold data types that can be consumed and produced by operations. -// These data types can be primitives, arrays or models. -// -// For more information: http://goo.gl/8us55a#definitionsObject -type Definitions map[string]Schema - -// SecurityDefinitions a declaration of the security schemes available to be used in the specification. -// This does not enforce the security schemes on the operations and only serves to provide -// the relevant details for each scheme. -// -// For more information: http://goo.gl/8us55a#securityDefinitionsObject -type SecurityDefinitions map[string]*SecurityScheme - -// StringOrArray represents a value that can either be a string -// or an array of strings. Mainly here for serialization purposes -type StringOrArray []string - -// Contains returns true when the value is contained in the slice -func (s StringOrArray) Contains(value string) bool { - for _, str := range s { - if str == value { - return true - } - } - return false -} - -// JSONLookup implements an interface to customize json pointer lookup -func (s SchemaOrArray) JSONLookup(token string) (interface{}, error) { - if _, err := strconv.Atoi(token); err == nil { - r, _, err := jsonpointer.GetForToken(s.Schemas, token) - return r, err - } - r, _, err := jsonpointer.GetForToken(s.Schema, token) - return r, err -} - -// UnmarshalJSON unmarshals this string or array object from a JSON array or JSON string -func (s *StringOrArray) UnmarshalJSON(data []byte) error { - var first byte - if len(data) > 1 { - first = data[0] - } - - if first == '[' { - var parsed []string - if err := json.Unmarshal(data, &parsed); err != nil { - return err - } - *s = StringOrArray(parsed) - return nil - } - - var single interface{} - if err := json.Unmarshal(data, &single); err != nil { - return err - } - if single == nil { - return nil - } - switch single.(type) { - case string: - *s = StringOrArray([]string{single.(string)}) - return nil - default: - return fmt.Errorf("only string or array is allowed, not %T", single) - } -} - -// MarshalJSON converts this string or array to a JSON array or JSON string -func (s StringOrArray) MarshalJSON() ([]byte, error) { - if len(s) == 1 { - return json.Marshal([]string(s)[0]) - } - return json.Marshal([]string(s)) -} - -// SchemaOrArray represents a value that can either be a Schema -// or an array of Schema. Mainly here for serialization purposes -type SchemaOrArray struct { - Schema *Schema - Schemas []Schema -} - -// Len returns the number of schemas in this property -func (s SchemaOrArray) Len() int { - if s.Schema != nil { - return 1 - } - return len(s.Schemas) -} - -// ContainsType returns true when one of the schemas is of the specified type -func (s *SchemaOrArray) ContainsType(name string) bool { - if s.Schema != nil { - return s.Schema.Type != nil && s.Schema.Type.Contains(name) - } - return false -} - -// MarshalJSON converts this schema object or array into JSON structure -func (s SchemaOrArray) MarshalJSON() ([]byte, error) { - if len(s.Schemas) > 0 { - return json.Marshal(s.Schemas) - } - return json.Marshal(s.Schema) -} - -// UnmarshalJSON converts this schema object or array from a JSON structure -func (s *SchemaOrArray) UnmarshalJSON(data []byte) error { - var nw SchemaOrArray - var first byte - if len(data) > 1 { - first = data[0] - } - if first == '{' { - var sch Schema - if err := json.Unmarshal(data, &sch); err != nil { - return err - } - nw.Schema = &sch - } - if first == '[' { - if err := json.Unmarshal(data, &nw.Schemas); err != nil { - return err - } - } - *s = nw - return nil -} - -// vim:set ft=go noet sts=2 sw=2 ts=2: diff --git a/vendor/github.com/go-openapi/spec/swagger_test.go b/vendor/github.com/go-openapi/spec/swagger_test.go deleted file mode 100644 index f7b3d9022d..0000000000 --- a/vendor/github.com/go-openapi/spec/swagger_test.go +++ /dev/null @@ -1,365 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "fmt" - "reflect" - "testing" - - "github.com/go-openapi/swag" - "github.com/stretchr/testify/assert" -) - -var spec = Swagger{ - SwaggerProps: SwaggerProps{ - ID: "http://localhost:3849/api-docs", - Swagger: "2.0", - Consumes: []string{"application/json", "application/x-yaml"}, - Produces: []string{"application/json"}, - Schemes: []string{"http", "https"}, - Info: &info, - Host: "some.api.out.there", - BasePath: "/", - Paths: &paths, - Definitions: map[string]Schema{"Category": {SchemaProps: SchemaProps{Type: []string{"string"}}}}, - Parameters: map[string]Parameter{ - "categoryParam": {ParamProps: ParamProps{Name: "category", In: "query"}, SimpleSchema: SimpleSchema{Type: "string"}}, - }, - Responses: map[string]Response{ - "EmptyAnswer": { - ResponseProps: ResponseProps{ - Description: "no data to return for this operation", - }, - }, - }, - SecurityDefinitions: map[string]*SecurityScheme{ - "internalApiKey": APIKeyAuth("api_key", "header"), - }, - Security: []map[string][]string{ - {"internalApiKey": {}}, - }, - Tags: []Tag{NewTag("pets", "", nil)}, - ExternalDocs: &ExternalDocumentation{"the name", "the url"}, - }, - VendorExtensible: VendorExtensible{map[string]interface{}{ - "x-some-extension": "vendor", - "x-schemes": []interface{}{"unix", "amqp"}, - }}, -} - -var specJSON = `{ - "id": "http://localhost:3849/api-docs", - "consumes": ["application/json", "application/x-yaml"], - "produces": ["application/json"], - "schemes": ["http", "https"], - "swagger": "2.0", - "info": { - "contact": { - "name": "wordnik api team", - "url": "http://developer.wordnik.com" - }, - "description": "A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", - "license": { - "name": "Creative Commons 4.0 International", - "url": "http://creativecommons.org/licenses/by/4.0/" - }, - "termsOfService": "http://helloreverb.com/terms/", - "title": "Swagger Sample API", - "version": "1.0.9-abcd", - "x-framework": "go-swagger" - }, - "host": "some.api.out.there", - "basePath": "/", - "paths": {"x-framework":"go-swagger","/":{"$ref":"cats"}}, - "definitions": { "Category": { "type": "string"} }, - "parameters": { - "categoryParam": { - "name": "category", - "in": "query", - "type": "string" - } - }, - "responses": { "EmptyAnswer": { "description": "no data to return for this operation" } }, - "securityDefinitions": { - "internalApiKey": { - "type": "apiKey", - "in": "header", - "name": "api_key" - } - }, - "security": [{"internalApiKey":[]}], - "tags": [{"name":"pets"}], - "externalDocs": {"description":"the name","url":"the url"}, - "x-some-extension": "vendor", - "x-schemes": ["unix","amqp"] -}` - -// -// func verifySpecSerialize(specJSON []byte, spec Swagger) { -// expected := map[string]interface{}{} -// json.Unmarshal(specJSON, &expected) -// b, err := json.MarshalIndent(spec, "", " ") -// So(err, ShouldBeNil) -// var actual map[string]interface{} -// err = json.Unmarshal(b, &actual) -// So(err, ShouldBeNil) -// compareSpecMaps(actual, expected) -// } - -func assertEquivalent(t testing.TB, actual, expected interface{}) bool { - if actual == nil || expected == nil || reflect.DeepEqual(actual, expected) { - return true - } - - actualType := reflect.TypeOf(actual) - expectedType := reflect.TypeOf(expected) - if reflect.TypeOf(actual).ConvertibleTo(expectedType) { - expectedValue := reflect.ValueOf(expected) - if swag.IsZero(expectedValue) && swag.IsZero(reflect.ValueOf(actual)) { - return true - } - - // Attempt comparison after type conversion - if reflect.DeepEqual(actual, expectedValue.Convert(actualType).Interface()) { - return true - } - } - - // Last ditch effort - if fmt.Sprintf("%#v", expected) == fmt.Sprintf("%#v", actual) { - return true - } - errFmt := "Expected: '%T(%#v)'\nActual: '%T(%#v)'\n(Should be equivalent)!" - return assert.Fail(t, errFmt, expected, expected, actual, actual) -} - -func ShouldBeEquivalentTo(actual interface{}, expecteds ...interface{}) string { - expected := expecteds[0] - if actual == nil || expected == nil { - return "" - } - - if reflect.DeepEqual(expected, actual) { - return "" - } - - actualType := reflect.TypeOf(actual) - expectedType := reflect.TypeOf(expected) - if reflect.TypeOf(actual).ConvertibleTo(expectedType) { - expectedValue := reflect.ValueOf(expected) - if swag.IsZero(expectedValue) && swag.IsZero(reflect.ValueOf(actual)) { - return "" - } - - // Attempt comparison after type conversion - if reflect.DeepEqual(actual, expectedValue.Convert(actualType).Interface()) { - return "" - } - } - - // Last ditch effort - if fmt.Sprintf("%#v", expected) == fmt.Sprintf("%#v", actual) { - return "" - } - errFmt := "Expected: '%T(%#v)'\nActual: '%T(%#v)'\n(Should be equivalent)!" - return fmt.Sprintf(errFmt, expected, expected, actual, actual) - -} - -func assertSpecMaps(t testing.TB, actual, expected map[string]interface{}) bool { - res := true - if id, ok := expected["id"]; ok { - res = assert.Equal(t, id, actual["id"]) - } - res = res && assert.Equal(t, expected["consumes"], actual["consumes"]) - res = res && assert.Equal(t, expected["produces"], actual["produces"]) - res = res && assert.Equal(t, expected["schemes"], actual["schemes"]) - res = res && assert.Equal(t, expected["swagger"], actual["swagger"]) - res = res && assert.Equal(t, expected["info"], actual["info"]) - res = res && assert.Equal(t, expected["host"], actual["host"]) - res = res && assert.Equal(t, expected["basePath"], actual["basePath"]) - res = res && assert.Equal(t, expected["paths"], actual["paths"]) - res = res && assert.Equal(t, expected["definitions"], actual["definitions"]) - res = res && assert.Equal(t, expected["responses"], actual["responses"]) - res = res && assert.Equal(t, expected["securityDefinitions"], actual["securityDefinitions"]) - res = res && assert.Equal(t, expected["tags"], actual["tags"]) - res = res && assert.Equal(t, expected["externalDocs"], actual["externalDocs"]) - res = res && assert.Equal(t, expected["x-some-extension"], actual["x-some-extension"]) - res = res && assert.Equal(t, expected["x-schemes"], actual["x-schemes"]) - - return res -} - -// -// func compareSpecMaps(actual, expected map[string]interface{}) { -// if id, ok := expected["id"]; ok { -// So(actual["id"], ShouldEqual, id) -// } -// //So(actual["$schema"], ShouldEqual, SwaggerSchemaURL) -// So(actual["consumes"], ShouldResemble, expected["consumes"]) -// So(actual["produces"], ShouldResemble, expected["produces"]) -// So(actual["schemes"], ShouldResemble, expected["schemes"]) -// So(actual["swagger"], ShouldEqual, expected["swagger"]) -// So(actual["info"], ShouldResemble, expected["info"]) -// So(actual["host"], ShouldEqual, expected["host"]) -// So(actual["basePath"], ShouldEqual, expected["basePath"]) -// So(actual["paths"], ShouldBeEquivalentTo, expected["paths"]) -// So(actual["definitions"], ShouldBeEquivalentTo, expected["definitions"]) -// So(actual["responses"], ShouldBeEquivalentTo, expected["responses"]) -// So(actual["securityDefinitions"], ShouldResemble, expected["securityDefinitions"]) -// So(actual["tags"], ShouldResemble, expected["tags"]) -// So(actual["externalDocs"], ShouldResemble, expected["externalDocs"]) -// So(actual["x-some-extension"], ShouldResemble, expected["x-some-extension"]) -// So(actual["x-schemes"], ShouldResemble, expected["x-schemes"]) -// } - -func assertSpecs(t testing.TB, actual, expected Swagger) bool { - expected.Swagger = "2.0" - return assert.Equal(t, actual, expected) -} - -// -// func compareSpecs(actual Swagger, spec Swagger) { -// spec.Swagger = "2.0" -// So(actual, ShouldBeEquivalentTo, spec) -// } - -func assertSpecJSON(t testing.TB, specJSON []byte) bool { - var expected map[string]interface{} - if !assert.NoError(t, json.Unmarshal(specJSON, &expected)) { - return false - } - - obj := Swagger{} - if !assert.NoError(t, json.Unmarshal(specJSON, &obj)) { - return false - } - - cb, err := json.MarshalIndent(obj, "", " ") - if assert.NoError(t, err) { - return false - } - var actual map[string]interface{} - if !assert.NoError(t, json.Unmarshal(cb, &actual)) { - return false - } - return assertSpecMaps(t, actual, expected) -} - -// func verifySpecJSON(specJSON []byte) { -// //Println() -// //Println("json to verify", string(specJson)) -// var expected map[string]interface{} -// err := json.Unmarshal(specJSON, &expected) -// So(err, ShouldBeNil) -// -// obj := Swagger{} -// err = json.Unmarshal(specJSON, &obj) -// So(err, ShouldBeNil) -// -// //spew.Dump(obj) -// -// cb, err := json.MarshalIndent(obj, "", " ") -// So(err, ShouldBeNil) -// //Println() -// //Println("Marshalling to json returned", string(cb)) -// -// var actual map[string]interface{} -// err = json.Unmarshal(cb, &actual) -// So(err, ShouldBeNil) -// //Println() -// //spew.Dump(expected) -// //spew.Dump(actual) -// //fmt.Printf("comparing %s\n\t%#v\nto\n\t%#+v\n", fileName, expected, actual) -// compareSpecMaps(actual, expected) -// } - -func TestSwaggerSpec_Serialize(t *testing.T) { - expected := make(map[string]interface{}) - json.Unmarshal([]byte(specJSON), &expected) - b, err := json.MarshalIndent(spec, "", " ") - if assert.NoError(t, err) { - var actual map[string]interface{} - err := json.Unmarshal(b, &actual) - if assert.NoError(t, err) { - assert.EqualValues(t, actual, expected) - } - } -} - -func TestSwaggerSpec_Deserialize(t *testing.T) { - var actual Swagger - err := json.Unmarshal([]byte(specJSON), &actual) - if assert.NoError(t, err) { - assert.EqualValues(t, actual, spec) - } -} - -func TestVendorExtensionStringSlice(t *testing.T) { - var actual Swagger - err := json.Unmarshal([]byte(specJSON), &actual) - if assert.NoError(t, err) { - schemes, ok := actual.Extensions.GetStringSlice("x-schemes") - if assert.True(t, ok) { - assert.EqualValues(t, []string{"unix", "amqp"}, schemes) - } - } -} - -func TestOptionalSwaggerProps_Serialize(t *testing.T) { - minimalJsonSpec := []byte(`{ - "swagger": "2.0", - "info": { - "version": "0.0.0", - "title": "Simple API" - }, - "paths": { - "/": { - "get": { - "responses": { - "200": { - "description": "OK" - } - } - } - } - } -}`) - - var minimalSpec Swagger - err := json.Unmarshal(minimalJsonSpec, &minimalSpec) - if assert.NoError(t, err) { - bytes, err := json.Marshal(&minimalSpec) - if assert.NoError(t, err) { - var ms map[string]interface{} - if err := json.Unmarshal(bytes, &ms); assert.NoError(t, err) { - assert.NotContains(t, ms, "consumes") - assert.NotContains(t, ms, "produces") - assert.NotContains(t, ms, "schemes") - assert.NotContains(t, ms, "host") - assert.NotContains(t, ms, "basePath") - assert.NotContains(t, ms, "definitions") - assert.NotContains(t, ms, "parameters") - assert.NotContains(t, ms, "responses") - assert.NotContains(t, ms, "securityDefinitions") - assert.NotContains(t, ms, "security") - assert.NotContains(t, ms, "tags") - assert.NotContains(t, ms, "externalDocs") - } - } - } -} diff --git a/vendor/github.com/go-openapi/spec/tag.go b/vendor/github.com/go-openapi/spec/tag.go deleted file mode 100644 index 97f555840c..0000000000 --- a/vendor/github.com/go-openapi/spec/tag.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - - "github.com/go-openapi/jsonpointer" - "github.com/go-openapi/swag" -) - -type TagProps struct { - Description string `json:"description,omitempty"` - Name string `json:"name,omitempty"` - ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` -} - -// NewTag creates a new tag -func NewTag(name, description string, externalDocs *ExternalDocumentation) Tag { - return Tag{TagProps: TagProps{description, name, externalDocs}} -} - -// Tag allows adding meta data to a single tag that is used by the [Operation Object](http://goo.gl/8us55a#operationObject). -// It is not mandatory to have a Tag Object per tag used there. -// -// For more information: http://goo.gl/8us55a#tagObject -type Tag struct { - VendorExtensible - TagProps -} - -// JSONLookup implements an interface to customize json pointer lookup -func (t Tag) JSONLookup(token string) (interface{}, error) { - if ex, ok := t.Extensions[token]; ok { - return &ex, nil - } - - r, _, err := jsonpointer.GetForToken(t.TagProps, token) - return r, err -} - -// MarshalJSON marshal this to JSON -func (t Tag) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(t.TagProps) - if err != nil { - return nil, err - } - b2, err := json.Marshal(t.VendorExtensible) - if err != nil { - return nil, err - } - return swag.ConcatJSON(b1, b2), nil -} - -// UnmarshalJSON marshal this from JSON -func (t *Tag) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &t.TagProps); err != nil { - return err - } - return json.Unmarshal(data, &t.VendorExtensible) -} diff --git a/vendor/github.com/go-openapi/spec/xml_object.go b/vendor/github.com/go-openapi/spec/xml_object.go deleted file mode 100644 index 945a46703d..0000000000 --- a/vendor/github.com/go-openapi/spec/xml_object.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -// XMLObject a metadata object that allows for more fine-tuned XML model definitions. -// -// For more information: http://goo.gl/8us55a#xmlObject -type XMLObject struct { - Name string `json:"name,omitempty"` - Namespace string `json:"namespace,omitempty"` - Prefix string `json:"prefix,omitempty"` - Attribute bool `json:"attribute,omitempty"` - Wrapped bool `json:"wrapped,omitempty"` -} - -// WithName sets the xml name for the object -func (x *XMLObject) WithName(name string) *XMLObject { - x.Name = name - return x -} - -// WithNamespace sets the xml namespace for the object -func (x *XMLObject) WithNamespace(namespace string) *XMLObject { - x.Namespace = namespace - return x -} - -// WithPrefix sets the xml prefix for the object -func (x *XMLObject) WithPrefix(prefix string) *XMLObject { - x.Prefix = prefix - return x -} - -// AsAttribute flags this object as xml attribute -func (x *XMLObject) AsAttribute() *XMLObject { - x.Attribute = true - return x -} - -// AsElement flags this object as an xml node -func (x *XMLObject) AsElement() *XMLObject { - x.Attribute = false - return x -} - -// AsWrapped flags this object as wrapped, this is mostly useful for array types -func (x *XMLObject) AsWrapped() *XMLObject { - x.Wrapped = true - return x -} - -// AsUnwrapped flags this object as an xml node -func (x *XMLObject) AsUnwrapped() *XMLObject { - x.Wrapped = false - return x -} diff --git a/vendor/github.com/go-openapi/spec/xml_object_test.go b/vendor/github.com/go-openapi/spec/xml_object_test.go deleted file mode 100644 index fda3b10841..0000000000 --- a/vendor/github.com/go-openapi/spec/xml_object_test.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package spec - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestXmlObject_Serialize(t *testing.T) { - obj1 := XMLObject{} - actual, err := json.Marshal(obj1) - if assert.NoError(t, err) { - assert.Equal(t, "{}", string(actual)) - } - - obj2 := XMLObject{ - Name: "the name", - Namespace: "the namespace", - Prefix: "the prefix", - Attribute: true, - Wrapped: true, - } - - actual, err = json.Marshal(obj2) - if assert.NoError(t, err) { - var ad map[string]interface{} - if assert.NoError(t, json.Unmarshal(actual, &ad)) { - assert.Equal(t, obj2.Name, ad["name"]) - assert.Equal(t, obj2.Namespace, ad["namespace"]) - assert.Equal(t, obj2.Prefix, ad["prefix"]) - assert.True(t, ad["attribute"].(bool)) - assert.True(t, ad["wrapped"].(bool)) - } - } -} - -func TestXmlObject_Deserialize(t *testing.T) { - expected := XMLObject{} - actual := XMLObject{} - if assert.NoError(t, json.Unmarshal([]byte("{}"), &actual)) { - assert.Equal(t, expected, actual) - } - - completed := `{"name":"the name","namespace":"the namespace","prefix":"the prefix","attribute":true,"wrapped":true}` - expected = XMLObject{"the name", "the namespace", "the prefix", true, true} - actual = XMLObject{} - if assert.NoError(t, json.Unmarshal([]byte(completed), &actual)) { - assert.Equal(t, expected, actual) - } -} diff --git a/vendor/github.com/go-openapi/swag/.gitignore b/vendor/github.com/go-openapi/swag/.gitignore deleted file mode 100644 index 769c244007..0000000000 --- a/vendor/github.com/go-openapi/swag/.gitignore +++ /dev/null @@ -1 +0,0 @@ -secrets.yml diff --git a/vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md b/vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md deleted file mode 100644 index 9322b065e3..0000000000 --- a/vendor/github.com/go-openapi/swag/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,74 +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, gender identity and expression, level of experience, -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 ivan+abuse@flanders.co.nz. 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 [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/go-openapi/swag/LICENSE b/vendor/github.com/go-openapi/swag/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/vendor/github.com/go-openapi/swag/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/go-openapi/swag/README.md b/vendor/github.com/go-openapi/swag/README.md deleted file mode 100644 index 5d43728e87..0000000000 --- a/vendor/github.com/go-openapi/swag/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Swag [![Build Status](https://travis-ci.org/go-openapi/swag.svg?branch=master)](https://travis-ci.org/go-openapi/swag) [![codecov](https://codecov.io/gh/go-openapi/swag/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/swag) [![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) - -[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/swag/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/swag?status.svg)](http://godoc.org/github.com/go-openapi/swag) - -Contains a bunch of helper functions: - -* convert between value and pointers for builtins -* convert from string to builtin -* fast json concatenation -* search in path -* load from file or http -* name manglin \ No newline at end of file diff --git a/vendor/github.com/go-openapi/swag/convert.go b/vendor/github.com/go-openapi/swag/convert.go deleted file mode 100644 index 2bf5ecbba2..0000000000 --- a/vendor/github.com/go-openapi/swag/convert.go +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package swag - -import ( - "math" - "strconv" - "strings" -) - -// same as ECMA Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER -const ( - maxJSONFloat = float64(1<<53 - 1) // 9007199254740991.0 2^53 - 1 - minJSONFloat = -float64(1<<53 - 1) //-9007199254740991.0 -2^53 - 1 -) - -// IsFloat64AJSONInteger allow for integers [-2^53, 2^53-1] inclusive -func IsFloat64AJSONInteger(f float64) bool { - if math.IsNaN(f) || math.IsInf(f, 0) || f < minJSONFloat || f > maxJSONFloat { - return false - } - - return f == float64(int64(f)) || f == float64(uint64(f)) -} - -var evaluatesAsTrue = map[string]struct{}{ - "true": struct{}{}, - "1": struct{}{}, - "yes": struct{}{}, - "ok": struct{}{}, - "y": struct{}{}, - "on": struct{}{}, - "selected": struct{}{}, - "checked": struct{}{}, - "t": struct{}{}, - "enabled": struct{}{}, -} - -// ConvertBool turn a string into a boolean -func ConvertBool(str string) (bool, error) { - _, ok := evaluatesAsTrue[strings.ToLower(str)] - return ok, nil -} - -// ConvertFloat32 turn a string into a float32 -func ConvertFloat32(str string) (float32, error) { - f, err := strconv.ParseFloat(str, 32) - if err != nil { - return 0, err - } - return float32(f), nil -} - -// ConvertFloat64 turn a string into a float64 -func ConvertFloat64(str string) (float64, error) { - return strconv.ParseFloat(str, 64) -} - -// ConvertInt8 turn a string into int8 boolean -func ConvertInt8(str string) (int8, error) { - i, err := strconv.ParseInt(str, 10, 8) - if err != nil { - return 0, err - } - return int8(i), nil -} - -// ConvertInt16 turn a string into a int16 -func ConvertInt16(str string) (int16, error) { - i, err := strconv.ParseInt(str, 10, 16) - if err != nil { - return 0, err - } - return int16(i), nil -} - -// ConvertInt32 turn a string into a int32 -func ConvertInt32(str string) (int32, error) { - i, err := strconv.ParseInt(str, 10, 32) - if err != nil { - return 0, err - } - return int32(i), nil -} - -// ConvertInt64 turn a string into a int64 -func ConvertInt64(str string) (int64, error) { - return strconv.ParseInt(str, 10, 64) -} - -// ConvertUint8 turn a string into a uint8 -func ConvertUint8(str string) (uint8, error) { - i, err := strconv.ParseUint(str, 10, 8) - if err != nil { - return 0, err - } - return uint8(i), nil -} - -// ConvertUint16 turn a string into a uint16 -func ConvertUint16(str string) (uint16, error) { - i, err := strconv.ParseUint(str, 10, 16) - if err != nil { - return 0, err - } - return uint16(i), nil -} - -// ConvertUint32 turn a string into a uint32 -func ConvertUint32(str string) (uint32, error) { - i, err := strconv.ParseUint(str, 10, 32) - if err != nil { - return 0, err - } - return uint32(i), nil -} - -// ConvertUint64 turn a string into a uint64 -func ConvertUint64(str string) (uint64, error) { - return strconv.ParseUint(str, 10, 64) -} - -// FormatBool turns a boolean into a string -func FormatBool(value bool) string { - return strconv.FormatBool(value) -} - -// FormatFloat32 turns a float32 into a string -func FormatFloat32(value float32) string { - return strconv.FormatFloat(float64(value), 'f', -1, 32) -} - -// FormatFloat64 turns a float64 into a string -func FormatFloat64(value float64) string { - return strconv.FormatFloat(value, 'f', -1, 64) -} - -// FormatInt8 turns an int8 into a string -func FormatInt8(value int8) string { - return strconv.FormatInt(int64(value), 10) -} - -// FormatInt16 turns an int16 into a string -func FormatInt16(value int16) string { - return strconv.FormatInt(int64(value), 10) -} - -// FormatInt32 turns an int32 into a string -func FormatInt32(value int32) string { - return strconv.Itoa(int(value)) -} - -// FormatInt64 turns an int64 into a string -func FormatInt64(value int64) string { - return strconv.FormatInt(value, 10) -} - -// FormatUint8 turns an uint8 into a string -func FormatUint8(value uint8) string { - return strconv.FormatUint(uint64(value), 10) -} - -// FormatUint16 turns an uint16 into a string -func FormatUint16(value uint16) string { - return strconv.FormatUint(uint64(value), 10) -} - -// FormatUint32 turns an uint32 into a string -func FormatUint32(value uint32) string { - return strconv.FormatUint(uint64(value), 10) -} - -// FormatUint64 turns an uint64 into a string -func FormatUint64(value uint64) string { - return strconv.FormatUint(value, 10) -} diff --git a/vendor/github.com/go-openapi/swag/convert_test.go b/vendor/github.com/go-openapi/swag/convert_test.go deleted file mode 100644 index 2f00732366..0000000000 --- a/vendor/github.com/go-openapi/swag/convert_test.go +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package swag - -import ( - "math" - "strconv" - "testing" - - "github.com/stretchr/testify/assert" -) - -// These are really dumb tests - -func TestConvertBool(t *testing.T) { - for k := range evaluatesAsTrue { - r, err := ConvertBool(k) - if assert.NoError(t, err) { - assert.True(t, r) - } - } - for _, k := range []string{"a", "", "0", "false", "unchecked"} { - r, err := ConvertBool(k) - if assert.NoError(t, err) { - assert.False(t, r) - } - } -} - -func TestConvertFloat32(t *testing.T) { - validFloats := []float32{1.0, -1, math.MaxFloat32, math.SmallestNonzeroFloat32, 0, 5.494430303} - invalidFloats := []string{"a", strconv.FormatFloat(math.MaxFloat64, 'f', -1, 64), "true"} - - for _, f := range validFloats { - c, err := ConvertFloat32(FormatFloat32(f)) - if assert.NoError(t, err) { - assert.EqualValues(t, f, c) - } - } - for _, f := range invalidFloats { - _, err := ConvertFloat32(f) - assert.Error(t, err, "expected '"+f+"' to generate an error") - } -} - -func TestConvertFloat64(t *testing.T) { - validFloats := []float64{1.0, -1, float64(math.MaxFloat32), float64(math.SmallestNonzeroFloat32), math.MaxFloat64, math.SmallestNonzeroFloat64, 0, 5.494430303} - invalidFloats := []string{"a", "true"} - - for _, f := range validFloats { - c, err := ConvertFloat64(FormatFloat64(f)) - if assert.NoError(t, err) { - assert.EqualValues(t, f, c) - } - } - for _, f := range invalidFloats { - _, err := ConvertFloat64(f) - assert.Error(t, err, "expected '"+f+"' to generate an error") - } -} - -func TestConvertInt8(t *testing.T) { - validInts := []int8{0, 1, -1, math.MaxInt8, math.MinInt8} - invalidInts := []string{"1.233", "a", "false", strconv.Itoa(int(math.MaxInt64))} - - for _, f := range validInts { - c, err := ConvertInt8(FormatInt8(f)) - if assert.NoError(t, err) { - assert.EqualValues(t, f, c) - } - } - for _, f := range invalidInts { - _, err := ConvertInt8(f) - assert.Error(t, err, "expected '"+f+"' to generate an error") - } -} - -func TestConvertInt16(t *testing.T) { - validInts := []int16{0, 1, -1, math.MaxInt8, math.MinInt8, math.MaxInt16, math.MinInt16} - invalidInts := []string{"1.233", "a", "false", strconv.Itoa(int(math.MaxInt64))} - - for _, f := range validInts { - c, err := ConvertInt16(FormatInt16(f)) - if assert.NoError(t, err) { - assert.EqualValues(t, f, c) - } - } - for _, f := range invalidInts { - _, err := ConvertInt16(f) - assert.Error(t, err, "expected '"+f+"' to generate an error") - } -} - -func TestConvertInt32(t *testing.T) { - validInts := []int32{0, 1, -1, math.MaxInt8, math.MinInt8, math.MaxInt16, math.MinInt16, math.MinInt32, math.MaxInt32} - invalidInts := []string{"1.233", "a", "false", strconv.Itoa(int(math.MaxInt64))} - - for _, f := range validInts { - c, err := ConvertInt32(FormatInt32(f)) - if assert.NoError(t, err) { - assert.EqualValues(t, f, c) - } - } - for _, f := range invalidInts { - _, err := ConvertInt32(f) - assert.Error(t, err, "expected '"+f+"' to generate an error") - } -} - -func TestConvertInt64(t *testing.T) { - validInts := []int64{0, 1, -1, math.MaxInt8, math.MinInt8, math.MaxInt16, math.MinInt16, math.MinInt32, math.MaxInt32, math.MaxInt64, math.MinInt64} - invalidInts := []string{"1.233", "a", "false"} - - for _, f := range validInts { - c, err := ConvertInt64(FormatInt64(f)) - if assert.NoError(t, err) { - assert.EqualValues(t, f, c) - } - } - for _, f := range invalidInts { - _, err := ConvertInt64(f) - assert.Error(t, err, "expected '"+f+"' to generate an error") - } -} - -func TestConvertUint8(t *testing.T) { - validInts := []uint8{0, 1, math.MaxUint8} - invalidInts := []string{"1.233", "a", "false", strconv.FormatUint(math.MaxUint64, 10)} - - for _, f := range validInts { - c, err := ConvertUint8(FormatUint8(f)) - if assert.NoError(t, err) { - assert.EqualValues(t, f, c) - } - } - for _, f := range invalidInts { - _, err := ConvertUint8(f) - assert.Error(t, err, "expected '"+f+"' to generate an error") - } -} - -func TestConvertUint16(t *testing.T) { - validUints := []uint16{0, 1, math.MaxUint8, math.MaxUint16} - invalidUints := []string{"1.233", "a", "false", strconv.FormatUint(math.MaxUint64, 10)} - - for _, f := range validUints { - c, err := ConvertUint16(FormatUint16(f)) - if assert.NoError(t, err) { - assert.EqualValues(t, f, c) - } - } - for _, f := range invalidUints { - _, err := ConvertUint16(f) - assert.Error(t, err, "expected '"+f+"' to generate an error") - } -} - -func TestConvertUint32(t *testing.T) { - validUints := []uint32{0, 1, math.MaxUint8, math.MaxUint16, math.MaxUint32} - invalidUints := []string{"1.233", "a", "false", strconv.FormatUint(math.MaxUint64, 10)} - - for _, f := range validUints { - c, err := ConvertUint32(FormatUint32(f)) - if assert.NoError(t, err) { - assert.EqualValues(t, f, c) - } - } - for _, f := range invalidUints { - _, err := ConvertUint32(f) - assert.Error(t, err, "expected '"+f+"' to generate an error") - } -} - -func TestConvertUint64(t *testing.T) { - validUints := []uint64{0, 1, math.MaxUint8, math.MaxUint16, math.MaxUint32, math.MaxUint64} - invalidUints := []string{"1.233", "a", "false"} - - for _, f := range validUints { - c, err := ConvertUint64(FormatUint64(f)) - if assert.NoError(t, err) { - assert.EqualValues(t, f, c) - } - } - for _, f := range invalidUints { - _, err := ConvertUint64(f) - assert.Error(t, err, "expected '"+f+"' to generate an error") - } -} - -func TestIsFloat64AJSONInteger(t *testing.T) { - assert.False(t, IsFloat64AJSONInteger(math.Inf(1))) - assert.False(t, IsFloat64AJSONInteger(maxJSONFloat+1)) - - assert.False(t, IsFloat64AJSONInteger(minJSONFloat-1)) - assert.True(t, IsFloat64AJSONInteger(1.0)) - assert.True(t, IsFloat64AJSONInteger(maxJSONFloat)) - assert.True(t, IsFloat64AJSONInteger(minJSONFloat)) -} - -func TestFormatBool(t *testing.T) { - assert.Equal(t, "true", FormatBool(true)) - assert.Equal(t, "false", FormatBool(false)) -} diff --git a/vendor/github.com/go-openapi/swag/convert_types.go b/vendor/github.com/go-openapi/swag/convert_types.go deleted file mode 100644 index c95e4e78bd..0000000000 --- a/vendor/github.com/go-openapi/swag/convert_types.go +++ /dev/null @@ -1,595 +0,0 @@ -package swag - -import "time" - -// This file was taken from the aws go sdk - -// String returns a pointer to of the string value passed in. -func String(v string) *string { - return &v -} - -// StringValue returns the value of the string pointer passed in or -// "" if the pointer is nil. -func StringValue(v *string) string { - if v != nil { - return *v - } - return "" -} - -// StringSlice converts a slice of string values into a slice of -// string pointers -func StringSlice(src []string) []*string { - dst := make([]*string, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// StringValueSlice converts a slice of string pointers into a slice of -// string values -func StringValueSlice(src []*string) []string { - dst := make([]string, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// StringMap converts a string map of string values into a string -// map of string pointers -func StringMap(src map[string]string) map[string]*string { - dst := make(map[string]*string) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// StringValueMap converts a string map of string pointers into a string -// map of string values -func StringValueMap(src map[string]*string) map[string]string { - dst := make(map[string]string) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Bool returns a pointer to of the bool value passed in. -func Bool(v bool) *bool { - return &v -} - -// BoolValue returns the value of the bool pointer passed in or -// false if the pointer is nil. -func BoolValue(v *bool) bool { - if v != nil { - return *v - } - return false -} - -// BoolSlice converts a slice of bool values into a slice of -// bool pointers -func BoolSlice(src []bool) []*bool { - dst := make([]*bool, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// BoolValueSlice converts a slice of bool pointers into a slice of -// bool values -func BoolValueSlice(src []*bool) []bool { - dst := make([]bool, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// BoolMap converts a string map of bool values into a string -// map of bool pointers -func BoolMap(src map[string]bool) map[string]*bool { - dst := make(map[string]*bool) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// BoolValueMap converts a string map of bool pointers into a string -// map of bool values -func BoolValueMap(src map[string]*bool) map[string]bool { - dst := make(map[string]bool) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Int returns a pointer to of the int value passed in. -func Int(v int) *int { - return &v -} - -// IntValue returns the value of the int pointer passed in or -// 0 if the pointer is nil. -func IntValue(v *int) int { - if v != nil { - return *v - } - return 0 -} - -// IntSlice converts a slice of int values into a slice of -// int pointers -func IntSlice(src []int) []*int { - dst := make([]*int, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// IntValueSlice converts a slice of int pointers into a slice of -// int values -func IntValueSlice(src []*int) []int { - dst := make([]int, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// IntMap converts a string map of int values into a string -// map of int pointers -func IntMap(src map[string]int) map[string]*int { - dst := make(map[string]*int) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// IntValueMap converts a string map of int pointers into a string -// map of int values -func IntValueMap(src map[string]*int) map[string]int { - dst := make(map[string]int) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Int32 returns a pointer to of the int64 value passed in. -func Int32(v int32) *int32 { - return &v -} - -// Int32Value returns the value of the int64 pointer passed in or -// 0 if the pointer is nil. -func Int32Value(v *int32) int32 { - if v != nil { - return *v - } - return 0 -} - -// Int32Slice converts a slice of int64 values into a slice of -// int32 pointers -func Int32Slice(src []int32) []*int32 { - dst := make([]*int32, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// Int32ValueSlice converts a slice of int32 pointers into a slice of -// int32 values -func Int32ValueSlice(src []*int32) []int32 { - dst := make([]int32, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// Int32Map converts a string map of int32 values into a string -// map of int32 pointers -func Int32Map(src map[string]int32) map[string]*int32 { - dst := make(map[string]*int32) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// Int32ValueMap converts a string map of int32 pointers into a string -// map of int32 values -func Int32ValueMap(src map[string]*int32) map[string]int32 { - dst := make(map[string]int32) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Int64 returns a pointer to of the int64 value passed in. -func Int64(v int64) *int64 { - return &v -} - -// Int64Value returns the value of the int64 pointer passed in or -// 0 if the pointer is nil. -func Int64Value(v *int64) int64 { - if v != nil { - return *v - } - return 0 -} - -// Int64Slice converts a slice of int64 values into a slice of -// int64 pointers -func Int64Slice(src []int64) []*int64 { - dst := make([]*int64, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// Int64ValueSlice converts a slice of int64 pointers into a slice of -// int64 values -func Int64ValueSlice(src []*int64) []int64 { - dst := make([]int64, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// Int64Map converts a string map of int64 values into a string -// map of int64 pointers -func Int64Map(src map[string]int64) map[string]*int64 { - dst := make(map[string]*int64) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// Int64ValueMap converts a string map of int64 pointers into a string -// map of int64 values -func Int64ValueMap(src map[string]*int64) map[string]int64 { - dst := make(map[string]int64) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Uint returns a pouinter to of the uint value passed in. -func Uint(v uint) *uint { - return &v -} - -// UintValue returns the value of the uint pouinter passed in or -// 0 if the pouinter is nil. -func UintValue(v *uint) uint { - if v != nil { - return *v - } - return 0 -} - -// UintSlice converts a slice of uint values uinto a slice of -// uint pouinters -func UintSlice(src []uint) []*uint { - dst := make([]*uint, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// UintValueSlice converts a slice of uint pouinters uinto a slice of -// uint values -func UintValueSlice(src []*uint) []uint { - dst := make([]uint, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// UintMap converts a string map of uint values uinto a string -// map of uint pouinters -func UintMap(src map[string]uint) map[string]*uint { - dst := make(map[string]*uint) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// UintValueMap converts a string map of uint pouinters uinto a string -// map of uint values -func UintValueMap(src map[string]*uint) map[string]uint { - dst := make(map[string]uint) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Uint32 returns a pouinter to of the uint64 value passed in. -func Uint32(v uint32) *uint32 { - return &v -} - -// Uint32Value returns the value of the uint64 pouinter passed in or -// 0 if the pouinter is nil. -func Uint32Value(v *uint32) uint32 { - if v != nil { - return *v - } - return 0 -} - -// Uint32Slice converts a slice of uint64 values uinto a slice of -// uint32 pouinters -func Uint32Slice(src []uint32) []*uint32 { - dst := make([]*uint32, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// Uint32ValueSlice converts a slice of uint32 pouinters uinto a slice of -// uint32 values -func Uint32ValueSlice(src []*uint32) []uint32 { - dst := make([]uint32, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// Uint32Map converts a string map of uint32 values uinto a string -// map of uint32 pouinters -func Uint32Map(src map[string]uint32) map[string]*uint32 { - dst := make(map[string]*uint32) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// Uint32ValueMap converts a string map of uint32 pouinters uinto a string -// map of uint32 values -func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { - dst := make(map[string]uint32) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Uint64 returns a pouinter to of the uint64 value passed in. -func Uint64(v uint64) *uint64 { - return &v -} - -// Uint64Value returns the value of the uint64 pouinter passed in or -// 0 if the pouinter is nil. -func Uint64Value(v *uint64) uint64 { - if v != nil { - return *v - } - return 0 -} - -// Uint64Slice converts a slice of uint64 values uinto a slice of -// uint64 pouinters -func Uint64Slice(src []uint64) []*uint64 { - dst := make([]*uint64, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// Uint64ValueSlice converts a slice of uint64 pouinters uinto a slice of -// uint64 values -func Uint64ValueSlice(src []*uint64) []uint64 { - dst := make([]uint64, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// Uint64Map converts a string map of uint64 values uinto a string -// map of uint64 pouinters -func Uint64Map(src map[string]uint64) map[string]*uint64 { - dst := make(map[string]*uint64) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// Uint64ValueMap converts a string map of uint64 pouinters uinto a string -// map of uint64 values -func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { - dst := make(map[string]uint64) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Float64 returns a pointer to of the float64 value passed in. -func Float64(v float64) *float64 { - return &v -} - -// Float64Value returns the value of the float64 pointer passed in or -// 0 if the pointer is nil. -func Float64Value(v *float64) float64 { - if v != nil { - return *v - } - return 0 -} - -// Float64Slice converts a slice of float64 values into a slice of -// float64 pointers -func Float64Slice(src []float64) []*float64 { - dst := make([]*float64, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// Float64ValueSlice converts a slice of float64 pointers into a slice of -// float64 values -func Float64ValueSlice(src []*float64) []float64 { - dst := make([]float64, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// Float64Map converts a string map of float64 values into a string -// map of float64 pointers -func Float64Map(src map[string]float64) map[string]*float64 { - dst := make(map[string]*float64) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// Float64ValueMap converts a string map of float64 pointers into a string -// map of float64 values -func Float64ValueMap(src map[string]*float64) map[string]float64 { - dst := make(map[string]float64) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} - -// Time returns a pointer to of the time.Time value passed in. -func Time(v time.Time) *time.Time { - return &v -} - -// TimeValue returns the value of the time.Time pointer passed in or -// time.Time{} if the pointer is nil. -func TimeValue(v *time.Time) time.Time { - if v != nil { - return *v - } - return time.Time{} -} - -// TimeSlice converts a slice of time.Time values into a slice of -// time.Time pointers -func TimeSlice(src []time.Time) []*time.Time { - dst := make([]*time.Time, len(src)) - for i := 0; i < len(src); i++ { - dst[i] = &(src[i]) - } - return dst -} - -// TimeValueSlice converts a slice of time.Time pointers into a slice of -// time.Time values -func TimeValueSlice(src []*time.Time) []time.Time { - dst := make([]time.Time, len(src)) - for i := 0; i < len(src); i++ { - if src[i] != nil { - dst[i] = *(src[i]) - } - } - return dst -} - -// TimeMap converts a string map of time.Time values into a string -// map of time.Time pointers -func TimeMap(src map[string]time.Time) map[string]*time.Time { - dst := make(map[string]*time.Time) - for k, val := range src { - v := val - dst[k] = &v - } - return dst -} - -// TimeValueMap converts a string map of time.Time pointers into a string -// map of time.Time values -func TimeValueMap(src map[string]*time.Time) map[string]time.Time { - dst := make(map[string]time.Time) - for k, val := range src { - if val != nil { - dst[k] = *val - } - } - return dst -} diff --git a/vendor/github.com/go-openapi/swag/convert_types_test.go b/vendor/github.com/go-openapi/swag/convert_types_test.go deleted file mode 100644 index 978cf3a1d3..0000000000 --- a/vendor/github.com/go-openapi/swag/convert_types_test.go +++ /dev/null @@ -1,579 +0,0 @@ -package swag - -import ( - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -var testCasesStringSlice = [][]string{ - {"a", "b", "c", "d", "e"}, - {"a", "b", "", "", "e"}, -} - -func TestStringSlice(t *testing.T) { - for idx, in := range testCasesStringSlice { - if in == nil { - continue - } - out := StringSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := StringValueSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesStringValueSlice = [][]*string{ - {String("a"), String("b"), nil, String("c")}, -} - -func TestStringValueSlice(t *testing.T) { - for idx, in := range testCasesStringValueSlice { - if in == nil { - continue - } - out := StringValueSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - if in[i] == nil { - assert.Empty(t, out[i], "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx) - } - } - - out2 := StringSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - for i := range out2 { - if in[i] == nil { - assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx) - } - } - } -} - -var testCasesStringMap = []map[string]string{ - {"a": "1", "b": "2", "c": "3"}, -} - -func TestStringMap(t *testing.T) { - for idx, in := range testCasesStringMap { - if in == nil { - continue - } - out := StringMap(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := StringValueMap(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesBoolSlice = [][]bool{ - {true, true, false, false}, -} - -func TestBoolSlice(t *testing.T) { - for idx, in := range testCasesBoolSlice { - if in == nil { - continue - } - out := BoolSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := BoolValueSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesBoolValueSlice = [][]*bool{} - -func TestBoolValueSlice(t *testing.T) { - for idx, in := range testCasesBoolValueSlice { - if in == nil { - continue - } - out := BoolValueSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - if in[i] == nil { - assert.Empty(t, out[i], "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx) - } - } - - out2 := BoolSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - for i := range out2 { - if in[i] == nil { - assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx) - } - } - } -} - -var testCasesBoolMap = []map[string]bool{ - {"a": true, "b": false, "c": true}, -} - -func TestBoolMap(t *testing.T) { - for idx, in := range testCasesBoolMap { - if in == nil { - continue - } - out := BoolMap(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := BoolValueMap(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesIntSlice = [][]int{ - {1, 2, 3, 4}, -} - -func TestIntSlice(t *testing.T) { - for idx, in := range testCasesIntSlice { - if in == nil { - continue - } - out := IntSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := IntValueSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesIntValueSlice = [][]*int{} - -func TestIntValueSlice(t *testing.T) { - for idx, in := range testCasesIntValueSlice { - if in == nil { - continue - } - out := IntValueSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - if in[i] == nil { - assert.Empty(t, out[i], "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx) - } - } - - out2 := IntSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - for i := range out2 { - if in[i] == nil { - assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx) - } - } - } -} - -var testCasesIntMap = []map[string]int{ - {"a": 3, "b": 2, "c": 1}, -} - -func TestIntMap(t *testing.T) { - for idx, in := range testCasesIntMap { - if in == nil { - continue - } - out := IntMap(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := IntValueMap(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesInt64Slice = [][]int64{ - {1, 2, 3, 4}, -} - -func TestInt64Slice(t *testing.T) { - for idx, in := range testCasesInt64Slice { - if in == nil { - continue - } - out := Int64Slice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := Int64ValueSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesInt64ValueSlice = [][]*int64{} - -func TestInt64ValueSlice(t *testing.T) { - for idx, in := range testCasesInt64ValueSlice { - if in == nil { - continue - } - out := Int64ValueSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - if in[i] == nil { - assert.Empty(t, out[i], "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx) - } - } - - out2 := Int64Slice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - for i := range out2 { - if in[i] == nil { - assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx) - } - } - } -} - -var testCasesInt64Map = []map[string]int64{ - {"a": 3, "b": 2, "c": 1}, -} - -func TestInt64Map(t *testing.T) { - for idx, in := range testCasesInt64Map { - if in == nil { - continue - } - out := Int64Map(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := Int64ValueMap(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesFloat64Slice = [][]float64{ - {1, 2, 3, 4}, -} - -func TestFloat64Slice(t *testing.T) { - for idx, in := range testCasesFloat64Slice { - if in == nil { - continue - } - out := Float64Slice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := Float64ValueSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesUintSlice = [][]uint{ - {1, 2, 3, 4}, -} - -func TestUintSlice(t *testing.T) { - for idx, in := range testCasesUintSlice { - if in == nil { - continue - } - out := UintSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := UintValueSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesUintValueSlice = [][]*uint{} - -func TestUintValueSlice(t *testing.T) { - for idx, in := range testCasesUintValueSlice { - if in == nil { - continue - } - out := UintValueSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - if in[i] == nil { - assert.Empty(t, out[i], "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx) - } - } - - out2 := UintSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - for i := range out2 { - if in[i] == nil { - assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx) - } - } - } -} - -var testCasesUintMap = []map[string]uint{ - {"a": 3, "b": 2, "c": 1}, -} - -func TestUintMap(t *testing.T) { - for idx, in := range testCasesUintMap { - if in == nil { - continue - } - out := UintMap(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := UintValueMap(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesUint64Slice = [][]uint64{ - {1, 2, 3, 4}, -} - -func TestUint64Slice(t *testing.T) { - for idx, in := range testCasesUint64Slice { - if in == nil { - continue - } - out := Uint64Slice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := Uint64ValueSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesUint64ValueSlice = [][]*uint64{} - -func TestUint64ValueSlice(t *testing.T) { - for idx, in := range testCasesUint64ValueSlice { - if in == nil { - continue - } - out := Uint64ValueSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - if in[i] == nil { - assert.Empty(t, out[i], "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx) - } - } - - out2 := Uint64Slice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - for i := range out2 { - if in[i] == nil { - assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx) - } - } - } -} - -var testCasesUint64Map = []map[string]uint64{ - {"a": 3, "b": 2, "c": 1}, -} - -func TestUint64Map(t *testing.T) { - for idx, in := range testCasesUint64Map { - if in == nil { - continue - } - out := Uint64Map(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := Uint64ValueMap(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesFloat64ValueSlice = [][]*float64{} - -func TestFloat64ValueSlice(t *testing.T) { - for idx, in := range testCasesFloat64ValueSlice { - if in == nil { - continue - } - out := Float64ValueSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - if in[i] == nil { - assert.Empty(t, out[i], "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx) - } - } - - out2 := Float64Slice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - for i := range out2 { - if in[i] == nil { - assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx) - } - } - } -} - -var testCasesFloat64Map = []map[string]float64{ - {"a": 3, "b": 2, "c": 1}, -} - -func TestFloat64Map(t *testing.T) { - for idx, in := range testCasesFloat64Map { - if in == nil { - continue - } - out := Float64Map(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := Float64ValueMap(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesTimeSlice = [][]time.Time{ - {time.Now(), time.Now().AddDate(100, 0, 0)}, -} - -func TestTimeSlice(t *testing.T) { - for idx, in := range testCasesTimeSlice { - if in == nil { - continue - } - out := TimeSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := TimeValueSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} - -var testCasesTimeValueSlice = [][]*time.Time{} - -func TestTimeValueSlice(t *testing.T) { - for idx, in := range testCasesTimeValueSlice { - if in == nil { - continue - } - out := TimeValueSlice(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - if in[i] == nil { - assert.Empty(t, out[i], "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, *(in[i]), out[i], "Unexpected value at idx %d", idx) - } - } - - out2 := TimeSlice(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - for i := range out2 { - if in[i] == nil { - assert.Empty(t, *(out2[i]), "Unexpected value at idx %d", idx) - } else { - assert.Equal(t, in[i], out2[i], "Unexpected value at idx %d", idx) - } - } - } -} - -var testCasesTimeMap = []map[string]time.Time{ - {"a": time.Now().AddDate(-100, 0, 0), "b": time.Now()}, -} - -func TestTimeMap(t *testing.T) { - for idx, in := range testCasesTimeMap { - if in == nil { - continue - } - out := TimeMap(in) - assert.Len(t, out, len(in), "Unexpected len at idx %d", idx) - for i := range out { - assert.Equal(t, in[i], *(out[i]), "Unexpected value at idx %d", idx) - } - - out2 := TimeValueMap(out) - assert.Len(t, out2, len(in), "Unexpected len at idx %d", idx) - assert.Equal(t, in, out2, "Unexpected value at idx %d", idx) - } -} diff --git a/vendor/github.com/go-openapi/swag/json.go b/vendor/github.com/go-openapi/swag/json.go deleted file mode 100644 index cb20a6a0f7..0000000000 --- a/vendor/github.com/go-openapi/swag/json.go +++ /dev/null @@ -1,295 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package swag - -import ( - "bytes" - "encoding/json" - "log" - "reflect" - "strings" - "sync" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// DefaultJSONNameProvider the default cache for types -var DefaultJSONNameProvider = NewNameProvider() - -const comma = byte(',') - -var closers = map[byte]byte{ - '{': '}', - '[': ']', -} - -type ejMarshaler interface { - MarshalEasyJSON(w *jwriter.Writer) -} - -type ejUnmarshaler interface { - UnmarshalEasyJSON(w *jlexer.Lexer) -} - -// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaller -// so it takes the fastest option available. -func WriteJSON(data interface{}) ([]byte, error) { - if d, ok := data.(ejMarshaler); ok { - jw := new(jwriter.Writer) - d.MarshalEasyJSON(jw) - return jw.BuildBytes() - } - if d, ok := data.(json.Marshaler); ok { - return d.MarshalJSON() - } - return json.Marshal(data) -} - -// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaller -// so it takes the fastes option available -func ReadJSON(data []byte, value interface{}) error { - if d, ok := value.(ejUnmarshaler); ok { - jl := &jlexer.Lexer{Data: data} - d.UnmarshalEasyJSON(jl) - return jl.Error() - } - if d, ok := value.(json.Unmarshaler); ok { - return d.UnmarshalJSON(data) - } - return json.Unmarshal(data, value) -} - -// DynamicJSONToStruct converts an untyped json structure into a struct -func DynamicJSONToStruct(data interface{}, target interface{}) error { - // TODO: convert straight to a json typed map (mergo + iterate?) - b, err := WriteJSON(data) - if err != nil { - return err - } - if err := ReadJSON(b, target); err != nil { - return err - } - return nil -} - -// ConcatJSON concatenates multiple json objects efficiently -func ConcatJSON(blobs ...[]byte) []byte { - if len(blobs) == 0 { - return nil - } - if len(blobs) == 1 { - return blobs[0] - } - - last := len(blobs) - 1 - var opening, closing byte - a := 0 - idx := 0 - buf := bytes.NewBuffer(nil) - - for i, b := range blobs { - if len(b) > 0 && opening == 0 { // is this an array or an object? - opening, closing = b[0], closers[b[0]] - } - - if opening != '{' && opening != '[' { - continue // don't know how to concatenate non container objects - } - - if len(b) < 3 { // yep empty but also the last one, so closing this thing - if i == last && a > 0 { - if err := buf.WriteByte(closing); err != nil { - log.Println(err) - } - } - continue - } - - idx = 0 - if a > 0 { // we need to join with a comma for everything beyond the first non-empty item - if err := buf.WriteByte(comma); err != nil { - log.Println(err) - } - idx = 1 // this is not the first or the last so we want to drop the leading bracket - } - - if i != last { // not the last one, strip brackets - if _, err := buf.Write(b[idx : len(b)-1]); err != nil { - log.Println(err) - } - } else { // last one, strip only the leading bracket - if _, err := buf.Write(b[idx:]); err != nil { - log.Println(err) - } - } - a++ - } - // somehow it ended up being empty, so provide a default value - if buf.Len() == 0 { - if err := buf.WriteByte(opening); err != nil { - log.Println(err) - } - if err := buf.WriteByte(closing); err != nil { - log.Println(err) - } - } - return buf.Bytes() -} - -// ToDynamicJSON turns an object into a properly JSON typed structure -func ToDynamicJSON(data interface{}) interface{} { - // TODO: convert straight to a json typed map (mergo + iterate?) - b, err := json.Marshal(data) - if err != nil { - log.Println(err) - } - var res interface{} - if err := json.Unmarshal(b, &res); err != nil { - log.Println(err) - } - return res -} - -// FromDynamicJSON turns an object into a properly JSON typed structure -func FromDynamicJSON(data, target interface{}) error { - b, err := json.Marshal(data) - if err != nil { - log.Println(err) - } - return json.Unmarshal(b, target) -} - -// NameProvider represents an object capabale of translating from go property names -// to json property names -// This type is thread-safe. -type NameProvider struct { - lock *sync.Mutex - index map[reflect.Type]nameIndex -} - -type nameIndex struct { - jsonNames map[string]string - goNames map[string]string -} - -// NewNameProvider creates a new name provider -func NewNameProvider() *NameProvider { - return &NameProvider{ - lock: &sync.Mutex{}, - index: make(map[reflect.Type]nameIndex), - } -} - -func buildnameIndex(tpe reflect.Type, idx, reverseIdx map[string]string) { - for i := 0; i < tpe.NumField(); i++ { - targetDes := tpe.Field(i) - - if targetDes.PkgPath != "" { // unexported - continue - } - - if targetDes.Anonymous { // walk embedded structures tree down first - buildnameIndex(targetDes.Type, idx, reverseIdx) - continue - } - - if tag := targetDes.Tag.Get("json"); tag != "" { - - parts := strings.Split(tag, ",") - if len(parts) == 0 { - continue - } - - nm := parts[0] - if nm == "-" { - continue - } - if nm == "" { // empty string means we want to use the Go name - nm = targetDes.Name - } - - idx[nm] = targetDes.Name - reverseIdx[targetDes.Name] = nm - } - } -} - -func newNameIndex(tpe reflect.Type) nameIndex { - var idx = make(map[string]string, tpe.NumField()) - var reverseIdx = make(map[string]string, tpe.NumField()) - - buildnameIndex(tpe, idx, reverseIdx) - return nameIndex{jsonNames: idx, goNames: reverseIdx} -} - -// GetJSONNames gets all the json property names for a type -func (n *NameProvider) GetJSONNames(subject interface{}) []string { - n.lock.Lock() - defer n.lock.Unlock() - tpe := reflect.Indirect(reflect.ValueOf(subject)).Type() - names, ok := n.index[tpe] - if !ok { - names = n.makeNameIndex(tpe) - } - - var res []string - for k := range names.jsonNames { - res = append(res, k) - } - return res -} - -// GetJSONName gets the json name for a go property name -func (n *NameProvider) GetJSONName(subject interface{}, name string) (string, bool) { - tpe := reflect.Indirect(reflect.ValueOf(subject)).Type() - return n.GetJSONNameForType(tpe, name) -} - -// GetJSONNameForType gets the json name for a go property name on a given type -func (n *NameProvider) GetJSONNameForType(tpe reflect.Type, name string) (string, bool) { - n.lock.Lock() - defer n.lock.Unlock() - names, ok := n.index[tpe] - if !ok { - names = n.makeNameIndex(tpe) - } - nme, ok := names.goNames[name] - return nme, ok -} - -func (n *NameProvider) makeNameIndex(tpe reflect.Type) nameIndex { - names := newNameIndex(tpe) - n.index[tpe] = names - return names -} - -// GetGoName gets the go name for a json property name -func (n *NameProvider) GetGoName(subject interface{}, name string) (string, bool) { - tpe := reflect.Indirect(reflect.ValueOf(subject)).Type() - return n.GetGoNameForType(tpe, name) -} - -// GetGoNameForType gets the go name for a given type for a json property name -func (n *NameProvider) GetGoNameForType(tpe reflect.Type, name string) (string, bool) { - n.lock.Lock() - defer n.lock.Unlock() - names, ok := n.index[tpe] - if !ok { - names = n.makeNameIndex(tpe) - } - nme, ok := names.jsonNames[name] - return nme, ok -} diff --git a/vendor/github.com/go-openapi/swag/json_test.go b/vendor/github.com/go-openapi/swag/json_test.go deleted file mode 100644 index a7d0d9821b..0000000000 --- a/vendor/github.com/go-openapi/swag/json_test.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package swag - -import ( - "reflect" - "testing" - - "github.com/stretchr/testify/assert" -) - -type testNameStruct struct { - Name string `json:"name"` - NotTheSame int64 `json:"plain"` - Ignored string `json:"-"` -} - -func TestNameProvider(t *testing.T) { - - provider := NewNameProvider() - - var obj = testNameStruct{} - - nm, ok := provider.GetGoName(obj, "name") - assert.True(t, ok) - assert.Equal(t, "Name", nm) - - nm, ok = provider.GetGoName(obj, "plain") - assert.True(t, ok) - assert.Equal(t, "NotTheSame", nm) - - nm, ok = provider.GetGoName(obj, "doesNotExist") - assert.False(t, ok) - assert.Empty(t, nm) - - nm, ok = provider.GetGoName(obj, "ignored") - assert.False(t, ok) - assert.Empty(t, nm) - - tpe := reflect.TypeOf(obj) - nm, ok = provider.GetGoNameForType(tpe, "name") - assert.True(t, ok) - assert.Equal(t, "Name", nm) - - nm, ok = provider.GetGoNameForType(tpe, "plain") - assert.True(t, ok) - assert.Equal(t, "NotTheSame", nm) - - nm, ok = provider.GetGoNameForType(tpe, "doesNotExist") - assert.False(t, ok) - assert.Empty(t, nm) - - nm, ok = provider.GetGoNameForType(tpe, "ignored") - assert.False(t, ok) - assert.Empty(t, nm) - - ptr := &obj - nm, ok = provider.GetGoName(ptr, "name") - assert.True(t, ok) - assert.Equal(t, "Name", nm) - - nm, ok = provider.GetGoName(ptr, "plain") - assert.True(t, ok) - assert.Equal(t, "NotTheSame", nm) - - nm, ok = provider.GetGoName(ptr, "doesNotExist") - assert.False(t, ok) - assert.Empty(t, nm) - - nm, ok = provider.GetGoName(ptr, "ignored") - assert.False(t, ok) - assert.Empty(t, nm) - - nm, ok = provider.GetJSONName(obj, "Name") - assert.True(t, ok) - assert.Equal(t, "name", nm) - - nm, ok = provider.GetJSONName(obj, "NotTheSame") - assert.True(t, ok) - assert.Equal(t, "plain", nm) - - nm, ok = provider.GetJSONName(obj, "DoesNotExist") - assert.False(t, ok) - assert.Empty(t, nm) - - nm, ok = provider.GetJSONName(obj, "Ignored") - assert.False(t, ok) - assert.Empty(t, nm) - - nm, ok = provider.GetJSONNameForType(tpe, "Name") - assert.True(t, ok) - assert.Equal(t, "name", nm) - - nm, ok = provider.GetJSONNameForType(tpe, "NotTheSame") - assert.True(t, ok) - assert.Equal(t, "plain", nm) - - nm, ok = provider.GetJSONNameForType(tpe, "doesNotExist") - assert.False(t, ok) - assert.Empty(t, nm) - - nm, ok = provider.GetJSONNameForType(tpe, "Ignored") - assert.False(t, ok) - assert.Empty(t, nm) - - nm, ok = provider.GetJSONName(ptr, "Name") - assert.True(t, ok) - assert.Equal(t, "name", nm) - - nm, ok = provider.GetJSONName(ptr, "NotTheSame") - assert.True(t, ok) - assert.Equal(t, "plain", nm) - - nm, ok = provider.GetJSONName(ptr, "doesNotExist") - assert.False(t, ok) - assert.Empty(t, nm) - - nm, ok = provider.GetJSONName(ptr, "Ignored") - assert.False(t, ok) - assert.Empty(t, nm) - - nms := provider.GetJSONNames(ptr) - assert.Len(t, nms, 2) - - assert.Len(t, provider.index, 1) - -} - -func TestJSONConcatenation(t *testing.T) { - assert.Nil(t, ConcatJSON()) - assert.Equal(t, ConcatJSON([]byte(`{"id":1}`)), []byte(`{"id":1}`)) - assert.Equal(t, ConcatJSON([]byte(`{}`), []byte(`{}`)), []byte(`{}`)) - assert.Equal(t, ConcatJSON([]byte(`[]`), []byte(`[]`)), []byte(`[]`)) - assert.Equal(t, ConcatJSON([]byte(`{"id":1}`), []byte(`{"name":"Rachel"}`)), []byte(`{"id":1,"name":"Rachel"}`)) - assert.Equal(t, ConcatJSON([]byte(`[{"id":1}]`), []byte(`[{"name":"Rachel"}]`)), []byte(`[{"id":1},{"name":"Rachel"}]`)) - assert.Equal(t, ConcatJSON([]byte(`{}`), []byte(`{"name":"Rachel"}`)), []byte(`{"name":"Rachel"}`)) - assert.Equal(t, ConcatJSON([]byte(`[]`), []byte(`[{"name":"Rachel"}]`)), []byte(`[{"name":"Rachel"}]`)) - assert.Equal(t, ConcatJSON([]byte(`{"id":1}`), []byte(`{}`)), []byte(`{"id":1}`)) - assert.Equal(t, ConcatJSON([]byte(`[{"id":1}]`), []byte(`[]`)), []byte(`[{"id":1}]`)) - assert.Equal(t, ConcatJSON([]byte(`{}`), []byte(`{}`), []byte(`{}`)), []byte(`{}`)) - assert.Equal(t, ConcatJSON([]byte(`[]`), []byte(`[]`), []byte(`[]`)), []byte(`[]`)) - assert.Equal(t, ConcatJSON([]byte(`{"id":1}`), []byte(`{"name":"Rachel"}`), []byte(`{"age":32}`)), []byte(`{"id":1,"name":"Rachel","age":32}`)) - assert.Equal(t, ConcatJSON([]byte(`[{"id":1}]`), []byte(`[{"name":"Rachel"}]`), []byte(`[{"age":32}]`)), []byte(`[{"id":1},{"name":"Rachel"},{"age":32}]`)) - assert.Equal(t, ConcatJSON([]byte(`{}`), []byte(`{"name":"Rachel"}`), []byte(`{"age":32}`)), []byte(`{"name":"Rachel","age":32}`)) - assert.Equal(t, ConcatJSON([]byte(`[]`), []byte(`[{"name":"Rachel"}]`), []byte(`[{"age":32}]`)), []byte(`[{"name":"Rachel"},{"age":32}]`)) - assert.Equal(t, ConcatJSON([]byte(`{"id":1}`), []byte(`{}`), []byte(`{"age":32}`)), []byte(`{"id":1,"age":32}`)) - assert.Equal(t, ConcatJSON([]byte(`[{"id":1}]`), []byte(`[]`), []byte(`[{"age":32}]`)), []byte(`[{"id":1},{"age":32}]`)) - assert.Equal(t, ConcatJSON([]byte(`{"id":1}`), []byte(`{"name":"Rachel"}`), []byte(`{}`)), []byte(`{"id":1,"name":"Rachel"}`)) - assert.Equal(t, ConcatJSON([]byte(`[{"id":1}]`), []byte(`[{"name":"Rachel"}]`), []byte(`[]`)), []byte(`[{"id":1},{"name":"Rachel"}]`)) - -} diff --git a/vendor/github.com/go-openapi/swag/loading.go b/vendor/github.com/go-openapi/swag/loading.go deleted file mode 100644 index 62ed1e80ab..0000000000 --- a/vendor/github.com/go-openapi/swag/loading.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package swag - -import ( - "fmt" - "io/ioutil" - "log" - "net/http" - "path/filepath" - "strings" - "time" -) - -// LoadHTTPTimeout the default timeout for load requests -var LoadHTTPTimeout = 30 * time.Second - -// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in -func LoadFromFileOrHTTP(path string) ([]byte, error) { - return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path) -} - -// LoadFromFileOrHTTPWithTimeout loads the bytes from a file or a remote http server based on the path passed in -// timeout arg allows for per request overriding of the request timeout -func LoadFromFileOrHTTPWithTimeout(path string, timeout time.Duration) ([]byte, error) { - return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(timeout))(path) -} - -// LoadStrategy returns a loader function for a given path or uri -func LoadStrategy(path string, local, remote func(string) ([]byte, error)) func(string) ([]byte, error) { - if strings.HasPrefix(path, "http") { - return remote - } - return func(pth string) ([]byte, error) { return local(filepath.FromSlash(pth)) } -} - -func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) { - return func(path string) ([]byte, error) { - client := &http.Client{Timeout: timeout} - req, err := http.NewRequest("GET", path, nil) - if err != nil { - return nil, err - } - resp, err := client.Do(req) - defer func() { - if resp != nil { - if e := resp.Body.Close(); e != nil { - log.Println(e) - } - } - }() - if err != nil { - return nil, err - } - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("could not access document at %q [%s] ", path, resp.Status) - } - - return ioutil.ReadAll(resp.Body) - } -} diff --git a/vendor/github.com/go-openapi/swag/loading_test.go b/vendor/github.com/go-openapi/swag/loading_test.go deleted file mode 100644 index 7b8bdf48db..0000000000 --- a/vendor/github.com/go-openapi/swag/loading_test.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package swag - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestLoadFromHTTP(t *testing.T) { - - _, err := LoadFromFileOrHTTP("httx://12394:abd") - assert.Error(t, err) - - serv := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - rw.WriteHeader(http.StatusNotFound) - })) - defer serv.Close() - - _, err = LoadFromFileOrHTTP(serv.URL) - assert.Error(t, err) - - ts2 := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - rw.WriteHeader(http.StatusOK) - rw.Write([]byte("the content")) - })) - defer ts2.Close() - - d, err := LoadFromFileOrHTTP(ts2.URL) - assert.NoError(t, err) - assert.Equal(t, []byte("the content"), d) -} diff --git a/vendor/github.com/go-openapi/swag/net.go b/vendor/github.com/go-openapi/swag/net.go deleted file mode 100644 index 8323fa37b6..0000000000 --- a/vendor/github.com/go-openapi/swag/net.go +++ /dev/null @@ -1,24 +0,0 @@ -package swag - -import ( - "net" - "strconv" -) - -// SplitHostPort splits a network address into a host and a port. -// The port is -1 when there is no port to be found -func SplitHostPort(addr string) (host string, port int, err error) { - h, p, err := net.SplitHostPort(addr) - if err != nil { - return "", -1, err - } - if p == "" { - return "", -1, &net.AddrError{Err: "missing port in address", Addr: addr} - } - - pi, err := strconv.Atoi(p) - if err != nil { - return "", -1, err - } - return h, pi, nil -} diff --git a/vendor/github.com/go-openapi/swag/net_test.go b/vendor/github.com/go-openapi/swag/net_test.go deleted file mode 100644 index 041db60a23..0000000000 --- a/vendor/github.com/go-openapi/swag/net_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package swag - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestSplitHostPort(t *testing.T) { - data := []struct { - Input string - Host string - Port int - Err bool - }{ - {"localhost:3933", "localhost", 3933, false}, - {"localhost:yellow", "", -1, true}, - {"localhost", "", -1, true}, - {"localhost:", "", -1, true}, - {"localhost:3933", "localhost", 3933, false}, - } - - for _, e := range data { - h, p, err := SplitHostPort(e.Input) - if (!e.Err && assert.NoError(t, err)) || (e.Err && assert.Error(t, err)) { - assert.Equal(t, e.Host, h) - assert.Equal(t, e.Port, p) - } - } -} diff --git a/vendor/github.com/go-openapi/swag/path.go b/vendor/github.com/go-openapi/swag/path.go deleted file mode 100644 index 941bd0176b..0000000000 --- a/vendor/github.com/go-openapi/swag/path.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package swag - -import ( - "os" - "path/filepath" - "runtime" - "strings" -) - -const ( - // GOPATHKey represents the env key for gopath - GOPATHKey = "GOPATH" -) - -// FindInSearchPath finds a package in a provided lists of paths -func FindInSearchPath(searchPath, pkg string) string { - pathsList := filepath.SplitList(searchPath) - for _, path := range pathsList { - if evaluatedPath, err := filepath.EvalSymlinks(filepath.Join(path, "src", pkg)); err == nil { - if _, err := os.Stat(evaluatedPath); err == nil { - return evaluatedPath - } - } - } - return "" -} - -// FindInGoSearchPath finds a package in the $GOPATH:$GOROOT -func FindInGoSearchPath(pkg string) string { - return FindInSearchPath(FullGoSearchPath(), pkg) -} - -// FullGoSearchPath gets the search paths for finding packages -func FullGoSearchPath() string { - allPaths := os.Getenv(GOPATHKey) - if allPaths == "" { - allPaths = filepath.Join(os.Getenv("HOME"), "go") - } - if allPaths != "" { - allPaths = strings.Join([]string{allPaths, runtime.GOROOT()}, ":") - } else { - allPaths = runtime.GOROOT() - } - return allPaths -} diff --git a/vendor/github.com/go-openapi/swag/path_test.go b/vendor/github.com/go-openapi/swag/path_test.go deleted file mode 100644 index 743bba534d..0000000000 --- a/vendor/github.com/go-openapi/swag/path_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package swag - -import ( - "io/ioutil" - "os" - "path/filepath" - "path" - "runtime" - "testing" - - "github.com/stretchr/testify/assert" -) - -func makeDirStructure(t *testing.T, tgt string) (string, string, error) { - if tgt == "" { - tgt = "pkgpaths" - } - td, err := ioutil.TempDir("", tgt) - if err != nil { - return "", "", err - } - td2, err := ioutil.TempDir("", tgt+"-2") - if err != nil { - return "", "", err - } - realPath := filepath.Join(td, "src", "foo", "bar") - if err := os.MkdirAll(realPath, os.ModePerm); err != nil { - return "", "", err - } - linkPathBase := filepath.Join(td, "src", "baz") - if err := os.MkdirAll(linkPathBase, os.ModePerm); err != nil { - return "", "", err - } - linkPath := filepath.Join(linkPathBase, "das") - if err := os.Symlink(realPath, linkPath); err != nil { - return "", "", err - } - - realPath = filepath.Join(td2, "src", "fuu", "bir") - if err := os.MkdirAll(realPath, os.ModePerm); err != nil { - return "", "", err - } - linkPathBase = filepath.Join(td2, "src", "biz") - if err := os.MkdirAll(linkPathBase, os.ModePerm); err != nil { - return "", "", err - } - linkPath = filepath.Join(linkPathBase, "dis") - if err := os.Symlink(realPath, linkPath); err != nil { - return "", "", err - } - return td, td2, nil -} - -func TestFindPackage(t *testing.T) { - pth, pth2, err := makeDirStructure(t, "") - if err != nil { - t.Fatal(err) - } - defer func() { - os.RemoveAll(pth) - os.RemoveAll(pth2) - }() - - searchPath := pth + string(filepath.ListSeparator) + pth2 - // finds package when real name mentioned - pkg := FindInSearchPath(searchPath, "foo/bar") - assert.NotEmpty(t, pkg) - assertPath(t, path.Join(pth, "src", "foo", "bar"), pkg) - // finds package when real name is mentioned in secondary - pkg = FindInSearchPath(searchPath, "fuu/bir") - assert.NotEmpty(t, pkg) - assertPath(t, path.Join(pth2, "src", "fuu", "bir"), pkg) - // finds package when symlinked - pkg = FindInSearchPath(searchPath, "baz/das") - assert.NotEmpty(t, pkg) - assertPath(t, path.Join(pth, "src", "foo", "bar"), pkg) - // finds package when symlinked in secondary - pkg = FindInSearchPath(searchPath, "biz/dis") - assert.NotEmpty(t, pkg) - assertPath(t, path.Join(pth2, "src", "fuu", "bir"), pkg) - // return empty string when nothing is found - pkg = FindInSearchPath(searchPath, "not/there") - assert.Empty(t, pkg) -} - -func assertPath(t testing.TB, expected, actual string) bool { - fp, err := filepath.EvalSymlinks(expected) - if assert.NoError(t, err) { - return assert.Equal(t, fp, actual) - } - return true -} - -func TestFullGOPATH(t *testing.T) { - os.Unsetenv(GOPATHKey) - ngp := "/some/where:/other/place" - os.Setenv(GOPATHKey, ngp) - - ogp := os.Getenv(GOPATHKey) - defer os.Setenv(GOPATHKey, ogp) - - expected := ngp + ":" + runtime.GOROOT() - assert.Equal(t, expected, FullGoSearchPath()) -} diff --git a/vendor/github.com/go-openapi/swag/util.go b/vendor/github.com/go-openapi/swag/util.go deleted file mode 100644 index 40751aab44..0000000000 --- a/vendor/github.com/go-openapi/swag/util.go +++ /dev/null @@ -1,336 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package swag - -import ( - "math" - "reflect" - "regexp" - "sort" - "strings" - "unicode" -) - -// Taken from https://github.com/golang/lint/blob/3390df4df2787994aea98de825b964ac7944b817/lint.go#L732-L769 -var commonInitialisms = map[string]bool{ - "ACL": true, - "API": true, - "ASCII": true, - "CPU": true, - "CSS": true, - "DNS": true, - "EOF": true, - "GUID": true, - "HTML": true, - "HTTPS": true, - "HTTP": true, - "ID": true, - "IP": true, - "JSON": true, - "LHS": true, - "QPS": true, - "RAM": true, - "RHS": true, - "RPC": true, - "SLA": true, - "SMTP": true, - "SQL": true, - "SSH": true, - "TCP": true, - "TLS": true, - "TTL": true, - "UDP": true, - "UI": true, - "UID": true, - "UUID": true, - "URI": true, - "URL": true, - "UTF8": true, - "VM": true, - "XML": true, - "XMPP": true, - "XSRF": true, - "XSS": true, -} -var initialisms []string - -func init() { - for k := range commonInitialisms { - initialisms = append(initialisms, k) - } - sort.Sort(sort.Reverse(byLength(initialisms))) -} - -// JoinByFormat joins a string array by a known format: -// ssv: space separated value -// tsv: tab separated value -// pipes: pipe (|) separated value -// csv: comma separated value (default) -func JoinByFormat(data []string, format string) []string { - if len(data) == 0 { - return data - } - var sep string - switch format { - case "ssv": - sep = " " - case "tsv": - sep = "\t" - case "pipes": - sep = "|" - case "multi": - return data - default: - sep = "," - } - return []string{strings.Join(data, sep)} -} - -// SplitByFormat splits a string by a known format: -// ssv: space separated value -// tsv: tab separated value -// pipes: pipe (|) separated value -// csv: comma separated value (default) -func SplitByFormat(data, format string) []string { - if data == "" { - return nil - } - var sep string - switch format { - case "ssv": - sep = " " - case "tsv": - sep = "\t" - case "pipes": - sep = "|" - case "multi": - return nil - default: - sep = "," - } - var result []string - for _, s := range strings.Split(data, sep) { - if ts := strings.TrimSpace(s); ts != "" { - result = append(result, ts) - } - } - return result -} - -type byLength []string - -func (s byLength) Len() int { - return len(s) -} -func (s byLength) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} -func (s byLength) Less(i, j int) bool { - return len(s[i]) < len(s[j]) -} - -// Prepares strings by splitting by caps, spaces, dashes, and underscore -func split(str string) (words []string) { - repl := strings.NewReplacer( - "@", "At ", - "&", "And ", - "|", "Pipe ", - "$", "Dollar ", - "!", "Bang ", - "-", " ", - "_", " ", - ) - - rex1 := regexp.MustCompile(`(\p{Lu})`) - rex2 := regexp.MustCompile(`(\pL|\pM|\pN|\p{Pc})+`) - - str = trim(str) - - // Convert dash and underscore to spaces - str = repl.Replace(str) - - // Split when uppercase is found (needed for Snake) - str = rex1.ReplaceAllString(str, " $1") - // check if consecutive single char things make up an initialism - - for _, k := range initialisms { - str = strings.Replace(str, rex1.ReplaceAllString(k, " $1"), " "+k, -1) - } - // Get the final list of words - words = rex2.FindAllString(str, -1) - - return -} - -// Removes leading whitespaces -func trim(str string) string { - return strings.Trim(str, " ") -} - -// Shortcut to strings.ToUpper() -func upper(str string) string { - return strings.ToUpper(trim(str)) -} - -// Shortcut to strings.ToLower() -func lower(str string) string { - return strings.ToLower(trim(str)) -} - -// ToFileName lowercases and underscores a go type name -func ToFileName(name string) string { - var out []string - for _, w := range split(name) { - out = append(out, lower(w)) - } - return strings.Join(out, "_") -} - -// ToCommandName lowercases and underscores a go type name -func ToCommandName(name string) string { - var out []string - for _, w := range split(name) { - out = append(out, lower(w)) - } - return strings.Join(out, "-") -} - -// ToHumanNameLower represents a code name as a human series of words -func ToHumanNameLower(name string) string { - var out []string - for _, w := range split(name) { - if !commonInitialisms[upper(w)] { - out = append(out, lower(w)) - } else { - out = append(out, w) - } - } - return strings.Join(out, " ") -} - -// ToHumanNameTitle represents a code name as a human series of words with the first letters titleized -func ToHumanNameTitle(name string) string { - var out []string - for _, w := range split(name) { - uw := upper(w) - if !commonInitialisms[uw] { - out = append(out, upper(w[:1])+lower(w[1:])) - } else { - out = append(out, w) - } - } - return strings.Join(out, " ") -} - -// ToJSONName camelcases a name which can be underscored or pascal cased -func ToJSONName(name string) string { - var out []string - for i, w := range split(name) { - if i == 0 { - out = append(out, lower(w)) - continue - } - out = append(out, upper(w[:1])+lower(w[1:])) - } - return strings.Join(out, "") -} - -// ToVarName camelcases a name which can be underscored or pascal cased -func ToVarName(name string) string { - res := ToGoName(name) - if _, ok := commonInitialisms[res]; ok { - return lower(res) - } - if len(res) <= 1 { - return lower(res) - } - return lower(res[:1]) + res[1:] -} - -// ToGoName translates a swagger name which can be underscored or camel cased to a name that golint likes -func ToGoName(name string) string { - var out []string - for _, w := range split(name) { - uw := upper(w) - mod := int(math.Min(float64(len(uw)), 2)) - if !commonInitialisms[uw] && !commonInitialisms[uw[:len(uw)-mod]] { - uw = upper(w[:1]) + lower(w[1:]) - } - out = append(out, uw) - } - - result := strings.Join(out, "") - if len(result) > 0 { - ud := upper(result[:1]) - ru := []rune(ud) - if unicode.IsUpper(ru[0]) { - result = ud + result[1:] - } else { - result = "X" + ud + result[1:] - } - } - return result -} - -// ContainsStringsCI searches a slice of strings for a case-insensitive match -func ContainsStringsCI(coll []string, item string) bool { - for _, a := range coll { - if strings.EqualFold(a, item) { - return true - } - } - return false -} - -type zeroable interface { - IsZero() bool -} - -// IsZero returns true when the value passed into the function is a zero value. -// This allows for safer checking of interface values. -func IsZero(data interface{}) bool { - // check for things that have an IsZero method instead - if vv, ok := data.(zeroable); ok { - return vv.IsZero() - } - // continue with slightly more complex reflection - v := reflect.ValueOf(data) - switch v.Kind() { - case reflect.String: - return v.Len() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return v.IsNil() - case reflect.Struct, reflect.Array: - return reflect.DeepEqual(data, reflect.Zero(v.Type()).Interface()) - case reflect.Invalid: - return true - } - return false -} - -// CommandLineOptionsGroup represents a group of user-defined command line options -type CommandLineOptionsGroup struct { - ShortDescription string - LongDescription string - Options interface{} -} diff --git a/vendor/github.com/go-openapi/swag/util_test.go b/vendor/github.com/go-openapi/swag/util_test.go deleted file mode 100644 index 5db20b90fe..0000000000 --- a/vendor/github.com/go-openapi/swag/util_test.go +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package swag - -import ( - "fmt" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -type translationSample struct { - str, out string -} - -func titleize(s string) string { return strings.ToTitle(s[:1]) + lower(s[1:]) } - -func TestToGoName(t *testing.T) { - samples := []translationSample{ - {"sample text", "SampleText"}, - {"sample-text", "SampleText"}, - {"sample_text", "SampleText"}, - {"sampleText", "SampleText"}, - {"sample 2 Text", "Sample2Text"}, - {"findThingById", "FindThingByID"}, - {"日本語sample 2 Text", "X日本語sample2Text"}, - {"日本語findThingById", "X日本語findThingByID"}, - } - - for k := range commonInitialisms { - samples = append(samples, - translationSample{"sample " + lower(k) + " text", "Sample" + k + "Text"}, - translationSample{"sample-" + lower(k) + "-text", "Sample" + k + "Text"}, - translationSample{"sample_" + lower(k) + "_text", "Sample" + k + "Text"}, - translationSample{"sample" + titleize(k) + "Text", "Sample" + k + "Text"}, - translationSample{"sample " + lower(k), "Sample" + k}, - translationSample{"sample-" + lower(k), "Sample" + k}, - translationSample{"sample_" + lower(k), "Sample" + k}, - translationSample{"sample" + titleize(k), "Sample" + k}, - translationSample{"sample " + titleize(k) + " text", "Sample" + k + "Text"}, - translationSample{"sample-" + titleize(k) + "-text", "Sample" + k + "Text"}, - translationSample{"sample_" + titleize(k) + "_text", "Sample" + k + "Text"}, - ) - } - - for _, sample := range samples { - assert.Equal(t, sample.out, ToGoName(sample.str)) - } -} - -func TestContainsStringsCI(t *testing.T) { - list := []string{"hello", "world", "and", "such"} - - assert.True(t, ContainsStringsCI(list, "hELLo")) - assert.True(t, ContainsStringsCI(list, "world")) - assert.True(t, ContainsStringsCI(list, "AND")) - assert.False(t, ContainsStringsCI(list, "nuts")) -} - -func TestSplitByFormat(t *testing.T) { - expected := []string{"one", "two", "three"} - for _, fmt := range []string{"csv", "pipes", "tsv", "ssv", "multi"} { - - var actual []string - switch fmt { - case "multi": - assert.Nil(t, SplitByFormat("", fmt)) - assert.Nil(t, SplitByFormat("blah", fmt)) - case "ssv": - actual = SplitByFormat(strings.Join(expected, " "), fmt) - assert.EqualValues(t, expected, actual) - case "pipes": - actual = SplitByFormat(strings.Join(expected, "|"), fmt) - assert.EqualValues(t, expected, actual) - case "tsv": - actual = SplitByFormat(strings.Join(expected, "\t"), fmt) - assert.EqualValues(t, expected, actual) - default: - actual = SplitByFormat(strings.Join(expected, ","), fmt) - assert.EqualValues(t, expected, actual) - } - } -} - -func TestJoinByFormat(t *testing.T) { - for _, fmt := range []string{"csv", "pipes", "tsv", "ssv", "multi"} { - - lval := []string{"one", "two", "three"} - var expected []string - switch fmt { - case "multi": - expected = lval - case "ssv": - expected = []string{strings.Join(lval, " ")} - case "pipes": - expected = []string{strings.Join(lval, "|")} - case "tsv": - expected = []string{strings.Join(lval, "\t")} - default: - expected = []string{strings.Join(lval, ",")} - } - assert.Nil(t, JoinByFormat(nil, fmt)) - assert.EqualValues(t, expected, JoinByFormat(lval, fmt)) - } -} - -func TestToFileName(t *testing.T) { - samples := []translationSample{ - {"SampleText", "sample_text"}, - {"FindThingByID", "find_thing_by_id"}, - } - - for k := range commonInitialisms { - samples = append(samples, - translationSample{"Sample" + k + "Text", "sample_" + lower(k) + "_text"}, - ) - } - - for _, sample := range samples { - assert.Equal(t, sample.out, ToFileName(sample.str)) - } -} - -func TestToCommandName(t *testing.T) { - samples := []translationSample{ - {"SampleText", "sample-text"}, - {"FindThingByID", "find-thing-by-id"}, - } - - for k := range commonInitialisms { - samples = append(samples, - translationSample{"Sample" + k + "Text", "sample-" + lower(k) + "-text"}, - ) - } - - for _, sample := range samples { - assert.Equal(t, sample.out, ToCommandName(sample.str)) - } -} - -func TestToHumanName(t *testing.T) { - samples := []translationSample{ - {"SampleText", "sample text"}, - {"FindThingByID", "find thing by ID"}, - } - - for k := range commonInitialisms { - samples = append(samples, - translationSample{"Sample" + k + "Text", "sample " + k + " text"}, - ) - } - - for _, sample := range samples { - assert.Equal(t, sample.out, ToHumanNameLower(sample.str)) - } -} - -func TestToJSONName(t *testing.T) { - samples := []translationSample{ - {"SampleText", "sampleText"}, - {"FindThingByID", "findThingById"}, - } - - for k := range commonInitialisms { - samples = append(samples, - translationSample{"Sample" + k + "Text", "sample" + titleize(k) + "Text"}, - ) - } - - for _, sample := range samples { - assert.Equal(t, sample.out, ToJSONName(sample.str)) - } -} - -type SimpleZeroes struct { - ID string - Name string -} -type ZeroesWithTime struct { - Time time.Time -} - -func TestIsZero(t *testing.T) { - var strs [5]string - var strss []string - var a int - var b int8 - var c int16 - var d int32 - var e int64 - var f uint - var g uint8 - var h uint16 - var i uint32 - var j uint64 - var k map[string]string - var l interface{} - var m *SimpleZeroes - var n string - var o SimpleZeroes - var p ZeroesWithTime - var q time.Time - data := []struct { - Data interface{} - Expected bool - }{ - {a, true}, - {b, true}, - {c, true}, - {d, true}, - {e, true}, - {f, true}, - {g, true}, - {h, true}, - {i, true}, - {j, true}, - {k, true}, - {l, true}, - {m, true}, - {n, true}, - {o, true}, - {p, true}, - {q, true}, - {strss, true}, - {strs, true}, - {"", true}, - {nil, true}, - {1, false}, - {0, true}, - {int8(1), false}, - {int8(0), true}, - {int16(1), false}, - {int16(0), true}, - {int32(1), false}, - {int32(0), true}, - {int64(1), false}, - {int64(0), true}, - {uint(1), false}, - {uint(0), true}, - {uint8(1), false}, - {uint8(0), true}, - {uint16(1), false}, - {uint16(0), true}, - {uint32(1), false}, - {uint32(0), true}, - {uint64(1), false}, - {uint64(0), true}, - {0.0, true}, - {0.1, false}, - {float32(0.0), true}, - {float32(0.1), false}, - {float64(0.0), true}, - {float64(0.1), false}, - {[...]string{}, true}, - {[...]string{"hello"}, false}, - {[]string(nil), true}, - {[]string{"a"}, false}, - } - - for _, it := range data { - assert.Equal(t, it.Expected, IsZero(it.Data), fmt.Sprintf("%#v", it.Data)) - } -} diff --git a/vendor/github.com/go-openapi/swag/yaml.go b/vendor/github.com/go-openapi/swag/yaml.go deleted file mode 100644 index 26502f21d5..0000000000 --- a/vendor/github.com/go-openapi/swag/yaml.go +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package swag - -import ( - "encoding/json" - "fmt" - "path/filepath" - "strconv" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" - - yaml "gopkg.in/yaml.v2" -) - -// YAMLMatcher matches yaml -func YAMLMatcher(path string) bool { - ext := filepath.Ext(path) - return ext == ".yaml" || ext == ".yml" -} - -// YAMLToJSON converts YAML unmarshaled data into json compatible data -func YAMLToJSON(data interface{}) (json.RawMessage, error) { - jm, err := transformData(data) - if err != nil { - return nil, err - } - b, err := WriteJSON(jm) - return json.RawMessage(b), err -} - -func BytesToYAMLDoc(data []byte) (interface{}, error) { - var canary map[interface{}]interface{} // validate this is an object and not a different type - if err := yaml.Unmarshal(data, &canary); err != nil { - return nil, err - } - - var document yaml.MapSlice // preserve order that is present in the document - if err := yaml.Unmarshal(data, &document); err != nil { - return nil, err - } - return document, nil -} - -type JSONMapSlice []JSONMapItem - -func (s JSONMapSlice) MarshalJSON() ([]byte, error) { - w := &jwriter.Writer{Flags: jwriter.NilMapAsEmpty | jwriter.NilSliceAsEmpty} - s.MarshalEasyJSON(w) - return w.BuildBytes() -} - -func (s JSONMapSlice) MarshalEasyJSON(w *jwriter.Writer) { - w.RawByte('{') - - ln := len(s) - last := ln - 1 - for i := 0; i < ln; i++ { - s[i].MarshalEasyJSON(w) - if i != last { // last item - w.RawByte(',') - } - } - - w.RawByte('}') -} - -func (s *JSONMapSlice) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{Data: data} - s.UnmarshalEasyJSON(&l) - return l.Error() -} -func (s *JSONMapSlice) UnmarshalEasyJSON(in *jlexer.Lexer) { - if in.IsNull() { - in.Skip() - return - } - - var result JSONMapSlice - in.Delim('{') - for !in.IsDelim('}') { - var mi JSONMapItem - mi.UnmarshalEasyJSON(in) - result = append(result, mi) - } - *s = result -} - -type JSONMapItem struct { - Key string - Value interface{} -} - -func (s JSONMapItem) MarshalJSON() ([]byte, error) { - w := &jwriter.Writer{Flags: jwriter.NilMapAsEmpty | jwriter.NilSliceAsEmpty} - s.MarshalEasyJSON(w) - return w.BuildBytes() -} - -func (s JSONMapItem) MarshalEasyJSON(w *jwriter.Writer) { - w.String(s.Key) - w.RawByte(':') - w.Raw(WriteJSON(s.Value)) -} - -func (s *JSONMapItem) UnmarshalEasyJSON(in *jlexer.Lexer) { - key := in.UnsafeString() - in.WantColon() - value := in.Interface() - in.WantComma() - s.Key = key - s.Value = value -} -func (s *JSONMapItem) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{Data: data} - s.UnmarshalEasyJSON(&l) - return l.Error() -} - -func transformData(input interface{}) (out interface{}, err error) { - switch in := input.(type) { - case yaml.MapSlice: - - o := make(JSONMapSlice, len(in)) - for i, mi := range in { - var nmi JSONMapItem - switch k := mi.Key.(type) { - case string: - nmi.Key = k - case int: - nmi.Key = strconv.Itoa(k) - default: - return nil, fmt.Errorf("types don't match expect map key string or int got: %T", mi.Key) - } - - v, err := transformData(mi.Value) - if err != nil { - return nil, err - } - nmi.Value = v - o[i] = nmi - } - return o, nil - case map[interface{}]interface{}: - o := make(JSONMapSlice, 0, len(in)) - for ke, va := range in { - var nmi JSONMapItem - switch k := ke.(type) { - case string: - nmi.Key = k - case int: - nmi.Key = strconv.Itoa(k) - default: - return nil, fmt.Errorf("types don't match expect map key string or int got: %T", ke) - } - - v, err := transformData(va) - if err != nil { - return nil, err - } - nmi.Value = v - o = append(o, nmi) - } - return o, nil - case []interface{}: - len1 := len(in) - o := make([]interface{}, len1) - for i := 0; i < len1; i++ { - o[i], err = transformData(in[i]) - if err != nil { - return nil, err - } - } - return o, nil - } - return input, nil -} - -// YAMLDoc loads a yaml document from either http or a file and converts it to json -func YAMLDoc(path string) (json.RawMessage, error) { - yamlDoc, err := YAMLData(path) - if err != nil { - return nil, err - } - - data, err := YAMLToJSON(yamlDoc) - if err != nil { - return nil, err - } - - return json.RawMessage(data), nil -} - -// YAMLData loads a yaml document from either http or a file -func YAMLData(path string) (interface{}, error) { - data, err := LoadFromFileOrHTTP(path) - if err != nil { - return nil, err - } - - return BytesToYAMLDoc(data) -} diff --git a/vendor/github.com/go-openapi/swag/yaml_test.go b/vendor/github.com/go-openapi/swag/yaml_test.go deleted file mode 100644 index ee32fab7d9..0000000000 --- a/vendor/github.com/go-openapi/swag/yaml_test.go +++ /dev/null @@ -1,444 +0,0 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package swag - -import ( - "encoding/json" - "errors" - "net/http" - "net/http/httptest" - "testing" - - yaml "gopkg.in/yaml.v2" - - "github.com/stretchr/testify/assert" -) - -type failJSONMarhal struct { -} - -func (f failJSONMarhal) MarshalJSON() ([]byte, error) { - return nil, errors.New("expected") -} - -func TestLoadHTTPBytes(t *testing.T) { - _, err := LoadFromFileOrHTTP("httx://12394:abd") - assert.Error(t, err) - - serv := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - rw.WriteHeader(http.StatusNotFound) - })) - defer serv.Close() - - _, err = LoadFromFileOrHTTP(serv.URL) - assert.Error(t, err) - - ts2 := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - rw.WriteHeader(http.StatusOK) - rw.Write([]byte("the content")) - })) - defer ts2.Close() - - d, err := LoadFromFileOrHTTP(ts2.URL) - assert.NoError(t, err) - assert.Equal(t, []byte("the content"), d) -} - -func TestYAMLToJSON(t *testing.T) { - - sd := `--- -1: the int key value -name: a string value -'y': some value -` - var data yaml.MapSlice - yaml.Unmarshal([]byte(sd), &data) - - d, err := YAMLToJSON(data) - if assert.NoError(t, err) { - assert.Equal(t, `{"1":"the int key value","name":"a string value","y":"some value"}`, string(d)) - } - - data = append(data, yaml.MapItem{Key: true, Value: "the bool value"}) - d, err = YAMLToJSON(data) - assert.Error(t, err) - assert.Nil(t, d) - - data = data[:len(data)-1] - - tag := yaml.MapSlice{{Key: "name", Value: "tag name"}} - data = append(data, yaml.MapItem{Key: "tag", Value: tag}) - - d, err = YAMLToJSON(data) - assert.NoError(t, err) - assert.Equal(t, `{"1":"the int key value","name":"a string value","y":"some value","tag":{"name":"tag name"}}`, string(d)) - - tag = yaml.MapSlice{{Key: true, Value: "bool tag name"}} - data = append(data[:len(data)-1], yaml.MapItem{Key: "tag", Value: tag}) - - d, err = YAMLToJSON(data) - assert.Error(t, err) - assert.Nil(t, d) - - var lst []interface{} - lst = append(lst, "hello") - - d, err = YAMLToJSON(lst) - assert.NoError(t, err) - assert.Equal(t, []byte(`["hello"]`), []byte(d)) - - lst = append(lst, data) - - d, err = YAMLToJSON(lst) - assert.Error(t, err) - assert.Nil(t, d) - - // _, err := yamlToJSON(failJSONMarhal{}) - // assert.Error(t, err) - - _, err = BytesToYAMLDoc([]byte("- name: hello\n")) - assert.Error(t, err) - - dd, err := BytesToYAMLDoc([]byte("description: 'object created'\n")) - assert.NoError(t, err) - - d, err = YAMLToJSON(dd) - assert.NoError(t, err) - assert.Equal(t, json.RawMessage(`{"description":"object created"}`), d) -} - -func TestLoadStrategy(t *testing.T) { - - loader := func(p string) ([]byte, error) { - return []byte(yamlPetStore), nil - } - remLoader := func(p string) ([]byte, error) { - return []byte("not it"), nil - } - - ld := LoadStrategy("blah", loader, remLoader) - b, _ := ld("") - assert.Equal(t, []byte(yamlPetStore), b) - - serv := httptest.NewServer(http.HandlerFunc(yamlPestoreServer)) - defer serv.Close() - - s, err := YAMLDoc(serv.URL) - assert.NoError(t, err) - assert.NotNil(t, s) - - ts2 := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - rw.WriteHeader(http.StatusNotFound) - rw.Write([]byte("\n")) - })) - defer ts2.Close() - _, err = YAMLDoc(ts2.URL) - assert.Error(t, err) -} - -var yamlPestoreServer = func(rw http.ResponseWriter, r *http.Request) { - rw.WriteHeader(http.StatusOK) - rw.Write([]byte(yamlPetStore)) -} - -func TestWithYKey(t *testing.T) { - doc, err := BytesToYAMLDoc([]byte(withYKey)) - if assert.NoError(t, err) { - _, err := YAMLToJSON(doc) - if assert.Error(t, err) { - doc, err := BytesToYAMLDoc([]byte(withQuotedYKey)) - if assert.NoError(t, err) { - jsond, err := YAMLToJSON(doc) - if assert.NoError(t, err) { - var yt struct { - Definitions struct { - Viewbox struct { - Properties struct { - Y struct { - Type string `json:"type"` - } `json:"y"` - } `json:"properties"` - } `json:"viewbox"` - } `json:"definitions"` - } - if assert.NoError(t, json.Unmarshal(jsond, &yt)) { - assert.Equal(t, "integer", yt.Definitions.Viewbox.Properties.Y.Type) - } - } - } - } - - } -} - -const withQuotedYKey = `consumes: -- application/json -definitions: - viewBox: - type: object - properties: - x: - type: integer - format: int16 - # y -> types don't match: expect map key string or int get: bool - "y": - type: integer - format: int16 - width: - type: integer - format: int16 - height: - type: integer - format: int16 -info: - description: Test RESTful APIs - title: Test Server - version: 1.0.0 -basePath: /api -paths: - /test: - get: - operationId: findAll - parameters: - - name: since - in: query - type: integer - format: int64 - - name: limit - in: query - type: integer - format: int32 - default: 20 - responses: - 200: - description: Array[Trigger] - schema: - type: array - items: - $ref: "#/definitions/viewBox" -produces: -- application/json -schemes: -- https -swagger: "2.0" -` - -const withYKey = `consumes: -- application/json -definitions: - viewBox: - type: object - properties: - x: - type: integer - format: int16 - # y -> types don't match: expect map key string or int get: bool - y: - type: integer - format: int16 - width: - type: integer - format: int16 - height: - type: integer - format: int16 -info: - description: Test RESTful APIs - title: Test Server - version: 1.0.0 -basePath: /api -paths: - /test: - get: - operationId: findAll - parameters: - - name: since - in: query - type: integer - format: int64 - - name: limit - in: query - type: integer - format: int32 - default: 20 - responses: - 200: - description: Array[Trigger] - schema: - type: array - items: - $ref: "#/definitions/viewBox" -produces: -- application/json -schemes: -- https -swagger: "2.0" -` - -const yamlPetStore = `swagger: '2.0' -info: - version: '1.0.0' - title: Swagger Petstore - description: A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification - termsOfService: http://helloreverb.com/terms/ - contact: - name: Swagger API team - email: foo@example.com - url: http://swagger.io - license: - name: MIT - url: http://opensource.org/licenses/MIT -host: petstore.swagger.wordnik.com -basePath: /api -schemes: - - http -consumes: - - application/json -produces: - - application/json -paths: - /pets: - get: - description: Returns all pets from the system that the user has access to - operationId: findPets - produces: - - application/json - - application/xml - - text/xml - - text/html - parameters: - - name: tags - in: query - description: tags to filter by - required: false - type: array - items: - type: string - collectionFormat: csv - - name: limit - in: query - description: maximum number of results to return - required: false - type: integer - format: int32 - responses: - '200': - description: pet response - schema: - type: array - items: - $ref: '#/definitions/pet' - default: - description: unexpected error - schema: - $ref: '#/definitions/errorModel' - post: - description: Creates a new pet in the store. Duplicates are allowed - operationId: addPet - produces: - - application/json - parameters: - - name: pet - in: body - description: Pet to add to the store - required: true - schema: - $ref: '#/definitions/newPet' - responses: - '200': - description: pet response - schema: - $ref: '#/definitions/pet' - default: - description: unexpected error - schema: - $ref: '#/definitions/errorModel' - /pets/{id}: - get: - description: Returns a user based on a single ID, if the user does not have access to the pet - operationId: findPetById - produces: - - application/json - - application/xml - - text/xml - - text/html - parameters: - - name: id - in: path - description: ID of pet to fetch - required: true - type: integer - format: int64 - responses: - '200': - description: pet response - schema: - $ref: '#/definitions/pet' - default: - description: unexpected error - schema: - $ref: '#/definitions/errorModel' - delete: - description: deletes a single pet based on the ID supplied - operationId: deletePet - parameters: - - name: id - in: path - description: ID of pet to delete - required: true - type: integer - format: int64 - responses: - '204': - description: pet deleted - default: - description: unexpected error - schema: - $ref: '#/definitions/errorModel' -definitions: - pet: - required: - - id - - name - properties: - id: - type: integer - format: int64 - name: - type: string - tag: - type: string - newPet: - allOf: - - $ref: '#/definitions/pet' - - required: - - name - properties: - id: - type: integer - format: int64 - name: - type: string - errorModel: - required: - - code - - message - properties: - code: - type: integer - format: int32 - message: - type: string -` diff --git a/vendor/github.com/google/btree/LICENSE b/vendor/github.com/google/btree/LICENSE deleted file mode 100644 index d645695673..0000000000 --- a/vendor/github.com/google/btree/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/google/btree/README.md b/vendor/github.com/google/btree/README.md deleted file mode 100644 index 6062a4dacd..0000000000 --- a/vendor/github.com/google/btree/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# BTree implementation for Go - -![Travis CI Build Status](https://api.travis-ci.org/google/btree.svg?branch=master) - -This package provides an in-memory B-Tree implementation for Go, useful as -an ordered, mutable data structure. - -The API is based off of the wonderful -http://godoc.org/github.com/petar/GoLLRB/llrb, and is meant to allow btree to -act as a drop-in replacement for gollrb trees. - -See http://godoc.org/github.com/google/btree for documentation. diff --git a/vendor/github.com/google/btree/btree.go b/vendor/github.com/google/btree/btree.go deleted file mode 100644 index eb74b1d39c..0000000000 --- a/vendor/github.com/google/btree/btree.go +++ /dev/null @@ -1,821 +0,0 @@ -// Copyright 2014 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package btree implements in-memory B-Trees of arbitrary degree. -// -// btree implements an in-memory B-Tree for use as an ordered data structure. -// It is not meant for persistent storage solutions. -// -// It has a flatter structure than an equivalent red-black or other binary tree, -// which in some cases yields better memory usage and/or performance. -// See some discussion on the matter here: -// http://google-opensource.blogspot.com/2013/01/c-containers-that-save-memory-and-time.html -// Note, though, that this project is in no way related to the C++ B-Tree -// implementation written about there. -// -// Within this tree, each node contains a slice of items and a (possibly nil) -// slice of children. For basic numeric values or raw structs, this can cause -// efficiency differences when compared to equivalent C++ template code that -// stores values in arrays within the node: -// * Due to the overhead of storing values as interfaces (each -// value needs to be stored as the value itself, then 2 words for the -// interface pointing to that value and its type), resulting in higher -// memory use. -// * Since interfaces can point to values anywhere in memory, values are -// most likely not stored in contiguous blocks, resulting in a higher -// number of cache misses. -// These issues don't tend to matter, though, when working with strings or other -// heap-allocated structures, since C++-equivalent structures also must store -// pointers and also distribute their values across the heap. -// -// This implementation is designed to be a drop-in replacement to gollrb.LLRB -// trees, (http://github.com/petar/gollrb), an excellent and probably the most -// widely used ordered tree implementation in the Go ecosystem currently. -// Its functions, therefore, exactly mirror those of -// llrb.LLRB where possible. Unlike gollrb, though, we currently don't -// support storing multiple equivalent values. -package btree - -import ( - "fmt" - "io" - "sort" - "strings" - "sync" -) - -// Item represents a single object in the tree. -type Item interface { - // Less tests whether the current item is less than the given argument. - // - // This must provide a strict weak ordering. - // If !a.Less(b) && !b.Less(a), we treat this to mean a == b (i.e. we can only - // hold one of either a or b in the tree). - Less(than Item) bool -} - -const ( - DefaultFreeListSize = 32 -) - -var ( - nilItems = make(items, 16) - nilChildren = make(children, 16) -) - -// FreeList represents a free list of btree nodes. By default each -// BTree has its own FreeList, but multiple BTrees can share the same -// FreeList. -// Two Btrees using the same freelist are safe for concurrent write access. -type FreeList struct { - mu sync.Mutex - freelist []*node -} - -// NewFreeList creates a new free list. -// size is the maximum size of the returned free list. -func NewFreeList(size int) *FreeList { - return &FreeList{freelist: make([]*node, 0, size)} -} - -func (f *FreeList) newNode() (n *node) { - f.mu.Lock() - index := len(f.freelist) - 1 - if index < 0 { - f.mu.Unlock() - return new(node) - } - n = f.freelist[index] - f.freelist[index] = nil - f.freelist = f.freelist[:index] - f.mu.Unlock() - return -} - -func (f *FreeList) freeNode(n *node) { - f.mu.Lock() - if len(f.freelist) < cap(f.freelist) { - f.freelist = append(f.freelist, n) - } - f.mu.Unlock() -} - -// ItemIterator allows callers of Ascend* to iterate in-order over portions of -// the tree. When this function returns false, iteration will stop and the -// associated Ascend* function will immediately return. -type ItemIterator func(i Item) bool - -// New creates a new B-Tree with the given degree. -// -// New(2), for example, will create a 2-3-4 tree (each node contains 1-3 items -// and 2-4 children). -func New(degree int) *BTree { - return NewWithFreeList(degree, NewFreeList(DefaultFreeListSize)) -} - -// NewWithFreeList creates a new B-Tree that uses the given node free list. -func NewWithFreeList(degree int, f *FreeList) *BTree { - if degree <= 1 { - panic("bad degree") - } - return &BTree{ - degree: degree, - cow: ©OnWriteContext{freelist: f}, - } -} - -// items stores items in a node. -type items []Item - -// insertAt inserts a value into the given index, pushing all subsequent values -// forward. -func (s *items) insertAt(index int, item Item) { - *s = append(*s, nil) - if index < len(*s) { - copy((*s)[index+1:], (*s)[index:]) - } - (*s)[index] = item -} - -// removeAt removes a value at a given index, pulling all subsequent values -// back. -func (s *items) removeAt(index int) Item { - item := (*s)[index] - copy((*s)[index:], (*s)[index+1:]) - (*s)[len(*s)-1] = nil - *s = (*s)[:len(*s)-1] - return item -} - -// pop removes and returns the last element in the list. -func (s *items) pop() (out Item) { - index := len(*s) - 1 - out = (*s)[index] - (*s)[index] = nil - *s = (*s)[:index] - return -} - -// truncate truncates this instance at index so that it contains only the -// first index items. index must be less than or equal to length. -func (s *items) truncate(index int) { - var toClear items - *s, toClear = (*s)[:index], (*s)[index:] - for len(toClear) > 0 { - toClear = toClear[copy(toClear, nilItems):] - } -} - -// find returns the index where the given item should be inserted into this -// list. 'found' is true if the item already exists in the list at the given -// index. -func (s items) find(item Item) (index int, found bool) { - i := sort.Search(len(s), func(i int) bool { - return item.Less(s[i]) - }) - if i > 0 && !s[i-1].Less(item) { - return i - 1, true - } - return i, false -} - -// children stores child nodes in a node. -type children []*node - -// insertAt inserts a value into the given index, pushing all subsequent values -// forward. -func (s *children) insertAt(index int, n *node) { - *s = append(*s, nil) - if index < len(*s) { - copy((*s)[index+1:], (*s)[index:]) - } - (*s)[index] = n -} - -// removeAt removes a value at a given index, pulling all subsequent values -// back. -func (s *children) removeAt(index int) *node { - n := (*s)[index] - copy((*s)[index:], (*s)[index+1:]) - (*s)[len(*s)-1] = nil - *s = (*s)[:len(*s)-1] - return n -} - -// pop removes and returns the last element in the list. -func (s *children) pop() (out *node) { - index := len(*s) - 1 - out = (*s)[index] - (*s)[index] = nil - *s = (*s)[:index] - return -} - -// truncate truncates this instance at index so that it contains only the -// first index children. index must be less than or equal to length. -func (s *children) truncate(index int) { - var toClear children - *s, toClear = (*s)[:index], (*s)[index:] - for len(toClear) > 0 { - toClear = toClear[copy(toClear, nilChildren):] - } -} - -// node is an internal node in a tree. -// -// It must at all times maintain the invariant that either -// * len(children) == 0, len(items) unconstrained -// * len(children) == len(items) + 1 -type node struct { - items items - children children - cow *copyOnWriteContext -} - -func (n *node) mutableFor(cow *copyOnWriteContext) *node { - if n.cow == cow { - return n - } - out := cow.newNode() - if cap(out.items) >= len(n.items) { - out.items = out.items[:len(n.items)] - } else { - out.items = make(items, len(n.items), cap(n.items)) - } - copy(out.items, n.items) - // Copy children - if cap(out.children) >= len(n.children) { - out.children = out.children[:len(n.children)] - } else { - out.children = make(children, len(n.children), cap(n.children)) - } - copy(out.children, n.children) - return out -} - -func (n *node) mutableChild(i int) *node { - c := n.children[i].mutableFor(n.cow) - n.children[i] = c - return c -} - -// split splits the given node at the given index. The current node shrinks, -// and this function returns the item that existed at that index and a new node -// containing all items/children after it. -func (n *node) split(i int) (Item, *node) { - item := n.items[i] - next := n.cow.newNode() - next.items = append(next.items, n.items[i+1:]...) - n.items.truncate(i) - if len(n.children) > 0 { - next.children = append(next.children, n.children[i+1:]...) - n.children.truncate(i + 1) - } - return item, next -} - -// maybeSplitChild checks if a child should be split, and if so splits it. -// Returns whether or not a split occurred. -func (n *node) maybeSplitChild(i, maxItems int) bool { - if len(n.children[i].items) < maxItems { - return false - } - first := n.mutableChild(i) - item, second := first.split(maxItems / 2) - n.items.insertAt(i, item) - n.children.insertAt(i+1, second) - return true -} - -// insert inserts an item into the subtree rooted at this node, making sure -// no nodes in the subtree exceed maxItems items. Should an equivalent item be -// be found/replaced by insert, it will be returned. -func (n *node) insert(item Item, maxItems int) Item { - i, found := n.items.find(item) - if found { - out := n.items[i] - n.items[i] = item - return out - } - if len(n.children) == 0 { - n.items.insertAt(i, item) - return nil - } - if n.maybeSplitChild(i, maxItems) { - inTree := n.items[i] - switch { - case item.Less(inTree): - // no change, we want first split node - case inTree.Less(item): - i++ // we want second split node - default: - out := n.items[i] - n.items[i] = item - return out - } - } - return n.mutableChild(i).insert(item, maxItems) -} - -// get finds the given key in the subtree and returns it. -func (n *node) get(key Item) Item { - i, found := n.items.find(key) - if found { - return n.items[i] - } else if len(n.children) > 0 { - return n.children[i].get(key) - } - return nil -} - -// min returns the first item in the subtree. -func min(n *node) Item { - if n == nil { - return nil - } - for len(n.children) > 0 { - n = n.children[0] - } - if len(n.items) == 0 { - return nil - } - return n.items[0] -} - -// max returns the last item in the subtree. -func max(n *node) Item { - if n == nil { - return nil - } - for len(n.children) > 0 { - n = n.children[len(n.children)-1] - } - if len(n.items) == 0 { - return nil - } - return n.items[len(n.items)-1] -} - -// toRemove details what item to remove in a node.remove call. -type toRemove int - -const ( - removeItem toRemove = iota // removes the given item - removeMin // removes smallest item in the subtree - removeMax // removes largest item in the subtree -) - -// remove removes an item from the subtree rooted at this node. -func (n *node) remove(item Item, minItems int, typ toRemove) Item { - var i int - var found bool - switch typ { - case removeMax: - if len(n.children) == 0 { - return n.items.pop() - } - i = len(n.items) - case removeMin: - if len(n.children) == 0 { - return n.items.removeAt(0) - } - i = 0 - case removeItem: - i, found = n.items.find(item) - if len(n.children) == 0 { - if found { - return n.items.removeAt(i) - } - return nil - } - default: - panic("invalid type") - } - // If we get to here, we have children. - if len(n.children[i].items) <= minItems { - return n.growChildAndRemove(i, item, minItems, typ) - } - child := n.mutableChild(i) - // Either we had enough items to begin with, or we've done some - // merging/stealing, because we've got enough now and we're ready to return - // stuff. - if found { - // The item exists at index 'i', and the child we've selected can give us a - // predecessor, since if we've gotten here it's got > minItems items in it. - out := n.items[i] - // We use our special-case 'remove' call with typ=maxItem to pull the - // predecessor of item i (the rightmost leaf of our immediate left child) - // and set it into where we pulled the item from. - n.items[i] = child.remove(nil, minItems, removeMax) - return out - } - // Final recursive call. Once we're here, we know that the item isn't in this - // node and that the child is big enough to remove from. - return child.remove(item, minItems, typ) -} - -// growChildAndRemove grows child 'i' to make sure it's possible to remove an -// item from it while keeping it at minItems, then calls remove to actually -// remove it. -// -// Most documentation says we have to do two sets of special casing: -// 1) item is in this node -// 2) item is in child -// In both cases, we need to handle the two subcases: -// A) node has enough values that it can spare one -// B) node doesn't have enough values -// For the latter, we have to check: -// a) left sibling has node to spare -// b) right sibling has node to spare -// c) we must merge -// To simplify our code here, we handle cases #1 and #2 the same: -// If a node doesn't have enough items, we make sure it does (using a,b,c). -// We then simply redo our remove call, and the second time (regardless of -// whether we're in case 1 or 2), we'll have enough items and can guarantee -// that we hit case A. -func (n *node) growChildAndRemove(i int, item Item, minItems int, typ toRemove) Item { - if i > 0 && len(n.children[i-1].items) > minItems { - // Steal from left child - child := n.mutableChild(i) - stealFrom := n.mutableChild(i - 1) - stolenItem := stealFrom.items.pop() - child.items.insertAt(0, n.items[i-1]) - n.items[i-1] = stolenItem - if len(stealFrom.children) > 0 { - child.children.insertAt(0, stealFrom.children.pop()) - } - } else if i < len(n.items) && len(n.children[i+1].items) > minItems { - // steal from right child - child := n.mutableChild(i) - stealFrom := n.mutableChild(i + 1) - stolenItem := stealFrom.items.removeAt(0) - child.items = append(child.items, n.items[i]) - n.items[i] = stolenItem - if len(stealFrom.children) > 0 { - child.children = append(child.children, stealFrom.children.removeAt(0)) - } - } else { - if i >= len(n.items) { - i-- - } - child := n.mutableChild(i) - // merge with right child - mergeItem := n.items.removeAt(i) - mergeChild := n.children.removeAt(i + 1) - child.items = append(child.items, mergeItem) - child.items = append(child.items, mergeChild.items...) - child.children = append(child.children, mergeChild.children...) - n.cow.freeNode(mergeChild) - } - return n.remove(item, minItems, typ) -} - -type direction int - -const ( - descend = direction(-1) - ascend = direction(+1) -) - -// iterate provides a simple method for iterating over elements in the tree. -// -// When ascending, the 'start' should be less than 'stop' and when descending, -// the 'start' should be greater than 'stop'. Setting 'includeStart' to true -// will force the iterator to include the first item when it equals 'start', -// thus creating a "greaterOrEqual" or "lessThanEqual" rather than just a -// "greaterThan" or "lessThan" queries. -func (n *node) iterate(dir direction, start, stop Item, includeStart bool, hit bool, iter ItemIterator) (bool, bool) { - var ok bool - switch dir { - case ascend: - for i := 0; i < len(n.items); i++ { - if start != nil && n.items[i].Less(start) { - continue - } - if len(n.children) > 0 { - if hit, ok = n.children[i].iterate(dir, start, stop, includeStart, hit, iter); !ok { - return hit, false - } - } - if !includeStart && !hit && start != nil && !start.Less(n.items[i]) { - hit = true - continue - } - hit = true - if stop != nil && !n.items[i].Less(stop) { - return hit, false - } - if !iter(n.items[i]) { - return hit, false - } - } - if len(n.children) > 0 { - if hit, ok = n.children[len(n.children)-1].iterate(dir, start, stop, includeStart, hit, iter); !ok { - return hit, false - } - } - case descend: - for i := len(n.items) - 1; i >= 0; i-- { - if start != nil && !n.items[i].Less(start) { - if !includeStart || hit || start.Less(n.items[i]) { - continue - } - } - if len(n.children) > 0 { - if hit, ok = n.children[i+1].iterate(dir, start, stop, includeStart, hit, iter); !ok { - return hit, false - } - } - if stop != nil && !stop.Less(n.items[i]) { - return hit, false // continue - } - hit = true - if !iter(n.items[i]) { - return hit, false - } - } - if len(n.children) > 0 { - if hit, ok = n.children[0].iterate(dir, start, stop, includeStart, hit, iter); !ok { - return hit, false - } - } - } - return hit, true -} - -// Used for testing/debugging purposes. -func (n *node) print(w io.Writer, level int) { - fmt.Fprintf(w, "%sNODE:%v\n", strings.Repeat(" ", level), n.items) - for _, c := range n.children { - c.print(w, level+1) - } -} - -// BTree is an implementation of a B-Tree. -// -// BTree stores Item instances in an ordered structure, allowing easy insertion, -// removal, and iteration. -// -// Write operations are not safe for concurrent mutation by multiple -// goroutines, but Read operations are. -type BTree struct { - degree int - length int - root *node - cow *copyOnWriteContext -} - -// copyOnWriteContext pointers determine node ownership... a tree with a write -// context equivalent to a node's write context is allowed to modify that node. -// A tree whose write context does not match a node's is not allowed to modify -// it, and must create a new, writable copy (IE: it's a Clone). -// -// When doing any write operation, we maintain the invariant that the current -// node's context is equal to the context of the tree that requested the write. -// We do this by, before we descend into any node, creating a copy with the -// correct context if the contexts don't match. -// -// Since the node we're currently visiting on any write has the requesting -// tree's context, that node is modifiable in place. Children of that node may -// not share context, but before we descend into them, we'll make a mutable -// copy. -type copyOnWriteContext struct { - freelist *FreeList -} - -// Clone clones the btree, lazily. Clone should not be called concurrently, -// but the original tree (t) and the new tree (t2) can be used concurrently -// once the Clone call completes. -// -// The internal tree structure of b is marked read-only and shared between t and -// t2. Writes to both t and t2 use copy-on-write logic, creating new nodes -// whenever one of b's original nodes would have been modified. Read operations -// should have no performance degredation. Write operations for both t and t2 -// will initially experience minor slow-downs caused by additional allocs and -// copies due to the aforementioned copy-on-write logic, but should converge to -// the original performance characteristics of the original tree. -func (t *BTree) Clone() (t2 *BTree) { - // Create two entirely new copy-on-write contexts. - // This operation effectively creates three trees: - // the original, shared nodes (old b.cow) - // the new b.cow nodes - // the new out.cow nodes - cow1, cow2 := *t.cow, *t.cow - out := *t - t.cow = &cow1 - out.cow = &cow2 - return &out -} - -// maxItems returns the max number of items to allow per node. -func (t *BTree) maxItems() int { - return t.degree*2 - 1 -} - -// minItems returns the min number of items to allow per node (ignored for the -// root node). -func (t *BTree) minItems() int { - return t.degree - 1 -} - -func (c *copyOnWriteContext) newNode() (n *node) { - n = c.freelist.newNode() - n.cow = c - return -} - -func (c *copyOnWriteContext) freeNode(n *node) { - if n.cow == c { - // clear to allow GC - n.items.truncate(0) - n.children.truncate(0) - n.cow = nil - c.freelist.freeNode(n) - } -} - -// ReplaceOrInsert adds the given item to the tree. If an item in the tree -// already equals the given one, it is removed from the tree and returned. -// Otherwise, nil is returned. -// -// nil cannot be added to the tree (will panic). -func (t *BTree) ReplaceOrInsert(item Item) Item { - if item == nil { - panic("nil item being added to BTree") - } - if t.root == nil { - t.root = t.cow.newNode() - t.root.items = append(t.root.items, item) - t.length++ - return nil - } else { - t.root = t.root.mutableFor(t.cow) - if len(t.root.items) >= t.maxItems() { - item2, second := t.root.split(t.maxItems() / 2) - oldroot := t.root - t.root = t.cow.newNode() - t.root.items = append(t.root.items, item2) - t.root.children = append(t.root.children, oldroot, second) - } - } - out := t.root.insert(item, t.maxItems()) - if out == nil { - t.length++ - } - return out -} - -// Delete removes an item equal to the passed in item from the tree, returning -// it. If no such item exists, returns nil. -func (t *BTree) Delete(item Item) Item { - return t.deleteItem(item, removeItem) -} - -// DeleteMin removes the smallest item in the tree and returns it. -// If no such item exists, returns nil. -func (t *BTree) DeleteMin() Item { - return t.deleteItem(nil, removeMin) -} - -// DeleteMax removes the largest item in the tree and returns it. -// If no such item exists, returns nil. -func (t *BTree) DeleteMax() Item { - return t.deleteItem(nil, removeMax) -} - -func (t *BTree) deleteItem(item Item, typ toRemove) Item { - if t.root == nil || len(t.root.items) == 0 { - return nil - } - t.root = t.root.mutableFor(t.cow) - out := t.root.remove(item, t.minItems(), typ) - if len(t.root.items) == 0 && len(t.root.children) > 0 { - oldroot := t.root - t.root = t.root.children[0] - t.cow.freeNode(oldroot) - } - if out != nil { - t.length-- - } - return out -} - -// AscendRange calls the iterator for every value in the tree within the range -// [greaterOrEqual, lessThan), until iterator returns false. -func (t *BTree) AscendRange(greaterOrEqual, lessThan Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(ascend, greaterOrEqual, lessThan, true, false, iterator) -} - -// AscendLessThan calls the iterator for every value in the tree within the range -// [first, pivot), until iterator returns false. -func (t *BTree) AscendLessThan(pivot Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(ascend, nil, pivot, false, false, iterator) -} - -// AscendGreaterOrEqual calls the iterator for every value in the tree within -// the range [pivot, last], until iterator returns false. -func (t *BTree) AscendGreaterOrEqual(pivot Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(ascend, pivot, nil, true, false, iterator) -} - -// Ascend calls the iterator for every value in the tree within the range -// [first, last], until iterator returns false. -func (t *BTree) Ascend(iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(ascend, nil, nil, false, false, iterator) -} - -// DescendRange calls the iterator for every value in the tree within the range -// [lessOrEqual, greaterThan), until iterator returns false. -func (t *BTree) DescendRange(lessOrEqual, greaterThan Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(descend, lessOrEqual, greaterThan, true, false, iterator) -} - -// DescendLessOrEqual calls the iterator for every value in the tree within the range -// [pivot, first], until iterator returns false. -func (t *BTree) DescendLessOrEqual(pivot Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(descend, pivot, nil, true, false, iterator) -} - -// DescendGreaterThan calls the iterator for every value in the tree within -// the range (pivot, last], until iterator returns false. -func (t *BTree) DescendGreaterThan(pivot Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(descend, nil, pivot, false, false, iterator) -} - -// Descend calls the iterator for every value in the tree within the range -// [last, first], until iterator returns false. -func (t *BTree) Descend(iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(descend, nil, nil, false, false, iterator) -} - -// Get looks for the key item in the tree, returning it. It returns nil if -// unable to find that item. -func (t *BTree) Get(key Item) Item { - if t.root == nil { - return nil - } - return t.root.get(key) -} - -// Min returns the smallest item in the tree, or nil if the tree is empty. -func (t *BTree) Min() Item { - return min(t.root) -} - -// Max returns the largest item in the tree, or nil if the tree is empty. -func (t *BTree) Max() Item { - return max(t.root) -} - -// Has returns true if the given key is in the tree. -func (t *BTree) Has(key Item) bool { - return t.Get(key) != nil -} - -// Len returns the number of items currently in the tree. -func (t *BTree) Len() int { - return t.length -} - -// Int implements the Item interface for integers. -type Int int - -// Less returns true if int(a) < int(b). -func (a Int) Less(b Item) bool { - return a < b.(Int) -} diff --git a/vendor/github.com/google/btree/btree_mem.go b/vendor/github.com/google/btree/btree_mem.go deleted file mode 100644 index cb95b7fa1b..0000000000 --- a/vendor/github.com/google/btree/btree_mem.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2014 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build ignore - -// This binary compares memory usage between btree and gollrb. -package main - -import ( - "flag" - "fmt" - "math/rand" - "runtime" - "time" - - "github.com/google/btree" - "github.com/petar/GoLLRB/llrb" -) - -var ( - size = flag.Int("size", 1000000, "size of the tree to build") - degree = flag.Int("degree", 8, "degree of btree") - gollrb = flag.Bool("llrb", false, "use llrb instead of btree") -) - -func main() { - flag.Parse() - vals := rand.Perm(*size) - var t, v interface{} - v = vals - var stats runtime.MemStats - for i := 0; i < 10; i++ { - runtime.GC() - } - fmt.Println("-------- BEFORE ----------") - runtime.ReadMemStats(&stats) - fmt.Printf("%+v\n", stats) - start := time.Now() - if *gollrb { - tr := llrb.New() - for _, v := range vals { - tr.ReplaceOrInsert(llrb.Int(v)) - } - t = tr // keep it around - } else { - tr := btree.New(*degree) - for _, v := range vals { - tr.ReplaceOrInsert(btree.Int(v)) - } - t = tr // keep it around - } - fmt.Printf("%v inserts in %v\n", *size, time.Since(start)) - fmt.Println("-------- AFTER ----------") - runtime.ReadMemStats(&stats) - fmt.Printf("%+v\n", stats) - for i := 0; i < 10; i++ { - runtime.GC() - } - fmt.Println("-------- AFTER GC ----------") - runtime.ReadMemStats(&stats) - fmt.Printf("%+v\n", stats) - if t == v { - fmt.Println("to make sure vals and tree aren't GC'd") - } -} diff --git a/vendor/github.com/google/btree/btree_test.go b/vendor/github.com/google/btree/btree_test.go deleted file mode 100644 index 5da9d8b694..0000000000 --- a/vendor/github.com/google/btree/btree_test.go +++ /dev/null @@ -1,689 +0,0 @@ -// Copyright 2014 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package btree - -import ( - "flag" - "fmt" - "math/rand" - "reflect" - "sort" - "sync" - "testing" - "time" -) - -func init() { - seed := time.Now().Unix() - fmt.Println(seed) - rand.Seed(seed) -} - -// perm returns a random permutation of n Int items in the range [0, n). -func perm(n int) (out []Item) { - for _, v := range rand.Perm(n) { - out = append(out, Int(v)) - } - return -} - -// rang returns an ordered list of Int items in the range [0, n). -func rang(n int) (out []Item) { - for i := 0; i < n; i++ { - out = append(out, Int(i)) - } - return -} - -// all extracts all items from a tree in order as a slice. -func all(t *BTree) (out []Item) { - t.Ascend(func(a Item) bool { - out = append(out, a) - return true - }) - return -} - -// rangerev returns a reversed ordered list of Int items in the range [0, n). -func rangrev(n int) (out []Item) { - for i := n - 1; i >= 0; i-- { - out = append(out, Int(i)) - } - return -} - -// allrev extracts all items from a tree in reverse order as a slice. -func allrev(t *BTree) (out []Item) { - t.Descend(func(a Item) bool { - out = append(out, a) - return true - }) - return -} - -var btreeDegree = flag.Int("degree", 32, "B-Tree degree") - -func TestBTree(t *testing.T) { - tr := New(*btreeDegree) - const treeSize = 10000 - for i := 0; i < 10; i++ { - if min := tr.Min(); min != nil { - t.Fatalf("empty min, got %+v", min) - } - if max := tr.Max(); max != nil { - t.Fatalf("empty max, got %+v", max) - } - for _, item := range perm(treeSize) { - if x := tr.ReplaceOrInsert(item); x != nil { - t.Fatal("insert found item", item) - } - } - for _, item := range perm(treeSize) { - if x := tr.ReplaceOrInsert(item); x == nil { - t.Fatal("insert didn't find item", item) - } - } - if min, want := tr.Min(), Item(Int(0)); min != want { - t.Fatalf("min: want %+v, got %+v", want, min) - } - if max, want := tr.Max(), Item(Int(treeSize-1)); max != want { - t.Fatalf("max: want %+v, got %+v", want, max) - } - got := all(tr) - want := rang(treeSize) - if !reflect.DeepEqual(got, want) { - t.Fatalf("mismatch:\n got: %v\nwant: %v", got, want) - } - - gotrev := allrev(tr) - wantrev := rangrev(treeSize) - if !reflect.DeepEqual(gotrev, wantrev) { - t.Fatalf("mismatch:\n got: %v\nwant: %v", got, want) - } - - for _, item := range perm(treeSize) { - if x := tr.Delete(item); x == nil { - t.Fatalf("didn't find %v", item) - } - } - if got = all(tr); len(got) > 0 { - t.Fatalf("some left!: %v", got) - } - } -} - -func ExampleBTree() { - tr := New(*btreeDegree) - for i := Int(0); i < 10; i++ { - tr.ReplaceOrInsert(i) - } - fmt.Println("len: ", tr.Len()) - fmt.Println("get3: ", tr.Get(Int(3))) - fmt.Println("get100: ", tr.Get(Int(100))) - fmt.Println("del4: ", tr.Delete(Int(4))) - fmt.Println("del100: ", tr.Delete(Int(100))) - fmt.Println("replace5: ", tr.ReplaceOrInsert(Int(5))) - fmt.Println("replace100:", tr.ReplaceOrInsert(Int(100))) - fmt.Println("min: ", tr.Min()) - fmt.Println("delmin: ", tr.DeleteMin()) - fmt.Println("max: ", tr.Max()) - fmt.Println("delmax: ", tr.DeleteMax()) - fmt.Println("len: ", tr.Len()) - // Output: - // len: 10 - // get3: 3 - // get100: - // del4: 4 - // del100: - // replace5: 5 - // replace100: - // min: 0 - // delmin: 0 - // max: 100 - // delmax: 100 - // len: 8 -} - -func TestDeleteMin(t *testing.T) { - tr := New(3) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - for v := tr.DeleteMin(); v != nil; v = tr.DeleteMin() { - got = append(got, v) - } - if want := rang(100); !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } -} - -func TestDeleteMax(t *testing.T) { - tr := New(3) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - for v := tr.DeleteMax(); v != nil; v = tr.DeleteMax() { - got = append(got, v) - } - // Reverse our list. - for i := 0; i < len(got)/2; i++ { - got[i], got[len(got)-i-1] = got[len(got)-i-1], got[i] - } - if want := rang(100); !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } -} - -func TestAscendRange(t *testing.T) { - tr := New(2) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - tr.AscendRange(Int(40), Int(60), func(a Item) bool { - got = append(got, a) - return true - }) - if want := rang(100)[40:60]; !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } - got = got[:0] - tr.AscendRange(Int(40), Int(60), func(a Item) bool { - if a.(Int) > 50 { - return false - } - got = append(got, a) - return true - }) - if want := rang(100)[40:51]; !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } -} - -func TestDescendRange(t *testing.T) { - tr := New(2) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - tr.DescendRange(Int(60), Int(40), func(a Item) bool { - got = append(got, a) - return true - }) - if want := rangrev(100)[39:59]; !reflect.DeepEqual(got, want) { - t.Fatalf("descendrange:\n got: %v\nwant: %v", got, want) - } - got = got[:0] - tr.DescendRange(Int(60), Int(40), func(a Item) bool { - if a.(Int) < 50 { - return false - } - got = append(got, a) - return true - }) - if want := rangrev(100)[39:50]; !reflect.DeepEqual(got, want) { - t.Fatalf("descendrange:\n got: %v\nwant: %v", got, want) - } -} -func TestAscendLessThan(t *testing.T) { - tr := New(*btreeDegree) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - tr.AscendLessThan(Int(60), func(a Item) bool { - got = append(got, a) - return true - }) - if want := rang(100)[:60]; !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } - got = got[:0] - tr.AscendLessThan(Int(60), func(a Item) bool { - if a.(Int) > 50 { - return false - } - got = append(got, a) - return true - }) - if want := rang(100)[:51]; !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } -} - -func TestDescendLessOrEqual(t *testing.T) { - tr := New(*btreeDegree) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - tr.DescendLessOrEqual(Int(40), func(a Item) bool { - got = append(got, a) - return true - }) - if want := rangrev(100)[59:]; !reflect.DeepEqual(got, want) { - t.Fatalf("descendlessorequal:\n got: %v\nwant: %v", got, want) - } - got = got[:0] - tr.DescendLessOrEqual(Int(60), func(a Item) bool { - if a.(Int) < 50 { - return false - } - got = append(got, a) - return true - }) - if want := rangrev(100)[39:50]; !reflect.DeepEqual(got, want) { - t.Fatalf("descendlessorequal:\n got: %v\nwant: %v", got, want) - } -} -func TestAscendGreaterOrEqual(t *testing.T) { - tr := New(*btreeDegree) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - tr.AscendGreaterOrEqual(Int(40), func(a Item) bool { - got = append(got, a) - return true - }) - if want := rang(100)[40:]; !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } - got = got[:0] - tr.AscendGreaterOrEqual(Int(40), func(a Item) bool { - if a.(Int) > 50 { - return false - } - got = append(got, a) - return true - }) - if want := rang(100)[40:51]; !reflect.DeepEqual(got, want) { - t.Fatalf("ascendrange:\n got: %v\nwant: %v", got, want) - } -} - -func TestDescendGreaterThan(t *testing.T) { - tr := New(*btreeDegree) - for _, v := range perm(100) { - tr.ReplaceOrInsert(v) - } - var got []Item - tr.DescendGreaterThan(Int(40), func(a Item) bool { - got = append(got, a) - return true - }) - if want := rangrev(100)[:59]; !reflect.DeepEqual(got, want) { - t.Fatalf("descendgreaterthan:\n got: %v\nwant: %v", got, want) - } - got = got[:0] - tr.DescendGreaterThan(Int(40), func(a Item) bool { - if a.(Int) < 50 { - return false - } - got = append(got, a) - return true - }) - if want := rangrev(100)[:50]; !reflect.DeepEqual(got, want) { - t.Fatalf("descendgreaterthan:\n got: %v\nwant: %v", got, want) - } -} - -const benchmarkTreeSize = 10000 - -func BenchmarkInsert(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - b.StartTimer() - i := 0 - for i < b.N { - tr := New(*btreeDegree) - for _, item := range insertP { - tr.ReplaceOrInsert(item) - i++ - if i >= b.N { - return - } - } - } -} - -func BenchmarkDeleteInsert(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, item := range insertP { - tr.ReplaceOrInsert(item) - } - b.StartTimer() - for i := 0; i < b.N; i++ { - tr.Delete(insertP[i%benchmarkTreeSize]) - tr.ReplaceOrInsert(insertP[i%benchmarkTreeSize]) - } -} - -func BenchmarkDeleteInsertCloneOnce(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, item := range insertP { - tr.ReplaceOrInsert(item) - } - tr = tr.Clone() - b.StartTimer() - for i := 0; i < b.N; i++ { - tr.Delete(insertP[i%benchmarkTreeSize]) - tr.ReplaceOrInsert(insertP[i%benchmarkTreeSize]) - } -} - -func BenchmarkDeleteInsertCloneEachTime(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, item := range insertP { - tr.ReplaceOrInsert(item) - } - b.StartTimer() - for i := 0; i < b.N; i++ { - tr = tr.Clone() - tr.Delete(insertP[i%benchmarkTreeSize]) - tr.ReplaceOrInsert(insertP[i%benchmarkTreeSize]) - } -} - -func BenchmarkDelete(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - removeP := perm(benchmarkTreeSize) - b.StartTimer() - i := 0 - for i < b.N { - b.StopTimer() - tr := New(*btreeDegree) - for _, v := range insertP { - tr.ReplaceOrInsert(v) - } - b.StartTimer() - for _, item := range removeP { - tr.Delete(item) - i++ - if i >= b.N { - return - } - } - if tr.Len() > 0 { - panic(tr.Len()) - } - } -} - -func BenchmarkGet(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - removeP := perm(benchmarkTreeSize) - b.StartTimer() - i := 0 - for i < b.N { - b.StopTimer() - tr := New(*btreeDegree) - for _, v := range insertP { - tr.ReplaceOrInsert(v) - } - b.StartTimer() - for _, item := range removeP { - tr.Get(item) - i++ - if i >= b.N { - return - } - } - } -} - -func BenchmarkGetCloneEachTime(b *testing.B) { - b.StopTimer() - insertP := perm(benchmarkTreeSize) - removeP := perm(benchmarkTreeSize) - b.StartTimer() - i := 0 - for i < b.N { - b.StopTimer() - tr := New(*btreeDegree) - for _, v := range insertP { - tr.ReplaceOrInsert(v) - } - b.StartTimer() - for _, item := range removeP { - tr = tr.Clone() - tr.Get(item) - i++ - if i >= b.N { - return - } - } - } -} - -type byInts []Item - -func (a byInts) Len() int { - return len(a) -} - -func (a byInts) Less(i, j int) bool { - return a[i].(Int) < a[j].(Int) -} - -func (a byInts) Swap(i, j int) { - a[i], a[j] = a[j], a[i] -} - -func BenchmarkAscend(b *testing.B) { - arr := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, v := range arr { - tr.ReplaceOrInsert(v) - } - sort.Sort(byInts(arr)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - j := 0 - tr.Ascend(func(item Item) bool { - if item.(Int) != arr[j].(Int) { - b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) - } - j++ - return true - }) - } -} - -func BenchmarkDescend(b *testing.B) { - arr := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, v := range arr { - tr.ReplaceOrInsert(v) - } - sort.Sort(byInts(arr)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - j := len(arr) - 1 - tr.Descend(func(item Item) bool { - if item.(Int) != arr[j].(Int) { - b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) - } - j-- - return true - }) - } -} -func BenchmarkAscendRange(b *testing.B) { - arr := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, v := range arr { - tr.ReplaceOrInsert(v) - } - sort.Sort(byInts(arr)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - j := 100 - tr.AscendRange(Int(100), arr[len(arr)-100], func(item Item) bool { - if item.(Int) != arr[j].(Int) { - b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) - } - j++ - return true - }) - if j != len(arr)-100 { - b.Fatalf("expected: %v, got %v", len(arr)-100, j) - } - } -} - -func BenchmarkDescendRange(b *testing.B) { - arr := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, v := range arr { - tr.ReplaceOrInsert(v) - } - sort.Sort(byInts(arr)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - j := len(arr) - 100 - tr.DescendRange(arr[len(arr)-100], Int(100), func(item Item) bool { - if item.(Int) != arr[j].(Int) { - b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) - } - j-- - return true - }) - if j != 100 { - b.Fatalf("expected: %v, got %v", len(arr)-100, j) - } - } -} -func BenchmarkAscendGreaterOrEqual(b *testing.B) { - arr := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, v := range arr { - tr.ReplaceOrInsert(v) - } - sort.Sort(byInts(arr)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - j := 100 - k := 0 - tr.AscendGreaterOrEqual(Int(100), func(item Item) bool { - if item.(Int) != arr[j].(Int) { - b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) - } - j++ - k++ - return true - }) - if j != len(arr) { - b.Fatalf("expected: %v, got %v", len(arr), j) - } - if k != len(arr)-100 { - b.Fatalf("expected: %v, got %v", len(arr)-100, k) - } - } -} -func BenchmarkDescendLessOrEqual(b *testing.B) { - arr := perm(benchmarkTreeSize) - tr := New(*btreeDegree) - for _, v := range arr { - tr.ReplaceOrInsert(v) - } - sort.Sort(byInts(arr)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - j := len(arr) - 100 - k := len(arr) - tr.DescendLessOrEqual(arr[len(arr)-100], func(item Item) bool { - if item.(Int) != arr[j].(Int) { - b.Fatalf("mismatch: expected: %v, got %v", arr[j].(Int), item.(Int)) - } - j-- - k-- - return true - }) - if j != -1 { - b.Fatalf("expected: %v, got %v", -1, j) - } - if k != 99 { - b.Fatalf("expected: %v, got %v", 99, k) - } - } -} - -const cloneTestSize = 10000 - -func cloneTest(t *testing.T, b *BTree, start int, p []Item, wg *sync.WaitGroup, trees *[]*BTree) { - t.Logf("Starting new clone at %v", start) - *trees = append(*trees, b) - for i := start; i < cloneTestSize; i++ { - b.ReplaceOrInsert(p[i]) - if i%(cloneTestSize/5) == 0 { - wg.Add(1) - go cloneTest(t, b.Clone(), i+1, p, wg, trees) - } - } - wg.Done() -} - -func TestCloneConcurrentOperations(t *testing.T) { - b := New(*btreeDegree) - trees := []*BTree{} - p := perm(cloneTestSize) - var wg sync.WaitGroup - wg.Add(1) - go cloneTest(t, b, 0, p, &wg, &trees) - wg.Wait() - want := rang(cloneTestSize) - t.Logf("Starting equality checks on %d trees", len(trees)) - for i, tree := range trees { - if !reflect.DeepEqual(want, all(tree)) { - t.Errorf("tree %v mismatch", i) - } - } - t.Log("Removing half from first half") - toRemove := rang(cloneTestSize)[cloneTestSize/2:] - for i := 0; i < len(trees)/2; i++ { - tree := trees[i] - wg.Add(1) - go func() { - for _, item := range toRemove { - tree.Delete(item) - } - wg.Done() - }() - } - wg.Wait() - t.Log("Checking all values again") - for i, tree := range trees { - var wantpart []Item - if i < len(trees)/2 { - wantpart = want[:cloneTestSize/2] - } else { - wantpart = want - } - if got := all(tree); !reflect.DeepEqual(wantpart, got) { - t.Errorf("tree %v mismatch, want %v got %v", i, len(want), len(got)) - } - } -} diff --git a/vendor/github.com/gregjones/httpcache/LICENSE.txt b/vendor/github.com/gregjones/httpcache/LICENSE.txt deleted file mode 100644 index 81316beb0c..0000000000 --- a/vendor/github.com/gregjones/httpcache/LICENSE.txt +++ /dev/null @@ -1,7 +0,0 @@ -Copyright © 2012 Greg Jones (greg.jones@gmail.com) - -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. \ No newline at end of file diff --git a/vendor/github.com/gregjones/httpcache/README.md b/vendor/github.com/gregjones/httpcache/README.md deleted file mode 100644 index 61bd830e57..0000000000 --- a/vendor/github.com/gregjones/httpcache/README.md +++ /dev/null @@ -1,24 +0,0 @@ -httpcache -========= - -[![Build Status](https://travis-ci.org/gregjones/httpcache.svg?branch=master)](https://travis-ci.org/gregjones/httpcache) [![GoDoc](https://godoc.org/github.com/gregjones/httpcache?status.svg)](https://godoc.org/github.com/gregjones/httpcache) - -Package httpcache provides a http.RoundTripper implementation that works as a mostly RFC-compliant cache for http responses. - -It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client and not for a shared proxy). - -Cache Backends --------------- - -- The built-in 'memory' cache stores responses in an in-memory map. -- [`github.com/gregjones/httpcache/diskcache`](https://github.com/gregjones/httpcache/tree/master/diskcache) provides a filesystem-backed cache using the [diskv](https://github.com/peterbourgon/diskv) library. -- [`github.com/gregjones/httpcache/memcache`](https://github.com/gregjones/httpcache/tree/master/memcache) provides memcache implementations, for both App Engine and 'normal' memcache servers. -- [`sourcegraph.com/sourcegraph/s3cache`](https://sourcegraph.com/github.com/sourcegraph/s3cache) uses Amazon S3 for storage. -- [`github.com/gregjones/httpcache/leveldbcache`](https://github.com/gregjones/httpcache/tree/master/leveldbcache) provides a filesystem-backed cache using [leveldb](https://github.com/syndtr/goleveldb/leveldb). -- [`github.com/die-net/lrucache`](https://github.com/die-net/lrucache) provides an in-memory cache that will evict least-recently used entries. -- [`github.com/die-net/lrucache/twotier`](https://github.com/die-net/lrucache/tree/master/twotier) allows caches to be combined, for example to use lrucache above with a persistent disk-cache. - -License -------- - -- [MIT License](LICENSE.txt) diff --git a/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go b/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go deleted file mode 100644 index 42e3129d82..0000000000 --- a/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go +++ /dev/null @@ -1,61 +0,0 @@ -// Package diskcache provides an implementation of httpcache.Cache that uses the diskv package -// to supplement an in-memory map with persistent storage -// -package diskcache - -import ( - "bytes" - "crypto/md5" - "encoding/hex" - "github.com/peterbourgon/diskv" - "io" -) - -// Cache is an implementation of httpcache.Cache that supplements the in-memory map with persistent storage -type Cache struct { - d *diskv.Diskv -} - -// Get returns the response corresponding to key if present -func (c *Cache) Get(key string) (resp []byte, ok bool) { - key = keyToFilename(key) - resp, err := c.d.Read(key) - if err != nil { - return []byte{}, false - } - return resp, true -} - -// Set saves a response to the cache as key -func (c *Cache) Set(key string, resp []byte) { - key = keyToFilename(key) - c.d.WriteStream(key, bytes.NewReader(resp), true) -} - -// Delete removes the response with key from the cache -func (c *Cache) Delete(key string) { - key = keyToFilename(key) - c.d.Erase(key) -} - -func keyToFilename(key string) string { - h := md5.New() - io.WriteString(h, key) - return hex.EncodeToString(h.Sum(nil)) -} - -// New returns a new Cache that will store files in basePath -func New(basePath string) *Cache { - return &Cache{ - d: diskv.New(diskv.Options{ - BasePath: basePath, - CacheSizeMax: 100 * 1024 * 1024, // 100MB - }), - } -} - -// NewWithDiskv returns a new Cache using the provided Diskv as underlying -// storage. -func NewWithDiskv(d *diskv.Diskv) *Cache { - return &Cache{d} -} diff --git a/vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go b/vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go deleted file mode 100644 index 35c76cbd1c..0000000000 --- a/vendor/github.com/gregjones/httpcache/diskcache/diskcache_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package diskcache - -import ( - "bytes" - "io/ioutil" - "os" - "testing" -) - -func TestDiskCache(t *testing.T) { - tempDir, err := ioutil.TempDir("", "httpcache") - if err != nil { - t.Fatalf("TempDir: %v", err) - } - defer os.RemoveAll(tempDir) - - cache := New(tempDir) - - key := "testKey" - _, ok := cache.Get(key) - if ok { - t.Fatal("retrieved key before adding it") - } - - val := []byte("some bytes") - cache.Set(key, val) - - retVal, ok := cache.Get(key) - if !ok { - t.Fatal("could not retrieve an element we just added") - } - if !bytes.Equal(retVal, val) { - t.Fatal("retrieved a different value than what we put in") - } - - cache.Delete(key) - - _, ok = cache.Get(key) - if ok { - t.Fatal("deleted key still present") - } -} diff --git a/vendor/github.com/gregjones/httpcache/httpcache.go b/vendor/github.com/gregjones/httpcache/httpcache.go deleted file mode 100644 index b26e167f0f..0000000000 --- a/vendor/github.com/gregjones/httpcache/httpcache.go +++ /dev/null @@ -1,557 +0,0 @@ -// Package httpcache provides a http.RoundTripper implementation that works as a -// mostly RFC-compliant cache for http responses. -// -// It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client -// and not for a shared proxy). -// -package httpcache - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httputil" - "strings" - "sync" - "time" -) - -const ( - stale = iota - fresh - transparent - // XFromCache is the header added to responses that are returned from the cache - XFromCache = "X-From-Cache" -) - -// A Cache interface is used by the Transport to store and retrieve responses. -type Cache interface { - // Get returns the []byte representation of a cached response and a bool - // set to true if the value isn't empty - Get(key string) (responseBytes []byte, ok bool) - // Set stores the []byte representation of a response against a key - Set(key string, responseBytes []byte) - // Delete removes the value associated with the key - Delete(key string) -} - -// cacheKey returns the cache key for req. -func cacheKey(req *http.Request) string { - if req.Method == http.MethodGet { - return req.URL.String() - } else { - return req.Method + " " + req.URL.String() - } -} - -// CachedResponse returns the cached http.Response for req if present, and nil -// otherwise. -func CachedResponse(c Cache, req *http.Request) (resp *http.Response, err error) { - cachedVal, ok := c.Get(cacheKey(req)) - if !ok { - return - } - - b := bytes.NewBuffer(cachedVal) - return http.ReadResponse(bufio.NewReader(b), req) -} - -// MemoryCache is an implemtation of Cache that stores responses in an in-memory map. -type MemoryCache struct { - mu sync.RWMutex - items map[string][]byte -} - -// Get returns the []byte representation of the response and true if present, false if not -func (c *MemoryCache) Get(key string) (resp []byte, ok bool) { - c.mu.RLock() - resp, ok = c.items[key] - c.mu.RUnlock() - return resp, ok -} - -// Set saves response resp to the cache with key -func (c *MemoryCache) Set(key string, resp []byte) { - c.mu.Lock() - c.items[key] = resp - c.mu.Unlock() -} - -// Delete removes key from the cache -func (c *MemoryCache) Delete(key string) { - c.mu.Lock() - delete(c.items, key) - c.mu.Unlock() -} - -// NewMemoryCache returns a new Cache that will store items in an in-memory map -func NewMemoryCache() *MemoryCache { - c := &MemoryCache{items: map[string][]byte{}} - return c -} - -// Transport is an implementation of http.RoundTripper that will return values from a cache -// where possible (avoiding a network request) and will additionally add validators (etag/if-modified-since) -// to repeated requests allowing servers to return 304 / Not Modified -type Transport struct { - // The RoundTripper interface actually used to make requests - // If nil, http.DefaultTransport is used - Transport http.RoundTripper - Cache Cache - // If true, responses returned from the cache will be given an extra header, X-From-Cache - MarkCachedResponses bool -} - -// NewTransport returns a new Transport with the -// provided Cache implementation and MarkCachedResponses set to true -func NewTransport(c Cache) *Transport { - return &Transport{Cache: c, MarkCachedResponses: true} -} - -// Client returns an *http.Client that caches responses. -func (t *Transport) Client() *http.Client { - return &http.Client{Transport: t} -} - -// varyMatches will return false unless all of the cached values for the headers listed in Vary -// match the new request -func varyMatches(cachedResp *http.Response, req *http.Request) bool { - for _, header := range headerAllCommaSepValues(cachedResp.Header, "vary") { - header = http.CanonicalHeaderKey(header) - if header != "" && req.Header.Get(header) != cachedResp.Header.Get("X-Varied-"+header) { - return false - } - } - return true -} - -// RoundTrip takes a Request and returns a Response -// -// If there is a fresh Response already in cache, then it will be returned without connecting to -// the server. -// -// If there is a stale Response, then any validators it contains will be set on the new request -// to give the server a chance to respond with NotModified. If this happens, then the cached Response -// will be returned. -func (t *Transport) RoundTrip(req *http.Request) (resp *http.Response, err error) { - cacheKey := cacheKey(req) - cacheable := (req.Method == "GET" || req.Method == "HEAD") && req.Header.Get("range") == "" - var cachedResp *http.Response - if cacheable { - cachedResp, err = CachedResponse(t.Cache, req) - } else { - // Need to invalidate an existing value - t.Cache.Delete(cacheKey) - } - - transport := t.Transport - if transport == nil { - transport = http.DefaultTransport - } - - if cacheable && cachedResp != nil && err == nil { - if t.MarkCachedResponses { - cachedResp.Header.Set(XFromCache, "1") - } - - if varyMatches(cachedResp, req) { - // Can only use cached value if the new request doesn't Vary significantly - freshness := getFreshness(cachedResp.Header, req.Header) - if freshness == fresh { - return cachedResp, nil - } - - if freshness == stale { - var req2 *http.Request - // Add validators if caller hasn't already done so - etag := cachedResp.Header.Get("etag") - if etag != "" && req.Header.Get("etag") == "" { - req2 = cloneRequest(req) - req2.Header.Set("if-none-match", etag) - } - lastModified := cachedResp.Header.Get("last-modified") - if lastModified != "" && req.Header.Get("last-modified") == "" { - if req2 == nil { - req2 = cloneRequest(req) - } - req2.Header.Set("if-modified-since", lastModified) - } - if req2 != nil { - req = req2 - } - } - } - - resp, err = transport.RoundTrip(req) - if err == nil && req.Method == "GET" && resp.StatusCode == http.StatusNotModified { - // Replace the 304 response with the one from cache, but update with some new headers - endToEndHeaders := getEndToEndHeaders(resp.Header) - for _, header := range endToEndHeaders { - cachedResp.Header[header] = resp.Header[header] - } - cachedResp.Status = fmt.Sprintf("%d %s", http.StatusOK, http.StatusText(http.StatusOK)) - cachedResp.StatusCode = http.StatusOK - - resp = cachedResp - } else if (err != nil || (cachedResp != nil && resp.StatusCode >= 500)) && - req.Method == "GET" && canStaleOnError(cachedResp.Header, req.Header) { - // In case of transport failure and stale-if-error activated, returns cached content - // when available - cachedResp.Status = fmt.Sprintf("%d %s", http.StatusOK, http.StatusText(http.StatusOK)) - cachedResp.StatusCode = http.StatusOK - return cachedResp, nil - } else { - if err != nil || resp.StatusCode != http.StatusOK { - t.Cache.Delete(cacheKey) - } - if err != nil { - return nil, err - } - } - } else { - reqCacheControl := parseCacheControl(req.Header) - if _, ok := reqCacheControl["only-if-cached"]; ok { - resp = newGatewayTimeoutResponse(req) - } else { - resp, err = transport.RoundTrip(req) - if err != nil { - return nil, err - } - } - } - - if cacheable && canStore(parseCacheControl(req.Header), parseCacheControl(resp.Header)) { - for _, varyKey := range headerAllCommaSepValues(resp.Header, "vary") { - varyKey = http.CanonicalHeaderKey(varyKey) - fakeHeader := "X-Varied-" + varyKey - reqValue := req.Header.Get(varyKey) - if reqValue != "" { - resp.Header.Set(fakeHeader, reqValue) - } - } - switch req.Method { - case "GET": - // Delay caching until EOF is reached. - resp.Body = &cachingReadCloser{ - R: resp.Body, - OnEOF: func(r io.Reader) { - resp := *resp - resp.Body = ioutil.NopCloser(r) - respBytes, err := httputil.DumpResponse(&resp, true) - if err == nil { - t.Cache.Set(cacheKey, respBytes) - } - }, - } - default: - respBytes, err := httputil.DumpResponse(resp, true) - if err == nil { - t.Cache.Set(cacheKey, respBytes) - } - } - } else { - t.Cache.Delete(cacheKey) - } - return resp, nil -} - -// ErrNoDateHeader indicates that the HTTP headers contained no Date header. -var ErrNoDateHeader = errors.New("no Date header") - -// Date parses and returns the value of the Date header. -func Date(respHeaders http.Header) (date time.Time, err error) { - dateHeader := respHeaders.Get("date") - if dateHeader == "" { - err = ErrNoDateHeader - return - } - - return time.Parse(time.RFC1123, dateHeader) -} - -type realClock struct{} - -func (c *realClock) since(d time.Time) time.Duration { - return time.Since(d) -} - -type timer interface { - since(d time.Time) time.Duration -} - -var clock timer = &realClock{} - -// getFreshness will return one of fresh/stale/transparent based on the cache-control -// values of the request and the response -// -// fresh indicates the response can be returned -// stale indicates that the response needs validating before it is returned -// transparent indicates the response should not be used to fulfil the request -// -// Because this is only a private cache, 'public' and 'private' in cache-control aren't -// signficant. Similarly, smax-age isn't used. -func getFreshness(respHeaders, reqHeaders http.Header) (freshness int) { - respCacheControl := parseCacheControl(respHeaders) - reqCacheControl := parseCacheControl(reqHeaders) - if _, ok := reqCacheControl["no-cache"]; ok { - return transparent - } - if _, ok := respCacheControl["no-cache"]; ok { - return stale - } - if _, ok := reqCacheControl["only-if-cached"]; ok { - return fresh - } - - date, err := Date(respHeaders) - if err != nil { - return stale - } - currentAge := clock.since(date) - - var lifetime time.Duration - var zeroDuration time.Duration - - // If a response includes both an Expires header and a max-age directive, - // the max-age directive overrides the Expires header, even if the Expires header is more restrictive. - if maxAge, ok := respCacheControl["max-age"]; ok { - lifetime, err = time.ParseDuration(maxAge + "s") - if err != nil { - lifetime = zeroDuration - } - } else { - expiresHeader := respHeaders.Get("Expires") - if expiresHeader != "" { - expires, err := time.Parse(time.RFC1123, expiresHeader) - if err != nil { - lifetime = zeroDuration - } else { - lifetime = expires.Sub(date) - } - } - } - - if maxAge, ok := reqCacheControl["max-age"]; ok { - // the client is willing to accept a response whose age is no greater than the specified time in seconds - lifetime, err = time.ParseDuration(maxAge + "s") - if err != nil { - lifetime = zeroDuration - } - } - if minfresh, ok := reqCacheControl["min-fresh"]; ok { - // the client wants a response that will still be fresh for at least the specified number of seconds. - minfreshDuration, err := time.ParseDuration(minfresh + "s") - if err == nil { - currentAge = time.Duration(currentAge + minfreshDuration) - } - } - - if maxstale, ok := reqCacheControl["max-stale"]; ok { - // Indicates that the client is willing to accept a response that has exceeded its expiration time. - // If max-stale is assigned a value, then the client is willing to accept a response that has exceeded - // its expiration time by no more than the specified number of seconds. - // If no value is assigned to max-stale, then the client is willing to accept a stale response of any age. - // - // Responses served only because of a max-stale value are supposed to have a Warning header added to them, - // but that seems like a hassle, and is it actually useful? If so, then there needs to be a different - // return-value available here. - if maxstale == "" { - return fresh - } - maxstaleDuration, err := time.ParseDuration(maxstale + "s") - if err == nil { - currentAge = time.Duration(currentAge - maxstaleDuration) - } - } - - if lifetime > currentAge { - return fresh - } - - return stale -} - -// Returns true if either the request or the response includes the stale-if-error -// cache control extension: https://tools.ietf.org/html/rfc5861 -func canStaleOnError(respHeaders, reqHeaders http.Header) bool { - respCacheControl := parseCacheControl(respHeaders) - reqCacheControl := parseCacheControl(reqHeaders) - - var err error - lifetime := time.Duration(-1) - - if staleMaxAge, ok := respCacheControl["stale-if-error"]; ok { - if staleMaxAge != "" { - lifetime, err = time.ParseDuration(staleMaxAge + "s") - if err != nil { - return false - } - } else { - return true - } - } - if staleMaxAge, ok := reqCacheControl["stale-if-error"]; ok { - if staleMaxAge != "" { - lifetime, err = time.ParseDuration(staleMaxAge + "s") - if err != nil { - return false - } - } else { - return true - } - } - - if lifetime >= 0 { - date, err := Date(respHeaders) - if err != nil { - return false - } - currentAge := clock.since(date) - if lifetime > currentAge { - return true - } - } - - return false -} - -func getEndToEndHeaders(respHeaders http.Header) []string { - // These headers are always hop-by-hop - hopByHopHeaders := map[string]struct{}{ - "Connection": struct{}{}, - "Keep-Alive": struct{}{}, - "Proxy-Authenticate": struct{}{}, - "Proxy-Authorization": struct{}{}, - "Te": struct{}{}, - "Trailers": struct{}{}, - "Transfer-Encoding": struct{}{}, - "Upgrade": struct{}{}, - } - - for _, extra := range strings.Split(respHeaders.Get("connection"), ",") { - // any header listed in connection, if present, is also considered hop-by-hop - if strings.Trim(extra, " ") != "" { - hopByHopHeaders[http.CanonicalHeaderKey(extra)] = struct{}{} - } - } - endToEndHeaders := []string{} - for respHeader, _ := range respHeaders { - if _, ok := hopByHopHeaders[respHeader]; !ok { - endToEndHeaders = append(endToEndHeaders, respHeader) - } - } - return endToEndHeaders -} - -func canStore(reqCacheControl, respCacheControl cacheControl) (canStore bool) { - if _, ok := respCacheControl["no-store"]; ok { - return false - } - if _, ok := reqCacheControl["no-store"]; ok { - return false - } - return true -} - -func newGatewayTimeoutResponse(req *http.Request) *http.Response { - var braw bytes.Buffer - braw.WriteString("HTTP/1.1 504 Gateway Timeout\r\n\r\n") - resp, err := http.ReadResponse(bufio.NewReader(&braw), req) - if err != nil { - panic(err) - } - return resp -} - -// cloneRequest returns a clone of the provided *http.Request. -// The clone is a shallow copy of the struct and its Header map. -// (This function copyright goauth2 authors: https://code.google.com/p/goauth2) -func cloneRequest(r *http.Request) *http.Request { - // shallow copy of the struct - r2 := new(http.Request) - *r2 = *r - // deep copy of the Header - r2.Header = make(http.Header) - for k, s := range r.Header { - r2.Header[k] = s - } - return r2 -} - -type cacheControl map[string]string - -func parseCacheControl(headers http.Header) cacheControl { - cc := cacheControl{} - ccHeader := headers.Get("Cache-Control") - for _, part := range strings.Split(ccHeader, ",") { - part = strings.Trim(part, " ") - if part == "" { - continue - } - if strings.ContainsRune(part, '=') { - keyval := strings.Split(part, "=") - cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",") - } else { - cc[part] = "" - } - } - return cc -} - -// headerAllCommaSepValues returns all comma-separated values (each -// with whitespace trimmed) for header name in headers. According to -// Section 4.2 of the HTTP/1.1 spec -// (http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2), -// values from multiple occurrences of a header should be concatenated, if -// the header's value is a comma-separated list. -func headerAllCommaSepValues(headers http.Header, name string) []string { - var vals []string - for _, val := range headers[http.CanonicalHeaderKey(name)] { - fields := strings.Split(val, ",") - for i, f := range fields { - fields[i] = strings.TrimSpace(f) - } - vals = append(vals, fields...) - } - return vals -} - -// cachingReadCloser is a wrapper around ReadCloser R that calls OnEOF -// handler with a full copy of the content read from R when EOF is -// reached. -type cachingReadCloser struct { - // Underlying ReadCloser. - R io.ReadCloser - // OnEOF is called with a copy of the content of R when EOF is reached. - OnEOF func(io.Reader) - - buf bytes.Buffer // buf stores a copy of the content of R. -} - -// Read reads the next len(p) bytes from R or until R is drained. The -// return value n is the number of bytes read. If R has no data to -// return, err is io.EOF and OnEOF is called with a full copy of what -// has been read so far. -func (r *cachingReadCloser) Read(p []byte) (n int, err error) { - n, err = r.R.Read(p) - r.buf.Write(p[:n]) - if err == io.EOF { - r.OnEOF(bytes.NewReader(r.buf.Bytes())) - } - return n, err -} - -func (r *cachingReadCloser) Close() error { - return r.R.Close() -} - -// NewMemoryCacheTransport returns a new Transport using the in-memory cache implementation -func NewMemoryCacheTransport() *Transport { - c := NewMemoryCache() - t := NewTransport(c) - return t -} diff --git a/vendor/github.com/gregjones/httpcache/httpcache_test.go b/vendor/github.com/gregjones/httpcache/httpcache_test.go deleted file mode 100644 index f22ed837fb..0000000000 --- a/vendor/github.com/gregjones/httpcache/httpcache_test.go +++ /dev/null @@ -1,1384 +0,0 @@ -package httpcache - -import ( - "bytes" - "errors" - "flag" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "strconv" - "testing" - "time" -) - -var s struct { - server *httptest.Server - client http.Client - transport *Transport - done chan struct{} // Closed to unlock infinite handlers. -} - -type fakeClock struct { - elapsed time.Duration -} - -func (c *fakeClock) since(t time.Time) time.Duration { - return c.elapsed -} - -func TestMain(m *testing.M) { - flag.Parse() - setup() - code := m.Run() - teardown() - os.Exit(code) -} - -func setup() { - tp := NewMemoryCacheTransport() - client := http.Client{Transport: tp} - s.transport = tp - s.client = client - s.done = make(chan struct{}) - - mux := http.NewServeMux() - s.server = httptest.NewServer(mux) - - mux.HandleFunc("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "max-age=3600") - })) - - mux.HandleFunc("/method", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "max-age=3600") - w.Write([]byte(r.Method)) - })) - - mux.HandleFunc("/range", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - lm := "Fri, 14 Dec 2010 01:01:50 GMT" - if r.Header.Get("if-modified-since") == lm { - w.WriteHeader(http.StatusNotModified) - return - } - w.Header().Set("last-modified", lm) - if r.Header.Get("range") == "bytes=4-9" { - w.WriteHeader(http.StatusPartialContent) - w.Write([]byte(" text ")) - return - } - w.Write([]byte("Some text content")) - })) - - mux.HandleFunc("/nostore", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "no-store") - })) - - mux.HandleFunc("/etag", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - etag := "124567" - if r.Header.Get("if-none-match") == etag { - w.WriteHeader(http.StatusNotModified) - return - } - w.Header().Set("etag", etag) - })) - - mux.HandleFunc("/lastmodified", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - lm := "Fri, 14 Dec 2010 01:01:50 GMT" - if r.Header.Get("if-modified-since") == lm { - w.WriteHeader(http.StatusNotModified) - return - } - w.Header().Set("last-modified", lm) - })) - - mux.HandleFunc("/varyaccept", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "max-age=3600") - w.Header().Set("Content-Type", "text/plain") - w.Header().Set("Vary", "Accept") - w.Write([]byte("Some text content")) - })) - - mux.HandleFunc("/doublevary", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "max-age=3600") - w.Header().Set("Content-Type", "text/plain") - w.Header().Set("Vary", "Accept, Accept-Language") - w.Write([]byte("Some text content")) - })) - mux.HandleFunc("/2varyheaders", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "max-age=3600") - w.Header().Set("Content-Type", "text/plain") - w.Header().Add("Vary", "Accept") - w.Header().Add("Vary", "Accept-Language") - w.Write([]byte("Some text content")) - })) - mux.HandleFunc("/varyunused", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Cache-Control", "max-age=3600") - w.Header().Set("Content-Type", "text/plain") - w.Header().Set("Vary", "X-Madeup-Header") - w.Write([]byte("Some text content")) - })) - - updateFieldsCounter := 0 - mux.HandleFunc("/updatefields", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("X-Counter", strconv.Itoa(updateFieldsCounter)) - w.Header().Set("Etag", `"e"`) - updateFieldsCounter++ - if r.Header.Get("if-none-match") != "" { - w.WriteHeader(http.StatusNotModified) - return - } - w.Write([]byte("Some text content")) - })) - - // Take 3 seconds to return 200 OK (for testing client timeouts). - mux.HandleFunc("/3seconds", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - time.Sleep(3 * time.Second) - })) - - mux.HandleFunc("/infinite", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - for { - select { - case <-s.done: - return - default: - w.Write([]byte{0}) - } - } - })) -} - -func teardown() { - close(s.done) - s.server.Close() -} - -func resetTest() { - s.transport.Cache = NewMemoryCache() - clock = &realClock{} -} - -// TestCacheableMethod ensures that uncacheable method does not get stored -// in cache and get incorrectly used for a following cacheable method request. -func TestCacheableMethod(t *testing.T) { - resetTest() - { - req, err := http.NewRequest("POST", s.server.URL+"/method", nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - _, err = io.Copy(&buf, resp.Body) - if err != nil { - t.Fatal(err) - } - err = resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if got, want := buf.String(), "POST"; got != want { - t.Errorf("got %q, want %q", got, want) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) - } - } - { - req, err := http.NewRequest("GET", s.server.URL+"/method", nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - _, err = io.Copy(&buf, resp.Body) - if err != nil { - t.Fatal(err) - } - err = resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if got, want := buf.String(), "GET"; got != want { - t.Errorf("got wrong body %q, want %q", got, want) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) - } - if resp.Header.Get(XFromCache) != "" { - t.Errorf("XFromCache header isn't blank") - } - } -} - -func TestDontServeHeadResponseToGetRequest(t *testing.T) { - resetTest() - url := s.server.URL + "/" - req, err := http.NewRequest(http.MethodHead, url, nil) - if err != nil { - t.Fatal(err) - } - _, err = s.client.Do(req) - if err != nil { - t.Fatal(err) - } - req, err = http.NewRequest(http.MethodGet, url, nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - if resp.Header.Get(XFromCache) != "" { - t.Errorf("Cache should not match") - } -} - -func TestDontStorePartialRangeInCache(t *testing.T) { - resetTest() - { - req, err := http.NewRequest("GET", s.server.URL+"/range", nil) - if err != nil { - t.Fatal(err) - } - req.Header.Set("range", "bytes=4-9") - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - _, err = io.Copy(&buf, resp.Body) - if err != nil { - t.Fatal(err) - } - err = resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if got, want := buf.String(), " text "; got != want { - t.Errorf("got %q, want %q", got, want) - } - if resp.StatusCode != http.StatusPartialContent { - t.Errorf("response status code isn't 206 Partial Content: %v", resp.StatusCode) - } - } - { - req, err := http.NewRequest("GET", s.server.URL+"/range", nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - _, err = io.Copy(&buf, resp.Body) - if err != nil { - t.Fatal(err) - } - err = resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if got, want := buf.String(), "Some text content"; got != want { - t.Errorf("got %q, want %q", got, want) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) - } - if resp.Header.Get(XFromCache) != "" { - t.Error("XFromCache header isn't blank") - } - } - { - req, err := http.NewRequest("GET", s.server.URL+"/range", nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - _, err = io.Copy(&buf, resp.Body) - if err != nil { - t.Fatal(err) - } - err = resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if got, want := buf.String(), "Some text content"; got != want { - t.Errorf("got %q, want %q", got, want) - } - if resp.StatusCode != http.StatusOK { - t.Errorf("response status code isn't 200 OK: %v", resp.StatusCode) - } - if resp.Header.Get(XFromCache) != "1" { - t.Errorf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } - { - req, err := http.NewRequest("GET", s.server.URL+"/range", nil) - if err != nil { - t.Fatal(err) - } - req.Header.Set("range", "bytes=4-9") - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - var buf bytes.Buffer - _, err = io.Copy(&buf, resp.Body) - if err != nil { - t.Fatal(err) - } - err = resp.Body.Close() - if err != nil { - t.Fatal(err) - } - if got, want := buf.String(), " text "; got != want { - t.Errorf("got %q, want %q", got, want) - } - if resp.StatusCode != http.StatusPartialContent { - t.Errorf("response status code isn't 206 Partial Content: %v", resp.StatusCode) - } - } -} - -func TestCacheOnlyIfBodyRead(t *testing.T) { - resetTest() - { - req, err := http.NewRequest("GET", s.server.URL, nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - // We do not read the body - resp.Body.Close() - } - { - req, err := http.NewRequest("GET", s.server.URL, nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatalf("XFromCache header isn't blank") - } - } -} - -func TestOnlyReadBodyOnDemand(t *testing.T) { - resetTest() - - req, err := http.NewRequest("GET", s.server.URL+"/infinite", nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) // This shouldn't hang forever. - if err != nil { - t.Fatal(err) - } - buf := make([]byte, 10) // Only partially read the body. - _, err = resp.Body.Read(buf) - if err != nil { - t.Fatal(err) - } - resp.Body.Close() -} - -func TestGetOnlyIfCachedHit(t *testing.T) { - resetTest() - { - req, err := http.NewRequest("GET", s.server.URL, nil) - if err != nil { - t.Fatal(err) - } - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - req, err := http.NewRequest("GET", s.server.URL, nil) - if err != nil { - t.Fatal(err) - } - req.Header.Add("cache-control", "only-if-cached") - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - if resp.StatusCode != http.StatusOK { - t.Fatalf("response status code isn't 200 OK: %v", resp.StatusCode) - } - } -} - -func TestGetOnlyIfCachedMiss(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL, nil) - if err != nil { - t.Fatal(err) - } - req.Header.Add("cache-control", "only-if-cached") - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - if resp.StatusCode != http.StatusGatewayTimeout { - t.Fatalf("response status code isn't 504 GatewayTimeout: %v", resp.StatusCode) - } -} - -func TestGetNoStoreRequest(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL, nil) - if err != nil { - t.Fatal(err) - } - req.Header.Add("Cache-Control", "no-store") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } -} - -func TestGetNoStoreResponse(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/nostore", nil) - if err != nil { - t.Fatal(err) - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } -} - -func TestGetWithEtag(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/etag", nil) - if err != nil { - t.Fatal(err) - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - // additional assertions to verify that 304 response is converted properly - if resp.StatusCode != http.StatusOK { - t.Fatalf("response status code isn't 200 OK: %v", resp.StatusCode) - } - if _, ok := resp.Header["Connection"]; ok { - t.Fatalf("Connection header isn't absent") - } - } -} - -func TestGetWithLastModified(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/lastmodified", nil) - if err != nil { - t.Fatal(err) - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } -} - -func TestGetWithVary(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/varyaccept", nil) - if err != nil { - t.Fatal(err) - } - req.Header.Set("Accept", "text/plain") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get("Vary") != "Accept" { - t.Fatalf(`Vary header isn't "Accept": %v`, resp.Header.Get("Vary")) - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } - req.Header.Set("Accept", "text/html") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - req.Header.Set("Accept", "") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } -} - -func TestGetWithDoubleVary(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/doublevary", nil) - if err != nil { - t.Fatal(err) - } - req.Header.Set("Accept", "text/plain") - req.Header.Set("Accept-Language", "da, en-gb;q=0.8, en;q=0.7") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get("Vary") == "" { - t.Fatalf(`Vary header is blank`) - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } - req.Header.Set("Accept-Language", "") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - req.Header.Set("Accept-Language", "da") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } -} - -func TestGetWith2VaryHeaders(t *testing.T) { - resetTest() - // Tests that multiple Vary headers' comma-separated lists are - // merged. See https://github.com/gregjones/httpcache/issues/27. - const ( - accept = "text/plain" - acceptLanguage = "da, en-gb;q=0.8, en;q=0.7" - ) - req, err := http.NewRequest("GET", s.server.URL+"/2varyheaders", nil) - if err != nil { - t.Fatal(err) - } - req.Header.Set("Accept", accept) - req.Header.Set("Accept-Language", acceptLanguage) - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get("Vary") == "" { - t.Fatalf(`Vary header is blank`) - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } - req.Header.Set("Accept-Language", "") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - req.Header.Set("Accept-Language", "da") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - req.Header.Set("Accept-Language", acceptLanguage) - req.Header.Set("Accept", "") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - } - req.Header.Set("Accept", "image/png") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "" { - t.Fatal("XFromCache header isn't blank") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } -} - -func TestGetVaryUnused(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/varyunused", nil) - if err != nil { - t.Fatal(err) - } - req.Header.Set("Accept", "text/plain") - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get("Vary") == "" { - t.Fatalf(`Vary header is blank`) - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - } -} - -func TestUpdateFields(t *testing.T) { - resetTest() - req, err := http.NewRequest("GET", s.server.URL+"/updatefields", nil) - if err != nil { - t.Fatal(err) - } - var counter, counter2 string - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - counter = resp.Header.Get("x-counter") - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - } - { - resp, err := s.client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.Header.Get(XFromCache) != "1" { - t.Fatalf(`XFromCache header isn't "1": %v`, resp.Header.Get(XFromCache)) - } - counter2 = resp.Header.Get("x-counter") - } - if counter == counter2 { - t.Fatalf(`both "x-counter" values are equal: %v %v`, counter, counter2) - } -} - -func TestParseCacheControl(t *testing.T) { - resetTest() - h := http.Header{} - for range parseCacheControl(h) { - t.Fatal("cacheControl should be empty") - } - - h.Set("cache-control", "no-cache") - { - cc := parseCacheControl(h) - if _, ok := cc["foo"]; ok { - t.Error(`Value "foo" shouldn't exist`) - } - noCache, ok := cc["no-cache"] - if !ok { - t.Fatalf(`"no-cache" value isn't set`) - } - if noCache != "" { - t.Fatalf(`"no-cache" value isn't blank: %v`, noCache) - } - } - h.Set("cache-control", "no-cache, max-age=3600") - { - cc := parseCacheControl(h) - noCache, ok := cc["no-cache"] - if !ok { - t.Fatalf(`"no-cache" value isn't set`) - } - if noCache != "" { - t.Fatalf(`"no-cache" value isn't blank: %v`, noCache) - } - if cc["max-age"] != "3600" { - t.Fatalf(`"max-age" value isn't "3600": %v`, cc["max-age"]) - } - } -} - -func TestNoCacheRequestExpiration(t *testing.T) { - resetTest() - respHeaders := http.Header{} - respHeaders.Set("Cache-Control", "max-age=7200") - - reqHeaders := http.Header{} - reqHeaders.Set("Cache-Control", "no-cache") - if getFreshness(respHeaders, reqHeaders) != transparent { - t.Fatal("freshness isn't transparent") - } -} - -func TestNoCacheResponseExpiration(t *testing.T) { - resetTest() - respHeaders := http.Header{} - respHeaders.Set("Cache-Control", "no-cache") - respHeaders.Set("Expires", "Wed, 19 Apr 3000 11:43:00 GMT") - - reqHeaders := http.Header{} - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestReqMustRevalidate(t *testing.T) { - resetTest() - // not paying attention to request setting max-stale means never returning stale - // responses, so always acting as if must-revalidate is set - respHeaders := http.Header{} - - reqHeaders := http.Header{} - reqHeaders.Set("Cache-Control", "must-revalidate") - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestRespMustRevalidate(t *testing.T) { - resetTest() - respHeaders := http.Header{} - respHeaders.Set("Cache-Control", "must-revalidate") - - reqHeaders := http.Header{} - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestFreshExpiration(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("expires", now.Add(time.Duration(2)*time.Second).Format(time.RFC1123)) - - reqHeaders := http.Header{} - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } - - clock = &fakeClock{elapsed: 3 * time.Second} - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestMaxAge(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("cache-control", "max-age=2") - - reqHeaders := http.Header{} - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } - - clock = &fakeClock{elapsed: 3 * time.Second} - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestMaxAgeZero(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("cache-control", "max-age=0") - - reqHeaders := http.Header{} - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestBothMaxAge(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("cache-control", "max-age=2") - - reqHeaders := http.Header{} - reqHeaders.Set("cache-control", "max-age=0") - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestMinFreshWithExpires(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("expires", now.Add(time.Duration(2)*time.Second).Format(time.RFC1123)) - - reqHeaders := http.Header{} - reqHeaders.Set("cache-control", "min-fresh=1") - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } - - reqHeaders = http.Header{} - reqHeaders.Set("cache-control", "min-fresh=2") - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func TestEmptyMaxStale(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("cache-control", "max-age=20") - - reqHeaders := http.Header{} - reqHeaders.Set("cache-control", "max-stale") - clock = &fakeClock{elapsed: 10 * time.Second} - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } - - clock = &fakeClock{elapsed: 60 * time.Second} - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } -} - -func TestMaxStaleValue(t *testing.T) { - resetTest() - now := time.Now() - respHeaders := http.Header{} - respHeaders.Set("date", now.Format(time.RFC1123)) - respHeaders.Set("cache-control", "max-age=10") - - reqHeaders := http.Header{} - reqHeaders.Set("cache-control", "max-stale=20") - clock = &fakeClock{elapsed: 5 * time.Second} - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } - - clock = &fakeClock{elapsed: 15 * time.Second} - if getFreshness(respHeaders, reqHeaders) != fresh { - t.Fatal("freshness isn't fresh") - } - - clock = &fakeClock{elapsed: 30 * time.Second} - if getFreshness(respHeaders, reqHeaders) != stale { - t.Fatal("freshness isn't stale") - } -} - -func containsHeader(headers []string, header string) bool { - for _, v := range headers { - if http.CanonicalHeaderKey(v) == http.CanonicalHeaderKey(header) { - return true - } - } - return false -} - -func TestGetEndToEndHeaders(t *testing.T) { - resetTest() - var ( - headers http.Header - end2end []string - ) - - headers = http.Header{} - headers.Set("content-type", "text/html") - headers.Set("te", "deflate") - - end2end = getEndToEndHeaders(headers) - if !containsHeader(end2end, "content-type") { - t.Fatal(`doesn't contain "content-type" header`) - } - if containsHeader(end2end, "te") { - t.Fatal(`doesn't contain "te" header`) - } - - headers = http.Header{} - headers.Set("connection", "content-type") - headers.Set("content-type", "text/csv") - headers.Set("te", "deflate") - end2end = getEndToEndHeaders(headers) - if containsHeader(end2end, "connection") { - t.Fatal(`doesn't contain "connection" header`) - } - if containsHeader(end2end, "content-type") { - t.Fatal(`doesn't contain "content-type" header`) - } - if containsHeader(end2end, "te") { - t.Fatal(`doesn't contain "te" header`) - } - - headers = http.Header{} - end2end = getEndToEndHeaders(headers) - if len(end2end) != 0 { - t.Fatal(`non-zero end2end headers`) - } - - headers = http.Header{} - headers.Set("connection", "content-type") - end2end = getEndToEndHeaders(headers) - if len(end2end) != 0 { - t.Fatal(`non-zero end2end headers`) - } -} - -type transportMock struct { - response *http.Response - err error -} - -func (t transportMock) RoundTrip(req *http.Request) (resp *http.Response, err error) { - return t.response, t.err -} - -func TestStaleIfErrorRequest(t *testing.T) { - resetTest() - now := time.Now() - tmock := transportMock{ - response: &http.Response{ - Status: http.StatusText(http.StatusOK), - StatusCode: http.StatusOK, - Header: http.Header{ - "Date": []string{now.Format(time.RFC1123)}, - "Cache-Control": []string{"no-cache"}, - }, - Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), - }, - err: nil, - } - tp := NewMemoryCacheTransport() - tp.Transport = &tmock - - // First time, response is cached on success - r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) - r.Header.Set("Cache-Control", "stale-if-error") - resp, err := tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - // On failure, response is returned from the cache - tmock.response = nil - tmock.err = errors.New("some error") - resp, err = tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } -} - -func TestStaleIfErrorRequestLifetime(t *testing.T) { - resetTest() - now := time.Now() - tmock := transportMock{ - response: &http.Response{ - Status: http.StatusText(http.StatusOK), - StatusCode: http.StatusOK, - Header: http.Header{ - "Date": []string{now.Format(time.RFC1123)}, - "Cache-Control": []string{"no-cache"}, - }, - Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), - }, - err: nil, - } - tp := NewMemoryCacheTransport() - tp.Transport = &tmock - - // First time, response is cached on success - r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) - r.Header.Set("Cache-Control", "stale-if-error=100") - resp, err := tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - // On failure, response is returned from the cache - tmock.response = nil - tmock.err = errors.New("some error") - resp, err = tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - - // Same for http errors - tmock.response = &http.Response{StatusCode: http.StatusInternalServerError} - tmock.err = nil - resp, err = tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - - // If failure last more than max stale, error is returned - clock = &fakeClock{elapsed: 200 * time.Second} - _, err = tp.RoundTrip(r) - if err != tmock.err { - t.Fatalf("got err %v, want %v", err, tmock.err) - } -} - -func TestStaleIfErrorResponse(t *testing.T) { - resetTest() - now := time.Now() - tmock := transportMock{ - response: &http.Response{ - Status: http.StatusText(http.StatusOK), - StatusCode: http.StatusOK, - Header: http.Header{ - "Date": []string{now.Format(time.RFC1123)}, - "Cache-Control": []string{"no-cache, stale-if-error"}, - }, - Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), - }, - err: nil, - } - tp := NewMemoryCacheTransport() - tp.Transport = &tmock - - // First time, response is cached on success - r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) - resp, err := tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - // On failure, response is returned from the cache - tmock.response = nil - tmock.err = errors.New("some error") - resp, err = tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } -} - -func TestStaleIfErrorResponseLifetime(t *testing.T) { - resetTest() - now := time.Now() - tmock := transportMock{ - response: &http.Response{ - Status: http.StatusText(http.StatusOK), - StatusCode: http.StatusOK, - Header: http.Header{ - "Date": []string{now.Format(time.RFC1123)}, - "Cache-Control": []string{"no-cache, stale-if-error=100"}, - }, - Body: ioutil.NopCloser(bytes.NewBuffer([]byte("some data"))), - }, - err: nil, - } - tp := NewMemoryCacheTransport() - tp.Transport = &tmock - - // First time, response is cached on success - r, _ := http.NewRequest("GET", "http://somewhere.com/", nil) - resp, err := tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - // On failure, response is returned from the cache - tmock.response = nil - tmock.err = errors.New("some error") - resp, err = tp.RoundTrip(r) - if err != nil { - t.Fatal(err) - } - if resp == nil { - t.Fatal("resp is nil") - } - - // If failure last more than max stale, error is returned - clock = &fakeClock{elapsed: 200 * time.Second} - _, err = tp.RoundTrip(r) - if err != tmock.err { - t.Fatalf("got err %v, want %v", err, tmock.err) - } -} - -// Test that http.Client.Timeout is respected when cache transport is used. -// That is so as long as request cancellation is propagated correctly. -// In the past, that required CancelRequest to be implemented correctly, -// but modern http.Client uses Request.Cancel (or request context) instead, -// so we don't have to do anything. -func TestClientTimeout(t *testing.T) { - if testing.Short() { - t.Skip("skipping timeout test in short mode") // Because it takes at least 3 seconds to run. - } - resetTest() - client := &http.Client{ - Transport: NewMemoryCacheTransport(), - Timeout: time.Second, - } - started := time.Now() - resp, err := client.Get(s.server.URL + "/3seconds") - taken := time.Since(started) - if err == nil { - t.Error("got nil error, want timeout error") - } - if resp != nil { - t.Error("got non-nil resp, want nil resp") - } - if taken >= 2*time.Second { - t.Error("client.Do took 2+ seconds, want < 2 seconds") - } -} diff --git a/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go b/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go deleted file mode 100644 index 9bcb7e2771..0000000000 --- a/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache.go +++ /dev/null @@ -1,51 +0,0 @@ -// Package leveldbcache provides an implementation of httpcache.Cache that -// uses github.com/syndtr/goleveldb/leveldb -package leveldbcache - -import ( - "github.com/syndtr/goleveldb/leveldb" -) - -// Cache is an implementation of httpcache.Cache with leveldb storage -type Cache struct { - db *leveldb.DB -} - -// Get returns the response corresponding to key if present -func (c *Cache) Get(key string) (resp []byte, ok bool) { - var err error - resp, err = c.db.Get([]byte(key), nil) - if err != nil { - return []byte{}, false - } - return resp, true -} - -// Set saves a response to the cache as key -func (c *Cache) Set(key string, resp []byte) { - c.db.Put([]byte(key), resp, nil) -} - -// Delete removes the response with key from the cache -func (c *Cache) Delete(key string) { - c.db.Delete([]byte(key), nil) -} - -// New returns a new Cache that will store leveldb in path -func New(path string) (*Cache, error) { - cache := &Cache{} - - var err error - cache.db, err = leveldb.OpenFile(path, nil) - - if err != nil { - return nil, err - } - return cache, nil -} - -// NewWithDB returns a new Cache using the provided leveldb as underlying -// storage. -func NewWithDB(db *leveldb.DB) *Cache { - return &Cache{db} -} diff --git a/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go b/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go deleted file mode 100644 index b885c01695..0000000000 --- a/vendor/github.com/gregjones/httpcache/leveldbcache/leveldbcache_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package leveldbcache - -import ( - "bytes" - "io/ioutil" - "os" - "path/filepath" - "testing" -) - -func TestDiskCache(t *testing.T) { - tempDir, err := ioutil.TempDir("", "httpcache") - if err != nil { - t.Fatalf("TempDir: %v", err) - } - defer os.RemoveAll(tempDir) - - cache, err := New(filepath.Join(tempDir, "db")) - if err != nil { - t.Fatalf("New leveldb,: %v", err) - } - - key := "testKey" - _, ok := cache.Get(key) - if ok { - t.Fatal("retrieved key before adding it") - } - - val := []byte("some bytes") - cache.Set(key, val) - - retVal, ok := cache.Get(key) - if !ok { - t.Fatal("could not retrieve an element we just added") - } - if !bytes.Equal(retVal, val) { - t.Fatal("retrieved a different value than what we put in") - } - - cache.Delete(key) - - _, ok = cache.Get(key) - if ok { - t.Fatal("deleted key still present") - } -} diff --git a/vendor/github.com/gregjones/httpcache/memcache/appengine.go b/vendor/github.com/gregjones/httpcache/memcache/appengine.go deleted file mode 100644 index e68d9bc092..0000000000 --- a/vendor/github.com/gregjones/httpcache/memcache/appengine.go +++ /dev/null @@ -1,61 +0,0 @@ -// +build appengine - -// Package memcache provides an implementation of httpcache.Cache that uses App -// Engine's memcache package to store cached responses. -// -// When not built for Google App Engine, this package will provide an -// implementation that connects to a specified memcached server. See the -// memcache.go file in this package for details. -package memcache - -import ( - "appengine" - "appengine/memcache" -) - -// Cache is an implementation of httpcache.Cache that caches responses in App -// Engine's memcache. -type Cache struct { - appengine.Context -} - -// cacheKey modifies an httpcache key for use in memcache. Specifically, it -// prefixes keys to avoid collision with other data stored in memcache. -func cacheKey(key string) string { - return "httpcache:" + key -} - -// Get returns the response corresponding to key if present. -func (c *Cache) Get(key string) (resp []byte, ok bool) { - item, err := memcache.Get(c.Context, cacheKey(key)) - if err != nil { - if err != memcache.ErrCacheMiss { - c.Context.Errorf("error getting cached response: %v", err) - } - return nil, false - } - return item.Value, true -} - -// Set saves a response to the cache as key. -func (c *Cache) Set(key string, resp []byte) { - item := &memcache.Item{ - Key: cacheKey(key), - Value: resp, - } - if err := memcache.Set(c.Context, item); err != nil { - c.Context.Errorf("error caching response: %v", err) - } -} - -// Delete removes the response with key from the cache. -func (c *Cache) Delete(key string) { - if err := memcache.Delete(c.Context, cacheKey(key)); err != nil { - c.Context.Errorf("error deleting cached response: %v", err) - } -} - -// New returns a new Cache for the given context. -func New(ctx appengine.Context) *Cache { - return &Cache{ctx} -} diff --git a/vendor/github.com/gregjones/httpcache/memcache/appengine_test.go b/vendor/github.com/gregjones/httpcache/memcache/appengine_test.go deleted file mode 100644 index 818b2776ea..0000000000 --- a/vendor/github.com/gregjones/httpcache/memcache/appengine_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// +build appengine - -package memcache - -import ( - "bytes" - "testing" - - "appengine/aetest" -) - -func TestAppEngine(t *testing.T) { - ctx, err := aetest.NewContext(nil) - if err != nil { - t.Fatal(err) - } - defer ctx.Close() - - cache := New(ctx) - - key := "testKey" - _, ok := cache.Get(key) - if ok { - t.Fatal("retrieved key before adding it") - } - - val := []byte("some bytes") - cache.Set(key, val) - - retVal, ok := cache.Get(key) - if !ok { - t.Fatal("could not retrieve an element we just added") - } - if !bytes.Equal(retVal, val) { - t.Fatal("retrieved a different value than what we put in") - } - - cache.Delete(key) - - _, ok = cache.Get(key) - if ok { - t.Fatal("deleted key still present") - } -} diff --git a/vendor/github.com/gregjones/httpcache/memcache/memcache.go b/vendor/github.com/gregjones/httpcache/memcache/memcache.go deleted file mode 100644 index 462f0e5419..0000000000 --- a/vendor/github.com/gregjones/httpcache/memcache/memcache.go +++ /dev/null @@ -1,60 +0,0 @@ -// +build !appengine - -// Package memcache provides an implementation of httpcache.Cache that uses -// gomemcache to store cached responses. -// -// When built for Google App Engine, this package will provide an -// implementation that uses App Engine's memcache service. See the -// appengine.go file in this package for details. -package memcache - -import ( - "github.com/bradfitz/gomemcache/memcache" -) - -// Cache is an implementation of httpcache.Cache that caches responses in a -// memcache server. -type Cache struct { - *memcache.Client -} - -// cacheKey modifies an httpcache key for use in memcache. Specifically, it -// prefixes keys to avoid collision with other data stored in memcache. -func cacheKey(key string) string { - return "httpcache:" + key -} - -// Get returns the response corresponding to key if present. -func (c *Cache) Get(key string) (resp []byte, ok bool) { - item, err := c.Client.Get(cacheKey(key)) - if err != nil { - return nil, false - } - return item.Value, true -} - -// Set saves a response to the cache as key. -func (c *Cache) Set(key string, resp []byte) { - item := &memcache.Item{ - Key: cacheKey(key), - Value: resp, - } - c.Client.Set(item) -} - -// Delete removes the response with key from the cache. -func (c *Cache) Delete(key string) { - c.Client.Delete(cacheKey(key)) -} - -// New returns a new Cache using the provided memcache server(s) with equal -// weight. If a server is listed multiple times, it gets a proportional amount -// of weight. -func New(server ...string) *Cache { - return NewWithClient(memcache.New(server...)) -} - -// NewWithClient returns a new Cache with the given memcache client. -func NewWithClient(client *memcache.Client) *Cache { - return &Cache{client} -} diff --git a/vendor/github.com/gregjones/httpcache/memcache/memcache_test.go b/vendor/github.com/gregjones/httpcache/memcache/memcache_test.go deleted file mode 100644 index 4dcc547c6e..0000000000 --- a/vendor/github.com/gregjones/httpcache/memcache/memcache_test.go +++ /dev/null @@ -1,47 +0,0 @@ -// +build !appengine - -package memcache - -import ( - "bytes" - "net" - "testing" -) - -const testServer = "localhost:11211" - -func TestMemCache(t *testing.T) { - conn, err := net.Dial("tcp", testServer) - if err != nil { - // TODO: rather than skip the test, fall back to a faked memcached server - t.Skipf("skipping test; no server running at %s", testServer) - } - conn.Write([]byte("flush_all\r\n")) // flush memcache - conn.Close() - - cache := New(testServer) - - key := "testKey" - _, ok := cache.Get(key) - if ok { - t.Fatal("retrieved key before adding it") - } - - val := []byte("some bytes") - cache.Set(key, val) - - retVal, ok := cache.Get(key) - if !ok { - t.Fatal("could not retrieve an element we just added") - } - if !bytes.Equal(retVal, val) { - t.Fatal("retrieved a different value than what we put in") - } - - cache.Delete(key) - - _, ok = cache.Get(key) - if ok { - t.Fatal("deleted key still present") - } -} diff --git a/vendor/github.com/gregjones/httpcache/redis/redis.go b/vendor/github.com/gregjones/httpcache/redis/redis.go deleted file mode 100644 index 3143d44388..0000000000 --- a/vendor/github.com/gregjones/httpcache/redis/redis.go +++ /dev/null @@ -1,43 +0,0 @@ -// Package redis provides a redis interface for http caching. -package redis - -import ( - "github.com/garyburd/redigo/redis" - "github.com/gregjones/httpcache" -) - -// cache is an implementation of httpcache.Cache that caches responses in a -// redis server. -type cache struct { - redis.Conn -} - -// cacheKey modifies an httpcache key for use in redis. Specifically, it -// prefixes keys to avoid collision with other data stored in redis. -func cacheKey(key string) string { - return "rediscache:" + key -} - -// Get returns the response corresponding to key if present. -func (c cache) Get(key string) (resp []byte, ok bool) { - item, err := redis.Bytes(c.Do("GET", cacheKey(key))) - if err != nil { - return nil, false - } - return item, true -} - -// Set saves a response to the cache as key. -func (c cache) Set(key string, resp []byte) { - c.Do("SET", cacheKey(key), resp) -} - -// Delete removes the response with key from the cache. -func (c cache) Delete(key string) { - c.Do("DEL", cacheKey(key)) -} - -// NewWithClient returns a new Cache with the given redis connection. -func NewWithClient(client redis.Conn) httpcache.Cache { - return cache{client} -} diff --git a/vendor/github.com/gregjones/httpcache/redis/redis_test.go b/vendor/github.com/gregjones/httpcache/redis/redis_test.go deleted file mode 100644 index 72f6f619ae..0000000000 --- a/vendor/github.com/gregjones/httpcache/redis/redis_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package redis - -import ( - "bytes" - "testing" - - "github.com/garyburd/redigo/redis" -) - -func TestRedisCache(t *testing.T) { - conn, err := redis.Dial("tcp", "localhost:6379") - if err != nil { - // TODO: rather than skip the test, fall back to a faked redis server - t.Skipf("skipping test; no server running at localhost:6379") - } - conn.Do("FLUSHALL") - - cache := NewWithClient(conn) - - key := "testKey" - _, ok := cache.Get(key) - if ok { - t.Fatal("retrieved key before adding it") - } - - val := []byte("some bytes") - cache.Set(key, val) - - retVal, ok := cache.Get(key) - if !ok { - t.Fatal("could not retrieve an element we just added") - } - if !bytes.Equal(retVal, val) { - t.Fatal("retrieved a different value than what we put in") - } - - cache.Delete(key) - - _, ok = cache.Get(key) - if ok { - t.Fatal("deleted key still present") - } -} diff --git a/vendor/github.com/juju/ratelimit/LICENSE b/vendor/github.com/juju/ratelimit/LICENSE deleted file mode 100644 index ade9307b39..0000000000 --- a/vendor/github.com/juju/ratelimit/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ -All files in this repository are licensed as follows. If you contribute -to this repository, it is assumed that you license your contribution -under the same license unless you state otherwise. - -All files Copyright (C) 2015 Canonical Ltd. unless otherwise specified in the file. - -This software is licensed under the LGPLv3, included below. - -As a special exception to the GNU Lesser General Public License version 3 -("LGPL3"), the copyright holders of this Library give you permission to -convey to a third party a Combined Work that links statically or dynamically -to this Library without providing any Minimal Corresponding Source or -Minimal Application Code as set out in 4d or providing the installation -information set out in section 4e, provided that you comply with the other -provisions of LGPL3 and provided that you meet, for the Application the -terms and conditions of the license(s) which apply to the Application. - -Except as stated in this special exception, the provisions of LGPL3 will -continue to comply in full to this Library. If you modify this Library, you -may apply this exception to your version of this Library, but you are not -obliged to do so. If you do not wish to do so, delete this exception -statement from your version. This exception does not (and cannot) modify any -license terms which apply to the Application, with which you must still -comply. - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/vendor/github.com/juju/ratelimit/README.md b/vendor/github.com/juju/ratelimit/README.md deleted file mode 100644 index a0fdfe2b12..0000000000 --- a/vendor/github.com/juju/ratelimit/README.md +++ /dev/null @@ -1,117 +0,0 @@ -# ratelimit --- - import "github.com/juju/ratelimit" - -The ratelimit package provides an efficient token bucket implementation. See -http://en.wikipedia.org/wiki/Token_bucket. - -## Usage - -#### func Reader - -```go -func Reader(r io.Reader, bucket *Bucket) io.Reader -``` -Reader returns a reader that is rate limited by the given token bucket. Each -token in the bucket represents one byte. - -#### func Writer - -```go -func Writer(w io.Writer, bucket *Bucket) io.Writer -``` -Writer returns a writer that is rate limited by the given token bucket. Each -token in the bucket represents one byte. - -#### type Bucket - -```go -type Bucket struct { -} -``` - -Bucket represents a token bucket that fills at a predetermined rate. Methods on -Bucket may be called concurrently. - -#### func NewBucket - -```go -func NewBucket(fillInterval time.Duration, capacity int64) *Bucket -``` -NewBucket returns a new token bucket that fills at the rate of one token every -fillInterval, up to the given maximum capacity. Both arguments must be positive. -The bucket is initially full. - -#### func NewBucketWithQuantum - -```go -func NewBucketWithQuantum(fillInterval time.Duration, capacity, quantum int64) *Bucket -``` -NewBucketWithQuantum is similar to NewBucket, but allows the specification of -the quantum size - quantum tokens are added every fillInterval. - -#### func NewBucketWithRate - -```go -func NewBucketWithRate(rate float64, capacity int64) *Bucket -``` -NewBucketWithRate returns a token bucket that fills the bucket at the rate of -rate tokens per second up to the given maximum capacity. Because of limited -clock resolution, at high rates, the actual rate may be up to 1% different from -the specified rate. - -#### func (*Bucket) Rate - -```go -func (tb *Bucket) Rate() float64 -``` -Rate returns the fill rate of the bucket, in tokens per second. - -#### func (*Bucket) Take - -```go -func (tb *Bucket) Take(count int64) time.Duration -``` -Take takes count tokens from the bucket without blocking. It returns the time -that the caller should wait until the tokens are actually available. - -Note that if the request is irrevocable - there is no way to return tokens to -the bucket once this method commits us to taking them. - -#### func (*Bucket) TakeAvailable - -```go -func (tb *Bucket) TakeAvailable(count int64) int64 -``` -TakeAvailable takes up to count immediately available tokens from the bucket. It -returns the number of tokens removed, or zero if there are no available tokens. -It does not block. - -#### func (*Bucket) TakeMaxDuration - -```go -func (tb *Bucket) TakeMaxDuration(count int64, maxWait time.Duration) (time.Duration, bool) -``` -TakeMaxDuration is like Take, except that it will only take tokens from the -bucket if the wait time for the tokens is no greater than maxWait. - -If it would take longer than maxWait for the tokens to become available, it does -nothing and reports false, otherwise it returns the time that the caller should -wait until the tokens are actually available, and reports true. - -#### func (*Bucket) Wait - -```go -func (tb *Bucket) Wait(count int64) -``` -Wait takes count tokens from the bucket, waiting until they are available. - -#### func (*Bucket) WaitMaxDuration - -```go -func (tb *Bucket) WaitMaxDuration(count int64, maxWait time.Duration) bool -``` -WaitMaxDuration is like Wait except that it will only take tokens from the -bucket if it needs to wait for no greater than maxWait. It reports whether any -tokens have been removed from the bucket If no tokens have been removed, it -returns immediately. diff --git a/vendor/github.com/juju/ratelimit/ratelimit.go b/vendor/github.com/juju/ratelimit/ratelimit.go deleted file mode 100644 index bd9ef10385..0000000000 --- a/vendor/github.com/juju/ratelimit/ratelimit.go +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3 with static-linking exception. -// See LICENCE file for details. - -// Package ratelimit provides an efficient token bucket implementation -// that can be used to limit the rate of arbitrary things. -// See http://en.wikipedia.org/wiki/Token_bucket. -package ratelimit - -import ( - "math" - "strconv" - "sync" - "time" -) - -// The algorithm that this implementation uses does computational work -// only when tokens are removed from the bucket, and that work completes -// in short, bounded-constant time (Bucket.Wait benchmarks at 175ns on -// my laptop). -// -// Time is measured in equal measured ticks, a given interval -// (fillInterval) apart. On each tick a number of tokens (quantum) are -// added to the bucket. -// -// When any of the methods are called the bucket updates the number of -// tokens that are in the bucket, and it records the current tick -// number too. Note that it doesn't record the current time - by -// keeping things in units of whole ticks, it's easy to dish out tokens -// at exactly the right intervals as measured from the start time. -// -// This allows us to calculate the number of tokens that will be -// available at some time in the future with a few simple arithmetic -// operations. -// -// The main reason for being able to transfer multiple tokens on each tick -// is so that we can represent rates greater than 1e9 (the resolution of the Go -// time package) tokens per second, but it's also useful because -// it means we can easily represent situations like "a person gets -// five tokens an hour, replenished on the hour". - -// Bucket represents a token bucket that fills at a predetermined rate. -// Methods on Bucket may be called concurrently. -type Bucket struct { - clock Clock - - // startTime holds the moment when the bucket was - // first created and ticks began. - startTime time.Time - - // capacity holds the overall capacity of the bucket. - capacity int64 - - // quantum holds how many tokens are added on - // each tick. - quantum int64 - - // fillInterval holds the interval between each tick. - fillInterval time.Duration - - // mu guards the fields below it. - mu sync.Mutex - - // availableTokens holds the number of available - // tokens as of the associated latestTick. - // It will be negative when there are consumers - // waiting for tokens. - availableTokens int64 - - // latestTick holds the latest tick for which - // we know the number of tokens in the bucket. - latestTick int64 -} - -// NewBucket returns a new token bucket that fills at the -// rate of one token every fillInterval, up to the given -// maximum capacity. Both arguments must be -// positive. The bucket is initially full. -func NewBucket(fillInterval time.Duration, capacity int64) *Bucket { - return NewBucketWithClock(fillInterval, capacity, nil) -} - -// NewBucketWithClock is identical to NewBucket but injects a testable clock -// interface. -func NewBucketWithClock(fillInterval time.Duration, capacity int64, clock Clock) *Bucket { - return NewBucketWithQuantumAndClock(fillInterval, capacity, 1, clock) -} - -// rateMargin specifes the allowed variance of actual -// rate from specified rate. 1% seems reasonable. -const rateMargin = 0.01 - -// NewBucketWithRate returns a token bucket that fills the bucket -// at the rate of rate tokens per second up to the given -// maximum capacity. Because of limited clock resolution, -// at high rates, the actual rate may be up to 1% different from the -// specified rate. -func NewBucketWithRate(rate float64, capacity int64) *Bucket { - return NewBucketWithRateAndClock(rate, capacity, nil) -} - -// NewBucketWithRateAndClock is identical to NewBucketWithRate but injects a -// testable clock interface. -func NewBucketWithRateAndClock(rate float64, capacity int64, clock Clock) *Bucket { - // Use the same bucket each time through the loop - // to save allocations. - tb := NewBucketWithQuantumAndClock(1, capacity, 1, clock) - for quantum := int64(1); quantum < 1<<50; quantum = nextQuantum(quantum) { - fillInterval := time.Duration(1e9 * float64(quantum) / rate) - if fillInterval <= 0 { - continue - } - tb.fillInterval = fillInterval - tb.quantum = quantum - if diff := math.Abs(tb.Rate() - rate); diff/rate <= rateMargin { - return tb - } - } - panic("cannot find suitable quantum for " + strconv.FormatFloat(rate, 'g', -1, 64)) -} - -// nextQuantum returns the next quantum to try after q. -// We grow the quantum exponentially, but slowly, so we -// get a good fit in the lower numbers. -func nextQuantum(q int64) int64 { - q1 := q * 11 / 10 - if q1 == q { - q1++ - } - return q1 -} - -// NewBucketWithQuantum is similar to NewBucket, but allows -// the specification of the quantum size - quantum tokens -// are added every fillInterval. -func NewBucketWithQuantum(fillInterval time.Duration, capacity, quantum int64) *Bucket { - return NewBucketWithQuantumAndClock(fillInterval, capacity, quantum, nil) -} - -// NewBucketWithQuantumAndClock is like NewBucketWithQuantum, but -// also has a clock argument that allows clients to fake the passing -// of time. If clock is nil, the system clock will be used. -func NewBucketWithQuantumAndClock(fillInterval time.Duration, capacity, quantum int64, clock Clock) *Bucket { - if clock == nil { - clock = realClock{} - } - if fillInterval <= 0 { - panic("token bucket fill interval is not > 0") - } - if capacity <= 0 { - panic("token bucket capacity is not > 0") - } - if quantum <= 0 { - panic("token bucket quantum is not > 0") - } - return &Bucket{ - clock: clock, - startTime: clock.Now(), - latestTick: 0, - fillInterval: fillInterval, - capacity: capacity, - quantum: quantum, - availableTokens: capacity, - } -} - -// Wait takes count tokens from the bucket, waiting until they are -// available. -func (tb *Bucket) Wait(count int64) { - if d := tb.Take(count); d > 0 { - tb.clock.Sleep(d) - } -} - -// WaitMaxDuration is like Wait except that it will -// only take tokens from the bucket if it needs to wait -// for no greater than maxWait. It reports whether -// any tokens have been removed from the bucket -// If no tokens have been removed, it returns immediately. -func (tb *Bucket) WaitMaxDuration(count int64, maxWait time.Duration) bool { - d, ok := tb.TakeMaxDuration(count, maxWait) - if d > 0 { - tb.clock.Sleep(d) - } - return ok -} - -const infinityDuration time.Duration = 0x7fffffffffffffff - -// Take takes count tokens from the bucket without blocking. It returns -// the time that the caller should wait until the tokens are actually -// available. -// -// Note that if the request is irrevocable - there is no way to return -// tokens to the bucket once this method commits us to taking them. -func (tb *Bucket) Take(count int64) time.Duration { - tb.mu.Lock() - defer tb.mu.Unlock() - d, _ := tb.take(tb.clock.Now(), count, infinityDuration) - return d -} - -// TakeMaxDuration is like Take, except that -// it will only take tokens from the bucket if the wait -// time for the tokens is no greater than maxWait. -// -// If it would take longer than maxWait for the tokens -// to become available, it does nothing and reports false, -// otherwise it returns the time that the caller should -// wait until the tokens are actually available, and reports -// true. -func (tb *Bucket) TakeMaxDuration(count int64, maxWait time.Duration) (time.Duration, bool) { - tb.mu.Lock() - defer tb.mu.Unlock() - return tb.take(tb.clock.Now(), count, maxWait) -} - -// TakeAvailable takes up to count immediately available tokens from the -// bucket. It returns the number of tokens removed, or zero if there are -// no available tokens. It does not block. -func (tb *Bucket) TakeAvailable(count int64) int64 { - tb.mu.Lock() - defer tb.mu.Unlock() - return tb.takeAvailable(tb.clock.Now(), count) -} - -// takeAvailable is the internal version of TakeAvailable - it takes the -// current time as an argument to enable easy testing. -func (tb *Bucket) takeAvailable(now time.Time, count int64) int64 { - if count <= 0 { - return 0 - } - tb.adjustavailableTokens(tb.currentTick(now)) - if tb.availableTokens <= 0 { - return 0 - } - if count > tb.availableTokens { - count = tb.availableTokens - } - tb.availableTokens -= count - return count -} - -// Available returns the number of available tokens. It will be negative -// when there are consumers waiting for tokens. Note that if this -// returns greater than zero, it does not guarantee that calls that take -// tokens from the buffer will succeed, as the number of available -// tokens could have changed in the meantime. This method is intended -// primarily for metrics reporting and debugging. -func (tb *Bucket) Available() int64 { - return tb.available(tb.clock.Now()) -} - -// available is the internal version of available - it takes the current time as -// an argument to enable easy testing. -func (tb *Bucket) available(now time.Time) int64 { - tb.mu.Lock() - defer tb.mu.Unlock() - tb.adjustavailableTokens(tb.currentTick(now)) - return tb.availableTokens -} - -// Capacity returns the capacity that the bucket was created with. -func (tb *Bucket) Capacity() int64 { - return tb.capacity -} - -// Rate returns the fill rate of the bucket, in tokens per second. -func (tb *Bucket) Rate() float64 { - return 1e9 * float64(tb.quantum) / float64(tb.fillInterval) -} - -// take is the internal version of Take - it takes the current time as -// an argument to enable easy testing. -func (tb *Bucket) take(now time.Time, count int64, maxWait time.Duration) (time.Duration, bool) { - if count <= 0 { - return 0, true - } - - tick := tb.currentTick(now) - tb.adjustavailableTokens(tick) - avail := tb.availableTokens - count - if avail >= 0 { - tb.availableTokens = avail - return 0, true - } - // Round up the missing tokens to the nearest multiple - // of quantum - the tokens won't be available until - // that tick. - - // endTick holds the tick when all the requested tokens will - // become available. - endTick := tick + (-avail+tb.quantum-1)/tb.quantum - endTime := tb.startTime.Add(time.Duration(endTick) * tb.fillInterval) - waitTime := endTime.Sub(now) - if waitTime > maxWait { - return 0, false - } - tb.availableTokens = avail - return waitTime, true -} - -// currentTick returns the current time tick, measured -// from tb.startTime. -func (tb *Bucket) currentTick(now time.Time) int64 { - return int64(now.Sub(tb.startTime) / tb.fillInterval) -} - -// adjustavailableTokens adjusts the current number of tokens -// available in the bucket at the given time, which must -// be in the future (positive) with respect to tb.latestTick. -func (tb *Bucket) adjustavailableTokens(tick int64) { - if tb.availableTokens >= tb.capacity { - return - } - tb.availableTokens += (tick - tb.latestTick) * tb.quantum - if tb.availableTokens > tb.capacity { - tb.availableTokens = tb.capacity - } - tb.latestTick = tick - return -} - -// Clock represents the passage of time in a way that -// can be faked out for tests. -type Clock interface { - // Now returns the current time. - Now() time.Time - // Sleep sleeps for at least the given duration. - Sleep(d time.Duration) -} - -// realClock implements Clock in terms of standard time functions. -type realClock struct{} - -// Now implements Clock.Now by calling time.Now. -func (realClock) Now() time.Time { - return time.Now() -} - -// Now implements Clock.Sleep by calling time.Sleep. -func (realClock) Sleep(d time.Duration) { - time.Sleep(d) -} diff --git a/vendor/github.com/juju/ratelimit/ratelimit_test.go b/vendor/github.com/juju/ratelimit/ratelimit_test.go deleted file mode 100644 index 3de0cad6e0..0000000000 --- a/vendor/github.com/juju/ratelimit/ratelimit_test.go +++ /dev/null @@ -1,396 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3 with static-linking exception. -// See LICENCE file for details. - -package ratelimit - -import ( - "math" - "testing" - "time" - - gc "gopkg.in/check.v1" -) - -func TestPackage(t *testing.T) { - gc.TestingT(t) -} - -type rateLimitSuite struct{} - -var _ = gc.Suite(rateLimitSuite{}) - -type takeReq struct { - time time.Duration - count int64 - expectWait time.Duration -} - -var takeTests = []struct { - about string - fillInterval time.Duration - capacity int64 - reqs []takeReq -}{{ - about: "serial requests", - fillInterval: 250 * time.Millisecond, - capacity: 10, - reqs: []takeReq{{ - time: 0, - count: 0, - expectWait: 0, - }, { - time: 0, - count: 10, - expectWait: 0, - }, { - time: 0, - count: 1, - expectWait: 250 * time.Millisecond, - }, { - time: 250 * time.Millisecond, - count: 1, - expectWait: 250 * time.Millisecond, - }}, -}, { - about: "concurrent requests", - fillInterval: 250 * time.Millisecond, - capacity: 10, - reqs: []takeReq{{ - time: 0, - count: 10, - expectWait: 0, - }, { - time: 0, - count: 2, - expectWait: 500 * time.Millisecond, - }, { - time: 0, - count: 2, - expectWait: 1000 * time.Millisecond, - }, { - time: 0, - count: 1, - expectWait: 1250 * time.Millisecond, - }}, -}, { - about: "more than capacity", - fillInterval: 1 * time.Millisecond, - capacity: 10, - reqs: []takeReq{{ - time: 0, - count: 10, - expectWait: 0, - }, { - time: 20 * time.Millisecond, - count: 15, - expectWait: 5 * time.Millisecond, - }}, -}, { - about: "sub-quantum time", - fillInterval: 10 * time.Millisecond, - capacity: 10, - reqs: []takeReq{{ - time: 0, - count: 10, - expectWait: 0, - }, { - time: 7 * time.Millisecond, - count: 1, - expectWait: 3 * time.Millisecond, - }, { - time: 8 * time.Millisecond, - count: 1, - expectWait: 12 * time.Millisecond, - }}, -}, { - about: "within capacity", - fillInterval: 10 * time.Millisecond, - capacity: 5, - reqs: []takeReq{{ - time: 0, - count: 5, - expectWait: 0, - }, { - time: 60 * time.Millisecond, - count: 5, - expectWait: 0, - }, { - time: 60 * time.Millisecond, - count: 1, - expectWait: 10 * time.Millisecond, - }, { - time: 80 * time.Millisecond, - count: 2, - expectWait: 10 * time.Millisecond, - }}, -}} - -var availTests = []struct { - about string - capacity int64 - fillInterval time.Duration - take int64 - sleep time.Duration - - expectCountAfterTake int64 - expectCountAfterSleep int64 -}{{ - about: "should fill tokens after interval", - capacity: 5, - fillInterval: time.Second, - take: 5, - sleep: time.Second, - expectCountAfterTake: 0, - expectCountAfterSleep: 1, -}, { - about: "should fill tokens plus existing count", - capacity: 2, - fillInterval: time.Second, - take: 1, - sleep: time.Second, - expectCountAfterTake: 1, - expectCountAfterSleep: 2, -}, { - about: "shouldn't fill before interval", - capacity: 2, - fillInterval: 2 * time.Second, - take: 1, - sleep: time.Second, - expectCountAfterTake: 1, - expectCountAfterSleep: 1, -}, { - about: "should fill only once after 1*interval before 2*interval", - capacity: 2, - fillInterval: 2 * time.Second, - take: 1, - sleep: 3 * time.Second, - expectCountAfterTake: 1, - expectCountAfterSleep: 2, -}} - -func (rateLimitSuite) TestTake(c *gc.C) { - for i, test := range takeTests { - tb := NewBucket(test.fillInterval, test.capacity) - for j, req := range test.reqs { - d, ok := tb.take(tb.startTime.Add(req.time), req.count, infinityDuration) - c.Assert(ok, gc.Equals, true) - if d != req.expectWait { - c.Fatalf("test %d.%d, %s, got %v want %v", i, j, test.about, d, req.expectWait) - } - } - } -} - -func (rateLimitSuite) TestTakeMaxDuration(c *gc.C) { - for i, test := range takeTests { - tb := NewBucket(test.fillInterval, test.capacity) - for j, req := range test.reqs { - if req.expectWait > 0 { - d, ok := tb.take(tb.startTime.Add(req.time), req.count, req.expectWait-1) - c.Assert(ok, gc.Equals, false) - c.Assert(d, gc.Equals, time.Duration(0)) - } - d, ok := tb.take(tb.startTime.Add(req.time), req.count, req.expectWait) - c.Assert(ok, gc.Equals, true) - if d != req.expectWait { - c.Fatalf("test %d.%d, %s, got %v want %v", i, j, test.about, d, req.expectWait) - } - } - } -} - -type takeAvailableReq struct { - time time.Duration - count int64 - expect int64 -} - -var takeAvailableTests = []struct { - about string - fillInterval time.Duration - capacity int64 - reqs []takeAvailableReq -}{{ - about: "serial requests", - fillInterval: 250 * time.Millisecond, - capacity: 10, - reqs: []takeAvailableReq{{ - time: 0, - count: 0, - expect: 0, - }, { - time: 0, - count: 10, - expect: 10, - }, { - time: 0, - count: 1, - expect: 0, - }, { - time: 250 * time.Millisecond, - count: 1, - expect: 1, - }}, -}, { - about: "concurrent requests", - fillInterval: 250 * time.Millisecond, - capacity: 10, - reqs: []takeAvailableReq{{ - time: 0, - count: 5, - expect: 5, - }, { - time: 0, - count: 2, - expect: 2, - }, { - time: 0, - count: 5, - expect: 3, - }, { - time: 0, - count: 1, - expect: 0, - }}, -}, { - about: "more than capacity", - fillInterval: 1 * time.Millisecond, - capacity: 10, - reqs: []takeAvailableReq{{ - time: 0, - count: 10, - expect: 10, - }, { - time: 20 * time.Millisecond, - count: 15, - expect: 10, - }}, -}, { - about: "within capacity", - fillInterval: 10 * time.Millisecond, - capacity: 5, - reqs: []takeAvailableReq{{ - time: 0, - count: 5, - expect: 5, - }, { - time: 60 * time.Millisecond, - count: 5, - expect: 5, - }, { - time: 70 * time.Millisecond, - count: 1, - expect: 1, - }}, -}} - -func (rateLimitSuite) TestTakeAvailable(c *gc.C) { - for i, test := range takeAvailableTests { - tb := NewBucket(test.fillInterval, test.capacity) - for j, req := range test.reqs { - d := tb.takeAvailable(tb.startTime.Add(req.time), req.count) - if d != req.expect { - c.Fatalf("test %d.%d, %s, got %v want %v", i, j, test.about, d, req.expect) - } - } - } -} - -func (rateLimitSuite) TestPanics(c *gc.C) { - c.Assert(func() { NewBucket(0, 1) }, gc.PanicMatches, "token bucket fill interval is not > 0") - c.Assert(func() { NewBucket(-2, 1) }, gc.PanicMatches, "token bucket fill interval is not > 0") - c.Assert(func() { NewBucket(1, 0) }, gc.PanicMatches, "token bucket capacity is not > 0") - c.Assert(func() { NewBucket(1, -2) }, gc.PanicMatches, "token bucket capacity is not > 0") -} - -func isCloseTo(x, y, tolerance float64) bool { - return math.Abs(x-y)/y < tolerance -} - -func (rateLimitSuite) TestRate(c *gc.C) { - tb := NewBucket(1, 1) - if !isCloseTo(tb.Rate(), 1e9, 0.00001) { - c.Fatalf("got %v want 1e9", tb.Rate()) - } - tb = NewBucket(2*time.Second, 1) - if !isCloseTo(tb.Rate(), 0.5, 0.00001) { - c.Fatalf("got %v want 0.5", tb.Rate()) - } - tb = NewBucketWithQuantum(100*time.Millisecond, 1, 5) - if !isCloseTo(tb.Rate(), 50, 0.00001) { - c.Fatalf("got %v want 50", tb.Rate()) - } -} - -func checkRate(c *gc.C, rate float64) { - tb := NewBucketWithRate(rate, 1<<62) - if !isCloseTo(tb.Rate(), rate, rateMargin) { - c.Fatalf("got %g want %v", tb.Rate(), rate) - } - d, ok := tb.take(tb.startTime, 1<<62, infinityDuration) - c.Assert(ok, gc.Equals, true) - c.Assert(d, gc.Equals, time.Duration(0)) - - // Check that the actual rate is as expected by - // asking for a not-quite multiple of the bucket's - // quantum and checking that the wait time - // correct. - d, ok = tb.take(tb.startTime, tb.quantum*2-tb.quantum/2, infinityDuration) - c.Assert(ok, gc.Equals, true) - expectTime := 1e9 * float64(tb.quantum) * 2 / rate - if !isCloseTo(float64(d), expectTime, rateMargin) { - c.Fatalf("rate %g: got %g want %v", rate, float64(d), expectTime) - } -} - -func (rateLimitSuite) NewBucketWithRate(c *gc.C) { - for rate := float64(1); rate < 1e6; rate += 7 { - checkRate(c, rate) - } - for _, rate := range []float64{ - 1024 * 1024 * 1024, - 1e-5, - 0.9e-5, - 0.5, - 0.9, - 0.9e8, - 3e12, - 4e18, - float64(1<<63 - 1), - } { - checkRate(c, rate) - checkRate(c, rate/3) - checkRate(c, rate*1.3) - } -} - -func TestAvailable(t *testing.T) { - for i, tt := range availTests { - tb := NewBucket(tt.fillInterval, tt.capacity) - if c := tb.takeAvailable(tb.startTime, tt.take); c != tt.take { - t.Fatalf("#%d: %s, take = %d, want = %d", i, tt.about, c, tt.take) - } - if c := tb.available(tb.startTime); c != tt.expectCountAfterTake { - t.Fatalf("#%d: %s, after take, available = %d, want = %d", i, tt.about, c, tt.expectCountAfterTake) - } - if c := tb.available(tb.startTime.Add(tt.sleep)); c != tt.expectCountAfterSleep { - t.Fatalf("#%d: %s, after some time it should fill in new tokens, available = %d, want = %d", - i, tt.about, c, tt.expectCountAfterSleep) - } - } - -} - -func BenchmarkWait(b *testing.B) { - tb := NewBucket(1, 16*1024) - for i := b.N - 1; i >= 0; i-- { - tb.Wait(1) - } -} - -func BenchmarkNewBucket(b *testing.B) { - for i := b.N - 1; i >= 0; i-- { - NewBucketWithRate(4e18, 1<<62) - } -} diff --git a/vendor/github.com/juju/ratelimit/reader.go b/vendor/github.com/juju/ratelimit/reader.go deleted file mode 100644 index 6403bf78d4..0000000000 --- a/vendor/github.com/juju/ratelimit/reader.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 Canonical Ltd. -// Licensed under the LGPLv3 with static-linking exception. -// See LICENCE file for details. - -package ratelimit - -import "io" - -type reader struct { - r io.Reader - bucket *Bucket -} - -// Reader returns a reader that is rate limited by -// the given token bucket. Each token in the bucket -// represents one byte. -func Reader(r io.Reader, bucket *Bucket) io.Reader { - return &reader{ - r: r, - bucket: bucket, - } -} - -func (r *reader) Read(buf []byte) (int, error) { - n, err := r.r.Read(buf) - if n <= 0 { - return n, err - } - r.bucket.Wait(int64(n)) - return n, err -} - -type writer struct { - w io.Writer - bucket *Bucket -} - -// Writer returns a reader that is rate limited by -// the given token bucket. Each token in the bucket -// represents one byte. -func Writer(w io.Writer, bucket *Bucket) io.Writer { - return &writer{ - w: w, - bucket: bucket, - } -} - -func (w *writer) Write(buf []byte) (int, error) { - w.bucket.Wait(int64(len(buf))) - return w.w.Write(buf) -} diff --git a/vendor/github.com/mailru/easyjson/.gitignore b/vendor/github.com/mailru/easyjson/.gitignore deleted file mode 100644 index db8c66edf8..0000000000 --- a/vendor/github.com/mailru/easyjson/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.root -*_easyjson.go -*.iml -.idea diff --git a/vendor/github.com/mailru/easyjson/LICENSE b/vendor/github.com/mailru/easyjson/LICENSE deleted file mode 100644 index fbff658f70..0000000000 --- a/vendor/github.com/mailru/easyjson/LICENSE +++ /dev/null @@ -1,7 +0,0 @@ -Copyright (c) 2016 Mail.Ru Group - -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. diff --git a/vendor/github.com/mailru/easyjson/Makefile b/vendor/github.com/mailru/easyjson/Makefile deleted file mode 100644 index f877ab269a..0000000000 --- a/vendor/github.com/mailru/easyjson/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -PKG=github.com/mailru/easyjson -GOPATH:=$(PWD)/.root:$(GOPATH) -export GOPATH - -all: test - -.root/src/$(PKG): - mkdir -p $@ - for i in $$PWD/* ; do ln -s $$i $@/`basename $$i` ; done - -root: .root/src/$(PKG) - -clean: - rm -rf .root - rm -rf tests/*_easyjson.go - -build: - go build -i -o .root/bin/easyjson $(PKG)/easyjson - -generate: root build - .root/bin/easyjson -stubs \ - .root/src/$(PKG)/tests/snake.go \ - .root/src/$(PKG)/tests/data.go \ - .root/src/$(PKG)/tests/omitempty.go \ - .root/src/$(PKG)/tests/nothing.go \ - .root/src/$(PKG)/tests/named_type.go - - .root/bin/easyjson -all .root/src/$(PKG)/tests/data.go - .root/bin/easyjson -all .root/src/$(PKG)/tests/nothing.go - .root/bin/easyjson -all .root/src/$(PKG)/tests/errors.go - .root/bin/easyjson -snake_case .root/src/$(PKG)/tests/snake.go - .root/bin/easyjson -omit_empty .root/src/$(PKG)/tests/omitempty.go - .root/bin/easyjson -build_tags=use_easyjson .root/src/$(PKG)/benchmark/data.go - .root/bin/easyjson .root/src/$(PKG)/tests/nested_easy.go - .root/bin/easyjson .root/src/$(PKG)/tests/named_type.go - -test: generate root - go test \ - $(PKG)/tests \ - $(PKG)/jlexer \ - $(PKG)/gen \ - $(PKG)/buffer - go test -benchmem -tags use_easyjson -bench . $(PKG)/benchmark - golint -set_exit_status .root/src/$(PKG)/tests/*_easyjson.go - -bench-other: generate root - @go test -benchmem -bench . $(PKG)/benchmark - @go test -benchmem -tags use_ffjson -bench . $(PKG)/benchmark - @go test -benchmem -tags use_jsoniter -bench . $(PKG)/benchmark - @go test -benchmem -tags use_codec -bench . $(PKG)/benchmark - -bench-python: - benchmark/ujson.sh - - -.PHONY: root clean generate test build diff --git a/vendor/github.com/mailru/easyjson/README.md b/vendor/github.com/mailru/easyjson/README.md deleted file mode 100644 index 9366e3f712..0000000000 --- a/vendor/github.com/mailru/easyjson/README.md +++ /dev/null @@ -1,331 +0,0 @@ -# easyjson [![Build Status](https://travis-ci.org/mailru/easyjson.svg?branch=master)](https://travis-ci.org/mailru/easyjson) [![Go Report Card](https://goreportcard.com/badge/github.com/mailru/easyjson)](https://goreportcard.com/report/github.com/mailru/easyjson) - -Package easyjson provides a fast and easy way to marshal/unmarshal Go structs -to/from JSON without the use of reflection. In performance tests, easyjson -outperforms the standard `encoding/json` package by a factor of 4-5x, and other -JSON encoding packages by a factor of 2-3x. - -easyjson aims to keep generated Go code simple enough so that it can be easily -optimized or fixed. Another goal is to provide users with the ability to -customize the generated code by providing options not available with the -standard `encoding/json` package, such as generating "snake_case" names or -enabling `omitempty` behavior by default. - -## Usage -```sh -# install -go get -u github.com/mailru/easyjson/... - -# run -easyjson -all .go -``` - -The above will generate `_easyjson.go` containing the appropriate marshaler and -unmarshaler funcs for all structs contained in `.go`. - -Please note that easyjson requires a full Go build environment and the `GOPATH` -environment variable to be set. This is because easyjson code generation -invokes `go run` on a temporary file (an approach to code generation borrowed -from [ffjson](https://github.com/pquerna/ffjson)). - -## Options -```txt -Usage of easyjson: - -all - generate marshaler/unmarshalers for all structs in a file - -build_tags string - build tags to add to generated file - -leave_temps - do not delete temporary files - -no_std_marshalers - don't generate MarshalJSON/UnmarshalJSON funcs - -noformat - do not run 'gofmt -w' on output file - -omit_empty - omit empty fields by default - -output_filename string - specify the filename of the output - -pkg - process the whole package instead of just the given file - -snake_case - use snake_case names instead of CamelCase by default - -lower_camel_case - use lowerCamelCase instead of CamelCase by default - -stubs - only generate stubs for marshaler/unmarshaler funcs -``` - -Using `-all` will generate marshalers/unmarshalers for all Go structs in the -file. If `-all` is not provided, then only those structs whose preceding -comment starts with `easyjson:json` will have marshalers/unmarshalers -generated. For example: - -```go -//easyjson:json -type A struct {} -``` - -Additional option notes: - -* `-snake_case` tells easyjson to generate snake\_case field names by default - (unless overridden by a field tag). The CamelCase to snake\_case conversion - algorithm should work in most cases (ie, HTTPVersion will be converted to - "http_version"). - -* `-build_tags` will add the specified build tags to generated Go sources. - -## Generated Marshaler/Unmarshaler Funcs - -For Go struct types, easyjson generates the funcs `MarshalEasyJSON` / -`UnmarshalEasyJSON` for marshaling/unmarshaling JSON. In turn, these satisify -the `easyjson.Marshaler` and `easyjson.Unmarshaler` interfaces and when used in -conjunction with `easyjson.Marshal` / `easyjson.Unmarshal` avoid unnecessary -reflection / type assertions during marshaling/unmarshaling to/from JSON for Go -structs. - -easyjson also generates `MarshalJSON` and `UnmarshalJSON` funcs for Go struct -types compatible with the standard `json.Marshaler` and `json.Unmarshaler` -interfaces. Please be aware that using the standard `json.Marshal` / -`json.Unmarshal` for marshaling/unmarshaling will incur a significant -performance penalty when compared to using `easyjson.Marshal` / -`easyjson.Unmarshal`. - -Additionally, easyjson exposes utility funcs that use the `MarshalEasyJSON` and -`UnmarshalEasyJSON` for marshaling/unmarshaling to and from standard readers -and writers. For example, easyjson provides `easyjson.MarshalToHTTPResponseWriter` -which marshals to the standard `http.ResponseWriter`. Please see the [GoDoc -listing](https://godoc.org/github.com/mailru/easyjson) for the full listing of -utility funcs that are available. - -## Controlling easyjson Marshaling and Unmarshaling Behavior - -Go types can provide their own `MarshalEasyJSON` and `UnmarshalEasyJSON` funcs -that satisify the `easyjson.Marshaler` / `easyjson.Unmarshaler` interfaces. -These will be used by `easyjson.Marshal` and `easyjson.Unmarshal` when defined -for a Go type. - -Go types can also satisify the `easyjson.Optional` interface, which allows the -type to define its own `omitempty` logic. - -## Type Wrappers - -easyjson provides additional type wrappers defined in the `easyjson/opt` -package. These wrap the standard Go primitives and in turn satisify the -easyjson interfaces. - -The `easyjson/opt` type wrappers are useful when needing to distinguish between -a missing value and/or when needing to specifying a default value. Type -wrappers allow easyjson to avoid additional pointers and heap allocations and -can significantly increase performance when used properly. - -## Memory Pooling - -easyjson uses a buffer pool that allocates data in increasing chunks from 128 -to 32768 bytes. Chunks of 512 bytes and larger will be reused with the help of -`sync.Pool`. The maximum size of a chunk is bounded to reduce redundant memory -allocation and to allow larger reusable buffers. - -easyjson's custom allocation buffer pool is defined in the `easyjson/buffer` -package, and the default behavior pool behavior can be modified (if necessary) -through a call to `buffer.Init()` prior to any marshaling or unmarshaling. -Please see the [GoDoc listing](https://godoc.org/github.com/mailru/easyjson/buffer) -for more information. - -## Issues, Notes, and Limitations - -* easyjson is still early in its development. As such, there are likely to be - bugs and missing features when compared to `encoding/json`. In the case of a - missing feature or bug, please create a GitHub issue. Pull requests are - welcome! - -* Unlike `encoding/json`, object keys are case-sensitive. Case-insensitive - matching is not currently provided due to the significant performance hit - when doing case-insensitive key matching. In the future, case-insensitive - object key matching may be provided via an option to the generator. - -* easyjson makes use of `unsafe`, which simplifies the code and - provides significant performance benefits by allowing no-copy - conversion from `[]byte` to `string`. That said, `unsafe` is used - only when unmarshaling and parsing JSON, and any `unsafe` operations - / memory allocations done will be safely deallocated by - easyjson. Set the build tag `easyjson_nounsafe` to compile it - without `unsafe`. - -* easyjson is compatible with Google App Engine. The `appengine` build - tag (set by App Engine's environment) will automatically disable the - use of `unsafe`, which is not allowed in App Engine's Standard - Environment. Note that the use with App Engine is still experimental. - -* Floats are formatted using the default precision from Go's `strconv` package. - As such, easyjson will not correctly handle high precision floats when - marshaling/unmarshaling JSON. Note, however, that there are very few/limited - uses where this behavior is not sufficient for general use. That said, a - different package may be needed if precise marshaling/unmarshaling of high - precision floats to/from JSON is required. - -* While unmarshaling, the JSON parser does the minimal amount of work needed to - skip over unmatching parens, and as such full validation is not done for the - entire JSON value being unmarshaled/parsed. - -* Currently there is no true streaming support for encoding/decoding as - typically for many uses/protocols the final, marshaled length of the JSON - needs to be known prior to sending the data. Currently this is not possible - with easyjson's architecture. - -## Benchmarks - -Most benchmarks were done using the example -[13kB example JSON](https://dev.twitter.com/rest/reference/get/search/tweets) -(9k after eliminating whitespace). This example is similar to real-world data, -is well-structured, and contains a healthy variety of different types, making -it ideal for JSON serialization benchmarks. - -Note: - -* For small request benchmarks, an 80 byte portion of the above example was - used. - -* For large request marshaling benchmarks, a struct containing 50 regular - samples was used, making a ~500kB output JSON. - -* Benchmarks are showing the results of easyjson's default behaviour, - which makes use of `unsafe`. - -Benchmarks are available in the repository and can be run by invoking `make`. - -### easyjson vs. encoding/json - -easyjson is roughly 5-6 times faster than the standard `encoding/json` for -unmarshaling, and 3-4 times faster for non-concurrent marshaling. Concurrent -marshaling is 6-7x faster if marshaling to a writer. - -### easyjson vs. ffjson - -easyjson uses the same approach for JSON marshaling as -[ffjson](https://github.com/pquerna/ffjson), but takes a significantly -different approach to lexing and parsing JSON during unmarshaling. This means -easyjson is roughly 2-3x faster for unmarshaling and 1.5-2x faster for -non-concurrent unmarshaling. - -As of this writing, `ffjson` seems to have issues when used concurrently: -specifically, large request pooling hurts `ffjson`'s performance and causes -scalability issues. These issues with `ffjson` can likely be fixed, but as of -writing remain outstanding/known issues with `ffjson`. - -easyjson and `ffjson` have similar performance for small requests, however -easyjson outperforms `ffjson` by roughly 2-5x times for large requests when -used with a writer. - -### easyjson vs. go/codec - -[go/codec](https://github.com/ugorji/go) provides -compile-time helpers for JSON generation. In this case, helpers do not work -like marshalers as they are encoding-independent. - -easyjson is generally 2x faster than `go/codec` for non-concurrent benchmarks -and about 3x faster for concurrent encoding (without marshaling to a writer). - -In an attempt to measure marshaling performance of `go/codec` (as opposed to -allocations/memcpy/writer interface invocations), a benchmark was done with -resetting length of a byte slice rather than resetting the whole slice to nil. -However, the optimization in this exact form may not be applicable in practice, -since the memory is not freed between marshaling operations. - -### easyjson vs 'ujson' python module - -[ujson](https://github.com/esnme/ultrajson) is using C code for parsing, so it -is interesting to see how plain golang compares to that. It is imporant to note -that the resulting object for python is slower to access, since the library -parses JSON object into dictionaries. - -easyjson is slightly faster for unmarshaling and 2-3x faster than `ujson` for -marshaling. - -### Benchmark Results - -`ffjson` results are from February 4th, 2016, using the latest `ffjson` and go1.6. -`go/codec` results are from March 4th, 2016, using the latest `go/codec` and go1.6. - -#### Unmarshaling - -| lib | json size | MB/s | allocs/op | B/op | -|:---------|:----------|-----:|----------:|------:| -| standard | regular | 22 | 218 | 10229 | -| standard | small | 9.7 | 14 | 720 | -| | | | | | -| easyjson | regular | 125 | 128 | 9794 | -| easyjson | small | 67 | 3 | 128 | -| | | | | | -| ffjson | regular | 66 | 141 | 9985 | -| ffjson | small | 17.6 | 10 | 488 | -| | | | | | -| codec | regular | 55 | 434 | 19299 | -| codec | small | 29 | 7 | 336 | -| | | | | | -| ujson | regular | 103 | N/A | N/A | - -#### Marshaling, one goroutine. - -| lib | json size | MB/s | allocs/op | B/op | -|:----------|:----------|-----:|----------:|------:| -| standard | regular | 75 | 9 | 23256 | -| standard | small | 32 | 3 | 328 | -| standard | large | 80 | 17 | 1.2M | -| | | | | | -| easyjson | regular | 213 | 9 | 10260 | -| easyjson* | regular | 263 | 8 | 742 | -| easyjson | small | 125 | 1 | 128 | -| easyjson | large | 212 | 33 | 490k | -| easyjson* | large | 262 | 25 | 2879 | -| | | | | | -| ffjson | regular | 122 | 153 | 21340 | -| ffjson** | regular | 146 | 152 | 4897 | -| ffjson | small | 36 | 5 | 384 | -| ffjson** | small | 64 | 4 | 128 | -| ffjson | large | 134 | 7317 | 818k | -| ffjson** | large | 125 | 7320 | 827k | -| | | | | | -| codec | regular | 80 | 17 | 33601 | -| codec*** | regular | 108 | 9 | 1153 | -| codec | small | 42 | 3 | 304 | -| codec*** | small | 56 | 1 | 48 | -| codec | large | 73 | 483 | 2.5M | -| codec*** | large | 103 | 451 | 66007 | -| | | | | | -| ujson | regular | 92 | N/A | N/A | - -\* marshaling to a writer, -\*\* using `ffjson.Pool()`, -\*\*\* reusing output slice instead of resetting it to nil - -#### Marshaling, concurrent. - -| lib | json size | MB/s | allocs/op | B/op | -|:----------|:----------|-----:|----------:|------:| -| standard | regular | 252 | 9 | 23257 | -| standard | small | 124 | 3 | 328 | -| standard | large | 289 | 17 | 1.2M | -| | | | | | -| easyjson | regular | 792 | 9 | 10597 | -| easyjson* | regular | 1748 | 8 | 779 | -| easyjson | small | 333 | 1 | 128 | -| easyjson | large | 718 | 36 | 548k | -| easyjson* | large | 2134 | 25 | 4957 | -| | | | | | -| ffjson | regular | 301 | 153 | 21629 | -| ffjson** | regular | 707 | 152 | 5148 | -| ffjson | small | 62 | 5 | 384 | -| ffjson** | small | 282 | 4 | 128 | -| ffjson | large | 438 | 7330 | 1.0M | -| ffjson** | large | 131 | 7319 | 820k | -| | | | | | -| codec | regular | 183 | 17 | 33603 | -| codec*** | regular | 671 | 9 | 1157 | -| codec | small | 147 | 3 | 304 | -| codec*** | small | 299 | 1 | 48 | -| codec | large | 190 | 483 | 2.5M | -| codec*** | large | 752 | 451 | 77574 | - -\* marshaling to a writer, -\*\* using `ffjson.Pool()`, -\*\*\* reusing output slice instead of resetting it to nil diff --git a/vendor/github.com/mailru/easyjson/benchmark/codec_test.go b/vendor/github.com/mailru/easyjson/benchmark/codec_test.go deleted file mode 100644 index 5c77072ee5..0000000000 --- a/vendor/github.com/mailru/easyjson/benchmark/codec_test.go +++ /dev/null @@ -1,279 +0,0 @@ -// +build use_codec - -package benchmark - -import ( - "testing" - - "github.com/ugorji/go/codec" -) - -func BenchmarkCodec_Unmarshal_M(b *testing.B) { - var h codec.Handle = new(codec.JsonHandle) - dec := codec.NewDecoderBytes(nil, h) - - b.SetBytes(int64(len(largeStructText))) - for i := 0; i < b.N; i++ { - var s LargeStruct - dec.ResetBytes(largeStructText) - if err := dec.Decode(&s); err != nil { - b.Error(err) - } - } -} - -func BenchmarkCodec_Unmarshal_S(b *testing.B) { - var h codec.Handle = new(codec.JsonHandle) - dec := codec.NewDecoderBytes(nil, h) - - b.SetBytes(int64(len(smallStructText))) - for i := 0; i < b.N; i++ { - var s LargeStruct - dec.ResetBytes(smallStructText) - if err := dec.Decode(&s); err != nil { - b.Error(err) - } - } -} - -func BenchmarkCodec_Marshal_S(b *testing.B) { - var h codec.Handle = new(codec.JsonHandle) - - var out []byte - enc := codec.NewEncoderBytes(&out, h) - - var l int64 - for i := 0; i < b.N; i++ { - enc.ResetBytes(&out) - if err := enc.Encode(&smallStructData); err != nil { - b.Error(err) - } - l = int64(len(out)) - out = nil - } - - b.SetBytes(l) -} - -func BenchmarkCodec_Marshal_M(b *testing.B) { - var h codec.Handle = new(codec.JsonHandle) - - var out []byte - enc := codec.NewEncoderBytes(&out, h) - - var l int64 - for i := 0; i < b.N; i++ { - enc.ResetBytes(&out) - if err := enc.Encode(&largeStructData); err != nil { - b.Error(err) - } - l = int64(len(out)) - out = nil - } - - b.SetBytes(l) -} - -func BenchmarkCodec_Marshal_L(b *testing.B) { - var h codec.Handle = new(codec.JsonHandle) - - var out []byte - enc := codec.NewEncoderBytes(&out, h) - - var l int64 - for i := 0; i < b.N; i++ { - enc.ResetBytes(&out) - if err := enc.Encode(&xlStructData); err != nil { - b.Error(err) - } - l = int64(len(out)) - out = nil - } - - b.SetBytes(l) -} - -func BenchmarkCodec_Marshal_S_Reuse(b *testing.B) { - var h codec.Handle = new(codec.JsonHandle) - - var out []byte - enc := codec.NewEncoderBytes(&out, h) - - var l int64 - for i := 0; i < b.N; i++ { - enc.ResetBytes(&out) - if err := enc.Encode(&smallStructData); err != nil { - b.Error(err) - } - l = int64(len(out)) - out = out[:0] - } - - b.SetBytes(l) -} - -func BenchmarkCodec_Marshal_M_Reuse(b *testing.B) { - var h codec.Handle = new(codec.JsonHandle) - - var out []byte - enc := codec.NewEncoderBytes(&out, h) - - var l int64 - for i := 0; i < b.N; i++ { - enc.ResetBytes(&out) - if err := enc.Encode(&largeStructData); err != nil { - b.Error(err) - } - l = int64(len(out)) - out = out[:0] - } - - b.SetBytes(l) -} - -func BenchmarkCodec_Marshal_L_Reuse(b *testing.B) { - var h codec.Handle = new(codec.JsonHandle) - - var out []byte - enc := codec.NewEncoderBytes(&out, h) - - var l int64 - for i := 0; i < b.N; i++ { - enc.ResetBytes(&out) - if err := enc.Encode(&xlStructData); err != nil { - b.Error(err) - } - l = int64(len(out)) - out = out[:0] - } - - b.SetBytes(l) -} - -func BenchmarkCodec_Marshal_S_Parallel(b *testing.B) { - var l int64 - - b.RunParallel(func(pb *testing.PB) { - var out []byte - - var h codec.Handle = new(codec.JsonHandle) - enc := codec.NewEncoderBytes(&out, h) - - for pb.Next() { - enc.ResetBytes(&out) - if err := enc.Encode(&smallStructData); err != nil { - b.Error(err) - } - l = int64(len(out)) - out = nil - } - }) - - b.SetBytes(l) -} - -func BenchmarkCodec_Marshal_M_Parallel(b *testing.B) { - var l int64 - - b.RunParallel(func(pb *testing.PB) { - var h codec.Handle = new(codec.JsonHandle) - - var out []byte - enc := codec.NewEncoderBytes(&out, h) - - for pb.Next() { - enc.ResetBytes(&out) - if err := enc.Encode(&largeStructData); err != nil { - b.Error(err) - } - l = int64(len(out)) - out = nil - } - }) - b.SetBytes(l) -} - -func BenchmarkCodec_Marshal_L_Parallel(b *testing.B) { - var l int64 - - b.RunParallel(func(pb *testing.PB) { - var h codec.Handle = new(codec.JsonHandle) - - var out []byte - enc := codec.NewEncoderBytes(&out, h) - - for pb.Next() { - enc.ResetBytes(&out) - if err := enc.Encode(&xlStructData); err != nil { - b.Error(err) - } - l = int64(len(out)) - out = nil - } - }) - b.SetBytes(l) -} - -func BenchmarkCodec_Marshal_S_Parallel_Reuse(b *testing.B) { - var l int64 - - b.RunParallel(func(pb *testing.PB) { - var out []byte - - var h codec.Handle = new(codec.JsonHandle) - enc := codec.NewEncoderBytes(&out, h) - - for pb.Next() { - enc.ResetBytes(&out) - if err := enc.Encode(&smallStructData); err != nil { - b.Error(err) - } - l = int64(len(out)) - out = out[:0] - } - }) - - b.SetBytes(l) -} - -func BenchmarkCodec_Marshal_M_Parallel_Reuse(b *testing.B) { - var l int64 - - b.RunParallel(func(pb *testing.PB) { - var h codec.Handle = new(codec.JsonHandle) - - var out []byte - enc := codec.NewEncoderBytes(&out, h) - - for pb.Next() { - enc.ResetBytes(&out) - if err := enc.Encode(&largeStructData); err != nil { - b.Error(err) - } - l = int64(len(out)) - out = out[:0] - } - }) - b.SetBytes(l) -} - -func BenchmarkCodec_Marshal_L_Parallel_Reuse(b *testing.B) { - var l int64 - - b.RunParallel(func(pb *testing.PB) { - var h codec.Handle = new(codec.JsonHandle) - - var out []byte - enc := codec.NewEncoderBytes(&out, h) - - for pb.Next() { - enc.ResetBytes(&out) - if err := enc.Encode(&xlStructData); err != nil { - b.Error(err) - } - l = int64(len(out)) - out = out[:0] - } - }) - b.SetBytes(l) -} diff --git a/vendor/github.com/mailru/easyjson/benchmark/data.go b/vendor/github.com/mailru/easyjson/benchmark/data.go deleted file mode 100644 index d2c689cd6c..0000000000 --- a/vendor/github.com/mailru/easyjson/benchmark/data.go +++ /dev/null @@ -1,148 +0,0 @@ -// Package benchmark provides a simple benchmark for easyjson against default serialization and ffjson. -// The data example is taken from https://dev.twitter.com/rest/reference/get/search/tweets -package benchmark - -import ( - "io/ioutil" -) - -var largeStructText, _ = ioutil.ReadFile("example.json") -var xlStructData XLStruct - -func init() { - for i := 0; i < 50; i++ { - xlStructData.Data = append(xlStructData.Data, largeStructData) - } -} - -var smallStructText = []byte(`{"hashtags":[{"indices":[5, 10],"text":"some-text"}],"urls":[],"user_mentions":[]}`) -var smallStructData = Entities{ - Hashtags: []Hashtag{{Indices: []int{5, 10}, Text: "some-text"}}, - Urls: []*string{}, - UserMentions: []*string{}, -} - -type SearchMetadata struct { - CompletedIn float64 `json:"completed_in"` - Count int `json:"count"` - MaxID int `json:"max_id"` - MaxIDStr string `json:"max_id_str"` - NextResults string `json:"next_results"` - Query string `json:"query"` - RefreshURL string `json:"refresh_url"` - SinceID int `json:"since_id"` - SinceIDStr string `json:"since_id_str"` -} - -type Hashtag struct { - Indices []int `json:"indices"` - Text string `json:"text"` -} - -//easyjson:json -type Entities struct { - Hashtags []Hashtag `json:"hashtags"` - Urls []*string `json:"urls"` - UserMentions []*string `json:"user_mentions"` -} - -type UserEntityDescription struct { - Urls []*string `json:"urls"` -} - -type URL struct { - ExpandedURL *string `json:"expanded_url"` - Indices []int `json:"indices"` - URL string `json:"url"` -} - -type UserEntityURL struct { - Urls []URL `json:"urls"` -} - -type UserEntities struct { - Description UserEntityDescription `json:"description"` - URL UserEntityURL `json:"url"` -} - -type User struct { - ContributorsEnabled bool `json:"contributors_enabled"` - CreatedAt string `json:"created_at"` - DefaultProfile bool `json:"default_profile"` - DefaultProfileImage bool `json:"default_profile_image"` - Description string `json:"description"` - Entities UserEntities `json:"entities"` - FavouritesCount int `json:"favourites_count"` - FollowRequestSent *string `json:"follow_request_sent"` - FollowersCount int `json:"followers_count"` - Following *string `json:"following"` - FriendsCount int `json:"friends_count"` - GeoEnabled bool `json:"geo_enabled"` - ID int `json:"id"` - IDStr string `json:"id_str"` - IsTranslator bool `json:"is_translator"` - Lang string `json:"lang"` - ListedCount int `json:"listed_count"` - Location string `json:"location"` - Name string `json:"name"` - Notifications *string `json:"notifications"` - ProfileBackgroundColor string `json:"profile_background_color"` - ProfileBackgroundImageURL string `json:"profile_background_image_url"` - ProfileBackgroundImageURLHTTPS string `json:"profile_background_image_url_https"` - ProfileBackgroundTile bool `json:"profile_background_tile"` - ProfileImageURL string `json:"profile_image_url"` - ProfileImageURLHTTPS string `json:"profile_image_url_https"` - ProfileLinkColor string `json:"profile_link_color"` - ProfileSidebarBorderColor string `json:"profile_sidebar_border_color"` - ProfileSidebarFillColor string `json:"profile_sidebar_fill_color"` - ProfileTextColor string `json:"profile_text_color"` - ProfileUseBackgroundImage bool `json:"profile_use_background_image"` - Protected bool `json:"protected"` - ScreenName string `json:"screen_name"` - ShowAllInlineMedia bool `json:"show_all_inline_media"` - StatusesCount int `json:"statuses_count"` - TimeZone string `json:"time_zone"` - URL *string `json:"url"` - UtcOffset int `json:"utc_offset"` - Verified bool `json:"verified"` -} - -type StatusMetadata struct { - IsoLanguageCode string `json:"iso_language_code"` - ResultType string `json:"result_type"` -} - -type Status struct { - Contributors *string `json:"contributors"` - Coordinates *string `json:"coordinates"` - CreatedAt string `json:"created_at"` - Entities Entities `json:"entities"` - Favorited bool `json:"favorited"` - Geo *string `json:"geo"` - ID int64 `json:"id"` - IDStr string `json:"id_str"` - InReplyToScreenName *string `json:"in_reply_to_screen_name"` - InReplyToStatusID *string `json:"in_reply_to_status_id"` - InReplyToStatusIDStr *string `json:"in_reply_to_status_id_str"` - InReplyToUserID *string `json:"in_reply_to_user_id"` - InReplyToUserIDStr *string `json:"in_reply_to_user_id_str"` - Metadata StatusMetadata `json:"metadata"` - Place *string `json:"place"` - RetweetCount int `json:"retweet_count"` - Retweeted bool `json:"retweeted"` - Source string `json:"source"` - Text string `json:"text"` - Truncated bool `json:"truncated"` - User User `json:"user"` -} - -//easyjson:json -type LargeStruct struct { - SearchMetadata SearchMetadata `json:"search_metadata"` - Statuses []Status `json:"statuses"` -} - -//easyjson:json -type XLStruct struct { - Data []LargeStruct -} diff --git a/vendor/github.com/mailru/easyjson/benchmark/data_codec.go b/vendor/github.com/mailru/easyjson/benchmark/data_codec.go deleted file mode 100644 index d2d83fac63..0000000000 --- a/vendor/github.com/mailru/easyjson/benchmark/data_codec.go +++ /dev/null @@ -1,6914 +0,0 @@ -//+build use_codec -//+build !easyjson_nounsafe -//+build !appengine - -// ************************************************************ -// DO NOT EDIT. -// THIS FILE IS AUTO-GENERATED BY codecgen. -// ************************************************************ - -package benchmark - -import ( - "errors" - "fmt" - "reflect" - "runtime" - "unsafe" - - codec1978 "github.com/ugorji/go/codec" -) - -const ( - // ----- content types ---- - codecSelferC_UTF89225 = 1 - codecSelferC_RAW9225 = 0 - // ----- value types used ---- - codecSelferValueTypeArray9225 = 10 - codecSelferValueTypeMap9225 = 9 - // ----- containerStateValues ---- - codecSelfer_containerMapKey9225 = 2 - codecSelfer_containerMapValue9225 = 3 - codecSelfer_containerMapEnd9225 = 4 - codecSelfer_containerArrayElem9225 = 6 - codecSelfer_containerArrayEnd9225 = 7 -) - -var ( - codecSelferBitsize9225 = uint8(reflect.TypeOf(uint(0)).Bits()) - codecSelferOnlyMapOrArrayEncodeToStructErr9225 = errors.New(`only encoded map or array can be decoded into a struct`) -) - -type codecSelferUnsafeString9225 struct { - Data uintptr - Len int -} - -type codecSelfer9225 struct{} - -func init() { - if codec1978.GenVersion != 5 { - _, file, _, _ := runtime.Caller(0) - err := fmt.Errorf("codecgen version mismatch: current: %v, need %v. Re-generate file: %v", - 5, codec1978.GenVersion, file) - panic(err) - } - if false { // reference the types, but skip this branch at build/run time - var v0 unsafe.Pointer - _ = v0 - } -} - -func (x *SearchMetadata) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [9]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(9) - } else { - yynn2 = 9 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym4 := z.EncBinary() - _ = yym4 - if false { - } else { - r.EncodeFloat64(float64(x.CompletedIn)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("completed_in")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym5 := z.EncBinary() - _ = yym5 - if false { - } else { - r.EncodeFloat64(float64(x.CompletedIn)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym7 := z.EncBinary() - _ = yym7 - if false { - } else { - r.EncodeInt(int64(x.Count)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("count")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym8 := z.EncBinary() - _ = yym8 - if false { - } else { - r.EncodeInt(int64(x.Count)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym10 := z.EncBinary() - _ = yym10 - if false { - } else { - r.EncodeInt(int64(x.MaxID)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("max_id")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym11 := z.EncBinary() - _ = yym11 - if false { - } else { - r.EncodeInt(int64(x.MaxID)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym13 := z.EncBinary() - _ = yym13 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.MaxIDStr)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("max_id_str")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym14 := z.EncBinary() - _ = yym14 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.MaxIDStr)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym16 := z.EncBinary() - _ = yym16 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.NextResults)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("next_results")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym17 := z.EncBinary() - _ = yym17 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.NextResults)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym19 := z.EncBinary() - _ = yym19 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Query)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("query")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym20 := z.EncBinary() - _ = yym20 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Query)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym22 := z.EncBinary() - _ = yym22 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.RefreshURL)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("refresh_url")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym23 := z.EncBinary() - _ = yym23 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.RefreshURL)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym25 := z.EncBinary() - _ = yym25 - if false { - } else { - r.EncodeInt(int64(x.SinceID)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("since_id")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym26 := z.EncBinary() - _ = yym26 - if false { - } else { - r.EncodeInt(int64(x.SinceID)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym28 := z.EncBinary() - _ = yym28 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.SinceIDStr)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("since_id_str")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym29 := z.EncBinary() - _ = yym29 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.SinceIDStr)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd9225) - } - } - } -} - -func (x *SearchMetadata) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap9225 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd9225) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray9225 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) - } - } -} - -func (x *SearchMetadata) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey9225) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} - yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) - z.DecSendContainerState(codecSelfer_containerMapValue9225) - switch yys3 { - case "completed_in": - if r.TryDecodeAsNil() { - x.CompletedIn = 0 - } else { - yyv4 := &x.CompletedIn - yym5 := z.DecBinary() - _ = yym5 - if false { - } else { - *((*float64)(yyv4)) = float64(r.DecodeFloat(false)) - } - } - case "count": - if r.TryDecodeAsNil() { - x.Count = 0 - } else { - yyv6 := &x.Count - yym7 := z.DecBinary() - _ = yym7 - if false { - } else { - *((*int)(yyv6)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - case "max_id": - if r.TryDecodeAsNil() { - x.MaxID = 0 - } else { - yyv8 := &x.MaxID - yym9 := z.DecBinary() - _ = yym9 - if false { - } else { - *((*int)(yyv8)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - case "max_id_str": - if r.TryDecodeAsNil() { - x.MaxIDStr = "" - } else { - yyv10 := &x.MaxIDStr - yym11 := z.DecBinary() - _ = yym11 - if false { - } else { - *((*string)(yyv10)) = r.DecodeString() - } - } - case "next_results": - if r.TryDecodeAsNil() { - x.NextResults = "" - } else { - yyv12 := &x.NextResults - yym13 := z.DecBinary() - _ = yym13 - if false { - } else { - *((*string)(yyv12)) = r.DecodeString() - } - } - case "query": - if r.TryDecodeAsNil() { - x.Query = "" - } else { - yyv14 := &x.Query - yym15 := z.DecBinary() - _ = yym15 - if false { - } else { - *((*string)(yyv14)) = r.DecodeString() - } - } - case "refresh_url": - if r.TryDecodeAsNil() { - x.RefreshURL = "" - } else { - yyv16 := &x.RefreshURL - yym17 := z.DecBinary() - _ = yym17 - if false { - } else { - *((*string)(yyv16)) = r.DecodeString() - } - } - case "since_id": - if r.TryDecodeAsNil() { - x.SinceID = 0 - } else { - yyv18 := &x.SinceID - yym19 := z.DecBinary() - _ = yym19 - if false { - } else { - *((*int)(yyv18)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - case "since_id_str": - if r.TryDecodeAsNil() { - x.SinceIDStr = "" - } else { - yyv20 := &x.SinceIDStr - yym21 := z.DecBinary() - _ = yym21 - if false { - } else { - *((*string)(yyv20)) = r.DecodeString() - } - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd9225) -} - -func (x *SearchMetadata) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj22 int - var yyb22 bool - var yyhl22 bool = l >= 0 - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l - } else { - yyb22 = r.CheckBreak() - } - if yyb22 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.CompletedIn = 0 - } else { - yyv23 := &x.CompletedIn - yym24 := z.DecBinary() - _ = yym24 - if false { - } else { - *((*float64)(yyv23)) = float64(r.DecodeFloat(false)) - } - } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l - } else { - yyb22 = r.CheckBreak() - } - if yyb22 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Count = 0 - } else { - yyv25 := &x.Count - yym26 := z.DecBinary() - _ = yym26 - if false { - } else { - *((*int)(yyv25)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l - } else { - yyb22 = r.CheckBreak() - } - if yyb22 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.MaxID = 0 - } else { - yyv27 := &x.MaxID - yym28 := z.DecBinary() - _ = yym28 - if false { - } else { - *((*int)(yyv27)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l - } else { - yyb22 = r.CheckBreak() - } - if yyb22 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.MaxIDStr = "" - } else { - yyv29 := &x.MaxIDStr - yym30 := z.DecBinary() - _ = yym30 - if false { - } else { - *((*string)(yyv29)) = r.DecodeString() - } - } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l - } else { - yyb22 = r.CheckBreak() - } - if yyb22 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.NextResults = "" - } else { - yyv31 := &x.NextResults - yym32 := z.DecBinary() - _ = yym32 - if false { - } else { - *((*string)(yyv31)) = r.DecodeString() - } - } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l - } else { - yyb22 = r.CheckBreak() - } - if yyb22 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Query = "" - } else { - yyv33 := &x.Query - yym34 := z.DecBinary() - _ = yym34 - if false { - } else { - *((*string)(yyv33)) = r.DecodeString() - } - } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l - } else { - yyb22 = r.CheckBreak() - } - if yyb22 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.RefreshURL = "" - } else { - yyv35 := &x.RefreshURL - yym36 := z.DecBinary() - _ = yym36 - if false { - } else { - *((*string)(yyv35)) = r.DecodeString() - } - } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l - } else { - yyb22 = r.CheckBreak() - } - if yyb22 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.SinceID = 0 - } else { - yyv37 := &x.SinceID - yym38 := z.DecBinary() - _ = yym38 - if false { - } else { - *((*int)(yyv37)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l - } else { - yyb22 = r.CheckBreak() - } - if yyb22 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.SinceIDStr = "" - } else { - yyv39 := &x.SinceIDStr - yym40 := z.DecBinary() - _ = yym40 - if false { - } else { - *((*string)(yyv39)) = r.DecodeString() - } - } - for { - yyj22++ - if yyhl22 { - yyb22 = yyj22 > l - } else { - yyb22 = r.CheckBreak() - } - if yyb22 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - z.DecStructFieldNotFound(yyj22-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x *Hashtag) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [2]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(2) - } else { - yynn2 = 2 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Indices == nil { - r.EncodeNil() - } else { - yym4 := z.EncBinary() - _ = yym4 - if false { - } else { - z.F.EncSliceIntV(x.Indices, false, e) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("indices")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Indices == nil { - r.EncodeNil() - } else { - yym5 := z.EncBinary() - _ = yym5 - if false { - } else { - z.F.EncSliceIntV(x.Indices, false, e) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym7 := z.EncBinary() - _ = yym7 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Text)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("text")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym8 := z.EncBinary() - _ = yym8 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Text)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd9225) - } - } - } -} - -func (x *Hashtag) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap9225 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd9225) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray9225 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) - } - } -} - -func (x *Hashtag) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey9225) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} - yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) - z.DecSendContainerState(codecSelfer_containerMapValue9225) - switch yys3 { - case "indices": - if r.TryDecodeAsNil() { - x.Indices = nil - } else { - yyv4 := &x.Indices - yym5 := z.DecBinary() - _ = yym5 - if false { - } else { - z.F.DecSliceIntX(yyv4, false, d) - } - } - case "text": - if r.TryDecodeAsNil() { - x.Text = "" - } else { - yyv6 := &x.Text - yym7 := z.DecBinary() - _ = yym7 - if false { - } else { - *((*string)(yyv6)) = r.DecodeString() - } - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd9225) -} - -func (x *Hashtag) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj8 int - var yyb8 bool - var yyhl8 bool = l >= 0 - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = r.CheckBreak() - } - if yyb8 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Indices = nil - } else { - yyv9 := &x.Indices - yym10 := z.DecBinary() - _ = yym10 - if false { - } else { - z.F.DecSliceIntX(yyv9, false, d) - } - } - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = r.CheckBreak() - } - if yyb8 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Text = "" - } else { - yyv11 := &x.Text - yym12 := z.DecBinary() - _ = yym12 - if false { - } else { - *((*string)(yyv11)) = r.DecodeString() - } - } - for { - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = r.CheckBreak() - } - if yyb8 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - z.DecStructFieldNotFound(yyj8-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x *Entities) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [3]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(3) - } else { - yynn2 = 3 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Hashtags == nil { - r.EncodeNil() - } else { - yym4 := z.EncBinary() - _ = yym4 - if false { - } else { - h.encSliceHashtag(([]Hashtag)(x.Hashtags), e) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("hashtags")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Hashtags == nil { - r.EncodeNil() - } else { - yym5 := z.EncBinary() - _ = yym5 - if false { - } else { - h.encSliceHashtag(([]Hashtag)(x.Hashtags), e) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Urls == nil { - r.EncodeNil() - } else { - yym7 := z.EncBinary() - _ = yym7 - if false { - } else { - h.encSlicePtrtostring(([]*string)(x.Urls), e) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("urls")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Urls == nil { - r.EncodeNil() - } else { - yym8 := z.EncBinary() - _ = yym8 - if false { - } else { - h.encSlicePtrtostring(([]*string)(x.Urls), e) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.UserMentions == nil { - r.EncodeNil() - } else { - yym10 := z.EncBinary() - _ = yym10 - if false { - } else { - h.encSlicePtrtostring(([]*string)(x.UserMentions), e) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("user_mentions")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.UserMentions == nil { - r.EncodeNil() - } else { - yym11 := z.EncBinary() - _ = yym11 - if false { - } else { - h.encSlicePtrtostring(([]*string)(x.UserMentions), e) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd9225) - } - } - } -} - -func (x *Entities) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap9225 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd9225) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray9225 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) - } - } -} - -func (x *Entities) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey9225) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} - yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) - z.DecSendContainerState(codecSelfer_containerMapValue9225) - switch yys3 { - case "hashtags": - if r.TryDecodeAsNil() { - x.Hashtags = nil - } else { - yyv4 := &x.Hashtags - yym5 := z.DecBinary() - _ = yym5 - if false { - } else { - h.decSliceHashtag((*[]Hashtag)(yyv4), d) - } - } - case "urls": - if r.TryDecodeAsNil() { - x.Urls = nil - } else { - yyv6 := &x.Urls - yym7 := z.DecBinary() - _ = yym7 - if false { - } else { - h.decSlicePtrtostring((*[]*string)(yyv6), d) - } - } - case "user_mentions": - if r.TryDecodeAsNil() { - x.UserMentions = nil - } else { - yyv8 := &x.UserMentions - yym9 := z.DecBinary() - _ = yym9 - if false { - } else { - h.decSlicePtrtostring((*[]*string)(yyv8), d) - } - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd9225) -} - -func (x *Entities) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj10 int - var yyb10 bool - var yyhl10 bool = l >= 0 - yyj10++ - if yyhl10 { - yyb10 = yyj10 > l - } else { - yyb10 = r.CheckBreak() - } - if yyb10 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Hashtags = nil - } else { - yyv11 := &x.Hashtags - yym12 := z.DecBinary() - _ = yym12 - if false { - } else { - h.decSliceHashtag((*[]Hashtag)(yyv11), d) - } - } - yyj10++ - if yyhl10 { - yyb10 = yyj10 > l - } else { - yyb10 = r.CheckBreak() - } - if yyb10 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Urls = nil - } else { - yyv13 := &x.Urls - yym14 := z.DecBinary() - _ = yym14 - if false { - } else { - h.decSlicePtrtostring((*[]*string)(yyv13), d) - } - } - yyj10++ - if yyhl10 { - yyb10 = yyj10 > l - } else { - yyb10 = r.CheckBreak() - } - if yyb10 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.UserMentions = nil - } else { - yyv15 := &x.UserMentions - yym16 := z.DecBinary() - _ = yym16 - if false { - } else { - h.decSlicePtrtostring((*[]*string)(yyv15), d) - } - } - for { - yyj10++ - if yyhl10 { - yyb10 = yyj10 > l - } else { - yyb10 = r.CheckBreak() - } - if yyb10 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - z.DecStructFieldNotFound(yyj10-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x *UserEntityDescription) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [1]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(1) - } else { - yynn2 = 1 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Urls == nil { - r.EncodeNil() - } else { - yym4 := z.EncBinary() - _ = yym4 - if false { - } else { - h.encSlicePtrtostring(([]*string)(x.Urls), e) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("urls")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Urls == nil { - r.EncodeNil() - } else { - yym5 := z.EncBinary() - _ = yym5 - if false { - } else { - h.encSlicePtrtostring(([]*string)(x.Urls), e) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd9225) - } - } - } -} - -func (x *UserEntityDescription) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap9225 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd9225) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray9225 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) - } - } -} - -func (x *UserEntityDescription) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey9225) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} - yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) - z.DecSendContainerState(codecSelfer_containerMapValue9225) - switch yys3 { - case "urls": - if r.TryDecodeAsNil() { - x.Urls = nil - } else { - yyv4 := &x.Urls - yym5 := z.DecBinary() - _ = yym5 - if false { - } else { - h.decSlicePtrtostring((*[]*string)(yyv4), d) - } - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd9225) -} - -func (x *UserEntityDescription) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj6 int - var yyb6 bool - var yyhl6 bool = l >= 0 - yyj6++ - if yyhl6 { - yyb6 = yyj6 > l - } else { - yyb6 = r.CheckBreak() - } - if yyb6 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Urls = nil - } else { - yyv7 := &x.Urls - yym8 := z.DecBinary() - _ = yym8 - if false { - } else { - h.decSlicePtrtostring((*[]*string)(yyv7), d) - } - } - for { - yyj6++ - if yyhl6 { - yyb6 = yyj6 > l - } else { - yyb6 = r.CheckBreak() - } - if yyb6 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - z.DecStructFieldNotFound(yyj6-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x *URL) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [3]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(3) - } else { - yynn2 = 3 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.ExpandedURL == nil { - r.EncodeNil() - } else { - yy4 := *x.ExpandedURL - yym5 := z.EncBinary() - _ = yym5 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy4)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("expanded_url")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.ExpandedURL == nil { - r.EncodeNil() - } else { - yy6 := *x.ExpandedURL - yym7 := z.EncBinary() - _ = yym7 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy6)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Indices == nil { - r.EncodeNil() - } else { - yym9 := z.EncBinary() - _ = yym9 - if false { - } else { - z.F.EncSliceIntV(x.Indices, false, e) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("indices")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Indices == nil { - r.EncodeNil() - } else { - yym10 := z.EncBinary() - _ = yym10 - if false { - } else { - z.F.EncSliceIntV(x.Indices, false, e) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym12 := z.EncBinary() - _ = yym12 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.URL)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("url")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym13 := z.EncBinary() - _ = yym13 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.URL)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd9225) - } - } - } -} - -func (x *URL) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap9225 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd9225) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray9225 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) - } - } -} - -func (x *URL) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey9225) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} - yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) - z.DecSendContainerState(codecSelfer_containerMapValue9225) - switch yys3 { - case "expanded_url": - if r.TryDecodeAsNil() { - if x.ExpandedURL != nil { - x.ExpandedURL = nil - } - } else { - if x.ExpandedURL == nil { - x.ExpandedURL = new(string) - } - yym5 := z.DecBinary() - _ = yym5 - if false { - } else { - *((*string)(x.ExpandedURL)) = r.DecodeString() - } - } - case "indices": - if r.TryDecodeAsNil() { - x.Indices = nil - } else { - yyv6 := &x.Indices - yym7 := z.DecBinary() - _ = yym7 - if false { - } else { - z.F.DecSliceIntX(yyv6, false, d) - } - } - case "url": - if r.TryDecodeAsNil() { - x.URL = "" - } else { - yyv8 := &x.URL - yym9 := z.DecBinary() - _ = yym9 - if false { - } else { - *((*string)(yyv8)) = r.DecodeString() - } - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd9225) -} - -func (x *URL) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj10 int - var yyb10 bool - var yyhl10 bool = l >= 0 - yyj10++ - if yyhl10 { - yyb10 = yyj10 > l - } else { - yyb10 = r.CheckBreak() - } - if yyb10 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.ExpandedURL != nil { - x.ExpandedURL = nil - } - } else { - if x.ExpandedURL == nil { - x.ExpandedURL = new(string) - } - yym12 := z.DecBinary() - _ = yym12 - if false { - } else { - *((*string)(x.ExpandedURL)) = r.DecodeString() - } - } - yyj10++ - if yyhl10 { - yyb10 = yyj10 > l - } else { - yyb10 = r.CheckBreak() - } - if yyb10 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Indices = nil - } else { - yyv13 := &x.Indices - yym14 := z.DecBinary() - _ = yym14 - if false { - } else { - z.F.DecSliceIntX(yyv13, false, d) - } - } - yyj10++ - if yyhl10 { - yyb10 = yyj10 > l - } else { - yyb10 = r.CheckBreak() - } - if yyb10 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.URL = "" - } else { - yyv15 := &x.URL - yym16 := z.DecBinary() - _ = yym16 - if false { - } else { - *((*string)(yyv15)) = r.DecodeString() - } - } - for { - yyj10++ - if yyhl10 { - yyb10 = yyj10 > l - } else { - yyb10 = r.CheckBreak() - } - if yyb10 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - z.DecStructFieldNotFound(yyj10-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x *UserEntityURL) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [1]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(1) - } else { - yynn2 = 1 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Urls == nil { - r.EncodeNil() - } else { - yym4 := z.EncBinary() - _ = yym4 - if false { - } else { - h.encSliceURL(([]URL)(x.Urls), e) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("urls")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Urls == nil { - r.EncodeNil() - } else { - yym5 := z.EncBinary() - _ = yym5 - if false { - } else { - h.encSliceURL(([]URL)(x.Urls), e) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd9225) - } - } - } -} - -func (x *UserEntityURL) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap9225 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd9225) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray9225 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) - } - } -} - -func (x *UserEntityURL) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey9225) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} - yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) - z.DecSendContainerState(codecSelfer_containerMapValue9225) - switch yys3 { - case "urls": - if r.TryDecodeAsNil() { - x.Urls = nil - } else { - yyv4 := &x.Urls - yym5 := z.DecBinary() - _ = yym5 - if false { - } else { - h.decSliceURL((*[]URL)(yyv4), d) - } - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd9225) -} - -func (x *UserEntityURL) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj6 int - var yyb6 bool - var yyhl6 bool = l >= 0 - yyj6++ - if yyhl6 { - yyb6 = yyj6 > l - } else { - yyb6 = r.CheckBreak() - } - if yyb6 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Urls = nil - } else { - yyv7 := &x.Urls - yym8 := z.DecBinary() - _ = yym8 - if false { - } else { - h.decSliceURL((*[]URL)(yyv7), d) - } - } - for { - yyj6++ - if yyhl6 { - yyb6 = yyj6 > l - } else { - yyb6 = r.CheckBreak() - } - if yyb6 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - z.DecStructFieldNotFound(yyj6-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x *UserEntities) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [2]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(2) - } else { - yynn2 = 2 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yy4 := &x.Description - yy4.CodecEncodeSelf(e) - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("description")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yy6 := &x.Description - yy6.CodecEncodeSelf(e) - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yy9 := &x.URL - yy9.CodecEncodeSelf(e) - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("url")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yy11 := &x.URL - yy11.CodecEncodeSelf(e) - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd9225) - } - } - } -} - -func (x *UserEntities) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap9225 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd9225) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray9225 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) - } - } -} - -func (x *UserEntities) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey9225) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} - yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) - z.DecSendContainerState(codecSelfer_containerMapValue9225) - switch yys3 { - case "description": - if r.TryDecodeAsNil() { - x.Description = UserEntityDescription{} - } else { - yyv4 := &x.Description - yyv4.CodecDecodeSelf(d) - } - case "url": - if r.TryDecodeAsNil() { - x.URL = UserEntityURL{} - } else { - yyv5 := &x.URL - yyv5.CodecDecodeSelf(d) - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd9225) -} - -func (x *UserEntities) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj6 int - var yyb6 bool - var yyhl6 bool = l >= 0 - yyj6++ - if yyhl6 { - yyb6 = yyj6 > l - } else { - yyb6 = r.CheckBreak() - } - if yyb6 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Description = UserEntityDescription{} - } else { - yyv7 := &x.Description - yyv7.CodecDecodeSelf(d) - } - yyj6++ - if yyhl6 { - yyb6 = yyj6 > l - } else { - yyb6 = r.CheckBreak() - } - if yyb6 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.URL = UserEntityURL{} - } else { - yyv8 := &x.URL - yyv8.CodecDecodeSelf(d) - } - for { - yyj6++ - if yyhl6 { - yyb6 = yyj6 > l - } else { - yyb6 = r.CheckBreak() - } - if yyb6 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - z.DecStructFieldNotFound(yyj6-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x *User) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [39]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(39) - } else { - yynn2 = 39 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym4 := z.EncBinary() - _ = yym4 - if false { - } else { - r.EncodeBool(bool(x.ContributorsEnabled)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("contributors_enabled")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym5 := z.EncBinary() - _ = yym5 - if false { - } else { - r.EncodeBool(bool(x.ContributorsEnabled)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym7 := z.EncBinary() - _ = yym7 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.CreatedAt)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("created_at")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym8 := z.EncBinary() - _ = yym8 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.CreatedAt)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym10 := z.EncBinary() - _ = yym10 - if false { - } else { - r.EncodeBool(bool(x.DefaultProfile)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("default_profile")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym11 := z.EncBinary() - _ = yym11 - if false { - } else { - r.EncodeBool(bool(x.DefaultProfile)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym13 := z.EncBinary() - _ = yym13 - if false { - } else { - r.EncodeBool(bool(x.DefaultProfileImage)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("default_profile_image")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym14 := z.EncBinary() - _ = yym14 - if false { - } else { - r.EncodeBool(bool(x.DefaultProfileImage)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym16 := z.EncBinary() - _ = yym16 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Description)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("description")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym17 := z.EncBinary() - _ = yym17 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Description)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yy19 := &x.Entities - yy19.CodecEncodeSelf(e) - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("entities")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yy21 := &x.Entities - yy21.CodecEncodeSelf(e) - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym24 := z.EncBinary() - _ = yym24 - if false { - } else { - r.EncodeInt(int64(x.FavouritesCount)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("favourites_count")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym25 := z.EncBinary() - _ = yym25 - if false { - } else { - r.EncodeInt(int64(x.FavouritesCount)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.FollowRequestSent == nil { - r.EncodeNil() - } else { - yy27 := *x.FollowRequestSent - yym28 := z.EncBinary() - _ = yym28 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy27)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("follow_request_sent")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.FollowRequestSent == nil { - r.EncodeNil() - } else { - yy29 := *x.FollowRequestSent - yym30 := z.EncBinary() - _ = yym30 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy29)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym32 := z.EncBinary() - _ = yym32 - if false { - } else { - r.EncodeInt(int64(x.FollowersCount)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("followers_count")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym33 := z.EncBinary() - _ = yym33 - if false { - } else { - r.EncodeInt(int64(x.FollowersCount)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Following == nil { - r.EncodeNil() - } else { - yy35 := *x.Following - yym36 := z.EncBinary() - _ = yym36 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy35)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("following")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Following == nil { - r.EncodeNil() - } else { - yy37 := *x.Following - yym38 := z.EncBinary() - _ = yym38 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy37)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym40 := z.EncBinary() - _ = yym40 - if false { - } else { - r.EncodeInt(int64(x.FriendsCount)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("friends_count")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym41 := z.EncBinary() - _ = yym41 - if false { - } else { - r.EncodeInt(int64(x.FriendsCount)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym43 := z.EncBinary() - _ = yym43 - if false { - } else { - r.EncodeBool(bool(x.GeoEnabled)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("geo_enabled")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym44 := z.EncBinary() - _ = yym44 - if false { - } else { - r.EncodeBool(bool(x.GeoEnabled)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym46 := z.EncBinary() - _ = yym46 - if false { - } else { - r.EncodeInt(int64(x.ID)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("id")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym47 := z.EncBinary() - _ = yym47 - if false { - } else { - r.EncodeInt(int64(x.ID)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym49 := z.EncBinary() - _ = yym49 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.IDStr)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("id_str")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym50 := z.EncBinary() - _ = yym50 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.IDStr)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym52 := z.EncBinary() - _ = yym52 - if false { - } else { - r.EncodeBool(bool(x.IsTranslator)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("is_translator")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym53 := z.EncBinary() - _ = yym53 - if false { - } else { - r.EncodeBool(bool(x.IsTranslator)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym55 := z.EncBinary() - _ = yym55 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Lang)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("lang")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym56 := z.EncBinary() - _ = yym56 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Lang)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym58 := z.EncBinary() - _ = yym58 - if false { - } else { - r.EncodeInt(int64(x.ListedCount)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("listed_count")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym59 := z.EncBinary() - _ = yym59 - if false { - } else { - r.EncodeInt(int64(x.ListedCount)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym61 := z.EncBinary() - _ = yym61 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Location)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("location")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym62 := z.EncBinary() - _ = yym62 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Location)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym64 := z.EncBinary() - _ = yym64 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Name)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("name")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym65 := z.EncBinary() - _ = yym65 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Name)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Notifications == nil { - r.EncodeNil() - } else { - yy67 := *x.Notifications - yym68 := z.EncBinary() - _ = yym68 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy67)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("notifications")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Notifications == nil { - r.EncodeNil() - } else { - yy69 := *x.Notifications - yym70 := z.EncBinary() - _ = yym70 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy69)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym72 := z.EncBinary() - _ = yym72 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileBackgroundColor)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("profile_background_color")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym73 := z.EncBinary() - _ = yym73 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileBackgroundColor)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym75 := z.EncBinary() - _ = yym75 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileBackgroundImageURL)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("profile_background_image_url")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym76 := z.EncBinary() - _ = yym76 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileBackgroundImageURL)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym78 := z.EncBinary() - _ = yym78 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileBackgroundImageURLHTTPS)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("profile_background_image_url_https")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym79 := z.EncBinary() - _ = yym79 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileBackgroundImageURLHTTPS)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym81 := z.EncBinary() - _ = yym81 - if false { - } else { - r.EncodeBool(bool(x.ProfileBackgroundTile)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("profile_background_tile")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym82 := z.EncBinary() - _ = yym82 - if false { - } else { - r.EncodeBool(bool(x.ProfileBackgroundTile)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym84 := z.EncBinary() - _ = yym84 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileImageURL)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("profile_image_url")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym85 := z.EncBinary() - _ = yym85 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileImageURL)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym87 := z.EncBinary() - _ = yym87 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileImageURLHTTPS)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("profile_image_url_https")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym88 := z.EncBinary() - _ = yym88 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileImageURLHTTPS)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym90 := z.EncBinary() - _ = yym90 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileLinkColor)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("profile_link_color")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym91 := z.EncBinary() - _ = yym91 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileLinkColor)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym93 := z.EncBinary() - _ = yym93 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileSidebarBorderColor)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("profile_sidebar_border_color")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym94 := z.EncBinary() - _ = yym94 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileSidebarBorderColor)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym96 := z.EncBinary() - _ = yym96 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileSidebarFillColor)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("profile_sidebar_fill_color")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym97 := z.EncBinary() - _ = yym97 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileSidebarFillColor)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym99 := z.EncBinary() - _ = yym99 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileTextColor)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("profile_text_color")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym100 := z.EncBinary() - _ = yym100 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ProfileTextColor)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym102 := z.EncBinary() - _ = yym102 - if false { - } else { - r.EncodeBool(bool(x.ProfileUseBackgroundImage)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("profile_use_background_image")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym103 := z.EncBinary() - _ = yym103 - if false { - } else { - r.EncodeBool(bool(x.ProfileUseBackgroundImage)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym105 := z.EncBinary() - _ = yym105 - if false { - } else { - r.EncodeBool(bool(x.Protected)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("protected")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym106 := z.EncBinary() - _ = yym106 - if false { - } else { - r.EncodeBool(bool(x.Protected)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym108 := z.EncBinary() - _ = yym108 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ScreenName)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("screen_name")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym109 := z.EncBinary() - _ = yym109 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ScreenName)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym111 := z.EncBinary() - _ = yym111 - if false { - } else { - r.EncodeBool(bool(x.ShowAllInlineMedia)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("show_all_inline_media")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym112 := z.EncBinary() - _ = yym112 - if false { - } else { - r.EncodeBool(bool(x.ShowAllInlineMedia)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym114 := z.EncBinary() - _ = yym114 - if false { - } else { - r.EncodeInt(int64(x.StatusesCount)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("statuses_count")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym115 := z.EncBinary() - _ = yym115 - if false { - } else { - r.EncodeInt(int64(x.StatusesCount)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym117 := z.EncBinary() - _ = yym117 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.TimeZone)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("time_zone")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym118 := z.EncBinary() - _ = yym118 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.TimeZone)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.URL == nil { - r.EncodeNil() - } else { - yy120 := *x.URL - yym121 := z.EncBinary() - _ = yym121 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy120)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("url")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.URL == nil { - r.EncodeNil() - } else { - yy122 := *x.URL - yym123 := z.EncBinary() - _ = yym123 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy122)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym125 := z.EncBinary() - _ = yym125 - if false { - } else { - r.EncodeInt(int64(x.UtcOffset)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("utc_offset")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym126 := z.EncBinary() - _ = yym126 - if false { - } else { - r.EncodeInt(int64(x.UtcOffset)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym128 := z.EncBinary() - _ = yym128 - if false { - } else { - r.EncodeBool(bool(x.Verified)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("verified")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym129 := z.EncBinary() - _ = yym129 - if false { - } else { - r.EncodeBool(bool(x.Verified)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd9225) - } - } - } -} - -func (x *User) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap9225 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd9225) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray9225 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) - } - } -} - -func (x *User) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey9225) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} - yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) - z.DecSendContainerState(codecSelfer_containerMapValue9225) - switch yys3 { - case "contributors_enabled": - if r.TryDecodeAsNil() { - x.ContributorsEnabled = false - } else { - yyv4 := &x.ContributorsEnabled - yym5 := z.DecBinary() - _ = yym5 - if false { - } else { - *((*bool)(yyv4)) = r.DecodeBool() - } - } - case "created_at": - if r.TryDecodeAsNil() { - x.CreatedAt = "" - } else { - yyv6 := &x.CreatedAt - yym7 := z.DecBinary() - _ = yym7 - if false { - } else { - *((*string)(yyv6)) = r.DecodeString() - } - } - case "default_profile": - if r.TryDecodeAsNil() { - x.DefaultProfile = false - } else { - yyv8 := &x.DefaultProfile - yym9 := z.DecBinary() - _ = yym9 - if false { - } else { - *((*bool)(yyv8)) = r.DecodeBool() - } - } - case "default_profile_image": - if r.TryDecodeAsNil() { - x.DefaultProfileImage = false - } else { - yyv10 := &x.DefaultProfileImage - yym11 := z.DecBinary() - _ = yym11 - if false { - } else { - *((*bool)(yyv10)) = r.DecodeBool() - } - } - case "description": - if r.TryDecodeAsNil() { - x.Description = "" - } else { - yyv12 := &x.Description - yym13 := z.DecBinary() - _ = yym13 - if false { - } else { - *((*string)(yyv12)) = r.DecodeString() - } - } - case "entities": - if r.TryDecodeAsNil() { - x.Entities = UserEntities{} - } else { - yyv14 := &x.Entities - yyv14.CodecDecodeSelf(d) - } - case "favourites_count": - if r.TryDecodeAsNil() { - x.FavouritesCount = 0 - } else { - yyv15 := &x.FavouritesCount - yym16 := z.DecBinary() - _ = yym16 - if false { - } else { - *((*int)(yyv15)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - case "follow_request_sent": - if r.TryDecodeAsNil() { - if x.FollowRequestSent != nil { - x.FollowRequestSent = nil - } - } else { - if x.FollowRequestSent == nil { - x.FollowRequestSent = new(string) - } - yym18 := z.DecBinary() - _ = yym18 - if false { - } else { - *((*string)(x.FollowRequestSent)) = r.DecodeString() - } - } - case "followers_count": - if r.TryDecodeAsNil() { - x.FollowersCount = 0 - } else { - yyv19 := &x.FollowersCount - yym20 := z.DecBinary() - _ = yym20 - if false { - } else { - *((*int)(yyv19)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - case "following": - if r.TryDecodeAsNil() { - if x.Following != nil { - x.Following = nil - } - } else { - if x.Following == nil { - x.Following = new(string) - } - yym22 := z.DecBinary() - _ = yym22 - if false { - } else { - *((*string)(x.Following)) = r.DecodeString() - } - } - case "friends_count": - if r.TryDecodeAsNil() { - x.FriendsCount = 0 - } else { - yyv23 := &x.FriendsCount - yym24 := z.DecBinary() - _ = yym24 - if false { - } else { - *((*int)(yyv23)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - case "geo_enabled": - if r.TryDecodeAsNil() { - x.GeoEnabled = false - } else { - yyv25 := &x.GeoEnabled - yym26 := z.DecBinary() - _ = yym26 - if false { - } else { - *((*bool)(yyv25)) = r.DecodeBool() - } - } - case "id": - if r.TryDecodeAsNil() { - x.ID = 0 - } else { - yyv27 := &x.ID - yym28 := z.DecBinary() - _ = yym28 - if false { - } else { - *((*int)(yyv27)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - case "id_str": - if r.TryDecodeAsNil() { - x.IDStr = "" - } else { - yyv29 := &x.IDStr - yym30 := z.DecBinary() - _ = yym30 - if false { - } else { - *((*string)(yyv29)) = r.DecodeString() - } - } - case "is_translator": - if r.TryDecodeAsNil() { - x.IsTranslator = false - } else { - yyv31 := &x.IsTranslator - yym32 := z.DecBinary() - _ = yym32 - if false { - } else { - *((*bool)(yyv31)) = r.DecodeBool() - } - } - case "lang": - if r.TryDecodeAsNil() { - x.Lang = "" - } else { - yyv33 := &x.Lang - yym34 := z.DecBinary() - _ = yym34 - if false { - } else { - *((*string)(yyv33)) = r.DecodeString() - } - } - case "listed_count": - if r.TryDecodeAsNil() { - x.ListedCount = 0 - } else { - yyv35 := &x.ListedCount - yym36 := z.DecBinary() - _ = yym36 - if false { - } else { - *((*int)(yyv35)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - case "location": - if r.TryDecodeAsNil() { - x.Location = "" - } else { - yyv37 := &x.Location - yym38 := z.DecBinary() - _ = yym38 - if false { - } else { - *((*string)(yyv37)) = r.DecodeString() - } - } - case "name": - if r.TryDecodeAsNil() { - x.Name = "" - } else { - yyv39 := &x.Name - yym40 := z.DecBinary() - _ = yym40 - if false { - } else { - *((*string)(yyv39)) = r.DecodeString() - } - } - case "notifications": - if r.TryDecodeAsNil() { - if x.Notifications != nil { - x.Notifications = nil - } - } else { - if x.Notifications == nil { - x.Notifications = new(string) - } - yym42 := z.DecBinary() - _ = yym42 - if false { - } else { - *((*string)(x.Notifications)) = r.DecodeString() - } - } - case "profile_background_color": - if r.TryDecodeAsNil() { - x.ProfileBackgroundColor = "" - } else { - yyv43 := &x.ProfileBackgroundColor - yym44 := z.DecBinary() - _ = yym44 - if false { - } else { - *((*string)(yyv43)) = r.DecodeString() - } - } - case "profile_background_image_url": - if r.TryDecodeAsNil() { - x.ProfileBackgroundImageURL = "" - } else { - yyv45 := &x.ProfileBackgroundImageURL - yym46 := z.DecBinary() - _ = yym46 - if false { - } else { - *((*string)(yyv45)) = r.DecodeString() - } - } - case "profile_background_image_url_https": - if r.TryDecodeAsNil() { - x.ProfileBackgroundImageURLHTTPS = "" - } else { - yyv47 := &x.ProfileBackgroundImageURLHTTPS - yym48 := z.DecBinary() - _ = yym48 - if false { - } else { - *((*string)(yyv47)) = r.DecodeString() - } - } - case "profile_background_tile": - if r.TryDecodeAsNil() { - x.ProfileBackgroundTile = false - } else { - yyv49 := &x.ProfileBackgroundTile - yym50 := z.DecBinary() - _ = yym50 - if false { - } else { - *((*bool)(yyv49)) = r.DecodeBool() - } - } - case "profile_image_url": - if r.TryDecodeAsNil() { - x.ProfileImageURL = "" - } else { - yyv51 := &x.ProfileImageURL - yym52 := z.DecBinary() - _ = yym52 - if false { - } else { - *((*string)(yyv51)) = r.DecodeString() - } - } - case "profile_image_url_https": - if r.TryDecodeAsNil() { - x.ProfileImageURLHTTPS = "" - } else { - yyv53 := &x.ProfileImageURLHTTPS - yym54 := z.DecBinary() - _ = yym54 - if false { - } else { - *((*string)(yyv53)) = r.DecodeString() - } - } - case "profile_link_color": - if r.TryDecodeAsNil() { - x.ProfileLinkColor = "" - } else { - yyv55 := &x.ProfileLinkColor - yym56 := z.DecBinary() - _ = yym56 - if false { - } else { - *((*string)(yyv55)) = r.DecodeString() - } - } - case "profile_sidebar_border_color": - if r.TryDecodeAsNil() { - x.ProfileSidebarBorderColor = "" - } else { - yyv57 := &x.ProfileSidebarBorderColor - yym58 := z.DecBinary() - _ = yym58 - if false { - } else { - *((*string)(yyv57)) = r.DecodeString() - } - } - case "profile_sidebar_fill_color": - if r.TryDecodeAsNil() { - x.ProfileSidebarFillColor = "" - } else { - yyv59 := &x.ProfileSidebarFillColor - yym60 := z.DecBinary() - _ = yym60 - if false { - } else { - *((*string)(yyv59)) = r.DecodeString() - } - } - case "profile_text_color": - if r.TryDecodeAsNil() { - x.ProfileTextColor = "" - } else { - yyv61 := &x.ProfileTextColor - yym62 := z.DecBinary() - _ = yym62 - if false { - } else { - *((*string)(yyv61)) = r.DecodeString() - } - } - case "profile_use_background_image": - if r.TryDecodeAsNil() { - x.ProfileUseBackgroundImage = false - } else { - yyv63 := &x.ProfileUseBackgroundImage - yym64 := z.DecBinary() - _ = yym64 - if false { - } else { - *((*bool)(yyv63)) = r.DecodeBool() - } - } - case "protected": - if r.TryDecodeAsNil() { - x.Protected = false - } else { - yyv65 := &x.Protected - yym66 := z.DecBinary() - _ = yym66 - if false { - } else { - *((*bool)(yyv65)) = r.DecodeBool() - } - } - case "screen_name": - if r.TryDecodeAsNil() { - x.ScreenName = "" - } else { - yyv67 := &x.ScreenName - yym68 := z.DecBinary() - _ = yym68 - if false { - } else { - *((*string)(yyv67)) = r.DecodeString() - } - } - case "show_all_inline_media": - if r.TryDecodeAsNil() { - x.ShowAllInlineMedia = false - } else { - yyv69 := &x.ShowAllInlineMedia - yym70 := z.DecBinary() - _ = yym70 - if false { - } else { - *((*bool)(yyv69)) = r.DecodeBool() - } - } - case "statuses_count": - if r.TryDecodeAsNil() { - x.StatusesCount = 0 - } else { - yyv71 := &x.StatusesCount - yym72 := z.DecBinary() - _ = yym72 - if false { - } else { - *((*int)(yyv71)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - case "time_zone": - if r.TryDecodeAsNil() { - x.TimeZone = "" - } else { - yyv73 := &x.TimeZone - yym74 := z.DecBinary() - _ = yym74 - if false { - } else { - *((*string)(yyv73)) = r.DecodeString() - } - } - case "url": - if r.TryDecodeAsNil() { - if x.URL != nil { - x.URL = nil - } - } else { - if x.URL == nil { - x.URL = new(string) - } - yym76 := z.DecBinary() - _ = yym76 - if false { - } else { - *((*string)(x.URL)) = r.DecodeString() - } - } - case "utc_offset": - if r.TryDecodeAsNil() { - x.UtcOffset = 0 - } else { - yyv77 := &x.UtcOffset - yym78 := z.DecBinary() - _ = yym78 - if false { - } else { - *((*int)(yyv77)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - case "verified": - if r.TryDecodeAsNil() { - x.Verified = false - } else { - yyv79 := &x.Verified - yym80 := z.DecBinary() - _ = yym80 - if false { - } else { - *((*bool)(yyv79)) = r.DecodeBool() - } - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd9225) -} - -func (x *User) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj81 int - var yyb81 bool - var yyhl81 bool = l >= 0 - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ContributorsEnabled = false - } else { - yyv82 := &x.ContributorsEnabled - yym83 := z.DecBinary() - _ = yym83 - if false { - } else { - *((*bool)(yyv82)) = r.DecodeBool() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.CreatedAt = "" - } else { - yyv84 := &x.CreatedAt - yym85 := z.DecBinary() - _ = yym85 - if false { - } else { - *((*string)(yyv84)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.DefaultProfile = false - } else { - yyv86 := &x.DefaultProfile - yym87 := z.DecBinary() - _ = yym87 - if false { - } else { - *((*bool)(yyv86)) = r.DecodeBool() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.DefaultProfileImage = false - } else { - yyv88 := &x.DefaultProfileImage - yym89 := z.DecBinary() - _ = yym89 - if false { - } else { - *((*bool)(yyv88)) = r.DecodeBool() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Description = "" - } else { - yyv90 := &x.Description - yym91 := z.DecBinary() - _ = yym91 - if false { - } else { - *((*string)(yyv90)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Entities = UserEntities{} - } else { - yyv92 := &x.Entities - yyv92.CodecDecodeSelf(d) - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.FavouritesCount = 0 - } else { - yyv93 := &x.FavouritesCount - yym94 := z.DecBinary() - _ = yym94 - if false { - } else { - *((*int)(yyv93)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.FollowRequestSent != nil { - x.FollowRequestSent = nil - } - } else { - if x.FollowRequestSent == nil { - x.FollowRequestSent = new(string) - } - yym96 := z.DecBinary() - _ = yym96 - if false { - } else { - *((*string)(x.FollowRequestSent)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.FollowersCount = 0 - } else { - yyv97 := &x.FollowersCount - yym98 := z.DecBinary() - _ = yym98 - if false { - } else { - *((*int)(yyv97)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.Following != nil { - x.Following = nil - } - } else { - if x.Following == nil { - x.Following = new(string) - } - yym100 := z.DecBinary() - _ = yym100 - if false { - } else { - *((*string)(x.Following)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.FriendsCount = 0 - } else { - yyv101 := &x.FriendsCount - yym102 := z.DecBinary() - _ = yym102 - if false { - } else { - *((*int)(yyv101)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.GeoEnabled = false - } else { - yyv103 := &x.GeoEnabled - yym104 := z.DecBinary() - _ = yym104 - if false { - } else { - *((*bool)(yyv103)) = r.DecodeBool() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ID = 0 - } else { - yyv105 := &x.ID - yym106 := z.DecBinary() - _ = yym106 - if false { - } else { - *((*int)(yyv105)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.IDStr = "" - } else { - yyv107 := &x.IDStr - yym108 := z.DecBinary() - _ = yym108 - if false { - } else { - *((*string)(yyv107)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.IsTranslator = false - } else { - yyv109 := &x.IsTranslator - yym110 := z.DecBinary() - _ = yym110 - if false { - } else { - *((*bool)(yyv109)) = r.DecodeBool() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Lang = "" - } else { - yyv111 := &x.Lang - yym112 := z.DecBinary() - _ = yym112 - if false { - } else { - *((*string)(yyv111)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ListedCount = 0 - } else { - yyv113 := &x.ListedCount - yym114 := z.DecBinary() - _ = yym114 - if false { - } else { - *((*int)(yyv113)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Location = "" - } else { - yyv115 := &x.Location - yym116 := z.DecBinary() - _ = yym116 - if false { - } else { - *((*string)(yyv115)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Name = "" - } else { - yyv117 := &x.Name - yym118 := z.DecBinary() - _ = yym118 - if false { - } else { - *((*string)(yyv117)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.Notifications != nil { - x.Notifications = nil - } - } else { - if x.Notifications == nil { - x.Notifications = new(string) - } - yym120 := z.DecBinary() - _ = yym120 - if false { - } else { - *((*string)(x.Notifications)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ProfileBackgroundColor = "" - } else { - yyv121 := &x.ProfileBackgroundColor - yym122 := z.DecBinary() - _ = yym122 - if false { - } else { - *((*string)(yyv121)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ProfileBackgroundImageURL = "" - } else { - yyv123 := &x.ProfileBackgroundImageURL - yym124 := z.DecBinary() - _ = yym124 - if false { - } else { - *((*string)(yyv123)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ProfileBackgroundImageURLHTTPS = "" - } else { - yyv125 := &x.ProfileBackgroundImageURLHTTPS - yym126 := z.DecBinary() - _ = yym126 - if false { - } else { - *((*string)(yyv125)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ProfileBackgroundTile = false - } else { - yyv127 := &x.ProfileBackgroundTile - yym128 := z.DecBinary() - _ = yym128 - if false { - } else { - *((*bool)(yyv127)) = r.DecodeBool() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ProfileImageURL = "" - } else { - yyv129 := &x.ProfileImageURL - yym130 := z.DecBinary() - _ = yym130 - if false { - } else { - *((*string)(yyv129)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ProfileImageURLHTTPS = "" - } else { - yyv131 := &x.ProfileImageURLHTTPS - yym132 := z.DecBinary() - _ = yym132 - if false { - } else { - *((*string)(yyv131)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ProfileLinkColor = "" - } else { - yyv133 := &x.ProfileLinkColor - yym134 := z.DecBinary() - _ = yym134 - if false { - } else { - *((*string)(yyv133)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ProfileSidebarBorderColor = "" - } else { - yyv135 := &x.ProfileSidebarBorderColor - yym136 := z.DecBinary() - _ = yym136 - if false { - } else { - *((*string)(yyv135)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ProfileSidebarFillColor = "" - } else { - yyv137 := &x.ProfileSidebarFillColor - yym138 := z.DecBinary() - _ = yym138 - if false { - } else { - *((*string)(yyv137)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ProfileTextColor = "" - } else { - yyv139 := &x.ProfileTextColor - yym140 := z.DecBinary() - _ = yym140 - if false { - } else { - *((*string)(yyv139)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ProfileUseBackgroundImage = false - } else { - yyv141 := &x.ProfileUseBackgroundImage - yym142 := z.DecBinary() - _ = yym142 - if false { - } else { - *((*bool)(yyv141)) = r.DecodeBool() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Protected = false - } else { - yyv143 := &x.Protected - yym144 := z.DecBinary() - _ = yym144 - if false { - } else { - *((*bool)(yyv143)) = r.DecodeBool() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ScreenName = "" - } else { - yyv145 := &x.ScreenName - yym146 := z.DecBinary() - _ = yym146 - if false { - } else { - *((*string)(yyv145)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ShowAllInlineMedia = false - } else { - yyv147 := &x.ShowAllInlineMedia - yym148 := z.DecBinary() - _ = yym148 - if false { - } else { - *((*bool)(yyv147)) = r.DecodeBool() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.StatusesCount = 0 - } else { - yyv149 := &x.StatusesCount - yym150 := z.DecBinary() - _ = yym150 - if false { - } else { - *((*int)(yyv149)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.TimeZone = "" - } else { - yyv151 := &x.TimeZone - yym152 := z.DecBinary() - _ = yym152 - if false { - } else { - *((*string)(yyv151)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.URL != nil { - x.URL = nil - } - } else { - if x.URL == nil { - x.URL = new(string) - } - yym154 := z.DecBinary() - _ = yym154 - if false { - } else { - *((*string)(x.URL)) = r.DecodeString() - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.UtcOffset = 0 - } else { - yyv155 := &x.UtcOffset - yym156 := z.DecBinary() - _ = yym156 - if false { - } else { - *((*int)(yyv155)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Verified = false - } else { - yyv157 := &x.Verified - yym158 := z.DecBinary() - _ = yym158 - if false { - } else { - *((*bool)(yyv157)) = r.DecodeBool() - } - } - for { - yyj81++ - if yyhl81 { - yyb81 = yyj81 > l - } else { - yyb81 = r.CheckBreak() - } - if yyb81 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - z.DecStructFieldNotFound(yyj81-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x *StatusMetadata) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [2]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(2) - } else { - yynn2 = 2 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym4 := z.EncBinary() - _ = yym4 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.IsoLanguageCode)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("iso_language_code")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym5 := z.EncBinary() - _ = yym5 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.IsoLanguageCode)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym7 := z.EncBinary() - _ = yym7 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ResultType)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("result_type")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym8 := z.EncBinary() - _ = yym8 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.ResultType)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd9225) - } - } - } -} - -func (x *StatusMetadata) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap9225 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd9225) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray9225 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) - } - } -} - -func (x *StatusMetadata) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey9225) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} - yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) - z.DecSendContainerState(codecSelfer_containerMapValue9225) - switch yys3 { - case "iso_language_code": - if r.TryDecodeAsNil() { - x.IsoLanguageCode = "" - } else { - yyv4 := &x.IsoLanguageCode - yym5 := z.DecBinary() - _ = yym5 - if false { - } else { - *((*string)(yyv4)) = r.DecodeString() - } - } - case "result_type": - if r.TryDecodeAsNil() { - x.ResultType = "" - } else { - yyv6 := &x.ResultType - yym7 := z.DecBinary() - _ = yym7 - if false { - } else { - *((*string)(yyv6)) = r.DecodeString() - } - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd9225) -} - -func (x *StatusMetadata) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj8 int - var yyb8 bool - var yyhl8 bool = l >= 0 - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = r.CheckBreak() - } - if yyb8 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.IsoLanguageCode = "" - } else { - yyv9 := &x.IsoLanguageCode - yym10 := z.DecBinary() - _ = yym10 - if false { - } else { - *((*string)(yyv9)) = r.DecodeString() - } - } - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = r.CheckBreak() - } - if yyb8 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ResultType = "" - } else { - yyv11 := &x.ResultType - yym12 := z.DecBinary() - _ = yym12 - if false { - } else { - *((*string)(yyv11)) = r.DecodeString() - } - } - for { - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = r.CheckBreak() - } - if yyb8 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - z.DecStructFieldNotFound(yyj8-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x *Status) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [21]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(21) - } else { - yynn2 = 21 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Contributors == nil { - r.EncodeNil() - } else { - yy4 := *x.Contributors - yym5 := z.EncBinary() - _ = yym5 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy4)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("contributors")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Contributors == nil { - r.EncodeNil() - } else { - yy6 := *x.Contributors - yym7 := z.EncBinary() - _ = yym7 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy6)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Coordinates == nil { - r.EncodeNil() - } else { - yy9 := *x.Coordinates - yym10 := z.EncBinary() - _ = yym10 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy9)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("coordinates")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Coordinates == nil { - r.EncodeNil() - } else { - yy11 := *x.Coordinates - yym12 := z.EncBinary() - _ = yym12 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy11)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym14 := z.EncBinary() - _ = yym14 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.CreatedAt)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("created_at")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym15 := z.EncBinary() - _ = yym15 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.CreatedAt)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yy17 := &x.Entities - yy17.CodecEncodeSelf(e) - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("entities")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yy19 := &x.Entities - yy19.CodecEncodeSelf(e) - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym22 := z.EncBinary() - _ = yym22 - if false { - } else { - r.EncodeBool(bool(x.Favorited)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("favorited")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym23 := z.EncBinary() - _ = yym23 - if false { - } else { - r.EncodeBool(bool(x.Favorited)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Geo == nil { - r.EncodeNil() - } else { - yy25 := *x.Geo - yym26 := z.EncBinary() - _ = yym26 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy25)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("geo")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Geo == nil { - r.EncodeNil() - } else { - yy27 := *x.Geo - yym28 := z.EncBinary() - _ = yym28 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy27)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym30 := z.EncBinary() - _ = yym30 - if false { - } else { - r.EncodeInt(int64(x.ID)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("id")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym31 := z.EncBinary() - _ = yym31 - if false { - } else { - r.EncodeInt(int64(x.ID)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym33 := z.EncBinary() - _ = yym33 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.IDStr)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("id_str")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym34 := z.EncBinary() - _ = yym34 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.IDStr)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.InReplyToScreenName == nil { - r.EncodeNil() - } else { - yy36 := *x.InReplyToScreenName - yym37 := z.EncBinary() - _ = yym37 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy36)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("in_reply_to_screen_name")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.InReplyToScreenName == nil { - r.EncodeNil() - } else { - yy38 := *x.InReplyToScreenName - yym39 := z.EncBinary() - _ = yym39 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy38)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.InReplyToStatusID == nil { - r.EncodeNil() - } else { - yy41 := *x.InReplyToStatusID - yym42 := z.EncBinary() - _ = yym42 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy41)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("in_reply_to_status_id")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.InReplyToStatusID == nil { - r.EncodeNil() - } else { - yy43 := *x.InReplyToStatusID - yym44 := z.EncBinary() - _ = yym44 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy43)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.InReplyToStatusIDStr == nil { - r.EncodeNil() - } else { - yy46 := *x.InReplyToStatusIDStr - yym47 := z.EncBinary() - _ = yym47 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy46)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("in_reply_to_status_id_str")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.InReplyToStatusIDStr == nil { - r.EncodeNil() - } else { - yy48 := *x.InReplyToStatusIDStr - yym49 := z.EncBinary() - _ = yym49 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy48)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.InReplyToUserID == nil { - r.EncodeNil() - } else { - yy51 := *x.InReplyToUserID - yym52 := z.EncBinary() - _ = yym52 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy51)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("in_reply_to_user_id")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.InReplyToUserID == nil { - r.EncodeNil() - } else { - yy53 := *x.InReplyToUserID - yym54 := z.EncBinary() - _ = yym54 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy53)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.InReplyToUserIDStr == nil { - r.EncodeNil() - } else { - yy56 := *x.InReplyToUserIDStr - yym57 := z.EncBinary() - _ = yym57 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy56)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("in_reply_to_user_id_str")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.InReplyToUserIDStr == nil { - r.EncodeNil() - } else { - yy58 := *x.InReplyToUserIDStr - yym59 := z.EncBinary() - _ = yym59 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy58)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yy61 := &x.Metadata - yy61.CodecEncodeSelf(e) - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("metadata")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yy63 := &x.Metadata - yy63.CodecEncodeSelf(e) - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Place == nil { - r.EncodeNil() - } else { - yy66 := *x.Place - yym67 := z.EncBinary() - _ = yym67 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy66)) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("place")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Place == nil { - r.EncodeNil() - } else { - yy68 := *x.Place - yym69 := z.EncBinary() - _ = yym69 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy68)) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym71 := z.EncBinary() - _ = yym71 - if false { - } else { - r.EncodeInt(int64(x.RetweetCount)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("retweet_count")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym72 := z.EncBinary() - _ = yym72 - if false { - } else { - r.EncodeInt(int64(x.RetweetCount)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym74 := z.EncBinary() - _ = yym74 - if false { - } else { - r.EncodeBool(bool(x.Retweeted)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("retweeted")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym75 := z.EncBinary() - _ = yym75 - if false { - } else { - r.EncodeBool(bool(x.Retweeted)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym77 := z.EncBinary() - _ = yym77 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Source)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("source")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym78 := z.EncBinary() - _ = yym78 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Source)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym80 := z.EncBinary() - _ = yym80 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Text)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("text")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym81 := z.EncBinary() - _ = yym81 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(x.Text)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yym83 := z.EncBinary() - _ = yym83 - if false { - } else { - r.EncodeBool(bool(x.Truncated)) - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("truncated")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yym84 := z.EncBinary() - _ = yym84 - if false { - } else { - r.EncodeBool(bool(x.Truncated)) - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yy86 := &x.User - yy86.CodecEncodeSelf(e) - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("user")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yy88 := &x.User - yy88.CodecEncodeSelf(e) - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd9225) - } - } - } -} - -func (x *Status) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap9225 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd9225) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray9225 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) - } - } -} - -func (x *Status) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey9225) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} - yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) - z.DecSendContainerState(codecSelfer_containerMapValue9225) - switch yys3 { - case "contributors": - if r.TryDecodeAsNil() { - if x.Contributors != nil { - x.Contributors = nil - } - } else { - if x.Contributors == nil { - x.Contributors = new(string) - } - yym5 := z.DecBinary() - _ = yym5 - if false { - } else { - *((*string)(x.Contributors)) = r.DecodeString() - } - } - case "coordinates": - if r.TryDecodeAsNil() { - if x.Coordinates != nil { - x.Coordinates = nil - } - } else { - if x.Coordinates == nil { - x.Coordinates = new(string) - } - yym7 := z.DecBinary() - _ = yym7 - if false { - } else { - *((*string)(x.Coordinates)) = r.DecodeString() - } - } - case "created_at": - if r.TryDecodeAsNil() { - x.CreatedAt = "" - } else { - yyv8 := &x.CreatedAt - yym9 := z.DecBinary() - _ = yym9 - if false { - } else { - *((*string)(yyv8)) = r.DecodeString() - } - } - case "entities": - if r.TryDecodeAsNil() { - x.Entities = Entities{} - } else { - yyv10 := &x.Entities - yyv10.CodecDecodeSelf(d) - } - case "favorited": - if r.TryDecodeAsNil() { - x.Favorited = false - } else { - yyv11 := &x.Favorited - yym12 := z.DecBinary() - _ = yym12 - if false { - } else { - *((*bool)(yyv11)) = r.DecodeBool() - } - } - case "geo": - if r.TryDecodeAsNil() { - if x.Geo != nil { - x.Geo = nil - } - } else { - if x.Geo == nil { - x.Geo = new(string) - } - yym14 := z.DecBinary() - _ = yym14 - if false { - } else { - *((*string)(x.Geo)) = r.DecodeString() - } - } - case "id": - if r.TryDecodeAsNil() { - x.ID = 0 - } else { - yyv15 := &x.ID - yym16 := z.DecBinary() - _ = yym16 - if false { - } else { - *((*int64)(yyv15)) = int64(r.DecodeInt(64)) - } - } - case "id_str": - if r.TryDecodeAsNil() { - x.IDStr = "" - } else { - yyv17 := &x.IDStr - yym18 := z.DecBinary() - _ = yym18 - if false { - } else { - *((*string)(yyv17)) = r.DecodeString() - } - } - case "in_reply_to_screen_name": - if r.TryDecodeAsNil() { - if x.InReplyToScreenName != nil { - x.InReplyToScreenName = nil - } - } else { - if x.InReplyToScreenName == nil { - x.InReplyToScreenName = new(string) - } - yym20 := z.DecBinary() - _ = yym20 - if false { - } else { - *((*string)(x.InReplyToScreenName)) = r.DecodeString() - } - } - case "in_reply_to_status_id": - if r.TryDecodeAsNil() { - if x.InReplyToStatusID != nil { - x.InReplyToStatusID = nil - } - } else { - if x.InReplyToStatusID == nil { - x.InReplyToStatusID = new(string) - } - yym22 := z.DecBinary() - _ = yym22 - if false { - } else { - *((*string)(x.InReplyToStatusID)) = r.DecodeString() - } - } - case "in_reply_to_status_id_str": - if r.TryDecodeAsNil() { - if x.InReplyToStatusIDStr != nil { - x.InReplyToStatusIDStr = nil - } - } else { - if x.InReplyToStatusIDStr == nil { - x.InReplyToStatusIDStr = new(string) - } - yym24 := z.DecBinary() - _ = yym24 - if false { - } else { - *((*string)(x.InReplyToStatusIDStr)) = r.DecodeString() - } - } - case "in_reply_to_user_id": - if r.TryDecodeAsNil() { - if x.InReplyToUserID != nil { - x.InReplyToUserID = nil - } - } else { - if x.InReplyToUserID == nil { - x.InReplyToUserID = new(string) - } - yym26 := z.DecBinary() - _ = yym26 - if false { - } else { - *((*string)(x.InReplyToUserID)) = r.DecodeString() - } - } - case "in_reply_to_user_id_str": - if r.TryDecodeAsNil() { - if x.InReplyToUserIDStr != nil { - x.InReplyToUserIDStr = nil - } - } else { - if x.InReplyToUserIDStr == nil { - x.InReplyToUserIDStr = new(string) - } - yym28 := z.DecBinary() - _ = yym28 - if false { - } else { - *((*string)(x.InReplyToUserIDStr)) = r.DecodeString() - } - } - case "metadata": - if r.TryDecodeAsNil() { - x.Metadata = StatusMetadata{} - } else { - yyv29 := &x.Metadata - yyv29.CodecDecodeSelf(d) - } - case "place": - if r.TryDecodeAsNil() { - if x.Place != nil { - x.Place = nil - } - } else { - if x.Place == nil { - x.Place = new(string) - } - yym31 := z.DecBinary() - _ = yym31 - if false { - } else { - *((*string)(x.Place)) = r.DecodeString() - } - } - case "retweet_count": - if r.TryDecodeAsNil() { - x.RetweetCount = 0 - } else { - yyv32 := &x.RetweetCount - yym33 := z.DecBinary() - _ = yym33 - if false { - } else { - *((*int)(yyv32)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - case "retweeted": - if r.TryDecodeAsNil() { - x.Retweeted = false - } else { - yyv34 := &x.Retweeted - yym35 := z.DecBinary() - _ = yym35 - if false { - } else { - *((*bool)(yyv34)) = r.DecodeBool() - } - } - case "source": - if r.TryDecodeAsNil() { - x.Source = "" - } else { - yyv36 := &x.Source - yym37 := z.DecBinary() - _ = yym37 - if false { - } else { - *((*string)(yyv36)) = r.DecodeString() - } - } - case "text": - if r.TryDecodeAsNil() { - x.Text = "" - } else { - yyv38 := &x.Text - yym39 := z.DecBinary() - _ = yym39 - if false { - } else { - *((*string)(yyv38)) = r.DecodeString() - } - } - case "truncated": - if r.TryDecodeAsNil() { - x.Truncated = false - } else { - yyv40 := &x.Truncated - yym41 := z.DecBinary() - _ = yym41 - if false { - } else { - *((*bool)(yyv40)) = r.DecodeBool() - } - } - case "user": - if r.TryDecodeAsNil() { - x.User = User{} - } else { - yyv42 := &x.User - yyv42.CodecDecodeSelf(d) - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd9225) -} - -func (x *Status) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj43 int - var yyb43 bool - var yyhl43 bool = l >= 0 - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.Contributors != nil { - x.Contributors = nil - } - } else { - if x.Contributors == nil { - x.Contributors = new(string) - } - yym45 := z.DecBinary() - _ = yym45 - if false { - } else { - *((*string)(x.Contributors)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.Coordinates != nil { - x.Coordinates = nil - } - } else { - if x.Coordinates == nil { - x.Coordinates = new(string) - } - yym47 := z.DecBinary() - _ = yym47 - if false { - } else { - *((*string)(x.Coordinates)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.CreatedAt = "" - } else { - yyv48 := &x.CreatedAt - yym49 := z.DecBinary() - _ = yym49 - if false { - } else { - *((*string)(yyv48)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Entities = Entities{} - } else { - yyv50 := &x.Entities - yyv50.CodecDecodeSelf(d) - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Favorited = false - } else { - yyv51 := &x.Favorited - yym52 := z.DecBinary() - _ = yym52 - if false { - } else { - *((*bool)(yyv51)) = r.DecodeBool() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.Geo != nil { - x.Geo = nil - } - } else { - if x.Geo == nil { - x.Geo = new(string) - } - yym54 := z.DecBinary() - _ = yym54 - if false { - } else { - *((*string)(x.Geo)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.ID = 0 - } else { - yyv55 := &x.ID - yym56 := z.DecBinary() - _ = yym56 - if false { - } else { - *((*int64)(yyv55)) = int64(r.DecodeInt(64)) - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.IDStr = "" - } else { - yyv57 := &x.IDStr - yym58 := z.DecBinary() - _ = yym58 - if false { - } else { - *((*string)(yyv57)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.InReplyToScreenName != nil { - x.InReplyToScreenName = nil - } - } else { - if x.InReplyToScreenName == nil { - x.InReplyToScreenName = new(string) - } - yym60 := z.DecBinary() - _ = yym60 - if false { - } else { - *((*string)(x.InReplyToScreenName)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.InReplyToStatusID != nil { - x.InReplyToStatusID = nil - } - } else { - if x.InReplyToStatusID == nil { - x.InReplyToStatusID = new(string) - } - yym62 := z.DecBinary() - _ = yym62 - if false { - } else { - *((*string)(x.InReplyToStatusID)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.InReplyToStatusIDStr != nil { - x.InReplyToStatusIDStr = nil - } - } else { - if x.InReplyToStatusIDStr == nil { - x.InReplyToStatusIDStr = new(string) - } - yym64 := z.DecBinary() - _ = yym64 - if false { - } else { - *((*string)(x.InReplyToStatusIDStr)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.InReplyToUserID != nil { - x.InReplyToUserID = nil - } - } else { - if x.InReplyToUserID == nil { - x.InReplyToUserID = new(string) - } - yym66 := z.DecBinary() - _ = yym66 - if false { - } else { - *((*string)(x.InReplyToUserID)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.InReplyToUserIDStr != nil { - x.InReplyToUserIDStr = nil - } - } else { - if x.InReplyToUserIDStr == nil { - x.InReplyToUserIDStr = new(string) - } - yym68 := z.DecBinary() - _ = yym68 - if false { - } else { - *((*string)(x.InReplyToUserIDStr)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Metadata = StatusMetadata{} - } else { - yyv69 := &x.Metadata - yyv69.CodecDecodeSelf(d) - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - if x.Place != nil { - x.Place = nil - } - } else { - if x.Place == nil { - x.Place = new(string) - } - yym71 := z.DecBinary() - _ = yym71 - if false { - } else { - *((*string)(x.Place)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.RetweetCount = 0 - } else { - yyv72 := &x.RetweetCount - yym73 := z.DecBinary() - _ = yym73 - if false { - } else { - *((*int)(yyv72)) = int(r.DecodeInt(codecSelferBitsize9225)) - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Retweeted = false - } else { - yyv74 := &x.Retweeted - yym75 := z.DecBinary() - _ = yym75 - if false { - } else { - *((*bool)(yyv74)) = r.DecodeBool() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Source = "" - } else { - yyv76 := &x.Source - yym77 := z.DecBinary() - _ = yym77 - if false { - } else { - *((*string)(yyv76)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Text = "" - } else { - yyv78 := &x.Text - yym79 := z.DecBinary() - _ = yym79 - if false { - } else { - *((*string)(yyv78)) = r.DecodeString() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Truncated = false - } else { - yyv80 := &x.Truncated - yym81 := z.DecBinary() - _ = yym81 - if false { - } else { - *((*bool)(yyv80)) = r.DecodeBool() - } - } - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.User = User{} - } else { - yyv82 := &x.User - yyv82.CodecDecodeSelf(d) - } - for { - yyj43++ - if yyhl43 { - yyb43 = yyj43 > l - } else { - yyb43 = r.CheckBreak() - } - if yyb43 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - z.DecStructFieldNotFound(yyj43-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x *LargeStruct) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [2]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(2) - } else { - yynn2 = 2 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yy4 := &x.SearchMetadata - yy4.CodecEncodeSelf(e) - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("search_metadata")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - yy6 := &x.SearchMetadata - yy6.CodecEncodeSelf(e) - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Statuses == nil { - r.EncodeNil() - } else { - yym9 := z.EncBinary() - _ = yym9 - if false { - } else { - h.encSliceStatus(([]Status)(x.Statuses), e) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("statuses")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Statuses == nil { - r.EncodeNil() - } else { - yym10 := z.EncBinary() - _ = yym10 - if false { - } else { - h.encSliceStatus(([]Status)(x.Statuses), e) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd9225) - } - } - } -} - -func (x *LargeStruct) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap9225 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd9225) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray9225 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) - } - } -} - -func (x *LargeStruct) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey9225) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} - yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) - z.DecSendContainerState(codecSelfer_containerMapValue9225) - switch yys3 { - case "search_metadata": - if r.TryDecodeAsNil() { - x.SearchMetadata = SearchMetadata{} - } else { - yyv4 := &x.SearchMetadata - yyv4.CodecDecodeSelf(d) - } - case "statuses": - if r.TryDecodeAsNil() { - x.Statuses = nil - } else { - yyv5 := &x.Statuses - yym6 := z.DecBinary() - _ = yym6 - if false { - } else { - h.decSliceStatus((*[]Status)(yyv5), d) - } - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd9225) -} - -func (x *LargeStruct) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj7 int - var yyb7 bool - var yyhl7 bool = l >= 0 - yyj7++ - if yyhl7 { - yyb7 = yyj7 > l - } else { - yyb7 = r.CheckBreak() - } - if yyb7 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.SearchMetadata = SearchMetadata{} - } else { - yyv8 := &x.SearchMetadata - yyv8.CodecDecodeSelf(d) - } - yyj7++ - if yyhl7 { - yyb7 = yyj7 > l - } else { - yyb7 = r.CheckBreak() - } - if yyb7 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Statuses = nil - } else { - yyv9 := &x.Statuses - yym10 := z.DecBinary() - _ = yym10 - if false { - } else { - h.decSliceStatus((*[]Status)(yyv9), d) - } - } - for { - yyj7++ - if yyhl7 { - yyb7 = yyj7 > l - } else { - yyb7 = r.CheckBreak() - } - if yyb7 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - z.DecStructFieldNotFound(yyj7-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x *XLStruct) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yym1 := z.EncBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.EncExt(x) { - } else { - yysep2 := !z.EncBinary() - yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [1]bool - _, _, _ = yysep2, yyq2, yy2arr2 - const yyr2 bool = false - var yynn2 int - if yyr2 || yy2arr2 { - r.EncodeArrayStart(1) - } else { - yynn2 = 1 - for _, b := range yyq2 { - if b { - yynn2++ - } - } - r.EncodeMapStart(yynn2) - yynn2 = 0 - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if x.Data == nil { - r.EncodeNil() - } else { - yym4 := z.EncBinary() - _ = yym4 - if false { - } else { - h.encSliceLargeStruct(([]LargeStruct)(x.Data), e) - } - } - } else { - z.EncSendContainerState(codecSelfer_containerMapKey9225) - r.EncodeString(codecSelferC_UTF89225, string("Data")) - z.EncSendContainerState(codecSelfer_containerMapValue9225) - if x.Data == nil { - r.EncodeNil() - } else { - yym5 := z.EncBinary() - _ = yym5 - if false { - } else { - h.encSliceLargeStruct(([]LargeStruct)(x.Data), e) - } - } - } - if yyr2 || yy2arr2 { - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - z.EncSendContainerState(codecSelfer_containerMapEnd9225) - } - } - } -} - -func (x *XLStruct) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yym1 := z.DecBinary() - _ = yym1 - if false { - } else if z.HasExtensions() && z.DecExt(x) { - } else { - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeMap9225 { - yyl2 := r.ReadMapStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerMapEnd9225) - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - } else if yyct2 == codecSelferValueTypeArray9225 { - yyl2 := r.ReadArrayStart() - if yyl2 == 0 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - } else { - x.codecDecodeSelfFromArray(yyl2, d) - } - } else { - panic(codecSelferOnlyMapOrArrayEncodeToStructErr9225) - } - } -} - -func (x *XLStruct) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yys3Slc = z.DecScratchBuffer() // default slice to decode into - _ = yys3Slc - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if r.CheckBreak() { - break - } - } - z.DecSendContainerState(codecSelfer_containerMapKey9225) - yys3Slc = r.DecodeBytes(yys3Slc, true, true) - yys3SlcHdr := codecSelferUnsafeString9225{uintptr(unsafe.Pointer(&yys3Slc[0])), len(yys3Slc)} - yys3 := *(*string)(unsafe.Pointer(&yys3SlcHdr)) - z.DecSendContainerState(codecSelfer_containerMapValue9225) - switch yys3 { - case "Data": - if r.TryDecodeAsNil() { - x.Data = nil - } else { - yyv4 := &x.Data - yym5 := z.DecBinary() - _ = yym5 - if false { - } else { - h.decSliceLargeStruct((*[]LargeStruct)(yyv4), d) - } - } - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 - z.DecSendContainerState(codecSelfer_containerMapEnd9225) -} - -func (x *XLStruct) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj6 int - var yyb6 bool - var yyhl6 bool = l >= 0 - yyj6++ - if yyhl6 { - yyb6 = yyj6 > l - } else { - yyb6 = r.CheckBreak() - } - if yyb6 { - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - if r.TryDecodeAsNil() { - x.Data = nil - } else { - yyv7 := &x.Data - yym8 := z.DecBinary() - _ = yym8 - if false { - } else { - h.decSliceLargeStruct((*[]LargeStruct)(yyv7), d) - } - } - for { - yyj6++ - if yyhl6 { - yyb6 = yyj6 > l - } else { - yyb6 = r.CheckBreak() - } - if yyb6 { - break - } - z.DecSendContainerState(codecSelfer_containerArrayElem9225) - z.DecStructFieldNotFound(yyj6-1, "") - } - z.DecSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x codecSelfer9225) encSliceHashtag(v []Hashtag, e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - r.EncodeArrayStart(len(v)) - for _, yyv1 := range v { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yy2 := &yyv1 - yy2.CodecEncodeSelf(e) - } - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x codecSelfer9225) decSliceHashtag(v *[]Hashtag, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - - yyv1 := *v - yyh1, yyl1 := z.DecSliceHelperStart() - var yyc1 bool - _ = yyc1 - if yyl1 == 0 { - if yyv1 == nil { - yyv1 = []Hashtag{} - yyc1 = true - } else if len(yyv1) != 0 { - yyv1 = yyv1[:0] - yyc1 = true - } - } else if yyl1 > 0 { - var yyrr1, yyrl1 int - var yyrt1 bool - _, _ = yyrl1, yyrt1 - yyrr1 = yyl1 // len(yyv1) - if yyl1 > cap(yyv1) { - - yyrg1 := len(yyv1) > 0 - yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 40) - if yyrt1 { - if yyrl1 <= cap(yyv1) { - yyv1 = yyv1[:yyrl1] - } else { - yyv1 = make([]Hashtag, yyrl1) - } - } else { - yyv1 = make([]Hashtag, yyrl1) - } - yyc1 = true - yyrr1 = len(yyv1) - if yyrg1 { - copy(yyv1, yyv21) - } - } else if yyl1 != len(yyv1) { - yyv1 = yyv1[:yyl1] - yyc1 = true - } - yyj1 := 0 - for ; yyj1 < yyrr1; yyj1++ { - yyh1.ElemContainerState(yyj1) - if r.TryDecodeAsNil() { - yyv1[yyj1] = Hashtag{} - } else { - yyv2 := &yyv1[yyj1] - yyv2.CodecDecodeSelf(d) - } - - } - if yyrt1 { - for ; yyj1 < yyl1; yyj1++ { - yyv1 = append(yyv1, Hashtag{}) - yyh1.ElemContainerState(yyj1) - if r.TryDecodeAsNil() { - yyv1[yyj1] = Hashtag{} - } else { - yyv3 := &yyv1[yyj1] - yyv3.CodecDecodeSelf(d) - } - - } - } - - } else { - yyj1 := 0 - for ; !r.CheckBreak(); yyj1++ { - - if yyj1 >= len(yyv1) { - yyv1 = append(yyv1, Hashtag{}) // var yyz1 Hashtag - yyc1 = true - } - yyh1.ElemContainerState(yyj1) - if yyj1 < len(yyv1) { - if r.TryDecodeAsNil() { - yyv1[yyj1] = Hashtag{} - } else { - yyv4 := &yyv1[yyj1] - yyv4.CodecDecodeSelf(d) - } - - } else { - z.DecSwallow() - } - - } - if yyj1 < len(yyv1) { - yyv1 = yyv1[:yyj1] - yyc1 = true - } else if yyj1 == 0 && yyv1 == nil { - yyv1 = []Hashtag{} - yyc1 = true - } - } - yyh1.End() - if yyc1 { - *v = yyv1 - } -} - -func (x codecSelfer9225) encSlicePtrtostring(v []*string, e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - r.EncodeArrayStart(len(v)) - for _, yyv1 := range v { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - if yyv1 == nil { - r.EncodeNil() - } else { - yy2 := *yyv1 - yym3 := z.EncBinary() - _ = yym3 - if false { - } else { - r.EncodeString(codecSelferC_UTF89225, string(yy2)) - } - } - } - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x codecSelfer9225) decSlicePtrtostring(v *[]*string, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - - yyv1 := *v - yyh1, yyl1 := z.DecSliceHelperStart() - var yyc1 bool - _ = yyc1 - if yyl1 == 0 { - if yyv1 == nil { - yyv1 = []*string{} - yyc1 = true - } else if len(yyv1) != 0 { - yyv1 = yyv1[:0] - yyc1 = true - } - } else if yyl1 > 0 { - var yyrr1, yyrl1 int - var yyrt1 bool - _, _ = yyrl1, yyrt1 - yyrr1 = yyl1 // len(yyv1) - if yyl1 > cap(yyv1) { - - yyrg1 := len(yyv1) > 0 - yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 8) - if yyrt1 { - if yyrl1 <= cap(yyv1) { - yyv1 = yyv1[:yyrl1] - } else { - yyv1 = make([]*string, yyrl1) - } - } else { - yyv1 = make([]*string, yyrl1) - } - yyc1 = true - yyrr1 = len(yyv1) - if yyrg1 { - copy(yyv1, yyv21) - } - } else if yyl1 != len(yyv1) { - yyv1 = yyv1[:yyl1] - yyc1 = true - } - yyj1 := 0 - for ; yyj1 < yyrr1; yyj1++ { - yyh1.ElemContainerState(yyj1) - if r.TryDecodeAsNil() { - if yyv1[yyj1] != nil { - *yyv1[yyj1] = "" - } - } else { - if yyv1[yyj1] == nil { - yyv1[yyj1] = new(string) - } - yyw2 := yyv1[yyj1] - yym3 := z.DecBinary() - _ = yym3 - if false { - } else { - *((*string)(yyw2)) = r.DecodeString() - } - } - - } - if yyrt1 { - for ; yyj1 < yyl1; yyj1++ { - yyv1 = append(yyv1, nil) - yyh1.ElemContainerState(yyj1) - if r.TryDecodeAsNil() { - if yyv1[yyj1] != nil { - *yyv1[yyj1] = "" - } - } else { - if yyv1[yyj1] == nil { - yyv1[yyj1] = new(string) - } - yyw4 := yyv1[yyj1] - yym5 := z.DecBinary() - _ = yym5 - if false { - } else { - *((*string)(yyw4)) = r.DecodeString() - } - } - - } - } - - } else { - yyj1 := 0 - for ; !r.CheckBreak(); yyj1++ { - - if yyj1 >= len(yyv1) { - yyv1 = append(yyv1, nil) // var yyz1 *string - yyc1 = true - } - yyh1.ElemContainerState(yyj1) - if yyj1 < len(yyv1) { - if r.TryDecodeAsNil() { - if yyv1[yyj1] != nil { - *yyv1[yyj1] = "" - } - } else { - if yyv1[yyj1] == nil { - yyv1[yyj1] = new(string) - } - yyw6 := yyv1[yyj1] - yym7 := z.DecBinary() - _ = yym7 - if false { - } else { - *((*string)(yyw6)) = r.DecodeString() - } - } - - } else { - z.DecSwallow() - } - - } - if yyj1 < len(yyv1) { - yyv1 = yyv1[:yyj1] - yyc1 = true - } else if yyj1 == 0 && yyv1 == nil { - yyv1 = []*string{} - yyc1 = true - } - } - yyh1.End() - if yyc1 { - *v = yyv1 - } -} - -func (x codecSelfer9225) encSliceURL(v []URL, e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - r.EncodeArrayStart(len(v)) - for _, yyv1 := range v { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yy2 := &yyv1 - yy2.CodecEncodeSelf(e) - } - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x codecSelfer9225) decSliceURL(v *[]URL, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - - yyv1 := *v - yyh1, yyl1 := z.DecSliceHelperStart() - var yyc1 bool - _ = yyc1 - if yyl1 == 0 { - if yyv1 == nil { - yyv1 = []URL{} - yyc1 = true - } else if len(yyv1) != 0 { - yyv1 = yyv1[:0] - yyc1 = true - } - } else if yyl1 > 0 { - var yyrr1, yyrl1 int - var yyrt1 bool - _, _ = yyrl1, yyrt1 - yyrr1 = yyl1 // len(yyv1) - if yyl1 > cap(yyv1) { - - yyrg1 := len(yyv1) > 0 - yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 48) - if yyrt1 { - if yyrl1 <= cap(yyv1) { - yyv1 = yyv1[:yyrl1] - } else { - yyv1 = make([]URL, yyrl1) - } - } else { - yyv1 = make([]URL, yyrl1) - } - yyc1 = true - yyrr1 = len(yyv1) - if yyrg1 { - copy(yyv1, yyv21) - } - } else if yyl1 != len(yyv1) { - yyv1 = yyv1[:yyl1] - yyc1 = true - } - yyj1 := 0 - for ; yyj1 < yyrr1; yyj1++ { - yyh1.ElemContainerState(yyj1) - if r.TryDecodeAsNil() { - yyv1[yyj1] = URL{} - } else { - yyv2 := &yyv1[yyj1] - yyv2.CodecDecodeSelf(d) - } - - } - if yyrt1 { - for ; yyj1 < yyl1; yyj1++ { - yyv1 = append(yyv1, URL{}) - yyh1.ElemContainerState(yyj1) - if r.TryDecodeAsNil() { - yyv1[yyj1] = URL{} - } else { - yyv3 := &yyv1[yyj1] - yyv3.CodecDecodeSelf(d) - } - - } - } - - } else { - yyj1 := 0 - for ; !r.CheckBreak(); yyj1++ { - - if yyj1 >= len(yyv1) { - yyv1 = append(yyv1, URL{}) // var yyz1 URL - yyc1 = true - } - yyh1.ElemContainerState(yyj1) - if yyj1 < len(yyv1) { - if r.TryDecodeAsNil() { - yyv1[yyj1] = URL{} - } else { - yyv4 := &yyv1[yyj1] - yyv4.CodecDecodeSelf(d) - } - - } else { - z.DecSwallow() - } - - } - if yyj1 < len(yyv1) { - yyv1 = yyv1[:yyj1] - yyc1 = true - } else if yyj1 == 0 && yyv1 == nil { - yyv1 = []URL{} - yyc1 = true - } - } - yyh1.End() - if yyc1 { - *v = yyv1 - } -} - -func (x codecSelfer9225) encSliceStatus(v []Status, e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - r.EncodeArrayStart(len(v)) - for _, yyv1 := range v { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yy2 := &yyv1 - yy2.CodecEncodeSelf(e) - } - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x codecSelfer9225) decSliceStatus(v *[]Status, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - - yyv1 := *v - yyh1, yyl1 := z.DecSliceHelperStart() - var yyc1 bool - _ = yyc1 - if yyl1 == 0 { - if yyv1 == nil { - yyv1 = []Status{} - yyc1 = true - } else if len(yyv1) != 0 { - yyv1 = yyv1[:0] - yyc1 = true - } - } else if yyl1 > 0 { - var yyrr1, yyrl1 int - var yyrt1 bool - _, _ = yyrl1, yyrt1 - yyrr1 = yyl1 // len(yyv1) - if yyl1 > cap(yyv1) { - - yyrg1 := len(yyv1) > 0 - yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 752) - if yyrt1 { - if yyrl1 <= cap(yyv1) { - yyv1 = yyv1[:yyrl1] - } else { - yyv1 = make([]Status, yyrl1) - } - } else { - yyv1 = make([]Status, yyrl1) - } - yyc1 = true - yyrr1 = len(yyv1) - if yyrg1 { - copy(yyv1, yyv21) - } - } else if yyl1 != len(yyv1) { - yyv1 = yyv1[:yyl1] - yyc1 = true - } - yyj1 := 0 - for ; yyj1 < yyrr1; yyj1++ { - yyh1.ElemContainerState(yyj1) - if r.TryDecodeAsNil() { - yyv1[yyj1] = Status{} - } else { - yyv2 := &yyv1[yyj1] - yyv2.CodecDecodeSelf(d) - } - - } - if yyrt1 { - for ; yyj1 < yyl1; yyj1++ { - yyv1 = append(yyv1, Status{}) - yyh1.ElemContainerState(yyj1) - if r.TryDecodeAsNil() { - yyv1[yyj1] = Status{} - } else { - yyv3 := &yyv1[yyj1] - yyv3.CodecDecodeSelf(d) - } - - } - } - - } else { - yyj1 := 0 - for ; !r.CheckBreak(); yyj1++ { - - if yyj1 >= len(yyv1) { - yyv1 = append(yyv1, Status{}) // var yyz1 Status - yyc1 = true - } - yyh1.ElemContainerState(yyj1) - if yyj1 < len(yyv1) { - if r.TryDecodeAsNil() { - yyv1[yyj1] = Status{} - } else { - yyv4 := &yyv1[yyj1] - yyv4.CodecDecodeSelf(d) - } - - } else { - z.DecSwallow() - } - - } - if yyj1 < len(yyv1) { - yyv1 = yyv1[:yyj1] - yyc1 = true - } else if yyj1 == 0 && yyv1 == nil { - yyv1 = []Status{} - yyc1 = true - } - } - yyh1.End() - if yyc1 { - *v = yyv1 - } -} - -func (x codecSelfer9225) encSliceLargeStruct(v []LargeStruct, e *codec1978.Encoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - r.EncodeArrayStart(len(v)) - for _, yyv1 := range v { - z.EncSendContainerState(codecSelfer_containerArrayElem9225) - yy2 := &yyv1 - yy2.CodecEncodeSelf(e) - } - z.EncSendContainerState(codecSelfer_containerArrayEnd9225) -} - -func (x codecSelfer9225) decSliceLargeStruct(v *[]LargeStruct, d *codec1978.Decoder) { - var h codecSelfer9225 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - - yyv1 := *v - yyh1, yyl1 := z.DecSliceHelperStart() - var yyc1 bool - _ = yyc1 - if yyl1 == 0 { - if yyv1 == nil { - yyv1 = []LargeStruct{} - yyc1 = true - } else if len(yyv1) != 0 { - yyv1 = yyv1[:0] - yyc1 = true - } - } else if yyl1 > 0 { - var yyrr1, yyrl1 int - var yyrt1 bool - _, _ = yyrl1, yyrt1 - yyrr1 = yyl1 // len(yyv1) - if yyl1 > cap(yyv1) { - - yyrg1 := len(yyv1) > 0 - yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 136) - if yyrt1 { - if yyrl1 <= cap(yyv1) { - yyv1 = yyv1[:yyrl1] - } else { - yyv1 = make([]LargeStruct, yyrl1) - } - } else { - yyv1 = make([]LargeStruct, yyrl1) - } - yyc1 = true - yyrr1 = len(yyv1) - if yyrg1 { - copy(yyv1, yyv21) - } - } else if yyl1 != len(yyv1) { - yyv1 = yyv1[:yyl1] - yyc1 = true - } - yyj1 := 0 - for ; yyj1 < yyrr1; yyj1++ { - yyh1.ElemContainerState(yyj1) - if r.TryDecodeAsNil() { - yyv1[yyj1] = LargeStruct{} - } else { - yyv2 := &yyv1[yyj1] - yyv2.CodecDecodeSelf(d) - } - - } - if yyrt1 { - for ; yyj1 < yyl1; yyj1++ { - yyv1 = append(yyv1, LargeStruct{}) - yyh1.ElemContainerState(yyj1) - if r.TryDecodeAsNil() { - yyv1[yyj1] = LargeStruct{} - } else { - yyv3 := &yyv1[yyj1] - yyv3.CodecDecodeSelf(d) - } - - } - } - - } else { - yyj1 := 0 - for ; !r.CheckBreak(); yyj1++ { - - if yyj1 >= len(yyv1) { - yyv1 = append(yyv1, LargeStruct{}) // var yyz1 LargeStruct - yyc1 = true - } - yyh1.ElemContainerState(yyj1) - if yyj1 < len(yyv1) { - if r.TryDecodeAsNil() { - yyv1[yyj1] = LargeStruct{} - } else { - yyv4 := &yyv1[yyj1] - yyv4.CodecDecodeSelf(d) - } - - } else { - z.DecSwallow() - } - - } - if yyj1 < len(yyv1) { - yyv1 = yyv1[:yyj1] - yyc1 = true - } else if yyj1 == 0 && yyv1 == nil { - yyv1 = []LargeStruct{} - yyc1 = true - } - } - yyh1.End() - if yyc1 { - *v = yyv1 - } -} diff --git a/vendor/github.com/mailru/easyjson/benchmark/data_ffjson.go b/vendor/github.com/mailru/easyjson/benchmark/data_ffjson.go deleted file mode 100644 index 9f000d3ad2..0000000000 --- a/vendor/github.com/mailru/easyjson/benchmark/data_ffjson.go +++ /dev/null @@ -1,6723 +0,0 @@ -// +build use_ffjson - -// DO NOT EDIT! -// Code generated by ffjson -// source: .root/src/github.com/mailru/easyjson/benchmark/data.go -// DO NOT EDIT! - -package benchmark - -import ( - "bytes" - "errors" - "fmt" - fflib "github.com/pquerna/ffjson/fflib/v1" -) - -func (mj *Entities) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if mj == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := mj.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} -func (mj *Entities) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if mj == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - buf.WriteString(`{"hashtags":`) - if mj.Hashtags != nil { - buf.WriteString(`[`) - for i, v := range mj.Hashtags { - if i != 0 { - buf.WriteString(`,`) - } - - { - - err = v.MarshalJSONBuf(buf) - if err != nil { - return err - } - - } - } - buf.WriteString(`]`) - } else { - buf.WriteString(`null`) - } - buf.WriteString(`,"urls":`) - if mj.Urls != nil { - buf.WriteString(`[`) - for i, v := range mj.Urls { - if i != 0 { - buf.WriteString(`,`) - } - if v != nil { - fflib.WriteJsonString(buf, string(*v)) - } else { - buf.WriteString(`null`) - } - } - buf.WriteString(`]`) - } else { - buf.WriteString(`null`) - } - buf.WriteString(`,"user_mentions":`) - if mj.UserMentions != nil { - buf.WriteString(`[`) - for i, v := range mj.UserMentions { - if i != 0 { - buf.WriteString(`,`) - } - if v != nil { - fflib.WriteJsonString(buf, string(*v)) - } else { - buf.WriteString(`null`) - } - } - buf.WriteString(`]`) - } else { - buf.WriteString(`null`) - } - buf.WriteByte('}') - return nil -} - -const ( - ffj_t_Entitiesbase = iota - ffj_t_Entitiesno_such_key - - ffj_t_Entities_Hashtags - - ffj_t_Entities_Urls - - ffj_t_Entities_UserMentions -) - -var ffj_key_Entities_Hashtags = []byte("hashtags") - -var ffj_key_Entities_Urls = []byte("urls") - -var ffj_key_Entities_UserMentions = []byte("user_mentions") - -func (uj *Entities) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -func (uj *Entities) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error = nil - currentKey := ffj_t_Entitiesbase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffj_t_Entitiesno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 'h': - - if bytes.Equal(ffj_key_Entities_Hashtags, kn) { - currentKey = ffj_t_Entities_Hashtags - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'u': - - if bytes.Equal(ffj_key_Entities_Urls, kn) { - currentKey = ffj_t_Entities_Urls - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_Entities_UserMentions, kn) { - currentKey = ffj_t_Entities_UserMentions - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.EqualFoldRight(ffj_key_Entities_UserMentions, kn) { - currentKey = ffj_t_Entities_UserMentions - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Entities_Urls, kn) { - currentKey = ffj_t_Entities_Urls - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Entities_Hashtags, kn) { - currentKey = ffj_t_Entities_Hashtags - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffj_t_Entitiesno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffj_t_Entities_Hashtags: - goto handle_Hashtags - - case ffj_t_Entities_Urls: - goto handle_Urls - - case ffj_t_Entities_UserMentions: - goto handle_UserMentions - - case ffj_t_Entitiesno_such_key: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_Hashtags: - - /* handler: uj.Hashtags type=[]benchmark.Hashtag kind=slice quoted=false*/ - - { - - { - if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) - } - } - - if tok == fflib.FFTok_null { - uj.Hashtags = nil - } else { - - uj.Hashtags = make([]Hashtag, 0) - - wantVal := true - - for { - - var tmp_uj__Hashtags Hashtag - - tok = fs.Scan() - if tok == fflib.FFTok_error { - goto tokerror - } - if tok == fflib.FFTok_right_brace { - break - } - - if tok == fflib.FFTok_comma { - if wantVal == true { - // TODO(pquerna): this isn't an ideal error message, this handles - // things like [,,,] as an array value. - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) - } - continue - } else { - wantVal = true - } - - /* handler: tmp_uj__Hashtags type=benchmark.Hashtag kind=struct quoted=false*/ - - { - if tok == fflib.FFTok_null { - - state = fflib.FFParse_after_value - goto mainparse - } - - err = tmp_uj__Hashtags.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) - if err != nil { - return err - } - state = fflib.FFParse_after_value - } - - uj.Hashtags = append(uj.Hashtags, tmp_uj__Hashtags) - wantVal = false - } - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Urls: - - /* handler: uj.Urls type=[]*string kind=slice quoted=false*/ - - { - - { - if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) - } - } - - if tok == fflib.FFTok_null { - uj.Urls = nil - } else { - - uj.Urls = make([]*string, 0) - - wantVal := true - - for { - - var tmp_uj__Urls *string - - tok = fs.Scan() - if tok == fflib.FFTok_error { - goto tokerror - } - if tok == fflib.FFTok_right_brace { - break - } - - if tok == fflib.FFTok_comma { - if wantVal == true { - // TODO(pquerna): this isn't an ideal error message, this handles - // things like [,,,] as an array value. - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) - } - continue - } else { - wantVal = true - } - - /* handler: tmp_uj__Urls type=*string kind=ptr quoted=false*/ - - { - - if tok == fflib.FFTok_null { - tmp_uj__Urls = nil - } else { - if tmp_uj__Urls == nil { - tmp_uj__Urls = new(string) - } - - /* handler: tmp_uj__Urls type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - tmp_uj__Urls = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - tmp_uj__Urls = &tval - - } - } - - } - } - - uj.Urls = append(uj.Urls, tmp_uj__Urls) - wantVal = false - } - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_UserMentions: - - /* handler: uj.UserMentions type=[]*string kind=slice quoted=false*/ - - { - - { - if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) - } - } - - if tok == fflib.FFTok_null { - uj.UserMentions = nil - } else { - - uj.UserMentions = make([]*string, 0) - - wantVal := true - - for { - - var tmp_uj__UserMentions *string - - tok = fs.Scan() - if tok == fflib.FFTok_error { - goto tokerror - } - if tok == fflib.FFTok_right_brace { - break - } - - if tok == fflib.FFTok_comma { - if wantVal == true { - // TODO(pquerna): this isn't an ideal error message, this handles - // things like [,,,] as an array value. - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) - } - continue - } else { - wantVal = true - } - - /* handler: tmp_uj__UserMentions type=*string kind=ptr quoted=false*/ - - { - - if tok == fflib.FFTok_null { - tmp_uj__UserMentions = nil - } else { - if tmp_uj__UserMentions == nil { - tmp_uj__UserMentions = new(string) - } - - /* handler: tmp_uj__UserMentions type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - tmp_uj__UserMentions = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - tmp_uj__UserMentions = &tval - - } - } - - } - } - - uj.UserMentions = append(uj.UserMentions, tmp_uj__UserMentions) - wantVal = false - } - } - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - return nil -} - -func (mj *Hashtag) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if mj == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := mj.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} -func (mj *Hashtag) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if mj == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - buf.WriteString(`{"indices":`) - if mj.Indices != nil { - buf.WriteString(`[`) - for i, v := range mj.Indices { - if i != 0 { - buf.WriteString(`,`) - } - fflib.FormatBits2(buf, uint64(v), 10, v < 0) - } - buf.WriteString(`]`) - } else { - buf.WriteString(`null`) - } - buf.WriteString(`,"text":`) - fflib.WriteJsonString(buf, string(mj.Text)) - buf.WriteByte('}') - return nil -} - -const ( - ffj_t_Hashtagbase = iota - ffj_t_Hashtagno_such_key - - ffj_t_Hashtag_Indices - - ffj_t_Hashtag_Text -) - -var ffj_key_Hashtag_Indices = []byte("indices") - -var ffj_key_Hashtag_Text = []byte("text") - -func (uj *Hashtag) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -func (uj *Hashtag) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error = nil - currentKey := ffj_t_Hashtagbase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffj_t_Hashtagno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 'i': - - if bytes.Equal(ffj_key_Hashtag_Indices, kn) { - currentKey = ffj_t_Hashtag_Indices - state = fflib.FFParse_want_colon - goto mainparse - } - - case 't': - - if bytes.Equal(ffj_key_Hashtag_Text, kn) { - currentKey = ffj_t_Hashtag_Text - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.SimpleLetterEqualFold(ffj_key_Hashtag_Text, kn) { - currentKey = ffj_t_Hashtag_Text - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Hashtag_Indices, kn) { - currentKey = ffj_t_Hashtag_Indices - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffj_t_Hashtagno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffj_t_Hashtag_Indices: - goto handle_Indices - - case ffj_t_Hashtag_Text: - goto handle_Text - - case ffj_t_Hashtagno_such_key: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_Indices: - - /* handler: uj.Indices type=[]int kind=slice quoted=false*/ - - { - - { - if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) - } - } - - if tok == fflib.FFTok_null { - uj.Indices = nil - } else { - - uj.Indices = make([]int, 0) - - wantVal := true - - for { - - var tmp_uj__Indices int - - tok = fs.Scan() - if tok == fflib.FFTok_error { - goto tokerror - } - if tok == fflib.FFTok_right_brace { - break - } - - if tok == fflib.FFTok_comma { - if wantVal == true { - // TODO(pquerna): this isn't an ideal error message, this handles - // things like [,,,] as an array value. - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) - } - continue - } else { - wantVal = true - } - - /* handler: tmp_uj__Indices type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - tmp_uj__Indices = int(tval) - - } - } - - uj.Indices = append(uj.Indices, tmp_uj__Indices) - wantVal = false - } - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Text: - - /* handler: uj.Text type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.Text = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - return nil -} - -func (mj *LargeStruct) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if mj == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := mj.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} -func (mj *LargeStruct) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if mj == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - buf.WriteString(`{"search_metadata":`) - - { - - err = mj.SearchMetadata.MarshalJSONBuf(buf) - if err != nil { - return err - } - - } - buf.WriteString(`,"statuses":`) - if mj.Statuses != nil { - buf.WriteString(`[`) - for i, v := range mj.Statuses { - if i != 0 { - buf.WriteString(`,`) - } - - { - - err = v.MarshalJSONBuf(buf) - if err != nil { - return err - } - - } - } - buf.WriteString(`]`) - } else { - buf.WriteString(`null`) - } - buf.WriteByte('}') - return nil -} - -const ( - ffj_t_LargeStructbase = iota - ffj_t_LargeStructno_such_key - - ffj_t_LargeStruct_SearchMetadata - - ffj_t_LargeStruct_Statuses -) - -var ffj_key_LargeStruct_SearchMetadata = []byte("search_metadata") - -var ffj_key_LargeStruct_Statuses = []byte("statuses") - -func (uj *LargeStruct) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -func (uj *LargeStruct) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error = nil - currentKey := ffj_t_LargeStructbase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffj_t_LargeStructno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 's': - - if bytes.Equal(ffj_key_LargeStruct_SearchMetadata, kn) { - currentKey = ffj_t_LargeStruct_SearchMetadata - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_LargeStruct_Statuses, kn) { - currentKey = ffj_t_LargeStruct_Statuses - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.EqualFoldRight(ffj_key_LargeStruct_Statuses, kn) { - currentKey = ffj_t_LargeStruct_Statuses - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_LargeStruct_SearchMetadata, kn) { - currentKey = ffj_t_LargeStruct_SearchMetadata - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffj_t_LargeStructno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffj_t_LargeStruct_SearchMetadata: - goto handle_SearchMetadata - - case ffj_t_LargeStruct_Statuses: - goto handle_Statuses - - case ffj_t_LargeStructno_such_key: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_SearchMetadata: - - /* handler: uj.SearchMetadata type=benchmark.SearchMetadata kind=struct quoted=false*/ - - { - if tok == fflib.FFTok_null { - - state = fflib.FFParse_after_value - goto mainparse - } - - err = uj.SearchMetadata.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) - if err != nil { - return err - } - state = fflib.FFParse_after_value - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Statuses: - - /* handler: uj.Statuses type=[]benchmark.Status kind=slice quoted=false*/ - - { - - { - if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) - } - } - - if tok == fflib.FFTok_null { - uj.Statuses = nil - } else { - - uj.Statuses = make([]Status, 0) - - wantVal := true - - for { - - var tmp_uj__Statuses Status - - tok = fs.Scan() - if tok == fflib.FFTok_error { - goto tokerror - } - if tok == fflib.FFTok_right_brace { - break - } - - if tok == fflib.FFTok_comma { - if wantVal == true { - // TODO(pquerna): this isn't an ideal error message, this handles - // things like [,,,] as an array value. - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) - } - continue - } else { - wantVal = true - } - - /* handler: tmp_uj__Statuses type=benchmark.Status kind=struct quoted=false*/ - - { - if tok == fflib.FFTok_null { - - state = fflib.FFParse_after_value - goto mainparse - } - - err = tmp_uj__Statuses.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) - if err != nil { - return err - } - state = fflib.FFParse_after_value - } - - uj.Statuses = append(uj.Statuses, tmp_uj__Statuses) - wantVal = false - } - } - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - return nil -} - -func (mj *SearchMetadata) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if mj == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := mj.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} -func (mj *SearchMetadata) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if mj == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - buf.WriteString(`{"completed_in":`) - fflib.AppendFloat(buf, float64(mj.CompletedIn), 'g', -1, 64) - buf.WriteString(`,"count":`) - fflib.FormatBits2(buf, uint64(mj.Count), 10, mj.Count < 0) - buf.WriteString(`,"max_id":`) - fflib.FormatBits2(buf, uint64(mj.MaxID), 10, mj.MaxID < 0) - buf.WriteString(`,"max_id_str":`) - fflib.WriteJsonString(buf, string(mj.MaxIDStr)) - buf.WriteString(`,"next_results":`) - fflib.WriteJsonString(buf, string(mj.NextResults)) - buf.WriteString(`,"query":`) - fflib.WriteJsonString(buf, string(mj.Query)) - buf.WriteString(`,"refresh_url":`) - fflib.WriteJsonString(buf, string(mj.RefreshURL)) - buf.WriteString(`,"since_id":`) - fflib.FormatBits2(buf, uint64(mj.SinceID), 10, mj.SinceID < 0) - buf.WriteString(`,"since_id_str":`) - fflib.WriteJsonString(buf, string(mj.SinceIDStr)) - buf.WriteByte('}') - return nil -} - -const ( - ffj_t_SearchMetadatabase = iota - ffj_t_SearchMetadatano_such_key - - ffj_t_SearchMetadata_CompletedIn - - ffj_t_SearchMetadata_Count - - ffj_t_SearchMetadata_MaxID - - ffj_t_SearchMetadata_MaxIDStr - - ffj_t_SearchMetadata_NextResults - - ffj_t_SearchMetadata_Query - - ffj_t_SearchMetadata_RefreshURL - - ffj_t_SearchMetadata_SinceID - - ffj_t_SearchMetadata_SinceIDStr -) - -var ffj_key_SearchMetadata_CompletedIn = []byte("completed_in") - -var ffj_key_SearchMetadata_Count = []byte("count") - -var ffj_key_SearchMetadata_MaxID = []byte("max_id") - -var ffj_key_SearchMetadata_MaxIDStr = []byte("max_id_str") - -var ffj_key_SearchMetadata_NextResults = []byte("next_results") - -var ffj_key_SearchMetadata_Query = []byte("query") - -var ffj_key_SearchMetadata_RefreshURL = []byte("refresh_url") - -var ffj_key_SearchMetadata_SinceID = []byte("since_id") - -var ffj_key_SearchMetadata_SinceIDStr = []byte("since_id_str") - -func (uj *SearchMetadata) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -func (uj *SearchMetadata) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error = nil - currentKey := ffj_t_SearchMetadatabase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffj_t_SearchMetadatano_such_key - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 'c': - - if bytes.Equal(ffj_key_SearchMetadata_CompletedIn, kn) { - currentKey = ffj_t_SearchMetadata_CompletedIn - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_SearchMetadata_Count, kn) { - currentKey = ffj_t_SearchMetadata_Count - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'm': - - if bytes.Equal(ffj_key_SearchMetadata_MaxID, kn) { - currentKey = ffj_t_SearchMetadata_MaxID - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_SearchMetadata_MaxIDStr, kn) { - currentKey = ffj_t_SearchMetadata_MaxIDStr - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'n': - - if bytes.Equal(ffj_key_SearchMetadata_NextResults, kn) { - currentKey = ffj_t_SearchMetadata_NextResults - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'q': - - if bytes.Equal(ffj_key_SearchMetadata_Query, kn) { - currentKey = ffj_t_SearchMetadata_Query - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'r': - - if bytes.Equal(ffj_key_SearchMetadata_RefreshURL, kn) { - currentKey = ffj_t_SearchMetadata_RefreshURL - state = fflib.FFParse_want_colon - goto mainparse - } - - case 's': - - if bytes.Equal(ffj_key_SearchMetadata_SinceID, kn) { - currentKey = ffj_t_SearchMetadata_SinceID - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_SearchMetadata_SinceIDStr, kn) { - currentKey = ffj_t_SearchMetadata_SinceIDStr - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.EqualFoldRight(ffj_key_SearchMetadata_SinceIDStr, kn) { - currentKey = ffj_t_SearchMetadata_SinceIDStr - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_SearchMetadata_SinceID, kn) { - currentKey = ffj_t_SearchMetadata_SinceID - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_SearchMetadata_RefreshURL, kn) { - currentKey = ffj_t_SearchMetadata_RefreshURL - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_SearchMetadata_Query, kn) { - currentKey = ffj_t_SearchMetadata_Query - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_SearchMetadata_NextResults, kn) { - currentKey = ffj_t_SearchMetadata_NextResults - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_SearchMetadata_MaxIDStr, kn) { - currentKey = ffj_t_SearchMetadata_MaxIDStr - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffj_key_SearchMetadata_MaxID, kn) { - currentKey = ffj_t_SearchMetadata_MaxID - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_SearchMetadata_Count, kn) { - currentKey = ffj_t_SearchMetadata_Count - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffj_key_SearchMetadata_CompletedIn, kn) { - currentKey = ffj_t_SearchMetadata_CompletedIn - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffj_t_SearchMetadatano_such_key - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffj_t_SearchMetadata_CompletedIn: - goto handle_CompletedIn - - case ffj_t_SearchMetadata_Count: - goto handle_Count - - case ffj_t_SearchMetadata_MaxID: - goto handle_MaxID - - case ffj_t_SearchMetadata_MaxIDStr: - goto handle_MaxIDStr - - case ffj_t_SearchMetadata_NextResults: - goto handle_NextResults - - case ffj_t_SearchMetadata_Query: - goto handle_Query - - case ffj_t_SearchMetadata_RefreshURL: - goto handle_RefreshURL - - case ffj_t_SearchMetadata_SinceID: - goto handle_SinceID - - case ffj_t_SearchMetadata_SinceIDStr: - goto handle_SinceIDStr - - case ffj_t_SearchMetadatano_such_key: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_CompletedIn: - - /* handler: uj.CompletedIn type=float64 kind=float64 quoted=false*/ - - { - if tok != fflib.FFTok_double && tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for float64", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseFloat(fs.Output.Bytes(), 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.CompletedIn = float64(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Count: - - /* handler: uj.Count type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.Count = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_MaxID: - - /* handler: uj.MaxID type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.MaxID = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_MaxIDStr: - - /* handler: uj.MaxIDStr type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.MaxIDStr = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_NextResults: - - /* handler: uj.NextResults type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.NextResults = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Query: - - /* handler: uj.Query type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.Query = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_RefreshURL: - - /* handler: uj.RefreshURL type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.RefreshURL = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_SinceID: - - /* handler: uj.SinceID type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.SinceID = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_SinceIDStr: - - /* handler: uj.SinceIDStr type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.SinceIDStr = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - return nil -} - -func (mj *Status) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if mj == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := mj.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} -func (mj *Status) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if mj == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - if mj.Contributors != nil { - buf.WriteString(`{"contributors":`) - fflib.WriteJsonString(buf, string(*mj.Contributors)) - } else { - buf.WriteString(`{"contributors":null`) - } - if mj.Coordinates != nil { - buf.WriteString(`,"coordinates":`) - fflib.WriteJsonString(buf, string(*mj.Coordinates)) - } else { - buf.WriteString(`,"coordinates":null`) - } - buf.WriteString(`,"created_at":`) - fflib.WriteJsonString(buf, string(mj.CreatedAt)) - buf.WriteString(`,"entities":`) - - { - - err = mj.Entities.MarshalJSONBuf(buf) - if err != nil { - return err - } - - } - if mj.Favorited { - buf.WriteString(`,"favorited":true`) - } else { - buf.WriteString(`,"favorited":false`) - } - if mj.Geo != nil { - buf.WriteString(`,"geo":`) - fflib.WriteJsonString(buf, string(*mj.Geo)) - } else { - buf.WriteString(`,"geo":null`) - } - buf.WriteString(`,"id":`) - fflib.FormatBits2(buf, uint64(mj.ID), 10, mj.ID < 0) - buf.WriteString(`,"id_str":`) - fflib.WriteJsonString(buf, string(mj.IDStr)) - if mj.InReplyToScreenName != nil { - buf.WriteString(`,"in_reply_to_screen_name":`) - fflib.WriteJsonString(buf, string(*mj.InReplyToScreenName)) - } else { - buf.WriteString(`,"in_reply_to_screen_name":null`) - } - if mj.InReplyToStatusID != nil { - buf.WriteString(`,"in_reply_to_status_id":`) - fflib.WriteJsonString(buf, string(*mj.InReplyToStatusID)) - } else { - buf.WriteString(`,"in_reply_to_status_id":null`) - } - if mj.InReplyToStatusIDStr != nil { - buf.WriteString(`,"in_reply_to_status_id_str":`) - fflib.WriteJsonString(buf, string(*mj.InReplyToStatusIDStr)) - } else { - buf.WriteString(`,"in_reply_to_status_id_str":null`) - } - if mj.InReplyToUserID != nil { - buf.WriteString(`,"in_reply_to_user_id":`) - fflib.WriteJsonString(buf, string(*mj.InReplyToUserID)) - } else { - buf.WriteString(`,"in_reply_to_user_id":null`) - } - if mj.InReplyToUserIDStr != nil { - buf.WriteString(`,"in_reply_to_user_id_str":`) - fflib.WriteJsonString(buf, string(*mj.InReplyToUserIDStr)) - } else { - buf.WriteString(`,"in_reply_to_user_id_str":null`) - } - buf.WriteString(`,"metadata":`) - - { - - err = mj.Metadata.MarshalJSONBuf(buf) - if err != nil { - return err - } - - } - if mj.Place != nil { - buf.WriteString(`,"place":`) - fflib.WriteJsonString(buf, string(*mj.Place)) - } else { - buf.WriteString(`,"place":null`) - } - buf.WriteString(`,"retweet_count":`) - fflib.FormatBits2(buf, uint64(mj.RetweetCount), 10, mj.RetweetCount < 0) - if mj.Retweeted { - buf.WriteString(`,"retweeted":true`) - } else { - buf.WriteString(`,"retweeted":false`) - } - buf.WriteString(`,"source":`) - fflib.WriteJsonString(buf, string(mj.Source)) - buf.WriteString(`,"text":`) - fflib.WriteJsonString(buf, string(mj.Text)) - if mj.Truncated { - buf.WriteString(`,"truncated":true`) - } else { - buf.WriteString(`,"truncated":false`) - } - buf.WriteString(`,"user":`) - - { - - err = mj.User.MarshalJSONBuf(buf) - if err != nil { - return err - } - - } - buf.WriteByte('}') - return nil -} - -const ( - ffj_t_Statusbase = iota - ffj_t_Statusno_such_key - - ffj_t_Status_Contributors - - ffj_t_Status_Coordinates - - ffj_t_Status_CreatedAt - - ffj_t_Status_Entities - - ffj_t_Status_Favorited - - ffj_t_Status_Geo - - ffj_t_Status_ID - - ffj_t_Status_IDStr - - ffj_t_Status_InReplyToScreenName - - ffj_t_Status_InReplyToStatusID - - ffj_t_Status_InReplyToStatusIDStr - - ffj_t_Status_InReplyToUserID - - ffj_t_Status_InReplyToUserIDStr - - ffj_t_Status_Metadata - - ffj_t_Status_Place - - ffj_t_Status_RetweetCount - - ffj_t_Status_Retweeted - - ffj_t_Status_Source - - ffj_t_Status_Text - - ffj_t_Status_Truncated - - ffj_t_Status_User -) - -var ffj_key_Status_Contributors = []byte("contributors") - -var ffj_key_Status_Coordinates = []byte("coordinates") - -var ffj_key_Status_CreatedAt = []byte("created_at") - -var ffj_key_Status_Entities = []byte("entities") - -var ffj_key_Status_Favorited = []byte("favorited") - -var ffj_key_Status_Geo = []byte("geo") - -var ffj_key_Status_ID = []byte("id") - -var ffj_key_Status_IDStr = []byte("id_str") - -var ffj_key_Status_InReplyToScreenName = []byte("in_reply_to_screen_name") - -var ffj_key_Status_InReplyToStatusID = []byte("in_reply_to_status_id") - -var ffj_key_Status_InReplyToStatusIDStr = []byte("in_reply_to_status_id_str") - -var ffj_key_Status_InReplyToUserID = []byte("in_reply_to_user_id") - -var ffj_key_Status_InReplyToUserIDStr = []byte("in_reply_to_user_id_str") - -var ffj_key_Status_Metadata = []byte("metadata") - -var ffj_key_Status_Place = []byte("place") - -var ffj_key_Status_RetweetCount = []byte("retweet_count") - -var ffj_key_Status_Retweeted = []byte("retweeted") - -var ffj_key_Status_Source = []byte("source") - -var ffj_key_Status_Text = []byte("text") - -var ffj_key_Status_Truncated = []byte("truncated") - -var ffj_key_Status_User = []byte("user") - -func (uj *Status) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -func (uj *Status) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error = nil - currentKey := ffj_t_Statusbase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffj_t_Statusno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 'c': - - if bytes.Equal(ffj_key_Status_Contributors, kn) { - currentKey = ffj_t_Status_Contributors - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_Status_Coordinates, kn) { - currentKey = ffj_t_Status_Coordinates - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_Status_CreatedAt, kn) { - currentKey = ffj_t_Status_CreatedAt - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'e': - - if bytes.Equal(ffj_key_Status_Entities, kn) { - currentKey = ffj_t_Status_Entities - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'f': - - if bytes.Equal(ffj_key_Status_Favorited, kn) { - currentKey = ffj_t_Status_Favorited - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'g': - - if bytes.Equal(ffj_key_Status_Geo, kn) { - currentKey = ffj_t_Status_Geo - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'i': - - if bytes.Equal(ffj_key_Status_ID, kn) { - currentKey = ffj_t_Status_ID - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_Status_IDStr, kn) { - currentKey = ffj_t_Status_IDStr - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_Status_InReplyToScreenName, kn) { - currentKey = ffj_t_Status_InReplyToScreenName - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_Status_InReplyToStatusID, kn) { - currentKey = ffj_t_Status_InReplyToStatusID - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_Status_InReplyToStatusIDStr, kn) { - currentKey = ffj_t_Status_InReplyToStatusIDStr - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_Status_InReplyToUserID, kn) { - currentKey = ffj_t_Status_InReplyToUserID - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_Status_InReplyToUserIDStr, kn) { - currentKey = ffj_t_Status_InReplyToUserIDStr - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'm': - - if bytes.Equal(ffj_key_Status_Metadata, kn) { - currentKey = ffj_t_Status_Metadata - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'p': - - if bytes.Equal(ffj_key_Status_Place, kn) { - currentKey = ffj_t_Status_Place - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'r': - - if bytes.Equal(ffj_key_Status_RetweetCount, kn) { - currentKey = ffj_t_Status_RetweetCount - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_Status_Retweeted, kn) { - currentKey = ffj_t_Status_Retweeted - state = fflib.FFParse_want_colon - goto mainparse - } - - case 's': - - if bytes.Equal(ffj_key_Status_Source, kn) { - currentKey = ffj_t_Status_Source - state = fflib.FFParse_want_colon - goto mainparse - } - - case 't': - - if bytes.Equal(ffj_key_Status_Text, kn) { - currentKey = ffj_t_Status_Text - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_Status_Truncated, kn) { - currentKey = ffj_t_Status_Truncated - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'u': - - if bytes.Equal(ffj_key_Status_User, kn) { - currentKey = ffj_t_Status_User - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.EqualFoldRight(ffj_key_Status_User, kn) { - currentKey = ffj_t_Status_User - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_Status_Truncated, kn) { - currentKey = ffj_t_Status_Truncated - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_Status_Text, kn) { - currentKey = ffj_t_Status_Text - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Status_Source, kn) { - currentKey = ffj_t_Status_Source - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_Status_Retweeted, kn) { - currentKey = ffj_t_Status_Retweeted - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffj_key_Status_RetweetCount, kn) { - currentKey = ffj_t_Status_RetweetCount - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_Status_Place, kn) { - currentKey = ffj_t_Status_Place - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_Status_Metadata, kn) { - currentKey = ffj_t_Status_Metadata - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Status_InReplyToUserIDStr, kn) { - currentKey = ffj_t_Status_InReplyToUserIDStr - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Status_InReplyToUserID, kn) { - currentKey = ffj_t_Status_InReplyToUserID - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Status_InReplyToStatusIDStr, kn) { - currentKey = ffj_t_Status_InReplyToStatusIDStr - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Status_InReplyToStatusID, kn) { - currentKey = ffj_t_Status_InReplyToStatusID - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Status_InReplyToScreenName, kn) { - currentKey = ffj_t_Status_InReplyToScreenName - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Status_IDStr, kn) { - currentKey = ffj_t_Status_IDStr - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_Status_ID, kn) { - currentKey = ffj_t_Status_ID - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_Status_Geo, kn) { - currentKey = ffj_t_Status_Geo - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_Status_Favorited, kn) { - currentKey = ffj_t_Status_Favorited - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Status_Entities, kn) { - currentKey = ffj_t_Status_Entities - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffj_key_Status_CreatedAt, kn) { - currentKey = ffj_t_Status_CreatedAt - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Status_Coordinates, kn) { - currentKey = ffj_t_Status_Coordinates - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_Status_Contributors, kn) { - currentKey = ffj_t_Status_Contributors - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffj_t_Statusno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffj_t_Status_Contributors: - goto handle_Contributors - - case ffj_t_Status_Coordinates: - goto handle_Coordinates - - case ffj_t_Status_CreatedAt: - goto handle_CreatedAt - - case ffj_t_Status_Entities: - goto handle_Entities - - case ffj_t_Status_Favorited: - goto handle_Favorited - - case ffj_t_Status_Geo: - goto handle_Geo - - case ffj_t_Status_ID: - goto handle_ID - - case ffj_t_Status_IDStr: - goto handle_IDStr - - case ffj_t_Status_InReplyToScreenName: - goto handle_InReplyToScreenName - - case ffj_t_Status_InReplyToStatusID: - goto handle_InReplyToStatusID - - case ffj_t_Status_InReplyToStatusIDStr: - goto handle_InReplyToStatusIDStr - - case ffj_t_Status_InReplyToUserID: - goto handle_InReplyToUserID - - case ffj_t_Status_InReplyToUserIDStr: - goto handle_InReplyToUserIDStr - - case ffj_t_Status_Metadata: - goto handle_Metadata - - case ffj_t_Status_Place: - goto handle_Place - - case ffj_t_Status_RetweetCount: - goto handle_RetweetCount - - case ffj_t_Status_Retweeted: - goto handle_Retweeted - - case ffj_t_Status_Source: - goto handle_Source - - case ffj_t_Status_Text: - goto handle_Text - - case ffj_t_Status_Truncated: - goto handle_Truncated - - case ffj_t_Status_User: - goto handle_User - - case ffj_t_Statusno_such_key: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_Contributors: - - /* handler: uj.Contributors type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.Contributors = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.Contributors = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Coordinates: - - /* handler: uj.Coordinates type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.Coordinates = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.Coordinates = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_CreatedAt: - - /* handler: uj.CreatedAt type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.CreatedAt = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Entities: - - /* handler: uj.Entities type=benchmark.Entities kind=struct quoted=false*/ - - { - if tok == fflib.FFTok_null { - - state = fflib.FFParse_after_value - goto mainparse - } - - err = uj.Entities.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) - if err != nil { - return err - } - state = fflib.FFParse_after_value - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Favorited: - - /* handler: uj.Favorited type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.Favorited = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.Favorited = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Geo: - - /* handler: uj.Geo type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.Geo = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.Geo = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ID: - - /* handler: uj.ID type=int64 kind=int64 quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int64", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.ID = int64(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_IDStr: - - /* handler: uj.IDStr type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.IDStr = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_InReplyToScreenName: - - /* handler: uj.InReplyToScreenName type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.InReplyToScreenName = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.InReplyToScreenName = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_InReplyToStatusID: - - /* handler: uj.InReplyToStatusID type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.InReplyToStatusID = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.InReplyToStatusID = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_InReplyToStatusIDStr: - - /* handler: uj.InReplyToStatusIDStr type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.InReplyToStatusIDStr = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.InReplyToStatusIDStr = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_InReplyToUserID: - - /* handler: uj.InReplyToUserID type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.InReplyToUserID = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.InReplyToUserID = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_InReplyToUserIDStr: - - /* handler: uj.InReplyToUserIDStr type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.InReplyToUserIDStr = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.InReplyToUserIDStr = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Metadata: - - /* handler: uj.Metadata type=benchmark.StatusMetadata kind=struct quoted=false*/ - - { - if tok == fflib.FFTok_null { - - state = fflib.FFParse_after_value - goto mainparse - } - - err = uj.Metadata.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) - if err != nil { - return err - } - state = fflib.FFParse_after_value - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Place: - - /* handler: uj.Place type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.Place = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.Place = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_RetweetCount: - - /* handler: uj.RetweetCount type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.RetweetCount = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Retweeted: - - /* handler: uj.Retweeted type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.Retweeted = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.Retweeted = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Source: - - /* handler: uj.Source type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.Source = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Text: - - /* handler: uj.Text type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.Text = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Truncated: - - /* handler: uj.Truncated type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.Truncated = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.Truncated = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_User: - - /* handler: uj.User type=benchmark.User kind=struct quoted=false*/ - - { - if tok == fflib.FFTok_null { - - state = fflib.FFParse_after_value - goto mainparse - } - - err = uj.User.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) - if err != nil { - return err - } - state = fflib.FFParse_after_value - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - return nil -} - -func (mj *StatusMetadata) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if mj == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := mj.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} -func (mj *StatusMetadata) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if mj == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - buf.WriteString(`{"iso_language_code":`) - fflib.WriteJsonString(buf, string(mj.IsoLanguageCode)) - buf.WriteString(`,"result_type":`) - fflib.WriteJsonString(buf, string(mj.ResultType)) - buf.WriteByte('}') - return nil -} - -const ( - ffj_t_StatusMetadatabase = iota - ffj_t_StatusMetadatano_such_key - - ffj_t_StatusMetadata_IsoLanguageCode - - ffj_t_StatusMetadata_ResultType -) - -var ffj_key_StatusMetadata_IsoLanguageCode = []byte("iso_language_code") - -var ffj_key_StatusMetadata_ResultType = []byte("result_type") - -func (uj *StatusMetadata) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -func (uj *StatusMetadata) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error = nil - currentKey := ffj_t_StatusMetadatabase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffj_t_StatusMetadatano_such_key - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 'i': - - if bytes.Equal(ffj_key_StatusMetadata_IsoLanguageCode, kn) { - currentKey = ffj_t_StatusMetadata_IsoLanguageCode - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'r': - - if bytes.Equal(ffj_key_StatusMetadata_ResultType, kn) { - currentKey = ffj_t_StatusMetadata_ResultType - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.EqualFoldRight(ffj_key_StatusMetadata_ResultType, kn) { - currentKey = ffj_t_StatusMetadata_ResultType - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_StatusMetadata_IsoLanguageCode, kn) { - currentKey = ffj_t_StatusMetadata_IsoLanguageCode - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffj_t_StatusMetadatano_such_key - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffj_t_StatusMetadata_IsoLanguageCode: - goto handle_IsoLanguageCode - - case ffj_t_StatusMetadata_ResultType: - goto handle_ResultType - - case ffj_t_StatusMetadatano_such_key: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_IsoLanguageCode: - - /* handler: uj.IsoLanguageCode type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.IsoLanguageCode = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ResultType: - - /* handler: uj.ResultType type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.ResultType = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - return nil -} - -func (mj *URL) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if mj == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := mj.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} -func (mj *URL) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if mj == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - if mj.ExpandedURL != nil { - buf.WriteString(`{"expanded_url":`) - fflib.WriteJsonString(buf, string(*mj.ExpandedURL)) - } else { - buf.WriteString(`{"expanded_url":null`) - } - buf.WriteString(`,"indices":`) - if mj.Indices != nil { - buf.WriteString(`[`) - for i, v := range mj.Indices { - if i != 0 { - buf.WriteString(`,`) - } - fflib.FormatBits2(buf, uint64(v), 10, v < 0) - } - buf.WriteString(`]`) - } else { - buf.WriteString(`null`) - } - buf.WriteString(`,"url":`) - fflib.WriteJsonString(buf, string(mj.URL)) - buf.WriteByte('}') - return nil -} - -const ( - ffj_t_URLbase = iota - ffj_t_URLno_such_key - - ffj_t_URL_ExpandedURL - - ffj_t_URL_Indices - - ffj_t_URL_URL -) - -var ffj_key_URL_ExpandedURL = []byte("expanded_url") - -var ffj_key_URL_Indices = []byte("indices") - -var ffj_key_URL_URL = []byte("url") - -func (uj *URL) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -func (uj *URL) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error = nil - currentKey := ffj_t_URLbase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffj_t_URLno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 'e': - - if bytes.Equal(ffj_key_URL_ExpandedURL, kn) { - currentKey = ffj_t_URL_ExpandedURL - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'i': - - if bytes.Equal(ffj_key_URL_Indices, kn) { - currentKey = ffj_t_URL_Indices - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'u': - - if bytes.Equal(ffj_key_URL_URL, kn) { - currentKey = ffj_t_URL_URL - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.SimpleLetterEqualFold(ffj_key_URL_URL, kn) { - currentKey = ffj_t_URL_URL - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_URL_Indices, kn) { - currentKey = ffj_t_URL_Indices - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffj_key_URL_ExpandedURL, kn) { - currentKey = ffj_t_URL_ExpandedURL - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffj_t_URLno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffj_t_URL_ExpandedURL: - goto handle_ExpandedURL - - case ffj_t_URL_Indices: - goto handle_Indices - - case ffj_t_URL_URL: - goto handle_URL - - case ffj_t_URLno_such_key: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_ExpandedURL: - - /* handler: uj.ExpandedURL type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.ExpandedURL = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.ExpandedURL = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Indices: - - /* handler: uj.Indices type=[]int kind=slice quoted=false*/ - - { - - { - if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) - } - } - - if tok == fflib.FFTok_null { - uj.Indices = nil - } else { - - uj.Indices = make([]int, 0) - - wantVal := true - - for { - - var tmp_uj__Indices int - - tok = fs.Scan() - if tok == fflib.FFTok_error { - goto tokerror - } - if tok == fflib.FFTok_right_brace { - break - } - - if tok == fflib.FFTok_comma { - if wantVal == true { - // TODO(pquerna): this isn't an ideal error message, this handles - // things like [,,,] as an array value. - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) - } - continue - } else { - wantVal = true - } - - /* handler: tmp_uj__Indices type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - tmp_uj__Indices = int(tval) - - } - } - - uj.Indices = append(uj.Indices, tmp_uj__Indices) - wantVal = false - } - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_URL: - - /* handler: uj.URL type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.URL = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - return nil -} - -func (mj *User) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if mj == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := mj.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} -func (mj *User) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if mj == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - if mj.ContributorsEnabled { - buf.WriteString(`{"contributors_enabled":true`) - } else { - buf.WriteString(`{"contributors_enabled":false`) - } - buf.WriteString(`,"created_at":`) - fflib.WriteJsonString(buf, string(mj.CreatedAt)) - if mj.DefaultProfile { - buf.WriteString(`,"default_profile":true`) - } else { - buf.WriteString(`,"default_profile":false`) - } - if mj.DefaultProfileImage { - buf.WriteString(`,"default_profile_image":true`) - } else { - buf.WriteString(`,"default_profile_image":false`) - } - buf.WriteString(`,"description":`) - fflib.WriteJsonString(buf, string(mj.Description)) - buf.WriteString(`,"entities":`) - - { - - err = mj.Entities.MarshalJSONBuf(buf) - if err != nil { - return err - } - - } - buf.WriteString(`,"favourites_count":`) - fflib.FormatBits2(buf, uint64(mj.FavouritesCount), 10, mj.FavouritesCount < 0) - if mj.FollowRequestSent != nil { - buf.WriteString(`,"follow_request_sent":`) - fflib.WriteJsonString(buf, string(*mj.FollowRequestSent)) - } else { - buf.WriteString(`,"follow_request_sent":null`) - } - buf.WriteString(`,"followers_count":`) - fflib.FormatBits2(buf, uint64(mj.FollowersCount), 10, mj.FollowersCount < 0) - if mj.Following != nil { - buf.WriteString(`,"following":`) - fflib.WriteJsonString(buf, string(*mj.Following)) - } else { - buf.WriteString(`,"following":null`) - } - buf.WriteString(`,"friends_count":`) - fflib.FormatBits2(buf, uint64(mj.FriendsCount), 10, mj.FriendsCount < 0) - if mj.GeoEnabled { - buf.WriteString(`,"geo_enabled":true`) - } else { - buf.WriteString(`,"geo_enabled":false`) - } - buf.WriteString(`,"id":`) - fflib.FormatBits2(buf, uint64(mj.ID), 10, mj.ID < 0) - buf.WriteString(`,"id_str":`) - fflib.WriteJsonString(buf, string(mj.IDStr)) - if mj.IsTranslator { - buf.WriteString(`,"is_translator":true`) - } else { - buf.WriteString(`,"is_translator":false`) - } - buf.WriteString(`,"lang":`) - fflib.WriteJsonString(buf, string(mj.Lang)) - buf.WriteString(`,"listed_count":`) - fflib.FormatBits2(buf, uint64(mj.ListedCount), 10, mj.ListedCount < 0) - buf.WriteString(`,"location":`) - fflib.WriteJsonString(buf, string(mj.Location)) - buf.WriteString(`,"name":`) - fflib.WriteJsonString(buf, string(mj.Name)) - if mj.Notifications != nil { - buf.WriteString(`,"notifications":`) - fflib.WriteJsonString(buf, string(*mj.Notifications)) - } else { - buf.WriteString(`,"notifications":null`) - } - buf.WriteString(`,"profile_background_color":`) - fflib.WriteJsonString(buf, string(mj.ProfileBackgroundColor)) - buf.WriteString(`,"profile_background_image_url":`) - fflib.WriteJsonString(buf, string(mj.ProfileBackgroundImageURL)) - buf.WriteString(`,"profile_background_image_url_https":`) - fflib.WriteJsonString(buf, string(mj.ProfileBackgroundImageURLHTTPS)) - if mj.ProfileBackgroundTile { - buf.WriteString(`,"profile_background_tile":true`) - } else { - buf.WriteString(`,"profile_background_tile":false`) - } - buf.WriteString(`,"profile_image_url":`) - fflib.WriteJsonString(buf, string(mj.ProfileImageURL)) - buf.WriteString(`,"profile_image_url_https":`) - fflib.WriteJsonString(buf, string(mj.ProfileImageURLHTTPS)) - buf.WriteString(`,"profile_link_color":`) - fflib.WriteJsonString(buf, string(mj.ProfileLinkColor)) - buf.WriteString(`,"profile_sidebar_border_color":`) - fflib.WriteJsonString(buf, string(mj.ProfileSidebarBorderColor)) - buf.WriteString(`,"profile_sidebar_fill_color":`) - fflib.WriteJsonString(buf, string(mj.ProfileSidebarFillColor)) - buf.WriteString(`,"profile_text_color":`) - fflib.WriteJsonString(buf, string(mj.ProfileTextColor)) - if mj.ProfileUseBackgroundImage { - buf.WriteString(`,"profile_use_background_image":true`) - } else { - buf.WriteString(`,"profile_use_background_image":false`) - } - if mj.Protected { - buf.WriteString(`,"protected":true`) - } else { - buf.WriteString(`,"protected":false`) - } - buf.WriteString(`,"screen_name":`) - fflib.WriteJsonString(buf, string(mj.ScreenName)) - if mj.ShowAllInlineMedia { - buf.WriteString(`,"show_all_inline_media":true`) - } else { - buf.WriteString(`,"show_all_inline_media":false`) - } - buf.WriteString(`,"statuses_count":`) - fflib.FormatBits2(buf, uint64(mj.StatusesCount), 10, mj.StatusesCount < 0) - buf.WriteString(`,"time_zone":`) - fflib.WriteJsonString(buf, string(mj.TimeZone)) - if mj.URL != nil { - buf.WriteString(`,"url":`) - fflib.WriteJsonString(buf, string(*mj.URL)) - } else { - buf.WriteString(`,"url":null`) - } - buf.WriteString(`,"utc_offset":`) - fflib.FormatBits2(buf, uint64(mj.UtcOffset), 10, mj.UtcOffset < 0) - if mj.Verified { - buf.WriteString(`,"verified":true`) - } else { - buf.WriteString(`,"verified":false`) - } - buf.WriteByte('}') - return nil -} - -const ( - ffj_t_Userbase = iota - ffj_t_Userno_such_key - - ffj_t_User_ContributorsEnabled - - ffj_t_User_CreatedAt - - ffj_t_User_DefaultProfile - - ffj_t_User_DefaultProfileImage - - ffj_t_User_Description - - ffj_t_User_Entities - - ffj_t_User_FavouritesCount - - ffj_t_User_FollowRequestSent - - ffj_t_User_FollowersCount - - ffj_t_User_Following - - ffj_t_User_FriendsCount - - ffj_t_User_GeoEnabled - - ffj_t_User_ID - - ffj_t_User_IDStr - - ffj_t_User_IsTranslator - - ffj_t_User_Lang - - ffj_t_User_ListedCount - - ffj_t_User_Location - - ffj_t_User_Name - - ffj_t_User_Notifications - - ffj_t_User_ProfileBackgroundColor - - ffj_t_User_ProfileBackgroundImageURL - - ffj_t_User_ProfileBackgroundImageURLHTTPS - - ffj_t_User_ProfileBackgroundTile - - ffj_t_User_ProfileImageURL - - ffj_t_User_ProfileImageURLHTTPS - - ffj_t_User_ProfileLinkColor - - ffj_t_User_ProfileSidebarBorderColor - - ffj_t_User_ProfileSidebarFillColor - - ffj_t_User_ProfileTextColor - - ffj_t_User_ProfileUseBackgroundImage - - ffj_t_User_Protected - - ffj_t_User_ScreenName - - ffj_t_User_ShowAllInlineMedia - - ffj_t_User_StatusesCount - - ffj_t_User_TimeZone - - ffj_t_User_URL - - ffj_t_User_UtcOffset - - ffj_t_User_Verified -) - -var ffj_key_User_ContributorsEnabled = []byte("contributors_enabled") - -var ffj_key_User_CreatedAt = []byte("created_at") - -var ffj_key_User_DefaultProfile = []byte("default_profile") - -var ffj_key_User_DefaultProfileImage = []byte("default_profile_image") - -var ffj_key_User_Description = []byte("description") - -var ffj_key_User_Entities = []byte("entities") - -var ffj_key_User_FavouritesCount = []byte("favourites_count") - -var ffj_key_User_FollowRequestSent = []byte("follow_request_sent") - -var ffj_key_User_FollowersCount = []byte("followers_count") - -var ffj_key_User_Following = []byte("following") - -var ffj_key_User_FriendsCount = []byte("friends_count") - -var ffj_key_User_GeoEnabled = []byte("geo_enabled") - -var ffj_key_User_ID = []byte("id") - -var ffj_key_User_IDStr = []byte("id_str") - -var ffj_key_User_IsTranslator = []byte("is_translator") - -var ffj_key_User_Lang = []byte("lang") - -var ffj_key_User_ListedCount = []byte("listed_count") - -var ffj_key_User_Location = []byte("location") - -var ffj_key_User_Name = []byte("name") - -var ffj_key_User_Notifications = []byte("notifications") - -var ffj_key_User_ProfileBackgroundColor = []byte("profile_background_color") - -var ffj_key_User_ProfileBackgroundImageURL = []byte("profile_background_image_url") - -var ffj_key_User_ProfileBackgroundImageURLHTTPS = []byte("profile_background_image_url_https") - -var ffj_key_User_ProfileBackgroundTile = []byte("profile_background_tile") - -var ffj_key_User_ProfileImageURL = []byte("profile_image_url") - -var ffj_key_User_ProfileImageURLHTTPS = []byte("profile_image_url_https") - -var ffj_key_User_ProfileLinkColor = []byte("profile_link_color") - -var ffj_key_User_ProfileSidebarBorderColor = []byte("profile_sidebar_border_color") - -var ffj_key_User_ProfileSidebarFillColor = []byte("profile_sidebar_fill_color") - -var ffj_key_User_ProfileTextColor = []byte("profile_text_color") - -var ffj_key_User_ProfileUseBackgroundImage = []byte("profile_use_background_image") - -var ffj_key_User_Protected = []byte("protected") - -var ffj_key_User_ScreenName = []byte("screen_name") - -var ffj_key_User_ShowAllInlineMedia = []byte("show_all_inline_media") - -var ffj_key_User_StatusesCount = []byte("statuses_count") - -var ffj_key_User_TimeZone = []byte("time_zone") - -var ffj_key_User_URL = []byte("url") - -var ffj_key_User_UtcOffset = []byte("utc_offset") - -var ffj_key_User_Verified = []byte("verified") - -func (uj *User) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -func (uj *User) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error = nil - currentKey := ffj_t_Userbase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffj_t_Userno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 'c': - - if bytes.Equal(ffj_key_User_ContributorsEnabled, kn) { - currentKey = ffj_t_User_ContributorsEnabled - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_CreatedAt, kn) { - currentKey = ffj_t_User_CreatedAt - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'd': - - if bytes.Equal(ffj_key_User_DefaultProfile, kn) { - currentKey = ffj_t_User_DefaultProfile - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_DefaultProfileImage, kn) { - currentKey = ffj_t_User_DefaultProfileImage - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_Description, kn) { - currentKey = ffj_t_User_Description - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'e': - - if bytes.Equal(ffj_key_User_Entities, kn) { - currentKey = ffj_t_User_Entities - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'f': - - if bytes.Equal(ffj_key_User_FavouritesCount, kn) { - currentKey = ffj_t_User_FavouritesCount - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_FollowRequestSent, kn) { - currentKey = ffj_t_User_FollowRequestSent - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_FollowersCount, kn) { - currentKey = ffj_t_User_FollowersCount - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_Following, kn) { - currentKey = ffj_t_User_Following - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_FriendsCount, kn) { - currentKey = ffj_t_User_FriendsCount - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'g': - - if bytes.Equal(ffj_key_User_GeoEnabled, kn) { - currentKey = ffj_t_User_GeoEnabled - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'i': - - if bytes.Equal(ffj_key_User_ID, kn) { - currentKey = ffj_t_User_ID - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_IDStr, kn) { - currentKey = ffj_t_User_IDStr - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_IsTranslator, kn) { - currentKey = ffj_t_User_IsTranslator - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'l': - - if bytes.Equal(ffj_key_User_Lang, kn) { - currentKey = ffj_t_User_Lang - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_ListedCount, kn) { - currentKey = ffj_t_User_ListedCount - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_Location, kn) { - currentKey = ffj_t_User_Location - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'n': - - if bytes.Equal(ffj_key_User_Name, kn) { - currentKey = ffj_t_User_Name - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_Notifications, kn) { - currentKey = ffj_t_User_Notifications - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'p': - - if bytes.Equal(ffj_key_User_ProfileBackgroundColor, kn) { - currentKey = ffj_t_User_ProfileBackgroundColor - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_ProfileBackgroundImageURL, kn) { - currentKey = ffj_t_User_ProfileBackgroundImageURL - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_ProfileBackgroundImageURLHTTPS, kn) { - currentKey = ffj_t_User_ProfileBackgroundImageURLHTTPS - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_ProfileBackgroundTile, kn) { - currentKey = ffj_t_User_ProfileBackgroundTile - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_ProfileImageURL, kn) { - currentKey = ffj_t_User_ProfileImageURL - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_ProfileImageURLHTTPS, kn) { - currentKey = ffj_t_User_ProfileImageURLHTTPS - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_ProfileLinkColor, kn) { - currentKey = ffj_t_User_ProfileLinkColor - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_ProfileSidebarBorderColor, kn) { - currentKey = ffj_t_User_ProfileSidebarBorderColor - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_ProfileSidebarFillColor, kn) { - currentKey = ffj_t_User_ProfileSidebarFillColor - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_ProfileTextColor, kn) { - currentKey = ffj_t_User_ProfileTextColor - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_ProfileUseBackgroundImage, kn) { - currentKey = ffj_t_User_ProfileUseBackgroundImage - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_Protected, kn) { - currentKey = ffj_t_User_Protected - state = fflib.FFParse_want_colon - goto mainparse - } - - case 's': - - if bytes.Equal(ffj_key_User_ScreenName, kn) { - currentKey = ffj_t_User_ScreenName - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_ShowAllInlineMedia, kn) { - currentKey = ffj_t_User_ShowAllInlineMedia - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_StatusesCount, kn) { - currentKey = ffj_t_User_StatusesCount - state = fflib.FFParse_want_colon - goto mainparse - } - - case 't': - - if bytes.Equal(ffj_key_User_TimeZone, kn) { - currentKey = ffj_t_User_TimeZone - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'u': - - if bytes.Equal(ffj_key_User_URL, kn) { - currentKey = ffj_t_User_URL - state = fflib.FFParse_want_colon - goto mainparse - - } else if bytes.Equal(ffj_key_User_UtcOffset, kn) { - currentKey = ffj_t_User_UtcOffset - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'v': - - if bytes.Equal(ffj_key_User_Verified, kn) { - currentKey = ffj_t_User_Verified - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.SimpleLetterEqualFold(ffj_key_User_Verified, kn) { - currentKey = ffj_t_User_Verified - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_UtcOffset, kn) { - currentKey = ffj_t_User_UtcOffset - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_User_URL, kn) { - currentKey = ffj_t_User_URL - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffj_key_User_TimeZone, kn) { - currentKey = ffj_t_User_TimeZone - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_StatusesCount, kn) { - currentKey = ffj_t_User_StatusesCount - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ShowAllInlineMedia, kn) { - currentKey = ffj_t_User_ShowAllInlineMedia - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ScreenName, kn) { - currentKey = ffj_t_User_ScreenName - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_User_Protected, kn) { - currentKey = ffj_t_User_Protected - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ProfileUseBackgroundImage, kn) { - currentKey = ffj_t_User_ProfileUseBackgroundImage - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffj_key_User_ProfileTextColor, kn) { - currentKey = ffj_t_User_ProfileTextColor - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ProfileSidebarFillColor, kn) { - currentKey = ffj_t_User_ProfileSidebarFillColor - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ProfileSidebarBorderColor, kn) { - currentKey = ffj_t_User_ProfileSidebarBorderColor - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ProfileLinkColor, kn) { - currentKey = ffj_t_User_ProfileLinkColor - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ProfileImageURLHTTPS, kn) { - currentKey = ffj_t_User_ProfileImageURLHTTPS - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffj_key_User_ProfileImageURL, kn) { - currentKey = ffj_t_User_ProfileImageURL - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ProfileBackgroundTile, kn) { - currentKey = ffj_t_User_ProfileBackgroundTile - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ProfileBackgroundImageURLHTTPS, kn) { - currentKey = ffj_t_User_ProfileBackgroundImageURLHTTPS - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ProfileBackgroundImageURL, kn) { - currentKey = ffj_t_User_ProfileBackgroundImageURL - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ProfileBackgroundColor, kn) { - currentKey = ffj_t_User_ProfileBackgroundColor - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_Notifications, kn) { - currentKey = ffj_t_User_Notifications - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_User_Name, kn) { - currentKey = ffj_t_User_Name - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_User_Location, kn) { - currentKey = ffj_t_User_Location - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ListedCount, kn) { - currentKey = ffj_t_User_ListedCount - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_User_Lang, kn) { - currentKey = ffj_t_User_Lang - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_IsTranslator, kn) { - currentKey = ffj_t_User_IsTranslator - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_IDStr, kn) { - currentKey = ffj_t_User_IDStr - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_User_ID, kn) { - currentKey = ffj_t_User_ID - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffj_key_User_GeoEnabled, kn) { - currentKey = ffj_t_User_GeoEnabled - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_FriendsCount, kn) { - currentKey = ffj_t_User_FriendsCount - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.SimpleLetterEqualFold(ffj_key_User_Following, kn) { - currentKey = ffj_t_User_Following - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_FollowersCount, kn) { - currentKey = ffj_t_User_FollowersCount - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_FollowRequestSent, kn) { - currentKey = ffj_t_User_FollowRequestSent - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_FavouritesCount, kn) { - currentKey = ffj_t_User_FavouritesCount - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_Entities, kn) { - currentKey = ffj_t_User_Entities - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_Description, kn) { - currentKey = ffj_t_User_Description - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffj_key_User_DefaultProfileImage, kn) { - currentKey = ffj_t_User_DefaultProfileImage - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffj_key_User_DefaultProfile, kn) { - currentKey = ffj_t_User_DefaultProfile - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.AsciiEqualFold(ffj_key_User_CreatedAt, kn) { - currentKey = ffj_t_User_CreatedAt - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_User_ContributorsEnabled, kn) { - currentKey = ffj_t_User_ContributorsEnabled - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffj_t_Userno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffj_t_User_ContributorsEnabled: - goto handle_ContributorsEnabled - - case ffj_t_User_CreatedAt: - goto handle_CreatedAt - - case ffj_t_User_DefaultProfile: - goto handle_DefaultProfile - - case ffj_t_User_DefaultProfileImage: - goto handle_DefaultProfileImage - - case ffj_t_User_Description: - goto handle_Description - - case ffj_t_User_Entities: - goto handle_Entities - - case ffj_t_User_FavouritesCount: - goto handle_FavouritesCount - - case ffj_t_User_FollowRequestSent: - goto handle_FollowRequestSent - - case ffj_t_User_FollowersCount: - goto handle_FollowersCount - - case ffj_t_User_Following: - goto handle_Following - - case ffj_t_User_FriendsCount: - goto handle_FriendsCount - - case ffj_t_User_GeoEnabled: - goto handle_GeoEnabled - - case ffj_t_User_ID: - goto handle_ID - - case ffj_t_User_IDStr: - goto handle_IDStr - - case ffj_t_User_IsTranslator: - goto handle_IsTranslator - - case ffj_t_User_Lang: - goto handle_Lang - - case ffj_t_User_ListedCount: - goto handle_ListedCount - - case ffj_t_User_Location: - goto handle_Location - - case ffj_t_User_Name: - goto handle_Name - - case ffj_t_User_Notifications: - goto handle_Notifications - - case ffj_t_User_ProfileBackgroundColor: - goto handle_ProfileBackgroundColor - - case ffj_t_User_ProfileBackgroundImageURL: - goto handle_ProfileBackgroundImageURL - - case ffj_t_User_ProfileBackgroundImageURLHTTPS: - goto handle_ProfileBackgroundImageURLHTTPS - - case ffj_t_User_ProfileBackgroundTile: - goto handle_ProfileBackgroundTile - - case ffj_t_User_ProfileImageURL: - goto handle_ProfileImageURL - - case ffj_t_User_ProfileImageURLHTTPS: - goto handle_ProfileImageURLHTTPS - - case ffj_t_User_ProfileLinkColor: - goto handle_ProfileLinkColor - - case ffj_t_User_ProfileSidebarBorderColor: - goto handle_ProfileSidebarBorderColor - - case ffj_t_User_ProfileSidebarFillColor: - goto handle_ProfileSidebarFillColor - - case ffj_t_User_ProfileTextColor: - goto handle_ProfileTextColor - - case ffj_t_User_ProfileUseBackgroundImage: - goto handle_ProfileUseBackgroundImage - - case ffj_t_User_Protected: - goto handle_Protected - - case ffj_t_User_ScreenName: - goto handle_ScreenName - - case ffj_t_User_ShowAllInlineMedia: - goto handle_ShowAllInlineMedia - - case ffj_t_User_StatusesCount: - goto handle_StatusesCount - - case ffj_t_User_TimeZone: - goto handle_TimeZone - - case ffj_t_User_URL: - goto handle_URL - - case ffj_t_User_UtcOffset: - goto handle_UtcOffset - - case ffj_t_User_Verified: - goto handle_Verified - - case ffj_t_Userno_such_key: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_ContributorsEnabled: - - /* handler: uj.ContributorsEnabled type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.ContributorsEnabled = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.ContributorsEnabled = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_CreatedAt: - - /* handler: uj.CreatedAt type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.CreatedAt = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_DefaultProfile: - - /* handler: uj.DefaultProfile type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.DefaultProfile = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.DefaultProfile = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_DefaultProfileImage: - - /* handler: uj.DefaultProfileImage type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.DefaultProfileImage = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.DefaultProfileImage = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Description: - - /* handler: uj.Description type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.Description = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Entities: - - /* handler: uj.Entities type=benchmark.UserEntities kind=struct quoted=false*/ - - { - if tok == fflib.FFTok_null { - - state = fflib.FFParse_after_value - goto mainparse - } - - err = uj.Entities.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) - if err != nil { - return err - } - state = fflib.FFParse_after_value - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_FavouritesCount: - - /* handler: uj.FavouritesCount type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.FavouritesCount = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_FollowRequestSent: - - /* handler: uj.FollowRequestSent type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.FollowRequestSent = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.FollowRequestSent = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_FollowersCount: - - /* handler: uj.FollowersCount type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.FollowersCount = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Following: - - /* handler: uj.Following type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.Following = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.Following = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_FriendsCount: - - /* handler: uj.FriendsCount type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.FriendsCount = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_GeoEnabled: - - /* handler: uj.GeoEnabled type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.GeoEnabled = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.GeoEnabled = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ID: - - /* handler: uj.ID type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.ID = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_IDStr: - - /* handler: uj.IDStr type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.IDStr = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_IsTranslator: - - /* handler: uj.IsTranslator type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.IsTranslator = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.IsTranslator = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Lang: - - /* handler: uj.Lang type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.Lang = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ListedCount: - - /* handler: uj.ListedCount type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.ListedCount = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Location: - - /* handler: uj.Location type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.Location = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Name: - - /* handler: uj.Name type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.Name = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Notifications: - - /* handler: uj.Notifications type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.Notifications = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.Notifications = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProfileBackgroundColor: - - /* handler: uj.ProfileBackgroundColor type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.ProfileBackgroundColor = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProfileBackgroundImageURL: - - /* handler: uj.ProfileBackgroundImageURL type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.ProfileBackgroundImageURL = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProfileBackgroundImageURLHTTPS: - - /* handler: uj.ProfileBackgroundImageURLHTTPS type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.ProfileBackgroundImageURLHTTPS = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProfileBackgroundTile: - - /* handler: uj.ProfileBackgroundTile type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.ProfileBackgroundTile = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.ProfileBackgroundTile = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProfileImageURL: - - /* handler: uj.ProfileImageURL type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.ProfileImageURL = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProfileImageURLHTTPS: - - /* handler: uj.ProfileImageURLHTTPS type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.ProfileImageURLHTTPS = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProfileLinkColor: - - /* handler: uj.ProfileLinkColor type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.ProfileLinkColor = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProfileSidebarBorderColor: - - /* handler: uj.ProfileSidebarBorderColor type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.ProfileSidebarBorderColor = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProfileSidebarFillColor: - - /* handler: uj.ProfileSidebarFillColor type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.ProfileSidebarFillColor = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProfileTextColor: - - /* handler: uj.ProfileTextColor type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.ProfileTextColor = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ProfileUseBackgroundImage: - - /* handler: uj.ProfileUseBackgroundImage type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.ProfileUseBackgroundImage = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.ProfileUseBackgroundImage = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Protected: - - /* handler: uj.Protected type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.Protected = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.Protected = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ScreenName: - - /* handler: uj.ScreenName type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.ScreenName = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_ShowAllInlineMedia: - - /* handler: uj.ShowAllInlineMedia type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.ShowAllInlineMedia = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.ShowAllInlineMedia = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_StatusesCount: - - /* handler: uj.StatusesCount type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.StatusesCount = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_TimeZone: - - /* handler: uj.TimeZone type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - } else { - - outBuf := fs.Output.Bytes() - - uj.TimeZone = string(string(outBuf)) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_URL: - - /* handler: uj.URL type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - uj.URL = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - uj.URL = &tval - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_UtcOffset: - - /* handler: uj.UtcOffset type=int kind=int quoted=false*/ - - { - if tok != fflib.FFTok_integer && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for int", tok)) - } - } - - { - - if tok == fflib.FFTok_null { - - } else { - - tval, err := fflib.ParseInt(fs.Output.Bytes(), 10, 64) - - if err != nil { - return fs.WrapErr(err) - } - - uj.UtcOffset = int(tval) - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_Verified: - - /* handler: uj.Verified type=bool kind=bool quoted=false*/ - - { - if tok != fflib.FFTok_bool && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for bool", tok)) - } - } - - { - if tok == fflib.FFTok_null { - - } else { - tmpb := fs.Output.Bytes() - - if bytes.Compare([]byte{'t', 'r', 'u', 'e'}, tmpb) == 0 { - - uj.Verified = true - - } else if bytes.Compare([]byte{'f', 'a', 'l', 's', 'e'}, tmpb) == 0 { - - uj.Verified = false - - } else { - err = errors.New("unexpected bytes for true/false value") - return fs.WrapErr(err) - } - - } - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - return nil -} - -func (mj *UserEntities) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if mj == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := mj.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} -func (mj *UserEntities) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if mj == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - buf.WriteString(`{"description":`) - - { - - err = mj.Description.MarshalJSONBuf(buf) - if err != nil { - return err - } - - } - buf.WriteString(`,"url":`) - - { - - err = mj.URL.MarshalJSONBuf(buf) - if err != nil { - return err - } - - } - buf.WriteByte('}') - return nil -} - -const ( - ffj_t_UserEntitiesbase = iota - ffj_t_UserEntitiesno_such_key - - ffj_t_UserEntities_Description - - ffj_t_UserEntities_URL -) - -var ffj_key_UserEntities_Description = []byte("description") - -var ffj_key_UserEntities_URL = []byte("url") - -func (uj *UserEntities) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -func (uj *UserEntities) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error = nil - currentKey := ffj_t_UserEntitiesbase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffj_t_UserEntitiesno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 'd': - - if bytes.Equal(ffj_key_UserEntities_Description, kn) { - currentKey = ffj_t_UserEntities_Description - state = fflib.FFParse_want_colon - goto mainparse - } - - case 'u': - - if bytes.Equal(ffj_key_UserEntities_URL, kn) { - currentKey = ffj_t_UserEntities_URL - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.SimpleLetterEqualFold(ffj_key_UserEntities_URL, kn) { - currentKey = ffj_t_UserEntities_URL - state = fflib.FFParse_want_colon - goto mainparse - } - - if fflib.EqualFoldRight(ffj_key_UserEntities_Description, kn) { - currentKey = ffj_t_UserEntities_Description - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffj_t_UserEntitiesno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffj_t_UserEntities_Description: - goto handle_Description - - case ffj_t_UserEntities_URL: - goto handle_URL - - case ffj_t_UserEntitiesno_such_key: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_Description: - - /* handler: uj.Description type=benchmark.UserEntityDescription kind=struct quoted=false*/ - - { - if tok == fflib.FFTok_null { - - state = fflib.FFParse_after_value - goto mainparse - } - - err = uj.Description.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) - if err != nil { - return err - } - state = fflib.FFParse_after_value - } - - state = fflib.FFParse_after_value - goto mainparse - -handle_URL: - - /* handler: uj.URL type=benchmark.UserEntityURL kind=struct quoted=false*/ - - { - if tok == fflib.FFTok_null { - - state = fflib.FFParse_after_value - goto mainparse - } - - err = uj.URL.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) - if err != nil { - return err - } - state = fflib.FFParse_after_value - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - return nil -} - -func (mj *UserEntityDescription) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if mj == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := mj.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} -func (mj *UserEntityDescription) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if mj == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - buf.WriteString(`{"urls":`) - if mj.Urls != nil { - buf.WriteString(`[`) - for i, v := range mj.Urls { - if i != 0 { - buf.WriteString(`,`) - } - if v != nil { - fflib.WriteJsonString(buf, string(*v)) - } else { - buf.WriteString(`null`) - } - } - buf.WriteString(`]`) - } else { - buf.WriteString(`null`) - } - buf.WriteByte('}') - return nil -} - -const ( - ffj_t_UserEntityDescriptionbase = iota - ffj_t_UserEntityDescriptionno_such_key - - ffj_t_UserEntityDescription_Urls -) - -var ffj_key_UserEntityDescription_Urls = []byte("urls") - -func (uj *UserEntityDescription) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -func (uj *UserEntityDescription) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error = nil - currentKey := ffj_t_UserEntityDescriptionbase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffj_t_UserEntityDescriptionno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 'u': - - if bytes.Equal(ffj_key_UserEntityDescription_Urls, kn) { - currentKey = ffj_t_UserEntityDescription_Urls - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.EqualFoldRight(ffj_key_UserEntityDescription_Urls, kn) { - currentKey = ffj_t_UserEntityDescription_Urls - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffj_t_UserEntityDescriptionno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffj_t_UserEntityDescription_Urls: - goto handle_Urls - - case ffj_t_UserEntityDescriptionno_such_key: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_Urls: - - /* handler: uj.Urls type=[]*string kind=slice quoted=false*/ - - { - - { - if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) - } - } - - if tok == fflib.FFTok_null { - uj.Urls = nil - } else { - - uj.Urls = make([]*string, 0) - - wantVal := true - - for { - - var tmp_uj__Urls *string - - tok = fs.Scan() - if tok == fflib.FFTok_error { - goto tokerror - } - if tok == fflib.FFTok_right_brace { - break - } - - if tok == fflib.FFTok_comma { - if wantVal == true { - // TODO(pquerna): this isn't an ideal error message, this handles - // things like [,,,] as an array value. - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) - } - continue - } else { - wantVal = true - } - - /* handler: tmp_uj__Urls type=*string kind=ptr quoted=false*/ - - { - - if tok == fflib.FFTok_null { - tmp_uj__Urls = nil - } else { - if tmp_uj__Urls == nil { - tmp_uj__Urls = new(string) - } - - /* handler: tmp_uj__Urls type=string kind=string quoted=false*/ - - { - - { - if tok != fflib.FFTok_string && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for string", tok)) - } - } - - if tok == fflib.FFTok_null { - - tmp_uj__Urls = nil - - } else { - - var tval string - outBuf := fs.Output.Bytes() - - tval = string(string(outBuf)) - tmp_uj__Urls = &tval - - } - } - - } - } - - uj.Urls = append(uj.Urls, tmp_uj__Urls) - wantVal = false - } - } - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - return nil -} - -func (mj *UserEntityURL) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if mj == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := mj.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} -func (mj *UserEntityURL) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if mj == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - buf.WriteString(`{"urls":`) - if mj.Urls != nil { - buf.WriteString(`[`) - for i, v := range mj.Urls { - if i != 0 { - buf.WriteString(`,`) - } - - { - - err = v.MarshalJSONBuf(buf) - if err != nil { - return err - } - - } - } - buf.WriteString(`]`) - } else { - buf.WriteString(`null`) - } - buf.WriteByte('}') - return nil -} - -const ( - ffj_t_UserEntityURLbase = iota - ffj_t_UserEntityURLno_such_key - - ffj_t_UserEntityURL_Urls -) - -var ffj_key_UserEntityURL_Urls = []byte("urls") - -func (uj *UserEntityURL) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -func (uj *UserEntityURL) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error = nil - currentKey := ffj_t_UserEntityURLbase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffj_t_UserEntityURLno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 'u': - - if bytes.Equal(ffj_key_UserEntityURL_Urls, kn) { - currentKey = ffj_t_UserEntityURL_Urls - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.EqualFoldRight(ffj_key_UserEntityURL_Urls, kn) { - currentKey = ffj_t_UserEntityURL_Urls - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffj_t_UserEntityURLno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffj_t_UserEntityURL_Urls: - goto handle_Urls - - case ffj_t_UserEntityURLno_such_key: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_Urls: - - /* handler: uj.Urls type=[]benchmark.URL kind=slice quoted=false*/ - - { - - { - if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) - } - } - - if tok == fflib.FFTok_null { - uj.Urls = nil - } else { - - uj.Urls = make([]URL, 0) - - wantVal := true - - for { - - var tmp_uj__Urls URL - - tok = fs.Scan() - if tok == fflib.FFTok_error { - goto tokerror - } - if tok == fflib.FFTok_right_brace { - break - } - - if tok == fflib.FFTok_comma { - if wantVal == true { - // TODO(pquerna): this isn't an ideal error message, this handles - // things like [,,,] as an array value. - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) - } - continue - } else { - wantVal = true - } - - /* handler: tmp_uj__Urls type=benchmark.URL kind=struct quoted=false*/ - - { - if tok == fflib.FFTok_null { - - state = fflib.FFParse_after_value - goto mainparse - } - - err = tmp_uj__Urls.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) - if err != nil { - return err - } - state = fflib.FFParse_after_value - } - - uj.Urls = append(uj.Urls, tmp_uj__Urls) - wantVal = false - } - } - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - return nil -} - -func (mj *XLStruct) MarshalJSON() ([]byte, error) { - var buf fflib.Buffer - if mj == nil { - buf.WriteString("null") - return buf.Bytes(), nil - } - err := mj.MarshalJSONBuf(&buf) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} -func (mj *XLStruct) MarshalJSONBuf(buf fflib.EncodingBuffer) error { - if mj == nil { - buf.WriteString("null") - return nil - } - var err error - var obj []byte - _ = obj - _ = err - buf.WriteString(`{"Data":`) - if mj.Data != nil { - buf.WriteString(`[`) - for i, v := range mj.Data { - if i != 0 { - buf.WriteString(`,`) - } - - { - - err = v.MarshalJSONBuf(buf) - if err != nil { - return err - } - - } - } - buf.WriteString(`]`) - } else { - buf.WriteString(`null`) - } - buf.WriteByte('}') - return nil -} - -const ( - ffj_t_XLStructbase = iota - ffj_t_XLStructno_such_key - - ffj_t_XLStruct_Data -) - -var ffj_key_XLStruct_Data = []byte("Data") - -func (uj *XLStruct) UnmarshalJSON(input []byte) error { - fs := fflib.NewFFLexer(input) - return uj.UnmarshalJSONFFLexer(fs, fflib.FFParse_map_start) -} - -func (uj *XLStruct) UnmarshalJSONFFLexer(fs *fflib.FFLexer, state fflib.FFParseState) error { - var err error = nil - currentKey := ffj_t_XLStructbase - _ = currentKey - tok := fflib.FFTok_init - wantedTok := fflib.FFTok_init - -mainparse: - for { - tok = fs.Scan() - // println(fmt.Sprintf("debug: tok: %v state: %v", tok, state)) - if tok == fflib.FFTok_error { - goto tokerror - } - - switch state { - - case fflib.FFParse_map_start: - if tok != fflib.FFTok_left_bracket { - wantedTok = fflib.FFTok_left_bracket - goto wrongtokenerror - } - state = fflib.FFParse_want_key - continue - - case fflib.FFParse_after_value: - if tok == fflib.FFTok_comma { - state = fflib.FFParse_want_key - } else if tok == fflib.FFTok_right_bracket { - goto done - } else { - wantedTok = fflib.FFTok_comma - goto wrongtokenerror - } - - case fflib.FFParse_want_key: - // json {} ended. goto exit. woo. - if tok == fflib.FFTok_right_bracket { - goto done - } - if tok != fflib.FFTok_string { - wantedTok = fflib.FFTok_string - goto wrongtokenerror - } - - kn := fs.Output.Bytes() - if len(kn) <= 0 { - // "" case. hrm. - currentKey = ffj_t_XLStructno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } else { - switch kn[0] { - - case 'D': - - if bytes.Equal(ffj_key_XLStruct_Data, kn) { - currentKey = ffj_t_XLStruct_Data - state = fflib.FFParse_want_colon - goto mainparse - } - - } - - if fflib.SimpleLetterEqualFold(ffj_key_XLStruct_Data, kn) { - currentKey = ffj_t_XLStruct_Data - state = fflib.FFParse_want_colon - goto mainparse - } - - currentKey = ffj_t_XLStructno_such_key - state = fflib.FFParse_want_colon - goto mainparse - } - - case fflib.FFParse_want_colon: - if tok != fflib.FFTok_colon { - wantedTok = fflib.FFTok_colon - goto wrongtokenerror - } - state = fflib.FFParse_want_value - continue - case fflib.FFParse_want_value: - - if tok == fflib.FFTok_left_brace || tok == fflib.FFTok_left_bracket || tok == fflib.FFTok_integer || tok == fflib.FFTok_double || tok == fflib.FFTok_string || tok == fflib.FFTok_bool || tok == fflib.FFTok_null { - switch currentKey { - - case ffj_t_XLStruct_Data: - goto handle_Data - - case ffj_t_XLStructno_such_key: - err = fs.SkipField(tok) - if err != nil { - return fs.WrapErr(err) - } - state = fflib.FFParse_after_value - goto mainparse - } - } else { - goto wantedvalue - } - } - } - -handle_Data: - - /* handler: uj.Data type=[]benchmark.LargeStruct kind=slice quoted=false*/ - - { - - { - if tok != fflib.FFTok_left_brace && tok != fflib.FFTok_null { - return fs.WrapErr(fmt.Errorf("cannot unmarshal %s into Go value for ", tok)) - } - } - - if tok == fflib.FFTok_null { - uj.Data = nil - } else { - - uj.Data = make([]LargeStruct, 0) - - wantVal := true - - for { - - var tmp_uj__Data LargeStruct - - tok = fs.Scan() - if tok == fflib.FFTok_error { - goto tokerror - } - if tok == fflib.FFTok_right_brace { - break - } - - if tok == fflib.FFTok_comma { - if wantVal == true { - // TODO(pquerna): this isn't an ideal error message, this handles - // things like [,,,] as an array value. - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) - } - continue - } else { - wantVal = true - } - - /* handler: tmp_uj__Data type=benchmark.LargeStruct kind=struct quoted=false*/ - - { - if tok == fflib.FFTok_null { - - state = fflib.FFParse_after_value - goto mainparse - } - - err = tmp_uj__Data.UnmarshalJSONFFLexer(fs, fflib.FFParse_want_key) - if err != nil { - return err - } - state = fflib.FFParse_after_value - } - - uj.Data = append(uj.Data, tmp_uj__Data) - wantVal = false - } - } - } - - state = fflib.FFParse_after_value - goto mainparse - -wantedvalue: - return fs.WrapErr(fmt.Errorf("wanted value token, but got token: %v", tok)) -wrongtokenerror: - return fs.WrapErr(fmt.Errorf("ffjson: wanted token: %v, but got token: %v output=%s", wantedTok, tok, fs.Output.String())) -tokerror: - if fs.BigError != nil { - return fs.WrapErr(fs.BigError) - } - err = fs.Error.ToError() - if err != nil { - return fs.WrapErr(err) - } - panic("ffjson-generated: unreachable, please report bug.") -done: - return nil -} diff --git a/vendor/github.com/mailru/easyjson/benchmark/data_var.go b/vendor/github.com/mailru/easyjson/benchmark/data_var.go deleted file mode 100644 index ea4202dbe2..0000000000 --- a/vendor/github.com/mailru/easyjson/benchmark/data_var.go +++ /dev/null @@ -1,350 +0,0 @@ -package benchmark - -var largeStructData = LargeStruct{ - SearchMetadata: SearchMetadata{ - CompletedIn: 0.035, - Count: 4, - MaxID: 250126199840518145, - MaxIDStr: "250126199840518145", - NextResults: "?max_id=249279667666817023&q=%23freebandnames&count=4&include_entities=1&result_type=mixed", - Query: "%23freebandnames", - RefreshURL: "?since_id=250126199840518145&q=%23freebandnames&result_type=mixed&include_entities=1", - SinceID: 24012619984051000, - SinceIDStr: "24012619984051000", - }, - Statuses: []Status{ - { - Contributors: nil, - Coordinates: nil, - CreatedAt: "Mon Sep 24 03:35:21 +0000 2012", - Entities: Entities{ - Hashtags: []Hashtag{{ - Indices: []int{20, 34}, - Text: "freebandnames"}, - }, - Urls: []*string{}, - UserMentions: []*string{}, - }, - Favorited: false, - Geo: nil, - ID: 250075927172759552, - IDStr: "250075927172759552", - InReplyToScreenName: nil, - InReplyToStatusID: nil, - InReplyToStatusIDStr: nil, - InReplyToUserID: nil, - InReplyToUserIDStr: nil, - Metadata: StatusMetadata{ - IsoLanguageCode: "en", - ResultType: "recent", - }, - Place: nil, - RetweetCount: 0, - Retweeted: false, - Source: "Twitter for Mac", - Text: "Aggressive Ponytail #freebandnames", - Truncated: false, - User: User{ - ContributorsEnabled: false, - CreatedAt: "Mon Apr 26 06:01:55 +0000 2010", - DefaultProfile: true, - DefaultProfileImage: false, - Description: "Born 330 Live 310", - Entities: UserEntities{ - Description: UserEntityDescription{ - Urls: []*string{}, - }, - URL: UserEntityURL{ - Urls: []URL{{ - ExpandedURL: nil, - Indices: []int{0, 0}, - URL: "", - }}, - }, - }, - FavouritesCount: 0, - FollowRequestSent: nil, - FollowersCount: 70, - Following: nil, - FriendsCount: 110, - GeoEnabled: true, - ID: 137238150, - IDStr: "137238150", - IsTranslator: false, - Lang: "en", - ListedCount: 2, - Location: "LA, CA", - Name: "Sean Cummings", - Notifications: nil, - ProfileBackgroundColor: "C0DEED", - ProfileBackgroundImageURL: "http://a0.twimg.com/images/themes/theme1/bg.png", - ProfileBackgroundImageURLHTTPS: "https://si0.twimg.com/images/themes/theme1/bg.png", - ProfileBackgroundTile: false, - ProfileImageURL: "http://a0.twimg.com/profile_images/2359746665/1v6zfgqo8g0d3mk7ii5s_normal.jpeg", - ProfileImageURLHTTPS: "https://si0.twimg.com/profile_images/2359746665/1v6zfgqo8g0d3mk7ii5s_normal.jpeg", - ProfileLinkColor: "0084B4", - ProfileSidebarBorderColor: "C0DEED", - ProfileSidebarFillColor: "DDEEF6", - ProfileTextColor: "333333", - ProfileUseBackgroundImage: true, - Protected: false, - ScreenName: "sean_cummings", - ShowAllInlineMedia: false, - StatusesCount: 579, - TimeZone: "Pacific Time (US & Canada)", - URL: nil, - UtcOffset: -28800, - Verified: false, - }, - }, - { - Contributors: nil, - Coordinates: nil, - CreatedAt: "Fri Sep 21 23:40:54 +0000 2012", - Entities: Entities{ - Hashtags: []Hashtag{{ - Indices: []int{20, 34}, - Text: "FreeBandNames", - }}, - Urls: []*string{}, - UserMentions: []*string{}, - }, - Favorited: false, - Geo: nil, - ID: 249292149810667520, - IDStr: "249292149810667520", - InReplyToScreenName: nil, - InReplyToStatusID: nil, - InReplyToStatusIDStr: nil, - InReplyToUserID: nil, - InReplyToUserIDStr: nil, - Metadata: StatusMetadata{ - IsoLanguageCode: "pl", - ResultType: "recent", - }, - Place: nil, - RetweetCount: 0, - Retweeted: false, - Source: "web", - Text: "Thee Namaste Nerdz. #FreeBandNames", - Truncated: false, - User: User{ - ContributorsEnabled: false, - CreatedAt: "Tue Apr 07 19:05:07 +0000 2009", - DefaultProfile: false, - DefaultProfileImage: false, - Description: "You will come to Durham, North Carolina. I will sell you some records then, here in Durham, North Carolina. Fun will happen.", - Entities: UserEntities{ - Description: UserEntityDescription{Urls: []*string{}}, - URL: UserEntityURL{ - Urls: []URL{{ - ExpandedURL: nil, - Indices: []int{0, 32}, - URL: "http://bullcityrecords.com/wnng/"}}, - }, - }, - FavouritesCount: 8, - FollowRequestSent: nil, - FollowersCount: 2052, - Following: nil, - FriendsCount: 348, - GeoEnabled: false, - ID: 29516238, - IDStr: "29516238", - IsTranslator: false, - Lang: "en", - ListedCount: 118, - Location: "Durham, NC", - Name: "Chaz Martenstein", - Notifications: nil, - ProfileBackgroundColor: "9AE4E8", - ProfileBackgroundImageURL: "http://a0.twimg.com/profile_background_images/9423277/background_tile.bmp", - ProfileBackgroundImageURLHTTPS: "https://si0.twimg.com/profile_background_images/9423277/background_tile.bmp", - ProfileBackgroundTile: true, - ProfileImageURL: "http://a0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg", - ProfileImageURLHTTPS: "https://si0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg", - ProfileLinkColor: "0084B4", - ProfileSidebarBorderColor: "BDDCAD", - ProfileSidebarFillColor: "DDFFCC", - ProfileTextColor: "333333", - ProfileUseBackgroundImage: true, - Protected: false, - ScreenName: "bullcityrecords", - ShowAllInlineMedia: true, - StatusesCount: 7579, - TimeZone: "Eastern Time (US & Canada)", - URL: nil, - UtcOffset: -18000, - Verified: false, - }, - }, - Status{ - Contributors: nil, - Coordinates: nil, - CreatedAt: "Fri Sep 21 23:30:20 +0000 2012", - Entities: Entities{ - Hashtags: []Hashtag{{ - Indices: []int{29, 43}, - Text: "freebandnames", - }}, - Urls: []*string{}, - UserMentions: []*string{}, - }, - Favorited: false, - Geo: nil, - ID: 249289491129438208, - IDStr: "249289491129438208", - InReplyToScreenName: nil, - InReplyToStatusID: nil, - InReplyToStatusIDStr: nil, - InReplyToUserID: nil, - InReplyToUserIDStr: nil, - Metadata: StatusMetadata{ - IsoLanguageCode: "en", - ResultType: "recent", - }, - Place: nil, - RetweetCount: 0, - Retweeted: false, - Source: "web", - Text: "Mexican Heaven, Mexican Hell #freebandnames", - Truncated: false, - User: User{ - ContributorsEnabled: false, - CreatedAt: "Tue Sep 01 21:21:35 +0000 2009", - DefaultProfile: false, - DefaultProfileImage: false, - Description: "Science Fiction Writer, sort of. Likes Superheroes, Mole People, Alt. Timelines.", - Entities: UserEntities{ - Description: UserEntityDescription{ - Urls: nil, - }, - URL: UserEntityURL{ - Urls: []URL{{ - ExpandedURL: nil, - Indices: []int{0, 0}, - URL: "", - }}, - }, - }, - FavouritesCount: 19, - FollowRequestSent: nil, - FollowersCount: 63, - Following: nil, - FriendsCount: 63, - GeoEnabled: false, - ID: 70789458, - IDStr: "70789458", - IsTranslator: false, - Lang: "en", - ListedCount: 1, - Location: "Kingston New York", - Name: "Thomas John Wakeman", - Notifications: nil, - ProfileBackgroundColor: "352726", - ProfileBackgroundImageURL: "http://a0.twimg.com/images/themes/theme5/bg.gif", - ProfileBackgroundImageURLHTTPS: "https://si0.twimg.com/images/themes/theme5/bg.gif", - ProfileBackgroundTile: false, - ProfileImageURL: "http://a0.twimg.com/profile_images/2219333930/Froggystyle_normal.png", - ProfileImageURLHTTPS: "https://si0.twimg.com/profile_images/2219333930/Froggystyle_normal.png", - ProfileLinkColor: "D02B55", - ProfileSidebarBorderColor: "829D5E", - ProfileSidebarFillColor: "99CC33", - ProfileTextColor: "3E4415", - ProfileUseBackgroundImage: true, - Protected: false, - ScreenName: "MonkiesFist", - ShowAllInlineMedia: false, - StatusesCount: 1048, - TimeZone: "Eastern Time (US & Canada)", - URL: nil, - UtcOffset: -18000, - Verified: false, - }, - }, - Status{ - Contributors: nil, - Coordinates: nil, - CreatedAt: "Fri Sep 21 22:51:18 +0000 2012", - Entities: Entities{ - Hashtags: []Hashtag{{ - Indices: []int{20, 34}, - Text: "freebandnames", - }}, - Urls: []*string{}, - UserMentions: []*string{}, - }, - Favorited: false, - Geo: nil, - ID: 249279667666817024, - IDStr: "249279667666817024", - InReplyToScreenName: nil, - InReplyToStatusID: nil, - InReplyToStatusIDStr: nil, - InReplyToUserID: nil, - InReplyToUserIDStr: nil, - Metadata: StatusMetadata{ - IsoLanguageCode: "en", - ResultType: "recent", - }, - Place: nil, - RetweetCount: 0, - Retweeted: false, - Source: "Twitter for iPhone", - Text: "The Foolish Mortals #freebandnames", - Truncated: false, - User: User{ - ContributorsEnabled: false, - CreatedAt: "Mon May 04 00:05:00 +0000 2009", - DefaultProfile: false, - DefaultProfileImage: false, - Description: "Cartoonist, Illustrator, and T-Shirt connoisseur", - Entities: UserEntities{ - Description: UserEntityDescription{ - Urls: []*string{}, - }, - URL: UserEntityURL{ - Urls: []URL{{ - ExpandedURL: nil, - Indices: []int{0, 24}, - URL: "http://www.omnitarian.me", - }}, - }, - }, - FavouritesCount: 647, - FollowRequestSent: nil, - FollowersCount: 608, - Following: nil, - FriendsCount: 249, - GeoEnabled: false, - ID: 37539828, - IDStr: "37539828", - IsTranslator: false, - Lang: "en", - ListedCount: 52, - Location: "Wisconsin, USA", - Name: "Marty Elmer", - Notifications: nil, - ProfileBackgroundColor: "EEE3C4", - ProfileBackgroundImageURL: "http://a0.twimg.com/profile_background_images/106455659/rect6056-9.png", - ProfileBackgroundImageURLHTTPS: "https://si0.twimg.com/profile_background_images/106455659/rect6056-9.png", - ProfileBackgroundTile: true, - ProfileImageURL: "http://a0.twimg.com/profile_images/1629790393/shrinker_2000_trans_normal.png", - ProfileImageURLHTTPS: "https://si0.twimg.com/profile_images/1629790393/shrinker_2000_trans_normal.png", - ProfileLinkColor: "3B2A26", - ProfileSidebarBorderColor: "615A44", - ProfileSidebarFillColor: "BFAC83", - ProfileTextColor: "000000", - ProfileUseBackgroundImage: true, - Protected: false, - ScreenName: "Omnitarian", - ShowAllInlineMedia: true, - StatusesCount: 3575, - TimeZone: "Central Time (US & Canada)", - URL: nil, - UtcOffset: -21600, - Verified: false, - }, - }, - }, -} diff --git a/vendor/github.com/mailru/easyjson/benchmark/default_test.go b/vendor/github.com/mailru/easyjson/benchmark/default_test.go deleted file mode 100644 index 68b37910de..0000000000 --- a/vendor/github.com/mailru/easyjson/benchmark/default_test.go +++ /dev/null @@ -1,118 +0,0 @@ -// +build !use_easyjson,!use_ffjson,!use_codec,!use_jsoniter - -package benchmark - -import ( - "encoding/json" - "testing" -) - -func BenchmarkStd_Unmarshal_M(b *testing.B) { - b.SetBytes(int64(len(largeStructText))) - for i := 0; i < b.N; i++ { - var s LargeStruct - err := json.Unmarshal(largeStructText, &s) - if err != nil { - b.Error(err) - } - } -} - -func BenchmarkStd_Unmarshal_S(b *testing.B) { - for i := 0; i < b.N; i++ { - var s Entities - err := json.Unmarshal(smallStructText, &s) - if err != nil { - b.Error(err) - } - } - b.SetBytes(int64(len(smallStructText))) -} - -func BenchmarkStd_Marshal_M(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := json.Marshal(&largeStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - b.SetBytes(l) -} - -func BenchmarkStd_Marshal_L(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := json.Marshal(&xlStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - b.SetBytes(l) -} - -func BenchmarkStd_Marshal_M_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := json.Marshal(&largeStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - }) - b.SetBytes(l) -} - -func BenchmarkStd_Marshal_L_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := json.Marshal(&xlStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - }) - b.SetBytes(l) -} - -func BenchmarkStd_Marshal_S(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := json.Marshal(&smallStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - b.SetBytes(l) -} - -func BenchmarkStd_Marshal_S_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := json.Marshal(&smallStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - }) - b.SetBytes(l) -} - -func BenchmarkStd_Marshal_M_ToWriter(b *testing.B) { - enc := json.NewEncoder(&DummyWriter{}) - for i := 0; i < b.N; i++ { - err := enc.Encode(&largeStructData) - if err != nil { - b.Error(err) - } - } -} diff --git a/vendor/github.com/mailru/easyjson/benchmark/dummy_test.go b/vendor/github.com/mailru/easyjson/benchmark/dummy_test.go deleted file mode 100644 index 3d928ca7cd..0000000000 --- a/vendor/github.com/mailru/easyjson/benchmark/dummy_test.go +++ /dev/null @@ -1,11 +0,0 @@ -package benchmark - -import ( - "testing" -) - -type DummyWriter struct{} - -func (w DummyWriter) Write(data []byte) (int, error) { return len(data), nil } - -func TestToSuppressNoTestsWarning(t *testing.T) {} diff --git a/vendor/github.com/mailru/easyjson/benchmark/easyjson_test.go b/vendor/github.com/mailru/easyjson/benchmark/easyjson_test.go deleted file mode 100644 index 16b670b274..0000000000 --- a/vendor/github.com/mailru/easyjson/benchmark/easyjson_test.go +++ /dev/null @@ -1,184 +0,0 @@ -// +build use_easyjson - -package benchmark - -import ( - "testing" - - "github.com/mailru/easyjson" - "github.com/mailru/easyjson/jwriter" -) - -func BenchmarkEJ_Unmarshal_M(b *testing.B) { - b.SetBytes(int64(len(largeStructText))) - for i := 0; i < b.N; i++ { - var s LargeStruct - err := s.UnmarshalJSON(largeStructText) - if err != nil { - b.Error(err) - } - } -} - -func BenchmarkEJ_Unmarshal_S(b *testing.B) { - b.SetBytes(int64(len(smallStructText))) - - for i := 0; i < b.N; i++ { - var s Entities - err := s.UnmarshalJSON(smallStructText) - if err != nil { - b.Error(err) - } - } -} - -func BenchmarkEJ_Marshal_M(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := easyjson.Marshal(&largeStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - b.SetBytes(l) -} - -func BenchmarkEJ_Marshal_L(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := easyjson.Marshal(&xlStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - b.SetBytes(l) -} - -func BenchmarkEJ_Marshal_L_ToWriter(b *testing.B) { - var l int64 - out := &DummyWriter{} - for i := 0; i < b.N; i++ { - w := jwriter.Writer{} - xlStructData.MarshalEasyJSON(&w) - if w.Error != nil { - b.Error(w.Error) - } - - l = int64(w.Size()) - w.DumpTo(out) - } - b.SetBytes(l) - -} -func BenchmarkEJ_Marshal_M_Parallel(b *testing.B) { - b.SetBytes(int64(len(largeStructText))) - - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _, err := largeStructData.MarshalJSON() - if err != nil { - b.Error(err) - } - } - }) -} - -func BenchmarkEJ_Marshal_M_ToWriter(b *testing.B) { - var l int64 - out := &DummyWriter{} - for i := 0; i < b.N; i++ { - w := jwriter.Writer{} - largeStructData.MarshalEasyJSON(&w) - if w.Error != nil { - b.Error(w.Error) - } - - l = int64(w.Size()) - w.DumpTo(out) - } - b.SetBytes(l) - -} -func BenchmarkEJ_Marshal_M_ToWriter_Parallel(b *testing.B) { - out := &DummyWriter{} - - b.RunParallel(func(pb *testing.PB) { - var l int64 - for pb.Next() { - w := jwriter.Writer{} - largeStructData.MarshalEasyJSON(&w) - if w.Error != nil { - b.Error(w.Error) - } - - l = int64(w.Size()) - w.DumpTo(out) - } - if l > 0 { - b.SetBytes(l) - } - }) - -} - -func BenchmarkEJ_Marshal_L_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := xlStructData.MarshalJSON() - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - }) - b.SetBytes(l) -} - -func BenchmarkEJ_Marshal_L_ToWriter_Parallel(b *testing.B) { - out := &DummyWriter{} - b.RunParallel(func(pb *testing.PB) { - var l int64 - for pb.Next() { - w := jwriter.Writer{} - - xlStructData.MarshalEasyJSON(&w) - if w.Error != nil { - b.Error(w.Error) - } - l = int64(w.Size()) - w.DumpTo(out) - } - if l > 0 { - b.SetBytes(l) - } - }) -} - -func BenchmarkEJ_Marshal_S(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := smallStructData.MarshalJSON() - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - b.SetBytes(l) -} - -func BenchmarkEJ_Marshal_S_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := smallStructData.MarshalJSON() - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - }) - b.SetBytes(l) -} diff --git a/vendor/github.com/mailru/easyjson/benchmark/example.json b/vendor/github.com/mailru/easyjson/benchmark/example.json deleted file mode 100644 index 2405022cf4..0000000000 --- a/vendor/github.com/mailru/easyjson/benchmark/example.json +++ /dev/null @@ -1,415 +0,0 @@ -{ - "statuses": [ - { - "coordinates": null, - "favorited": false, - "truncated": false, - "created_at": "Mon Sep 24 03:35:21 +0000 2012", - "id_str": "250075927172759552", - "entities": { - "urls": [ - - ], - "hashtags": [ - { - "text": "freebandnames", - "indices": [ - 20, - 34 - ] - } - ], - "user_mentions": [ - - ] - }, - "in_reply_to_user_id_str": null, - "contributors": null, - "text": "Aggressive Ponytail #freebandnames", - "metadata": { - "iso_language_code": "en", - "result_type": "recent" - }, - "retweet_count": 0, - "in_reply_to_status_id_str": null, - "id": 250075927172759552, - "geo": null, - "retweeted": false, - "in_reply_to_user_id": null, - "place": null, - "user": { - "profile_sidebar_fill_color": "DDEEF6", - "profile_sidebar_border_color": "C0DEED", - "profile_background_tile": false, - "name": "Sean Cummings", - "profile_image_url": "http://a0.twimg.com/profile_images/2359746665/1v6zfgqo8g0d3mk7ii5s_normal.jpeg", - "created_at": "Mon Apr 26 06:01:55 +0000 2010", - "location": "LA, CA", - "follow_request_sent": null, - "profile_link_color": "0084B4", - "is_translator": false, - "id_str": "137238150", - "entities": { - "url": { - "urls": [ - { - "expanded_url": null, - "url": "", - "indices": [ - 0, - 0 - ] - } - ] - }, - "description": { - "urls": [ - - ] - } - }, - "default_profile": true, - "contributors_enabled": false, - "favourites_count": 0, - "url": null, - "profile_image_url_https": "https://si0.twimg.com/profile_images/2359746665/1v6zfgqo8g0d3mk7ii5s_normal.jpeg", - "utc_offset": -28800, - "id": 137238150, - "profile_use_background_image": true, - "listed_count": 2, - "profile_text_color": "333333", - "lang": "en", - "followers_count": 70, - "protected": false, - "notifications": null, - "profile_background_image_url_https": "https://si0.twimg.com/images/themes/theme1/bg.png", - "profile_background_color": "C0DEED", - "verified": false, - "geo_enabled": true, - "time_zone": "Pacific Time (US & Canada)", - "description": "Born 330 Live 310", - "default_profile_image": false, - "profile_background_image_url": "http://a0.twimg.com/images/themes/theme1/bg.png", - "statuses_count": 579, - "friends_count": 110, - "following": null, - "show_all_inline_media": false, - "screen_name": "sean_cummings" - }, - "in_reply_to_screen_name": null, - "source": "Twitter for Mac", - "in_reply_to_status_id": null - }, - { - "coordinates": null, - "favorited": false, - "truncated": false, - "created_at": "Fri Sep 21 23:40:54 +0000 2012", - "id_str": "249292149810667520", - "entities": { - "urls": [ - - ], - "hashtags": [ - { - "text": "FreeBandNames", - "indices": [ - 20, - 34 - ] - } - ], - "user_mentions": [ - - ] - }, - "in_reply_to_user_id_str": null, - "contributors": null, - "text": "Thee Namaste Nerdz. #FreeBandNames", - "metadata": { - "iso_language_code": "pl", - "result_type": "recent" - }, - "retweet_count": 0, - "in_reply_to_status_id_str": null, - "id": 249292149810667520, - "geo": null, - "retweeted": false, - "in_reply_to_user_id": null, - "place": null, - "user": { - "profile_sidebar_fill_color": "DDFFCC", - "profile_sidebar_border_color": "BDDCAD", - "profile_background_tile": true, - "name": "Chaz Martenstein", - "profile_image_url": "http://a0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg", - "created_at": "Tue Apr 07 19:05:07 +0000 2009", - "location": "Durham, NC", - "follow_request_sent": null, - "profile_link_color": "0084B4", - "is_translator": false, - "id_str": "29516238", - "entities": { - "url": { - "urls": [ - { - "expanded_url": null, - "url": "http://bullcityrecords.com/wnng/", - "indices": [ - 0, - 32 - ] - } - ] - }, - "description": { - "urls": [ - - ] - } - }, - "default_profile": false, - "contributors_enabled": false, - "favourites_count": 8, - "url": "http://bullcityrecords.com/wnng/", - "profile_image_url_https": "https://si0.twimg.com/profile_images/447958234/Lichtenstein_normal.jpg", - "utc_offset": -18000, - "id": 29516238, - "profile_use_background_image": true, - "listed_count": 118, - "profile_text_color": "333333", - "lang": "en", - "followers_count": 2052, - "protected": false, - "notifications": null, - "profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/9423277/background_tile.bmp", - "profile_background_color": "9AE4E8", - "verified": false, - "geo_enabled": false, - "time_zone": "Eastern Time (US & Canada)", - "description": "You will come to Durham, North Carolina. I will sell you some records then, here in Durham, North Carolina. Fun will happen.", - "default_profile_image": false, - "profile_background_image_url": "http://a0.twimg.com/profile_background_images/9423277/background_tile.bmp", - "statuses_count": 7579, - "friends_count": 348, - "following": null, - "show_all_inline_media": true, - "screen_name": "bullcityrecords" - }, - "in_reply_to_screen_name": null, - "source": "web", - "in_reply_to_status_id": null - }, - { - "coordinates": null, - "favorited": false, - "truncated": false, - "created_at": "Fri Sep 21 23:30:20 +0000 2012", - "id_str": "249289491129438208", - "entities": { - "urls": [ - - ], - "hashtags": [ - { - "text": "freebandnames", - "indices": [ - 29, - 43 - ] - } - ], - "user_mentions": [ - - ] - }, - "in_reply_to_user_id_str": null, - "contributors": null, - "text": "Mexican Heaven, Mexican Hell #freebandnames", - "metadata": { - "iso_language_code": "en", - "result_type": "recent" - }, - "retweet_count": 0, - "in_reply_to_status_id_str": null, - "id": 249289491129438208, - "geo": null, - "retweeted": false, - "in_reply_to_user_id": null, - "place": null, - "user": { - "profile_sidebar_fill_color": "99CC33", - "profile_sidebar_border_color": "829D5E", - "profile_background_tile": false, - "name": "Thomas John Wakeman", - "profile_image_url": "http://a0.twimg.com/profile_images/2219333930/Froggystyle_normal.png", - "created_at": "Tue Sep 01 21:21:35 +0000 2009", - "location": "Kingston New York", - "follow_request_sent": null, - "profile_link_color": "D02B55", - "is_translator": false, - "id_str": "70789458", - "entities": { - "url": { - "urls": [ - { - "expanded_url": null, - "url": "", - "indices": [ - 0, - 0 - ] - } - ] - }, - "description": { - "urls": [ - - ] - } - }, - "default_profile": false, - "contributors_enabled": false, - "favourites_count": 19, - "url": null, - "profile_image_url_https": "https://si0.twimg.com/profile_images/2219333930/Froggystyle_normal.png", - "utc_offset": -18000, - "id": 70789458, - "profile_use_background_image": true, - "listed_count": 1, - "profile_text_color": "3E4415", - "lang": "en", - "followers_count": 63, - "protected": false, - "notifications": null, - "profile_background_image_url_https": "https://si0.twimg.com/images/themes/theme5/bg.gif", - "profile_background_color": "352726", - "verified": false, - "geo_enabled": false, - "time_zone": "Eastern Time (US & Canada)", - "description": "Science Fiction Writer, sort of. Likes Superheroes, Mole People, Alt. Timelines.", - "default_profile_image": false, - "profile_background_image_url": "http://a0.twimg.com/images/themes/theme5/bg.gif", - "statuses_count": 1048, - "friends_count": 63, - "following": null, - "show_all_inline_media": false, - "screen_name": "MonkiesFist" - }, - "in_reply_to_screen_name": null, - "source": "web", - "in_reply_to_status_id": null - }, - { - "coordinates": null, - "favorited": false, - "truncated": false, - "created_at": "Fri Sep 21 22:51:18 +0000 2012", - "id_str": "249279667666817024", - "entities": { - "urls": [ - - ], - "hashtags": [ - { - "text": "freebandnames", - "indices": [ - 20, - 34 - ] - } - ], - "user_mentions": [ - - ] - }, - "in_reply_to_user_id_str": null, - "contributors": null, - "text": "The Foolish Mortals #freebandnames", - "metadata": { - "iso_language_code": "en", - "result_type": "recent" - }, - "retweet_count": 0, - "in_reply_to_status_id_str": null, - "id": 249279667666817024, - "geo": null, - "retweeted": false, - "in_reply_to_user_id": null, - "place": null, - "user": { - "profile_sidebar_fill_color": "BFAC83", - "profile_sidebar_border_color": "615A44", - "profile_background_tile": true, - "name": "Marty Elmer", - "profile_image_url": "http://a0.twimg.com/profile_images/1629790393/shrinker_2000_trans_normal.png", - "created_at": "Mon May 04 00:05:00 +0000 2009", - "location": "Wisconsin, USA", - "follow_request_sent": null, - "profile_link_color": "3B2A26", - "is_translator": false, - "id_str": "37539828", - "entities": { - "url": { - "urls": [ - { - "expanded_url": null, - "url": "http://www.omnitarian.me", - "indices": [ - 0, - 24 - ] - } - ] - }, - "description": { - "urls": [ - - ] - } - }, - "default_profile": false, - "contributors_enabled": false, - "favourites_count": 647, - "url": "http://www.omnitarian.me", - "profile_image_url_https": "https://si0.twimg.com/profile_images/1629790393/shrinker_2000_trans_normal.png", - "utc_offset": -21600, - "id": 37539828, - "profile_use_background_image": true, - "listed_count": 52, - "profile_text_color": "000000", - "lang": "en", - "followers_count": 608, - "protected": false, - "notifications": null, - "profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/106455659/rect6056-9.png", - "profile_background_color": "EEE3C4", - "verified": false, - "geo_enabled": false, - "time_zone": "Central Time (US & Canada)", - "description": "Cartoonist, Illustrator, and T-Shirt connoisseur", - "default_profile_image": false, - "profile_background_image_url": "http://a0.twimg.com/profile_background_images/106455659/rect6056-9.png", - "statuses_count": 3575, - "friends_count": 249, - "following": null, - "show_all_inline_media": true, - "screen_name": "Omnitarian" - }, - "in_reply_to_screen_name": null, - "source": "Twitter for iPhone", - "in_reply_to_status_id": null - } - ], - "search_metadata": { - "max_id": 250126199840518145, - "since_id": 24012619984051000, - "refresh_url": "?since_id=250126199840518145&q=%23freebandnames&result_type=mixed&include_entities=1", - "next_results": "?max_id=249279667666817023&q=%23freebandnames&count=4&include_entities=1&result_type=mixed", - "count": 4, - "completed_in": 0.035, - "since_id_str": "24012619984051000", - "query": "%23freebandnames", - "max_id_str": "250126199840518145" - } -} diff --git a/vendor/github.com/mailru/easyjson/benchmark/ffjson_test.go b/vendor/github.com/mailru/easyjson/benchmark/ffjson_test.go deleted file mode 100644 index 03671827cf..0000000000 --- a/vendor/github.com/mailru/easyjson/benchmark/ffjson_test.go +++ /dev/null @@ -1,190 +0,0 @@ -// +build use_ffjson - -package benchmark - -import ( - "testing" - - "github.com/pquerna/ffjson/ffjson" -) - -func BenchmarkFF_Unmarshal_M(b *testing.B) { - b.SetBytes(int64(len(largeStructText))) - for i := 0; i < b.N; i++ { - var s LargeStruct - err := ffjson.UnmarshalFast(largeStructText, &s) - if err != nil { - b.Error(err) - } - } -} - -func BenchmarkFF_Unmarshal_S(b *testing.B) { - for i := 0; i < b.N; i++ { - var s Entities - err := ffjson.UnmarshalFast(smallStructText, &s) - if err != nil { - b.Error(err) - } - } - b.SetBytes(int64(len(smallStructText))) -} - -func BenchmarkFF_Marshal_M(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := ffjson.MarshalFast(&largeStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - b.SetBytes(l) -} - -func BenchmarkFF_Marshal_S(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := ffjson.MarshalFast(&smallStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - b.SetBytes(l) -} - -func BenchmarkFF_Marshal_M_Pool(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := ffjson.MarshalFast(&largeStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - ffjson.Pool(data) - } - b.SetBytes(l) -} - -func BenchmarkFF_Marshal_L(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := ffjson.MarshalFast(&xlStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - b.SetBytes(l) -} - -func BenchmarkFF_Marshal_L_Pool(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := ffjson.MarshalFast(&xlStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - ffjson.Pool(data) - } - b.SetBytes(l) -} - -func BenchmarkFF_Marshal_L_Pool_Parallel(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := ffjson.MarshalFast(&xlStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - ffjson.Pool(data) - } - b.SetBytes(l) -} -func BenchmarkFF_Marshal_M_Pool_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := ffjson.MarshalFast(&largeStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - ffjson.Pool(data) - } - }) - b.SetBytes(l) -} - -func BenchmarkFF_Marshal_S_Pool(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := ffjson.MarshalFast(&smallStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - ffjson.Pool(data) - } - b.SetBytes(l) -} - -func BenchmarkFF_Marshal_S_Pool_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := ffjson.MarshalFast(&smallStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - ffjson.Pool(data) - } - }) - b.SetBytes(l) -} - -func BenchmarkFF_Marshal_S_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := ffjson.MarshalFast(&smallStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - }) - b.SetBytes(l) -} - -func BenchmarkFF_Marshal_M_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := ffjson.MarshalFast(&largeStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - }) - b.SetBytes(l) -} - -func BenchmarkFF_Marshal_L_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := ffjson.MarshalFast(&xlStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - }) - b.SetBytes(l) -} diff --git a/vendor/github.com/mailru/easyjson/benchmark/jsoniter_test.go b/vendor/github.com/mailru/easyjson/benchmark/jsoniter_test.go deleted file mode 100644 index 004f891da5..0000000000 --- a/vendor/github.com/mailru/easyjson/benchmark/jsoniter_test.go +++ /dev/null @@ -1,119 +0,0 @@ -// +build use_jsoniter - -package benchmark - -import ( - "testing" - - jsoniter "github.com/json-iterator/go" -) - -func BenchmarkJI_Unmarshal_M(b *testing.B) { - b.SetBytes(int64(len(largeStructText))) - for i := 0; i < b.N; i++ { - var s LargeStruct - err := jsoniter.Unmarshal(largeStructText, &s) - if err != nil { - b.Error(err) - } - } -} - -func BenchmarkJI_Unmarshal_S(b *testing.B) { - for i := 0; i < b.N; i++ { - var s Entities - err := jsoniter.Unmarshal(smallStructText, &s) - if err != nil { - b.Error(err) - } - } - b.SetBytes(int64(len(smallStructText))) -} - -func BenchmarkJI_Marshal_M(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := jsoniter.Marshal(&largeStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - b.SetBytes(l) -} - -func BenchmarkJI_Marshal_L(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := jsoniter.Marshal(&xlStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - b.SetBytes(l) -} - -func BenchmarkJI_Marshal_M_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := jsoniter.Marshal(&largeStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - }) - b.SetBytes(l) -} - -func BenchmarkJI_Marshal_L_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := jsoniter.Marshal(&xlStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - }) - b.SetBytes(l) -} - -func BenchmarkJI_Marshal_S(b *testing.B) { - var l int64 - for i := 0; i < b.N; i++ { - data, err := jsoniter.Marshal(&smallStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - b.SetBytes(l) -} - -func BenchmarkJI_Marshal_S_Parallel(b *testing.B) { - var l int64 - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - data, err := jsoniter.Marshal(&smallStructData) - if err != nil { - b.Error(err) - } - l = int64(len(data)) - } - }) - b.SetBytes(l) -} - -func BenchmarkJI_Marshal_M_ToWriter(b *testing.B) { - enc := jsoniter.NewEncoder(&DummyWriter{}) - for i := 0; i < b.N; i++ { - err := enc.Encode(&largeStructData) - if err != nil { - b.Error(err) - } - } -} diff --git a/vendor/github.com/mailru/easyjson/benchmark/ujson.sh b/vendor/github.com/mailru/easyjson/benchmark/ujson.sh deleted file mode 100755 index 378e7df464..0000000000 --- a/vendor/github.com/mailru/easyjson/benchmark/ujson.sh +++ /dev/null @@ -1,7 +0,0 @@ -#/bin/bash - -echo -n "Python ujson module, DECODE: " -python -m timeit -s "import ujson; data = open('`dirname $0`/example.json', 'r').read()" 'ujson.loads(data)' - -echo -n "Python ujson module, ENCODE: " -python -m timeit -s "import ujson; data = open('`dirname $0`/example.json', 'r').read(); obj = ujson.loads(data)" 'ujson.dumps(obj)' diff --git a/vendor/github.com/mailru/easyjson/bootstrap/bootstrap.go b/vendor/github.com/mailru/easyjson/bootstrap/bootstrap.go deleted file mode 100644 index 3c20e09ca6..0000000000 --- a/vendor/github.com/mailru/easyjson/bootstrap/bootstrap.go +++ /dev/null @@ -1,188 +0,0 @@ -// Package bootstrap implements the bootstrapping logic: generation of a .go file to -// launch the actual generator and launching the generator itself. -// -// The package may be preferred to a command-line utility if generating the serializers -// from golang code is required. -package bootstrap - -import ( - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "sort" -) - -const genPackage = "github.com/mailru/easyjson/gen" -const pkgWriter = "github.com/mailru/easyjson/jwriter" -const pkgLexer = "github.com/mailru/easyjson/jlexer" - -type Generator struct { - PkgPath, PkgName string - Types []string - - NoStdMarshalers bool - SnakeCase bool - LowerCamelCase bool - OmitEmpty bool - - OutName string - BuildTags string - - StubsOnly bool - LeaveTemps bool - NoFormat bool -} - -// writeStub outputs an initial stubs for marshalers/unmarshalers so that the package -// using marshalers/unmarshales compiles correctly for boostrapping code. -func (g *Generator) writeStub() error { - f, err := os.Create(g.OutName) - if err != nil { - return err - } - defer f.Close() - - if g.BuildTags != "" { - fmt.Fprintln(f, "// +build ", g.BuildTags) - fmt.Fprintln(f) - } - fmt.Fprintln(f, "// TEMPORARY AUTOGENERATED FILE: easyjson stub code to make the package") - fmt.Fprintln(f, "// compilable during generation.") - fmt.Fprintln(f) - fmt.Fprintln(f, "package ", g.PkgName) - - if len(g.Types) > 0 { - fmt.Fprintln(f) - fmt.Fprintln(f, "import (") - fmt.Fprintln(f, ` "`+pkgWriter+`"`) - fmt.Fprintln(f, ` "`+pkgLexer+`"`) - fmt.Fprintln(f, ")") - } - - sort.Strings(g.Types) - for _, t := range g.Types { - fmt.Fprintln(f) - if !g.NoStdMarshalers { - fmt.Fprintln(f, "func (", t, ") MarshalJSON() ([]byte, error) { return nil, nil }") - fmt.Fprintln(f, "func (*", t, ") UnmarshalJSON([]byte) error { return nil }") - } - - fmt.Fprintln(f, "func (", t, ") MarshalEasyJSON(w *jwriter.Writer) {}") - fmt.Fprintln(f, "func (*", t, ") UnmarshalEasyJSON(l *jlexer.Lexer) {}") - fmt.Fprintln(f) - fmt.Fprintln(f, "type EasyJSON_exporter_"+t+" *"+t) - } - return nil -} - -// writeMain creates a .go file that launches the generator if 'go run'. -func (g *Generator) writeMain() (path string, err error) { - f, err := ioutil.TempFile(filepath.Dir(g.OutName), "easyjson-bootstrap") - if err != nil { - return "", err - } - - fmt.Fprintln(f, "// +build ignore") - fmt.Fprintln(f) - fmt.Fprintln(f, "// TEMPORARY AUTOGENERATED FILE: easyjson bootstapping code to launch") - fmt.Fprintln(f, "// the actual generator.") - fmt.Fprintln(f) - fmt.Fprintln(f, "package main") - fmt.Fprintln(f) - fmt.Fprintln(f, "import (") - fmt.Fprintln(f, ` "fmt"`) - fmt.Fprintln(f, ` "os"`) - fmt.Fprintln(f) - fmt.Fprintf(f, " %q\n", genPackage) - if len(g.Types) > 0 { - fmt.Fprintln(f) - fmt.Fprintf(f, " pkg %q\n", g.PkgPath) - } - fmt.Fprintln(f, ")") - fmt.Fprintln(f) - fmt.Fprintln(f, "func main() {") - fmt.Fprintf(f, " g := gen.NewGenerator(%q)\n", filepath.Base(g.OutName)) - fmt.Fprintf(f, " g.SetPkg(%q, %q)\n", g.PkgName, g.PkgPath) - if g.BuildTags != "" { - fmt.Fprintf(f, " g.SetBuildTags(%q)\n", g.BuildTags) - } - if g.SnakeCase { - fmt.Fprintln(f, " g.UseSnakeCase()") - } - if g.LowerCamelCase { - fmt.Fprintln(f, " g.UseLowerCamelCase()") - } - if g.OmitEmpty { - fmt.Fprintln(f, " g.OmitEmpty()") - } - if g.NoStdMarshalers { - fmt.Fprintln(f, " g.NoStdMarshalers()") - } - - sort.Strings(g.Types) - for _, v := range g.Types { - fmt.Fprintln(f, " g.Add(pkg.EasyJSON_exporter_"+v+"(nil))") - } - - fmt.Fprintln(f, " if err := g.Run(os.Stdout); err != nil {") - fmt.Fprintln(f, " fmt.Fprintln(os.Stderr, err)") - fmt.Fprintln(f, " os.Exit(1)") - fmt.Fprintln(f, " }") - fmt.Fprintln(f, "}") - - src := f.Name() - if err := f.Close(); err != nil { - return src, err - } - - dest := src + ".go" - return dest, os.Rename(src, dest) -} - -func (g *Generator) Run() error { - if err := g.writeStub(); err != nil { - return err - } - if g.StubsOnly { - return nil - } - - path, err := g.writeMain() - if err != nil { - return err - } - if !g.LeaveTemps { - defer os.Remove(path) - } - - f, err := os.Create(g.OutName + ".tmp") - if err != nil { - return err - } - if !g.LeaveTemps { - defer os.Remove(f.Name()) // will not remove after rename - } - - cmd := exec.Command("go", "run", "-tags", g.BuildTags, path) - cmd.Stdout = f - cmd.Stderr = os.Stderr - if err = cmd.Run(); err != nil { - return err - } - - f.Close() - - if !g.NoFormat { - cmd = exec.Command("gofmt", "-w", f.Name()) - cmd.Stderr = os.Stderr - cmd.Stdout = os.Stdout - - if err = cmd.Run(); err != nil { - return err - } - } - - return os.Rename(f.Name(), g.OutName) -} diff --git a/vendor/github.com/mailru/easyjson/buffer/pool.go b/vendor/github.com/mailru/easyjson/buffer/pool.go deleted file mode 100644 index 07fb4bc1f7..0000000000 --- a/vendor/github.com/mailru/easyjson/buffer/pool.go +++ /dev/null @@ -1,270 +0,0 @@ -// Package buffer implements a buffer for serialization, consisting of a chain of []byte-s to -// reduce copying and to allow reuse of individual chunks. -package buffer - -import ( - "io" - "sync" -) - -// PoolConfig contains configuration for the allocation and reuse strategy. -type PoolConfig struct { - StartSize int // Minimum chunk size that is allocated. - PooledSize int // Minimum chunk size that is reused, reusing chunks too small will result in overhead. - MaxSize int // Maximum chunk size that will be allocated. -} - -var config = PoolConfig{ - StartSize: 128, - PooledSize: 512, - MaxSize: 32768, -} - -// Reuse pool: chunk size -> pool. -var buffers = map[int]*sync.Pool{} - -func initBuffers() { - for l := config.PooledSize; l <= config.MaxSize; l *= 2 { - buffers[l] = new(sync.Pool) - } -} - -func init() { - initBuffers() -} - -// Init sets up a non-default pooling and allocation strategy. Should be run before serialization is done. -func Init(cfg PoolConfig) { - config = cfg - initBuffers() -} - -// putBuf puts a chunk to reuse pool if it can be reused. -func putBuf(buf []byte) { - size := cap(buf) - if size < config.PooledSize { - return - } - if c := buffers[size]; c != nil { - c.Put(buf[:0]) - } -} - -// getBuf gets a chunk from reuse pool or creates a new one if reuse failed. -func getBuf(size int) []byte { - if size < config.PooledSize { - return make([]byte, 0, size) - } - - if c := buffers[size]; c != nil { - v := c.Get() - if v != nil { - return v.([]byte) - } - } - return make([]byte, 0, size) -} - -// Buffer is a buffer optimized for serialization without extra copying. -type Buffer struct { - - // Buf is the current chunk that can be used for serialization. - Buf []byte - - toPool []byte - bufs [][]byte -} - -// EnsureSpace makes sure that the current chunk contains at least s free bytes, -// possibly creating a new chunk. -func (b *Buffer) EnsureSpace(s int) { - if cap(b.Buf)-len(b.Buf) >= s { - return - } - l := len(b.Buf) - if l > 0 { - if cap(b.toPool) != cap(b.Buf) { - // Chunk was reallocated, toPool can be pooled. - putBuf(b.toPool) - } - if cap(b.bufs) == 0 { - b.bufs = make([][]byte, 0, 8) - } - b.bufs = append(b.bufs, b.Buf) - l = cap(b.toPool) * 2 - } else { - l = config.StartSize - } - - if l > config.MaxSize { - l = config.MaxSize - } - b.Buf = getBuf(l) - b.toPool = b.Buf -} - -// AppendByte appends a single byte to buffer. -func (b *Buffer) AppendByte(data byte) { - if cap(b.Buf) == len(b.Buf) { // EnsureSpace won't be inlined. - b.EnsureSpace(1) - } - b.Buf = append(b.Buf, data) -} - -// AppendBytes appends a byte slice to buffer. -func (b *Buffer) AppendBytes(data []byte) { - for len(data) > 0 { - if cap(b.Buf) == len(b.Buf) { // EnsureSpace won't be inlined. - b.EnsureSpace(1) - } - - sz := cap(b.Buf) - len(b.Buf) - if sz > len(data) { - sz = len(data) - } - - b.Buf = append(b.Buf, data[:sz]...) - data = data[sz:] - } -} - -// AppendBytes appends a string to buffer. -func (b *Buffer) AppendString(data string) { - for len(data) > 0 { - if cap(b.Buf) == len(b.Buf) { // EnsureSpace won't be inlined. - b.EnsureSpace(1) - } - - sz := cap(b.Buf) - len(b.Buf) - if sz > len(data) { - sz = len(data) - } - - b.Buf = append(b.Buf, data[:sz]...) - data = data[sz:] - } -} - -// Size computes the size of a buffer by adding sizes of every chunk. -func (b *Buffer) Size() int { - size := len(b.Buf) - for _, buf := range b.bufs { - size += len(buf) - } - return size -} - -// DumpTo outputs the contents of a buffer to a writer and resets the buffer. -func (b *Buffer) DumpTo(w io.Writer) (written int, err error) { - var n int - for _, buf := range b.bufs { - if err == nil { - n, err = w.Write(buf) - written += n - } - putBuf(buf) - } - - if err == nil { - n, err = w.Write(b.Buf) - written += n - } - putBuf(b.toPool) - - b.bufs = nil - b.Buf = nil - b.toPool = nil - - return -} - -// BuildBytes creates a single byte slice with all the contents of the buffer. Data is -// copied if it does not fit in a single chunk. You can optionally provide one byte -// slice as argument that it will try to reuse. -func (b *Buffer) BuildBytes(reuse ...[]byte) []byte { - if len(b.bufs) == 0 { - ret := b.Buf - b.toPool = nil - b.Buf = nil - return ret - } - - var ret []byte - size := b.Size() - - // If we got a buffer as argument and it is big enought, reuse it. - if len(reuse) == 1 && cap(reuse[0]) >= size { - ret = reuse[0][:0] - } else { - ret = make([]byte, 0, size) - } - for _, buf := range b.bufs { - ret = append(ret, buf...) - putBuf(buf) - } - - ret = append(ret, b.Buf...) - putBuf(b.toPool) - - b.bufs = nil - b.toPool = nil - b.Buf = nil - - return ret -} - -type readCloser struct { - offset int - bufs [][]byte -} - -func (r *readCloser) Read(p []byte) (n int, err error) { - for _, buf := range r.bufs { - // Copy as much as we can. - x := copy(p[n:], buf[r.offset:]) - n += x // Increment how much we filled. - - // Did we empty the whole buffer? - if r.offset+x == len(buf) { - // On to the next buffer. - r.offset = 0 - r.bufs = r.bufs[1:] - - // We can release this buffer. - putBuf(buf) - } else { - r.offset += x - } - - if n == len(p) { - break - } - } - // No buffers left or nothing read? - if len(r.bufs) == 0 { - err = io.EOF - } - return -} - -func (r *readCloser) Close() error { - // Release all remaining buffers. - for _, buf := range r.bufs { - putBuf(buf) - } - // In case Close gets called multiple times. - r.bufs = nil - - return nil -} - -// ReadCloser creates an io.ReadCloser with all the contents of the buffer. -func (b *Buffer) ReadCloser() io.ReadCloser { - ret := &readCloser{0, append(b.bufs, b.Buf)} - - b.bufs = nil - b.toPool = nil - b.Buf = nil - - return ret -} diff --git a/vendor/github.com/mailru/easyjson/buffer/pool_test.go b/vendor/github.com/mailru/easyjson/buffer/pool_test.go deleted file mode 100644 index 680623aced..0000000000 --- a/vendor/github.com/mailru/easyjson/buffer/pool_test.go +++ /dev/null @@ -1,107 +0,0 @@ -package buffer - -import ( - "bytes" - "testing" -) - -func TestAppendByte(t *testing.T) { - var b Buffer - var want []byte - - for i := 0; i < 1000; i++ { - b.AppendByte(1) - b.AppendByte(2) - want = append(want, 1, 2) - } - - got := b.BuildBytes() - if !bytes.Equal(got, want) { - t.Errorf("BuildBytes() = %v; want %v", got, want) - } -} - -func TestAppendBytes(t *testing.T) { - var b Buffer - var want []byte - - for i := 0; i < 1000; i++ { - b.AppendBytes([]byte{1, 2}) - want = append(want, 1, 2) - } - - got := b.BuildBytes() - if !bytes.Equal(got, want) { - t.Errorf("BuildBytes() = %v; want %v", got, want) - } -} - -func TestAppendString(t *testing.T) { - var b Buffer - var want []byte - - s := "test" - for i := 0; i < 1000; i++ { - b.AppendBytes([]byte(s)) - want = append(want, s...) - } - - got := b.BuildBytes() - if !bytes.Equal(got, want) { - t.Errorf("BuildBytes() = %v; want %v", got, want) - } -} - -func TestDumpTo(t *testing.T) { - var b Buffer - var want []byte - - s := "test" - for i := 0; i < 1000; i++ { - b.AppendBytes([]byte(s)) - want = append(want, s...) - } - - out := &bytes.Buffer{} - n, err := b.DumpTo(out) - if err != nil { - t.Errorf("DumpTo() error: %v", err) - } - - got := out.Bytes() - if !bytes.Equal(got, want) { - t.Errorf("DumpTo(): got %v; want %v", got, want) - } - - if n != len(want) { - t.Errorf("DumpTo() = %v; want %v", n, len(want)) - } -} - -func TestReadCloser(t *testing.T) { - var b Buffer - var want []byte - - s := "test" - for i := 0; i < 1000; i++ { - b.AppendBytes([]byte(s)) - want = append(want, s...) - } - - out := &bytes.Buffer{} - rc := b.ReadCloser() - n, err := out.ReadFrom(rc) - if err != nil { - t.Errorf("ReadCloser() error: %v", err) - } - rc.Close() // Will always return nil - - got := out.Bytes() - if !bytes.Equal(got, want) { - t.Errorf("DumpTo(): got %v; want %v", got, want) - } - - if n != int64(len(want)) { - t.Errorf("DumpTo() = %v; want %v", n, len(want)) - } -} diff --git a/vendor/github.com/mailru/easyjson/easyjson/main.go b/vendor/github.com/mailru/easyjson/easyjson/main.go deleted file mode 100644 index 1cd30bb363..0000000000 --- a/vendor/github.com/mailru/easyjson/easyjson/main.go +++ /dev/null @@ -1,106 +0,0 @@ -package main - -import ( - "errors" - "flag" - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/mailru/easyjson/bootstrap" - // Reference the gen package to be friendly to vendoring tools, - // as it is an indirect dependency. - // (The temporary bootstrapping code uses it.) - _ "github.com/mailru/easyjson/gen" - "github.com/mailru/easyjson/parser" -) - -var buildTags = flag.String("build_tags", "", "build tags to add to generated file") -var snakeCase = flag.Bool("snake_case", false, "use snake_case names instead of CamelCase by default") -var lowerCamelCase = flag.Bool("lower_camel_case", false, "use lowerCamelCase names instead of CamelCase by default") -var noStdMarshalers = flag.Bool("no_std_marshalers", false, "don't generate MarshalJSON/UnmarshalJSON funcs") -var omitEmpty = flag.Bool("omit_empty", false, "omit empty fields by default") -var allStructs = flag.Bool("all", false, "generate marshaler/unmarshalers for all structs in a file") -var leaveTemps = flag.Bool("leave_temps", false, "do not delete temporary files") -var stubs = flag.Bool("stubs", false, "only generate stubs for marshaler/unmarshaler funcs") -var noformat = flag.Bool("noformat", false, "do not run 'gofmt -w' on output file") -var specifiedName = flag.String("output_filename", "", "specify the filename of the output") -var processPkg = flag.Bool("pkg", false, "process the whole package instead of just the given file") - -func generate(fname string) (err error) { - fInfo, err := os.Stat(fname) - if err != nil { - return err - } - - p := parser.Parser{AllStructs: *allStructs} - if err := p.Parse(fname, fInfo.IsDir()); err != nil { - return fmt.Errorf("Error parsing %v: %v", fname, err) - } - - var outName string - if fInfo.IsDir() { - outName = filepath.Join(fname, p.PkgName+"_easyjson.go") - } else { - if s := strings.TrimSuffix(fname, ".go"); s == fname { - return errors.New("Filename must end in '.go'") - } else { - outName = s + "_easyjson.go" - } - } - - if *specifiedName != "" { - outName = *specifiedName - } - - var trimmedBuildTags string - if *buildTags != "" { - trimmedBuildTags = strings.TrimSpace(*buildTags) - } - - g := bootstrap.Generator{ - BuildTags: trimmedBuildTags, - PkgPath: p.PkgPath, - PkgName: p.PkgName, - Types: p.StructNames, - SnakeCase: *snakeCase, - LowerCamelCase: *lowerCamelCase, - NoStdMarshalers: *noStdMarshalers, - OmitEmpty: *omitEmpty, - LeaveTemps: *leaveTemps, - OutName: outName, - StubsOnly: *stubs, - NoFormat: *noformat, - } - - if err := g.Run(); err != nil { - return fmt.Errorf("Bootstrap failed: %v", err) - } - return nil -} - -func main() { - flag.Parse() - - files := flag.Args() - - gofile := os.Getenv("GOFILE") - if *processPkg { - gofile = filepath.Dir(gofile) - } - - if len(files) == 0 && gofile != "" { - files = []string{gofile} - } else if len(files) == 0 { - flag.Usage() - os.Exit(1) - } - - for _, fname := range files { - if err := generate(fname); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - } -} diff --git a/vendor/github.com/mailru/easyjson/gen/decoder.go b/vendor/github.com/mailru/easyjson/gen/decoder.go deleted file mode 100644 index 021933ac8f..0000000000 --- a/vendor/github.com/mailru/easyjson/gen/decoder.go +++ /dev/null @@ -1,489 +0,0 @@ -package gen - -import ( - "encoding" - "encoding/json" - "fmt" - "reflect" - "strings" - "unicode" - - "github.com/mailru/easyjson" -) - -// Target this byte size for initial slice allocation to reduce garbage collection. -const minSliceBytes = 64 - -func (g *Generator) getDecoderName(t reflect.Type) string { - return g.functionName("decode", t) -} - -var primitiveDecoders = map[reflect.Kind]string{ - reflect.String: "in.String()", - reflect.Bool: "in.Bool()", - reflect.Int: "in.Int()", - reflect.Int8: "in.Int8()", - reflect.Int16: "in.Int16()", - reflect.Int32: "in.Int32()", - reflect.Int64: "in.Int64()", - reflect.Uint: "in.Uint()", - reflect.Uint8: "in.Uint8()", - reflect.Uint16: "in.Uint16()", - reflect.Uint32: "in.Uint32()", - reflect.Uint64: "in.Uint64()", - reflect.Float32: "in.Float32()", - reflect.Float64: "in.Float64()", -} - -var primitiveStringDecoders = map[reflect.Kind]string{ - reflect.String: "in.String()", - reflect.Int: "in.IntStr()", - reflect.Int8: "in.Int8Str()", - reflect.Int16: "in.Int16Str()", - reflect.Int32: "in.Int32Str()", - reflect.Int64: "in.Int64Str()", - reflect.Uint: "in.UintStr()", - reflect.Uint8: "in.Uint8Str()", - reflect.Uint16: "in.Uint16Str()", - reflect.Uint32: "in.Uint32Str()", - reflect.Uint64: "in.Uint64Str()", - reflect.Uintptr: "in.UintptrStr()", -} - -var customDecoders = map[string]string{ - "json.Number": "in.JsonNumber()", -} - -// genTypeDecoder generates decoding code for the type t, but uses unmarshaler interface if implemented by t. -func (g *Generator) genTypeDecoder(t reflect.Type, out string, tags fieldTags, indent int) error { - ws := strings.Repeat(" ", indent) - - unmarshalerIface := reflect.TypeOf((*easyjson.Unmarshaler)(nil)).Elem() - if reflect.PtrTo(t).Implements(unmarshalerIface) { - fmt.Fprintln(g.out, ws+"("+out+").UnmarshalEasyJSON(in)") - return nil - } - - unmarshalerIface = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() - if reflect.PtrTo(t).Implements(unmarshalerIface) { - fmt.Fprintln(g.out, ws+"if data := in.Raw(); in.Ok() {") - fmt.Fprintln(g.out, ws+" in.AddError( ("+out+").UnmarshalJSON(data) )") - fmt.Fprintln(g.out, ws+"}") - return nil - } - - unmarshalerIface = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() - if reflect.PtrTo(t).Implements(unmarshalerIface) { - fmt.Fprintln(g.out, ws+"if data := in.UnsafeBytes(); in.Ok() {") - fmt.Fprintln(g.out, ws+" in.AddError( ("+out+").UnmarshalText(data) )") - fmt.Fprintln(g.out, ws+"}") - return nil - } - - err := g.genTypeDecoderNoCheck(t, out, tags, indent) - return err -} - -// genTypeDecoderNoCheck generates decoding code for the type t. -func (g *Generator) genTypeDecoderNoCheck(t reflect.Type, out string, tags fieldTags, indent int) error { - ws := strings.Repeat(" ", indent) - // Check whether type is primitive, needs to be done after interface check. - if dec := customDecoders[t.String()]; dec != "" { - fmt.Fprintln(g.out, ws+out+" = "+dec) - return nil - } else if dec := primitiveStringDecoders[t.Kind()]; dec != "" && tags.asString { - fmt.Fprintln(g.out, ws+out+" = "+g.getType(t)+"("+dec+")") - return nil - } else if dec := primitiveDecoders[t.Kind()]; dec != "" { - fmt.Fprintln(g.out, ws+out+" = "+g.getType(t)+"("+dec+")") - return nil - } - - switch t.Kind() { - case reflect.Slice: - tmpVar := g.uniqueVarName() - elem := t.Elem() - - if elem.Kind() == reflect.Uint8 { - fmt.Fprintln(g.out, ws+"if in.IsNull() {") - fmt.Fprintln(g.out, ws+" in.Skip()") - fmt.Fprintln(g.out, ws+" "+out+" = nil") - fmt.Fprintln(g.out, ws+"} else {") - fmt.Fprintln(g.out, ws+" "+out+" = in.Bytes()") - fmt.Fprintln(g.out, ws+"}") - - } else { - - capacity := minSliceBytes / elem.Size() - if capacity == 0 { - capacity = 1 - } - - fmt.Fprintln(g.out, ws+"if in.IsNull() {") - fmt.Fprintln(g.out, ws+" in.Skip()") - fmt.Fprintln(g.out, ws+" "+out+" = nil") - fmt.Fprintln(g.out, ws+"} else {") - fmt.Fprintln(g.out, ws+" in.Delim('[')") - fmt.Fprintln(g.out, ws+" if "+out+" == nil {") - fmt.Fprintln(g.out, ws+" if !in.IsDelim(']') {") - fmt.Fprintln(g.out, ws+" "+out+" = make("+g.getType(t)+", 0, "+fmt.Sprint(capacity)+")") - fmt.Fprintln(g.out, ws+" } else {") - fmt.Fprintln(g.out, ws+" "+out+" = "+g.getType(t)+"{}") - fmt.Fprintln(g.out, ws+" }") - fmt.Fprintln(g.out, ws+" } else { ") - fmt.Fprintln(g.out, ws+" "+out+" = ("+out+")[:0]") - fmt.Fprintln(g.out, ws+" }") - fmt.Fprintln(g.out, ws+" for !in.IsDelim(']') {") - fmt.Fprintln(g.out, ws+" var "+tmpVar+" "+g.getType(elem)) - - if err := g.genTypeDecoder(elem, tmpVar, tags, indent+2); err != nil { - return err - } - - fmt.Fprintln(g.out, ws+" "+out+" = append("+out+", "+tmpVar+")") - fmt.Fprintln(g.out, ws+" in.WantComma()") - fmt.Fprintln(g.out, ws+" }") - fmt.Fprintln(g.out, ws+" in.Delim(']')") - fmt.Fprintln(g.out, ws+"}") - } - - case reflect.Array: - iterVar := g.uniqueVarName() - elem := t.Elem() - - if elem.Kind() == reflect.Uint8 { - fmt.Fprintln(g.out, ws+"if in.IsNull() {") - fmt.Fprintln(g.out, ws+" in.Skip()") - fmt.Fprintln(g.out, ws+"} else {") - fmt.Fprintln(g.out, ws+" copy("+out+"[:], in.Bytes())") - fmt.Fprintln(g.out, ws+"}") - - } else { - - length := t.Len() - - fmt.Fprintln(g.out, ws+"if in.IsNull() {") - fmt.Fprintln(g.out, ws+" in.Skip()") - fmt.Fprintln(g.out, ws+"} else {") - fmt.Fprintln(g.out, ws+" in.Delim('[')") - fmt.Fprintln(g.out, ws+" "+iterVar+" := 0") - fmt.Fprintln(g.out, ws+" for !in.IsDelim(']') {") - fmt.Fprintln(g.out, ws+" if "+iterVar+" < "+fmt.Sprint(length)+" {") - - if err := g.genTypeDecoder(elem, out+"["+iterVar+"]", tags, indent+3); err != nil { - return err - } - - fmt.Fprintln(g.out, ws+" "+iterVar+"++") - fmt.Fprintln(g.out, ws+" } else {") - fmt.Fprintln(g.out, ws+" in.SkipRecursive()") - fmt.Fprintln(g.out, ws+" }") - fmt.Fprintln(g.out, ws+" in.WantComma()") - fmt.Fprintln(g.out, ws+" }") - fmt.Fprintln(g.out, ws+" in.Delim(']')") - fmt.Fprintln(g.out, ws+"}") - } - - case reflect.Struct: - dec := g.getDecoderName(t) - g.addType(t) - - fmt.Fprintln(g.out, ws+dec+"(in, &"+out+")") - - case reflect.Ptr: - fmt.Fprintln(g.out, ws+"if in.IsNull() {") - fmt.Fprintln(g.out, ws+" in.Skip()") - fmt.Fprintln(g.out, ws+" "+out+" = nil") - fmt.Fprintln(g.out, ws+"} else {") - fmt.Fprintln(g.out, ws+" if "+out+" == nil {") - fmt.Fprintln(g.out, ws+" "+out+" = new("+g.getType(t.Elem())+")") - fmt.Fprintln(g.out, ws+" }") - - if err := g.genTypeDecoder(t.Elem(), "*"+out, tags, indent+1); err != nil { - return err - } - - fmt.Fprintln(g.out, ws+"}") - - case reflect.Map: - key := t.Key() - keyDec, ok := primitiveStringDecoders[key.Kind()] - if !ok { - return fmt.Errorf("map type %v not supported: only string and integer keys are allowed", key) - } - elem := t.Elem() - tmpVar := g.uniqueVarName() - - fmt.Fprintln(g.out, ws+"if in.IsNull() {") - fmt.Fprintln(g.out, ws+" in.Skip()") - fmt.Fprintln(g.out, ws+"} else {") - fmt.Fprintln(g.out, ws+" in.Delim('{')") - fmt.Fprintln(g.out, ws+" if !in.IsDelim('}') {") - fmt.Fprintln(g.out, ws+" "+out+" = make("+g.getType(t)+")") - fmt.Fprintln(g.out, ws+" } else {") - fmt.Fprintln(g.out, ws+" "+out+" = nil") - fmt.Fprintln(g.out, ws+" }") - - fmt.Fprintln(g.out, ws+" for !in.IsDelim('}') {") - fmt.Fprintln(g.out, ws+" key := "+g.getType(key)+"("+keyDec+")") - fmt.Fprintln(g.out, ws+" in.WantColon()") - fmt.Fprintln(g.out, ws+" var "+tmpVar+" "+g.getType(elem)) - - if err := g.genTypeDecoder(elem, tmpVar, tags, indent+2); err != nil { - return err - } - - fmt.Fprintln(g.out, ws+" ("+out+")[key] = "+tmpVar) - fmt.Fprintln(g.out, ws+" in.WantComma()") - fmt.Fprintln(g.out, ws+" }") - fmt.Fprintln(g.out, ws+" in.Delim('}')") - fmt.Fprintln(g.out, ws+"}") - - case reflect.Interface: - if t.NumMethod() != 0 { - return fmt.Errorf("interface type %v not supported: only interface{} is allowed", t) - } - fmt.Fprintln(g.out, ws+"if m, ok := "+out+".(easyjson.Unmarshaler); ok {") - fmt.Fprintln(g.out, ws+"m.UnmarshalEasyJSON(in)") - fmt.Fprintln(g.out, ws+"} else if m, ok := "+out+".(json.Unmarshaler); ok {") - fmt.Fprintln(g.out, ws+"_ = m.UnmarshalJSON(in.Raw())") - fmt.Fprintln(g.out, ws+"} else {") - fmt.Fprintln(g.out, ws+" "+out+" = in.Interface()") - fmt.Fprintln(g.out, ws+"}") - default: - return fmt.Errorf("don't know how to decode %v", t) - } - return nil - -} - -func (g *Generator) genStructFieldDecoder(t reflect.Type, f reflect.StructField) error { - jsonName := g.fieldNamer.GetJSONFieldName(t, f) - tags := parseFieldTags(f) - - if tags.omit { - return nil - } - - fmt.Fprintf(g.out, " case %q:\n", jsonName) - if err := g.genTypeDecoder(f.Type, "out."+f.Name, tags, 3); err != nil { - return err - } - - if tags.required { - fmt.Fprintf(g.out, "%sSet = true\n", f.Name) - } - - return nil -} - -func (g *Generator) genRequiredFieldSet(t reflect.Type, f reflect.StructField) { - tags := parseFieldTags(f) - - if !tags.required { - return - } - - fmt.Fprintf(g.out, "var %sSet bool\n", f.Name) -} - -func (g *Generator) genRequiredFieldCheck(t reflect.Type, f reflect.StructField) { - jsonName := g.fieldNamer.GetJSONFieldName(t, f) - tags := parseFieldTags(f) - - if !tags.required { - return - } - - g.imports["fmt"] = "fmt" - - fmt.Fprintf(g.out, "if !%sSet {\n", f.Name) - fmt.Fprintf(g.out, " in.AddError(fmt.Errorf(\"key '%s' is required\"))\n", jsonName) - fmt.Fprintf(g.out, "}\n") -} - -func mergeStructFields(fields1, fields2 []reflect.StructField) (fields []reflect.StructField) { - used := map[string]bool{} - for _, f := range fields2 { - used[f.Name] = true - fields = append(fields, f) - } - - for _, f := range fields1 { - if !used[f.Name] { - fields = append(fields, f) - } - } - return -} - -func getStructFields(t reflect.Type) ([]reflect.StructField, error) { - if t.Kind() != reflect.Struct { - return nil, fmt.Errorf("got %v; expected a struct", t) - } - - var efields []reflect.StructField - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if !f.Anonymous { - continue - } - - t1 := f.Type - if t1.Kind() == reflect.Ptr { - t1 = t1.Elem() - } - - fs, err := getStructFields(t1) - if err != nil { - return nil, fmt.Errorf("error processing embedded field: %v", err) - } - efields = mergeStructFields(efields, fs) - } - - var fields []reflect.StructField - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if f.Anonymous { - continue - } - - c := []rune(f.Name)[0] - if unicode.IsUpper(c) { - fields = append(fields, f) - } - } - return mergeStructFields(efields, fields), nil -} - -func (g *Generator) genDecoder(t reflect.Type) error { - switch t.Kind() { - case reflect.Slice, reflect.Array, reflect.Map: - return g.genSliceArrayDecoder(t) - default: - return g.genStructDecoder(t) - } -} - -func (g *Generator) genSliceArrayDecoder(t reflect.Type) error { - switch t.Kind() { - case reflect.Slice, reflect.Array, reflect.Map: - default: - return fmt.Errorf("cannot generate encoder/decoder for %v, not a slice/array/map type", t) - } - - fname := g.getDecoderName(t) - typ := g.getType(t) - - fmt.Fprintln(g.out, "func "+fname+"(in *jlexer.Lexer, out *"+typ+") {") - fmt.Fprintln(g.out, " isTopLevel := in.IsStart()") - err := g.genTypeDecoderNoCheck(t, "*out", fieldTags{}, 1) - if err != nil { - return err - } - fmt.Fprintln(g.out, " if isTopLevel {") - fmt.Fprintln(g.out, " in.Consumed()") - fmt.Fprintln(g.out, " }") - fmt.Fprintln(g.out, "}") - - return nil -} - -func (g *Generator) genStructDecoder(t reflect.Type) error { - if t.Kind() != reflect.Struct { - return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct type", t) - } - - fname := g.getDecoderName(t) - typ := g.getType(t) - - fmt.Fprintln(g.out, "func "+fname+"(in *jlexer.Lexer, out *"+typ+") {") - fmt.Fprintln(g.out, " isTopLevel := in.IsStart()") - fmt.Fprintln(g.out, " if in.IsNull() {") - fmt.Fprintln(g.out, " if isTopLevel {") - fmt.Fprintln(g.out, " in.Consumed()") - fmt.Fprintln(g.out, " }") - fmt.Fprintln(g.out, " in.Skip()") - fmt.Fprintln(g.out, " return") - fmt.Fprintln(g.out, " }") - - // Init embedded pointer fields. - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if !f.Anonymous || f.Type.Kind() != reflect.Ptr { - continue - } - fmt.Fprintln(g.out, " out."+f.Name+" = new("+g.getType(f.Type.Elem())+")") - } - - fs, err := getStructFields(t) - if err != nil { - return fmt.Errorf("cannot generate decoder for %v: %v", t, err) - } - - for _, f := range fs { - g.genRequiredFieldSet(t, f) - } - - fmt.Fprintln(g.out, " in.Delim('{')") - fmt.Fprintln(g.out, " for !in.IsDelim('}') {") - fmt.Fprintln(g.out, " key := in.UnsafeString()") - fmt.Fprintln(g.out, " in.WantColon()") - fmt.Fprintln(g.out, " if in.IsNull() {") - fmt.Fprintln(g.out, " in.Skip()") - fmt.Fprintln(g.out, " in.WantComma()") - fmt.Fprintln(g.out, " continue") - fmt.Fprintln(g.out, " }") - - fmt.Fprintln(g.out, " switch key {") - for _, f := range fs { - if err := g.genStructFieldDecoder(t, f); err != nil { - return err - } - } - - fmt.Fprintln(g.out, " default:") - fmt.Fprintln(g.out, " in.SkipRecursive()") - fmt.Fprintln(g.out, " }") - fmt.Fprintln(g.out, " in.WantComma()") - fmt.Fprintln(g.out, " }") - fmt.Fprintln(g.out, " in.Delim('}')") - fmt.Fprintln(g.out, " if isTopLevel {") - fmt.Fprintln(g.out, " in.Consumed()") - fmt.Fprintln(g.out, " }") - - for _, f := range fs { - g.genRequiredFieldCheck(t, f) - } - - fmt.Fprintln(g.out, "}") - - return nil -} - -func (g *Generator) genStructUnmarshaler(t reflect.Type) error { - switch t.Kind() { - case reflect.Slice, reflect.Array, reflect.Map, reflect.Struct: - default: - return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct/slice/array/map type", t) - } - - fname := g.getDecoderName(t) - typ := g.getType(t) - - if !g.noStdMarshalers { - fmt.Fprintln(g.out, "// UnmarshalJSON supports json.Unmarshaler interface") - fmt.Fprintln(g.out, "func (v *"+typ+") UnmarshalJSON(data []byte) error {") - fmt.Fprintln(g.out, " r := jlexer.Lexer{Data: data}") - fmt.Fprintln(g.out, " "+fname+"(&r, v)") - fmt.Fprintln(g.out, " return r.Error()") - fmt.Fprintln(g.out, "}") - } - - fmt.Fprintln(g.out, "// UnmarshalEasyJSON supports easyjson.Unmarshaler interface") - fmt.Fprintln(g.out, "func (v *"+typ+") UnmarshalEasyJSON(l *jlexer.Lexer) {") - fmt.Fprintln(g.out, " "+fname+"(l, v)") - fmt.Fprintln(g.out, "}") - - return nil -} diff --git a/vendor/github.com/mailru/easyjson/gen/encoder.go b/vendor/github.com/mailru/easyjson/gen/encoder.go deleted file mode 100644 index 408ae5569c..0000000000 --- a/vendor/github.com/mailru/easyjson/gen/encoder.go +++ /dev/null @@ -1,369 +0,0 @@ -package gen - -import ( - "encoding" - "encoding/json" - "fmt" - "reflect" - "strconv" - "strings" - - "github.com/mailru/easyjson" -) - -func (g *Generator) getEncoderName(t reflect.Type) string { - return g.functionName("encode", t) -} - -var primitiveEncoders = map[reflect.Kind]string{ - reflect.String: "out.String(string(%v))", - reflect.Bool: "out.Bool(bool(%v))", - reflect.Int: "out.Int(int(%v))", - reflect.Int8: "out.Int8(int8(%v))", - reflect.Int16: "out.Int16(int16(%v))", - reflect.Int32: "out.Int32(int32(%v))", - reflect.Int64: "out.Int64(int64(%v))", - reflect.Uint: "out.Uint(uint(%v))", - reflect.Uint8: "out.Uint8(uint8(%v))", - reflect.Uint16: "out.Uint16(uint16(%v))", - reflect.Uint32: "out.Uint32(uint32(%v))", - reflect.Uint64: "out.Uint64(uint64(%v))", - reflect.Float32: "out.Float32(float32(%v))", - reflect.Float64: "out.Float64(float64(%v))", -} - -var primitiveStringEncoders = map[reflect.Kind]string{ - reflect.String: "out.String(string(%v))", - reflect.Int: "out.IntStr(int(%v))", - reflect.Int8: "out.Int8Str(int8(%v))", - reflect.Int16: "out.Int16Str(int16(%v))", - reflect.Int32: "out.Int32Str(int32(%v))", - reflect.Int64: "out.Int64Str(int64(%v))", - reflect.Uint: "out.UintStr(uint(%v))", - reflect.Uint8: "out.Uint8Str(uint8(%v))", - reflect.Uint16: "out.Uint16Str(uint16(%v))", - reflect.Uint32: "out.Uint32Str(uint32(%v))", - reflect.Uint64: "out.Uint64Str(uint64(%v))", - reflect.Uintptr: "out.UintptrStr(uintptr(%v))", -} - -// fieldTags contains parsed version of json struct field tags. -type fieldTags struct { - name string - - omit bool - omitEmpty bool - noOmitEmpty bool - asString bool - required bool -} - -// parseFieldTags parses the json field tag into a structure. -func parseFieldTags(f reflect.StructField) fieldTags { - var ret fieldTags - - for i, s := range strings.Split(f.Tag.Get("json"), ",") { - switch { - case i == 0 && s == "-": - ret.omit = true - case i == 0: - ret.name = s - case s == "omitempty": - ret.omitEmpty = true - case s == "!omitempty": - ret.noOmitEmpty = true - case s == "string": - ret.asString = true - case s == "required": - ret.required = true - } - } - - return ret -} - -// genTypeEncoder generates code that encodes in of type t into the writer, but uses marshaler interface if implemented by t. -func (g *Generator) genTypeEncoder(t reflect.Type, in string, tags fieldTags, indent int) error { - ws := strings.Repeat(" ", indent) - - marshalerIface := reflect.TypeOf((*easyjson.Marshaler)(nil)).Elem() - if reflect.PtrTo(t).Implements(marshalerIface) { - fmt.Fprintln(g.out, ws+"("+in+").MarshalEasyJSON(out)") - return nil - } - - marshalerIface = reflect.TypeOf((*json.Marshaler)(nil)).Elem() - if reflect.PtrTo(t).Implements(marshalerIface) { - fmt.Fprintln(g.out, ws+"out.Raw( ("+in+").MarshalJSON() )") - return nil - } - - marshalerIface = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() - if reflect.PtrTo(t).Implements(marshalerIface) { - fmt.Fprintln(g.out, ws+"out.RawText( ("+in+").MarshalText() )") - return nil - } - - err := g.genTypeEncoderNoCheck(t, in, tags, indent) - return err -} - -// genTypeEncoderNoCheck generates code that encodes in of type t into the writer. -func (g *Generator) genTypeEncoderNoCheck(t reflect.Type, in string, tags fieldTags, indent int) error { - ws := strings.Repeat(" ", indent) - - // Check whether type is primitive, needs to be done after interface check. - if enc := primitiveStringEncoders[t.Kind()]; enc != "" && tags.asString { - fmt.Fprintf(g.out, ws+enc+"\n", in) - return nil - } else if enc := primitiveEncoders[t.Kind()]; enc != "" { - fmt.Fprintf(g.out, ws+enc+"\n", in) - return nil - } - - switch t.Kind() { - case reflect.Slice: - elem := t.Elem() - iVar := g.uniqueVarName() - vVar := g.uniqueVarName() - - if t.Elem().Kind() == reflect.Uint8 { - fmt.Fprintln(g.out, ws+"out.Base64Bytes("+in+")") - } else { - fmt.Fprintln(g.out, ws+"if "+in+" == nil && (out.Flags & jwriter.NilSliceAsEmpty) == 0 {") - fmt.Fprintln(g.out, ws+` out.RawString("null")`) - fmt.Fprintln(g.out, ws+"} else {") - fmt.Fprintln(g.out, ws+" out.RawByte('[')") - fmt.Fprintln(g.out, ws+" for "+iVar+", "+vVar+" := range "+in+" {") - fmt.Fprintln(g.out, ws+" if "+iVar+" > 0 {") - fmt.Fprintln(g.out, ws+" out.RawByte(',')") - fmt.Fprintln(g.out, ws+" }") - - if err := g.genTypeEncoder(elem, vVar, tags, indent+2); err != nil { - return err - } - - fmt.Fprintln(g.out, ws+" }") - fmt.Fprintln(g.out, ws+" out.RawByte(']')") - fmt.Fprintln(g.out, ws+"}") - } - - case reflect.Array: - elem := t.Elem() - iVar := g.uniqueVarName() - - if t.Elem().Kind() == reflect.Uint8 { - fmt.Fprintln(g.out, ws+"out.Base64Bytes("+in+"[:])") - } else { - fmt.Fprintln(g.out, ws+"out.RawByte('[')") - fmt.Fprintln(g.out, ws+"for "+iVar+" := range "+in+" {") - fmt.Fprintln(g.out, ws+" if "+iVar+" > 0 {") - fmt.Fprintln(g.out, ws+" out.RawByte(',')") - fmt.Fprintln(g.out, ws+" }") - - if err := g.genTypeEncoder(elem, in+"["+iVar+"]", tags, indent+1); err != nil { - return err - } - - fmt.Fprintln(g.out, ws+"}") - fmt.Fprintln(g.out, ws+"out.RawByte(']')") - } - - case reflect.Struct: - enc := g.getEncoderName(t) - g.addType(t) - - fmt.Fprintln(g.out, ws+enc+"(out, "+in+")") - - case reflect.Ptr: - fmt.Fprintln(g.out, ws+"if "+in+" == nil {") - fmt.Fprintln(g.out, ws+` out.RawString("null")`) - fmt.Fprintln(g.out, ws+"} else {") - - if err := g.genTypeEncoder(t.Elem(), "*"+in, tags, indent+1); err != nil { - return err - } - - fmt.Fprintln(g.out, ws+"}") - - case reflect.Map: - key := t.Key() - keyEnc, ok := primitiveStringEncoders[key.Kind()] - if !ok { - return fmt.Errorf("map key type %v not supported: only string and integer keys are allowed", key) - } - tmpVar := g.uniqueVarName() - - fmt.Fprintln(g.out, ws+"if "+in+" == nil && (out.Flags & jwriter.NilMapAsEmpty) == 0 {") - fmt.Fprintln(g.out, ws+" out.RawString(`null`)") - fmt.Fprintln(g.out, ws+"} else {") - fmt.Fprintln(g.out, ws+" out.RawByte('{')") - fmt.Fprintln(g.out, ws+" "+tmpVar+"First := true") - fmt.Fprintln(g.out, ws+" for "+tmpVar+"Name, "+tmpVar+"Value := range "+in+" {") - fmt.Fprintln(g.out, ws+" if !"+tmpVar+"First { out.RawByte(',') }") - fmt.Fprintln(g.out, ws+" "+tmpVar+"First = false") - fmt.Fprintln(g.out, ws+" "+fmt.Sprintf(keyEnc, tmpVar+"Name")) - fmt.Fprintln(g.out, ws+" out.RawByte(':')") - - if err := g.genTypeEncoder(t.Elem(), tmpVar+"Value", tags, indent+2); err != nil { - return err - } - - fmt.Fprintln(g.out, ws+" }") - fmt.Fprintln(g.out, ws+" out.RawByte('}')") - fmt.Fprintln(g.out, ws+"}") - - case reflect.Interface: - if t.NumMethod() != 0 { - return fmt.Errorf("interface type %v not supported: only interface{} is allowed", t) - } - fmt.Fprintln(g.out, ws+"if m, ok := "+in+".(easyjson.Marshaler); ok {") - fmt.Fprintln(g.out, ws+" m.MarshalEasyJSON(out)") - fmt.Fprintln(g.out, ws+"} else if m, ok := "+in+".(json.Marshaler); ok {") - fmt.Fprintln(g.out, ws+" out.Raw(m.MarshalJSON())") - fmt.Fprintln(g.out, ws+"} else {") - fmt.Fprintln(g.out, ws+" out.Raw(json.Marshal("+in+"))") - fmt.Fprintln(g.out, ws+"}") - - default: - return fmt.Errorf("don't know how to encode %v", t) - } - return nil -} - -func (g *Generator) notEmptyCheck(t reflect.Type, v string) string { - optionalIface := reflect.TypeOf((*easyjson.Optional)(nil)).Elem() - if reflect.PtrTo(t).Implements(optionalIface) { - return "(" + v + ").IsDefined()" - } - - switch t.Kind() { - case reflect.Slice, reflect.Map: - return "len(" + v + ") != 0" - case reflect.Interface, reflect.Ptr: - return v + " != nil" - case reflect.Bool: - return v - case reflect.String: - return v + ` != ""` - case reflect.Float32, reflect.Float64, - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - - return v + " != 0" - - default: - // note: Array types don't have a useful empty value - return "true" - } -} - -func (g *Generator) genStructFieldEncoder(t reflect.Type, f reflect.StructField) error { - jsonName := g.fieldNamer.GetJSONFieldName(t, f) - tags := parseFieldTags(f) - - if tags.omit { - return nil - } - if !tags.omitEmpty && !g.omitEmpty || tags.noOmitEmpty { - fmt.Fprintln(g.out, " if !first { out.RawByte(',') }") - fmt.Fprintln(g.out, " first = false") - fmt.Fprintf(g.out, " out.RawString(%q)\n", strconv.Quote(jsonName)+":") - return g.genTypeEncoder(f.Type, "in."+f.Name, tags, 1) - } - - fmt.Fprintln(g.out, " if", g.notEmptyCheck(f.Type, "in."+f.Name), "{") - fmt.Fprintln(g.out, " if !first { out.RawByte(',') }") - fmt.Fprintln(g.out, " first = false") - - fmt.Fprintf(g.out, " out.RawString(%q)\n", strconv.Quote(jsonName)+":") - if err := g.genTypeEncoder(f.Type, "in."+f.Name, tags, 2); err != nil { - return err - } - fmt.Fprintln(g.out, " }") - return nil -} - -func (g *Generator) genEncoder(t reflect.Type) error { - switch t.Kind() { - case reflect.Slice, reflect.Array, reflect.Map: - return g.genSliceArrayMapEncoder(t) - default: - return g.genStructEncoder(t) - } -} - -func (g *Generator) genSliceArrayMapEncoder(t reflect.Type) error { - switch t.Kind() { - case reflect.Slice, reflect.Array, reflect.Map: - default: - return fmt.Errorf("cannot generate encoder/decoder for %v, not a slice/array/map type", t) - } - - fname := g.getEncoderName(t) - typ := g.getType(t) - - fmt.Fprintln(g.out, "func "+fname+"(out *jwriter.Writer, in "+typ+") {") - err := g.genTypeEncoderNoCheck(t, "in", fieldTags{}, 1) - if err != nil { - return err - } - fmt.Fprintln(g.out, "}") - return nil -} - -func (g *Generator) genStructEncoder(t reflect.Type) error { - if t.Kind() != reflect.Struct { - return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct type", t) - } - - fname := g.getEncoderName(t) - typ := g.getType(t) - - fmt.Fprintln(g.out, "func "+fname+"(out *jwriter.Writer, in "+typ+") {") - fmt.Fprintln(g.out, " out.RawByte('{')") - fmt.Fprintln(g.out, " first := true") - fmt.Fprintln(g.out, " _ = first") - - fs, err := getStructFields(t) - if err != nil { - return fmt.Errorf("cannot generate encoder for %v: %v", t, err) - } - for _, f := range fs { - if err := g.genStructFieldEncoder(t, f); err != nil { - return err - } - } - - fmt.Fprintln(g.out, " out.RawByte('}')") - fmt.Fprintln(g.out, "}") - - return nil -} - -func (g *Generator) genStructMarshaler(t reflect.Type) error { - switch t.Kind() { - case reflect.Slice, reflect.Array, reflect.Map, reflect.Struct: - default: - return fmt.Errorf("cannot generate encoder/decoder for %v, not a struct/slice/array/map type", t) - } - - fname := g.getEncoderName(t) - typ := g.getType(t) - - if !g.noStdMarshalers { - fmt.Fprintln(g.out, "// MarshalJSON supports json.Marshaler interface") - fmt.Fprintln(g.out, "func (v "+typ+") MarshalJSON() ([]byte, error) {") - fmt.Fprintln(g.out, " w := jwriter.Writer{}") - fmt.Fprintln(g.out, " "+fname+"(&w, v)") - fmt.Fprintln(g.out, " return w.Buffer.BuildBytes(), w.Error") - fmt.Fprintln(g.out, "}") - } - - fmt.Fprintln(g.out, "// MarshalEasyJSON supports easyjson.Marshaler interface") - fmt.Fprintln(g.out, "func (v "+typ+") MarshalEasyJSON(w *jwriter.Writer) {") - fmt.Fprintln(g.out, " "+fname+"(w, v)") - fmt.Fprintln(g.out, "}") - - return nil -} diff --git a/vendor/github.com/mailru/easyjson/gen/generator.go b/vendor/github.com/mailru/easyjson/gen/generator.go deleted file mode 100644 index eb0d70ba27..0000000000 --- a/vendor/github.com/mailru/easyjson/gen/generator.go +++ /dev/null @@ -1,523 +0,0 @@ -package gen - -import ( - "bytes" - "fmt" - "hash/fnv" - "io" - "path" - "reflect" - "sort" - "strconv" - "strings" - "unicode" -) - -const pkgWriter = "github.com/mailru/easyjson/jwriter" -const pkgLexer = "github.com/mailru/easyjson/jlexer" -const pkgEasyJSON = "github.com/mailru/easyjson" - -// FieldNamer defines a policy for generating names for struct fields. -type FieldNamer interface { - GetJSONFieldName(t reflect.Type, f reflect.StructField) string -} - -// Generator generates the requested marshaler/unmarshalers. -type Generator struct { - out *bytes.Buffer - - pkgName string - pkgPath string - buildTags string - hashString string - - varCounter int - - noStdMarshalers bool - omitEmpty bool - fieldNamer FieldNamer - - // package path to local alias map for tracking imports - imports map[string]string - - // types that marshalers were requested for by user - marshalers map[reflect.Type]bool - - // types that encoders were already generated for - typesSeen map[reflect.Type]bool - - // types that encoders were requested for (e.g. by encoders of other types) - typesUnseen []reflect.Type - - // function name to relevant type maps to track names of de-/encoders in - // case of a name clash or unnamed structs - functionNames map[string]reflect.Type -} - -// NewGenerator initializes and returns a Generator. -func NewGenerator(filename string) *Generator { - ret := &Generator{ - imports: map[string]string{ - pkgWriter: "jwriter", - pkgLexer: "jlexer", - pkgEasyJSON: "easyjson", - "encoding/json": "json", - }, - fieldNamer: DefaultFieldNamer{}, - marshalers: make(map[reflect.Type]bool), - typesSeen: make(map[reflect.Type]bool), - functionNames: make(map[string]reflect.Type), - } - - // Use a file-unique prefix on all auxiliary funcs to avoid - // name clashes. - hash := fnv.New32() - hash.Write([]byte(filename)) - ret.hashString = fmt.Sprintf("%x", hash.Sum32()) - - return ret -} - -// SetPkg sets the name and path of output package. -func (g *Generator) SetPkg(name, path string) { - g.pkgName = name - g.pkgPath = path -} - -// SetBuildTags sets build tags for the output file. -func (g *Generator) SetBuildTags(tags string) { - g.buildTags = tags -} - -// SetFieldNamer sets field naming strategy. -func (g *Generator) SetFieldNamer(n FieldNamer) { - g.fieldNamer = n -} - -// UseSnakeCase sets snake_case field naming strategy. -func (g *Generator) UseSnakeCase() { - g.fieldNamer = SnakeCaseFieldNamer{} -} - -// UseLowerCamelCase sets lowerCamelCase field naming strategy. -func (g *Generator) UseLowerCamelCase() { - g.fieldNamer = LowerCamelCaseFieldNamer{} -} - -// NoStdMarshalers instructs not to generate standard MarshalJSON/UnmarshalJSON -// methods (only the custom interface). -func (g *Generator) NoStdMarshalers() { - g.noStdMarshalers = true -} - -// OmitEmpty triggers `json=",omitempty"` behaviour by default. -func (g *Generator) OmitEmpty() { - g.omitEmpty = true -} - -// addTypes requests to generate encoding/decoding funcs for the given type. -func (g *Generator) addType(t reflect.Type) { - if g.typesSeen[t] { - return - } - for _, t1 := range g.typesUnseen { - if t1 == t { - return - } - } - g.typesUnseen = append(g.typesUnseen, t) -} - -// Add requests to generate marshaler/unmarshalers and encoding/decoding -// funcs for the type of given object. -func (g *Generator) Add(obj interface{}) { - t := reflect.TypeOf(obj) - if t.Kind() == reflect.Ptr { - t = t.Elem() - } - g.addType(t) - g.marshalers[t] = true -} - -// printHeader prints package declaration and imports. -func (g *Generator) printHeader() { - if g.buildTags != "" { - fmt.Println("// +build ", g.buildTags) - fmt.Println() - } - fmt.Println("// Code generated by easyjson for marshaling/unmarshaling. DO NOT EDIT.") - fmt.Println() - fmt.Println("package ", g.pkgName) - fmt.Println() - - byAlias := map[string]string{} - var aliases []string - for path, alias := range g.imports { - aliases = append(aliases, alias) - byAlias[alias] = path - } - - sort.Strings(aliases) - fmt.Println("import (") - for _, alias := range aliases { - fmt.Printf(" %s %q\n", alias, byAlias[alias]) - } - - fmt.Println(")") - fmt.Println("") - fmt.Println("// suppress unused package warning") - fmt.Println("var (") - fmt.Println(" _ *json.RawMessage") - fmt.Println(" _ *jlexer.Lexer") - fmt.Println(" _ *jwriter.Writer") - fmt.Println(" _ easyjson.Marshaler") - fmt.Println(")") - - fmt.Println() -} - -// Run runs the generator and outputs generated code to out. -func (g *Generator) Run(out io.Writer) error { - g.out = &bytes.Buffer{} - - for len(g.typesUnseen) > 0 { - t := g.typesUnseen[len(g.typesUnseen)-1] - g.typesUnseen = g.typesUnseen[:len(g.typesUnseen)-1] - g.typesSeen[t] = true - - if err := g.genDecoder(t); err != nil { - return err - } - if err := g.genEncoder(t); err != nil { - return err - } - - if !g.marshalers[t] { - continue - } - - if err := g.genStructMarshaler(t); err != nil { - return err - } - if err := g.genStructUnmarshaler(t); err != nil { - return err - } - } - g.printHeader() - _, err := out.Write(g.out.Bytes()) - return err -} - -// fixes vendored paths -func fixPkgPathVendoring(pkgPath string) string { - const vendor = "/vendor/" - if i := strings.LastIndex(pkgPath, vendor); i != -1 { - return pkgPath[i+len(vendor):] - } - return pkgPath -} - -func fixAliasName(alias string) string { - alias = strings.Replace( - strings.Replace(alias, ".", "_", -1), - "-", - "_", - -1, - ) - - if alias[0] == 'v' { // to void conflicting with var names, say v1 - alias = "_" + alias - } - return alias -} - -// pkgAlias creates and returns and import alias for a given package. -func (g *Generator) pkgAlias(pkgPath string) string { - pkgPath = fixPkgPathVendoring(pkgPath) - if alias := g.imports[pkgPath]; alias != "" { - return alias - } - - for i := 0; ; i++ { - alias := fixAliasName(path.Base(pkgPath)) - if i > 0 { - alias += fmt.Sprint(i) - } - - exists := false - for _, v := range g.imports { - if v == alias { - exists = true - break - } - } - - if !exists { - g.imports[pkgPath] = alias - return alias - } - } -} - -// getType return the textual type name of given type that can be used in generated code. -func (g *Generator) getType(t reflect.Type) string { - if t.Name() == "" { - switch t.Kind() { - case reflect.Ptr: - return "*" + g.getType(t.Elem()) - case reflect.Slice: - return "[]" + g.getType(t.Elem()) - case reflect.Array: - return "[" + strconv.Itoa(t.Len()) + "]" + g.getType(t.Elem()) - case reflect.Map: - return "map[" + g.getType(t.Key()) + "]" + g.getType(t.Elem()) - } - } - - if t.Name() == "" || t.PkgPath() == "" { - if t.Kind() == reflect.Struct { - // the fields of an anonymous struct can have named types, - // and t.String() will not be sufficient because it does not - // remove the package name when it matches g.pkgPath. - // so we convert by hand - nf := t.NumField() - lines := make([]string, 0, nf) - for i := 0; i < nf; i++ { - f := t.Field(i) - line := f.Name + " " + g.getType(f.Type) - t := f.Tag - if t != "" { - line += " " + escapeTag(t) - } - lines = append(lines, line) - } - return strings.Join([]string{"struct { ", strings.Join(lines, "; "), " }"}, "") - } - return t.String() - } else if t.PkgPath() == g.pkgPath { - return t.Name() - } - return g.pkgAlias(t.PkgPath()) + "." + t.Name() -} - -// escape a struct field tag string back to source code -func escapeTag(tag reflect.StructTag) string { - t := string(tag) - if strings.ContainsRune(t, '`') { - // there are ` in the string; we can't use ` to enclose the string - return strconv.Quote(t) - } - return "`" + t + "`" -} - -// uniqueVarName returns a file-unique name that can be used for generated variables. -func (g *Generator) uniqueVarName() string { - g.varCounter++ - return fmt.Sprint("v", g.varCounter) -} - -// safeName escapes unsafe characters in pkg/type name and returns a string that can be used -// in encoder/decoder names for the type. -func (g *Generator) safeName(t reflect.Type) string { - name := t.PkgPath() - if t.Name() == "" { - name += "anonymous" - } else { - name += "." + t.Name() - } - - parts := []string{} - part := []rune{} - for _, c := range name { - if unicode.IsLetter(c) || unicode.IsDigit(c) { - part = append(part, c) - } else if len(part) > 0 { - parts = append(parts, string(part)) - part = []rune{} - } - } - return joinFunctionNameParts(false, parts...) -} - -// functionName returns a function name for a given type with a given prefix. If a function -// with this prefix already exists for a type, it is returned. -// -// Method is used to track encoder/decoder names for the type. -func (g *Generator) functionName(prefix string, t reflect.Type) string { - prefix = joinFunctionNameParts(true, "easyjson", g.hashString, prefix) - name := joinFunctionNameParts(true, prefix, g.safeName(t)) - - // Most of the names will be unique, try a shortcut first. - if e, ok := g.functionNames[name]; !ok || e == t { - g.functionNames[name] = t - return name - } - - // Search if the function already exists. - for name1, t1 := range g.functionNames { - if t1 == t && strings.HasPrefix(name1, prefix) { - return name1 - } - } - - // Create a new name in the case of a clash. - for i := 1; ; i++ { - nm := fmt.Sprint(name, i) - if _, ok := g.functionNames[nm]; ok { - continue - } - g.functionNames[nm] = t - return nm - } -} - -// DefaultFieldsNamer implements trivial naming policy equivalent to encoding/json. -type DefaultFieldNamer struct{} - -func (DefaultFieldNamer) GetJSONFieldName(t reflect.Type, f reflect.StructField) string { - jsonName := strings.Split(f.Tag.Get("json"), ",")[0] - if jsonName != "" { - return jsonName - } else { - return f.Name - } -} - -// LowerCamelCaseFieldNamer -type LowerCamelCaseFieldNamer struct{} - -func isLower(b byte) bool { - return b <= 122 && b >= 97 -} - -func isUpper(b byte) bool { - return b >= 65 && b <= 90 -} - -// convert HTTPRestClient to httpRestClient -func lowerFirst(s string) string { - if s == "" { - return "" - } - - str := "" - strlen := len(s) - - /** - Loop each char - If is uppercase: - If is first char, LOWER it - If the following char is lower, LEAVE it - If the following char is upper OR numeric, LOWER it - If is the end of string, LEAVE it - Else lowercase - */ - - foundLower := false - for i := range s { - ch := s[i] - if isUpper(ch) { - if i == 0 { - str += string(ch + 32) - } else if !foundLower { // Currently just a stream of capitals, eg JSONRESTS[erver] - if strlen > (i+1) && isLower(s[i+1]) { - // Next char is lower, keep this a capital - str += string(ch) - } else { - // Either at end of string or next char is capital - str += string(ch + 32) - } - } else { - str += string(ch) - } - } else { - foundLower = true - str += string(ch) - } - } - - return str -} - -func (LowerCamelCaseFieldNamer) GetJSONFieldName(t reflect.Type, f reflect.StructField) string { - jsonName := strings.Split(f.Tag.Get("json"), ",")[0] - if jsonName != "" { - return jsonName - } else { - return lowerFirst(f.Name) - } -} - -// SnakeCaseFieldNamer implements CamelCase to snake_case conversion for fields names. -type SnakeCaseFieldNamer struct{} - -func camelToSnake(name string) string { - var ret bytes.Buffer - - multipleUpper := false - var lastUpper rune - var beforeUpper rune - - for _, c := range name { - // Non-lowercase character after uppercase is considered to be uppercase too. - isUpper := (unicode.IsUpper(c) || (lastUpper != 0 && !unicode.IsLower(c))) - - if lastUpper != 0 { - // Output a delimiter if last character was either the first uppercase character - // in a row, or the last one in a row (e.g. 'S' in "HTTPServer"). - // Do not output a delimiter at the beginning of the name. - - firstInRow := !multipleUpper - lastInRow := !isUpper - - if ret.Len() > 0 && (firstInRow || lastInRow) && beforeUpper != '_' { - ret.WriteByte('_') - } - ret.WriteRune(unicode.ToLower(lastUpper)) - } - - // Buffer uppercase char, do not output it yet as a delimiter may be required if the - // next character is lowercase. - if isUpper { - multipleUpper = (lastUpper != 0) - lastUpper = c - continue - } - - ret.WriteRune(c) - lastUpper = 0 - beforeUpper = c - multipleUpper = false - } - - if lastUpper != 0 { - ret.WriteRune(unicode.ToLower(lastUpper)) - } - return string(ret.Bytes()) -} - -func (SnakeCaseFieldNamer) GetJSONFieldName(t reflect.Type, f reflect.StructField) string { - jsonName := strings.Split(f.Tag.Get("json"), ",")[0] - if jsonName != "" { - return jsonName - } - - return camelToSnake(f.Name) -} - -func joinFunctionNameParts(keepFirst bool, parts ...string) string { - buf := bytes.NewBufferString("") - for i, part := range parts { - if i == 0 && keepFirst { - buf.WriteString(part) - } else { - if len(part) > 0 { - buf.WriteString(strings.ToUpper(string(part[0]))) - } - if len(part) > 1 { - buf.WriteString(part[1:]) - } - } - } - return buf.String() -} diff --git a/vendor/github.com/mailru/easyjson/gen/generator_test.go b/vendor/github.com/mailru/easyjson/gen/generator_test.go deleted file mode 100644 index 0c9d278458..0000000000 --- a/vendor/github.com/mailru/easyjson/gen/generator_test.go +++ /dev/null @@ -1,87 +0,0 @@ -package gen - -import ( - "testing" -) - -func TestCamelToSnake(t *testing.T) { - for i, test := range []struct { - In, Out string - }{ - {"", ""}, - {"A", "a"}, - {"SimpleExample", "simple_example"}, - {"internalField", "internal_field"}, - - {"SomeHTTPStuff", "some_http_stuff"}, - {"WriteJSON", "write_json"}, - {"HTTP2Server", "http2_server"}, - {"Some_Mixed_Case", "some_mixed_case"}, - {"do_nothing", "do_nothing"}, - - {"JSONHTTPRPCServer", "jsonhttprpc_server"}, // nothing can be done here without a dictionary - } { - got := camelToSnake(test.In) - if got != test.Out { - t.Errorf("[%d] camelToSnake(%s) = %s; want %s", i, test.In, got, test.Out) - } - } -} - -func TestCamelToLowerCamel(t *testing.T) { - for i, test := range []struct { - In, Out string - }{ - {"", ""}, - {"A", "a"}, - {"SimpleExample", "simpleExample"}, - {"internalField", "internalField"}, - - {"SomeHTTPStuff", "someHTTPStuff"}, - {"WriteJSON", "writeJSON"}, - {"HTTP2Server", "http2Server"}, - - {"JSONHTTPRPCServer", "jsonhttprpcServer"}, // nothing can be done here without a dictionary - } { - got := lowerFirst(test.In) - if got != test.Out { - t.Errorf("[%d] lowerFirst(%s) = %s; want %s", i, test.In, got, test.Out) - } - } -} - -func TestJoinFunctionNameParts(t *testing.T) { - for i, test := range []struct { - keepFirst bool - parts []string - out string - }{ - {false, []string{}, ""}, - {false, []string{"a"}, "A"}, - {false, []string{"simple", "example"}, "SimpleExample"}, - {true, []string{"first", "example"}, "firstExample"}, - {false, []string{"some", "UPPER", "case"}, "SomeUPPERCase"}, - {false, []string{"number", "123"}, "Number123"}, - } { - got := joinFunctionNameParts(test.keepFirst, test.parts...) - if got != test.out { - t.Errorf("[%d] joinFunctionNameParts(%v) = %s; want %s", i, test.parts, got, test.out) - } - } -} - -func TestFixVendorPath(t *testing.T) { - for i, test := range []struct { - In, Out string - }{ - {"", ""}, - {"time", "time"}, - {"project/vendor/subpackage", "subpackage"}, - } { - got := fixPkgPathVendoring(test.In) - if got != test.Out { - t.Errorf("[%d] fixPkgPathVendoring(%s) = %s; want %s", i, test.In, got, test.Out) - } - } - -} diff --git a/vendor/github.com/mailru/easyjson/helpers.go b/vendor/github.com/mailru/easyjson/helpers.go deleted file mode 100644 index b86b87d228..0000000000 --- a/vendor/github.com/mailru/easyjson/helpers.go +++ /dev/null @@ -1,78 +0,0 @@ -// Package easyjson contains marshaler/unmarshaler interfaces and helper functions. -package easyjson - -import ( - "io" - "io/ioutil" - "net/http" - "strconv" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// Marshaler is an easyjson-compatible marshaler interface. -type Marshaler interface { - MarshalEasyJSON(w *jwriter.Writer) -} - -// Marshaler is an easyjson-compatible unmarshaler interface. -type Unmarshaler interface { - UnmarshalEasyJSON(w *jlexer.Lexer) -} - -// Optional defines an undefined-test method for a type to integrate with 'omitempty' logic. -type Optional interface { - IsDefined() bool -} - -// Marshal returns data as a single byte slice. Method is suboptimal as the data is likely to be copied -// from a chain of smaller chunks. -func Marshal(v Marshaler) ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.BuildBytes() -} - -// MarshalToWriter marshals the data to an io.Writer. -func MarshalToWriter(v Marshaler, w io.Writer) (written int, err error) { - jw := jwriter.Writer{} - v.MarshalEasyJSON(&jw) - return jw.DumpTo(w) -} - -// MarshalToHTTPResponseWriter sets Content-Length and Content-Type headers for the -// http.ResponseWriter, and send the data to the writer. started will be equal to -// false if an error occurred before any http.ResponseWriter methods were actually -// invoked (in this case a 500 reply is possible). -func MarshalToHTTPResponseWriter(v Marshaler, w http.ResponseWriter) (started bool, written int, err error) { - jw := jwriter.Writer{} - v.MarshalEasyJSON(&jw) - if jw.Error != nil { - return false, 0, jw.Error - } - w.Header().Set("Content-Type", "application/json") - w.Header().Set("Content-Length", strconv.Itoa(jw.Size())) - - started = true - written, err = jw.DumpTo(w) - return -} - -// Unmarshal decodes the JSON in data into the object. -func Unmarshal(data []byte, v Unmarshaler) error { - l := jlexer.Lexer{Data: data} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// UnmarshalFromReader reads all the data in the reader and decodes as JSON into the object. -func UnmarshalFromReader(r io.Reader, v Unmarshaler) error { - data, err := ioutil.ReadAll(r) - if err != nil { - return err - } - l := jlexer.Lexer{Data: data} - v.UnmarshalEasyJSON(&l) - return l.Error() -} diff --git a/vendor/github.com/mailru/easyjson/jlexer/bytestostr.go b/vendor/github.com/mailru/easyjson/jlexer/bytestostr.go deleted file mode 100644 index ff7b27c5b2..0000000000 --- a/vendor/github.com/mailru/easyjson/jlexer/bytestostr.go +++ /dev/null @@ -1,24 +0,0 @@ -// This file will only be included to the build if neither -// easyjson_nounsafe nor appengine build tag is set. See README notes -// for more details. - -//+build !easyjson_nounsafe -//+build !appengine - -package jlexer - -import ( - "reflect" - "unsafe" -) - -// bytesToStr creates a string pointing at the slice to avoid copying. -// -// Warning: the string returned by the function should be used with care, as the whole input data -// chunk may be either blocked from being freed by GC because of a single string or the buffer.Data -// may be garbage-collected even when the string exists. -func bytesToStr(data []byte) string { - h := (*reflect.SliceHeader)(unsafe.Pointer(&data)) - shdr := reflect.StringHeader{Data: h.Data, Len: h.Len} - return *(*string)(unsafe.Pointer(&shdr)) -} diff --git a/vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go b/vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go deleted file mode 100644 index 864d1be676..0000000000 --- a/vendor/github.com/mailru/easyjson/jlexer/bytestostr_nounsafe.go +++ /dev/null @@ -1,13 +0,0 @@ -// This file is included to the build if any of the buildtags below -// are defined. Refer to README notes for more details. - -//+build easyjson_nounsafe appengine - -package jlexer - -// bytesToStr creates a string normally from []byte -// -// Note that this method is roughly 1.5x slower than using the 'unsafe' method. -func bytesToStr(data []byte) string { - return string(data) -} diff --git a/vendor/github.com/mailru/easyjson/jlexer/error.go b/vendor/github.com/mailru/easyjson/jlexer/error.go deleted file mode 100644 index e90ec40d05..0000000000 --- a/vendor/github.com/mailru/easyjson/jlexer/error.go +++ /dev/null @@ -1,15 +0,0 @@ -package jlexer - -import "fmt" - -// LexerError implements the error interface and represents all possible errors that can be -// generated during parsing the JSON data. -type LexerError struct { - Reason string - Offset int - Data string -} - -func (l *LexerError) Error() string { - return fmt.Sprintf("parse error: %s near offset %d of '%s'", l.Reason, l.Offset, l.Data) -} diff --git a/vendor/github.com/mailru/easyjson/jlexer/lexer.go b/vendor/github.com/mailru/easyjson/jlexer/lexer.go deleted file mode 100644 index e5558ae39c..0000000000 --- a/vendor/github.com/mailru/easyjson/jlexer/lexer.go +++ /dev/null @@ -1,1141 +0,0 @@ -// Package jlexer contains a JSON lexer implementation. -// -// It is expected that it is mostly used with generated parser code, so the interface is tuned -// for a parser that knows what kind of data is expected. -package jlexer - -import ( - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "io" - "strconv" - "unicode" - "unicode/utf16" - "unicode/utf8" -) - -// tokenKind determines type of a token. -type tokenKind byte - -const ( - tokenUndef tokenKind = iota // No token. - tokenDelim // Delimiter: one of '{', '}', '[' or ']'. - tokenString // A string literal, e.g. "abc\u1234" - tokenNumber // Number literal, e.g. 1.5e5 - tokenBool // Boolean literal: true or false. - tokenNull // null keyword. -) - -// token describes a single token: type, position in the input and value. -type token struct { - kind tokenKind // Type of a token. - - boolValue bool // Value if a boolean literal token. - byteValue []byte // Raw value of a token. - delimValue byte -} - -// Lexer is a JSON lexer: it iterates over JSON tokens in a byte slice. -type Lexer struct { - Data []byte // Input data given to the lexer. - - start int // Start of the current token. - pos int // Current unscanned position in the input stream. - token token // Last scanned token, if token.kind != tokenUndef. - - firstElement bool // Whether current element is the first in array or an object. - wantSep byte // A comma or a colon character, which need to occur before a token. - - UseMultipleErrors bool // If we want to use multiple errors. - fatalError error // Fatal error occurred during lexing. It is usually a syntax error. - multipleErrors []*LexerError // Semantic errors occurred during lexing. Marshalling will be continued after finding this errors. -} - -// FetchToken scans the input for the next token. -func (r *Lexer) FetchToken() { - r.token.kind = tokenUndef - r.start = r.pos - - // Check if r.Data has r.pos element - // If it doesn't, it mean corrupted input data - if len(r.Data) < r.pos { - r.errParse("Unexpected end of data") - return - } - // Determine the type of a token by skipping whitespace and reading the - // first character. - for _, c := range r.Data[r.pos:] { - switch c { - case ':', ',': - if r.wantSep == c { - r.pos++ - r.start++ - r.wantSep = 0 - } else { - r.errSyntax() - } - - case ' ', '\t', '\r', '\n': - r.pos++ - r.start++ - - case '"': - if r.wantSep != 0 { - r.errSyntax() - } - - r.token.kind = tokenString - r.fetchString() - return - - case '{', '[': - if r.wantSep != 0 { - r.errSyntax() - } - r.firstElement = true - r.token.kind = tokenDelim - r.token.delimValue = r.Data[r.pos] - r.pos++ - return - - case '}', ']': - if !r.firstElement && (r.wantSep != ',') { - r.errSyntax() - } - r.wantSep = 0 - r.token.kind = tokenDelim - r.token.delimValue = r.Data[r.pos] - r.pos++ - return - - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-': - if r.wantSep != 0 { - r.errSyntax() - } - r.token.kind = tokenNumber - r.fetchNumber() - return - - case 'n': - if r.wantSep != 0 { - r.errSyntax() - } - - r.token.kind = tokenNull - r.fetchNull() - return - - case 't': - if r.wantSep != 0 { - r.errSyntax() - } - - r.token.kind = tokenBool - r.token.boolValue = true - r.fetchTrue() - return - - case 'f': - if r.wantSep != 0 { - r.errSyntax() - } - - r.token.kind = tokenBool - r.token.boolValue = false - r.fetchFalse() - return - - default: - r.errSyntax() - return - } - } - r.fatalError = io.EOF - return -} - -// isTokenEnd returns true if the char can follow a non-delimiter token -func isTokenEnd(c byte) bool { - return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '[' || c == ']' || c == '{' || c == '}' || c == ',' || c == ':' -} - -// fetchNull fetches and checks remaining bytes of null keyword. -func (r *Lexer) fetchNull() { - r.pos += 4 - if r.pos > len(r.Data) || - r.Data[r.pos-3] != 'u' || - r.Data[r.pos-2] != 'l' || - r.Data[r.pos-1] != 'l' || - (r.pos != len(r.Data) && !isTokenEnd(r.Data[r.pos])) { - - r.pos -= 4 - r.errSyntax() - } -} - -// fetchTrue fetches and checks remaining bytes of true keyword. -func (r *Lexer) fetchTrue() { - r.pos += 4 - if r.pos > len(r.Data) || - r.Data[r.pos-3] != 'r' || - r.Data[r.pos-2] != 'u' || - r.Data[r.pos-1] != 'e' || - (r.pos != len(r.Data) && !isTokenEnd(r.Data[r.pos])) { - - r.pos -= 4 - r.errSyntax() - } -} - -// fetchFalse fetches and checks remaining bytes of false keyword. -func (r *Lexer) fetchFalse() { - r.pos += 5 - if r.pos > len(r.Data) || - r.Data[r.pos-4] != 'a' || - r.Data[r.pos-3] != 'l' || - r.Data[r.pos-2] != 's' || - r.Data[r.pos-1] != 'e' || - (r.pos != len(r.Data) && !isTokenEnd(r.Data[r.pos])) { - - r.pos -= 5 - r.errSyntax() - } -} - -// fetchNumber scans a number literal token. -func (r *Lexer) fetchNumber() { - hasE := false - afterE := false - hasDot := false - - r.pos++ - for i, c := range r.Data[r.pos:] { - switch { - case c >= '0' && c <= '9': - afterE = false - case c == '.' && !hasDot: - hasDot = true - case (c == 'e' || c == 'E') && !hasE: - hasE = true - hasDot = true - afterE = true - case (c == '+' || c == '-') && afterE: - afterE = false - default: - r.pos += i - if !isTokenEnd(c) { - r.errSyntax() - } else { - r.token.byteValue = r.Data[r.start:r.pos] - } - return - } - } - - r.pos = len(r.Data) - r.token.byteValue = r.Data[r.start:] -} - -// findStringLen tries to scan into the string literal for ending quote char to determine required size. -// The size will be exact if no escapes are present and may be inexact if there are escaped chars. -func findStringLen(data []byte) (hasEscapes bool, length int) { - delta := 0 - - for i := 0; i < len(data); i++ { - switch data[i] { - case '\\': - i++ - delta++ - if i < len(data) && data[i] == 'u' { - delta++ - } - case '"': - return (delta > 0), (i - delta) - } - } - - return false, len(data) -} - -// getu4 decodes \uXXXX from the beginning of s, returning the hex value, -// or it returns -1. -func getu4(s []byte) rune { - if len(s) < 6 || s[0] != '\\' || s[1] != 'u' { - return -1 - } - var val rune - for i := 2; i < len(s) && i < 6; i++ { - var v byte - c := s[i] - switch c { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - v = c - '0' - case 'a', 'b', 'c', 'd', 'e', 'f': - v = c - 'a' + 10 - case 'A', 'B', 'C', 'D', 'E', 'F': - v = c - 'A' + 10 - default: - return -1 - } - - val <<= 4 - val |= rune(v) - } - return val -} - -// processEscape processes a single escape sequence and returns number of bytes processed. -func (r *Lexer) processEscape(data []byte) (int, error) { - if len(data) < 2 { - return 0, fmt.Errorf("syntax error at %v", string(data)) - } - - c := data[1] - switch c { - case '"', '/', '\\': - r.token.byteValue = append(r.token.byteValue, c) - return 2, nil - case 'b': - r.token.byteValue = append(r.token.byteValue, '\b') - return 2, nil - case 'f': - r.token.byteValue = append(r.token.byteValue, '\f') - return 2, nil - case 'n': - r.token.byteValue = append(r.token.byteValue, '\n') - return 2, nil - case 'r': - r.token.byteValue = append(r.token.byteValue, '\r') - return 2, nil - case 't': - r.token.byteValue = append(r.token.byteValue, '\t') - return 2, nil - case 'u': - rr := getu4(data) - if rr < 0 { - return 0, errors.New("syntax error") - } - - read := 6 - if utf16.IsSurrogate(rr) { - rr1 := getu4(data[read:]) - if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar { - read += 6 - rr = dec - } else { - rr = unicode.ReplacementChar - } - } - var d [4]byte - s := utf8.EncodeRune(d[:], rr) - r.token.byteValue = append(r.token.byteValue, d[:s]...) - return read, nil - } - - return 0, errors.New("syntax error") -} - -// fetchString scans a string literal token. -func (r *Lexer) fetchString() { - r.pos++ - data := r.Data[r.pos:] - - hasEscapes, length := findStringLen(data) - if !hasEscapes { - r.token.byteValue = data[:length] - r.pos += length + 1 - return - } - - r.token.byteValue = make([]byte, 0, length) - p := 0 - for i := 0; i < len(data); { - switch data[i] { - case '"': - r.pos += i + 1 - r.token.byteValue = append(r.token.byteValue, data[p:i]...) - i++ - return - - case '\\': - r.token.byteValue = append(r.token.byteValue, data[p:i]...) - off, err := r.processEscape(data[i:]) - if err != nil { - r.errParse(err.Error()) - return - } - i += off - p = i - - default: - i++ - } - } - r.errParse("unterminated string literal") -} - -// scanToken scans the next token if no token is currently available in the lexer. -func (r *Lexer) scanToken() { - if r.token.kind != tokenUndef || r.fatalError != nil { - return - } - - r.FetchToken() -} - -// consume resets the current token to allow scanning the next one. -func (r *Lexer) consume() { - r.token.kind = tokenUndef - r.token.delimValue = 0 -} - -// Ok returns true if no error (including io.EOF) was encountered during scanning. -func (r *Lexer) Ok() bool { - return r.fatalError == nil -} - -const maxErrorContextLen = 13 - -func (r *Lexer) errParse(what string) { - if r.fatalError == nil { - var str string - if len(r.Data)-r.pos <= maxErrorContextLen { - str = string(r.Data) - } else { - str = string(r.Data[r.pos:r.pos+maxErrorContextLen-3]) + "..." - } - r.fatalError = &LexerError{ - Reason: what, - Offset: r.pos, - Data: str, - } - } -} - -func (r *Lexer) errSyntax() { - r.errParse("syntax error") -} - -func (r *Lexer) errInvalidToken(expected string) { - if r.fatalError != nil { - return - } - if r.UseMultipleErrors { - r.pos = r.start - r.consume() - r.SkipRecursive() - switch expected { - case "[": - r.token.delimValue = ']' - r.token.kind = tokenDelim - case "{": - r.token.delimValue = '}' - r.token.kind = tokenDelim - } - r.addNonfatalError(&LexerError{ - Reason: fmt.Sprintf("expected %s", expected), - Offset: r.start, - Data: string(r.Data[r.start:r.pos]), - }) - return - } - - var str string - if len(r.token.byteValue) <= maxErrorContextLen { - str = string(r.token.byteValue) - } else { - str = string(r.token.byteValue[:maxErrorContextLen-3]) + "..." - } - r.fatalError = &LexerError{ - Reason: fmt.Sprintf("expected %s", expected), - Offset: r.pos, - Data: str, - } -} - -func (r *Lexer) GetPos() int { - return r.pos -} - -// Delim consumes a token and verifies that it is the given delimiter. -func (r *Lexer) Delim(c byte) { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - - if !r.Ok() || r.token.delimValue != c { - r.consume() // errInvalidToken can change token if UseMultipleErrors is enabled. - r.errInvalidToken(string([]byte{c})) - } else { - r.consume() - } -} - -// IsDelim returns true if there was no scanning error and next token is the given delimiter. -func (r *Lexer) IsDelim(c byte) bool { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - return !r.Ok() || r.token.delimValue == c -} - -// Null verifies that the next token is null and consumes it. -func (r *Lexer) Null() { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - if !r.Ok() || r.token.kind != tokenNull { - r.errInvalidToken("null") - } - r.consume() -} - -// IsNull returns true if the next token is a null keyword. -func (r *Lexer) IsNull() bool { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - return r.Ok() && r.token.kind == tokenNull -} - -// Skip skips a single token. -func (r *Lexer) Skip() { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - r.consume() -} - -// SkipRecursive skips next array or object completely, or just skips a single token if not -// an array/object. -// -// Note: no syntax validation is performed on the skipped data. -func (r *Lexer) SkipRecursive() { - r.scanToken() - var start, end byte - - if r.token.delimValue == '{' { - start, end = '{', '}' - } else if r.token.delimValue == '[' { - start, end = '[', ']' - } else { - r.consume() - return - } - - r.consume() - - level := 1 - inQuotes := false - wasEscape := false - - for i, c := range r.Data[r.pos:] { - switch { - case c == start && !inQuotes: - level++ - case c == end && !inQuotes: - level-- - if level == 0 { - r.pos += i + 1 - return - } - case c == '\\' && inQuotes: - wasEscape = !wasEscape - continue - case c == '"' && inQuotes: - inQuotes = wasEscape - case c == '"': - inQuotes = true - } - wasEscape = false - } - r.pos = len(r.Data) - r.fatalError = &LexerError{ - Reason: "EOF reached while skipping array/object or token", - Offset: r.pos, - Data: string(r.Data[r.pos:]), - } -} - -// Raw fetches the next item recursively as a data slice -func (r *Lexer) Raw() []byte { - r.SkipRecursive() - if !r.Ok() { - return nil - } - return r.Data[r.start:r.pos] -} - -// IsStart returns whether the lexer is positioned at the start -// of an input string. -func (r *Lexer) IsStart() bool { - return r.pos == 0 -} - -// Consumed reads all remaining bytes from the input, publishing an error if -// there is anything but whitespace remaining. -func (r *Lexer) Consumed() { - if r.pos > len(r.Data) || !r.Ok() { - return - } - - for _, c := range r.Data[r.pos:] { - if c != ' ' && c != '\t' && c != '\r' && c != '\n' { - r.AddError(&LexerError{ - Reason: "invalid character '" + string(c) + "' after top-level value", - Offset: r.pos, - Data: string(r.Data[r.pos:]), - }) - return - } - - r.pos++ - r.start++ - } -} - -func (r *Lexer) unsafeString() (string, []byte) { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - if !r.Ok() || r.token.kind != tokenString { - r.errInvalidToken("string") - return "", nil - } - bytes := r.token.byteValue - ret := bytesToStr(r.token.byteValue) - r.consume() - return ret, bytes -} - -// UnsafeString returns the string value if the token is a string literal. -// -// Warning: returned string may point to the input buffer, so the string should not outlive -// the input buffer. Intended pattern of usage is as an argument to a switch statement. -func (r *Lexer) UnsafeString() string { - ret, _ := r.unsafeString() - return ret -} - -// UnsafeBytes returns the byte slice if the token is a string literal. -func (r *Lexer) UnsafeBytes() []byte { - _, ret := r.unsafeString() - return ret -} - -// String reads a string literal. -func (r *Lexer) String() string { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - if !r.Ok() || r.token.kind != tokenString { - r.errInvalidToken("string") - return "" - } - ret := string(r.token.byteValue) - r.consume() - return ret -} - -// Bytes reads a string literal and base64 decodes it into a byte slice. -func (r *Lexer) Bytes() []byte { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - if !r.Ok() || r.token.kind != tokenString { - r.errInvalidToken("string") - return nil - } - ret := make([]byte, base64.StdEncoding.DecodedLen(len(r.token.byteValue))) - len, err := base64.StdEncoding.Decode(ret, r.token.byteValue) - if err != nil { - r.fatalError = &LexerError{ - Reason: err.Error(), - } - return nil - } - - r.consume() - return ret[:len] -} - -// Bool reads a true or false boolean keyword. -func (r *Lexer) Bool() bool { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - if !r.Ok() || r.token.kind != tokenBool { - r.errInvalidToken("bool") - return false - } - ret := r.token.boolValue - r.consume() - return ret -} - -func (r *Lexer) number() string { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - if !r.Ok() || r.token.kind != tokenNumber { - r.errInvalidToken("number") - return "" - } - ret := bytesToStr(r.token.byteValue) - r.consume() - return ret -} - -func (r *Lexer) Uint8() uint8 { - s := r.number() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseUint(s, 10, 8) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: s, - }) - } - return uint8(n) -} - -func (r *Lexer) Uint16() uint16 { - s := r.number() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseUint(s, 10, 16) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: s, - }) - } - return uint16(n) -} - -func (r *Lexer) Uint32() uint32 { - s := r.number() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseUint(s, 10, 32) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: s, - }) - } - return uint32(n) -} - -func (r *Lexer) Uint64() uint64 { - s := r.number() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseUint(s, 10, 64) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: s, - }) - } - return n -} - -func (r *Lexer) Uint() uint { - return uint(r.Uint64()) -} - -func (r *Lexer) Int8() int8 { - s := r.number() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseInt(s, 10, 8) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: s, - }) - } - return int8(n) -} - -func (r *Lexer) Int16() int16 { - s := r.number() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseInt(s, 10, 16) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: s, - }) - } - return int16(n) -} - -func (r *Lexer) Int32() int32 { - s := r.number() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseInt(s, 10, 32) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: s, - }) - } - return int32(n) -} - -func (r *Lexer) Int64() int64 { - s := r.number() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseInt(s, 10, 64) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: s, - }) - } - return n -} - -func (r *Lexer) Int() int { - return int(r.Int64()) -} - -func (r *Lexer) Uint8Str() uint8 { - s, b := r.unsafeString() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseUint(s, 10, 8) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: string(b), - }) - } - return uint8(n) -} - -func (r *Lexer) Uint16Str() uint16 { - s, b := r.unsafeString() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseUint(s, 10, 16) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: string(b), - }) - } - return uint16(n) -} - -func (r *Lexer) Uint32Str() uint32 { - s, b := r.unsafeString() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseUint(s, 10, 32) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: string(b), - }) - } - return uint32(n) -} - -func (r *Lexer) Uint64Str() uint64 { - s, b := r.unsafeString() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseUint(s, 10, 64) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: string(b), - }) - } - return n -} - -func (r *Lexer) UintStr() uint { - return uint(r.Uint64Str()) -} - -func (r *Lexer) UintptrStr() uintptr { - return uintptr(r.Uint64Str()) -} - -func (r *Lexer) Int8Str() int8 { - s, b := r.unsafeString() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseInt(s, 10, 8) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: string(b), - }) - } - return int8(n) -} - -func (r *Lexer) Int16Str() int16 { - s, b := r.unsafeString() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseInt(s, 10, 16) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: string(b), - }) - } - return int16(n) -} - -func (r *Lexer) Int32Str() int32 { - s, b := r.unsafeString() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseInt(s, 10, 32) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: string(b), - }) - } - return int32(n) -} - -func (r *Lexer) Int64Str() int64 { - s, b := r.unsafeString() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseInt(s, 10, 64) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: string(b), - }) - } - return n -} - -func (r *Lexer) IntStr() int { - return int(r.Int64Str()) -} - -func (r *Lexer) Float32() float32 { - s := r.number() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseFloat(s, 32) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: s, - }) - } - return float32(n) -} - -func (r *Lexer) Float64() float64 { - s := r.number() - if !r.Ok() { - return 0 - } - - n, err := strconv.ParseFloat(s, 64) - if err != nil { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Reason: err.Error(), - Data: s, - }) - } - return n -} - -func (r *Lexer) Error() error { - return r.fatalError -} - -func (r *Lexer) AddError(e error) { - if r.fatalError == nil { - r.fatalError = e - } -} - -func (r *Lexer) AddNonFatalError(e error) { - r.addNonfatalError(&LexerError{ - Offset: r.start, - Data: string(r.Data[r.start:r.pos]), - Reason: e.Error(), - }) -} - -func (r *Lexer) addNonfatalError(err *LexerError) { - if r.UseMultipleErrors { - // We don't want to add errors with the same offset. - if len(r.multipleErrors) != 0 && r.multipleErrors[len(r.multipleErrors)-1].Offset == err.Offset { - return - } - r.multipleErrors = append(r.multipleErrors, err) - return - } - r.fatalError = err -} - -func (r *Lexer) GetNonFatalErrors() []*LexerError { - return r.multipleErrors -} - -// JsonNumber fetches and json.Number from 'encoding/json' package. -// Both int, float or string, contains them are valid values -func (r *Lexer) JsonNumber() json.Number { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - if !r.Ok() { - r.errInvalidToken("json.Number") - return json.Number("0") - } - - switch r.token.kind { - case tokenString: - return json.Number(r.String()) - case tokenNumber: - return json.Number(r.Raw()) - default: - r.errSyntax() - return json.Number("0") - } -} - -// Interface fetches an interface{} analogous to the 'encoding/json' package. -func (r *Lexer) Interface() interface{} { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - - if !r.Ok() { - return nil - } - switch r.token.kind { - case tokenString: - return r.String() - case tokenNumber: - return r.Float64() - case tokenBool: - return r.Bool() - case tokenNull: - r.Null() - return nil - } - - if r.token.delimValue == '{' { - r.consume() - - ret := map[string]interface{}{} - for !r.IsDelim('}') { - key := r.String() - r.WantColon() - ret[key] = r.Interface() - r.WantComma() - } - r.Delim('}') - - if r.Ok() { - return ret - } else { - return nil - } - } else if r.token.delimValue == '[' { - r.consume() - - var ret []interface{} - for !r.IsDelim(']') { - ret = append(ret, r.Interface()) - r.WantComma() - } - r.Delim(']') - - if r.Ok() { - return ret - } else { - return nil - } - } - r.errSyntax() - return nil -} - -// WantComma requires a comma to be present before fetching next token. -func (r *Lexer) WantComma() { - r.wantSep = ',' - r.firstElement = false -} - -// WantColon requires a colon to be present before fetching next token. -func (r *Lexer) WantColon() { - r.wantSep = ':' - r.firstElement = false -} diff --git a/vendor/github.com/mailru/easyjson/jlexer/lexer_test.go b/vendor/github.com/mailru/easyjson/jlexer/lexer_test.go deleted file mode 100644 index 4ce4abe6af..0000000000 --- a/vendor/github.com/mailru/easyjson/jlexer/lexer_test.go +++ /dev/null @@ -1,311 +0,0 @@ -package jlexer - -import ( - "bytes" - "encoding/json" - "reflect" - "testing" -) - -func TestString(t *testing.T) { - for i, test := range []struct { - toParse string - want string - wantError bool - }{ - {toParse: `"simple string"`, want: "simple string"}, - {toParse: " \r\r\n\t " + `"test"`, want: "test"}, - {toParse: `"\n\t\"\/\\\f\r"`, want: "\n\t\"/\\\f\r"}, - {toParse: `"\u0020"`, want: " "}, - {toParse: `"\u0020-\t"`, want: " -\t"}, - {toParse: `"\ufffd\uFFFD"`, want: "\ufffd\ufffd"}, - {toParse: `"\ud83d\ude00"`, want: "😀"}, - {toParse: `"\ud83d\ude08"`, want: "😈"}, - {toParse: `"\ud8"`, wantError: true}, - - {toParse: `"test"junk`, want: "test"}, - - {toParse: `5`, wantError: true}, // not a string - {toParse: `"\x"`, wantError: true}, // invalid escape - {toParse: `"\ud800"`, want: "�"}, // invalid utf-8 char; return replacement char - } { - l := Lexer{Data: []byte(test.toParse)} - - got := l.String() - if got != test.want { - t.Errorf("[%d, %q] String() = %v; want %v", i, test.toParse, got, test.want) - } - err := l.Error() - if err != nil && !test.wantError { - t.Errorf("[%d, %q] String() error: %v", i, test.toParse, err) - } else if err == nil && test.wantError { - t.Errorf("[%d, %q] String() ok; want error", i, test.toParse) - } - } -} - -func TestBytes(t *testing.T) { - for i, test := range []struct { - toParse string - want string - wantError bool - }{ - {toParse: `"c2ltcGxlIHN0cmluZw=="`, want: "simple string"}, - {toParse: " \r\r\n\t " + `"dGVzdA=="`, want: "test"}, - - {toParse: `5`, wantError: true}, // not a JSON string - {toParse: `"foobar"`, wantError: true}, // not base64 encoded - {toParse: `"c2ltcGxlIHN0cmluZw="`, wantError: true}, // invalid base64 padding - } { - l := Lexer{Data: []byte(test.toParse)} - - got := l.Bytes() - if bytes.Compare(got, []byte(test.want)) != 0 { - t.Errorf("[%d, %q] Bytes() = %v; want: %v", i, test.toParse, got, []byte(test.want)) - } - err := l.Error() - if err != nil && !test.wantError { - t.Errorf("[%d, %q] Bytes() error: %v", i, test.toParse, err) - } else if err == nil && test.wantError { - t.Errorf("[%d, %q] Bytes() ok; want error", i, test.toParse) - } - } -} - -func TestNumber(t *testing.T) { - for i, test := range []struct { - toParse string - want string - wantError bool - }{ - {toParse: "123", want: "123"}, - {toParse: "-123", want: "-123"}, - {toParse: "\r\n12.35", want: "12.35"}, - {toParse: "12.35e+1", want: "12.35e+1"}, - {toParse: "12.35e-15", want: "12.35e-15"}, - {toParse: "12.35E-15", want: "12.35E-15"}, - {toParse: "12.35E15", want: "12.35E15"}, - - {toParse: `"a"`, wantError: true}, - {toParse: "123junk", wantError: true}, - {toParse: "1.2.3", wantError: true}, - {toParse: "1e2e3", wantError: true}, - {toParse: "1e2.3", wantError: true}, - } { - l := Lexer{Data: []byte(test.toParse)} - - got := l.number() - if got != test.want { - t.Errorf("[%d, %q] number() = %v; want %v", i, test.toParse, got, test.want) - } - err := l.Error() - if err != nil && !test.wantError { - t.Errorf("[%d, %q] number() error: %v", i, test.toParse, err) - } else if err == nil && test.wantError { - t.Errorf("[%d, %q] number() ok; want error", i, test.toParse) - } - } -} - -func TestBool(t *testing.T) { - for i, test := range []struct { - toParse string - want bool - wantError bool - }{ - {toParse: "true", want: true}, - {toParse: "false", want: false}, - - {toParse: "1", wantError: true}, - {toParse: "truejunk", wantError: true}, - {toParse: `false"junk"`, wantError: true}, - {toParse: "True", wantError: true}, - {toParse: "False", wantError: true}, - } { - l := Lexer{Data: []byte(test.toParse)} - - got := l.Bool() - if got != test.want { - t.Errorf("[%d, %q] Bool() = %v; want %v", i, test.toParse, got, test.want) - } - err := l.Error() - if err != nil && !test.wantError { - t.Errorf("[%d, %q] Bool() error: %v", i, test.toParse, err) - } else if err == nil && test.wantError { - t.Errorf("[%d, %q] Bool() ok; want error", i, test.toParse) - } - } -} - -func TestSkipRecursive(t *testing.T) { - for i, test := range []struct { - toParse string - left string - wantError bool - }{ - {toParse: "5, 4", left: ", 4"}, - {toParse: "[5, 6], 4", left: ", 4"}, - {toParse: "[5, [7,8]]: 4", left: ": 4"}, - - {toParse: `{"a":1}, 4`, left: ", 4"}, - {toParse: `{"a":1, "b":{"c": 5}, "e":[12,15]}, 4`, left: ", 4"}, - - // array start/end chars in a string - {toParse: `[5, "]"], 4`, left: ", 4"}, - {toParse: `[5, "\"]"], 4`, left: ", 4"}, - {toParse: `[5, "["], 4`, left: ", 4"}, - {toParse: `[5, "\"["], 4`, left: ", 4"}, - - // object start/end chars in a string - {toParse: `{"a}":1}, 4`, left: ", 4"}, - {toParse: `{"a\"}":1}, 4`, left: ", 4"}, - {toParse: `{"a{":1}, 4`, left: ", 4"}, - {toParse: `{"a\"{":1}, 4`, left: ", 4"}, - - // object with double slashes at the end of string - {toParse: `{"a":"hey\\"}, 4`, left: ", 4"}, - } { - l := Lexer{Data: []byte(test.toParse)} - - l.SkipRecursive() - - got := string(l.Data[l.pos:]) - if got != test.left { - t.Errorf("[%d, %q] SkipRecursive() left = %v; want %v", i, test.toParse, got, test.left) - } - err := l.Error() - if err != nil && !test.wantError { - t.Errorf("[%d, %q] SkipRecursive() error: %v", i, test.toParse, err) - } else if err == nil && test.wantError { - t.Errorf("[%d, %q] SkipRecursive() ok; want error", i, test.toParse) - } - } -} - -func TestInterface(t *testing.T) { - for i, test := range []struct { - toParse string - want interface{} - wantError bool - }{ - {toParse: "null", want: nil}, - {toParse: "true", want: true}, - {toParse: `"a"`, want: "a"}, - {toParse: "5", want: float64(5)}, - - {toParse: `{}`, want: map[string]interface{}{}}, - {toParse: `[]`, want: []interface{}(nil)}, - - {toParse: `{"a": "b"}`, want: map[string]interface{}{"a": "b"}}, - {toParse: `[5]`, want: []interface{}{float64(5)}}, - - {toParse: `{"a":5 , "b" : "string"}`, want: map[string]interface{}{"a": float64(5), "b": "string"}}, - {toParse: `["a", 5 , null, true]`, want: []interface{}{"a", float64(5), nil, true}}, - - {toParse: `{"a" "b"}`, wantError: true}, - {toParse: `{"a": "b",}`, wantError: true}, - {toParse: `{"a":"b","c" "b"}`, wantError: true}, - {toParse: `{"a": "b","c":"d",}`, wantError: true}, - {toParse: `{,}`, wantError: true}, - - {toParse: `[1, 2,]`, wantError: true}, - {toParse: `[1 2]`, wantError: true}, - {toParse: `[,]`, wantError: true}, - } { - l := Lexer{Data: []byte(test.toParse)} - - got := l.Interface() - if !reflect.DeepEqual(got, test.want) { - t.Errorf("[%d, %q] Interface() = %v; want %v", i, test.toParse, got, test.want) - } - err := l.Error() - if err != nil && !test.wantError { - t.Errorf("[%d, %q] Interface() error: %v", i, test.toParse, err) - } else if err == nil && test.wantError { - t.Errorf("[%d, %q] Interface() ok; want error", i, test.toParse) - } - } -} - -func TestConsumed(t *testing.T) { - for i, test := range []struct { - toParse string - wantError bool - }{ - {toParse: "", wantError: false}, - {toParse: " ", wantError: false}, - {toParse: "\r\n", wantError: false}, - {toParse: "\t\t", wantError: false}, - - {toParse: "{", wantError: true}, - } { - l := Lexer{Data: []byte(test.toParse)} - l.Consumed() - - err := l.Error() - if err != nil && !test.wantError { - t.Errorf("[%d, %q] Consumed() error: %v", i, test.toParse, err) - } else if err == nil && test.wantError { - t.Errorf("[%d, %q] Consumed() ok; want error", i, test.toParse) - } - } -} - -func TestJsonNumber(t *testing.T) { - for i, test := range []struct { - toParse string - want json.Number - wantLexerError bool - wantValue interface{} - wantValueError bool - }{ - {toParse: `10`, want: json.Number("10"), wantValue: int64(10)}, - {toParse: `0`, want: json.Number("0"), wantValue: int64(0)}, - {toParse: `0.12`, want: json.Number("0.12"), wantValue: 0.12}, - {toParse: `25E-4`, want: json.Number("25E-4"), wantValue: 25E-4}, - - {toParse: `"10"`, want: json.Number("10"), wantValue: int64(10)}, - {toParse: `"0"`, want: json.Number("0"), wantValue: int64(0)}, - {toParse: `"0.12"`, want: json.Number("0.12"), wantValue: 0.12}, - {toParse: `"25E-4"`, want: json.Number("25E-4"), wantValue: 25E-4}, - - {toParse: `"a""`, wantValueError: true}, - - {toParse: `[1]`, wantLexerError: true}, - {toParse: `{}`, wantLexerError: true}, - {toParse: `a`, wantLexerError: true}, - } { - l := Lexer{Data: []byte(test.toParse)} - - got := l.JsonNumber() - if got != test.want && !test.wantLexerError && !test.wantValueError { - t.Errorf("[%d, %q] JsonNumber() = %v; want %v", i, test.toParse, got, test.want) - } - - err := l.Error() - if err != nil && !test.wantLexerError { - t.Errorf("[%d, %q] JsonNumber() lexer error: %v", i, test.toParse, err) - } else if err == nil && test.wantLexerError { - t.Errorf("[%d, %q] JsonNumber() ok; want lexer error", i, test.toParse) - } - - var valueErr error - var gotValue interface{} - switch test.wantValue.(type) { - case float64: - gotValue, valueErr = got.Float64() - default: - gotValue, valueErr = got.Int64() - } - - if !reflect.DeepEqual(gotValue, test.wantValue) && !test.wantLexerError && !test.wantValueError { - t.Errorf("[%d, %q] JsonNumber() = %v; want %v", i, test.toParse, gotValue, test.wantValue) - } - - if valueErr != nil && !test.wantValueError { - t.Errorf("[%d, %q] JsonNumber() value error: %v", i, test.toParse, err) - } else if valueErr == nil && test.wantValueError { - t.Errorf("[%d, %q] JsonNumber() ok; want value error", i, test.toParse) - } - } -} diff --git a/vendor/github.com/mailru/easyjson/jwriter/writer.go b/vendor/github.com/mailru/easyjson/jwriter/writer.go deleted file mode 100644 index 250920d85b..0000000000 --- a/vendor/github.com/mailru/easyjson/jwriter/writer.go +++ /dev/null @@ -1,335 +0,0 @@ -// Package jwriter contains a JSON writer. -package jwriter - -import ( - "encoding/base64" - "io" - "strconv" - "unicode/utf8" - - "github.com/mailru/easyjson/buffer" -) - -// Flags describe various encoding options. The behavior may be actually implemented in the encoder, but -// Flags field in Writer is used to set and pass them around. -type Flags int - -const ( - NilMapAsEmpty Flags = 1 << iota // Encode nil map as '{}' rather than 'null'. - NilSliceAsEmpty // Encode nil slice as '[]' rather than 'null'. -) - -// Writer is a JSON writer. -type Writer struct { - Flags Flags - - Error error - Buffer buffer.Buffer - NoEscapeHTML bool -} - -// Size returns the size of the data that was written out. -func (w *Writer) Size() int { - return w.Buffer.Size() -} - -// DumpTo outputs the data to given io.Writer, resetting the buffer. -func (w *Writer) DumpTo(out io.Writer) (written int, err error) { - return w.Buffer.DumpTo(out) -} - -// BuildBytes returns writer data as a single byte slice. You can optionally provide one byte slice -// as argument that it will try to reuse. -func (w *Writer) BuildBytes(reuse ...[]byte) ([]byte, error) { - if w.Error != nil { - return nil, w.Error - } - - return w.Buffer.BuildBytes(reuse...), nil -} - -// ReadCloser returns an io.ReadCloser that can be used to read the data. -// ReadCloser also resets the buffer. -func (w *Writer) ReadCloser() (io.ReadCloser, error) { - if w.Error != nil { - return nil, w.Error - } - - return w.Buffer.ReadCloser(), nil -} - -// RawByte appends raw binary data to the buffer. -func (w *Writer) RawByte(c byte) { - w.Buffer.AppendByte(c) -} - -// RawByte appends raw binary data to the buffer. -func (w *Writer) RawString(s string) { - w.Buffer.AppendString(s) -} - -// Raw appends raw binary data to the buffer or sets the error if it is given. Useful for -// calling with results of MarshalJSON-like functions. -func (w *Writer) Raw(data []byte, err error) { - switch { - case w.Error != nil: - return - case err != nil: - w.Error = err - case len(data) > 0: - w.Buffer.AppendBytes(data) - default: - w.RawString("null") - } -} - -// RawText encloses raw binary data in quotes and appends in to the buffer. -// Useful for calling with results of MarshalText-like functions. -func (w *Writer) RawText(data []byte, err error) { - switch { - case w.Error != nil: - return - case err != nil: - w.Error = err - case len(data) > 0: - w.String(string(data)) - default: - w.RawString("null") - } -} - -// Base64Bytes appends data to the buffer after base64 encoding it -func (w *Writer) Base64Bytes(data []byte) { - if data == nil { - w.Buffer.AppendString("null") - return - } - w.Buffer.AppendByte('"') - dst := make([]byte, base64.StdEncoding.EncodedLen(len(data))) - base64.StdEncoding.Encode(dst, data) - w.Buffer.AppendBytes(dst) - w.Buffer.AppendByte('"') -} - -func (w *Writer) Uint8(n uint8) { - w.Buffer.EnsureSpace(3) - w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) -} - -func (w *Writer) Uint16(n uint16) { - w.Buffer.EnsureSpace(5) - w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) -} - -func (w *Writer) Uint32(n uint32) { - w.Buffer.EnsureSpace(10) - w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) -} - -func (w *Writer) Uint(n uint) { - w.Buffer.EnsureSpace(20) - w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) -} - -func (w *Writer) Uint64(n uint64) { - w.Buffer.EnsureSpace(20) - w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, n, 10) -} - -func (w *Writer) Int8(n int8) { - w.Buffer.EnsureSpace(4) - w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) -} - -func (w *Writer) Int16(n int16) { - w.Buffer.EnsureSpace(6) - w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) -} - -func (w *Writer) Int32(n int32) { - w.Buffer.EnsureSpace(11) - w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) -} - -func (w *Writer) Int(n int) { - w.Buffer.EnsureSpace(21) - w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) -} - -func (w *Writer) Int64(n int64) { - w.Buffer.EnsureSpace(21) - w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, n, 10) -} - -func (w *Writer) Uint8Str(n uint8) { - w.Buffer.EnsureSpace(3) - w.Buffer.Buf = append(w.Buffer.Buf, '"') - w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) - w.Buffer.Buf = append(w.Buffer.Buf, '"') -} - -func (w *Writer) Uint16Str(n uint16) { - w.Buffer.EnsureSpace(5) - w.Buffer.Buf = append(w.Buffer.Buf, '"') - w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) - w.Buffer.Buf = append(w.Buffer.Buf, '"') -} - -func (w *Writer) Uint32Str(n uint32) { - w.Buffer.EnsureSpace(10) - w.Buffer.Buf = append(w.Buffer.Buf, '"') - w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) - w.Buffer.Buf = append(w.Buffer.Buf, '"') -} - -func (w *Writer) UintStr(n uint) { - w.Buffer.EnsureSpace(20) - w.Buffer.Buf = append(w.Buffer.Buf, '"') - w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) - w.Buffer.Buf = append(w.Buffer.Buf, '"') -} - -func (w *Writer) Uint64Str(n uint64) { - w.Buffer.EnsureSpace(20) - w.Buffer.Buf = append(w.Buffer.Buf, '"') - w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, n, 10) - w.Buffer.Buf = append(w.Buffer.Buf, '"') -} - -func (w *Writer) UintptrStr(n uintptr) { - w.Buffer.EnsureSpace(20) - w.Buffer.Buf = append(w.Buffer.Buf, '"') - w.Buffer.Buf = strconv.AppendUint(w.Buffer.Buf, uint64(n), 10) - w.Buffer.Buf = append(w.Buffer.Buf, '"') -} - -func (w *Writer) Int8Str(n int8) { - w.Buffer.EnsureSpace(4) - w.Buffer.Buf = append(w.Buffer.Buf, '"') - w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) - w.Buffer.Buf = append(w.Buffer.Buf, '"') -} - -func (w *Writer) Int16Str(n int16) { - w.Buffer.EnsureSpace(6) - w.Buffer.Buf = append(w.Buffer.Buf, '"') - w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) - w.Buffer.Buf = append(w.Buffer.Buf, '"') -} - -func (w *Writer) Int32Str(n int32) { - w.Buffer.EnsureSpace(11) - w.Buffer.Buf = append(w.Buffer.Buf, '"') - w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) - w.Buffer.Buf = append(w.Buffer.Buf, '"') -} - -func (w *Writer) IntStr(n int) { - w.Buffer.EnsureSpace(21) - w.Buffer.Buf = append(w.Buffer.Buf, '"') - w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, int64(n), 10) - w.Buffer.Buf = append(w.Buffer.Buf, '"') -} - -func (w *Writer) Int64Str(n int64) { - w.Buffer.EnsureSpace(21) - w.Buffer.Buf = append(w.Buffer.Buf, '"') - w.Buffer.Buf = strconv.AppendInt(w.Buffer.Buf, n, 10) - w.Buffer.Buf = append(w.Buffer.Buf, '"') -} - -func (w *Writer) Float32(n float32) { - w.Buffer.EnsureSpace(20) - w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, float64(n), 'g', -1, 32) -} - -func (w *Writer) Float64(n float64) { - w.Buffer.EnsureSpace(20) - w.Buffer.Buf = strconv.AppendFloat(w.Buffer.Buf, n, 'g', -1, 64) -} - -func (w *Writer) Bool(v bool) { - w.Buffer.EnsureSpace(5) - if v { - w.Buffer.Buf = append(w.Buffer.Buf, "true"...) - } else { - w.Buffer.Buf = append(w.Buffer.Buf, "false"...) - } -} - -const chars = "0123456789abcdef" - -func isNotEscapedSingleChar(c byte, escapeHTML bool) bool { - // Note: might make sense to use a table if there are more chars to escape. With 4 chars - // it benchmarks the same. - if escapeHTML { - return c != '<' && c != '>' && c != '&' && c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf - } else { - return c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf - } -} - -func (w *Writer) String(s string) { - w.Buffer.AppendByte('"') - - // Portions of the string that contain no escapes are appended as - // byte slices. - - p := 0 // last non-escape symbol - - for i := 0; i < len(s); { - c := s[i] - - if isNotEscapedSingleChar(c, !w.NoEscapeHTML) { - // single-width character, no escaping is required - i++ - continue - } else if c < utf8.RuneSelf { - // single-with character, need to escape - w.Buffer.AppendString(s[p:i]) - switch c { - case '\t': - w.Buffer.AppendString(`\t`) - case '\r': - w.Buffer.AppendString(`\r`) - case '\n': - w.Buffer.AppendString(`\n`) - case '\\': - w.Buffer.AppendString(`\\`) - case '"': - w.Buffer.AppendString(`\"`) - default: - w.Buffer.AppendString(`\u00`) - w.Buffer.AppendByte(chars[c>>4]) - w.Buffer.AppendByte(chars[c&0xf]) - } - - i++ - p = i - continue - } - - // broken utf - runeValue, runeWidth := utf8.DecodeRuneInString(s[i:]) - if runeValue == utf8.RuneError && runeWidth == 1 { - w.Buffer.AppendString(s[p:i]) - w.Buffer.AppendString(`\ufffd`) - i++ - p = i - continue - } - - // jsonp stuff - tab separator and line separator - if runeValue == '\u2028' || runeValue == '\u2029' { - w.Buffer.AppendString(s[p:i]) - w.Buffer.AppendString(`\u202`) - w.Buffer.AppendByte(chars[runeValue&0xf]) - i += runeWidth - p = i - continue - } - i += runeWidth - } - w.Buffer.AppendString(s[p:]) - w.Buffer.AppendByte('"') -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Bool.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Bool.go deleted file mode 100644 index 927d2398ae..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Bool.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Bool struct { - V bool - Defined bool -} - -// Creates an optional type with a given value. -func OBool(v bool) Bool { - return Bool{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Bool) Get(deflt bool) bool { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Bool) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Bool(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Bool) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Bool{} - } else { - v.V = l.Bool() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Bool) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Bool) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Bool) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Bool) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Float32.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Float32.go deleted file mode 100644 index 3d5f1575c5..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Float32.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Float32 struct { - V float32 - Defined bool -} - -// Creates an optional type with a given value. -func OFloat32(v float32) Float32 { - return Float32{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Float32) Get(deflt float32) float32 { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Float32) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Float32(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Float32) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Float32{} - } else { - v.V = l.Float32() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Float32) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Float32) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Float32) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Float32) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Float64.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Float64.go deleted file mode 100644 index 9719657ea2..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Float64.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Float64 struct { - V float64 - Defined bool -} - -// Creates an optional type with a given value. -func OFloat64(v float64) Float64 { - return Float64{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Float64) Get(deflt float64) float64 { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Float64) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Float64(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Float64) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Float64{} - } else { - v.V = l.Float64() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Float64) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Float64) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Float64) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Float64) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int.go deleted file mode 100644 index bfe6eff20a..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Int struct { - V int - Defined bool -} - -// Creates an optional type with a given value. -func OInt(v int) Int { - return Int{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Int) Get(deflt int) int { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Int) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Int(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Int) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Int{} - } else { - v.V = l.Int() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Int) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Int) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Int) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Int) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int16.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int16.go deleted file mode 100644 index e2f5daa3c8..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int16.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Int16 struct { - V int16 - Defined bool -} - -// Creates an optional type with a given value. -func OInt16(v int16) Int16 { - return Int16{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Int16) Get(deflt int16) int16 { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Int16) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Int16(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Int16) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Int16{} - } else { - v.V = l.Int16() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Int16) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Int16) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Int16) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Int16) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int32.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int32.go deleted file mode 100644 index e0d6975d8b..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int32.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Int32 struct { - V int32 - Defined bool -} - -// Creates an optional type with a given value. -func OInt32(v int32) Int32 { - return Int32{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Int32) Get(deflt int32) int32 { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Int32) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Int32(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Int32) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Int32{} - } else { - v.V = l.Int32() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Int32) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Int32) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Int32) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Int32) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int64.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int64.go deleted file mode 100644 index 641fccc9ab..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int64.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Int64 struct { - V int64 - Defined bool -} - -// Creates an optional type with a given value. -func OInt64(v int64) Int64 { - return Int64{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Int64) Get(deflt int64) int64 { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Int64) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Int64(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Int64) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Int64{} - } else { - v.V = l.Int64() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Int64) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Int64) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Int64) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Int64) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int8.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Int8.go deleted file mode 100644 index 9d6745c825..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Int8.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Int8 struct { - V int8 - Defined bool -} - -// Creates an optional type with a given value. -func OInt8(v int8) Int8 { - return Int8{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Int8) Get(deflt int8) int8 { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Int8) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Int8(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Int8) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Int8{} - } else { - v.V = l.Int8() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Int8) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Int8) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Int8) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Int8) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_String.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_String.go deleted file mode 100644 index d2799de932..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_String.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type String struct { - V string - Defined bool -} - -// Creates an optional type with a given value. -func OString(v string) String { - return String{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v String) Get(deflt string) string { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v String) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.String(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *String) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = String{} - } else { - v.V = l.String() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *String) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *String) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v String) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v String) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint.go deleted file mode 100644 index b41405bf90..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Uint struct { - V uint - Defined bool -} - -// Creates an optional type with a given value. -func OUint(v uint) Uint { - return Uint{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Uint) Get(deflt uint) uint { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Uint) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Uint(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Uint) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Uint{} - } else { - v.V = l.Uint() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Uint) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Uint) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Uint) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Uint) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint16.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint16.go deleted file mode 100644 index 35c38fd609..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint16.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Uint16 struct { - V uint16 - Defined bool -} - -// Creates an optional type with a given value. -func OUint16(v uint16) Uint16 { - return Uint16{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Uint16) Get(deflt uint16) uint16 { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Uint16) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Uint16(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Uint16) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Uint16{} - } else { - v.V = l.Uint16() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Uint16) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Uint16) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Uint16) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Uint16) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint32.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint32.go deleted file mode 100644 index 118b7945cd..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint32.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Uint32 struct { - V uint32 - Defined bool -} - -// Creates an optional type with a given value. -func OUint32(v uint32) Uint32 { - return Uint32{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Uint32) Get(deflt uint32) uint32 { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Uint32) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Uint32(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Uint32) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Uint32{} - } else { - v.V = l.Uint32() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Uint32) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Uint32) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Uint32) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Uint32) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint64.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint64.go deleted file mode 100644 index e540c9da52..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint64.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Uint64 struct { - V uint64 - Defined bool -} - -// Creates an optional type with a given value. -func OUint64(v uint64) Uint64 { - return Uint64{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Uint64) Get(deflt uint64) uint64 { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Uint64) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Uint64(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Uint64) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Uint64{} - } else { - v.V = l.Uint64() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Uint64) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Uint64) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Uint64) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Uint64) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint8.go b/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint8.go deleted file mode 100644 index f184569331..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/gotemplate_Uint8.go +++ /dev/null @@ -1,79 +0,0 @@ -// generated by gotemplate - -package opt - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Uint8 struct { - V uint8 - Defined bool -} - -// Creates an optional type with a given value. -func OUint8(v uint8) Uint8 { - return Uint8{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Uint8) Get(deflt uint8) uint8 { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Uint8) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Uint8(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Uint8) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Uint8{} - } else { - v.V = l.Uint8() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Uint8) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Uint8) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Uint8) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Uint8) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/optional/opt.go b/vendor/github.com/mailru/easyjson/opt/optional/opt.go deleted file mode 100644 index 29c4afa552..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/optional/opt.go +++ /dev/null @@ -1,80 +0,0 @@ -// +build none - -package optional - -import ( - "fmt" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// template type Optional(A) -type A int - -// A 'gotemplate'-based type for providing optional semantics without using pointers. -type Optional struct { - V A - Defined bool -} - -// Creates an optional type with a given value. -func OOptional(v A) Optional { - return Optional{V: v, Defined: true} -} - -// Get returns the value or given default in the case the value is undefined. -func (v Optional) Get(deflt A) A { - if !v.Defined { - return deflt - } - return v.V -} - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v Optional) MarshalEasyJSON(w *jwriter.Writer) { - if v.Defined { - w.Optional(v.V) - } else { - w.RawString("null") - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *Optional) UnmarshalEasyJSON(l *jlexer.Lexer) { - if l.IsNull() { - l.Skip() - *v = Optional{} - } else { - v.V = l.Optional() - v.Defined = true - } -} - -// MarshalJSON implements a standard json marshaler interface. -func (v *Optional) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - v.MarshalEasyJSON(&w) - return w.Buffer.BuildBytes(), w.Error -} - -// UnmarshalJSON implements a standard json unmarshaler interface. -func (v *Optional) UnmarshalJSON(data []byte) error { - l := jlexer.Lexer{} - v.UnmarshalEasyJSON(&l) - return l.Error() -} - -// IsDefined returns whether the value is defined, a function is required so that it can -// be used in an interface. -func (v Optional) IsDefined() bool { - return v.Defined -} - -// String implements a stringer interface using fmt.Sprint for the value. -func (v Optional) String() string { - if !v.Defined { - return "" - } - return fmt.Sprint(v.V) -} diff --git a/vendor/github.com/mailru/easyjson/opt/opts.go b/vendor/github.com/mailru/easyjson/opt/opts.go deleted file mode 100644 index 3617f7f9f5..0000000000 --- a/vendor/github.com/mailru/easyjson/opt/opts.go +++ /dev/null @@ -1,22 +0,0 @@ -package opt - -//go:generate sed -i "s/\\+build none/generated by gotemplate/" optional/opt.go -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Int(int) -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Uint(uint) - -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Int8(int8) -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Int16(int16) -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Int32(int32) -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Int64(int64) - -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Uint8(uint8) -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Uint16(uint16) -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Uint32(uint32) -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Uint64(uint64) - -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Float32(float32) -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Float64(float64) - -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" Bool(bool) -//go:generate gotemplate "github.com/mailru/easyjson/opt/optional" String(string) -//go:generate sed -i "s/generated by gotemplate/+build none/" optional/opt.go diff --git a/vendor/github.com/mailru/easyjson/parser/parser.go b/vendor/github.com/mailru/easyjson/parser/parser.go deleted file mode 100644 index 5bd06e9462..0000000000 --- a/vendor/github.com/mailru/easyjson/parser/parser.go +++ /dev/null @@ -1,97 +0,0 @@ -package parser - -import ( - "go/ast" - "go/parser" - "go/token" - "os/exec" - "strings" -) - -const structComment = "easyjson:json" - -type Parser struct { - PkgPath string - PkgName string - StructNames []string - AllStructs bool -} - -type visitor struct { - *Parser - - name string - explicit bool -} - -func (p *Parser) needType(comments string) bool { - for _, v := range strings.Split(comments, "\n") { - if strings.HasPrefix(v, structComment) { - return true - } - } - return false -} - -func (v *visitor) Visit(n ast.Node) (w ast.Visitor) { - switch n := n.(type) { - case *ast.Package: - return v - case *ast.File: - v.PkgName = n.Name.String() - return v - - case *ast.GenDecl: - v.explicit = v.needType(n.Doc.Text()) - - if !v.explicit && !v.AllStructs { - return nil - } - return v - case *ast.TypeSpec: - v.name = n.Name.String() - - // Allow to specify non-structs explicitly independent of '-all' flag. - if v.explicit { - v.StructNames = append(v.StructNames, v.name) - return nil - } - return v - case *ast.StructType: - v.StructNames = append(v.StructNames, v.name) - return nil - } - return nil -} - -func (p *Parser) Parse(fname string, isDir bool) error { - var err error - if p.PkgPath, err = getPkgPath(fname, isDir); err != nil { - return err - } - - fset := token.NewFileSet() - if isDir { - packages, err := parser.ParseDir(fset, fname, nil, parser.ParseComments) - if err != nil { - return err - } - - for _, pckg := range packages { - ast.Walk(&visitor{Parser: p}, pckg) - } - } else { - f, err := parser.ParseFile(fset, fname, nil, parser.ParseComments) - if err != nil { - return err - } - - ast.Walk(&visitor{Parser: p}, f) - } - return nil -} - -func getDefaultGoPath() (string, error) { - output, err := exec.Command("go", "env", "GOPATH").Output() - return string(output), err -} diff --git a/vendor/github.com/mailru/easyjson/parser/parser_unix.go b/vendor/github.com/mailru/easyjson/parser/parser_unix.go deleted file mode 100644 index 09b20a2e19..0000000000 --- a/vendor/github.com/mailru/easyjson/parser/parser_unix.go +++ /dev/null @@ -1,42 +0,0 @@ -// +build !windows - -package parser - -import ( - "fmt" - "os" - "path" - "strings" -) - -func getPkgPath(fname string, isDir bool) (string, error) { - if !path.IsAbs(fname) { - pwd, err := os.Getwd() - if err != nil { - return "", err - } - fname = path.Join(pwd, fname) - } - - gopath := os.Getenv("GOPATH") - if gopath == "" { - var err error - gopath, err = getDefaultGoPath() - if err != nil { - return "", fmt.Errorf("cannot determine GOPATH: %s", err) - } - } - - for _, p := range strings.Split(os.Getenv("GOPATH"), ":") { - prefix := path.Join(p, "src") + "/" - if rel := strings.TrimPrefix(fname, prefix); rel != fname { - if !isDir { - return path.Dir(rel), nil - } else { - return path.Clean(rel), nil - } - } - } - - return "", fmt.Errorf("file '%v' is not in GOPATH", fname) -} diff --git a/vendor/github.com/mailru/easyjson/parser/parser_windows.go b/vendor/github.com/mailru/easyjson/parser/parser_windows.go deleted file mode 100644 index 90d3a78b5a..0000000000 --- a/vendor/github.com/mailru/easyjson/parser/parser_windows.go +++ /dev/null @@ -1,49 +0,0 @@ -package parser - -import ( - "fmt" - "os" - "path" - "path/filepath" - "strings" -) - -func normalizePath(path string) string { - // use lower case, as Windows file systems will almost always be case insensitive - return strings.ToLower(strings.Replace(path, "\\", "/", -1)) -} - -func getPkgPath(fname string, isDir bool) (string, error) { - // path.IsAbs doesn't work properly on Windows; use filepath.IsAbs instead - if !filepath.IsAbs(fname) { - pwd, err := os.Getwd() - if err != nil { - return "", err - } - fname = path.Join(pwd, fname) - } - - fname = normalizePath(fname) - - gopath := os.Getenv("GOPATH") - if gopath == "" { - var err error - gopath, err = getDefaultGoPath() - if err != nil { - return "", fmt.Errorf("cannot determine GOPATH: %s", err) - } - } - - for _, p := range strings.Split(os.Getenv("GOPATH"), ";") { - prefix := path.Join(normalizePath(p), "src") + "/" - if rel := strings.TrimPrefix(fname, prefix); rel != fname { - if !isDir { - return path.Dir(rel), nil - } else { - return path.Clean(rel), nil - } - } - } - - return "", fmt.Errorf("file '%v' is not in GOPATH", fname) -} diff --git a/vendor/github.com/mailru/easyjson/raw.go b/vendor/github.com/mailru/easyjson/raw.go deleted file mode 100644 index 81bd002e19..0000000000 --- a/vendor/github.com/mailru/easyjson/raw.go +++ /dev/null @@ -1,45 +0,0 @@ -package easyjson - -import ( - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -// RawMessage is a raw piece of JSON (number, string, bool, object, array or -// null) that is extracted without parsing and output as is during marshaling. -type RawMessage []byte - -// MarshalEasyJSON does JSON marshaling using easyjson interface. -func (v *RawMessage) MarshalEasyJSON(w *jwriter.Writer) { - if len(*v) == 0 { - w.RawString("null") - } else { - w.Raw(*v, nil) - } -} - -// UnmarshalEasyJSON does JSON unmarshaling using easyjson interface. -func (v *RawMessage) UnmarshalEasyJSON(l *jlexer.Lexer) { - *v = RawMessage(l.Raw()) -} - -// UnmarshalJSON implements encoding/json.Unmarshaler interface. -func (v *RawMessage) UnmarshalJSON(data []byte) error { - *v = data - return nil -} - -var nullBytes = []byte("null") - -// MarshalJSON implements encoding/json.Marshaler interface. -func (v RawMessage) MarshalJSON() ([]byte, error) { - if len(v) == 0 { - return nullBytes, nil - } - return v, nil -} - -// IsDefined is required for integration with omitempty easyjson logic. -func (v *RawMessage) IsDefined() bool { - return len(*v) > 0 -} diff --git a/vendor/github.com/mailru/easyjson/tests/basic_test.go b/vendor/github.com/mailru/easyjson/tests/basic_test.go deleted file mode 100644 index 0186784023..0000000000 --- a/vendor/github.com/mailru/easyjson/tests/basic_test.go +++ /dev/null @@ -1,231 +0,0 @@ -package tests - -import ( - "reflect" - "testing" - - "encoding/json" - - "github.com/mailru/easyjson" - "github.com/mailru/easyjson/jwriter" -) - -type testType interface { - json.Marshaler - json.Unmarshaler -} - -var testCases = []struct { - Decoded testType - Encoded string -}{ - {&primitiveTypesValue, primitiveTypesString}, - {&namedPrimitiveTypesValue, namedPrimitiveTypesString}, - {&structsValue, structsString}, - {&omitEmptyValue, omitEmptyString}, - {&snakeStructValue, snakeStructString}, - {&omitEmptyDefaultValue, omitEmptyDefaultString}, - {&optsValue, optsString}, - {&rawValue, rawString}, - {&stdMarshalerValue, stdMarshalerString}, - {&userMarshalerValue, userMarshalerString}, - {&unexportedStructValue, unexportedStructString}, - {&excludedFieldValue, excludedFieldString}, - {&sliceValue, sliceString}, - {&arrayValue, arrayString}, - {&mapsValue, mapsString}, - {&deepNestValue, deepNestString}, - {&IntsValue, IntsString}, - {&mapStringStringValue, mapStringStringString}, - {&namedTypeValue, namedTypeValueString}, - {&mapMyIntStringValue, mapMyIntStringValueString}, - {&mapIntStringValue, mapIntStringValueString}, - {&mapInt32StringValue, mapInt32StringValueString}, - {&mapInt64StringValue, mapInt64StringValueString}, - {&mapUintStringValue, mapUintStringValueString}, - {&mapUint32StringValue, mapUint32StringValueString}, - {&mapUint64StringValue, mapUint64StringValueString}, - {&mapUintptrStringValue, mapUintptrStringValueString}, - {&intKeyedMapStructValue, intKeyedMapStructValueString}, -} - -func TestMarshal(t *testing.T) { - for i, test := range testCases { - data, err := test.Decoded.MarshalJSON() - if err != nil { - t.Errorf("[%d, %T] MarshalJSON() error: %v", i, test.Decoded, err) - } - - got := string(data) - if got != test.Encoded { - t.Errorf("[%d, %T] MarshalJSON(): got \n%v\n\t\t want \n%v", i, test.Decoded, got, test.Encoded) - } - } -} - -func TestUnmarshal(t *testing.T) { - for i, test := range testCases { - v1 := reflect.New(reflect.TypeOf(test.Decoded).Elem()).Interface() - v := v1.(testType) - - err := v.UnmarshalJSON([]byte(test.Encoded)) - if err != nil { - t.Errorf("[%d, %T] UnmarshalJSON() error: %v", i, test.Decoded, err) - } - - if !reflect.DeepEqual(v, test.Decoded) { - t.Errorf("[%d, %T] UnmarshalJSON(): got \n%+v\n\t\t want \n%+v", i, test.Decoded, v, test.Decoded) - } - } -} - -func TestRawMessageSTD(t *testing.T) { - type T struct { - F easyjson.RawMessage - Fnil easyjson.RawMessage - } - - val := T{F: easyjson.RawMessage([]byte(`"test"`))} - str := `{"F":"test","Fnil":null}` - - data, err := json.Marshal(val) - if err != nil { - t.Errorf("json.Marshal() error: %v", err) - } - got := string(data) - if got != str { - t.Errorf("json.Marshal() = %v; want %v", got, str) - } - - wantV := T{F: easyjson.RawMessage([]byte(`"test"`)), Fnil: easyjson.RawMessage([]byte("null"))} - var gotV T - - err = json.Unmarshal([]byte(str), &gotV) - if err != nil { - t.Errorf("json.Unmarshal() error: %v", err) - } - if !reflect.DeepEqual(gotV, wantV) { - t.Errorf("json.Unmarshal() = %v; want %v", gotV, wantV) - } -} - -func TestParseNull(t *testing.T) { - var got, want SubStruct - if err := easyjson.Unmarshal([]byte("null"), &got); err != nil { - t.Errorf("Unmarshal() error: %v", err) - } - - if !reflect.DeepEqual(got, want) { - t.Errorf("Unmarshal() = %+v; want %+v", got, want) - } -} - -var testSpecialCases = []struct { - EncodedString string - Value string -}{ - {`"Username \u003cuser@example.com\u003e"`, `Username `}, - {`"Username\ufffd"`, "Username\xc5"}, - {`"тестzтест"`, "тестzтест"}, - {`"тест\ufffdтест"`, "тест\xc5тест"}, - {`"绿茶"`, "绿茶"}, - {`"绿\ufffd茶"`, "绿\xc5茶"}, - {`"тест\u2028"`, "тест\xE2\x80\xA8"}, - {`"\\\r\n\t\""`, "\\\r\n\t\""}, - {`"ü"`, "ü"}, -} - -func TestSpecialCases(t *testing.T) { - for i, test := range testSpecialCases { - w := jwriter.Writer{} - w.String(test.Value) - got := string(w.Buffer.BuildBytes()) - if got != test.EncodedString { - t.Errorf("[%d] Encoded() = %+v; want %+v", i, got, test.EncodedString) - } - } -} - -func TestOverflowArray(t *testing.T) { - var a Arrays - err := easyjson.Unmarshal([]byte(arrayOverflowString), &a) - if err != nil { - t.Error(err) - } - if a != arrayValue { - t.Errorf("Unmarshal(%v) = %+v; want %+v", arrayOverflowString, a, arrayValue) - } -} - -func TestUnderflowArray(t *testing.T) { - var a Arrays - err := easyjson.Unmarshal([]byte(arrayUnderflowString), &a) - if err != nil { - t.Error(err) - } - if a != arrayUnderflowValue { - t.Errorf("Unmarshal(%v) = %+v; want %+v", arrayUnderflowString, a, arrayUnderflowValue) - } -} - -func TestEncodingFlags(t *testing.T) { - for i, test := range []struct { - Flags jwriter.Flags - In easyjson.Marshaler - Want string - }{ - {0, EncodingFlagsTestMap{}, `{"F":null}`}, - {0, EncodingFlagsTestSlice{}, `{"F":null}`}, - {jwriter.NilMapAsEmpty, EncodingFlagsTestMap{}, `{"F":{}}`}, - {jwriter.NilSliceAsEmpty, EncodingFlagsTestSlice{}, `{"F":[]}`}, - } { - w := &jwriter.Writer{Flags: test.Flags} - test.In.MarshalEasyJSON(w) - - data, err := w.BuildBytes() - if err != nil { - t.Errorf("[%v] easyjson.Marshal(%+v) error: %v", i, test.In, err) - } - - v := string(data) - if v != test.Want { - t.Errorf("[%v] easyjson.Marshal(%+v) = %v; want %v", i, test.In, v, test.Want) - } - } - -} - -func TestNestedEasyJsonMarshal(t *testing.T) { - n := map[string]*NestedEasyMarshaler{ - "Value": {}, - "Slice1": {}, - "Slice2": {}, - "Map1": {}, - "Map2": {}, - } - - ni := NestedInterfaces{ - Value: n["Value"], - Slice: []interface{}{n["Slice1"], n["Slice2"]}, - Map: map[string]interface{}{"1": n["Map1"], "2": n["Map2"]}, - } - easyjson.Marshal(ni) - - for k, v := range n { - if !v.EasilyMarshaled { - t.Errorf("Nested interface %s wasn't easily marshaled", k) - } - } -} - -func TestUnmarshalStructWithEmbeddedPtrStruct(t *testing.T) { - var s = StructWithInterface{Field2: &EmbeddedStruct{}} - var err error - err = easyjson.Unmarshal([]byte(structWithInterfaceString), &s) - if err != nil { - t.Errorf("easyjson.Unmarshal() error: %v", err) - } - if !reflect.DeepEqual(s, structWithInterfaceValueFilled) { - t.Errorf("easyjson.Unmarshal() = %#v; want %#v", s, structWithInterfaceValueFilled) - } -} diff --git a/vendor/github.com/mailru/easyjson/tests/data.go b/vendor/github.com/mailru/easyjson/tests/data.go deleted file mode 100644 index 234e578b1a..0000000000 --- a/vendor/github.com/mailru/easyjson/tests/data.go +++ /dev/null @@ -1,759 +0,0 @@ -package tests - -import ( - "fmt" - "math" - "net" - "time" - - "github.com/mailru/easyjson" - "github.com/mailru/easyjson/opt" -) - -type PrimitiveTypes struct { - String string - Bool bool - - Int int - Int8 int8 - Int16 int16 - Int32 int32 - Int64 int64 - - Uint uint - Uint8 uint8 - Uint16 uint16 - Uint32 uint32 - Uint64 uint64 - - IntString int `json:",string"` - Int8String int8 `json:",string"` - Int16String int16 `json:",string"` - Int32String int32 `json:",string"` - Int64String int64 `json:",string"` - - UintString uint `json:",string"` - Uint8String uint8 `json:",string"` - Uint16String uint16 `json:",string"` - Uint32String uint32 `json:",string"` - Uint64String uint64 `json:",string"` - - Float32 float32 - Float64 float64 - - Ptr *string - PtrNil *string -} - -var str = "bla" - -var primitiveTypesValue = PrimitiveTypes{ - String: "test", Bool: true, - - Int: math.MinInt32, - Int8: math.MinInt8, - Int16: math.MinInt16, - Int32: math.MinInt32, - Int64: math.MinInt64, - - Uint: math.MaxUint32, - Uint8: math.MaxUint8, - Uint16: math.MaxUint16, - Uint32: math.MaxUint32, - Uint64: math.MaxUint64, - - IntString: math.MinInt32, - Int8String: math.MinInt8, - Int16String: math.MinInt16, - Int32String: math.MinInt32, - Int64String: math.MinInt64, - - UintString: math.MaxUint32, - Uint8String: math.MaxUint8, - Uint16String: math.MaxUint16, - Uint32String: math.MaxUint32, - Uint64String: math.MaxUint64, - - Float32: 1.5, - Float64: math.MaxFloat64, - - Ptr: &str, -} - -var primitiveTypesString = "{" + - `"String":"test","Bool":true,` + - - `"Int":` + fmt.Sprint(math.MinInt32) + `,` + - `"Int8":` + fmt.Sprint(math.MinInt8) + `,` + - `"Int16":` + fmt.Sprint(math.MinInt16) + `,` + - `"Int32":` + fmt.Sprint(math.MinInt32) + `,` + - `"Int64":` + fmt.Sprint(int64(math.MinInt64)) + `,` + - - `"Uint":` + fmt.Sprint(math.MaxUint32) + `,` + - `"Uint8":` + fmt.Sprint(math.MaxUint8) + `,` + - `"Uint16":` + fmt.Sprint(math.MaxUint16) + `,` + - `"Uint32":` + fmt.Sprint(math.MaxUint32) + `,` + - `"Uint64":` + fmt.Sprint(uint64(math.MaxUint64)) + `,` + - - `"IntString":"` + fmt.Sprint(math.MinInt32) + `",` + - `"Int8String":"` + fmt.Sprint(math.MinInt8) + `",` + - `"Int16String":"` + fmt.Sprint(math.MinInt16) + `",` + - `"Int32String":"` + fmt.Sprint(math.MinInt32) + `",` + - `"Int64String":"` + fmt.Sprint(int64(math.MinInt64)) + `",` + - - `"UintString":"` + fmt.Sprint(math.MaxUint32) + `",` + - `"Uint8String":"` + fmt.Sprint(math.MaxUint8) + `",` + - `"Uint16String":"` + fmt.Sprint(math.MaxUint16) + `",` + - `"Uint32String":"` + fmt.Sprint(math.MaxUint32) + `",` + - `"Uint64String":"` + fmt.Sprint(uint64(math.MaxUint64)) + `",` + - - `"Float32":` + fmt.Sprint(1.5) + `,` + - `"Float64":` + fmt.Sprint(math.MaxFloat64) + `,` + - - `"Ptr":"bla",` + - `"PtrNil":null` + - - "}" - -type ( - NamedString string - NamedBool bool - - NamedInt int - NamedInt8 int8 - NamedInt16 int16 - NamedInt32 int32 - NamedInt64 int64 - - NamedUint uint - NamedUint8 uint8 - NamedUint16 uint16 - NamedUint32 uint32 - NamedUint64 uint64 - - NamedFloat32 float32 - NamedFloat64 float64 - - NamedStrPtr *string -) - -type NamedPrimitiveTypes struct { - String NamedString - Bool NamedBool - - Int NamedInt - Int8 NamedInt8 - Int16 NamedInt16 - Int32 NamedInt32 - Int64 NamedInt64 - - Uint NamedUint - Uint8 NamedUint8 - Uint16 NamedUint16 - Uint32 NamedUint32 - Uint64 NamedUint64 - - Float32 NamedFloat32 - Float64 NamedFloat64 - - Ptr NamedStrPtr - PtrNil NamedStrPtr -} - -var namedPrimitiveTypesValue = NamedPrimitiveTypes{ - String: "test", - Bool: true, - - Int: math.MinInt32, - Int8: math.MinInt8, - Int16: math.MinInt16, - Int32: math.MinInt32, - Int64: math.MinInt64, - - Uint: math.MaxUint32, - Uint8: math.MaxUint8, - Uint16: math.MaxUint16, - Uint32: math.MaxUint32, - Uint64: math.MaxUint64, - - Float32: 1.5, - Float64: math.MaxFloat64, - - Ptr: NamedStrPtr(&str), -} - -var namedPrimitiveTypesString = "{" + - `"String":"test",` + - `"Bool":true,` + - - `"Int":` + fmt.Sprint(math.MinInt32) + `,` + - `"Int8":` + fmt.Sprint(math.MinInt8) + `,` + - `"Int16":` + fmt.Sprint(math.MinInt16) + `,` + - `"Int32":` + fmt.Sprint(math.MinInt32) + `,` + - `"Int64":` + fmt.Sprint(int64(math.MinInt64)) + `,` + - - `"Uint":` + fmt.Sprint(math.MaxUint32) + `,` + - `"Uint8":` + fmt.Sprint(math.MaxUint8) + `,` + - `"Uint16":` + fmt.Sprint(math.MaxUint16) + `,` + - `"Uint32":` + fmt.Sprint(math.MaxUint32) + `,` + - `"Uint64":` + fmt.Sprint(uint64(math.MaxUint64)) + `,` + - - `"Float32":` + fmt.Sprint(1.5) + `,` + - `"Float64":` + fmt.Sprint(math.MaxFloat64) + `,` + - - `"Ptr":"bla",` + - `"PtrNil":null` + - "}" - -type SubStruct struct { - Value string - Value2 string - unexpored bool -} - -type SubP struct { - V string -} - -type SubStructAlias SubStruct - -type Structs struct { - SubStruct - *SubP - - Value2 int - - Sub1 SubStruct `json:"substruct"` - Sub2 *SubStruct - SubNil *SubStruct - - SubSlice []SubStruct - SubSliceNil []SubStruct - - SubPtrSlice []*SubStruct - SubPtrSliceNil []*SubStruct - - SubA1 SubStructAlias - SubA2 *SubStructAlias - - Anonymous struct { - V string - I int - } - Anonymous1 *struct { - V string - } - - AnonymousSlice []struct{ V int } - AnonymousPtrSlice []*struct{ V int } - - Slice []string - - unexported bool -} - -var structsValue = Structs{ - SubStruct: SubStruct{Value: "test"}, - SubP: &SubP{V: "subp"}, - - Value2: 5, - - Sub1: SubStruct{Value: "test1", Value2: "v"}, - Sub2: &SubStruct{Value: "test2", Value2: "v2"}, - - SubSlice: []SubStruct{ - {Value: "s1"}, - {Value: "s2"}, - }, - - SubPtrSlice: []*SubStruct{ - {Value: "p1"}, - {Value: "p2"}, - }, - - SubA1: SubStructAlias{Value: "test3", Value2: "v3"}, - SubA2: &SubStructAlias{Value: "test4", Value2: "v4"}, - - Anonymous: struct { - V string - I int - }{V: "bla", I: 5}, - - Anonymous1: &struct { - V string - }{V: "bla1"}, - - AnonymousSlice: []struct{ V int }{{1}, {2}}, - AnonymousPtrSlice: []*struct{ V int }{{3}, {4}}, - - Slice: []string{"test5", "test6"}, -} - -var structsString = "{" + - `"Value2":5,` + - - `"substruct":{"Value":"test1","Value2":"v"},` + - `"Sub2":{"Value":"test2","Value2":"v2"},` + - `"SubNil":null,` + - - `"SubSlice":[{"Value":"s1","Value2":""},{"Value":"s2","Value2":""}],` + - `"SubSliceNil":null,` + - - `"SubPtrSlice":[{"Value":"p1","Value2":""},{"Value":"p2","Value2":""}],` + - `"SubPtrSliceNil":null,` + - - `"SubA1":{"Value":"test3","Value2":"v3"},` + - `"SubA2":{"Value":"test4","Value2":"v4"},` + - - `"Anonymous":{"V":"bla","I":5},` + - `"Anonymous1":{"V":"bla1"},` + - - `"AnonymousSlice":[{"V":1},{"V":2}],` + - `"AnonymousPtrSlice":[{"V":3},{"V":4}],` + - - `"Slice":["test5","test6"],` + - - // Embedded fields go last. - `"V":"subp",` + - `"Value":"test"` + - "}" - -type OmitEmpty struct { - // NOTE: first field is empty to test comma printing. - - StrE, StrNE string `json:",omitempty"` - PtrE, PtrNE *string `json:",omitempty"` - - IntNE int `json:"intField,omitempty"` - IntE int `json:",omitempty"` - - // NOTE: omitempty has no effect on non-pointer struct fields. - SubE, SubNE SubStruct `json:",omitempty"` - SubPE, SubPNE *SubStruct `json:",omitempty"` -} - -var omitEmptyValue = OmitEmpty{ - StrNE: "str", - PtrNE: &str, - IntNE: 6, - SubNE: SubStruct{Value: "1", Value2: "2"}, - SubPNE: &SubStruct{Value: "3", Value2: "4"}, -} - -var omitEmptyString = "{" + - `"StrNE":"str",` + - `"PtrNE":"bla",` + - `"intField":6,` + - `"SubE":{"Value":"","Value2":""},` + - `"SubNE":{"Value":"1","Value2":"2"},` + - `"SubPNE":{"Value":"3","Value2":"4"}` + - "}" - -type Opts struct { - StrNull opt.String - StrEmpty opt.String - Str opt.String - StrOmitempty opt.String `json:",omitempty"` - - IntNull opt.Int - IntZero opt.Int - Int opt.Int -} - -var optsValue = Opts{ - StrEmpty: opt.OString(""), - Str: opt.OString("test"), - - IntZero: opt.OInt(0), - Int: opt.OInt(5), -} - -var optsString = `{` + - `"StrNull":null,` + - `"StrEmpty":"",` + - `"Str":"test",` + - `"IntNull":null,` + - `"IntZero":0,` + - `"Int":5` + - `}` - -type Raw struct { - Field easyjson.RawMessage - Field2 string -} - -var rawValue = Raw{ - Field: []byte(`{"a" : "b"}`), - Field2: "test", -} - -var rawString = `{` + - `"Field":{"a" : "b"},` + - `"Field2":"test"` + - `}` - -type StdMarshaler struct { - T time.Time - IP net.IP -} - -var stdMarshalerValue = StdMarshaler{ - T: time.Date(2016, 01, 02, 14, 15, 10, 0, time.UTC), - IP: net.IPv4(192, 168, 0, 1), -} -var stdMarshalerString = `{` + - `"T":"2016-01-02T14:15:10Z",` + - `"IP":"192.168.0.1"` + - `}` - -type UserMarshaler struct { - V vMarshaler - T tMarshaler -} - -type vMarshaler net.IP - -func (v vMarshaler) MarshalJSON() ([]byte, error) { - return []byte(`"0::0"`), nil -} - -func (v *vMarshaler) UnmarshalJSON([]byte) error { - *v = vMarshaler(net.IPv6zero) - return nil -} - -type tMarshaler net.IP - -func (v tMarshaler) MarshalText() ([]byte, error) { - return []byte(`[0::0]`), nil -} - -func (v *tMarshaler) UnmarshalText([]byte) error { - *v = tMarshaler(net.IPv6zero) - return nil -} - -var userMarshalerValue = UserMarshaler{ - V: vMarshaler(net.IPv6zero), - T: tMarshaler(net.IPv6zero), -} -var userMarshalerString = `{` + - `"V":"0::0",` + - `"T":"[0::0]"` + - `}` - -type unexportedStruct struct { - Value string -} - -var unexportedStructValue = unexportedStruct{"test"} -var unexportedStructString = `{"Value":"test"}` - -type ExcludedField struct { - Process bool `json:"process"` - DoNotProcess bool `json:"-"` - DoNotProcess1 bool `json:"-"` -} - -var excludedFieldValue = ExcludedField{ - Process: true, - DoNotProcess: false, - DoNotProcess1: false, -} -var excludedFieldString = `{"process":true}` - -type Slices struct { - ByteSlice []byte - EmptyByteSlice []byte - NilByteSlice []byte - IntSlice []int - EmptyIntSlice []int - NilIntSlice []int -} - -var sliceValue = Slices{ - ByteSlice: []byte("abc"), - EmptyByteSlice: []byte{}, - NilByteSlice: []byte(nil), - IntSlice: []int{1, 2, 3, 4, 5}, - EmptyIntSlice: []int{}, - NilIntSlice: []int(nil), -} - -var sliceString = `{` + - `"ByteSlice":"YWJj",` + - `"EmptyByteSlice":"",` + - `"NilByteSlice":null,` + - `"IntSlice":[1,2,3,4,5],` + - `"EmptyIntSlice":[],` + - `"NilIntSlice":null` + - `}` - -type Arrays struct { - ByteArray [3]byte - EmptyByteArray [0]byte - IntArray [5]int - EmptyIntArray [0]int -} - -var arrayValue = Arrays{ - ByteArray: [3]byte{'a', 'b', 'c'}, - EmptyByteArray: [0]byte{}, - IntArray: [5]int{1, 2, 3, 4, 5}, - EmptyIntArray: [0]int{}, -} - -var arrayString = `{` + - `"ByteArray":"YWJj",` + - `"EmptyByteArray":"",` + - `"IntArray":[1,2,3,4,5],` + - `"EmptyIntArray":[]` + - `}` - -var arrayOverflowString = `{` + - `"ByteArray":"YWJjbnNk",` + - `"EmptyByteArray":"YWJj",` + - `"IntArray":[1,2,3,4,5,6],` + - `"EmptyIntArray":[7,8]` + - `}` - -var arrayUnderflowValue = Arrays{ - ByteArray: [3]byte{'x', 0, 0}, - EmptyByteArray: [0]byte{}, - IntArray: [5]int{1, 2, 0, 0, 0}, - EmptyIntArray: [0]int{}, -} - -var arrayUnderflowString = `{` + - `"ByteArray":"eA==",` + - `"IntArray":[1,2]` + - `}` - -type Str string - -type Maps struct { - Map map[string]string - InterfaceMap map[string]interface{} - NilMap map[string]string - - CustomMap map[Str]Str -} - -var mapsValue = Maps{ - Map: map[string]string{"A": "b"}, // only one item since map iteration is randomized - InterfaceMap: map[string]interface{}{"G": float64(1)}, - - CustomMap: map[Str]Str{"c": "d"}, -} - -var mapsString = `{` + - `"Map":{"A":"b"},` + - `"InterfaceMap":{"G":1},` + - `"NilMap":null,` + - `"CustomMap":{"c":"d"}` + - `}` - -type NamedSlice []Str -type NamedMap map[Str]Str - -type DeepNest struct { - SliceMap map[Str][]Str - SliceMap1 map[Str][]Str - SliceMap2 map[Str][]Str - NamedSliceMap map[Str]NamedSlice - NamedMapMap map[Str]NamedMap - MapSlice []map[Str]Str - NamedSliceSlice []NamedSlice - NamedMapSlice []NamedMap - NamedStringSlice []NamedString -} - -var deepNestValue = DeepNest{ - SliceMap: map[Str][]Str{ - "testSliceMap": []Str{ - "0", - "1", - }, - }, - SliceMap1: map[Str][]Str{ - "testSliceMap1": []Str(nil), - }, - SliceMap2: map[Str][]Str{ - "testSliceMap2": []Str{}, - }, - NamedSliceMap: map[Str]NamedSlice{ - "testNamedSliceMap": NamedSlice{ - "2", - "3", - }, - }, - NamedMapMap: map[Str]NamedMap{ - "testNamedMapMap": NamedMap{ - "key1": "value1", - }, - }, - MapSlice: []map[Str]Str{ - map[Str]Str{ - "testMapSlice": "someValue", - }, - }, - NamedSliceSlice: []NamedSlice{ - NamedSlice{ - "someValue1", - "someValue2", - }, - NamedSlice{ - "someValue3", - "someValue4", - }, - }, - NamedMapSlice: []NamedMap{ - NamedMap{ - "key2": "value2", - }, - NamedMap{ - "key3": "value3", - }, - }, - NamedStringSlice: []NamedString{ - "value4", "value5", - }, -} - -var deepNestString = `{` + - `"SliceMap":{` + - `"testSliceMap":["0","1"]` + - `},` + - `"SliceMap1":{` + - `"testSliceMap1":null` + - `},` + - `"SliceMap2":{` + - `"testSliceMap2":[]` + - `},` + - `"NamedSliceMap":{` + - `"testNamedSliceMap":["2","3"]` + - `},` + - `"NamedMapMap":{` + - `"testNamedMapMap":{"key1":"value1"}` + - `},` + - `"MapSlice":[` + - `{"testMapSlice":"someValue"}` + - `],` + - `"NamedSliceSlice":[` + - `["someValue1","someValue2"],` + - `["someValue3","someValue4"]` + - `],` + - `"NamedMapSlice":[` + - `{"key2":"value2"},` + - `{"key3":"value3"}` + - `],` + - `"NamedStringSlice":["value4","value5"]` + - `}` - -//easyjson:json -type Ints []int - -var IntsValue = Ints{1, 2, 3, 4, 5} - -var IntsString = `[1,2,3,4,5]` - -//easyjson:json -type MapStringString map[string]string - -var mapStringStringValue = MapStringString{"a": "b"} - -var mapStringStringString = `{"a":"b"}` - -type RequiredOptionalStruct struct { - FirstName string `json:"first_name,required"` - Lastname string `json:"last_name"` -} - -//easyjson:json -type EncodingFlagsTestMap struct { - F map[string]string -} - -//easyjson:json -type EncodingFlagsTestSlice struct { - F []string -} - -type StructWithInterface struct { - Field1 int `json:"f1"` - Field2 interface{} `json:"f2"` - Field3 string `json:"f3"` -} - -type EmbeddedStruct struct { - Field1 int `json:"f1"` - Field2 string `json:"f2"` -} - -var structWithInterfaceString = `{"f1":1,"f2":{"f1":11,"f2":"22"},"f3":"3"}` -var structWithInterfaceValueFilled = StructWithInterface{1, &EmbeddedStruct{11, "22"}, "3"} - -//easyjson:json -type MapIntString map[int]string - -var mapIntStringValue = MapIntString{3: "hi"} -var mapIntStringValueString = `{"3":"hi"}` - -//easyjson:json -type MapInt32String map[int32]string - -var mapInt32StringValue = MapInt32String{-354634382: "life"} -var mapInt32StringValueString = `{"-354634382":"life"}` - -//easyjson:json -type MapInt64String map[int64]string - -var mapInt64StringValue = MapInt64String{-3546343826724305832: "life"} -var mapInt64StringValueString = `{"-3546343826724305832":"life"}` - -//easyjson:json -type MapUintString map[uint]string - -var mapUintStringValue = MapUintString{42: "life"} -var mapUintStringValueString = `{"42":"life"}` - -//easyjson:json -type MapUint32String map[uint32]string - -var mapUint32StringValue = MapUint32String{354634382: "life"} -var mapUint32StringValueString = `{"354634382":"life"}` - -//easyjson:json -type MapUint64String map[uint64]string - -var mapUint64StringValue = MapUint64String{3546343826724305832: "life"} -var mapUint64StringValueString = `{"3546343826724305832":"life"}` - -//easyjson:json -type MapUintptrString map[uintptr]string - -var mapUintptrStringValue = MapUintptrString{272679208: "obj"} -var mapUintptrStringValueString = `{"272679208":"obj"}` - -type MyInt int - -//easyjson:json -type MapMyIntString map[MyInt]string - -var mapMyIntStringValue = MapMyIntString{MyInt(42): "life"} -var mapMyIntStringValueString = `{"42":"life"}` - -//easyjson:json -type IntKeyedMapStruct struct { - Foo MapMyIntString `json:"foo"` - Bar map[int16]MapUint32String `json:"bar"` -} - -var intKeyedMapStructValue = IntKeyedMapStruct{ - Foo: mapMyIntStringValue, - Bar: map[int16]MapUint32String{32: mapUint32StringValue}, -} -var intKeyedMapStructValueString = `{` + - `"foo":{"42":"life"},` + - `"bar":{"32":{"354634382":"life"}}` + - `}` diff --git a/vendor/github.com/mailru/easyjson/tests/errors.go b/vendor/github.com/mailru/easyjson/tests/errors.go deleted file mode 100644 index 14360fcc29..0000000000 --- a/vendor/github.com/mailru/easyjson/tests/errors.go +++ /dev/null @@ -1,26 +0,0 @@ -package tests - -//easyjson:json -type ErrorIntSlice []int - -//easyjson:json -type ErrorBoolSlice []bool - -//easyjson:json -type ErrorUintSlice []uint - -//easyjson:json -type ErrorStruct struct { - Int int `json:"int"` - String string `json:"string"` - Slice []int `json:"slice"` - IntSlice []int `json:"int_slice"` -} - -type ErrorNestedStruct struct { - ErrorStruct ErrorStruct `json:"error_struct"` - Int int `json:"int"` -} - -//easyjson:json -type ErrorIntMap map[uint32]string diff --git a/vendor/github.com/mailru/easyjson/tests/errors_test.go b/vendor/github.com/mailru/easyjson/tests/errors_test.go deleted file mode 100644 index 40fa335447..0000000000 --- a/vendor/github.com/mailru/easyjson/tests/errors_test.go +++ /dev/null @@ -1,285 +0,0 @@ -package tests - -import ( - "testing" - - "github.com/mailru/easyjson/jlexer" -) - -func TestMultipleErrorsInt(t *testing.T) { - for i, test := range []struct { - Data []byte - Offsets []int - }{ - { - Data: []byte(`[1, 2, 3, "4", "5"]`), - Offsets: []int{10, 15}, - }, - { - Data: []byte(`[1, {"2":"3"}, 3, "4"]`), - Offsets: []int{4, 18}, - }, - { - Data: []byte(`[1, "2", "3", "4", "5", "6"]`), - Offsets: []int{4, 9, 14, 19, 24}, - }, - { - Data: []byte(`[1, 2, 3, 4, "5"]`), - Offsets: []int{13}, - }, - { - Data: []byte(`[{"1": "2"}]`), - Offsets: []int{1}, - }, - } { - l := jlexer.Lexer{ - Data: test.Data, - UseMultipleErrors: true, - } - - var v ErrorIntSlice - - v.UnmarshalEasyJSON(&l) - - errors := l.GetNonFatalErrors() - - if len(errors) != len(test.Offsets) { - t.Errorf("[%d] TestMultipleErrorsInt(): errornum: want: %d, got %d", i, len(test.Offsets), len(errors)) - return - } - - for ii, e := range errors { - if e.Offset != test.Offsets[ii] { - t.Errorf("[%d] TestMultipleErrorsInt(): offset[%d]: want %d, got %d", i, ii, test.Offsets[ii], e.Offset) - } - } - } -} - -func TestMultipleErrorsBool(t *testing.T) { - for i, test := range []struct { - Data []byte - Offsets []int - }{ - { - Data: []byte(`[true, false, true, false]`), - }, - { - Data: []byte(`["test", "value", "lol", "1"]`), - Offsets: []int{1, 9, 18, 25}, - }, - { - Data: []byte(`[true, 42, {"a":"b", "c":"d"}, false]`), - Offsets: []int{7, 11}, - }, - } { - l := jlexer.Lexer{ - Data: test.Data, - UseMultipleErrors: true, - } - - var v ErrorBoolSlice - v.UnmarshalEasyJSON(&l) - - errors := l.GetNonFatalErrors() - - if len(errors) != len(test.Offsets) { - t.Errorf("[%d] TestMultipleErrorsBool(): errornum: want: %d, got %d", i, len(test.Offsets), len(errors)) - return - } - for ii, e := range errors { - if e.Offset != test.Offsets[ii] { - t.Errorf("[%d] TestMultipleErrorsBool(): offset[%d]: want %d, got %d", i, ii, test.Offsets[ii], e.Offset) - } - } - } -} - -func TestMultipleErrorsUint(t *testing.T) { - for i, test := range []struct { - Data []byte - Offsets []int - }{ - { - Data: []byte(`[42, 42, 42]`), - }, - { - Data: []byte(`[17, "42", 32]`), - Offsets: []int{5}, - }, - { - Data: []byte(`["zz", "zz"]`), - Offsets: []int{1, 7}, - }, - { - Data: []byte(`[{}, 42]`), - Offsets: []int{1}, - }, - } { - l := jlexer.Lexer{ - Data: test.Data, - UseMultipleErrors: true, - } - - var v ErrorUintSlice - v.UnmarshalEasyJSON(&l) - - errors := l.GetNonFatalErrors() - - if len(errors) != len(test.Offsets) { - t.Errorf("[%d] TestMultipleErrorsUint(): errornum: want: %d, got %d", i, len(test.Offsets), len(errors)) - return - } - for ii, e := range errors { - if e.Offset != test.Offsets[ii] { - t.Errorf("[%d] TestMultipleErrorsUint(): offset[%d]: want %d, got %d", i, ii, test.Offsets[ii], e.Offset) - } - } - } -} - -func TestMultipleErrorsStruct(t *testing.T) { - for i, test := range []struct { - Data []byte - Offsets []int - }{ - { - Data: []byte(`{"string": "test", "slice":[42, 42, 42], "int_slice":[1, 2, 3]}`), - }, - { - Data: []byte(`{"string": {"test": "test"}, "slice":[42, 42, 42], "int_slice":["1", 2, 3]}`), - Offsets: []int{11, 64}, - }, - { - Data: []byte(`{"slice": [42, 42], "string": {"test": "test"}, "int_slice":["1", "2", 3]}`), - Offsets: []int{30, 61, 66}, - }, - { - Data: []byte(`{"string": "test", "slice": {}}`), - Offsets: []int{28}, - }, - { - Data: []byte(`{"slice":5, "string" : "test"}`), - Offsets: []int{9}, - }, - { - Data: []byte(`{"slice" : "test", "string" : "test"}`), - Offsets: []int{11}, - }, - { - Data: []byte(`{"slice": "", "string" : {}, "int":{}}`), - Offsets: []int{10, 25, 35}, - }, - } { - l := jlexer.Lexer{ - Data: test.Data, - UseMultipleErrors: true, - } - var v ErrorStruct - v.UnmarshalEasyJSON(&l) - - errors := l.GetNonFatalErrors() - - if len(errors) != len(test.Offsets) { - t.Errorf("[%d] TestMultipleErrorsStruct(): errornum: want: %d, got %d", i, len(test.Offsets), len(errors)) - return - } - for ii, e := range errors { - if e.Offset != test.Offsets[ii] { - t.Errorf("[%d] TestMultipleErrorsStruct(): offset[%d]: want %d, got %d", i, ii, test.Offsets[ii], e.Offset) - } - } - } -} - -func TestMultipleErrorsNestedStruct(t *testing.T) { - for i, test := range []struct { - Data []byte - Offsets []int - }{ - { - Data: []byte(`{"error_struct":{}}`), - }, - { - Data: []byte(`{"error_struct":5}`), - Offsets: []int{16}, - }, - { - Data: []byte(`{"error_struct":[]}`), - Offsets: []int{16}, - }, - { - Data: []byte(`{"error_struct":{"int":{}}}`), - Offsets: []int{23}, - }, - { - Data: []byte(`{"error_struct":{"int_slice":{}}, "int":4}`), - Offsets: []int{29}, - }, - { - Data: []byte(`{"error_struct":{"int_slice":["1", 2, "3"]}, "int":[]}`), - Offsets: []int{30, 38, 51}, - }, - } { - l := jlexer.Lexer{ - Data: test.Data, - UseMultipleErrors: true, - } - var v ErrorNestedStruct - v.UnmarshalEasyJSON(&l) - - errors := l.GetNonFatalErrors() - - if len(errors) != len(test.Offsets) { - t.Errorf("[%d] TestMultipleErrorsNestedStruct(): errornum: want: %d, got %d", i, len(test.Offsets), len(errors)) - return - } - for ii, e := range errors { - if e.Offset != test.Offsets[ii] { - t.Errorf("[%d] TestMultipleErrorsNestedStruct(): offset[%d]: want %d, got %d", i, ii, test.Offsets[ii], e.Offset) - } - } - } -} - -func TestMultipleErrorsIntMap(t *testing.T) { - for i, test := range []struct { - Data []byte - Offsets []int - }{ - { - Data: []byte(`{"a":"NumErr"}`), - Offsets: []int{1}, - }, - { - Data: []byte(`{"":"ErrSyntax"}`), - Offsets: []int{1}, - }, - { - Data: []byte(`{"a":"NumErr","33147483647":"ErrRange","-1":"ErrRange"}`), - Offsets: []int{1, 14, 39}, - }, - } { - l := jlexer.Lexer{ - Data: test.Data, - UseMultipleErrors: true, - } - - var v ErrorIntMap - - v.UnmarshalEasyJSON(&l) - - errors := l.GetNonFatalErrors() - - if len(errors) != len(test.Offsets) { - t.Errorf("[%d] TestMultipleErrorsInt(): errornum: want: %d, got %d", i, len(test.Offsets), len(errors)) - return - } - - for ii, e := range errors { - if e.Offset != test.Offsets[ii] { - t.Errorf("[%d] TestMultipleErrorsInt(): offset[%d]: want %d, got %d", i, ii, test.Offsets[ii], e.Offset) - } - } - } -} diff --git a/vendor/github.com/mailru/easyjson/tests/named_type.go b/vendor/github.com/mailru/easyjson/tests/named_type.go deleted file mode 100644 index 0ff8dfeb37..0000000000 --- a/vendor/github.com/mailru/easyjson/tests/named_type.go +++ /dev/null @@ -1,22 +0,0 @@ -package tests - -//easyjson:json -type NamedType struct { - Inner struct { - // easyjson is mistakenly naming the type of this field 'tests.MyString' in the generated output - // something about a named type inside an anonmymous type is triggering this bug - Field MyString `tag:"value"` - Field2 int "tag:\"value with ` in it\"" - } -} - -type MyString string - -var namedTypeValue NamedType - -func init() { - namedTypeValue.Inner.Field = "test" - namedTypeValue.Inner.Field2 = 123 -} - -var namedTypeValueString = `{"Inner":{"Field":"test","Field2":123}}` diff --git a/vendor/github.com/mailru/easyjson/tests/nested_easy.go b/vendor/github.com/mailru/easyjson/tests/nested_easy.go deleted file mode 100644 index 6309a49f9f..0000000000 --- a/vendor/github.com/mailru/easyjson/tests/nested_easy.go +++ /dev/null @@ -1,25 +0,0 @@ -package tests - -import ( - "github.com/mailru/easyjson" - "github.com/mailru/easyjson/jwriter" -) - -//easyjson:json -type NestedInterfaces struct { - Value interface{} - Slice []interface{} - Map map[string]interface{} -} - -type NestedEasyMarshaler struct { - EasilyMarshaled bool -} - -var _ easyjson.Marshaler = &NestedEasyMarshaler{} - -func (i *NestedEasyMarshaler) MarshalEasyJSON(w *jwriter.Writer) { - // We use this method only to indicate that easyjson.Marshaler - // interface was really used while encoding. - i.EasilyMarshaled = true -} \ No newline at end of file diff --git a/vendor/github.com/mailru/easyjson/tests/nothing.go b/vendor/github.com/mailru/easyjson/tests/nothing.go deleted file mode 100644 index 35334f5f5e..0000000000 --- a/vendor/github.com/mailru/easyjson/tests/nothing.go +++ /dev/null @@ -1,3 +0,0 @@ -package tests - -// No structs in this file diff --git a/vendor/github.com/mailru/easyjson/tests/omitempty.go b/vendor/github.com/mailru/easyjson/tests/omitempty.go deleted file mode 100644 index ede5eb95a7..0000000000 --- a/vendor/github.com/mailru/easyjson/tests/omitempty.go +++ /dev/null @@ -1,12 +0,0 @@ -package tests - -//easyjson:json -type OmitEmptyDefault struct { - Field string - Str string - Str1 string `json:"s,!omitempty"` - Str2 string `json:",!omitempty"` -} - -var omitEmptyDefaultValue = OmitEmptyDefault{Field: "test"} -var omitEmptyDefaultString = `{"Field":"test","s":"","Str2":""}` diff --git a/vendor/github.com/mailru/easyjson/tests/required_test.go b/vendor/github.com/mailru/easyjson/tests/required_test.go deleted file mode 100644 index 8cc743d8cc..0000000000 --- a/vendor/github.com/mailru/easyjson/tests/required_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package tests - -import ( - "fmt" - "testing" -) - -func TestRequiredField(t *testing.T) { - cases := []struct{ json, errorMessage string }{ - {`{"first_name":"Foo", "last_name": "Bar"}`, ""}, - {`{"last_name":"Bar"}`, "key 'first_name' is required"}, - {"{}", "key 'first_name' is required"}, - } - - for _, tc := range cases { - var v RequiredOptionalStruct - err := v.UnmarshalJSON([]byte(tc.json)) - if tc.errorMessage == "" { - if err != nil { - t.Errorf("%s. UnmarshalJSON didn`t expect error: %v", tc.json, err) - } - } else { - if fmt.Sprintf("%v", err) != tc.errorMessage { - t.Errorf("%s. UnmarshalJSON expected error: %v. got: %v", tc.json, tc.errorMessage, err) - } - } - } -} diff --git a/vendor/github.com/mailru/easyjson/tests/snake.go b/vendor/github.com/mailru/easyjson/tests/snake.go deleted file mode 100644 index 9b64f86120..0000000000 --- a/vendor/github.com/mailru/easyjson/tests/snake.go +++ /dev/null @@ -1,10 +0,0 @@ -package tests - -//easyjson:json -type SnakeStruct struct { - WeirdHTTPStuff bool - CustomNamedField string `json:"cUsToM"` -} - -var snakeStructValue SnakeStruct -var snakeStructString = `{"weird_http_stuff":false,"cUsToM":""}` diff --git a/vendor/github.com/petar/GoLLRB/.gitignore b/vendor/github.com/petar/GoLLRB/.gitignore deleted file mode 100644 index e333b2dbf7..0000000000 --- a/vendor/github.com/petar/GoLLRB/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -syntax:glob -*.[568ao] -*.ao -*.so -*.pyc -*.swp -*.swo -._* -.nfs.* -[568a].out -*~ -*.orig -*.pb.go -core -_obj -_test -src/pkg/Make.deps -_testmain.go - -syntax:regexp -^pkg/ -^src/cmd/(.*)/6?\1$ -^.*/core.[0-9]*$ diff --git a/vendor/github.com/petar/GoLLRB/AUTHORS b/vendor/github.com/petar/GoLLRB/AUTHORS deleted file mode 100644 index 78d1de4956..0000000000 --- a/vendor/github.com/petar/GoLLRB/AUTHORS +++ /dev/null @@ -1,4 +0,0 @@ -Petar Maymounkov -Vadim Vygonets -Ian Smith -Martin Bruse diff --git a/vendor/github.com/petar/GoLLRB/LICENSE b/vendor/github.com/petar/GoLLRB/LICENSE deleted file mode 100644 index b75312c787..0000000000 --- a/vendor/github.com/petar/GoLLRB/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2010, Petar Maymounkov -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -(*) Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. - -(*) Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -(*) Neither the name of Petar Maymounkov nor the names of its contributors may be -used to endorse or promote products derived from this software without specific -prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/petar/GoLLRB/README.md b/vendor/github.com/petar/GoLLRB/README.md deleted file mode 100644 index 742ca0bd56..0000000000 --- a/vendor/github.com/petar/GoLLRB/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# GoLLRB - -GoLLRB is a Left-Leaning Red-Black (LLRB) implementation of 2-3 balanced binary -search trees in Go Language. - -## Overview - -As of this writing and to the best of the author's knowledge, -Go still does not have a balanced binary search tree (BBST) data structure. -These data structures are quite useful in a variety of cases. A BBST maintains -elements in sorted order under dynamic updates (inserts and deletes) and can -support various order-specific queries. Furthermore, in practice one often -implements other common data structures like Priority Queues, using BBST's. - -2-3 trees (a type of BBST's), as well as the runtime-similar 2-3-4 trees, are -the de facto standard BBST algoritms found in implementations of Python, Java, -and other libraries. The LLRB method of implementing 2-3 trees is a recent -improvement over the traditional implementation. The LLRB approach was -discovered relatively recently (in 2008) by Robert Sedgewick of Princeton -University. - -GoLLRB is a Go implementation of LLRB 2-3 trees. - -## Maturity - -GoLLRB has been used in some pretty heavy-weight machine learning tasks over many gigabytes of data. -I consider it to be in stable, perhaps even production, shape. There are no known bugs. - -## Installation - -With a healthy Go Language installed, simply run `go get github.com/petar/GoLLRB/llrb` - -## Example - - package main - - import ( - "fmt" - "github.com/petar/GoLLRB/llrb" - ) - - func lessInt(a, b interface{}) bool { return a.(int) < b.(int) } - - func main() { - tree := llrb.New(lessInt) - tree.ReplaceOrInsert(1) - tree.ReplaceOrInsert(2) - tree.ReplaceOrInsert(3) - tree.ReplaceOrInsert(4) - tree.DeleteMin() - tree.Delete(4) - c := tree.IterAscend() - for { - u := <-c - if u == nil { - break - } - fmt.Printf("%d\n", int(u.(int))) - } - } - -## About - -GoLLRB was written by [Petar Maymounkov](http://pdos.csail.mit.edu/~petar/). - -Follow me on [Twitter @maymounkov](http://www.twitter.com/maymounkov)! diff --git a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-LLRB.pdf b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-LLRB.pdf deleted file mode 100644 index a399b06ae09a1fe32d8235ac569f38128248637a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819932 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%0D^Ic|NC(e$eDBkGAUe**%qajtxI{`0740$&iu2 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%0D99DAMZ=9jL17%tEs^VCvICaF}Cf)CZ~LCs_- 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%0ArHe5XHr^F%jmTxj=wjYcL>TzNJ;- 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 diff --git a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java deleted file mode 100644 index 55ac177f8c..0000000000 --- a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-RedBlackBST.java +++ /dev/null @@ -1,475 +0,0 @@ -public class RedBlackBST, Value> -{ - private static final int BST = 0; - private static final int TD234 = 1; - private static final int BU23 = 2; - private static final boolean RED = true; - private static final boolean BLACK = false; - - private Node root; // root of the BST - private int k; // ordinal for drawing - private final int species; // species kind of tree for insert - private int heightBLACK; // black height of tree - - RedBlackBST(int species) - { this.species = species; } - - private class Node - { - Key key; // key - Value value; // associated data - Node left, right; // left and right subtrees - boolean color; // color of parent link - private int N; // number of nodes in tree rooted here - private int height; // height of tree rooted here - private double xc, yc; // for drawing - - Node(Key key, Value value) - { - this.key = key; - this.value = value; - this.color = RED; - this.N = 1; - this.height = 1; - } - } - - public int size() - { return size(root); } - - private int size(Node x) - { - if (x == null) return 0; - else return x.N; - } - - public int rootRank() - { - if (root == null) return 0; - else return size(root.left); - } - - public int height() - { return height(root); } - - public int heightB() - { return heightBLACK; } - - private int height(Node x) - { - if (x == null) return 0; - else return x.height; - } - - public boolean contains(Key key) - { return (get(key) != null); } - - public Value get(Key key) - { return get(root, key); } - - private Value get(Node x, Key key) - { - if (x == null) return null; - if (eq (key, x.key)) return x.value; - if (less(key, x.key)) return get(x.left, key); - else return get(x.right, key); - } - - public Key min() - { - if (root == null) return null; - else return min(root); - } - - private Key min(Node x) - { - if (x.left == null) return x.key; - else return min(x.left); - } - - public Key max() - { - if (root == null) return null; - else return max(root); - } - - private Key max(Node x) - { - if (x.right == null) return x.key; - else return max(x.right); - } - - public void put(Key key, Value value) - { - root = insert(root, key, value); - if (isRed(root)) heightBLACK++; - root.color = BLACK; - } - - private Node insert(Node h, Key key, Value value) - { - if (h == null) - return new Node(key, value); - - if (species == TD234) - if (isRed(h.left) && isRed(h.right)) - colorFlip(h); - - if (eq(key, h.key)) - h.value = value; - else if (less(key, h.key)) - h.left = insert(h.left, key, value); - else - h.right = insert(h.right, key, value); - - if (species == BST) return setN(h); - - if (isRed(h.right)) - h = rotateLeft(h); - - if (isRed(h.left) && isRed(h.left.left)) - h = rotateRight(h); - - if (species == BU23) - if (isRed(h.left) && isRed(h.right)) - colorFlip(h); - - return setN(h); - } - - public void deleteMin() - { - root = deleteMin(root); - root.color = BLACK; - } - - private Node deleteMin(Node h) - { - if (h.left == null) - return null; - - if (!isRed(h.left) && !isRed(h.left.left)) - h = moveRedLeft(h); - - h.left = deleteMin(h.left); - - return fixUp(h); - } - - public void deleteMax() - { - root = deleteMax(root); - root.color = BLACK; - } - - private Node deleteMax(Node h) - { - // if (h.right == null) - // { - // if (h.left != null) - // h.left.color = BLACK; - // return h.left; - // } - - if (isRed(h.left)) - h = rotateRight(h); - - if (h.right == null) - return null; - - if (!isRed(h.right) && !isRed(h.right.left)) - h = moveRedRight(h); - - h.right = deleteMax(h.right); - - return fixUp(h); - } - - public void delete(Key key) - { - root = delete(root, key); - root.color = BLACK; - } - - private Node delete(Node h, Key key) - { - if (less(key, h.key)) - { - if (!isRed(h.left) && !isRed(h.left.left)) - h = moveRedLeft(h); - h.left = delete(h.left, key); - } - else - { - if (isRed(h.left)) - h = rotateRight(h); - if (eq(key, h.key) && (h.right == null)) - return null; - if (!isRed(h.right) && !isRed(h.right.left)) - h = moveRedRight(h); - if (eq(key, h.key)) - { - h.value = get(h.right, min(h.right)); - h.key = min(h.right); - h.right = deleteMin(h.right); - } - else h.right = delete(h.right, key); - } - - return fixUp(h); - } - -// Helper methods - - private boolean less(Key a, Key b) { return a.compareTo(b) < 0; } - private boolean eq (Key a, Key b) { return a.compareTo(b) == 0; } - - private boolean isRed(Node x) - { - if (x == null) return false; - return (x.color == RED); - } - - private void colorFlip(Node h) - { - h.color = !h.color; - h.left.color = !h.left.color; - h.right.color = !h.right.color; - } - - private Node rotateLeft(Node h) - { // Make a right-leaning 3-node lean to the left. - Node x = h.right; - h.right = x.left; - x.left = setN(h); - x.color = x.left.color; - x.left.color = RED; - return setN(x); - } - - private Node rotateRight(Node h) - { // Make a left-leaning 3-node lean to the right. - Node x = h.left; - h.left = x.right; - x.right = setN(h); - x.color = x.right.color; - x.right.color = RED; - return setN(x); - } - - private Node moveRedLeft(Node h) - { // Assuming that h is red and both h.left and h.left.left - // are black, make h.left or one of its children red. - colorFlip(h); - if (isRed(h.right.left)) - { - h.right = rotateRight(h.right); - h = rotateLeft(h); - colorFlip(h); - } - return h; - } - - private Node moveRedRight(Node h) - { // Assuming that h is red and both h.right and h.right.left - // are black, make h.right or one of its children red. - colorFlip(h); - if (isRed(h.left.left)) - { - h = rotateRight(h); - colorFlip(h); - } - return h; - } - - private Node fixUp(Node h) - { - if (isRed(h.right)) - h = rotateLeft(h); - - if (isRed(h.left) && isRed(h.left.left)) - h = rotateRight(h); - - if (isRed(h.left) && isRed(h.right)) - colorFlip(h); - - return setN(h); - } - - private Node setN(Node h) - { - h.N = size(h.left) + size(h.right) + 1; - if (height(h.left) > height(h.right)) h.height = height(h.left) + 1; - else h.height = height(h.right) + 1; - return h; - } - - public String toString() - { - if (root == null) return ""; - else return heightB() + " " + toString(root); - } - - public String toString(Node x) - { - String s = "("; - if (x.left == null) s += "("; else s += toString(x.left); - if (isRed(x)) s += "*"; - if (x.right == null) s += ")"; else s += toString(x.right); - return s + ")"; - } - -// Methods for tree drawing - - public void draw(double y, double lineWidth, double nodeSize) - { - k = 0; - setcoords(root, y); - StdDraw.setPenColor(StdDraw.BLACK); - StdDraw.setPenRadius(lineWidth); - drawlines(root); - StdDraw.setPenColor(StdDraw.WHITE); - drawnodes(root, nodeSize); - } - - public void setcoords(Node x, double d) - { - if (x == null) return; - setcoords(x.left, d-.04); - x.xc = (0.5 + k++)/size(); x.yc = d - .04; - setcoords(x.right, d-.04); - } - - public void drawlines(Node x) - { - if (x == null) return; - drawlines(x.left); - if (x.left != null) - { - if (x.left.color == RED) StdDraw.setPenColor(StdDraw.RED); - else StdDraw.setPenColor(StdDraw.BLACK); - StdDraw.line(x.xc, x.yc, x.left.xc, x.left.yc); - } - if (x.right != null) - { - if (x.right.color == RED) StdDraw.setPenColor(StdDraw.RED); - else StdDraw.setPenColor(StdDraw.BLACK); - StdDraw.line(x.xc, x.yc, x.right.xc, x.right.yc); - } - drawlines(x.right); - } - - public void drawnodes(Node x, double nodeSize) - { - if (x == null) return; - drawnodes(x.left, nodeSize); - StdDraw.filledCircle(x.xc, x.yc, nodeSize); - drawnodes(x.right, nodeSize); - } - - public void mark(Key key) - { - StdDraw.setPenColor(StdDraw.BLACK); - marknodes(key, root); - } - - public void marknodes(Key key, Node x) - { - if (x == null) return; - marknodes(key, x.left); - if (eq(key, x.key)) - StdDraw.filledCircle(x.xc, x.yc, .004); - marknodes(key, x.right); - } - - public int ipl() - { return ipl(root); } - - public int ipl(Node x) - { - if (x == null) return 0; - return size(x) - 1 + ipl(x.left) + ipl(x.right); - } - - public int sizeRed() - { return sizeRed(root); } - - public int sizeRed(Node x) - { - if (x == null) return 0; - if (isRed(x)) return 1 + sizeRed(x.left) + sizeRed(x.right); - else return sizeRed(x.left) + sizeRed(x.right); - } - -// Integrity checks - - public boolean check() - { // Is this tree a red-black tree? - return isBST() && is234() && isBalanced(); - } - - private boolean isBST() - { // Is this tree a BST? - return isBST(root, min(), max()); - } - - private boolean isBST(Node x, Key min, Key max) - { // Are all the values in the BST rooted at x between min and max, - // and does the same property hold for both subtrees? - if (x == null) return true; - if (less(x.key, min) || less(max, x.key)) return false; - return isBST(x.left, min, x.key) && isBST(x.right, x.key, max); - } - - private boolean is234() { return is234(root); } - private boolean is234(Node x) - { // Does the tree have no red right links, and at most two (left) - // red links in a row on any path? - if (x == null) return true; - if (isRed(x.right)) return false; - if (isRed(x)) - if (isRed(x.left)) - if (isRed(x.left.left)) return false; - return is234(x.left) && is234(x.right); - } - - private boolean isBalanced() - { // Do all paths from root to leaf have same number of black edges? - int black = 0; // number of black links on path from root to min - Node x = root; - while (x != null) - { - if (!isRed(x)) black++; - x = x.left; - } - return isBalanced(root, black); - } - - private boolean isBalanced(Node x, int black) - { // Does every path from the root to a leaf have the given number - // of black links? - if (x == null && black == 0) return true; - else if (x == null && black != 0) return false; - if (!isRed(x)) black--; - return isBalanced(x.left, black) && isBalanced(x.right, black); - } - - - public static void main(String[] args) - { - StdDraw.setPenRadius(.0025); - int species = Integer.parseInt(args[0]); - RedBlackBST st; - st = new RedBlackBST(species); - int[] a = { 3, 1, 4, 2, 5, 9, 6, 8, 7 }; - for (int i = 0; i < a.length; i++) - st.put(a[i], i); - StdOut.println(st); - StdDraw.clear(StdDraw.LIGHT_GRAY); - st.draw(.95, .0025, .008); - StdOut.println(st.min() + " " + st.max() + " " + st.check()); - StdOut.println(st.ipl()); - StdOut.println(st.heightB()); - } - -} diff --git a/vendor/github.com/petar/GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf b/vendor/github.com/petar/GoLLRB/doc/Sedgewick-Talk-Penn2008.pdf deleted file mode 100644 index 07861abedacbb8a39b6f8aedad0d95ea8c343ed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11636171 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%0A!w4EurGF_YlryEfW!(S`e;^stHke{^ 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�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